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:
@@ -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)
|
||||
{
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
Reference in New Issue
Block a user