]> git.saurik.com Git - wxWidgets.git/blobdiff - src/generic/proplist.cpp
don't crash trying to dereference NULL m_selection (happens when showing a grid witho...
[wxWidgets.git] / src / generic / proplist.cpp
index c5e69cac4a60da380d2dc7be4ffacbd80f2d479b..a9e3b83c39ecbe170c1303b9a63d63dba844962a 100644 (file)
@@ -28,6 +28,8 @@
     #pragma hdrstop
 #endif
 
     #pragma hdrstop
 #endif
 
+#if wxUSE_PROPSHEET
+
 #ifndef WX_PRECOMP
     #include "wx/window.h"
     #include "wx/font.h"
 #ifndef WX_PRECOMP
     #include "wx/window.h"
     #include "wx/font.h"
@@ -43,6 +45,7 @@
 #include "wx/sizer.h"
 #include "wx/module.h"
 #include "wx/intl.h"
 #include "wx/sizer.h"
 #include "wx/module.h"
 #include "wx/intl.h"
+#include "wx/artprov.h"
 
 #include "wx/colordlg.h"
 #include "wx/proplist.h"
 
 #include "wx/colordlg.h"
 #include "wx/proplist.h"
 #include <math.h>
 #include <string.h>
 
 #include <math.h>
 #include <string.h>
 
-// ----------------------------------------------------------------------------
-// XPMs
-// ----------------------------------------------------------------------------
-
-#ifndef __WXMSW__
-    #include "wx/generic/cross.xpm"
-    #include "wx/generic/tick.xpm"
-#endif
-
-// ----------------------------------------------------------------------------
-// accessor functions for the bitmaps (may return NULL, check for it!)
-// ----------------------------------------------------------------------------
-
-static wxBitmap *GetTickBitmap();
-static wxBitmap *GetCrossBitmap();
-
 // ----------------------------------------------------------------------------
 // Property text edit control
 // ----------------------------------------------------------------------------
 
 // ----------------------------------------------------------------------------
 // Property text edit control
 // ----------------------------------------------------------------------------
 
