X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/30fad74e44b2118795fc070e0e599ae474f0ad1d..404b319a85dadd7decf7a5a5331020520031a41c:/src/propgrid/advprops.cpp diff --git a/src/propgrid/advprops.cpp b/src/propgrid/advprops.cpp index 22c5089f77..a634885003 100644 --- a/src/propgrid/advprops.cpp +++ b/src/propgrid/advprops.cpp @@ -6,7 +6,7 @@ // Created: 2004-09-25 // RCS-ID: $Id$ // Copyright: (c) Jaakko Salli -// Licence: wxWindows license +// Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// // For compilers that support precompilation, includes "wx/wx.h". @@ -240,12 +240,12 @@ WX_PG_IMPLEMENT_INTERNAL_EDITOR_CLASS(SpinCtrl, wxPGEditor) -// Trivial destructor. +// Destructor. It is useful to reset the global pointer in it. wxPGSpinCtrlEditor::~wxPGSpinCtrlEditor() { + wxPG_EDITOR(SpinCtrl) = NULL; } - // Create controls and initialize event handling. wxPGWindowList wxPGSpinCtrlEditor::CreateControls( wxPropertyGrid* propgrid, wxPGProperty* property, const wxPoint& pos, const wxSize& sz ) const @@ -449,6 +449,7 @@ WX_PG_IMPLEMENT_INTERNAL_EDITOR_CLASS(DatePickerCtrl, wxPGDatePickerCtrlEditor::~wxPGDatePickerCtrlEditor() { + wxPG_EDITOR(DatePickerCtrl) = NULL; } wxPGWindowList wxPGDatePickerCtrlEditor::CreateControls( wxPropertyGrid* propgrid, @@ -456,7 +457,7 @@ wxPGWindowList wxPGDatePickerCtrlEditor::CreateControls( wxPropertyGrid* propgri const wxPoint& pos, const wxSize& sz ) const { - wxCHECK_MSG( property->IsKindOf(CLASSINFO(wxDateProperty)), + wxCHECK_MSG( wxDynamicCast(property, wxDateProperty), NULL, wxT("DatePickerCtrl editor can only be used with wxDateProperty or derivative.") ); @@ -497,7 +498,7 @@ void wxPGDatePickerCtrlEditor::UpdateControl( wxPGProperty* property, wxWindow* wnd ) const { wxDatePickerCtrl* ctrl = (wxDatePickerCtrl*) wnd; - wxASSERT( ctrl && ctrl->IsKindOf(CLASSINFO(wxDatePickerCtrl)) ); + wxASSERT( wxDynamicCast(ctrl, wxDatePickerCtrl) ); wxDateTime dateValue(wxInvalidDateTime); wxVariant v(property->GetValue()); @@ -522,7 +523,7 @@ bool wxPGDatePickerCtrlEditor::OnEvent( wxPropertyGrid* WXUNUSED(propgrid), bool wxPGDatePickerCtrlEditor::GetValueFromControl( wxVariant& variant, wxPGProperty* WXUNUSED(property), wxWindow* wnd ) const { wxDatePickerCtrl* ctrl = (wxDatePickerCtrl*) wnd; - wxASSERT( ctrl && ctrl->IsKindOf(CLASSINFO(wxDatePickerCtrl)) ); + wxASSERT( wxDynamicCast(ctrl, wxDatePickerCtrl) ); variant = ctrl->GetValue(); @@ -533,7 +534,7 @@ void wxPGDatePickerCtrlEditor::SetValueToUnspecified( wxPGProperty* property, wxWindow* wnd ) const { wxDatePickerCtrl* ctrl = (wxDatePickerCtrl*) wnd; - wxASSERT( ctrl && ctrl->IsKindOf(CLASSINFO(wxDatePickerCtrl)) ); + wxASSERT( wxDynamicCast(ctrl, wxDatePickerCtrl) ); wxDateProperty* prop = wxDynamicCast(property, wxDateProperty); @@ -559,7 +560,7 @@ void wxPGDatePickerCtrlEditor::SetValueToUnspecified( wxPGProperty* property, // NB: Do not use wxS here since unlike wxT it doesn't translate to wxChar* // -static const wxChar* gs_fp_es_family_labels[] = { +static const wxChar* const gs_fp_es_family_labels[] = { wxT("Default"), wxT("Decorative"), wxT("Roman"), wxT("Script"), wxT("Swiss"), wxT("Modern"), @@ -567,34 +568,34 @@ static const wxChar* gs_fp_es_family_labels[] = { (const wxChar*) NULL }; -static long gs_fp_es_family_values[] = { +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 @@ -633,7 +634,7 @@ wxFontProperty::wxFontProperty( const wxString& label, const wxString& name, wxString faceName = font.GetFaceName(); // If font was not in there, add it now - if ( faceName.length() && + if ( !faceName.empty() && wxPGGlobalVars->m_fontFamilyChoices->Index(faceName) == wxNOT_FOUND ) wxPGGlobalVars->m_fontFamilyChoices->AddAsSorted(faceName); @@ -667,7 +668,7 @@ void wxFontProperty::OnSetValue() wxFont font; font << m_value; - if ( !font.Ok() ) + if ( !font.IsOk() ) { m_value << *wxNORMAL_FONT; } @@ -689,7 +690,10 @@ bool wxFontProperty::OnEvent( wxPropertyGrid* propgrid, wxWindow* WXUNUSED(prima wxFontData data; wxFont font; - font << useValue; + + if ( useValue.GetType() == wxS("wxFont") ) + font << useValue; + data.SetInitialFont( font ); data.SetColour(*wxBLACK); @@ -793,7 +797,7 @@ void wxFontProperty::OnCustomPaint(wxDC& dc, else drawFace = m_value_wxFont.GetFaceName(); - if ( drawFace.length() ) + if ( !drawFace.empty() ) { // Draw the background dc.SetBrush( wxColour(wxSystemSettings::GetColour(wxSYS_COLOUR_BTNFACE)) ); @@ -831,7 +835,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"), @@ -860,7 +864,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, @@ -902,7 +906,7 @@ void wxSystemColourProperty::Init( int type, const wxColour& colour ) { wxColourPropertyValue cpv; - if ( colour.Ok() ) + if ( colour.IsOk() ) cpv.Init( type, colour ); else cpv.Init( type, *wxWHITE ); @@ -934,7 +938,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 ) { @@ -946,7 +950,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 ) { @@ -1093,7 +1097,7 @@ void wxSystemColourProperty::OnSetValue() cpv << m_value; wxColour col = cpv.m_colour; - if ( !col.Ok() ) + if ( !col.IsOk() ) { SetValueToUnspecified(); SetIndex(wxNOT_FOUND); @@ -1116,7 +1120,7 @@ void wxSystemColourProperty::OnSetValue() wxColour col; col << m_value; - if ( !col.Ok() ) + if ( !col.IsOk() ) { SetValueToUnspecified(); SetIndex(wxNOT_FOUND); @@ -1139,15 +1143,35 @@ wxColour wxSystemColourProperty::GetColour( int index ) const return wxSystemSettings::GetColour( (wxSystemColour)index ); } -wxString wxSystemColourProperty::ColourToString( const wxColour& col, int index ) const +wxString wxSystemColourProperty::ColourToString( const wxColour& col, + int index, + int argFlags ) const { + if ( index == wxNOT_FOUND ) - return wxString::Format(wxT("(%i,%i,%i)"), - (int)col.Red(), - (int)col.Green(), - (int)col.Blue()); + { + + if ( (argFlags & wxPG_FULL_VALUE) || + GetAttributeAsLong(wxPG_COLOUR_HAS_ALPHA, 0) ) + { + return wxString::Format(wxS("(%i,%i,%i,%i)"), + (int)col.Red(), + (int)col.Green(), + (int)col.Blue(), + (int)col.Alpha()); + } + else + { + return wxString::Format(wxS("(%i,%i,%i)"), + (int)col.Red(), + (int)col.Green(), + (int)col.Blue()); + } + } else + { return m_choices.GetLabel(index); + } } wxString wxSystemColourProperty::ValueToString( wxVariant& value, @@ -1174,7 +1198,7 @@ wxString wxSystemColourProperty::ValueToString( wxVariant& value, index = m_choices.Index(val.m_type); } - return ColourToString(val.m_colour, index); + return ColourToString(val.m_colour, index, argFlags); } @@ -1296,7 +1320,7 @@ public: const wxPropertyGrid* propertyGrid, wxPGProperty* property, int WXUNUSED(column), int item, int WXUNUSED(flags) ) const { - wxASSERT( property->IsKindOf(CLASSINFO(wxSystemColourProperty)) ); + wxASSERT( wxDynamicCast(property, wxSystemColourProperty) ); wxSystemColourProperty* prop = wxStaticCast(property, wxSystemColourProperty); dc.SetPen(*wxBLACK_PEN); @@ -1359,7 +1383,7 @@ void wxSystemColourProperty::OnCustomPaint( wxDC& dc, const wxRect& rect, col = GetVal().m_colour; } - if ( col.Ok() ) + if ( col.IsOk() ) { dc.SetBrush(col); dc.DrawRectangle(rect); @@ -1369,41 +1393,51 @@ void wxSystemColourProperty::OnCustomPaint( wxDC& dc, const wxRect& rect, bool wxSystemColourProperty::StringToValue( wxVariant& value, const wxString& text, int argFlags ) const { - // - // Accept colour format "[Name] [(R,G,B)]" - // Name takes precedence. - // - wxString colourName; - wxString colourRGB; + wxString custColName(m_choices.GetLabel(GetCustomColourIndex())); + wxString colStr(text); + colStr.Trim(true); + colStr.Trim(false); - int ppos = text.Find(wxT("(")); + wxColour customColour; + bool conversionSuccess = false; - if ( ppos == wxNOT_FOUND ) + if ( colStr != custColName ) { - colourName = text; - } - else - { - colourName = text.substr(0, ppos); - colourRGB = text.substr(ppos, text.length()-ppos); - } + if ( colStr.Find(wxS("(")) == 0 ) + { + // Eliminate whitespace + colStr.Replace(wxS(" "), wxEmptyString); - // Strip spaces from extremities - colourName.Trim(true); - colourName.Trim(false); - colourRGB.Trim(true); + int commaCount = colStr.Freq(wxS(',')); + if ( commaCount == 2 ) + { + // Convert (R,G,B) to rgb(R,G,B) + colStr = wxS("rgb") + colStr; + } + else if ( commaCount == 3 ) + { + // We have int alpha, CSS format that wxColour takes as + // input processes float alpha. So, let's parse the colour + // ourselves instead of trying to convert it to a format + // that wxColour::FromString() understands. + int r = -1, g = -1, b = -1, a = -1; + wxSscanf(colStr, wxS("(%i,%i,%i,%i)"), &r, &g, &b, &a); + customColour.Set(r, g, b, a); + conversionSuccess = customColour.IsOk(); + } + } - // Validate colourRGB string - (1,1,1) is shortest allowed - if ( colourRGB.length() < 7 ) - colourRGB.clear(); + if ( !conversionSuccess ) + conversionSuccess = customColour.Set(colStr); + } - if ( colourRGB.length() == 0 && m_choices.GetCount() && + if ( !conversionSuccess && m_choices.GetCount() && !(m_flags & wxPG_PROP_HIDE_CUSTOM_COLOUR) && - colourName == m_choices.GetLabel(GetCustomColourIndex()) ) + colStr == custColName ) { if ( !(argFlags & wxPG_EDITABLE_VALUE )) { - // This really should not occurr... + // This really should not occur... // wxASSERT(false); ResetNextIndex(); return false; @@ -1417,10 +1451,12 @@ bool wxSystemColourProperty::StringToValue( wxVariant& value, const wxString& te bool done = false; - if ( colourName.length() ) + if ( !conversionSuccess ) { // Try predefined colour first - bool res = wxEnumProperty::StringToValue(value, colourName, argFlags); + bool res = wxEnumProperty::StringToValue(value, + colStr, + argFlags); if ( res && GetIndex() >= 0 ) { val.m_type = GetIndex(); @@ -1433,22 +1469,11 @@ bool wxSystemColourProperty::StringToValue( wxVariant& value, const wxString& te done = true; } } - if ( colourRGB.length() && !done ) + else { - // Then check custom colour. val.m_type = wxPG_COLOUR_CUSTOM; - - int r = -1, g = -1, b = -1; - wxSscanf(colourRGB.c_str(),wxT("(%i,%i,%i)"),&r,&g,&b); - - if ( r >= 0 && r <= 255 && - g >= 0 && g <= 255 && - b >= 0 && b <= 255 ) - { - val.m_colour.Set(r,g,b); - - done = true; - } + val.m_colour = customColour; + done = true; } if ( !done ) @@ -1492,7 +1517,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"), @@ -1515,7 +1540,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), @@ -1560,7 +1585,7 @@ wxColourProperty::~wxColourProperty() void wxColourProperty::Init( wxColour colour ) { - if ( !colour.Ok() ) + if ( !colour.IsOk() ) colour = *wxWHITE; wxVariant variant; variant << colour; @@ -1604,7 +1629,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"), @@ -1636,7 +1661,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, @@ -1757,7 +1782,7 @@ void wxCursorProperty::OnCustomPaint( wxDC&, const wxRect&, wxPGPaintData& ) { } const wxString& wxPGGetDefaultImageWildcard() { // Form the wildcard, if not done yet - if ( !wxPGGlobalVars->m_pDefaultImageWildcard.length() ) + if ( wxPGGlobalVars->m_pDefaultImageWildcard.empty() ) { wxString str; @@ -1818,16 +1843,8 @@ void wxImageFileProperty::OnSetValue() wxFileProperty::OnSetValue(); // Delete old image - if ( m_pImage ) - { - delete m_pImage; - m_pImage = NULL; - } - if ( m_pBitmap ) - { - delete m_pBitmap; - m_pBitmap = NULL; - } + wxDELETE(m_pImage); + wxDELETE(m_pBitmap); wxFileName filename = GetFileName(); @@ -1847,7 +1864,7 @@ void wxImageFileProperty::OnCustomPaint( wxDC& dc, const wxRect& rect, wxPGPaintData& ) { - if ( m_pBitmap || (m_pImage && m_pImage->Ok() ) ) + if ( m_pBitmap || (m_pImage && m_pImage->IsOk() ) ) { // Draw the thumbnail @@ -1856,8 +1873,7 @@ void wxImageFileProperty::OnCustomPaint( wxDC& dc, { m_pImage->Rescale( rect.width, rect.height ); m_pBitmap = new wxBitmap( *m_pImage ); - delete m_pImage; - m_pImage = NULL; + wxDELETE(m_pImage); } dc.DrawBitmap( *m_pBitmap, rect.x, rect.y, false ); @@ -2163,7 +2179,7 @@ wxString wxDateProperty::ValueToString( wxVariant& value, if ( !dateTime.IsValid() ) return wxT("Invalid"); - if ( !ms_defaultDateFormat.length() ) + if ( ms_defaultDateFormat.empty() ) { #if wxUSE_DATEPICKCTRL bool showCentury = m_dpStyle & wxDP_SHOWCENTURY ? true : false; @@ -2173,7 +2189,7 @@ wxString wxDateProperty::ValueToString( wxVariant& value, ms_defaultDateFormat = DetermineDefaultDateFormat( showCentury ); } - if ( m_format.length() && + if ( !m_format.empty() && !(argFlags & wxPG_FULL_VALUE) ) format = m_format.c_str(); @@ -2188,7 +2204,7 @@ wxString wxDateProperty::ValueToString( wxVariant& value, wxString wxDateProperty::DetermineDefaultDateFormat( bool showCentury ) { - // This code is basicly copied from datectlg.cpp's SetFormat + // This code is basically copied from datectlg.cpp's SetFormat // wxString format;