blob: e109c4a7ed3f072ef3ba1119f3cafe6a68984c47 [file] [log] [blame]
/**************************************************************
*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the 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_DATASELECTION:
// return new OTableSelectionPage(this);
//
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_DATASELECTION:
// return GBW_STATE_OPTIONLIST;
//
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&)
{
DBG_ERROR("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
//.........................................................................