1 /////////////////////////////////////////////////////////////////////////////
3 // Purpose: Property list classes
4 // Author: Julian Smart
8 // Copyright: (c) Julian Smart
9 // Licence: wxWindows licence
10 /////////////////////////////////////////////////////////////////////////////
12 // ============================================================================
14 // ============================================================================
16 // ----------------------------------------------------------------------------
18 // ----------------------------------------------------------------------------
21 #pragma implementation "proplist.h"
24 // For compilers that support precompilation, includes "wx/wx.h".
25 #include "wx/wxprec.h"
31 #include "wx/deprecated/setup.h"
36 #include "wx/window.h"
38 #include "wx/button.h"
39 #include "wx/bmpbuttn.h"
40 #include "wx/textctrl.h"
41 #include "wx/listbox.h"
42 #include "wx/settings.h"
43 #include "wx/msgdlg.h"
44 #include "wx/filedlg.h"
48 #include "wx/module.h"
50 #include "wx/artprov.h"
52 #include "wx/colordlg.h"
53 #include "wx/deprecated/proplist.h"
60 #if !WXWIN_COMPATIBILITY_2_4
61 static inline wxChar
* copystring(const wxChar
* s
)
62 { return wxStrcpy(new wxChar
[wxStrlen(s
) + 1], s
); }
65 // ----------------------------------------------------------------------------
66 // Property text edit control
67 // ----------------------------------------------------------------------------
69 IMPLEMENT_DYNAMIC_CLASS(wxPropertyTextEdit
, wxTextCtrl
)
71 wxPropertyTextEdit::wxPropertyTextEdit(wxPropertyListView
*v
, wxWindow
*parent
,
72 const wxWindowID id
, const wxString
& value
,
73 const wxPoint
& pos
, const wxSize
& size
,
74 long style
, const wxString
& name
):
75 wxTextCtrl(parent
, id
, value
, pos
, size
, style
, wxDefaultValidator
, name
)
80 void wxPropertyTextEdit::OnSetFocus()
84 void wxPropertyTextEdit::OnKillFocus()
88 // ----------------------------------------------------------------------------
90 // ----------------------------------------------------------------------------
92 bool wxPropertyListView::sm_dialogCancelled
= false;
94 IMPLEMENT_DYNAMIC_CLASS(wxPropertyListView
, wxPropertyView
)
96 BEGIN_EVENT_TABLE(wxPropertyListView
, wxPropertyView
)
97 EVT_BUTTON(wxID_OK
, wxPropertyListView::OnOk
)
98 EVT_BUTTON(wxID_CANCEL
, wxPropertyListView::OnCancel
)
99 EVT_BUTTON(wxID_HELP
, wxPropertyListView::OnHelp
)
100 EVT_BUTTON(wxID_PROP_CROSS
, wxPropertyListView::OnCross
)
101 EVT_BUTTON(wxID_PROP_CHECK
, wxPropertyListView::OnCheck
)
102 EVT_BUTTON(wxID_PROP_EDIT
, wxPropertyListView::OnEdit
)
103 EVT_TEXT_ENTER(wxID_PROP_TEXT
, wxPropertyListView::OnText
)
104 EVT_LISTBOX(wxID_PROP_SELECT
, wxPropertyListView::OnPropertySelect
)
105 EVT_COMMAND(wxID_PROP_SELECT
, wxEVT_COMMAND_LISTBOX_DOUBLECLICKED
,
106 wxPropertyListView::OnPropertyDoubleClick
)
107 EVT_LISTBOX(wxID_PROP_VALUE_SELECT
, wxPropertyListView::OnValueListSelect
)
110 wxPropertyListView::wxPropertyListView(wxPanel
*propPanel
, long flags
):wxPropertyView(flags
)
112 m_propertyScrollingList
= NULL
;
116 m_confirmButton
= NULL
;
117 m_cancelButton
= NULL
;
118 m_propertyWindow
= propPanel
;
119 m_managedWindow
= NULL
;
121 m_windowCloseButton
= NULL
;
122 m_windowCancelButton
= NULL
;
123 m_windowHelpButton
= NULL
;
125 m_detailedEditing
= false;
128 wxPropertyListView::~wxPropertyListView()
132 void wxPropertyListView::ShowView(wxPropertySheet
*ps
, wxPanel
*panel
)
134 m_propertySheet
= ps
;
136 AssociatePanel(panel
);
139 UpdatePropertyList();
143 // Update this view of the viewed object, called e.g. by
144 // the object itself.
145 bool wxPropertyListView::OnUpdateView()
150 bool wxPropertyListView::UpdatePropertyList(bool clearEditArea
)
152 if (!m_propertyScrollingList
|| !m_propertySheet
)
155 m_propertyScrollingList
->Clear();
158 m_valueList
->Clear();
159 m_valueText
->SetValue( wxT("") );
161 wxNode
*node
= m_propertySheet
->GetProperties().GetFirst();
163 // Should sort them... later...
166 wxProperty
*property
= (wxProperty
*)node
->GetData();
167 wxString
stringValueRepr(property
->GetValue().GetStringRepresentation());
168 wxString
paddedString(MakeNameValueString(property
->GetName(), stringValueRepr
));
169 m_propertyScrollingList
->Append(paddedString
.GetData(), (void *)property
);
170 node
= node
->GetNext();
175 bool wxPropertyListView::UpdatePropertyDisplayInList(wxProperty
*property
)
177 if (!m_propertyScrollingList
|| !m_propertySheet
)
181 int currentlySelected
= m_propertyScrollingList
->GetSelection();
184 wxString
stringValueRepr(property
->GetValue().GetStringRepresentation());
185 wxString
paddedString(MakeNameValueString(property
->GetName(), stringValueRepr
));
186 int sel
= FindListIndexForProperty(property
);
190 // Don't update the listbox unnecessarily because it can cause
193 if (paddedString
!= m_propertyScrollingList
->GetString(sel
))
194 m_propertyScrollingList
->SetString(sel
, paddedString
.GetData());
197 // UpdatePropertyList(false);
200 // TODO: why is this necessary?
202 if (currentlySelected
> -1)
203 m_propertyScrollingList
->SetSelection(currentlySelected
);
209 // Find the wxListBox index corresponding to this property
210 int wxPropertyListView::FindListIndexForProperty(wxProperty
*property
)
212 int n
= m_propertyScrollingList
->GetCount();
213 for (int i
= 0; i
< n
; i
++)
215 if (property
== (wxProperty
*)m_propertyScrollingList
->wxListBox::GetClientData(i
))
221 wxString
wxPropertyListView::MakeNameValueString(wxString name
, wxString value
)
223 wxString
theString(name
);
226 int padWith
= nameWidth
- theString
.Length();
230 if (GetFlags() & wxPROP_SHOWVALUES
)
232 // Want to pad with spaces
233 theString
.Append( wxT(' '), padWith
);
240 // Select and show string representation in validator the given
241 // property. NULL resets to show no property.
242 bool wxPropertyListView::ShowProperty(wxProperty
*property
, bool select
)
244 if (m_currentProperty
)
246 EndShowingProperty(m_currentProperty
);
247 m_currentProperty
= NULL
;
250 m_valueList
->Clear();
251 m_valueText
->SetValue( wxT("") );
255 m_currentProperty
= property
;
256 BeginShowingProperty(property
);
260 int sel
= FindListIndexForProperty(property
);
262 m_propertyScrollingList
->SetSelection(sel
);
267 // Find appropriate validator and load property into value controls
268 bool wxPropertyListView::BeginShowingProperty(wxProperty
*property
)
270 m_currentValidator
= FindPropertyValidator(property
);
271 if (!m_currentValidator
)
274 if (!m_currentValidator
->IsKindOf(CLASSINFO(wxPropertyListValidator
)))
277 wxPropertyListValidator
*listValidator
= (wxPropertyListValidator
*)m_currentValidator
;
279 listValidator
->OnPrepareControls(property
, this, m_propertyWindow
);
280 DisplayProperty(property
);
284 // Find appropriate validator and unload property from value controls
285 bool wxPropertyListView::EndShowingProperty(wxProperty
*property
)
287 if (!m_currentValidator
)
290 RetrieveProperty(property
);
292 if (!m_currentValidator
->IsKindOf(CLASSINFO(wxPropertyListValidator
)))
295 wxPropertyListValidator
*listValidator
= (wxPropertyListValidator
*)m_currentValidator
;
297 listValidator
->OnClearControls(property
, this, m_propertyWindow
);
298 if (m_detailedEditing
)
300 listValidator
->OnClearDetailControls(property
, this, m_propertyWindow
);
301 m_detailedEditing
= false;
306 void wxPropertyListView::BeginDetailedEditing()
308 if (!m_currentValidator
)
310 if (!m_currentProperty
)
312 if (m_detailedEditing
)
314 if (!m_currentValidator
->IsKindOf(CLASSINFO(wxPropertyListValidator
)))
316 if (!m_currentProperty
->IsEnabled())
319 wxPropertyListValidator
*listValidator
= (wxPropertyListValidator
*)m_currentValidator
;
321 if (listValidator
->OnPrepareDetailControls(m_currentProperty
, this, m_propertyWindow
))
322 m_detailedEditing
= true;
325 void wxPropertyListView::EndDetailedEditing()
327 if (!m_currentValidator
)
329 if (!m_currentProperty
)
332 RetrieveProperty(m_currentProperty
);
334 if (!m_currentValidator
->IsKindOf(CLASSINFO(wxPropertyListValidator
)))
337 wxPropertyListValidator
*listValidator
= (wxPropertyListValidator
*)m_currentValidator
;
339 if (m_detailedEditing
)
341 listValidator
->OnClearDetailControls(m_currentProperty
, this, m_propertyWindow
);
342 m_detailedEditing
= false;
346 bool wxPropertyListView::DisplayProperty(wxProperty
*property
)
348 if (!m_currentValidator
)
351 if (((m_currentValidator
->GetFlags() & wxPROP_ALLOW_TEXT_EDITING
) == 0) || !property
->IsEnabled())
352 m_valueText
->SetEditable(false);
354 m_valueText
->SetEditable(true);
356 if (!m_currentValidator
->IsKindOf(CLASSINFO(wxPropertyListValidator
)))
359 wxPropertyListValidator
*listValidator
= (wxPropertyListValidator
*)m_currentValidator
;
361 listValidator
->OnDisplayValue(property
, this, m_propertyWindow
);
365 bool wxPropertyListView::RetrieveProperty(wxProperty
*property
)
367 if (!m_currentValidator
)
369 if (!property
->IsEnabled())
372 if (!m_currentValidator
->IsKindOf(CLASSINFO(wxPropertyListValidator
)))
375 wxPropertyListValidator
*listValidator
= (wxPropertyListValidator
*)m_currentValidator
;
377 if (listValidator
->OnCheckValue(property
, this, m_propertyWindow
))
379 if (listValidator
->OnRetrieveValue(property
, this, m_propertyWindow
))
381 UpdatePropertyDisplayInList(property
);
382 OnPropertyChanged(property
);
387 // Revert to old value
388 listValidator
->OnDisplayValue(property
, this, m_propertyWindow
);
394 bool wxPropertyListView::EditProperty(wxProperty
*WXUNUSED(property
))
399 // Called by the listbox callback
400 void wxPropertyListView::OnPropertySelect(wxCommandEvent
& WXUNUSED(event
))
402 int sel
= m_propertyScrollingList
->GetSelection();
405 wxProperty
*newSel
= (wxProperty
*)m_propertyScrollingList
->wxListBox::GetClientData(sel
);
406 if (newSel
&& newSel
!= m_currentProperty
)
408 ShowProperty(newSel
, false);
413 bool wxPropertyListView::CreateControls()
415 wxPanel
*panel
= (wxPanel
*)m_propertyWindow
;
417 wxSize
largeButtonSize( 70, 25 );
418 wxSize
smallButtonSize( 23, 23 );
426 wxFont guiFont
= wxSystemSettings::GetSystemFont(wxSYS_DEFAULT_GUI_FONT
);
430 wxTheFontList
->FindOrCreateFont(guiFont
.GetPointSize(), wxMODERN
,
431 wxNORMAL
, wxNORMAL
, false, _T("Courier New"));
433 wxFont
*boringFont
= wxTheFontList
->FindOrCreateFont(guiFont
.GetPointSize(), wxTELETYPE
, wxNORMAL
, wxNORMAL
);
436 // May need to be changed in future to eliminate clashes with app.
437 // WHAT WAS THIS FOR?
438 // panel->SetClientData((char *)this);
440 wxBoxSizer
*mainsizer
= new wxBoxSizer( wxVERTICAL
);
442 // top row with optional buttons and input line
444 wxBoxSizer
*topsizer
= new wxBoxSizer( wxHORIZONTAL
);
445 int buttonborder
= 3;
447 if (m_buttonFlags
& wxPROP_BUTTON_CHECK_CROSS
)
449 wxBitmap tickBitmap
= wxArtProvider::GetBitmap(wxART_TICK_MARK
);
450 wxBitmap crossBitmap
= wxArtProvider::GetBitmap(wxART_CROSS_MARK
);
452 if ( tickBitmap
.Ok() && crossBitmap
.Ok() )
454 m_confirmButton
= new wxBitmapButton(panel
, wxID_PROP_CHECK
, tickBitmap
, wxDefaultPosition
, smallButtonSize
);
455 m_cancelButton
= new wxBitmapButton(panel
, wxID_PROP_CROSS
, crossBitmap
, wxDefaultPosition
, smallButtonSize
);
459 m_confirmButton
= new wxButton(panel
, wxID_PROP_CHECK
, _T(":-)"), wxDefaultPosition
, smallButtonSize
);
460 m_cancelButton
= new wxButton(panel
, wxID_PROP_CROSS
, _T("X"), wxDefaultPosition
, smallButtonSize
);
463 topsizer
->Add( m_confirmButton
, 0, wxLEFT
|wxTOP
|wxBOTTOM
| wxEXPAND
, buttonborder
);
464 topsizer
->Add( m_cancelButton
, 0, wxLEFT
|wxTOP
|wxBOTTOM
| wxEXPAND
, buttonborder
);
467 m_valueText
= new wxPropertyTextEdit(this, panel
, wxID_PROP_TEXT
, _T(""),
468 wxDefaultPosition
, wxSize(wxDefaultSize
.x
, smallButtonSize
.y
), wxPROCESS_ENTER
);
469 m_valueText
->Enable(false);
470 topsizer
->Add( m_valueText
, 1, wxALL
| wxEXPAND
, buttonborder
);
472 if (m_buttonFlags
& wxPROP_PULLDOWN
)
474 m_editButton
= new wxButton(panel
, wxID_PROP_EDIT
, _T("..."), wxDefaultPosition
, smallButtonSize
);
475 m_editButton
->Enable(false);
476 topsizer
->Add( m_editButton
, 0, wxRIGHT
|wxTOP
|wxBOTTOM
| wxEXPAND
, buttonborder
);
479 mainsizer
->Add( topsizer
, 0, wxEXPAND
);
481 // middle section with two list boxes
483 m_middleSizer
= new wxBoxSizer( wxVERTICAL
);
485 m_valueList
= new wxListBox(panel
, wxID_PROP_VALUE_SELECT
, wxDefaultPosition
, wxSize(wxDefaultSize
.x
, 60));
486 m_valueList
->Show(false);
488 m_propertyScrollingList
= new wxListBox(panel
, wxID_PROP_SELECT
, wxDefaultPosition
, wxSize(100, 100));
489 m_propertyScrollingList
->SetFont(* boringFont
);
490 m_middleSizer
->Add( m_propertyScrollingList
, 1, wxALL
|wxEXPAND
, buttonborder
);
492 mainsizer
->Add( m_middleSizer
, 1, wxEXPAND
);
494 // bottom row with buttons
496 if ((m_buttonFlags
& wxPROP_BUTTON_OK
) ||
497 (m_buttonFlags
& wxPROP_BUTTON_CLOSE
) ||
498 (m_buttonFlags
& wxPROP_BUTTON_CANCEL
) ||
499 (m_buttonFlags
& wxPROP_BUTTON_HELP
))
501 wxBoxSizer
*bottomsizer
= new wxBoxSizer( wxHORIZONTAL
);
504 if (m_buttonFlags
& wxPROP_BUTTON_OK
)
506 m_windowCloseButton
= new wxButton(panel
, wxID_OK
, _("OK"), wxDefaultPosition
, largeButtonSize
);
507 m_windowCloseButton
->SetDefault();
508 m_windowCloseButton
->SetFocus();
509 bottomsizer
->Add( m_windowCloseButton
, 0, wxALL
, buttonborder
);
511 else if (m_buttonFlags
& wxPROP_BUTTON_CLOSE
)
513 m_windowCloseButton
= new wxButton(panel
, wxID_OK
, _("Close"), wxDefaultPosition
, largeButtonSize
);
514 bottomsizer
->Add( m_windowCloseButton
, 0, wxALL
, buttonborder
);
516 if (m_buttonFlags
& wxPROP_BUTTON_CANCEL
)
518 m_windowCancelButton
= new wxButton(panel
, wxID_CANCEL
, _("Cancel"), wxDefaultPosition
, largeButtonSize
);
519 bottomsizer
->Add( m_windowCancelButton
, 0, wxALL
, buttonborder
);
521 if (m_buttonFlags
& wxPROP_BUTTON_HELP
)
523 m_windowHelpButton
= new wxButton(panel
, wxID_HELP
, _("Help"), wxDefaultPosition
, largeButtonSize
);
524 bottomsizer
->Add( m_windowHelpButton
, 0, wxALL
, buttonborder
);
527 mainsizer
->Add( bottomsizer
, 0, wxALIGN_RIGHT
| wxEXPAND
);
530 panel
->SetSizer( mainsizer
);
535 void wxPropertyListView::ShowTextControl(bool show
)
538 m_valueText
->Show(show
);
541 void wxPropertyListView::ShowListBoxControl(bool show
)
543 if (!m_valueList
) return;
545 m_valueList
->Show(show
);
547 if (m_buttonFlags
& wxPROP_DYNAMIC_VALUE_FIELD
)
550 m_middleSizer
->Prepend( m_valueList
, 0, wxTOP
|wxLEFT
|wxRIGHT
| wxEXPAND
, 3 );
552 m_middleSizer
->Remove( 0 );
554 m_propertyWindow
->Layout();
558 void wxPropertyListView::EnableCheck(bool show
)
561 m_confirmButton
->Enable(show
);
564 void wxPropertyListView::EnableCross(bool show
)
567 m_cancelButton
->Enable(show
);
570 bool wxPropertyListView::OnClose()
572 // Retrieve the value if any
573 wxCommandEvent event
;
580 void wxPropertyListView::OnValueListSelect(wxCommandEvent
& WXUNUSED(event
))
582 if (m_currentProperty
&& m_currentValidator
)
584 if (!m_currentValidator
->IsKindOf(CLASSINFO(wxPropertyListValidator
)))
587 wxPropertyListValidator
*listValidator
= (wxPropertyListValidator
*)m_currentValidator
;
589 listValidator
->OnValueListSelect(m_currentProperty
, this, m_propertyWindow
);
593 void wxPropertyListView::OnOk(wxCommandEvent
& event
)
595 // Retrieve the value if any
598 m_managedWindow
->Close(true);
599 sm_dialogCancelled
= false;
602 void wxPropertyListView::OnCancel(wxCommandEvent
& WXUNUSED(event
))
604 // SetReturnCode(wxID_CANCEL);
605 m_managedWindow
->Close(true);
606 sm_dialogCancelled
= true;
609 void wxPropertyListView::OnHelp(wxCommandEvent
& WXUNUSED(event
))
613 void wxPropertyListView::OnCheck(wxCommandEvent
& WXUNUSED(event
))
615 if (m_currentProperty
)
617 RetrieveProperty(m_currentProperty
);
621 void wxPropertyListView::OnCross(wxCommandEvent
& WXUNUSED(event
))
623 if (m_currentProperty
&& m_currentValidator
)
625 if (!m_currentValidator
->IsKindOf(CLASSINFO(wxPropertyListValidator
)))
628 wxPropertyListValidator
*listValidator
= (wxPropertyListValidator
*)m_currentValidator
;
630 // Revert to old value
631 listValidator
->OnDisplayValue(m_currentProperty
, this, m_propertyWindow
);
635 void wxPropertyListView::OnPropertyDoubleClick(wxCommandEvent
& WXUNUSED(event
))
637 if (m_currentProperty
&& m_currentValidator
)
639 if (!m_currentValidator
->IsKindOf(CLASSINFO(wxPropertyListValidator
)))
642 wxPropertyListValidator
*listValidator
= (wxPropertyListValidator
*)m_currentValidator
;
644 // Revert to old value
645 listValidator
->OnDoubleClick(m_currentProperty
, this, m_propertyWindow
);
649 void wxPropertyListView::OnEdit(wxCommandEvent
& WXUNUSED(event
))
651 if (m_currentProperty
&& m_currentValidator
)
653 if (!m_currentValidator
->IsKindOf(CLASSINFO(wxPropertyListValidator
)))
656 wxPropertyListValidator
*listValidator
= (wxPropertyListValidator
*)m_currentValidator
;
658 listValidator
->OnEdit(m_currentProperty
, this, m_propertyWindow
);
662 void wxPropertyListView::OnText(wxCommandEvent
& event
)
664 if (event
.GetEventType() == wxEVT_COMMAND_TEXT_ENTER
)
670 // ----------------------------------------------------------------------------
671 // Property dialog box
672 // ----------------------------------------------------------------------------
674 IMPLEMENT_DYNAMIC_CLASS(wxPropertyListDialog
, wxDialog
)
676 BEGIN_EVENT_TABLE(wxPropertyListDialog
, wxDialog
)
677 EVT_BUTTON(wxID_CANCEL
, wxPropertyListDialog::OnCancel
)
678 EVT_CLOSE(wxPropertyListDialog::OnCloseWindow
)
681 wxPropertyListDialog::wxPropertyListDialog(wxPropertyListView
*v
, wxWindow
*parent
,
682 const wxString
& title
, const wxPoint
& pos
,
683 const wxSize
& size
, long style
, const wxString
& name
):
684 wxDialog(parent
, wxID_ANY
, title
, pos
, size
, style
, name
)
687 m_view
->AssociatePanel( ((wxPanel
*)this) );
688 m_view
->SetManagedWindow(this);
692 void wxPropertyListDialog::OnCloseWindow(wxCloseEvent
& event
)
696 SetReturnCode(wxID_CANCEL
);
707 void wxPropertyListDialog::OnCancel(wxCommandEvent
& WXUNUSED(event
))
709 SetReturnCode(wxID_CANCEL
);
713 void wxPropertyListDialog::OnDefaultAction(wxControl
*WXUNUSED(item
))
716 if (item == m_view->GetPropertyScrollingList())
717 view->OnDoubleClick();
721 // Extend event processing to search the view's event table
722 bool wxPropertyListDialog::ProcessEvent(wxEvent
& event
)
724 if ( !m_view
|| ! m_view
->ProcessEvent(event
) )
725 return wxEvtHandler::ProcessEvent(event
);
730 // ----------------------------------------------------------------------------
732 // ----------------------------------------------------------------------------
734 IMPLEMENT_DYNAMIC_CLASS(wxPropertyListPanel
, wxPanel
)
736 BEGIN_EVENT_TABLE(wxPropertyListPanel
, wxPanel
)
737 EVT_SIZE(wxPropertyListPanel::OnSize
)
740 wxPropertyListPanel::~wxPropertyListPanel()
744 void wxPropertyListPanel::OnDefaultAction(wxControl
*WXUNUSED(item
))
747 if (item == view->GetPropertyScrollingList())
748 view->OnDoubleClick();
752 // Extend event processing to search the view's event table
753 bool wxPropertyListPanel::ProcessEvent(wxEvent
& event
)
755 if ( !m_view
|| ! m_view
->ProcessEvent(event
) )
756 return wxEvtHandler::ProcessEvent(event
);
761 void wxPropertyListPanel::OnSize(wxSizeEvent
& WXUNUSED(event
))
766 // ----------------------------------------------------------------------------
768 // ----------------------------------------------------------------------------
770 IMPLEMENT_DYNAMIC_CLASS(wxPropertyListFrame
, wxFrame
)
772 BEGIN_EVENT_TABLE(wxPropertyListFrame
, wxFrame
)
773 EVT_CLOSE(wxPropertyListFrame::OnCloseWindow
)
776 void wxPropertyListFrame::OnCloseWindow(wxCloseEvent
& event
)
781 m_propertyPanel
->SetView(NULL
);
792 wxPropertyListPanel
*wxPropertyListFrame::OnCreatePanel(wxFrame
*parent
, wxPropertyListView
*v
)
794 return new wxPropertyListPanel(v
, parent
);
797 bool wxPropertyListFrame::Initialize()
799 m_propertyPanel
= OnCreatePanel(this, m_view
);
802 m_view
->AssociatePanel(m_propertyPanel
);
803 m_view
->SetManagedWindow(this);
804 m_propertyPanel
->SetAutoLayout(true);
811 // ----------------------------------------------------------------------------
812 // Property list specific validator
813 // ----------------------------------------------------------------------------
815 IMPLEMENT_ABSTRACT_CLASS(wxPropertyListValidator
, wxPropertyValidator
)
817 bool wxPropertyListValidator::OnSelect(bool select
, wxProperty
*property
, wxPropertyListView
*view
, wxWindow
*parentWindow
)
819 // view->GetValueText()->Show(true);
821 OnDisplayValue(property
, view
, parentWindow
);
826 bool wxPropertyListValidator::OnValueListSelect(wxProperty
*property
, wxPropertyListView
*view
, wxWindow
*WXUNUSED(parentWindow
))
828 wxString
s(view
->GetValueList()->GetStringSelection());
831 view
->GetValueText()->SetValue(s
);
832 view
->RetrieveProperty(property
);
837 bool wxPropertyListValidator::OnDisplayValue(wxProperty
*property
, wxPropertyListView
*view
, wxWindow
*WXUNUSED(parentWindow
))
839 // view->GetValueText()->Show(true);
840 wxString
str(property
->GetValue().GetStringRepresentation());
842 view
->GetValueText()->SetValue(str
);
846 // Called when TICK is pressed or focus is lost or view wants to update
847 // the property list.
848 // Does the transferance from the property editing area to the property itself
849 bool wxPropertyListValidator::OnRetrieveValue(wxProperty
*WXUNUSED(property
), wxPropertyListView
*view
, wxWindow
*WXUNUSED(parentWindow
))
851 if (!view
->GetValueText())
856 void wxPropertyListValidator::OnEdit(wxProperty
*WXUNUSED(property
), wxPropertyListView
*view
, wxWindow
*WXUNUSED(parentWindow
))
858 if (view
->GetDetailedEditing())
859 view
->EndDetailedEditing();
861 view
->BeginDetailedEditing();
864 bool wxPropertyListValidator::OnClearControls(wxProperty
*WXUNUSED(property
), wxPropertyListView
*view
, wxWindow
*WXUNUSED(parentWindow
))
866 if (view
->GetConfirmButton())
867 view
->GetConfirmButton()->Enable(false);
868 if (view
->GetCancelButton())
869 view
->GetCancelButton()->Enable(false);
870 if (view
->GetEditButton())
871 view
->GetEditButton()->Enable(false);
875 // ----------------------------------------------------------------------------
876 // Default validators
877 // ----------------------------------------------------------------------------
879 IMPLEMENT_DYNAMIC_CLASS(wxRealListValidator
, wxPropertyListValidator
)
882 /// Real number validator
884 bool wxRealListValidator::OnCheckValue(wxProperty
*WXUNUSED(property
), wxPropertyListView
*view
, wxWindow
*parentWindow
)
886 if (m_realMin
== 0.0 && m_realMax
== 0.0)
889 if (!view
->GetValueText())
891 wxString
value(view
->GetValueText()->GetValue());
894 if (!StringToFloat(WXSTRINGCAST value
, &val
))
897 wxSprintf(buf
, wxT("Value %s is not a valid real number!"), value
.GetData());
898 wxMessageBox(buf
, wxT("Property value error"), wxOK
| wxICON_EXCLAMATION
, parentWindow
);
902 if (val
< m_realMin
|| val
> m_realMax
)
905 wxSprintf(buf
, wxT("Value must be a real number between %.2f and %.2f!"), m_realMin
, m_realMax
);
906 wxMessageBox(buf
, wxT("Property value error"), wxOK
| wxICON_EXCLAMATION
, parentWindow
);
912 // Called when TICK is pressed or focus is lost or view wants to update
913 // the property list.
914 // Does the transferance from the property editing area to the property itself
915 bool wxRealListValidator::OnRetrieveValue(wxProperty
*property
, wxPropertyListView
*view
, wxWindow
*WXUNUSED(parentWindow
))
917 if (!view
->GetValueText())
920 if (wxStrlen(view
->GetValueText()->GetValue()) == 0)
923 wxString
value(view
->GetValueText()->GetValue());
924 float f
= (float)wxAtof(value
.GetData());
925 property
->GetValue() = f
;
929 bool wxRealListValidator::OnPrepareControls(wxProperty
*WXUNUSED(property
), wxPropertyListView
*view
, wxWindow
*WXUNUSED(parentWindow
))
931 if (view
->GetConfirmButton())
932 view
->GetConfirmButton()->Enable(true);
933 if (view
->GetCancelButton())
934 view
->GetCancelButton()->Enable(true);
935 if (view
->GetEditButton())
936 view
->GetEditButton()->Enable(false);
937 if (view
->GetValueText())
938 view
->GetValueText()->Enable(true);
943 /// Integer validator
945 IMPLEMENT_DYNAMIC_CLASS(wxIntegerListValidator
, wxPropertyListValidator
)
947 bool wxIntegerListValidator::OnCheckValue(wxProperty
*WXUNUSED(property
), wxPropertyListView
*view
, wxWindow
*parentWindow
)
949 if (m_integerMin
== 0 && m_integerMax
== 0)
952 if (!view
->GetValueText())
954 wxString
value(view
->GetValueText()->GetValue());
957 if (!StringToLong(WXSTRINGCAST value
, &val
))
960 wxSprintf(buf
, wxT("Value %s is not a valid integer!"), value
.GetData());
961 wxMessageBox(buf
, wxT("Property value error"), wxOK
| wxICON_EXCLAMATION
, parentWindow
);
964 if (val
< m_integerMin
|| val
> m_integerMax
)
967 wxSprintf(buf
, wxT("Value must be an integer between %ld and %ld!"), m_integerMin
, m_integerMax
);
968 wxMessageBox(buf
, wxT("Property value error"), wxOK
| wxICON_EXCLAMATION
, parentWindow
);
974 // Called when TICK is pressed or focus is lost or view wants to update
975 // the property list.
976 // Does the transferance from the property editing area to the property itself
977 bool wxIntegerListValidator::OnRetrieveValue(wxProperty
*property
, wxPropertyListView
*view
, wxWindow
*WXUNUSED(parentWindow
))
979 if (!view
->GetValueText())
982 if (wxStrlen(view
->GetValueText()->GetValue()) == 0)
985 wxString
value(view
->GetValueText()->GetValue());
986 long val
= (long)wxAtoi(value
.GetData());
987 property
->GetValue() = (long)val
;
991 bool wxIntegerListValidator::OnPrepareControls(wxProperty
*WXUNUSED(property
), wxPropertyListView
*view
, wxWindow
*WXUNUSED(parentWindow
))
993 if (view
->GetConfirmButton())
994 view
->GetConfirmButton()->Enable(true);
995 if (view
->GetCancelButton())
996 view
->GetCancelButton()->Enable(true);
997 if (view
->GetEditButton())
998 view
->GetEditButton()->Enable(false);
999 if (view
->GetValueText())
1000 view
->GetValueText()->Enable(true);
1005 /// boolean validator
1007 IMPLEMENT_DYNAMIC_CLASS(wxBoolListValidator
, wxPropertyListValidator
)
1009 bool wxBoolListValidator::OnCheckValue(wxProperty
*WXUNUSED(property
), wxPropertyListView
*view
, wxWindow
*parentWindow
)
1011 if (!view
->GetValueText())
1013 wxString
value(view
->GetValueText()->GetValue());
1014 if (value
!= wxT("True") && value
!= wxT("False"))
1016 wxMessageBox(wxT("Value must be True or False!"), wxT("Property value error"), wxOK
| wxICON_EXCLAMATION
, parentWindow
);
1022 // Called when TICK is pressed or focus is lost or view wants to update
1023 // the property list.
1024 // Does the transferance from the property editing area to the property itself
1025 bool wxBoolListValidator::OnRetrieveValue(wxProperty
*property
, wxPropertyListView
*view
, wxWindow
*WXUNUSED(parentWindow
))
1027 if (!view
->GetValueText())
1030 if (wxStrlen(view
->GetValueText()->GetValue()) == 0)
1033 wxString
value(view
->GetValueText()->GetValue());
1034 bool boolValue
= (value
== wxT("True"));
1035 property
->GetValue() = boolValue
;
1039 bool wxBoolListValidator::OnDisplayValue(wxProperty
*property
, wxPropertyListView
*view
, wxWindow
*WXUNUSED(parentWindow
))
1041 if (!view
->GetValueText())
1043 wxString
str(property
->GetValue().GetStringRepresentation());
1045 view
->GetValueText()->SetValue(str
);
1047 if (view
->GetValueList()->IsShown())
1049 view
->GetValueList()->SetStringSelection(str
);
1054 bool wxBoolListValidator::OnPrepareControls(wxProperty
*WXUNUSED(property
), wxPropertyListView
*view
, wxWindow
*WXUNUSED(parentWindow
))
1056 if (view
->GetConfirmButton())
1057 view
->GetConfirmButton()->Enable(false);
1058 if (view
->GetCancelButton())
1059 view
->GetCancelButton()->Enable(false);
1060 if (view
->GetEditButton())
1061 view
->GetEditButton()->Enable(true);
1062 if (view
->GetValueText())
1063 view
->GetValueText()->Enable(false);
1067 bool wxBoolListValidator::OnPrepareDetailControls(wxProperty
*WXUNUSED(property
), wxPropertyListView
*view
, wxWindow
*WXUNUSED(parentWindow
))
1069 if (view
->GetValueList())
1071 view
->ShowListBoxControl(true);
1072 view
->GetValueList()->Enable(true);
1074 view
->GetValueList()->Append(wxT("True"));
1075 view
->GetValueList()->Append(wxT("False"));
1076 wxChar
*currentString
= copystring(view
->GetValueText()->GetValue());
1077 view
->GetValueList()->SetStringSelection(currentString
);
1078 delete[] currentString
;
1083 bool wxBoolListValidator::OnClearDetailControls(wxProperty
*WXUNUSED(property
), wxPropertyListView
*view
, wxWindow
*WXUNUSED(parentWindow
))
1085 if (view
->GetValueList())
1087 view
->GetValueList()->Clear();
1088 view
->ShowListBoxControl(false);
1089 view
->GetValueList()->Enable(false);
1094 // Called when the property is double clicked. Extra functionality can be provided,
1095 // cycling through possible values.
1096 bool wxBoolListValidator::OnDoubleClick(wxProperty
*property
, wxPropertyListView
*view
, wxWindow
*WXUNUSED(parentWindow
))
1098 if (!view
->GetValueText())
1100 if (property
->GetValue().BoolValue())
1101 property
->GetValue() = false;
1103 property
->GetValue() = true;
1104 view
->DisplayProperty(property
);
1105 view
->UpdatePropertyDisplayInList(property
);
1106 view
->OnPropertyChanged(property
);
1111 /// String validator
1113 IMPLEMENT_DYNAMIC_CLASS(wxStringListValidator
, wxPropertyListValidator
)
1115 wxStringListValidator::wxStringListValidator(wxStringList
*list
, long flags
):
1116 wxPropertyListValidator(flags
)
1119 // If no constraint, we just allow the string to be edited.
1120 if (!m_strings
&& ((m_validatorFlags
& wxPROP_ALLOW_TEXT_EDITING
) == 0))
1121 m_validatorFlags
|= wxPROP_ALLOW_TEXT_EDITING
;
1124 bool wxStringListValidator::OnCheckValue(wxProperty
*WXUNUSED(property
), wxPropertyListView
*view
, wxWindow
*parentWindow
)
1129 if (!view
->GetValueText())
1131 wxString
value(view
->GetValueText()->GetValue());
1133 if (!m_strings
->Member(value
.GetData()))
1135 wxString
str( wxT("Value ") );
1136 str
+= value
.GetData();
1137 str
+= wxT(" is not valid.");
1138 wxMessageBox( str
.GetData(), wxT("Property value error"), wxOK
| wxICON_EXCLAMATION
, parentWindow
);
1144 // Called when TICK is pressed or focus is lost or view wants to update
1145 // the property list.
1146 // Does the transferance from the property editing area to the property itself
1147 bool wxStringListValidator::OnRetrieveValue(wxProperty
*property
, wxPropertyListView
*view
, wxWindow
*WXUNUSED(parentWindow
))
1149 if (!view
->GetValueText())
1151 wxString
value(view
->GetValueText()->GetValue());
1152 property
->GetValue() = value
;
1156 // Called when TICK is pressed or focus is lost or view wants to update
1157 // the property list.
1158 // Does the transferance from the property editing area to the property itself
1159 bool wxStringListValidator::OnDisplayValue(wxProperty
*property
, wxPropertyListView
*view
, wxWindow
*WXUNUSED(parentWindow
))
1161 if (!view
->GetValueText())
1163 wxString
str(property
->GetValue().GetStringRepresentation());
1164 view
->GetValueText()->SetValue(str
);
1165 if (m_strings
&& view
->GetValueList() && view
->GetValueList()->IsShown() && view
->GetValueList()->GetCount() > 0)
1167 view
->GetValueList()->SetStringSelection(str
);
1172 bool wxStringListValidator::OnPrepareControls(wxProperty
*WXUNUSED(property
), wxPropertyListView
*view
, wxWindow
*WXUNUSED(parentWindow
))
1177 if (view
->GetEditButton())
1178 view
->GetEditButton()->Enable(false);
1179 if (view
->GetConfirmButton())
1180 view
->GetConfirmButton()->Enable(true);
1181 if (view
->GetCancelButton())
1182 view
->GetCancelButton()->Enable(true);
1183 if (view
->GetValueText())
1184 view
->GetValueText()->Enable(true);
1189 if (view
->GetValueText())
1190 view
->GetValueText()->Enable(false);
1192 if (view
->GetEditButton())
1193 view
->GetEditButton()->Enable(true);
1195 if (view
->GetConfirmButton())
1196 view
->GetConfirmButton()->Enable(false);
1197 if (view
->GetCancelButton())
1198 view
->GetCancelButton()->Enable(false);
1202 bool wxStringListValidator::OnPrepareDetailControls( wxProperty
*property
,
1203 wxPropertyListView
*view
,
1204 wxWindow
*WXUNUSED(parentWindow
) )
1206 if (view
->GetValueList())
1208 view
->ShowListBoxControl(true);
1209 view
->GetValueList()->Enable(true);
1210 wxStringList::Node
*node
= m_strings
->GetFirst();
1213 wxChar
*s
= node
->GetData();
1214 view
->GetValueList()->Append(s
);
1215 node
= node
->GetNext();
1217 wxChar
*currentString
= property
->GetValue().StringValue();
1218 view
->GetValueList()->SetStringSelection(currentString
);
1223 bool wxStringListValidator::OnClearDetailControls(wxProperty
*WXUNUSED(property
), wxPropertyListView
*view
, wxWindow
*WXUNUSED(parentWindow
))
1230 if (view
->GetValueList())
1232 view
->GetValueList()->Clear();
1233 view
->ShowListBoxControl(false);
1234 view
->GetValueList()->Enable(false);
1239 // Called when the property is double clicked. Extra functionality can be provided,
1240 // cycling through possible values.
1241 bool wxStringListValidator::OnDoubleClick( wxProperty
*property
,
1242 wxPropertyListView
*view
,
1243 wxWindow
*WXUNUSED(parentWindow
) )
1245 if (!view
->GetValueText())
1250 wxStringList::Node
*node
= m_strings
->GetFirst();
1251 wxChar
*currentString
= property
->GetValue().StringValue();
1254 wxChar
*s
= node
->GetData();
1255 if (wxStrcmp(s
, currentString
) == 0)
1258 if (node
->GetNext())
1259 nextString
= node
->GetNext()->GetData();
1261 nextString
= m_strings
->GetFirst()->GetData();
1262 property
->GetValue() = wxString(nextString
);
1263 view
->DisplayProperty(property
);
1264 view
->UpdatePropertyDisplayInList(property
);
1265 view
->OnPropertyChanged(property
);
1268 else node
= node
->GetNext();
1274 /// Filename validator
1276 IMPLEMENT_DYNAMIC_CLASS(wxFilenameListValidator
, wxPropertyListValidator
)
1278 wxFilenameListValidator::wxFilenameListValidator(wxString message
, wxString wildcard
, long flags
):
1279 wxPropertyListValidator(flags
), m_filenameWildCard(wildcard
), m_filenameMessage(message
)
1283 wxFilenameListValidator::~wxFilenameListValidator()
1287 bool wxFilenameListValidator::OnCheckValue(wxProperty
*WXUNUSED(property
), wxPropertyListView
*WXUNUSED(view
), wxWindow
*WXUNUSED(parentWindow
))
1292 // Called when TICK is pressed or focus is lost or view wants to update
1293 // the property list.
1294 // Does the transferance from the property editing area to the property itself
1295 bool wxFilenameListValidator::OnRetrieveValue(wxProperty
*property
, wxPropertyListView
*view
, wxWindow
*WXUNUSED(parentWindow
))
1297 if (!view
->GetValueText())
1299 wxString
value(view
->GetValueText()->GetValue());
1300 property
->GetValue() = value
;
1304 // Called when TICK is pressed or focus is lost or view wants to update
1305 // the property list.
1306 // Does the transferance from the property editing area to the property itself
1307 bool wxFilenameListValidator::OnDisplayValue(wxProperty
*property
, wxPropertyListView
*view
, wxWindow
*WXUNUSED(parentWindow
))
1309 if (!view
->GetValueText())
1311 wxString
str(property
->GetValue().GetStringRepresentation());
1312 view
->GetValueText()->SetValue(str
);
1316 // Called when the property is double clicked. Extra functionality can be provided,
1317 // cycling through possible values.
1318 bool wxFilenameListValidator::OnDoubleClick(wxProperty
*property
, wxPropertyListView
*view
, wxWindow
*parentWindow
)
1320 if (!view
->GetValueText())
1322 OnEdit(property
, view
, parentWindow
);
1326 bool wxFilenameListValidator::OnPrepareControls(wxProperty
*WXUNUSED(property
), wxPropertyListView
*view
, wxWindow
*WXUNUSED(parentWindow
))
1328 if (view
->GetConfirmButton())
1329 view
->GetConfirmButton()->Enable(true);
1330 if (view
->GetCancelButton())
1331 view
->GetCancelButton()->Enable(true);
1332 if (view
->GetEditButton())
1333 view
->GetEditButton()->Enable(true);
1334 if (view
->GetValueText())
1335 view
->GetValueText()->Enable((GetFlags() & wxPROP_ALLOW_TEXT_EDITING
) == wxPROP_ALLOW_TEXT_EDITING
);
1339 void wxFilenameListValidator::OnEdit(wxProperty
*property
, wxPropertyListView
*view
, wxWindow
*parentWindow
)
1341 if (!view
->GetValueText())
1344 wxString s
= wxFileSelector(
1345 m_filenameMessage
.GetData(),
1346 wxPathOnly(property
->GetValue().StringValue()),
1347 wxFileNameFromPath(property
->GetValue().StringValue()),
1349 m_filenameWildCard
.GetData(),
1354 property
->GetValue() = s
;
1355 view
->DisplayProperty(property
);
1356 view
->UpdatePropertyDisplayInList(property
);
1357 view
->OnPropertyChanged(property
);
1362 /// Colour validator
1364 IMPLEMENT_DYNAMIC_CLASS(wxColourListValidator
, wxPropertyListValidator
)
1366 wxColourListValidator::wxColourListValidator(long flags
):
1367 wxPropertyListValidator(flags
)
1371 wxColourListValidator::~wxColourListValidator()
1375 bool wxColourListValidator::OnCheckValue(wxProperty
*WXUNUSED(property
), wxPropertyListView
*WXUNUSED(view
), wxWindow
*WXUNUSED(parentWindow
))
1380 // Called when TICK is pressed or focus is lost or view wants to update
1381 // the property list.
1382 // Does the transferance from the property editing area to the property itself
1383 bool wxColourListValidator::OnRetrieveValue(wxProperty
*property
, wxPropertyListView
*view
, wxWindow
*WXUNUSED(parentWindow
))
1385 if (!view
->GetValueText())
1387 wxString
value(view
->GetValueText()->GetValue());
1389 property
->GetValue() = value
;
1393 // Called when TICK is pressed or focus is lost or view wants to update
1394 // the property list.
1395 // Does the transferance from the property editing area to the property itself
1396 bool wxColourListValidator::OnDisplayValue(wxProperty
*property
, wxPropertyListView
*view
, wxWindow
*WXUNUSED(parentWindow
))
1398 if (!view
->GetValueText())
1400 wxString
str(property
->GetValue().GetStringRepresentation());
1401 view
->GetValueText()->SetValue(str
);
1405 // Called when the property is double clicked. Extra functionality can be provided,
1406 // cycling through possible values.
1407 bool wxColourListValidator::OnDoubleClick(wxProperty
*property
, wxPropertyListView
*view
, wxWindow
*parentWindow
)
1409 if (!view
->GetValueText())
1411 OnEdit(property
, view
, parentWindow
);
1415 bool wxColourListValidator::OnPrepareControls(wxProperty
*WXUNUSED(property
), wxPropertyListView
*view
, wxWindow
*WXUNUSED(parentWindow
))
1417 if (view
->GetConfirmButton())
1418 view
->GetConfirmButton()->Enable(true);
1419 if (view
->GetCancelButton())
1420 view
->GetCancelButton()->Enable(true);
1421 if (view
->GetEditButton())
1422 view
->GetEditButton()->Enable(true);
1423 if (view
->GetValueText())
1424 view
->GetValueText()->Enable((GetFlags() & wxPROP_ALLOW_TEXT_EDITING
) == wxPROP_ALLOW_TEXT_EDITING
);
1428 void wxColourListValidator::OnEdit(wxProperty
*property
, wxPropertyListView
*view
, wxWindow
*parentWindow
)
1430 if (!view
->GetValueText())
1433 wxChar
*s
= property
->GetValue().StringValue();
1440 g
= wxHexToDec(s
+2);
1441 b
= wxHexToDec(s
+4);
1444 wxColour
col(r
,g
,b
);
1447 data
.SetChooseFull(true);
1448 data
.SetColour(col
);
1450 for (int i
= 0; i
< 16; i
++)
1452 wxColour
colour(i
*16, i
*16, i
*16);
1453 data
.SetCustomColour(i
, colour
);
1456 wxColourDialog
dialog(parentWindow
, &data
);
1457 if (dialog
.ShowModal() != wxID_CANCEL
)
1459 wxColourData retData
= dialog
.GetColourData();
1460 col
= retData
.GetColour();
1463 wxDecToHex(col
.Red(), buf
);
1464 wxDecToHex(col
.Green(), buf
+2);
1465 wxDecToHex(col
.Blue(), buf
+4);
1467 property
->GetValue() = wxString(buf
);
1468 view
->DisplayProperty(property
);
1469 view
->UpdatePropertyDisplayInList(property
);
1470 view
->OnPropertyChanged(property
);
1475 /// List of strings validator. For this we need more user interface than
1476 /// we get with a property list; so create a new dialog for editing the list.
1478 IMPLEMENT_DYNAMIC_CLASS(wxListOfStringsListValidator
, wxPropertyListValidator
)
1480 wxListOfStringsListValidator::wxListOfStringsListValidator(long flags
):
1481 wxPropertyListValidator(flags
)
1485 bool wxListOfStringsListValidator::OnCheckValue(wxProperty
*WXUNUSED(property
), wxPropertyListView
*WXUNUSED(view
), wxWindow
*WXUNUSED(parentWindow
))
1487 // No constraints for an arbitrary, user-editable list of strings.
1491 // Called when TICK is pressed or focus is lost or view wants to update
1492 // the property list.
1493 // Does the transferance from the property editing area to the property itself.
1494 // In this case, the user cannot directly edit the string list.
1495 bool wxListOfStringsListValidator::OnRetrieveValue(wxProperty
*WXUNUSED(property
), wxPropertyListView
*WXUNUSED(view
), wxWindow
*WXUNUSED(parentWindow
))
1500 bool wxListOfStringsListValidator::OnDisplayValue(wxProperty
*property
, wxPropertyListView
*view
, wxWindow
*WXUNUSED(parentWindow
))
1502 if (!view
->GetValueText())
1504 wxString
str(property
->GetValue().GetStringRepresentation());
1505 view
->GetValueText()->SetValue(str
);
1509 bool wxListOfStringsListValidator::OnPrepareControls(wxProperty
*WXUNUSED(property
), wxPropertyListView
*view
, wxWindow
*WXUNUSED(parentWindow
))
1511 if (view
->GetEditButton())
1512 view
->GetEditButton()->Enable(true);
1513 if (view
->GetValueText())
1514 view
->GetValueText()->Enable(false);
1516 if (view
->GetConfirmButton())
1517 view
->GetConfirmButton()->Enable(false);
1518 if (view
->GetCancelButton())
1519 view
->GetCancelButton()->Enable(false);
1523 // Called when the property is double clicked. Extra functionality can be provided,
1524 // cycling through possible values.
1525 bool wxListOfStringsListValidator::OnDoubleClick(wxProperty
*property
, wxPropertyListView
*view
, wxWindow
*parentWindow
)
1527 OnEdit(property
, view
, parentWindow
);
1531 void wxListOfStringsListValidator::OnEdit( wxProperty
*property
,
1532 wxPropertyListView
*view
,
1533 wxWindow
*parentWindow
)
1535 // Convert property value to a list of strings for editing
1536 wxStringList
*stringList
= new wxStringList
;
1538 wxPropertyValue
*expr
= property
->GetValue().GetFirst();
1541 wxChar
*s
= expr
->StringValue();
1544 expr
= expr
->GetNext();
1547 wxString
title(wxT("Editing "));
1548 title
+= property
->GetName();
1550 if (EditStringList(parentWindow
, stringList
, title
.GetData()))
1552 wxPropertyValue
& oldValue
= property
->GetValue();
1553 oldValue
.ClearList();
1554 wxStringList::Node
*node
= stringList
->GetFirst();
1557 wxChar
*s
= node
->GetData();
1558 oldValue
.Append(new wxPropertyValue(s
));
1560 node
= node
->GetNext();
1563 view
->DisplayProperty(property
);
1564 view
->UpdatePropertyDisplayInList(property
);
1565 view
->OnPropertyChanged(property
);
1570 class wxPropertyStringListEditorDialog
: public wxDialog
1573 wxPropertyStringListEditorDialog(wxWindow
*parent
, const wxString
& title
,
1574 const wxPoint
& pos
= wxDefaultPosition
, const wxSize
& size
= wxDefaultSize
,
1575 long windowStyle
= wxDEFAULT_DIALOG_STYLE
, const wxString
& name
= wxT("stringEditorDialogBox")):
1576 wxDialog(parent
, wxID_ANY
, title
, pos
, size
, windowStyle
, name
)
1578 m_stringList
= NULL
;
1579 m_stringText
= NULL
;
1581 sm_dialogCancelled
= false;
1582 m_currentSelection
= -1;
1584 ~wxPropertyStringListEditorDialog(void) {}
1585 void OnCloseWindow(wxCloseEvent
& event
);
1586 void SaveCurrentSelection(void);
1587 void ShowCurrentSelection(void);
1589 void OnOK(wxCommandEvent
& event
);
1590 void OnCancel(wxCommandEvent
& event
);
1591 void OnAdd(wxCommandEvent
& event
);
1592 void OnDelete(wxCommandEvent
& event
);
1593 void OnStrings(wxCommandEvent
& event
);
1594 void OnText(wxCommandEvent
& event
);
1597 wxStringList
* m_stringList
;
1598 wxListBox
* m_listBox
;
1599 wxTextCtrl
* m_stringText
;
1600 static bool sm_dialogCancelled
;
1601 int m_currentSelection
;
1602 DECLARE_EVENT_TABLE()
1605 #define wxID_PROP_SL_ADD 3000
1606 #define wxID_PROP_SL_DELETE 3001
1607 #define wxID_PROP_SL_STRINGS 3002
1608 #define wxID_PROP_SL_TEXT 3003
1610 BEGIN_EVENT_TABLE(wxPropertyStringListEditorDialog
, wxDialog
)
1611 EVT_BUTTON(wxID_OK
, wxPropertyStringListEditorDialog::OnOK
)
1612 EVT_BUTTON(wxID_CANCEL
, wxPropertyStringListEditorDialog::OnCancel
)
1613 EVT_BUTTON(wxID_PROP_SL_ADD
, wxPropertyStringListEditorDialog::OnAdd
)
1614 EVT_BUTTON(wxID_PROP_SL_DELETE
, wxPropertyStringListEditorDialog::OnDelete
)
1615 EVT_LISTBOX(wxID_PROP_SL_STRINGS
, wxPropertyStringListEditorDialog::OnStrings
)
1616 EVT_TEXT_ENTER(wxID_PROP_SL_TEXT
, wxPropertyStringListEditorDialog::OnText
)
1617 EVT_CLOSE(wxPropertyStringListEditorDialog::OnCloseWindow
)
1620 class wxPropertyStringListEditorText
: public wxTextCtrl
1623 wxPropertyStringListEditorText(wxWindow
*parent
, wxWindowID id
, const wxString
& val
,
1624 const wxPoint
& pos
= wxDefaultPosition
, const wxSize
& size
= wxDefaultSize
,
1625 long windowStyle
= 0, const wxString
& name
= wxT("text")):
1626 wxTextCtrl(parent
, id
, val
, pos
, size
, windowStyle
, wxDefaultValidator
, name
)
1631 wxPropertyStringListEditorDialog
*dialog
= (wxPropertyStringListEditorDialog
*)GetParent();
1632 dialog
->SaveCurrentSelection();
1636 bool wxPropertyStringListEditorDialog::sm_dialogCancelled
= false;
1638 // Edit the string list.
1639 bool wxListOfStringsListValidator::EditStringList(wxWindow
*parent
, wxStringList
*stringList
, const wxChar
*title
)
1641 int largeButtonWidth
= 60;
1642 int largeButtonHeight
= 25;
1644 wxBeginBusyCursor();
1645 wxPropertyStringListEditorDialog
*dialog
= new wxPropertyStringListEditorDialog(parent
,
1646 title
, wxPoint(10, 10), wxSize(400, 400));
1648 dialog
->m_stringList
= stringList
;
1650 dialog
->m_listBox
= new wxListBox(dialog
, wxID_PROP_SL_STRINGS
,
1651 wxDefaultPosition
, wxDefaultSize
, 0, NULL
, wxLB_SINGLE
);
1653 dialog
->m_stringText
= new wxPropertyStringListEditorText(dialog
,
1654 wxID_PROP_SL_TEXT
, wxT(""), wxPoint(5, 240),
1655 wxSize(300, wxDefaultSize
.y
), wxPROCESS_ENTER
);
1656 dialog
->m_stringText
->Enable(false);
1658 wxButton
*addButton
= new wxButton(dialog
, wxID_PROP_SL_ADD
, wxT("Add"), wxDefaultPosition
, wxSize(largeButtonWidth
, largeButtonHeight
));
1659 wxButton
*deleteButton
= new wxButton(dialog
, wxID_PROP_SL_DELETE
, wxT("Delete"), wxDefaultPosition
, wxSize(largeButtonWidth
, largeButtonHeight
));
1660 wxButton
*cancelButton
= new wxButton(dialog
, wxID_CANCEL
, wxT("Cancel"), wxDefaultPosition
, wxSize(largeButtonWidth
, largeButtonHeight
));
1661 wxButton
*okButton
= new wxButton(dialog
, wxID_OK
, wxT("OK"), wxDefaultPosition
, wxSize(largeButtonWidth
, largeButtonHeight
));
1664 okButton
->SetDefault();
1667 wxBoxSizer
*m_bottom_sizer
= new wxBoxSizer( wxHORIZONTAL
);
1668 m_bottom_sizer
->Add(addButton
, 0, wxALL
| wxALIGN_LEFT
, 2 );
1669 m_bottom_sizer
->Add(deleteButton
, 0, wxALL
| wxALIGN_LEFT
, 2 );
1670 m_bottom_sizer
->Add(1, 1, 1, wxEXPAND
| wxALL
);
1671 m_bottom_sizer
->Add(cancelButton
, 0, wxALL
| wxALIGN_RIGHT
, 2 );
1672 m_bottom_sizer
->Add(okButton
, 0, wxALL
| wxALIGN_RIGHT
, 2 );
1674 wxBoxSizer
*m_sizer
= new wxBoxSizer( wxVERTICAL
);
1675 m_sizer
->Add(dialog
->m_listBox
, 1, wxEXPAND
| wxALL
, 2 );
1676 m_sizer
->Add(dialog
->m_stringText
, 0, wxEXPAND
| wxALL
, 2 );
1677 m_sizer
->Add(m_bottom_sizer
, 0, wxEXPAND
| wxALL
, 0 );
1679 dialog
->SetSizer( m_sizer
);
1680 m_sizer
->SetSizeHints( dialog
);
1682 wxStringList::Node
*node
= stringList
->GetFirst();
1685 wxChar
*str
= node
->GetData();
1686 // Save node as client data for each listbox item
1687 dialog
->m_listBox
->Append(str
, (wxChar
*)node
);
1688 node
= node
->GetNext();
1691 dialog
->SetClientSize(310, 305);
1694 dialog
->Centre(wxBOTH
);
1696 if (dialog
->ShowModal() == wxID_CANCEL
)
1703 * String list editor callbacks
1707 void wxPropertyStringListEditorDialog::OnStrings(wxCommandEvent
& WXUNUSED(event
))
1709 int sel
= m_listBox
->GetSelection();
1712 m_currentSelection
= sel
;
1714 ShowCurrentSelection();
1718 void wxPropertyStringListEditorDialog::OnDelete(wxCommandEvent
& WXUNUSED(event
))
1720 int sel
= m_listBox
->GetSelection();
1724 wxNode
*node
= (wxNode
*)m_listBox
->wxListBox::GetClientData(sel
);
1728 m_listBox
->Delete(sel
);
1729 delete[] (wxChar
*)node
->GetData();
1731 m_currentSelection
= -1;
1732 m_stringText
->SetValue(_T(""));
1735 void wxPropertyStringListEditorDialog::OnAdd(wxCommandEvent
& WXUNUSED(event
))
1737 SaveCurrentSelection();
1739 wxString initialText
;
1740 wxNode
*node
= m_stringList
->Add(initialText
);
1741 m_listBox
->Append(initialText
, (void *)node
);
1742 m_currentSelection
= m_stringList
->GetCount() - 1;
1743 m_listBox
->SetSelection(m_currentSelection
);
1744 ShowCurrentSelection();
1745 m_stringText
->SetFocus();
1748 void wxPropertyStringListEditorDialog::OnOK(wxCommandEvent
& WXUNUSED(event
))
1750 SaveCurrentSelection();
1756 void wxPropertyStringListEditorDialog::OnCancel(wxCommandEvent
& WXUNUSED(event
))
1758 sm_dialogCancelled
= true;
1759 EndModal(wxID_CANCEL
);
1764 void wxPropertyStringListEditorDialog::OnText(wxCommandEvent
& event
)
1766 if (event
.GetEventType() == wxEVT_COMMAND_TEXT_ENTER
)
1768 SaveCurrentSelection();
1773 wxPropertyStringListEditorDialog::OnCloseWindow(wxCloseEvent
& WXUNUSED(event
))
1775 SaveCurrentSelection();
1780 void wxPropertyStringListEditorDialog::SaveCurrentSelection()
1782 if (m_currentSelection
== -1)
1785 wxNode
*node
= (wxNode
*)m_listBox
->wxListBox::GetClientData(m_currentSelection
);
1789 wxString
txt(m_stringText
->GetValue());
1790 if (node
->GetData())
1791 delete[] (wxChar
*)node
->GetData();
1792 node
->SetData((wxObject
*)wxStrdup(txt
));
1794 m_listBox
->SetString(m_currentSelection
, (wxChar
*)node
->GetData());
1797 void wxPropertyStringListEditorDialog::ShowCurrentSelection()
1799 if (m_currentSelection
== -1)
1801 m_stringText
->SetValue(wxT(""));
1804 wxNode
*node
= (wxNode
*)m_listBox
->wxListBox::GetClientData(m_currentSelection
);
1805 wxChar
*txt
= (wxChar
*)node
->GetData();
1806 m_stringText
->SetValue(txt
);
1807 m_stringText
->Enable(true);
1811 #endif // wxUSE_PROPSHEET