X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/1e6935a670905d1486219c763ab4c85797740723..bd412bc6b6b4d824e83a8eff5c694d5692b46f45:/src/propgrid/propgrid.cpp diff --git a/src/propgrid/propgrid.cpp b/src/propgrid/propgrid.cpp index c841b1e7f5..021f77cd5f 100644 --- a/src/propgrid/propgrid.cpp +++ b/src/propgrid/propgrid.cpp @@ -4,7 +4,7 @@ // Author: Jaakko Salli // Modified by: // Created: 2004-09-25 -// RCS-ID: $Id: +// RCS-ID: $Id$ // Copyright: (c) Jaakko Salli // Licence: wxWindows license ///////////////////////////////////////////////////////////////////////////// @@ -52,22 +52,22 @@ // This define is necessary to prevent macro clearing #define __wxPG_SOURCE_FILE__ -#include -#include +#include "wx/propgrid/propgrid.h" +#include "wx/propgrid/editors.h" #if wxPG_USE_RENDERER_NATIVE - #include + #include "wx/renderer.h" #endif -#include +#include "wx/odcombo.h" #include "wx/timer.h" #include "wx/dcbuffer.h" -#include -#include +#include "wx/clipbrd.h" +#include "wx/dataobj.h" #ifdef __WXMSW__ - #include + #include "wx/msw/private.h" #endif // Two pics for the expand / collapse buttons. @@ -140,7 +140,7 @@ const wxChar *wxPropertyGridNameStr = wxT("wxPropertyGrid"); // Statics in one class for easy destruction. // ----------------------------------------------------------------------- -#include +#include "wx/module.h" class wxPGGlobalVarsClassManager : public wxModule { @@ -414,14 +414,13 @@ protected: pg->OnKeyUp( event ); } - void OnNavigationKey( wxNavigationKeyEvent& event ) - { - wxPropertyGrid* pg = wxStaticCast(GetParent(), wxPropertyGrid); - pg->OnNavigationKey( event ); - } - void OnPaint( wxPaintEvent& event ); + // Always be focussable, even with child windows + virtual void SetCanFocus(bool WXUNUSED(canFocus)) + { wxPanel::SetCanFocus(true); } + + private: DECLARE_EVENT_TABLE() DECLARE_ABSTRACT_CLASS(wxPGCanvas) @@ -440,7 +439,6 @@ BEGIN_EVENT_TABLE(wxPGCanvas, wxPanel) EVT_KEY_DOWN(wxPGCanvas::OnKey) EVT_KEY_UP(wxPGCanvas::OnKeyUp) EVT_CHAR(wxPGCanvas::OnKey) - EVT_NAVIGATION_KEY(wxPGCanvas::OnNavigationKey) END_EVENT_TABLE() @@ -587,6 +585,8 @@ void wxPropertyGrid::Init1() AddActionTrigger( wxPG_ACTION_COPY, WXK_INSERT, wxMOD_CONTROL ); AddActionTrigger( wxPG_ACTION_PASTE, 'V', wxMOD_CONTROL ); AddActionTrigger( wxPG_ACTION_PASTE, WXK_INSERT, wxMOD_SHIFT ); + AddActionTrigger( wxPG_ACTION_PRESS_BUTTON, WXK_DOWN, wxMOD_ALT ); + AddActionTrigger( wxPG_ACTION_PRESS_BUTTON, WXK_F4 ); m_coloursCustomized = 0; m_frozen = 0; @@ -597,8 +597,6 @@ void wxPropertyGrid::Init1() m_doubleBuffer = (wxBitmap*) NULL; #endif - m_windowsToDelete = NULL; - #ifndef wxPG_ICON_WIDTH m_expandbmp = NULL; m_collbmp = NULL; @@ -617,10 +615,6 @@ void wxPropertyGrid::Init1() m_width = m_height = 0; - SetButtonShortcut(0); - - m_keyComboConsumed = 0; - m_commonValues.push_back(new wxPGCommonValue(_("Unspecified"), wxPGGlobalVars->m_defaultRenderer) ); m_cvUnspecified = 0; @@ -756,8 +750,6 @@ wxPropertyGrid::~wxPropertyGrid() delete m_doubleBuffer; #endif - delete m_windowsToDelete; - //m_selected = (wxPGProperty*) NULL; if ( m_iFlags & wxPG_FL_CREATEDSTATE ) @@ -1182,7 +1174,8 @@ bool wxPropertyGrid::SetFont( const wxFont& font ) // TODO: Following code is disabled with wxMac because // it is reported to fail. I (JMS) cannot debug it // personally right now. -#if !defined(__WXMAC__) + // CS: should be fixed now, leaving old code in just in case, TODO: REMOVE +#if 1 // !defined(__WXMAC__) bool res = wxScrolledWindow::SetFont( font ); if ( res ) { @@ -2643,24 +2636,6 @@ wxPGProperty* wxPropertyGrid::GetNearestPaintVisible( wxPGProperty* p ) const } -// ----------------------------------------------------------------------- - -void wxPropertyGrid::SetButtonShortcut( int keycode, bool ctrlDown, bool altDown ) -{ - if ( keycode ) - { - m_pushButKeyCode = keycode; - m_pushButKeyCodeNeedsCtrl = ctrlDown ? 1 : 0; - m_pushButKeyCodeNeedsAlt = altDown ? 1 : 0; - } - else - { - m_pushButKeyCode = WXK_DOWN; - m_pushButKeyCodeNeedsCtrl = 0; - m_pushButKeyCodeNeedsAlt = 1; - } -} - // ----------------------------------------------------------------------- // Methods related to change in value, value modification and sending events // ----------------------------------------------------------------------- @@ -2756,7 +2731,8 @@ bool wxPropertyGrid::CommitChangesFromEditor( wxUint32 flags ) // ----------------------------------------------------------------------- -bool wxPropertyGrid::PerformValidation( wxPGProperty* p, wxVariant& pendingValue ) +bool wxPropertyGrid::PerformValidation( wxPGProperty* p, wxVariant& pendingValue, + int flags ) { // // Runs all validation functionality. @@ -2825,33 +2801,37 @@ bool wxPropertyGrid::PerformValidation( wxPGProperty* p, wxVariant& pendingValue wxVariant evtChangingValue = value; - // FIXME: After proper ValueToString()s added, remove - // this. It is just a temporary fix, as evt_changing - // will simply not work for wxPG_PROP_COMPOSED_VALUE - // (unless it is selected, and textctrl editor is open). - if ( changedProperty->HasFlag(wxPG_PROP_COMPOSED_VALUE) ) + if ( flags & SendEvtChanging ) { - evtChangingProperty = baseChangedProperty; - if ( evtChangingProperty != p ) + // FIXME: After proper ValueToString()s added, remove + // this. It is just a temporary fix, as evt_changing + // will simply not work for wxPG_PROP_COMPOSED_VALUE + // (unless it is selected, and textctrl editor is open). + if ( changedProperty->HasFlag(wxPG_PROP_COMPOSED_VALUE) ) { - evtChangingProperty->AdaptListToValue( bcpPendingList, &evtChangingValue ); - } - else - { - evtChangingValue = pendingValue; + evtChangingProperty = baseChangedProperty; + if ( evtChangingProperty != p ) + { + evtChangingProperty->AdaptListToValue( bcpPendingList, &evtChangingValue ); + } + else + { + evtChangingValue = pendingValue; + } } - } - if ( evtChangingProperty->HasFlag(wxPG_PROP_COMPOSED_VALUE) ) - { - if ( changedProperty == m_selected ) + if ( evtChangingProperty->HasFlag(wxPG_PROP_COMPOSED_VALUE) ) { - wxASSERT( m_wndEditor->IsKindOf(CLASSINFO(wxTextCtrl)) ); - evtChangingValue = ((wxTextCtrl*)m_wndEditor)->GetValue(); - } - else - { - wxLogDebug(wxT("WARNING: wxEVT_PG_CHANGING is about to happen with old value.")); + if ( changedProperty == m_selected ) + { + wxWindow* editor = GetEditorControl(); + wxASSERT( editor->IsKindOf(CLASSINFO(wxTextCtrl)) ); + evtChangingValue = wxStaticCast(editor, wxTextCtrl)->GetValue(); + } + else + { + wxLogDebug(wxT("WARNING: wxEVT_PG_CHANGING is about to happen with old value.")); + } } } @@ -2873,9 +2853,20 @@ bool wxPropertyGrid::PerformValidation( wxPGProperty* p, wxVariant& pendingValue return false; } - // SendEvent returns true if event was vetoed - if ( SendEvent( wxEVT_PG_CHANGING, evtChangingProperty, &evtChangingValue, 0 ) ) - return false; + if ( flags & SendEvtChanging ) + { + // SendEvent returns true if event was vetoed + if ( SendEvent( wxEVT_PG_CHANGING, evtChangingProperty, &evtChangingValue, 0 ) ) + return false; + } + + if ( flags & IsStandaloneValidation ) + { + // If called in 'generic' context, we need to reset + // m_chgInfo_changedProperty and write back translated value. + m_chgInfo_changedProperty = NULL; + pendingValue = value; + } return true; } @@ -3113,6 +3104,30 @@ bool wxPropertyGrid::ChangePropertyValue( wxPGPropArg id, wxVariant newValue ) // ----------------------------------------------------------------------- +wxVariant wxPropertyGrid::GetUncommittedPropertyValue() +{ + wxPGProperty* prop = GetSelectedProperty(); + + if ( !prop ) + return wxNullVariant; + + wxTextCtrl* tc = GetEditorTextCtrl(); + wxVariant value = prop->GetValue(); + + if ( !tc || !IsEditorsValueModified() ) + return value; + + if ( !prop->StringToValue(value, tc->GetValue()) ) + return value; + + if ( !PerformValidation(prop, value, IsStandaloneValidation) ) + return prop->GetValue(); + + return value; +} + +// ----------------------------------------------------------------------- + // Runs wxValidator for the selected property bool wxPropertyGrid::DoEditorValidate() { @@ -3147,7 +3162,6 @@ void wxPropertyGrid::OnCustomEditorEvent( wxCommandEvent &event ) { wxPGProperty* selected = m_selected; - // // Somehow, event is handled after property has been deselected. // Possibly, but very rare. if ( !selected ) @@ -3246,7 +3260,7 @@ void wxPropertyGrid::OnCustomEditorEvent( wxCommandEvent &event ) if ( !PerformValidation(m_selected, pendingValue) ) validationFailure = true; - if ( validationFailure ) + if ( validationFailure) { OnValidationFailure(selected, pendingValue); } @@ -3256,10 +3270,24 @@ void wxPropertyGrid::OnCustomEditorEvent( wxCommandEvent &event ) DoPropertyChanged(selected, selFlags); EditorsValueWasNotModified(); + + // Regardless of editor type, unfocus editor on + // text-editing related enter press. + if ( event.GetEventType() == wxEVT_COMMAND_TEXT_ENTER ) + { + SetFocusOnCanvas(); + } } else { // No value after all + + // Regardless of editor type, unfocus editor on + // text-editing related enter press. + if ( event.GetEventType() == wxEVT_COMMAND_TEXT_ENTER ) + { + SetFocusOnCanvas(); + } // Let unhandled button click events go to the parent if ( !buttonWasHandled && event.GetEventType() == wxEVT_COMMAND_BUTTON_CLICKED ) @@ -3398,54 +3426,50 @@ void wxPropertyGrid::CustomSetCursor( int type, bool override ) // ----------------------------------------------------------------------- // Setups event handling for child control -void wxPropertyGrid::SetupChildEventHandling( wxWindow* argWnd, int id ) +void wxPropertyGrid::SetupChildEventHandling( wxWindow* argWnd ) { + wxWindowID id = argWnd->GetId(); + if ( argWnd == m_wndEditor ) { - this->Connect(id, wxEVT_MOTION, - wxMouseEventHandler(wxPropertyGrid::OnMouseMoveChild)); - this->Connect(id, wxEVT_LEFT_UP, - wxMouseEventHandler(wxPropertyGrid::OnMouseUpChild)); - this->Connect(id, wxEVT_LEFT_DOWN, - wxMouseEventHandler(wxPropertyGrid::OnMouseClickChild)); - this->Connect(id, wxEVT_RIGHT_UP, - wxMouseEventHandler(wxPropertyGrid::OnMouseRightClickChild)); - this->Connect(id, wxEVT_ENTER_WINDOW, - wxMouseEventHandler(wxPropertyGrid::OnMouseEntry)); - this->Connect(id, wxEVT_LEAVE_WINDOW, - wxMouseEventHandler(wxPropertyGrid::OnMouseEntry)); + argWnd->Connect(id, wxEVT_MOTION, + wxMouseEventHandler(wxPropertyGrid::OnMouseMoveChild), + NULL, this); + argWnd->Connect(id, wxEVT_LEFT_UP, + wxMouseEventHandler(wxPropertyGrid::OnMouseUpChild), + NULL, this); + argWnd->Connect(id, wxEVT_LEFT_DOWN, + wxMouseEventHandler(wxPropertyGrid::OnMouseClickChild), + NULL, this); + argWnd->Connect(id, wxEVT_RIGHT_UP, + wxMouseEventHandler(wxPropertyGrid::OnMouseRightClickChild), + NULL, this); + argWnd->Connect(id, wxEVT_ENTER_WINDOW, + wxMouseEventHandler(wxPropertyGrid::OnMouseEntry), + NULL, this); + argWnd->Connect(id, wxEVT_LEAVE_WINDOW, + wxMouseEventHandler(wxPropertyGrid::OnMouseEntry), + NULL, this); + argWnd->Connect(id, wxEVT_KEY_DOWN, + wxCharEventHandler(wxPropertyGrid::OnChildKeyDown), + NULL, this); } - else - { - this->Connect(id, wxEVT_NAVIGATION_KEY, - wxNavigationKeyEventHandler(wxPropertyGrid::OnNavigationKey)); - } - - this->Connect(id, wxEVT_KEY_DOWN, - wxKeyEventHandler(wxPropertyGrid::OnChildKeyDown)); - this->Connect(id, wxEVT_KEY_UP, - wxKeyEventHandler(wxPropertyGrid::OnChildKeyUp)); - this->Connect(id, wxEVT_KILL_FOCUS, - wxFocusEventHandler(wxPropertyGrid::OnFocusEvent)); } void wxPropertyGrid::FreeEditors() { // Do not free editors immediately if processing events - if ( !m_windowsToDelete ) - m_windowsToDelete = new wxArrayPtrVoid; - if ( m_wndEditor2 ) { - m_windowsToDelete->push_back(m_wndEditor2); m_wndEditor2->Hide(); + wxPendingDelete.Append( m_wndEditor2 ); m_wndEditor2 = (wxWindow*) NULL; } if ( m_wndEditor ) { - m_windowsToDelete->push_back(m_wndEditor); m_wndEditor->Hide(); + wxPendingDelete.Append( m_wndEditor ); m_wndEditor = (wxWindow*) NULL; } } @@ -3470,25 +3494,24 @@ bool wxPropertyGrid::DoSelectProperty( wxPGProperty* p, unsigned int flags ) wxPGProperty* prev = m_selected; - // - // Delete windows pending for deletion - if ( m_windowsToDelete && !m_inDoPropertyChanged && m_windowsToDelete->size() ) - { - unsigned int i; - - for ( i=0; isize(); i++ ) - delete ((wxWindow*)((*m_windowsToDelete)[i])); - - m_windowsToDelete->clear(); - } - if ( !m_pState ) { m_inDoSelectProperty = 0; return false; } - // +/* + if (m_selected) + wxPrintf( "Selected %s\n", m_selected->GetClassInfo()->GetClassName() ); + else + wxPrintf( "None selected\n" ); + + if (p) + wxPrintf( "P = %s\n", p->GetClassInfo()->GetClassName() ); + else + wxPrintf( "P = NULL\n" ); +*/ + // If we are frozen, then just set the values. if ( m_frozen ) { @@ -3620,10 +3643,15 @@ bool wxPropertyGrid::DoSelectProperty( wxPGProperty* p, unsigned int flags ) m_wndEditor = wndList.m_primary; m_wndEditor2 = wndList.m_secondary; + wxWindow* primaryCtrl = GetEditorControl(); + + // + // Essentially, primaryCtrl == m_wndEditor + // // NOTE: It is allowed for m_wndEditor to be NULL - in this case // value is drawn as normal, and m_wndEditor2 is assumed - // to be a right-aligned button that triggers a separate editor + // to be a right-aligned button that triggers a separate editorCtrl // window. if ( m_wndEditor ) @@ -3635,7 +3663,7 @@ bool wxPropertyGrid::DoSelectProperty( wxPGProperty* p, unsigned int flags ) #if wxUSE_VALIDATORS wxValidator* validator = p->GetValidator(); if ( validator ) - m_wndEditor->SetValidator(*validator); + primaryCtrl->SetValidator(*validator); #endif if ( m_wndEditor->GetSize().y > (m_lineHeight+6) ) @@ -3650,10 +3678,10 @@ bool wxPropertyGrid::DoSelectProperty( wxPGProperty* p, unsigned int flags ) // Fix TextCtrl indentation #if defined(__WXMSW__) && !defined(__WXWINCE__) wxTextCtrl* tc = NULL; - if ( m_wndEditor->IsKindOf(CLASSINFO(wxOwnerDrawnComboBox)) ) - tc = ((wxOwnerDrawnComboBox*)m_wndEditor)->GetTextCtrl(); + if ( primaryCtrl->IsKindOf(CLASSINFO(wxOwnerDrawnComboBox)) ) + tc = ((wxOwnerDrawnComboBox*)primaryCtrl)->GetTextCtrl(); else - tc = wxDynamicCast(m_wndEditor, wxTextCtrl); + tc = wxDynamicCast(primaryCtrl, wxTextCtrl); if ( tc ) ::SendMessage(GetHwndOf(tc), EM_SETMARGINS, EC_LEFTMARGIN | EC_RIGHTMARGIN, MAKELONG(0, 0)); #endif @@ -3679,8 +3707,7 @@ bool wxPropertyGrid::DoSelectProperty( wxPGProperty* p, unsigned int flags ) m_wndEditor->Move( goodPos ); #endif - wxWindow* primaryCtrl = GetEditorControl(); - SetupChildEventHandling(primaryCtrl, wxPG_SUBID1); + SetupChildEventHandling(primaryCtrl); // Focus and select all (wxTextCtrl, wxComboBox etc) if ( flags & wxPG_SEL_FOCUS ) @@ -3720,7 +3747,7 @@ bool wxPropertyGrid::DoSelectProperty( wxPGProperty* p, unsigned int flags ) #endif m_wndEditor2->Show(); - SetupChildEventHandling(m_wndEditor2,wxPG_SUBID2); + SetupChildEventHandling(m_wndEditor2); // If no primary editor, focus to button to allow // it to interprete ENTER etc. @@ -4641,13 +4668,13 @@ bool wxPropertyGrid::OnMouseCommon( wxMouseEvent& event, int* px, int* py ) int ux = event.m_x; int uy = event.m_y; - wxWindow* wnd = m_wndEditor; + wxWindow* wnd = GetEditorControl(); // Hide popup on clicks if ( event.GetEventType() != wxEVT_MOTION ) if ( wnd && wnd->IsKindOf(CLASSINFO(wxOwnerDrawnComboBox)) ) { - ((wxOwnerDrawnComboBox*)m_wndEditor)->HidePopup(); + ((wxOwnerDrawnComboBox*)wnd)->HidePopup(); } wxRect r; @@ -4796,8 +4823,6 @@ bool wxPropertyGrid::OnMouseChildCommon( wxMouseEvent &event, int* px, int *py ) int x, y; event.GetPosition(&x,&y); - AdjustPosForClipperWindow( topCtrlWnd, &x, &y ); - int splitterX = GetSplitterPosition(); wxRect r = topCtrlWnd->GetRect(); @@ -4866,17 +4891,6 @@ void wxPropertyGrid::OnMouseUpChild( wxMouseEvent &event ) // wxPropertyGrid keyboard event handling // ----------------------------------------------------------------------- -void wxPropertyGrid::SendNavigationKeyEvent( int dir ) -{ - wxNavigationKeyEvent evt; - evt.SetFlags(wxNavigationKeyEvent::FromTab| - (dir?wxNavigationKeyEvent::IsForward: - wxNavigationKeyEvent::IsBackward)); - evt.SetEventObject(this); - m_canvas->GetEventHandler()->AddPendingEvent(evt); -} - - int wxPropertyGrid::KeyEventToActions(wxKeyEvent &event, int* pSecond) const { // Translates wxKeyEvent to wxPG_ACTION_XXX @@ -4963,7 +4977,8 @@ void wxPropertyGrid::HandleKeyEvent(wxKeyEvent &event) if ( keycode == WXK_TAB ) { - SendNavigationKeyEvent( event.ShiftDown()?0:1 ); + if (m_selected) + DoSelectProperty( m_selected, wxPG_SEL_FOCUS ); return; } @@ -4982,7 +4997,7 @@ void wxPropertyGrid::HandleKeyEvent(wxKeyEvent &event) { // Show dialog? - if ( ButtonTriggerKeyTest(event) ) + if ( ButtonTriggerKeyTest(action, event) ) return; wxPGProperty* p = m_selected; @@ -5078,14 +5093,13 @@ bool wxPropertyGrid::HandleChildKey( wxKeyEvent& event ) // Update the control as well m_selected->GetEditorClass()->SetControlStringValue( m_selected, - m_wndEditor, + GetEditorControl(), m_selected->GetDisplayedString() ); } OnValidationFailureReset(m_selected); res = false; - UnfocusEditor(); } else if ( action == wxPG_ACTION_COPY ) @@ -5154,133 +5168,31 @@ bool wxPropertyGrid::HandleChildKey( wxKeyEvent& event ) void wxPropertyGrid::OnKey( wxKeyEvent &event ) { - - // - // Events to editor controls should get relayed here. - // - wxWindow* focused = wxWindow::FindFocus(); - - wxWindow* primaryCtrl = GetEditorControl(); - - if ( primaryCtrl && - (focused==primaryCtrl - || m_editorFocused) ) - { - // Child key must be processed here, since it can - // destroy the control which is referred by its own - // event handling. - HandleChildKey( event ); - } - else - HandleKeyEvent( event ); + HandleKeyEvent( event ); } // ----------------------------------------------------------------------- void wxPropertyGrid::OnKeyUp(wxKeyEvent &event) { - m_keyComboConsumed = 0; - event.Skip(); } // ----------------------------------------------------------------------- -void wxPropertyGrid::OnNavigationKey( wxNavigationKeyEvent& event ) +bool wxPropertyGrid::ButtonTriggerKeyTest( int action, wxKeyEvent& event ) { - // Ignore events that occur very close to focus set - if ( m_iFlags & wxPG_FL_IGNORE_NEXT_NAVKEY ) + if ( action == -1 ) { - m_iFlags &= ~(wxPG_FL_IGNORE_NEXT_NAVKEY); - event.Skip(); - return; - } - - wxPGProperty* next = (wxPGProperty*) NULL; - - int dir = event.GetDirection()?1:-1; - - if ( m_selected ) - { - if ( dir == 1 && (m_wndEditor || m_wndEditor2) ) - { - wxWindow* focused = wxWindow::FindFocus(); - - wxWindow* wndToCheck = GetEditorControl(); - - // ODComboBox focus goes to its text ctrl, so we need to use it instead - if ( wndToCheck && wndToCheck->IsKindOf(CLASSINFO(wxOwnerDrawnComboBox)) ) - { - wxTextCtrl* comboTextCtrl = ((wxOwnerDrawnComboBox*)wndToCheck)->GetTextCtrl(); - if ( comboTextCtrl ) - wndToCheck = comboTextCtrl; - } - - /* - // Because of problems navigating from wxButton, do not go to it. - if ( !wndToCheck ) - { - // No primary, use secondary - wndToCheck = m_wndEditor2; - } - // If it has editor button, focus to it after the primary editor. - // NB: Doesn't work since wxButton on wxMSW doesn't seem to propagate - // key events (yes, I'm using wxWANTS_CHARS with it, and yes I - // have somewhat debugged in window.cpp itself). - else if ( focused == wndToCheck && - m_wndEditor2 && - !(GetExtraStyle() & wxPG_EX_NO_TAB_TO_BUTTON) ) - { - wndToCheck = m_wndEditor2; - wxLogDebug(wxT("Exp1")); - } - */ - - if ( focused != wndToCheck && - wndToCheck ) - { - wndToCheck->SetFocus(); - - // Select all text in wxTextCtrl etc. - if ( m_wndEditor && wndToCheck == m_wndEditor ) - m_selected->GetEditorClass()->OnFocus(m_selected,wndToCheck); - - m_editorFocused = 1; - next = m_selected; - } - } - - if ( !next ) - { - next = wxPropertyGridIterator::OneStep(m_pState, wxPG_ITERATE_VISIBLE, m_selected, dir); - - if ( next ) - { - // This allows preventing NavigateOut to occur - DoSelectProperty( next, wxPG_SEL_FOCUS ); - } - } + int secondAction; + action = KeyEventToActions(event, &secondAction); } - if ( !next ) - event.Skip(); -} - -// ----------------------------------------------------------------------- - -bool wxPropertyGrid::ButtonTriggerKeyTest( wxKeyEvent &event ) -{ - int keycode = event.GetKeyCode(); - // Does the keycode trigger button? - if ( keycode == m_pushButKeyCode && - m_wndEditor2 && - (!m_pushButKeyCodeNeedsAlt || event.AltDown()) && - (!m_pushButKeyCodeNeedsCtrl || event.ControlDown()) ) + if ( action == wxPG_ACTION_PRESS_BUTTON && + m_wndEditor2 ) { - m_keyComboConsumed = 1; - - wxCommandEvent evt(wxEVT_COMMAND_BUTTON_CLICKED,m_wndEditor2->GetId()); + wxCommandEvent evt(wxEVT_COMMAND_BUTTON_CLICKED, m_wndEditor2->GetId()); GetEventHandler()->AddPendingEvent(evt); return true; } @@ -5302,7 +5214,7 @@ void wxPropertyGrid::OnChildKeyDown( wxKeyEvent &event ) return; } - if ( ButtonTriggerKeyTest(event) ) + if ( ButtonTriggerKeyTest(-1, event) ) return; if ( HandleChildKey(event) == true ) @@ -5313,8 +5225,6 @@ void wxPropertyGrid::OnChildKeyDown( wxKeyEvent &event ) void wxPropertyGrid::OnChildKeyUp( wxKeyEvent &event ) { - m_keyComboConsumed = 0; - GetEventHandler()->AddPendingEvent(event); event.Skip(); @@ -5361,13 +5271,8 @@ void wxPropertyGrid::HandleFocusChange( wxWindow* newFocused ) if ( (m_iFlags & wxPG_FL_FOCUSED) != (oldFlags & wxPG_FL_FOCUSED) ) { - // On each focus kill, mark the next nav key event - // to be ignored (can't do on set focus since the - // event would occur before it). if ( !(m_iFlags & wxPG_FL_FOCUSED) ) { - m_iFlags |= wxPG_FL_IGNORE_NEXT_NAVKEY; - // Need to store changed value CommitChangesFromEditor(); } @@ -5400,8 +5305,6 @@ void wxPropertyGrid::HandleFocusChange( wxWindow* newFocused ) } */ - - m_iFlags &= ~(wxPG_FL_IGNORE_NEXT_NAVKEY); } // Redraw selected @@ -5471,6 +5374,13 @@ wxPGEditor* wxPropertyGrid::RegisterEditorClass( wxPGEditor* editorClass, // Existing editor under this name? wxPGHashMapS2P::iterator vt_it = wxPGGlobalVars->m_mapEditorClasses.find(name); + if ( vt_it != wxPGGlobalVars->m_mapEditorClasses.end() ) + { + // If this name was already used, try class name. + name = editorClass->GetClassInfo()->GetClassName(); + vt_it = wxPGGlobalVars->m_mapEditorClasses.find(name); + } + wxCHECK_MSG( vt_it == wxPGGlobalVars->m_mapEditorClasses.end(), (wxPGEditor*) vt_it->second, "Editor with given name was already registered" ); @@ -5480,6 +5390,14 @@ wxPGEditor* wxPropertyGrid::RegisterEditorClass( wxPGEditor* editorClass, return editorClass; } +// Use this in RegisterDefaultEditors. +#define wxPGRegisterDefaultEditorClass(EDITOR) \ + if ( wxPGEditor_##EDITOR == (wxPGEditor*) NULL ) \ + { \ + wxPGEditor_##EDITOR = wxPropertyGrid::RegisterEditorClass( \ + new wxPG##EDITOR##Editor, true ); \ + } + // Registers all default editor classes void wxPropertyGrid::RegisterDefaultEditors() { @@ -5611,11 +5529,7 @@ void wxPGChoicesData::Clear() delete Item(i); } -#if wxUSE_STL - m_items.resize(0); -#else - m_items.Empty(); -#endif + m_items.clear(); } void wxPGChoicesData::CopyDataFrom( wxPGChoicesData* data ) @@ -5760,7 +5674,8 @@ void wxPGChoices::RemoveAt(size_t nIndex, size_t count) unsigned int i; for ( i=nIndex; i<(nIndex+count); i++) delete m_data->Item(i); - m_data->m_items.RemoveAt(nIndex, count); + m_data->m_items.erase(m_data->m_items.begin()+nIndex, + m_data->m_items.begin()+nIndex+count); } // -----------------------------------------------------------------------