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