X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/1621f192d95b44c5909a788b8f1fe9e9c381df72..a188ac2988b6fedeead7a809124b8eaa2290c020:/src/propgrid/propgridiface.cpp diff --git a/src/propgrid/propgridiface.cpp b/src/propgrid/propgridiface.cpp index 3b4bfe078c..ea0b4ee072 100644 --- a/src/propgrid/propgridiface.cpp +++ b/src/propgrid/propgridiface.cpp @@ -56,173 +56,8 @@ const wxChar *wxPGTypeName_wxArrayString = wxT("arrstring"); WX_PG_IMPLEMENT_VARIANT_DATA_EXPORTED(wxPoint, WXDLLIMPEXP_PROPGRID) WX_PG_IMPLEMENT_VARIANT_DATA_EXPORTED(wxSize, WXDLLIMPEXP_PROPGRID) WX_PG_IMPLEMENT_VARIANT_DATA_EXPORTED_DUMMY_EQ(wxArrayInt, WXDLLIMPEXP_PROPGRID) - -// For wxLongLong and wxULongLong have custom classname << variant -// implementation for improved flexibility. -WX_PG_IMPLEMENT_VARIANT_DATA_EXPORTED_NO_EQ_NO_GETTER(wxLongLong, WXDLLIMPEXP_PROPGRID) -WX_PG_IMPLEMENT_VARIANT_DATA_EQ(wxLongLong, WXDLLIMPEXP_PROPGRID) -WXDLLIMPEXP_PROPGRID wxLongLong& operator << ( wxLongLong &value, const wxVariant &variant ) -{ - wxLongLong_t ll; - if ( !wxPGVariantToLongLong(variant, &ll) ) - { - wxFAIL_MSG("Cannot convert to wxLongLong"); - } - value = ll; - return value; -} -WXDLLIMPEXP_PROPGRID wxLongLong_t& operator << ( wxLongLong_t &value, const wxVariant &variant ) -{ - if ( !wxPGVariantToLongLong(variant, &value) ) - { - wxFAIL_MSG("Cannot convert to wxLongLong"); - } - return value; -} - -WX_PG_IMPLEMENT_VARIANT_DATA_EXPORTED_NO_EQ_NO_GETTER(wxULongLong, WXDLLIMPEXP_PROPGRID) -WX_PG_IMPLEMENT_VARIANT_DATA_EQ(wxULongLong, WXDLLIMPEXP_PROPGRID) -WXDLLIMPEXP_PROPGRID wxULongLong& operator << ( wxULongLong &value, const wxVariant &variant ) -{ - wxULongLong_t ull; - if ( !wxPGVariantToULongLong(variant, &ull) ) - { - wxFAIL_MSG("Cannot convert to wxULongLong"); - } - value = ull; - return value; -} -WXDLLIMPEXP_PROPGRID wxULongLong_t& operator << ( wxULongLong_t &value, const wxVariant &variant ) -{ - if ( !wxPGVariantToULongLong(variant, &value) ) - { - wxFAIL_MSG("Cannot convert to wxULongLong"); - } - return value; -} - IMPLEMENT_VARIANT_OBJECT_EXPORTED(wxFont, WXDLLIMPEXP_PROPGRID) -// ----------------------------------------------------------------------- -// wxVariant helpers -// ----------------------------------------------------------------------- - -long wxPGVariantToInt( const wxVariant& variant, long defVal ) -{ - if ( variant.IsNull() ) - return defVal; - - if ( variant.GetType() == wxS("long") ) - return variant.GetLong(); - - if ( variant.GetType() == wxS("bool") ) - return variant.GetBool() ? 1 : 0; - - if ( variant.GetType() == wxS("wxLongLong") ) - { - wxLongLong ll; - ll << variant; - if ( ll >= LONG_MAX ) - return LONG_MAX; - else if ( ll <= LONG_MIN ) - return LONG_MIN; - return ll.ToLong(); - } - - long l = defVal; - - if ( variant.GetType() == wxPG_VARIANT_TYPE_STRING ) - variant.GetString().ToLong(&l, 0); - - return l; -} - -// ----------------------------------------------------------------------- - -bool wxPGVariantToLongLong( const wxVariant& variant, wxLongLong_t* pResult ) -{ - if ( variant.IsNull() ) - return false; - - wxString variantType = variant.GetType(); - - if ( variantType == wxPG_VARIANT_TYPE_LONG ) - { - *pResult = variant.GetLong(); - return true; - } - - if ( variantType == wxLongLong_VariantType ) - { - // NOTE: << operator uses this functions, so we can't use it here - *pResult = wxLongLongRefFromVariant(variant).GetValue(); - return true; - } - - return false; -} - -// ----------------------------------------------------------------------- - -bool wxPGVariantToULongLong( const wxVariant& variant, wxULongLong_t* pResult ) -{ - if ( variant.IsNull() ) - return false; - - wxString variantType = variant.GetType(); - - if ( variantType == wxPG_VARIANT_TYPE_LONG ) - { - *pResult = (unsigned long)variant.GetLong(); - return true; - } - - if ( variantType == wxULongLong_VariantType ) - { - // NOTE: << operator uses this functions, so we can't use it here - *pResult = wxULongLongRefFromVariant(variant).GetValue(); - return true; - } - - return false; -} - -// ----------------------------------------------------------------------- - -bool wxPGVariantToDouble( const wxVariant& variant, double* pResult ) -{ - if ( variant.IsNull() ) - return false; - - wxString variantType = variant.GetType(); - - if ( variantType == wxPG_VARIANT_TYPE_DOUBLE ) - { - *pResult = variant.GetDouble(); - return true; - } - - if ( variantType == wxPG_VARIANT_TYPE_LONG ) - { - *pResult = (double)variant.GetLong(); - return true; - } - - if ( variantType == wxLongLong_VariantType ) - { - wxLongLong ll; - ll << variant; - *pResult = ll.ToDouble(); - return true; - } - - if ( variantType == wxPG_VARIANT_TYPE_STRING ) - if ( variant.GetString().ToDouble(pResult) ) - return true; - - return false; -} - // ----------------------------------------------------------------------- // wxPGPropArgCls // ----------------------------------------------------------------------- @@ -317,9 +152,38 @@ void wxPropertyGridInterface::DeleteProperty( wxPGPropArg id ) if ( grid->GetState() == state ) grid->DoSelectProperty(NULL, wxPG_SEL_DELETING|wxPG_SEL_NOVALIDATE); - state->DoDelete( p ); + state->DoDelete( p, true ); + + RefreshGrid(state); +} + +// ----------------------------------------------------------------------- + +wxPGProperty* wxPropertyGridInterface::RemoveProperty( wxPGPropArg id ) +{ + wxPG_PROP_ARG_CALL_PROLOG_RETVAL(wxNullProperty) + + wxCHECK( !p->GetChildCount() || p->HasFlag(wxPG_PROP_AGGREGATE), + wxNullProperty); + + wxPropertyGridPageState* state = p->GetParentState(); + wxPropertyGrid* grid = state->GetGrid(); + + if ( grid->GetState() == state ) + { + grid->DoSelectProperty(NULL, + wxPG_SEL_DELETING|wxPG_SEL_NOVALIDATE); + } + + state->DoDelete( p, false ); + + // Mark the property as 'unattached' + p->m_parentState = NULL; + p->m_parent = NULL; RefreshGrid(state); + + return p; } // ----------------------------------------------------------------------- @@ -361,11 +225,16 @@ bool wxPropertyGridInterface::ClearSelection( bool validation ) flags |= wxPG_SEL_NOVALIDATE; wxPropertyGridPageState* state = m_pState; - wxPropertyGrid* pg = state->GetGrid(); - if ( pg->GetState() == state ) - return pg->DoSelectProperty(NULL, flags); - else - state->SetSelection(NULL); + + if ( state ) + { + wxPropertyGrid* pg = state->GetGrid(); + if ( pg->GetState() == state ) + return pg->DoSelectProperty(NULL, flags); + else + state->SetSelection(NULL); + } + return true; } @@ -464,18 +333,6 @@ bool wxPropertyGridInterface::ExpandAll( bool doExpand ) // ----------------------------------------------------------------------- -void wxPropertyGridInterface::SetPropertyValueUnspecified( wxPGPropArg id ) -{ - wxPG_PROP_ARG_CALL_PROLOG() - wxPropertyGrid* propGrid = p->GetGridIfDisplayed(); - if ( propGrid ) - propGrid->DoSetPropertyValueUnspecified(p); - else - p->GetParentState()->DoSetPropertyValueUnspecified(p); -} - -// ----------------------------------------------------------------------- - void wxPropertyGridInterface::ClearModifiedStatus() { unsigned int pageIndex = 0; @@ -489,6 +346,9 @@ void wxPropertyGridInterface::ClearModifiedStatus() pageIndex++; } + + // Update active editor control, if any + GetPropertyGrid()->RefreshEditor(); } // ----------------------------------------------------------------------- @@ -518,13 +378,7 @@ void wxPropertyGridInterface::SetPropVal( wxPGPropArg id, wxVariant& value ) wxPG_PROP_ARG_CALL_PROLOG() if ( p ) - { p->SetValue(value); - wxPropertyGrid* propGrid = p->GetGridIfDisplayed(); - if ( propGrid ) - propGrid->DrawItemAndValueRelated( p ); - - } } // ----------------------------------------------------------------------- @@ -533,12 +387,8 @@ void wxPropertyGridInterface::SetPropertyValueString( wxPGPropArg id, const wxSt { wxPG_PROP_ARG_CALL_PROLOG() - if ( m_pState->DoSetPropertyValueString(p,value) ) - { - wxPropertyGrid* propGrid = p->GetGridIfDisplayed(); - if ( propGrid ) - propGrid->DrawItemAndValueRelated( p ); - } + if ( p ) + m_pState->DoSetPropertyValueString(p, value); } // ----------------------------------------------------------------------- @@ -725,6 +575,25 @@ bool wxPropertyGridInterface::Expand( wxPGPropArg id ) // ----------------------------------------------------------------------- +void wxPropertyGridInterface::Sort( int flags ) +{ + wxPropertyGrid* pg = GetPropertyGrid(); + + pg->ClearSelection(false); + + unsigned int pageIndex = 0; + + for (;;) + { + wxPropertyGridPageState* page = GetPageState(pageIndex); + if ( !page ) break; + page->DoSort(flags); + pageIndex++; + } +} + +// ----------------------------------------------------------------------- + void wxPropertyGridInterface::SetPropertyLabel( wxPGPropArg id, const wxString& newproplabel ) { wxPG_PROP_ARG_CALL_PROLOG() @@ -1003,7 +872,7 @@ wxString wxPropertyGridInterface::SaveEditableState( int includedStates ) const if ( !p->HasFlag(wxPG_PROP_COLLAPSED) ) result += EscapeDelimiters(p->GetName()); - result += wxS(","); + result += wxS(","); }