summaryrefslogtreecommitdiff
path: root/extensions/source/dbpilots/groupboxwiz.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'extensions/source/dbpilots/groupboxwiz.cxx')
-rw-r--r--extensions/source/dbpilots/groupboxwiz.cxx565
1 files changed, 565 insertions, 0 deletions
diff --git a/extensions/source/dbpilots/groupboxwiz.cxx b/extensions/source/dbpilots/groupboxwiz.cxx
new file mode 100644
index 000000000000..c171ed581ef3
--- /dev/null
+++ b/extensions/source/dbpilots/groupboxwiz.cxx
@@ -0,0 +1,565 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+// MARKER(update_precomp.py): autogen include statement, do not remove
+#include "precompiled_extensions.hxx"
+#include "groupboxwiz.hxx"
+#include "commonpagesdbp.hxx"
+#include <tools/debug.hxx>
+#include <vcl/svapp.hxx>
+#include <vcl/msgbox.hxx>
+#include "optiongrouplayouter.hxx"
+#include "dbpilots.hrc"
+
+
+//#define GBW_STATE_DATASELECTION 0
+#define GBW_STATE_OPTIONLIST 0
+#define GBW_STATE_DEFAULTOPTION 1
+#define GBW_STATE_OPTIONVALUES 2
+#define GBW_STATE_DBFIELD 3
+#define GBW_STATE_FINALIZE 4
+
+//.........................................................................
+namespace dbp
+{
+//.........................................................................
+
+ using namespace ::com::sun::star::uno;
+ using namespace ::com::sun::star::lang;
+ using namespace ::com::sun::star::beans;
+ using namespace ::com::sun::star::form;
+ using namespace ::svt;
+
+ //=====================================================================
+ //= OGroupBoxWizard
+ //=====================================================================
+ //---------------------------------------------------------------------
+ OGroupBoxWizard::OGroupBoxWizard( Window* _pParent,
+ const Reference< XPropertySet >& _rxObjectModel, const Reference< XMultiServiceFactory >& _rxORB )
+ :OControlWizard(_pParent, ModuleRes(RID_DLG_GROUPBOXWIZARD), _rxObjectModel, _rxORB)
+ ,m_bVisitedDefault(sal_False)
+ ,m_bVisitedDB(sal_False)
+ {
+ initControlSettings(&m_aSettings);
+
+ m_pPrevPage->SetHelpId(HID_GROUPWIZARD_PREVIOUS);
+ m_pNextPage->SetHelpId(HID_GROUPWIZARD_NEXT);
+ m_pCancel->SetHelpId(HID_GROUPWIZARD_CANCEL);
+ m_pFinish->SetHelpId(HID_GROUPWIZARD_FINISH);
+ }
+
+ //---------------------------------------------------------------------
+ sal_Bool OGroupBoxWizard::approveControl(sal_Int16 _nClassId)
+ {
+ return FormComponentType::GROUPBOX == _nClassId;
+ }
+
+ //---------------------------------------------------------------------
+ OWizardPage* OGroupBoxWizard::createPage(::svt::WizardTypes::WizardState _nState)
+ {
+ switch (_nState)
+ {
+ case GBW_STATE_OPTIONLIST:
+ return new ORadioSelectionPage(this);
+
+ case GBW_STATE_DEFAULTOPTION:
+ return new ODefaultFieldSelectionPage(this);
+
+ case GBW_STATE_OPTIONVALUES:
+ return new OOptionValuesPage(this);
+
+ case GBW_STATE_DBFIELD:
+ return new OOptionDBFieldPage(this);
+
+ case GBW_STATE_FINALIZE:
+ return new OFinalizeGBWPage(this);
+ }
+
+ return NULL;
+ }
+
+ //---------------------------------------------------------------------
+ WizardTypes::WizardState OGroupBoxWizard::determineNextState( ::svt::WizardTypes::WizardState _nCurrentState ) const
+ {
+ switch (_nCurrentState)
+ {
+ case GBW_STATE_OPTIONLIST:
+ return GBW_STATE_DEFAULTOPTION;
+
+ case GBW_STATE_DEFAULTOPTION:
+ return GBW_STATE_OPTIONVALUES;
+
+ case GBW_STATE_OPTIONVALUES:
+ if (getContext().aFieldNames.getLength())
+ return GBW_STATE_DBFIELD;
+ else
+ return GBW_STATE_FINALIZE;
+
+ case GBW_STATE_DBFIELD:
+ return GBW_STATE_FINALIZE;
+ }
+
+ return WZS_INVALID_STATE;
+ }
+
+ //---------------------------------------------------------------------
+ void OGroupBoxWizard::enterState(::svt::WizardTypes::WizardState _nState)
+ {
+ // some stuff to do before calling the base class (modifying our settings)
+ switch (_nState)
+ {
+ case GBW_STATE_DEFAULTOPTION:
+ if (!m_bVisitedDefault)
+ { // assume that the first of the radio buttons should be selected
+ DBG_ASSERT(m_aSettings.aLabels.size(), "OGroupBoxWizard::enterState: should never have reached this state!");
+ m_aSettings.sDefaultField = m_aSettings.aLabels[0];
+ }
+ m_bVisitedDefault = sal_True;
+ break;
+
+ case GBW_STATE_DBFIELD:
+ if (!m_bVisitedDB)
+ { // try to generate a default for the DB field
+ // (simply use the first field in the DB names collection)
+ if (getContext().aFieldNames.getLength())
+ m_aSettings.sDBField = getContext().aFieldNames[0];
+ }
+ m_bVisitedDB = sal_True;
+ break;
+ }
+
+ // setting the def button .... to be done before the base class is called, too, 'cause the base class
+ // calls the pages, which are allowed to override our def button behaviour
+ defaultButton(GBW_STATE_FINALIZE == _nState ? WZB_FINISH : WZB_NEXT);
+
+ // allow "finish" on the last page only
+ enableButtons(WZB_FINISH, GBW_STATE_FINALIZE == _nState);
+ // allow previous on all pages but the first one
+ enableButtons(WZB_PREVIOUS, GBW_STATE_OPTIONLIST != _nState);
+ // allow next on all pages but the last one
+ enableButtons(WZB_NEXT, GBW_STATE_FINALIZE != _nState);
+
+ OControlWizard::enterState(_nState);
+ }
+
+ //---------------------------------------------------------------------
+ void OGroupBoxWizard::createRadios()
+ {
+ try
+ {
+ OOptionGroupLayouter aLayouter(getServiceFactory());
+ aLayouter.doLayout(getContext(), getSettings());
+ }
+ catch(Exception&)
+ {
+ OSL_FAIL("OGroupBoxWizard::createRadios: caught an exception while creating the radio shapes!");
+ }
+ }
+
+ //---------------------------------------------------------------------
+ sal_Bool OGroupBoxWizard::onFinish()
+ {
+ // commit the basic control setttings
+ commitControlSettings(&m_aSettings);
+
+ // create the radio buttons
+ createRadios();
+
+ return OControlWizard::onFinish();
+ }
+
+ //=====================================================================
+ //= ORadioSelectionPage
+ //=====================================================================
+ //---------------------------------------------------------------------
+ ORadioSelectionPage::ORadioSelectionPage( OControlWizard* _pParent )
+ :OGBWPage(_pParent, ModuleRes(RID_PAGE_GROUPRADIOSELECTION))
+ ,m_aFrame (this, ModuleRes(FL_DATA))
+ ,m_aRadioNameLabel (this, ModuleRes(FT_RADIOLABELS))
+ ,m_aRadioName (this, ModuleRes(ET_RADIOLABELS))
+ ,m_aMoveRight (this, ModuleRes(PB_MOVETORIGHT))
+ ,m_aMoveLeft (this, ModuleRes(PB_MOVETOLEFT))
+ ,m_aExistingRadiosLabel (this, ModuleRes(FT_RADIOBUTTONS))
+ ,m_aExistingRadios (this, ModuleRes(LB_RADIOBUTTONS))
+ {
+ FreeResource();
+
+ if (getContext().aFieldNames.getLength())
+ {
+ enableFormDatasourceDisplay();
+ }
+ else
+ {
+ adjustControlForNoDSDisplay(&m_aFrame);
+ adjustControlForNoDSDisplay(&m_aRadioNameLabel);
+ adjustControlForNoDSDisplay(&m_aRadioName);
+ adjustControlForNoDSDisplay(&m_aMoveRight);
+ adjustControlForNoDSDisplay(&m_aMoveLeft);
+ adjustControlForNoDSDisplay(&m_aExistingRadiosLabel);
+ adjustControlForNoDSDisplay(&m_aExistingRadios, sal_True);
+ }
+
+ m_aMoveLeft.SetClickHdl(LINK(this, ORadioSelectionPage, OnMoveEntry));
+ m_aMoveRight.SetClickHdl(LINK(this, ORadioSelectionPage, OnMoveEntry));
+ m_aRadioName.SetModifyHdl(LINK(this, ORadioSelectionPage, OnNameModified));
+ m_aExistingRadios.SetSelectHdl(LINK(this, ORadioSelectionPage, OnEntrySelected));
+
+ implCheckMoveButtons();
+ m_aExistingRadios.EnableMultiSelection(sal_True);
+
+ getDialog()->defaultButton(&m_aMoveRight);
+
+ m_aExistingRadios.SetAccessibleRelationMemberOf(&m_aExistingRadios);
+ m_aExistingRadios.SetAccessibleRelationLabeledBy(&m_aExistingRadiosLabel);
+ }
+
+ //---------------------------------------------------------------------
+ void ORadioSelectionPage::ActivatePage()
+ {
+ OGBWPage::ActivatePage();
+ m_aRadioName.GrabFocus();
+ }
+
+ //---------------------------------------------------------------------
+ void ORadioSelectionPage::initializePage()
+ {
+ OGBWPage::initializePage();
+
+ m_aRadioName.SetText(String());
+
+ // no need to initialize the list of radios here
+ // (we're the only one affecting this special setting, so it will be in the same state as last time this
+ // page was commited)
+
+ implCheckMoveButtons();
+ }
+
+ //---------------------------------------------------------------------
+ sal_Bool ORadioSelectionPage::commitPage( ::svt::WizardTypes::CommitPageReason _eReason )
+ {
+ if (!OGBWPage::commitPage(_eReason))
+ return sal_False;
+
+ // copy the names of the radio buttons to be inserted
+ // and initialize the values
+ OOptionGroupSettings& rSettings = getSettings();
+ rSettings.aLabels.clear();
+ rSettings.aValues.clear();
+ rSettings.aLabels.reserve(m_aExistingRadios.GetEntryCount());
+ rSettings.aValues.reserve(m_aExistingRadios.GetEntryCount());
+ for (::svt::WizardTypes::WizardState i=0; i<m_aExistingRadios.GetEntryCount(); ++i)
+ {
+ rSettings.aLabels.push_back(m_aExistingRadios.GetEntry(i));
+ rSettings.aValues.push_back(String::CreateFromInt32((sal_Int32)(i + 1)));
+ }
+
+ return sal_True;
+ }
+
+ //---------------------------------------------------------------------
+ IMPL_LINK( ORadioSelectionPage, OnMoveEntry, PushButton*, _pButton )
+ {
+ sal_Bool bMoveLeft = (&m_aMoveLeft == _pButton);
+ if (bMoveLeft)
+ {
+ while (m_aExistingRadios.GetSelectEntryCount())
+ m_aExistingRadios.RemoveEntry(m_aExistingRadios.GetSelectEntryPos(0));
+ }
+ else
+ {
+ m_aExistingRadios.InsertEntry(m_aRadioName.GetText());
+ m_aRadioName.SetText(String());
+ }
+
+ implCheckMoveButtons();
+
+ //adjust the focus
+ if (bMoveLeft)
+ m_aExistingRadios.GrabFocus();
+ else
+ m_aRadioName.GrabFocus();
+ return 0L;
+ }
+
+ //---------------------------------------------------------------------
+ IMPL_LINK( ORadioSelectionPage, OnEntrySelected, ListBox*, /*_pList*/ )
+ {
+ implCheckMoveButtons();
+ return 0L;
+ }
+
+ //---------------------------------------------------------------------
+ IMPL_LINK( ORadioSelectionPage, OnNameModified, Edit*, /*_pList*/ )
+ {
+ implCheckMoveButtons();
+ return 0L;
+ }
+
+ //---------------------------------------------------------------------
+ bool ORadioSelectionPage::canAdvance() const
+ {
+ return 0 != m_aExistingRadios.GetEntryCount();
+ }
+
+ //---------------------------------------------------------------------
+ void ORadioSelectionPage::implCheckMoveButtons()
+ {
+ sal_Bool bHaveSome = (0 != m_aExistingRadios.GetEntryCount());
+ sal_Bool bSelectedSome = (0 != m_aExistingRadios.GetSelectEntryCount());
+ sal_Bool bUnfinishedInput = (0 != m_aRadioName.GetText().Len());
+
+ m_aMoveLeft.Enable(bSelectedSome);
+ m_aMoveRight.Enable(bUnfinishedInput);
+
+ getDialog()->enableButtons(WZB_NEXT, bHaveSome);
+
+ if (bUnfinishedInput)
+ {
+ if (0 == (m_aMoveRight.GetStyle() & WB_DEFBUTTON))
+ getDialog()->defaultButton(&m_aMoveRight);
+ }
+ else
+ {
+ if (WB_DEFBUTTON == (m_aMoveRight.GetStyle() & WB_DEFBUTTON))
+ getDialog()->defaultButton(WZB_NEXT);
+ }
+ }
+
+ //=====================================================================
+ //= ODefaultFieldSelectionPage
+ //=====================================================================
+ //---------------------------------------------------------------------
+ ODefaultFieldSelectionPage::ODefaultFieldSelectionPage( OControlWizard* _pParent )
+ :OMaybeListSelectionPage(_pParent, ModuleRes(RID_PAGE_DEFAULTFIELDSELECTION))
+ ,m_aFrame (this, ModuleRes(FL_DEFAULTSELECTION))
+ ,m_aDefaultSelectionLabel (this, ModuleRes(FT_DEFAULTSELECTION))
+ ,m_aDefSelYes (this, ModuleRes(RB_DEFSELECTION_YES))
+ ,m_aDefSelNo (this, ModuleRes(RB_DEFSELECTION_NO))
+ ,m_aDefSelection (this, ModuleRes(LB_DEFSELECTIONFIELD))
+ {
+ FreeResource();
+
+ announceControls(m_aDefSelYes, m_aDefSelNo, m_aDefSelection);
+ m_aDefSelection.SetDropDownLineCount(10);
+ m_aDefSelection.SetAccessibleRelationLabeledBy( &m_aDefSelYes );
+ m_aDefSelection.SetAccessibleRelationMemberOf(&m_aDefaultSelectionLabel);
+ }
+
+ //---------------------------------------------------------------------
+ void ODefaultFieldSelectionPage::initializePage()
+ {
+ OMaybeListSelectionPage::initializePage();
+
+ const OOptionGroupSettings& rSettings = getSettings();
+
+ // fill the listbox
+ m_aDefSelection.Clear();
+ for ( ConstStringArrayIterator aLoop = rSettings.aLabels.begin();
+ aLoop != rSettings.aLabels.end();
+ ++aLoop
+ )
+ m_aDefSelection.InsertEntry(*aLoop);
+
+
+ implInitialize(rSettings.sDefaultField);
+ }
+
+ //---------------------------------------------------------------------
+ sal_Bool ODefaultFieldSelectionPage::commitPage( ::svt::WizardTypes::CommitPageReason _eReason )
+ {
+ if (!OMaybeListSelectionPage::commitPage(_eReason))
+ return sal_False;
+
+ OOptionGroupSettings& rSettings = getSettings();
+ implCommit(rSettings.sDefaultField);
+
+ return sal_True;
+ }
+
+ //=====================================================================
+ //= OOptionValuesPage
+ //=====================================================================
+ //---------------------------------------------------------------------
+ OOptionValuesPage::OOptionValuesPage( OControlWizard* _pParent )
+ :OGBWPage(_pParent, ModuleRes(RID_PAGE_OPTIONVALUES))
+ ,m_aFrame (this, ModuleRes(FL_OPTIONVALUES))
+ ,m_aDescription (this, ModuleRes(FT_OPTIONVALUES_EXPL))
+ ,m_aValueLabel (this, ModuleRes(FT_OPTIONVALUES))
+ ,m_aValue (this, ModuleRes(ET_OPTIONVALUE))
+ ,m_aOptionsLabel (this, ModuleRes(FT_RADIOBUTTONS))
+ ,m_aOptions (this, ModuleRes(LB_RADIOBUTTONS))
+ ,m_nLastSelection((::svt::WizardTypes::WizardState)-1)
+ {
+ FreeResource();
+
+ m_aOptions.SetSelectHdl(LINK(this, OOptionValuesPage, OnOptionSelected));
+
+ m_aOptions.SetAccessibleRelationMemberOf(&m_aOptions);
+ m_aOptions.SetAccessibleRelationLabeledBy(&m_aOptionsLabel);
+ }
+
+ //---------------------------------------------------------------------
+ IMPL_LINK( OOptionValuesPage, OnOptionSelected, ListBox*, /*NOTINTERESTEDIN*/ )
+ {
+ implTraveledOptions();
+ return 0L;
+ }
+
+ //---------------------------------------------------------------------
+ void OOptionValuesPage::ActivatePage()
+ {
+ OGBWPage::ActivatePage();
+ m_aValue.GrabFocus();
+ }
+
+ //---------------------------------------------------------------------
+ void OOptionValuesPage::implTraveledOptions()
+ {
+ if ((::svt::WizardTypes::WizardState)-1 != m_nLastSelection)
+ {
+ // save the value for the last option
+ DBG_ASSERT((size_t)m_nLastSelection < m_aUncommittedValues.size(), "OOptionValuesPage::implTraveledOptions: invalid previous selection index!");
+ m_aUncommittedValues[m_nLastSelection] = m_aValue.GetText();
+ }
+
+ m_nLastSelection = m_aOptions.GetSelectEntryPos();
+ DBG_ASSERT((size_t)m_nLastSelection < m_aUncommittedValues.size(), "OOptionValuesPage::implTraveledOptions: invalid new selection index!");
+ m_aValue.SetText(m_aUncommittedValues[m_nLastSelection]);
+ }
+
+ //---------------------------------------------------------------------
+ void OOptionValuesPage::initializePage()
+ {
+ OGBWPage::initializePage();
+
+ const OOptionGroupSettings& rSettings = getSettings();
+ DBG_ASSERT(rSettings.aLabels.size(), "OOptionValuesPage::initializePage: no options!!");
+ DBG_ASSERT(rSettings.aLabels.size() == rSettings.aValues.size(), "OOptionValuesPage::initializePage: inconsistent data!");
+
+ // fill the list with all available options
+ m_aOptions.Clear();
+ m_nLastSelection = -1;
+ for ( ConstStringArrayIterator aLoop = rSettings.aLabels.begin();
+ aLoop != rSettings.aLabels.end();
+ ++aLoop
+ )
+ m_aOptions.InsertEntry(*aLoop);
+
+ // remember the values ... can't set them directly in the settings without the explicit commit call
+ // so we need have a copy of the values
+ m_aUncommittedValues = rSettings.aValues;
+
+ // select the first entry
+ m_aOptions.SelectEntryPos(0);
+ implTraveledOptions();
+ }
+
+ //---------------------------------------------------------------------
+ sal_Bool OOptionValuesPage::commitPage( ::svt::WizardTypes::CommitPageReason _eReason )
+ {
+ if (!OGBWPage::commitPage(_eReason))
+ return sal_False;
+
+ OOptionGroupSettings& rSettings = getSettings();
+
+ // commit the current value
+ implTraveledOptions();
+ // copy the uncommitted values
+ rSettings.aValues = m_aUncommittedValues;
+
+ return sal_True;
+ }
+
+ //=====================================================================
+ //= OOptionDBFieldPage
+ //=====================================================================
+ //---------------------------------------------------------------------
+ OOptionDBFieldPage::OOptionDBFieldPage( OControlWizard* _pParent )
+ :ODBFieldPage(_pParent)
+ {
+ setDescriptionText(String(ModuleRes(RID_STR_GROUPWIZ_DBFIELD)));
+ }
+
+ //---------------------------------------------------------------------
+ String& OOptionDBFieldPage::getDBFieldSetting()
+ {
+ return getSettings().sDBField;
+ }
+
+ //=====================================================================
+ //= OFinalizeGBWPage
+ //=====================================================================
+ //---------------------------------------------------------------------
+ OFinalizeGBWPage::OFinalizeGBWPage( OControlWizard* _pParent )
+ :OGBWPage(_pParent, ModuleRes(RID_PAGE_OPTIONS_FINAL))
+ ,m_aFrame (this, ModuleRes(FL_NAMEIT))
+ ,m_aNameLabel (this, ModuleRes(FT_NAMEIT))
+ ,m_aName (this, ModuleRes(ET_NAMEIT))
+ ,m_aThatsAll (this, ModuleRes(FT_THATSALL))
+ {
+ FreeResource();
+ }
+
+ //---------------------------------------------------------------------
+ void OFinalizeGBWPage::ActivatePage()
+ {
+ OGBWPage::ActivatePage();
+ m_aName.GrabFocus();
+ }
+
+ //---------------------------------------------------------------------
+ bool OFinalizeGBWPage::canAdvance() const
+ {
+ return false;
+ }
+
+ //---------------------------------------------------------------------
+ void OFinalizeGBWPage::initializePage()
+ {
+ OGBWPage::initializePage();
+
+ const OOptionGroupSettings& rSettings = getSettings();
+ m_aName.SetText(rSettings.sControlLabel);
+ }
+
+ //---------------------------------------------------------------------
+ sal_Bool OFinalizeGBWPage::commitPage( ::svt::WizardTypes::CommitPageReason _eReason )
+ {
+ if (!OGBWPage::commitPage(_eReason))
+ return sal_False;
+
+ getSettings().sControlLabel = m_aName.GetText();
+
+ return sal_True;
+ }
+
+//.........................................................................
+} // namespace dbp
+//.........................................................................
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */