blob: 7747fa754cb964307df1c5d27068d5008908230f [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 "listcombowizard.hxx"
#include "commonpagesdbp.hxx"
#include <com/sun/star/sdbc/XConnection.hpp>
#include <com/sun/star/sdbcx/XTablesSupplier.hpp>
#include <com/sun/star/container/XNameAccess.hpp>
#include <com/sun/star/form/ListSourceType.hpp>
#include <com/sun/star/sdbcx/XColumnsSupplier.hpp>
#include <tools/debug.hxx>
#include <vcl/msgbox.hxx>
#include <connectivity/dbtools.hxx>
#include "dbpilots.hrc"
#include <comphelper/extract.hxx>
//.........................................................................
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::sdbc;
using namespace ::com::sun::star::sdbcx;
using namespace ::com::sun::star::container;
using namespace ::com::sun::star::form;
using namespace ::svt;
using namespace ::dbtools;
//=====================================================================
//= OListComboWizard
//=====================================================================
//---------------------------------------------------------------------
OListComboWizard::OListComboWizard( Window* _pParent,
const Reference< XPropertySet >& _rxObjectModel, const Reference< XMultiServiceFactory >& _rxORB )
:OControlWizard(_pParent, ModuleRes(RID_DLG_LISTCOMBOWIZARD), _rxObjectModel, _rxORB)
,m_bListBox(sal_False)
,m_bHadDataSelection(sal_True)
{
initControlSettings(&m_aSettings);
m_pPrevPage->SetHelpId(HID_LISTWIZARD_PREVIOUS);
m_pNextPage->SetHelpId(HID_LISTWIZARD_NEXT);
m_pCancel->SetHelpId(HID_LISTWIZARD_CANCEL);
m_pFinish->SetHelpId(HID_LISTWIZARD_FINISH);
// if we do not need the data source selection page ...
if (!needDatasourceSelection())
{ // ... skip it!
skip(1);
m_bHadDataSelection = sal_False;
}
}
//---------------------------------------------------------------------
sal_Bool OListComboWizard::approveControl(sal_Int16 _nClassId)
{
switch (_nClassId)
{
case FormComponentType::LISTBOX:
m_bListBox = sal_True;
setTitleBase(String(ModuleRes(RID_STR_LISTWIZARD_TITLE)));
return sal_True;
case FormComponentType::COMBOBOX:
m_bListBox = sal_False;
setTitleBase(String(ModuleRes(RID_STR_COMBOWIZARD_TITLE)));
return sal_True;
}
return sal_False;
}
//---------------------------------------------------------------------
OWizardPage* OListComboWizard::createPage(WizardState _nState)
{
switch (_nState)
{
case LCW_STATE_DATASOURCE_SELECTION:
return new OTableSelectionPage(this);
case LCW_STATE_TABLESELECTION:
return new OContentTableSelection(this);
case LCW_STATE_FIELDSELECTION:
return new OContentFieldSelection(this);
case LCW_STATE_FIELDLINK:
return new OLinkFieldsPage(this);
case LCW_STATE_COMBODBFIELD:
return new OComboDBFieldPage(this);
}
return NULL;
}
//---------------------------------------------------------------------
WizardTypes::WizardState OListComboWizard::determineNextState( WizardState _nCurrentState ) const
{
switch (_nCurrentState)
{
case LCW_STATE_DATASOURCE_SELECTION:
return LCW_STATE_TABLESELECTION;
case LCW_STATE_TABLESELECTION:
return LCW_STATE_FIELDSELECTION;
case LCW_STATE_FIELDSELECTION:
return getFinalState();
}
return WZS_INVALID_STATE;
}
//---------------------------------------------------------------------
void OListComboWizard::enterState(WizardState _nState)
{
OControlWizard::enterState(_nState);
enableButtons(WZB_PREVIOUS, m_bHadDataSelection ? (LCW_STATE_DATASOURCE_SELECTION < _nState) : LCW_STATE_TABLESELECTION < _nState);
enableButtons(WZB_NEXT, getFinalState() != _nState);
if (_nState < getFinalState())
enableButtons(WZB_FINISH, sal_False);
if (getFinalState() == _nState)
defaultButton(WZB_FINISH);
}
//---------------------------------------------------------------------
sal_Bool OListComboWizard::leaveState(WizardState _nState)
{
if (!OControlWizard::leaveState(_nState))
return sal_False;
if (getFinalState() == _nState)
defaultButton(WZB_NEXT);
return sal_True;
}
//---------------------------------------------------------------------
void OListComboWizard::implApplySettings()
{
try
{
// for quoting identifiers, we need the connection meta data
Reference< XConnection > xConn = getFormConnection();
DBG_ASSERT(xConn.is(), "OListComboWizard::implApplySettings: no connection, unable to quote!");
Reference< XDatabaseMetaData > xMetaData;
if (xConn.is())
xMetaData = xConn->getMetaData();
// do some quotings
if (xMetaData.is())
{
::rtl::OUString sQuoteString = xMetaData->getIdentifierQuoteString();
if (isListBox()) // only when we have a listbox this should be not empty
getSettings().sLinkedListField = quoteName(sQuoteString, getSettings().sLinkedListField);
::rtl::OUString sCatalog, sSchema, sName;
::dbtools::qualifiedNameComponents( xMetaData, getSettings().sListContentTable, sCatalog, sSchema, sName, ::dbtools::eInDataManipulation );
getSettings().sListContentTable = ::dbtools::composeTableNameForSelect( xConn, sCatalog, sSchema, sName );
getSettings().sListContentField = quoteName(sQuoteString, getSettings().sListContentField);
}
// ListSourceType: SQL
getContext().xObjectModel->setPropertyValue(::rtl::OUString::createFromAscii("ListSourceType"), makeAny((sal_Int32)ListSourceType_SQL));
if (isListBox())
{
// BoundColumn: 1
getContext().xObjectModel->setPropertyValue(::rtl::OUString::createFromAscii("BoundColumn"), makeAny((sal_Int16)1));
// build the statement to set as list source
String sStatement;
sStatement.AppendAscii("SELECT ");
sStatement += getSettings().sListContentField;
sStatement.AppendAscii(", ");
sStatement += getSettings().sLinkedListField;
sStatement.AppendAscii(" FROM ");
sStatement += getSettings().sListContentTable;
Sequence< ::rtl::OUString > aListSource(1);
aListSource[0] = sStatement;
getContext().xObjectModel->setPropertyValue(::rtl::OUString::createFromAscii("ListSource"), makeAny(aListSource));
}
else
{
// build the statement to set as list source
String sStatement;
sStatement.AppendAscii("SELECT DISTINCT ");
sStatement += getSettings().sListContentField;
sStatement.AppendAscii(" FROM ");
sStatement += getSettings().sListContentTable;
getContext().xObjectModel->setPropertyValue(::rtl::OUString::createFromAscii("ListSource"), makeAny(::rtl::OUString(sStatement)));
}
// the bound field
getContext().xObjectModel->setPropertyValue(::rtl::OUString::createFromAscii("DataField"), makeAny(::rtl::OUString(getSettings().sLinkedFormField)));
}
catch(Exception&)
{
DBG_ERROR("OListComboWizard::implApplySettings: could not set the property values for the listbox!");
}
}
//---------------------------------------------------------------------
sal_Bool OListComboWizard::onFinish()
{
if ( !OControlWizard::onFinish() )
return sal_False;
implApplySettings();
return sal_True;
}
//=====================================================================
//= OLCPage
//=====================================================================
//---------------------------------------------------------------------
Reference< XNameAccess > OLCPage::getTables(sal_Bool _bNeedIt)
{
Reference< XConnection > xConn = getFormConnection();
DBG_ASSERT(!_bNeedIt || xConn.is(), "OLCPage::getTables: should have an active connection when reaching this page!");
(void)_bNeedIt;
Reference< XTablesSupplier > xSuppTables(xConn, UNO_QUERY);
Reference< XNameAccess > xTables;
if (xSuppTables.is())
xTables = xSuppTables->getTables();
DBG_ASSERT(!_bNeedIt || xTables.is() || !xConn.is(), "OLCPage::getTables: got no tables from the connection!");
return xTables;
}
//---------------------------------------------------------------------
Sequence< ::rtl::OUString > OLCPage::getTableFields(sal_Bool _bNeedIt)
{
Reference< XNameAccess > xTables = getTables(_bNeedIt);
Sequence< ::rtl::OUString > aColumnNames;
if (xTables.is())
{
try
{
// the list table as XColumnsSupplier
Reference< XColumnsSupplier > xSuppCols;
xTables->getByName(getSettings().sListContentTable) >>= xSuppCols;
DBG_ASSERT(!_bNeedIt || xSuppCols.is(), "OLCPage::getTableFields: no columns supplier!");
// the columns
Reference< XNameAccess > xColumns;
if (xSuppCols.is())
xColumns = xSuppCols->getColumns();
// the column names
if (xColumns.is())
aColumnNames = xColumns->getElementNames();
}
catch(Exception&)
{
DBG_ASSERT(!_bNeedIt, "OLinkFieldsPage::initializePage: caught an exception while retrieving the columns!");
}
}
return aColumnNames;
}
//=====================================================================
//= OContentTableSelection
//=====================================================================
//---------------------------------------------------------------------
OContentTableSelection::OContentTableSelection( OListComboWizard* _pParent )
:OLCPage(_pParent, ModuleRes(RID_PAGE_LCW_CONTENTSELECTION_TABLE))
,m_aFrame (this, ModuleRes(FL_FRAME))
,m_aSelectTableLabel (this, ModuleRes(FT_SELECTTABLE_LABEL))
,m_aSelectTable (this, ModuleRes(LB_SELECTTABLE))
{
FreeResource();
enableFormDatasourceDisplay();
m_aSelectTable.SetDoubleClickHdl(LINK(this, OContentTableSelection, OnTableDoubleClicked));
m_aSelectTable.SetSelectHdl(LINK(this, OContentTableSelection, OnTableSelected));
}
//---------------------------------------------------------------------
void OContentTableSelection::ActivatePage()
{
OLCPage::ActivatePage();
m_aSelectTable.GrabFocus();
}
//---------------------------------------------------------------------
bool OContentTableSelection::canAdvance() const
{
if (!OLCPage::canAdvance())
return false;
return 0 != m_aSelectTable.GetSelectEntryCount();
}
//---------------------------------------------------------------------
IMPL_LINK( OContentTableSelection, OnTableSelected, ListBox*, /*_pListBox*/ )
{
updateDialogTravelUI();
return 0L;
}
//---------------------------------------------------------------------
IMPL_LINK( OContentTableSelection, OnTableDoubleClicked, ListBox*, _pListBox )
{
if (_pListBox->GetSelectEntryCount())
getDialog()->travelNext();
return 0L;
}
//---------------------------------------------------------------------
void OContentTableSelection::initializePage()
{
OLCPage::initializePage();
// fill the list with the table name
m_aSelectTable.Clear();
try
{
Reference< XNameAccess > xTables = getTables(sal_True);
Sequence< ::rtl::OUString > aTableNames;
if (xTables.is())
aTableNames = xTables->getElementNames();
fillListBox(m_aSelectTable, aTableNames);
}
catch(Exception&)
{
DBG_ERROR("OContentTableSelection::initializePage: could not retrieve the table names!");
}
m_aSelectTable.SelectEntry(getSettings().sListContentTable);
}
//---------------------------------------------------------------------
sal_Bool OContentTableSelection::commitPage( ::svt::WizardTypes::CommitPageReason _eReason )
{
if (!OLCPage::commitPage(_eReason))
return sal_False;
OListComboSettings& rSettings = getSettings();
rSettings.sListContentTable = m_aSelectTable.GetSelectEntry();
if (!rSettings.sListContentTable.Len() && (::svt::WizardTypes::eTravelBackward != _eReason))
// need to select a table
return sal_False;
return sal_True;
}
//=====================================================================
//= OContentFieldSelection
//=====================================================================
//---------------------------------------------------------------------
OContentFieldSelection::OContentFieldSelection( OListComboWizard* _pParent )
:OLCPage(_pParent, ModuleRes(RID_PAGE_LCW_CONTENTSELECTION_FIELD))
,m_aFrame (this, ModuleRes(FL_FRAME))
,m_aTableFields (this, ModuleRes(FT_TABLEFIELDS))
,m_aSelectTableField (this, ModuleRes(LB_SELECTFIELD))
,m_aDisplayedFieldLabel (this, ModuleRes(FT_DISPLAYEDFIELD))
,m_aDisplayedField (this, ModuleRes(ET_DISPLAYEDFIELD))
,m_aInfo (this, ModuleRes(FT_CONTENTFIELD_INFO))
{
m_aInfo.SetText(String(ModuleRes( isListBox() ? STR_FIELDINFO_LISTBOX : STR_FIELDINFO_COMBOBOX)));
FreeResource();
m_aSelectTableField.SetSelectHdl(LINK(this, OContentFieldSelection, OnFieldSelected));
m_aSelectTableField.SetDoubleClickHdl(LINK(this, OContentFieldSelection, OnTableDoubleClicked));
}
//---------------------------------------------------------------------
void OContentFieldSelection::ActivatePage()
{
OLCPage::ActivatePage();
m_aTableFields.GrabFocus();
}
//---------------------------------------------------------------------
void OContentFieldSelection::initializePage()
{
OLCPage::initializePage();
// fill the list of fields
fillListBox(m_aSelectTableField, getTableFields(sal_True));
m_aSelectTableField.SelectEntry(getSettings().sListContentField);
m_aDisplayedField.SetText(getSettings().sListContentField);
}
//---------------------------------------------------------------------
bool OContentFieldSelection::canAdvance() const
{
if (!OLCPage::canAdvance())
return false;
return 0 != m_aSelectTableField.GetSelectEntryCount();
}
//---------------------------------------------------------------------
IMPL_LINK( OContentFieldSelection, OnTableDoubleClicked, ListBox*, /*NOTINTERESTEDIN*/ )
{
if (m_aSelectTableField.GetSelectEntryCount())
getDialog()->travelNext();
return 0L;
}
//---------------------------------------------------------------------
IMPL_LINK( OContentFieldSelection, OnFieldSelected, ListBox*, /*NOTINTERESTEDIN*/ )
{
updateDialogTravelUI();
m_aDisplayedField.SetText(m_aSelectTableField.GetSelectEntry());
return 0L;
}
//---------------------------------------------------------------------
sal_Bool OContentFieldSelection::commitPage( ::svt::WizardTypes::CommitPageReason _eReason )
{
if (!OLCPage::commitPage(_eReason))
return sal_False;
getSettings().sListContentField = m_aSelectTableField.GetSelectEntry();
return sal_True;
}
//=====================================================================
//= OLinkFieldsPage
//=====================================================================
//---------------------------------------------------------------------
OLinkFieldsPage::OLinkFieldsPage( OListComboWizard* _pParent )
:OLCPage(_pParent, ModuleRes(RID_PAGE_LCW_FIELDLINK))
,m_aDescription (this, ModuleRes(FT_FIELDLINK_DESC))
,m_aFrame (this, ModuleRes(FL_FRAME))
,m_aValueListFieldLabel (this, ModuleRes(FT_VALUELISTFIELD))
,m_aValueListField (this, ModuleRes(CMB_VALUELISTFIELD))
,m_aTableFieldLabel (this, ModuleRes(FT_TABLEFIELD))
,m_aTableField (this, ModuleRes(CMB_TABLEFIELD))
{
FreeResource();
m_aValueListField.SetModifyHdl(LINK(this, OLinkFieldsPage, OnSelectionModified));
m_aTableField.SetModifyHdl(LINK(this, OLinkFieldsPage, OnSelectionModified));
m_aValueListField.SetSelectHdl(LINK(this, OLinkFieldsPage, OnSelectionModified));
m_aTableField.SetSelectHdl(LINK(this, OLinkFieldsPage, OnSelectionModified));
}
//---------------------------------------------------------------------
void OLinkFieldsPage::ActivatePage()
{
OLCPage::ActivatePage();
m_aValueListField.GrabFocus();
}
//---------------------------------------------------------------------
void OLinkFieldsPage::initializePage()
{
OLCPage::initializePage();
// fill the value list
fillListBox(m_aValueListField, getContext().aFieldNames);
// fill the table field list
fillListBox(m_aTableField, getTableFields(sal_True));
// the initial selections
m_aValueListField.SetText(getSettings().sLinkedFormField);
m_aTableField.SetText(getSettings().sLinkedListField);
implCheckFinish();
}
//---------------------------------------------------------------------
bool OLinkFieldsPage::canAdvance() const
{
// we're on the last page here, no travelNext allowed ...
return false;
}
//---------------------------------------------------------------------
void OLinkFieldsPage::implCheckFinish()
{
sal_Bool bInvalidSelection = (COMBOBOX_ENTRY_NOTFOUND == m_aValueListField.GetEntryPos(m_aValueListField.GetText()));
bInvalidSelection |= (COMBOBOX_ENTRY_NOTFOUND == m_aTableField.GetEntryPos(m_aTableField.GetText()));
getDialog()->enableButtons(WZB_FINISH, !bInvalidSelection);
}
//---------------------------------------------------------------------
IMPL_LINK(OLinkFieldsPage, OnSelectionModified, void*, EMPTYARG)
{
implCheckFinish();
return 0L;
}
//---------------------------------------------------------------------
sal_Bool OLinkFieldsPage::commitPage( ::svt::WizardTypes::CommitPageReason _eReason )
{
if (!OLCPage::commitPage(_eReason))
return sal_False;
getSettings().sLinkedFormField = m_aValueListField.GetText();
getSettings().sLinkedListField = m_aTableField.GetText();
return sal_True;
}
//=====================================================================
//= OComboDBFieldPage
//=====================================================================
//---------------------------------------------------------------------
OComboDBFieldPage::OComboDBFieldPage( OControlWizard* _pParent )
:ODBFieldPage(_pParent)
{
setDescriptionText(String(ModuleRes(RID_STR_COMBOWIZ_DBFIELD)));
}
//---------------------------------------------------------------------
String& OComboDBFieldPage::getDBFieldSetting()
{
return getSettings().sLinkedFormField;
}
//---------------------------------------------------------------------
void OComboDBFieldPage::ActivatePage()
{
ODBFieldPage::ActivatePage();
getDialog()->enableButtons(WZB_FINISH, sal_True);
}
//---------------------------------------------------------------------
bool OComboDBFieldPage::canAdvance() const
{
// we're on the last page here, no travelNext allowed ...
return false;
}
//.........................................................................
} // namespace dbp
//.........................................................................