-IMPLEMENT_CLASS(wxPropertyTextEdit, wxTextCtrl)
+IMPLEMENT_DYNAMIC_CLASS(wxPropertyTextEdit, wxTextCtrl)
 
 wxPropertyTextEdit::wxPropertyTextEdit(wxPropertyListView *v, wxWindow *parent,
     const wxWindowID id, const wxString& value,
 
 wxPropertyTextEdit::wxPropertyTextEdit(wxPropertyListView *v, wxWindow *parent,
     const wxWindowID id, const wxString& value,
@@ -162,7 +149,7 @@ bool wxPropertyListView::UpdatePropertyList(bool clearEditArea)
   if (clearEditArea)
   {
     m_valueList->Clear();
   if (clearEditArea)
   {
     m_valueList->Clear();
-    m_valueText->SetValue("");
+    m_valueText->SetValue(_T(""));
   }
   wxNode *node = m_propertySheet->GetProperties().First();
 
   }
   wxNode *node = m_propertySheet->GetProperties().First();
 
@@ -215,7 +202,7 @@ bool wxPropertyListView::UpdatePropertyDisplayInList(wxProperty *property)
 // Find the wxListBox index corresponding to this property
 int wxPropertyListView::FindListIndexForProperty(wxProperty *property)
 {
 // Find the wxListBox index corresponding to this property
 int wxPropertyListView::FindListIndexForProperty(wxProperty *property)
 {
-  int n = m_propertyScrollingList->Number();
+  int n = m_propertyScrollingList->GetCount();
   for (int i = 0; i < n; i++)
   {
     if (property == (wxProperty *)m_propertyScrollingList->wxListBox::GetClientData(i))
   for (int i = 0; i < n; i++)
   {
     if (property == (wxProperty *)m_propertyScrollingList->wxListBox::GetClientData(i))
@@ -254,7 +241,7 @@ bool wxPropertyListView::ShowProperty(wxProperty *property, bool select)
   }
 
   m_valueList->Clear();
   }
 
   m_valueList->Clear();
-  m_valueText->SetValue("");
+  m_valueText->SetValue(_T(""));
 
   if (property)
   {
 
   if (property)
   {
@@ -420,7 +407,7 @@ bool wxPropertyListView::CreateControls()
 {
     wxPanel *panel = (wxPanel *)m_propertyWindow;
 
 {
     wxPanel *panel = (wxPanel *)m_propertyWindow;
 
-    wxSize largeButtonSize( 60, 25 );
+    wxSize largeButtonSize( 70, 25 );
     wxSize smallButtonSize( 23, 23 );
 
     if (m_valueText)
     wxSize smallButtonSize( 23, 23 );
 
     if (m_valueText)
@@ -429,11 +416,12 @@ bool wxPropertyListView::CreateControls()
     if (!panel)
         return FALSE;
 
     if (!panel)
         return FALSE;
 
-    wxSystemSettings settings;
-    wxFont guiFont = settings.GetSystemFont(wxSYS_DEFAULT_GUI_FONT);
+    wxFont guiFont = wxSystemSettings::GetSystemFont(wxSYS_DEFAULT_GUI_FONT);
 
 #ifdef __WXMSW__
 
 #ifdef __WXMSW__
-    wxFont *boringFont = wxTheFontList->FindOrCreateFont(guiFont.GetPointSize(), wxMODERN, wxNORMAL, wxNORMAL, FALSE, "Courier New");
+    wxFont *boringFont =
+        wxTheFontList->FindOrCreateFont(guiFont.GetPointSize(), wxMODERN,
+                                        wxNORMAL, wxNORMAL, FALSE, _T("Courier New"));
 #else
     wxFont *boringFont = wxTheFontList->FindOrCreateFont(guiFont.GetPointSize(), wxTELETYPE, wxNORMAL, wxNORMAL);
 #endif
 #else
     wxFont *boringFont = wxTheFontList->FindOrCreateFont(guiFont.GetPointSize(), wxTELETYPE, wxNORMAL, wxNORMAL);
 #endif
@@ -451,32 +439,32 @@ bool wxPropertyListView::CreateControls()
 
     if (m_buttonFlags & wxPROP_BUTTON_CHECK_CROSS)
     {
 
     if (m_buttonFlags & wxPROP_BUTTON_CHECK_CROSS)
     {
-        wxBitmap *tickBitmap = GetTickBitmap();
-        wxBitmap *crossBitmap = GetCrossBitmap();
+        wxBitmap tickBitmap = wxArtProvider::GetBitmap(wxART_TICK_MARK);
+        wxBitmap crossBitmap = wxArtProvider::GetBitmap(wxART_CROSS_MARK);
 
 
-        if ( tickBitmap && crossBitmap )
+        if ( tickBitmap.Ok() && crossBitmap.Ok() )
         {
         {
-            m_confirmButton = new wxBitmapButton(panel, wxID_PROP_CHECK, *tickBitmap, wxPoint(-1, -1), smallButtonSize );
-            m_cancelButton = new wxBitmapButton(panel, wxID_PROP_CROSS, *crossBitmap, wxPoint(-1, -1), smallButtonSize );
+            m_confirmButton = new wxBitmapButton(panel, wxID_PROP_CHECK, tickBitmap, wxPoint(-1, -1), smallButtonSize );
+            m_cancelButton = new wxBitmapButton(panel, wxID_PROP_CROSS, crossBitmap, wxPoint(-1, -1), smallButtonSize );
         }
         else
         {
         }
         else
         {
-            m_confirmButton = new wxButton(panel, wxID_PROP_CHECK, ":-)", wxPoint(-1, -1), smallButtonSize );
-            m_cancelButton = new wxButton(panel, wxID_PROP_CROSS, "X", wxPoint(-1, -1), smallButtonSize );
+            m_confirmButton = new wxButton(panel, wxID_PROP_CHECK, _T(":-)"), wxPoint(-1, -1), smallButtonSize );
+            m_cancelButton = new wxButton(panel, wxID_PROP_CROSS, _T("X"), wxPoint(-1, -1), smallButtonSize );
         }
 
         topsizer->Add( m_confirmButton, 0, wxLEFT|wxTOP|wxBOTTOM | wxEXPAND, buttonborder );
         topsizer->Add( m_cancelButton, 0, wxLEFT|wxTOP|wxBOTTOM | wxEXPAND, buttonborder );
     }
 
         }
 
         topsizer->Add( m_confirmButton, 0, wxLEFT|wxTOP|wxBOTTOM | wxEXPAND, buttonborder );
         topsizer->Add( m_cancelButton, 0, wxLEFT|wxTOP|wxBOTTOM | wxEXPAND, buttonborder );
     }
 
-    m_valueText = new wxPropertyTextEdit(this, panel, wxID_PROP_TEXT, "",
+    m_valueText = new wxPropertyTextEdit(this, panel, wxID_PROP_TEXT, _T(""),
        wxPoint(-1, -1), wxSize(-1, smallButtonSize.y), wxPROCESS_ENTER);
     m_valueText->Enable(FALSE);
     topsizer->Add( m_valueText, 1, wxALL | wxEXPAND, buttonborder );
 
     if (m_buttonFlags & wxPROP_PULLDOWN)
     {
        wxPoint(-1, -1), wxSize(-1, smallButtonSize.y), wxPROCESS_ENTER);
     m_valueText->Enable(FALSE);
     topsizer->Add( m_valueText, 1, wxALL | wxEXPAND, buttonborder );
 
     if (m_buttonFlags & wxPROP_PULLDOWN)
     {
-        m_editButton = new wxButton(panel, wxID_PROP_EDIT, "...",  wxPoint(-1, -1), smallButtonSize);
+        m_editButton = new wxButton(panel, wxID_PROP_EDIT, _T("..."),  wxPoint(-1, -1), smallButtonSize);
         m_editButton->Enable(FALSE);
         topsizer->Add( m_editButton, 0, wxRIGHT|wxTOP|wxBOTTOM | wxEXPAND, buttonborder );
     }
         m_editButton->Enable(FALSE);
         topsizer->Add( m_editButton, 0, wxRIGHT|wxTOP|wxBOTTOM | wxEXPAND, buttonborder );
     }
@@ -511,7 +499,7 @@ bool wxPropertyListView::CreateControls()
             m_windowCloseButton = new wxButton(panel, wxID_OK, _("OK"), wxPoint(-1, -1), largeButtonSize );
             m_windowCloseButton->SetDefault();
             m_windowCloseButton->SetFocus();
             m_windowCloseButton = new wxButton(panel, wxID_OK, _("OK"), wxPoint(-1, -1), largeButtonSize );
             m_windowCloseButton->SetDefault();
             m_windowCloseButton->SetFocus();
-            bottomsizer->Add( m_windowCloseButton, 0, wxLEFT|wxTOP|wxBOTTOM, buttonborder );
+            bottomsizer->Add( m_windowCloseButton, 0, wxALL, buttonborder );
         }
         else if (m_buttonFlags & wxPROP_BUTTON_CLOSE)
         {
         }
         else if (m_buttonFlags & wxPROP_BUTTON_CLOSE)
         {
@@ -529,7 +517,7 @@ bool wxPropertyListView::CreateControls()
             bottomsizer->Add( m_windowHelpButton, 0, wxALL, buttonborder );
         }
 
             bottomsizer->Add( m_windowHelpButton, 0, wxALL, buttonborder );
         }
 
-        mainsizer->Add( bottomsizer, 1, wxALIGN_RIGHT | wxEXPAND );
+        mainsizer->Add( bottomsizer, 0, wxALIGN_RIGHT | wxEXPAND );
     }
 
     panel->SetSizer( mainsizer );
     }
 
     panel->SetSizer( mainsizer );
@@ -601,6 +589,7 @@ void wxPropertyListView::OnOk(wxCommandEvent& event)
   OnCheck(event);
 
   m_managedWindow->Close(TRUE);
   OnCheck(event);
 
   m_managedWindow->Close(TRUE);
+  sm_dialogCancelled = FALSE;
 }
 
 void wxPropertyListView::OnCancel(wxCommandEvent& WXUNUSED(event))
 }
 
 void wxPropertyListView::OnCancel(wxCommandEvent& WXUNUSED(event))
@@ -675,7 +664,7 @@ void wxPropertyListView::OnText(wxCommandEvent& event)
 // Property dialog box
 // ----------------------------------------------------------------------------
 
 // Property dialog box
 // ----------------------------------------------------------------------------
 
-IMPLEMENT_CLASS(wxPropertyListDialog, wxDialog)
+IMPLEMENT_DYNAMIC_CLASS(wxPropertyListDialog, wxDialog)
 
 BEGIN_EVENT_TABLE(wxPropertyListDialog, wxDialog)
     EVT_BUTTON(wxID_CANCEL,                wxPropertyListDialog::OnCancel)
 
 BEGIN_EVENT_TABLE(wxPropertyListDialog, wxDialog)
     EVT_BUTTON(wxID_CANCEL,                wxPropertyListDialog::OnCancel)
@@ -735,7 +724,7 @@ bool wxPropertyListDialog::ProcessEvent(wxEvent& event)
 // Property panel
 // ----------------------------------------------------------------------------
 
 // Property panel
 // ----------------------------------------------------------------------------
 
-IMPLEMENT_CLASS(wxPropertyListPanel, wxPanel)
+IMPLEMENT_DYNAMIC_CLASS(wxPropertyListPanel, wxPanel)
 
 BEGIN_EVENT_TABLE(wxPropertyListPanel, wxPanel)
     EVT_SIZE(wxPropertyListPanel::OnSize)
 
 BEGIN_EVENT_TABLE(wxPropertyListPanel, wxPanel)
     EVT_SIZE(wxPropertyListPanel::OnSize)
@@ -771,7 +760,7 @@ void wxPropertyListPanel::OnSize(wxSizeEvent& WXUNUSED(event))
 // Property frame
 // ----------------------------------------------------------------------------
 
 // Property frame
 // ----------------------------------------------------------------------------
 
-IMPLEMENT_CLASS(wxPropertyListFrame, wxFrame)
+IMPLEMENT_DYNAMIC_CLASS(wxPropertyListFrame, wxFrame)
 
 BEGIN_EVENT_TABLE(wxPropertyListFrame, wxFrame)
     EVT_CLOSE(wxPropertyListFrame::OnCloseWindow)
 
 BEGIN_EVENT_TABLE(wxPropertyListFrame, wxFrame)
     EVT_CLOSE(wxPropertyListFrame::OnCloseWindow)
@@ -830,7 +819,7 @@ bool wxPropertyListValidator::OnSelect(bool select, wxProperty *property, wxProp
 bool wxPropertyListValidator::OnValueListSelect(wxProperty *property, wxPropertyListView *view, wxWindow *WXUNUSED(parentWindow))
 {
   wxString s(view->GetValueList()->GetStringSelection());
 bool wxPropertyListValidator::OnValueListSelect(wxProperty *property, wxPropertyListView *view, wxWindow *WXUNUSED(parentWindow))
 {
   wxString s(view->GetValueList()->GetStringSelection());
-  if (s != T(""))
+  if (s != wxT(""))
   {
     view->GetValueText()->SetValue(s);
     view->RetrieveProperty(property);
   {
     view->GetValueText()->SetValue(s);
     view->RetrieveProperty(property);
@@ -898,8 +887,8 @@ bool wxRealListValidator::OnCheckValue(wxProperty *WXUNUSED(property), wxPropert
   if (!StringToFloat(WXSTRINGCAST value, &val))
   {
     wxChar buf[200];
   if (!StringToFloat(WXSTRINGCAST value, &val))
   {
     wxChar buf[200];
-    wxSprintf(buf, T("Value %s is not a valid real number!"), value.GetData());
-    wxMessageBox(buf, T("Property value error"), wxOK | wxICON_EXCLAMATION, parentWindow);
+    wxSprintf(buf, wxT("Value %s is not a valid real number!"), value.GetData());
+    wxMessageBox(buf, wxT("Property value error"), wxOK | wxICON_EXCLAMATION, parentWindow);
     return FALSE;
   }
 
     return FALSE;
   }
 
@@ -961,15 +950,15 @@ bool wxIntegerListValidator::OnCheckValue(wxProperty *WXUNUSED(property), wxProp
   if (!StringToLong(WXSTRINGCAST value, &val))
   {
     wxChar buf[200];
   if (!StringToLong(WXSTRINGCAST value, &val))
   {
     wxChar buf[200];
-    wxSprintf(buf, T("Value %s is not a valid integer!"), value.GetData());
-    wxMessageBox(buf, T("Property value error"), wxOK | wxICON_EXCLAMATION, parentWindow);
+    wxSprintf(buf, wxT("Value %s is not a valid integer!"), value.GetData());
+    wxMessageBox(buf, wxT("Property value error"), wxOK | wxICON_EXCLAMATION, parentWindow);
     return FALSE;
   }
   if (val < m_integerMin || val > m_integerMax)
   {
     wxChar buf[200];
     return FALSE;
   }
   if (val < m_integerMin || val > m_integerMax)
   {
     wxChar buf[200];
-    wxSprintf(buf, T("Value must be an integer between %ld and %ld!"), m_integerMin, m_integerMax);
-    wxMessageBox(buf, T("Property value error"), wxOK | wxICON_EXCLAMATION, parentWindow);
+    wxSprintf(buf, wxT("Value must be an integer between %ld and %ld!"), m_integerMin, m_integerMax);
+    wxMessageBox(buf, wxT("Property value error"), wxOK | wxICON_EXCLAMATION, parentWindow);
     return FALSE;
   }
   return TRUE;
     return FALSE;
   }
   return TRUE;
@@ -1015,9 +1004,9 @@ bool wxBoolListValidator::OnCheckValue(wxProperty *WXUNUSED(property), wxPropert
   if (!view->GetValueText())
     return FALSE;
   wxString value(view->GetValueText()->GetValue());
   if (!view->GetValueText())
     return FALSE;
   wxString value(view->GetValueText()->GetValue());
-  if (value != T("True") && value != T("False"))
+  if (value != wxT("True") && value != wxT("False"))
   {
   {
-    wxMessageBox(T("Value must be True or False!"), T("Property value error"), wxOK | wxICON_EXCLAMATION, parentWindow);
+    wxMessageBox(wxT("Value must be True or False!"), wxT("Property value error"), wxOK | wxICON_EXCLAMATION, parentWindow);
     return FALSE;
   }
   return TRUE;
     return FALSE;
   }
   return TRUE;
@@ -1036,7 +1025,7 @@ bool wxBoolListValidator::OnRetrieveValue(wxProperty *property, wxPropertyListVi
 
   wxString value(view->GetValueText()->GetValue());
   bool boolValue = FALSE;
 
   wxString value(view->GetValueText()->GetValue());
   bool boolValue = FALSE;
-  if (value == T("True"))
+  if (value == wxT("True"))
     boolValue = TRUE;
   else
     boolValue = FALSE;
     boolValue = TRUE;
   else
     boolValue = FALSE;
@@ -1079,8 +1068,8 @@ bool wxBoolListValidator::OnPrepareDetailControls(wxProperty *WXUNUSED(property)
     view->ShowListBoxControl(TRUE);
     view->GetValueList()->Enable(TRUE);
 
     view->ShowListBoxControl(TRUE);
     view->GetValueList()->Enable(TRUE);
 
-    view->GetValueList()->Append(T("True"));
-    view->GetValueList()->Append(T("False"));
+    view->GetValueList()->Append(wxT("True"));
+    view->GetValueList()->Append(wxT("False"));
     wxChar *currentString = copystring(view->GetValueText()->GetValue());
     view->GetValueList()->SetStringSelection(currentString);
     delete[] currentString;
     wxChar *currentString = copystring(view->GetValueText()->GetValue());
     view->GetValueList()->SetStringSelection(currentString);
     delete[] currentString;
@@ -1170,7 +1159,7 @@ bool wxStringListValidator::OnDisplayValue(wxProperty *property, wxPropertyListV
     return FALSE;
   wxString str(property->GetValue().GetStringRepresentation());
   view->GetValueText()->SetValue(str);
     return FALSE;
   wxString str(property->GetValue().GetStringRepresentation());
   view->GetValueText()->SetValue(str);
-  if (m_strings && view->GetValueList() && view->GetValueList()->IsShown() && view->GetValueList()->Number() > 0)
+  if (m_strings && view->GetValueList() && view->GetValueList()->IsShown() && view->GetValueList()->GetCount() > 0)
   {
     view->GetValueList()->SetStringSelection(str);
   }
   {
     view->GetValueList()->SetStringSelection(str);
   }
@@ -1353,7 +1342,7 @@ void wxFilenameListValidator::OnEdit(wxProperty *property, wxPropertyListView *v
      m_filenameWildCard.GetData(),
      0,
      parentWindow);
      m_filenameWildCard.GetData(),
      0,
      parentWindow);
-  if (s != T(""))
+  if (s != wxT(""))
   {
     property->GetValue() = s;
     view->DisplayProperty(property);
   {
     property->GetValue() = s;
     view->DisplayProperty(property);
@@ -1546,7 +1535,7 @@ void wxListOfStringsListValidator::OnEdit(wxProperty *property, wxPropertyListVi
     expr = expr->GetNext();
   }
 
     expr = expr->GetNext();
   }
 
-  wxString title(T("Editing "));
+  wxString title(wxT("Editing "));
   title += property->GetName();
 
   if (EditStringList(parentWindow, stringList, title.GetData()))
   title += property->GetName();
 
   if (EditStringList(parentWindow, stringList, title.GetData()))
@@ -1759,14 +1748,14 @@ void wxPropertyStringListEditorDialog::OnDelete(wxCommandEvent& WXUNUSED(event))
   delete[] (wxChar *)node->Data();
   delete node;
   m_currentSelection = -1;
   delete[] (wxChar *)node->Data();
   delete node;
   m_currentSelection = -1;
-  m_stringText->SetValue("");
+  m_stringText->SetValue(_T(""));
 }
 
 void wxPropertyStringListEditorDialog::OnAdd(wxCommandEvent& WXUNUSED(event))
 {
   SaveCurrentSelection();
 
 }
 
 void wxPropertyStringListEditorDialog::OnAdd(wxCommandEvent& WXUNUSED(event))
 {
   SaveCurrentSelection();
 
-  wxChar *initialText = T("");
+  wxString initialText;
   wxNode *node = m_stringList->Add(initialText);
   m_listBox->Append(initialText, (void *)node);
   m_currentSelection = m_stringList->Number() - 1;
   wxNode *node = m_stringList->Add(initialText);
   m_listBox->Append(initialText, (void *)node);
   m_currentSelection = m_stringList->Number() - 1;
@@ -1828,7 +1817,7 @@ void wxPropertyStringListEditorDialog::ShowCurrentSelection()
 {
   if (m_currentSelection == -1)
   {
 {
   if (m_currentSelection == -1)
   {
-    m_stringText->SetValue("");
+    m_stringText->SetValue(_T(""));
     return;
   }
   wxNode *node = (wxNode *)m_listBox->wxListBox::GetClientData(m_currentSelection);
     return;
   }
   wxNode *node = (wxNode *)m_listBox->wxListBox::GetClientData(m_currentSelection);
@@ -1837,46 +1826,5 @@ void wxPropertyStringListEditorDialog::ShowCurrentSelection()
   m_stringText->Enable(TRUE);
 }
 
   m_stringText->Enable(TRUE);
 }
 
-// ----------------------------------------------------------------------------
-// global functions
-// ----------------------------------------------------------------------------
-
-// FIXME MT-UNSAFE
-static wxBitmap *GetTickBitmap()
-{
-    static wxBitmap* s_tickBitmap = (wxBitmap *) NULL;
-    static bool s_loaded = FALSE;
-
-    if ( !s_loaded )
-    {
-        s_loaded = TRUE; // set it to TRUE anyhow, we won't try again
-
-        #if defined(__WXMSW__) || defined(__WXOS2__)
-            s_tickBitmap = new wxBitmap("tick_bmp", wxBITMAP_TYPE_RESOURCE);
-        #else
-            s_tickBitmap = new wxBitmap( tick_xpm );
-        #endif
-    }
-
-    return s_tickBitmap;
-}
-
-static wxBitmap *GetCrossBitmap()
-{
-    static wxBitmap* s_crossBitmap = (wxBitmap *) NULL;
-    static bool s_loaded = FALSE;
-
-    if ( !s_loaded )
-    {
-        s_loaded = TRUE; // set it to TRUE anyhow, we won't try again
-
-        #if defined(__WXMSW__) || defined(__WXOS2__)
-            s_crossBitmap =  new wxBitmap("cross_bmp", wxBITMAP_TYPE_RESOURCE);
-        #else // XPMs
-            s_crossBitmap =  new wxBitmap( cross_xpm );
-        #endif // BMPs/XPMs
-    }
-
-    return s_crossBitmap;
-}
 
 
+#endif // wxUSE_PROPSHEET