X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/8a337f95d82671e8f94809a49687d2c18d316e39..85284ca4b226d9a1ab6bed26c5eaa480543649d5:/src/propgrid/advprops.cpp diff --git a/src/propgrid/advprops.cpp b/src/propgrid/advprops.cpp index 32eff3b0a7..7fa93bcc19 100644 --- a/src/propgrid/advprops.cpp +++ b/src/propgrid/advprops.cpp @@ -108,6 +108,14 @@ bool operator == (const wxArrayInt& array1, const wxArrayInt& array2) #if wxUSE_SPINBTN +#ifdef __WXMSW__ + #define IS_MOTION_SPIN_SUPPORTED 1 +#else + #define IS_MOTION_SPIN_SUPPORTED 0 +#endif + +#if IS_MOTION_SPIN_SUPPORTED + // // This class implements ability to rapidly change "spin" value // by moving mouse when one of the spin buttons is depressed. @@ -194,18 +202,23 @@ private: { if ( m_bLeftDown ) { - Capture(); int dy = m_ptPosition.y - event.GetPosition().y; - m_ptPosition = event.GetPosition(); - - wxSpinEvent evtscroll( (dy >= 0) ? wxEVT_SCROLL_LINEUP : - wxEVT_SCROLL_LINEDOWN, - GetId() ); - evtscroll.SetEventObject(this); - - m_spins = abs(dy); - GetEventHandler()->ProcessEvent(evtscroll); - m_spins = 1; + if ( dy ) + { + Capture(); + m_ptPosition = event.GetPosition(); + + wxSpinEvent evtscroll( (dy >= 0) ? wxEVT_SCROLL_LINEUP : + wxEVT_SCROLL_LINEDOWN, + GetId() ); + evtscroll.SetEventObject(this); + + wxASSERT( m_spins == 1 ); + + m_spins = abs(dy); + GetEventHandler()->ProcessEvent(evtscroll); + m_spins = 1; + } } } @@ -217,6 +230,8 @@ private: } }; +#endif // IS_MOTION_SPIN_SUPPORTED + WX_PG_IMPLEMENT_INTERNAL_EDITOR_CLASS(SpinCtrl, wxPGSpinCtrlEditor, @@ -240,7 +255,16 @@ wxPGWindowList wxPGSpinCtrlEditor::CreateControls( wxPropertyGrid* propgrid, wxP wxSpinButton* wnd2; - wnd2 = new wxPGSpinButton(); +#if IS_MOTION_SPIN_SUPPORTED + if ( property->GetAttributeAsLong(wxT("MotionSpin"), 0) ) + { + wnd2 = new wxPGSpinButton(); + } + else +#endif + { + wnd2 = new wxSpinButton(); + } #ifdef __WXMSW__ wnd2->Hide(); @@ -291,11 +315,16 @@ bool wxPGSpinCtrlEditor::OnEvent( wxPropertyGrid* propgrid, wxPGProperty* proper if ( evtType == wxEVT_SCROLL_LINEUP || evtType == wxEVT_SCROLL_LINEDOWN ) { - wxPGSpinButton* spinButton = - (wxPGSpinButton*) propgrid->GetEditorControlSecondary(); + #if IS_MOTION_SPIN_SUPPORTED + if ( property->GetAttributeAsLong(wxT("MotionSpin"), 0) ) + { + wxPGSpinButton* spinButton = + (wxPGSpinButton*) propgrid->GetEditorControlSecondary(); - if ( spinButton ) - spins = spinButton->GetSpins(); + if ( spinButton ) + spins = spinButton->GetSpins(); + } + #endif wxString s; // Can't use wnd since it might be clipper window @@ -428,7 +457,7 @@ wxPGWindowList wxPGDatePickerCtrlEditor::CreateControls( wxPropertyGrid* propgri NULL, wxT("DatePickerCtrl editor can only be used with wxDateProperty or derivative.") ); - wxDateProperty* prop = (wxDateProperty*) property; + wxDateProperty* prop = wxDynamicCast(property, wxDateProperty); // Use two stage creation to allow cleaner display on wxMSW wxDatePickerCtrl* ctrl = new wxDatePickerCtrl(); @@ -461,14 +490,18 @@ wxPGWindowList wxPGDatePickerCtrlEditor::CreateControls( wxPropertyGrid* propgri } // Copies value from property to control -void wxPGDatePickerCtrlEditor::UpdateControl( wxPGProperty* property, wxWindow* wnd ) const +void wxPGDatePickerCtrlEditor::UpdateControl( wxPGProperty* property, + wxWindow* wnd ) const { wxDatePickerCtrl* ctrl = (wxDatePickerCtrl*) wnd; wxASSERT( ctrl && ctrl->IsKindOf(CLASSINFO(wxDatePickerCtrl)) ); - // We assume that property's data type is 'int' (or something similar), - // thus allowing us to get raw, unchecked value via DoGetValue. - ctrl->SetValue( property->GetValue().GetDateTime() ); + wxDateTime dateValue(wxInvalidDateTime); + wxVariant v(property->GetValue()); + if ( v.GetType() == wxT("datetime") ) + dateValue = v.GetDateTime(); + + ctrl->SetValue( dateValue ); } // Control's events are redirected here @@ -493,11 +526,20 @@ bool wxPGDatePickerCtrlEditor::GetValueFromControl( wxVariant& variant, wxPGProp return true; } -void wxPGDatePickerCtrlEditor::SetValueToUnspecified( wxPGProperty* WXUNUSED(property), wxWindow* WXUNUSED(wnd) ) const +void wxPGDatePickerCtrlEditor::SetValueToUnspecified( wxPGProperty* property, + wxWindow* wnd ) const { - // TODO? - //wxDateProperty* prop = (wxDateProperty*) property; - //ctrl->SetValue(?); + wxDatePickerCtrl* ctrl = (wxDatePickerCtrl*) wnd; + wxASSERT( ctrl && ctrl->IsKindOf(CLASSINFO(wxDatePickerCtrl)) ); + + wxDateProperty* prop = wxDynamicCast(property, wxDateProperty); + + if ( prop ) + { + int datePickerStyle = prop->GetDatePickerStyle(); + if ( datePickerStyle & wxDP_ALLOWNONE ) + ctrl->SetValue(wxInvalidDateTime); + } } #endif // wxUSE_DATEPICKCTRL @@ -577,13 +619,12 @@ wxFontProperty::wxFontProperty( const wxString& label, const wxString& name, wxFont font; font << m_value; - SetParentalType(wxPG_PROP_AGGREGATE); + AddPrivateChild( new wxIntProperty( _("Point Size"), + wxS("Point Size"),(long)font.GetPointSize() ) ); - AddChild( new wxIntProperty( _("Point Size"), wxS("Point Size"),(long)font.GetPointSize() ) ); - - AddChild( new wxEnumProperty(_("Family"), wxS("PointSize"), - gs_fp_es_family_labels,gs_fp_es_family_values, - font.GetFamily()) ); + AddPrivateChild( new wxEnumProperty(_("Family"), wxS("PointSize"), + gs_fp_es_family_labels,gs_fp_es_family_values, + font.GetFamily()) ); wxString faceName = font.GetFaceName(); // If font was not in there, add it now @@ -596,16 +637,18 @@ wxFontProperty::wxFontProperty( const wxString& label, const wxString& name, p->SetValueFromString(faceName, wxPG_FULL_VALUE); - AddChild( p ); + AddPrivateChild( p ); - AddChild( new wxEnumProperty(_("Style"), wxS("Style"), - gs_fp_es_style_labels,gs_fp_es_style_values,font.GetStyle()) ); + AddPrivateChild( new wxEnumProperty(_("Style"), wxS("Style"), + gs_fp_es_style_labels,gs_fp_es_style_values, + font.GetStyle()) ); - AddChild( new wxEnumProperty(_("Weight"), wxS("Weight"), - gs_fp_es_weight_labels,gs_fp_es_weight_values,font.GetWeight()) ); + AddPrivateChild( new wxEnumProperty(_("Weight"), wxS("Weight"), + gs_fp_es_weight_labels,gs_fp_es_weight_values, + font.GetWeight()) ); - AddChild( new wxBoolProperty(_("Underlined"), wxS("Underlined"), - font.GetUnderlined()) ); + AddPrivateChild( new wxBoolProperty(_("Underlined"), wxS("Underlined"), + font.GetUnderlined()) ); } wxFontProperty::~wxFontProperty() { } @@ -617,8 +660,7 @@ void wxFontProperty::OnSetValue() if ( !font.Ok() ) { - font = wxFont(10,wxSWISS,wxNORMAL,wxNORMAL); - m_value << font; + m_value << *wxNORMAL_FONT; } } @@ -669,14 +711,16 @@ void wxFontProperty::RefreshChildren() Item(5)->SetValue( font.GetUnderlined() ); } -void wxFontProperty::ChildChanged( wxVariant& thisValue, int ind, wxVariant& childValue ) const +wxVariant wxFontProperty::ChildChanged( wxVariant& thisValue, + int ind, + wxVariant& childValue ) const { wxFont font; font << thisValue; if ( ind == 0 ) { - font.SetPointSize( wxPGVariantToInt(childValue) ); + font.SetPointSize( childValue.GetLong() ); } else if ( ind == 1 ) { @@ -719,7 +763,9 @@ void wxFontProperty::ChildChanged( wxVariant& thisValue, int ind, wxVariant& chi font.SetUnderlined( childValue.GetBool() ); } - thisValue << font; + wxVariant newVariant; + newVariant << font; + return newVariant; } /* @@ -1379,9 +1425,7 @@ bool wxSystemColourProperty::DoSetAttribute( const wxString& name, wxVariant& va { if ( name == wxPG_COLOUR_ALLOW_CUSTOM ) { - int ival = wxPGVariantToInt(value); - - SetChoicesExclusive(); // Make sure we don't corrupt colour lists of other properties + int ival = value.GetLong(); if ( ival && (m_flags & wxPG_PROP_HIDE_CUSTOM_COLOUR) ) { @@ -1714,8 +1758,8 @@ wxImageFileProperty::wxImageFileProperty( const wxString& label, const wxString& { SetAttribute( wxPG_FILE_WILDCARD, wxPGGetDefaultImageWildcard() ); - m_pImage = (wxImage*) NULL; - m_pBitmap = (wxBitmap*) NULL; + m_pImage = NULL; + m_pBitmap = NULL; } wxImageFileProperty::~wxImageFileProperty() @@ -1875,7 +1919,8 @@ void wxMultiChoiceProperty::GenerateValueAsString( wxVariant& value, wxArrayInt wxMultiChoiceProperty::GetValueAsIndices() const { - const wxArrayInt& valueArr = wxArrayIntRefFromVariant(GetValue()); + wxVariant variant = GetValue(); + const wxArrayInt& valueArr = wxArrayIntRefFromVariant(variant); unsigned int i; // Translate values to string indices. @@ -2036,12 +2081,25 @@ wxDateProperty::~wxDateProperty() { } +void wxDateProperty::OnSetValue() +{ + // + // Convert invalid dates to unspecified value + if ( m_value.GetType() == wxT("datetime") ) + { + if ( !m_value.GetDateTime().IsValid() ) + m_value.MakeNull(); + } +} + bool wxDateProperty::StringToValue( wxVariant& variant, const wxString& text, int WXUNUSED(argFlags) ) const { wxDateTime dt; - const char* c = dt.ParseFormat(text, wxString(wxDefaultDateTimeFormat), wxDefaultDateTime, NULL); + // FIXME: do we really want to return true from here if only part of the + // string was parsed? + const char* c = dt.ParseFormat(text); if ( c ) {