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