196de5490SAndrew Rist /**************************************************************
2cdf0e10cSrcweir *
396de5490SAndrew Rist * Licensed to the Apache Software Foundation (ASF) under one
496de5490SAndrew Rist * or more contributor license agreements. See the NOTICE file
596de5490SAndrew Rist * distributed with this work for additional information
696de5490SAndrew Rist * regarding copyright ownership. The ASF licenses this file
796de5490SAndrew Rist * to you under the Apache License, Version 2.0 (the
896de5490SAndrew Rist * "License"); you may not use this file except in compliance
996de5490SAndrew Rist * with the License. You may obtain a copy of the License at
1096de5490SAndrew Rist *
1196de5490SAndrew Rist * http://www.apache.org/licenses/LICENSE-2.0
1296de5490SAndrew Rist *
1396de5490SAndrew Rist * Unless required by applicable law or agreed to in writing,
1496de5490SAndrew Rist * software distributed under the License is distributed on an
1596de5490SAndrew Rist * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
1696de5490SAndrew Rist * KIND, either express or implied. See the License for the
1796de5490SAndrew Rist * specific language governing permissions and limitations
1896de5490SAndrew Rist * under the License.
1996de5490SAndrew Rist *
2096de5490SAndrew Rist *************************************************************/
2196de5490SAndrew Rist
2296de5490SAndrew Rist
23cdf0e10cSrcweir
24cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove
25*b63233d8Sdamjan #include "precompiled_dbui.hxx"
26cdf0e10cSrcweir
27cdf0e10cSrcweir #ifndef _DBAUI_TABLETREE_HXX_
28cdf0e10cSrcweir #include "tabletree.hxx"
29cdf0e10cSrcweir #endif
30cdf0e10cSrcweir #ifndef _DBAUI_TABLETREE_HRC_
31cdf0e10cSrcweir #include "tabletree.hrc"
32cdf0e10cSrcweir #endif
33cdf0e10cSrcweir #ifndef DBACCESS_IMAGEPROVIDER_HXX
34cdf0e10cSrcweir #include "imageprovider.hxx"
35cdf0e10cSrcweir #endif
36cdf0e10cSrcweir #ifndef _DBAUI_MODULE_DBU_HXX_
37cdf0e10cSrcweir #include "moduledbu.hxx"
38cdf0e10cSrcweir #endif
39cdf0e10cSrcweir #ifndef _DBU_CONTROL_HRC_
40cdf0e10cSrcweir #include "dbu_control.hrc"
41cdf0e10cSrcweir #endif
42cdf0e10cSrcweir #ifndef _SV_MENU_HXX
43cdf0e10cSrcweir #include <vcl/menu.hxx>
44cdf0e10cSrcweir #endif
45cdf0e10cSrcweir #ifndef _CONNECTIVITY_DBTOOLS_HXX_
46cdf0e10cSrcweir #include <connectivity/dbtools.hxx>
47cdf0e10cSrcweir #endif
48cdf0e10cSrcweir #ifndef _COMPHELPER_TYPES_HXX_
49cdf0e10cSrcweir #include <comphelper/types.hxx>
50cdf0e10cSrcweir #endif
51cdf0e10cSrcweir #ifndef DBACCESS_SHARED_DBUSTRINGS_HRC
52cdf0e10cSrcweir #include "dbustrings.hrc"
53cdf0e10cSrcweir #endif
54cdf0e10cSrcweir #ifndef _COM_SUN_STAR_SDB_APPLICATION_DATABASEOBJECT_HPP_
55cdf0e10cSrcweir #include <com/sun/star/sdb/application/DatabaseObject.hpp>
56cdf0e10cSrcweir #endif
57cdf0e10cSrcweir #ifndef _COM_SUN_STAR_SDB_APPLICATION_DATABASEOBJECTFOLDER_HPP_
58cdf0e10cSrcweir #include <com/sun/star/sdb/application/DatabaseObjectContainer.hpp>
59cdf0e10cSrcweir #endif
60cdf0e10cSrcweir #ifndef _COM_SUN_STAR_SDBC_XDRIVERACCESS_HPP_
61cdf0e10cSrcweir #include <com/sun/star/sdbc/XDriverAccess.hpp>
62cdf0e10cSrcweir #endif
63cdf0e10cSrcweir #ifndef _COM_SUN_STAR_SDBCX_XDATADEFINITIONSUPPLIER_HPP_
64cdf0e10cSrcweir #include <com/sun/star/sdbcx/XDataDefinitionSupplier.hpp>
65cdf0e10cSrcweir #endif
66cdf0e10cSrcweir #ifndef _COM_SUN_STAR_SDBCX_XVIEWSSUPPLIER_HPP_
67cdf0e10cSrcweir #include <com/sun/star/sdbcx/XViewsSupplier.hpp>
68cdf0e10cSrcweir #endif
69cdf0e10cSrcweir #ifndef _COM_SUN_STAR_SDBCX_XTABLESSUPPLIER_HPP_
70cdf0e10cSrcweir #include <com/sun/star/sdbcx/XTablesSupplier.hpp>
71cdf0e10cSrcweir #endif
72cdf0e10cSrcweir #ifndef _COM_SUN_STAR_SDB_SQLCONTEXT_HPP_
73cdf0e10cSrcweir #include <com/sun/star/sdb/SQLContext.hpp>
74cdf0e10cSrcweir #endif
75cdf0e10cSrcweir #ifndef _COM_SUN_STAR_SDBC_XROW_HPP_
76cdf0e10cSrcweir #include <com/sun/star/sdbc/XRow.hpp>
77cdf0e10cSrcweir #endif
78cdf0e10cSrcweir #ifndef _COM_SUN_STAR_BEANS_XPROPERTYSET_HPP_
79cdf0e10cSrcweir #include <com/sun/star/beans/XPropertySet.hpp>
80cdf0e10cSrcweir #endif
81cdf0e10cSrcweir #ifndef _DBAUI_COMMON_TYPES_HXX_
82cdf0e10cSrcweir #include "commontypes.hxx"
83cdf0e10cSrcweir #endif
84cdf0e10cSrcweir #ifndef _DBAUI_LISTVIEWITEMS_HXX_
85cdf0e10cSrcweir #include "listviewitems.hxx"
86cdf0e10cSrcweir #endif
87cdf0e10cSrcweir #ifndef TOOLS_DIAGNOSE_EX_H
88cdf0e10cSrcweir #include <tools/diagnose_ex.h>
89cdf0e10cSrcweir #endif
90cdf0e10cSrcweir #ifndef _RTL_USTRBUF_HXX_
91cdf0e10cSrcweir #include <rtl/ustrbuf.hxx>
92cdf0e10cSrcweir #endif
93cdf0e10cSrcweir #include <connectivity/dbmetadata.hxx>
94cdf0e10cSrcweir
95cdf0e10cSrcweir #include <algorithm>
96cdf0e10cSrcweir
97cdf0e10cSrcweir //.........................................................................
98cdf0e10cSrcweir namespace dbaui
99cdf0e10cSrcweir {
100cdf0e10cSrcweir //.........................................................................
101cdf0e10cSrcweir
102cdf0e10cSrcweir using namespace ::com::sun::star::uno;
103cdf0e10cSrcweir using namespace ::com::sun::star::sdb;
104cdf0e10cSrcweir using namespace ::com::sun::star::lang;
105cdf0e10cSrcweir using namespace ::com::sun::star::sdbc;
106cdf0e10cSrcweir using namespace ::com::sun::star::sdbcx;
107cdf0e10cSrcweir using namespace ::com::sun::star::beans;
108cdf0e10cSrcweir using namespace ::com::sun::star::container;
109cdf0e10cSrcweir using namespace ::com::sun::star::sdb::application;
110cdf0e10cSrcweir
111cdf0e10cSrcweir using namespace ::dbtools;
112cdf0e10cSrcweir using namespace ::comphelper;
113cdf0e10cSrcweir
114cdf0e10cSrcweir namespace DatabaseObject = ::com::sun::star::sdb::application::DatabaseObject;
115cdf0e10cSrcweir namespace DatabaseObjectContainer = ::com::sun::star::sdb::application::DatabaseObjectContainer;
116cdf0e10cSrcweir
117cdf0e10cSrcweir //========================================================================
118cdf0e10cSrcweir //= OTableTreeListBox
119cdf0e10cSrcweir //========================================================================
OTableTreeListBox(Window * pParent,const Reference<XMultiServiceFactory> & _rxORB,WinBits nWinStyle,sal_Bool _bVirtualRoot)120cdf0e10cSrcweir OTableTreeListBox::OTableTreeListBox( Window* pParent, const Reference< XMultiServiceFactory >& _rxORB, WinBits nWinStyle,sal_Bool _bVirtualRoot )
121cdf0e10cSrcweir :OMarkableTreeListBox(pParent,_rxORB,nWinStyle)
122cdf0e10cSrcweir ,m_pImageProvider( new ImageProvider )
123cdf0e10cSrcweir ,m_bVirtualRoot(_bVirtualRoot)
124cdf0e10cSrcweir ,m_bNoEmptyFolders( false )
125cdf0e10cSrcweir {
126cdf0e10cSrcweir implSetDefaultImages();
127cdf0e10cSrcweir }
128cdf0e10cSrcweir //------------------------------------------------------------------------
OTableTreeListBox(Window * pParent,const Reference<XMultiServiceFactory> & _rxORB,const ResId & rResId,sal_Bool _bVirtualRoot)129cdf0e10cSrcweir OTableTreeListBox::OTableTreeListBox( Window* pParent, const Reference< XMultiServiceFactory >& _rxORB, const ResId& rResId ,sal_Bool _bVirtualRoot)
130cdf0e10cSrcweir :OMarkableTreeListBox(pParent,_rxORB,rResId)
131cdf0e10cSrcweir ,m_pImageProvider( new ImageProvider )
132cdf0e10cSrcweir ,m_bVirtualRoot(_bVirtualRoot)
133cdf0e10cSrcweir ,m_bNoEmptyFolders( false )
134cdf0e10cSrcweir {
135cdf0e10cSrcweir implSetDefaultImages();
136cdf0e10cSrcweir }
137cdf0e10cSrcweir
138cdf0e10cSrcweir // -----------------------------------------------------------------------------
~OTableTreeListBox()139cdf0e10cSrcweir OTableTreeListBox::~OTableTreeListBox()
140cdf0e10cSrcweir {
141cdf0e10cSrcweir }
142cdf0e10cSrcweir
143cdf0e10cSrcweir // -----------------------------------------------------------------------------
implSetDefaultImages()144cdf0e10cSrcweir void OTableTreeListBox::implSetDefaultImages()
145cdf0e10cSrcweir {
146cdf0e10cSrcweir ImageProvider aImageProvider;
147cdf0e10cSrcweir SetDefaultExpandedEntryBmp( aImageProvider.getFolderImage( DatabaseObject::TABLE, false ), BMP_COLOR_NORMAL );
148cdf0e10cSrcweir SetDefaultExpandedEntryBmp( aImageProvider.getFolderImage( DatabaseObject::TABLE, true ), BMP_COLOR_HIGHCONTRAST );
149cdf0e10cSrcweir SetDefaultCollapsedEntryBmp( aImageProvider.getFolderImage( DatabaseObject::TABLE, false ), BMP_COLOR_NORMAL );
150cdf0e10cSrcweir SetDefaultCollapsedEntryBmp( aImageProvider.getFolderImage( DatabaseObject::TABLE, true ), BMP_COLOR_HIGHCONTRAST );
151cdf0e10cSrcweir }
152cdf0e10cSrcweir
153cdf0e10cSrcweir // -----------------------------------------------------------------------------
isFolderEntry(const SvLBoxEntry * _pEntry) const154cdf0e10cSrcweir bool OTableTreeListBox::isFolderEntry( const SvLBoxEntry* _pEntry ) const
155cdf0e10cSrcweir {
156cdf0e10cSrcweir sal_Int32 nEntryType = reinterpret_cast< sal_IntPtr >( _pEntry->GetUserData() );
157cdf0e10cSrcweir if ( ( nEntryType == DatabaseObjectContainer::TABLES )
158cdf0e10cSrcweir || ( nEntryType == DatabaseObjectContainer::CATALOG )
159cdf0e10cSrcweir || ( nEntryType == DatabaseObjectContainer::SCHEMA )
160cdf0e10cSrcweir )
161cdf0e10cSrcweir return true;
162cdf0e10cSrcweir return false;
163cdf0e10cSrcweir }
164cdf0e10cSrcweir
165cdf0e10cSrcweir // -----------------------------------------------------------------------------
notifyHiContrastChanged()166cdf0e10cSrcweir void OTableTreeListBox::notifyHiContrastChanged()
167cdf0e10cSrcweir {
168cdf0e10cSrcweir implSetDefaultImages();
169cdf0e10cSrcweir
170cdf0e10cSrcweir SvLBoxEntry* pEntryLoop = First();
171cdf0e10cSrcweir while (pEntryLoop)
172cdf0e10cSrcweir {
173cdf0e10cSrcweir sal_uInt16 nCount = pEntryLoop->ItemCount();
174cdf0e10cSrcweir for (sal_uInt16 i=0;i<nCount;++i)
175cdf0e10cSrcweir {
176cdf0e10cSrcweir SvLBoxItem* pItem = pEntryLoop->GetItem(i);
177cdf0e10cSrcweir if ( pItem && pItem->IsA() == SV_ITEM_ID_LBOXCONTEXTBMP)
178cdf0e10cSrcweir {
179cdf0e10cSrcweir SvLBoxContextBmp* pContextBitmapItem = static_cast< SvLBoxContextBmp* >( pItem );
180cdf0e10cSrcweir
181cdf0e10cSrcweir Image aImage, aImageHC;
182cdf0e10cSrcweir if ( isFolderEntry( pEntryLoop ) )
183cdf0e10cSrcweir {
184cdf0e10cSrcweir aImage = m_pImageProvider->getFolderImage( DatabaseObject::TABLE, false );
185cdf0e10cSrcweir aImageHC = m_pImageProvider->getFolderImage( DatabaseObject::TABLE, true );
186cdf0e10cSrcweir }
187cdf0e10cSrcweir else
188cdf0e10cSrcweir {
189cdf0e10cSrcweir String sCompleteName( getQualifiedTableName( pEntryLoop ) );
190cdf0e10cSrcweir m_pImageProvider->getImages( sCompleteName, DatabaseObject::TABLE, aImage, aImageHC );
191cdf0e10cSrcweir }
192cdf0e10cSrcweir
193cdf0e10cSrcweir pContextBitmapItem->SetBitmap1( aImage, BMP_COLOR_NORMAL );
194cdf0e10cSrcweir pContextBitmapItem->SetBitmap2( aImage, BMP_COLOR_NORMAL );
195cdf0e10cSrcweir pContextBitmapItem->SetBitmap1( aImageHC, BMP_COLOR_HIGHCONTRAST );
196cdf0e10cSrcweir pContextBitmapItem->SetBitmap2( aImageHC, BMP_COLOR_HIGHCONTRAST );
197cdf0e10cSrcweir // TODO: Now that we give both images to the entry item, it is not necessary anymore
198cdf0e10cSrcweir // to do this anytime HC changes - the tree control will do this itself now.
199cdf0e10cSrcweir // We would only need to properly initialize newly inserted entries.
200cdf0e10cSrcweir break;
201cdf0e10cSrcweir }
202cdf0e10cSrcweir }
203cdf0e10cSrcweir pEntryLoop = Next(pEntryLoop);
204cdf0e10cSrcweir }
205cdf0e10cSrcweir }
206cdf0e10cSrcweir
207cdf0e10cSrcweir //------------------------------------------------------------------------
implOnNewConnection(const Reference<XConnection> & _rxConnection)208cdf0e10cSrcweir void OTableTreeListBox::implOnNewConnection( const Reference< XConnection >& _rxConnection )
209cdf0e10cSrcweir {
210cdf0e10cSrcweir m_xConnection = _rxConnection;
211cdf0e10cSrcweir m_pImageProvider.reset( new ImageProvider( m_xConnection ) );
212cdf0e10cSrcweir }
213cdf0e10cSrcweir
214cdf0e10cSrcweir //------------------------------------------------------------------------
UpdateTableList(const Reference<XConnection> & _rxConnection)215cdf0e10cSrcweir void OTableTreeListBox::UpdateTableList( const Reference< XConnection >& _rxConnection ) throw(SQLException)
216cdf0e10cSrcweir {
217cdf0e10cSrcweir Sequence< ::rtl::OUString > sTables, sViews;
218cdf0e10cSrcweir
219cdf0e10cSrcweir String sCurrentActionError;
220cdf0e10cSrcweir try
221cdf0e10cSrcweir {
222cdf0e10cSrcweir Reference< XTablesSupplier > xTableSupp( _rxConnection, UNO_QUERY_THROW );
223cdf0e10cSrcweir sCurrentActionError = String(ModuleRes(STR_NOTABLEINFO));
224cdf0e10cSrcweir
225cdf0e10cSrcweir Reference< XNameAccess > xTables,xViews;
226cdf0e10cSrcweir
227cdf0e10cSrcweir Reference< XViewsSupplier > xViewSupp( _rxConnection, UNO_QUERY );
228cdf0e10cSrcweir if ( xViewSupp.is() )
229cdf0e10cSrcweir {
230cdf0e10cSrcweir xViews = xViewSupp->getViews();
231cdf0e10cSrcweir if (xViews.is())
232cdf0e10cSrcweir sViews = xViews->getElementNames();
233cdf0e10cSrcweir }
234cdf0e10cSrcweir
235cdf0e10cSrcweir xTables = xTableSupp->getTables();
236cdf0e10cSrcweir if (xTables.is())
237cdf0e10cSrcweir sTables = xTables->getElementNames();
238cdf0e10cSrcweir }
239cdf0e10cSrcweir catch(RuntimeException&)
240cdf0e10cSrcweir {
241cdf0e10cSrcweir DBG_ERROR("OTableTreeListBox::UpdateTableList : caught an RuntimeException!");
242cdf0e10cSrcweir }
243cdf0e10cSrcweir catch ( const SQLException& )
244cdf0e10cSrcweir {
245cdf0e10cSrcweir throw;
246cdf0e10cSrcweir }
247cdf0e10cSrcweir catch(Exception&)
248cdf0e10cSrcweir {
24907a3d7f1SPedro Giffuni // a non-SQLException exception occurred ... simply throw an SQLException
250cdf0e10cSrcweir SQLException aInfo;
251cdf0e10cSrcweir aInfo.Message = sCurrentActionError;
252cdf0e10cSrcweir throw aInfo;
253cdf0e10cSrcweir }
254cdf0e10cSrcweir
255cdf0e10cSrcweir UpdateTableList( _rxConnection, sTables, sViews );
256cdf0e10cSrcweir }
257cdf0e10cSrcweir // -----------------------------------------------------------------------------
258cdf0e10cSrcweir namespace
259cdf0e10cSrcweir {
260cdf0e10cSrcweir struct OViewSetter : public ::std::unary_function< OTableTreeListBox::TNames::value_type, bool>
261cdf0e10cSrcweir {
262cdf0e10cSrcweir const Sequence< ::rtl::OUString> m_aViews;
263cdf0e10cSrcweir ::comphelper::TStringMixEqualFunctor m_aEqualFunctor;
264cdf0e10cSrcweir
OViewSetterdbaui::__anon117e8d4b0111::OViewSetter265cdf0e10cSrcweir OViewSetter(const Sequence< ::rtl::OUString>& _rViews,sal_Bool _bCase) : m_aViews(_rViews),m_aEqualFunctor(_bCase){}
operator ()dbaui::__anon117e8d4b0111::OViewSetter266cdf0e10cSrcweir OTableTreeListBox::TNames::value_type operator() (const ::rtl::OUString& lhs)
267cdf0e10cSrcweir {
268cdf0e10cSrcweir OTableTreeListBox::TNames::value_type aRet;
269cdf0e10cSrcweir aRet.first = lhs;
270cdf0e10cSrcweir const ::rtl::OUString* pIter = m_aViews.getConstArray();
271cdf0e10cSrcweir const ::rtl::OUString* pEnd = m_aViews.getConstArray() + m_aViews.getLength();
272cdf0e10cSrcweir aRet.second = (::std::find_if(pIter,pEnd,::std::bind2nd(m_aEqualFunctor,lhs)) != pEnd);
273cdf0e10cSrcweir
274cdf0e10cSrcweir return aRet;
275cdf0e10cSrcweir }
276cdf0e10cSrcweir };
277cdf0e10cSrcweir
278cdf0e10cSrcweir }
279cdf0e10cSrcweir // -----------------------------------------------------------------------------
UpdateTableList(const Reference<XConnection> & _rxConnection,const Sequence<::rtl::OUString> & _rTables,const Sequence<::rtl::OUString> & _rViews)280cdf0e10cSrcweir void OTableTreeListBox::UpdateTableList(
281cdf0e10cSrcweir const Reference< XConnection >& _rxConnection,
282cdf0e10cSrcweir const Sequence< ::rtl::OUString>& _rTables,
283cdf0e10cSrcweir const Sequence< ::rtl::OUString>& _rViews
284cdf0e10cSrcweir )
285cdf0e10cSrcweir {
286cdf0e10cSrcweir TNames aTables;
287cdf0e10cSrcweir aTables.resize(_rTables.getLength());
288cdf0e10cSrcweir const ::rtl::OUString* pIter = _rTables.getConstArray();
289cdf0e10cSrcweir const ::rtl::OUString* pEnd = _rTables.getConstArray() + _rTables.getLength();
290cdf0e10cSrcweir try
291cdf0e10cSrcweir {
292cdf0e10cSrcweir Reference< XDatabaseMetaData > xMeta( _rxConnection->getMetaData(), UNO_QUERY_THROW );
293cdf0e10cSrcweir ::std::transform( pIter, pEnd,
294cdf0e10cSrcweir aTables.begin(), OViewSetter( _rViews, xMeta->supportsMixedCaseQuotedIdentifiers() ) );
295cdf0e10cSrcweir }
296cdf0e10cSrcweir catch(Exception&)
297cdf0e10cSrcweir {
298cdf0e10cSrcweir DBG_UNHANDLED_EXCEPTION();
299cdf0e10cSrcweir }
300cdf0e10cSrcweir UpdateTableList( _rxConnection, aTables );
301cdf0e10cSrcweir }
302cdf0e10cSrcweir
303cdf0e10cSrcweir //------------------------------------------------------------------------
304cdf0e10cSrcweir namespace
305cdf0e10cSrcweir {
lcl_getMetaDataStrings_throw(const Reference<XResultSet> & _rxMetaDataResult,sal_Int32 _nColumnIndex)306cdf0e10cSrcweir ::std::vector< ::rtl::OUString > lcl_getMetaDataStrings_throw( const Reference< XResultSet >& _rxMetaDataResult, sal_Int32 _nColumnIndex )
307cdf0e10cSrcweir {
308cdf0e10cSrcweir ::std::vector< ::rtl::OUString > aStrings;
309cdf0e10cSrcweir Reference< XRow > xRow( _rxMetaDataResult, UNO_QUERY_THROW );
310cdf0e10cSrcweir while ( _rxMetaDataResult->next() )
311cdf0e10cSrcweir aStrings.push_back( xRow->getString( _nColumnIndex ) );
312cdf0e10cSrcweir return aStrings;
313cdf0e10cSrcweir }
314cdf0e10cSrcweir
lcl_shouldDisplayEmptySchemasAndCatalogs(const Reference<XConnection> & _rxConnection)315cdf0e10cSrcweir bool lcl_shouldDisplayEmptySchemasAndCatalogs( const Reference< XConnection >& _rxConnection )
316cdf0e10cSrcweir {
317cdf0e10cSrcweir ::dbtools::DatabaseMetaData aMetaData( _rxConnection );
318cdf0e10cSrcweir return aMetaData.displayEmptyTableFolders();
319cdf0e10cSrcweir }
320cdf0e10cSrcweir }
321cdf0e10cSrcweir
322cdf0e10cSrcweir //------------------------------------------------------------------------
UpdateTableList(const Reference<XConnection> & _rxConnection,const TNames & _rTables)323cdf0e10cSrcweir void OTableTreeListBox::UpdateTableList( const Reference< XConnection >& _rxConnection, const TNames& _rTables )
324cdf0e10cSrcweir {
325cdf0e10cSrcweir implOnNewConnection( _rxConnection );
326cdf0e10cSrcweir
327cdf0e10cSrcweir // throw away all the old stuff
328cdf0e10cSrcweir Clear();
329cdf0e10cSrcweir
330cdf0e10cSrcweir try
331cdf0e10cSrcweir {
332cdf0e10cSrcweir // the root entry saying "all objects"
333cdf0e10cSrcweir SvLBoxEntry* pAllObjects = NULL;
334cdf0e10cSrcweir if (haveVirtualRoot())
335cdf0e10cSrcweir {
336cdf0e10cSrcweir String sRootEntryText;
337cdf0e10cSrcweir TNames::const_iterator aViews = ::std::find_if(_rTables.begin(),_rTables.end(),
338cdf0e10cSrcweir ::std::compose1(::std::bind2nd(::std::equal_to<sal_Bool>(),sal_False),::std::select2nd<TNames::value_type>()));
339cdf0e10cSrcweir TNames::const_iterator aTables = ::std::find_if(_rTables.begin(),_rTables.end(),
340cdf0e10cSrcweir ::std::compose1(::std::bind2nd(::std::equal_to<sal_Bool>(),sal_True),::std::select2nd<TNames::value_type>()));
341cdf0e10cSrcweir
342cdf0e10cSrcweir if ( aViews == _rTables.end() )
343cdf0e10cSrcweir sRootEntryText = String(ModuleRes(STR_ALL_TABLES));
344cdf0e10cSrcweir else if ( aTables == _rTables.end() )
345cdf0e10cSrcweir sRootEntryText = String(ModuleRes(STR_ALL_VIEWS));
346cdf0e10cSrcweir else
347cdf0e10cSrcweir sRootEntryText = String(ModuleRes(STR_ALL_TABLES_AND_VIEWS));
348cdf0e10cSrcweir pAllObjects = InsertEntry( sRootEntryText, NULL, sal_False, LIST_APPEND, reinterpret_cast< void* >( DatabaseObjectContainer::TABLES ) );
349cdf0e10cSrcweir }
350cdf0e10cSrcweir
351cdf0e10cSrcweir if ( _rTables.empty() )
352cdf0e10cSrcweir // nothing to do (besides inserting the root entry)
353cdf0e10cSrcweir return;
354cdf0e10cSrcweir
355cdf0e10cSrcweir // get the table/view names
356cdf0e10cSrcweir TNames::const_iterator aIter = _rTables.begin();
357cdf0e10cSrcweir TNames::const_iterator aEnd = _rTables.end();
358cdf0e10cSrcweir
359cdf0e10cSrcweir Reference< XDatabaseMetaData > xMeta( _rxConnection->getMetaData(), UNO_QUERY_THROW );
360cdf0e10cSrcweir for ( ; aIter != aEnd; ++aIter )
361cdf0e10cSrcweir {
362cdf0e10cSrcweir // add the entry
363cdf0e10cSrcweir implAddEntry(
364cdf0e10cSrcweir xMeta,
365cdf0e10cSrcweir aIter->first,
366cdf0e10cSrcweir sal_False
367cdf0e10cSrcweir );
368cdf0e10cSrcweir }
369cdf0e10cSrcweir
370cdf0e10cSrcweir if ( !m_bNoEmptyFolders && lcl_shouldDisplayEmptySchemasAndCatalogs( _rxConnection ) )
371cdf0e10cSrcweir {
372cdf0e10cSrcweir sal_Bool bSupportsCatalogs = xMeta->supportsCatalogsInDataManipulation();
373cdf0e10cSrcweir sal_Bool bSupportsSchemas = xMeta->supportsSchemasInDataManipulation();
374cdf0e10cSrcweir
375cdf0e10cSrcweir if ( bSupportsCatalogs || bSupportsSchemas )
376cdf0e10cSrcweir {
377cdf0e10cSrcweir // we display empty catalogs if the DB supports catalogs, and they're noted at the beginning of a
378cdf0e10cSrcweir // composed name. Otherwise, we display empty schematas. (also see the tree structure explained in
379cdf0e10cSrcweir // implAddEntry)
380cdf0e10cSrcweir bool bCatalogs = bSupportsCatalogs && xMeta->isCatalogAtStart();
381cdf0e10cSrcweir
382cdf0e10cSrcweir ::std::vector< ::rtl::OUString > aFolderNames( lcl_getMetaDataStrings_throw(
383cdf0e10cSrcweir bCatalogs ? xMeta->getCatalogs() : xMeta->getSchemas(), 1 ) );
384cdf0e10cSrcweir sal_Int32 nFolderType = bCatalogs ? DatabaseObjectContainer::CATALOG : DatabaseObjectContainer::SCHEMA;
385cdf0e10cSrcweir
386cdf0e10cSrcweir SvLBoxEntry* pRootEntry = getAllObjectsEntry();
387cdf0e10cSrcweir for ( ::std::vector< ::rtl::OUString >::const_iterator folder = aFolderNames.begin();
388cdf0e10cSrcweir folder != aFolderNames.end();
389cdf0e10cSrcweir ++folder
390cdf0e10cSrcweir )
391cdf0e10cSrcweir {
392cdf0e10cSrcweir SvLBoxEntry* pFolder = GetEntryPosByName( *folder, pRootEntry );
393cdf0e10cSrcweir if ( !pFolder )
394cdf0e10cSrcweir pFolder = InsertEntry( *folder, pRootEntry, sal_False, LIST_APPEND, reinterpret_cast< void* >( nFolderType ) );
395cdf0e10cSrcweir }
396cdf0e10cSrcweir }
397cdf0e10cSrcweir }
398cdf0e10cSrcweir }
399cdf0e10cSrcweir catch ( const Exception& )
400cdf0e10cSrcweir {
401cdf0e10cSrcweir DBG_UNHANDLED_EXCEPTION();
402cdf0e10cSrcweir }
403cdf0e10cSrcweir }
404cdf0e10cSrcweir //------------------------------------------------------------------------
isWildcardChecked(SvLBoxEntry * _pEntry) const405cdf0e10cSrcweir sal_Bool OTableTreeListBox::isWildcardChecked(SvLBoxEntry* _pEntry) const
406cdf0e10cSrcweir {
407cdf0e10cSrcweir if (_pEntry)
408cdf0e10cSrcweir {
409cdf0e10cSrcweir OBoldListboxString* pTextItem = static_cast<OBoldListboxString*>(_pEntry->GetFirstItem(SV_ITEM_ID_BOLDLBSTRING));
410cdf0e10cSrcweir if (pTextItem)
411cdf0e10cSrcweir return pTextItem->isEmphasized();
412cdf0e10cSrcweir }
413cdf0e10cSrcweir return sal_False;
414cdf0e10cSrcweir }
415cdf0e10cSrcweir
416cdf0e10cSrcweir //------------------------------------------------------------------------
checkWildcard(SvLBoxEntry * _pEntry)417cdf0e10cSrcweir void OTableTreeListBox::checkWildcard(SvLBoxEntry* _pEntry)
418cdf0e10cSrcweir {
419cdf0e10cSrcweir SetCheckButtonState(_pEntry, SV_BUTTON_CHECKED);
420cdf0e10cSrcweir checkedButton_noBroadcast(_pEntry);
421cdf0e10cSrcweir }
422cdf0e10cSrcweir
423cdf0e10cSrcweir //------------------------------------------------------------------------
getAllObjectsEntry() const424cdf0e10cSrcweir SvLBoxEntry* OTableTreeListBox::getAllObjectsEntry() const
425cdf0e10cSrcweir {
426cdf0e10cSrcweir return haveVirtualRoot() ? First() : NULL;
427cdf0e10cSrcweir }
428cdf0e10cSrcweir
429cdf0e10cSrcweir //------------------------------------------------------------------------
checkedButton_noBroadcast(SvLBoxEntry * _pEntry)430cdf0e10cSrcweir void OTableTreeListBox::checkedButton_noBroadcast(SvLBoxEntry* _pEntry)
431cdf0e10cSrcweir {
432cdf0e10cSrcweir OMarkableTreeListBox::checkedButton_noBroadcast(_pEntry);
433cdf0e10cSrcweir
434cdf0e10cSrcweir // if an entry has children, it makes a difference if the entry is checked because alls children are checked
435cdf0e10cSrcweir // or if the user checked it explicitly.
436cdf0e10cSrcweir // So we track explicit (un)checking
437cdf0e10cSrcweir
438cdf0e10cSrcweir SvButtonState eState = GetCheckButtonState(_pEntry);
439cdf0e10cSrcweir DBG_ASSERT(SV_BUTTON_TRISTATE != eState, "OTableTreeListBox::CheckButtonHdl: user action which lead to TRISTATE?");
440cdf0e10cSrcweir implEmphasize(_pEntry, SV_BUTTON_CHECKED == eState);
441cdf0e10cSrcweir }
442cdf0e10cSrcweir
443cdf0e10cSrcweir //------------------------------------------------------------------------
implEmphasize(SvLBoxEntry * _pEntry,sal_Bool _bChecked,sal_Bool _bUpdateDescendants,sal_Bool _bUpdateAncestors)444cdf0e10cSrcweir void OTableTreeListBox::implEmphasize(SvLBoxEntry* _pEntry, sal_Bool _bChecked, sal_Bool _bUpdateDescendants, sal_Bool _bUpdateAncestors)
445cdf0e10cSrcweir {
446cdf0e10cSrcweir DBG_ASSERT(_pEntry, "OTableTreeListBox::implEmphasize: invalid entry (NULL)!");
447cdf0e10cSrcweir
448cdf0e10cSrcweir // special emphasizing handling for the "all objects" entry
449cdf0e10cSrcweir // 89709 - 16.07.2001 - frank.schoenheit@sun.com
450cdf0e10cSrcweir sal_Bool bAllObjectsEntryAffected = haveVirtualRoot() && (getAllObjectsEntry() == _pEntry);
451cdf0e10cSrcweir if ( GetModel()->HasChilds(_pEntry) // the entry has children
452cdf0e10cSrcweir || bAllObjectsEntryAffected // or it is the "all objects" entry
453cdf0e10cSrcweir )
454cdf0e10cSrcweir {
455cdf0e10cSrcweir OBoldListboxString* pTextItem = static_cast<OBoldListboxString*>(_pEntry->GetFirstItem(SV_ITEM_ID_BOLDLBSTRING));
456cdf0e10cSrcweir if (pTextItem)
457cdf0e10cSrcweir pTextItem->emphasize(_bChecked);
458cdf0e10cSrcweir
459cdf0e10cSrcweir if (bAllObjectsEntryAffected)
460cdf0e10cSrcweir InvalidateEntry(_pEntry);
461cdf0e10cSrcweir }
462cdf0e10cSrcweir
463cdf0e10cSrcweir if (_bUpdateDescendants)
464cdf0e10cSrcweir {
465cdf0e10cSrcweir // remove the mark for all children of the checked entry
466cdf0e10cSrcweir SvLBoxEntry* pChildLoop = FirstChild(_pEntry);
467cdf0e10cSrcweir while (pChildLoop)
468cdf0e10cSrcweir {
469cdf0e10cSrcweir if (GetModel()->HasChilds(pChildLoop))
470cdf0e10cSrcweir implEmphasize(pChildLoop, sal_False, sal_True, sal_False);
471cdf0e10cSrcweir pChildLoop = NextSibling(pChildLoop);
472cdf0e10cSrcweir }
473cdf0e10cSrcweir }
474cdf0e10cSrcweir
475cdf0e10cSrcweir if (_bUpdateAncestors)
476cdf0e10cSrcweir {
477cdf0e10cSrcweir // remove the mark for all ancestors of the entry
478cdf0e10cSrcweir if (GetModel()->HasParent(_pEntry))
479cdf0e10cSrcweir implEmphasize(GetParent(_pEntry), sal_False, sal_False, sal_True);
480cdf0e10cSrcweir }
481cdf0e10cSrcweir }
482cdf0e10cSrcweir
483cdf0e10cSrcweir //------------------------------------------------------------------------
InitEntry(SvLBoxEntry * _pEntry,const XubString & _rString,const Image & _rCollapsedBitmap,const Image & _rExpandedBitmap,SvLBoxButtonKind _eButtonKind)484cdf0e10cSrcweir void OTableTreeListBox::InitEntry(SvLBoxEntry* _pEntry, const XubString& _rString, const Image& _rCollapsedBitmap, const Image& _rExpandedBitmap, SvLBoxButtonKind _eButtonKind)
485cdf0e10cSrcweir {
486cdf0e10cSrcweir OMarkableTreeListBox::InitEntry(_pEntry, _rString, _rCollapsedBitmap, _rExpandedBitmap, _eButtonKind);
487cdf0e10cSrcweir
488cdf0e10cSrcweir // replace the text item with our own one
489cdf0e10cSrcweir SvLBoxItem* pTextItem = _pEntry->GetFirstItem(SV_ITEM_ID_LBOXSTRING);
490cdf0e10cSrcweir DBG_ASSERT(pTextItem, "OTableTreeListBox::InitEntry: no text item!?");
491cdf0e10cSrcweir sal_uInt16 nTextPos = _pEntry->GetPos(pTextItem);
492cdf0e10cSrcweir DBG_ASSERT(((sal_uInt16)-1) != nTextPos, "OTableTreeListBox::InitEntry: no text item pos!");
493cdf0e10cSrcweir
494cdf0e10cSrcweir _pEntry->ReplaceItem(new OBoldListboxString(_pEntry, 0, _rString), nTextPos);
495cdf0e10cSrcweir }
496cdf0e10cSrcweir
497cdf0e10cSrcweir //------------------------------------------------------------------------
implAddEntry(const Reference<XDatabaseMetaData> & _rxMeta,const::rtl::OUString & _rTableName,sal_Bool _bCheckName)498cdf0e10cSrcweir SvLBoxEntry* OTableTreeListBox::implAddEntry(
499cdf0e10cSrcweir const Reference< XDatabaseMetaData >& _rxMeta,
500cdf0e10cSrcweir const ::rtl::OUString& _rTableName,
501cdf0e10cSrcweir sal_Bool _bCheckName
502cdf0e10cSrcweir )
503cdf0e10cSrcweir {
504cdf0e10cSrcweir OSL_PRECOND( _rxMeta.is(), "OTableTreeListBox::implAddEntry: invalid meta data!" );
505cdf0e10cSrcweir if ( !_rxMeta.is() )
506cdf0e10cSrcweir return NULL;
507cdf0e10cSrcweir
508cdf0e10cSrcweir // split the complete name into it's components
509cdf0e10cSrcweir ::rtl::OUString sCatalog, sSchema, sName;
510cdf0e10cSrcweir qualifiedNameComponents( _rxMeta, _rTableName, sCatalog, sSchema, sName, ::dbtools::eInDataManipulation );
511cdf0e10cSrcweir
512cdf0e10cSrcweir SvLBoxEntry* pParentEntry = getAllObjectsEntry();
513cdf0e10cSrcweir
514cdf0e10cSrcweir // if the DB uses catalog at the start of identifiers, then our hierarchy is
515cdf0e10cSrcweir // catalog
516cdf0e10cSrcweir // +- schema
517cdf0e10cSrcweir // +- table
518cdf0e10cSrcweir // else it is
519cdf0e10cSrcweir // schema
520cdf0e10cSrcweir // +- catalog
521cdf0e10cSrcweir // +- table
522cdf0e10cSrcweir sal_Bool bCatalogAtStart = _rxMeta->isCatalogAtStart();
523cdf0e10cSrcweir const ::rtl::OUString& rFirstName = bCatalogAtStart ? sCatalog : sSchema;
524cdf0e10cSrcweir const sal_Int32 nFirstFolderType = bCatalogAtStart ? DatabaseObjectContainer::CATALOG : DatabaseObjectContainer::SCHEMA;
525cdf0e10cSrcweir const ::rtl::OUString& rSecondName = bCatalogAtStart ? sSchema : sCatalog;
526cdf0e10cSrcweir const sal_Int32 nSecondFolderType = bCatalogAtStart ? DatabaseObjectContainer::SCHEMA : DatabaseObjectContainer::CATALOG;
527cdf0e10cSrcweir
528cdf0e10cSrcweir if ( rFirstName.getLength() )
529cdf0e10cSrcweir {
530cdf0e10cSrcweir SvLBoxEntry* pFolder = GetEntryPosByName( rFirstName, pParentEntry );
531cdf0e10cSrcweir if ( !pFolder )
532cdf0e10cSrcweir pFolder = InsertEntry( rFirstName, pParentEntry, sal_False, LIST_APPEND, reinterpret_cast< void* >( nFirstFolderType ) );
533cdf0e10cSrcweir pParentEntry = pFolder;
534cdf0e10cSrcweir }
535cdf0e10cSrcweir
536cdf0e10cSrcweir if ( rSecondName.getLength() )
537cdf0e10cSrcweir {
538cdf0e10cSrcweir SvLBoxEntry* pFolder = GetEntryPosByName( rSecondName, pParentEntry );
539cdf0e10cSrcweir if ( !pFolder )
540cdf0e10cSrcweir pFolder = InsertEntry( rSecondName, pParentEntry, sal_False, LIST_APPEND, reinterpret_cast< void* >( nSecondFolderType ) );
541cdf0e10cSrcweir pParentEntry = pFolder;
542cdf0e10cSrcweir }
543cdf0e10cSrcweir
544cdf0e10cSrcweir SvLBoxEntry* pRet = NULL;
545cdf0e10cSrcweir if ( !_bCheckName || !GetEntryPosByName( sName, pParentEntry ) )
546cdf0e10cSrcweir {
547cdf0e10cSrcweir pRet = InsertEntry( sName, pParentEntry, sal_False, LIST_APPEND );
548cdf0e10cSrcweir
549cdf0e10cSrcweir Image aImage, aImageHC;
550cdf0e10cSrcweir m_pImageProvider->getImages( _rTableName, DatabaseObject::TABLE, aImage, aImageHC );
551cdf0e10cSrcweir
552cdf0e10cSrcweir SetExpandedEntryBmp( pRet, aImage, BMP_COLOR_NORMAL );
553cdf0e10cSrcweir SetCollapsedEntryBmp( pRet, aImage, BMP_COLOR_NORMAL );
554cdf0e10cSrcweir SetExpandedEntryBmp( pRet, aImageHC, BMP_COLOR_HIGHCONTRAST );
555cdf0e10cSrcweir SetCollapsedEntryBmp( pRet, aImageHC, BMP_COLOR_HIGHCONTRAST );
556cdf0e10cSrcweir }
557cdf0e10cSrcweir return pRet;
558cdf0e10cSrcweir }
559cdf0e10cSrcweir
560cdf0e10cSrcweir //------------------------------------------------------------------------
describeObject(SvLBoxEntry * _pEntry)561cdf0e10cSrcweir NamedDatabaseObject OTableTreeListBox::describeObject( SvLBoxEntry* _pEntry )
562cdf0e10cSrcweir {
563cdf0e10cSrcweir NamedDatabaseObject aObject;
564cdf0e10cSrcweir
565cdf0e10cSrcweir sal_Int32 nEntryType = reinterpret_cast< sal_IntPtr >( _pEntry->GetUserData() );
566cdf0e10cSrcweir
567cdf0e10cSrcweir if ( nEntryType == DatabaseObjectContainer::TABLES )
568cdf0e10cSrcweir {
569cdf0e10cSrcweir aObject.Type = DatabaseObjectContainer::TABLES;
570cdf0e10cSrcweir }
571cdf0e10cSrcweir else if ( ( nEntryType == DatabaseObjectContainer::CATALOG )
572cdf0e10cSrcweir || ( nEntryType == DatabaseObjectContainer::SCHEMA )
573cdf0e10cSrcweir )
574cdf0e10cSrcweir {
575cdf0e10cSrcweir SvLBoxEntry* pParent = GetParent( _pEntry );
576cdf0e10cSrcweir sal_Int32 nParentEntryType = pParent ? reinterpret_cast< sal_IntPtr >( pParent->GetUserData() ) : -1;
577cdf0e10cSrcweir
578cdf0e10cSrcweir ::rtl::OUStringBuffer buffer;
579cdf0e10cSrcweir if ( nEntryType == DatabaseObjectContainer::CATALOG )
580cdf0e10cSrcweir {
581cdf0e10cSrcweir if ( nParentEntryType == DatabaseObjectContainer::SCHEMA )
582cdf0e10cSrcweir {
583cdf0e10cSrcweir buffer.append( GetEntryText( pParent ) );
584cdf0e10cSrcweir buffer.append( sal_Unicode( '.' ) );
585cdf0e10cSrcweir }
586cdf0e10cSrcweir buffer.append( GetEntryText( _pEntry ) );
587cdf0e10cSrcweir }
588cdf0e10cSrcweir else if ( nEntryType == DatabaseObjectContainer::SCHEMA )
589cdf0e10cSrcweir {
590cdf0e10cSrcweir if ( nParentEntryType == DatabaseObjectContainer::CATALOG )
591cdf0e10cSrcweir {
592cdf0e10cSrcweir buffer.append( GetEntryText( pParent ) );
593cdf0e10cSrcweir buffer.append( sal_Unicode( '.' ) );
594cdf0e10cSrcweir }
595cdf0e10cSrcweir buffer.append( GetEntryText( _pEntry ) );
596cdf0e10cSrcweir }
597cdf0e10cSrcweir }
598cdf0e10cSrcweir else
599cdf0e10cSrcweir {
600cdf0e10cSrcweir aObject.Type = DatabaseObject::TABLE;
601cdf0e10cSrcweir aObject.Name = getQualifiedTableName( _pEntry );
602cdf0e10cSrcweir }
603cdf0e10cSrcweir
604cdf0e10cSrcweir return aObject;
605cdf0e10cSrcweir }
606cdf0e10cSrcweir
607cdf0e10cSrcweir //------------------------------------------------------------------------
addedTable(const::rtl::OUString & _rName)608cdf0e10cSrcweir SvLBoxEntry* OTableTreeListBox::addedTable( const ::rtl::OUString& _rName )
609cdf0e10cSrcweir {
610cdf0e10cSrcweir try
611cdf0e10cSrcweir {
612cdf0e10cSrcweir Reference< XDatabaseMetaData > xMeta;
613cdf0e10cSrcweir if ( impl_getAndAssertMetaData( xMeta ) )
614cdf0e10cSrcweir return implAddEntry( xMeta, _rName );
615cdf0e10cSrcweir }
616cdf0e10cSrcweir catch( const Exception& )
617cdf0e10cSrcweir {
618cdf0e10cSrcweir DBG_UNHANDLED_EXCEPTION();
619cdf0e10cSrcweir }
620cdf0e10cSrcweir return NULL;
621cdf0e10cSrcweir }
622cdf0e10cSrcweir
623cdf0e10cSrcweir //------------------------------------------------------------------------
impl_getAndAssertMetaData(Reference<XDatabaseMetaData> & _out_rMetaData) const624cdf0e10cSrcweir bool OTableTreeListBox::impl_getAndAssertMetaData( Reference< XDatabaseMetaData >& _out_rMetaData ) const
625cdf0e10cSrcweir {
626cdf0e10cSrcweir if ( m_xConnection.is() )
627cdf0e10cSrcweir _out_rMetaData = m_xConnection->getMetaData();
628cdf0e10cSrcweir OSL_PRECOND( _out_rMetaData.is(), "OTableTreeListBox::impl_getAndAssertMetaData: invalid current connection!" );
629cdf0e10cSrcweir return _out_rMetaData.is();
630cdf0e10cSrcweir }
631cdf0e10cSrcweir
632cdf0e10cSrcweir //------------------------------------------------------------------------
getQualifiedTableName(SvLBoxEntry * _pEntry) const633cdf0e10cSrcweir String OTableTreeListBox::getQualifiedTableName( SvLBoxEntry* _pEntry ) const
634cdf0e10cSrcweir {
635cdf0e10cSrcweir OSL_PRECOND( !isFolderEntry( _pEntry ), "OTableTreeListBox::getQualifiedTableName: folder entries not allowed here!" );
636cdf0e10cSrcweir
637cdf0e10cSrcweir try
638cdf0e10cSrcweir {
639cdf0e10cSrcweir Reference< XDatabaseMetaData > xMeta;
640cdf0e10cSrcweir if ( !impl_getAndAssertMetaData( xMeta ) )
641cdf0e10cSrcweir return String();
642cdf0e10cSrcweir
643cdf0e10cSrcweir ::rtl::OUString sCatalog;
644cdf0e10cSrcweir ::rtl::OUString sSchema;
645cdf0e10cSrcweir ::rtl::OUString sTable;
646cdf0e10cSrcweir
647cdf0e10cSrcweir SvLBoxEntry* pSchema = GetParent( _pEntry );
648cdf0e10cSrcweir if ( pSchema )
649cdf0e10cSrcweir {
650cdf0e10cSrcweir SvLBoxEntry* pCatalog = GetParent( pSchema );
651cdf0e10cSrcweir if ( pCatalog
652cdf0e10cSrcweir || ( xMeta->supportsCatalogsInDataManipulation()
653cdf0e10cSrcweir && !xMeta->supportsSchemasInDataManipulation()
654cdf0e10cSrcweir ) // here we support catalog but no schema
655cdf0e10cSrcweir )
656cdf0e10cSrcweir {
657cdf0e10cSrcweir if ( pCatalog == NULL )
658cdf0e10cSrcweir {
659cdf0e10cSrcweir pCatalog = pSchema;
660cdf0e10cSrcweir pSchema = NULL;
661cdf0e10cSrcweir }
662cdf0e10cSrcweir sCatalog = GetEntryText( pCatalog );
663cdf0e10cSrcweir }
664cdf0e10cSrcweir if ( pSchema )
665cdf0e10cSrcweir sSchema = GetEntryText(pSchema);
666cdf0e10cSrcweir }
667cdf0e10cSrcweir sTable = GetEntryText( _pEntry );
668cdf0e10cSrcweir
669cdf0e10cSrcweir return ::dbtools::composeTableName( xMeta, sCatalog, sSchema, sTable, sal_False, ::dbtools::eInDataManipulation );
670cdf0e10cSrcweir }
671cdf0e10cSrcweir catch( const Exception& )
672cdf0e10cSrcweir {
673cdf0e10cSrcweir DBG_UNHANDLED_EXCEPTION();
674cdf0e10cSrcweir }
675cdf0e10cSrcweir return String();
676cdf0e10cSrcweir }
677cdf0e10cSrcweir
678cdf0e10cSrcweir //------------------------------------------------------------------------
getEntryByQualifiedName(const::rtl::OUString & _rName)679cdf0e10cSrcweir SvLBoxEntry* OTableTreeListBox::getEntryByQualifiedName( const ::rtl::OUString& _rName )
680cdf0e10cSrcweir {
681cdf0e10cSrcweir try
682cdf0e10cSrcweir {
683cdf0e10cSrcweir Reference< XDatabaseMetaData > xMeta;
684cdf0e10cSrcweir if ( !impl_getAndAssertMetaData( xMeta ) )
685cdf0e10cSrcweir return NULL;
686cdf0e10cSrcweir
687cdf0e10cSrcweir // split the complete name into it's components
688cdf0e10cSrcweir ::rtl::OUString sCatalog, sSchema, sName;
689cdf0e10cSrcweir qualifiedNameComponents(xMeta, _rName, sCatalog, sSchema, sName,::dbtools::eInDataManipulation);
690cdf0e10cSrcweir
691cdf0e10cSrcweir SvLBoxEntry* pParent = getAllObjectsEntry();
692cdf0e10cSrcweir SvLBoxEntry* pCat = NULL;
693cdf0e10cSrcweir SvLBoxEntry* pSchema = NULL;
694cdf0e10cSrcweir if ( sCatalog.getLength() )
695cdf0e10cSrcweir {
696cdf0e10cSrcweir pCat = GetEntryPosByName(sCatalog, pParent);
697cdf0e10cSrcweir if ( pCat )
698cdf0e10cSrcweir pParent = pCat;
699cdf0e10cSrcweir }
700cdf0e10cSrcweir
701cdf0e10cSrcweir if ( sSchema.getLength() )
702cdf0e10cSrcweir {
703cdf0e10cSrcweir pSchema = GetEntryPosByName(sSchema, pParent);
704cdf0e10cSrcweir if ( pSchema )
705cdf0e10cSrcweir pParent = pSchema;
706cdf0e10cSrcweir }
707cdf0e10cSrcweir
708cdf0e10cSrcweir return GetEntryPosByName(sName, pParent);
709cdf0e10cSrcweir }
710cdf0e10cSrcweir catch( const Exception& )
711cdf0e10cSrcweir {
712cdf0e10cSrcweir DBG_UNHANDLED_EXCEPTION();
713cdf0e10cSrcweir }
714cdf0e10cSrcweir return NULL;
715cdf0e10cSrcweir }
716cdf0e10cSrcweir //------------------------------------------------------------------------
removedTable(const::rtl::OUString & _rName)717cdf0e10cSrcweir void OTableTreeListBox::removedTable( const ::rtl::OUString& _rName )
718cdf0e10cSrcweir {
719cdf0e10cSrcweir try
720cdf0e10cSrcweir {
721cdf0e10cSrcweir SvLBoxEntry* pEntry = getEntryByQualifiedName( _rName );
722cdf0e10cSrcweir if ( pEntry )
723cdf0e10cSrcweir GetModel()->Remove( pEntry );
724cdf0e10cSrcweir }
725cdf0e10cSrcweir catch( const Exception& )
726cdf0e10cSrcweir {
727cdf0e10cSrcweir DBG_UNHANDLED_EXCEPTION();
728cdf0e10cSrcweir }
729cdf0e10cSrcweir }
730cdf0e10cSrcweir
731cdf0e10cSrcweir //.........................................................................
732cdf0e10cSrcweir } // namespace dbaui
733cdf0e10cSrcweir //.........................................................................
734cdf0e10cSrcweir
735