xref: /trunk/main/extensions/source/dbpilots/groupboxwiz.cxx (revision cdf0e10c4e3984b49a9502b011690b615761d4a3)
1 /*************************************************************************
2  *
3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4  *
5  * Copyright 2000, 2010 Oracle and/or its affiliates.
6  *
7  * OpenOffice.org - a multi-platform office productivity suite
8  *
9  * This file is part of OpenOffice.org.
10  *
11  * OpenOffice.org is free software: you can redistribute it and/or modify
12  * it under the terms of the GNU Lesser General Public License version 3
13  * only, as published by the Free Software Foundation.
14  *
15  * OpenOffice.org is distributed in the hope that it will be useful,
16  * but WITHOUT ANY WARRANTY; without even the implied warranty of
17  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18  * GNU Lesser General Public License version 3 for more details
19  * (a copy is included in the LICENSE file that accompanied this code).
20  *
21  * You should have received a copy of the GNU Lesser General Public License
22  * version 3 along with OpenOffice.org.  If not, see
23  * <http://www.openoffice.org/license.html>
24  * for a copy of the LGPLv3 License.
25  *
26  ************************************************************************/
27 
28 // MARKER(update_precomp.py): autogen include statement, do not remove
29 #include "precompiled_extensions.hxx"
30 #include "groupboxwiz.hxx"
31 #include "commonpagesdbp.hxx"
32 #include <tools/debug.hxx>
33 #include <vcl/svapp.hxx>
34 #include <vcl/msgbox.hxx>
35 #include "optiongrouplayouter.hxx"
36 #include "dbpilots.hrc"
37 
38 
39 //#define GBW_STATE_DATASELECTION       0
40 #define GBW_STATE_OPTIONLIST        0
41 #define GBW_STATE_DEFAULTOPTION     1
42 #define GBW_STATE_OPTIONVALUES      2
43 #define GBW_STATE_DBFIELD           3
44 #define GBW_STATE_FINALIZE          4
45 
46 //.........................................................................
47 namespace dbp
48 {
49 //.........................................................................
50 
51     using namespace ::com::sun::star::uno;
52     using namespace ::com::sun::star::lang;
53     using namespace ::com::sun::star::beans;
54     using namespace ::com::sun::star::form;
55     using namespace ::svt;
56 
57     //=====================================================================
58     //= OGroupBoxWizard
59     //=====================================================================
60     //---------------------------------------------------------------------
61     OGroupBoxWizard::OGroupBoxWizard( Window* _pParent,
62             const Reference< XPropertySet >& _rxObjectModel, const Reference< XMultiServiceFactory >& _rxORB )
63         :OControlWizard(_pParent, ModuleRes(RID_DLG_GROUPBOXWIZARD), _rxObjectModel, _rxORB)
64         ,m_bVisitedDefault(sal_False)
65         ,m_bVisitedDB(sal_False)
66     {
67         initControlSettings(&m_aSettings);
68 
69         m_pPrevPage->SetHelpId(HID_GROUPWIZARD_PREVIOUS);
70         m_pNextPage->SetHelpId(HID_GROUPWIZARD_NEXT);
71         m_pCancel->SetHelpId(HID_GROUPWIZARD_CANCEL);
72         m_pFinish->SetHelpId(HID_GROUPWIZARD_FINISH);
73     }
74 
75     //---------------------------------------------------------------------
76     sal_Bool OGroupBoxWizard::approveControl(sal_Int16 _nClassId)
77     {
78         return FormComponentType::GROUPBOX == _nClassId;
79     }
80 
81     //---------------------------------------------------------------------
82     OWizardPage* OGroupBoxWizard::createPage(::svt::WizardTypes::WizardState _nState)
83     {
84         switch (_nState)
85         {
86 //          case GBW_STATE_DATASELECTION:
87 //              return new OTableSelectionPage(this);
88 //
89             case GBW_STATE_OPTIONLIST:
90                 return new ORadioSelectionPage(this);
91 
92             case GBW_STATE_DEFAULTOPTION:
93                 return new ODefaultFieldSelectionPage(this);
94 
95             case GBW_STATE_OPTIONVALUES:
96                 return new OOptionValuesPage(this);
97 
98             case GBW_STATE_DBFIELD:
99                 return new OOptionDBFieldPage(this);
100 
101             case GBW_STATE_FINALIZE:
102                 return new OFinalizeGBWPage(this);
103         }
104 
105         return NULL;
106     }
107 
108     //---------------------------------------------------------------------
109     WizardTypes::WizardState OGroupBoxWizard::determineNextState( ::svt::WizardTypes::WizardState _nCurrentState ) const
110     {
111         switch (_nCurrentState)
112         {
113 //          case GBW_STATE_DATASELECTION:
114 //              return GBW_STATE_OPTIONLIST;
115 //
116             case GBW_STATE_OPTIONLIST:
117                 return GBW_STATE_DEFAULTOPTION;
118 
119             case GBW_STATE_DEFAULTOPTION:
120                 return GBW_STATE_OPTIONVALUES;
121 
122             case GBW_STATE_OPTIONVALUES:
123                 if (getContext().aFieldNames.getLength())
124                     return GBW_STATE_DBFIELD;
125                 else
126                     return GBW_STATE_FINALIZE;
127 
128             case GBW_STATE_DBFIELD:
129                 return GBW_STATE_FINALIZE;
130         }
131 
132         return WZS_INVALID_STATE;
133     }
134 
135     //---------------------------------------------------------------------
136     void OGroupBoxWizard::enterState(::svt::WizardTypes::WizardState _nState)
137     {
138         // some stuff to do before calling the base class (modifying our settings)
139         switch (_nState)
140         {
141             case GBW_STATE_DEFAULTOPTION:
142                 if (!m_bVisitedDefault)
143                 {   // assume that the first of the radio buttons should be selected
144                     DBG_ASSERT(m_aSettings.aLabels.size(), "OGroupBoxWizard::enterState: should never have reached this state!");
145                     m_aSettings.sDefaultField = m_aSettings.aLabels[0];
146                 }
147                 m_bVisitedDefault = sal_True;
148                 break;
149 
150             case GBW_STATE_DBFIELD:
151                 if (!m_bVisitedDB)
152                 {   // try to generate a default for the DB field
153                     // (simply use the first field in the DB names collection)
154                     if (getContext().aFieldNames.getLength())
155                         m_aSettings.sDBField = getContext().aFieldNames[0];
156                 }
157                 m_bVisitedDB = sal_True;
158                 break;
159         }
160 
161         // setting the def button .... to be done before the base class is called, too, 'cause the base class
162         // calls the pages, which are allowed to override our def button behaviour
163         defaultButton(GBW_STATE_FINALIZE == _nState ? WZB_FINISH : WZB_NEXT);
164 
165         // allow "finish" on the last page only
166         enableButtons(WZB_FINISH, GBW_STATE_FINALIZE == _nState);
167         // allow previous on all pages but the first one
168         enableButtons(WZB_PREVIOUS, GBW_STATE_OPTIONLIST != _nState);
169         // allow next on all pages but the last one
170         enableButtons(WZB_NEXT, GBW_STATE_FINALIZE != _nState);
171 
172         OControlWizard::enterState(_nState);
173     }
174 
175     //---------------------------------------------------------------------
176     void OGroupBoxWizard::createRadios()
177     {
178         try
179         {
180             OOptionGroupLayouter aLayouter(getServiceFactory());
181             aLayouter.doLayout(getContext(), getSettings());
182         }
183         catch(Exception&)
184         {
185             DBG_ERROR("OGroupBoxWizard::createRadios: caught an exception while creating the radio shapes!");
186         }
187     }
188 
189     //---------------------------------------------------------------------
190     sal_Bool OGroupBoxWizard::onFinish()
191     {
192         // commit the basic control setttings
193         commitControlSettings(&m_aSettings);
194 
195         // create the radio buttons
196         createRadios();
197 
198         return OControlWizard::onFinish();
199     }
200 
201     //=====================================================================
202     //= ORadioSelectionPage
203     //=====================================================================
204     //---------------------------------------------------------------------
205     ORadioSelectionPage::ORadioSelectionPage( OControlWizard* _pParent )
206         :OGBWPage(_pParent, ModuleRes(RID_PAGE_GROUPRADIOSELECTION))
207         ,m_aFrame               (this, ModuleRes(FL_DATA))
208         ,m_aRadioNameLabel      (this, ModuleRes(FT_RADIOLABELS))
209         ,m_aRadioName           (this, ModuleRes(ET_RADIOLABELS))
210         ,m_aMoveRight           (this, ModuleRes(PB_MOVETORIGHT))
211         ,m_aMoveLeft            (this, ModuleRes(PB_MOVETOLEFT))
212         ,m_aExistingRadiosLabel (this, ModuleRes(FT_RADIOBUTTONS))
213         ,m_aExistingRadios      (this, ModuleRes(LB_RADIOBUTTONS))
214     {
215         FreeResource();
216 
217         if (getContext().aFieldNames.getLength())
218         {
219             enableFormDatasourceDisplay();
220         }
221         else
222         {
223             adjustControlForNoDSDisplay(&m_aFrame);
224             adjustControlForNoDSDisplay(&m_aRadioNameLabel);
225             adjustControlForNoDSDisplay(&m_aRadioName);
226             adjustControlForNoDSDisplay(&m_aMoveRight);
227             adjustControlForNoDSDisplay(&m_aMoveLeft);
228             adjustControlForNoDSDisplay(&m_aExistingRadiosLabel);
229             adjustControlForNoDSDisplay(&m_aExistingRadios, sal_True);
230         }
231 
232         m_aMoveLeft.SetClickHdl(LINK(this, ORadioSelectionPage, OnMoveEntry));
233         m_aMoveRight.SetClickHdl(LINK(this, ORadioSelectionPage, OnMoveEntry));
234         m_aRadioName.SetModifyHdl(LINK(this, ORadioSelectionPage, OnNameModified));
235         m_aExistingRadios.SetSelectHdl(LINK(this, ORadioSelectionPage, OnEntrySelected));
236 
237         implCheckMoveButtons();
238         m_aExistingRadios.EnableMultiSelection(sal_True);
239 
240         getDialog()->defaultButton(&m_aMoveRight);
241 
242         m_aExistingRadios.SetAccessibleRelationMemberOf(&m_aExistingRadios);
243         m_aExistingRadios.SetAccessibleRelationLabeledBy(&m_aExistingRadiosLabel);
244     }
245 
246     //---------------------------------------------------------------------
247     void ORadioSelectionPage::ActivatePage()
248     {
249         OGBWPage::ActivatePage();
250         m_aRadioName.GrabFocus();
251     }
252 
253     //---------------------------------------------------------------------
254     void ORadioSelectionPage::initializePage()
255     {
256         OGBWPage::initializePage();
257 
258         m_aRadioName.SetText(String());
259 
260         // no need to initialize the list of radios here
261         // (we're the only one affecting this special setting, so it will be in the same state as last time this
262         // page was commited)
263 
264         implCheckMoveButtons();
265     }
266 
267     //---------------------------------------------------------------------
268     sal_Bool ORadioSelectionPage::commitPage( ::svt::WizardTypes::CommitPageReason _eReason )
269     {
270         if (!OGBWPage::commitPage(_eReason))
271             return sal_False;
272 
273         // copy the names of the radio buttons to be inserted
274         // and initialize the values
275         OOptionGroupSettings& rSettings = getSettings();
276         rSettings.aLabels.clear();
277         rSettings.aValues.clear();
278         rSettings.aLabels.reserve(m_aExistingRadios.GetEntryCount());
279         rSettings.aValues.reserve(m_aExistingRadios.GetEntryCount());
280         for (::svt::WizardTypes::WizardState i=0; i<m_aExistingRadios.GetEntryCount(); ++i)
281         {
282             rSettings.aLabels.push_back(m_aExistingRadios.GetEntry(i));
283             rSettings.aValues.push_back(String::CreateFromInt32((sal_Int32)(i + 1)));
284         }
285 
286         return sal_True;
287     }
288 
289     //---------------------------------------------------------------------
290     IMPL_LINK( ORadioSelectionPage, OnMoveEntry, PushButton*, _pButton )
291     {
292         sal_Bool bMoveLeft = (&m_aMoveLeft == _pButton);
293         if (bMoveLeft)
294         {
295             while (m_aExistingRadios.GetSelectEntryCount())
296                 m_aExistingRadios.RemoveEntry(m_aExistingRadios.GetSelectEntryPos(0));
297         }
298         else
299         {
300             m_aExistingRadios.InsertEntry(m_aRadioName.GetText());
301             m_aRadioName.SetText(String());
302         }
303 
304         implCheckMoveButtons();
305 
306         //adjust the focus
307         if (bMoveLeft)
308             m_aExistingRadios.GrabFocus();
309         else
310             m_aRadioName.GrabFocus();
311         return 0L;
312     }
313 
314     //---------------------------------------------------------------------
315     IMPL_LINK( ORadioSelectionPage, OnEntrySelected, ListBox*, /*_pList*/ )
316     {
317         implCheckMoveButtons();
318         return 0L;
319     }
320 
321     //---------------------------------------------------------------------
322     IMPL_LINK( ORadioSelectionPage, OnNameModified, Edit*, /*_pList*/ )
323     {
324         implCheckMoveButtons();
325         return 0L;
326     }
327 
328     //---------------------------------------------------------------------
329     bool ORadioSelectionPage::canAdvance() const
330     {
331         return 0 != m_aExistingRadios.GetEntryCount();
332     }
333 
334     //---------------------------------------------------------------------
335     void ORadioSelectionPage::implCheckMoveButtons()
336     {
337         sal_Bool bHaveSome = (0 != m_aExistingRadios.GetEntryCount());
338         sal_Bool bSelectedSome = (0 != m_aExistingRadios.GetSelectEntryCount());
339         sal_Bool bUnfinishedInput = (0 != m_aRadioName.GetText().Len());
340 
341         m_aMoveLeft.Enable(bSelectedSome);
342         m_aMoveRight.Enable(bUnfinishedInput);
343 
344         getDialog()->enableButtons(WZB_NEXT, bHaveSome);
345 
346         if (bUnfinishedInput)
347         {
348             if (0 == (m_aMoveRight.GetStyle() & WB_DEFBUTTON))
349                 getDialog()->defaultButton(&m_aMoveRight);
350         }
351         else
352         {
353             if (WB_DEFBUTTON == (m_aMoveRight.GetStyle() & WB_DEFBUTTON))
354                 getDialog()->defaultButton(WZB_NEXT);
355         }
356     }
357 
358     //=====================================================================
359     //= ODefaultFieldSelectionPage
360     //=====================================================================
361     //---------------------------------------------------------------------
362     ODefaultFieldSelectionPage::ODefaultFieldSelectionPage( OControlWizard* _pParent )
363         :OMaybeListSelectionPage(_pParent, ModuleRes(RID_PAGE_DEFAULTFIELDSELECTION))
364         ,m_aFrame                   (this, ModuleRes(FL_DEFAULTSELECTION))
365         ,m_aDefaultSelectionLabel   (this, ModuleRes(FT_DEFAULTSELECTION))
366         ,m_aDefSelYes               (this, ModuleRes(RB_DEFSELECTION_YES))
367         ,m_aDefSelNo                (this, ModuleRes(RB_DEFSELECTION_NO))
368         ,m_aDefSelection            (this, ModuleRes(LB_DEFSELECTIONFIELD))
369     {
370         FreeResource();
371 
372         announceControls(m_aDefSelYes, m_aDefSelNo, m_aDefSelection);
373         m_aDefSelection.SetDropDownLineCount(10);
374         m_aDefSelection.SetAccessibleRelationLabeledBy( &m_aDefSelYes );
375         m_aDefSelection.SetAccessibleRelationMemberOf(&m_aDefaultSelectionLabel);
376     }
377 
378     //---------------------------------------------------------------------
379     void ODefaultFieldSelectionPage::initializePage()
380     {
381         OMaybeListSelectionPage::initializePage();
382 
383         const OOptionGroupSettings& rSettings = getSettings();
384 
385         // fill the listbox
386         m_aDefSelection.Clear();
387         for (   ConstStringArrayIterator aLoop = rSettings.aLabels.begin();
388                 aLoop != rSettings.aLabels.end();
389                 ++aLoop
390             )
391             m_aDefSelection.InsertEntry(*aLoop);
392 
393 
394         implInitialize(rSettings.sDefaultField);
395     }
396 
397     //---------------------------------------------------------------------
398     sal_Bool ODefaultFieldSelectionPage::commitPage( ::svt::WizardTypes::CommitPageReason _eReason )
399     {
400         if (!OMaybeListSelectionPage::commitPage(_eReason))
401             return sal_False;
402 
403         OOptionGroupSettings& rSettings = getSettings();
404         implCommit(rSettings.sDefaultField);
405 
406         return sal_True;
407     }
408 
409     //=====================================================================
410     //= OOptionValuesPage
411     //=====================================================================
412     //---------------------------------------------------------------------
413     OOptionValuesPage::OOptionValuesPage( OControlWizard* _pParent )
414         :OGBWPage(_pParent, ModuleRes(RID_PAGE_OPTIONVALUES))
415         ,m_aFrame               (this, ModuleRes(FL_OPTIONVALUES))
416         ,m_aDescription         (this, ModuleRes(FT_OPTIONVALUES_EXPL))
417         ,m_aValueLabel          (this, ModuleRes(FT_OPTIONVALUES))
418         ,m_aValue               (this, ModuleRes(ET_OPTIONVALUE))
419         ,m_aOptionsLabel        (this, ModuleRes(FT_RADIOBUTTONS))
420         ,m_aOptions             (this, ModuleRes(LB_RADIOBUTTONS))
421         ,m_nLastSelection((::svt::WizardTypes::WizardState)-1)
422     {
423         FreeResource();
424 
425         m_aOptions.SetSelectHdl(LINK(this, OOptionValuesPage, OnOptionSelected));
426 
427         m_aOptions.SetAccessibleRelationMemberOf(&m_aOptions);
428         m_aOptions.SetAccessibleRelationLabeledBy(&m_aOptionsLabel);
429     }
430 
431     //---------------------------------------------------------------------
432     IMPL_LINK( OOptionValuesPage, OnOptionSelected, ListBox*, /*NOTINTERESTEDIN*/ )
433     {
434         implTraveledOptions();
435         return 0L;
436     }
437 
438     //---------------------------------------------------------------------
439     void OOptionValuesPage::ActivatePage()
440     {
441         OGBWPage::ActivatePage();
442         m_aValue.GrabFocus();
443     }
444 
445     //---------------------------------------------------------------------
446     void OOptionValuesPage::implTraveledOptions()
447     {
448         if ((::svt::WizardTypes::WizardState)-1 != m_nLastSelection)
449         {
450             // save the value for the last option
451             DBG_ASSERT((size_t)m_nLastSelection < m_aUncommittedValues.size(), "OOptionValuesPage::implTraveledOptions: invalid previous selection index!");
452             m_aUncommittedValues[m_nLastSelection] = m_aValue.GetText();
453         }
454 
455         m_nLastSelection = m_aOptions.GetSelectEntryPos();
456         DBG_ASSERT((size_t)m_nLastSelection < m_aUncommittedValues.size(), "OOptionValuesPage::implTraveledOptions: invalid new selection index!");
457         m_aValue.SetText(m_aUncommittedValues[m_nLastSelection]);
458     }
459 
460     //---------------------------------------------------------------------
461     void OOptionValuesPage::initializePage()
462     {
463         OGBWPage::initializePage();
464 
465         const OOptionGroupSettings& rSettings = getSettings();
466         DBG_ASSERT(rSettings.aLabels.size(), "OOptionValuesPage::initializePage: no options!!");
467         DBG_ASSERT(rSettings.aLabels.size() == rSettings.aValues.size(), "OOptionValuesPage::initializePage: inconsistent data!");
468 
469         // fill the list with all available options
470         m_aOptions.Clear();
471         m_nLastSelection = -1;
472         for (   ConstStringArrayIterator aLoop = rSettings.aLabels.begin();
473                 aLoop != rSettings.aLabels.end();
474                 ++aLoop
475             )
476             m_aOptions.InsertEntry(*aLoop);
477 
478         // remember the values ... can't set them directly in the settings without the explicit commit call
479         // so we need have a copy of the values
480         m_aUncommittedValues = rSettings.aValues;
481 
482         // select the first entry
483         m_aOptions.SelectEntryPos(0);
484         implTraveledOptions();
485     }
486 
487     //---------------------------------------------------------------------
488     sal_Bool OOptionValuesPage::commitPage( ::svt::WizardTypes::CommitPageReason _eReason )
489     {
490         if (!OGBWPage::commitPage(_eReason))
491             return sal_False;
492 
493         OOptionGroupSettings& rSettings = getSettings();
494 
495         // commit the current value
496         implTraveledOptions();
497         // copy the uncommitted values
498         rSettings.aValues = m_aUncommittedValues;
499 
500         return sal_True;
501     }
502 
503     //=====================================================================
504     //= OOptionDBFieldPage
505     //=====================================================================
506     //---------------------------------------------------------------------
507     OOptionDBFieldPage::OOptionDBFieldPage( OControlWizard* _pParent )
508         :ODBFieldPage(_pParent)
509     {
510         setDescriptionText(String(ModuleRes(RID_STR_GROUPWIZ_DBFIELD)));
511     }
512 
513     //---------------------------------------------------------------------
514     String& OOptionDBFieldPage::getDBFieldSetting()
515     {
516         return getSettings().sDBField;
517     }
518 
519     //=====================================================================
520     //= OFinalizeGBWPage
521     //=====================================================================
522     //---------------------------------------------------------------------
523     OFinalizeGBWPage::OFinalizeGBWPage( OControlWizard* _pParent )
524         :OGBWPage(_pParent, ModuleRes(RID_PAGE_OPTIONS_FINAL))
525         ,m_aFrame           (this, ModuleRes(FL_NAMEIT))
526         ,m_aNameLabel       (this, ModuleRes(FT_NAMEIT))
527         ,m_aName            (this, ModuleRes(ET_NAMEIT))
528         ,m_aThatsAll        (this, ModuleRes(FT_THATSALL))
529     {
530         FreeResource();
531     }
532 
533     //---------------------------------------------------------------------
534     void OFinalizeGBWPage::ActivatePage()
535     {
536         OGBWPage::ActivatePage();
537         m_aName.GrabFocus();
538     }
539 
540     //---------------------------------------------------------------------
541     bool OFinalizeGBWPage::canAdvance() const
542     {
543         return false;
544     }
545 
546     //---------------------------------------------------------------------
547     void OFinalizeGBWPage::initializePage()
548     {
549         OGBWPage::initializePage();
550 
551         const OOptionGroupSettings& rSettings = getSettings();
552         m_aName.SetText(rSettings.sControlLabel);
553     }
554 
555     //---------------------------------------------------------------------
556     sal_Bool OFinalizeGBWPage::commitPage( ::svt::WizardTypes::CommitPageReason _eReason )
557     {
558         if (!OGBWPage::commitPage(_eReason))
559             return sal_False;
560 
561         getSettings().sControlLabel = m_aName.GetText();
562 
563         return sal_True;
564     }
565 
566 //.........................................................................
567 }   // namespace dbp
568 //.........................................................................
569 
570