]> git.saurik.com Git - wxWidgets.git/blobdiff - samples/propgrid/sampleprops.cpp
Support using GetTextExtent() with empty string to get descent in wxOSX.
[wxWidgets.git] / samples / propgrid / sampleprops.cpp
index 21303e7af44252cd8c644b6eb4bc10d66476b054..61438b748808e430e8a6c3e6e320e9c663e809d3 100644 (file)
@@ -6,7 +6,7 @@
 // Created:     2006-03-05
 // RCS-ID:      $Id$
 // Copyright:   (c) Jaakko Salli
 // Created:     2006-03-05
 // 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".
@@ -22,6 +22,8 @@
     #include "wx/wx.h"
 #endif
 
     #include "wx/wx.h"
 #endif
 
+#include "wx/fontdlg.h"
+
 // -----------------------------------------------------------------------
 
 
 // -----------------------------------------------------------------------
 
 
@@ -46,8 +48,6 @@ bool operator == (const wxFontData&, const wxFontData&)
 // Custom version of wxFontProperty that also holds colour in the value.
 // Original version by Vladimir Vainer.
 
 // Custom version of wxFontProperty that also holds colour in the value.
 // Original version by Vladimir Vainer.
 
-#include <wx/fontdlg.h>
-
 IMPLEMENT_VARIANT_OBJECT_SHALLOWCMP(wxFontData)
 
 WX_PG_IMPLEMENT_PROPERTY_CLASS(wxFontDataProperty,wxFontProperty,
 IMPLEMENT_VARIANT_OBJECT_SHALLOWCMP(wxFontData)
 
 WX_PG_IMPLEMENT_PROPERTY_CLASS(wxFontDataProperty,wxFontProperty,
@@ -60,7 +60,7 @@ wxFontDataProperty::wxFontDataProperty( const wxString& label, const wxString& n
 
     // Fix value.
     fontData.SetChosenFont(value.GetInitialFont());
 
     // Fix value.
     fontData.SetChosenFont(value.GetInitialFont());
-    if ( !fontData.GetColour().Ok() )
+    if ( !fontData.GetColour().IsOk() )
         fontData.SetColour(*wxBLACK);
 
     // Set initial value - should be done in a simpler way like this
         fontData.SetColour(*wxBLACK);
 
     // Set initial value - should be done in a simpler way like this
@@ -68,8 +68,8 @@ wxFontDataProperty::wxFontDataProperty( const wxString& label, const wxString& n
     m_value_wxFontData << value;
 
     // Add extra children.
     m_value_wxFontData << value;
 
     // Add extra children.
-    AddChild( new wxColourProperty(_("Colour"), wxPG_LABEL,
-                                   fontData.GetColour() ) );
+    AddPrivateChild( new wxColourProperty(_("Colour"), wxPG_LABEL,
+                                          fontData.GetColour() ) );
 }
 
 wxFontDataProperty::~wxFontDataProperty () { }
 }
 
 wxFontDataProperty::~wxFontDataProperty () { }
@@ -113,7 +113,7 @@ void wxFontDataProperty::OnSetValue()
         fontData << m_value_wxFontData;
 
         wxFont font = fontData.GetChosenFont();
         fontData << m_value_wxFontData;
 
         wxFont font = fontData.GetChosenFont();
-        if ( !font.Ok() )
+        if ( !font.IsOk() )
             font = wxFont(10,wxSWISS,wxNORMAL,wxNORMAL);
 
         m_value = WXVARIANT(font);
             font = wxFont(10,wxSWISS,wxNORMAL,wxNORMAL);
 
         m_value = WXVARIANT(font);
@@ -131,7 +131,7 @@ bool wxFontDataProperty::OnEvent( wxPropertyGrid* propgrid,
 {
     if ( propgrid->IsMainButtonEvent(event) )
     {
 {
     if ( propgrid->IsMainButtonEvent(event) )
     {
-        wxVariant useValue = propgrid->GetPendingEditedValue();
+        wxVariant useValue = propgrid->GetUncommittedPropertyValue();
 
         wxFontData fontData;
         fontData << useValue;
 
         wxFontData fontData;
         fontData << useValue;
@@ -161,7 +161,9 @@ void wxFontDataProperty::RefreshChildren()
     Item(6)->SetValue( variant );
 }
 
     Item(6)->SetValue( variant );
 }
 
-void wxFontDataProperty::ChildChanged( wxVariant& thisValue, int childIndex, wxVariant& childValue ) const
+wxVariant wxFontDataProperty::ChildChanged( wxVariant& thisValue,
+                                            int childIndex,
+                                            wxVariant& childValue ) const
 {
     wxFontData fontData;
     fontData << thisValue;
 {
     wxFontData fontData;
     fontData << thisValue;
@@ -183,7 +185,9 @@ void wxFontDataProperty::ChildChanged( wxVariant& thisValue, int childIndex, wxV
             fontData.SetChosenFont(font);
     }
 
             fontData.SetChosenFont(font);
     }
 
-    thisValue << fontData;
+    wxVariant newVariant;
+    newVariant << fontData;
+    return newVariant;
 }
 
 // -----------------------------------------------------------------------
 }
 
 // -----------------------------------------------------------------------
@@ -197,8 +201,8 @@ wxSizeProperty::wxSizeProperty( const wxString& label, const wxString& name,
     const wxSize& value) : wxPGProperty(label,name)
 {
     SetValueI(value);
     const wxSize& value) : wxPGProperty(label,name)
 {
     SetValueI(value);
-    AddChild( new wxIntProperty(wxT("Width"),wxPG_LABEL,value.x) );
-    AddChild( new wxIntProperty(wxT("Height"),wxPG_LABEL,value.y) );
+    AddPrivateChild( new wxIntProperty(wxT("Width"),wxPG_LABEL,value.x) );
+    AddPrivateChild( new wxIntProperty(wxT("Height"),wxPG_LABEL,value.y) );
 }
 
 wxSizeProperty::~wxSizeProperty() { }
 }
 
 wxSizeProperty::~wxSizeProperty() { }
@@ -211,15 +215,20 @@ void wxSizeProperty::RefreshChildren()
     Item(1)->SetValue( (long)size.y );
 }
 
     Item(1)->SetValue( (long)size.y );
 }
 
-void wxSizeProperty::ChildChanged( wxVariant& thisValue, int childIndex, wxVariant& childValue ) const
+wxVariant wxSizeProperty::ChildChanged( wxVariant& thisValue,
+                                        int childIndex,
+                                        wxVariant& childValue ) const
 {
     wxSize& size = wxSizeRefFromVariant(thisValue);
 {
     wxSize& size = wxSizeRefFromVariant(thisValue);
-    int val = wxPGVariantToInt(childValue);
+    int val = childValue.GetLong();
     switch ( childIndex )
     {
         case 0: size.x = val; break;
         case 1: size.y = val; break;
     }
     switch ( childIndex )
     {
         case 0: size.x = val; break;
         case 1: size.y = val; break;
     }
+    wxVariant newVariant;
+    newVariant << size;
+    return newVariant;
 }
 
 // -----------------------------------------------------------------------
 }
 
 // -----------------------------------------------------------------------
@@ -233,8 +242,8 @@ wxPointProperty::wxPointProperty( const wxString& label, const wxString& name,
     const wxPoint& value) : wxPGProperty(label,name)
 {
     SetValueI(value);
     const wxPoint& value) : wxPGProperty(label,name)
 {
     SetValueI(value);
-    AddChild( new wxIntProperty(wxT("X"),wxPG_LABEL,value.x) );
-    AddChild( new wxIntProperty(wxT("Y"),wxPG_LABEL,value.y) );
+    AddPrivateChild( new wxIntProperty(wxT("X"),wxPG_LABEL,value.x) );
+    AddPrivateChild( new wxIntProperty(wxT("Y"),wxPG_LABEL,value.y) );
 }
 
 wxPointProperty::~wxPointProperty() { }
 }
 
 wxPointProperty::~wxPointProperty() { }
