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"
34 #include "wx/window.h"
36 #include "wx/button.h"
37 #include "wx/bmpbuttn.h"
38 #include "wx/textctrl.h"
39 #include "wx/listbox.h"
40 #include "wx/settings.h"
41 #include "wx/msgdlg.h"
42 #include "wx/filedlg.h"
46 #include "wx/module.h"
48 #include "wx/artprov.h"
50 #include "wx/colordlg.h"
51 #include "wx/proplist.h"
58 // ----------------------------------------------------------------------------
59 // Property text edit control
60 // ----------------------------------------------------------------------------
62 IMPLEMENT_DYNAMIC_CLASS(wxPropertyTextEdit
, wxTextCtrl
)
64 wxPropertyTextEdit::wxPropertyTextEdit(wxPropertyListView
*v
, wxWindow
*parent
,
65 const wxWindowID id
, const wxString
& value
,
66 const wxPoint
& pos
, const wxSize
& size
,
67 long style
, const wxString
& name
):
68 wxTextCtrl(parent
, id
, value
, pos
, size
, style
, wxDefaultValidator
, name
)
73 void wxPropertyTextEdit::OnSetFocus()
77 void wxPropertyTextEdit::OnKillFocus()
81 // ----------------------------------------------------------------------------
83 // ----------------------------------------------------------------------------
85 bool wxPropertyListView::sm_dialogCancelled
= FALSE
;
87 IMPLEMENT_DYNAMIC_CLASS(wxPropertyListView
, wxPropertyView
)
89 BEGIN_EVENT_TABLE(wxPropertyListView
, wxPropertyView
)
90 EVT_BUTTON(wxID_OK
, wxPropertyListView::OnOk
)
91 EVT_BUTTON(wxID_CANCEL
, wxPropertyListView::OnCancel
)
92 EVT_BUTTON(wxID_HELP
, wxPropertyListView::OnHelp
)
93 EVT_BUTTON(wxID_PROP_CROSS
, wxPropertyListView::OnCross
)
94 EVT_BUTTON(wxID_PROP_CHECK
, wxPropertyListView::OnCheck
)
95 EVT_BUTTON(wxID_PROP_EDIT
, wxPropertyListView::OnEdit
)
96 EVT_TEXT_ENTER(wxID_PROP_TEXT
, wxPropertyListView::OnText
)
97 EVT_LISTBOX(wxID_PROP_SELECT
, wxPropertyListView::OnPropertySelect
)
98 EVT_COMMAND(wxID_PROP_SELECT
, wxEVT_COMMAND_LISTBOX_DOUBLECLICKED
,
99 wxPropertyListView::OnPropertyDoubleClick
)
100 EVT_LISTBOX(wxID_PROP_VALUE_SELECT
, wxPropertyListView::OnValueListSelect
)
103 wxPropertyListView::wxPropertyListView(wxPanel
*propPanel
, long flags
):wxPropertyView(flags
)
105 m_propertyScrollingList
= NULL
;
109 m_confirmButton
= NULL
;
110 m_cancelButton
= NULL
;
111 m_propertyWindow
= propPanel
;
112 m_managedWindow
= NULL
;
114 m_windowCloseButton
= NULL
;
115 m_windowCancelButton
= NULL
;
116 m_windowHelpButton
= NULL
;
118 m_detailedEditing
= FALSE
;
121 wxPropertyListView::~wxPropertyListView()
125 void wxPropertyListView::ShowView(wxPropertySheet
*ps
, wxPanel
*panel
)
127 m_propertySheet
= ps
;
129 AssociatePanel(panel
);
132 UpdatePropertyList();
136 // Update this view of the viewed object, called e.g. by
137 // the object itself.
138 bool wxPropertyListView::OnUpdateView()
143 bool wxPropertyListView::UpdatePropertyList(bool clearEditArea
)
145 if (!m_propertyScrollingList
|| !m_propertySheet
)
148 m_propertyScrollingList
->Clear();
151 m_valueList
->Clear();
152 m_valueText
->SetValue( wxT("") );
154 wxNode
*node
= m_propertySheet
->GetProperties().GetFirst();
156 // Should sort them... later...
159 wxProperty
*property
= (wxProperty
*)node
->GetData();
160 wxString
stringValueRepr(property
->GetValue().GetStringRepresentation());
161 wxString
paddedString(MakeNameValueString(property
->GetName(), stringValueRepr
));
162 m_propertyScrollingList
->Append(paddedString
.GetData(), (void *)property
);
163 node
= node
->GetNext();
168 bool wxPropertyListView::UpdatePropertyDisplayInList(wxProperty
*property
)
170 if (!m_propertyScrollingList
|| !m_propertySheet
)
174 int currentlySelected
= m_propertyScrollingList
->GetSelection();
177 wxString
stringValueRepr(property
->GetValue().GetStringRepresentation());
178 wxString
paddedString(MakeNameValueString(property
->GetName(), stringValueRepr
));
179 int sel
= FindListIndexForProperty(property
);
183 // Don't update the listbox unnecessarily because it can cause
186 if (paddedString
!= m_propertyScrollingList
->GetString(sel
))
187 m_propertyScrollingList
->SetString(sel
, paddedString
.GetData());
190 // UpdatePropertyList(FALSE);
193 // TODO: why is this necessary?
195 if (currentlySelected
> -1)
196 m_propertyScrollingList
->SetSelection(currentlySelected
);
202 // Find the wxListBox index corresponding to this property
203 int wxPropertyListView::FindListIndexForProperty(wxProperty
*property
)
205 int n
= m_propertyScrollingList
->GetCount();
206 for (int i
= 0; i
< n
; i
++)
208 if (property
== (wxProperty
*)m_propertyScrollingList
->wxListBox::GetClientData(i
))
214 wxString
wxPropertyListView::MakeNameValueString(wxString name
, wxString value
)
216 wxString
theString(name
);
219 int padWith
= nameWidth
- theString
.Length();
223 if (GetFlags() & wxPROP_SHOWVALUES
)
225 // Want to pad with spaces
226 theString
.Append( wxT(' '), padWith
);
233 // Select and show string representation in validator the given
234 // property. NULL resets to show no property.
235 bool wxPropertyListView::ShowProperty(wxProperty
*property
, bool select
)
237 if (m_currentProperty
)
239 EndShowingProperty(m_currentProperty
);
240 m_currentProperty
= NULL
;
243 m_valueList
->Clear();
244 m_valueText
->SetValue( wxT("") );
248 m_currentProperty
= property
;
249 BeginShowingProperty(property
);
253 int sel
= FindListIndexForProperty(property
);
255 m_propertyScrollingList
->SetSelection(sel
);
260 // Find appropriate validator and load property into value controls
261 bool wxPropertyListView::BeginShowingProperty(wxProperty
*property
)
263 m_currentValidator
= FindPropertyValidator(property
);
264 if (!m_currentValidator
)
267 if (!m_currentValidator
->IsKindOf(CLASSINFO(wxPropertyListValidator
)))
270 wxPropertyListValidator
*listValidator
= (wxPropertyListValidator
*)m_currentValidator
;
272 listValidator
->OnPrepareControls(property
, this, m_propertyWindow
);
273 DisplayProperty(property
);
277 // Find appropriate validator and unload property from value controls
278 bool wxPropertyListView::EndShowingProperty(wxProperty
*property
)
280 if (!m_currentValidator
)
283 RetrieveProperty(property
);
285 if (!m_currentValidator
->IsKindOf(CLASSINFO(wxPropertyListValidator
)))
288 wxPropertyListValidator
*listValidator
= (wxPropertyListValidator
*)m_currentValidator
;
290 listValidator
->OnClearControls(property
, this, m_propertyWindow
);
291 if (m_detailedEditing
)
293 listValidator
->OnClearDetailControls(property
, this, m_propertyWindow
);
294 m_detailedEditing
= FALSE
;
299 void wxPropertyListView::BeginDetailedEditing()
301 if (!m_currentValidator
)
303 if (!m_currentProperty
)
305 if (m_detailedEditing
)
307 if (!m_currentValidator
->IsKindOf(CLASSINFO(wxPropertyListValidator
)))
309 if (!m_currentProperty
->IsEnabled())
312 wxPropertyListValidator
*listValidator
= (wxPropertyListValidator
*)m_currentValidator
;
314 if (listValidator
->OnPrepareDetailControls(m_currentProperty
, this, m_propertyWindow
))
315 m_detailedEditing
= TRUE
;
318 void wxPropertyListView::EndDetailedEditing()
320 if (!m_currentValidator
)
322 if (!m_currentProperty
)
325 RetrieveProperty(m_currentProperty
);
327 if (!m_currentValidator
->IsKindOf(CLASSINFO(wxPropertyListValidator
)))
330 wxPropertyListValidator
*listValidator
= (wxPropertyListValidator
*)m_currentValidator
;
332 if (m_detailedEditing
)
334 listValidator
->OnClearDetailControls(m_currentProperty
, this, m_propertyWindow
);
335 m_detailedEditing
= FALSE
;
339 bool wxPropertyListView::DisplayProperty(wxProperty
*property
)
341 if (!m_currentValidator
)
344 if (((m_currentValidator
->GetFlags() & wxPROP_ALLOW_TEXT_EDITING
) == 0) || !property
->IsEnabled())
345 m_valueText
->SetEditable(FALSE
);
347 m_valueText
->SetEditable(TRUE
);
349 if (!m_currentValidator
->IsKindOf(CLASSINFO(wxPropertyListValidator
)))
352 wxPropertyListValidator
*listValidator
= (wxPropertyListValidator
*)m_currentValidator
;
354 listValidator
->OnDisplayValue(property
, this, m_propertyWindow
);
358 bool wxPropertyListView::RetrieveProperty(wxProperty
*property
)
360 if (!m_currentValidator
)
362 if (!property
->IsEnabled())
365 if (!m_currentValidator
->IsKindOf(CLASSINFO(wxPropertyListValidator
)))
368 wxPropertyListValidator
*listValidator
= (wxPropertyListValidator
*)m_currentValidator
;
370 if (listValidator
->OnCheckValue(property
, this, m_propertyWindow
))
372 if (listValidator
->OnRetrieveValue(property
, this, m_propertyWindow
))
374 UpdatePropertyDisplayInList(property
);
375 OnPropertyChanged(property
);
380 // Revert to old value
381 listValidator
->OnDisplayValue(property
, this, m_propertyWindow
);
387 bool wxPropertyListView::EditProperty(wxProperty
*WXUNUSED(property
))
392 // Called by the listbox callback
393 void wxPropertyListView::OnPropertySelect(wxCommandEvent
& WXUNUSED(event
))
395 int sel
= m_propertyScrollingList
->GetSelection();
398 wxProperty
*newSel
= (wxProperty
*)m_propertyScrollingList
->wxListBox::GetClientData(sel
);
399 if (newSel
&& newSel
!= m_currentProperty
)
401 ShowProperty(newSel
, FALSE
);
406 bool wxPropertyListView::CreateControls()
408 wxPanel
*panel
= (wxPanel
*)m_propertyWindow
;
410 wxSize
largeButtonSize( 70, 25 );
411 wxSize
smallButtonSize( 23, 23 );
419 wxFont guiFont
= wxSystemSettings::GetSystemFont(wxSYS_DEFAULT_GUI_FONT
);
423 wxTheFontList
->FindOrCreateFont(guiFont
.GetPointSize(), wxMODERN
,
424 wxNORMAL
, wxNORMAL
, FALSE
, _T("Courier New"));
426 wxFont
*boringFont
= wxTheFontList
->FindOrCreateFont(guiFont
.GetPointSize(), wxTELETYPE
, wxNORMAL
, wxNORMAL
);
429 // May need to be changed in future to eliminate clashes with app.
430 // WHAT WAS THIS FOR?
431 // panel->SetClientData((char *)this);
433 wxBoxSizer
*mainsizer
= new wxBoxSizer( wxVERTICAL
);
435 // top row with optional buttons and input line
437 wxBoxSizer
*topsizer
= new wxBoxSizer( wxHORIZONTAL
);
438 int buttonborder
= 3;
440 if (m_buttonFlags
& wxPROP_BUTTON_CHECK_CROSS
)
442 wxBitmap tickBitmap
= wxArtProvider::GetBitmap(wxART_TICK_MARK
);
443 wxBitmap crossBitmap
= wxArtProvider::GetBitmap(wxART_CROSS_MARK
);
445 if ( tickBitmap
.Ok() && crossBitmap
.Ok() )
447 m_confirmButton
= new wxBitmapButton(panel
, wxID_PROP_CHECK
, tickBitmap
, wxPoint(-1, -1), smallButtonSize
);
448 m_cancelButton
= new wxBitmapButton(panel
, wxID_PROP_CROSS
, crossBitmap
, wxPoint(-1, -1), smallButtonSize
);
452 m_confirmButton
= new wxButton(panel
, wxID_PROP_CHECK
, _T(":-)"), wxPoint(-1, -1), smallButtonSize
);
453 m_cancelButton
= new wxButton(panel
, wxID_PROP_CROSS
, _T("X"), wxPoint(-1, -1), smallButtonSize
);
456 topsizer
->Add( m_confirmButton
, 0, wxLEFT
|wxTOP
|wxBOTTOM
| wxEXPAND
, buttonborder
);
457 topsizer
->Add( m_cancelButton
, 0, wxLEFT
|wxTOP
|wxBOTTOM
| wxEXPAND
, buttonborder
);
460 m_valueText
= new wxPropertyTextEdit(this, panel
, wxID_PROP_TEXT
, _T(""),
461 wxPoint(-1, -1), wxSize(-1, smallButtonSize
.y
), wxPROCESS_ENTER
);
462 m_valueText
->Enable(FALSE
);
463 topsizer
->Add( m_valueText
, 1, wxALL
| wxEXPAND
, buttonborder
);
465 if (m_buttonFlags
& wxPROP_PULLDOWN
)
467 m_editButton
= new wxButton(panel
, wxID_PROP_EDIT
, _T("..."), wxPoint(-1, -1), smallButtonSize
);
468 m_editButton
->Enable(FALSE
);
469 topsizer
->Add( m_editButton
, 0, wxRIGHT
|wxTOP
|wxBOTTOM
| wxEXPAND
, buttonborder
);
472 mainsizer
->Add( topsizer
, 0, wxEXPAND
);
474 // middle section with two list boxes
476 m_middleSizer
= new wxBoxSizer( wxVERTICAL
);
478 m_valueList
= new wxListBox(panel
, wxID_PROP_VALUE_SELECT
, wxPoint(-1, -1), wxSize(-1, 60));
479 m_valueList
->Show(FALSE
);
481 m_propertyScrollingList
= new wxListBox(panel
, wxID_PROP_SELECT
, wxPoint(-1, -1), wxSize(100, 100));
482 m_propertyScrollingList
->SetFont(* boringFont
);
483 m_middleSizer
->Add( m_propertyScrollingList
, 1, wxALL
|wxEXPAND
, buttonborder
);
485 mainsizer
->Add( m_middleSizer
, 1, wxEXPAND
);
487 // bottom row with buttons
489 if ((m_buttonFlags
& wxPROP_BUTTON_OK
) ||
490 (m_buttonFlags
& wxPROP_BUTTON_CLOSE
) ||
491 (m_buttonFlags
& wxPROP_BUTTON_CANCEL
) ||
492 (m_buttonFlags
& wxPROP_BUTTON_HELP
))
494 wxBoxSizer
*bottomsizer
= new wxBoxSizer( wxHORIZONTAL
);
497 if (m_buttonFlags
& wxPROP_BUTTON_OK
)
499 m_windowCloseButton
= new wxButton(panel
, wxID_OK
, _("OK"), wxPoint(-1, -1), largeButtonSize
);
500 m_windowCloseButton
->SetDefault();
501 m_windowCloseButton
->SetFocus();
502 bottomsizer
->Add( m_windowCloseButton
, 0, wxALL
, buttonborder
);
504 else if (m_buttonFlags
& wxPROP_BUTTON_CLOSE
)
506 m_windowCloseButton
= new wxButton(panel
, wxID_OK
, _("Close"), wxPoint(-1, -1), largeButtonSize
);
507 bottomsizer
->Add( m_windowCloseButton
, 0, wxALL
, buttonborder
);
509 if (m_buttonFlags
& wxPROP_BUTTON_CANCEL
)
511 m_windowCancelButton
= new wxButton(panel
, wxID_CANCEL
, _("Cancel"), wxPoint(-1, -1), largeButtonSize
);
512 bottomsizer
->Add( m_windowCancelButton
, 0, wxALL
, buttonborder
);
514 if (m_buttonFlags
& wxPROP_BUTTON_HELP
)
516 m_windowHelpButton
= new wxButton(panel
, wxID_HELP
, _("Help"), wxPoint(-1, -1), largeButtonSize
);
517 bottomsizer
->Add( m_windowHelpButton
, 0, wxALL
, buttonborder
);
520 mainsizer
->Add( bottomsizer
, 0, wxALIGN_RIGHT
| wxEXPAND
);
523 panel
->SetSizer( mainsizer
);
528 void wxPropertyListView::ShowTextControl(bool show
)
531 m_valueText
->Show(show
);
534 void wxPropertyListView::ShowListBoxControl(bool show
)
536 if (!m_valueList
) return;
538 m_valueList
->Show(show
);
540 if (m_buttonFlags
& wxPROP_DYNAMIC_VALUE_FIELD
)
543 m_middleSizer
->Prepend( m_valueList
, 0, wxTOP
|wxLEFT
|wxRIGHT
| wxEXPAND
, 3 );
545 m_middleSizer
->Remove( (size_t) 0 );
547 m_propertyWindow
->Layout();
551 void wxPropertyListView::EnableCheck(bool show
)
554 m_confirmButton
->Enable(show
);
557 void wxPropertyListView::EnableCross(bool show
)
560 m_cancelButton
->Enable(show
);
563 bool wxPropertyListView::OnClose()
565 // Retrieve the value if any
566 wxCommandEvent event
;
573 void wxPropertyListView::OnValueListSelect(wxCommandEvent
& WXUNUSED(event
))
575 if (m_currentProperty
&& m_currentValidator
)
577 if (!m_currentValidator
->IsKindOf(CLASSINFO(wxPropertyListValidator
)))
580 wxPropertyListValidator
*listValidator
= (wxPropertyListValidator
*)m_currentValidator
;
582 listValidator
->OnValueListSelect(m_currentProperty
, this, m_propertyWindow
);
586 void wxPropertyListView::OnOk(wxCommandEvent
& event
)
588 // Retrieve the value if any
591 m_managedWindow
->Close(TRUE
);
592 sm_dialogCancelled
= FALSE
;
595 void wxPropertyListView::OnCancel(wxCommandEvent
& WXUNUSED(event
))
597 // SetReturnCode(wxID_CANCEL);
598 m_managedWindow
->Close(TRUE
);
599 sm_dialogCancelled
= TRUE
;
602 void wxPropertyListView::OnHelp(wxCommandEvent
& WXUNUSED(event
))
606 void wxPropertyListView::OnCheck(wxCommandEvent
& WXUNUSED(event
))
608 if (m_currentProperty
)
610 RetrieveProperty(m_currentProperty
);
614 void wxPropertyListView::OnCross(wxCommandEvent
& WXUNUSED(event
))
616 if (m_currentProperty
&& m_currentValidator
)
618 if (!m_currentValidator
->IsKindOf(CLASSINFO(wxPropertyListValidator
)))
621 wxPropertyListValidator
*listValidator
= (wxPropertyListValidator
*)m_currentValidator
;
623 // Revert to old value
624 listValidator
->OnDisplayValue(m_currentProperty
, this, m_propertyWindow
);
628 void wxPropertyListView::OnPropertyDoubleClick(wxCommandEvent
& WXUNUSED(event
))
630 if (m_currentProperty
&& m_currentValidator
)
632 if (!m_currentValidator
->IsKindOf(CLASSINFO(wxPropertyListValidator
)))
635 wxPropertyListValidator
*listValidator
= (wxPropertyListValidator
*)m_currentValidator
;
637 // Revert to old value
638 listValidator
->OnDoubleClick(m_currentProperty
, this, m_propertyWindow
);
642 void wxPropertyListView::OnEdit(wxCommandEvent
& WXUNUSED(event
))
644 if (m_currentProperty
&& m_currentValidator
)
646 if (!m_currentValidator
->IsKindOf(CLASSINFO(wxPropertyListValidator
)))
649 wxPropertyListValidator
*listValidator
= (wxPropertyListValidator
*)m_currentValidator
;
651 listValidator
->OnEdit(m_currentProperty
, this, m_propertyWindow
);
655 void wxPropertyListView::OnText(wxCommandEvent
& event
)
657 if (event
.GetEventType() == wxEVT_COMMAND_TEXT_ENTER
)
663 // ----------------------------------------------------------------------------
664 // Property dialog box
665 // ----------------------------------------------------------------------------
667 IMPLEMENT_DYNAMIC_CLASS(wxPropertyListDialog
, wxDialog
)
669 BEGIN_EVENT_TABLE(wxPropertyListDialog
, wxDialog
)
670 EVT_BUTTON(wxID_CANCEL
, wxPropertyListDialog::OnCancel
)
671 EVT_CLOSE(wxPropertyListDialog::OnCloseWindow
)
674 wxPropertyListDialog::wxPropertyListDialog(wxPropertyListView
*v
, wxWindow
*parent
,
675 const wxString
& title
, const wxPoint
& pos
,
676 const wxSize
& size
, long style
, const wxString
& name
):
677 wxDialog(parent
, -1, title
, pos
, size
, style
, name
)
680 m_view
->AssociatePanel( ((wxPanel
*)this) );
681 m_view
->SetManagedWindow(this);
685 void wxPropertyListDialog::OnCloseWindow(wxCloseEvent
& event
)
689 SetReturnCode(wxID_CANCEL
);
700 void wxPropertyListDialog::OnCancel(wxCommandEvent
& WXUNUSED(event
))
702 SetReturnCode(wxID_CANCEL
);
706 void wxPropertyListDialog::OnDefaultAction(wxControl
*WXUNUSED(item
))
709 if (item == m_view->GetPropertyScrollingList())
710 view->OnDoubleClick();
714 // Extend event processing to search the view's event table
715 bool wxPropertyListDialog::ProcessEvent(wxEvent
& event
)
717 if ( !m_view
|| ! m_view
->ProcessEvent(event
) )
718 return wxEvtHandler::ProcessEvent(event
);
723 // ----------------------------------------------------------------------------
725 // ----------------------------------------------------------------------------
727 IMPLEMENT_DYNAMIC_CLASS(wxPropertyListPanel
, wxPanel
)
729 BEGIN_EVENT_TABLE(wxPropertyListPanel
, wxPanel
)
730 EVT_SIZE(wxPropertyListPanel::OnSize
)
733 wxPropertyListPanel::~wxPropertyListPanel()
737 void wxPropertyListPanel::OnDefaultAction(wxControl
*WXUNUSED(item
))
740 if (item == view->GetPropertyScrollingList())
741 view->OnDoubleClick();
745 // Extend event processing to search the view's event table
746 bool wxPropertyListPanel::ProcessEvent(wxEvent
& event
)
748 if ( !m_view
|| ! m_view
->ProcessEvent(event
) )
749 return wxEvtHandler::ProcessEvent(event
);
754 void wxPropertyListPanel::OnSize(wxSizeEvent
& WXUNUSED(event
))
759 // ----------------------------------------------------------------------------
761 // ----------------------------------------------------------------------------
763 IMPLEMENT_DYNAMIC_CLASS(wxPropertyListFrame
, wxFrame
)
765 BEGIN_EVENT_TABLE(wxPropertyListFrame
, wxFrame
)
766 EVT_CLOSE(wxPropertyListFrame::OnCloseWindow
)
769 void wxPropertyListFrame::OnCloseWindow(wxCloseEvent
& event
)
774 m_propertyPanel
->SetView(NULL
);
785 wxPropertyListPanel
*wxPropertyListFrame::OnCreatePanel(wxFrame
*parent
, wxPropertyListView
*v
)
787 return new wxPropertyListPanel(v
, parent
);
790 bool wxPropertyListFrame::Initialize()
792 m_propertyPanel
= OnCreatePanel(this, m_view
);
795 m_view
->AssociatePanel(m_propertyPanel
);
796 m_view
->SetManagedWindow(this);
797 m_propertyPanel
->SetAutoLayout(TRUE
);
804 // ----------------------------------------------------------------------------
805 // Property list specific validator
806 // ----------------------------------------------------------------------------
808 IMPLEMENT_ABSTRACT_CLASS(wxPropertyListValidator
, wxPropertyValidator
)
810 bool wxPropertyListValidator::OnSelect(bool select
, wxProperty
*property
, wxPropertyListView
*view
, wxWindow
*parentWindow
)
812 // view->GetValueText()->Show(TRUE);
814 OnDisplayValue(property
, view
, parentWindow
);
819 bool wxPropertyListValidator::OnValueListSelect(wxProperty
*property
, wxPropertyListView
*view
, wxWindow
*WXUNUSED(parentWindow
))
821 wxString
s(view
->GetValueList()->GetStringSelection());
824 view
->GetValueText()->SetValue(s
);
825 view
->RetrieveProperty(property
);
830 bool wxPropertyListValidator::OnDisplayValue(wxProperty
*property
, wxPropertyListView
*view
, wxWindow
*WXUNUSED(parentWindow
))
832 // view->GetValueText()->Show(TRUE);
833 wxString
str(property
->GetValue().GetStringRepresentation());
835 view
->GetValueText()->SetValue(str
);
839 // Called when TICK is pressed or focus is lost or view wants to update
840 // the property list.
841 // Does the transferance from the property editing area to the property itself
842 bool wxPropertyListValidator::OnRetrieveValue(wxProperty
*WXUNUSED(property
), wxPropertyListView
*view
, wxWindow
*WXUNUSED(parentWindow
))
844 if (!view
->GetValueText())
849 void wxPropertyListValidator::OnEdit(wxProperty
*WXUNUSED(property
), wxPropertyListView
*view
, wxWindow
*WXUNUSED(parentWindow
))
851 if (view
->GetDetailedEditing())
852 view
->EndDetailedEditing();
854 view
->BeginDetailedEditing();
857 bool wxPropertyListValidator::OnClearControls(wxProperty
*WXUNUSED(property
), wxPropertyListView
*view
, wxWindow
*WXUNUSED(parentWindow
))
859 if (view
->GetConfirmButton())
860 view
->GetConfirmButton()->Enable(FALSE
);
861 if (view
->GetCancelButton())
862 view
->GetCancelButton()->Enable(FALSE
);
863 if (view
->GetEditButton())
864 view
->GetEditButton()->Enable(FALSE
);
868 // ----------------------------------------------------------------------------
869 // Default validators
870 // ----------------------------------------------------------------------------
872 IMPLEMENT_DYNAMIC_CLASS(wxRealListValidator
, wxPropertyListValidator
)
875 /// Real number validator
877 bool wxRealListValidator::OnCheckValue(wxProperty
*WXUNUSED(property
), wxPropertyListView
*view
, wxWindow
*parentWindow
)
879 if (m_realMin
== 0.0 && m_realMax
== 0.0)
882 if (!view
->GetValueText())
884 wxString
value(view
->GetValueText()->GetValue());
887 if (!StringToFloat(WXSTRINGCAST value
, &val
))
890 wxSprintf(buf
, wxT("Value %s is not a valid real number!"), value
.GetData());
891 wxMessageBox(buf
, wxT("Property value error"), wxOK
| wxICON_EXCLAMATION
, parentWindow
);
895 if (val
< m_realMin
|| val
> m_realMax
)
898 wxSprintf(buf
, wxT("Value must be a real number between %.2f and %.2f!"), m_realMin
, m_realMax
);
899 wxMessageBox(buf
, wxT("Property value error"), wxOK
| wxICON_EXCLAMATION
, parentWindow
);
905 // Called when TICK is pressed or focus is lost or view wants to update
906 // the property list.
907 // Does the transferance from the property editing area to the property itself
908 bool wxRealListValidator::OnRetrieveValue(wxProperty
*property
, wxPropertyListView
*view
, wxWindow
*WXUNUSED(parentWindow
))
910 if (!view
->GetValueText())
913 if (wxStrlen(view
->GetValueText()->GetValue()) == 0)
916 wxString
value(view
->GetValueText()->GetValue());
917 float f
= (float)wxAtof(value
.GetData());
918 property
->GetValue() = f
;
922 bool wxRealListValidator::OnPrepareControls(wxProperty
*WXUNUSED(property
), wxPropertyListView
*view
, wxWindow
*WXUNUSED(parentWindow
))
924 if (view
->GetConfirmButton())
925 view
->GetConfirmButton()->Enable(TRUE
);
926 if (view
->GetCancelButton())
927 view
->GetCancelButton()->Enable(TRUE
);
928 if (view
->GetEditButton())
929 view
->GetEditButton()->Enable(FALSE
);
930 if (view
->GetValueText())
931 view
->GetValueText()->Enable(TRUE
);
936 /// Integer validator
938 IMPLEMENT_DYNAMIC_CLASS(wxIntegerListValidator
, wxPropertyListValidator
)
940 bool wxIntegerListValidator::OnCheckValue(wxProperty
*WXUNUSED(property
), wxPropertyListView
*view
, wxWindow
*parentWindow
)
942 if (m_integerMin
== 0 && m_integerMax
== 0)
945 if (!view
->GetValueText())
947 wxString
value(view
->GetValueText()->GetValue());
950 if (!StringToLong(WXSTRINGCAST value
, &val
))
953 wxSprintf(buf
, wxT("Value %s is not a valid integer!"), value
.GetData());
954 wxMessageBox(buf
, wxT("Property value error"), wxOK
| wxICON_EXCLAMATION
, parentWindow
);
957 if (val
< m_integerMin
|| val
> m_integerMax
)
960 wxSprintf(buf
, wxT("Value must be an integer between %ld and %ld!"), m_integerMin
, m_integerMax
);
961 wxMessageBox(buf
, wxT("Property value error"), wxOK
| wxICON_EXCLAMATION
, parentWindow
);
967 // Called when TICK is pressed or focus is lost or view wants to update
968 // the property list.
969 // Does the transferance from the property editing area to the property itself
970 bool wxIntegerListValidator::OnRetrieveValue(wxProperty
*property
, wxPropertyListView
*view
, wxWindow
*WXUNUSED(parentWindow
))
972 if (!view
->GetValueText())
975 if (wxStrlen(view
->GetValueText()->GetValue()) == 0)
978 wxString
value(view
->GetValueText()->GetValue());
979 long val
= (long)wxAtoi(value
.GetData());
980 property
->GetValue() = (long)val
;
984 bool wxIntegerListValidator::OnPrepareControls(wxProperty
*WXUNUSED(property
), wxPropertyListView
*view
, wxWindow
*WXUNUSED(parentWindow
))
986 if (view
->GetConfirmButton())
987 view
->GetConfirmButton()->Enable(TRUE
);
988 if (view
->GetCancelButton())
989 view
->GetCancelButton()->Enable(TRUE
);
990 if (view
->GetEditButton())
991 view
->GetEditButton()->Enable(FALSE
);
992 if (view
->GetValueText())
993 view
->GetValueText()->Enable(TRUE
);
998 /// boolean validator
1000 IMPLEMENT_DYNAMIC_CLASS(wxBoolListValidator
, wxPropertyListValidator
)
1002 bool wxBoolListValidator::OnCheckValue(wxProperty
*WXUNUSED(property
), wxPropertyListView
*view
, wxWindow
*parentWindow
)
1004 if (!view
->GetValueText())
1006 wxString
value(view
->GetValueText()->GetValue());
1007 if (value
!= wxT("True") && value
!= wxT("False"))
1009 wxMessageBox(wxT("Value must be True or False!"), wxT("Property value error"), wxOK
| wxICON_EXCLAMATION
, parentWindow
);
1015 // Called when TICK is pressed or focus is lost or view wants to update
1016 // the property list.
1017 // Does the transferance from the property editing area to the property itself
1018 bool wxBoolListValidator::OnRetrieveValue(wxProperty
*property
, wxPropertyListView
*view
, wxWindow
*WXUNUSED(parentWindow
))
1020 if (!view
->GetValueText())
1023 if (wxStrlen(view
->GetValueText()->GetValue()) == 0)
1026 wxString
value(view
->GetValueText()->GetValue());
1027 bool boolValue
= FALSE
;
1028 if (value
== wxT("True"))
1032 property
->GetValue() = (bool)boolValue
;
1036 bool wxBoolListValidator::OnDisplayValue(wxProperty
*property
, wxPropertyListView
*view
, wxWindow
*WXUNUSED(parentWindow
))
1038 if (!view
->GetValueText())
1040 wxString
str(property
->GetValue().GetStringRepresentation());
1042 view
->GetValueText()->SetValue(str
);
1044 if (view
->GetValueList()->IsShown())
1046 view
->GetValueList()->SetStringSelection(str
);
1051 bool wxBoolListValidator::OnPrepareControls(wxProperty
*WXUNUSED(property
), wxPropertyListView
*view
, wxWindow
*WXUNUSED(parentWindow
))
1053 if (view
->GetConfirmButton())
1054 view
->GetConfirmButton()->Enable(FALSE
);
1055 if (view
->GetCancelButton())
1056 view
->GetCancelButton()->Enable(FALSE
);
1057 if (view
->GetEditButton())
1058 view
->GetEditButton()->Enable(TRUE
);
1059 if (view
->GetValueText())
1060 view
->GetValueText()->Enable(FALSE
);
1064 bool wxBoolListValidator::OnPrepareDetailControls(wxProperty
*WXUNUSED(property
), wxPropertyListView
*view
, wxWindow
*WXUNUSED(parentWindow
))
1066 if (view
->GetValueList())
1068 view
->ShowListBoxControl(TRUE
);
1069 view
->GetValueList()->Enable(TRUE
);
1071 view
->GetValueList()->Append(wxT("True"));
1072 view
->GetValueList()->Append(wxT("False"));
1073 wxChar
*currentString
= copystring(view
->GetValueText()->GetValue());
1074 view
->GetValueList()->SetStringSelection(currentString
);
1075 delete[] currentString
;
1080 bool wxBoolListValidator::OnClearDetailControls(wxProperty
*WXUNUSED(property
), wxPropertyListView
*view
, wxWindow
*WXUNUSED(parentWindow
))
1082 if (view
->GetValueList())
1084 view
->GetValueList()->Clear();
1085 view
->ShowListBoxControl(FALSE
);
1086 view
->GetValueList()->Enable(FALSE
);
1091 // Called when the property is double clicked. Extra functionality can be provided,
1092 // cycling through possible values.
1093 bool wxBoolListValidator::OnDoubleClick(wxProperty
*property
, wxPropertyListView
*view
, wxWindow
*WXUNUSED(parentWindow
))
1095 if (!view
->GetValueText())
1097 if (property
->GetValue().BoolValue())
1098 property
->GetValue() = (bool)FALSE
;
1100 property
->GetValue() = (bool)TRUE
;
1101 view
->DisplayProperty(property
);
1102 view
->UpdatePropertyDisplayInList(property
);
1103 view
->OnPropertyChanged(property
);
1108 /// String validator
1110 IMPLEMENT_DYNAMIC_CLASS(wxStringListValidator
, wxPropertyListValidator
)
1112 wxStringListValidator::wxStringListValidator(wxStringList
*list
, long flags
):
1113 wxPropertyListValidator(flags
)
1116 // If no constraint, we just allow the string to be edited.
1117 if (!m_strings
&& ((m_validatorFlags
& wxPROP_ALLOW_TEXT_EDITING
) == 0))
1118 m_validatorFlags
|= wxPROP_ALLOW_TEXT_EDITING
;
1121 bool wxStringListValidator::OnCheckValue(wxProperty
*WXUNUSED(property
), wxPropertyListView
*view
, wxWindow
*parentWindow
)
1126 if (!view
->GetValueText())
1128 wxString
value(view
->GetValueText()->GetValue());
1130 if (!m_strings
->Member(value
.GetData()))
1132 wxString
str( wxT("Value ") );
1133 str
+= value
.GetData();
1134 str
+= wxT(" is not valid.");
1135 wxMessageBox( str
.GetData(), wxT("Property value error"), wxOK
| wxICON_EXCLAMATION
, parentWindow
);
1141 // Called when TICK is pressed or focus is lost or view wants to update
1142 // the property list.
1143 // Does the transferance from the property editing area to the property itself
1144 bool wxStringListValidator::OnRetrieveValue(wxProperty
*property
, wxPropertyListView
*view
, wxWindow
*WXUNUSED(parentWindow
))
1146 if (!view
->GetValueText())
1148 wxString
value(view
->GetValueText()->GetValue());
1149 property
->GetValue() = value
;
1153 // Called when TICK is pressed or focus is lost or view wants to update
1154 // the property list.
1155 // Does the transferance from the property editing area to the property itself
1156 bool wxStringListValidator::OnDisplayValue(wxProperty
*property
, wxPropertyListView
*view
, wxWindow
*WXUNUSED(parentWindow
))
1158 if (!view
->GetValueText())
1160 wxString
str(property
->GetValue().GetStringRepresentation());
1161 view
->GetValueText()->SetValue(str
);
1162 if (m_strings
&& view
->GetValueList() && view
->GetValueList()->IsShown() && view
->GetValueList()->GetCount() > 0)
1164 view
->GetValueList()->SetStringSelection(str
);
1169 bool wxStringListValidator::OnPrepareControls(wxProperty
*WXUNUSED(property
), wxPropertyListView
*view
, wxWindow
*WXUNUSED(parentWindow
))
1174 if (view
->GetEditButton())
1175 view
->GetEditButton()->Enable(FALSE
);
1176 if (view
->GetConfirmButton())
1177 view
->GetConfirmButton()->Enable(TRUE
);
1178 if (view
->GetCancelButton())
1179 view
->GetCancelButton()->Enable(TRUE
);
1180 if (view
->GetValueText())
1181 view
->GetValueText()->Enable(TRUE
);
1186 if (view
->GetValueText())
1187 view
->GetValueText()->Enable(FALSE
);
1189 if (view
->GetEditButton())
1190 view
->GetEditButton()->Enable(TRUE
);
1192 if (view
->GetConfirmButton())
1193 view
->GetConfirmButton()->Enable(FALSE
);
1194 if (view
->GetCancelButton())
1195 view
->GetCancelButton()->Enable(FALSE
);
1199 bool wxStringListValidator::OnPrepareDetailControls( wxProperty
*property
,
1200 wxPropertyListView
*view
,
1201 wxWindow
*WXUNUSED(parentWindow
) )
1203 if (view
->GetValueList())
1205 view
->ShowListBoxControl(TRUE
);
1206 view
->GetValueList()->Enable(TRUE
);
1207 wxStringList::Node
*node
= m_strings
->GetFirst();
1210 wxChar
*s
= node
->GetData();
1211 view
->GetValueList()->Append(s
);
1212 node
= node
->GetNext();
1214 wxChar
*currentString
= property
->GetValue().StringValue();
1215 view
->GetValueList()->SetStringSelection(currentString
);
1220 bool wxStringListValidator::OnClearDetailControls(wxProperty
*WXUNUSED(property
), wxPropertyListView
*view
, wxWindow
*WXUNUSED(parentWindow
))
1227 if (view
->GetValueList())
1229 view
->GetValueList()->Clear();
1230 view
->ShowListBoxControl(FALSE
);
1231 view
->GetValueList()->Enable(FALSE
);
1236 // Called when the property is double clicked. Extra functionality can be provided,
1237 // cycling through possible values.
1238 bool wxStringListValidator::OnDoubleClick( wxProperty
*property
,
1239 wxPropertyListView
*view
,
1240 wxWindow
*WXUNUSED(parentWindow
) )
1242 if (!view
->GetValueText())
1247 wxStringList::Node
*node
= m_strings
->GetFirst();
1248 wxChar
*currentString
= property
->GetValue().StringValue();
1251 wxChar
*s
= node
->GetData();
1252 if (wxStrcmp(s
, currentString
) == 0)
1254 wxChar
*nextString
= NULL
;
1255 if (node
->GetNext())
1256 nextString
= node
->GetNext()->GetData();
1258 nextString
= m_strings
->GetFirst()->GetData();
1259 property
->GetValue() = wxString(nextString
);
1260 view
->DisplayProperty(property
);
1261 view
->UpdatePropertyDisplayInList(property
);
1262 view
->OnPropertyChanged(property
);
1265 else node
= node
->GetNext();
1271 /// Filename validator
1273 IMPLEMENT_DYNAMIC_CLASS(wxFilenameListValidator
, wxPropertyListValidator
)
1275 wxFilenameListValidator::wxFilenameListValidator(wxString message
, wxString wildcard
, long flags
):
1276 wxPropertyListValidator(flags
), m_filenameWildCard(wildcard
), m_filenameMessage(message
)
1280 wxFilenameListValidator::~wxFilenameListValidator()
1284 bool wxFilenameListValidator::OnCheckValue(wxProperty
*WXUNUSED(property
), wxPropertyListView
*WXUNUSED(view
), wxWindow
*WXUNUSED(parentWindow
))
1289 // Called when TICK is pressed or focus is lost or view wants to update
1290 // the property list.
1291 // Does the transferance from the property editing area to the property itself
1292 bool wxFilenameListValidator::OnRetrieveValue(wxProperty
*property
, wxPropertyListView
*view
, wxWindow
*WXUNUSED(parentWindow
))
1294 if (!view
->GetValueText())
1296 wxString
value(view
->GetValueText()->GetValue());
1297 property
->GetValue() = value
;
1301 // Called when TICK is pressed or focus is lost or view wants to update
1302 // the property list.
1303 // Does the transferance from the property editing area to the property itself
1304 bool wxFilenameListValidator::OnDisplayValue(wxProperty
*property
, wxPropertyListView
*view
, wxWindow
*WXUNUSED(parentWindow
))
1306 if (!view
->GetValueText())
1308 wxString
str(property
->GetValue().GetStringRepresentation());
1309 view
->GetValueText()->SetValue(str
);
1313 // Called when the property is double clicked. Extra functionality can be provided,
1314 // cycling through possible values.
1315 bool wxFilenameListValidator::OnDoubleClick(wxProperty
*property
, wxPropertyListView
*view
, wxWindow
*parentWindow
)
1317 if (!view
->GetValueText())
1319 OnEdit(property
, view
, parentWindow
);
1323 bool wxFilenameListValidator::OnPrepareControls(wxProperty
*WXUNUSED(property
), wxPropertyListView
*view
, wxWindow
*WXUNUSED(parentWindow
))
1325 if (view
->GetConfirmButton())
1326 view
->GetConfirmButton()->Enable(TRUE
);
1327 if (view
->GetCancelButton())
1328 view
->GetCancelButton()->Enable(TRUE
);
1329 if (view
->GetEditButton())
1330 view
->GetEditButton()->Enable(TRUE
);
1331 if (view
->GetValueText())
1332 view
->GetValueText()->Enable((GetFlags() & wxPROP_ALLOW_TEXT_EDITING
) == wxPROP_ALLOW_TEXT_EDITING
);
1336 void wxFilenameListValidator::OnEdit(wxProperty
*property
, wxPropertyListView
*view
, wxWindow
*parentWindow
)
1338 if (!view
->GetValueText())
1341 wxString s
= wxFileSelector(
1342 m_filenameMessage
.GetData(),
1343 wxPathOnly(property
->GetValue().StringValue()),
1344 wxFileNameFromPath(property
->GetValue().StringValue()),
1346 m_filenameWildCard
.GetData(),
1351 property
->GetValue() = s
;
1352 view
->DisplayProperty(property
);
1353 view
->UpdatePropertyDisplayInList(property
);
1354 view
->OnPropertyChanged(property
);
1359 /// Colour validator
1361 IMPLEMENT_DYNAMIC_CLASS(wxColourListValidator
, wxPropertyListValidator
)
1363 wxColourListValidator::wxColourListValidator(long flags
):
1364 wxPropertyListValidator(flags
)
1368 wxColourListValidator::~wxColourListValidator()
1372 bool wxColourListValidator::OnCheckValue(wxProperty
*WXUNUSED(property
), wxPropertyListView
*WXUNUSED(view
), wxWindow
*WXUNUSED(parentWindow
))
1377 // Called when TICK is pressed or focus is lost or view wants to update
1378 // the property list.
1379 // Does the transferance from the property editing area to the property itself
1380 bool wxColourListValidator::OnRetrieveValue(wxProperty
*property
, wxPropertyListView
*view
, wxWindow
*WXUNUSED(parentWindow
))
1382 if (!view
->GetValueText())
1384 wxString
value(view
->GetValueText()->GetValue());
1386 property
->GetValue() = value
;
1390 // Called when TICK is pressed or focus is lost or view wants to update
1391 // the property list.
1392 // Does the transferance from the property editing area to the property itself
1393 bool wxColourListValidator::OnDisplayValue(wxProperty
*property
, wxPropertyListView
*view
, wxWindow
*WXUNUSED(parentWindow
))
1395 if (!view
->GetValueText())
1397 wxString
str(property
->GetValue().GetStringRepresentation());
1398 view
->GetValueText()->SetValue(str
);
1402 // Called when the property is double clicked. Extra functionality can be provided,
1403 // cycling through possible values.
1404 bool wxColourListValidator::OnDoubleClick(wxProperty
*property
, wxPropertyListView
*view
, wxWindow
*parentWindow
)
1406 if (!view
->GetValueText())
1408 OnEdit(property
, view
, parentWindow
);
1412 bool wxColourListValidator::OnPrepareControls(wxProperty
*WXUNUSED(property
), wxPropertyListView
*view
, wxWindow
*WXUNUSED(parentWindow
))
1414 if (view
->GetConfirmButton())
1415 view
->GetConfirmButton()->Enable(TRUE
);
1416 if (view
->GetCancelButton())
1417 view
->GetCancelButton()->Enable(TRUE
);
1418 if (view
->GetEditButton())
1419 view
->GetEditButton()->Enable(TRUE
);
1420 if (view
->GetValueText())
1421 view
->GetValueText()->Enable((GetFlags() & wxPROP_ALLOW_TEXT_EDITING
) == wxPROP_ALLOW_TEXT_EDITING
);
1425 void wxColourListValidator::OnEdit(wxProperty
*property
, wxPropertyListView
*view
, wxWindow
*parentWindow
)
1427 if (!view
->GetValueText())
1430 wxChar
*s
= property
->GetValue().StringValue();
1437 g
= wxHexToDec(s
+2);
1438 b
= wxHexToDec(s
+4);
1441 wxColour
col(r
,g
,b
);
1444 data
.SetChooseFull(TRUE
);
1445 data
.SetColour(col
);
1447 for (int i
= 0; i
< 16; i
++)
1449 wxColour
colour(i
*16, i
*16, i
*16);
1450 data
.SetCustomColour(i
, colour
);
1453 wxColourDialog
dialog(parentWindow
, &data
);
1454 if (dialog
.ShowModal() != wxID_CANCEL
)
1456 wxColourData retData
= dialog
.GetColourData();
1457 col
= retData
.GetColour();
1460 wxDecToHex(col
.Red(), buf
);
1461 wxDecToHex(col
.Green(), buf
+2);
1462 wxDecToHex(col
.Blue(), buf
+4);
1464 property
->GetValue() = wxString(buf
);
1465 view
->DisplayProperty(property
);
1466 view
->UpdatePropertyDisplayInList(property
);
1467 view
->OnPropertyChanged(property
);
1472 /// List of strings validator. For this we need more user interface than
1473 /// we get with a property list; so create a new dialog for editing the list.
1475 IMPLEMENT_DYNAMIC_CLASS(wxListOfStringsListValidator
, wxPropertyListValidator
)
1477 wxListOfStringsListValidator::wxListOfStringsListValidator(long flags
):
1478 wxPropertyListValidator(flags
)
1482 bool wxListOfStringsListValidator::OnCheckValue(wxProperty
*WXUNUSED(property
), wxPropertyListView
*WXUNUSED(view
), wxWindow
*WXUNUSED(parentWindow
))
1484 // No constraints for an arbitrary, user-editable list of strings.
1488 // Called when TICK is pressed or focus is lost or view wants to update
1489 // the property list.
1490 // Does the transferance from the property editing area to the property itself.
1491 // In this case, the user cannot directly edit the string list.
1492 bool wxListOfStringsListValidator::OnRetrieveValue(wxProperty
*WXUNUSED(property
), wxPropertyListView
*WXUNUSED(view
), wxWindow
*WXUNUSED(parentWindow
))
1497 bool wxListOfStringsListValidator::OnDisplayValue(wxProperty
*property
, wxPropertyListView
*view
, wxWindow
*WXUNUSED(parentWindow
))
1499 if (!view
->GetValueText())
1501 wxString
str(property
->GetValue().GetStringRepresentation());
1502 view
->GetValueText()->SetValue(str
);
1506 bool wxListOfStringsListValidator::OnPrepareControls(wxProperty
*WXUNUSED(property
), wxPropertyListView
*view
, wxWindow
*WXUNUSED(parentWindow
))
1508 if (view
->GetEditButton())
1509 view
->GetEditButton()->Enable(TRUE
);
1510 if (view
->GetValueText())
1511 view
->GetValueText()->Enable(FALSE
);
1513 if (view
->GetConfirmButton())
1514 view
->GetConfirmButton()->Enable(FALSE
);
1515 if (view
->GetCancelButton())
1516 view
->GetCancelButton()->Enable(FALSE
);
1520 // Called when the property is double clicked. Extra functionality can be provided,
1521 // cycling through possible values.
1522 bool wxListOfStringsListValidator::OnDoubleClick(wxProperty
*property
, wxPropertyListView
*view
, wxWindow
*parentWindow
)
1524 OnEdit(property
, view
, parentWindow
);
1528 void wxListOfStringsListValidator::OnEdit( wxProperty
*property
,
1529 wxPropertyListView
*view
,
1530 wxWindow
*parentWindow
)
1532 // Convert property value to a list of strings for editing
1533 wxStringList
*stringList
= new wxStringList
;
1535 wxPropertyValue
*expr
= property
->GetValue().GetFirst();
1538 wxChar
*s
= expr
->StringValue();
1541 expr
= expr
->GetNext();
1544 wxString
title(wxT("Editing "));
1545 title
+= property
->GetName();
1547 if (EditStringList(parentWindow
, stringList
, title
.GetData()))
1549 wxPropertyValue
& oldValue
= property
->GetValue();
1550 oldValue
.ClearList();
1551 wxStringList::Node
*node
= stringList
->GetFirst();
1554 wxChar
*s
= node
->GetData();
1555 oldValue
.Append(new wxPropertyValue(s
));
1557 node
= node
->GetNext();
1560 view
->DisplayProperty(property
);
1561 view
->UpdatePropertyDisplayInList(property
);
1562 view
->OnPropertyChanged(property
);
1567 class wxPropertyStringListEditorDialog
: public wxDialog
1570 wxPropertyStringListEditorDialog(wxWindow
*parent
, const wxString
& title
,
1571 const wxPoint
& pos
= wxDefaultPosition
, const wxSize
& size
= wxDefaultSize
,
1572 long windowStyle
= wxDEFAULT_DIALOG_STYLE
, const wxString
& name
= wxT("stringEditorDialogBox")):
1573 wxDialog(parent
, -1, title
, pos
, size
, windowStyle
, name
)
1575 m_stringList
= NULL
;
1576 m_stringText
= NULL
;
1578 sm_dialogCancelled
= FALSE
;
1579 m_currentSelection
= -1;
1581 ~wxPropertyStringListEditorDialog(void) {}
1582 void OnCloseWindow(wxCloseEvent
& event
);
1583 void SaveCurrentSelection(void);
1584 void ShowCurrentSelection(void);
1586 void OnOK(wxCommandEvent
& event
);
1587 void OnCancel(wxCommandEvent
& event
);
1588 void OnAdd(wxCommandEvent
& event
);
1589 void OnDelete(wxCommandEvent
& event
);
1590 void OnStrings(wxCommandEvent
& event
);
1591 void OnText(wxCommandEvent
& event
);
1594 wxStringList
* m_stringList
;
1595 wxListBox
* m_listBox
;
1596 wxTextCtrl
* m_stringText
;
1597 static bool sm_dialogCancelled
;
1598 int m_currentSelection
;
1599 DECLARE_EVENT_TABLE()
1602 #define wxID_PROP_SL_ADD 3000
1603 #define wxID_PROP_SL_DELETE 3001
1604 #define wxID_PROP_SL_STRINGS 3002
1605 #define wxID_PROP_SL_TEXT 3003
1607 BEGIN_EVENT_TABLE(wxPropertyStringListEditorDialog
, wxDialog
)
1608 EVT_BUTTON(wxID_OK
, wxPropertyStringListEditorDialog::OnOK
)
1609 EVT_BUTTON(wxID_CANCEL
, wxPropertyStringListEditorDialog::OnCancel
)
1610 EVT_BUTTON(wxID_PROP_SL_ADD
, wxPropertyStringListEditorDialog::OnAdd
)
1611 EVT_BUTTON(wxID_PROP_SL_DELETE
, wxPropertyStringListEditorDialog::OnDelete
)
1612 EVT_LISTBOX(wxID_PROP_SL_STRINGS
, wxPropertyStringListEditorDialog::OnStrings
)
1613 EVT_TEXT_ENTER(wxID_PROP_SL_TEXT
, wxPropertyStringListEditorDialog::OnText
)
1614 EVT_CLOSE(wxPropertyStringListEditorDialog::OnCloseWindow
)
1617 class wxPropertyStringListEditorText
: public wxTextCtrl
1620 wxPropertyStringListEditorText(wxWindow
*parent
, wxWindowID id
, const wxString
& val
,
1621 const wxPoint
& pos
= wxDefaultPosition
, const wxSize
& size
= wxDefaultSize
,
1622 long windowStyle
= 0, const wxString
& name
= wxT("text")):
1623 wxTextCtrl(parent
, id
, val
, pos
, size
, windowStyle
, wxDefaultValidator
, name
)
1628 wxPropertyStringListEditorDialog
*dialog
= (wxPropertyStringListEditorDialog
*)GetParent();
1629 dialog
->SaveCurrentSelection();
1633 bool wxPropertyStringListEditorDialog::sm_dialogCancelled
= FALSE
;
1635 // Edit the string list.
1636 bool wxListOfStringsListValidator::EditStringList(wxWindow
*parent
, wxStringList
*stringList
, const wxChar
*title
)
1638 int largeButtonWidth
= 60;
1639 int largeButtonHeight
= 25;
1641 wxBeginBusyCursor();
1642 wxPropertyStringListEditorDialog
*dialog
= new wxPropertyStringListEditorDialog(parent
,
1643 title
, wxPoint(10, 10), wxSize(400, 400), wxDEFAULT_DIALOG_STYLE
|wxDIALOG_MODAL
);
1645 dialog
->m_stringList
= stringList
;
1647 dialog
->m_listBox
= new wxListBox(dialog
, wxID_PROP_SL_STRINGS
,
1648 wxPoint(-1, -1), wxSize(-1, -1), 0, NULL
, wxLB_SINGLE
);
1650 dialog
->m_stringText
= new wxPropertyStringListEditorText(dialog
,
1651 wxID_PROP_SL_TEXT
, wxT(""), wxPoint(5, 240),
1652 wxSize(300, -1), wxPROCESS_ENTER
);
1653 dialog
->m_stringText
->Enable(FALSE
);
1655 wxButton
*addButton
= new wxButton(dialog
, wxID_PROP_SL_ADD
, wxT("Add"), wxPoint(-1, -1), wxSize(largeButtonWidth
, largeButtonHeight
));
1656 wxButton
*deleteButton
= new wxButton(dialog
, wxID_PROP_SL_DELETE
, wxT("Delete"), wxPoint(-1, -1), wxSize(largeButtonWidth
, largeButtonHeight
));
1657 wxButton
*cancelButton
= new wxButton(dialog
, wxID_CANCEL
, wxT("Cancel"), wxPoint(-1, -1), wxSize(largeButtonWidth
, largeButtonHeight
));
1658 wxButton
*okButton
= new wxButton(dialog
, wxID_OK
, wxT("OK"), wxPoint(-1, -1), wxSize(largeButtonWidth
, largeButtonHeight
));
1661 okButton
->SetDefault();
1664 wxLayoutConstraints
*c
= new wxLayoutConstraints
;
1666 c
->top
.SameAs (dialog
, wxTop
, 2);
1667 c
->left
.SameAs (dialog
, wxLeft
, 2);
1668 c
->right
.SameAs (dialog
, wxRight
, 2);
1669 c
->bottom
.SameAs (dialog
->m_stringText
, wxTop
, 2);
1670 dialog
->m_listBox
->SetConstraints(c
);
1672 c
= new wxLayoutConstraints
;
1673 c
->left
.SameAs (dialog
, wxLeft
, 2);
1674 c
->right
.SameAs (dialog
, wxRight
, 2);
1675 c
->bottom
.SameAs (addButton
, wxTop
, 2);
1677 dialog
->m_stringText
->SetConstraints(c
);
1679 c
= new wxLayoutConstraints
;
1680 c
->bottom
.SameAs (dialog
, wxBottom
, 2);
1681 c
->left
.SameAs (dialog
, wxLeft
, 2);
1684 addButton
->SetConstraints(c
);
1686 c
= new wxLayoutConstraints
;
1687 c
->bottom
.SameAs (dialog
, wxBottom
, 2);
1688 c
->left
.SameAs (addButton
, wxRight
, 2);
1691 deleteButton
->SetConstraints(c
);
1693 c
= new wxLayoutConstraints
;
1694 c
->bottom
.SameAs (dialog
, wxBottom
, 2);
1695 c
->right
.SameAs (dialog
, wxRight
, 2);
1698 cancelButton
->SetConstraints(c
);
1700 c
= new wxLayoutConstraints
;
1701 c
->bottom
.SameAs (dialog
, wxBottom
, 2);
1702 c
->right
.SameAs (cancelButton
, wxLeft
, 2);
1705 okButton
->SetConstraints(c
);
1707 wxStringList::Node
*node
= stringList
->GetFirst();
1710 wxChar
*str
= node
->GetData();
1711 // Save node as client data for each listbox item
1712 dialog
->m_listBox
->Append(str
, (wxChar
*)node
);
1713 node
= node
->GetNext();
1716 dialog
->SetClientSize(310, 305);
1719 dialog
->Centre(wxBOTH
);
1721 if (dialog
->ShowModal() == wxID_CANCEL
)
1728 * String list editor callbacks
1732 void wxPropertyStringListEditorDialog::OnStrings(wxCommandEvent
& WXUNUSED(event
))
1734 int sel
= m_listBox
->GetSelection();
1737 m_currentSelection
= sel
;
1739 ShowCurrentSelection();
1743 void wxPropertyStringListEditorDialog::OnDelete(wxCommandEvent
& WXUNUSED(event
))
1745 int sel
= m_listBox
->GetSelection();
1749 wxNode
*node
= (wxNode
*)m_listBox
->wxListBox::GetClientData(sel
);
1753 m_listBox
->Delete(sel
);
1754 delete[] (wxChar
*)node
->GetData();
1756 m_currentSelection
= -1;
1757 m_stringText
->SetValue(_T(""));
1760 void wxPropertyStringListEditorDialog::OnAdd(wxCommandEvent
& WXUNUSED(event
))
1762 SaveCurrentSelection();
1764 wxString initialText
;
1765 wxNode
*node
= m_stringList
->Add(initialText
);
1766 m_listBox
->Append(initialText
, (void *)node
);
1767 m_currentSelection
= m_stringList
->GetCount() - 1;
1768 m_listBox
->SetSelection(m_currentSelection
);
1769 ShowCurrentSelection();
1770 m_stringText
->SetFocus();
1773 void wxPropertyStringListEditorDialog::OnOK(wxCommandEvent
& WXUNUSED(event
))
1775 SaveCurrentSelection();
1781 void wxPropertyStringListEditorDialog::OnCancel(wxCommandEvent
& WXUNUSED(event
))
1783 sm_dialogCancelled
= TRUE
;
1784 EndModal(wxID_CANCEL
);
1789 void wxPropertyStringListEditorDialog::OnText(wxCommandEvent
& event
)
1791 if (event
.GetEventType() == wxEVT_COMMAND_TEXT_ENTER
)
1793 SaveCurrentSelection();
1798 wxPropertyStringListEditorDialog::OnCloseWindow(wxCloseEvent
& WXUNUSED(event
))
1800 SaveCurrentSelection();
1805 void wxPropertyStringListEditorDialog::SaveCurrentSelection()
1807 if (m_currentSelection
== -1)
1810 wxNode
*node
= (wxNode
*)m_listBox
->wxListBox::GetClientData(m_currentSelection
);
1814 wxString
txt(m_stringText
->GetValue());
1815 if (node
->GetData())
1816 delete[] (wxChar
*)node
->GetData();
1817 node
->SetData((wxObject
*)wxStrdup(txt
));
1819 m_listBox
->SetString(m_currentSelection
, (wxChar
*)node
->GetData());
1822 void wxPropertyStringListEditorDialog::ShowCurrentSelection()
1824 if (m_currentSelection
== -1)
1826 m_stringText
->SetValue(wxT(""));
1829 wxNode
*node
= (wxNode
*)m_listBox
->wxListBox::GetClientData(m_currentSelection
);
1830 wxChar
*txt
= (wxChar
*)node
->GetData();
1831 m_stringText
->SetValue(txt
);
1832 m_stringText
->Enable(TRUE
);
1836 #endif // wxUSE_PROPSHEET