summaryrefslogtreecommitdiff
path: root/extensions/source/dbpilots/controlwizard.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'extensions/source/dbpilots/controlwizard.cxx')
-rw-r--r--extensions/source/dbpilots/controlwizard.cxx780
1 files changed, 780 insertions, 0 deletions
diff --git a/extensions/source/dbpilots/controlwizard.cxx b/extensions/source/dbpilots/controlwizard.cxx
new file mode 100644
index 000000000000..169286a19a5f
--- /dev/null
+++ b/extensions/source/dbpilots/controlwizard.cxx
@@ -0,0 +1,780 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2008 by Sun Microsystems, Inc.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * $RCSfile: controlwizard.cxx,v $
+ * $Revision: 1.22 $
+ *
+ * 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 "controlwizard.hxx"
+#include <tools/debug.hxx>
+#include <com/sun/star/container/XNameAccess.hpp>
+#include <com/sun/star/sdbcx/XTablesSupplier.hpp>
+#include <com/sun/star/sdb/XQueriesSupplier.hpp>
+#include <com/sun/star/sdbc/XPreparedStatement.hpp>
+#include <com/sun/star/container/XChild.hpp>
+#include <com/sun/star/sdbcx/XColumnsSupplier.hpp>
+#include <com/sun/star/frame/XModel.hpp>
+#include <com/sun/star/sheet/XSpreadsheetView.hpp>
+#include <com/sun/star/drawing/XDrawView.hpp>
+#include <com/sun/star/drawing/XDrawPageSupplier.hpp>
+#include <com/sun/star/sdb/CommandType.hpp>
+#include <com/sun/star/sdbc/SQLWarning.hpp>
+#include <com/sun/star/sdb/SQLContext.hpp>
+#include <comphelper/types.hxx>
+#include <connectivity/dbtools.hxx>
+#include <vcl/msgbox.hxx>
+#include <comphelper/interaction.hxx>
+#include <vcl/stdtext.hxx>
+#include <svtools/localresaccess.hxx>
+#include <connectivity/conncleanup.hxx>
+#include <com/sun/star/sdbc/DataType.hpp>
+#include <tools/urlobj.hxx>
+
+//.........................................................................
+namespace dbp
+{
+//.........................................................................
+
+ using namespace ::com::sun::star::uno;
+ using namespace ::com::sun::star::awt;
+ using namespace ::com::sun::star::lang;
+ using namespace ::com::sun::star::sdb;
+ using namespace ::com::sun::star::sdbc;
+ using namespace ::com::sun::star::sdbcx;
+ using namespace ::com::sun::star::beans;
+ using namespace ::com::sun::star::container;
+ using namespace ::com::sun::star::drawing;
+ using namespace ::com::sun::star::frame;
+ using namespace ::com::sun::star::sheet;
+ using namespace ::com::sun::star::form;
+ using namespace ::com::sun::star::task;
+ using namespace ::svt;
+ using namespace ::comphelper;
+ using namespace ::dbtools;
+
+ //=====================================================================
+ //= OAccessRegulator
+ //=====================================================================
+ struct OAccessRegulator
+ {
+ friend class OControlWizardPage;
+
+ protected:
+ OAccessRegulator() { }
+ };
+
+ //=====================================================================
+ //= OControlWizardPage
+ //=====================================================================
+ //---------------------------------------------------------------------
+ OControlWizardPage::OControlWizardPage( OControlWizard* _pParent, const ResId& _rResId )
+ :OControlWizardPage_Base( _pParent, _rResId )
+ ,m_pFormSettingsSeparator(NULL)
+ ,m_pFormDatasourceLabel(NULL)
+ ,m_pFormDatasource(NULL)
+ ,m_pFormContentTypeLabel(NULL)
+ ,m_pFormContentType(NULL)
+ ,m_pFormTableLabel(NULL)
+ ,m_pFormTable(NULL)
+ {
+ }
+
+ //---------------------------------------------------------------------
+ OControlWizardPage::~OControlWizardPage()
+ {
+ delete m_pFormSettingsSeparator;
+ delete m_pFormDatasourceLabel;
+ delete m_pFormDatasource;
+ delete m_pFormContentTypeLabel;
+ delete m_pFormContentType;
+ delete m_pFormTableLabel;
+ delete m_pFormTable;
+ }
+
+ //---------------------------------------------------------------------
+ OControlWizard* OControlWizardPage::getDialog()
+ {
+ return static_cast< OControlWizard* >(GetParent());
+ }
+
+ //---------------------------------------------------------------------
+ const OControlWizard* OControlWizardPage::getDialog() const
+ {
+ return static_cast< OControlWizard* >(GetParent());
+ }
+
+ //---------------------------------------------------------------------
+ sal_Bool OControlWizardPage::updateContext()
+ {
+ return getDialog()->updateContext(OAccessRegulator());
+ }
+
+ //---------------------------------------------------------------------
+ Reference< XConnection > OControlWizardPage::getFormConnection() const
+ {
+ return getDialog()->getFormConnection(OAccessRegulator());
+ }
+
+ //---------------------------------------------------------------------
+ void OControlWizardPage::setFormConnection( const Reference< XConnection >& _rxConn, sal_Bool _bAutoDispose )
+ {
+ getDialog()->setFormConnection( OAccessRegulator(), _rxConn, _bAutoDispose );
+ }
+
+ //---------------------------------------------------------------------
+ const OControlWizardContext& OControlWizardPage::getContext()
+ {
+ return getDialog()->getContext();
+ }
+
+ //---------------------------------------------------------------------
+ void OControlWizardPage::fillListBox(ListBox& _rList, const Sequence< ::rtl::OUString >& _rItems, sal_Bool _bClear)
+ {
+ if (_bClear)
+ _rList.Clear();
+ const ::rtl::OUString* pItems = _rItems.getConstArray();
+ const ::rtl::OUString* pEnd = pItems + _rItems.getLength();
+ WizardState nPos;
+ sal_Int32 nIndex = 0;
+ for (;pItems < pEnd; ++pItems, ++nIndex)
+ {
+ nPos = _rList.InsertEntry(*pItems);
+ _rList.SetEntryData(nPos, reinterpret_cast<void*>(nIndex));
+ }
+ }
+
+ //---------------------------------------------------------------------
+ void OControlWizardPage::fillListBox(ComboBox& _rList, const Sequence< ::rtl::OUString >& _rItems, sal_Bool _bClear)
+ {
+ if (_bClear)
+ _rList.Clear();
+ const ::rtl::OUString* pItems = _rItems.getConstArray();
+ const ::rtl::OUString* pEnd = pItems + _rItems.getLength();
+ WizardState nPos;
+ sal_Int32 nIndex = 0;
+ for (;pItems < pEnd; ++pItems)
+ {
+ nPos = _rList.InsertEntry(*pItems);
+ _rList.SetEntryData(nPos, reinterpret_cast<void*>(nIndex));
+ }
+ }
+
+ //---------------------------------------------------------------------
+ void OControlWizardPage::enableFormDatasourceDisplay()
+ {
+ if (m_pFormSettingsSeparator)
+ // nothing to do
+ return;
+
+ ModuleRes aModuleRes(RID_PAGE_FORM_DATASOURCE_STATUS);
+ OLocalResourceAccess aLocalControls(aModuleRes, RSC_TABPAGE);
+
+ m_pFormSettingsSeparator = new FixedLine(this, ModuleRes(FL_FORMSETINGS));
+ m_pFormDatasourceLabel = new FixedText(this, ModuleRes(FT_FORMDATASOURCELABEL));
+ m_pFormDatasource = new FixedText(this, ModuleRes(FT_FORMDATASOURCE));
+ m_pFormContentTypeLabel = new FixedText(this, ModuleRes(FT_FORMCONTENTTYPELABEL));
+ m_pFormContentType = new FixedText(this, ModuleRes(FT_FORMCONTENTTYPE));
+ m_pFormTableLabel = new FixedText(this, ModuleRes(FT_FORMTABLELABEL));
+ m_pFormTable = new FixedText(this, ModuleRes(FT_FORMTABLE));
+
+ const OControlWizardContext& rContext = getContext();
+ if ( rContext.bEmbedded )
+ {
+ m_pFormDatasourceLabel->Hide();
+ m_pFormDatasource->Hide();
+ m_pFormContentTypeLabel->SetPosPixel(m_pFormDatasourceLabel->GetPosPixel());
+ m_pFormContentType->SetPosPixel(m_pFormDatasource->GetPosPixel());
+ m_pFormTableLabel->SetPosPixel(::Point(m_pFormDatasourceLabel->GetPosPixel().X(),m_pFormTableLabel->GetPosPixel().Y()));
+ m_pFormTable->SetPosPixel(::Point(m_pFormDatasource->GetPosPixel().X(),m_pFormTable->GetPosPixel().Y()));
+ }
+ }
+
+ //---------------------------------------------------------------------
+ void OControlWizardPage::adjustControlForNoDSDisplay(Control* _pControl, sal_Bool _bConstLowerDistance)
+ {
+ ::Size aDistanceToMove = LogicToPixel( ::Size( 0, 37 ), MAP_APPFONT );
+
+ ::Point aPos = _pControl->GetPosPixel();
+ aPos.Y() -= aDistanceToMove.Height();
+ _pControl->SetPosPixel(aPos);
+
+ if (_bConstLowerDistance)
+ {
+ ::Size aSize = _pControl->GetSizePixel();
+ aSize.Height() += aDistanceToMove.Height();
+ _pControl->SetSizePixel(aSize);
+ }
+ }
+
+ //---------------------------------------------------------------------
+ void OControlWizardPage::initializePage()
+ {
+ if (m_pFormDatasource && m_pFormContentTypeLabel && m_pFormTable)
+ {
+ const OControlWizardContext& rContext = getContext();
+ ::rtl::OUString sDataSource;
+ ::rtl::OUString sCommand;
+ sal_Int32 nCommandType = CommandType::COMMAND;
+ try
+ {
+ rContext.xForm->getPropertyValue(::rtl::OUString::createFromAscii("DataSourceName")) >>= sDataSource;
+ rContext.xForm->getPropertyValue(::rtl::OUString::createFromAscii("Command")) >>= sCommand;
+ rContext.xForm->getPropertyValue(::rtl::OUString::createFromAscii("CommandType")) >>= nCommandType;
+ }
+ catch(const Exception&)
+ {
+ DBG_ERROR("OControlWizardPage::initializePage: caught an exception!");
+ }
+
+ INetURLObject aURL( sDataSource );
+ if( aURL.GetProtocol() != INET_PROT_NOT_VALID )
+ sDataSource = aURL.GetName(INetURLObject::DECODE_WITH_CHARSET);
+ m_pFormDatasource->SetText(sDataSource);
+ m_pFormTable->SetText(sCommand);
+
+ WizardState nCommandTypeResourceId = 0;
+ switch (nCommandType)
+ {
+ case CommandType::TABLE:
+ nCommandTypeResourceId = RID_STR_TYPE_TABLE;
+ break;
+
+ case CommandType::QUERY:
+ nCommandTypeResourceId = RID_STR_TYPE_QUERY;
+ break;
+
+ default:
+ nCommandTypeResourceId = RID_STR_TYPE_COMMAND;
+ break;
+ }
+ m_pFormContentType->SetText(String(ModuleRes(nCommandTypeResourceId)));
+ }
+
+ OControlWizardPage_Base::initializePage();
+ }
+
+ //=====================================================================
+ //= OControlWizard
+ //=====================================================================
+ //---------------------------------------------------------------------
+ OControlWizard::OControlWizard( Window* _pParent, const ResId& _rId,
+ const Reference< XPropertySet >& _rxObjectModel, const Reference< XMultiServiceFactory >& _rxORB )
+ :OWizardMachine(_pParent, _rId, WZB_CANCEL | WZB_PREVIOUS | WZB_NEXT | WZB_FINISH)
+ ,m_xORB(_rxORB)
+ {
+ m_aContext.xObjectModel = _rxObjectModel;
+ initContext();
+
+ SetPageSizePixel(LogicToPixel(::Size(WINDOW_SIZE_X, WINDOW_SIZE_Y), MAP_APPFONT));
+ ShowButtonFixedLine(sal_True);
+ defaultButton(WZB_NEXT);
+ enableButtons(WZB_FINISH, sal_False);
+ }
+
+ //---------------------------------------------------------------------
+ OControlWizard::~OControlWizard()
+ {
+ }
+
+ //---------------------------------------------------------------------
+ short OControlWizard::Execute()
+ {
+ // get the class id of the control we're dealing with
+ sal_Int16 nClassId = FormComponentType::CONTROL;
+ try
+ {
+ getContext().xObjectModel->getPropertyValue(::rtl::OUString::createFromAscii("ClassId")) >>= nClassId;
+ }
+ catch(Exception&)
+ {
+ DBG_ERROR("OControlWizard::activate: could not obtain the class id!");
+ }
+ if (!approveControl(nClassId))
+ {
+ // TODO: MessageBox or exception
+ return RET_CANCEL;
+ }
+
+ ActivatePage();
+
+ return OControlWizard_Base::Execute();
+ }
+
+ //---------------------------------------------------------------------
+ void OControlWizard::ActivatePage()
+ {
+ OControlWizard_Base::ActivatePage();
+ }
+
+ //---------------------------------------------------------------------
+ void OControlWizard::implDetermineShape()
+ {
+ Reference< XIndexAccess > xPageObjects(m_aContext.xDrawPage, UNO_QUERY);
+ DBG_ASSERT(xPageObjects.is(), "OControlWizard::implDetermineShape: invalid page!");
+
+ // for comparing the model
+ Reference< XControlModel > xModelCompare(m_aContext.xObjectModel, UNO_QUERY);
+
+ if (xPageObjects.is())
+ {
+ // loop through all objects of the page
+ sal_Int32 nObjects = xPageObjects->getCount();
+ Reference< XControlShape > xControlShape;
+ Reference< XControlModel > xControlModel;
+ for (sal_Int32 i=0; i<nObjects; ++i)
+ {
+ if (xPageObjects->getByIndex(i) >>= xControlShape)
+ { // it _is_ a control shape
+ xControlModel = xControlShape->getControl();
+ DBG_ASSERT(xControlModel.is(), "OControlWizard::implDetermineShape: control shape without model!");
+ if (xModelCompare.get() == xControlModel.get())
+ {
+ m_aContext.xObjectShape = xControlShape;
+ break;
+ }
+ }
+ }
+ }
+ }
+
+ //---------------------------------------------------------------------
+ void OControlWizard::implDetermineForm()
+ {
+ Reference< XChild > xModelAsChild(m_aContext.xObjectModel, UNO_QUERY);
+ Reference< XInterface > xControlParent;
+ if (xModelAsChild.is())
+ xControlParent = xModelAsChild->getParent();
+
+ m_aContext.xForm = Reference< XPropertySet >(xControlParent, UNO_QUERY);
+ m_aContext.xRowSet = Reference< XRowSet >(xControlParent, UNO_QUERY);
+ DBG_ASSERT(m_aContext.xForm.is() && m_aContext.xRowSet.is(),
+ "OControlWizard::implDetermineForm: missing some interfaces of the control parent!");
+
+ }
+
+ //---------------------------------------------------------------------
+ void OControlWizard::implDeterminePage()
+ {
+ try
+ {
+ // get the document model
+ Reference< XChild > xControlAsChild(m_aContext.xObjectModel, UNO_QUERY);
+ Reference< XChild > xModelSearch(xControlAsChild->getParent(), UNO_QUERY);
+
+ Reference< XModel > xModel(xModelSearch, UNO_QUERY);
+ while (xModelSearch.is() && !xModel.is())
+ {
+ xModelSearch = Reference< XChild >(xModelSearch->getParent(), UNO_QUERY);
+ xModel = Reference< XModel >(xModelSearch, UNO_QUERY);
+ }
+
+ Reference< XDrawPage > xPage;
+ if (xModel.is())
+ {
+ m_aContext.xDocumentModel = xModel;
+
+ Reference< XDrawPageSupplier > xPageSupp(xModel, UNO_QUERY);
+ if (xPageSupp.is())
+ { // it's a document with only one page -> Writer
+ xPage = xPageSupp->getDrawPage();
+ }
+ else
+ {
+ // get the controller currently working on this model
+ Reference< XController > xController = xModel->getCurrentController();
+ DBG_ASSERT(xController.is(), "OControlWizard::implDeterminePage: no current controller!");
+
+ // maybe it's a spredsheet
+ Reference< XSpreadsheetView > xView(xController, UNO_QUERY);
+ if (xView.is())
+ { // okay, it is one
+ Reference< XSpreadsheet > xSheet = xView->getActiveSheet();
+ xPageSupp = Reference< XDrawPageSupplier >(xSheet, UNO_QUERY);
+ DBG_ASSERT(xPageSupp.is(), "OControlWizard::implDeterminePage: a spreadsheet which is no page supplier!");
+ if (xPageSupp.is())
+ xPage = xPageSupp->getDrawPage();
+ }
+ else
+ { // can be a draw/impress doc only
+ Reference< XDrawView > xDrawView(xController, UNO_QUERY);
+ DBG_ASSERT(xDrawView.is(), "OControlWizard::implDeterminePage: no alternatives left ... can't determine the page!");
+ if (xDrawView.is())
+ xPage = xDrawView->getCurrentPage();
+ }
+ }
+ }
+ else
+ {
+ DBG_ASSERT(xPage.is(), "OControlWizard::implDeterminePage: can't determine the page (no model)!");
+ }
+ m_aContext.xDrawPage = xPage;
+ }
+ catch(Exception&)
+ {
+ DBG_ERROR("OControlWizard::implDeterminePage: caught an exception!");
+ }
+ }
+
+ //---------------------------------------------------------------------
+ void OControlWizard::implGetDSContext()
+ {
+ Reference< XMultiServiceFactory > xORB = getServiceFactory();
+ try
+ {
+ DBG_ASSERT(xORB.is(), "OControlWizard::implGetDSContext: invalid service factory!");
+
+ Reference< XInterface > xContext;
+ if (xORB.is())
+ xContext = xORB->createInstance(::rtl::OUString::createFromAscii("com.sun.star.sdb.DatabaseContext"));
+ DBG_ASSERT(xContext.is(), "OControlWizard::implGetDSContext: invalid database context!");
+
+ m_aContext.xDatasourceContext = Reference< XNameAccess >(xContext, UNO_QUERY);
+ DBG_ASSERT(m_aContext.xDatasourceContext.is() || !xContext.is(), "OControlWizard::implGetDSContext: invalid database context (missing the XNameAccess)!");
+ }
+ catch(Exception&)
+ {
+ DBG_ERROR("OControlWizard::implGetDSContext: invalid database context!");
+ }
+ }
+
+ //---------------------------------------------------------------------
+ Reference< XConnection > OControlWizard::getFormConnection(const OAccessRegulator&) const
+ {
+ return getFormConnection();
+ }
+ //---------------------------------------------------------------------
+ Reference< XConnection > OControlWizard::getFormConnection() const
+ {
+ Reference< XConnection > xConn;
+ try
+ {
+ if ( !::dbtools::isEmbeddedInDatabase(m_aContext.xForm,xConn) )
+ m_aContext.xForm->getPropertyValue(::rtl::OUString::createFromAscii("ActiveConnection")) >>= xConn;
+ }
+ catch(const Exception&)
+ {
+ DBG_ERROR("OControlWizard::getFormConnection: caught an exception!");
+ }
+ return xConn;
+ }
+
+ //---------------------------------------------------------------------
+ void OControlWizard::setFormConnection( const OAccessRegulator& _rAccess, const Reference< XConnection >& _rxConn, sal_Bool _bAutoDispose )
+ {
+ try
+ {
+ Reference< XConnection > xOldConn = getFormConnection(_rAccess);
+ if (xOldConn.get() == _rxConn.get())
+ return;
+
+ disposeComponent(xOldConn);
+
+ // set the new connection
+ if ( _bAutoDispose )
+ {
+ // for this, use a AutoDisposer (so the conn is cleaned up when the form dies or get's another connection)
+ Reference< XRowSet > xFormRowSet( m_aContext.xForm, UNO_QUERY );
+ OAutoConnectionDisposer* pAutoDispose = new OAutoConnectionDisposer( xFormRowSet, _rxConn );
+ Reference< XPropertyChangeListener > xEnsureDelete( pAutoDispose );
+ }
+ else
+ {
+ m_aContext.xForm->setPropertyValue( ::rtl::OUString::createFromAscii("ActiveConnection"), makeAny( _rxConn ) );
+ }
+ }
+ catch(const Exception&)
+ {
+ DBG_ERROR("OControlWizard::setFormConnection: caught an exception!");
+ }
+ }
+
+ //---------------------------------------------------------------------
+ sal_Bool OControlWizard::updateContext(const OAccessRegulator&)
+ {
+ return initContext();
+ }
+ //---------------------------------------------------------------------
+ Reference< XInteractionHandler > OControlWizard::getInteractionHandler(Window* _pWindow) const
+ {
+ const ::rtl::OUString sInteractionHandlerServiceName = ::rtl::OUString::createFromAscii("com.sun.star.sdb.InteractionHandler");
+ Reference< XInteractionHandler > xHandler;
+ try
+ {
+ if (getServiceFactory().is())
+ xHandler = Reference< XInteractionHandler >(getServiceFactory()->createInstance(sInteractionHandlerServiceName), UNO_QUERY);
+ }
+ catch(Exception&) { }
+ if (!xHandler.is())
+ ShowServiceNotAvailableError(_pWindow, sInteractionHandlerServiceName, sal_True);
+ return xHandler;
+ }
+ //---------------------------------------------------------------------
+ sal_Bool OControlWizard::initContext()
+ {
+ DBG_ASSERT(m_aContext.xObjectModel.is(), "OGroupBoxWizard::initContext: have no control model to work with!");
+ if (!m_aContext.xObjectModel.is())
+ return sal_False;
+
+ // reset the context
+ m_aContext.xForm.clear();
+ m_aContext.xRowSet.clear();
+ m_aContext.xDocumentModel.clear();
+ m_aContext.xDrawPage.clear();
+ m_aContext.xObjectShape.clear();
+ m_aContext.aFieldNames.realloc(0);
+
+ m_aContext.xObjectContainer.clear();
+ m_aContext.aTypes.clear();
+ m_aContext.bEmbedded = sal_False;
+
+ Any aSQLException;
+ Reference< XPreparedStatement > xStatement;
+ try
+ {
+ // get the datasource context
+ implGetDSContext();
+
+ // first, determine the form the control belongs to
+ implDetermineForm();
+
+ // need the page, too
+ implDeterminePage();
+
+ // the shape of the control
+ implDetermineShape();
+
+ // get the columns of the object the settins refer to
+ Reference< XNameAccess > xColumns;
+
+ if (m_aContext.xForm.is())
+ {
+ // collect some properties of the form
+ ::rtl::OUString sObjectName = ::comphelper::getString(m_aContext.xForm->getPropertyValue(::rtl::OUString::createFromAscii("Command")));
+ sal_Int32 nObjectType = ::comphelper::getINT32(m_aContext.xForm->getPropertyValue(::rtl::OUString::createFromAscii("CommandType")));
+
+ // calculate the connection the rowset is working with
+ Reference< XConnection > xConnection;
+ m_aContext.bEmbedded = ::dbtools::isEmbeddedInDatabase( m_aContext.xForm, xConnection );
+ if ( !m_aContext.bEmbedded )
+ xConnection = ::dbtools::connectRowset( m_aContext.xRowSet, getServiceFactory(), sal_True );
+
+ // get the fields
+ if (xConnection.is())
+ {
+ switch (nObjectType)
+ {
+ case 0:
+ {
+ Reference< XTablesSupplier > xSupplyTables(xConnection, UNO_QUERY);
+ if (xSupplyTables.is() && xSupplyTables->getTables().is() && xSupplyTables->getTables()->hasByName(sObjectName))
+ {
+ Reference< XColumnsSupplier > xSupplyColumns;
+ m_aContext.xObjectContainer = xSupplyTables->getTables();
+ m_aContext.xObjectContainer->getByName(sObjectName) >>= xSupplyColumns;
+ DBG_ASSERT(xSupplyColumns.is(), "OControlWizard::initContext: invalid table columns!");
+ xColumns = xSupplyColumns->getColumns();
+ }
+ }
+ break;
+ case 1:
+ {
+ Reference< XQueriesSupplier > xSupplyQueries(xConnection, UNO_QUERY);
+ if (xSupplyQueries.is() && xSupplyQueries->getQueries().is() && xSupplyQueries->getQueries()->hasByName(sObjectName))
+ {
+ Reference< XColumnsSupplier > xSupplyColumns;
+ m_aContext.xObjectContainer = xSupplyQueries->getQueries();
+ m_aContext.xObjectContainer->getByName(sObjectName) >>= xSupplyColumns;
+ DBG_ASSERT(xSupplyColumns.is(), "OControlWizard::initContext: invalid query columns!");
+ xColumns = xSupplyColumns->getColumns();
+ }
+ }
+ break;
+ default:
+ {
+ xStatement = xConnection->prepareStatement(sObjectName);
+
+ // not interested in any results, only in the fields
+ Reference< XPropertySet > xStatementProps(xStatement, UNO_QUERY);
+ xStatementProps->setPropertyValue(::rtl::OUString::createFromAscii("MaxRows"), makeAny(sal_Int32(0)));
+
+ // TODO: think about handling local SQLExceptions here ...
+ Reference< XColumnsSupplier > xSupplyCols(xStatement->executeQuery(), UNO_QUERY);
+ if (xSupplyCols.is())
+ xColumns = xSupplyCols->getColumns();
+ }
+ }
+ }
+ }
+
+ if (xColumns.is())
+ {
+ m_aContext.aFieldNames = xColumns->getElementNames();
+ static const ::rtl::OUString s_sFieldTypeProperty = ::rtl::OUString::createFromAscii("Type");
+ const ::rtl::OUString* pBegin = m_aContext.aFieldNames.getConstArray();
+ const ::rtl::OUString* pEnd = pBegin + m_aContext.aFieldNames.getLength();
+ for(;pBegin != pEnd;++pBegin)
+ {
+ sal_Int32 nFieldType = DataType::OTHER;
+ try
+ {
+ Reference< XPropertySet > xColumn;
+ xColumns->getByName(*pBegin) >>= xColumn;
+ xColumn->getPropertyValue(s_sFieldTypeProperty) >>= nFieldType;
+ }
+ catch(Exception&)
+ {
+ DBG_ERROR("OControlWizard::initContext: unexpected exception while gathering column information!");
+ }
+ m_aContext.aTypes.insert(OControlWizardContext::TNameTypeMap::value_type(*pBegin,nFieldType));
+ }
+ }
+ }
+ catch(SQLContext& e) { aSQLException <<= e; }
+ catch(SQLWarning& e) { aSQLException <<= e; }
+ catch(SQLException& e) { aSQLException <<= e; }
+ catch(Exception&)
+ {
+ DBG_ERROR("OControlWizard::initContext: could not retrieve the control context (caught an exception)!");
+ }
+
+ ::comphelper::disposeComponent(xStatement);
+
+ if (aSQLException.hasValue())
+ { // an SQLException (or derivee) was thrown ...
+
+ // prepend an extra SQLContext explaining what we were doing
+ SQLContext aContext;
+ aContext.Message = String(ModuleRes(RID_STR_COULDNOTOPENTABLE));
+ aContext.NextException = aSQLException;
+
+ // create an interaction handler to display this exception
+ Reference< XInteractionHandler > xHandler = getInteractionHandler(this);
+ if ( !xHandler.is() )
+ return sal_False;
+
+ Reference< XInteractionRequest > xRequest = new OInteractionRequest(makeAny(aContext));
+ try
+ {
+ xHandler->handle(xRequest);
+ }
+ catch(Exception&) { }
+ return sal_False;
+ }
+
+ return 0 != m_aContext.aFieldNames.getLength();
+ }
+
+ //---------------------------------------------------------------------
+ void OControlWizard::commitControlSettings(OControlWizardSettings* _pSettings)
+ {
+ DBG_ASSERT(m_aContext.xObjectModel.is(), "OControlWizard::commitControlSettings: have no control model to work with!");
+ if (!m_aContext.xObjectModel.is())
+ return;
+
+ // the only thing we have at the moment is the label
+ try
+ {
+ ::rtl::OUString sLabelPropertyName = ::rtl::OUString::createFromAscii("Label");
+ Reference< XPropertySetInfo > xInfo = m_aContext.xObjectModel->getPropertySetInfo();
+ if (xInfo.is() && xInfo->hasPropertyByName(sLabelPropertyName))
+ {
+ ::rtl::OUString sControlLabel(_pSettings->sControlLabel);
+ m_aContext.xObjectModel->setPropertyValue(
+ ::rtl::OUString::createFromAscii("Label"),
+ makeAny(sControlLabel)
+ );
+ }
+ }
+ catch(Exception&)
+ {
+ DBG_ERROR("OControlWizard::commitControlSettings: could not commit the basic control settings!");
+ }
+ }
+
+ //---------------------------------------------------------------------
+ void OControlWizard::initControlSettings(OControlWizardSettings* _pSettings)
+ {
+ DBG_ASSERT(m_aContext.xObjectModel.is(), "OControlWizard::initControlSettings: have no control model to work with!");
+ if (!m_aContext.xObjectModel.is())
+ return;
+
+ // initialize some settings from the control model give
+ try
+ {
+ ::rtl::OUString sLabelPropertyName = ::rtl::OUString::createFromAscii("Label");
+ Reference< XPropertySetInfo > xInfo = m_aContext.xObjectModel->getPropertySetInfo();
+ if (xInfo.is() && xInfo->hasPropertyByName(sLabelPropertyName))
+ {
+ ::rtl::OUString sControlLabel;
+ m_aContext.xObjectModel->getPropertyValue(sLabelPropertyName) >>= sControlLabel;
+ _pSettings->sControlLabel = sControlLabel;
+ }
+ }
+ catch(Exception&)
+ {
+ DBG_ERROR("OControlWizard::initControlSettings: could not retrieve the basic control settings!");
+ }
+ }
+
+ //---------------------------------------------------------------------
+ sal_Bool OControlWizard::needDatasourceSelection()
+ {
+ // lemme see ...
+ return (0 == getContext().aFieldNames.getLength());
+ // if we got fields, the data source is valid ...
+// try
+// {
+// // first, we need a valid data source name
+// ::rtl::OUString sDataSourceName;
+// m_aContext.xForm->getPropertyValue(::rtl::OUString::createFromAscii("DataSourceName")) >>= sDataSourceName;
+// if (m_aContext.xDatasourceContext.is() && m_aContext.xDatasourceContext->hasByName(sDataSourceName))
+// { // at least the data source name is valid ...
+// // then, a CommandType "table" would be nice ...
+// sal_Int32 nCommandType = CommandType::COMMAND;
+// m_aContext.xForm->getPropertyValue(::rtl::OUString::createFromAscii("CommandType")) >>= nCommandType;
+// if (CommandType::TABLE == nCommandType)
+// { // okay ....
+// // now the table itself should be valid
+// ::rtl::OUString sTableName;
+// m_aContext.xForm->getPropertyValue(::rtl::OUString::createFromAscii("Command")) >>= sTableName;
+// if (m_aContext.xObjectContainer.is() && m_aContext.xObjectContainer->hasByName(sTableName))
+// return sal_False;
+// }
+// }
+// }
+// catch(Exception&)
+// {
+// DBG_ERROR("OControlWizard::needDatasourceSelection: caught an exception while checking the form settings!");
+// }
+// return sal_True;
+ }
+
+//.........................................................................
+} // namespace dbp
+//.........................................................................
+