LCOV - code coverage report
Current view: top level - extensions/source/dbpilots - controlwizard.cxx (source / functions) Hit Total Coverage
Test: commit e02a6cb2c3e2b23b203b422e4e0680877f232636 Lines: 0 317 0.0 %
Date: 2014-04-14 Functions: 0 33 0.0 %
Legend: Lines: hit not hit

          Line data    Source code
       1             : /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
       2             : /*
       3             :  * This file is part of the LibreOffice project.
       4             :  *
       5             :  * This Source Code Form is subject to the terms of the Mozilla Public
       6             :  * License, v. 2.0. If a copy of the MPL was not distributed with this
       7             :  * file, You can obtain one at http://mozilla.org/MPL/2.0/.
       8             :  *
       9             :  * This file incorporates work covered by the following license notice:
      10             :  *
      11             :  *   Licensed to the Apache Software Foundation (ASF) under one or more
      12             :  *   contributor license agreements. See the NOTICE file distributed
      13             :  *   with this work for additional information regarding copyright
      14             :  *   ownership. The ASF licenses this file to you under the Apache
      15             :  *   License, Version 2.0 (the "License"); you may not use this file
      16             :  *   except in compliance with the License. You may obtain a copy of
      17             :  *   the License at http://www.apache.org/licenses/LICENSE-2.0 .
      18             :  */
      19             : 
      20             : #include "controlwizard.hxx"
      21             : #include <tools/debug.hxx>
      22             : #include <com/sun/star/container/XNameAccess.hpp>
      23             : #include <com/sun/star/sdbcx/XTablesSupplier.hpp>
      24             : #include <com/sun/star/sdb/DatabaseContext.hpp>
      25             : #include <com/sun/star/sdb/XQueriesSupplier.hpp>
      26             : #include <com/sun/star/sdbc/XPreparedStatement.hpp>
      27             : #include <com/sun/star/container/XChild.hpp>
      28             : #include <com/sun/star/sdbcx/XColumnsSupplier.hpp>
      29             : #include <com/sun/star/frame/XModel.hpp>
      30             : #include <com/sun/star/sheet/XSpreadsheetView.hpp>
      31             : #include <com/sun/star/drawing/XDrawView.hpp>
      32             : #include <com/sun/star/drawing/XDrawPageSupplier.hpp>
      33             : #include <com/sun/star/sdb/CommandType.hpp>
      34             : #include <com/sun/star/sdbc/SQLWarning.hpp>
      35             : #include <com/sun/star/sdb/SQLContext.hpp>
      36             : #include <com/sun/star/task/InteractionHandler.hpp>
      37             : #include <comphelper/processfactory.hxx>
      38             : #include <comphelper/types.hxx>
      39             : #include <connectivity/dbtools.hxx>
      40             : #include <vcl/msgbox.hxx>
      41             : #include <comphelper/interaction.hxx>
      42             : #include <vcl/stdtext.hxx>
      43             : #include <svtools/localresaccess.hxx>
      44             : #include <connectivity/conncleanup.hxx>
      45             : #include <com/sun/star/sdbc/DataType.hpp>
      46             : #include <tools/urlobj.hxx>
      47             : 
      48             : 
      49             : namespace dbp
      50             : {
      51             : 
      52             : 
      53             :     using namespace ::com::sun::star::uno;
      54             :     using namespace ::com::sun::star::awt;
      55             :     using namespace ::com::sun::star::lang;
      56             :     using namespace ::com::sun::star::sdb;
      57             :     using namespace ::com::sun::star::sdbc;
      58             :     using namespace ::com::sun::star::sdbcx;
      59             :     using namespace ::com::sun::star::beans;
      60             :     using namespace ::com::sun::star::container;
      61             :     using namespace ::com::sun::star::drawing;
      62             :     using namespace ::com::sun::star::frame;
      63             :     using namespace ::com::sun::star::sheet;
      64             :     using namespace ::com::sun::star::form;
      65             :     using namespace ::com::sun::star::task;
      66             :     using namespace ::svt;
      67             :     using namespace ::comphelper;
      68             :     using namespace ::dbtools;
      69             : 
      70             : 
      71             :     //= OAccessRegulator
      72             : 
      73             :     struct OAccessRegulator
      74             :     {
      75             :         friend class OControlWizardPage;
      76             : 
      77             :     protected:
      78           0 :         OAccessRegulator() { }
      79             :     };
      80             : 
      81             : 
      82             :     //= OControlWizardPage
      83             : 
      84             : 
      85           0 :     OControlWizardPage::OControlWizardPage( OControlWizard* _pParent, const ResId& _rResId )
      86             :         :OControlWizardPage_Base( _pParent, _rResId )
      87             :         ,m_pFormSettingsSeparator(NULL)
      88             :         ,m_pFormDatasourceLabel(NULL)
      89             :         ,m_pFormDatasource(NULL)
      90             :         ,m_pFormContentTypeLabel(NULL)
      91             :         ,m_pFormContentType(NULL)
      92             :         ,m_pFormTableLabel(NULL)
      93           0 :         ,m_pFormTable(NULL)
      94             :     {
      95           0 :     }
      96             : 
      97             : 
      98           0 :     OControlWizardPage::~OControlWizardPage()
      99             :     {
     100           0 :         delete m_pFormSettingsSeparator;
     101           0 :         delete m_pFormDatasourceLabel;
     102           0 :         delete m_pFormDatasource;
     103           0 :         delete m_pFormContentTypeLabel;
     104           0 :         delete m_pFormContentType;
     105           0 :         delete m_pFormTableLabel;
     106           0 :         delete m_pFormTable;
     107           0 :     }
     108             : 
     109             : 
     110           0 :     OControlWizard* OControlWizardPage::getDialog()
     111             :     {
     112           0 :         return static_cast< OControlWizard* >(GetParent());
     113             :     }
     114             : 
     115             : 
     116           0 :     const OControlWizard* OControlWizardPage::getDialog() const
     117             :     {
     118           0 :         return static_cast< OControlWizard* >(GetParent());
     119             :     }
     120             : 
     121             : 
     122           0 :     sal_Bool OControlWizardPage::updateContext()
     123             :     {
     124           0 :         return getDialog()->updateContext(OAccessRegulator());
     125             :     }
     126             : 
     127             : 
     128           0 :     Reference< XConnection > OControlWizardPage::getFormConnection() const
     129             :     {
     130           0 :         return getDialog()->getFormConnection(OAccessRegulator());
     131             :     }
     132             : 
     133             : 
     134           0 :     void OControlWizardPage::setFormConnection( const Reference< XConnection >& _rxConn, sal_Bool _bAutoDispose )
     135             :     {
     136           0 :         getDialog()->setFormConnection( OAccessRegulator(), _rxConn, _bAutoDispose );
     137           0 :     }
     138             : 
     139             : 
     140           0 :     const OControlWizardContext& OControlWizardPage::getContext()
     141             :     {
     142           0 :         return getDialog()->getContext();
     143             :     }
     144             : 
     145             : 
     146           0 :     void OControlWizardPage::fillListBox(ListBox& _rList, const Sequence< OUString >& _rItems, sal_Bool _bClear)
     147             :     {
     148           0 :         if (_bClear)
     149           0 :             _rList.Clear();
     150           0 :         const OUString* pItems = _rItems.getConstArray();
     151           0 :         const OUString* pEnd = pItems + _rItems.getLength();
     152             :         ::svt::WizardTypes::WizardState nPos;
     153           0 :         sal_Int32 nIndex = 0;
     154           0 :         for (;pItems < pEnd; ++pItems, ++nIndex)
     155             :         {
     156           0 :             nPos = _rList.InsertEntry(*pItems);
     157           0 :             _rList.SetEntryData(nPos, reinterpret_cast<void*>(nIndex));
     158             :         }
     159           0 :     }
     160             : 
     161             : 
     162           0 :     void OControlWizardPage::fillListBox(ComboBox& _rList, const Sequence< OUString >& _rItems, sal_Bool _bClear)
     163             :     {
     164           0 :         if (_bClear)
     165           0 :             _rList.Clear();
     166           0 :         const OUString* pItems = _rItems.getConstArray();
     167           0 :         const OUString* pEnd = pItems + _rItems.getLength();
     168             :         ::svt::WizardTypes::WizardState nPos;
     169           0 :         sal_Int32 nIndex = 0;
     170           0 :         for (;pItems < pEnd; ++pItems)
     171             :         {
     172           0 :             nPos = _rList.InsertEntry(*pItems);
     173           0 :             _rList.SetEntryData(nPos, reinterpret_cast<void*>(nIndex));
     174             :         }
     175           0 :     }
     176             : 
     177             : 
     178           0 :     void OControlWizardPage::enableFormDatasourceDisplay()
     179             :     {
     180           0 :         if (m_pFormSettingsSeparator)
     181             :             // nothing to do
     182           0 :             return;
     183             : 
     184           0 :         ModuleRes aModuleRes(RID_PAGE_FORM_DATASOURCE_STATUS);
     185           0 :         OLocalResourceAccess aLocalControls(aModuleRes, RSC_TABPAGE);
     186             : 
     187           0 :         m_pFormSettingsSeparator    = new FixedLine(this,  ModuleRes(FL_FORMSETINGS));
     188           0 :         m_pFormDatasourceLabel      = new FixedText(this,  ModuleRes(FT_FORMDATASOURCELABEL));
     189           0 :         m_pFormDatasource           = new FixedText(this,  ModuleRes(FT_FORMDATASOURCE));
     190           0 :         m_pFormContentTypeLabel     = new FixedText(this,  ModuleRes(FT_FORMCONTENTTYPELABEL));
     191           0 :         m_pFormContentType          = new FixedText(this,  ModuleRes(FT_FORMCONTENTTYPE));
     192           0 :         m_pFormTableLabel           = new FixedText(this,  ModuleRes(FT_FORMTABLELABEL));
     193           0 :         m_pFormTable                = new FixedText(this,  ModuleRes(FT_FORMTABLE));
     194             : 
     195           0 :         const OControlWizardContext& rContext = getContext();
     196           0 :         if ( rContext.bEmbedded )
     197             :         {
     198           0 :             m_pFormDatasourceLabel->Hide();
     199           0 :             m_pFormDatasource->Hide();
     200           0 :             m_pFormContentTypeLabel->SetPosPixel(m_pFormDatasourceLabel->GetPosPixel());
     201           0 :             m_pFormContentType->SetPosPixel(m_pFormDatasource->GetPosPixel());
     202           0 :             m_pFormTableLabel->SetPosPixel(::Point(m_pFormDatasourceLabel->GetPosPixel().X(),m_pFormTableLabel->GetPosPixel().Y()));
     203           0 :             m_pFormTable->SetPosPixel(::Point(m_pFormDatasource->GetPosPixel().X(),m_pFormTable->GetPosPixel().Y()));
     204           0 :         }
     205             :     }
     206             : 
     207             : 
     208           0 :     void OControlWizardPage::adjustControlForNoDSDisplay(Control* _pControl, sal_Bool _bConstLowerDistance)
     209             :     {
     210           0 :         ::Size aDistanceToMove = LogicToPixel( ::Size( 0, 37 ), MAP_APPFONT );
     211             : 
     212           0 :         ::Point aPos = _pControl->GetPosPixel();
     213           0 :         aPos.Y() -= aDistanceToMove.Height();
     214           0 :         _pControl->SetPosPixel(aPos);
     215             : 
     216           0 :         if (_bConstLowerDistance)
     217             :         {
     218           0 :             ::Size aSize = _pControl->GetSizePixel();
     219           0 :             aSize.Height() += aDistanceToMove.Height();
     220           0 :             _pControl->SetSizePixel(aSize);
     221             :         }
     222           0 :     }
     223             : 
     224             : 
     225           0 :     void OControlWizardPage::initializePage()
     226             :     {
     227           0 :         if (m_pFormDatasource && m_pFormContentTypeLabel && m_pFormTable)
     228             :         {
     229           0 :             const OControlWizardContext& rContext = getContext();
     230           0 :             OUString sDataSource;
     231           0 :             OUString sCommand;
     232           0 :             sal_Int32 nCommandType = CommandType::COMMAND;
     233             :             try
     234             :             {
     235           0 :                 rContext.xForm->getPropertyValue("DataSourceName") >>= sDataSource;
     236           0 :                 rContext.xForm->getPropertyValue("Command") >>= sCommand;
     237           0 :                 rContext.xForm->getPropertyValue("CommandType") >>= nCommandType;
     238             :             }
     239           0 :             catch(const Exception&)
     240             :             {
     241             :                 OSL_FAIL("OControlWizardPage::initializePage: caught an exception!");
     242             :             }
     243             : 
     244           0 :             INetURLObject aURL( sDataSource );
     245           0 :             if( aURL.GetProtocol() != INET_PROT_NOT_VALID )
     246           0 :                 sDataSource = aURL.GetName(INetURLObject::DECODE_WITH_CHARSET);
     247           0 :             m_pFormDatasource->SetText(sDataSource);
     248           0 :             m_pFormTable->SetText(sCommand);
     249             : 
     250           0 :             ::svt::WizardTypes::WizardState nCommandTypeResourceId = 0;
     251           0 :             switch (nCommandType)
     252             :             {
     253             :                 case CommandType::TABLE:
     254           0 :                     nCommandTypeResourceId = RID_STR_TYPE_TABLE;
     255           0 :                     break;
     256             : 
     257             :                 case CommandType::QUERY:
     258           0 :                     nCommandTypeResourceId = RID_STR_TYPE_QUERY;
     259           0 :                     break;
     260             : 
     261             :                 default:
     262           0 :                     nCommandTypeResourceId = RID_STR_TYPE_COMMAND;
     263           0 :                     break;
     264             :             }
     265           0 :             m_pFormContentType->SetText(ModuleRes(nCommandTypeResourceId).toString());
     266             :         }
     267             : 
     268           0 :         OControlWizardPage_Base::initializePage();
     269           0 :     }
     270             : 
     271             : 
     272             :     //= OControlWizard
     273             : 
     274             : 
     275           0 :     OControlWizard::OControlWizard( Window* _pParent, const ResId& _rId,
     276             :             const Reference< XPropertySet >& _rxObjectModel, const Reference< XComponentContext >& _rxContext )
     277             :         :OWizardMachine(_pParent, _rId, WZB_CANCEL | WZB_PREVIOUS | WZB_NEXT | WZB_FINISH)
     278           0 :         ,m_xContext(_rxContext)
     279             :     {
     280           0 :         m_aContext.xObjectModel = _rxObjectModel;
     281           0 :         initContext();
     282             : 
     283           0 :         SetPageSizePixel(LogicToPixel(::Size(WINDOW_SIZE_X, WINDOW_SIZE_Y), MAP_APPFONT));
     284           0 :         ShowButtonFixedLine(true);
     285           0 :         defaultButton(WZB_NEXT);
     286           0 :         enableButtons(WZB_FINISH, false);
     287           0 :     }
     288             : 
     289             : 
     290           0 :     OControlWizard::~OControlWizard()
     291             :     {
     292           0 :     }
     293             : 
     294             : 
     295           0 :     short OControlWizard::Execute()
     296             :     {
     297             :         // get the class id of the control we're dealing with
     298           0 :         sal_Int16 nClassId = FormComponentType::CONTROL;
     299             :         try
     300             :         {
     301           0 :             getContext().xObjectModel->getPropertyValue("ClassId") >>= nClassId;
     302             :         }
     303           0 :         catch(const Exception&)
     304             :         {
     305             :             OSL_FAIL("OControlWizard::activate: could not obtain the class id!");
     306             :         }
     307           0 :         if (!approveControl(nClassId))
     308             :         {
     309             :             // TODO: MessageBox or exception
     310           0 :             return RET_CANCEL;
     311             :         }
     312             : 
     313           0 :         ActivatePage();
     314             : 
     315           0 :         return OControlWizard_Base::Execute();
     316             :     }
     317             : 
     318             : 
     319           0 :     void OControlWizard::ActivatePage()
     320             :     {
     321           0 :         OControlWizard_Base::ActivatePage();
     322           0 :     }
     323             : 
     324             : 
     325           0 :     void OControlWizard::implDetermineShape()
     326             :     {
     327           0 :         Reference< XIndexAccess > xPageObjects(m_aContext.xDrawPage, UNO_QUERY);
     328             :         DBG_ASSERT(xPageObjects.is(), "OControlWizard::implDetermineShape: invalid page!");
     329             : 
     330             :         // for comparing the model
     331           0 :         Reference< XControlModel > xModelCompare(m_aContext.xObjectModel, UNO_QUERY);
     332             : 
     333           0 :         if (xPageObjects.is())
     334             :         {
     335             :             // loop through all objects of the page
     336           0 :             sal_Int32 nObjects = xPageObjects->getCount();
     337           0 :             Reference< XControlShape > xControlShape;
     338           0 :             Reference< XControlModel > xControlModel;
     339           0 :             for (sal_Int32 i=0; i<nObjects; ++i)
     340             :             {
     341           0 :                 if (xPageObjects->getByIndex(i) >>= xControlShape)
     342             :                 {   // it _is_ a control shape
     343           0 :                     xControlModel = xControlShape->getControl();
     344             :                     DBG_ASSERT(xControlModel.is(), "OControlWizard::implDetermineShape: control shape without model!");
     345           0 :                     if (xModelCompare.get() == xControlModel.get())
     346             :                     {
     347           0 :                         m_aContext.xObjectShape = xControlShape;
     348           0 :                         break;
     349             :                     }
     350             :                 }
     351           0 :             }
     352           0 :         }
     353           0 :     }
     354             : 
     355             : 
     356           0 :     void OControlWizard::implDetermineForm()
     357             :     {
     358           0 :         Reference< XChild > xModelAsChild(m_aContext.xObjectModel, UNO_QUERY);
     359           0 :         Reference< XInterface > xControlParent;
     360           0 :         if (xModelAsChild.is())
     361           0 :             xControlParent = xModelAsChild->getParent();
     362             : 
     363           0 :         m_aContext.xForm = Reference< XPropertySet >(xControlParent, UNO_QUERY);
     364           0 :         m_aContext.xRowSet = Reference< XRowSet >(xControlParent, UNO_QUERY);
     365             :         DBG_ASSERT(m_aContext.xForm.is() && m_aContext.xRowSet.is(),
     366           0 :             "OControlWizard::implDetermineForm: missing some interfaces of the control parent!");
     367             : 
     368           0 :     }
     369             : 
     370             : 
     371           0 :     void OControlWizard::implDeterminePage()
     372             :     {
     373             :         try
     374             :         {
     375             :             // get the document model
     376           0 :             Reference< XChild > xControlAsChild(m_aContext.xObjectModel, UNO_QUERY);
     377           0 :             Reference< XChild > xModelSearch(xControlAsChild->getParent(), UNO_QUERY);
     378             : 
     379           0 :             Reference< XModel > xModel(xModelSearch, UNO_QUERY);
     380           0 :             while (xModelSearch.is() && !xModel.is())
     381             :             {
     382           0 :                 xModelSearch = Reference< XChild >(xModelSearch->getParent(), UNO_QUERY);
     383           0 :                 xModel = Reference< XModel >(xModelSearch, UNO_QUERY);
     384             :             }
     385             : 
     386           0 :             Reference< XDrawPage > xPage;
     387           0 :             if (xModel.is())
     388             :             {
     389           0 :                 m_aContext.xDocumentModel = xModel;
     390             : 
     391           0 :                 Reference< XDrawPageSupplier > xPageSupp(xModel, UNO_QUERY);
     392           0 :                 if (xPageSupp.is())
     393             :                 {   // it's a document with only one page -> Writer
     394           0 :                     xPage = xPageSupp->getDrawPage();
     395             :                 }
     396             :                 else
     397             :                 {
     398             :                     // get the controller currently working on this model
     399           0 :                     Reference< XController > xController = xModel->getCurrentController();
     400             :                     DBG_ASSERT(xController.is(), "OControlWizard::implDeterminePage: no current controller!");
     401             : 
     402             :                     // maybe it's a spredsheet
     403           0 :                     Reference< XSpreadsheetView > xView(xController, UNO_QUERY);
     404           0 :                     if (xView.is())
     405             :                     {   // okay, it is one
     406           0 :                         Reference< XSpreadsheet > xSheet = xView->getActiveSheet();
     407           0 :                         xPageSupp = Reference< XDrawPageSupplier >(xSheet, UNO_QUERY);
     408             :                         DBG_ASSERT(xPageSupp.is(), "OControlWizard::implDeterminePage: a spreadsheet which is no page supplier!");
     409           0 :                         if (xPageSupp.is())
     410           0 :                             xPage = xPageSupp->getDrawPage();
     411             :                     }
     412             :                     else
     413             :                     {   // can be a draw/impress doc only
     414           0 :                         Reference< XDrawView > xDrawView(xController, UNO_QUERY);
     415             :                         DBG_ASSERT(xDrawView.is(), "OControlWizard::implDeterminePage: no alternatives left ... can't determine the page!");
     416           0 :                         if (xDrawView.is())
     417           0 :                             xPage = xDrawView->getCurrentPage();
     418           0 :                     }
     419           0 :                 }
     420             :             }
     421             :             else
     422             :             {
     423             :                 DBG_ASSERT(xPage.is(), "OControlWizard::implDeterminePage: can't determine the page (no model)!");
     424             :             }
     425           0 :             m_aContext.xDrawPage = xPage;
     426             :         }
     427           0 :         catch(const Exception&)
     428             :         {
     429             :             OSL_FAIL("OControlWizard::implDeterminePage: caught an exception!");
     430             :         }
     431           0 :     }
     432             : 
     433             : 
     434           0 :     void OControlWizard::implGetDSContext()
     435             :     {
     436             :         try
     437             :         {
     438             :             DBG_ASSERT(m_xContext.is(), "OControlWizard::implGetDSContext: invalid service factory!");
     439             : 
     440           0 :             m_aContext.xDatasourceContext = DatabaseContext::create(m_xContext);
     441             :         }
     442           0 :         catch(const Exception&)
     443             :         {
     444             :             OSL_FAIL("OControlWizard::implGetDSContext: invalid database context!");
     445             :         }
     446           0 :     }
     447             : 
     448             : 
     449           0 :     Reference< XConnection > OControlWizard::getFormConnection(const OAccessRegulator&) const
     450             :     {
     451           0 :         return getFormConnection();
     452             :     }
     453             : 
     454           0 :     Reference< XConnection > OControlWizard::getFormConnection() const
     455             :     {
     456           0 :         Reference< XConnection > xConn;
     457             :         try
     458             :         {
     459           0 :             if ( !::dbtools::isEmbeddedInDatabase(m_aContext.xForm,xConn) )
     460           0 :                 m_aContext.xForm->getPropertyValue("ActiveConnection") >>= xConn;
     461             :         }
     462           0 :         catch(const Exception&)
     463             :         {
     464             :             OSL_FAIL("OControlWizard::getFormConnection: caught an exception!");
     465             :         }
     466           0 :         return xConn;
     467             :     }
     468             : 
     469             : 
     470           0 :     void OControlWizard::setFormConnection( const OAccessRegulator& _rAccess, const Reference< XConnection >& _rxConn, sal_Bool _bAutoDispose )
     471             :     {
     472             :         try
     473             :         {
     474           0 :             Reference< XConnection > xOldConn = getFormConnection(_rAccess);
     475           0 :             if (xOldConn.get() == _rxConn.get())
     476           0 :                 return;
     477             : 
     478           0 :             disposeComponent(xOldConn);
     479             : 
     480             :             // set the new connection
     481           0 :             if ( _bAutoDispose )
     482             :             {
     483             :                 // for this, use a AutoDisposer (so the conn is cleaned up when the form dies or get's another connection)
     484           0 :                 Reference< XRowSet > xFormRowSet( m_aContext.xForm, UNO_QUERY );
     485           0 :                 OAutoConnectionDisposer* pAutoDispose = new OAutoConnectionDisposer( xFormRowSet, _rxConn );
     486           0 :                 Reference< XPropertyChangeListener > xEnsureDelete( pAutoDispose );
     487             :             }
     488             :             else
     489             :             {
     490           0 :                 m_aContext.xForm->setPropertyValue("ActiveConnection", makeAny( _rxConn ) );
     491           0 :             }
     492             :         }
     493           0 :         catch(const Exception&)
     494             :         {
     495             :             OSL_FAIL("OControlWizard::setFormConnection: caught an exception!");
     496             :         }
     497             :     }
     498             : 
     499             : 
     500           0 :     sal_Bool OControlWizard::updateContext(const OAccessRegulator&)
     501             :     {
     502           0 :         return initContext();
     503             :     }
     504             : 
     505           0 :     Reference< XInteractionHandler > OControlWizard::getInteractionHandler(Window* _pWindow) const
     506             :     {
     507           0 :         Reference< XInteractionHandler > xHandler;
     508             :         try
     509             :         {
     510           0 :             xHandler = Reference< XInteractionHandler >( InteractionHandler::createWithParent(m_xContext, 0), UNO_QUERY_THROW );
     511             :         }
     512           0 :         catch(const Exception&) { }
     513           0 :         if (!xHandler.is())
     514             :         {
     515           0 :             const OUString sInteractionHandlerServiceName("com.sun.star.task.InteractionHandler");
     516           0 :             ShowServiceNotAvailableError(_pWindow, sInteractionHandlerServiceName, true);
     517             :         }
     518           0 :         return xHandler;
     519             :     }
     520             : 
     521           0 :     sal_Bool OControlWizard::initContext()
     522             :     {
     523             :         DBG_ASSERT(m_aContext.xObjectModel.is(), "OGroupBoxWizard::initContext: have no control model to work with!");
     524           0 :         if (!m_aContext.xObjectModel.is())
     525           0 :             return sal_False;
     526             : 
     527             :         // reset the context
     528           0 :         m_aContext.xForm.clear();
     529           0 :         m_aContext.xRowSet.clear();
     530           0 :         m_aContext.xDocumentModel.clear();
     531           0 :         m_aContext.xDrawPage.clear();
     532           0 :         m_aContext.xObjectShape.clear();
     533           0 :         m_aContext.aFieldNames.realloc(0);
     534             : 
     535           0 :         m_aContext.xObjectContainer.clear();
     536           0 :         m_aContext.aTypes.clear();
     537           0 :         m_aContext.bEmbedded = sal_False;
     538             : 
     539           0 :         Any aSQLException;
     540           0 :         Reference< XPreparedStatement >  xStatement;
     541             :         try
     542             :         {
     543             :             // get the datasource context
     544           0 :             implGetDSContext();
     545             : 
     546             :             // first, determine the form the control belongs to
     547           0 :             implDetermineForm();
     548             : 
     549             :             // need the page, too
     550           0 :             implDeterminePage();
     551             : 
     552             :             // the shape of the control
     553           0 :             implDetermineShape();
     554             : 
     555             :             // get the columns of the object the settins refer to
     556           0 :             Reference< XNameAccess >  xColumns;
     557             : 
     558           0 :             if (m_aContext.xForm.is())
     559             :             {
     560             :                 // collect some properties of the form
     561           0 :                 OUString sObjectName = ::comphelper::getString(m_aContext.xForm->getPropertyValue("Command"));
     562           0 :                 sal_Int32 nObjectType = ::comphelper::getINT32(m_aContext.xForm->getPropertyValue("CommandType"));
     563             : 
     564             :                 // calculate the connection the rowset is working with
     565           0 :                 Reference< XConnection > xConnection;
     566           0 :                 m_aContext.bEmbedded = ::dbtools::isEmbeddedInDatabase( m_aContext.xForm, xConnection );
     567           0 :                 if ( !m_aContext.bEmbedded )
     568           0 :                     xConnection = ::dbtools::connectRowset( m_aContext.xRowSet, m_xContext, true );
     569             : 
     570             :                 // get the fields
     571           0 :                 if (xConnection.is())
     572             :                 {
     573           0 :                     switch (nObjectType)
     574             :                     {
     575             :                         case 0:
     576             :                         {
     577           0 :                             Reference< XTablesSupplier >  xSupplyTables(xConnection, UNO_QUERY);
     578           0 :                             if (xSupplyTables.is() && xSupplyTables->getTables().is() && xSupplyTables->getTables()->hasByName(sObjectName))
     579             :                             {
     580           0 :                                 Reference< XColumnsSupplier >  xSupplyColumns;
     581           0 :                                 m_aContext.xObjectContainer = xSupplyTables->getTables();
     582           0 :                                 m_aContext.xObjectContainer->getByName(sObjectName) >>= xSupplyColumns;
     583             :                                 DBG_ASSERT(xSupplyColumns.is(), "OControlWizard::initContext: invalid table columns!");
     584           0 :                                 xColumns = xSupplyColumns->getColumns();
     585           0 :                             }
     586             :                         }
     587           0 :                         break;
     588             :                         case 1:
     589             :                         {
     590           0 :                             Reference< XQueriesSupplier >  xSupplyQueries(xConnection, UNO_QUERY);
     591           0 :                             if (xSupplyQueries.is() && xSupplyQueries->getQueries().is() && xSupplyQueries->getQueries()->hasByName(sObjectName))
     592             :                             {
     593           0 :                                 Reference< XColumnsSupplier >  xSupplyColumns;
     594           0 :                                 m_aContext.xObjectContainer = xSupplyQueries->getQueries();
     595           0 :                                 m_aContext.xObjectContainer->getByName(sObjectName) >>= xSupplyColumns;
     596             :                                 DBG_ASSERT(xSupplyColumns.is(), "OControlWizard::initContext: invalid query columns!");
     597           0 :                                 xColumns  = xSupplyColumns->getColumns();
     598           0 :                             }
     599             :                         }
     600           0 :                         break;
     601             :                         default:
     602             :                         {
     603           0 :                             xStatement = xConnection->prepareStatement(sObjectName);
     604             : 
     605             :                             // not interested in any results, only in the fields
     606           0 :                             Reference< XPropertySet > xStatementProps(xStatement, UNO_QUERY);
     607           0 :                             xStatementProps->setPropertyValue("MaxRows", makeAny(sal_Int32(0)));
     608             : 
     609             :                             // TODO: think about handling local SQLExceptions here ...
     610           0 :                             Reference< XColumnsSupplier >  xSupplyCols(xStatement->executeQuery(), UNO_QUERY);
     611           0 :                             if (xSupplyCols.is())
     612           0 :                                 xColumns = xSupplyCols->getColumns();
     613             :                         }
     614             :                     }
     615           0 :                 }
     616             :             }
     617             : 
     618           0 :             if (xColumns.is())
     619             :             {
     620           0 :                 m_aContext.aFieldNames = xColumns->getElementNames();
     621           0 :                 static const OUString s_sFieldTypeProperty("Type");
     622           0 :                 const OUString* pBegin = m_aContext.aFieldNames.getConstArray();
     623           0 :                 const OUString* pEnd   = pBegin + m_aContext.aFieldNames.getLength();
     624           0 :                 for(;pBegin != pEnd;++pBegin)
     625             :                 {
     626           0 :                     sal_Int32 nFieldType = DataType::OTHER;
     627             :                     try
     628             :                     {
     629           0 :                         Reference< XPropertySet > xColumn;
     630           0 :                         xColumns->getByName(*pBegin) >>= xColumn;
     631           0 :                         xColumn->getPropertyValue(s_sFieldTypeProperty) >>= nFieldType;
     632             :                     }
     633           0 :                     catch(const Exception&)
     634             :                     {
     635             :                         OSL_FAIL("OControlWizard::initContext: unexpected exception while gathering column information!");
     636             :                     }
     637           0 :                     m_aContext.aTypes.insert(OControlWizardContext::TNameTypeMap::value_type(*pBegin,nFieldType));
     638             :                 }
     639           0 :             }
     640             :         }
     641           0 :         catch(const SQLContext& e) { aSQLException <<= e; }
     642           0 :         catch(const SQLWarning& e) { aSQLException <<= e; }
     643           0 :         catch(const SQLException& e) { aSQLException <<= e; }
     644           0 :         catch(const Exception&)
     645             :         {
     646             :             OSL_FAIL("OControlWizard::initContext: could not retrieve the control context (caught an exception)!");
     647             :         }
     648             : 
     649           0 :         ::comphelper::disposeComponent(xStatement);
     650             : 
     651           0 :         if (aSQLException.hasValue())
     652             :         {   // an SQLException (or derivee) was thrown ...
     653             : 
     654             :             // prepend an extra SQLContext explaining what we were doing
     655           0 :             SQLContext aContext;
     656           0 :             aContext.Message = ModuleRes(RID_STR_COULDNOTOPENTABLE).toString();
     657           0 :             aContext.NextException = aSQLException;
     658             : 
     659             :             // create an interaction handler to display this exception
     660           0 :             Reference< XInteractionHandler > xHandler = getInteractionHandler(this);
     661           0 :             if ( !xHandler.is() )
     662           0 :                 return sal_False;
     663             : 
     664           0 :             Reference< XInteractionRequest > xRequest = new OInteractionRequest(makeAny(aContext));
     665             :             try
     666             :             {
     667           0 :                 xHandler->handle(xRequest);
     668             :             }
     669           0 :             catch(const Exception&) { }
     670           0 :             return sal_False;
     671             :         }
     672             : 
     673           0 :         return 0 != m_aContext.aFieldNames.getLength();
     674             :     }
     675             : 
     676             : 
     677           0 :     void OControlWizard::commitControlSettings(OControlWizardSettings* _pSettings)
     678             :     {
     679             :         DBG_ASSERT(m_aContext.xObjectModel.is(), "OControlWizard::commitControlSettings: have no control model to work with!");
     680           0 :         if (!m_aContext.xObjectModel.is())
     681           0 :             return;
     682             : 
     683             :         // the only thing we have at the moment is the label
     684             :         try
     685             :         {
     686           0 :             OUString sLabelPropertyName("Label");
     687           0 :             Reference< XPropertySetInfo > xInfo = m_aContext.xObjectModel->getPropertySetInfo();
     688           0 :             if (xInfo.is() && xInfo->hasPropertyByName(sLabelPropertyName))
     689             :             {
     690           0 :                 OUString sControlLabel(_pSettings->sControlLabel);
     691           0 :                 m_aContext.xObjectModel->setPropertyValue(
     692             :                     OUString("Label"),
     693             :                     makeAny(sControlLabel)
     694           0 :                 );
     695           0 :             }
     696             :         }
     697           0 :         catch(const Exception&)
     698             :         {
     699             :             OSL_FAIL("OControlWizard::commitControlSettings: could not commit the basic control settings!");
     700             :         }
     701             :     }
     702             : 
     703             : 
     704           0 :     void OControlWizard::initControlSettings(OControlWizardSettings* _pSettings)
     705             :     {
     706             :         DBG_ASSERT(m_aContext.xObjectModel.is(), "OControlWizard::initControlSettings: have no control model to work with!");
     707           0 :         if (!m_aContext.xObjectModel.is())
     708           0 :             return;
     709             : 
     710             :         // initialize some settings from the control model give
     711             :         try
     712             :         {
     713           0 :             OUString sLabelPropertyName("Label");
     714           0 :             Reference< XPropertySetInfo > xInfo = m_aContext.xObjectModel->getPropertySetInfo();
     715           0 :             if (xInfo.is() && xInfo->hasPropertyByName(sLabelPropertyName))
     716             :             {
     717           0 :                 OUString sControlLabel;
     718           0 :                 m_aContext.xObjectModel->getPropertyValue(sLabelPropertyName) >>= sControlLabel;
     719           0 :                 _pSettings->sControlLabel = sControlLabel;
     720           0 :             }
     721             :         }
     722           0 :         catch(const Exception&)
     723             :         {
     724             :             OSL_FAIL("OControlWizard::initControlSettings: could not retrieve the basic control settings!");
     725             :         }
     726             :     }
     727             : 
     728             : 
     729           0 :     sal_Bool OControlWizard::needDatasourceSelection()
     730             :     {
     731             :         // lemme see ...
     732           0 :         return (0 == getContext().aFieldNames.getLength());
     733             :             // if we got fields, the data source is valid ...
     734             :     }
     735             : 
     736             : 
     737             : }   // namespace dbp
     738             : 
     739             : 
     740             : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */

Generated by: LCOV version 1.10