]> git.saurik.com Git - wxWidgets.git/blame - src/generic/proplist.cpp
Only call use uppercase letter if control, alt, or shift is held down,
[wxWidgets.git] / src / generic / proplist.cpp
CommitLineData
e3a43801
JS
1/////////////////////////////////////////////////////////////////////////////
2// Name: proplist.cpp
3// Purpose: Property list classes
4// Author: Julian Smart
5// Modified by:
6// Created: 04/01/98
7// RCS-ID: $Id$
8// Copyright: (c) Julian Smart
29006414 9// Licence: wxWindows licence
e3a43801
JS
10/////////////////////////////////////////////////////////////////////////////
11
22aed133
VZ
12// ============================================================================
13// declarations
14// ============================================================================
15
16// ----------------------------------------------------------------------------
17// headers
18// ----------------------------------------------------------------------------
19
e3a43801 20#ifdef __GNUG__
22aed133 21 #pragma implementation "proplist.h"
e3a43801
JS
22#endif
23
24// For compilers that support precompilation, includes "wx/wx.h".
25#include "wx/wxprec.h"
26
27#ifdef __BORLANDC__
22aed133 28 #pragma hdrstop
e3a43801
JS
29#endif
30
1e6feb95
VZ
31#if wxUSE_PROPSHEET
32
e3a43801 33#ifndef WX_PRECOMP
22aed133
VZ
34 #include "wx/window.h"
35 #include "wx/font.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"
e3a43801
JS
43#endif
44
42b4e99e
RR
45#include "wx/sizer.h"
46#include "wx/module.h"
47#include "wx/intl.h"
00958db5 48#include "wx/artprov.h"
42b4e99e 49
c693edf3
RR
50#include "wx/colordlg.h"
51#include "wx/proplist.h"
52
e3a43801
JS
53#include <ctype.h>
54#include <stdlib.h>
55#include <math.h>
56#include <string.h>
57
22aed133
VZ
58// ----------------------------------------------------------------------------
59// Property text edit control
60// ----------------------------------------------------------------------------
29006414 61
f6bcfd97 62IMPLEMENT_DYNAMIC_CLASS(wxPropertyTextEdit, wxTextCtrl)
e3a43801
JS
63
64wxPropertyTextEdit::wxPropertyTextEdit(wxPropertyListView *v, wxWindow *parent,
65 const wxWindowID id, const wxString& value,
29006414 66 const wxPoint& pos, const wxSize& size,
e3a43801
JS
67 long style, const wxString& name):
68 wxTextCtrl(parent, id, value, pos, size, style, wxDefaultValidator, name)
69{
70 m_view = v;
71}
72
22aed133 73void wxPropertyTextEdit::OnSetFocus()
e3a43801
JS
74{
75}
76
22aed133 77void wxPropertyTextEdit::OnKillFocus()
e3a43801
JS
78{
79}
80
22aed133
VZ
81// ----------------------------------------------------------------------------
82// Property list view
83// ----------------------------------------------------------------------------
e3a43801 84
42b4e99e
RR
85bool wxPropertyListView::sm_dialogCancelled = FALSE;
86
e3a43801
JS
87IMPLEMENT_DYNAMIC_CLASS(wxPropertyListView, wxPropertyView)
88
89BEGIN_EVENT_TABLE(wxPropertyListView, wxPropertyView)
29006414
VZ
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)
e3a43801
JS
101END_EVENT_TABLE()
102
e3a43801
JS
103wxPropertyListView::wxPropertyListView(wxPanel *propPanel, long flags):wxPropertyView(flags)
104{
105 m_propertyScrollingList = NULL;
106 m_valueList = NULL;
107 m_valueText = NULL;
108 m_editButton = NULL;
109 m_confirmButton = NULL;
110 m_cancelButton = NULL;
111 m_propertyWindow = propPanel;
112 m_managedWindow = NULL;
113
114 m_windowCloseButton = NULL;
115 m_windowCancelButton = NULL;
116 m_windowHelpButton = NULL;
117
118 m_detailedEditing = FALSE;
119}
120
22aed133 121wxPropertyListView::~wxPropertyListView()
e3a43801 122{
e3a43801
JS
123}
124
125void wxPropertyListView::ShowView(wxPropertySheet *ps, wxPanel *panel)
126{
127 m_propertySheet = ps;
128
129 AssociatePanel(panel);
130 CreateControls();
131
132 UpdatePropertyList();
133 panel->Layout();
134}
135
136// Update this view of the viewed object, called e.g. by
137// the object itself.
22aed133 138bool wxPropertyListView::OnUpdateView()
e3a43801
JS
139{
140 return TRUE;
141}
142
143bool wxPropertyListView::UpdatePropertyList(bool clearEditArea)
144{
145 if (!m_propertyScrollingList || !m_propertySheet)
146 return FALSE;
147
148 m_propertyScrollingList->Clear();
149 if (clearEditArea)
150 {
151 m_valueList->Clear();
2b5f62a0 152 m_valueText->SetValue( wxT("") );
e3a43801 153 }
b1d4dd7a 154 wxNode *node = m_propertySheet->GetProperties().GetFirst();
e3a43801
JS
155
156 // Should sort them... later...
157 while (node)
158 {
b1d4dd7a 159 wxProperty *property = (wxProperty *)node->GetData();
e3a43801
JS
160 wxString stringValueRepr(property->GetValue().GetStringRepresentation());
161 wxString paddedString(MakeNameValueString(property->GetName(), stringValueRepr));
ee0fc54a 162 m_propertyScrollingList->Append(paddedString.GetData(), (void *)property);
b1d4dd7a 163 node = node->GetNext();
e3a43801
JS
164 }
165 return TRUE;
166}
167
168bool wxPropertyListView::UpdatePropertyDisplayInList(wxProperty *property)
169{
170 if (!m_propertyScrollingList || !m_propertySheet)
171 return FALSE;
172
8710cf5c 173#ifdef __WXMSW__
e3a43801 174 int currentlySelected = m_propertyScrollingList->GetSelection();
8710cf5c 175#endif
e3a43801
JS
176// #ifdef __WXMSW__
177 wxString stringValueRepr(property->GetValue().GetStringRepresentation());
178 wxString paddedString(MakeNameValueString(property->GetName(), stringValueRepr));
179 int sel = FindListIndexForProperty(property);
180
181 if (sel > -1)
182 {
183 // Don't update the listbox unnecessarily because it can cause
184 // ugly flashing.
29006414 185
e3a43801
JS
186 if (paddedString != m_propertyScrollingList->GetString(sel))
187 m_propertyScrollingList->SetString(sel, paddedString.GetData());
188 }
189//#else
190// UpdatePropertyList(FALSE);
191//#endif
192
193 // TODO: why is this necessary?
194#ifdef __WXMSW__
195 if (currentlySelected > -1)
196 m_propertyScrollingList->SetSelection(currentlySelected);
197#endif
198
199 return TRUE;
200}
201
202// Find the wxListBox index corresponding to this property
203int wxPropertyListView::FindListIndexForProperty(wxProperty *property)
204{
6326010c 205 int n = m_propertyScrollingList->GetCount();
e3a43801
JS
206 for (int i = 0; i < n; i++)
207 {
208 if (property == (wxProperty *)m_propertyScrollingList->wxListBox::GetClientData(i))
209 return i;
210 }
211 return -1;
212}
213
214wxString wxPropertyListView::MakeNameValueString(wxString name, wxString value)
215{
216 wxString theString(name);
217
218 int nameWidth = 25;
219 int padWith = nameWidth - theString.Length();
220 if (padWith < 0)
221 padWith = 0;
222
223 if (GetFlags() & wxPROP_SHOWVALUES)
224 {
225 // Want to pad with spaces
2b5f62a0 226 theString.Append( wxT(' '), padWith);
e3a43801
JS
227 theString += value;
228 }
229
230 return theString;
231}
232
233// Select and show string representation in validator the given
234// property. NULL resets to show no property.
235bool wxPropertyListView::ShowProperty(wxProperty *property, bool select)
236{
237 if (m_currentProperty)
238 {
239 EndShowingProperty(m_currentProperty);
240 m_currentProperty = NULL;
241 }
242
243 m_valueList->Clear();
2b5f62a0 244 m_valueText->SetValue( wxT("") );
e3a43801
JS
245
246 if (property)
247 {
248 m_currentProperty = property;
249 BeginShowingProperty(property);
250 }
251 if (select)
252 {
253 int sel = FindListIndexForProperty(property);
254 if (sel > -1)
255 m_propertyScrollingList->SetSelection(sel);
256 }
257 return TRUE;
258}
259
260// Find appropriate validator and load property into value controls
261bool wxPropertyListView::BeginShowingProperty(wxProperty *property)
262{
263 m_currentValidator = FindPropertyValidator(property);
264 if (!m_currentValidator)
265 return FALSE;
266
267 if (!m_currentValidator->IsKindOf(CLASSINFO(wxPropertyListValidator)))
268 return FALSE;
269
270 wxPropertyListValidator *listValidator = (wxPropertyListValidator *)m_currentValidator;
271
272 listValidator->OnPrepareControls(property, this, m_propertyWindow);
273 DisplayProperty(property);
274 return TRUE;
275}
276
277// Find appropriate validator and unload property from value controls
278bool wxPropertyListView::EndShowingProperty(wxProperty *property)
279{
280 if (!m_currentValidator)
281 return FALSE;
282
283 RetrieveProperty(property);
284
285 if (!m_currentValidator->IsKindOf(CLASSINFO(wxPropertyListValidator)))
286 return FALSE;
287
288 wxPropertyListValidator *listValidator = (wxPropertyListValidator *)m_currentValidator;
289
290 listValidator->OnClearControls(property, this, m_propertyWindow);
291 if (m_detailedEditing)
292 {
293 listValidator->OnClearDetailControls(property, this, m_propertyWindow);
294 m_detailedEditing = FALSE;
295 }
296 return TRUE;
297}
298
22aed133 299void wxPropertyListView::BeginDetailedEditing()
e3a43801
JS
300{
301 if (!m_currentValidator)
302 return;
303 if (!m_currentProperty)
304 return;
305 if (m_detailedEditing)
306 return;
307 if (!m_currentValidator->IsKindOf(CLASSINFO(wxPropertyListValidator)))
308 return;
309 if (!m_currentProperty->IsEnabled())
310 return;
311
312 wxPropertyListValidator *listValidator = (wxPropertyListValidator *)m_currentValidator;
313
314 if (listValidator->OnPrepareDetailControls(m_currentProperty, this, m_propertyWindow))
315 m_detailedEditing = TRUE;
316}
317
22aed133 318void wxPropertyListView::EndDetailedEditing()
e3a43801
JS
319{
320 if (!m_currentValidator)
321 return;
322 if (!m_currentProperty)
323 return;
324
325 RetrieveProperty(m_currentProperty);
326
327 if (!m_currentValidator->IsKindOf(CLASSINFO(wxPropertyListValidator)))
328 return;
329
330 wxPropertyListValidator *listValidator = (wxPropertyListValidator *)m_currentValidator;
331
332 if (m_detailedEditing)
333 {
334 listValidator->OnClearDetailControls(m_currentProperty, this, m_propertyWindow);
335 m_detailedEditing = FALSE;
336 }
337}
338
339bool wxPropertyListView::DisplayProperty(wxProperty *property)
340{
341 if (!m_currentValidator)
342 return FALSE;
343
344 if (((m_currentValidator->GetFlags() & wxPROP_ALLOW_TEXT_EDITING) == 0) || !property->IsEnabled())
345 m_valueText->SetEditable(FALSE);
346 else
347 m_valueText->SetEditable(TRUE);
348
349 if (!m_currentValidator->IsKindOf(CLASSINFO(wxPropertyListValidator)))
350 return FALSE;
351
352 wxPropertyListValidator *listValidator = (wxPropertyListValidator *)m_currentValidator;
353
354 listValidator->OnDisplayValue(property, this, m_propertyWindow);
355 return TRUE;
356}
357
358bool wxPropertyListView::RetrieveProperty(wxProperty *property)
359{
360 if (!m_currentValidator)
361 return FALSE;
362 if (!property->IsEnabled())
363 return FALSE;
364
365 if (!m_currentValidator->IsKindOf(CLASSINFO(wxPropertyListValidator)))
366 return FALSE;
367
368 wxPropertyListValidator *listValidator = (wxPropertyListValidator *)m_currentValidator;
369
370 if (listValidator->OnCheckValue(property, this, m_propertyWindow))
371 {
372 if (listValidator->OnRetrieveValue(property, this, m_propertyWindow))
373 {
374 UpdatePropertyDisplayInList(property);
375 OnPropertyChanged(property);
376 }
377 }
378 else
379 {
380 // Revert to old value
381 listValidator->OnDisplayValue(property, this, m_propertyWindow);
382 }
383 return TRUE;
384}
385
386
387bool wxPropertyListView::EditProperty(wxProperty *WXUNUSED(property))
388{
389 return TRUE;
390}
391
392// Called by the listbox callback
393void wxPropertyListView::OnPropertySelect(wxCommandEvent& WXUNUSED(event))
394{
395 int sel = m_propertyScrollingList->GetSelection();
396 if (sel > -1)
397 {
398 wxProperty *newSel = (wxProperty *)m_propertyScrollingList->wxListBox::GetClientData(sel);
399 if (newSel && newSel != m_currentProperty)
400 {
401 ShowProperty(newSel, FALSE);
402 }
403 }
404}
405
42b4e99e 406bool wxPropertyListView::CreateControls()
e3a43801 407{
42b4e99e 408 wxPanel *panel = (wxPanel *)m_propertyWindow;
e3a43801 409
cf1f0870 410 wxSize largeButtonSize( 70, 25 );
42b4e99e 411 wxSize smallButtonSize( 23, 23 );
e3a43801 412
42b4e99e
RR
413 if (m_valueText)
414 return TRUE;
e3a43801 415
42b4e99e
RR
416 if (!panel)
417 return FALSE;
e3a43801 418
4ccf704a 419 wxFont guiFont = wxSystemSettings::GetSystemFont(wxSYS_DEFAULT_GUI_FONT);
e3a43801
JS
420
421#ifdef __WXMSW__
9dae7a02
VZ
422 wxFont *boringFont =
423 wxTheFontList->FindOrCreateFont(guiFont.GetPointSize(), wxMODERN,
424 wxNORMAL, wxNORMAL, FALSE, _T("Courier New"));
e3a43801 425#else
42b4e99e 426 wxFont *boringFont = wxTheFontList->FindOrCreateFont(guiFont.GetPointSize(), wxTELETYPE, wxNORMAL, wxNORMAL);
e3a43801
JS
427#endif
428
42b4e99e
RR
429 // May need to be changed in future to eliminate clashes with app.
430 // WHAT WAS THIS FOR?
e3a43801
JS
431// panel->SetClientData((char *)this);
432
42b4e99e 433 wxBoxSizer *mainsizer = new wxBoxSizer( wxVERTICAL );
feeb8165 434
42b4e99e 435 // top row with optional buttons and input line
e3a43801 436
42b4e99e
RR
437 wxBoxSizer *topsizer = new wxBoxSizer( wxHORIZONTAL );
438 int buttonborder = 3;
e3a43801 439
42b4e99e 440 if (m_buttonFlags & wxPROP_BUTTON_CHECK_CROSS)
e3a43801 441 {
00958db5
VS
442 wxBitmap tickBitmap = wxArtProvider::GetBitmap(wxART_TICK_MARK);
443 wxBitmap crossBitmap = wxArtProvider::GetBitmap(wxART_CROSS_MARK);
22aed133 444
00958db5 445 if ( tickBitmap.Ok() && crossBitmap.Ok() )
42b4e99e 446 {
00958db5
VS
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 );
42b4e99e
RR
449 }
450 else
451 {
9dae7a02
VZ
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 );
42b4e99e 454 }
6e31e940
VZ
455
456 topsizer->Add( m_confirmButton, 0, wxLEFT|wxTOP|wxBOTTOM | wxEXPAND, buttonborder );
457 topsizer->Add( m_cancelButton, 0, wxLEFT|wxTOP|wxBOTTOM | wxEXPAND, buttonborder );
e3a43801 458 }
42b4e99e 459
9dae7a02 460 m_valueText = new wxPropertyTextEdit(this, panel, wxID_PROP_TEXT, _T(""),
42b4e99e
RR
461 wxPoint(-1, -1), wxSize(-1, smallButtonSize.y), wxPROCESS_ENTER);
462 m_valueText->Enable(FALSE);
463 topsizer->Add( m_valueText, 1, wxALL | wxEXPAND, buttonborder );
feeb8165 464
42b4e99e 465 if (m_buttonFlags & wxPROP_PULLDOWN)
e3a43801 466 {
9dae7a02 467 m_editButton = new wxButton(panel, wxID_PROP_EDIT, _T("..."), wxPoint(-1, -1), smallButtonSize);
42b4e99e 468 m_editButton->Enable(FALSE);
6e31e940 469 topsizer->Add( m_editButton, 0, wxRIGHT|wxTOP|wxBOTTOM | wxEXPAND, buttonborder );
e3a43801
JS
470 }
471
42b4e99e 472 mainsizer->Add( topsizer, 0, wxEXPAND );
e3a43801 473
42b4e99e 474 // middle section with two list boxes
e3a43801 475
42b4e99e 476 m_middleSizer = new wxBoxSizer( wxVERTICAL );
e3a43801 477
42b4e99e
RR
478 m_valueList = new wxListBox(panel, wxID_PROP_VALUE_SELECT, wxPoint(-1, -1), wxSize(-1, 60));
479 m_valueList->Show(FALSE);
e3a43801 480
42b4e99e
RR
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 );
e3a43801 484
feeb8165 485 mainsizer->Add( m_middleSizer, 1, wxEXPAND );
e3a43801 486
42b4e99e 487 // bottom row with buttons
e3a43801 488
42b4e99e
RR
489 if ((m_buttonFlags & wxPROP_BUTTON_OK) ||
490 (m_buttonFlags & wxPROP_BUTTON_CLOSE) ||
6e31e940
VZ
491 (m_buttonFlags & wxPROP_BUTTON_CANCEL) ||
492 (m_buttonFlags & wxPROP_BUTTON_HELP))
42b4e99e
RR
493 {
494 wxBoxSizer *bottomsizer = new wxBoxSizer( wxHORIZONTAL );
495 buttonborder = 5;
feeb8165 496
42b4e99e
RR
497 if (m_buttonFlags & wxPROP_BUTTON_OK)
498 {
499 m_windowCloseButton = new wxButton(panel, wxID_OK, _("OK"), wxPoint(-1, -1), largeButtonSize );
500 m_windowCloseButton->SetDefault();
501 m_windowCloseButton->SetFocus();
cf1f0870 502 bottomsizer->Add( m_windowCloseButton, 0, wxALL, buttonborder );
42b4e99e
RR
503 }
504 else if (m_buttonFlags & wxPROP_BUTTON_CLOSE)
505 {
506 m_windowCloseButton = new wxButton(panel, wxID_OK, _("Close"), wxPoint(-1, -1), largeButtonSize );
507 bottomsizer->Add( m_windowCloseButton, 0, wxALL, buttonborder );
508 }
509 if (m_buttonFlags & wxPROP_BUTTON_CANCEL)
510 {
511 m_windowCancelButton = new wxButton(panel, wxID_CANCEL, _("Cancel"), wxPoint(-1, -1), largeButtonSize );
512 bottomsizer->Add( m_windowCancelButton, 0, wxALL, buttonborder );
513 }
514 if (m_buttonFlags & wxPROP_BUTTON_HELP)
515 {
516 m_windowHelpButton = new wxButton(panel, wxID_HELP, _("Help"), wxPoint(-1, -1), largeButtonSize );
517 bottomsizer->Add( m_windowHelpButton, 0, wxALL, buttonborder );
518 }
6e31e940 519
cf1f0870 520 mainsizer->Add( bottomsizer, 0, wxALIGN_RIGHT | wxEXPAND );
42b4e99e 521 }
e3a43801 522
42b4e99e 523 panel->SetSizer( mainsizer );
e3a43801 524
42b4e99e 525 return TRUE;
e3a43801
JS
526}
527
528void wxPropertyListView::ShowTextControl(bool show)
529{
530 if (m_valueText)
531 m_valueText->Show(show);
532}
533
534void wxPropertyListView::ShowListBoxControl(bool show)
535{
42b4e99e 536 if (!m_valueList) return;
feeb8165 537
e3a43801 538 m_valueList->Show(show);
feeb8165 539
e3a43801
JS
540 if (m_buttonFlags & wxPROP_DYNAMIC_VALUE_FIELD)
541 {
e3a43801 542 if (show)
6e31e940
VZ
543 m_middleSizer->Prepend( m_valueList, 0, wxTOP|wxLEFT|wxRIGHT | wxEXPAND, 3 );
544 else
5709329c 545 m_middleSizer->Remove( 0 );
feeb8165 546
e3a43801 547 m_propertyWindow->Layout();
e3a43801 548 }
e3a43801
JS
549}
550
551void wxPropertyListView::EnableCheck(bool show)
552{
553 if (m_confirmButton)
554 m_confirmButton->Enable(show);
555}
556
557void wxPropertyListView::EnableCross(bool show)
558{
559 if (m_cancelButton)
560 m_cancelButton->Enable(show);
561}
562
22aed133 563bool wxPropertyListView::OnClose()
e3a43801
JS
564{
565 // Retrieve the value if any
566 wxCommandEvent event;
567 OnCheck(event);
29006414 568
e3a43801
JS
569 delete this;
570 return TRUE;
571}
572
573void wxPropertyListView::OnValueListSelect(wxCommandEvent& WXUNUSED(event))
574{
575 if (m_currentProperty && m_currentValidator)
576 {
577 if (!m_currentValidator->IsKindOf(CLASSINFO(wxPropertyListValidator)))
578 return;
579
580 wxPropertyListValidator *listValidator = (wxPropertyListValidator *)m_currentValidator;
581
582 listValidator->OnValueListSelect(m_currentProperty, this, m_propertyWindow);
583 }
584}
585
586void wxPropertyListView::OnOk(wxCommandEvent& event)
587{
588 // Retrieve the value if any
589 OnCheck(event);
29006414 590
e3a43801 591 m_managedWindow->Close(TRUE);
0c44c1c6 592 sm_dialogCancelled = FALSE;
e3a43801
JS
593}
594
595void wxPropertyListView::OnCancel(wxCommandEvent& WXUNUSED(event))
596{
597// SetReturnCode(wxID_CANCEL);
598 m_managedWindow->Close(TRUE);
599 sm_dialogCancelled = TRUE;
600}
601
602void wxPropertyListView::OnHelp(wxCommandEvent& WXUNUSED(event))
603{
604}
605
606void wxPropertyListView::OnCheck(wxCommandEvent& WXUNUSED(event))
607{
608 if (m_currentProperty)
609 {
610 RetrieveProperty(m_currentProperty);
611 }
612}
613
614void wxPropertyListView::OnCross(wxCommandEvent& WXUNUSED(event))
615{
616 if (m_currentProperty && m_currentValidator)
617 {
618 if (!m_currentValidator->IsKindOf(CLASSINFO(wxPropertyListValidator)))
619 return;
620
621 wxPropertyListValidator *listValidator = (wxPropertyListValidator *)m_currentValidator;
622
623 // Revert to old value
624 listValidator->OnDisplayValue(m_currentProperty, this, m_propertyWindow);
625 }
626}
627
628void wxPropertyListView::OnPropertyDoubleClick(wxCommandEvent& WXUNUSED(event))
629{
630 if (m_currentProperty && m_currentValidator)
631 {
632 if (!m_currentValidator->IsKindOf(CLASSINFO(wxPropertyListValidator)))
633 return;
634
635 wxPropertyListValidator *listValidator = (wxPropertyListValidator *)m_currentValidator;
636
637 // Revert to old value
638 listValidator->OnDoubleClick(m_currentProperty, this, m_propertyWindow);
639 }
640}
641
642void wxPropertyListView::OnEdit(wxCommandEvent& WXUNUSED(event))
643{
644 if (m_currentProperty && m_currentValidator)
645 {
646 if (!m_currentValidator->IsKindOf(CLASSINFO(wxPropertyListValidator)))
647 return;
648
649 wxPropertyListValidator *listValidator = (wxPropertyListValidator *)m_currentValidator;
650
651 listValidator->OnEdit(m_currentProperty, this, m_propertyWindow);
652 }
653}
654
655void wxPropertyListView::OnText(wxCommandEvent& event)
656{
657 if (event.GetEventType() == wxEVT_COMMAND_TEXT_ENTER)
658 {
659 OnCheck(event);
660 }
661}
662
22aed133
VZ
663// ----------------------------------------------------------------------------
664// Property dialog box
665// ----------------------------------------------------------------------------
29006414 666
f6bcfd97 667IMPLEMENT_DYNAMIC_CLASS(wxPropertyListDialog, wxDialog)
e3a43801
JS
668
669BEGIN_EVENT_TABLE(wxPropertyListDialog, wxDialog)
29006414 670 EVT_BUTTON(wxID_CANCEL, wxPropertyListDialog::OnCancel)
e3065973 671 EVT_CLOSE(wxPropertyListDialog::OnCloseWindow)
e3a43801
JS
672END_EVENT_TABLE()
673
674wxPropertyListDialog::wxPropertyListDialog(wxPropertyListView *v, wxWindow *parent,
29006414 675 const wxString& title, const wxPoint& pos,
e3a43801
JS
676 const wxSize& size, long style, const wxString& name):
677 wxDialog(parent, -1, title, pos, size, style, name)
678{
679 m_view = v;
680 m_view->AssociatePanel( ((wxPanel*)this) );
681 m_view->SetManagedWindow(this);
682 SetAutoLayout(TRUE);
683}
684
e3065973 685void wxPropertyListDialog::OnCloseWindow(wxCloseEvent& event)
e3a43801
JS
686{
687 if (m_view)
688 {
29006414 689 SetReturnCode(wxID_CANCEL);
e3a43801 690 m_view->OnClose();
29006414
VZ
691 m_view = NULL;
692 this->Destroy();
e3a43801
JS
693 }
694 else
e3065973
JS
695 {
696 event.Veto();
697 }
e3a43801
JS
698}
699
700void wxPropertyListDialog::OnCancel(wxCommandEvent& WXUNUSED(event))
701{
29006414 702 SetReturnCode(wxID_CANCEL);
e3a43801
JS
703 this->Close();
704}
705
8710cf5c 706void wxPropertyListDialog::OnDefaultAction(wxControl *WXUNUSED(item))
e3a43801
JS
707{
708/*
709 if (item == m_view->GetPropertyScrollingList())
710 view->OnDoubleClick();
711*/
712}
713
714// Extend event processing to search the view's event table
715bool wxPropertyListDialog::ProcessEvent(wxEvent& event)
716{
29006414
VZ
717 if ( !m_view || ! m_view->ProcessEvent(event) )
718 return wxEvtHandler::ProcessEvent(event);
719 else
720 return TRUE;
e3a43801
JS
721}
722
22aed133
VZ
723// ----------------------------------------------------------------------------
724// Property panel
725// ----------------------------------------------------------------------------
29006414 726
f6bcfd97 727IMPLEMENT_DYNAMIC_CLASS(wxPropertyListPanel, wxPanel)
e3a43801
JS
728
729BEGIN_EVENT_TABLE(wxPropertyListPanel, wxPanel)
730 EVT_SIZE(wxPropertyListPanel::OnSize)
731END_EVENT_TABLE()
732
733wxPropertyListPanel::~wxPropertyListPanel()
734{
735}
736
8710cf5c 737void wxPropertyListPanel::OnDefaultAction(wxControl *WXUNUSED(item))
e3a43801
JS
738{
739/*
740 if (item == view->GetPropertyScrollingList())
741 view->OnDoubleClick();
742*/
743}
744
745// Extend event processing to search the view's event table
746bool wxPropertyListPanel::ProcessEvent(wxEvent& event)
747{
29006414
VZ
748 if ( !m_view || ! m_view->ProcessEvent(event) )
749 return wxEvtHandler::ProcessEvent(event);
750 else
751 return TRUE;
e3a43801
JS
752}
753
754void wxPropertyListPanel::OnSize(wxSizeEvent& WXUNUSED(event))
755{
756 Layout();
757}
758
22aed133
VZ
759// ----------------------------------------------------------------------------
760// Property frame
761// ----------------------------------------------------------------------------
29006414 762
f6bcfd97 763IMPLEMENT_DYNAMIC_CLASS(wxPropertyListFrame, wxFrame)
e3a43801 764
e3065973
JS
765BEGIN_EVENT_TABLE(wxPropertyListFrame, wxFrame)
766 EVT_CLOSE(wxPropertyListFrame::OnCloseWindow)
767END_EVENT_TABLE()
768
769void wxPropertyListFrame::OnCloseWindow(wxCloseEvent& event)
e3a43801
JS
770{
771 if (m_view)
772 {
773 if (m_propertyPanel)
774 m_propertyPanel->SetView(NULL);
775 m_view->OnClose();
776 m_view = NULL;
e3065973 777 this->Destroy();
e3a43801
JS
778 }
779 else
e3065973
JS
780 {
781 event.Veto();
782 }
e3a43801
JS
783}
784
785wxPropertyListPanel *wxPropertyListFrame::OnCreatePanel(wxFrame *parent, wxPropertyListView *v)
786{
787 return new wxPropertyListPanel(v, parent);
788}
789
22aed133 790bool wxPropertyListFrame::Initialize()
e3a43801
JS
791{
792 m_propertyPanel = OnCreatePanel(this, m_view);
793 if (m_propertyPanel)
794 {
795 m_view->AssociatePanel(m_propertyPanel);
796 m_view->SetManagedWindow(this);
797 m_propertyPanel->SetAutoLayout(TRUE);
798 return TRUE;
799 }
800 else
801 return FALSE;
802}
803
22aed133
VZ
804// ----------------------------------------------------------------------------
805// Property list specific validator
806// ----------------------------------------------------------------------------
29006414 807
e3a43801
JS
808IMPLEMENT_ABSTRACT_CLASS(wxPropertyListValidator, wxPropertyValidator)
809
810bool wxPropertyListValidator::OnSelect(bool select, wxProperty *property, wxPropertyListView *view, wxWindow *parentWindow)
811{
812// view->GetValueText()->Show(TRUE);
813 if (select)
814 OnDisplayValue(property, view, parentWindow);
815
816 return TRUE;
817}
818
8710cf5c 819bool wxPropertyListValidator::OnValueListSelect(wxProperty *property, wxPropertyListView *view, wxWindow *WXUNUSED(parentWindow))
e3a43801
JS
820{
821 wxString s(view->GetValueList()->GetStringSelection());
223d09f6 822 if (s != wxT(""))
e3a43801
JS
823 {
824 view->GetValueText()->SetValue(s);
825 view->RetrieveProperty(property);
826 }
827 return TRUE;
828}
829
8710cf5c 830bool wxPropertyListValidator::OnDisplayValue(wxProperty *property, wxPropertyListView *view, wxWindow *WXUNUSED(parentWindow))
e3a43801
JS
831{
832// view->GetValueText()->Show(TRUE);
833 wxString str(property->GetValue().GetStringRepresentation());
834
835 view->GetValueText()->SetValue(str);
836 return TRUE;
837}
838
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
8710cf5c 842bool wxPropertyListValidator::OnRetrieveValue(wxProperty *WXUNUSED(property), wxPropertyListView *view, wxWindow *WXUNUSED(parentWindow))
e3a43801
JS
843{
844 if (!view->GetValueText())
845 return FALSE;
846 return FALSE;
847}
848
8710cf5c 849void wxPropertyListValidator::OnEdit(wxProperty *WXUNUSED(property), wxPropertyListView *view, wxWindow *WXUNUSED(parentWindow))
e3a43801
JS
850{
851 if (view->GetDetailedEditing())
852 view->EndDetailedEditing();
853 else
854 view->BeginDetailedEditing();
855}
856
8710cf5c 857bool wxPropertyListValidator::OnClearControls(wxProperty *WXUNUSED(property), wxPropertyListView *view, wxWindow *WXUNUSED(parentWindow))
e3a43801
JS
858{
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);
865 return TRUE;
866}
867
22aed133
VZ
868// ----------------------------------------------------------------------------
869// Default validators
870// ----------------------------------------------------------------------------
e3a43801
JS
871
872IMPLEMENT_DYNAMIC_CLASS(wxRealListValidator, wxPropertyListValidator)
873
874///
875/// Real number validator
29006414 876///
8710cf5c 877bool wxRealListValidator::OnCheckValue(wxProperty *WXUNUSED(property), wxPropertyListView *view, wxWindow *parentWindow)
e3a43801
JS
878{
879 if (m_realMin == 0.0 && m_realMax == 0.0)
880 return TRUE;
29006414 881
e3a43801
JS
882 if (!view->GetValueText())
883 return FALSE;
884 wxString value(view->GetValueText()->GetValue());
885
886 float val = 0.0;
887 if (!StringToFloat(WXSTRINGCAST value, &val))
888 {
87138c52 889 wxChar buf[200];
223d09f6
KB
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);
e3a43801
JS
892 return FALSE;
893 }
29006414 894
e3a43801
JS
895 if (val < m_realMin || val > m_realMax)
896 {
2b5f62a0
VZ
897 wxChar buf[200];
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);
e3a43801
JS
900 return FALSE;
901 }
902 return TRUE;
903}
904
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
8710cf5c 908bool wxRealListValidator::OnRetrieveValue(wxProperty *property, wxPropertyListView *view, wxWindow *WXUNUSED(parentWindow))
e3a43801
JS
909{
910 if (!view->GetValueText())
911 return FALSE;
912
87138c52 913 if (wxStrlen(view->GetValueText()->GetValue()) == 0)
e3a43801 914 return FALSE;
29006414 915
e3a43801 916 wxString value(view->GetValueText()->GetValue());
87138c52 917 float f = (float)wxAtof(value.GetData());
e3a43801
JS
918 property->GetValue() = f;
919 return TRUE;
920}
921
8710cf5c 922bool wxRealListValidator::OnPrepareControls(wxProperty *WXUNUSED(property), wxPropertyListView *view, wxWindow *WXUNUSED(parentWindow))
e3a43801
JS
923{
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);
932 return TRUE;
933}
934
935///
936/// Integer validator
29006414 937///
e3a43801
JS
938IMPLEMENT_DYNAMIC_CLASS(wxIntegerListValidator, wxPropertyListValidator)
939
8710cf5c 940bool wxIntegerListValidator::OnCheckValue(wxProperty *WXUNUSED(property), wxPropertyListView *view, wxWindow *parentWindow)
e3a43801
JS
941{
942 if (m_integerMin == 0 && m_integerMax == 0)
943 return TRUE;
29006414 944
e3a43801
JS
945 if (!view->GetValueText())
946 return FALSE;
947 wxString value(view->GetValueText()->GetValue());
948
949 long val = 0;
950 if (!StringToLong(WXSTRINGCAST value, &val))
951 {
87138c52 952 wxChar buf[200];
223d09f6
KB
953 wxSprintf(buf, wxT("Value %s is not a valid integer!"), value.GetData());
954 wxMessageBox(buf, wxT("Property value error"), wxOK | wxICON_EXCLAMATION, parentWindow);
e3a43801
JS
955 return FALSE;
956 }
957 if (val < m_integerMin || val > m_integerMax)
958 {
87138c52 959 wxChar buf[200];
223d09f6
KB
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);
e3a43801
JS
962 return FALSE;
963 }
964 return TRUE;
965}
966
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
8710cf5c 970bool wxIntegerListValidator::OnRetrieveValue(wxProperty *property, wxPropertyListView *view, wxWindow *WXUNUSED(parentWindow))
e3a43801
JS
971{
972 if (!view->GetValueText())
973 return FALSE;
974
87138c52 975 if (wxStrlen(view->GetValueText()->GetValue()) == 0)
e3a43801 976 return FALSE;
29006414 977
e3a43801 978 wxString value(view->GetValueText()->GetValue());
87138c52 979 long val = (long)wxAtoi(value.GetData());
e3a43801
JS
980 property->GetValue() = (long)val;
981 return TRUE;
982}
983
8710cf5c 984bool wxIntegerListValidator::OnPrepareControls(wxProperty *WXUNUSED(property), wxPropertyListView *view, wxWindow *WXUNUSED(parentWindow))
e3a43801
JS
985{
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);
994 return TRUE;
995}
996
997///
998/// boolean validator
999///
1000IMPLEMENT_DYNAMIC_CLASS(wxBoolListValidator, wxPropertyListValidator)
1001
8710cf5c 1002bool wxBoolListValidator::OnCheckValue(wxProperty *WXUNUSED(property), wxPropertyListView *view, wxWindow *parentWindow)
e3a43801
JS
1003{
1004 if (!view->GetValueText())
1005 return FALSE;
1006 wxString value(view->GetValueText()->GetValue());
223d09f6 1007 if (value != wxT("True") && value != wxT("False"))
e3a43801 1008 {
223d09f6 1009 wxMessageBox(wxT("Value must be True or False!"), wxT("Property value error"), wxOK | wxICON_EXCLAMATION, parentWindow);
e3a43801
JS
1010 return FALSE;
1011 }
1012 return TRUE;
1013}
1014
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
8710cf5c 1018bool wxBoolListValidator::OnRetrieveValue(wxProperty *property, wxPropertyListView *view, wxWindow *WXUNUSED(parentWindow))
e3a43801
JS
1019{
1020 if (!view->GetValueText())
1021 return FALSE;
1022
87138c52 1023 if (wxStrlen(view->GetValueText()->GetValue()) == 0)
e3a43801 1024 return FALSE;
29006414 1025
e3a43801
JS
1026 wxString value(view->GetValueText()->GetValue());
1027 bool boolValue = FALSE;
223d09f6 1028 if (value == wxT("True"))
e3a43801
JS
1029 boolValue = TRUE;
1030 else
1031 boolValue = FALSE;
1032 property->GetValue() = (bool)boolValue;
1033 return TRUE;
1034}
1035
8710cf5c 1036bool wxBoolListValidator::OnDisplayValue(wxProperty *property, wxPropertyListView *view, wxWindow *WXUNUSED(parentWindow))
e3a43801
JS
1037{
1038 if (!view->GetValueText())
1039 return FALSE;
1040 wxString str(property->GetValue().GetStringRepresentation());
1041
1042 view->GetValueText()->SetValue(str);
1043
1044 if (view->GetValueList()->IsShown())
1045 {
1046 view->GetValueList()->SetStringSelection(str);
1047 }
1048 return TRUE;
1049}
1050
8710cf5c 1051bool wxBoolListValidator::OnPrepareControls(wxProperty *WXUNUSED(property), wxPropertyListView *view, wxWindow *WXUNUSED(parentWindow))
e3a43801
JS
1052{
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);
1061 return TRUE;
1062}
1063
8710cf5c 1064bool wxBoolListValidator::OnPrepareDetailControls(wxProperty *WXUNUSED(property), wxPropertyListView *view, wxWindow *WXUNUSED(parentWindow))
e3a43801
JS
1065{
1066 if (view->GetValueList())
1067 {
1068 view->ShowListBoxControl(TRUE);
1069 view->GetValueList()->Enable(TRUE);
29006414 1070
223d09f6
KB
1071 view->GetValueList()->Append(wxT("True"));
1072 view->GetValueList()->Append(wxT("False"));
87138c52 1073 wxChar *currentString = copystring(view->GetValueText()->GetValue());
e3a43801
JS
1074 view->GetValueList()->SetStringSelection(currentString);
1075 delete[] currentString;
1076 }
1077 return TRUE;
1078}
1079
8710cf5c 1080bool wxBoolListValidator::OnClearDetailControls(wxProperty *WXUNUSED(property), wxPropertyListView *view, wxWindow *WXUNUSED(parentWindow))
e3a43801
JS
1081{
1082 if (view->GetValueList())
1083 {
1084 view->GetValueList()->Clear();
1085 view->ShowListBoxControl(FALSE);
1086 view->GetValueList()->Enable(FALSE);
1087 }
1088 return TRUE;
1089}
1090
1091// Called when the property is double clicked. Extra functionality can be provided,
1092// cycling through possible values.
8710cf5c 1093bool wxBoolListValidator::OnDoubleClick(wxProperty *property, wxPropertyListView *view, wxWindow *WXUNUSED(parentWindow))
e3a43801
JS
1094{
1095 if (!view->GetValueText())
1096 return FALSE;
1097 if (property->GetValue().BoolValue())
1098 property->GetValue() = (bool)FALSE;
1099 else
1100 property->GetValue() = (bool)TRUE;
1101 view->DisplayProperty(property);
1102 view->UpdatePropertyDisplayInList(property);
1103 view->OnPropertyChanged(property);
1104 return TRUE;
1105}
1106
1107///
1108/// String validator
29006414 1109///
e3a43801
JS
1110IMPLEMENT_DYNAMIC_CLASS(wxStringListValidator, wxPropertyListValidator)
1111
1112wxStringListValidator::wxStringListValidator(wxStringList *list, long flags):
1113 wxPropertyListValidator(flags)
1114{
1115 m_strings = list;
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;
1119}
1120
8710cf5c 1121bool wxStringListValidator::OnCheckValue(wxProperty *WXUNUSED(property), wxPropertyListView *view, wxWindow *parentWindow)
e3a43801
JS
1122{
1123 if (!m_strings)
1124 return TRUE;
1125
1126 if (!view->GetValueText())
1127 return FALSE;
1128 wxString value(view->GetValueText()->GetValue());
1129
1130 if (!m_strings->Member(value.GetData()))
1131 {
2b5f62a0
VZ
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);
e3a43801
JS
1136 return FALSE;
1137 }
1138 return TRUE;
1139}
1140
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
8710cf5c 1144bool wxStringListValidator::OnRetrieveValue(wxProperty *property, wxPropertyListView *view, wxWindow *WXUNUSED(parentWindow))
e3a43801
JS
1145{
1146 if (!view->GetValueText())
1147 return FALSE;
1148 wxString value(view->GetValueText()->GetValue());
1149 property->GetValue() = value ;
1150 return TRUE;
1151}
1152
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
8710cf5c 1156bool wxStringListValidator::OnDisplayValue(wxProperty *property, wxPropertyListView *view, wxWindow *WXUNUSED(parentWindow))
e3a43801
JS
1157{
1158 if (!view->GetValueText())
1159 return FALSE;
1160 wxString str(property->GetValue().GetStringRepresentation());
1161 view->GetValueText()->SetValue(str);
6326010c 1162 if (m_strings && view->GetValueList() && view->GetValueList()->IsShown() && view->GetValueList()->GetCount() > 0)
e3a43801
JS
1163 {
1164 view->GetValueList()->SetStringSelection(str);
1165 }
1166 return TRUE;
1167}
1168
8710cf5c 1169bool wxStringListValidator::OnPrepareControls(wxProperty *WXUNUSED(property), wxPropertyListView *view, wxWindow *WXUNUSED(parentWindow))
e3a43801
JS
1170{
1171 // Unconstrained
1172 if (!m_strings)
1173 {
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);
1182 return TRUE;
1183 }
29006414 1184
e3a43801
JS
1185 // Constrained
1186 if (view->GetValueText())
1187 view->GetValueText()->Enable(FALSE);
1188
1189 if (view->GetEditButton())
1190 view->GetEditButton()->Enable(TRUE);
1191
1192 if (view->GetConfirmButton())
1193 view->GetConfirmButton()->Enable(FALSE);
1194 if (view->GetCancelButton())
1195 view->GetCancelButton()->Enable(FALSE);
1196 return TRUE;
1197}
1198
b1d4dd7a
RL
1199bool wxStringListValidator::OnPrepareDetailControls( wxProperty *property,
1200 wxPropertyListView *view,
1201 wxWindow *WXUNUSED(parentWindow) )
e3a43801
JS
1202{
1203 if (view->GetValueList())
1204 {
1205 view->ShowListBoxControl(TRUE);
1206 view->GetValueList()->Enable(TRUE);
b1d4dd7a 1207 wxStringList::Node *node = m_strings->GetFirst();
e3a43801
JS
1208 while (node)
1209 {
b1d4dd7a 1210 wxChar *s = node->GetData();
e3a43801 1211 view->GetValueList()->Append(s);
b1d4dd7a 1212 node = node->GetNext();
e3a43801 1213 }
87138c52 1214 wxChar *currentString = property->GetValue().StringValue();
e3a43801
JS
1215 view->GetValueList()->SetStringSelection(currentString);
1216 }
1217 return TRUE;
1218}
1219
8710cf5c 1220bool wxStringListValidator::OnClearDetailControls(wxProperty *WXUNUSED(property), wxPropertyListView *view, wxWindow *WXUNUSED(parentWindow))
e3a43801
JS
1221{
1222 if (!m_strings)
1223 {
1224 return TRUE;
1225 }
1226
1227 if (view->GetValueList())
1228 {
1229 view->GetValueList()->Clear();
1230 view->ShowListBoxControl(FALSE);
1231 view->GetValueList()->Enable(FALSE);
1232 }
1233 return TRUE;
1234}
1235
1236// Called when the property is double clicked. Extra functionality can be provided,
1237// cycling through possible values.
b1d4dd7a
RL
1238bool wxStringListValidator::OnDoubleClick( wxProperty *property,
1239 wxPropertyListView *view,
1240 wxWindow *WXUNUSED(parentWindow) )
e3a43801
JS
1241{
1242 if (!view->GetValueText())
1243 return FALSE;
1244 if (!m_strings)
1245 return FALSE;
1246
b1d4dd7a
RL
1247 wxStringList::Node *node = m_strings->GetFirst();
1248 wxChar *currentString = property->GetValue().StringValue();
e3a43801
JS
1249 while (node)
1250 {
b1d4dd7a 1251 wxChar *s = node->GetData();
87138c52 1252 if (wxStrcmp(s, currentString) == 0)
e3a43801 1253 {
87138c52 1254 wxChar *nextString = NULL;
b1d4dd7a
RL
1255 if (node->GetNext())
1256 nextString = node->GetNext()->GetData();
e3a43801 1257 else
b1d4dd7a 1258 nextString = m_strings->GetFirst()->GetData();
e3a43801
JS
1259 property->GetValue() = wxString(nextString);
1260 view->DisplayProperty(property);
1261 view->UpdatePropertyDisplayInList(property);
1262 view->OnPropertyChanged(property);
1263 return TRUE;
1264 }
b1d4dd7a 1265 else node = node->GetNext();
e3a43801
JS
1266 }
1267 return TRUE;
1268}
1269
1270///
1271/// Filename validator
29006414 1272///
e3a43801
JS
1273IMPLEMENT_DYNAMIC_CLASS(wxFilenameListValidator, wxPropertyListValidator)
1274
1275wxFilenameListValidator::wxFilenameListValidator(wxString message , wxString wildcard, long flags):
1276 wxPropertyListValidator(flags), m_filenameWildCard(wildcard), m_filenameMessage(message)
1277{
1278}
1279
22aed133 1280wxFilenameListValidator::~wxFilenameListValidator()
e3a43801
JS
1281{
1282}
1283
8710cf5c 1284bool wxFilenameListValidator::OnCheckValue(wxProperty *WXUNUSED(property), wxPropertyListView *WXUNUSED(view), wxWindow *WXUNUSED(parentWindow))
e3a43801
JS
1285{
1286 return TRUE;
1287}
1288
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
8710cf5c 1292bool wxFilenameListValidator::OnRetrieveValue(wxProperty *property, wxPropertyListView *view, wxWindow *WXUNUSED(parentWindow))
e3a43801
JS
1293{
1294 if (!view->GetValueText())
1295 return FALSE;
1296 wxString value(view->GetValueText()->GetValue());
1297 property->GetValue() = value ;
1298 return TRUE;
1299}
1300
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
8710cf5c 1304bool wxFilenameListValidator::OnDisplayValue(wxProperty *property, wxPropertyListView *view, wxWindow *WXUNUSED(parentWindow))
e3a43801
JS
1305{
1306 if (!view->GetValueText())
1307 return FALSE;
1308 wxString str(property->GetValue().GetStringRepresentation());
1309 view->GetValueText()->SetValue(str);
1310 return TRUE;
1311}
1312
1313// Called when the property is double clicked. Extra functionality can be provided,
1314// cycling through possible values.
1315bool wxFilenameListValidator::OnDoubleClick(wxProperty *property, wxPropertyListView *view, wxWindow *parentWindow)
1316{
1317 if (!view->GetValueText())
1318 return FALSE;
1319 OnEdit(property, view, parentWindow);
1320 return TRUE;
1321}
1322
8710cf5c 1323bool wxFilenameListValidator::OnPrepareControls(wxProperty *WXUNUSED(property), wxPropertyListView *view, wxWindow *WXUNUSED(parentWindow))
e3a43801
JS
1324{
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);
1333 return TRUE;
1334}
1335
1336void wxFilenameListValidator::OnEdit(wxProperty *property, wxPropertyListView *view, wxWindow *parentWindow)
1337{
1338 if (!view->GetValueText())
1339 return;
1340
227869da 1341 wxString s = wxFileSelector(
e3a43801
JS
1342 m_filenameMessage.GetData(),
1343 wxPathOnly(property->GetValue().StringValue()),
1344 wxFileNameFromPath(property->GetValue().StringValue()),
1345 NULL,
1346 m_filenameWildCard.GetData(),
1347 0,
1348 parentWindow);
223d09f6 1349 if (s != wxT(""))
e3a43801 1350 {
227869da 1351 property->GetValue() = s;
e3a43801
JS
1352 view->DisplayProperty(property);
1353 view->UpdatePropertyDisplayInList(property);
1354 view->OnPropertyChanged(property);
1355 }
1356}
1357
1358///
1359/// Colour validator
29006414 1360///
e3a43801
JS
1361IMPLEMENT_DYNAMIC_CLASS(wxColourListValidator, wxPropertyListValidator)
1362
1363wxColourListValidator::wxColourListValidator(long flags):
1364 wxPropertyListValidator(flags)
1365{
1366}
1367
22aed133 1368wxColourListValidator::~wxColourListValidator()
e3a43801
JS
1369{
1370}
1371
8710cf5c 1372bool wxColourListValidator::OnCheckValue(wxProperty *WXUNUSED(property), wxPropertyListView *WXUNUSED(view), wxWindow *WXUNUSED(parentWindow))
e3a43801
JS
1373{
1374 return TRUE;
1375}
1376
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
8710cf5c 1380bool wxColourListValidator::OnRetrieveValue(wxProperty *property, wxPropertyListView *view, wxWindow *WXUNUSED(parentWindow))
e3a43801
JS
1381{
1382 if (!view->GetValueText())
1383 return FALSE;
1384 wxString value(view->GetValueText()->GetValue());
29006414 1385
e3a43801
JS
1386 property->GetValue() = value ;
1387 return TRUE;
1388}
1389
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
8710cf5c 1393bool wxColourListValidator::OnDisplayValue(wxProperty *property, wxPropertyListView *view, wxWindow *WXUNUSED(parentWindow))
e3a43801
JS
1394{
1395 if (!view->GetValueText())
1396 return FALSE;
1397 wxString str(property->GetValue().GetStringRepresentation());
1398 view->GetValueText()->SetValue(str);
1399 return TRUE;
1400}
1401
1402// Called when the property is double clicked. Extra functionality can be provided,
1403// cycling through possible values.
1404bool wxColourListValidator::OnDoubleClick(wxProperty *property, wxPropertyListView *view, wxWindow *parentWindow)
1405{
1406 if (!view->GetValueText())
1407 return FALSE;
1408 OnEdit(property, view, parentWindow);
1409 return TRUE;
1410}
1411
8710cf5c 1412bool wxColourListValidator::OnPrepareControls(wxProperty *WXUNUSED(property), wxPropertyListView *view, wxWindow *WXUNUSED(parentWindow))
e3a43801
JS
1413{
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);
1422 return TRUE;
1423}
1424
1425void wxColourListValidator::OnEdit(wxProperty *property, wxPropertyListView *view, wxWindow *parentWindow)
1426{
1427 if (!view->GetValueText())
1428 return;
29006414 1429
87138c52 1430 wxChar *s = property->GetValue().StringValue();
e3a43801
JS
1431 int r = 0;
1432 int g = 0;
1433 int b = 0;
1434 if (s)
1435 {
1436 r = wxHexToDec(s);
1437 g = wxHexToDec(s+2);
1438 b = wxHexToDec(s+4);
1439 }
29006414 1440
e3a43801 1441 wxColour col(r,g,b);
29006414 1442
e3a43801
JS
1443 wxColourData data;
1444 data.SetChooseFull(TRUE);
1445 data.SetColour(col);
29006414 1446
e3a43801
JS
1447 for (int i = 0; i < 16; i++)
1448 {
1449 wxColour colour(i*16, i*16, i*16);
1450 data.SetCustomColour(i, colour);
1451 }
29006414 1452
e3a43801
JS
1453 wxColourDialog dialog(parentWindow, &data);
1454 if (dialog.ShowModal() != wxID_CANCEL)
1455 {
1456 wxColourData retData = dialog.GetColourData();
1457 col = retData.GetColour();
29006414 1458
87138c52 1459 wxChar buf[7];
e3a43801
JS
1460 wxDecToHex(col.Red(), buf);
1461 wxDecToHex(col.Green(), buf+2);
1462 wxDecToHex(col.Blue(), buf+4);
1463
1464 property->GetValue() = wxString(buf);
1465 view->DisplayProperty(property);
1466 view->UpdatePropertyDisplayInList(property);
1467 view->OnPropertyChanged(property);
1468 }
1469}
1470
1471///
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.
1474///
1475IMPLEMENT_DYNAMIC_CLASS(wxListOfStringsListValidator, wxPropertyListValidator)
1476
1477wxListOfStringsListValidator::wxListOfStringsListValidator(long flags):
1478 wxPropertyListValidator(flags)
1479{
1480}
1481
8710cf5c 1482bool wxListOfStringsListValidator::OnCheckValue(wxProperty *WXUNUSED(property), wxPropertyListView *WXUNUSED(view), wxWindow *WXUNUSED(parentWindow))
e3a43801
JS
1483{
1484 // No constraints for an arbitrary, user-editable list of strings.
1485 return TRUE;
1486}
1487
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.
8710cf5c 1492bool wxListOfStringsListValidator::OnRetrieveValue(wxProperty *WXUNUSED(property), wxPropertyListView *WXUNUSED(view), wxWindow *WXUNUSED(parentWindow))
e3a43801
JS
1493{
1494 return TRUE;
1495}
1496
8710cf5c 1497bool wxListOfStringsListValidator::OnDisplayValue(wxProperty *property, wxPropertyListView *view, wxWindow *WXUNUSED(parentWindow))
e3a43801
JS
1498{
1499 if (!view->GetValueText())
1500 return FALSE;
1501 wxString str(property->GetValue().GetStringRepresentation());
1502 view->GetValueText()->SetValue(str);
1503 return TRUE;
1504}
1505
8710cf5c 1506bool wxListOfStringsListValidator::OnPrepareControls(wxProperty *WXUNUSED(property), wxPropertyListView *view, wxWindow *WXUNUSED(parentWindow))
e3a43801
JS
1507{
1508 if (view->GetEditButton())
1509 view->GetEditButton()->Enable(TRUE);
1510 if (view->GetValueText())
1511 view->GetValueText()->Enable(FALSE);
1512
1513 if (view->GetConfirmButton())
1514 view->GetConfirmButton()->Enable(FALSE);
1515 if (view->GetCancelButton())
1516 view->GetCancelButton()->Enable(FALSE);
1517 return TRUE;
1518}
1519
1520// Called when the property is double clicked. Extra functionality can be provided,
1521// cycling through possible values.
1522bool wxListOfStringsListValidator::OnDoubleClick(wxProperty *property, wxPropertyListView *view, wxWindow *parentWindow)
1523{
1524 OnEdit(property, view, parentWindow);
1525 return TRUE;
1526}
1527
b1d4dd7a
RL
1528void wxListOfStringsListValidator::OnEdit( wxProperty *property,
1529 wxPropertyListView *view,
1530 wxWindow *parentWindow )
e3a43801
JS
1531{
1532 // Convert property value to a list of strings for editing
1533 wxStringList *stringList = new wxStringList;
29006414 1534
e3a43801
JS
1535 wxPropertyValue *expr = property->GetValue().GetFirst();
1536 while (expr)
1537 {
87138c52 1538 wxChar *s = expr->StringValue();
e3a43801
JS
1539 if (s)
1540 stringList->Add(s);
1541 expr = expr->GetNext();
1542 }
29006414 1543
223d09f6 1544 wxString title(wxT("Editing "));
e3a43801 1545 title += property->GetName();
29006414 1546
e3a43801
JS
1547 if (EditStringList(parentWindow, stringList, title.GetData()))
1548 {
1549 wxPropertyValue& oldValue = property->GetValue();
1550 oldValue.ClearList();
b1d4dd7a 1551 wxStringList::Node *node = stringList->GetFirst();
e3a43801
JS
1552 while (node)
1553 {
b1d4dd7a 1554 wxChar *s = node->GetData();
e3a43801 1555 oldValue.Append(new wxPropertyValue(s));
29006414 1556
b1d4dd7a 1557 node = node->GetNext();
e3a43801 1558 }
29006414 1559
e3a43801
JS
1560 view->DisplayProperty(property);
1561 view->UpdatePropertyDisplayInList(property);
1562 view->OnPropertyChanged(property);
1563 }
1564 delete stringList;
1565}
1566
1567class wxPropertyStringListEditorDialog: public wxDialog
1568{
1569 public:
1570 wxPropertyStringListEditorDialog(wxWindow *parent, const wxString& title,
29006414 1571 const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize,
2b5f62a0 1572 long windowStyle = wxDEFAULT_DIALOG_STYLE, const wxString& name = wxT("stringEditorDialogBox")):
29006414 1573 wxDialog(parent, -1, title, pos, size, windowStyle, name)
e3a43801
JS
1574 {
1575 m_stringList = NULL;
1576 m_stringText = NULL;
1577 m_listBox = NULL;
1578 sm_dialogCancelled = FALSE;
1579 m_currentSelection = -1;
1580 }
1581 ~wxPropertyStringListEditorDialog(void) {}
3b1e466c 1582 void OnCloseWindow(wxCloseEvent& event);
e3a43801
JS
1583 void SaveCurrentSelection(void);
1584 void ShowCurrentSelection(void);
1585
29006414
VZ
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);
e3a43801
JS
1592
1593public:
1594 wxStringList* m_stringList;
1595 wxListBox* m_listBox;
1596 wxTextCtrl* m_stringText;
1597 static bool sm_dialogCancelled;
1598 int m_currentSelection;
1599DECLARE_EVENT_TABLE()
1600};
1601
29006414
VZ
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
e3a43801
JS
1606
1607BEGIN_EVENT_TABLE(wxPropertyStringListEditorDialog, wxDialog)
29006414
VZ
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)
3b1e466c 1614 EVT_CLOSE(wxPropertyStringListEditorDialog::OnCloseWindow)
e3a43801
JS
1615END_EVENT_TABLE()
1616
1617class wxPropertyStringListEditorText: public wxTextCtrl
1618{
1619 public:
1620 wxPropertyStringListEditorText(wxWindow *parent, wxWindowID id, const wxString& val,
29006414 1621 const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize,
2b5f62a0 1622 long windowStyle = 0, const wxString& name = wxT("text")):
e3a43801
JS
1623 wxTextCtrl(parent, id, val, pos, size, windowStyle, wxDefaultValidator, name)
1624 {
1625 }
22aed133 1626 void OnKillFocus()
e3a43801
JS
1627 {
1628 wxPropertyStringListEditorDialog *dialog = (wxPropertyStringListEditorDialog *)GetParent();
1629 dialog->SaveCurrentSelection();
1630 }
1631};
1632
1633bool wxPropertyStringListEditorDialog::sm_dialogCancelled = FALSE;
1634
1635// Edit the string list.
87138c52 1636bool wxListOfStringsListValidator::EditStringList(wxWindow *parent, wxStringList *stringList, const wxChar *title)
e3a43801
JS
1637{
1638 int largeButtonWidth = 60;
1639 int largeButtonHeight = 25;
1640
1641 wxBeginBusyCursor();
1642 wxPropertyStringListEditorDialog *dialog = new wxPropertyStringListEditorDialog(parent,
29006414
VZ
1643 title, wxPoint(10, 10), wxSize(400, 400), wxDEFAULT_DIALOG_STYLE|wxDIALOG_MODAL);
1644
e3a43801 1645 dialog->m_stringList = stringList;
29006414 1646
e3a43801
JS
1647 dialog->m_listBox = new wxListBox(dialog, wxID_PROP_SL_STRINGS,
1648 wxPoint(-1, -1), wxSize(-1, -1), 0, NULL, wxLB_SINGLE);
1649
1650 dialog->m_stringText = new wxPropertyStringListEditorText(dialog,
2b5f62a0 1651 wxID_PROP_SL_TEXT, wxT(""), wxPoint(5, 240),
e3a43801
JS
1652 wxSize(300, -1), wxPROCESS_ENTER);
1653 dialog->m_stringText->Enable(FALSE);
1654
2b5f62a0
VZ
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));
e3a43801 1659
42b4e99e 1660#ifndef __WXGTK__
e3a43801 1661 okButton->SetDefault();
42b4e99e 1662#endif
e3a43801
JS
1663
1664 wxLayoutConstraints *c = new wxLayoutConstraints;
1665
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);
1671
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);
1676 c->height.AsIs();
1677 dialog->m_stringText->SetConstraints(c);
1678
1679 c = new wxLayoutConstraints;
1680 c->bottom.SameAs (dialog, wxBottom, 2);
1681 c->left.SameAs (dialog, wxLeft, 2);
1682 c->width.AsIs();
1683 c->height.AsIs();
1684 addButton->SetConstraints(c);
1685
1686 c = new wxLayoutConstraints;
1687 c->bottom.SameAs (dialog, wxBottom, 2);
1688 c->left.SameAs (addButton, wxRight, 2);
1689 c->width.AsIs();
1690 c->height.AsIs();
1691 deleteButton->SetConstraints(c);
1692
1693 c = new wxLayoutConstraints;
1694 c->bottom.SameAs (dialog, wxBottom, 2);
1695 c->right.SameAs (dialog, wxRight, 2);
1696 c->width.AsIs();
1697 c->height.AsIs();
1698 cancelButton->SetConstraints(c);
1699
1700 c = new wxLayoutConstraints;
1701 c->bottom.SameAs (dialog, wxBottom, 2);
1702 c->right.SameAs (cancelButton, wxLeft, 2);
1703 c->width.AsIs();
1704 c->height.AsIs();
1705 okButton->SetConstraints(c);
1706
b1d4dd7a 1707 wxStringList::Node *node = stringList->GetFirst();
e3a43801
JS
1708 while (node)
1709 {
b1d4dd7a 1710 wxChar *str = node->GetData();
e3a43801 1711 // Save node as client data for each listbox item
2b5f62a0 1712 dialog->m_listBox->Append(str, (wxChar *)node);
b1d4dd7a 1713 node = node->GetNext();
e3a43801
JS
1714 }
1715
1716 dialog->SetClientSize(310, 305);
1717 dialog->Layout();
1718
1719 dialog->Centre(wxBOTH);
1720 wxEndBusyCursor();
1721 if (dialog->ShowModal() == wxID_CANCEL)
29006414 1722 return FALSE;
e3a43801 1723 else
29006414 1724 return TRUE;
e3a43801
JS
1725}
1726
1727/*
1728 * String list editor callbacks
1729 *
1730 */
1731
1732void wxPropertyStringListEditorDialog::OnStrings(wxCommandEvent& WXUNUSED(event))
1733{
1734 int sel = m_listBox->GetSelection();
1735 if (sel > -1)
1736 {
1737 m_currentSelection = sel;
1738
1739 ShowCurrentSelection();
1740 }
1741}
1742
1743void wxPropertyStringListEditorDialog::OnDelete(wxCommandEvent& WXUNUSED(event))
1744{
1745 int sel = m_listBox->GetSelection();
1746 if (sel == -1)
1747 return;
29006414 1748
e3a43801
JS
1749 wxNode *node = (wxNode *)m_listBox->wxListBox::GetClientData(sel);
1750 if (!node)
1751 return;
29006414 1752
e3a43801 1753 m_listBox->Delete(sel);
b1d4dd7a 1754 delete[] (wxChar *)node->GetData();
e3a43801
JS
1755 delete node;
1756 m_currentSelection = -1;
9dae7a02 1757 m_stringText->SetValue(_T(""));
e3a43801
JS
1758}
1759
1760void wxPropertyStringListEditorDialog::OnAdd(wxCommandEvent& WXUNUSED(event))
1761{
1762 SaveCurrentSelection();
29006414 1763
9dae7a02 1764 wxString initialText;
e3a43801 1765 wxNode *node = m_stringList->Add(initialText);
ee0fc54a 1766 m_listBox->Append(initialText, (void *)node);
b1d4dd7a 1767 m_currentSelection = m_stringList->GetCount() - 1;
e3a43801
JS
1768 m_listBox->SetSelection(m_currentSelection);
1769 ShowCurrentSelection();
1770 m_stringText->SetFocus();
1771}
1772
1773void wxPropertyStringListEditorDialog::OnOK(wxCommandEvent& WXUNUSED(event))
1774{
1775 SaveCurrentSelection();
1776 EndModal(wxID_OK);
3b1e466c
JS
1777 // Close(TRUE);
1778 this->Destroy();
e3a43801
JS
1779}
1780
1781void wxPropertyStringListEditorDialog::OnCancel(wxCommandEvent& WXUNUSED(event))
1782{
1783 sm_dialogCancelled = TRUE;
1784 EndModal(wxID_CANCEL);
3b1e466c
JS
1785// Close(TRUE);
1786 this->Destroy();
e3a43801
JS
1787}
1788
1789void wxPropertyStringListEditorDialog::OnText(wxCommandEvent& event)
1790{
2432b92d 1791 if (event.GetEventType() == wxEVT_COMMAND_TEXT_ENTER)
e3a43801
JS
1792 {
1793 SaveCurrentSelection();
1794 }
1795}
1796
6e31e940
VZ
1797void
1798wxPropertyStringListEditorDialog::OnCloseWindow(wxCloseEvent& WXUNUSED(event))
e3a43801
JS
1799{
1800 SaveCurrentSelection();
6e31e940
VZ
1801
1802 Destroy();
e3a43801
JS
1803}
1804
22aed133 1805void wxPropertyStringListEditorDialog::SaveCurrentSelection()
e3a43801
JS
1806{
1807 if (m_currentSelection == -1)
1808 return;
29006414 1809
e3a43801
JS
1810 wxNode *node = (wxNode *)m_listBox->wxListBox::GetClientData(m_currentSelection);
1811 if (!node)
1812 return;
29006414 1813
e3a43801 1814 wxString txt(m_stringText->GetValue());
b1d4dd7a
RL
1815 if (node->GetData())
1816 delete[] (wxChar *)node->GetData();
2b5f62a0 1817 node->SetData((wxObject *)wxStrdup(txt));
29006414 1818
b1d4dd7a 1819 m_listBox->SetString(m_currentSelection, (wxChar *)node->GetData());
e3a43801
JS
1820}
1821
22aed133 1822void wxPropertyStringListEditorDialog::ShowCurrentSelection()
e3a43801
JS
1823{
1824 if (m_currentSelection == -1)
1825 {
2b5f62a0 1826 m_stringText->SetValue(wxT(""));
e3a43801
JS
1827 return;
1828 }
1829 wxNode *node = (wxNode *)m_listBox->wxListBox::GetClientData(m_currentSelection);
b1d4dd7a 1830 wxChar *txt = (wxChar *)node->GetData();
e3a43801
JS
1831 m_stringText->SetValue(txt);
1832 m_stringText->Enable(TRUE);
1833}
1834
42b4e99e 1835
1e6feb95 1836#endif // wxUSE_PROPSHEET