// Author: Jaakko Salli
// Modified by:
// Created: 2004-09-25
-// RCS-ID: $Id:
+// RCS-ID: $Id$
// Copyright: (c) Jaakko Salli
// Licence: wxWindows license
/////////////////////////////////////////////////////////////////////////////
#pragma hdrstop
#endif
+#if wxUSE_PROPGRID
+
#ifndef WX_PRECOMP
#include "wx/defs.h"
#include "wx/object.h"
#include "wx/scrolwin.h"
#include "wx/dirdlg.h"
#include "wx/combobox.h"
- #include "wx/layout.h"
#include "wx/sizer.h"
#include "wx/textdlg.h"
#include "wx/filedlg.h"
#include "wx/intl.h"
+ #include "wx/wxcrtvararg.h"
#endif
#define __wxPG_SOURCE_FILE__
-#include <wx/propgrid/propgrid.h>
+#include "wx/propgrid/propgrid.h"
#if wxPG_INCLUDE_ADVPROPS
-#include <wx/propgrid/advprops.h>
+#include "wx/propgrid/advprops.h"
#ifdef __WXMSW__
- #include <wx/msw/private.h>
- #include <wx/msw/dc.h>
+ #include "wx/msw/private.h"
+ #include "wx/msw/dc.h"
#endif
// -----------------------------------------------------------------------
#if wxUSE_SPINBTN
-// This macro also defines global wxPGEditor_SpinCtrl for storing
-// the singleton class instance.
-WX_PG_IMPLEMENT_EDITOR_CLASS(SpinCtrl,wxPGSpinCtrlEditor,wxPGEditor)
+WX_PG_IMPLEMENT_INTERNAL_EDITOR_CLASS(SpinCtrl,
+ wxPGSpinCtrlEditor,
+ wxPGEditor)
// Trivial destructor.
wnd2->SetRange( INT_MIN, INT_MAX );
wnd2->SetValue( 0 );
- propgrid->Connect( wxPG_SUBID2, wxEVT_SCROLL_LINEUP,
- (wxObjectEventFunction) (wxEventFunction) (wxCommandEventFunction)
- &wxPropertyGrid::OnCustomEditorEvent, NULL, propgrid );
- propgrid->Connect( wxPG_SUBID2, wxEVT_SCROLL_LINEDOWN,
- (wxObjectEventFunction) (wxEventFunction) (wxCommandEventFunction)
- &wxPropertyGrid::OnCustomEditorEvent, NULL, propgrid );
- propgrid->Connect( wxPG_SUBID1, wxEVT_KEY_DOWN,
- (wxObjectEventFunction) (wxEventFunction) (wxCommandEventFunction)
- &wxPropertyGrid::OnCustomEditorEvent, NULL, propgrid );
+ wxWindowID id = wnd2->GetId();
+ wnd2->Connect( id, wxEVT_SCROLL_LINEUP,
+ wxCommandEventHandler(wxPropertyGrid::OnCustomEditorEvent),
+ NULL, propgrid );
+ wnd2->Connect( id, wxEVT_SCROLL_LINEDOWN,
+ wxCommandEventHandler(wxPropertyGrid::OnCustomEditorEvent),
+ NULL, propgrid );
// 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->Connect( wnd1->GetId(), wxEVT_KEY_DOWN,
+ wxCommandEventHandler(wxPropertyGrid::OnCustomEditorEvent),
+ NULL, propgrid );
+
return wxPGWindowList(wnd1, wnd2);
}
#if wxUSE_DATEPICKCTRL
-#include <wx/datectrl.h>
-#include <wx/dateevt.h>
+#include "wx/datectrl.h"
+#include "wx/dateevt.h"
class wxPGDatePickerCtrlEditor : public wxPGEditor
{
- WX_PG_DECLARE_EDITOR_CLASS(wxPGDatePickerCtrlEditor)
+ DECLARE_DYNAMIC_CLASS(wxPGDatePickerCtrlEditor)
public:
virtual ~wxPGDatePickerCtrlEditor();
- wxPG_DECLARE_CREATECONTROLS
-
+ wxString GetName() const;
+ virtual wxPGWindowList CreateControls(wxPropertyGrid* propgrid,
+ wxPGProperty* property,
+ const wxPoint& pos,
+ const wxSize& size) const;
virtual void UpdateControl( wxPGProperty* property, wxWindow* wnd ) const;
virtual bool OnEvent( wxPropertyGrid* propgrid, wxPGProperty* property,
wxWindow* wnd, wxEvent& event ) const;
};
-WX_PG_IMPLEMENT_EDITOR_CLASS(DatePickerCtrl,wxPGDatePickerCtrlEditor,wxPGEditor)
+WX_PG_IMPLEMENT_INTERNAL_EDITOR_CLASS(DatePickerCtrl,
+ wxPGDatePickerCtrlEditor,
+ wxPGEditor)
wxPGDatePickerCtrlEditor::~wxPGDatePickerCtrlEditor()
// Connect all required events to grid's OnCustomEditorEvent
// (all relevenat wxTextCtrl, wxComboBox and wxButton events are
// already connected)
- propgrid->Connect( wxPG_SUBID1, wxEVT_DATE_CHANGED,
- (wxObjectEventFunction) (wxEventFunction) (wxCommandEventFunction)
- &wxPropertyGrid::OnCustomEditorEvent );
+ ctrl->Connect( wxPG_SUBID1, wxEVT_DATE_CHANGED,
+ wxCommandEventHandler(wxPropertyGrid::OnCustomEditorEvent),
+ NULL, propgrid );
#ifdef __WXMSW__
ctrl->Show();
// wxFontProperty
// -----------------------------------------------------------------------
-#include <wx/fontdlg.h>
-#include <wx/fontenum.h>
+#include "wx/fontdlg.h"
+#include "wx/fontenum.h"
static const wxChar* gs_fp_es_family_labels[] = {
wxT("Default"), wxT("Decorative"),
const wxFont& value )
: wxPGProperty(label,name)
{
- SetValue( wxFontToVariant(value) );
+ SetValue(WXVARIANT(value));
// Initialize font family choices list
if ( !wxPGGlobalVars->m_fontFamilyChoices )
wxString emptyString(wxEmptyString);
- wxFont& font = wxFontFromVariant(m_value);
+ wxFont font;
+ font << m_value;
- AddChild( new wxIntProperty( _("Point Size"),emptyString,(long)font.GetPointSize() ) );
+ AddChild( new wxIntProperty( _("Point Size"), wxS("Point Size"),(long)font.GetPointSize() ) );
- AddChild( new wxEnumProperty(_("Family"), emptyString,
+ AddChild( new wxEnumProperty(_("Family"), wxS("PointSize"),
gs_fp_es_family_labels,gs_fp_es_family_values,
font.GetFamily()) );
wxPGGlobalVars->m_fontFamilyChoices->Index(faceName) == wxNOT_FOUND )
wxPGGlobalVars->m_fontFamilyChoices->AddAsSorted(faceName);
- wxPGProperty* p = new wxEnumProperty(_("Face Name"),emptyString,
+ wxPGProperty* p = new wxEnumProperty(_("Face Name"), wxS("Face Name"),
*wxPGGlobalVars->m_fontFamilyChoices);
p->SetValueFromString(faceName, wxPG_FULL_VALUE);
AddChild( p );
- AddChild( new wxEnumProperty(_("Style"),emptyString,
+ AddChild( new wxEnumProperty(_("Style"), wxS("Style"),
gs_fp_es_style_labels,gs_fp_es_style_values,font.GetStyle()) );
- AddChild( new wxEnumProperty(_("Weight"),emptyString,
+ AddChild( new wxEnumProperty(_("Weight"), wxS("Weight"),
gs_fp_es_weight_labels,gs_fp_es_weight_values,font.GetWeight()) );
- AddChild( new wxBoolProperty(_("Underlined"),emptyString,
+ AddChild( new wxBoolProperty(_("Underlined"), wxS("Underlined"),
font.GetUnderlined()) );
}
void wxFontProperty::OnSetValue()
{
- wxFont& font = wxFontFromVariant(m_value);
- wxASSERT(&font);
+ wxFont font;
+ font << m_value;
- wxFont font2;
if ( !font.Ok() )
- font2 = wxFont(10,wxSWISS,wxNORMAL,wxNORMAL);
- else
- font2 = font;
-
- m_value = wxFontToVariant(font2);
+ {
+ font = wxFont(10,wxSWISS,wxNORMAL,wxNORMAL);
+ m_value << font;
+ }
}
wxString wxFontProperty::GetValueAsString( int argFlags ) const
PrepareValueForDialogEditing(propgrid);
wxFontData data;
- data.SetInitialFont( wxFontFromVariant(m_value) );
+ wxFont font;
+ font << m_value;
+ data.SetInitialFont( font );
data.SetColour(*wxBLACK);
wxFontDialog dlg(propgrid, data);
{
propgrid->EditorsValueWasModified();
- wxVariant variant = wxFontToVariant(dlg.GetFontData().GetChosenFont());
+ wxVariant variant;
+ variant << dlg.GetFontData().GetChosenFont();
SetValueInEvent( variant );
return true;
}
void wxFontProperty::RefreshChildren()
{
if ( !GetChildCount() ) return;
- const wxFont& font = wxFontFromVariant(m_value);
+ 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 );
void wxFontProperty::ChildChanged( wxVariant& thisValue, int ind, wxVariant& childValue ) const
{
- wxFont& font = wxFontFromVariant(thisValue);
+ wxFont font;
+ font << thisValue;
if ( ind == 0 )
{
{
font.SetUnderlined( childValue.GetBool() );
}
+
+ thisValue << font;
}
/*
// wxEnumProperty based classes cannot use wxPG_PROP_CLASS_SPECIFIC_1
#define wxPG_PROP_HIDE_CUSTOM_COLOUR wxPG_PROP_CLASS_SPECIFIC_2
-#include <wx/colordlg.h>
+#include "wx/colordlg.h"
//#define wx_cp_es_syscolours_len 25
static const wxChar* gs_cp_es_syscolour_labels[] = {
};
-WX_PG_IMPLEMENT_WXOBJECT_VARIANT_DATA(wxPGVariantDataColourPropertyValue, wxColourPropertyValue)
+IMPLEMENT_VARIANT_OBJECT_EXPORTED_SHALLOWCMP(wxColourPropertyValue, WXDLLIMPEXP_PROPGRID)
// Class body is in advprops.h
m_flags |= wxPG_PROP_STATIC_CHOICES; // Colour selection cannot be changed.
- m_value = wxColourPropertyValueToVariant(cpv);
+ m_value << cpv;
OnSetValue();
}
if ( pVariant->IsNull() )
return wxColourPropertyValue(wxPG_COLOUR_UNSPECIFIED, wxColour());
- wxColourPropertyValue* v1 = &wxColourPropertyValueFromVariant(*pVariant);
- if ( v1 )
- return *v1;
+ if ( pVariant->GetType() == wxS("wxColourPropertyValue") )
+ {
+ wxColourPropertyValue v;
+ v << *pVariant;
+ return v;
+ }
- wxColour* pCol = wxGetVariantCast(*pVariant, wxColour);
wxColour col;
bool variantProcessed = true;
- if ( pCol )
+ if ( pVariant->GetType() == wxS("wxColour*") )
{
+ wxColour* pCol = wxStaticCast(pVariant->GetWxObjectPtr(), wxColour);
col = *pCol;
}
- else if ( pVariant->GetType() == wxT("wxArrayInt") )
+ else if ( pVariant->GetType() == wxS("wxColour") )
+ {
+ col << *pVariant;
+ }
+ else if ( pVariant->GetType() == wxArrayInt_VariantType )
{
+ // This code is mostly needed for wxPython bindings, which
+ // may offer tuple of integers as colour value.
wxArrayInt arr;
arr << *pVariant;
variantProcessed = false;
}
}
- else if ( pVariant->GetType() == wxT("wxColour") )
- {
- col << *pVariant;
- }
else
{
variantProcessed = false;
wxVariant wxSystemColourProperty::DoTranslateVal( wxColourPropertyValue& v ) const
{
- return wxColourPropertyValueToVariant(v);
+ wxVariant variant;
+ variant << v;
+ return variant;
}
int wxSystemColourProperty::ColToInd( const wxColour& colour ) const
void wxSystemColourProperty::OnSetValue()
{
// Convert from generic wxobject ptr to wxPGVariantDataColour
- if ( wxPGIsVariantType(m_value, wxobject) )
+ if ( m_value.GetType() == wxS("wxColour*") )
{
- wxASSERT( m_value.IsValueKindOf(CLASSINFO(wxColour)) );
- wxColour* pCol = (wxColour*) m_value.GetWxObjectPtr();
+ wxColour* pCol = wxStaticCast(m_value.GetWxObjectPtr(), wxColour);
m_value << *pCol;
}
m_value = TranslateVal(val);
}
- wxColourPropertyValue* pCpv = &wxColourPropertyValueFromVariant(m_value);
- wxColour col;
- if ( pCpv )
- col = pCpv->m_colour;
- else
- col << m_value;
+ int ind;
- if ( !col.Ok() )
+ if ( m_value.GetType() == wxS("wxColourPropertyValue") )
{
- SetValueToUnspecified();
- SetIndex(wxNOT_FOUND);
- return;
- }
+ wxColourPropertyValue cpv;
+ cpv << m_value;
+ wxColour col = cpv.m_colour;
- int ind;
+ if ( !col.Ok() )
+ {
+ SetValueToUnspecified();
+ SetIndex(wxNOT_FOUND);
+ return;
+ }
- if ( pCpv )
- {
- if ( pCpv->m_type < wxPG_COLOUR_WEB_BASE )
+ if ( cpv.m_type < wxPG_COLOUR_WEB_BASE )
{
if ( m_choices.HasValues() )
- ind = GetIndexForValue(pCpv->m_type);
+ ind = GetIndexForValue(cpv.m_type);
else
ind = ColToInd(col);
}
else
{
- pCpv->m_type = wxPG_COLOUR_CUSTOM;
+ cpv.m_type = wxPG_COLOUR_CUSTOM;
ind = GetCustomColourIndex();
}
}
else
{
+ wxColour col;
+ col << m_value;
+
+ if ( !col.Ok() )
+ {
+ SetValueToUnspecified();
+ SetIndex(wxNOT_FOUND);
+ return;
+ }
+
ind = ColToInd(col);
if ( ind == wxNOT_FOUND )
bool wxSystemColourProperty::QueryColourFromUser( wxVariant& variant ) const
{
- wxASSERT( m_value.GetType() != wxT("string") );
+ wxASSERT( m_value.GetType() != wxPG_VARIANT_TYPE_STRING );
bool res = false;
wxPropertyGrid* propgrid = GetGrid();
wxPG_COLOUR(0,0,0)
};
-WX_PG_IMPLEMENT_CUSTOM_COLOUR_PROPERTY_USES_WXCOLOUR2(wxColourProperty,
- gs_cp_es_normcolour_labels,
- (const long*)NULL,
- gs_cp_es_normcolour_colours,
- TextCtrlAndButton)
+WX_PG_IMPLEMENT_PROPERTY_CLASS(wxColourProperty, wxSystemColourProperty,
+ wxColour, const wxColour&, TextCtrlAndButton)
+
+static wxPGChoices gs_wxColourProperty_choicesCache;
+
+wxColourProperty::wxColourProperty( const wxString& label,
+ const wxString& name,
+ const wxColour& value )
+ : wxSystemColourProperty(label, name, gs_cp_es_normcolour_labels,
+ NULL,
+ &gs_wxColourProperty_choicesCache, value )
+{
+ Init( value );
+
+ m_flags |= wxPG_PROP_TRANSLATE_CUSTOM;
+}
+
+wxColourProperty::~wxColourProperty()
+{
+}
+
+void wxColourProperty::Init( wxColour colour )
+{
+ if ( !colour.Ok() )
+ colour = *wxWHITE;
+ wxVariant variant;
+ variant << colour;
+ m_value = variant;
+ int ind = ColToInd(colour);
+ if ( ind < 0 )
+ ind = m_choices.GetCount() - 1;
+ SetIndex( ind );
+}
+
+wxString wxColourProperty::GetValueAsString( int argFlags ) const
+{
+ const wxPGEditor* editor = GetEditorClass();
+ if ( editor != wxPGEditor_Choice &&
+ editor != wxPGEditor_ChoiceAndButton &&
+ editor != wxPGEditor_ComboBox )
+ argFlags |= wxPG_PROPERTY_SPECIFIC;
+
+ return wxSystemColourProperty::GetValueAsString(argFlags);
+}
+
+wxColour wxColourProperty::GetColour( int index ) const
+{
+ if ( !m_choices.HasValue(index) )
+ {
+ wxASSERT( index < (int)GetItemCount() );
+ return gs_cp_es_normcolour_colours[index];
+ }
+ return gs_cp_es_normcolour_colours[m_choices.GetValue(index)];
+}
+
+wxVariant wxColourProperty::DoTranslateVal( wxColourPropertyValue& v ) const
+{
+ wxVariant variant;
+ variant << v.m_colour;
+ return variant;
+}
// -----------------------------------------------------------------------
// wxCursorProperty
if ( paintdata.m_choiceItem < NUM_CURSORS )
{
- int cursorindex = gs_cp_es_syscursors_values[paintdata.m_choiceItem];
+ wxStockCursor cursorIndex =
+ (wxStockCursor) gs_cp_es_syscursors_values[paintdata.m_choiceItem];
{
- if ( cursorindex == wxCURSOR_NONE )
- cursorindex = wxCURSOR_ARROW;
+ if ( cursorIndex == wxCURSOR_NONE )
+ cursorIndex = wxCURSOR_ARROW;
- wxCursor cursor( cursorindex );
+ wxCursor cursor( cursorIndex );
#ifdef __WXMSW__
HDC hDc = (HDC)((const wxMSWDCImpl *)dc.GetImpl())->GetHDC();
return wxPGGlobalVars->m_pDefaultImageWildcard;
}
-WX_PG_IMPLEMENT_DERIVED_PROPERTY_CLASS(wxImageFileProperty,
- wxFileProperty,
- const wxString&)
+IMPLEMENT_DYNAMIC_CLASS(wxImageFileProperty, wxFileProperty)
wxImageFileProperty::wxImageFileProperty( const wxString& label, const wxString& name,
const wxString& value )
#if wxUSE_CHOICEDLG
-#include <wx/choicdlg.h>
+#include "wx/choicdlg.h"
WX_PG_IMPLEMENT_PROPERTY_CLASS(wxMultiChoiceProperty,wxPGProperty,
wxArrayInt,const wxArrayInt&,TextCtrlAndButton)
{
wxArrayString strings;
- if ( wxPGIsVariantType(m_value, arrstring) )
+ if ( m_value.GetType() == wxPG_VARIANT_TYPE_ARRSTRING )
strings = m_value.GetArrayString();
wxString& tempStr = m_display;
wxArrayInt wxMultiChoiceProperty::GetValueAsIndices() const
{
- const wxArrayInt& valueArr = wxArrayIntFromVariant(GetValue());
+ const wxArrayInt& valueArr = wxArrayIntRefFromVariant(GetValue());
unsigned int i;
// Translate values to string indices.
return false;
}
-int wxMultiChoiceProperty::GetChoiceInfo( wxPGChoiceInfo* choiceinfo )
-{
- if ( choiceinfo )
- choiceinfo->m_choices = &m_choices;
- return -1;
-}
-
bool wxMultiChoiceProperty::StringToValue( wxVariant& variant, const wxString& text, int ) const
{
wxArrayString arr;
void wxPropertyGridInterface::RegisterAdditionalEditors()
{
+ // Register editor classes, if necessary.
+ if ( wxPGGlobalVars->m_mapEditorClasses.empty() )
+ wxPropertyGrid::RegisterDefaultEditors();
+
#if wxUSE_SPINBTN
wxPGRegisterEditorClass(SpinCtrl);
#endif
// -----------------------------------------------------------------------
-#endif // wxPG_INCLUDE_ADVPROPS
+#endif // wxPG_INCLUDE_ADVPROPS
+
+#endif // wxUSE_PROPGRID
+