| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664 |
- /////////////////////////////////////////////////////////////////////////////
- // Name: samples/propgrid/sampleprops.cpp
- // Purpose: wxPropertyGrid Sample Properties
- // Author: Jaakko Salli
- // Modified by:
- // Created: 2006-03-05
- // Copyright: (c) Jaakko Salli
- // Licence: wxWindows licence
- /////////////////////////////////////////////////////////////////////////////
- // For compilers that support precompilation, includes "wx/wx.h".
- #include "wx/wxprec.h"
- #ifdef __BORLANDC__
- #pragma hdrstop
- #endif
- // for all others, include the necessary headers (this file is usually all you
- // need because it includes almost all "standard" wxWidgets headers)
- #ifndef WX_PRECOMP
- #include "wx/wx.h"
- #endif
- #include "wx/fontdlg.h"
- // -----------------------------------------------------------------------
- #include <wx/propgrid/propgrid.h>
- #include <wx/propgrid/advprops.h>
- #ifndef WX_PROPGRID_SAMPLEPROPS_H
- #include "sampleprops.h"
- #endif
- // -----------------------------------------------------------------------
- // wxFontDataProperty
- // -----------------------------------------------------------------------
- // Dummy comparison required by value type implementation.
- bool operator == (const wxFontData&, const wxFontData&)
- {
- return FALSE;
- }
- // Custom version of wxFontProperty that also holds colour in the value.
- // Original version by Vladimir Vainer.
- IMPLEMENT_VARIANT_OBJECT_SHALLOWCMP(wxFontData)
- WX_PG_IMPLEMENT_PROPERTY_CLASS(wxFontDataProperty,wxFontProperty,
- wxFontData,const wxFontData&,TextCtrlAndButton)
- wxFontDataProperty::wxFontDataProperty( const wxString& label, const wxString& name,
- const wxFontData& value ) : wxFontProperty(label,name,value.GetInitialFont())
- {
- wxFontData fontData(value);
- // Fix value.
- fontData.SetChosenFont(value.GetInitialFont());
- if ( !fontData.GetColour().IsOk() )
- fontData.SetColour(*wxBLACK);
- // Set initial value - should be done in a simpler way like this
- // (instead of calling SetValue) in derived (wxObject) properties.
- m_value_wxFontData << value;
- // Add extra children.
- AddPrivateChild( new wxColourProperty(_("Colour"), wxPG_LABEL,
- fontData.GetColour() ) );
- }
- wxFontDataProperty::~wxFontDataProperty () { }
- void wxFontDataProperty::OnSetValue()
- {
- if ( m_value.GetType() != "wxFontData" )
- {
- if ( m_value.GetType() == "wxFont" )
- {
- wxFont font;
- font << m_value;
- wxFontData fontData;
- fontData.SetChosenFont(font);
- if ( !m_value_wxFontData.IsNull() )
- {
- wxFontData oldFontData;
- oldFontData << m_value_wxFontData;
- fontData.SetColour(oldFontData.GetColour());
- }
- else
- {
- fontData.SetColour(*wxBLACK);
- }
- wxVariant variant;
- variant << fontData;
- m_value_wxFontData = variant;
- }
- else
- {
- wxFAIL_MSG(wxT("Value to wxFontDataProperty must be eithe wxFontData or wxFont"));
- }
- }
- else
- {
- // Set m_value to wxFont so that wxFontProperty methods will work
- // correctly.
- m_value_wxFontData = m_value;
- wxFontData fontData;
- fontData << m_value_wxFontData;
- wxFont font = fontData.GetChosenFont();
- if ( !font.IsOk() )
- font = wxFont(10,wxSWISS,wxNORMAL,wxNORMAL);
- m_value = WXVARIANT(font);
- }
- }
- wxVariant wxFontDataProperty::DoGetValue() const
- {
- return m_value_wxFontData;
- }
- // Must re-create font dialog displayer.
- bool wxFontDataProperty::OnEvent( wxPropertyGrid* propgrid,
- wxWindow* WXUNUSED(primary), wxEvent& event )
- {
- if ( propgrid->IsMainButtonEvent(event) )
- {
- wxVariant useValue = propgrid->GetUncommittedPropertyValue();
- wxFontData fontData;
- fontData << useValue;
- fontData.SetInitialFont(fontData.GetChosenFont());
- wxFontDialog dlg(propgrid, fontData);
- if ( dlg.ShowModal() == wxID_OK )
- {
- wxVariant variant;
- variant << dlg.GetFontData();
- SetValueInEvent( variant );
- return true;
- }
- }
- return false;
- }
- void wxFontDataProperty::RefreshChildren()
- {
- wxFontProperty::RefreshChildren();
- if ( GetChildCount() < 6 ) // Number is count of wxFontProperty's children + 1.
- return;
- wxFontData fontData; fontData << m_value_wxFontData;
- wxVariant variant; variant << fontData.GetColour();
- Item(6)->SetValue( variant );
- }
- wxVariant wxFontDataProperty::ChildChanged( wxVariant& thisValue,
- int childIndex,
- wxVariant& childValue ) const
- {
- wxFontData fontData;
- fontData << thisValue;
- wxColour col;
- wxVariant variant;
- switch ( childIndex )
- {
- case 6:
- col << childValue;
- fontData.SetColour( col );
- break;
- default:
- // Transfer from subset to superset.
- wxFont font = fontData.GetChosenFont();
- variant = WXVARIANT(font);
- wxFontProperty::ChildChanged( variant, childIndex, childValue );
- font << variant;
- fontData.SetChosenFont(font);
- }
- wxVariant newVariant;
- newVariant << fontData;
- return newVariant;
- }
- // -----------------------------------------------------------------------
- // wxSizeProperty
- // -----------------------------------------------------------------------
- WX_PG_IMPLEMENT_PROPERTY_CLASS(wxSizeProperty,wxPGProperty,
- wxSize,const wxSize&,TextCtrl)
- wxSizeProperty::wxSizeProperty( const wxString& label, const wxString& name,
- const wxSize& value) : wxPGProperty(label,name)
- {
- SetValueI(value);
- AddPrivateChild( new wxIntProperty(wxT("Width"),wxPG_LABEL,value.x) );
- AddPrivateChild( new wxIntProperty(wxT("Height"),wxPG_LABEL,value.y) );
- }
- wxSizeProperty::~wxSizeProperty() { }
- void wxSizeProperty::RefreshChildren()
- {
- if ( !GetChildCount() ) return;
- const wxSize& size = wxSizeRefFromVariant(m_value);
- Item(0)->SetValue( (long)size.x );
- Item(1)->SetValue( (long)size.y );
- }
- wxVariant wxSizeProperty::ChildChanged( wxVariant& thisValue,
- int childIndex,
- wxVariant& childValue ) const
- {
- wxSize& size = wxSizeRefFromVariant(thisValue);
- int val = childValue.GetLong();
- switch ( childIndex )
- {
- case 0: size.x = val; break;
- case 1: size.y = val; break;
- }
- wxVariant newVariant;
- newVariant << size;
- return newVariant;
- }
- // -----------------------------------------------------------------------
- // wxPointProperty
- // -----------------------------------------------------------------------
- WX_PG_IMPLEMENT_PROPERTY_CLASS(wxPointProperty,wxPGProperty,
- wxPoint,const wxPoint&,TextCtrl)
- wxPointProperty::wxPointProperty( const wxString& label, const wxString& name,
- const wxPoint& value) : wxPGProperty(label,name)
- {
- SetValueI(value);
- AddPrivateChild( new wxIntProperty(wxT("X"),wxPG_LABEL,value.x) );
- AddPrivateChild( new wxIntProperty(wxT("Y"),wxPG_LABEL,value.y) );
- }
- wxPointProperty::~wxPointProperty() { }
- void wxPointProperty::RefreshChildren()
- {
- if ( !GetChildCount() ) return;
- const wxPoint& point = wxPointRefFromVariant(m_value);
- Item(0)->SetValue( (long)point.x );
- Item(1)->SetValue( (long)point.y );
- }
- wxVariant wxPointProperty::ChildChanged( wxVariant& thisValue,
- int childIndex,
- wxVariant& childValue ) const
- {
- wxPoint& point = wxPointRefFromVariant(thisValue);
- int val = childValue.GetLong();
- switch ( childIndex )
- {
- case 0: point.x = val; break;
- case 1: point.y = val; break;
- }
- wxVariant newVariant;
- newVariant << point;
- return newVariant;
- }
- // -----------------------------------------------------------------------
- // Dirs Property
- // -----------------------------------------------------------------------
- WX_PG_IMPLEMENT_ARRAYSTRING_PROPERTY_WITH_VALIDATOR(wxDirsProperty, ',',
- "Browse")
- #if wxUSE_VALIDATORS
- wxValidator* wxDirsProperty::DoGetValidator() const
- {
- return wxFileProperty::GetClassValidator();
- }
- #endif
- bool wxDirsProperty::OnCustomStringEdit( wxWindow* parent, wxString& value )
- {
- wxDirDialog dlg(parent,
- _("Select a directory to be added to the list:"),
- value,
- 0);
- if ( dlg.ShowModal() == wxID_OK )
- {
- value = dlg.GetPath();
- return TRUE;
- }
- return FALSE;
- }
- // -----------------------------------------------------------------------
- // wxArrayDoubleEditorDialog
- // -----------------------------------------------------------------------
- //
- // You can *almost* convert wxArrayDoubleEditorDialog to wxArrayXXXEditorDialog
- // by replacing each ArrayDouble with ArrayXXX.
- //
- class wxArrayDoubleEditorDialog : public wxPGArrayEditorDialog
- {
- public:
- wxArrayDoubleEditorDialog();
- void Init();
- wxArrayDoubleEditorDialog(wxWindow *parent,
- const wxString& message,
- const wxString& caption,
- wxArrayDouble& array,
- long style = wxAEDIALOG_STYLE,
- const wxPoint& pos = wxDefaultPosition,
- const wxSize& sz = wxDefaultSize );
- bool Create(wxWindow *parent,
- const wxString& message,
- const wxString& caption,
- wxArrayDouble& array,
- long style = wxAEDIALOG_STYLE,
- const wxPoint& pos = wxDefaultPosition,
- const wxSize& sz = wxDefaultSize );
- const wxArrayDouble& GetArray() const { return m_array; }
- // Extra method for this type of array
- void SetPrecision ( int precision )
- {
- m_precision = precision;
- m_dtoaTemplate.Empty();
- }
- protected:
- // Mandatory array of type
- wxArrayDouble m_array;
- // Use this to avoid extra wxString creation+Printf
- // on double-to-wxString conversion.
- wxString m_dtoaTemplate;
- int m_precision;
- // Mandatory overridden methods
- virtual wxString ArrayGet( size_t index );
- virtual size_t ArrayGetCount();
- virtual bool ArrayInsert( const wxString& str, int index );
- virtual bool ArraySet( size_t index, const wxString& str );
- virtual void ArrayRemoveAt( int index );
- virtual void ArraySwap( size_t first, size_t second );
- private:
- wxDECLARE_DYNAMIC_CLASS_NO_COPY(wxArrayDoubleEditorDialog);
- };
- IMPLEMENT_DYNAMIC_CLASS(wxArrayDoubleEditorDialog, wxPGArrayEditorDialog)
- //
- // Array dialog array access and manipulation
- //
- wxString wxArrayDoubleEditorDialog::ArrayGet( size_t index )
- {
- wxString str;
- wxPropertyGrid::DoubleToString(str,m_array[index],m_precision,true,&m_dtoaTemplate);
- return str;
- }
- size_t wxArrayDoubleEditorDialog::ArrayGetCount()
- {
- return m_array.GetCount();
- }
- bool wxArrayDoubleEditorDialog::ArrayInsert( const wxString& str, int index )
- {
- double d;
- if ( !str.ToDouble(&d) )
- return FALSE;
- if (index<0)
- m_array.Add(d);
- else
- m_array.Insert(d,index);
- return TRUE;
- }
- bool wxArrayDoubleEditorDialog::ArraySet( size_t index, const wxString& str )
- {
- double d;
- if ( !str.ToDouble(&d) )
- return FALSE;
- m_array[index] = d;
- return TRUE;
- }
- void wxArrayDoubleEditorDialog::ArrayRemoveAt( int index )
- {
- m_array.RemoveAt(index);
- }
- void wxArrayDoubleEditorDialog::ArraySwap( size_t first, size_t second )
- {
- double a = m_array[first];
- double b = m_array[second];
- m_array[first] = b;
- m_array[second] = a;
- }
- //
- // Array dialog construction etc.
- //
- wxArrayDoubleEditorDialog::wxArrayDoubleEditorDialog()
- : wxPGArrayEditorDialog()
- {
- Init();
- }
- void wxArrayDoubleEditorDialog::Init()
- {
- wxPGArrayEditorDialog::Init();
- SetPrecision(-1);
- }
- wxArrayDoubleEditorDialog::wxArrayDoubleEditorDialog(wxWindow *parent,
- const wxString& message,
- const wxString& caption,
- wxArrayDouble& array,
- long style,
- const wxPoint& pos,
- const wxSize& sz )
- : wxPGArrayEditorDialog()
- {
- Init();
- Create(parent,message,caption,array,style,pos,sz);
- }
- bool wxArrayDoubleEditorDialog::Create(wxWindow *parent,
- const wxString& message,
- const wxString& caption,
- wxArrayDouble& array,
- long style,
- const wxPoint& pos,
- const wxSize& sz )
- {
- m_array = array;
- return wxPGArrayEditorDialog::Create (parent,message,caption,style,pos,sz);
- }
- // -----------------------------------------------------------------------
- // wxArrayDoubleProperty
- // -----------------------------------------------------------------------
- #include <math.h> // for fabs
- // Comparison required by value type implementation.
- bool operator == (const wxArrayDouble& a, const wxArrayDouble& b)
- {
- if ( a.GetCount() != b.GetCount() )
- return FALSE;
- size_t i;
- for ( i=0; i<a.GetCount(); i++ )
- {
- // Can't do direct equality comparison with floating point numbers.
- if ( fabs(a[i] - b[i]) > 0.0000000001 )
- {
- //wxLogDebug(wxT("%f != %f"),a[i],b[i]);
- return FALSE;
- }
- }
- return TRUE;
- }
- WX_PG_IMPLEMENT_VARIANT_DATA_DUMMY_EQ(wxArrayDouble)
- WX_PG_IMPLEMENT_PROPERTY_CLASS(wxArrayDoubleProperty,
- wxPGProperty,
- wxArrayDouble,
- const wxArrayDouble&,
- TextCtrlAndButton)
- wxArrayDoubleProperty::wxArrayDoubleProperty (const wxString& label,
- const wxString& name,
- const wxArrayDouble& array )
- : wxPGProperty(label,name)
- {
- m_precision = -1;
- //
- // Need to figure out delimiter needed for this locale
- // (ie. can't use comma when comma acts as decimal point in float).
- wxChar use_delimiter = wxT(',');
- if (wxString::Format(wxT("%.2f"),12.34).Find(use_delimiter) >= 0)
- use_delimiter = wxT(';');
- m_delimiter = use_delimiter;
- SetValue( WXVARIANT(array) );
- }
- wxArrayDoubleProperty::~wxArrayDoubleProperty () { }
- void wxArrayDoubleProperty::OnSetValue()
- {
- // Generate cached display string, to optimize grid drawing
- GenerateValueAsString( m_display, m_precision, true );
- }
- wxString wxArrayDoubleProperty::ValueToString( wxVariant& value,
- int argFlags ) const
- {
- wxString s;
- 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;
- }
- void wxArrayDoubleProperty::GenerateValueAsString( wxString& target, int prec, bool removeZeroes ) const
- {
- wxString s;
- wxString template_str;
- wxChar between[3] = wxT(", ");
- size_t i;
- between[0] = m_delimiter;
- target.Empty();
- const wxArrayDouble& value = wxArrayDoubleRefFromVariant(m_value);
- for ( i=0; i<value.GetCount(); i++ )
- {
- wxPropertyGrid::DoubleToString(s,value[i],prec,removeZeroes,&template_str);
- target += s;
- if ( i<(value.GetCount()-1) )
- target += between;
- }
- }
- bool wxArrayDoubleProperty::OnEvent( wxPropertyGrid* propgrid,
- wxWindow* WXUNUSED(primary),
- wxEvent& event)
- {
- if ( propgrid->IsMainButtonEvent(event) )
- {
- // Update the value in case of last minute changes
- wxVariant useValue = propgrid->GetUncommittedPropertyValue();
- wxArrayDouble& value = wxArrayDoubleRefFromVariant(useValue);
- // Create editor dialog.
- wxArrayDoubleEditorDialog dlg;
- dlg.SetPrecision(m_precision);
- dlg.Create( propgrid, wxEmptyString, m_label, value );
- dlg.Move( propgrid->GetGoodEditorDialogPosition(this,dlg.GetSize()) );
- // Execute editor dialog
- int res = dlg.ShowModal();
- if ( res == wxID_OK && dlg.IsModified() )
- {
- SetValueInEvent( WXVARIANT(dlg.GetArray()) );
- return true;
- }
- return false;
- }
- return false;
- }
- bool wxArrayDoubleProperty::StringToValue( wxVariant& variant, const wxString& text, int ) const
- {
- double tval;
- wxString tstr;
- // Add values to a temporary array so that in case
- // of error we can opt not to use them.
- wxArrayDouble new_array;
- bool ok = true;
- wxChar delimiter = m_delimiter;
- WX_PG_TOKENIZER1_BEGIN(text,delimiter)
- if ( !token.empty() )
- {
- // If token was invalid, exit the loop now
- if ( !token.ToDouble(&tval) )
- {
- tstr.Printf ( _("\"%s\" is not a floating-point number."), token.c_str() );
- ok = false;
- break;
- }
- // TODO: Put validator code here
- new_array.Add(tval);
- }
- WX_PG_TOKENIZER1_END()
- // When invalid token found, show error message and don't change anything
- if ( !ok )
- {
- //ShowError( tstr );
- return false;
- }
- if ( !(wxArrayDoubleRefFromVariant(m_value) == new_array) )
- {
- variant = WXVARIANT(new_array);
- return true;
- }
- return false;
- }
- bool wxArrayDoubleProperty::DoSetAttribute( const wxString& name, wxVariant& value )
- {
- if ( name == wxPG_FLOAT_PRECISION )
- {
- m_precision = value.GetLong();
- GenerateValueAsString( m_display, m_precision, true );
- return true;
- }
- return false;
- }
|