xref: /aoo4110/main/sw/source/ui/dbui/dbtree.cxx (revision b1cdbd2c)
1 /**************************************************************
2  *
3  * Licensed to the Apache Software Foundation (ASF) under one
4  * or more contributor license agreements.  See the NOTICE file
5  * distributed with this work for additional information
6  * regarding copyright ownership.  The ASF licenses this file
7  * to you under the Apache License, Version 2.0 (the
8  * "License"); you may not use this file except in compliance
9  * with the License.  You may obtain a copy of the License at
10  *
11  *   http://www.apache.org/licenses/LICENSE-2.0
12  *
13  * Unless required by applicable law or agreed to in writing,
14  * software distributed under the License is distributed on an
15  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16  * KIND, either express or implied.  See the License for the
17  * specific language governing permissions and limitations
18  * under the License.
19  *
20  *************************************************************/
21 
22 
23 
24 // MARKER(update_precomp.py): autogen include statement, do not remove
25 #include "precompiled_sw.hxx"
26 
27 // INCLUDE ---------------------------------------------------------------
28 
29 
30 #include <sot/formats.hxx>
31 #include <com/sun/star/lang/XMultiServiceFactory.hpp>
32 #include <com/sun/star/container/XNameAccess.hpp>
33 #include <com/sun/star/sdbc/XDataSource.hpp>
34 #include <com/sun/star/sdbcx/XTablesSupplier.hpp>
35 #include <com/sun/star/sdbcx/XColumnsSupplier.hpp>
36 #include <com/sun/star/sdb/XQueriesSupplier.hpp>
37 #include <com/sun/star/sdb/XDatabaseAccess.hpp>
38 #include <com/sun/star/sdb/CommandType.hpp>
39 #include <com/sun/star/beans/XPropertySet.hpp>
40 #include <comphelper/processfactory.hxx>
41 #include <com/sun/star/sdb/XCompletedConnection.hpp>
42 #include <com/sun/star/container/XContainerListener.hpp>
43 #include <com/sun/star/container/XContainer.hpp>
44 #include <cppuhelper/implbase1.hxx>
45 #include <svx/dbaexchange.hxx>
46 
47 #ifndef _DBMGR_HXX
48 #include <dbmgr.hxx>
49 #endif
50 #include <swmodule.hxx>
51 #ifndef _VIEW_HXX
52 #include <view.hxx>
53 #endif
54 #include <wrtsh.hxx>
55 #include <dbtree.hxx>
56 #include <vos/mutex.hxx>
57 #include <vcl/svapp.hxx>
58 
59 #ifndef _HELPID_H
60 #include <helpid.h>
61 #endif
62 #ifndef _UTLUI_HRC
63 #include <utlui.hrc>
64 #endif
65 
66 #include <unomid.h>
67 
68 using namespace ::com::sun::star;
69 using namespace ::com::sun::star::uno;
70 using namespace ::com::sun::star::container;
71 using namespace ::com::sun::star::lang;
72 using namespace ::com::sun::star::sdb;
73 using namespace ::com::sun::star::sdbc;
74 using namespace ::com::sun::star::sdbcx;
75 using namespace ::com::sun::star::task;
76 using namespace ::com::sun::star::beans;
77 
78 /* -----------------------------17.07.01 13:10--------------------------------
79 
80  ---------------------------------------------------------------------------*/
81 struct SwConnectionData
82 {
83     ::rtl::OUString                sSourceName;
84     Reference<XConnection>  xConnection;
85 };
86 
87 typedef SwConnectionData* SwConnectionDataPtr;
88 SV_DECL_PTRARR_DEL( SwConnectionArr, SwConnectionDataPtr, 32, 32 )
89 SV_IMPL_PTRARR( SwConnectionArr, SwConnectionDataPtr )
90 /* -----------------------------17.07.01 13:24--------------------------------
91 
92  ---------------------------------------------------------------------------*/
93 class SwDBTreeList_Impl : public cppu::WeakImplHelper1 < XContainerListener >
94 {
95     Reference< XNameAccess > xDBContext;
96     SwConnectionArr aConnections;
97     SwWrtShell* pWrtSh;
98 
99     public:
SwDBTreeList_Impl(SwWrtShell * pShell)100         SwDBTreeList_Impl(SwWrtShell* pShell) :
101             pWrtSh(pShell) {}
102         ~SwDBTreeList_Impl();
103 
104     virtual void SAL_CALL elementInserted( const ContainerEvent& Event ) throw (RuntimeException);
105     virtual void SAL_CALL elementRemoved( const ContainerEvent& Event ) throw (RuntimeException);
106     virtual void SAL_CALL elementReplaced( const ContainerEvent& Event ) throw (RuntimeException);
107     virtual void SAL_CALL disposing( const EventObject& Source ) throw (RuntimeException);
108 
109     sal_Bool                        HasContext();
GetWrtShell()110     SwWrtShell*                 GetWrtShell() { return pWrtSh;}
SetWrtShell(SwWrtShell & rSh)111     void                        SetWrtShell(SwWrtShell& rSh) { pWrtSh = &rSh;}
GetContext()112     Reference< XNameAccess >    GetContext() {return xDBContext;}
113     Reference<XConnection>      GetConnection(const rtl::OUString& rSourceName);
114 };
115 /* -----------------------------17.07.01 13:24--------------------------------
116 
117  ---------------------------------------------------------------------------*/
~SwDBTreeList_Impl()118 SwDBTreeList_Impl::~SwDBTreeList_Impl()
119 {
120     Reference<XContainer> xContainer(xDBContext, UNO_QUERY);
121     if(xContainer.is())
122     {
123         m_refCount++;
124         //block necessary due to solaris' compiler behaviour to
125         //remove temporaries at the block's end
126         {
127             xContainer->removeContainerListener( this );
128         }
129         m_refCount--;
130     }
131 }
132 /* -----------------------------17.07.01 13:24--------------------------------
133 
134  ---------------------------------------------------------------------------*/
elementInserted(const ContainerEvent &)135 void SwDBTreeList_Impl::elementInserted( const ContainerEvent&  ) throw (RuntimeException)
136 {
137     // information not needed
138 }
139 /* -----------------------------17.07.01 13:24--------------------------------
140 
141  ---------------------------------------------------------------------------*/
elementRemoved(const ContainerEvent & rEvent)142 void SwDBTreeList_Impl::elementRemoved( const ContainerEvent& rEvent ) throw (RuntimeException)
143 {
144     vos::OGuard aGuard(Application::GetSolarMutex());
145     ::rtl::OUString sSource;
146     rEvent.Accessor >>= sSource;
147     for(sal_uInt16 i = 0; i < aConnections.Count(); i++)
148     {
149         SwConnectionDataPtr pPtr = aConnections[i];
150         if(pPtr->sSourceName == sSource)
151         {
152 //            SwConnectionDataPtr pPtr = aConnections[i];
153 //            Reference<XComponent> xComp(pPtr->xConnection, UNO_QUERY);
154 //            if(xComp.is())
155 //                xComp->dispose();
156             aConnections.DeleteAndDestroy(i);
157             break;
158         }
159     }
160 }
161 /* -----------------------------17.07.01 13:24--------------------------------
162 
163  ---------------------------------------------------------------------------*/
disposing(const EventObject &)164 void SwDBTreeList_Impl::disposing( const EventObject&  ) throw (RuntimeException)
165 {
166     xDBContext = 0;
167 }
168 /* -----------------------------17.07.01 13:24--------------------------------
169 
170  ---------------------------------------------------------------------------*/
elementReplaced(const ContainerEvent & rEvent)171 void SwDBTreeList_Impl::elementReplaced( const ContainerEvent& rEvent ) throw (RuntimeException)
172 {
173     elementRemoved(rEvent);
174 }
175 /* -----------------------------17.07.01 13:24--------------------------------
176 
177  ---------------------------------------------------------------------------*/
HasContext()178 sal_Bool SwDBTreeList_Impl::HasContext()
179 {
180     if(!xDBContext.is())
181     {
182         Reference< XMultiServiceFactory > xMgr( ::comphelper::getProcessServiceFactory() );
183         if( xMgr.is() )
184         {
185             Reference<XInterface> xInstance = xMgr->createInstance(
186                         C2U( "com.sun.star.sdb.DatabaseContext" ));
187             xDBContext = Reference<XNameAccess>(xInstance, UNO_QUERY) ;
188             Reference<XContainer> xContainer(xDBContext, UNO_QUERY);
189             if(xContainer.is())
190                 xContainer->addContainerListener( this );
191         }
192         DBG_ASSERT(xDBContext.is(), "com.sun.star.sdb.DataBaseContext: service not available");
193     }
194     return xDBContext.is();
195 }
196 /* -----------------------------17.07.01 13:24--------------------------------
197 
198  ---------------------------------------------------------------------------*/
GetConnection(const rtl::OUString & rSourceName)199 Reference<XConnection>  SwDBTreeList_Impl::GetConnection(const rtl::OUString& rSourceName)
200 {
201     Reference<XConnection>  xRet;
202     for(sal_uInt16 i = 0; i < aConnections.Count(); i++)
203     {
204         SwConnectionDataPtr pPtr = aConnections[i];
205         if(pPtr->sSourceName == rSourceName)
206         {
207             xRet = pPtr->xConnection;
208             break;
209         }
210     }
211     if(!xRet.is() && xDBContext.is() && pWrtSh)
212     {
213         SwConnectionDataPtr pPtr = new SwConnectionData();
214         pPtr->sSourceName = rSourceName;
215         xRet = pWrtSh->GetNewDBMgr()->RegisterConnection(pPtr->sSourceName);
216         aConnections.Insert(pPtr, aConnections.Count());
217     }
218     return xRet;
219 }
220 /*------------------------------------------------------------------------
221  Beschreibung:
222 ------------------------------------------------------------------------*/
SwDBTreeList(Window * pParent,const ResId & rResId,SwWrtShell * pSh,const String & rDefDBName,const sal_Bool bShowCol)223 SwDBTreeList::SwDBTreeList(Window *pParent, const ResId& rResId,
224                         SwWrtShell* pSh,
225                         const String& rDefDBName, const sal_Bool bShowCol):
226 
227 	SvTreeListBox	(pParent, rResId),
228     aImageList      (SW_RES(ILIST_DB_DLG    )),
229     aImageListHC    (SW_RES(ILIST_DB_DLG_HC )),
230 	sDefDBName		(rDefDBName),
231     bInitialized    (sal_False),
232 	bShowColumns	(bShowCol),
233     pImpl(new SwDBTreeList_Impl(pSh))
234 {
235 	SetHelpId(HID_DB_SELECTION_TLB);
236 
237 	if (IsVisible())
238 		InitTreeList();
239 }
240 
241 /*------------------------------------------------------------------------
242  Beschreibung:
243 ------------------------------------------------------------------------*/
~SwDBTreeList()244 SwDBTreeList::~SwDBTreeList()
245 {
246     delete pImpl;
247 }
248 
249 /*------------------------------------------------------------------------
250  Beschreibung:
251 ------------------------------------------------------------------------*/
252 
253 
InitTreeList()254 void SwDBTreeList::InitTreeList()
255 {
256     if(!pImpl->HasContext() && pImpl->GetWrtShell())
257 		return;
258 	SetSelectionMode(SINGLE_SELECTION);
259 	SetStyle(GetStyle()|WB_HASLINES|WB_CLIPCHILDREN|WB_SORT|WB_HASBUTTONS|WB_HASBUTTONSATROOT|WB_HSCROLL);
260 	// Font nicht setzen, damit der Font des Controls uebernommen wird!
261 	SetSpaceBetweenEntries(0);
262     SetNodeBitmaps( aImageList.GetImage(IMG_COLLAPSE),
263                     aImageList.GetImage(IMG_EXPAND  ), BMP_COLOR_NORMAL );
264     SetNodeBitmaps( aImageListHC.GetImage(IMG_COLLAPSE),
265                     aImageListHC.GetImage(IMG_EXPAND  ), BMP_COLOR_HIGHCONTRAST );
266 
267 	SetDragDropMode(SV_DRAGDROP_APP_COPY);
268 
269 	GetModel()->SetCompareHdl(LINK(this, SwDBTreeList, DBCompare));
270 
271     Sequence< ::rtl::OUString > aDBNames = pImpl->GetContext()->getElementNames();
272     const ::rtl::OUString* pDBNames = aDBNames.getConstArray();
273 	long nCount = aDBNames.getLength();
274 
275     Image aImg = aImageList.GetImage(IMG_DB);
276     Image aHCImg = aImageListHC.GetImage(IMG_DB);
277     for(long i = 0; i < nCount; i++)
278 	{
279 		String sDBName(pDBNames[i]);
280         SvLBoxEntry* pEntry = InsertEntry(sDBName, aImg, aImg, NULL, sal_True);
281         SetExpandedEntryBmp(pEntry, aHCImg, BMP_COLOR_HIGHCONTRAST);
282         SetCollapsedEntryBmp(pEntry, aHCImg, BMP_COLOR_HIGHCONTRAST);
283 	}
284 	String sDBName(sDefDBName.GetToken(0, DB_DELIM));
285 	String sTableName(sDefDBName.GetToken(1, DB_DELIM));
286 	String sColumnName(sDefDBName.GetToken(2, DB_DELIM));
287 	Select(sDBName, sTableName, sColumnName);
288 
289 
290 	bInitialized = sal_True;
291 }
292 /*-- 27.05.2004 09:19:09---------------------------------------------------
293 
294   -----------------------------------------------------------------------*/
AddDataSource(const String & rSource)295 void    SwDBTreeList::AddDataSource(const String& rSource)
296 {
297     Image aImg = aImageList.GetImage(IMG_DB);
298     Image aHCImg = aImageListHC.GetImage(IMG_DB);
299     SvLBoxEntry* pEntry = InsertEntry(rSource, aImg, aImg, NULL, sal_True);
300     SetExpandedEntryBmp(pEntry, aHCImg, BMP_COLOR_HIGHCONTRAST);
301     SetCollapsedEntryBmp(pEntry, aHCImg, BMP_COLOR_HIGHCONTRAST);
302     SvTreeListBox::Select(pEntry);
303 }
304 /*------------------------------------------------------------------------
305  Beschreibung:
306 ------------------------------------------------------------------------*/
307 
ShowColumns(sal_Bool bShowCol)308 void SwDBTreeList::ShowColumns(sal_Bool bShowCol)
309 {
310 	if (bShowCol != bShowColumns)
311 	{
312 		bShowColumns = bShowCol;
313 		String sTableName, sColumnName;
314 		String  sDBName(GetDBName(sTableName, sColumnName));
315 
316 		SetUpdateMode(sal_False);
317 
318 		SvLBoxEntry* pEntry = First();
319 
320 		while (pEntry)
321 		{
322 			pEntry = (SvLBoxEntry*)GetRootLevelParent( pEntry );
323 			Collapse(pEntry);		// zuklappen
324 
325 			SvLBoxEntry* pChild;
326 			while ((pChild = FirstChild(pEntry)) != 0L)
327 				GetModel()->Remove(pChild);
328 
329 			pEntry = Next(pEntry);
330 		}
331 
332 		if (sDBName.Len())
333 		{
334 			Select(sDBName, sTableName, sColumnName);	// force RequestingChilds
335 		}
336 		SetUpdateMode(sal_True);
337 	}
338 }
339 
340 /*------------------------------------------------------------------------
341  Beschreibung:
342 ------------------------------------------------------------------------*/
343 
RequestingChilds(SvLBoxEntry * pParent)344 void  SwDBTreeList::RequestingChilds(SvLBoxEntry* pParent)
345 {
346 	if (!pParent->HasChilds())
347 	{
348 		if (GetParent(pParent))	// column names
349 		{
350             try
351             {
352 
353                 String sSourceName = GetEntryText(GetParent(pParent));
354                 String sTableName = GetEntryText(pParent);
355 
356                 if(!pImpl->GetContext()->hasByName(sSourceName))
357                     return;
358                 Reference<XConnection> xConnection = pImpl->GetConnection(sSourceName);
359                 sal_Bool bTable = pParent->GetUserData() == 0;
360                 Reference<XColumnsSupplier> xColsSupplier;
361                 if(bTable)
362                 {
363                     Reference<XTablesSupplier> xTSupplier = Reference<XTablesSupplier>(xConnection, UNO_QUERY);
364                     if(xTSupplier.is())
365                     {
366                         Reference<XNameAccess> xTbls = xTSupplier->getTables();
367                         DBG_ASSERT(xTbls->hasByName(sTableName), "table not available anymore?");
368                         try
369                         {
370                             Any aTable = xTbls->getByName(sTableName);
371                             Reference<XPropertySet> xPropSet;
372                             aTable >>= xPropSet;
373                             xColsSupplier = Reference<XColumnsSupplier>(xPropSet, UNO_QUERY);
374                         }
375                         catch(Exception&)
376                         {}
377                     }
378                 }
379                 else
380                 {
381                     Reference<XQueriesSupplier> xQSupplier = Reference<XQueriesSupplier>(xConnection, UNO_QUERY);
382                     if(xQSupplier.is())
383                     {
384                         Reference<XNameAccess> xQueries = xQSupplier->getQueries();
385                         DBG_ASSERT(xQueries->hasByName(sTableName), "table not available anymore?");
386                         try
387                         {
388                             Any aQuery = xQueries->getByName(sTableName);
389                             Reference<XPropertySet> xPropSet;
390                             aQuery >>= xPropSet;
391                             xColsSupplier = Reference<XColumnsSupplier>(xPropSet, UNO_QUERY);
392                         }
393                         catch(Exception&)
394                         {}
395                     }
396                 }
397 
398                 if(xColsSupplier.is())
399                 {
400                     Reference <XNameAccess> xCols = xColsSupplier->getColumns();
401                     Sequence< ::rtl::OUString> aColNames = xCols->getElementNames();
402                     const ::rtl::OUString* pColNames = aColNames.getConstArray();
403                     long nCount = aColNames.getLength();
404                     for (long i = 0; i < nCount; i++)
405                     {
406                         String sName = pColNames[i];
407                         if(bTable)
408                             InsertEntry(sName, pParent);
409                         else
410                             InsertEntry(sName, pParent);
411                     }
412                 }
413             }
414             catch(const Exception&)
415             {
416             }
417 		}
418 		else	// Tabellennamen
419 		{
420             try
421             {
422                 String sSourceName = GetEntryText(pParent);
423                 if(!pImpl->GetContext()->hasByName(sSourceName))
424                     return;
425                 Reference<XConnection> xConnection = pImpl->GetConnection(sSourceName);
426                 if (xConnection.is())
427                 {
428                     Reference<XTablesSupplier> xTSupplier = Reference<XTablesSupplier>(xConnection, UNO_QUERY);
429                     if(xTSupplier.is())
430                     {
431                         Reference<XNameAccess> xTbls = xTSupplier->getTables();
432                         Sequence< ::rtl::OUString> aTblNames = xTbls->getElementNames();
433                         String sTableName;
434                         long nCount = aTblNames.getLength();
435                         const ::rtl::OUString* pTblNames = aTblNames.getConstArray();
436                         Image aImg = aImageList.GetImage(IMG_DBTABLE);
437                         Image aHCImg = aImageListHC.GetImage(IMG_DBTABLE);
438                         for (long i = 0; i < nCount; i++)
439                         {
440                             sTableName = pTblNames[i];
441                             SvLBoxEntry* pTableEntry = InsertEntry(sTableName, aImg, aImg, pParent, bShowColumns);
442                             //to discriminate between queries and tables the user data of table entries is set
443                             pTableEntry->SetUserData((void*)0);
444                             SetExpandedEntryBmp(pTableEntry, aHCImg, BMP_COLOR_HIGHCONTRAST);
445                             SetCollapsedEntryBmp(pTableEntry, aHCImg, BMP_COLOR_HIGHCONTRAST);
446                         }
447                     }
448 
449                     Reference<XQueriesSupplier> xQSupplier = Reference<XQueriesSupplier>(xConnection, UNO_QUERY);
450                     if(xQSupplier.is())
451                     {
452                         Reference<XNameAccess> xQueries = xQSupplier->getQueries();
453                         Sequence< ::rtl::OUString> aQueryNames = xQueries->getElementNames();
454                         String sQueryName;
455                         long nCount = aQueryNames.getLength();
456                         const ::rtl::OUString* pQueryNames = aQueryNames.getConstArray();
457                         Image aImg = aImageList.GetImage(IMG_DBQUERY);
458                         Image aHCImg = aImageListHC.GetImage(IMG_DBQUERY);
459                         for (long i = 0; i < nCount; i++)
460                         {
461                             sQueryName = pQueryNames[i];
462                             SvLBoxEntry* pQueryEntry = InsertEntry(sQueryName, aImg, aImg, pParent, bShowColumns);
463                             pQueryEntry->SetUserData((void*)1);
464                             SetExpandedEntryBmp(pQueryEntry, aHCImg, BMP_COLOR_HIGHCONTRAST);
465                             SetCollapsedEntryBmp( pQueryEntry, aHCImg, BMP_COLOR_HIGHCONTRAST);
466                         }
467                     }
468                 }
469             }
470             catch(const Exception&)
471             {
472             }
473         }
474 	}
475 }
476 
477 /*------------------------------------------------------------------------
478  Beschreibung:
479 ------------------------------------------------------------------------*/
480 
IMPL_LINK(SwDBTreeList,DBCompare,SvSortData *,pData)481 IMPL_LINK( SwDBTreeList, DBCompare, SvSortData*, pData )
482 {
483 	SvLBoxEntry* pRight = (SvLBoxEntry*)(pData->pRight );
484 
485 	if (GetParent(pRight) && GetParent(GetParent(pRight)))
486 		return COMPARE_GREATER;	// Spaltennamen nicht sortieren
487 
488 	return DefaultCompare(pData);	// Sonst Basisklasse rufen
489 }
490 
491 /*------------------------------------------------------------------------
492  Beschreibung:
493 ------------------------------------------------------------------------*/
494 
GetDBName(String & rTableName,String & rColumnName,sal_Bool * pbIsTable)495 String  SwDBTreeList::GetDBName(String& rTableName, String& rColumnName, sal_Bool* pbIsTable)
496 {
497 	String sDBName;
498 	SvLBoxEntry* pEntry = FirstSelected();
499 
500 	if (pEntry && GetParent(pEntry))
501 	{
502 		if (GetParent(GetParent(pEntry)))
503 		{
504 			rColumnName = GetEntryText(pEntry);
505 			pEntry = GetParent(pEntry);	// Spaltenname war selektiert
506 		}
507 		sDBName = GetEntryText(GetParent(pEntry));
508 		if(pbIsTable)
509 		{
510             *pbIsTable = pEntry->GetUserData() == 0;
511 		}
512 		rTableName = GetEntryText(pEntry);
513 	}
514 	return sDBName;
515 }
516 
517 /*------------------------------------------------------------------------
518  Beschreibung:	Format: Datenbank.Tabelle
519 ------------------------------------------------------------------------*/
520 
521 
Select(const String & rDBName,const String & rTableName,const String & rColumnName)522 void SwDBTreeList::Select(const String& rDBName, const String& rTableName, const String& rColumnName)
523 {
524 	SvLBoxEntry* pParent;
525 	SvLBoxEntry* pChild;
526 	sal_uInt16 nParent = 0;
527 	sal_uInt16 nChild = 0;
528 
529 	while ((pParent = GetEntry(nParent++)) != NULL)
530 	{
531 		if (rDBName == GetEntryText(pParent))
532 		{
533 			if (!pParent->HasChilds())
534 				RequestingChilds(pParent);
535 			while ((pChild = GetEntry(pParent, nChild++)) != NULL)
536 			{
537 				if (rTableName == GetEntryText(pChild))
538 				{
539 					pParent = pChild;
540 
541 					if (bShowColumns && rColumnName.Len())
542 					{
543 						nChild = 0;
544 
545 						if (!pParent->HasChilds())
546 							RequestingChilds(pParent);
547 
548 						while ((pChild = GetEntry(pParent, nChild++)) != NULL)
549 							if (rColumnName == GetEntryText(pChild))
550 								break;
551 					}
552 					if (!pChild)
553 						pChild = pParent;
554 
555 					MakeVisible(pChild);
556 					SvTreeListBox::Select(pChild);
557 					return;
558 				}
559 			}
560 		}
561 	}
562 }
563 
564 /*------------------------------------------------------------------------
565  Beschreibung:
566 ------------------------------------------------------------------------*/
567 
StartDrag(sal_Int8,const Point &)568 void SwDBTreeList::StartDrag( sal_Int8 /*nAction*/, const Point& /*rPosPixel*/ )
569 {
570 	String sTableName, sColumnName;
571 	String  sDBName( GetDBName( sTableName, sColumnName ));
572 	if( sDBName.Len() )
573 	{
574 		TransferDataContainer* pContainer = new TransferDataContainer;
575 		STAR_REFERENCE( datatransfer::XTransferable ) xRef( pContainer );
576 		if( sColumnName.Len() )
577 		{
578 			// Datenbankfeld draggen
579 			svx::OColumnTransferable aColTransfer(
580 							sDBName
581 							,::rtl::OUString()
582                             , sdb::CommandType::TABLE
583 							,sTableName
584 							, sColumnName
585 							,(CTF_FIELD_DESCRIPTOR |CTF_COLUMN_DESCRIPTOR ));
586 			aColTransfer.addDataToContainer( pContainer );
587 		}
588 
589 		sDBName += '.';
590 		sDBName += sTableName;
591 		if( sColumnName.Len() )
592 		{
593 			sDBName += '.';
594 			sDBName += sColumnName;
595 		}
596 
597 		pContainer->CopyString( FORMAT_STRING, sDBName );
598 		pContainer->StartDrag( this, DND_ACTION_COPY | DND_ACTION_LINK,
599 								Link() );
600 	}
601 }
602 
603 /*------------------------------------------------------------------------
604  Beschreibung:
605 ------------------------------------------------------------------------*/
AcceptDrop(const AcceptDropEvent &)606 sal_Int8 SwDBTreeList::AcceptDrop( const AcceptDropEvent& /*rEvt*/ )
607 {
608 	return DND_ACTION_NONE;
609 }
610 /*-- 07.10.2003 13:28:22---------------------------------------------------
611 
612   -----------------------------------------------------------------------*/
SetWrtShell(SwWrtShell & rSh)613 void    SwDBTreeList::SetWrtShell(SwWrtShell& rSh)
614 {
615     pImpl->SetWrtShell(rSh);
616     if (IsVisible() && !bInitialized)
617         InitTreeList();
618 }
619