summaryrefslogtreecommitdiff
path: root/extensions/source/dbpilots/gridwizard.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'extensions/source/dbpilots/gridwizard.cxx')
-rw-r--r--extensions/source/dbpilots/gridwizard.cxx485
1 files changed, 485 insertions, 0 deletions
diff --git a/extensions/source/dbpilots/gridwizard.cxx b/extensions/source/dbpilots/gridwizard.cxx
new file mode 100644
index 000000000000..7606fc7bec65
--- /dev/null
+++ b/extensions/source/dbpilots/gridwizard.cxx
@@ -0,0 +1,485 @@
+/*************************************************************************
+ *
+ * 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 "gridwizard.hxx"
+#include <com/sun/star/sdbcx/XColumnsSupplier.hpp>
+#include <com/sun/star/sdbc/DataType.hpp>
+#include <comphelper/stl_types.hxx>
+#include <tools/string.hxx>
+#include <com/sun/star/form/XGridColumnFactory.hpp>
+#include <com/sun/star/awt/MouseWheelBehavior.hpp>
+#include <com/sun/star/container/XNameContainer.hpp>
+#include <tools/debug.hxx>
+#include "dbptools.hxx"
+#include "dbpilots.hrc"
+
+#define GW_STATE_DATASOURCE_SELECTION 0
+#define GW_STATE_FIELDSELECTION 1
+
+//.........................................................................
+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::container;
+ using namespace ::com::sun::star::form;
+ using namespace ::com::sun::star::awt;
+ using namespace ::svt;
+
+ //=====================================================================
+ //= OGridWizard
+ //=====================================================================
+ //---------------------------------------------------------------------
+ OGridWizard::OGridWizard( Window* _pParent,
+ const Reference< XPropertySet >& _rxObjectModel, const Reference< XMultiServiceFactory >& _rxORB )
+ :OControlWizard(_pParent, ModuleRes(RID_DLG_GRIDWIZARD), _rxObjectModel, _rxORB)
+ ,m_bHadDataSelection(sal_True)
+ {
+ initControlSettings(&m_aSettings);
+
+ m_pPrevPage->SetHelpId(HID_GRIDWIZARD_PREVIOUS);
+ m_pNextPage->SetHelpId(HID_GRIDWIZARD_NEXT);
+ m_pCancel->SetHelpId(HID_GRIDWIZARD_CANCEL);
+ m_pFinish->SetHelpId(HID_GRIDWIZARD_FINISH);
+
+ // if we do not need the data source selection page ...
+ if (!needDatasourceSelection())
+ { // ... skip it!
+ skip(1);
+ m_bHadDataSelection = sal_False;
+ }
+ }
+
+ //---------------------------------------------------------------------
+ sal_Bool OGridWizard::approveControl(sal_Int16 _nClassId)
+ {
+ if (FormComponentType::GRIDCONTROL != _nClassId)
+ return sal_False;
+
+ Reference< XGridColumnFactory > xColumnFactory(getContext().xObjectModel, UNO_QUERY);
+ if (!xColumnFactory.is())
+ return sal_False;
+
+ return sal_True;
+ }
+
+ //---------------------------------------------------------------------
+ void OGridWizard::implApplySettings()
+ {
+ const OControlWizardContext& rContext = getContext();
+
+ // the factory for the columns
+ Reference< XGridColumnFactory > xColumnFactory(rContext.xObjectModel, UNO_QUERY);
+ DBG_ASSERT(xColumnFactory.is(), "OGridWizard::implApplySettings: should never have made it 'til here!");
+ // (if we're here, what the hell happened in approveControl??)
+
+ // the container for the columns
+ Reference< XNameContainer > xColumnContainer(rContext.xObjectModel, UNO_QUERY);
+ DBG_ASSERT(xColumnContainer.is(), "OGridWizard::implApplySettings: no container!");
+
+ if (!xColumnFactory.is() || !xColumnContainer.is())
+ return;
+
+ static const ::rtl::OUString s_sDataFieldProperty = ::rtl::OUString::createFromAscii("DataField");
+ static const ::rtl::OUString s_sLabelProperty = ::rtl::OUString::createFromAscii("Label");
+ static const ::rtl::OUString s_sWidthProperty = ::rtl::OUString::createFromAscii("Width");
+ static const ::rtl::OUString s_sMouseWheelBehavior = ::rtl::OUString::createFromAscii("MouseWheelBehavior");
+ static const ::rtl::OUString s_sEmptyString;
+
+ // collect "descriptors" for the to-be-created (grid)columns
+ DECLARE_STL_VECTOR( ::rtl::OUString, StringArray );
+ StringArray aColumnServiceNames; // service names to be used with the XGridColumnFactory
+ StringArray aColumnLabelPostfixes; // postfixes to append to the column labels
+ StringArray aFormFieldNames; // data field names
+
+ aColumnServiceNames.reserve(getSettings().aSelectedFields.getLength());
+ aColumnLabelPostfixes.reserve(getSettings().aSelectedFields.getLength());
+ aFormFieldNames.reserve(getSettings().aSelectedFields.getLength());
+
+ // loop through the selected field names
+ const ::rtl::OUString* pSelectedFields = getSettings().aSelectedFields.getConstArray();
+ const ::rtl::OUString* pEnd = pSelectedFields + getSettings().aSelectedFields.getLength();
+ for (;pSelectedFields < pEnd; ++pSelectedFields)
+ {
+ // get the information for the selected column
+ sal_Int32 nFieldType = DataType::OTHER;
+ OControlWizardContext::TNameTypeMap::const_iterator aFind = rContext.aTypes.find(*pSelectedFields);
+ if ( aFind != rContext.aTypes.end() )
+ nFieldType = aFind->second;
+
+ aFormFieldNames.push_back(*pSelectedFields);
+ switch (nFieldType)
+ {
+ case DataType::BIT:
+ case DataType::BOOLEAN:
+ aColumnServiceNames.push_back(::rtl::OUString::createFromAscii("CheckBox"));
+ aColumnLabelPostfixes.push_back(s_sEmptyString);
+ break;
+
+ case DataType::TINYINT:
+ case DataType::SMALLINT:
+ case DataType::INTEGER:
+ aColumnServiceNames.push_back(::rtl::OUString::createFromAscii("NumericField"));
+ aColumnLabelPostfixes.push_back(s_sEmptyString);
+ break;
+
+ case DataType::FLOAT:
+ case DataType::REAL:
+ case DataType::DOUBLE:
+ case DataType::NUMERIC:
+ case DataType::DECIMAL:
+ aColumnServiceNames.push_back(::rtl::OUString::createFromAscii("FormattedField"));
+ aColumnLabelPostfixes.push_back(s_sEmptyString);
+ break;
+
+ case DataType::DATE:
+ aColumnServiceNames.push_back(::rtl::OUString::createFromAscii("DateField"));
+ aColumnLabelPostfixes.push_back(s_sEmptyString);
+ break;
+
+ case DataType::TIME:
+ aColumnServiceNames.push_back(::rtl::OUString::createFromAscii("TimeField"));
+ aColumnLabelPostfixes.push_back(s_sEmptyString);
+ break;
+
+ case DataType::TIMESTAMP:
+ aColumnServiceNames.push_back(::rtl::OUString::createFromAscii("DateField"));
+ aColumnLabelPostfixes.push_back(String(ModuleRes(RID_STR_DATEPOSTFIX)));
+
+ aFormFieldNames.push_back(*pSelectedFields);
+ aColumnServiceNames.push_back(::rtl::OUString::createFromAscii("TimeField"));
+ aColumnLabelPostfixes.push_back(String(ModuleRes(RID_STR_TIMEPOSTFIX)));
+ break;
+
+ default:
+ aColumnServiceNames.push_back(::rtl::OUString::createFromAscii("TextField"));
+ aColumnLabelPostfixes.push_back(s_sEmptyString);
+ }
+ }
+
+ DBG_ASSERT( aFormFieldNames.size() == aColumnServiceNames.size()
+ && aColumnServiceNames.size() == aColumnLabelPostfixes.size(),
+ "OGridWizard::implApplySettings: inconsistent descriptor sequences!");
+
+ // now loop through the descriptions and create the (grid)columns out of th descriptors
+ {
+ Reference< XNameAccess > xExistenceChecker(xColumnContainer.get());
+
+ ConstStringArrayIterator pColumnServiceName = aColumnServiceNames.begin();
+ ConstStringArrayIterator pColumnLabelPostfix = aColumnLabelPostfixes.begin();
+ ConstStringArrayIterator pFormFieldName = aFormFieldNames.begin();
+ ConstStringArrayIterator pColumnServiceNameEnd = aColumnServiceNames.end();
+
+ for (;pColumnServiceName < pColumnServiceNameEnd; ++pColumnServiceName, ++pColumnLabelPostfix, ++pFormFieldName)
+ {
+ // create a (grid)column for the (resultset)column
+ try
+ {
+ Reference< XPropertySet > xColumn( xColumnFactory->createColumn(*pColumnServiceName), UNO_SET_THROW );
+ Reference< XPropertySetInfo > xColumnPSI( xColumn->getPropertySetInfo(), UNO_SET_THROW );
+
+ ::rtl::OUString sColumnName(*pColumnServiceName);
+ disambiguateName(xExistenceChecker, sColumnName);
+
+ // the data field the column should be bound to
+ xColumn->setPropertyValue(s_sDataFieldProperty, makeAny(*pFormFieldName));
+ // the label
+ xColumn->setPropertyValue(s_sLabelProperty, makeAny(::rtl::OUString(*pFormFieldName) += *pColumnLabelPostfix));
+ // the width (<void/> => column will be auto-sized)
+ xColumn->setPropertyValue(s_sWidthProperty, Any());
+
+ if ( xColumnPSI->hasPropertyByName( s_sMouseWheelBehavior ) )
+ xColumn->setPropertyValue( s_sMouseWheelBehavior, makeAny( MouseWheelBehavior::SCROLL_DISABLED ) );
+
+ // insert the column
+ xColumnContainer->insertByName(sColumnName, makeAny(xColumn));
+ }
+ catch(Exception&)
+ {
+ DBG_ERROR( ::rtl::OString("OGridWizard::implApplySettings: unexpected exception while creating the grid column for field ")
+ += ::rtl::OString(pFormFieldName->getStr(), pFormFieldName->getLength(), gsl_getSystemTextEncoding())
+ += ::rtl::OString("!"));
+ }
+ }
+ }
+ }
+
+ //---------------------------------------------------------------------
+ OWizardPage* OGridWizard::createPage(WizardState _nState)
+ {
+ switch (_nState)
+ {
+ case GW_STATE_DATASOURCE_SELECTION:
+ return new OTableSelectionPage(this);
+ case GW_STATE_FIELDSELECTION:
+ return new OGridFieldsSelection(this);
+ }
+
+ return NULL;
+ }
+
+ //---------------------------------------------------------------------
+ WizardTypes::WizardState OGridWizard::determineNextState( WizardState _nCurrentState ) const
+ {
+ switch (_nCurrentState)
+ {
+ case GW_STATE_DATASOURCE_SELECTION:
+ return GW_STATE_FIELDSELECTION;
+ case GW_STATE_FIELDSELECTION:
+ return WZS_INVALID_STATE;
+ }
+
+ return WZS_INVALID_STATE;
+ }
+
+ //---------------------------------------------------------------------
+ void OGridWizard::enterState(WizardState _nState)
+ {
+ OControlWizard::enterState(_nState);
+
+ enableButtons(WZB_PREVIOUS, m_bHadDataSelection ? (GW_STATE_DATASOURCE_SELECTION < _nState) : GW_STATE_FIELDSELECTION < _nState);
+ enableButtons(WZB_NEXT, GW_STATE_FIELDSELECTION != _nState);
+ if (_nState < GW_STATE_FIELDSELECTION)
+ enableButtons(WZB_FINISH, sal_False);
+
+ if (GW_STATE_FIELDSELECTION == _nState)
+ defaultButton(WZB_FINISH);
+ }
+
+ //---------------------------------------------------------------------
+ sal_Bool OGridWizard::leaveState(WizardState _nState)
+ {
+ if (!OControlWizard::leaveState(_nState))
+ return sal_False;
+
+ if (GW_STATE_FIELDSELECTION == _nState)
+ defaultButton(WZB_NEXT);
+
+ return sal_True;
+ }
+
+ //---------------------------------------------------------------------
+ sal_Bool OGridWizard::onFinish()
+ {
+ if ( !OControlWizard::onFinish() )
+ return sal_False;
+
+ implApplySettings();
+
+ return sal_True;
+ }
+
+ //=====================================================================
+ //= OGridFieldsSelection
+ //=====================================================================
+ //---------------------------------------------------------------------
+ OGridFieldsSelection::OGridFieldsSelection( OGridWizard* _pParent )
+ :OGridPage(_pParent, ModuleRes(RID_PAGE_GW_FIELDSELECTION))
+ ,m_aFrame (this, ModuleRes(FL_FRAME))
+ ,m_aExistFieldsLabel (this, ModuleRes(FT_EXISTING_FIELDS))
+ ,m_aExistFields (this, ModuleRes(LB_EXISTING_FIELDS))
+ ,m_aSelectOne (this, ModuleRes(PB_FIELDRIGHT))
+ ,m_aSelectAll (this, ModuleRes(PB_ALLFIELDSRIGHT))
+ ,m_aDeselectOne (this, ModuleRes(PB_FIELDLEFT))
+ ,m_aDeselectAll (this, ModuleRes(PB_ALLFIELDSLEFT))
+ ,m_aSelFieldsLabel (this, ModuleRes(FT_SELECTED_FIELDS))
+ ,m_aSelFields (this, ModuleRes(LB_SELECTED_FIELDS))
+ {
+ FreeResource();
+
+ enableFormDatasourceDisplay();
+
+ m_aSelectOne.SetClickHdl(LINK(this, OGridFieldsSelection, OnMoveOneEntry));
+ m_aSelectAll.SetClickHdl(LINK(this, OGridFieldsSelection, OnMoveAllEntries));
+ m_aDeselectOne.SetClickHdl(LINK(this, OGridFieldsSelection, OnMoveOneEntry));
+ m_aDeselectAll.SetClickHdl(LINK(this, OGridFieldsSelection, OnMoveAllEntries));
+
+ m_aExistFields.SetSelectHdl(LINK(this, OGridFieldsSelection, OnEntrySelected));
+ m_aSelFields.SetSelectHdl(LINK(this, OGridFieldsSelection, OnEntrySelected));
+ m_aExistFields.SetDoubleClickHdl(LINK(this, OGridFieldsSelection, OnEntryDoubleClicked));
+ m_aSelFields.SetDoubleClickHdl(LINK(this, OGridFieldsSelection, OnEntryDoubleClicked));
+ }
+
+ //---------------------------------------------------------------------
+ void OGridFieldsSelection::ActivatePage()
+ {
+ OGridPage::ActivatePage();
+ m_aExistFields.GrabFocus();
+ }
+
+ //---------------------------------------------------------------------
+ bool OGridFieldsSelection::canAdvance() const
+ {
+ return false;
+ // we're the last page in our wizard
+ }
+
+ //---------------------------------------------------------------------
+ void OGridFieldsSelection::initializePage()
+ {
+ OGridPage::initializePage();
+
+ const OControlWizardContext& rContext = getContext();
+ fillListBox(m_aExistFields, rContext.aFieldNames);
+
+ m_aSelFields.Clear();
+ const OGridSettings& rSettings = getSettings();
+ const ::rtl::OUString* pSelected = rSettings.aSelectedFields.getConstArray();
+ const ::rtl::OUString* pEnd = pSelected + rSettings.aSelectedFields.getLength();
+ for (; pSelected < pEnd; ++pSelected)
+ {
+ m_aSelFields.InsertEntry(*pSelected);
+ m_aExistFields.RemoveEntry(*pSelected);
+ }
+
+ implCheckButtons();
+ }
+
+ //---------------------------------------------------------------------
+ sal_Bool OGridFieldsSelection::commitPage( ::svt::WizardTypes::CommitPageReason _eReason )
+ {
+ if (!OGridPage::commitPage(_eReason))
+ return sal_False;
+
+ OGridSettings& rSettings = getSettings();
+ USHORT nSelected = m_aSelFields.GetEntryCount();
+
+ rSettings.aSelectedFields.realloc(nSelected);
+ ::rtl::OUString* pSelected = rSettings.aSelectedFields.getArray();
+
+ for (USHORT i=0; i<nSelected; ++i, ++pSelected)
+ *pSelected = m_aSelFields.GetEntry(i);
+
+ return sal_True;
+ }
+
+ //---------------------------------------------------------------------
+ void OGridFieldsSelection::implCheckButtons()
+ {
+ m_aSelectOne.Enable(m_aExistFields.GetSelectEntryCount() != 0);
+ m_aSelectAll.Enable(m_aExistFields.GetEntryCount() != 0);
+
+ m_aDeselectOne.Enable(m_aSelFields.GetSelectEntryCount() != 0);
+ m_aDeselectAll.Enable(m_aSelFields.GetEntryCount() != 0);
+
+ getDialog()->enableButtons(WZB_FINISH, 0 != m_aSelFields.GetEntryCount());
+ }
+
+ //---------------------------------------------------------------------
+ IMPL_LINK(OGridFieldsSelection, OnEntryDoubleClicked, ListBox*, _pList)
+ {
+ PushButton* pSimulateButton = &m_aExistFields == _pList ? &m_aSelectOne : &m_aDeselectOne;
+ if (pSimulateButton->IsEnabled())
+ return OnMoveOneEntry( pSimulateButton );
+ else
+ return 1L;
+ }
+
+ //---------------------------------------------------------------------
+ IMPL_LINK(OGridFieldsSelection, OnEntrySelected, ListBox*, /*NOTINTERESTEDIN*/)
+ {
+ implCheckButtons();
+ return 0L;
+ }
+
+ //---------------------------------------------------------------------
+ IMPL_LINK(OGridFieldsSelection, OnMoveOneEntry, PushButton*, _pButton)
+ {
+ sal_Bool bMoveRight = (&m_aSelectOne == _pButton);
+ ListBox& rMoveTo = bMoveRight ? m_aSelFields : m_aExistFields;
+
+ // the index of the selected entry
+ USHORT nSelected = bMoveRight ? m_aExistFields.GetSelectEntryPos() : m_aSelFields.GetSelectEntryPos();
+ // the (original) relative position of the entry
+ sal_IntPtr nRelativeIndex = reinterpret_cast<sal_IntPtr>(bMoveRight ? m_aExistFields.GetEntryData(nSelected) : m_aSelFields.GetEntryData(nSelected));
+
+ USHORT nInsertPos = LISTBOX_APPEND;
+ if (!bMoveRight)
+ { // need to determine an insert pos which reflects the original
+ nInsertPos = 0;
+ while (nInsertPos < rMoveTo.GetEntryCount())
+ {
+ if (reinterpret_cast<sal_IntPtr>(rMoveTo.GetEntryData(nInsertPos)) > nRelativeIndex)
+ break;
+ ++nInsertPos;
+ }
+ }
+
+ // the text of the entry to move
+ String sMovingEntry = bMoveRight ? m_aExistFields.GetEntry(nSelected) : m_aSelFields.GetEntry(nSelected);
+
+ // insert the entry
+ nInsertPos = rMoveTo.InsertEntry(sMovingEntry, nInsertPos);
+ // preserve it's "relative position" entry data
+ rMoveTo.SetEntryData(nInsertPos, reinterpret_cast<void*>(nRelativeIndex));
+
+ // remove the entry from it's old list
+ if (bMoveRight)
+ {
+ USHORT nSelectPos = m_aExistFields.GetSelectEntryPos();
+ m_aExistFields.RemoveEntry(nSelected);
+ if ((LISTBOX_ENTRY_NOTFOUND != nSelectPos) && (nSelectPos < m_aExistFields.GetEntryCount()))
+ m_aExistFields.SelectEntryPos(nSelectPos);
+
+ m_aExistFields.GrabFocus();
+ }
+ else
+ {
+ USHORT nSelectPos = m_aSelFields.GetSelectEntryPos();
+ m_aSelFields.RemoveEntry(nSelected);
+ if ((LISTBOX_ENTRY_NOTFOUND != nSelectPos) && (nSelectPos < m_aSelFields.GetEntryCount()))
+ m_aSelFields.SelectEntryPos(nSelectPos);
+
+ m_aSelFields.GrabFocus();
+ }
+
+ implCheckButtons();
+ return 0;
+ }
+
+ //---------------------------------------------------------------------
+ IMPL_LINK(OGridFieldsSelection, OnMoveAllEntries, PushButton*, _pButton)
+ {
+ sal_Bool bMoveRight = (&m_aSelectAll == _pButton);
+ m_aExistFields.Clear();
+ m_aSelFields.Clear();
+ fillListBox(bMoveRight ? m_aSelFields : m_aExistFields, getContext().aFieldNames);
+
+ implCheckButtons();
+ return 0;
+ }
+
+//.........................................................................
+} // namespace dbp
+//.........................................................................
+