X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/1c4293cb91327247ad69e6ec8d589bfaa299db28..622f7a49ef5ddf9a47096e14bf1f8d93be3c8668:/src/propgrid/propgridiface.cpp diff --git a/src/propgrid/propgridiface.cpp b/src/propgrid/propgridiface.cpp index bf59ef0305..75bf8bdd52 100644 --- a/src/propgrid/propgridiface.cpp +++ b/src/propgrid/propgridiface.cpp @@ -16,6 +16,8 @@ #pragma hdrstop #endif +#if wxUSE_PROPGRID + #ifndef WX_PRECOMP #include "wx/defs.h" #include "wx/object.h" @@ -30,21 +32,9 @@ #include "wx/button.h" #include "wx/pen.h" #include "wx/brush.h" - #include "wx/cursor.h" - #include "wx/dialog.h" #include "wx/settings.h" - #include "wx/msgdlg.h" - #include "wx/choice.h" - #include "wx/stattext.h" - #include "wx/scrolwin.h" - #include "wx/dirdlg.h" - #include "wx/layout.h" #include "wx/sizer.h" - #include "wx/textdlg.h" - #include "wx/filedlg.h" - #include "wx/statusbr.h" #include "wx/intl.h" - #include "wx/frame.h" #endif #include @@ -63,30 +53,55 @@ const wxChar *wxPGTypeName_wxArrayString = wxT("arrstring"); // VariantDatas // ---------------------------------------------------------------------------- -WX_PG_IMPLEMENT_VARIANT_DATA(wxPGVariantDataPoint, wxPoint) -WX_PG_IMPLEMENT_VARIANT_DATA(wxPGVariantDataSize, wxSize) -WX_PG_IMPLEMENT_VARIANT_DATA(wxPGVariantDataArrayInt, wxArrayInt) -WX_PG_IMPLEMENT_VARIANT_DATA(wxPGVariantDataLongLong, wxLongLong) -WX_PG_IMPLEMENT_VARIANT_DATA(wxPGVariantDataULongLong, wxULongLong) - -WX_PG_IMPLEMENT_WXOBJECT_VARIANT_DATA(wxPGVariantDataFont, wxFont) +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) -wxObject* wxPG_VariantToWxObject( const wxVariant& variant, wxClassInfo* classInfo ) +// 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 ) { - if ( !variant.IsValueKindOf(classInfo) ) - return (wxObject*) NULL; - - wxVariantData* vdata = variant.GetData(); - - wxPGVariantData* pgvdata = wxDynamicCastVariantData(vdata, wxPGVariantData); - if ( pgvdata ) - return (wxObject*) pgvdata->GetValuePtr(); - - if ( wxPGIsVariantClassInfo(wxPGVariantDataGetClassInfo(vdata), wxobject) ) - return variant.GetWxObjectPtr(); + 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; +} - return (wxObject*) NULL; +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 @@ -97,15 +112,16 @@ long wxPGVariantToInt( const wxVariant& variant, long defVal ) if ( variant.IsNull() ) return defVal; - if ( wxPGIsVariantType(variant, long) ) + if ( variant.GetType() == wxS("long") ) return variant.GetLong(); - if ( wxPGIsVariantType(variant, bool) ) + if ( variant.GetType() == wxS("bool") ) return variant.GetBool() ? 1 : 0; - if ( typeid(*variant.GetData()) == typeid(wxPGVariantDataLongLong) ) + if ( variant.GetType() == wxS("wxLongLong") ) { - wxLongLong ll = ((const wxPGVariantDataLongLong&)variant).GetValue(); + wxLongLong ll; + ll << variant; if ( ll >= LONG_MAX ) return LONG_MAX; else if ( ll <= LONG_MIN ) @@ -115,7 +131,7 @@ long wxPGVariantToInt( const wxVariant& variant, long defVal ) long l = defVal; - if ( wxPGIsVariantType(variant, string) ) + if ( variant.GetType() == wxPG_VARIANT_TYPE_STRING ) variant.GetString().ToLong(&l, 0); return l; @@ -128,15 +144,18 @@ bool wxPGVariantToLongLong( const wxVariant& variant, wxLongLong_t* pResult ) if ( variant.IsNull() ) return false; - if ( wxPGIsVariantType(variant, long) ) + wxString variantType = variant.GetType(); + + if ( variantType == wxPG_VARIANT_TYPE_LONG ) { *pResult = variant.GetLong(); return true; } - if ( typeid(*variant.GetData()) == typeid(wxPGVariantDataLongLong) ) + if ( variantType == wxLongLong_VariantType ) { - *pResult = ((const wxPGVariantDataLongLong&)variant).GetValue().GetValue(); + // NOTE: << operator uses this functions, so we can't use it here + *pResult = wxLongLongRefFromVariant(variant).GetValue(); return true; } @@ -150,15 +169,18 @@ bool wxPGVariantToULongLong( const wxVariant& variant, wxULongLong_t* pResult ) if ( variant.IsNull() ) return false; - if ( wxPGIsVariantType(variant, long) ) + wxString variantType = variant.GetType(); + + if ( variantType == wxPG_VARIANT_TYPE_LONG ) { *pResult = (unsigned long)variant.GetLong(); return true; } - if ( typeid(*variant.GetData()) == typeid(wxPGVariantDataULongLong) ) + if ( variantType == wxULongLong_VariantType ) { - *pResult = ((const wxPGVariantDataULongLong&)variant).GetValue().GetValue(); + // NOTE: << operator uses this functions, so we can't use it here + *pResult = wxULongLongRefFromVariant(variant).GetValue(); return true; } @@ -172,26 +194,29 @@ bool wxPGVariantToDouble( const wxVariant& variant, double* pResult ) if ( variant.IsNull() ) return false; - if ( wxPGIsVariantType(variant, double) ) + wxString variantType = variant.GetType(); + + if ( variantType == wxPG_VARIANT_TYPE_DOUBLE ) { *pResult = variant.GetDouble(); return true; } - if ( wxPGIsVariantType(variant, long) ) + if ( variantType == wxPG_VARIANT_TYPE_LONG ) { *pResult = (double)variant.GetLong(); return true; } - if ( typeid(*variant.GetData()) == typeid(wxPGVariantDataLongLong) ) + if ( variantType == wxLongLong_VariantType ) { - wxLongLong ll = ((const wxPGVariantDataLongLong&)variant).GetValue(); + wxLongLong ll; + ll << variant; *pResult = ll.ToDouble(); return true; } - if ( wxPGIsVariantType(variant, string) ) + if ( variantType == wxPG_VARIANT_TYPE_STRING ) if ( variant.GetString().ToDouble(pResult) ) return true; @@ -199,38 +224,30 @@ bool wxPGVariantToDouble( const wxVariant& variant, double* pResult ) } // ----------------------------------------------------------------------- -// Choice related methods +// wxPGPropArgCls // ----------------------------------------------------------------------- -void wxPropertyGridInterface::AddPropertyChoice( wxPGPropArg id, - const wxString& label, - int value ) -{ - wxPG_PROP_ARG_CALL_PROLOG() - - p->InsertChoice(label,-1,value); -} - - -void wxPropertyGridInterface::InsertPropertyChoice( wxPGPropArg id, - const wxString& label, - int index, - int value ) -{ - wxPG_PROP_ARG_CALL_PROLOG() - - p->InsertChoice(label,index,value); -} - - -void wxPropertyGridInterface::DeletePropertyChoice( wxPGPropArg id, - int index ) +wxPGProperty* wxPGPropArgCls::GetPtr( wxPropertyGridInterface* iface ) const { - wxPG_PROP_ARG_CALL_PROLOG() + if ( m_flags == IsProperty ) + { + wxASSERT_MSG( m_ptr.property, wxT("invalid property ptr") ); + return m_ptr.property; + } + else if ( m_flags & IsWxString ) + return iface->GetPropertyByNameA(*m_ptr.stringName); + else if ( m_flags & IsCharPtr ) + return iface->GetPropertyByNameA(m_ptr.charName); +#if wxUSE_WCHAR_T + else if ( m_flags & IsWCharPtr ) + return iface->GetPropertyByNameA(m_ptr.wcharName); +#endif - p->DeleteChoice(index); + return NULL; } +// ----------------------------------------------------------------------- +// wxPropertyGridInterface // ----------------------------------------------------------------------- void wxPropertyGridInterface::RefreshGrid( wxPropertyGridPageState* state ) @@ -462,19 +479,20 @@ void wxPropertyGridInterface::SetPropertyValueUnspecified( wxPGPropArg id ) // wxPropertyGridInterface property value setting and getting // ----------------------------------------------------------------------- -void wxPGGetFailed( const wxPGProperty* p, const wxChar* typestr ) +void wxPGGetFailed( const wxPGProperty* p, const wxString& typestr ) { - wxPGTypeOperationFailed(p,typestr,wxT("Get")); + wxPGTypeOperationFailed(p, typestr, wxS("Get")); } // ----------------------------------------------------------------------- -void wxPGTypeOperationFailed( const wxPGProperty* p, const wxChar* typestr, - const wxChar* op ) +void wxPGTypeOperationFailed( const wxPGProperty* p, + const wxString& typestr, + const wxString& op ) { wxASSERT( p != NULL ); wxLogError( _("Type operation \"%s\" failed: Property labeled \"%s\" is of type \"%s\", NOT \"%s\"."), - op,p->GetLabel().c_str(),p->GetValue().GetType().c_str(),typestr ); + op.c_str(), p->GetLabel().c_str(), p->GetValue().GetType().c_str(), typestr.c_str() ); } // ----------------------------------------------------------------------- @@ -557,6 +575,24 @@ void wxPropertyGridInterface::DoSetPropertyAttribute( wxPGPropArg id, const wxSt // ----------------------------------------------------------------------- +void wxPropertyGridInterface::SetPropertyAttributeAll( const wxString& attrName, + wxVariant value ) +{ + unsigned int pageIndex = 0; + + for (;;) + { + wxPropertyGridPageState* page = GetPageState(pageIndex); + if ( !page ) break; + + DoSetPropertyAttribute(page->DoGetRoot(), attrName, value, wxPG_RECURSE); + + pageIndex++; + } +} + +// ----------------------------------------------------------------------- + void wxPropertyGridInterface::GetPropertiesWithFlag( wxArrayPGProperty* targetArr, wxPGProperty::FlagType flags, bool inverse, @@ -623,25 +659,6 @@ void wxPropertyGridInterface::SetBoolChoices( const wxString& trueChoice, // ----------------------------------------------------------------------- -wxPGChoices gs_emptyChoices; - -wxPGChoices& wxPropertyGridInterface::GetPropertyChoices( wxPGPropArg id ) -{ - wxPG_PROP_ARG_CALL_PROLOG_RETVAL(gs_emptyChoices) - - wxPGChoiceInfo ci; - ci.m_choices = (wxPGChoices*) NULL; - - p->GetChoiceInfo(&ci); - - if ( !ci.m_choices ) - return gs_emptyChoices; - - return *ci.m_choices; -} - -// ----------------------------------------------------------------------- - wxPGProperty* wxPropertyGridInterface::DoGetPropertyByName( const wxString& name ) const { return m_pState->BaseGetPropertyByName(name); @@ -809,29 +826,6 @@ IMPLEMENT_GET_VALUE(long,long,Long,0) IMPLEMENT_GET_VALUE(double,double,Double,0.0) IMPLEMENT_GET_VALUE(void,void*,VoidPtr,NULL) -// wxObject is different than others. -wxObject* wxPropertyGridInterface::GetPropertyValueAsWxObjectPtr( wxPGPropArg id ) const -{ - wxPG_PROP_ARG_CALL_PROLOG_RETVAL((wxObject*)NULL) - - wxVariant value = p->GetValue(); - wxVariantData* vdata = value.GetData(); - - if ( !vdata->GetValueClassInfo() ) - return (wxObject*) NULL; - - wxPGVariantData* pgvdata = wxDynamicCastVariantData(vdata, wxPGVariantData); - if ( pgvdata ) - return (wxObject*) pgvdata->GetValuePtr(); - - if ( wxPGIsVariantClassInfo(wxPGVariantDataGetClassInfo(vdata), wxobject) ) - return (wxObject*) value.GetWxObjectPtr(); - - return (wxObject*) NULL; -} - -// ----------------------------------------------------------------------- - bool wxPropertyGridInterface::IsPropertyExpanded( wxPGPropArg id ) const { wxPG_PROP_ARG_CALL_PROLOG_RETVAL(false) @@ -924,14 +918,17 @@ wxString wxPropertyGridInterface::SaveEditableState( int includedStates ) const // // Save state on page basis - size_t pageIndex = 0; - wxPropertyGridPageState* pageState = GetPageState(pageIndex); + unsigned int pageIndex = 0; wxArrayPtrVoid pageStates; - while ( pageState ) + + for (;;) { - pageStates.Add(pageState); - pageIndex += 1; - pageState = GetPageState(pageIndex); + wxPropertyGridPageState* page = GetPageState(pageIndex); + if ( !page ) break; + + pageStates.Add(page); + + pageIndex++; } for ( pageIndex=0; pageIndex < pageStates.size(); pageIndex++ ) @@ -1181,3 +1178,5 @@ bool wxPropertyGridInterface::RestoreEditableState( const wxString& src, int res return res; } +#endif // wxUSE_PROPGRID +