Speed fix for wxGenericDirCtrl, starting to add text input control;

added wxWS_EX_NO_AUTOFOCUS for wxMSW so we can stop wxToolBar accepting
the focus; UI update improvement to send commands to current focus window;
split tree control horiz. scrollbar problem fixed


git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@8472 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Julian Smart 2000-10-04 12:53:28 +00:00
parent 511eb3e71d
commit e63fdcd600
9 changed files with 155 additions and 12 deletions

View File

@ -338,7 +338,7 @@ void wxRemotelyScrolledTreeCtrl::OnScroll(wxScrollWinEvent& event)
int orient = event.GetOrientation();
if (orient == wxHORIZONTAL)
{
// Don't 'skip' or we'd get into infinite recursion
event.Skip();
return;
}
wxScrolledWindow* scrollWin = GetScrolledWindow();
@ -439,7 +439,7 @@ void wxTreeCompanionWindow::OnScroll(wxScrollWinEvent& event)
int orient = event.GetOrientation();
if (orient == wxHORIZONTAL)
{
// Don't 'skip' or we'd get into infinite recursion
event.Skip();
return;
}
if (!m_treeCtrl)
@ -585,8 +585,13 @@ void wxSplitterScrolledWindow::OnScroll(wxScrollWinEvent& event)
if (orient == wxHORIZONTAL)
{
inOnScroll = FALSE;
event.Skip();
return;
#if 0
int newPos = m_xScrollPosition + nScrollInc;
SetScrollPos(wxHORIZONTAL, newPos, TRUE );
#endif
}
else
{

View File

@ -897,6 +897,9 @@ enum wxStretch
// descend into all subwindows
#define wxWS_EX_VALIDATE_RECURSIVELY 0x00000001
// Don't automatically set the focus when left-clicking on the window
#define wxWS_EX_NO_AUTOFOCUS 0x10000000
/*
* wxFrame/wxDialog style flags
*/

View File

@ -27,7 +27,7 @@
// classes
//-----------------------------------------------------------------------------
class wxDirItemData;
//class wxDirItemData;
class wxDirCtrl;
//-----------------------------------------------------------------------------
@ -224,9 +224,14 @@ public:
wxGenericDirDialog(wxWindow* parent, const wxString& title,
const wxString& defaultPath = wxEmptyString, long style = wxDEFAULT_DIALOG_STYLE, const wxPoint& pos = wxDefaultPosition, const wxSize& sz = wxSize(450, 550), const wxString& name = "dialog");
//// Event handlers
void OnCloseWindow(wxCloseEvent& event);
void OnOK(wxCommandEvent& event);
void OnTreeSelected( wxTreeEvent &event );
void OnTreeKeyDown( wxTreeEvent &event );
void OnNew(wxCommandEvent& event);
//// Accessors
inline void SetMessage(const wxString& message) { m_message = message; }
void SetPath(const wxString& path) ;
inline void SetStyle(long style) { m_dialogStyle = style; }
@ -235,11 +240,17 @@ public:
wxString GetPath(void) const ;
inline long GetStyle(void) const { return m_dialogStyle; }
wxTextCtrl* GetInputCtrl() const { return m_input; }
//// Overrides
int ShowModal();
protected:
wxString m_message;
long m_dialogStyle;
wxString m_path;
wxGenericDirCtrl* m_dirCtrl;
wxTextCtrl* m_input;
};

View File

