diff options
Diffstat (limited to 'extensions/source/dbpilots/listcombowizard.cxx')
-rw-r--r-- | extensions/source/dbpilots/listcombowizard.cxx | 564 |
1 files changed, 564 insertions, 0 deletions
diff --git a/extensions/source/dbpilots/listcombowizard.cxx b/extensions/source/dbpilots/listcombowizard.cxx new file mode 100644 index 000000000000..93c71ba16085 --- /dev/null +++ b/extensions/source/dbpilots/listcombowizard.cxx @@ -0,0 +1,564 @@ +/* -*- 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 "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 +//......................................................................... + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ |