X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/4d18ddc7bf2896d7dce1bb404c741dbc90cfe8aa..0571b62b887f2d9b02084e027e01c1d4881a4713:/src/propgrid/propgridpagestate.cpp diff --git a/src/propgrid/propgridpagestate.cpp b/src/propgrid/propgridpagestate.cpp index 57668950d1..8f5d8a0325 100644 --- a/src/propgrid/propgridpagestate.cpp +++ b/src/propgrid/propgridpagestate.cpp @@ -206,7 +206,6 @@ wxPropertyGridPageState::wxPropertyGridPageState() m_properties = &m_regularArray; m_abcArray = NULL; m_currentCategory = NULL; - m_selected = NULL; m_width = 0; m_virtualHeight = 0; m_lastCaptionBottomnest = 1; @@ -216,6 +215,9 @@ wxPropertyGridPageState::wxPropertyGridPageState() m_colWidths.push_back( wxPG_DEFAULT_SPLITTERX ); m_colWidths.push_back( wxPG_DEFAULT_SPLITTERX ); m_fSplitterX = wxPG_DEFAULT_SPLITTERX; + + // By default, we only have the 'value' column editable + m_editableColumns.push_back(1); } // ----------------------------------------------------------------------- @@ -274,7 +276,7 @@ void wxPropertyGridPageState::DoClear() } else { - m_selected = NULL; + m_selection.clear(); } m_regularArray.Empty(); @@ -606,23 +608,6 @@ bool wxPropertyGridPageState::EnableCategories( bool enable ) // ----------------------------------------------------------------------- -#if wxUSE_STL -#include - -static bool wxPG_SortFunc_ByFunction(wxPGProperty *p1, wxPGProperty *p2) -{ - wxPropertyGrid* pg = p1->GetGrid(); - wxPGSortCallback sortFunction = pg->GetSortFunction(); - return sortFunction(pg, p1, p2) < 0; -} - -static bool wxPG_SortFunc_ByLabel(wxPGProperty *p1, wxPGProperty *p2) -{ - return p1->GetLabel().CmpNoCase( p2->GetLabel() ) < 0; -} - -#else - static int wxPG_SortFunc_ByFunction(wxPGProperty **pp1, wxPGProperty **pp2) { wxPGProperty *p1 = *pp1; @@ -639,6 +624,24 @@ static int wxPG_SortFunc_ByLabel(wxPGProperty **pp1, wxPGProperty **pp2) return p1->GetLabel().CmpNoCase( p2->GetLabel() ); } +#if 0 +// +// For wxVector w/ wxUSE_STL=1, you would use code like this instead: +// + +#include + +static bool wxPG_SortFunc_ByFunction(wxPGProperty *p1, wxPGProperty *p2) +{ + wxPropertyGrid* pg = p1->GetGrid(); + wxPGSortCallback sortFunction = pg->GetSortFunction(); + return sortFunction(pg, p1, p2) < 0; +} + +static bool wxPG_SortFunc_ByLabel(wxPGProperty *p1, wxPGProperty *p2) +{ + return p1->GetLabel().CmpNoCase( p2->GetLabel() ) < 0; +} #endif void wxPropertyGridPageState::DoSortChildren( wxPGProperty* p, @@ -659,18 +662,21 @@ void wxPropertyGridPageState::DoSortChildren( wxPGProperty* p, && !p->IsCategory() && !p->IsRoot() ) return; -#if wxUSE_STL + if ( GetGrid()->GetSortFunction() ) + p->m_children.Sort( wxPG_SortFunc_ByFunction ); + else + p->m_children.Sort( wxPG_SortFunc_ByLabel ); + +#if 0 + // + // For wxVector w/ wxUSE_STL=1, you would use code like this instead: + // if ( GetGrid()->GetSortFunction() ) std::sort(p->m_children.begin(), p->m_children.end(), wxPG_SortFunc_ByFunction); else std::sort(p->m_children.begin(), p->m_children.end(), wxPG_SortFunc_ByLabel); -#else - if ( GetGrid()->GetSortFunction() ) - p->m_children.Sort( wxPG_SortFunc_ByFunction ); - else - p->m_children.Sort( wxPG_SortFunc_ByLabel ); #endif // Fix indices @@ -727,11 +733,13 @@ wxPGProperty* wxPropertyGridPageState::DoGetItemAtY( int y ) const // ----------------------------------------------------------------------- -wxPropertyGridHitTestResult wxPropertyGridPageState::HitTest( const wxPoint&pt ) const +wxPropertyGridHitTestResult +wxPropertyGridPageState::HitTest( const wxPoint&pt ) const { wxPropertyGridHitTestResult result; - result.column = HitTestH( pt.x, &result.splitter, &result.splitterHitOffset ); - result.property = DoGetItemAtY( pt.y ); + result.m_column = HitTestH( pt.x, &result.m_splitter, + &result.m_splitterHitOffset ); + result.m_property = DoGetItemAtY( pt.y ); return result; } @@ -1150,7 +1158,8 @@ bool wxPropertyGridPageState::DoSetPropertyValueString( wxPGProperty* p, const w if ( res ) { p->SetValue(variant); - if ( m_selected==p && this==m_pPropGrid->GetState() ) + if ( p == m_pPropGrid->GetSelection() && + this == m_pPropGrid->GetState() ) m_pPropGrid->RefreshEditor(); } @@ -1166,7 +1175,8 @@ bool wxPropertyGridPageState::DoSetPropertyValue( wxPGProperty* p, wxVariant& va if ( p ) { p->SetValue(value); - if ( m_selected==p && this==m_pPropGrid->GetState() ) + if ( p == m_pPropGrid->GetSelection() && + this == m_pPropGrid->GetState() ) m_pPropGrid->RefreshEditor(); return true; @@ -1192,6 +1202,59 @@ bool wxPropertyGridPageState::DoSetPropertyValueWxObjectPtr( wxPGProperty* p, wx // wxPropertyGridPageState property operations // ----------------------------------------------------------------------- +bool wxPropertyGridPageState::DoIsPropertySelected( wxPGProperty* prop ) const +{ + const wxArrayPGProperty& selection = m_selection; + + for ( unsigned int i=0; iGetState() == this ) + { + // If first item (ie. one with the active editor) was + // deselected, then we need to take some extra measures. + wxArrayPGProperty sel = m_selection; + sel.erase( sel.begin() + i ); + + wxPGProperty* newFirst; + if ( sel.size() ) + newFirst = sel[0]; + else + newFirst = NULL; + + pg->DoSelectProperty(newFirst, + wxPG_SEL_DONT_SEND_EVENT); + + m_selection = sel; + + pg->Refresh(); + } + else + { + m_selection.erase( m_selection.begin() + i ); + } + return; + } + } +} + +// ----------------------------------------------------------------------- + bool wxPropertyGridPageState::DoCollapse( wxPGProperty* p ) { wxCHECK_MSG( p, false, wxT("invalid property id") ); @@ -1231,7 +1294,7 @@ bool wxPropertyGridPageState::DoSelectProperty( wxPGProperty* p, unsigned int fl if ( this == m_pPropGrid->GetState() ) return m_pPropGrid->DoSelectProperty( p, flags ); - m_selected = p; + DoSetSelection(p); return true; } @@ -1711,6 +1774,25 @@ void wxPropertyGridPageState::DoDelete( wxPGProperty* item, bool doDelete ) wxCHECK_RET( !parent->HasFlag(wxPG_PROP_AGGREGATE), wxT("wxPropertyGrid: Do not attempt to remove sub-properties.") ); + wxASSERT( item->GetParentState() == this ); + + wxPropertyGrid* pg = GetGrid(); + + if ( DoIsPropertySelected(item) ) + { + if ( pg && pg->GetState() == this ) + { + pg->DoRemoveFromSelection(item, + wxPG_SEL_DELETING|wxPG_SEL_NOVALIDATE); + } + else + { + DoRemoveFromSelection(item); + } + } + + item->SetFlag(wxPG_PROP_BEING_DELETED); + // Delete children if ( item->GetChildCount() && !item->HasFlag(wxPG_PROP_AGGREGATE) ) { @@ -1776,15 +1858,13 @@ void wxPropertyGridPageState::DoDelete( wxPGProperty* item, bool doDelete ) } } - if ( item->GetBaseName().length() && + if ( item->GetBaseName().length() && (parent->IsCategory() || parent->IsRoot()) ) m_dictName.erase(item->GetBaseName()); - wxPropertyGrid* pg = GetGrid(); - - // We need to clear parent grid's m_propHover, if it matches item - if ( pg && pg->m_propHover == item ) - pg->m_propHover = NULL; + // We need to clear parent grid's m_propHover, if it matches item + if ( pg && pg->m_propHover == item ) + pg->m_propHover = NULL; // We can actually delete it now if ( doDelete )