@ -427,18 +427,20 @@ void wxFrameBase::DoMenuUpdates()
{
wxMenuBar* bar = GetMenuBar();
wxWindow* focusWin = wxFindFocusDescendant((wxWindow*) this);
if ( bar != NULL )
{
int nCount = bar->GetMenuCount();
for (int n = 0; n < nCount; n++)
DoMenuUpdates(bar->GetMenu(n), (wxWindow*) NULL);
DoMenuUpdates(bar->GetMenu(n), focusWin);
}
}
// update a menu and all submenus recursively
void wxFrameBase::DoMenuUpdates(wxMenu* menu, wxWindow* WXUNUSED(focusWin))
void wxFrameBase::DoMenuUpdates(wxMenu* menu, wxWindow* focusWin)
{
wxEvtHandler* evtHandler = GetEventHandler();
wxEvtHandler* evtHandler = focusWin ? focusWin->GetEventHandler() : GetEventHandler();
wxMenuItemList::Node* node = menu->GetMenuItems().GetFirst();
while (node)
{

View File

@ -526,7 +526,13 @@ void wxToolBarBase::OnIdle(wxIdleEvent& event)
// Do the toolbar button updates (check for EVT_UPDATE_UI handlers)
void wxToolBarBase::DoToolbarUpdates()
{
wxEvtHandler* evtHandler = GetEventHandler();
wxWindow* parent = this;
while (parent->GetParent())
parent = parent->GetParent();
wxWindow* focusWin = wxFindFocusDescendant(parent);
wxEvtHandler* evtHandler = focusWin ? focusWin->GetEventHandler() : GetEventHandler() ;
for ( wxToolBarToolsList::Node* node = m_tools.GetFirst();
node;

View File

@ -421,7 +421,7 @@ wxSize wxWindowBase::DoGetBestSize() const
node = node->GetNext() )
{
wxWindow *win = node->GetData();
if ( win->IsTopLevel() || wxDynamicCast(win, wxStatusBar) )
if ( win->IsTopLevel() || wxDynamicCast(win, wxStatusBar) || !win->IsShown())
{
// dialogs and frames lie in different top level windows -
// don't deal with them here; as for the status bars, they

View File

@ -338,7 +338,8 @@ wxDirItemDataEx::wxDirItemDataEx(const wxString& path, const wxString& name,
* For FileNameFromPath read LastDirNameInThisPath ;-) */
// m_isHidden = (bool)(wxFileNameFromPath(*m_path)[0] == '.');
m_isHidden = FALSE;
m_hasSubDirs = HasSubDirs();
// m_hasSubDirs is no longer needed
m_hasSubDirs = TRUE; // HasSubDirs();
m_isExpanded = FALSE;
m_isDir = isDir;
}
@ -353,6 +354,7 @@ void wxDirItemDataEx::SetNewDirName( wxString path )
m_name = wxFileNameFromPath( path );
}
// No longer used, and takes a very long time
bool wxDirItemDataEx::HasSubDirs()
{
if (m_path.IsEmpty())
@ -1179,7 +1181,11 @@ void wxDirFilterListCtrl::FillFilterList(const wxString& filter, int defaultFilt
BEGIN_EVENT_TABLE(wxGenericDirDialog, wxDialog)
EVT_BUTTON(wxID_OK, wxGenericDirDialog::OnOK)
EVT_BUTTON (wxID_NEW, wxGenericDirDialog::OnNew)
EVT_CLOSE(wxGenericDirDialog::OnCloseWindow)
EVT_TREE_KEY_DOWN (ID_DIRCTRL, wxGenericDirDialog::OnTreeKeyDown)
EVT_TREE_SEL_CHANGED (ID_DIRCTRL, wxGenericDirDialog::OnTreeSelected)
EVT_TEXT_ENTER (ID_TEXTCTRL, wxGenericDirDialog::OnOK)
END_EVENT_TABLE()
wxGenericDirDialog::wxGenericDirDialog(wxWindow* parent, const wxString& title,
@ -1197,7 +1203,9 @@ wxGenericDirDialog::wxGenericDirDialog(wxWindow* parent, const wxString& title,
topsizer->Add( m_dirCtrl, 1, wxTOP|wxLEFT|wxRIGHT | wxEXPAND, 10 );
// 2) TODO: text control for entering path?
// 2) text ctrl
m_input = new wxTextCtrl( this, ID_TEXTCTRL, wxEmptyString, wxDefaultPosition );
topsizer->Add( m_input, 0, wxTOP|wxLEFT|wxRIGHT | wxEXPAND, 10 );
#if wxUSE_STATLINE
// 3) Static line
@ -1220,6 +1228,8 @@ wxGenericDirDialog::wxGenericDirDialog(wxWindow* parent, const wxString& title,
okButton->SetDefault();
m_dirCtrl->SetFocus();
m_input->SetValue(defaultPath);
SetAutoLayout( TRUE );
SetSizer( topsizer );
@ -1236,7 +1246,36 @@ void wxGenericDirDialog::OnCloseWindow(wxCloseEvent& event)
void wxGenericDirDialog::OnOK(wxCommandEvent& event)
{
EndModal(wxID_OK);
m_path = m_input->GetValue();
// Does the path exist? (User may have typed anything in m_input)
if (wxPathExists(m_path)) {
// OK, path exists, we're done.
EndModal(wxID_OK);
return;
}
// Interact with user, find out if the dir is a typo or to be created
wxString msg( _("The directory ") );
msg = msg + m_path;
msg = msg + _("\ndoes not exist\nCreate it now?") ;
wxMessageDialog dialog(this, msg, _("Directory does not exist"), wxYES_NO | wxICON_WARNING );
if ( dialog.ShowModal() == wxID_YES ) {
// Okay, let's make it
wxLogNull log;
if (wxMkdir(m_path)) {
// The new dir was created okay.
EndModal(wxID_OK);
return;
}
else {
// Trouble...
msg = _("Failed to create directory ")+m_path+
_("\n(Do you have the required permissions?)");
wxMessageDialog errmsg(this, msg, _("Error creating directory"), wxOK | wxICON_ERROR);
errmsg.ShowModal();
// We still don't have a valid dir. Back to the main dialog.
}
}
// User has answered NO to create dir.
}
void wxGenericDirDialog::SetPath(const wxString& path)
@ -1248,3 +1287,76 @@ wxString wxGenericDirDialog::GetPath(void) const
{
return m_dirCtrl->GetPath();
}
int wxGenericDirDialog::ShowModal()
{
m_input->SetValue( m_path );
return wxDialog::ShowModal();
}
void wxGenericDirDialog::OnTreeSelected( wxTreeEvent &event )
{
wxDirItemDataEx *data = (wxDirItemDataEx*)m_dirCtrl->GetTreeCtrl()->GetItemData(event.GetItem());
if (data)
m_input->SetValue( data->m_path );
};
void wxGenericDirDialog::OnTreeKeyDown( wxTreeEvent &WXUNUSED(event) )
{
wxDirItemDataEx *data = (wxDirItemDataEx*)m_dirCtrl->GetTreeCtrl()->GetItemData(m_dirCtrl->GetTreeCtrl()->GetSelection());
if (data)
m_input->SetValue( data->m_path );
};
void wxGenericDirDialog::OnNew( wxCommandEvent& WXUNUSED(event) )
{
#if 0
wxTreeItemId id = m_dir->GetSelection();
if ((id == m_dir->GetRootItem()) ||
(m_dir->GetParent(id) == m_dir->GetRootItem()))
{
wxMessageDialog msg(this, _("You cannot add a new directory to this section."),
_("Create directory"), wxOK | wxICON_INFORMATION );
msg.ShowModal();
return;
}
wxTreeItemId parent = m_dir->GetParent( id );
wxDirItemData *data = (wxDirItemData*)m_dir->GetItemData( parent );
wxASSERT( data );
wxString new_name( wxT("NewName") );
wxString path( data->m_path );
path += wxT("/");
path += new_name;
if (wxFileExists(path))
{
// try NewName0, NewName1 etc.
int i = 0;
do {
new_name = wxT("NewName");
wxString num;
num.Printf( wxT("%d"), i );
new_name += num;
path = data->m_path;
path += wxT("/");
path += new_name;
i++;
} while (wxFileExists(path));
}
wxLogNull log;
if (!wxMkdir(path))
{
wxMessageDialog dialog(this, _("Operation not permitted."), _("Error"), wxOK | wxICON_ERROR );
dialog.ShowModal();
return;
}
wxDirItemData *new_data = new wxDirItemData( path, new_name );
wxTreeItemId new_id = m_dir->AppendItem( parent, new_name, 0, 1, new_data );
m_dir->EnsureVisible( new_id );
m_dir->EditLabel( new_id );
#endif
}

View File

@ -205,6 +205,9 @@ bool wxToolBar::Create(wxWindow *parent,
long style,
const wxString& name)
{
// Don't want to grab the focus when we left click
SetExtraStyle(GetExtraStyle() | wxWS_EX_NO_AUTOFOCUS);
// common initialisation
if ( !CreateControl(parent, id, pos, size, style, wxDefaultValidator, name) )
return FALSE;

View File

@ -1897,7 +1897,8 @@ long wxWindow::MSWWindowProc(WXUINT message, WXWPARAM wParam, WXLPARAM lParam)
case WM_LBUTTONDOWN:
// set focus to this window
SetFocus();
if ((GetExtraStyle() & wxWS_EX_NO_AUTOFOCUS) != wxWS_EX_NO_AUTOFOCUS)
SetFocus();
// fall through