@@ -247,15 +256,20 @@ void wxPointProperty::RefreshChildren()
     Item(1)->SetValue( (long)point.y );
 }
 
     Item(1)->SetValue( (long)point.y );
 }
 
-void wxPointProperty::ChildChanged( wxVariant& thisValue, int childIndex, wxVariant& childValue ) const
+wxVariant wxPointProperty::ChildChanged( wxVariant& thisValue,
+                                         int childIndex,
+                                         wxVariant& childValue ) const
 {
     wxPoint& point = wxPointRefFromVariant(thisValue);
 {
     wxPoint& point = wxPointRefFromVariant(thisValue);
-    int val = wxPGVariantToInt(childValue);
+    int val = childValue.GetLong();
     switch ( childIndex )
     {
         case 0: point.x = val; break;
         case 1: point.y = val; break;
     }
     switch ( childIndex )
     {
         case 0: point.x = val; break;
         case 1: point.y = val; break;
     }
+    wxVariant newVariant;
+    newVariant << point;
+    return newVariant;
 }
 
 
 }
 
 
@@ -263,7 +277,8 @@ void wxPointProperty::ChildChanged( wxVariant& thisValue, int childIndex, wxVari
 // Dirs Property
 // -----------------------------------------------------------------------
 
 // Dirs Property
 // -----------------------------------------------------------------------
 
-WX_PG_IMPLEMENT_ARRAYSTRING_PROPERTY_WITH_VALIDATOR(wxDirsProperty,wxT(','),wxT("Browse"))
+WX_PG_IMPLEMENT_ARRAYSTRING_PROPERTY_WITH_VALIDATOR(wxDirsProperty, ',',
+                                                    "Browse")
 
 #if wxUSE_VALIDATORS
 
 
 #if wxUSE_VALIDATORS
 
@@ -300,7 +315,7 @@ bool wxDirsProperty::OnCustomStringEdit( wxWindow* parent, wxString& value )
 // by replacing each ArrayDouble with ArrayXXX.
 //
 
 // by replacing each ArrayDouble with ArrayXXX.
 //
 
-class wxArrayDoubleEditorDialog : public wxArrayEditorDialog
+class wxArrayDoubleEditorDialog : public wxPGArrayEditorDialog
 {
 public:
     wxArrayDoubleEditorDialog();
 {
 public:
     wxArrayDoubleEditorDialog();
@@ -354,7 +369,7 @@ private:
     DECLARE_DYNAMIC_CLASS_NO_COPY(wxArrayDoubleEditorDialog)
 };
 
     DECLARE_DYNAMIC_CLASS_NO_COPY(wxArrayDoubleEditorDialog)
 };
 
-IMPLEMENT_DYNAMIC_CLASS(wxArrayDoubleEditorDialog, wxArrayEditorDialog)
+IMPLEMENT_DYNAMIC_CLASS(wxArrayDoubleEditorDialog, wxPGArrayEditorDialog)
 
 //
 // Array dialog array access and manipulation
 
 //
 // Array dialog array access and manipulation
@@ -412,14 +427,14 @@ void wxArrayDoubleEditorDialog::ArraySwap( size_t first, size_t second )
 //
 
 wxArrayDoubleEditorDialog::wxArrayDoubleEditorDialog()
 //
 
 wxArrayDoubleEditorDialog::wxArrayDoubleEditorDialog()
-    : wxArrayEditorDialog()
+    : wxPGArrayEditorDialog()
 {
     Init();
 }
 
 void wxArrayDoubleEditorDialog::Init()
 {
 {
     Init();
 }
 
 void wxArrayDoubleEditorDialog::Init()
 {
-    wxArrayEditorDialog::Init();
+    wxPGArrayEditorDialog::Init();
     SetPrecision(-1);
 }
 
     SetPrecision(-1);
 }
 
@@ -430,7 +445,7 @@ wxArrayDoubleEditorDialog::wxArrayDoubleEditorDialog(wxWindow *parent,
                               long style,
                               const wxPoint& pos,
                               const wxSize& sz )
                               long style,
                               const wxPoint& pos,
                               const wxSize& sz )
