]> git.saurik.com Git - wxWidgets.git/blobdiff - src/propgrid/advprops.cpp
Document that wxDC::FloodFill() is not implemented under wxOSX.
[wxWidgets.git] / src / propgrid / advprops.cpp
index 9dc5a203c77cccdfab7f03d53570a36f4aa5bcc9..c5189457dfc60aacf16032ae67143c9eb846a720 100644 (file)
@@ -6,7 +6,7 @@
 // Created:     2004-09-25
 // RCS-ID:      $Id$
 // Copyright:   (c) Jaakko Salli
 // 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".
 /////////////////////////////////////////////////////////////////////////////
 
 // For compilers that support precompilation, includes "wx/wx.h".
@@ -62,6 +62,8 @@
     #include "wx/msw/dc.h"
 #endif
 
     #include "wx/msw/dc.h"
 #endif
 
+#include "wx/odcombo.h"
+
 // -----------------------------------------------------------------------
 
 #if defined(__WXMSW__)
 // -----------------------------------------------------------------------
 
 #if defined(__WXMSW__)
@@ -238,12 +240,12 @@ WX_PG_IMPLEMENT_INTERNAL_EDITOR_CLASS(SpinCtrl,
                                       wxPGEditor)
 
 
                                       wxPGEditor)
 
 
-// Trivial destructor.
+// Destructor. It is useful to reset the global pointer in it.
 wxPGSpinCtrlEditor::~wxPGSpinCtrlEditor()
 {
 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
 // Create controls and initialize event handling.
 wxPGWindowList wxPGSpinCtrlEditor::CreateControls( wxPropertyGrid* propgrid, wxPGProperty* property,
                                                    const wxPoint& pos, const wxSize& sz ) const
@@ -274,11 +276,12 @@ wxPGWindowList wxPGSpinCtrlEditor::CreateControls( wxPropertyGrid* propgrid, wxP
     wnd2->SetRange( INT_MIN, INT_MAX );
     wnd2->SetValue( 0 );
 
     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);
     // 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);
     wnd1->SetValidator(validator);
+#endif
 
     return wxPGWindowList(wnd1, wnd2);
 }
 
     return wxPGWindowList(wnd1, wnd2);
 }
