X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/ea5af9c5356676a5c4d81b4d4915ad32ca3c9c6e..8ba80c6f8325e61de2e3fc4bbd7cf3d750f432cd:/src/propgrid/propgrid.cpp diff --git a/src/propgrid/propgrid.cpp b/src/propgrid/propgrid.cpp index 05bfa384e8..2fbaf76534 100644 --- a/src/propgrid/propgrid.cpp +++ b/src/propgrid/propgrid.cpp @@ -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 { @@ -1174,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 ) { @@ -2730,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. @@ -2799,34 +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 ) - { - evtChangingProperty->AdaptListToValue( bcpPendingList, &evtChangingValue ); - } - else + // 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) ) { - 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) ) { - 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.")); + 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.")); + } } } @@ -2848,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; } @@ -3088,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() { @@ -3418,6 +3458,25 @@ void wxPropertyGrid::SetupChildEventHandling( wxWindow* argWnd ) void wxPropertyGrid::FreeEditors() { + // + // Return focus back to canvas from children (this is required at least for + // GTK+, which, unlike Windows, clears focus when control is destroyed + // instead of moving it to closest parent). + wxWindow* focus = wxWindow::FindFocus(); + if ( focus ) + { + wxWindow* parent = focus->GetParent(); + while ( parent ) + { + if ( parent == m_canvas ) + { + SetFocusOnCanvas(); + break; + } + parent = parent->GetParent(); + } + } + // Do not free editors immediately if processing events if ( m_wndEditor2 ) { @@ -5334,6 +5393,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" ); @@ -5343,6 +5409,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() {