X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/18e046a7c549687f42e37c4db6e80ff9df17f955..9914bfbb77f48baf869b63aff58feb2b145ff4d3:/src/propgrid/advprops.cpp diff --git a/src/propgrid/advprops.cpp b/src/propgrid/advprops.cpp index 5c5a2e99fa..8be3545e6d 100644 --- a/src/propgrid/advprops.cpp +++ b/src/propgrid/advprops.cpp @@ -62,6 +62,8 @@ #include "wx/msw/dc.h" #endif +#include "wx/odcombo.h" + // ----------------------------------------------------------------------- #if defined(__WXMSW__) @@ -274,11 +276,12 @@ wxPGWindowList wxPGSpinCtrlEditor::CreateControls( wxPropertyGrid* propgrid, wxP wnd2->SetRange( INT_MIN, INT_MAX ); wnd2->SetValue( 0 ); + wxWindow* wnd1 = wxPGTextCtrlEditor::CreateControls(propgrid, property, pos, tcSz).m_primary; +#if wxUSE_VALIDATORS // Let's add validator to make sure only numbers can be entered wxTextValidator validator(wxFILTER_NUMERIC, &m_tempString); - - wxTextCtrl* wnd1 = (wxTextCtrl*) wxPGTextCtrlEditor::CreateControls( propgrid, property, pos, tcSz ).m_primary; wnd1->SetValidator(validator); +#endif return wxPGWindowList(wnd1, wnd2); } @@ -457,7 +460,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(); @@ -490,14 +493,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 @@ -522,11 +529,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 @@ -539,40 +555,46 @@ void wxPGDatePickerCtrlEditor::SetValueToUnspecified( wxPGProperty* WXUNUSED(pro #include "wx/fontdlg.h" #include "wx/fontenum.h" -static const wxChar* gs_fp_es_family_labels[] = { +// +// NB: Do not use wxS here since unlike wxT it doesn't translate to wxChar* +// + +static const wxChar* const gs_fp_es_family_labels[] = { wxT("Default"), wxT("Decorative"), wxT("Roman"), wxT("Script"), wxT("Swiss"), wxT("Modern"), + wxT("Teletype"), wxT("Unknown"), (const wxChar*) NULL }; -static long gs_fp_es_family_values[] = { - wxDEFAULT, wxDECORATIVE, - wxROMAN, wxSCRIPT, - wxSWISS, wxMODERN +static const long gs_fp_es_family_values[] = { + wxFONTFAMILY_DEFAULT, wxFONTFAMILY_DECORATIVE, + wxFONTFAMILY_ROMAN, wxFONTFAMILY_SCRIPT, + wxFONTFAMILY_SWISS, wxFONTFAMILY_MODERN, + wxFONTFAMILY_TELETYPE, wxFONTFAMILY_UNKNOWN }; -static const wxChar* gs_fp_es_style_labels[] = { +static const wxChar* const gs_fp_es_style_labels[] = { wxT("Normal"), wxT("Slant"), wxT("Italic"), (const wxChar*) NULL }; -static long gs_fp_es_style_values[] = { +static const long gs_fp_es_style_values[] = { wxNORMAL, wxSLANT, wxITALIC }; -static const wxChar* gs_fp_es_weight_labels[] = { +static const wxChar* const gs_fp_es_weight_labels[] = { wxT("Normal"), wxT("Light"), wxT("Bold"), (const wxChar*) NULL }; -static long gs_fp_es_weight_values[] = { +static const long gs_fp_es_weight_values[] = { wxNORMAL, wxLIGHT, wxBOLD @@ -606,13 +628,8 @@ wxFontProperty::wxFontProperty( const wxString& label, const wxString& name, wxFont font; font << m_value; - SetParentalType(wxPG_PROP_AGGREGATE); - - 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 wxIntProperty( _("Point Size"), + wxS("Point Size"),(long)font.GetPointSize() ) ); wxString faceName = font.GetFaceName(); // If font was not in there, add it now @@ -625,16 +642,22 @@ wxFontProperty::wxFontProperty( const wxString& label, const wxString& name, p->SetValueFromString(faceName, wxPG_FULL_VALUE); - AddChild( p ); + AddPrivateChild( p ); + + AddPrivateChild( new wxEnumProperty(_("Style"), wxS("Style"), + gs_fp_es_style_labels,gs_fp_es_style_values, + font.GetStyle()) ); - AddChild( new wxEnumProperty(_("Style"), wxS("Style"), - gs_fp_es_style_labels,gs_fp_es_style_values,font.GetStyle()) ); + AddPrivateChild( new wxEnumProperty(_("Weight"), wxS("Weight"), + gs_fp_es_weight_labels,gs_fp_es_weight_values, + font.GetWeight()) ); - AddChild( new wxEnumProperty(_("Weight"), wxS("Weight"), - gs_fp_es_weight_labels,gs_fp_es_weight_values,font.GetWeight()) ); + AddPrivateChild( new wxBoolProperty(_("Underlined"), wxS("Underlined"), + font.GetUnderlined()) ); - AddChild( new wxBoolProperty(_("Underlined"), wxS("Underlined"), - font.GetUnderlined()) ); + AddPrivateChild( new wxEnumProperty(_("Family"), wxS("PointSize"), + gs_fp_es_family_labels,gs_fp_es_family_values, + font.GetFamily()) ); } wxFontProperty::~wxFontProperty() { } @@ -646,8 +669,7 @@ void wxFontProperty::OnSetValue() if ( !font.Ok() ) { - font = wxFont(10,wxSWISS,wxNORMAL,wxNORMAL); - m_value << font; + m_value << *wxNORMAL_FONT; } } @@ -691,31 +713,25 @@ void wxFontProperty::RefreshChildren() wxFont font; font << m_value; Item(0)->SetValue( (long)font.GetPointSize() ); - Item(1)->SetValue( (long)font.GetFamily() ); - Item(2)->SetValueFromString( font.GetFaceName(), wxPG_FULL_VALUE ); - Item(3)->SetValue( (long)font.GetStyle() ); - Item(4)->SetValue( (long)font.GetWeight() ); - Item(5)->SetValue( font.GetUnderlined() ); + Item(1)->SetValueFromString( font.GetFaceName(), wxPG_FULL_VALUE ); + Item(2)->SetValue( (long)font.GetStyle() ); + Item(3)->SetValue( (long)font.GetWeight() ); + Item(4)->SetValue( font.GetUnderlined() ); + Item(5)->SetValue( (long)font.GetFamily() ); } -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 ) - { - int fam = childValue.GetLong(); - if ( fam < wxDEFAULT || - fam > wxTELETYPE ) - fam = wxDEFAULT; - font.SetFamily( fam ); - } - else if ( ind == 2 ) { wxString faceName; int faceIndex = childValue.GetLong(); @@ -725,7 +741,7 @@ void wxFontProperty::ChildChanged( wxVariant& thisValue, int ind, wxVariant& chi font.SetFaceName( faceName ); } - else if ( ind == 3 ) + else if ( ind == 2 ) { int st = childValue.GetLong(); if ( st != wxFONTSTYLE_NORMAL && @@ -734,7 +750,7 @@ void wxFontProperty::ChildChanged( wxVariant& thisValue, int ind, wxVariant& chi st = wxFONTWEIGHT_NORMAL; font.SetStyle( st ); } - else if ( ind == 4 ) + else if ( ind == 3 ) { int wt = childValue.GetLong(); if ( wt != wxFONTWEIGHT_NORMAL && @@ -743,12 +759,22 @@ void wxFontProperty::ChildChanged( wxVariant& thisValue, int ind, wxVariant& chi wt = wxFONTWEIGHT_NORMAL; font.SetWeight( wt ); } - else if ( ind == 5 ) + else if ( ind == 4 ) { font.SetUnderlined( childValue.GetBool() ); } + else if ( ind == 5 ) + { + int fam = childValue.GetLong(); + if ( fam < wxDEFAULT || + fam > wxTELETYPE ) + fam = wxDEFAULT; + font.SetFamily( fam ); + } - thisValue << font; + wxVariant newVariant; + newVariant << font; + return newVariant; } /* @@ -805,7 +831,7 @@ void wxFontProperty::OnCustomPaint(wxDC& dc, #include "wx/colordlg.h" //#define wx_cp_es_syscolours_len 25 -static const wxChar* gs_cp_es_syscolour_labels[] = { +static const wxChar* const gs_cp_es_syscolour_labels[] = { wxT("AppWorkspace"), wxT("ActiveBorder"), wxT("ActiveCaption"), @@ -834,7 +860,7 @@ static const wxChar* gs_cp_es_syscolour_labels[] = { (const wxChar*) NULL }; -static long gs_cp_es_syscolour_values[] = { +static const long gs_cp_es_syscolour_values[] = { wxSYS_COLOUR_APPWORKSPACE, wxSYS_COLOUR_ACTIVEBORDER, wxSYS_COLOUR_ACTIVECAPTION, @@ -908,7 +934,7 @@ wxSystemColourProperty::wxSystemColourProperty( const wxString& label, const wxS wxSystemColourProperty::wxSystemColourProperty( const wxString& label, const wxString& name, - const wxChar** labels, const long* values, wxPGChoices* choicesCache, + const wxChar* const* labels, const long* values, wxPGChoices* choicesCache, const wxColourPropertyValue& value ) : wxEnumProperty( label, name, labels, values, choicesCache ) { @@ -920,7 +946,7 @@ wxSystemColourProperty::wxSystemColourProperty( const wxString& label, const wxS wxSystemColourProperty::wxSystemColourProperty( const wxString& label, const wxString& name, - const wxChar** labels, const long* values, wxPGChoices* choicesCache, + const wxChar* const* labels, const long* values, wxPGChoices* choicesCache, const wxColour& value ) : wxEnumProperty( label, name, labels, values, choicesCache ) { @@ -1013,7 +1039,10 @@ wxVariant wxSystemColourProperty::DoTranslateVal( wxColourPropertyValue& v ) con int wxSystemColourProperty::ColToInd( const wxColour& colour ) const { size_t i; - size_t i_max = m_choices.GetCount() - 1; + size_t i_max = m_choices.GetCount(); + + if ( !(m_flags & wxPG_PROP_HIDE_CUSTOM_COLOUR) ) + i_max -= 1; for ( i=0; iIsMainButtonEvent(event) ) { // We need to handle button click in case editor has been // switched to one that has wxButton as well. + askColour = true; + } + else if ( event.GetEventType() == wxEVT_COMMAND_COMBOBOX_SELECTED ) + { + // Must override index detection since at this point GetIndex() + // will return old value. + wxOwnerDrawnComboBox* cb = + static_cast(propgrid->GetEditorControl()); + + if ( cb ) + { + int index = cb->GetSelection(); + + if ( index == GetCustomColourIndex() && + !(m_flags & wxPG_PROP_HIDE_CUSTOM_COLOUR) ) + askColour = true; + } + } + + if ( askColour && !propgrid->WasValueChangedInEvent() ) + { wxVariant variant; if ( QueryColourFromUser(variant) ) return true; @@ -1289,8 +1346,10 @@ void wxSystemColourProperty::OnCustomPaint( wxDC& dc, const wxRect& rect, { wxColour col; - if ( paintdata.m_choiceItem >= 0 && paintdata.m_choiceItem < (int)m_choices.GetCount() && - paintdata.m_choiceItem != GetCustomColourIndex() ) + if ( paintdata.m_choiceItem >= 0 && + paintdata.m_choiceItem < (int)m_choices.GetCount() && + (paintdata.m_choiceItem != GetCustomColourIndex() || + m_flags & wxPG_PROP_HIDE_CUSTOM_COLOUR) ) { int colInd = m_choices[paintdata.m_choiceItem].GetValue(); col = GetColour( colInd ); @@ -1339,6 +1398,7 @@ bool wxSystemColourProperty::StringToValue( wxVariant& value, const wxString& te colourRGB.clear(); if ( colourRGB.length() == 0 && m_choices.GetCount() && + !(m_flags & wxPG_PROP_HIDE_CUSTOM_COLOUR) && colourName == m_choices.GetLabel(GetCustomColourIndex()) ) { if ( !(argFlags & wxPG_EDITABLE_VALUE )) @@ -1408,9 +1468,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) ) { @@ -1434,7 +1492,7 @@ bool wxSystemColourProperty::DoSetAttribute( const wxString& name, wxVariant& va // wxColourProperty // ----------------------------------------------------------------------- -static const wxChar* gs_cp_es_normcolour_labels[] = { +static const wxChar* const gs_cp_es_normcolour_labels[] = { wxT("Black"), wxT("Maroon"), wxT("Navy"), @@ -1457,7 +1515,7 @@ static const wxChar* gs_cp_es_normcolour_labels[] = { (const wxChar*) NULL }; -static unsigned long gs_cp_es_normcolour_colours[] = { +static const unsigned long gs_cp_es_normcolour_colours[] = { wxPG_COLOUR(0,0,0), wxPG_COLOUR(128,0,0), wxPG_COLOUR(0,0,128), @@ -1546,7 +1604,7 @@ wxVariant wxColourProperty::DoTranslateVal( wxColourPropertyValue& v ) const #define NUM_CURSORS 28 //#define wx_cp_es_syscursors_len 28 -static const wxChar* gs_cp_es_syscursors_labels[NUM_CURSORS+1] = { +static const wxChar* const gs_cp_es_syscursors_labels[NUM_CURSORS+1] = { wxT("Default"), wxT("Arrow"), wxT("Right Arrow"), @@ -1578,7 +1636,7 @@ static const wxChar* gs_cp_es_syscursors_labels[NUM_CURSORS+1] = { (const wxChar*) NULL }; -static long gs_cp_es_syscursors_values[NUM_CURSORS] = { +static const long gs_cp_es_syscursors_values[NUM_CURSORS] = { wxCURSOR_NONE, wxCURSOR_ARROW, wxCURSOR_RIGHT_ARROW, @@ -1743,8 +1801,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() @@ -1904,7 +1962,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. @@ -2065,12 +2124,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 ) {