-                              : wxArrayEditorDialog()
+                              : wxPGArrayEditorDialog()
 {
     Init();
     Create(parent,message,caption,array,style,pos,sz);
 {
     Init();
     Create(parent,message,caption,array,style,pos,sz);
@@ -447,7 +462,7 @@ bool wxArrayDoubleEditorDialog::Create(wxWindow *parent,
 
     m_array = array;
 
 
     m_array = array;
 
-    return wxArrayEditorDialog::Create (parent,message,caption,style,pos,sz);
+    return wxPGArrayEditorDialog::Create (parent,message,caption,style,pos,sz);
 }
 
 // -----------------------------------------------------------------------
 }
 
 // -----------------------------------------------------------------------
@@ -509,16 +524,29 @@ wxArrayDoubleProperty::~wxArrayDoubleProperty () { }
 
 void wxArrayDoubleProperty::OnSetValue()
 {
 
 void wxArrayDoubleProperty::OnSetValue()
 {
+    // Generate cached display string, to optimize grid drawing
     GenerateValueAsString( m_display, m_precision, true );
 }
 
     GenerateValueAsString( m_display, m_precision, true );
 }
 
-wxString wxArrayDoubleProperty::GetValueAsString( int arg_flags ) const
+wxString wxArrayDoubleProperty::ValueToString( wxVariant& value,
+                                               int argFlags ) const
 {
 {
-    if ( !(arg_flags & wxPG_FULL_VALUE ))
-        return m_display;
-
     wxString s;
     wxString s;
-    GenerateValueAsString(s,-1,false);
+
+    if ( argFlags & wxPG_FULL_VALUE )
+    {
+        GenerateValueAsString(s,-1,false);
+    }
+    else
+    {
+        //
+        // Display cached string only if value truly matches m_value
+        if ( value.GetData() == m_value.GetData() )
+            return m_display;
+        else
+            GenerateValueAsString( s, m_precision, true );
+    }
+
     return s;
 }
 
     return s;
 }
 
@@ -554,7 +582,7 @@ bool wxArrayDoubleProperty::OnEvent( wxPropertyGrid* propgrid,
     if ( propgrid->IsMainButtonEvent(event) )
     {
         // Update the value in case of last minute changes
     if ( propgrid->IsMainButtonEvent(event) )
     {
         // Update the value in case of last minute changes
-        wxVariant useValue = propgrid->GetPendingEditedValue();
+        wxVariant useValue = propgrid->GetUncommittedPropertyValue();
 
         wxArrayDouble& value = wxArrayDoubleRefFromVariant(useValue);
 
 
         wxArrayDouble& value = wxArrayDoubleRefFromVariant(useValue);
 
@@ -590,7 +618,7 @@ bool wxArrayDoubleProperty::StringToValue( wxVariant& variant, const wxString& t
 
     WX_PG_TOKENIZER1_BEGIN(text,delimiter)
 
 
     WX_PG_TOKENIZER1_BEGIN(text,delimiter)
 
-        if ( token.length() )
+        if ( !token.empty() )
         {
 
             // If token was invalid, exit the loop now
         {
 
             // If token was invalid, exit the loop now