diff options
Diffstat (limited to 'dbaccess/source/ui/control/tabletree.cxx')
-rw-r--r-- | dbaccess/source/ui/control/tabletree.cxx | 685 |
1 files changed, 685 insertions, 0 deletions
diff --git a/dbaccess/source/ui/control/tabletree.cxx b/dbaccess/source/ui/control/tabletree.cxx new file mode 100644 index 000000000000..c1c12947cb9b --- /dev/null +++ b/dbaccess/source/ui/control/tabletree.cxx @@ -0,0 +1,685 @@ +/* -*- 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 "tabletree.hxx" +#include "tabletree.hrc" +#include "imageprovider.hxx" +#include "moduledbu.hxx" +#include "dbu_control.hrc" +#include <vcl/menu.hxx> +#include <connectivity/dbtools.hxx> +#include <comphelper/types.hxx> +#include "dbustrings.hrc" +#include <com/sun/star/sdb/application/DatabaseObject.hpp> +#include <com/sun/star/sdb/application/DatabaseObjectContainer.hpp> +#include <com/sun/star/sdbc/XDriverAccess.hpp> +#include <com/sun/star/sdbcx/XDataDefinitionSupplier.hpp> +#include <com/sun/star/sdbcx/XViewsSupplier.hpp> +#include <com/sun/star/sdbcx/XTablesSupplier.hpp> +#include <com/sun/star/sdb/SQLContext.hpp> +#include <com/sun/star/sdbc/XRow.hpp> +#include <com/sun/star/beans/XPropertySet.hpp> +#include "commontypes.hxx" +#include "listviewitems.hxx" +#include <tools/diagnose_ex.h> +#include <osl/diagnose.h> +#include <rtl/ustrbuf.hxx> +#include <connectivity/dbmetadata.hxx> + +#include <algorithm> +#include <o3tl/compat_functional.hxx> + +//......................................................................... +namespace dbaui +{ +//......................................................................... + +using namespace ::com::sun::star::uno; +using namespace ::com::sun::star::sdb; +using namespace ::com::sun::star::lang; +using namespace ::com::sun::star::sdbc; +using namespace ::com::sun::star::sdbcx; +using namespace ::com::sun::star::beans; +using namespace ::com::sun::star::container; +using namespace ::com::sun::star::sdb::application; + +using namespace ::dbtools; +using namespace ::comphelper; + +namespace DatabaseObject = ::com::sun::star::sdb::application::DatabaseObject; +namespace DatabaseObjectContainer = ::com::sun::star::sdb::application::DatabaseObjectContainer; + +//======================================================================== +//= OTableTreeListBox +//======================================================================== +OTableTreeListBox::OTableTreeListBox( Window* pParent, const Reference< XMultiServiceFactory >& _rxORB, WinBits nWinStyle,sal_Bool _bVirtualRoot ) + :OMarkableTreeListBox(pParent,_rxORB,nWinStyle) + ,m_pImageProvider( new ImageProvider ) + ,m_bVirtualRoot(_bVirtualRoot) + ,m_bNoEmptyFolders( false ) +{ + implSetDefaultImages(); +} +//------------------------------------------------------------------------ +OTableTreeListBox::OTableTreeListBox( Window* pParent, const Reference< XMultiServiceFactory >& _rxORB, const ResId& rResId ,sal_Bool _bVirtualRoot) + :OMarkableTreeListBox(pParent,_rxORB,rResId) + ,m_pImageProvider( new ImageProvider ) + ,m_bVirtualRoot(_bVirtualRoot) + ,m_bNoEmptyFolders( false ) +{ + implSetDefaultImages(); +} + +// ----------------------------------------------------------------------------- +OTableTreeListBox::~OTableTreeListBox() +{ +} + +// ----------------------------------------------------------------------------- +void OTableTreeListBox::implSetDefaultImages() +{ + ImageProvider aImageProvider; + SetDefaultExpandedEntryBmp( aImageProvider.getFolderImage( DatabaseObject::TABLE ) ); + SetDefaultCollapsedEntryBmp( aImageProvider.getFolderImage( DatabaseObject::TABLE ) ); +} + +// ----------------------------------------------------------------------------- +bool OTableTreeListBox::isFolderEntry( const SvLBoxEntry* _pEntry ) const +{ + sal_Int32 nEntryType = reinterpret_cast< sal_IntPtr >( _pEntry->GetUserData() ); + if ( ( nEntryType == DatabaseObjectContainer::TABLES ) + || ( nEntryType == DatabaseObjectContainer::CATALOG ) + || ( nEntryType == DatabaseObjectContainer::SCHEMA ) + ) + return true; + return false; +} + +// ----------------------------------------------------------------------------- +void OTableTreeListBox::notifyHiContrastChanged() +{ + implSetDefaultImages(); + + SvLBoxEntry* pEntryLoop = First(); + while (pEntryLoop) + { + sal_uInt16 nCount = pEntryLoop->ItemCount(); + for (sal_uInt16 i=0;i<nCount;++i) + { + SvLBoxItem* pItem = pEntryLoop->GetItem(i); + if ( pItem && pItem->IsA() == SV_ITEM_ID_LBOXCONTEXTBMP) + { + SvLBoxContextBmp* pContextBitmapItem = static_cast< SvLBoxContextBmp* >( pItem ); + + Image aImage; + if ( isFolderEntry( pEntryLoop ) ) + { + aImage = m_pImageProvider->getFolderImage( DatabaseObject::TABLE ); + } + else + { + String sCompleteName( getQualifiedTableName( pEntryLoop ) ); + m_pImageProvider->getImages( sCompleteName, DatabaseObject::TABLE, aImage ); + } + + pContextBitmapItem->SetBitmap1( aImage ); + pContextBitmapItem->SetBitmap2( aImage ); + break; + } + } + pEntryLoop = Next(pEntryLoop); + } +} + +//------------------------------------------------------------------------ +void OTableTreeListBox::implOnNewConnection( const Reference< XConnection >& _rxConnection ) +{ + m_xConnection = _rxConnection; + m_pImageProvider.reset( new ImageProvider( m_xConnection ) ); +} + +//------------------------------------------------------------------------ +void OTableTreeListBox::UpdateTableList( const Reference< XConnection >& _rxConnection ) throw(SQLException) +{ + Sequence< ::rtl::OUString > sTables, sViews; + + String sCurrentActionError; + try + { + Reference< XTablesSupplier > xTableSupp( _rxConnection, UNO_QUERY_THROW ); + sCurrentActionError = String(ModuleRes(STR_NOTABLEINFO)); + + Reference< XNameAccess > xTables,xViews; + + Reference< XViewsSupplier > xViewSupp( _rxConnection, UNO_QUERY ); + if ( xViewSupp.is() ) + { + xViews = xViewSupp->getViews(); + if (xViews.is()) + sViews = xViews->getElementNames(); + } + + xTables = xTableSupp->getTables(); + if (xTables.is()) + sTables = xTables->getElementNames(); + } + catch(RuntimeException&) + { + OSL_FAIL("OTableTreeListBox::UpdateTableList : caught an RuntimeException!"); + } + catch ( const SQLException& ) + { + throw; + } + catch(Exception&) + { + // a non-SQLException exception occurred ... simply throw an SQLException + SQLException aInfo; + aInfo.Message = sCurrentActionError; + throw aInfo; + } + + UpdateTableList( _rxConnection, sTables, sViews ); +} +// ----------------------------------------------------------------------------- +namespace +{ + struct OViewSetter : public ::std::unary_function< OTableTreeListBox::TNames::value_type, bool> + { + const Sequence< ::rtl::OUString> m_aViews; + ::comphelper::TStringMixEqualFunctor m_aEqualFunctor; + + OViewSetter(const Sequence< ::rtl::OUString>& _rViews,sal_Bool _bCase) : m_aViews(_rViews),m_aEqualFunctor(_bCase){} + OTableTreeListBox::TNames::value_type operator() (const ::rtl::OUString& lhs) + { + OTableTreeListBox::TNames::value_type aRet; + aRet.first = lhs; + const ::rtl::OUString* pIter = m_aViews.getConstArray(); + const ::rtl::OUString* pEnd = m_aViews.getConstArray() + m_aViews.getLength(); + aRet.second = (::std::find_if(pIter,pEnd,::std::bind2nd(m_aEqualFunctor,lhs)) != pEnd); + + return aRet; + } + }; + +} +// ----------------------------------------------------------------------------- +void OTableTreeListBox::UpdateTableList( + const Reference< XConnection >& _rxConnection, + const Sequence< ::rtl::OUString>& _rTables, + const Sequence< ::rtl::OUString>& _rViews + ) +{ + TNames aTables; + aTables.resize(_rTables.getLength()); + const ::rtl::OUString* pIter = _rTables.getConstArray(); + const ::rtl::OUString* pEnd = _rTables.getConstArray() + _rTables.getLength(); + try + { + Reference< XDatabaseMetaData > xMeta( _rxConnection->getMetaData(), UNO_QUERY_THROW ); + ::std::transform( pIter, pEnd, + aTables.begin(), OViewSetter( _rViews, xMeta->supportsMixedCaseQuotedIdentifiers() ) ); + } + catch(Exception&) + { + DBG_UNHANDLED_EXCEPTION(); + } + UpdateTableList( _rxConnection, aTables ); +} + +//------------------------------------------------------------------------ +namespace +{ + ::std::vector< ::rtl::OUString > lcl_getMetaDataStrings_throw( const Reference< XResultSet >& _rxMetaDataResult, sal_Int32 _nColumnIndex ) + { + ::std::vector< ::rtl::OUString > aStrings; + Reference< XRow > xRow( _rxMetaDataResult, UNO_QUERY_THROW ); + while ( _rxMetaDataResult->next() ) + aStrings.push_back( xRow->getString( _nColumnIndex ) ); + return aStrings; + } + + bool lcl_shouldDisplayEmptySchemasAndCatalogs( const Reference< XConnection >& _rxConnection ) + { + ::dbtools::DatabaseMetaData aMetaData( _rxConnection ); + return aMetaData.displayEmptyTableFolders(); + } +} + +//------------------------------------------------------------------------ +void OTableTreeListBox::UpdateTableList( const Reference< XConnection >& _rxConnection, const TNames& _rTables ) +{ + implOnNewConnection( _rxConnection ); + + // throw away all the old stuff + Clear(); + + try + { + if (haveVirtualRoot()) + { + String sRootEntryText; + TNames::const_iterator aViews = ::std::find_if(_rTables.begin(),_rTables.end(), + ::o3tl::compose1(::std::bind2nd(::std::equal_to<sal_Bool>(),sal_False),::o3tl::select2nd<TNames::value_type>())); + TNames::const_iterator aTables = ::std::find_if(_rTables.begin(),_rTables.end(), + ::o3tl::compose1(::std::bind2nd(::std::equal_to<sal_Bool>(),sal_True),::o3tl::select2nd<TNames::value_type>())); + + if ( aViews == _rTables.end() ) + sRootEntryText = String(ModuleRes(STR_ALL_TABLES)); + else if ( aTables == _rTables.end() ) + sRootEntryText = String(ModuleRes(STR_ALL_VIEWS)); + else + sRootEntryText = String(ModuleRes(STR_ALL_TABLES_AND_VIEWS)); + InsertEntry( sRootEntryText, NULL, sal_False, LIST_APPEND, reinterpret_cast< void* >( DatabaseObjectContainer::TABLES ) ); + } + + if ( _rTables.empty() ) + // nothing to do (besides inserting the root entry) + return; + + // get the table/view names + TNames::const_iterator aIter = _rTables.begin(); + TNames::const_iterator aEnd = _rTables.end(); + + Reference< XDatabaseMetaData > xMeta( _rxConnection->getMetaData(), UNO_QUERY_THROW ); + for ( ; aIter != aEnd; ++aIter ) + { + // add the entry + implAddEntry( + xMeta, + aIter->first, + sal_False + ); + } + + if ( !m_bNoEmptyFolders && lcl_shouldDisplayEmptySchemasAndCatalogs( _rxConnection ) ) + { + sal_Bool bSupportsCatalogs = xMeta->supportsCatalogsInDataManipulation(); + sal_Bool bSupportsSchemas = xMeta->supportsSchemasInDataManipulation(); + + if ( bSupportsCatalogs || bSupportsSchemas ) + { + // we display empty catalogs if the DB supports catalogs, and they're noted at the beginning of a + // composed name. Otherwise, we display empty schematas. (also see the tree structure explained in + // implAddEntry) + bool bCatalogs = bSupportsCatalogs && xMeta->isCatalogAtStart(); + + ::std::vector< ::rtl::OUString > aFolderNames( lcl_getMetaDataStrings_throw( + bCatalogs ? xMeta->getCatalogs() : xMeta->getSchemas(), 1 ) ); + sal_Int32 nFolderType = bCatalogs ? DatabaseObjectContainer::CATALOG : DatabaseObjectContainer::SCHEMA; + + SvLBoxEntry* pRootEntry = getAllObjectsEntry(); + for ( ::std::vector< ::rtl::OUString >::const_iterator folder = aFolderNames.begin(); + folder != aFolderNames.end(); + ++folder + ) + { + SvLBoxEntry* pFolder = GetEntryPosByName( *folder, pRootEntry ); + if ( !pFolder ) + pFolder = InsertEntry( *folder, pRootEntry, sal_False, LIST_APPEND, reinterpret_cast< void* >( nFolderType ) ); + } + } + } + } + catch ( const Exception& ) + { + DBG_UNHANDLED_EXCEPTION(); + } +} +//------------------------------------------------------------------------ +sal_Bool OTableTreeListBox::isWildcardChecked(SvLBoxEntry* _pEntry) const +{ + if (_pEntry) + { + OBoldListboxString* pTextItem = static_cast<OBoldListboxString*>(_pEntry->GetFirstItem(SV_ITEM_ID_BOLDLBSTRING)); + if (pTextItem) + return pTextItem->isEmphasized(); + } + return sal_False; +} + +//------------------------------------------------------------------------ +void OTableTreeListBox::checkWildcard(SvLBoxEntry* _pEntry) +{ + SetCheckButtonState(_pEntry, SV_BUTTON_CHECKED); + checkedButton_noBroadcast(_pEntry); +} + +//------------------------------------------------------------------------ +SvLBoxEntry* OTableTreeListBox::getAllObjectsEntry() const +{ + return haveVirtualRoot() ? First() : NULL; +} + +//------------------------------------------------------------------------ +void OTableTreeListBox::checkedButton_noBroadcast(SvLBoxEntry* _pEntry) +{ + OMarkableTreeListBox::checkedButton_noBroadcast(_pEntry); + + // if an entry has children, it makes a difference if the entry is checked + // because all children are checked or if the user checked it explicitly. + // So we track explicit (un)checking + + SvButtonState eState = GetCheckButtonState(_pEntry); + OSL_ENSURE(SV_BUTTON_TRISTATE != eState, "OTableTreeListBox::CheckButtonHdl: user action which lead to TRISTATE?"); + implEmphasize(_pEntry, SV_BUTTON_CHECKED == eState); +} + +//------------------------------------------------------------------------ +void OTableTreeListBox::implEmphasize(SvLBoxEntry* _pEntry, sal_Bool _bChecked, sal_Bool _bUpdateDescendants, sal_Bool _bUpdateAncestors) +{ + OSL_ENSURE(_pEntry, "OTableTreeListBox::implEmphasize: invalid entry (NULL)!"); + + // special emphasizing handling for the "all objects" entry + sal_Bool bAllObjectsEntryAffected = haveVirtualRoot() && (getAllObjectsEntry() == _pEntry); + if ( GetModel()->HasChilds(_pEntry) // the entry has children + || bAllObjectsEntryAffected // or it is the "all objects" entry + ) + { + OBoldListboxString* pTextItem = static_cast<OBoldListboxString*>(_pEntry->GetFirstItem(SV_ITEM_ID_BOLDLBSTRING)); + if (pTextItem) + pTextItem->emphasize(_bChecked); + + if (bAllObjectsEntryAffected) + InvalidateEntry(_pEntry); + } + + if (_bUpdateDescendants) + { + // remove the mark for all children of the checked entry + SvLBoxEntry* pChildLoop = FirstChild(_pEntry); + while (pChildLoop) + { + if (GetModel()->HasChilds(pChildLoop)) + implEmphasize(pChildLoop, sal_False, sal_True, sal_False); + pChildLoop = NextSibling(pChildLoop); + } + } + + if (_bUpdateAncestors) + { + // remove the mark for all ancestors of the entry + if (GetModel()->HasParent(_pEntry)) + implEmphasize(GetParent(_pEntry), sal_False, sal_False, sal_True); + } +} + +//------------------------------------------------------------------------ +void OTableTreeListBox::InitEntry(SvLBoxEntry* _pEntry, const XubString& _rString, const Image& _rCollapsedBitmap, const Image& _rExpandedBitmap, SvLBoxButtonKind _eButtonKind) +{ + OMarkableTreeListBox::InitEntry(_pEntry, _rString, _rCollapsedBitmap, _rExpandedBitmap, _eButtonKind); + + // replace the text item with our own one + SvLBoxItem* pTextItem = _pEntry->GetFirstItem(SV_ITEM_ID_LBOXSTRING); + OSL_ENSURE(pTextItem, "OTableTreeListBox::InitEntry: no text item!?"); + sal_uInt16 nTextPos = _pEntry->GetPos(pTextItem); + OSL_ENSURE(((sal_uInt16)-1) != nTextPos, "OTableTreeListBox::InitEntry: no text item pos!"); + + _pEntry->ReplaceItem(new OBoldListboxString(_pEntry, 0, _rString), nTextPos); +} + +//------------------------------------------------------------------------ +SvLBoxEntry* OTableTreeListBox::implAddEntry( + const Reference< XDatabaseMetaData >& _rxMeta, + const ::rtl::OUString& _rTableName, + sal_Bool _bCheckName + ) +{ + OSL_PRECOND( _rxMeta.is(), "OTableTreeListBox::implAddEntry: invalid meta data!" ); + if ( !_rxMeta.is() ) + return NULL; + + // split the complete name into it's components + ::rtl::OUString sCatalog, sSchema, sName; + qualifiedNameComponents( _rxMeta, _rTableName, sCatalog, sSchema, sName, ::dbtools::eInDataManipulation ); + + SvLBoxEntry* pParentEntry = getAllObjectsEntry(); + + // if the DB uses catalog at the start of identifiers, then our hierarchy is + // catalog + // +- schema + // +- table + // else it is + // schema + // +- catalog + // +- table + sal_Bool bCatalogAtStart = _rxMeta->isCatalogAtStart(); + const ::rtl::OUString& rFirstName = bCatalogAtStart ? sCatalog : sSchema; + const sal_Int32 nFirstFolderType = bCatalogAtStart ? DatabaseObjectContainer::CATALOG : DatabaseObjectContainer::SCHEMA; + const ::rtl::OUString& rSecondName = bCatalogAtStart ? sSchema : sCatalog; + const sal_Int32 nSecondFolderType = bCatalogAtStart ? DatabaseObjectContainer::SCHEMA : DatabaseObjectContainer::CATALOG; + + if ( rFirstName.getLength() ) + { + SvLBoxEntry* pFolder = GetEntryPosByName( rFirstName, pParentEntry ); + if ( !pFolder ) + pFolder = InsertEntry( rFirstName, pParentEntry, sal_False, LIST_APPEND, reinterpret_cast< void* >( nFirstFolderType ) ); + pParentEntry = pFolder; + } + + if ( rSecondName.getLength() ) + { + SvLBoxEntry* pFolder = GetEntryPosByName( rSecondName, pParentEntry ); + if ( !pFolder ) + pFolder = InsertEntry( rSecondName, pParentEntry, sal_False, LIST_APPEND, reinterpret_cast< void* >( nSecondFolderType ) ); + pParentEntry = pFolder; + } + + SvLBoxEntry* pRet = NULL; + if ( !_bCheckName || !GetEntryPosByName( sName, pParentEntry ) ) + { + pRet = InsertEntry( sName, pParentEntry, sal_False, LIST_APPEND ); + + Image aImage; + m_pImageProvider->getImages( _rTableName, DatabaseObject::TABLE, aImage ); + + SetExpandedEntryBmp( pRet, aImage ); + SetCollapsedEntryBmp( pRet, aImage ); + } + return pRet; +} + +//------------------------------------------------------------------------ +NamedDatabaseObject OTableTreeListBox::describeObject( SvLBoxEntry* _pEntry ) +{ + NamedDatabaseObject aObject; + + sal_Int32 nEntryType = reinterpret_cast< sal_IntPtr >( _pEntry->GetUserData() ); + + if ( nEntryType == DatabaseObjectContainer::TABLES ) + { + aObject.Type = DatabaseObjectContainer::TABLES; + } + else if ( ( nEntryType == DatabaseObjectContainer::CATALOG ) + || ( nEntryType == DatabaseObjectContainer::SCHEMA ) + ) + { + SvLBoxEntry* pParent = GetParent( _pEntry ); + sal_Int32 nParentEntryType = pParent ? reinterpret_cast< sal_IntPtr >( pParent->GetUserData() ) : -1; + + ::rtl::OUStringBuffer buffer; + if ( nEntryType == DatabaseObjectContainer::CATALOG ) + { + if ( nParentEntryType == DatabaseObjectContainer::SCHEMA ) + { + buffer.append( GetEntryText( pParent ) ); + buffer.append( sal_Unicode( '.' ) ); + } + buffer.append( GetEntryText( _pEntry ) ); + } + else if ( nEntryType == DatabaseObjectContainer::SCHEMA ) + { + if ( nParentEntryType == DatabaseObjectContainer::CATALOG ) + { + buffer.append( GetEntryText( pParent ) ); + buffer.append( sal_Unicode( '.' ) ); + } + buffer.append( GetEntryText( _pEntry ) ); + } + } + else + { + aObject.Type = DatabaseObject::TABLE; + aObject.Name = getQualifiedTableName( _pEntry ); + } + + return aObject; +} + +//------------------------------------------------------------------------ +SvLBoxEntry* OTableTreeListBox::addedTable( const ::rtl::OUString& _rName ) +{ + try + { + Reference< XDatabaseMetaData > xMeta; + if ( impl_getAndAssertMetaData( xMeta ) ) + return implAddEntry( xMeta, _rName ); + } + catch( const Exception& ) + { + DBG_UNHANDLED_EXCEPTION(); + } + return NULL; +} + +//------------------------------------------------------------------------ +bool OTableTreeListBox::impl_getAndAssertMetaData( Reference< XDatabaseMetaData >& _out_rMetaData ) const +{ + if ( m_xConnection.is() ) + _out_rMetaData = m_xConnection->getMetaData(); + OSL_PRECOND( _out_rMetaData.is(), "OTableTreeListBox::impl_getAndAssertMetaData: invalid current connection!" ); + return _out_rMetaData.is(); +} + +//------------------------------------------------------------------------ +String OTableTreeListBox::getQualifiedTableName( SvLBoxEntry* _pEntry ) const +{ + OSL_PRECOND( !isFolderEntry( _pEntry ), "OTableTreeListBox::getQualifiedTableName: folder entries not allowed here!" ); + + try + { + Reference< XDatabaseMetaData > xMeta; + if ( !impl_getAndAssertMetaData( xMeta ) ) + return String(); + + ::rtl::OUString sCatalog; + ::rtl::OUString sSchema; + ::rtl::OUString sTable; + + SvLBoxEntry* pSchema = GetParent( _pEntry ); + if ( pSchema ) + { + SvLBoxEntry* pCatalog = GetParent( pSchema ); + if ( pCatalog + || ( xMeta->supportsCatalogsInDataManipulation() + && !xMeta->supportsSchemasInDataManipulation() + ) // here we support catalog but no schema + ) + { + if ( pCatalog == NULL ) + { + pCatalog = pSchema; + pSchema = NULL; + } + sCatalog = GetEntryText( pCatalog ); + } + if ( pSchema ) + sSchema = GetEntryText(pSchema); + } + sTable = GetEntryText( _pEntry ); + + return ::dbtools::composeTableName( xMeta, sCatalog, sSchema, sTable, sal_False, ::dbtools::eInDataManipulation ); + } + catch( const Exception& ) + { + DBG_UNHANDLED_EXCEPTION(); + } + return String(); +} + +//------------------------------------------------------------------------ +SvLBoxEntry* OTableTreeListBox::getEntryByQualifiedName( const ::rtl::OUString& _rName ) +{ + try + { + Reference< XDatabaseMetaData > xMeta; + if ( !impl_getAndAssertMetaData( xMeta ) ) + return NULL; + + // split the complete name into it's components + ::rtl::OUString sCatalog, sSchema, sName; + qualifiedNameComponents(xMeta, _rName, sCatalog, sSchema, sName,::dbtools::eInDataManipulation); + + SvLBoxEntry* pParent = getAllObjectsEntry(); + SvLBoxEntry* pCat = NULL; + SvLBoxEntry* pSchema = NULL; + if ( sCatalog.getLength() ) + { + pCat = GetEntryPosByName(sCatalog, pParent); + if ( pCat ) + pParent = pCat; + } + + if ( sSchema.getLength() ) + { + pSchema = GetEntryPosByName(sSchema, pParent); + if ( pSchema ) + pParent = pSchema; + } + + return GetEntryPosByName(sName, pParent); + } + catch( const Exception& ) + { + DBG_UNHANDLED_EXCEPTION(); + } + return NULL; +} +//------------------------------------------------------------------------ +void OTableTreeListBox::removedTable( const ::rtl::OUString& _rName ) +{ + try + { + SvLBoxEntry* pEntry = getEntryByQualifiedName( _rName ); + if ( pEntry ) + GetModel()->Remove( pEntry ); + } + catch( const Exception& ) + { + DBG_UNHANDLED_EXCEPTION(); + } +} + +//......................................................................... +} // namespace dbaui +//......................................................................... + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ |