]> git.saurik.com Git - wxWidgets.git/blobdiff - src/propgrid/advprops.cpp
Make keyboard input to controls in a wxPopupWindow work in at least some cases, embed...
[wxWidgets.git] / src / propgrid / advprops.cpp
index 82578fd24278bc6467d82aad001d013f115e2da9..0a47883b32bdd6d31afac29464fb01ae3253d7f0 100644 (file)
@@ -4,7 +4,7 @@
 // Author:      Jaakko Salli
 // Modified by:
 // Created:     2004-09-25
-// RCS-ID:      $Id:
+// RCS-ID:      $Id$
 // Copyright:   (c) Jaakko Salli
 // Licence:     wxWindows license
 /////////////////////////////////////////////////////////////////////////////
@@ -16,6 +16,8 @@
     #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
 
-#include <typeinfo>
-
 // -----------------------------------------------------------------------
 
 #if defined(__WXMSW__)
@@ -142,15 +142,13 @@ wxPGWindowList wxPGSpinCtrlEditor::CreateControls( wxPropertyGrid* propgrid, wxP
     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);
@@ -158,6 +156,10 @@ wxPGWindowList wxPGSpinCtrlEditor::CreateControls( wxPropertyGrid* propgrid, wxP
     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);
 }
 
@@ -279,8 +281,8 @@ bool wxPGSpinCtrlEditor::OnEvent( wxPropertyGrid* propgrid, wxPGProperty* proper
 #if wxUSE_DATEPICKCTRL
 
 
-#include <wx/datectrl.h>
-#include <wx/dateevt.h>
+#include "wx/datectrl.h"
+#include "wx/dateevt.h"
 
 class wxPGDatePickerCtrlEditor : public wxPGEditor
 {
@@ -335,9 +337,9 @@ wxPGWindowList wxPGDatePickerCtrlEditor::CreateControls( wxPropertyGrid* propgri
     // 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();
@@ -393,8 +395,8 @@ void wxPGDatePickerCtrlEditor::SetValueToUnspecified( wxPGProperty* WXUNUSED(pro
 // 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"),
@@ -446,7 +448,7 @@ wxFontProperty::wxFontProperty( const wxString& label, const wxString& name,
                                 const wxFont& value )
     : wxPGProperty(label,name)
 {
-    SetValue( wxFontToVariant(value) );
+    SetValue(WXVARIANT(value));
 
     // Initialize font family choices list
     if ( !wxPGGlobalVars->m_fontFamilyChoices )
@@ -467,7 +469,8 @@ wxFontProperty::wxFontProperty( const wxString& label, const wxString& name,
 
     wxString emptyString(wxEmptyString);
 
-    wxFont& font = wxFontFromVariant(m_value);
+    wxFont font;
+    font << m_value;
 
     AddChild( new wxIntProperty( _("Point Size"), wxS("Point Size"),(long)font.GetPointSize() ) );
 
@@ -502,16 +505,14 @@ wxFontProperty::~wxFontProperty() { }
 
 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
@@ -528,7 +529,9 @@ bool wxFontProperty::OnEvent( wxPropertyGrid* propgrid, wxWindow* WXUNUSED(prima
         PrepareValueForDialogEditing(propgrid);
 
         wxFontData data;
-        data.SetInitialFont( wxFontFromVariant(m_value) );
+        wxFont font;
+        font << m_value;
+        data.SetInitialFont( font );
         data.SetColour(*wxBLACK);
 
         wxFontDialog dlg(propgrid, data);
@@ -536,7 +539,8 @@ bool wxFontProperty::OnEvent( wxPropertyGrid* propgrid, wxWindow* WXUNUSED(prima
         {
             propgrid->EditorsValueWasModified();
 
-            wxVariant variant = wxFontToVariant(dlg.GetFontData().GetChosenFont());
+            wxVariant variant;
+            variant << dlg.GetFontData().GetChosenFont();
             SetValueInEvent( variant );
             return true;
         }
@@ -547,7 +551,8 @@ bool wxFontProperty::OnEvent( wxPropertyGrid* propgrid, wxWindow* WXUNUSED(prima
 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 );
@@ -558,7 +563,8 @@ void wxFontProperty::RefreshChildren()
 
 void wxFontProperty::ChildChanged( wxVariant& thisValue, int ind, wxVariant& childValue ) const
 {
-    wxFont& font = wxFontFromVariant(thisValue);
+    wxFont font;
+    font << thisValue;
 
     if ( ind == 0 )
     {
@@ -604,6 +610,8 @@ void wxFontProperty::ChildChanged( wxVariant& thisValue, int ind, wxVariant& chi
     {
         font.SetUnderlined( childValue.GetBool() );
     }
+
+    thisValue << font;
 }
 
 /*
@@ -657,7 +665,7 @@ void wxFontProperty::OnCustomPaint(wxDC& dc,
 // 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[] = {
@@ -718,7 +726,7 @@ static long gs_cp_es_syscolour_values[] = {
 };
 
 
-WX_PG_IMPLEMENT_WXOBJECT_VARIANT_DATA(wxPGVariantDataColourPropertyValue, wxColourPropertyValue)
+IMPLEMENT_VARIANT_OBJECT_EXPORTED_SHALLOWCMP(wxColourPropertyValue, WXDLLIMPEXP_PROPGRID)
 
 
 // Class body is in advprops.h
@@ -738,7 +746,7 @@ void wxSystemColourProperty::Init( int type, const wxColour& colour )
 
     m_flags |= wxPG_PROP_STATIC_CHOICES; // Colour selection cannot be changed.
 
-    m_value = wxColourPropertyValueToVariant(cpv);
+    m_value << cpv;
 
     OnSetValue();
 }
@@ -797,20 +805,29 @@ wxColourPropertyValue wxSystemColourProperty::GetVal( const wxVariant* pVariant
     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;
 
@@ -832,10 +849,6 @@ wxColourPropertyValue wxSystemColourProperty::GetVal( const wxVariant* pVariant
             variantProcessed = false;
         }
     }
-    else if ( pVariant->GetType() == wxT("wxColour") )
-    {
-        col << *pVariant;
-    }
     else
     {
         variantProcessed = false;
@@ -855,7 +868,9 @@ wxColourPropertyValue wxSystemColourProperty::GetVal( const wxVariant* pVariant
 
 wxVariant wxSystemColourProperty::DoTranslateVal( wxColourPropertyValue& v ) const
 {
-    return wxColourPropertyValueToVariant(v);
+    wxVariant variant;
+    variant << v;
+    return variant;
 }
 
 int wxSystemColourProperty::ColToInd( const wxColour& colour ) const
@@ -889,10 +904,9 @@ static inline wxColour wxColourFromPGLong( long col )
 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;
     }
 
@@ -912,39 +926,46 @@ void wxSystemColourProperty::OnSetValue()
         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 )
@@ -1006,7 +1027,7 @@ int wxSystemColourProperty::GetCustomColourIndex() const
 
 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();
@@ -1451,13 +1472,14 @@ void wxCursorProperty::OnCustomPaint( wxDC& dc,
 
         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();
@@ -1530,9 +1552,7 @@ const wxString& wxPGGetDefaultImageWildcard()
     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 )
@@ -1615,7 +1635,7 @@ void wxImageFileProperty::OnCustomPaint( wxDC& dc,
 
 #if wxUSE_CHOICEDLG
 
-#include <wx/choicdlg.h>
+#include "wx/choicdlg.h"
 
 WX_PG_IMPLEMENT_PROPERTY_CLASS(wxMultiChoiceProperty,wxPGProperty,
                                wxArrayInt,const wxArrayInt&,TextCtrlAndButton)
@@ -1668,7 +1688,7 @@ void wxMultiChoiceProperty::GenerateValueAsString()
 {
     wxArrayString strings;
 
-    if ( wxPGIsVariantType(m_value, arrstring) )
+    if ( m_value.GetType() == wxPG_VARIANT_TYPE_ARRSTRING )
         strings = m_value.GetArrayString();
 
     wxString& tempStr = m_display;
@@ -1691,7 +1711,7 @@ void wxMultiChoiceProperty::GenerateValueAsString()
 
 wxArrayInt wxMultiChoiceProperty::GetValueAsIndices() const
 {
-    const wxArrayInt& valueArr = wxArrayIntFromVariant(GetValue());
+    const wxArrayInt& valueArr = wxArrayIntRefFromVariant(GetValue());
     unsigned int i;
 
     // Translate values to string indices.
@@ -1787,13 +1807,6 @@ bool wxMultiChoiceProperty::OnEvent( wxPropertyGrid* propgrid,
     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;
@@ -1982,6 +1995,10 @@ void wxPropertyGridInterface::InitAllTypeHandlers()
 
 void wxPropertyGridInterface::RegisterAdditionalEditors()
 {
+    // Register editor classes, if necessary.
+    if ( wxPGGlobalVars->m_mapEditorClasses.empty() )
+        wxPropertyGrid::RegisterDefaultEditors();
+
 #if wxUSE_SPINBTN
     wxPGRegisterEditorClass(SpinCtrl);
 #endif
@@ -1992,4 +2009,7 @@ void wxPropertyGridInterface::RegisterAdditionalEditors()
 
 // -----------------------------------------------------------------------
 
-#endif // wxPG_INCLUDE_ADVPROPS
+#endif  // wxPG_INCLUDE_ADVPROPS
+
+#endif  // wxUSE_PROPGRID
+