@@ -446,6 +449,7 @@ WX_PG_IMPLEMENT_INTERNAL_EDITOR_CLASS(DatePickerCtrl,
 
 wxPGDatePickerCtrlEditor::~wxPGDatePickerCtrlEditor()
 {
 
 wxPGDatePickerCtrlEditor::~wxPGDatePickerCtrlEditor()
 {
+    wxPG_EDITOR(DatePickerCtrl) = NULL;
 }
 
 wxPGWindowList wxPGDatePickerCtrlEditor::CreateControls( wxPropertyGrid* propgrid,
 }
 
 wxPGWindowList wxPGDatePickerCtrlEditor::CreateControls( wxPropertyGrid* propgrid,
@@ -453,7 +457,7 @@ wxPGWindowList wxPGDatePickerCtrlEditor::CreateControls( wxPropertyGrid* propgri
                                                          const wxPoint& pos,
                                                          const wxSize& sz ) const
 {
                                                          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.") );
 
                  NULL,
                  wxT("DatePickerCtrl editor can only be used with wxDateProperty or derivative.") );
 
@@ -494,7 +498,7 @@ void wxPGDatePickerCtrlEditor::UpdateControl( wxPGProperty* property,
                                               wxWindow* wnd ) const
 {
     wxDatePickerCtrl* ctrl = (wxDatePickerCtrl*) wnd;
                                               wxWindow* wnd ) const
 {
     wxDatePickerCtrl* ctrl = (wxDatePickerCtrl*) wnd;
-    wxASSERT( ctrl && ctrl->IsKindOf(CLASSINFO(wxDatePickerCtrl)) );
+    wxASSERT( wxDynamicCast(ctrl, wxDatePickerCtrl) );
 
     wxDateTime dateValue(wxInvalidDateTime);
     wxVariant v(property->GetValue());
 
     wxDateTime dateValue(wxInvalidDateTime);
     wxVariant v(property->GetValue());
@@ -519,7 +523,7 @@ bool wxPGDatePickerCtrlEditor::OnEvent( wxPropertyGrid* WXUNUSED(propgrid),
 bool wxPGDatePickerCtrlEditor::GetValueFromControl( wxVariant& variant, wxPGProperty* WXUNUSED(property), wxWindow* wnd ) const
 {
     wxDatePickerCtrl* ctrl = (wxDatePickerCtrl*) wnd;
 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();
 
 
     variant = ctrl->GetValue();
 
@@ -530,7 +534,7 @@ void wxPGDatePickerCtrlEditor::SetValueToUnspecified( wxPGProperty* property,
                                                       wxWindow* wnd ) const
 {
     wxDatePickerCtrl* ctrl = (wxDatePickerCtrl*) wnd;
                                                       wxWindow* wnd ) const
 {
     wxDatePickerCtrl* ctrl = (wxDatePickerCtrl*) wnd;
-    wxASSERT( ctrl && ctrl->IsKindOf(CLASSINFO(wxDatePickerCtrl)) );
+    wxASSERT( wxDynamicCast(ctrl, wxDatePickerCtrl) );
 
     wxDateProperty* prop = wxDynamicCast(property, wxDateProperty);
 
 
     wxDateProperty* prop = wxDynamicCast(property, wxDateProperty);
 
@@ -552,40 +556,46 @@ void wxPGDatePickerCtrlEditor::SetValueToUnspecified( wxPGProperty* property,
 #include "wx/fontdlg.h"
 #include "wx/fontenum.h"
 
 #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("Default"), wxT("Decorative"),
     wxT("Roman"), wxT("Script"),
     wxT("Swiss"), wxT("Modern"),
+    wxT("Teletype"), wxT("Unknown"),
     (const wxChar*) NULL
 };
 
     (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
 };
 
     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
 };
 
     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
 };
 
     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
     wxNORMAL,
     wxLIGHT,
     wxBOLD
@@ -622,13 +632,9 @@ wxFontProperty::wxFontProperty( const wxString& label, const wxString& name,
     AddPrivateChild( new wxIntProperty( _("Point Size"),
                      wxS("Point Size"),(long)font.GetPointSize() ) );
 
     AddPrivateChild( new wxIntProperty( _("Point Size"),
                      wxS("Point Size"),(long)font.GetPointSize() ) );
 
-    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
     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);
 
          wxPGGlobalVars->m_fontFamilyChoices->Index(faceName) == wxNOT_FOUND )
         wxPGGlobalVars->m_fontFamilyChoices->AddAsSorted(faceName);
 
@@ -649,6 +655,10 @@ wxFontProperty::wxFontProperty( const wxString& label, const wxString& name,
 
     AddPrivateChild( new wxBoolProperty(_("Underlined"), wxS("Underlined"),
                      font.GetUnderlined()) );
 
     AddPrivateChild( 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() { }
 }
 
 wxFontProperty::~wxFontProperty() { }
@@ -658,7 +668,7 @@ void wxFontProperty::OnSetValue()
     wxFont font;
     font << m_value;
 
     wxFont font;
     font << m_value;
 
-    if ( !font.Ok() )
+    if ( !font.IsOk() )
     {
         m_value << *wxNORMAL_FONT;
     }
     {
         m_value << *wxNORMAL_FONT;
     }
@@ -680,7 +690,10 @@ bool wxFontProperty::OnEvent( wxPropertyGrid* propgrid, wxWindow* WXUNUSED(prima
 
         wxFontData data;
         wxFont font;
 
         wxFontData data;
         wxFont font;
-        font << useValue;
+
+        if ( useValue.GetType() == wxS("wxFont") )
+            font << useValue;
+
         data.SetInitialFont( font );
         data.SetColour(*wxBLACK);
 
         data.SetInitialFont( font );
         data.SetColour(*wxBLACK);
 
@@ -704,11 +717,11 @@ void wxFontProperty::RefreshChildren()
     wxFont font;
     font << m_value;
     Item(0)->SetValue( (long)font.GetPointSize() );
     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() );
 }
 
 wxVariant wxFontProperty::ChildChanged( wxVariant& thisValue,
 }
 
 wxVariant wxFontProperty::ChildChanged( wxVariant& thisValue,
@@ -723,14 +736,6 @@ wxVariant wxFontProperty::ChildChanged( wxVariant& thisValue,
         font.SetPointSize( childValue.GetLong() );
     }
     else if ( ind == 1 )
         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();
     {
         wxString faceName;
         int faceIndex = childValue.GetLong();
@@ -740,7 +745,7 @@ wxVariant wxFontProperty::ChildChanged( wxVariant& thisValue,
 
         font.SetFaceName( faceName );
     }
 
         font.SetFaceName( faceName );
     }
-    else if ( ind == 3 )
+    else if ( ind == 2 )
     {
         int st = childValue.GetLong();
         if ( st != wxFONTSTYLE_NORMAL &&
     {
         int st = childValue.GetLong();
         if ( st != wxFONTSTYLE_NORMAL &&
@@ -749,7 +754,7 @@ wxVariant wxFontProperty::ChildChanged( wxVariant& thisValue,
              st = wxFONTWEIGHT_NORMAL;
         font.SetStyle( st );
     }
              st = wxFONTWEIGHT_NORMAL;
         font.SetStyle( st );
     }
-    else if ( ind == 4 )
+    else if ( ind == 3 )
     {
         int wt = childValue.GetLong();
         if ( wt != wxFONTWEIGHT_NORMAL &&
     {
         int wt = childValue.GetLong();
         if ( wt != wxFONTWEIGHT_NORMAL &&
@@ -758,10 +763,18 @@ wxVariant wxFontProperty::ChildChanged( wxVariant& thisValue,
              wt = wxFONTWEIGHT_NORMAL;
         font.SetWeight( wt );
     }
              wt = wxFONTWEIGHT_NORMAL;
         font.SetWeight( wt );
     }
-    else if ( ind == 5 )
+    else if ( ind == 4 )
     {
         font.SetUnderlined( childValue.GetBool() );
     }
     {
         font.SetUnderlined( childValue.GetBool() );
     }
+    else if ( ind == 5 )
+    {
+        int fam = childValue.GetLong();
+        if ( fam < wxDEFAULT ||
+             fam > wxTELETYPE )
+             fam = wxDEFAULT;
+        font.SetFamily( fam );
+    }
 
     wxVariant newVariant;
     newVariant << font;
 
     wxVariant newVariant;
     newVariant << font;
@@ -784,7 +797,7 @@ void wxFontProperty::OnCustomPaint(wxDC& dc,
     else
         drawFace = m_value_wxFont.GetFaceName();
 
     else
         drawFace = m_value_wxFont.GetFaceName();
 
-    if ( drawFace.length() )
+    if ( !drawFace.empty() )
     {
         // Draw the background
         dc.SetBrush( wxColour(wxSystemSettings::GetColour(wxSYS_COLOUR_BTNFACE)) );
     {
         // Draw the background
         dc.SetBrush( wxColour(wxSystemSettings::GetColour(wxSYS_COLOUR_BTNFACE)) );
@@ -822,7 +835,7 @@ void wxFontProperty::OnCustomPaint(wxDC& dc,
 #include "wx/colordlg.h"
 
 //#define wx_cp_es_syscolours_len 25
 #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"),
     wxT("AppWorkspace"),
     wxT("ActiveBorder"),
     wxT("ActiveCaption"),
@@ -851,7 +864,7 @@ static const wxChar* gs_cp_es_syscolour_labels[] = {
     (const wxChar*) NULL
 };
 
     (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,
     wxSYS_COLOUR_APPWORKSPACE,
     wxSYS_COLOUR_ACTIVEBORDER,
     wxSYS_COLOUR_ACTIVECAPTION,
@@ -893,7 +906,7 @@ void wxSystemColourProperty::Init( int type, const wxColour& colour )
 {
     wxColourPropertyValue cpv;
 
 {
     wxColourPropertyValue cpv;
 
-    if ( colour.Ok() )
+    if ( colour.IsOk() )
         cpv.Init( type, colour );
     else
         cpv.Init( type, *wxWHITE );
         cpv.Init( type, colour );
     else
         cpv.Init( type, *wxWHITE );
@@ -925,7 +938,7 @@ wxSystemColourProperty::wxSystemColourProperty( const wxString& label, const wxS
 
 
 wxSystemColourProperty::wxSystemColourProperty( const wxString& label, const wxString& name,
 
 
 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 )
 {
     const wxColourPropertyValue& value )
     : wxEnumProperty( label, name, labels, values, choicesCache )
 {
@@ -937,7 +950,7 @@ wxSystemColourProperty::wxSystemColourProperty( const wxString& label, const wxS
 
 
 wxSystemColourProperty::wxSystemColourProperty( const wxString& label, const wxString& name,
 
 
 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 )
 {
     const wxColour& value )
     : wxEnumProperty( label, name, labels, values, choicesCache )
 {
@@ -1084,7 +1097,7 @@ void wxSystemColourProperty::OnSetValue()
         cpv << m_value;
         wxColour col = cpv.m_colour;
 
         cpv << m_value;
         wxColour col = cpv.m_colour;
 
-        if ( !col.Ok() )
+        if ( !col.IsOk() )
         {
             SetValueToUnspecified();
             SetIndex(wxNOT_FOUND);
         {
             SetValueToUnspecified();
             SetIndex(wxNOT_FOUND);
@@ -1107,7 +1120,7 @@ void wxSystemColourProperty::OnSetValue()
         wxColour col;
         col << m_value;
 
         wxColour col;
         col << m_value;
 
-        if ( !col.Ok() )
+        if ( !col.IsOk() )
         {
             SetValueToUnspecified();
             SetIndex(wxNOT_FOUND);
         {
             SetValueToUnspecified();
             SetIndex(wxNOT_FOUND);
@@ -1130,15 +1143,35 @@ wxColour wxSystemColourProperty::GetColour( int index ) const
     return wxSystemSettings::GetColour( (wxSystemColour)index );
 }
 
     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 )
     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
     else
+    {
         return m_choices.GetLabel(index);
         return m_choices.GetLabel(index);
+    }
 }
 
 wxString wxSystemColourProperty::ValueToString( wxVariant& value,
 }
 
 wxString wxSystemColourProperty::ValueToString( wxVariant& value,
@@ -1165,7 +1198,7 @@ wxString wxSystemColourProperty::ValueToString( wxVariant& value,
         index = m_choices.Index(val.m_type);
     }
 
         index = m_choices.Index(val.m_type);
     }
 
-    return ColourToString(val.m_colour, index);
+    return ColourToString(val.m_colour, index, argFlags);
 }
 
 
 }
 
 
@@ -1242,12 +1275,37 @@ bool wxSystemColourProperty::IntToValue( wxVariant& variant, int number, int WXU
 }
 
 // Need to do some extra event handling.
 }
 
 // Need to do some extra event handling.
-bool wxSystemColourProperty::OnEvent( wxPropertyGrid* propgrid, wxWindow* WXUNUSED(primary), wxEvent& event )
+bool wxSystemColourProperty::OnEvent( wxPropertyGrid* propgrid,
+                                      wxWindow* WXUNUSED(primary),
+                                      wxEvent& event )
 {
 {
+    bool askColour = false;
+
     if ( propgrid->IsMainButtonEvent(event) )
     {
         // We need to handle button click in case editor has been
         // switched to one that has wxButton as well.
     if ( propgrid->IsMainButtonEvent(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_COMBOBOX )
+    {
+        // Must override index detection since at this point GetIndex()
+        // will return old value.
+        wxOwnerDrawnComboBox* cb =
+            static_cast<wxOwnerDrawnComboBox*>(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;
         wxVariant variant;
         if ( QueryColourFromUser(variant) )
             return true;
@@ -1262,7 +1320,7 @@ public:
                          const wxPropertyGrid* propertyGrid, wxPGProperty* property,
                          int WXUNUSED(column), int item, int WXUNUSED(flags) ) const
     {
                          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);
         wxSystemColourProperty* prop = wxStaticCast(property, wxSystemColourProperty);
 
         dc.SetPen(*wxBLACK_PEN);
@@ -1325,7 +1383,7 @@ void wxSystemColourProperty::OnCustomPaint( wxDC& dc, const wxRect& rect,
         col = GetVal().m_colour;
     }
 
         col = GetVal().m_colour;
     }
 
-    if ( col.Ok() )
+    if ( col.IsOk() )
     {
         dc.SetBrush(col);
         dc.DrawRectangle(rect);
     {
         dc.SetBrush(col);
         dc.DrawRectangle(rect);
@@ -1335,41 +1393,51 @@ void wxSystemColourProperty::OnCustomPaint( wxDC& dc, const wxRect& rect,
 
 bool wxSystemColourProperty::StringToValue( wxVariant& value, const wxString& text, int argFlags ) const
 {
 
 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) &&
          !(m_flags & wxPG_PROP_HIDE_CUSTOM_COLOUR) &&
-         colourName == m_choices.GetLabel(GetCustomColourIndex()) )
+         colStr == custColName )
     {
         if ( !(argFlags & wxPG_EDITABLE_VALUE ))
         {
     {
         if ( !(argFlags & wxPG_EDITABLE_VALUE ))
         {
-            // This really should not occurr...
+            // This really should not occur...
             // wxASSERT(false);
             ResetNextIndex();
             return false;
             // wxASSERT(false);
             ResetNextIndex();
             return false;
@@ -1383,10 +1451,12 @@ bool wxSystemColourProperty::StringToValue( wxVariant& value, const wxString& te
 
         bool done = false;
 
 
         bool done = false;
 
-        if ( colourName.length() )
+        if ( !conversionSuccess )
         {
             // Try predefined colour first
         {
             // 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();
             if ( res && GetIndex() >= 0 )
             {
                 val.m_type = GetIndex();
@@ -1399,22 +1469,11 @@ bool wxSystemColourProperty::StringToValue( wxVariant& value, const wxString& te
                 done = true;
             }
         }
                 done = true;
             }
         }
-        if ( colourRGB.length() && !done )
+        else
         {
         {
-            // Then check custom colour.
             val.m_type = wxPG_COLOUR_CUSTOM;
             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 )
         }
 
         if ( !done )
@@ -1458,7 +1517,7 @@ bool wxSystemColourProperty::DoSetAttribute( const wxString& name, wxVariant& va
 // wxColourProperty
 // -----------------------------------------------------------------------
 
 // wxColourProperty
 // -----------------------------------------------------------------------
 
-static const wxChar* gs_cp_es_normcolour_labels[] = {
+static const wxChar* const gs_cp_es_normcolour_labels[] = {
     wxT("Black"),
     wxT("Maroon"),
     wxT("Navy"),
     wxT("Black"),
     wxT("Maroon"),
     wxT("Navy"),
@@ -1481,7 +1540,7 @@ static const wxChar* gs_cp_es_normcolour_labels[] = {
     (const wxChar*) NULL
 };
 
     (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),
     wxPG_COLOUR(0,0,0),
     wxPG_COLOUR(128,0,0),
     wxPG_COLOUR(0,0,128),
@@ -1526,7 +1585,7 @@ wxColourProperty::~wxColourProperty()
 
 void wxColourProperty::Init( wxColour colour )
 {
 
 void wxColourProperty::Init( wxColour colour )
 {
-    if ( !colour.Ok() )
+    if ( !colour.IsOk() )
         colour = *wxWHITE;
     wxVariant variant;
     variant << colour;
         colour = *wxWHITE;
     wxVariant variant;
     variant << colour;
@@ -1570,7 +1629,7 @@ wxVariant wxColourProperty::DoTranslateVal( wxColourPropertyValue& v ) const
 #define NUM_CURSORS 28
 
 //#define wx_cp_es_syscursors_len 28
 #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"),
     wxT("Default"),
     wxT("Arrow"),
     wxT("Right Arrow"),
@@ -1602,7 +1661,7 @@ static const wxChar* gs_cp_es_syscursors_labels[NUM_CURSORS+1] = {
     (const wxChar*) NULL
 };
 
     (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,
     wxCURSOR_NONE,
     wxCURSOR_ARROW,
     wxCURSOR_RIGHT_ARROW,
@@ -1723,7 +1782,7 @@ void wxCursorProperty::OnCustomPaint( wxDC&, const wxRect&, wxPGPaintData& ) { }
 const wxString& wxPGGetDefaultImageWildcard()
 {
     // Form the wildcard, if not done yet
 const wxString& wxPGGetDefaultImageWildcard()
 {
     // Form the wildcard, if not done yet
-    if ( !wxPGGlobalVars->m_pDefaultImageWildcard.length() )
+    if ( wxPGGlobalVars->m_pDefaultImageWildcard.empty() )
     {
 
         wxString str;
     {
 
         wxString str;
@@ -1784,16 +1843,8 @@ void wxImageFileProperty::OnSetValue()
     wxFileProperty::OnSetValue();
 
     // Delete old image
     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();
 
 
     wxFileName filename = GetFileName();
 
@@ -1813,7 +1864,7 @@ void wxImageFileProperty::OnCustomPaint( wxDC& dc,
                                          const wxRect& rect,
                                          wxPGPaintData& )
 {
                                          const wxRect& rect,
                                          wxPGPaintData& )
 {
-    if ( m_pBitmap || (m_pImage && m_pImage->Ok() ) )
+    if ( m_pBitmap || (m_pImage && m_pImage->IsOk() ) )
     {
         // Draw the thumbnail
 
     {
         // Draw the thumbnail
 
@@ -1822,8 +1873,7 @@ void wxImageFileProperty::OnCustomPaint( wxDC& dc,
         {
             m_pImage->Rescale( rect.width, rect.height );
             m_pBitmap = new wxBitmap( *m_pImage );
         {
             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 );
         }
 
         dc.DrawBitmap( *m_pBitmap, rect.x, rect.y, false );
@@ -2129,7 +2179,7 @@ wxString wxDateProperty::ValueToString( wxVariant& value,
     if ( !dateTime.IsValid() )
         return wxT("Invalid");
 
     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;
     {
 #if wxUSE_DATEPICKCTRL
         bool showCentury = m_dpStyle & wxDP_SHOWCENTURY ? true : false;
@@ -2139,7 +2189,7 @@ wxString wxDateProperty::ValueToString( wxVariant& value,
         ms_defaultDateFormat = DetermineDefaultDateFormat( showCentury );
     }
 
         ms_defaultDateFormat = DetermineDefaultDateFormat( showCentury );
     }
 
-    if ( m_format.length() &&
+    if ( !m_format.empty() &&
          !(argFlags & wxPG_FULL_VALUE) )
             format = m_format.c_str();
 
          !(argFlags & wxPG_FULL_VALUE) )
             format = m_format.c_str();
 
@@ -2154,7 +2204,7 @@ wxString wxDateProperty::ValueToString( wxVariant& value,
 
 wxString wxDateProperty::DetermineDefaultDateFormat( bool showCentury )
 {
 
 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;
 
     //
     wxString format;