diff options
Diffstat (limited to 'dbaccess/source/ui/browser/unodatbr.cxx')
-rw-r--r-- | dbaccess/source/ui/browser/unodatbr.cxx | 3919 |
1 files changed, 0 insertions, 3919 deletions
diff --git a/dbaccess/source/ui/browser/unodatbr.cxx b/dbaccess/source/ui/browser/unodatbr.cxx deleted file mode 100644 index 8ab98cade..000000000 --- a/dbaccess/source/ui/browser/unodatbr.cxx +++ /dev/null @@ -1,3919 +0,0 @@ -/* -*- 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_dbaccess.hxx" - -#include "browserids.hxx" -#include "dbaccess_helpid.hrc" -#include "dbexchange.hxx" -#include "dbtreelistbox.hxx" -#include "dbtreemodel.hxx" -#include "dbtreeview.hxx" -#include "dbu_brw.hrc" -#include "dbu_reghelper.hxx" -#include "dbustrings.hrc" -#include "dlgsave.hxx" -#include "HtmlReader.hxx" -#include "imageprovider.hxx" -#include "listviewitems.hxx" -#include "QEnumTypes.hxx" -#include "RtfReader.hxx" -#include "sbagrid.hrc" -#include "sbagrid.hxx" -#include "sqlmessage.hxx" -#include "TokenWriter.hxx" -#include "UITools.hxx" -#include "unodatbr.hxx" -#include "WColumnSelect.hxx" -#include "WCopyTable.hxx" -#include "WCPage.hxx" -#include "WExtendPages.hxx" -#include "WNameMatch.hxx" - -/** === begin UNO includes === **/ -#include <com/sun/star/awt/LineEndFormat.hpp> -#include <com/sun/star/awt/LineEndFormat.hpp> -#include <com/sun/star/awt/MouseWheelBehavior.hpp> -#include <com/sun/star/awt/TextAlign.hpp> -#include <com/sun/star/awt/VisualEffect.hpp> -#include <com/sun/star/beans/NamedValue.hpp> -#include <com/sun/star/beans/PropertyValue.hpp> -#include <com/sun/star/container/XNameContainer.hpp> -#include <com/sun/star/form/XForm.hpp> -#include <com/sun/star/form/XGridColumnFactory.hpp> -#include <com/sun/star/form/XLoadable.hpp> -#include <com/sun/star/form/XReset.hpp> -#include <com/sun/star/frame/FrameSearchFlag.hpp> -#include <com/sun/star/frame/XLayoutManager.hpp> -#include <com/sun/star/lang/DisposedException.hpp> -#include <com/sun/star/sdb/CommandType.hpp> -#include <com/sun/star/sdb/SQLContext.hpp> -#include <com/sun/star/sdb/XBookmarksSupplier.hpp> -#include <com/sun/star/sdb/XCompletedConnection.hpp> -#include <com/sun/star/sdb/XDatabaseRegistrations.hpp> -#include <com/sun/star/sdb/XDocumentDataSource.hpp> -#include <com/sun/star/sdb/XParametersSupplier.hpp> -#include <com/sun/star/sdb/XQueriesSupplier.hpp> -#include <com/sun/star/sdb/XQueryDefinitionsSupplier.hpp> -#include <com/sun/star/sdb/XResultSetAccess.hpp> -#include <com/sun/star/sdb/XSingleSelectQueryComposer.hpp> -#include <com/sun/star/sdb/application/NamedDatabaseObject.hpp> -#include <com/sun/star/sdbc/ColumnValue.hpp> -#include <com/sun/star/sdbc/DataType.hpp> -#include <com/sun/star/sdbc/FetchDirection.hpp> -#include <com/sun/star/sdbc/SQLWarning.hpp> -#include <com/sun/star/sdbc/XDataSource.hpp> -#include <com/sun/star/sdbc/XResultSetMetaDataSupplier.hpp> -#include <com/sun/star/sdbc/XWarningsSupplier.hpp> -#include <com/sun/star/sdbcx/Privilege.hpp> -#include <com/sun/star/sdbcx/XColumnsSupplier.hpp> -#include <com/sun/star/sdbcx/XDataDescriptorFactory.hpp> -#include <com/sun/star/sdbcx/XDrop.hpp> -#include <com/sun/star/sdbcx/XTablesSupplier.hpp> -#include <com/sun/star/sdbcx/XViewsSupplier.hpp> -#include <com/sun/star/ui/dialogs/XExecutableDialog.hpp> -#include <com/sun/star/util/XFlushable.hpp> -#include <com/sun/star/sdb/XDocumentDataSource.hpp> -#include <com/sun/star/document/MacroExecMode.hpp> -#include <com/sun/star/frame/XComponentLoader.hpp> -#include <com/sun/star/ui/XContextMenuInterceptor.hpp> -/** === end UNO includes === **/ - -#include <comphelper/extract.hxx> -#include <comphelper/sequence.hxx> -#include <comphelper/types.hxx> -#include <connectivity/dbexception.hxx> -#include <cppuhelper/exc_hlp.hxx> -#include <cppuhelper/implbase2.hxx> -#include <cppuhelper/typeprovider.hxx> -#include <sfx2/app.hxx> -#include <sfx2/dispatch.hxx> -#include <sot/storage.hxx> -#include <svl/filenotation.hxx> -#include <svl/intitem.hxx> -#include <unotools/moduleoptions.hxx> -#include <svtools/svlbitm.hxx> -#include <svtools/svtreebx.hxx> -#include <svx/algitem.hxx> -#include <svx/dataaccessdescriptor.hxx> -#include <svx/databaseregistrationui.hxx> -#include <toolkit/unohlp.hxx> -#include <tools/diagnose_ex.h> -#include <osl/diagnose.h> -#include <tools/multisel.hxx> -#include <tools/urlobj.hxx> -#include <unotools/confignode.hxx> -#include <vcl/msgbox.hxx> -#include <vcl/split.hxx> -#include <vcl/stdtext.hxx> -#include <vcl/svapp.hxx> -#include <vcl/toolbox.hxx> -#include <vcl/waitobj.hxx> -#include <vcl/wrkwin.hxx> -#include <rtl/logfile.hxx> - -#include <memory> - -using namespace ::com::sun::star::uno; -using namespace ::com::sun::star::awt; -using namespace ::com::sun::star::sdb; -using namespace ::com::sun::star::sdb::application; -using namespace ::com::sun::star::sdbc; -using namespace ::com::sun::star::sdbcx; -using namespace ::com::sun::star::beans; -using namespace ::com::sun::star::util; -using namespace ::com::sun::star::frame; -using namespace ::com::sun::star::container; -using namespace ::com::sun::star::lang; -using namespace ::com::sun::star::ui::dialogs; -using namespace ::com::sun::star::task; -using namespace ::com::sun::star::form; -using namespace ::com::sun::star::io; -using namespace ::com::sun::star::i18n; -using namespace ::com::sun::star::view; -using namespace ::com::sun::star::datatransfer; -using namespace ::com::sun::star::document; -using namespace ::com::sun::star::ui; -using namespace ::dbtools; -using namespace ::comphelper; -using namespace ::svx; - -// ......................................................................... -namespace dbaui -{ -// ......................................................................... - -namespace DatabaseObject = ::com::sun::star::sdb::application::DatabaseObject; -namespace DatabaseObjectContainer = ::com::sun::star::sdb::application::DatabaseObjectContainer; - -//================================================================== -//= SbaTableQueryBrowser -//================================================================== -// ------------------------------------------------------------------------- -extern "C" void SAL_CALL createRegistryInfo_OBrowser() -{ - static OMultiInstanceAutoRegistration< SbaTableQueryBrowser > aAutoRegistration; -} -// ------------------------------------------------------------------------- -void SafeAddPropertyListener(const Reference< XPropertySet > & xSet, const ::rtl::OUString& rPropName, XPropertyChangeListener* pListener) -{ - Reference< XPropertySetInfo > xInfo = xSet->getPropertySetInfo(); - if (xInfo->hasPropertyByName(rPropName)) - xSet->addPropertyChangeListener(rPropName, pListener); -} - -// ------------------------------------------------------------------------- -void SafeRemovePropertyListener(const Reference< XPropertySet > & xSet, const ::rtl::OUString& rPropName, XPropertyChangeListener* pListener) -{ - Reference< XPropertySetInfo > xInfo = xSet->getPropertySetInfo(); - if (xInfo->hasPropertyByName(rPropName)) - xSet->removePropertyChangeListener(rPropName, pListener); -} -//------------------------------------------------------------------------- -::rtl::OUString SAL_CALL SbaTableQueryBrowser::getImplementationName() throw(RuntimeException) -{ - return getImplementationName_Static(); -} -//------------------------------------------------------------------------- -::comphelper::StringSequence SAL_CALL SbaTableQueryBrowser::getSupportedServiceNames() throw(RuntimeException) -{ - return getSupportedServiceNames_Static(); -} -// ------------------------------------------------------------------------- -::rtl::OUString SbaTableQueryBrowser::getImplementationName_Static() throw(RuntimeException) -{ - return ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("org.openoffice.comp.dbu.ODatasourceBrowser")); -} -//------------------------------------------------------------------------- -::comphelper::StringSequence SbaTableQueryBrowser::getSupportedServiceNames_Static() throw(RuntimeException) -{ - ::comphelper::StringSequence aSupported(1); - aSupported.getArray()[0] = ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("com.sun.star.sdb.DataSourceBrowser")); - return aSupported; -} -//------------------------------------------------------------------------- -Reference< XInterface > SAL_CALL SbaTableQueryBrowser::Create(const Reference<XMultiServiceFactory >& _rxFactory) -{ - SolarMutexGuard aGuard; - return *(new SbaTableQueryBrowser(_rxFactory)); -} - -DBG_NAME(SbaTableQueryBrowser); -//------------------------------------------------------------------------------ -SbaTableQueryBrowser::SbaTableQueryBrowser(const Reference< XMultiServiceFactory >& _rM) - :SbaXDataBrowserController(_rM) - ,m_aSelectionListeners( getMutex() ) - ,m_aContextMenuInterceptors( getMutex() ) - ,m_aTableCopyHelper(this) - ,m_pTreeView(NULL) - ,m_pSplitter(NULL) - ,m_pTreeModel(NULL) - ,m_pCurrentlyDisplayed(NULL) - ,m_nAsyncDrop(0) - ,m_nBorder(1) - ,m_bQueryEscapeProcessing( sal_False ) - ,m_bShowMenu(sal_False) - ,m_bInSuspend(sal_False) - ,m_bEnableBrowser(sal_True) -{ - DBG_CTOR(SbaTableQueryBrowser,NULL); -} - -//------------------------------------------------------------------------------ -SbaTableQueryBrowser::~SbaTableQueryBrowser() -{ - DBG_DTOR(SbaTableQueryBrowser,NULL); - if ( !rBHelper.bDisposed && !rBHelper.bInDispose ) - { - OSL_FAIL("Please check who doesn't dispose this component!"); - // increment ref count to prevent double call of Dtor - osl_incrementInterlockedCount( &m_refCount ); - dispose(); - } -} - -//------------------------------------------------------------------------------ -Any SAL_CALL SbaTableQueryBrowser::queryInterface(const Type& _rType) throw (RuntimeException) -{ - if ( _rType.equals( XScriptInvocationContext::static_type() ) ) - { - OSL_PRECOND( !!m_aDocScriptSupport, "SbaTableQueryBrowser::queryInterface: did not initialize this, yet!" ); - if ( !!m_aDocScriptSupport && *m_aDocScriptSupport ) - return makeAny( Reference< XScriptInvocationContext >( this ) ); - return Any(); - } - - Any aReturn = SbaXDataBrowserController::queryInterface(_rType); - if (!aReturn.hasValue()) - aReturn = SbaTableQueryBrowser_Base::queryInterface(_rType); - return aReturn; -} - -//------------------------------------------------------------------------------ -Sequence< Type > SAL_CALL SbaTableQueryBrowser::getTypes( ) throw (RuntimeException) -{ - Sequence< Type > aTypes( ::comphelper::concatSequences( - SbaXDataBrowserController::getTypes(), - SbaTableQueryBrowser_Base::getTypes() - ) ); - - OSL_PRECOND( !!m_aDocScriptSupport, "SbaTableQueryBrowser::getTypes: did not initialize this, yet!" ); - if ( !m_aDocScriptSupport || !*m_aDocScriptSupport ) - { - Sequence< Type > aStrippedTypes( aTypes.getLength() - 1 ); - ::std::remove_copy_if( - aTypes.getConstArray(), - aTypes.getConstArray() + aTypes.getLength(), - aStrippedTypes.getArray(), - ::std::bind2nd( ::std::equal_to< Type >(), XScriptInvocationContext::static_type() ) - ); - aTypes = aStrippedTypes; - } - return aTypes; -} - -//------------------------------------------------------------------------------ -Sequence< sal_Int8 > SAL_CALL SbaTableQueryBrowser::getImplementationId( ) throw (RuntimeException) -{ - static ::cppu::OImplementationId * pId = 0; - if (! pId) - { - ::osl::MutexGuard aGuard( ::osl::Mutex::getGlobalMutex() ); - if (! pId) - { - static ::cppu::OImplementationId aId; - pId = &aId; - } - } - return pId->getImplementationId(); -} - -//------------------------------------------------------------------------------ -void SAL_CALL SbaTableQueryBrowser::disposing() -{ - SolarMutexGuard aGuard; - // doin' a lot of VCL stuff here -> lock the SolarMutex - - // kiss our listeners goodbye - EventObject aEvt(*this); - m_aSelectionListeners.disposeAndClear(aEvt); - m_aContextMenuInterceptors.disposeAndClear(aEvt); - - // reset the content's tree view: it holds a reference to our model which is to be deleted immediately, - // and it will live longer than we do. - if (getBrowserView()) - getBrowserView()->setTreeView(NULL); - - clearTreeModel(); - // clear the tree model - { - ::std::auto_ptr<SvLBoxTreeList> aTemp(m_pTreeModel); - m_pTreeModel = NULL; - } - - // remove ourself as status listener - implRemoveStatusListeners(); - - // remove the container listener from the database context - try - { - Reference< XDatabaseRegistrations > xDatabaseRegistrations( m_xDatabaseContext, UNO_QUERY_THROW ); - xDatabaseRegistrations->removeDatabaseRegistrationsListener( this ); - } - catch( const Exception& ) - { - DBG_UNHANDLED_EXCEPTION(); - } - - // check out from all the objects we are listening - // the frame - if (m_xCurrentFrameParent.is()) - m_xCurrentFrameParent->removeFrameActionListener((::com::sun::star::frame::XFrameActionListener*)this); - SbaXDataBrowserController::disposing(); -} - -//------------------------------------------------------------------------------ -sal_Bool SbaTableQueryBrowser::Construct(Window* pParent) -{ - if ( !SbaXDataBrowserController::Construct( pParent ) ) - return sal_False; - - try - { - Reference< XDatabaseRegistrations > xDatabaseRegistrations( m_xDatabaseContext, UNO_QUERY_THROW ); - xDatabaseRegistrations->addDatabaseRegistrationsListener( this ); - - // the collator for the string compares - m_xCollator = Reference< XCollator >( getORB()->createInstance(::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("com.sun.star.i18n.Collator")) ), UNO_QUERY_THROW ); - m_xCollator->loadDefaultCollator( Application::GetSettings().GetLocale(), 0 ); - } - catch(const Exception&) - { - OSL_FAIL("SbaTableQueryBrowser::Construct: could not create (or start listening at) the database context!"); - } - // some help ids - if (getBrowserView() && getBrowserView()->getVclControl()) - { - - // create controls and set sizes - const long nFrameWidth = getBrowserView()->LogicToPixel( ::Size( 3, 0 ), MAP_APPFONT ).Width(); - - m_pSplitter = new Splitter(getBrowserView(),WB_HSCROLL); - m_pSplitter->SetPosSizePixel( ::Point(0,0), ::Size(nFrameWidth,0) ); - m_pSplitter->SetBackground( Wallpaper( Application::GetSettings().GetStyleSettings().GetDialogColor() ) ); - - m_pTreeView = new DBTreeView(getBrowserView(),getORB(), WB_TABSTOP | WB_BORDER); - m_pTreeView->SetPreExpandHandler(LINK(this, SbaTableQueryBrowser, OnExpandEntry)); - - m_pTreeView->setCopyHandler(LINK(this, SbaTableQueryBrowser, OnCopyEntry)); - - m_pTreeView->getListBox().setContextMenuProvider( this ); - m_pTreeView->getListBox().setControlActionListener( this ); - m_pTreeView->SetHelpId(HID_CTL_TREEVIEW); - - // a default pos for the splitter, so that the listbox is about 80 (logical) pixels wide - m_pSplitter->SetSplitPosPixel( getBrowserView()->LogicToPixel( ::Size( 80, 0 ), MAP_APPFONT ).Width() ); - - getBrowserView()->setSplitter(m_pSplitter); - getBrowserView()->setTreeView(m_pTreeView); - - // fill view with data - m_pTreeModel = new SvLBoxTreeList; - m_pTreeModel->SetSortMode(SortAscending); - m_pTreeModel->SetCompareHdl(LINK(this, SbaTableQueryBrowser, OnTreeEntryCompare)); - m_pTreeView->setModel(m_pTreeModel); - m_pTreeView->setSelChangeHdl( LINK( this, SbaTableQueryBrowser, OnSelectionChange ) ); - - // TODO - getBrowserView()->getVclControl()->GetDataWindow().SetUniqueId(UID_DATABROWSE_DATAWINDOW); - getBrowserView()->getVclControl()->SetHelpId(HID_CTL_TABBROWSER); - getBrowserView()->SetUniqueId(UID_CTL_CONTENT); - if (getBrowserView()->getVclControl()->GetHeaderBar()) - getBrowserView()->getVclControl()->GetHeaderBar()->SetHelpId(HID_DATABROWSE_HEADER); - InvalidateFeature(ID_BROWSER_EXPLORER); - } - - return sal_True; -} -// --------------------------------------------------------------------------------------------------------------------- -namespace -{ - // ----------------------------------------------------------------------------------------------------------------- - struct SelectValueByName : public ::std::unary_function< ::rtl::OUString, Any > - { - const Any& operator()( ::rtl::OUString const& i_name ) const - { - return m_rCollection.get( i_name ); - } - - SelectValueByName( ::comphelper::NamedValueCollection const& i_collection ) - :m_rCollection( i_collection ) - { - } - - ::comphelper::NamedValueCollection const& m_rCollection; - }; -} - -// --------------------------------------------------------------------------------------------------------------------- -void SbaTableQueryBrowser::impl_sanitizeRowSetClauses_nothrow() -{ - try - { - Reference< XPropertySet > xRowSetProps( getRowSet(), UNO_QUERY_THROW ); - sal_Bool bEscapeProcessing = sal_False; - OSL_VERIFY( xRowSetProps->getPropertyValue( PROPERTY_ESCAPE_PROCESSING ) >>= bEscapeProcessing ); - if ( !bEscapeProcessing ) - // don't touch or interpret anything if escape processing is disabled - return; - - Reference< XSingleSelectQueryComposer > xComposer( createParser_nothrow() ); - if ( !xComposer.is() ) - // can't do anything. Already reported via assertion in createParser_nothrow. - return; - - // the tables participating in the statement - const Reference< XTablesSupplier > xSuppTables( xComposer, UNO_QUERY_THROW ); - const Reference< XNameAccess > xTableNames( xSuppTables->getTables(), UNO_QUERY_THROW ); - - // the columns participating in the statement - const Reference< XColumnsSupplier > xSuppColumns( xComposer, UNO_QUERY_THROW ); - const Reference< XNameAccess > xColumnNames( xSuppColumns->getColumns(), UNO_QUERY_THROW ); - - // ............................................................................................................. - // check if the order columns apply to tables which really exist in the statement - const Reference< XIndexAccess > xOrderColumns( xComposer->getOrderColumns(), UNO_SET_THROW ); - const sal_Int32 nOrderColumns( xOrderColumns->getCount() ); - bool invalidColumn = nOrderColumns == 0; - for ( sal_Int32 c=0; ( c < nOrderColumns ) && !invalidColumn; ++c ) - { - const Reference< XPropertySet > xOrderColumn( xOrderColumns->getByIndex(c), UNO_QUERY_THROW ); - ::rtl::OUString sTableName; - OSL_VERIFY( xOrderColumn->getPropertyValue( PROPERTY_TABLENAME ) >>= sTableName ); - ::rtl::OUString sColumnName; - OSL_VERIFY( xOrderColumn->getPropertyValue( PROPERTY_NAME ) >>= sColumnName ); - - if ( sTableName.getLength() == 0 ) - { - if ( !xColumnNames->hasByName( sColumnName ) ) - { - invalidColumn = true; - break; - } - } - else - { - if ( !xTableNames->hasByName( sTableName ) ) - { - invalidColumn = true; - break; - } - - const Reference< XColumnsSupplier > xSuppTableColumns( xTableNames->getByName( sTableName ), UNO_QUERY_THROW ); - const Reference< XNameAccess > xTableColumnNames( xSuppTableColumns->getColumns(), UNO_QUERY_THROW ); - if ( !xTableColumnNames->hasByName( sColumnName ) ) - { - invalidColumn = true; - break; - } - } - } - - if ( invalidColumn ) - { - // reset the complete order statement at both the row set and the parser - const ::rtl::OUString sEmptyOrder; - xRowSetProps->setPropertyValue( PROPERTY_ORDER, makeAny( sEmptyOrder ) ); - xComposer->setOrder( sEmptyOrder ); - } - - // ............................................................................................................. - // check if the columns participating in the filter refer to existing tables - // TODO: there's no API at all for this. The method which comes nearest to what we need is - // "getStructuredFilter", but it returns pure column names only. That is, for a statement like - // "SELECT * FROM <table> WHERE <other_table>.<column> = <value>", it will return "<column>". But - // there's no API at all to retrieve the information about "<other_table>" - which is what would - // be needed here. - // That'd be a chance to replace getStructuredFilter with something more reasonable. This method - // has at least one other problem: For a clause like "<column> != <value>", it will return "<column>" - // as column name, "NOT_EQUAL" as operator, and "!= <value>" as value, effectively duplicating the - // information about the operator, and beding all clients to manually remove the "!=" from the value - // string. - // So, what really would be handy, is some - // XNormalizedFilter getNormalizedFilter(); - // with - // interface XDisjunctiveFilterExpression - // { - // XConjunctiveFilterTerm getTerm( int index ); - // } - // interface XConjunctiveFilterTerm - // { - // ComparisonPredicate getPredicate( int index ); - // } - // struct ComparisonPredicate - // { - // XComparisonOperand Lhs; - // SQLFilterOperator Operator; - // XComparisonOperand Rhs; - // } - // interface XComparisonOperand - // { - // SQLFilterOperand Type; - // XPropertySet getColumn(); - // string getLiteral(); - // ... - // } - // enum SQLFilterOperand { Column, Literal, ... } - // - // ... or something like this .... - } - catch( const Exception& ) - { - DBG_UNHANDLED_EXCEPTION(); - } -} - -// --------------------------------------------------------------------------------------------------------------------- -sal_Bool SbaTableQueryBrowser::InitializeForm( const Reference< XPropertySet > & i_formProperties ) -{ - if(!m_pCurrentlyDisplayed) - return sal_True; - - // this method set all format settings from the orignal table or query - try - { - DBTreeListUserData* pData = static_cast<DBTreeListUserData*>(m_pCurrentlyDisplayed->GetUserData()); - ENSURE_OR_RETURN_FALSE( pData, "SbaTableQueryBrowser::InitializeForm: No user data set at the currently displayed entry!" ); - ENSURE_OR_RETURN_FALSE( pData->xObjectProperties.is(), "SbaTableQueryBrowser::InitializeForm: No table available!" ); - - Reference< XPropertySetInfo > xPSI( pData->xObjectProperties->getPropertySetInfo(), UNO_SET_THROW ); - - ::comphelper::NamedValueCollection aPropertyValues; - - const ::rtl::OUString aTransferProperties[] = - { - PROPERTY_APPLYFILTER, - PROPERTY_FILTER, - PROPERTY_HAVING_CLAUSE, - PROPERTY_ORDER - }; - for ( size_t i=0; i < sizeof( aTransferProperties ) / sizeof( aTransferProperties[0] ); ++i ) - { - if ( !xPSI->hasPropertyByName( aTransferProperties[i] ) ) - continue; - aPropertyValues.put( aTransferProperties[i], pData->xObjectProperties->getPropertyValue( aTransferProperties[i] ) ); - } - - const ::std::vector< ::rtl::OUString > aNames( aPropertyValues.getNames() ); - Sequence< ::rtl::OUString > aPropNames( aNames.size() ); - ::std::copy( aNames.begin(), aNames.end(), aPropNames.getArray() ); - - Sequence< Any > aPropValues( aNames.size() ); - ::std::transform( aNames.begin(), aNames.end(), aPropValues.getArray(), SelectValueByName( aPropertyValues ) ); - - Reference< XMultiPropertySet > xFormMultiSet( i_formProperties, UNO_QUERY_THROW ); - xFormMultiSet->setPropertyValues( aPropNames, aPropValues ); - - impl_sanitizeRowSetClauses_nothrow(); - } - catch ( const Exception& ) - { - DBG_UNHANDLED_EXCEPTION(); - return sal_False; - } - - return sal_True; -} - -//------------------------------------------------------------------------------ -void SbaTableQueryBrowser::initializePreviewMode() -{ - if ( getBrowserView() && getBrowserView()->getVclControl() ) - { - getBrowserView()->getVclControl()->AlwaysEnableInput( sal_False ); - getBrowserView()->getVclControl()->EnableInput( sal_False ); - getBrowserView()->getVclControl()->ForceHideScrollbars( sal_True ); - } - Reference< XPropertySet > xDataSourceSet(getRowSet(), UNO_QUERY); - if ( xDataSourceSet.is() ) - { - xDataSourceSet->setPropertyValue(::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("AllowInserts")),makeAny(sal_False)); - xDataSourceSet->setPropertyValue(::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("AllowUpdates")),makeAny(sal_False)); - xDataSourceSet->setPropertyValue(::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("AllowDeletes")),makeAny(sal_False)); - } -} - -//------------------------------------------------------------------------------ -sal_Bool SbaTableQueryBrowser::InitializeGridModel(const Reference< ::com::sun::star::form::XFormComponent > & xGrid) -{ - try - { - Reference< ::com::sun::star::form::XGridColumnFactory > xColFactory(xGrid, UNO_QUERY); - Reference< XNameContainer > xColContainer(xGrid, UNO_QUERY); - clearGridColumns( xColContainer ); - - Reference< XChild > xGridAsChild(xGrid, UNO_QUERY); - Reference< XLoadable > xFormAsLoadable; - if (xGridAsChild.is()) - xFormAsLoadable = xFormAsLoadable.query(xGridAsChild->getParent()); - if (xFormAsLoadable.is() && xFormAsLoadable->isLoaded()) - { - // set the formats from the table - if(m_pCurrentlyDisplayed) - { - Sequence< ::rtl::OUString> aProperties(6 + ( m_bPreview ? 5 : 0 )); - Sequence< Any> aValues(7 + ( m_bPreview ? 5 : 0 )); - - DBTreeListUserData* pData = static_cast<DBTreeListUserData*>(m_pCurrentlyDisplayed->GetUserData()); - OSL_ENSURE( pData->xObjectProperties.is(), "SbaTableQueryBrowser::InitializeGridModel: No table available!" ); - if ( !pData->xObjectProperties.is() ) - return sal_False; - - ::rtl::OUString* pStringIter = aProperties.getArray(); - Any* pValueIter = aValues.getArray(); - if ( m_bPreview ) - { - *pStringIter++ = ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("AlwaysShowCursor")); - *pValueIter++ <<= sal_False; - *pStringIter++ = PROPERTY_BORDER; - *pValueIter++ <<= sal_Int16(0); - } - - *pStringIter++ = PROPERTY_FONT; - *pValueIter++ = pData->xObjectProperties->getPropertyValue(PROPERTY_FONT); - *pStringIter++ = PROPERTY_TEXTEMPHASIS; - *pValueIter++ = pData->xObjectProperties->getPropertyValue(PROPERTY_TEXTEMPHASIS); - *pStringIter++ = PROPERTY_TEXTRELIEF; - *pValueIter++ = pData->xObjectProperties->getPropertyValue(PROPERTY_TEXTRELIEF); - if ( m_bPreview ) - { - *pStringIter++ = ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("HasNavigationBar")); - *pValueIter++ <<= sal_False; - *pStringIter++ = ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("HasRecordMarker")); - *pValueIter++ <<= sal_False; - } - *pStringIter++ = PROPERTY_ROW_HEIGHT; - *pValueIter++ = pData->xObjectProperties->getPropertyValue(PROPERTY_ROW_HEIGHT); - if ( m_bPreview ) - { - *pStringIter++ = ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("Tabstop")); - *pValueIter++ <<= sal_False; - } - *pStringIter++ = PROPERTY_TEXTCOLOR; - *pValueIter++ = pData->xObjectProperties->getPropertyValue(PROPERTY_TEXTCOLOR); - *pStringIter++ = PROPERTY_TEXTLINECOLOR; - *pValueIter++ = pData->xObjectProperties->getPropertyValue(PROPERTY_TEXTLINECOLOR); - - Reference< XMultiPropertySet > xFormMultiSet(xGrid, UNO_QUERY); - xFormMultiSet->setPropertyValues(aProperties, aValues); - } - - - // get the formats supplier of the database we're working with - Reference< ::com::sun::star::util::XNumberFormatsSupplier > xSupplier = getNumberFormatter()->getNumberFormatsSupplier(); - - Reference<XConnection> xConnection; - Reference<XPropertySet> xRowSetProps(getRowSet(),UNO_QUERY); - xRowSetProps->getPropertyValue( PROPERTY_ACTIVE_CONNECTION ) >>= xConnection; - OSL_ENSURE(xConnection.is(),"A ActiveConnection should normaly exists!"); - - Reference<XChild> xChild(xConnection,UNO_QUERY); - Reference<XPropertySet> xDataSourceProp(xChild->getParent(),UNO_QUERY); - sal_Bool bSuppressVersionCol = sal_False; - OSL_VERIFY( xDataSourceProp->getPropertyValue( PROPERTY_SUPPRESSVERSIONCL ) >>= bSuppressVersionCol ); - - // insert the column into the gridcontrol so that we see something :-) - ::rtl::OUString aCurrentModelType; - Reference<XColumnsSupplier> xSupCols(getRowSet(),UNO_QUERY); - Reference<XNameAccess> xColumns = xSupCols->getColumns(); - Sequence< ::rtl::OUString> aNames = xColumns->getElementNames(); - const ::rtl::OUString* pIter = aNames.getConstArray(); - const ::rtl::OUString* pEnd = pIter + aNames.getLength(); - - ::rtl::OUString sDefaultProperty; - Reference< XPropertySet > xColumn; - Reference< XPropertySetInfo > xColPSI; - for (sal_uInt16 i=0; pIter != pEnd; ++i,++pIter) - { - xColumn.set( xColumns->getByName( *pIter ), UNO_QUERY_THROW ); - xColPSI.set( xColumn->getPropertySetInfo(), UNO_SET_THROW ); - - // ignore the column when it is a rowversion one - if ( bSuppressVersionCol - && xColPSI->hasPropertyByName( PROPERTY_ISROWVERSION ) - && ::cppu::any2bool( xColumn->getPropertyValue( PROPERTY_ISROWVERSION ) ) - ) - continue; - - // use the result set column's type to determine the type of grid column to create - sal_Bool bFormattedIsNumeric = sal_True; - sal_Int32 nType = ::comphelper::getINT32( xColumn->getPropertyValue( PROPERTY_TYPE ) ); - - ::std::vector< NamedValue > aInitialValues; - ::std::vector< ::rtl::OUString > aCopyProperties; - Any aDefault; - - switch(nType) - { - case DataType::BIT: - case DataType::BOOLEAN: - { - aCurrentModelType = ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("CheckBox")); - aInitialValues.push_back( NamedValue( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "VisualEffect" ) ), makeAny( VisualEffect::FLAT ) ) ); - sDefaultProperty = PROPERTY_DEFAULTSTATE; - - sal_Int32 nNullable = ColumnValue::NULLABLE_UNKNOWN; - OSL_VERIFY( xColumn->getPropertyValue( PROPERTY_ISNULLABLE ) >>= nNullable ); - aInitialValues.push_back( NamedValue( - ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "TriState" ) ), - makeAny( sal_Bool( ColumnValue::NO_NULLS != nNullable ) ) - ) ); - if ( ColumnValue::NO_NULLS == nNullable ) - aDefault <<= (sal_Int16)STATE_NOCHECK; - } - break; - - case DataType::LONGVARCHAR: - case DataType::CLOB: - aInitialValues.push_back( NamedValue( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "MultiLine" ) ), makeAny( (sal_Bool)sal_True ) ) ); - // NO break! - case DataType::BINARY: - case DataType::VARBINARY: - case DataType::LONGVARBINARY: - aCurrentModelType = ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("TextField")); - sDefaultProperty = PROPERTY_DEFAULTTEXT; - break; - - case DataType::VARCHAR: - case DataType::CHAR: - bFormattedIsNumeric = sal_False; - // NO break! - default: - aCurrentModelType = ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("FormattedField")); - sDefaultProperty = PROPERTY_EFFECTIVEDEFAULT; - - if ( xSupplier.is() ) - aInitialValues.push_back( NamedValue( ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("FormatsSupplier")), makeAny( xSupplier ) ) ); - aInitialValues.push_back( NamedValue( ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("TreatAsNumber")), makeAny( (sal_Bool)bFormattedIsNumeric ) ) ); - aCopyProperties.push_back( PROPERTY_FORMATKEY ); - break; - } - - aInitialValues.push_back( NamedValue( PROPERTY_CONTROLSOURCE, makeAny( *pIter ) ) ); - ::rtl::OUString sLabel; - xColumn->getPropertyValue(PROPERTY_LABEL) >>= sLabel; - if ( sLabel.getLength() ) - aInitialValues.push_back( NamedValue( PROPERTY_LABEL, makeAny( sLabel ) ) ); - else - aInitialValues.push_back( NamedValue( PROPERTY_LABEL, makeAny( *pIter ) ) ); - - Reference< XPropertySet > xGridCol( xColFactory->createColumn( aCurrentModelType ), UNO_SET_THROW ); - Reference< XPropertySetInfo > xGridColPSI( xGridCol->getPropertySetInfo(), UNO_SET_THROW ); - - // calculate the default - if ( xGridColPSI->hasPropertyByName( PROPERTY_CONTROLDEFAULT ) ) - { - aDefault = xColumn->getPropertyValue( PROPERTY_CONTROLDEFAULT ); - // default value - if ( nType == DataType::BIT || nType == DataType::BOOLEAN ) - { - if ( aDefault.hasValue() ) - aDefault <<= (comphelper::getString(aDefault).toInt32() == 0) ? (sal_Int16)STATE_NOCHECK : (sal_Int16)STATE_CHECK; - else - aDefault <<= ((sal_Int16)STATE_DONTKNOW); - } - } - - if ( aDefault.hasValue() ) - aInitialValues.push_back( NamedValue( sDefaultProperty, aDefault ) ); - - // transfer properties from the definition to the UNO-model : - aCopyProperties.push_back( PROPERTY_HIDDEN ); - aCopyProperties.push_back( PROPERTY_WIDTH ); - - // help text to display for the column - Any aDescription; - if ( xColPSI->hasPropertyByName( PROPERTY_HELPTEXT ) ) - aDescription = xColumn->getPropertyValue( PROPERTY_HELPTEXT ); - ::rtl::OUString sTemp; - aDescription >>= sTemp; - if ( !sTemp.getLength() ) - xColumn->getPropertyValue( PROPERTY_DESCRIPTION ) >>= sTemp; - - aDescription <<= sTemp; - aInitialValues.push_back( NamedValue( PROPERTY_HELPTEXT, aDescription ) ); - - // ... horizontal justify - Any aAlign; aAlign <<= sal_Int16( 0 ); - Any aColAlign( xColumn->getPropertyValue( PROPERTY_ALIGN ) ); - if ( aColAlign.hasValue() ) - aAlign <<= sal_Int16( ::comphelper::getINT32( aColAlign ) ); - aInitialValues.push_back( NamedValue( PROPERTY_ALIGN, aAlign ) ); - - // don't allow the mouse to scroll in the cells - if ( xGridColPSI->hasPropertyByName( PROPERTY_MOUSE_WHEEL_BEHAVIOR ) ) - aInitialValues.push_back( NamedValue( PROPERTY_MOUSE_WHEEL_BEHAVIOR, makeAny( MouseWheelBehavior::SCROLL_DISABLED ) ) ); - - // now set all those values - for ( ::std::vector< NamedValue >::const_iterator property = aInitialValues.begin(); - property != aInitialValues.end(); - ++property - ) - { - xGridCol->setPropertyValue( property->Name, property->Value ); - } - for ( ::std::vector< ::rtl::OUString >::const_iterator copyPropertyName = aCopyProperties.begin(); - copyPropertyName != aCopyProperties.end(); - ++copyPropertyName - ) - xGridCol->setPropertyValue( *copyPropertyName, xColumn->getPropertyValue( *copyPropertyName ) ); - - xColContainer->insertByName(*pIter, makeAny(xGridCol)); - } - } - } - catch(const Exception&) - { - DBG_UNHANDLED_EXCEPTION(); - return sal_False; - } - - return sal_True; -} -// ----------------------------------------------------------------------------- -Reference<XPropertySet> getColumnHelper(SvLBoxEntry* _pCurrentlyDisplayed,const Reference<XPropertySet>& _rxSource) -{ - Reference<XPropertySet> xRet; - if(_pCurrentlyDisplayed) - { - DBTreeListUserData* pData = static_cast<DBTreeListUserData*>(_pCurrentlyDisplayed->GetUserData()); - Reference<XColumnsSupplier> xColumnsSup(pData->xObjectProperties,UNO_QUERY); - Reference<XNameAccess> xNames = xColumnsSup->getColumns(); - ::rtl::OUString aName; - _rxSource->getPropertyValue(PROPERTY_NAME) >>= aName; - if(xNames.is() && xNames->hasByName(aName)) - xRet.set(xNames->getByName(aName),UNO_QUERY); - } - return xRet; -} - -// ----------------------------------------------------------------------- -void SbaTableQueryBrowser::transferChangedControlProperty(const ::rtl::OUString& _rProperty, const Any& _rNewValue) -{ - if(m_pCurrentlyDisplayed) - { - DBTreeListUserData* pData = static_cast<DBTreeListUserData*>(m_pCurrentlyDisplayed->GetUserData()); - Reference< XPropertySet > xObjectProps(pData->xObjectProperties, UNO_QUERY); - OSL_ENSURE(xObjectProps.is(),"SbaTableQueryBrowser::transferChangedControlProperty: no table/query object!"); - if (xObjectProps.is()) - xObjectProps->setPropertyValue(_rProperty, _rNewValue); - } -} - -// ----------------------------------------------------------------------- -void SbaTableQueryBrowser::propertyChange(const PropertyChangeEvent& evt) throw(::com::sun::star::uno::RuntimeException) -{ - SbaXDataBrowserController::propertyChange(evt); - - try - { - Reference< XPropertySet > xSource(evt.Source, UNO_QUERY); - if (!xSource.is()) - return; - - // one of the many properties which require us to update the definition ? - // a column's width ? - else if (evt.PropertyName.equals(PROPERTY_WIDTH)) - { // a column width has changed -> update the model - // (the update of the view is done elsewhere) - Reference<XPropertySet> xProp = getColumnHelper(m_pCurrentlyDisplayed,xSource); - if(xProp.is()) - { - if(!evt.NewValue.hasValue()) - xProp->setPropertyValue(PROPERTY_WIDTH,makeAny((sal_Int32)227)); - else - xProp->setPropertyValue(PROPERTY_WIDTH,evt.NewValue); - } - } - - // a column's 'visible' state ? - else if (evt.PropertyName.equals(PROPERTY_HIDDEN)) - { - Reference<XPropertySet> xProp = getColumnHelper(m_pCurrentlyDisplayed,xSource); - if(xProp.is()) - xProp->setPropertyValue(PROPERTY_HIDDEN,evt.NewValue); - } - - // a columns alignment ? - else if (evt.PropertyName.equals(PROPERTY_ALIGN)) - { - Reference<XPropertySet> xProp = getColumnHelper(m_pCurrentlyDisplayed,xSource); - try - { - if(xProp.is()) - { - if(evt.NewValue.hasValue()) - { - sal_Int16 nAlign = 0; - if(evt.NewValue >>= nAlign) - xProp->setPropertyValue(PROPERTY_ALIGN,makeAny(sal_Int32(nAlign))); - else - xProp->setPropertyValue(PROPERTY_ALIGN,evt.NewValue); - } - else - xProp->setPropertyValue(PROPERTY_ALIGN,makeAny(::com::sun::star::awt::TextAlign::LEFT)); - } - } - catch( const Exception& ) - { - DBG_UNHANDLED_EXCEPTION(); - } - } - - // a column's format ? - else if ( (evt.PropertyName.equals(PROPERTY_FORMATKEY)) - && (TypeClass_LONG == evt.NewValue.getValueTypeClass()) - ) - { - // update the model (means the definition object) - Reference<XPropertySet> xProp = getColumnHelper(m_pCurrentlyDisplayed,xSource); - if(xProp.is()) - xProp->setPropertyValue(PROPERTY_FORMATKEY,evt.NewValue); - } - - // some table definition properties ? - // the height of the rows in the grid ? - else if (evt.PropertyName.equals(PROPERTY_ROW_HEIGHT)) - { - if(m_pCurrentlyDisplayed) - { - DBTreeListUserData* pData = static_cast<DBTreeListUserData*>(m_pCurrentlyDisplayed->GetUserData()); - OSL_ENSURE( pData->xObjectProperties.is(), "No table available!" ); - - sal_Bool bDefault = !evt.NewValue.hasValue(); - if (bDefault) - pData->xObjectProperties->setPropertyValue(PROPERTY_ROW_HEIGHT,makeAny((sal_Int32)45)); - else - pData->xObjectProperties->setPropertyValue(PROPERTY_ROW_HEIGHT,evt.NewValue); - } - } - - else if ( evt.PropertyName.equals(PROPERTY_FONT) // the font ? - || evt.PropertyName.equals(PROPERTY_TEXTCOLOR) // the text color ? - || evt.PropertyName.equals(PROPERTY_FILTER) // the filter ? - || evt.PropertyName.equals(PROPERTY_HAVING_CLAUSE) // the having clause ? - || evt.PropertyName.equals(PROPERTY_ORDER) // the sort ? - || evt.PropertyName.equals(PROPERTY_APPLYFILTER) // the appliance of the filter ? - || evt.PropertyName.equals(PROPERTY_TEXTLINECOLOR) // the text line color ? - || evt.PropertyName.equals(PROPERTY_TEXTEMPHASIS) // the text emphasis ? - || evt.PropertyName.equals(PROPERTY_TEXTRELIEF) // the text relief ? - ) - { - transferChangedControlProperty(evt.PropertyName, evt.NewValue); - } - } - catch( const Exception& ) - { - DBG_UNHANDLED_EXCEPTION(); - } -} - -// ----------------------------------------------------------------------- -sal_Bool SbaTableQueryBrowser::suspend(sal_Bool bSuspend) throw( RuntimeException ) -{ - SolarMutexGuard aSolarGuard; - ::osl::MutexGuard aGuard( getMutex() ); - if ( getView() && getView()->IsInModalMode() ) - return sal_False; - sal_Bool bRet = sal_False; - if ( !m_bInSuspend ) - { - m_bInSuspend = sal_True; - if ( rBHelper.bDisposed ) - throw DisposedException( ::rtl::OUString(), *this ); - - bRet = SbaXDataBrowserController::suspend(bSuspend); - if ( bRet && getView() ) - getView()->Hide(); - - m_bInSuspend = sal_False; - } - - return bRet; -} - -// ------------------------------------------------------------------------- -void SAL_CALL SbaTableQueryBrowser::statusChanged( const FeatureStateEvent& _rEvent ) throw(RuntimeException) -{ - // search the external dispatcher causing this call - Reference< XDispatch > xSource(_rEvent.Source, UNO_QUERY); - ExternalFeaturesMap::iterator aLoop; - for ( aLoop = m_aExternalFeatures.begin(); - aLoop != m_aExternalFeatures.end(); - ++aLoop - ) - { - if ( _rEvent.FeatureURL.Complete == aLoop->second.aURL.Complete) - { - OSL_ENSURE( xSource.get() == aLoop->second.xDispatcher.get(), "SbaTableQueryBrowser::statusChanged: inconsistent!" ); - // update the enabled state - aLoop->second.bEnabled = _rEvent.IsEnabled; - - switch ( aLoop->first ) - { - case ID_BROWSER_DOCUMENT_DATASOURCE: - { - // if it's the slot for the document data source, remember the state - Sequence< PropertyValue > aDescriptor; - #if OSL_DEBUG_LEVEL > 0 - sal_Bool bProperFormat = - #endif - _rEvent.State >>= aDescriptor; - OSL_ENSURE(bProperFormat, "SbaTableQueryBrowser::statusChanged: need a data access descriptor here!"); - m_aDocumentDataSource.initializeFrom(aDescriptor); - - OSL_ENSURE( ( m_aDocumentDataSource.has(daDataSource) - || m_aDocumentDataSource.has(daDatabaseLocation) - ) - && m_aDocumentDataSource.has(daCommand) - && m_aDocumentDataSource.has(daCommandType), - "SbaTableQueryBrowser::statusChanged: incomplete descriptor!"); - - // check if we know the object which is set as document data source - checkDocumentDataSource(); - } - break; - - default: - // update the toolbox - implCheckExternalSlot( aLoop->first ); - break; - } - break; - } - } - - OSL_ENSURE(aLoop != m_aExternalFeatures.end(), "SbaTableQueryBrowser::statusChanged: don't know who sent this!"); -} - -// ------------------------------------------------------------------------- -void SbaTableQueryBrowser::checkDocumentDataSource() -{ - SvLBoxEntry* pDataSourceEntry = NULL; - SvLBoxEntry* pContainerEntry = NULL; - SvLBoxEntry* pObjectEntry = getObjectEntry( m_aDocumentDataSource, &pDataSourceEntry, &pContainerEntry, sal_False ); - sal_Bool bKnownDocDataSource = (NULL != pObjectEntry); - if (!bKnownDocDataSource) - { - if (NULL != pDataSourceEntry) - { // at least the data source is known - if (NULL != pContainerEntry) - bKnownDocDataSource = sal_True; // assume we know it. - // TODO: should we expand the object container? This may be too expensive just for checking .... - else - { - if ((NULL == pObjectEntry) && m_aDocumentDataSource.has(daCommandType) && m_aDocumentDataSource.has(daCommand)) - { // maybe we have a command to be displayed ? - sal_Int32 nCommandType = CommandType::TABLE; - m_aDocumentDataSource[daCommandType] >>= nCommandType; - - ::rtl::OUString sCommand; - m_aDocumentDataSource[daCommand] >>= sCommand; - - bKnownDocDataSource = (CommandType::COMMAND == nCommandType) && (0 != sCommand.getLength()); - } - } - } - } - - if ( !bKnownDocDataSource ) - m_aExternalFeatures[ ID_BROWSER_DOCUMENT_DATASOURCE ].bEnabled = sal_False; - - // update the toolbox - implCheckExternalSlot(ID_BROWSER_DOCUMENT_DATASOURCE); -} - -// ------------------------------------------------------------------------- -void SbaTableQueryBrowser::extractDescriptorProps(const ::svx::ODataAccessDescriptor& _rDescriptor, ::rtl::OUString& _rDataSource, ::rtl::OUString& _rCommand, sal_Int32& _rCommandType, sal_Bool& _rEscapeProcessing) -{ - _rDataSource = _rDescriptor.getDataSource(); - if ( _rDescriptor.has(daCommand) ) - _rDescriptor[daCommand] >>= _rCommand; - if ( _rDescriptor.has(daCommandType) ) - _rDescriptor[daCommandType] >>= _rCommandType; - - // escape processing is the only one allowed not to be present - _rEscapeProcessing = sal_True; - if (_rDescriptor.has(daEscapeProcessing)) - _rEscapeProcessing = ::cppu::any2bool(_rDescriptor[daEscapeProcessing]); -} - -// ------------------------------------------------------------------------- -namespace -{ - bool getDataSourceDisplayName_isURL( const String& _rDS, String& _rDisplayName, String& _rUniqueId ) - { - INetURLObject aURL( _rDS ); - if ( aURL.GetProtocol() != INET_PROT_NOT_VALID ) - { - _rDisplayName = aURL.getBase(INetURLObject::LAST_SEGMENT,true,INetURLObject::DECODE_WITH_CHARSET); - _rUniqueId = aURL.GetMainURL( INetURLObject::NO_DECODE ); - return true; - } - _rDisplayName = _rDS; - _rUniqueId = String(); - return false; - } - - // ..................................................................... - struct FilterByEntryDataId : public IEntryFilter - { - String sId; - FilterByEntryDataId( const String& _rId ) : sId( _rId ) { } - - virtual ~FilterByEntryDataId() {} - - virtual bool includeEntry( SvLBoxEntry* _pEntry ) const; - }; - - bool FilterByEntryDataId::includeEntry( SvLBoxEntry* _pEntry ) const - { - DBTreeListUserData* pData = static_cast< DBTreeListUserData* >( _pEntry->GetUserData() ); - return ( !pData || ( pData->sAccessor == sId ) ); - } -} - -// ------------------------------------------------------------------------- -String SbaTableQueryBrowser::getDataSourceAcessor( SvLBoxEntry* _pDataSourceEntry ) const -{ - OSL_ENSURE( _pDataSourceEntry, "SbaTableQueryBrowser::getDataSourceAcessor: invalid entry!" ); - - DBTreeListUserData* pData = static_cast< DBTreeListUserData* >( _pDataSourceEntry->GetUserData() ); - OSL_ENSURE( pData, "SbaTableQueryBrowser::getDataSourceAcessor: invalid entry data!" ); - OSL_ENSURE( pData->eType == etDatasource, "SbaTableQueryBrowser::getDataSourceAcessor: entry does not denote a data source!" ); - return pData->sAccessor.Len() ? pData->sAccessor : GetEntryText( _pDataSourceEntry ); -} - -// ------------------------------------------------------------------------- -SvLBoxEntry* SbaTableQueryBrowser::getObjectEntry(const ::rtl::OUString& _rDataSource, const ::rtl::OUString& _rCommand, sal_Int32 _nCommandType, - SvLBoxEntry** _ppDataSourceEntry, SvLBoxEntry** _ppContainerEntry, sal_Bool _bExpandAncestors, - const SharedConnection& _rxConnection ) -{ - if (_ppDataSourceEntry) - *_ppDataSourceEntry = NULL; - if (_ppContainerEntry) - *_ppContainerEntry = NULL; - - SvLBoxEntry* pObject = NULL; - if ( m_pTreeView ) - { - // look for the data source entry - String sDisplayName, sDataSourceId; - bool bIsDataSourceURL = getDataSourceDisplayName_isURL( _rDataSource, sDisplayName, sDataSourceId ); - // the display name may differ from the URL for readability reasons - // #i33699# - - FilterByEntryDataId aFilter( sDataSourceId ); - SvLBoxEntry* pDataSource = m_pTreeView->getListBox().GetEntryPosByName( sDisplayName, NULL, &aFilter ); - if ( !pDataSource ) // check if the data source name is a file location - { - if ( bIsDataSourceURL ) - { - // special case, the data source is a URL - // add new entries to the list box model - implAddDatasource( _rDataSource, _rxConnection ); - pDataSource = m_pTreeView->getListBox().GetEntryPosByName( sDisplayName, NULL, &aFilter ); - OSL_ENSURE( pDataSource, "SbaTableQueryBrowser::getObjectEntry: hmm - did not find it again!" ); - } - } - if (_ppDataSourceEntry) - // (caller wants to have it ...) - *_ppDataSourceEntry = pDataSource; - - if (pDataSource) - { - // expand if required so - if (_bExpandAncestors) - m_pTreeView->getListBox().Expand(pDataSource); - - // look for the object container - SvLBoxEntry* pCommandType = NULL; - switch (_nCommandType) - { - case CommandType::TABLE: - pCommandType = m_pTreeView->getListBox().GetModel()->GetEntry(pDataSource, CONTAINER_TABLES); - break; - - case CommandType::QUERY: - pCommandType = m_pTreeView->getListBox().GetModel()->GetEntry(pDataSource, CONTAINER_QUERIES); - break; - } - - if (_ppContainerEntry) - *_ppContainerEntry = pCommandType; - - if (pCommandType) - { - // expand if required so - if (_bExpandAncestors) - { - m_pTreeView->getListBox().Expand(pCommandType); - } - - // look for the object - ::rtl::OUString sCommand = _rCommand; - sal_Int32 nIndex = 0; - do - { - ::rtl::OUString sPath = sCommand.getToken( 0, '/', nIndex ); - pObject = m_pTreeView->getListBox().GetEntryPosByName(sPath, pCommandType); - pCommandType = pObject; - if ( nIndex >= 0 ) - { - if (ensureEntryObject(pObject)) - { - DBTreeListUserData* pParentData = static_cast< DBTreeListUserData* >( pObject->GetUserData() ); - Reference< XNameAccess > xCollection( pParentData->xContainer, UNO_QUERY ); - sal_Int32 nIndex2 = nIndex; - sPath = sCommand.getToken( 0, '/', nIndex2 ); - try - { - if ( xCollection->hasByName(sPath) ) - { - if(!m_pTreeView->getListBox().GetEntryPosByName(sPath,pObject)) - { - Reference<XNameAccess> xChild(xCollection->getByName(sPath),UNO_QUERY); - DBTreeListUserData* pEntryData = new DBTreeListUserData; - pEntryData->eType = etQuery; - if ( xChild.is() ) - { - pEntryData->eType = etQueryContainer; - } - implAppendEntry( pObject, sPath, pEntryData, pEntryData->eType ); - } - } - } - catch(const Exception&) - { - OSL_FAIL("SbaTableQueryBrowser::populateTree: could not fill the tree"); - } - } - } - } - while ( nIndex >= 0 ); - } - } - } - return pObject; -} - -// ------------------------------------------------------------------------- -SvLBoxEntry* SbaTableQueryBrowser::getObjectEntry(const ::svx::ODataAccessDescriptor& _rDescriptor, - SvLBoxEntry** _ppDataSourceEntry, SvLBoxEntry** _ppContainerEntry, - sal_Bool _bExpandAncestors) -{ - // extract the props from the descriptor - ::rtl::OUString sDataSource; - ::rtl::OUString sCommand; - sal_Int32 nCommandType = CommandType::COMMAND; - sal_Bool bEscapeProcessing = sal_True; - extractDescriptorProps(_rDescriptor, sDataSource, sCommand, nCommandType, bEscapeProcessing); - - return getObjectEntry( sDataSource, sCommand, nCommandType, _ppDataSourceEntry, _ppContainerEntry, _bExpandAncestors, SharedConnection() ); -} - -// ------------------------------------------------------------------------- -void SbaTableQueryBrowser::connectExternalDispatches() -{ - Reference< XDispatchProvider > xProvider( getFrame(), UNO_QUERY ); - OSL_ENSURE(xProvider.is(), "SbaTableQueryBrowser::connectExternalDispatches: no DispatchProvider !"); - if (xProvider.is()) - { - if ( m_aExternalFeatures.empty() ) - { - const sal_Char* pURLs[] = { - ".uno:DataSourceBrowser/DocumentDataSource", - ".uno:DataSourceBrowser/FormLetter", - ".uno:DataSourceBrowser/InsertColumns", - ".uno:DataSourceBrowser/InsertContent", - }; - const sal_uInt16 nIds[] = { - ID_BROWSER_DOCUMENT_DATASOURCE, - ID_BROWSER_FORMLETTER, - ID_BROWSER_INSERTCOLUMNS, - ID_BROWSER_INSERTCONTENT - }; - - for ( size_t i=0; i < SAL_N_ELEMENTS( pURLs ); ++i ) - { - URL aURL; - aURL.Complete = ::rtl::OUString::createFromAscii( pURLs[i] ); - if ( m_xUrlTransformer.is() ) - m_xUrlTransformer->parseStrict( aURL ); - m_aExternalFeatures[ nIds[ i ] ] = ExternalFeature( aURL ); - } - } - - for ( ExternalFeaturesMap::iterator feature = m_aExternalFeatures.begin(); - feature != m_aExternalFeatures.end(); - ++feature - ) - { - feature->second.xDispatcher = xProvider->queryDispatch( - feature->second.aURL, ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("_parent")), FrameSearchFlag::PARENT - ); - - if ( feature->second.xDispatcher.get() == static_cast< XDispatch* >( this ) ) - { - OSL_FAIL( "SbaTableQueryBrowser::connectExternalDispatches: this should not happen anymore!" ); - // (nowadays, the URLs aren't in our SupportedFeatures list anymore, so we should - // not supply a dispatcher for this) - feature->second.xDispatcher.clear(); - } - - if ( feature->second.xDispatcher.is() ) - { - try - { - feature->second.xDispatcher->addStatusListener( this, feature->second.aURL ); - } - catch( const Exception& ) - { - DBG_UNHANDLED_EXCEPTION(); - } - } - - implCheckExternalSlot( feature->first ); - } - } -} - -// ------------------------------------------------------------------------- -void SbaTableQueryBrowser::implCheckExternalSlot( sal_uInt16 _nId ) -{ - if ( !m_xMainToolbar.is() ) - return; - - Window* pToolboxWindow = VCLUnoHelper::GetWindow( m_xMainToolbar ); - ToolBox* pToolbox = dynamic_cast< ToolBox* >( pToolboxWindow ); - OSL_ENSURE( pToolbox, "SbaTableQueryBrowser::implCheckExternalSlot: cannot obtain the toolbox window!" ); - - // check if we have to hide this item from the toolbox - if ( pToolbox ) - { - sal_Bool bHaveDispatcher = m_aExternalFeatures[ _nId ].xDispatcher.is(); - if ( bHaveDispatcher != pToolbox->IsItemVisible( _nId ) ) - bHaveDispatcher ? pToolbox->ShowItem( _nId ) : pToolbox->HideItem( _nId ); - } - - // and invalidate this feature in general - InvalidateFeature( _nId ); -} - -// ------------------------------------------------------------------------- -void SAL_CALL SbaTableQueryBrowser::disposing( const EventObject& _rSource ) throw(RuntimeException) -{ - // our frame ? - Reference< ::com::sun::star::frame::XFrame > xSourceFrame(_rSource.Source, UNO_QUERY); - if (m_xCurrentFrameParent.is() && (xSourceFrame == m_xCurrentFrameParent)) - m_xCurrentFrameParent->removeFrameActionListener((::com::sun::star::frame::XFrameActionListener*)this); - else - { - // search the external dispatcher causing this call in our map - Reference< XDispatch > xSource(_rSource.Source, UNO_QUERY); - if(xSource.is()) - { - for ( ExternalFeaturesMap::iterator aLoop = m_aExternalFeatures.begin(); - aLoop != m_aExternalFeatures.end(); - ++aLoop - ) - { - if ( aLoop->second.xDispatcher.get() == xSource.get() ) - { - ExternalFeaturesMap::iterator aPrevious = aLoop; - --aPrevious; - - // remove it - m_aExternalFeatures.erase( aLoop ); - - // maybe update the UI - implCheckExternalSlot(aLoop->first); - - // continue, the same XDispatch may be resposible for more than one URL - aLoop = aPrevious; - } - } - } - else - { - Reference<XConnection> xCon(_rSource.Source, UNO_QUERY); - if ( xCon.is() && m_pTreeView ) - { // our connection is in dispose so we have to find the entry equal with this connection - // and close it what means to collapse the entry - // get the top-level representing the removed data source - SvLBoxEntry* pDSLoop = m_pTreeView->getListBox().FirstChild(NULL); - while (pDSLoop) - { - DBTreeListUserData* pData = static_cast<DBTreeListUserData*>(pDSLoop->GetUserData()); - if ( pData && pData->xConnection == xCon ) - { - // we set the connection to null to avoid a second disposing of the connection - pData->xConnection.clear(); - closeConnection(pDSLoop,sal_False); - break; - } - - pDSLoop = m_pTreeView->getListBox().NextSibling(pDSLoop); - } - } - else - SbaXDataBrowserController::disposing(_rSource); - } - } -} - -// ------------------------------------------------------------------------- -void SbaTableQueryBrowser::implRemoveStatusListeners() -{ - // clear all old dispatches - for ( ExternalFeaturesMap::const_iterator aLoop = m_aExternalFeatures.begin(); - aLoop != m_aExternalFeatures.end(); - ++aLoop - ) - { - if ( aLoop->second.xDispatcher.is() ) - { - try - { - aLoop->second.xDispatcher->removeStatusListener( this, aLoop->second.aURL ); - } - catch (Exception&) - { - OSL_FAIL("SbaTableQueryBrowser::implRemoveStatusListeners: could not remove a status listener!"); - } - } - } - m_aExternalFeatures.clear(); -} - -// ------------------------------------------------------------------------- -sal_Bool SAL_CALL SbaTableQueryBrowser::select( const Any& _rSelection ) throw (IllegalArgumentException, RuntimeException) -{ - SolarMutexGuard aGuard; - // doin' a lot of VCL stuff here -> lock the SolarMutex - - Sequence< PropertyValue > aDescriptorSequence; - if (!(_rSelection >>= aDescriptorSequence)) - throw IllegalArgumentException(::rtl::OUString(), *this, 1); - // TODO: error message - - ODataAccessDescriptor aDescriptor; - try - { - aDescriptor = ODataAccessDescriptor(aDescriptorSequence); - } - catch(const Exception&) - { - OSL_FAIL("SbaTableQueryBrowser::select: could not extract the descriptor!"); - } - - // check the precense of the props we need - if ( !(aDescriptor.has(daDataSource) || aDescriptor.has(daDatabaseLocation)) || !aDescriptor.has(daCommand) || !aDescriptor.has(daCommandType)) - throw IllegalArgumentException(::rtl::OUString(), *this, 1); - // TODO: error message - - return implSelect(aDescriptor,sal_True); -} - -// ------------------------------------------------------------------------- -Any SAL_CALL SbaTableQueryBrowser::getSelection( ) throw (RuntimeException) -{ - Any aReturn; - - try - { - Reference< XLoadable > xLoadable(getRowSet(), UNO_QUERY); - if (xLoadable.is() && xLoadable->isLoaded()) - { - Reference< XPropertySet > aFormProps(getRowSet(), UNO_QUERY); - ODataAccessDescriptor aDescriptor(aFormProps); - // remove properties which are not part of our "selection" - aDescriptor.erase(daConnection); - aDescriptor.erase(daCursor); - - aReturn <<= aDescriptor.createPropertyValueSequence(); - } - } - catch( const Exception& ) - { - DBG_UNHANDLED_EXCEPTION(); - } - - return aReturn; -} - -// ------------------------------------------------------------------------- -void SAL_CALL SbaTableQueryBrowser::addSelectionChangeListener( const Reference< XSelectionChangeListener >& _rxListener ) throw (RuntimeException) -{ - m_aSelectionListeners.addInterface(_rxListener); -} - -// ------------------------------------------------------------------------- -void SAL_CALL SbaTableQueryBrowser::removeSelectionChangeListener( const Reference< XSelectionChangeListener >& _rxListener ) throw (RuntimeException) -{ - m_aSelectionListeners.removeInterface(_rxListener); -} - -// ------------------------------------------------------------------------- -void SbaTableQueryBrowser::attachFrame(const Reference< ::com::sun::star::frame::XFrame > & _xFrame) throw( RuntimeException ) -{ - implRemoveStatusListeners(); - - if (m_xCurrentFrameParent.is()) - m_xCurrentFrameParent->removeFrameActionListener((::com::sun::star::frame::XFrameActionListener*)this); - - SbaXDataBrowserController::attachFrame(_xFrame); - - Reference< XFrame > xCurrentFrame( getFrame() ); - if ( xCurrentFrame.is() ) - { - m_xCurrentFrameParent = xCurrentFrame->findFrame(::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("_parent")),FrameSearchFlag::PARENT); - if ( m_xCurrentFrameParent.is() ) - m_xCurrentFrameParent->addFrameActionListener((::com::sun::star::frame::XFrameActionListener*)this); - - // obtain our toolbox - try - { - Reference< XPropertySet > xFrameProps( m_aCurrentFrame.getFrame(), UNO_QUERY_THROW ); - Reference< XLayoutManager > xLayouter( - xFrameProps->getPropertyValue( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "LayoutManager" ) ) ), - UNO_QUERY ); - - if ( xLayouter.is() ) - { - Reference< XUIElement > xUI( - xLayouter->getElement( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "private:resource/toolbar/toolbar" ) ) ), - UNO_SET_THROW ); - m_xMainToolbar = m_xMainToolbar.query( xUI->getRealInterface() ); - OSL_ENSURE( m_xMainToolbar.is(), "SbaTableQueryBrowser::attachFrame: where's my toolbox?" ); - } - } - catch( const Exception& ) - { - DBG_UNHANDLED_EXCEPTION(); - } - } - - // get the dispatchers for the external slots - connectExternalDispatches(); -} - -// ------------------------------------------------------------------------- -void SbaTableQueryBrowser::addModelListeners(const Reference< ::com::sun::star::awt::XControlModel > & _xGridControlModel) -{ - SbaXDataBrowserController::addModelListeners(_xGridControlModel); - Reference< XPropertySet > xSourceSet(_xGridControlModel, UNO_QUERY); - if (xSourceSet.is()) - { - xSourceSet->addPropertyChangeListener(PROPERTY_ROW_HEIGHT, static_cast<XPropertyChangeListener*>(this)); - xSourceSet->addPropertyChangeListener(PROPERTY_FONT, static_cast<XPropertyChangeListener*>(this)); - xSourceSet->addPropertyChangeListener(PROPERTY_TEXTCOLOR, static_cast<XPropertyChangeListener*>(this)); - xSourceSet->addPropertyChangeListener(PROPERTY_TEXTLINECOLOR, static_cast<XPropertyChangeListener*>(this)); - xSourceSet->addPropertyChangeListener(PROPERTY_TEXTEMPHASIS, static_cast<XPropertyChangeListener*>(this)); - xSourceSet->addPropertyChangeListener(PROPERTY_TEXTRELIEF, static_cast<XPropertyChangeListener*>(this)); - } - -} - -// ------------------------------------------------------------------------- -void SbaTableQueryBrowser::removeModelListeners(const Reference< ::com::sun::star::awt::XControlModel > & _xGridControlModel) -{ - SbaXDataBrowserController::removeModelListeners(_xGridControlModel); - Reference< XPropertySet > xSourceSet(_xGridControlModel, UNO_QUERY); - if (xSourceSet.is()) - { - xSourceSet->removePropertyChangeListener(PROPERTY_ROW_HEIGHT, static_cast<XPropertyChangeListener*>(this)); - xSourceSet->removePropertyChangeListener(PROPERTY_FONT, static_cast<XPropertyChangeListener*>(this)); - xSourceSet->removePropertyChangeListener(PROPERTY_TEXTCOLOR, static_cast<XPropertyChangeListener*>(this)); - xSourceSet->removePropertyChangeListener(PROPERTY_TEXTLINECOLOR, static_cast<XPropertyChangeListener*>(this)); - xSourceSet->removePropertyChangeListener(PROPERTY_TEXTEMPHASIS, static_cast<XPropertyChangeListener*>(this)); - xSourceSet->removePropertyChangeListener(PROPERTY_TEXTRELIEF, static_cast<XPropertyChangeListener*>(this)); - } -} -// ------------------------------------------------------------------------- -void SbaTableQueryBrowser::RowChanged() -{ - if(getBrowserView()) - { - SbaGridControl* pControl = getBrowserView()->getVclControl(); - if (!pControl->IsEditing()) - InvalidateFeature(ID_BROWSER_COPY); - } - SbaXDataBrowserController::RowChanged(); -} - -// ------------------------------------------------------------------------- -void SbaTableQueryBrowser::ColumnChanged() -{ - if(getBrowserView()) - { - SbaGridControl* pControl = getBrowserView()->getVclControl(); - if (!pControl->IsEditing()) - InvalidateFeature(ID_BROWSER_COPY); - } - SbaXDataBrowserController::ColumnChanged(); -} -//------------------------------------------------------------------------------ -void SbaTableQueryBrowser::AddColumnListener(const Reference< XPropertySet > & xCol) -{ - SbaXDataBrowserController::AddColumnListener(xCol); - SafeAddPropertyListener(xCol, PROPERTY_WIDTH, static_cast<XPropertyChangeListener*>(this)); - SafeAddPropertyListener(xCol, PROPERTY_HIDDEN, static_cast<XPropertyChangeListener*>(this)); - SafeAddPropertyListener(xCol, PROPERTY_ALIGN, static_cast<XPropertyChangeListener*>(this)); - SafeAddPropertyListener(xCol, PROPERTY_FORMATKEY, static_cast<XPropertyChangeListener*>(this)); -} - -//------------------------------------------------------------------------------ -void SbaTableQueryBrowser::RemoveColumnListener(const Reference< XPropertySet > & xCol) -{ - SbaXDataBrowserController::RemoveColumnListener(xCol); - SafeRemovePropertyListener(xCol, PROPERTY_WIDTH, static_cast<XPropertyChangeListener*>(this)); - SafeRemovePropertyListener(xCol, PROPERTY_HIDDEN, static_cast<XPropertyChangeListener*>(this)); - SafeRemovePropertyListener(xCol, PROPERTY_ALIGN, static_cast<XPropertyChangeListener*>(this)); - SafeRemovePropertyListener(xCol, PROPERTY_FORMATKEY, static_cast<XPropertyChangeListener*>(this)); -} - -//------------------------------------------------------------------------------ -void SbaTableQueryBrowser::criticalFail() -{ - SbaXDataBrowserController::criticalFail(); - unloadAndCleanup( sal_False ); -} - -//------------------------------------------------------------------------------ -void SbaTableQueryBrowser::LoadFinished(sal_Bool _bWasSynch) -{ - SbaXDataBrowserController::LoadFinished(_bWasSynch); - - m_sQueryCommand = ::rtl::OUString(); - m_bQueryEscapeProcessing = sal_False; - - if (isValid() && !loadingCancelled()) - { - // did we load a query? - sal_Bool bTemporary; // needed because we m_bQueryEscapeProcessing is only one bit wide (and we want to pass it by reference) - if ( implGetQuerySignature( m_sQueryCommand, bTemporary ) ) - m_bQueryEscapeProcessing = bTemporary; - } - - // if the form has been loaded, this means that our "selection" has changed - EventObject aEvent( *this ); - m_aSelectionListeners.notifyEach( &XSelectionChangeListener::selectionChanged, aEvent ); -} - -//------------------------------------------------------------------------------ -sal_Bool SbaTableQueryBrowser::getExternalSlotState( sal_uInt16 _nId ) const -{ - sal_Bool bEnabled = sal_False; - ExternalFeaturesMap::const_iterator aPos = m_aExternalFeatures.find( _nId ); - if ( ( m_aExternalFeatures.end() != aPos ) && aPos->second.xDispatcher.is() ) - bEnabled = aPos->second.bEnabled; - return bEnabled; -} - -//------------------------------------------------------------------------------ -FeatureState SbaTableQueryBrowser::GetState(sal_uInt16 nId) const -{ - FeatureState aReturn; - // (disabled automatically) - - // no chance without a view - if (!getBrowserView() || !getBrowserView()->getVclControl()) - return aReturn; - - switch ( nId ) - { - case ID_TREE_ADMINISTRATE: - aReturn.bEnabled = true; - return aReturn; - - case ID_BROWSER_CLOSE: - // the close button should always be enabled - aReturn.bEnabled = !m_bEnableBrowser; - return aReturn; - - // "toggle explorer" is always enabled (if we have a explorer) - case ID_BROWSER_EXPLORER: - aReturn.bEnabled = m_bEnableBrowser; - aReturn.bChecked = haveExplorer(); - return aReturn; - - case ID_BROWSER_REMOVEFILTER: - return SbaXDataBrowserController::GetState( nId ); - - case ID_BROWSER_COPY: - if ( !m_pTreeView->HasChildPathFocus() ) - // handled below - break; - // NO break! - case ID_TREE_CLOSE_CONN: - case ID_TREE_EDIT_DATABASE: - { - SvLBoxEntry* pCurrentEntry( m_pTreeView->getListBox().GetCurEntry() ); - EntryType eType = getEntryType( pCurrentEntry ); - if ( eType == etUnknown ) - return aReturn; - - SvLBoxEntry* pDataSourceEntry = m_pTreeView->getListBox().GetRootLevelParent( pCurrentEntry ); - DBTreeListUserData* pDSData - = pDataSourceEntry - ? static_cast< DBTreeListUserData* >( pDataSourceEntry->GetUserData() ) - : NULL; - - if ( nId == ID_TREE_CLOSE_CONN ) - { - aReturn.bEnabled = ( pDSData != NULL ) && pDSData->xConnection.is(); - } - else if ( nId == ID_TREE_EDIT_DATABASE ) - { - ::utl::OConfigurationTreeRoot aConfig( ::utl::OConfigurationTreeRoot::createWithServiceFactory( getORB(), - ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "/org.openoffice.Office.DataAccess/Policies/Features/Common" ) ) ) ); - sal_Bool bHaveEditDatabase( sal_True ); - OSL_VERIFY( aConfig.getNodeValue( "EditDatabaseFromDataSourceView" ) >>= bHaveEditDatabase ); - aReturn.bEnabled = getORB().is() && ( pDataSourceEntry != NULL ) && bHaveEditDatabase; - } - else if ( nId == ID_BROWSER_COPY ) - { - aReturn.bEnabled = isEntryCopyAllowed( pCurrentEntry ); - } - - return aReturn; - } - } - - // all slots not handled above are not available if no form is loaded - if (!isLoaded()) - return aReturn; - - try - { - sal_Bool bHandled = sal_False; - switch (nId) - { - case ID_BROWSER_DOCUMENT_DATASOURCE: - // the slot is enabled if we have an external dispatcher able to handle it, - // and the dispatcher must have enabled the slot in general - aReturn.bEnabled = getExternalSlotState( ID_BROWSER_DOCUMENT_DATASOURCE ); - bHandled = sal_True; - break; - case ID_BROWSER_REFRESH: - aReturn.bEnabled = sal_True; - bHandled = sal_True; - break; - } - - if (bHandled) - return aReturn; - - // no chance without valid models - if (isValid() && !isValidCursor() && nId != ID_BROWSER_CLOSE) - return aReturn; - - switch (nId) - { - case ID_BROWSER_INSERTCOLUMNS: - case ID_BROWSER_INSERTCONTENT: - case ID_BROWSER_FORMLETTER: - { - // the slot is enabled if we have an external dispatcher able to handle it, - // and the dispatcher must have enabled the slot in general - aReturn.bEnabled = getExternalSlotState( nId ); - - // for the Insert* slots, we need at least one selected row - if (ID_BROWSER_FORMLETTER != nId) - aReturn.bEnabled = aReturn.bEnabled && getBrowserView()->getVclControl()->GetSelectRowCount(); - - // disabled for native queries which are not saved within the database - Reference< XPropertySet > xDataSource(getRowSet(), UNO_QUERY); - try - { - aReturn.bEnabled = aReturn.bEnabled && xDataSource.is(); - - if (xDataSource.is()) - { - sal_Int32 nType = ::comphelper::getINT32(xDataSource->getPropertyValue(PROPERTY_COMMAND_TYPE)); - aReturn.bEnabled = aReturn.bEnabled && ((::comphelper::getBOOL(xDataSource->getPropertyValue(PROPERTY_ESCAPE_PROCESSING)) || (nType == ::com::sun::star::sdb::CommandType::QUERY))); - } - } - catch(DisposedException&) - { - OSL_FAIL("SbaTableQueryBrowser::GetState: object already disposed!"); - } - catch( const Exception& ) - { - DBG_UNHANDLED_EXCEPTION(); - } - } - break; - - case ID_BROWSER_TITLE: - { - Reference<XPropertySet> xProp(getRowSet(),UNO_QUERY); - sal_Int32 nCommandType = CommandType::TABLE; - xProp->getPropertyValue(PROPERTY_COMMAND_TYPE) >>= nCommandType; - String sTitle; - switch (nCommandType) - { - case CommandType::TABLE: - sTitle = String(ModuleRes(STR_TBL_TITLE)); break; - case CommandType::QUERY: - case CommandType::COMMAND: - sTitle = String(ModuleRes(STR_QRY_TITLE)); break; - default: - OSL_FAIL("SbaTableQueryBrowser::GetState: unknown command type!"); - } - ::rtl::OUString aName; - xProp->getPropertyValue(PROPERTY_COMMAND) >>= aName; - String sObject(aName.getStr()); - - sTitle.SearchAndReplace('#',sObject); - aReturn.sTitle = sTitle; - aReturn.bEnabled = sal_True; - } - break; - case ID_BROWSER_TABLEATTR: - case ID_BROWSER_ROWHEIGHT: - case ID_BROWSER_COLATTRSET: - case ID_BROWSER_COLWIDTH: - aReturn.bEnabled = getBrowserView() && getBrowserView()->getVclControl() && isValid() && isValidCursor(); - // aReturn.bEnabled &= getDefinition() && !getDefinition()->GetDatabase()->IsReadOnly(); - break; - - case ID_BROWSER_COPY: - OSL_ENSURE( !m_pTreeView->HasChildPathFocus(), "SbaTableQueryBrowser::GetState( ID_BROWSER_COPY ): this should have been handled above!" ); - if (getBrowserView() && getBrowserView()->getVclControl() && !getBrowserView()->getVclControl()->IsEditing()) - { - SbaGridControl* pControl = getBrowserView()->getVclControl(); - if ( pControl->GetSelectRowCount() ) - { - aReturn.bEnabled = m_aCurrentFrame.isActive(); - break; - } - else - aReturn.bEnabled = pControl->canCopyCellText(pControl->GetCurRow(), pControl->GetCurColumnId()); - break; - } - // NO break here - default: - return SbaXDataBrowserController::GetState(nId); - } - } - catch(const Exception&) - { - DBG_UNHANDLED_EXCEPTION(); - } - - return aReturn; - -} - -//------------------------------------------------------------------------------ -void SbaTableQueryBrowser::Execute(sal_uInt16 nId, const Sequence< PropertyValue >& aArgs) -{ - switch (nId) - { - default: - SbaXDataBrowserController::Execute(nId,aArgs); - break; - - case ID_TREE_EDIT_DATABASE: - implAdministrate( m_pTreeView->getListBox().GetCurEntry() ); - break; - - case ID_TREE_CLOSE_CONN: - openHelpAgent( HID_DSBROWSER_DISCONNECTING ); - closeConnection( m_pTreeView->getListBox().GetRootLevelParent( m_pTreeView->getListBox().GetCurEntry() ) ); - break; - - case ID_TREE_ADMINISTRATE: - ::svx::administrateDatabaseRegistration( getView() ); - break; - - case ID_BROWSER_REFRESH: - { - if ( !SaveModified( ) ) - // nothing to do - break; - - sal_Bool bFullReinit = sal_False; - // check if the query signature (if the form is based on a query) has changed - if ( m_sQueryCommand.getLength() ) - { - ::rtl::OUString sNewQueryCommand; - sal_Bool bNewQueryEP; - -#if OSL_DEBUG_LEVEL > 0 - sal_Bool bIsQuery = -#endif - implGetQuerySignature( sNewQueryCommand, bNewQueryEP ); - OSL_ENSURE( bIsQuery, "SbaTableQueryBrowser::Execute: was a query before, but is not anymore?" ); - - bFullReinit = ( sNewQueryCommand != m_sQueryCommand ) || ( m_bQueryEscapeProcessing != bNewQueryEP ); - } - if ( !bFullReinit ) - { - // let the base class do a simple reload - SbaXDataBrowserController::Execute(nId,aArgs); - break; - } - // NO break here! - } - - case ID_BROWSER_REFRESH_REBUILD: - { - if ( !SaveModified() ) - // nothing to do - break; - - SvLBoxEntry* pSelected = m_pCurrentlyDisplayed; - // unload - unloadAndCleanup( sal_False ); - - // reselect the entry - if ( pSelected ) - { - implSelect( pSelected ); - } - else - { - Reference<XPropertySet> xProp(getRowSet(),UNO_QUERY); - implSelect(::svx::ODataAccessDescriptor(xProp)); - } - } - break; - - case ID_BROWSER_EXPLORER: - toggleExplorer(); - break; - - case ID_BROWSER_DOCUMENT_DATASOURCE: - implSelect(m_aDocumentDataSource); - break; - - case ID_BROWSER_INSERTCOLUMNS: - case ID_BROWSER_INSERTCONTENT: - case ID_BROWSER_FORMLETTER: - if (getBrowserView() && isValidCursor()) - { - // the URL the slot id is assigned to - OSL_ENSURE( m_aExternalFeatures.find( nId ) != m_aExternalFeatures.end(), - "SbaTableQueryBrowser::Execute( ID_BROWSER_?): how could this ever be enabled?" ); - URL aParentUrl = m_aExternalFeatures[ nId ].aURL; - - // let the dispatcher execute the slot - Reference< XDispatch > xDispatch( m_aExternalFeatures[ nId ].xDispatcher ); - if (xDispatch.is()) - { - // set the properties for the dispatch - - // first fill the selection - SbaGridControl* pGrid = getBrowserView()->getVclControl(); - MultiSelection* pSelection = (MultiSelection*)pGrid->GetSelection(); - Sequence< Any > aSelection; - if ( !pGrid->IsAllSelected() ) - { // transfer the selected rows only if not all rows are selected - // (all rows means the whole table) - // #i3832# - if (pSelection != NULL) - { - aSelection.realloc(pSelection->GetSelectCount()); - long nIdx = pSelection->FirstSelected(); - Any* pSelectionNos = aSelection.getArray(); - while (nIdx >= 0) - { - *pSelectionNos++ <<= (sal_Int32)(nIdx + 1); - nIdx = pSelection->NextSelected(); - } - } - } - - Reference< XResultSet > xCursorClone; - try - { - Reference< XResultSetAccess > xResultSetAccess(getRowSet(),UNO_QUERY); - if (xResultSetAccess.is()) - xCursorClone = xResultSetAccess->createResultSet(); - } - catch(DisposedException&) - { - OSL_FAIL("Object already disposed!"); - } - catch(const Exception&) - { - OSL_FAIL("SbaTableQueryBrowser::Execute(ID_BROWSER_?): could not clone the cursor!"); - } - - Reference<XPropertySet> xProp(getRowSet(),UNO_QUERY); - - try - { - ODataAccessDescriptor aDescriptor; - ::rtl::OUString sDataSourceName; - xProp->getPropertyValue(PROPERTY_DATASOURCENAME) >>= sDataSourceName; - - aDescriptor.setDataSource(sDataSourceName); - aDescriptor[daCommand] = xProp->getPropertyValue(PROPERTY_COMMAND); - aDescriptor[daCommandType] = xProp->getPropertyValue(PROPERTY_COMMAND_TYPE); - aDescriptor[daConnection] = xProp->getPropertyValue(PROPERTY_ACTIVE_CONNECTION); - aDescriptor[daCursor] <<= xCursorClone; - if ( aSelection.getLength() ) - { - aDescriptor[daSelection] <<= aSelection; - aDescriptor[daBookmarkSelection] <<= sal_False; - // these are selection indicies - // before we change this, all clients have to be adjusted - // so that they recognize the new BookmarkSelection property! - } - - xDispatch->dispatch(aParentUrl, aDescriptor.createPropertyValueSequence()); - } - catch( const Exception& ) - { - DBG_UNHANDLED_EXCEPTION(); - } - } - } - break; - - case ID_BROWSER_CLOSE: - closeTask(); - // if it's not 0, such a async close is already pending - break; - - case ID_BROWSER_COPY: - if(m_pTreeView->HasChildPathFocus()) - { - copyEntry(m_pTreeView->getListBox().GetCurEntry()); - } - else if (getBrowserView() && getBrowserView()->getVclControl() && !getBrowserView()->getVclControl()->IsEditing() && getBrowserView()->getVclControl()->GetSelectRowCount() < 1) - { - SbaGridControl* pControl = getBrowserView()->getVclControl(); - pControl->copyCellText(pControl->GetCurRow(), pControl->GetCurColumnId()); - } - else - SbaXDataBrowserController::Execute(nId,aArgs); - break; - } -} - -// ------------------------------------------------------------------------- -void SbaTableQueryBrowser::implAddDatasource( const String& _rDataSourceName, const SharedConnection& _rxConnection ) -{ - Image a, b, c; - String d, e; - implAddDatasource( _rDataSourceName, a, d, b, e, c, _rxConnection ); -} - -// ------------------------------------------------------------------------- -void SbaTableQueryBrowser::implAddDatasource(const String& _rDbName, Image& _rDbImage, - String& _rQueryName, Image& _rQueryImage, String& _rTableName, Image& _rTableImage, - const SharedConnection& _rxConnection) -{ - SolarMutexGuard aGuard; - // initialize the names/images if necessary - if (!_rQueryName.Len()) - _rQueryName = String(ModuleRes(RID_STR_QUERIES_CONTAINER)); - if (!_rTableName.Len()) - _rTableName = String(ModuleRes(RID_STR_TABLES_CONTAINER)); - - ImageProvider aImageProvider; - if (!_rQueryImage) - _rQueryImage = aImageProvider.getFolderImage( DatabaseObject::QUERY ); - if (!_rTableImage) - _rTableImage = aImageProvider.getFolderImage( DatabaseObject::TABLE ); - - if (!_rDbImage) - _rDbImage = aImageProvider.getDatabaseImage(); - - // add the entry for the data source - // special handling for data sources denoted by URLs - we do not want to display this ugly URL, do we? - // #i33699# - String sDSDisplayName, sDataSourceId; - getDataSourceDisplayName_isURL( _rDbName, sDSDisplayName, sDataSourceId ); - - SvLBoxEntry* pDatasourceEntry = m_pTreeView->getListBox().InsertEntry( sDSDisplayName, _rDbImage, _rDbImage, NULL, sal_False ); - DBTreeListUserData* pDSData = new DBTreeListUserData; - pDSData->eType = etDatasource; - pDSData->sAccessor = sDataSourceId; - pDSData->xConnection = _rxConnection; - pDatasourceEntry->SetUserData(pDSData); - - // the child for the queries container - { - DBTreeListUserData* pQueriesData = new DBTreeListUserData; - pQueriesData->eType = etQueryContainer; - - m_pTreeView->getListBox().InsertEntry( - _rQueryName, _rQueryImage, _rQueryImage, pDatasourceEntry, - sal_True /*ChildsOnDemand*/, LIST_APPEND, pQueriesData ); - } - - // the child for the tables container - { - DBTreeListUserData* pTablesData = new DBTreeListUserData; - pTablesData->eType = etTableContainer; - - m_pTreeView->getListBox().InsertEntry( - _rTableName, _rTableImage, _rTableImage, pDatasourceEntry, - sal_True /*ChildsOnDemand*/, LIST_APPEND, pTablesData ); - } - -} -// ------------------------------------------------------------------------- -void SbaTableQueryBrowser::initializeTreeModel() -{ - if (m_xDatabaseContext.is()) - { - Image aDBImage, aQueriesImage, aTablesImage; - String sQueriesName, sTablesName; - - // fill the model with the names of the registered datasources - Sequence< ::rtl::OUString > aDatasources = m_xDatabaseContext->getElementNames(); - const ::rtl::OUString* pIter = aDatasources.getConstArray(); - const ::rtl::OUString* pEnd = pIter + aDatasources.getLength(); - for (; pIter != pEnd; ++pIter) - implAddDatasource( *pIter, aDBImage, sQueriesName, aQueriesImage, sTablesName, aTablesImage, SharedConnection() ); - } -} -// ------------------------------------------------------------------------- -void SbaTableQueryBrowser::populateTree(const Reference<XNameAccess>& _xNameAccess, - SvLBoxEntry* _pParent, - EntryType _eEntryType) -{ - DBTreeListUserData* pData = static_cast<DBTreeListUserData*>(_pParent->GetUserData()); - if(pData) // don't ask if the nameaccess is already set see OnExpandEntry views and tables - pData->xContainer = _xNameAccess; - - try - { - Sequence< ::rtl::OUString > aNames = _xNameAccess->getElementNames(); - const ::rtl::OUString* pIter = aNames.getConstArray(); - const ::rtl::OUString* pEnd = pIter + aNames.getLength(); - for (; pIter != pEnd; ++pIter) - { - if( !m_pTreeView->getListBox().GetEntryPosByName(*pIter,_pParent)) - { - Reference<XNameAccess> xChild(_xNameAccess->getByName(*pIter),UNO_QUERY); - DBTreeListUserData* pEntryData = new DBTreeListUserData; - pEntryData->eType = _eEntryType; - if ( _eEntryType == etQuery && xChild.is() ) - { - pEntryData->eType = etQueryContainer; - } - implAppendEntry( _pParent, *pIter, pEntryData, pEntryData->eType ); - } - } - } - catch(const Exception&) - { - OSL_FAIL("SbaTableQueryBrowser::populateTree: could not fill the tree"); - } -} - -//------------------------------------------------------------------------------ -SvLBoxEntry* SbaTableQueryBrowser::implAppendEntry( SvLBoxEntry* _pParent, const String& _rName, void* _pUserData, EntryType _eEntryType ) -{ - ::std::auto_ptr< ImageProvider > pImageProvider( getImageProviderFor( _pParent ) ); - - Image aImage; - pImageProvider->getImages( _rName, getDatabaseObjectType( _eEntryType ), aImage ); - - SvLBoxEntry* pNewEntry = m_pTreeView->getListBox().InsertEntry( _rName, _pParent, _eEntryType == etQueryContainer , LIST_APPEND, _pUserData ); - - m_pTreeView->getListBox().SetExpandedEntryBmp( pNewEntry, aImage ); - m_pTreeView->getListBox().SetCollapsedEntryBmp( pNewEntry, aImage ); - - return pNewEntry; -} - -//------------------------------------------------------------------------------ -IMPL_LINK(SbaTableQueryBrowser, OnExpandEntry, SvLBoxEntry*, _pParent) -{ - if (_pParent->HasChilds()) - // nothing to to ... - return 1L; - - SvLBoxEntry* pFirstParent = m_pTreeView->getListBox().GetRootLevelParent(_pParent); - OSL_ENSURE(pFirstParent,"SbaTableQueryBrowser::OnExpandEntry: No rootlevelparent!"); - - DBTreeListUserData* pData = static_cast< DBTreeListUserData* >(_pParent->GetUserData()); - OSL_ENSURE(pData,"SbaTableQueryBrowser::OnExpandEntry: No user data!"); -#if OSL_DEBUG_LEVEL > 0 - SvLBoxString* pString = static_cast<SvLBoxString*>(pFirstParent->GetFirstItem(SV_ITEM_ID_BOLDLBSTRING)); - OSL_ENSURE(pString,"SbaTableQueryBrowser::OnExpandEntry: No string item!"); -#endif - - if (etTableContainer == pData->eType) - { - WaitObject aWaitCursor(getBrowserView()); - - // it could be that we already have a connection - SharedConnection xConnection; - ensureConnection( pFirstParent, xConnection ); - - if ( xConnection.is() ) - { - SQLExceptionInfo aInfo; - try - { - Reference< XWarningsSupplier > xWarnings(xConnection, UNO_QUERY); - if (xWarnings.is()) - xWarnings->clearWarnings(); - - // first insert the views because the tables can also include - // views but that time the bitmap is the wrong one - // the nameaccess will be overwriten in populateTree - Reference<XViewsSupplier> xViewSup(xConnection,UNO_QUERY); - if(xViewSup.is()) - populateTree( xViewSup->getViews(), _pParent, etTableOrView ); - - Reference<XTablesSupplier> xTabSup(xConnection,UNO_QUERY); - if(xTabSup.is()) - { - populateTree( xTabSup->getTables(), _pParent, etTableOrView ); - Reference<XContainer> xCont(xTabSup->getTables(),UNO_QUERY); - if(xCont.is()) - // add as listener to know when elements are inserted or removed - xCont->addContainerListener(this); - } - - if (xWarnings.is()) - { - SQLExceptionInfo aWarnings(xWarnings->getWarnings()); - if (aWarnings.isValid() && sal_False) - { - SQLContext aContext; - aContext.Message = String(ModuleRes(STR_OPENTABLES_WARNINGS)); - aContext.Details = String(ModuleRes(STR_OPENTABLES_WARNINGS_DETAILS)); - aContext.NextException = aWarnings.get(); - aWarnings = aContext; - showError(aWarnings); - } - // TODO: we need a better concept for these warnings: - // something like "don't show any warnings for this datasource, again" would be nice - // But this requires an extension of the InteractionHandler and an additional property on the data source - } - } - catch(const SQLContext& e) { aInfo = e; } - catch(const SQLWarning& e) { aInfo = e; } - catch(const SQLException& e) { aInfo = e; } - catch(const WrappedTargetException& e) - { - SQLException aSql; - if(e.TargetException >>= aSql) - aInfo = aSql; - else - OSL_FAIL("SbaTableQueryBrowser::OnExpandEntry: something strange happended!"); - } - catch( const Exception& ) - { - DBG_UNHANDLED_EXCEPTION(); - } - if (aInfo.isValid()) - showError(aInfo); - } - else - return 0L; - // 0 indicates that an error occurred - } - else - { // we have to expand the queries or bookmarks - if (ensureEntryObject(_pParent)) - { - DBTreeListUserData* pParentData = static_cast< DBTreeListUserData* >( _pParent->GetUserData() ); - Reference< XNameAccess > xCollection( pParentData->xContainer, UNO_QUERY ); - populateTree( xCollection, _pParent, etQuery ); - } - } - return 1L; -} - -//------------------------------------------------------------------------------ -sal_Bool SbaTableQueryBrowser::ensureEntryObject( SvLBoxEntry* _pEntry ) -{ - OSL_ENSURE(_pEntry, "SbaTableQueryBrowser::ensureEntryObject: invalid argument!"); - if (!_pEntry) - return sal_False; - - EntryType eType = getEntryType( _pEntry ); - - // the user data of the entry - DBTreeListUserData* pEntryData = static_cast<DBTreeListUserData*>(_pEntry->GetUserData()); - OSL_ENSURE(pEntryData,"ensureEntryObject: user data should already be set!"); - - SvLBoxEntry* pDataSourceEntry = m_pTreeView->getListBox().GetRootLevelParent(_pEntry); - - sal_Bool bSuccess = sal_False; - switch (eType) - { - case etQueryContainer: - if ( pEntryData->xContainer.is() ) - { - // nothing to do - bSuccess = sal_True; - break; - } - - { - SvLBoxEntry* pParent = m_pTreeView->getListBox().GetParent(_pEntry); - if ( pParent != pDataSourceEntry ) - { - SvLBoxString* pString = (SvLBoxString*)_pEntry->GetFirstItem(SV_ITEM_ID_BOLDLBSTRING); - OSL_ENSURE(pString,"There must be a string item!"); - ::rtl::OUString aName(pString->GetText()); - DBTreeListUserData* pData = static_cast<DBTreeListUserData*>(pParent->GetUserData()); - try - { - Reference< XNameAccess > xNameAccess(pData->xContainer,UNO_QUERY); - if ( xNameAccess.is() ) - pEntryData->xContainer.set(xNameAccess->getByName(aName),UNO_QUERY); - } - catch(const Exception& ) - { - DBG_UNHANDLED_EXCEPTION(); - } - - bSuccess = pEntryData->xContainer.is(); - } - else - { - try - { - Reference< XQueryDefinitionsSupplier > xQuerySup; - m_xDatabaseContext->getByName( getDataSourceAcessor( pDataSourceEntry ) ) >>= xQuerySup; - if (xQuerySup.is()) - { - Reference< XNameAccess > xQueryDefs = xQuerySup->getQueryDefinitions(); - Reference< XContainer > xCont(xQueryDefs, UNO_QUERY); - if (xCont.is()) - // add as listener to get notified if elements are inserted or removed - xCont->addContainerListener(this); - - pEntryData->xContainer = xQueryDefs; - bSuccess = pEntryData->xContainer.is(); - } - else { - OSL_FAIL("SbaTableQueryBrowser::ensureEntryObject: no XQueryDefinitionsSupplier interface!"); - } - } - catch( const Exception& ) - { - DBG_UNHANDLED_EXCEPTION(); - } - } - } - break; - - default: - OSL_FAIL("SbaTableQueryBrowser::ensureEntryObject: ooops ... missing some implementation here!"); - // TODO ... - break; - } - - return bSuccess; -} -//------------------------------------------------------------------------------ -sal_Bool SbaTableQueryBrowser::implSelect(const ::svx::ODataAccessDescriptor& _rDescriptor,sal_Bool _bSelectDirect) -{ - // extract the props - ::rtl::OUString sDataSource; - ::rtl::OUString sCommand; - sal_Int32 nCommandType = CommandType::COMMAND; - sal_Bool bEscapeProcessing = sal_True; - extractDescriptorProps(_rDescriptor, sDataSource, sCommand, nCommandType, bEscapeProcessing); - - // select it - return implSelect( sDataSource, sCommand, nCommandType, bEscapeProcessing, SharedConnection(), _bSelectDirect ); -} - -//------------------------------------------------------------------------------ -sal_Bool SbaTableQueryBrowser::implLoadAnything(const ::rtl::OUString& _rDataSourceName, const ::rtl::OUString& _rCommand, - const sal_Int32 _nCommandType, const sal_Bool _bEscapeProcessing, const SharedConnection& _rxConnection) -{ - try - { - Reference<XPropertySet> xProp( getRowSet(), UNO_QUERY_THROW ); - Reference< XLoadable > xLoadable( xProp, UNO_QUERY_THROW ); - // the values allowing the RowSet to re-execute - xProp->setPropertyValue(PROPERTY_DATASOURCENAME, makeAny(_rDataSourceName)); - if(_rxConnection.is()) - xProp->setPropertyValue( PROPERTY_ACTIVE_CONNECTION, makeAny( _rxConnection.getTyped() ) ); - - // set this _before_ setting the connection, else the rowset would rebuild it ... - xProp->setPropertyValue(PROPERTY_COMMAND_TYPE, makeAny(_nCommandType)); - xProp->setPropertyValue(PROPERTY_COMMAND, makeAny(_rCommand)); - xProp->setPropertyValue(PROPERTY_ESCAPE_PROCESSING, ::cppu::bool2any(_bEscapeProcessing)); - if ( m_bPreview ) - { - xProp->setPropertyValue(PROPERTY_FETCHDIRECTION, makeAny(FetchDirection::FORWARD)); - } - - // the formatter depends on the data source we're working on, so rebuild it here ... - initFormatter(); - - // switch the grid to design mode while loading - getBrowserView()->getGridControl()->setDesignMode(sal_True); - InitializeForm( xProp ); - - sal_Bool bSuccess = sal_True; - - { - { - Reference< XNameContainer > xColContainer(getFormComponent(), UNO_QUERY); - // first we have to clear the grid - clearGridColumns(xColContainer); - } - FormErrorHelper aHelper(this); - // load the form - bSuccess = reloadForm(xLoadable); - - // initialize the model - InitializeGridModel(getFormComponent()); - - Any aVal = xProp->getPropertyValue(PROPERTY_ISNEW); - if (aVal.hasValue() && ::comphelper::getBOOL(aVal)) - { - // then set the default values and the parameters given from the parent - Reference< XReset> xReset(xProp, UNO_QUERY); - xReset->reset(); - } - - if ( m_bPreview ) - initializePreviewMode(); - - LoadFinished(sal_True); - } - - InvalidateAll(); - return bSuccess; - } - catch( const SQLException& e ) - { - Any aException( ::cppu::getCaughtException() ); - showError( SQLExceptionInfo( aException ) ); - } - catch( const WrappedTargetException& e ) - { - SQLException aSql; - if ( e.TargetException.isExtractableTo( ::cppu::UnoType< SQLException >::get() ) ) - showError( SQLExceptionInfo( e.TargetException ) ); - else - { - DBG_UNHANDLED_EXCEPTION(); - } - } - catch(const Exception&) - { - DBG_UNHANDLED_EXCEPTION(); - } - - InvalidateAll(); - return sal_False; -} - -//------------------------------------------------------------------------------ -sal_Bool SbaTableQueryBrowser::implSelect(const ::rtl::OUString& _rDataSourceName, const ::rtl::OUString& _rCommand, - const sal_Int32 _nCommandType, const sal_Bool _bEscapeProcessing, - const SharedConnection& _rxConnection - ,sal_Bool _bSelectDirect) -{ - if (_rDataSourceName.getLength() && _rCommand.getLength() && (-1 != _nCommandType)) - { - SvLBoxEntry* pDataSource = NULL; - SvLBoxEntry* pCommandType = NULL; - SvLBoxEntry* pCommand = getObjectEntry( _rDataSourceName, _rCommand, _nCommandType, &pDataSource, &pCommandType, sal_True, _rxConnection ); - - if (pCommand) - { - bool bSuccess = true; - if ( _bSelectDirect ) - { - bSuccess = implSelect( pCommand ); - } - else - { - m_pTreeView->getListBox().Select( pCommand ); - } - - if ( bSuccess ) - { - m_pTreeView->getListBox().MakeVisible(pCommand); - m_pTreeView->getListBox().SetCursor(pCommand); - } - } - else if (!pCommandType) - { - if ( m_pCurrentlyDisplayed ) - { // tell the old entry (if any) it has been deselected - selectPath(m_pCurrentlyDisplayed, sal_False); - m_pCurrentlyDisplayed = NULL; - } - - // we have a command and need to display this in the rowset - return implLoadAnything(_rDataSourceName, _rCommand, _nCommandType, _bEscapeProcessing, _rxConnection); - } - } - return sal_False; -} - -//------------------------------------------------------------------------------ -IMPL_LINK(SbaTableQueryBrowser, OnSelectionChange, void*, /*NOINTERESTEDIN*/) -{ - return implSelect( m_pTreeView->getListBox().FirstSelected() ) ? 1L : 0L; -} -//------------------------------------------------------------------------------ -SvLBoxEntry* SbaTableQueryBrowser::implGetConnectionEntry(SvLBoxEntry* _pEntry) const -{ - SvLBoxEntry* pCurrentEntry = _pEntry; - DBTreeListUserData* pEntryData = static_cast< DBTreeListUserData* >( pCurrentEntry->GetUserData() ); - while(pEntryData->eType != etDatasource ) - { - pCurrentEntry = m_pTreeModel->GetParent(pCurrentEntry); - pEntryData = static_cast< DBTreeListUserData* >( pCurrentEntry->GetUserData() ); - } - return pCurrentEntry; -} -//------------------------------------------------------------------------------ -bool SbaTableQueryBrowser::implSelect( SvLBoxEntry* _pEntry ) -{ - if ( !_pEntry ) - return false; - - DBTreeListUserData* pEntryData = static_cast< DBTreeListUserData* >( _pEntry->GetUserData() ); - switch (pEntryData->eType) - { - case etTableOrView: - case etQuery: - break; - default: - // nothing to do - return false; - } - - OSL_ENSURE(m_pTreeModel->HasParent(_pEntry), "SbaTableQueryBrowser::implSelect: invalid entry (1)!"); - OSL_ENSURE(m_pTreeModel->HasParent(m_pTreeModel->GetParent(_pEntry)), "SbaTableQueryBrowser::implSelect: invalid entry (2)!"); - - // get the entry for the tables or queries - SvLBoxEntry* pContainer = m_pTreeModel->GetParent(_pEntry); - DBTreeListUserData* pContainerData = static_cast<DBTreeListUserData*>(pContainer->GetUserData()); - - // get the entry for the datasource - SvLBoxEntry* pConnection = implGetConnectionEntry(pContainer); - DBTreeListUserData* pConData = static_cast<DBTreeListUserData*>(pConnection->GetUserData()); - - // reinitialize the rowset - // but first check if it is necessary - // get all old properties - Reference<XPropertySet> xRowSetProps(getRowSet(),UNO_QUERY); - ::rtl::OUString aOldName; - xRowSetProps->getPropertyValue(PROPERTY_COMMAND) >>= aOldName; - sal_Int32 nOldType = 0; - xRowSetProps->getPropertyValue(PROPERTY_COMMAND_TYPE) >>= nOldType; - Reference<XConnection> xOldConnection(xRowSetProps->getPropertyValue(PROPERTY_ACTIVE_CONNECTION),UNO_QUERY); - - // the name of the table or query - SvLBoxString* pString = (SvLBoxString*)_pEntry->GetFirstItem(SV_ITEM_ID_BOLDLBSTRING); - OSL_ENSURE(pString,"There must be a string item!"); - const ::rtl::OUString sSimpleName = pString->GetText(); - ::rtl::OUStringBuffer sNameBuffer(sSimpleName); - if ( etQueryContainer == pContainerData->eType ) - { - SvLBoxEntry* pTemp = pContainer; - while( m_pTreeModel->GetParent(pTemp) != pConnection ) - { - sNameBuffer.insert(0,sal_Unicode('/')); - pString = (SvLBoxString*)pTemp->GetFirstItem(SV_ITEM_ID_BOLDLBSTRING); - OSL_ENSURE(pString,"There must be a string item!"); - sNameBuffer.insert(0,pString->GetText()); - pTemp = m_pTreeModel->GetParent(pTemp); - } - } - ::rtl::OUString aName = sNameBuffer.makeStringAndClear(); - - sal_Int32 nCommandType = ( etTableContainer == pContainerData->eType) - ? CommandType::TABLE - : CommandType::QUERY; - - // check if need to rebuild the rowset - sal_Bool bRebuild = ( xOldConnection != pConData->xConnection ) - || ( nOldType != nCommandType ) - || ( aName != aOldName ); - - Reference< ::com::sun::star::form::XLoadable > xLoadable = getLoadable(); - bRebuild |= !xLoadable->isLoaded(); - bool bSuccess = true; - if ( bRebuild ) - { - try - { - WaitObject aWaitCursor(getBrowserView()); - - // tell the old entry it has been deselected - selectPath(m_pCurrentlyDisplayed, sal_False); - m_pCurrentlyDisplayed = NULL; - - // not really loaded - m_pCurrentlyDisplayed = _pEntry; - // tell the new entry it has been selected - selectPath(m_pCurrentlyDisplayed, sal_True); - - // get the name of the data source currently selected - ensureConnection( m_pCurrentlyDisplayed, pConData->xConnection ); - - if ( !pConData->xConnection.is() ) - { - unloadAndCleanup( sal_False ); - return false; - } - - Reference<XNameAccess> xNameAccess; - switch(nCommandType) - { - case CommandType::TABLE: - { - // only for tables - if ( !pContainerData->xContainer.is() ) - { - Reference<XTablesSupplier> xSup( pConData->xConnection, UNO_QUERY ); - if(xSup.is()) - xNameAccess = xSup->getTables(); - - pContainerData->xContainer = xNameAccess; - } - else - xNameAccess.set( pContainerData->xContainer, UNO_QUERY ); - } - break; - case CommandType::QUERY: - { - if ( pContainerData->xContainer.is() ) - xNameAccess.set( pContainerData->xContainer, UNO_QUERY ); - else - { - Reference<XQueriesSupplier> xSup( pConData->xConnection, UNO_QUERY ); - if(xSup.is()) - xNameAccess = xSup->getQueries(); - } - } - break; - } - String sStatus(ModuleRes( CommandType::TABLE == nCommandType ? STR_LOADING_TABLE : STR_LOADING_QUERY )); - sStatus.SearchAndReplaceAscii("$name$", aName); - BrowserViewStatusDisplay aShowStatus(static_cast<UnoDataBrowserView*>(getView()), sStatus); - - - sal_Bool bEscapeProcessing = sal_True; - if(xNameAccess.is() && xNameAccess->hasByName(sSimpleName)) - { - DBTreeListUserData* pData = static_cast<DBTreeListUserData*>(_pEntry->GetUserData()); - if ( !pData->xObjectProperties.is() ) - { - Reference<XInterface> xObject; - if(xNameAccess->getByName(sSimpleName) >>= xObject) // remember the table or query object - { - pData->xObjectProperties = pData->xObjectProperties.query( xObject ); - // if the query contains a parameterized statement and preview is enabled we won't get any data. - if ( nCommandType == CommandType::QUERY && xObject.is() ) - { - Reference<XPropertySet> xObjectProps(xObject,UNO_QUERY); - xObjectProps->getPropertyValue(PROPERTY_ESCAPE_PROCESSING) >>= bEscapeProcessing; - if ( m_bPreview ) - { - ::rtl::OUString sSql; - xObjectProps->getPropertyValue(PROPERTY_COMMAND) >>= sSql; - Reference< XMultiServiceFactory > xFactory( pConData->xConnection, UNO_QUERY ); - if (xFactory.is()) - { - try - { - Reference<XSingleSelectQueryAnalyzer> xAnalyzer(xFactory->createInstance(SERVICE_NAME_SINGLESELECTQUERYCOMPOSER),UNO_QUERY); - if ( xAnalyzer.is() ) - { - xAnalyzer->setQuery(sSql); - Reference<XParametersSupplier> xParSup(xAnalyzer,UNO_QUERY); - if ( xParSup->getParameters()->getCount() > 0 ) - { - String sFilter = ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(" WHERE ")); - sFilter = sFilter + xAnalyzer->getFilter(); - String sReplace(sSql); - sReplace.SearchAndReplace(sFilter,String()); - xAnalyzer->setQuery(sReplace); - Reference<XSingleSelectQueryComposer> xComposer(xAnalyzer,UNO_QUERY); - xComposer->setFilter(::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("0=1"))); - aName = xAnalyzer->getQuery(); - nCommandType = CommandType::COMMAND; - } - } - } - catch (Exception&) - { - DBG_UNHANDLED_EXCEPTION(); - } - } - } - } - } - } - } - - String sDataSourceName( getDataSourceAcessor( pConnection ) ); - bSuccess = implLoadAnything( sDataSourceName, aName, nCommandType, bEscapeProcessing, pConData->xConnection ); - if ( !bSuccess ) - { // clean up - criticalFail(); - } - } - catch(const SQLException& e) - { - showError(SQLExceptionInfo(e)); - // reset the values - xRowSetProps->setPropertyValue(PROPERTY_DATASOURCENAME,Any()); - xRowSetProps->setPropertyValue(PROPERTY_ACTIVE_CONNECTION,Any()); - } - catch(WrappedTargetException& e) - { - SQLException aSql; - if(e.TargetException >>= aSql) - showError(SQLExceptionInfo(aSql)); - else - OSL_FAIL("SbaTableQueryBrowser::implSelect: something strange happended!"); - // reset the values - xRowSetProps->setPropertyValue(PROPERTY_DATASOURCENAME,Any()); - xRowSetProps->setPropertyValue(PROPERTY_ACTIVE_CONNECTION,Any()); - } - catch(const Exception&) - { - // reset the values - xRowSetProps->setPropertyValue(PROPERTY_DATASOURCENAME,Any()); - xRowSetProps->setPropertyValue(PROPERTY_ACTIVE_CONNECTION,Any()); - } - } - return bSuccess; -} - -// ----------------------------------------------------------------------------- -SvLBoxEntry* SbaTableQueryBrowser::getEntryFromContainer(const Reference<XNameAccess>& _rxNameAccess) -{ - DBTreeListBox& rListBox = m_pTreeView->getListBox(); - SvLBoxEntry* pContainer = NULL; - SvLBoxEntry* pDSLoop = rListBox.FirstChild(NULL); - while (pDSLoop) - { - pContainer = rListBox.GetEntry(pDSLoop, CONTAINER_QUERIES); - DBTreeListUserData* pQueriesData = static_cast<DBTreeListUserData*>(pContainer->GetUserData()); - if ( pQueriesData && pQueriesData->xContainer == _rxNameAccess ) - break; - - pContainer = rListBox.GetEntry(pDSLoop, CONTAINER_TABLES); - DBTreeListUserData* pTablesData = static_cast<DBTreeListUserData*>(pContainer->GetUserData()); - if ( pTablesData && pTablesData->xContainer == _rxNameAccess ) - break; - - pDSLoop = rListBox.NextSibling(pDSLoop); - pContainer = NULL; - } - return pContainer; -} - -// ------------------------------------------------------------------------- -void SAL_CALL SbaTableQueryBrowser::elementInserted( const ContainerEvent& _rEvent ) throw(RuntimeException) -{ - SolarMutexGuard aSolarGuard; - - Reference< XNameAccess > xNames(_rEvent.Source, UNO_QUERY); - // first search for a definition container where we can insert this element - - SvLBoxEntry* pEntry = getEntryFromContainer(xNames); - if(pEntry) // found one - { - // insert the new entry into the tree - DBTreeListUserData* pContainerData = static_cast<DBTreeListUserData*>(pEntry->GetUserData()); - OSL_ENSURE(pContainerData, "elementInserted: There must be user data for this type!"); - - DBTreeListUserData* pNewData = new DBTreeListUserData; - sal_Bool bIsTable = etTableContainer == pContainerData->eType; - if ( bIsTable ) - { - _rEvent.Element >>= pNewData->xObjectProperties;// remember the new element - pNewData->eType = etTableOrView; - } - else - { - if ((sal_Int32)m_pTreeView->getListBox().GetChildCount(pEntry) < ( xNames->getElementNames().getLength() - 1 ) ) - { - // the item inserts its children on demand, but it has not been expanded yet. So ensure here and - // now that it has all items - populateTree(xNames, pEntry, etQuery ); - } - pNewData->eType = etQuery; - } - implAppendEntry( pEntry, ::comphelper::getString( _rEvent.Accessor ), pNewData, pNewData->eType ); - } - else - SbaXDataBrowserController::elementInserted(_rEvent); -} -// ------------------------------------------------------------------------- -sal_Bool SbaTableQueryBrowser::isCurrentlyDisplayedChanged(const String& _sName,SvLBoxEntry* _pContainer) -{ - return m_pCurrentlyDisplayed - && getEntryType(m_pCurrentlyDisplayed) == getChildType(_pContainer) - && m_pTreeView->getListBox().GetParent(m_pCurrentlyDisplayed) == _pContainer - && m_pTreeView->getListBox().GetEntryText(m_pCurrentlyDisplayed) == _sName; -} -// ------------------------------------------------------------------------- -void SAL_CALL SbaTableQueryBrowser::elementRemoved( const ContainerEvent& _rEvent ) throw(RuntimeException) -{ - SolarMutexGuard aSolarGuard; - - Reference< XNameAccess > xNames(_rEvent.Source, UNO_QUERY); - // get the top-level representing the removed data source - // and search for the queries and tables - SvLBoxEntry* pContainer = getEntryFromContainer(xNames); - if ( pContainer ) - { // a query or table has been removed - String aName = ::comphelper::getString(_rEvent.Accessor).getStr(); - - if ( isCurrentlyDisplayedChanged( aName, pContainer) ) - { // the element displayed currently has been replaced - - // we need to remember the old value - SvLBoxEntry* pTemp = m_pCurrentlyDisplayed; - - // unload - unloadAndCleanup( sal_False ); // don't dispose the connection - - DBTreeListUserData* pData = static_cast<DBTreeListUserData*>(pTemp->GetUserData()); - pTemp->SetUserData(NULL); - delete pData; - // the data could be null because we have a table which isn't correct - m_pTreeModel->Remove(pTemp); - } - else - { - // remove the entry from the model - SvLBoxEntry* pChild = m_pTreeModel->FirstChild(pContainer); - while(pChild) - { - if (m_pTreeView->getListBox().GetEntryText(pChild) == aName) - { - DBTreeListUserData* pData = static_cast<DBTreeListUserData*>(pChild->GetUserData()); - pChild->SetUserData(NULL); - delete pData; - m_pTreeModel->Remove(pChild); - break; - } - pChild = m_pTreeModel->NextSibling(pChild); - } - } - - // maybe the object which is part of the document data source has been removed - checkDocumentDataSource(); - } - else - SbaXDataBrowserController::elementRemoved(_rEvent); -} - -// ------------------------------------------------------------------------- -void SAL_CALL SbaTableQueryBrowser::elementReplaced( const ContainerEvent& _rEvent ) throw(RuntimeException) -{ - SolarMutexGuard aSolarGuard; - - Reference< XNameAccess > xNames(_rEvent.Source, UNO_QUERY); - SvLBoxEntry* pContainer = getEntryFromContainer(xNames); - if ( pContainer ) - { // a table or query as been replaced - String aName = ::comphelper::getString(_rEvent.Accessor).getStr(); - - if ( isCurrentlyDisplayedChanged( aName, pContainer) ) - { // the element displayed currently has been replaced - - // we need to remember the old value - SvLBoxEntry* pTemp = m_pCurrentlyDisplayed; - unloadAndCleanup( sal_False ); // don't dispose the connection - - DBTreeListUserData* pData = static_cast<DBTreeListUserData*>(pTemp->GetUserData()); - if (pData) - { - if ( etTableOrView == pData->eType ) - { // only insert userdata when we have a table because the query is only a commanddefinition object and not a query - _rEvent.Element >>= pData->xObjectProperties; // remember the new element - } - else - { - pTemp->SetUserData(NULL); - delete pData; - } - } - } - else - { - // find the entry for this name - SvLBoxEntry* pChild = m_pTreeModel->FirstChild(pContainer); - while(pChild) - { - if (m_pTreeView->getListBox().GetEntryText(pChild) == aName) - { - DBTreeListUserData* pData = static_cast<DBTreeListUserData*>(pChild->GetUserData()); - if (pData) - { - if ( etTableOrView == pData->eType ) - { // only insert userdata when we have a table because the query is only a commanddefinition object and not a query - _rEvent.Element >>= pData->xObjectProperties; // remember the new element - } - else - { - pChild->SetUserData(NULL); - delete pData; - } - } - break; - } - pChild = m_pTreeModel->NextSibling(pChild); - } - } - - // maybe the object which is part of the document data source has been removed - checkDocumentDataSource(); - } - else if (xNames.get() == m_xDatabaseContext.get()) - { // a datasource has been replaced in the context - OSL_FAIL("SbaTableQueryBrowser::elementReplaced: no support for replaced data sources!"); - // very suspicious: the database context should not allow to replace data source, only to register - // and revoke them - } - else - SbaXDataBrowserController::elementReplaced(_rEvent); -} - -// ------------------------------------------------------------------------- -void SbaTableQueryBrowser::impl_releaseConnection( SharedConnection& _rxConnection ) -{ - // remove as event listener - Reference< XComponent > xComponent( _rxConnection, UNO_QUERY ); - if ( xComponent.is() ) - { - Reference< XEventListener > xListener( static_cast< ::cppu::OWeakObject* >( this ), UNO_QUERY ); - xComponent->removeEventListener( xListener ); - } - - try - { - // temporary (hopefully!) hack for #i55274# - Reference< XFlushable > xFlush( _rxConnection, UNO_QUERY ); - if ( xFlush.is() ) - xFlush->flush(); - } - catch( const Exception& ) - { - DBG_UNHANDLED_EXCEPTION(); - } - - // clear - _rxConnection.clear(); - // will implicitly dispose if we have the ownership, since xConnection is a SharedConnection -} - -// ------------------------------------------------------------------------- -void SbaTableQueryBrowser::disposeConnection( SvLBoxEntry* _pDSEntry ) -{ - OSL_ENSURE( _pDSEntry, "SbaTableQueryBrowser::disposeConnection: invalid entry (NULL)!" ); - OSL_ENSURE( impl_isDataSourceEntry( _pDSEntry ), "SbaTableQueryBrowser::disposeConnection: invalid entry (not top-level)!" ); - - if ( _pDSEntry ) - { - DBTreeListUserData* pTreeListData = static_cast< DBTreeListUserData* >( _pDSEntry->GetUserData() ); - if ( pTreeListData ) - impl_releaseConnection( pTreeListData->xConnection ); - } -} - -// ------------------------------------------------------------------------- -void SbaTableQueryBrowser::closeConnection(SvLBoxEntry* _pDSEntry,sal_Bool _bDisposeConnection) -{ - OSL_ENSURE(_pDSEntry, "SbaTableQueryBrowser::closeConnection: invalid entry (NULL)!"); - OSL_ENSURE( impl_isDataSourceEntry( _pDSEntry ), "SbaTableQueryBrowser::closeConnection: invalid entry (not top-level)!"); - - // if one of the entries of the given DS is displayed currently, unload the form - if (m_pCurrentlyDisplayed && (m_pTreeView->getListBox().GetRootLevelParent(m_pCurrentlyDisplayed) == _pDSEntry)) - unloadAndCleanup(_bDisposeConnection); - - // collapse the query/table container - for (SvLBoxEntry* pContainers = m_pTreeModel->FirstChild(_pDSEntry); pContainers; pContainers= m_pTreeModel->NextSibling(pContainers)) - { - SvLBoxEntry* pElements = m_pTreeModel->FirstChild(pContainers); - if ( pElements ) - m_pTreeView->getListBox().Collapse(pContainers); - m_pTreeView->getListBox().EnableExpandHandler(pContainers); - // and delete their children (they are connection-relative) - for (; pElements; ) - { - SvLBoxEntry* pRemove = pElements; - pElements= m_pTreeModel->NextSibling(pElements); - DBTreeListUserData* pData = static_cast<DBTreeListUserData*>(pRemove->GetUserData()); - pRemove->SetUserData(NULL); - delete pData; - m_pTreeModel->Remove(pRemove); - } - } - // collapse the entry itself - m_pTreeView->getListBox().Collapse(_pDSEntry); - - // dispose/reset the connection - if ( _bDisposeConnection ) - disposeConnection( _pDSEntry ); -} - -// ------------------------------------------------------------------------- -void SbaTableQueryBrowser::unloadAndCleanup( sal_Bool _bDisposeConnection ) -{ - if (!m_pCurrentlyDisplayed) - // nothing to do - return; - - SvLBoxEntry* pDSEntry = m_pTreeView->getListBox().GetRootLevelParent(m_pCurrentlyDisplayed); - - // de-select the path for the currently displayed table/query - if (m_pCurrentlyDisplayed) - { - selectPath(m_pCurrentlyDisplayed, sal_False); - } - m_pCurrentlyDisplayed = NULL; - - try - { - // get the active connection. We need to dispose it. - Reference< XPropertySet > xRowSetProps(getRowSet(),UNO_QUERY); - Reference< XConnection > xConn; - xRowSetProps->getPropertyValue(PROPERTY_ACTIVE_CONNECTION) >>= xConn; -#if OSL_DEBUG_LEVEL > 1 - { - Reference< XComponent > xComp; - ::cppu::extractInterface(xComp, xRowSetProps->getPropertyValue(PROPERTY_ACTIVE_CONNECTION)); - } -#endif - - // unload the form - Reference< XLoadable > xLoadable = getLoadable(); - if (xLoadable->isLoaded()) - xLoadable->unload(); - - // clear the grid control - Reference< XNameContainer > xConta(getControlModel(),UNO_QUERY); - clearGridColumns(xConta); - - // dispose the connection - if(_bDisposeConnection) - disposeConnection( pDSEntry ); - } - catch(SQLException& e) - { - showError(SQLExceptionInfo(e)); - } - catch(WrappedTargetException& e) - { - SQLException aSql; - if(e.TargetException >>= aSql) - showError(SQLExceptionInfo(aSql)); - else - OSL_FAIL("SbaTableQueryBrowser::unloadAndCleanup: something strange happended!"); - } - catch(const Exception&) - { - OSL_FAIL("SbaTableQueryBrowser::unloadAndCleanup: could not reset the form"); - } -} - -// ------------------------------------------------------------------------- -namespace -{ - Reference< XInterface > lcl_getDataSource( const Reference< XNameAccess >& _rxDatabaseContext, - const ::rtl::OUString& _rDataSourceName, const Reference< XConnection >& _rxConnection ) - { - Reference< XDataSource > xDataSource; - try - { - if ( _rDataSourceName.getLength() && _rxDatabaseContext->hasByName( _rDataSourceName ) ) - xDataSource.set( _rxDatabaseContext->getByName( _rDataSourceName ), UNO_QUERY_THROW ); - - if ( !xDataSource.is() ) - { - Reference< XChild > xConnAsChild( _rxConnection, UNO_QUERY ); - if ( xConnAsChild.is() ) - xDataSource.set( xConnAsChild->getParent(), UNO_QUERY_THROW ); - } - } - catch( const Exception& ) - { - DBG_UNHANDLED_EXCEPTION(); - } - return xDataSource.get(); - } -} - -// ------------------------------------------------------------------------- -void SbaTableQueryBrowser::impl_initialize() -{ - SolarMutexGuard aGuard; - // doin' a lot of VCL stuff here -> lock the SolarMutex - - // first initialize the parent - SbaXDataBrowserController::impl_initialize(); - - Reference<XConnection> xForeignConnection; - Reference< XFrame > xFrame; - - ::rtl::OUString aTableName, aCatalogName, aSchemaName; - - sal_Bool bEsacpeProcessing = sal_True; - sal_Int32 nInitialDisplayCommandType = CommandType::COMMAND; - ::rtl::OUString sInitialDataSourceName; - ::rtl::OUString sInitialCommand; - - const NamedValueCollection& rArguments( getInitParams() ); - - rArguments.get_ensureType( (::rtl::OUString)PROPERTY_DATASOURCENAME, sInitialDataSourceName ); - rArguments.get_ensureType( (::rtl::OUString)PROPERTY_COMMAND_TYPE, nInitialDisplayCommandType ); - rArguments.get_ensureType( (::rtl::OUString)PROPERTY_COMMAND, sInitialCommand ); - rArguments.get_ensureType( (::rtl::OUString)PROPERTY_ACTIVE_CONNECTION, xForeignConnection ); - rArguments.get_ensureType( (::rtl::OUString)PROPERTY_UPDATE_CATALOGNAME, aCatalogName ); - rArguments.get_ensureType( (::rtl::OUString)PROPERTY_UPDATE_SCHEMANAME, aSchemaName ); - rArguments.get_ensureType( (::rtl::OUString)PROPERTY_UPDATE_TABLENAME, aTableName ); - rArguments.get_ensureType( (::rtl::OUString)PROPERTY_ESCAPE_PROCESSING, bEsacpeProcessing ); - rArguments.get_ensureType( "Frame", xFrame ); - rArguments.get_ensureType( (::rtl::OUString)PROPERTY_SHOWMENU, m_bShowMenu ); - - // disable the browser if either of ShowTreeViewButton (compatibility name) or EnableBrowser - // is present and set to FALSE - sal_Bool bDisableBrowser = ( sal_False == rArguments.getOrDefault( "ShowTreeViewButton", sal_True ) ) // compatibility name - || ( sal_False == rArguments.getOrDefault( (::rtl::OUString)PROPERTY_ENABLE_BROWSER, sal_True ) ); - OSL_ENSURE( !rArguments.has( "ShowTreeViewButton" ), - "SbaTableQueryBrowser::impl_initialize: ShowTreeViewButton is superseded by EnableBrowser!" ); - m_bEnableBrowser = !bDisableBrowser; - - // hide the tree view it is disabled in general, or if the settings tell to hide it initially - sal_Bool bHideTreeView = ( !m_bEnableBrowser ) - || ( sal_False == rArguments.getOrDefault( "ShowTreeView", sal_True ) ) // compatibility name - || ( sal_False == rArguments.getOrDefault( (::rtl::OUString)PROPERTY_SHOW_BROWSER, sal_True ) ); - OSL_ENSURE( !rArguments.has( "ShowTreeView" ), - "SbaTableQueryBrowser::impl_initialize: ShowTreeView is superseded by ShowBrowser!" ); - - if ( bHideTreeView ) - hideExplorer(); - else - showExplorer(); - - if ( m_bPreview ) - { - try - { - Sequence< ::rtl::OUString> aProperties(5); - Sequence< Any> aValues(5); - - ::rtl::OUString* pStringIter = aProperties.getArray(); - Any* pValueIter = aValues.getArray(); - *pStringIter++ = ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("AlwaysShowCursor")); - *pValueIter++ <<= sal_False; - *pStringIter++ = PROPERTY_BORDER; - *pValueIter++ <<= sal_Int16(0); - - *pStringIter++ = ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("HasNavigationBar")); - *pValueIter++ <<= sal_False; - *pStringIter++ = ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("HasRecordMarker")); - *pValueIter++ <<= sal_False; - - *pStringIter++ = ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("Tabstop")); - *pValueIter++ <<= sal_False; - - Reference< XMultiPropertySet > xFormMultiSet(getFormComponent(), UNO_QUERY); - if ( xFormMultiSet.is() ) - xFormMultiSet->setPropertyValues(aProperties, aValues); - } - catch(const Exception&) - { - DBG_UNHANDLED_EXCEPTION(); - } - } - - // are we loaded into a (sub)frame of an embedded document (i.e. a form belonging to a database - // document)? - sal_Bool bSubFrameOfEmbeddedDocument = sal_False; - if ( xFrame.is() ) - { - Reference<XFramesSupplier> xSup = xFrame->getCreator(); - Reference<XController> xCont = xSup.is() ? xSup->getController() : Reference<XController>(); - - bSubFrameOfEmbeddedDocument = xCont.is() && ::dbtools::isEmbeddedInDatabase( xCont->getModel(), xForeignConnection ); - } - - // if we have a connection at this point, it was either passed from outside, our - // determined from a outer DB document. In both cases, do not dispose it later on. - SharedConnection xConnection( xForeignConnection, SharedConnection::NoTakeOwnership ); - - // should we display all registered databases in the left hand side tree? - // or only *one* special? - sal_Bool bLimitedTreeEntries = sal_False; - // if we're part of a frame which is a secondary frame of a database document, then only - // display the database for this document, not all registered ones - bLimitedTreeEntries |= bSubFrameOfEmbeddedDocument; - // if the tree view is not to be displayed at all, then only display the data source - // which was given as initial selection - bLimitedTreeEntries |= ( m_bEnableBrowser != sal_True ); - - if ( bLimitedTreeEntries ) - { - if ( xConnection.is() ) - { - startConnectionListening( xConnection ); - - // if no initial name was given, try to obtain one from the data source - if ( !sInitialDataSourceName.getLength() ) - { - Reference< XChild > xChild( xConnection, UNO_QUERY ); - Reference< XPropertySet > xDataSourceProperties; - if ( xChild.is() ) - xDataSourceProperties = xDataSourceProperties.query( xChild->getParent() ); - if ( xDataSourceProperties.is() ) - { - try - { - OSL_VERIFY( xDataSourceProperties->getPropertyValue( PROPERTY_NAME ) >>= sInitialDataSourceName ); - } - catch( const Exception& ) - { - OSL_FAIL( "SbaTableQueryBrowser::impl_initialize: a connection parent which does not have a 'Name'!??" ); - } - } - } - } - - implAddDatasource( sInitialDataSourceName, xConnection ); - m_pTreeView->getListBox().Expand( m_pTreeView->getListBox().First() ); - } - else - initializeTreeModel(); - - if ( m_bEnableBrowser ) - { - m_aDocScriptSupport = ::boost::optional< bool >( false ); - } - else - { - // we are not used as "browser", but as mere view for a single table/query/command. In particular, - // there is a specific database document which we belong to. - Reference< XOfficeDatabaseDocument > xDocument( getDataSourceOrModel( - lcl_getDataSource( m_xDatabaseContext, sInitialDataSourceName, xConnection ) ), UNO_QUERY ); - m_aDocScriptSupport = ::boost::optional< bool >( Reference< XEmbeddedScripts >( xDocument, UNO_QUERY ).is() ); - } - - if ( implSelect( sInitialDataSourceName, sInitialCommand, nInitialDisplayCommandType, bEsacpeProcessing, xConnection, sal_True ) ) - { - try - { - Reference< XPropertySet > xRowSetProps(getRowSet(), UNO_QUERY); - xRowSetProps->setPropertyValue(PROPERTY_UPDATE_CATALOGNAME,makeAny(aCatalogName)); - xRowSetProps->setPropertyValue(PROPERTY_UPDATE_SCHEMANAME,makeAny(aSchemaName)); - xRowSetProps->setPropertyValue(PROPERTY_UPDATE_TABLENAME,makeAny(aTableName)); - - } - catch(const Exception&) - { - OSL_FAIL("SbaTableQueryBrowser::impl_initialize: could not set the update related names!"); - } - } - - InvalidateAll(); -} - -// ------------------------------------------------------------------------- -sal_Bool SbaTableQueryBrowser::haveExplorer() const -{ - return m_pTreeView && m_pTreeView->IsVisible(); -} - -// ------------------------------------------------------------------------- -void SbaTableQueryBrowser::hideExplorer() -{ - if (!haveExplorer()) - return; - if (!getBrowserView()) - return; - - m_pTreeView->Hide(); - m_pSplitter->Hide(); - getBrowserView()->Resize(); - - InvalidateFeature(ID_BROWSER_EXPLORER); -} - -// ------------------------------------------------------------------------- -void SbaTableQueryBrowser::showExplorer() -{ - if (haveExplorer()) - return; - - if (!getBrowserView()) - return; - - m_pTreeView->Show(); - m_pSplitter->Show(); - getBrowserView()->Resize(); - - InvalidateFeature(ID_BROWSER_EXPLORER); -} - -// ----------------------------------------------------------------------------- -sal_Bool SbaTableQueryBrowser::ensureConnection(SvLBoxEntry* _pAnyEntry, SharedConnection& _rConnection) -{ - SvLBoxEntry* pDSEntry = m_pTreeView->getListBox().GetRootLevelParent(_pAnyEntry); - DBTreeListUserData* pDSData = - pDSEntry - ? static_cast<DBTreeListUserData*>(pDSEntry->GetUserData()) - : NULL; - - return ensureConnection( pDSEntry, pDSData, _rConnection ); -} - -// ----------------------------------------------------------------------------- -::std::auto_ptr< ImageProvider > SbaTableQueryBrowser::getImageProviderFor( SvLBoxEntry* _pAnyEntry ) -{ - ::std::auto_ptr< ImageProvider > pImageProvider( new ImageProvider ); - SharedConnection xConnection; - if ( getExistentConnectionFor( _pAnyEntry, xConnection ) ) - pImageProvider.reset( new ImageProvider( xConnection ) ); - return pImageProvider; -} - -// ----------------------------------------------------------------------------- -sal_Bool SbaTableQueryBrowser::getExistentConnectionFor( SvLBoxEntry* _pAnyEntry, SharedConnection& _rConnection ) -{ - SvLBoxEntry* pDSEntry = m_pTreeView->getListBox().GetRootLevelParent( _pAnyEntry ); - DBTreeListUserData* pDSData = - pDSEntry - ? static_cast< DBTreeListUserData* >( pDSEntry->GetUserData() ) - : NULL; - if ( pDSData ) - _rConnection = pDSData->xConnection; - return _rConnection.is(); -} - -#if OSL_DEBUG_LEVEL > 0 -// ----------------------------------------------------------------------------- -bool SbaTableQueryBrowser::impl_isDataSourceEntry( SvLBoxEntry* _pEntry ) const -{ - return m_pTreeModel->GetRootLevelParent( _pEntry ) == _pEntry; -} -#endif - -// ----------------------------------------------------------------------------- -sal_Bool SbaTableQueryBrowser::ensureConnection( SvLBoxEntry* _pDSEntry, void* pDSData, SharedConnection& _rConnection ) -{ - OSL_ENSURE( impl_isDataSourceEntry( _pDSEntry ), "SbaTableQueryBrowser::ensureConnection: this entry does not denote a data source!" ); - if(_pDSEntry) - { - DBTreeListUserData* pTreeListData = static_cast<DBTreeListUserData*>(pDSData); - ::rtl::OUString aDSName = GetEntryText(_pDSEntry); - - if ( pTreeListData ) - _rConnection = pTreeListData->xConnection; - - if ( !_rConnection.is() && pTreeListData ) - { - // show the "connecting to ..." status - String sConnecting(ModuleRes(STR_CONNECTING_DATASOURCE)); - sConnecting.SearchAndReplaceAscii("$name$", aDSName); - BrowserViewStatusDisplay aShowStatus(static_cast<UnoDataBrowserView*>(getView()), sConnecting); - - // build a string showing context information in case of error - String sConnectingContext( ModuleRes( STR_COULDNOTCONNECT_DATASOURCE ) ); - sConnectingContext.SearchAndReplaceAscii("$name$", aDSName); - - // connect - _rConnection.reset( - connect( getDataSourceAcessor( _pDSEntry ), sConnectingContext, NULL ), - SharedConnection::TakeOwnership - ); - - // remember the connection - pTreeListData->xConnection = _rConnection; - } - } - - return _rConnection.is(); -} - -// ----------------------------------------------------------------------------- -IMPL_LINK( SbaTableQueryBrowser, OnTreeEntryCompare, const SvSortData*, _pSortData ) -{ - SvLBoxEntry* pLHS = static_cast<SvLBoxEntry*>(_pSortData->pLeft); - SvLBoxEntry* pRHS = static_cast<SvLBoxEntry*>(_pSortData->pRight); - OSL_ENSURE(pLHS && pRHS, "SbaTableQueryBrowser::OnTreeEntryCompare: invalid tree entries!"); - // we want the table entry and the end so we have to do a check - - if (isContainer(pRHS)) - { - // don't use getEntryType (directly or indirecly) for the LHS: - // LHS is currently beeing inserted, so it is not "completely valid" at the moment - - const EntryType eRight = getEntryType(pRHS); - if (etTableContainer == eRight) - // every other container should be placed _before_ the bookmark container - return -1; - - const String sLeft = m_pTreeView->getListBox().GetEntryText(pLHS); - - EntryType eLeft = etTableContainer; - if (String(ModuleRes(RID_STR_TABLES_CONTAINER)) == sLeft) - eLeft = etTableContainer; - else if (String(ModuleRes(RID_STR_QUERIES_CONTAINER)) == sLeft) - eLeft = etQueryContainer; - - if ( eLeft == eRight ) - return COMPARE_EQUAL; - - if ( ( eLeft == etTableContainer ) && ( eRight == etQueryContainer ) ) - return COMPARE_GREATER; - - if ( ( eLeft == etQueryContainer ) && ( eRight == etTableContainer ) ) - return COMPARE_LESS; - - OSL_FAIL( "SbaTableQueryBrowser::OnTreeEntryCompare: unexpected case!" ); - return COMPARE_EQUAL; - } - - SvLBoxString* pLeftTextItem = static_cast<SvLBoxString*>(pLHS->GetFirstItem(SV_ITEM_ID_LBOXSTRING)); - SvLBoxString* pRightTextItem = static_cast<SvLBoxString*>(pRHS->GetFirstItem(SV_ITEM_ID_LBOXSTRING)); - OSL_ENSURE(pLeftTextItem && pRightTextItem, "SbaTableQueryBrowser::OnTreeEntryCompare: invalid text items!"); - - String sLeftText = pLeftTextItem->GetText(); - String sRightText = pRightTextItem->GetText(); - - sal_Int32 nCompareResult = 0; // equal by default - - if (m_xCollator.is()) - { - try - { - nCompareResult = m_xCollator->compareString(sLeftText, sRightText); - } - catch(const Exception&) - { - } - } - else - // default behaviour if we do not have a collator -> do the simple string compare - nCompareResult = sLeftText.CompareTo(sRightText); - - return nCompareResult; -} - -// ----------------------------------------------------------------------------- -void SbaTableQueryBrowser::implAdministrate( SvLBoxEntry* _pApplyTo ) -{ - OSL_PRECOND( _pApplyTo, "SbaTableQueryBrowser::implAdministrate: illegal entry!" ); - if ( !_pApplyTo ) - return; - - try - { - // get the desktop object - sal_Int32 nFrameSearchFlag = FrameSearchFlag::ALL | FrameSearchFlag::GLOBAL ; - Reference< XComponentLoader > xFrameLoader(getORB()->createInstance(SERVICE_FRAME_DESKTOP),UNO_QUERY); - - if ( xFrameLoader.is() ) - { - // the initial selection - SvLBoxEntry* pTopLevelSelected = _pApplyTo; - while (pTopLevelSelected && m_pTreeView->getListBox().GetParent(pTopLevelSelected)) - pTopLevelSelected = m_pTreeView->getListBox().GetParent(pTopLevelSelected); - ::rtl::OUString sInitialSelection; - if (pTopLevelSelected) - sInitialSelection = getDataSourceAcessor( pTopLevelSelected ); - - Reference< XDataSource > xDataSource( getDataSourceByName( sInitialSelection, getView(), getORB(), NULL ) ); - Reference< XModel > xDocumentModel( getDataSourceOrModel( xDataSource ), UNO_QUERY ); - - if ( xDocumentModel.is() ) - { - Reference< XInteractionHandler > xInteractionHandler( - getORB()->createInstance( - ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.task.InteractionHandler" ) ) ), - UNO_QUERY ); - OSL_ENSURE( xInteractionHandler.is(), "SbaTableQueryBrowser::implAdministrate: no interaction handler available!" ); - - ::comphelper::NamedValueCollection aLoadArgs; - aLoadArgs.put( "Model", xDocumentModel ); - aLoadArgs.put( "InteractionHandler", xInteractionHandler ); - aLoadArgs.put( "MacroExecutionMode", MacroExecMode::USE_CONFIG ); - - Sequence< PropertyValue > aLoadArgPV; - aLoadArgs >>= aLoadArgPV; - - xFrameLoader->loadComponentFromURL( - xDocumentModel->getURL(), - ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("_default")), - nFrameSearchFlag, - aLoadArgPV - ); - } - } - } - catch( const Exception& ) - { - DBG_UNHANDLED_EXCEPTION(); - } -} - -// ----------------------------------------------------------------------------- -sal_Bool SbaTableQueryBrowser::requestQuickHelp( const SvLBoxEntry* _pEntry, String& _rText ) const -{ - const DBTreeListUserData* pData = static_cast< const DBTreeListUserData* >( _pEntry->GetUserData() ); - if ( ( pData->eType == etDatasource ) && pData->sAccessor.Len() ) - { - _rText = ::svt::OFileNotation( pData->sAccessor ).get( ::svt::OFileNotation::N_SYSTEM ); - return sal_True; - } - return sal_False; -} - -// ----------------------------------------------------------------------------- -PopupMenu* SbaTableQueryBrowser::getContextMenu( Control& _rControl ) const -{ - OSL_PRECOND( &m_pTreeView->getListBox() == &_rControl, - "SbaTableQueryBrowser::getContextMenu: where does this come from?" ); - if ( &m_pTreeView->getListBox() != &_rControl ) - return NULL; - - return new PopupMenu( ModuleRes( MENU_BROWSER_DEFAULTCONTEXT ) ); -} - -// ----------------------------------------------------------------------------- -IController& SbaTableQueryBrowser::getCommandController() -{ - return *this; -} - -// ----------------------------------------------------------------------------- -::cppu::OInterfaceContainerHelper* SbaTableQueryBrowser::getContextMenuInterceptors() -{ - return &m_aContextMenuInterceptors; -} - -// ----------------------------------------------------------------------------- -Any SbaTableQueryBrowser::getCurrentSelection( Control& _rControl ) const -{ - OSL_PRECOND( &m_pTreeView->getListBox() == &_rControl, - "SbaTableQueryBrowser::getCurrentSelection: where does this come from?" ); - - if ( &m_pTreeView->getListBox() != &_rControl ) - return Any(); - - SvLBoxEntry* pSelected = m_pTreeView->getListBox().FirstSelected(); - if ( !pSelected ) - return Any(); - - OSL_ENSURE( m_pTreeView->getListBox().NextSelected( pSelected ) == NULL, - "SbaTableQueryBrowser::getCurrentSelection: single-selection is expected here!" ); - - NamedDatabaseObject aSelectedObject; - DBTreeListUserData* pData = static_cast< DBTreeListUserData* >( pSelected->GetUserData() ); - aSelectedObject.Type = static_cast< sal_Int32 >( pData->eType ); - - switch ( aSelectedObject.Type ) - { - case DatabaseObject::QUERY: - case DatabaseObject::TABLE: - aSelectedObject.Name = m_pTreeView->getListBox().GetEntryText( pSelected ); - break; - - case DatabaseObjectContainer::DATA_SOURCE: - case DatabaseObjectContainer::QUERIES: - case DatabaseObjectContainer::TABLES: - aSelectedObject.Name = getDataSourceAcessor( pSelected ); - break; - - default: - OSL_FAIL( "SbaTableQueryBrowser::getCurrentSelection: invalid (unexpected) object type!" ); - break; - } - - return makeAny( aSelectedObject ); -} - -// ----------------------------------------------------------------------------- -sal_Bool SbaTableQueryBrowser::implGetQuerySignature( ::rtl::OUString& _rCommand, sal_Bool& _bEscapeProcessing ) -{ - _rCommand = ::rtl::OUString(); - _bEscapeProcessing = sal_False; - - try - { - // contain the dss (data source signature) of the form - ::rtl::OUString sDataSourceName; - ::rtl::OUString sCommand; - sal_Int32 nCommandType = CommandType::COMMAND; - Reference< XPropertySet > xRowsetProps( getRowSet(), UNO_QUERY ); - ODataAccessDescriptor aDesc( xRowsetProps ); - sDataSourceName = aDesc.getDataSource(); - aDesc[ daCommand ] >>= sCommand; - aDesc[ daCommandType ] >>= nCommandType; - - // do we need to do anything? - if ( CommandType::QUERY != nCommandType ) - return sal_False; - - // get the query object - Reference< XQueryDefinitionsSupplier > xSuppQueries; - Reference< XNameAccess > xQueries; - Reference< XPropertySet > xQuery; - m_xDatabaseContext->getByName( sDataSourceName ) >>= xSuppQueries; - if ( xSuppQueries.is() ) - xQueries = xSuppQueries->getQueryDefinitions(); - if ( xQueries.is() ) - xQueries->getByName( sCommand ) >>= xQuery; - OSL_ENSURE( xQuery.is(), "SbaTableQueryBrowser::implGetQuerySignature: could not retrieve the query object!" ); - - // get the two properties we need - if ( xQuery.is() ) - { - xQuery->getPropertyValue( PROPERTY_COMMAND ) >>= _rCommand; - _bEscapeProcessing = ::cppu::any2bool( xQuery->getPropertyValue( PROPERTY_ESCAPE_PROCESSING ) ); - return sal_True; - } - } - catch( const Exception& ) - { - DBG_UNHANDLED_EXCEPTION(); - } - - return sal_False; -} -//------------------------------------------------------------------------------ -void SbaTableQueryBrowser::frameAction(const ::com::sun::star::frame::FrameActionEvent& aEvent) throw( RuntimeException ) -{ - if (aEvent.Frame == m_xCurrentFrameParent) - { - if(aEvent.Action == FrameAction_COMPONENT_DETACHING) - implRemoveStatusListeners(); - else if (aEvent.Action == FrameAction_COMPONENT_REATTACHED) - connectExternalDispatches(); - } - else - SbaXDataBrowserController::frameAction(aEvent); - -} -// ----------------------------------------------------------------------------- -void SbaTableQueryBrowser::clearGridColumns(const Reference< XNameContainer >& _xColContainer) -{ - // first we have to clear the grid - Sequence< ::rtl::OUString > aNames = _xColContainer->getElementNames(); - const ::rtl::OUString* pIter = aNames.getConstArray(); - const ::rtl::OUString* pEnd = pIter + aNames.getLength(); - Reference< XInterface > xColumn; - for (; pIter != pEnd;++pIter) - { - _xColContainer->getByName(*pIter) >>= xColumn; - _xColContainer->removeByName(*pIter); - ::comphelper::disposeComponent(xColumn); - } -} -// ----------------------------------------------------------------------------- -void SbaTableQueryBrowser::loadMenu(const Reference< XFrame >& _xFrame) -{ - if ( m_bShowMenu ) - { - OGenericUnoController::loadMenu(_xFrame); - } - else if ( !m_bPreview ) - { - Reference< ::com::sun::star::frame::XLayoutManager > xLayoutManager = getLayoutManager(_xFrame); - - if ( xLayoutManager.is() ) - { - xLayoutManager->lock(); - xLayoutManager->createElement( rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "private:resource/toolbar/toolbar" ))); - xLayoutManager->unlock(); - xLayoutManager->doLayout(); - } - onLoadedMenu( xLayoutManager ); - } -} -// ----------------------------------------------------------------------------- -::rtl::OUString SbaTableQueryBrowser::getPrivateTitle() const -{ - ::rtl::OUString sTitle; - if ( m_pCurrentlyDisplayed ) - { - SvLBoxEntry* pContainer = m_pTreeModel->GetParent(m_pCurrentlyDisplayed); - // get the entry for the datasource - SvLBoxEntry* pConnection = implGetConnectionEntry(pContainer); - ::rtl::OUString sName = m_pTreeView->getListBox().GetEntryText(m_pCurrentlyDisplayed); - sTitle = GetEntryText( pConnection ); - INetURLObject aURL(sTitle); - if ( aURL.GetProtocol() != INET_PROT_NOT_VALID ) - sTitle = aURL.getBase(INetURLObject::LAST_SEGMENT,true,INetURLObject::DECODE_WITH_CHARSET); - if ( sName.getLength() ) - { - sName += ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(" - ")); - sName += sTitle; - sTitle = sName; - } - } - - return sTitle; -} -// ----------------------------------------------------------------------------- -sal_Bool SbaTableQueryBrowser::preReloadForm() -{ - sal_Bool bIni = sal_False; - if ( !m_pCurrentlyDisplayed ) - { - // switch the grid to design mode while loading - getBrowserView()->getGridControl()->setDesignMode(sal_True); - // we had an invalid statement so we need to connect the column models - Reference<XPropertySet> xRowSetProps(getRowSet(),UNO_QUERY); - ::svx::ODataAccessDescriptor aDesc(xRowSetProps); - // extract the props - ::rtl::OUString sDataSource; - ::rtl::OUString sCommand; - sal_Int32 nCommandType = CommandType::COMMAND; - sal_Bool bEscapeProcessing = sal_True; - extractDescriptorProps(aDesc, sDataSource, sCommand, nCommandType, bEscapeProcessing); - if ( sDataSource.getLength() && sCommand.getLength() && (-1 != nCommandType) ) - { - SvLBoxEntry* pDataSource = NULL; - SvLBoxEntry* pCommandType = NULL; - m_pCurrentlyDisplayed = getObjectEntry( sDataSource, sCommand, nCommandType, &pDataSource, &pCommandType, sal_True, SharedConnection() ); - bIni = sal_True; - } - } - return bIni; -} - -// ----------------------------------------------------------------------------- -void SbaTableQueryBrowser::postReloadForm() -{ - InitializeGridModel(getFormComponent()); - LoadFinished(sal_True); -} - -//------------------------------------------------------------------------------ -Reference< XEmbeddedScripts > SAL_CALL SbaTableQueryBrowser::getScriptContainer() throw (RuntimeException) -{ - // update our database document - Reference< XModel > xDocument; - try - { - Reference< XPropertySet > xCursorProps( getRowSet(), UNO_QUERY_THROW ); - Reference< XConnection > xConnection( xCursorProps->getPropertyValue( PROPERTY_ACTIVE_CONNECTION ), UNO_QUERY ); - if ( xConnection.is() ) - { - Reference< XChild > xChild( xConnection, UNO_QUERY_THROW ); - Reference< XDocumentDataSource > xDataSource( xChild->getParent(), UNO_QUERY_THROW ); - xDocument.set( xDataSource->getDatabaseDocument(), UNO_QUERY_THROW ); - } - } - catch( const Exception& ) - { - DBG_UNHANDLED_EXCEPTION(); - } - Reference< XEmbeddedScripts > xScripts( xDocument, UNO_QUERY ); - OSL_ENSURE( xScripts.is() || !xDocument.is(), - "SbaTableQueryBrowser::getScriptContainer: invalid database document!" ); - return xScripts; -} - -//------------------------------------------------------------------------------ -void SAL_CALL SbaTableQueryBrowser::registerContextMenuInterceptor( const Reference< XContextMenuInterceptor >& _Interceptor ) throw (RuntimeException) -{ - if ( _Interceptor.is() ) - m_aContextMenuInterceptors.addInterface( _Interceptor ); -} - -//------------------------------------------------------------------------------ -void SAL_CALL SbaTableQueryBrowser::releaseContextMenuInterceptor( const Reference< XContextMenuInterceptor >& _Interceptor ) throw (RuntimeException) -{ - if ( _Interceptor.is() ) - m_aContextMenuInterceptors.removeInterface( _Interceptor ); -} - -//------------------------------------------------------------------------------ -void SAL_CALL SbaTableQueryBrowser::registeredDatabaseLocation( const DatabaseRegistrationEvent& _Event ) throw (RuntimeException) -{ - SolarMutexGuard aGuard; - implAddDatasource( _Event.Name, SharedConnection() ); -} - -//------------------------------------------------------------------------------ -void SbaTableQueryBrowser::impl_cleanupDataSourceEntry( const String& _rDataSourceName ) -{ - // get the top-level representing the removed data source - SvLBoxEntry* pDataSourceEntry = m_pTreeView->getListBox().FirstChild( NULL ); - while ( pDataSourceEntry ) - { - if ( m_pTreeView->getListBox().GetEntryText( pDataSourceEntry ) == _rDataSourceName ) - break; - - pDataSourceEntry = m_pTreeView->getListBox().NextSibling( pDataSourceEntry ); - } - - OSL_ENSURE( pDataSourceEntry, "SbaTableQueryBrowser::impl_cleanupDataSourceEntry: do not know this data source!" ); - if ( !pDataSourceEntry ) - return; - - if ( isSelected( pDataSourceEntry ) ) - { // a table or query belonging to the deleted data source is currently beeing displayed. - OSL_ENSURE( m_pTreeView->getListBox().GetRootLevelParent( m_pCurrentlyDisplayed ) == pDataSourceEntry, - "SbaTableQueryBrowser::impl_cleanupDataSourceEntry: inconsistence (1)!" ); - unloadAndCleanup( sal_True ); - } - else - OSL_ENSURE( - ( NULL == m_pCurrentlyDisplayed ) - || ( m_pTreeView->getListBox().GetRootLevelParent( m_pCurrentlyDisplayed ) != pDataSourceEntry ), - "SbaTableQueryBrowser::impl_cleanupDataSourceEntry: inconsistence (2)!"); - - // delete any user data of the child entries of the to-be-removed entry - SvTreeEntryList* pList = m_pTreeModel->GetChildList( pDataSourceEntry ); - if ( pList ) - { - for ( size_t i = 0, n = pList->size(); i < n; ++i ) - { - SvLBoxEntry* pEntryLoop = static_cast<SvLBoxEntry*>((*pList)[ i ]); - DBTreeListUserData* pData = static_cast< DBTreeListUserData* >( pEntryLoop->GetUserData() ); - pEntryLoop->SetUserData( NULL ); - delete pData; - } - } - - // remove the entry - DBTreeListUserData* pData = static_cast< DBTreeListUserData* >( pDataSourceEntry->GetUserData() ); - pDataSourceEntry->SetUserData( NULL ); - delete pData; - m_pTreeModel->Remove( pDataSourceEntry ); -} - -//------------------------------------------------------------------------------ -void SAL_CALL SbaTableQueryBrowser::revokedDatabaseLocation( const DatabaseRegistrationEvent& _Event ) throw (RuntimeException) -{ - SolarMutexGuard aGuard; - - impl_cleanupDataSourceEntry( _Event.Name ); - - // maybe the object which is part of the document data source has been removed - checkDocumentDataSource(); -} - -//------------------------------------------------------------------------------ -void SAL_CALL SbaTableQueryBrowser::changedDatabaseLocation( const DatabaseRegistrationEvent& _Event ) throw (RuntimeException) -{ - SolarMutexGuard aGuard; - - // in case the data source was expanded, and connected, we need to clean it up - // for simplicity, just do as if the data source were completely removed and re-added - impl_cleanupDataSourceEntry( _Event.Name ); - implAddDatasource( _Event.Name, SharedConnection() ); -} - - -// ......................................................................... -} // namespace dbaui -// ......................................................................... - - -/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ |