xref: /aoo4110/main/svx/source/form/fmexch.cxx (revision b1cdbd2c)
1*b1cdbd2cSJim Jagielski /**************************************************************
2*b1cdbd2cSJim Jagielski  *
3*b1cdbd2cSJim Jagielski  * Licensed to the Apache Software Foundation (ASF) under one
4*b1cdbd2cSJim Jagielski  * or more contributor license agreements.  See the NOTICE file
5*b1cdbd2cSJim Jagielski  * distributed with this work for additional information
6*b1cdbd2cSJim Jagielski  * regarding copyright ownership.  The ASF licenses this file
7*b1cdbd2cSJim Jagielski  * to you under the Apache License, Version 2.0 (the
8*b1cdbd2cSJim Jagielski  * "License"); you may not use this file except in compliance
9*b1cdbd2cSJim Jagielski  * with the License.  You may obtain a copy of the License at
10*b1cdbd2cSJim Jagielski  *
11*b1cdbd2cSJim Jagielski  *   http://www.apache.org/licenses/LICENSE-2.0
12*b1cdbd2cSJim Jagielski  *
13*b1cdbd2cSJim Jagielski  * Unless required by applicable law or agreed to in writing,
14*b1cdbd2cSJim Jagielski  * software distributed under the License is distributed on an
15*b1cdbd2cSJim Jagielski  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*b1cdbd2cSJim Jagielski  * KIND, either express or implied.  See the License for the
17*b1cdbd2cSJim Jagielski  * specific language governing permissions and limitations
18*b1cdbd2cSJim Jagielski  * under the License.
19*b1cdbd2cSJim Jagielski  *
20*b1cdbd2cSJim Jagielski  *************************************************************/
21*b1cdbd2cSJim Jagielski 
22*b1cdbd2cSJim Jagielski 
23*b1cdbd2cSJim Jagielski 
24*b1cdbd2cSJim Jagielski // MARKER(update_precomp.py): autogen include statement, do not remove
25*b1cdbd2cSJim Jagielski #include "precompiled_svx.hxx"
26*b1cdbd2cSJim Jagielski #include "fmexch.hxx"
27*b1cdbd2cSJim Jagielski 
28*b1cdbd2cSJim Jagielski #include <sot/storage.hxx>
29*b1cdbd2cSJim Jagielski #include <svl/itempool.hxx>
30*b1cdbd2cSJim Jagielski 
31*b1cdbd2cSJim Jagielski #ifndef _SVX_DBEXCH_HRC
32*b1cdbd2cSJim Jagielski #include <svx/dbexch.hrc>
33*b1cdbd2cSJim Jagielski #endif
34*b1cdbd2cSJim Jagielski #include <sot/formats.hxx>
35*b1cdbd2cSJim Jagielski #include <svtools/svtreebx.hxx>
36*b1cdbd2cSJim Jagielski #include <tools/diagnose_ex.h>
37*b1cdbd2cSJim Jagielski 
38*b1cdbd2cSJim Jagielski #define _SVSTDARR_ULONGS
39*b1cdbd2cSJim Jagielski #include <svl/svstdarr.hxx>
40*b1cdbd2cSJim Jagielski 
41*b1cdbd2cSJim Jagielski //........................................................................
42*b1cdbd2cSJim Jagielski namespace svxform
43*b1cdbd2cSJim Jagielski {
44*b1cdbd2cSJim Jagielski //........................................................................
45*b1cdbd2cSJim Jagielski 
46*b1cdbd2cSJim Jagielski 	using namespace ::com::sun::star::uno;
47*b1cdbd2cSJim Jagielski 	using namespace ::com::sun::star::datatransfer;
48*b1cdbd2cSJim Jagielski 
49*b1cdbd2cSJim Jagielski 	//====================================================================
50*b1cdbd2cSJim Jagielski 	//= OLocalExchange
51*b1cdbd2cSJim Jagielski 	//====================================================================
52*b1cdbd2cSJim Jagielski 	//--------------------------------------------------------------------
OLocalExchange()53*b1cdbd2cSJim Jagielski 	OLocalExchange::OLocalExchange( )
54*b1cdbd2cSJim Jagielski 		:m_bDragging( sal_False )
55*b1cdbd2cSJim Jagielski 		,m_bClipboardOwner( sal_False )
56*b1cdbd2cSJim Jagielski 	{
57*b1cdbd2cSJim Jagielski 	}
58*b1cdbd2cSJim Jagielski 
59*b1cdbd2cSJim Jagielski 	//--------------------------------------------------------------------
copyToClipboard(Window * _pWindow,const GrantAccess &)60*b1cdbd2cSJim Jagielski 	void OLocalExchange::copyToClipboard( Window* _pWindow, const GrantAccess& )
61*b1cdbd2cSJim Jagielski 	{
62*b1cdbd2cSJim Jagielski 		if ( m_bClipboardOwner )
63*b1cdbd2cSJim Jagielski 		{	// simulate a lostOwnership to notify parties interested in
64*b1cdbd2cSJim Jagielski 			if ( m_aClipboardListener.IsSet() )
65*b1cdbd2cSJim Jagielski 				m_aClipboardListener.Call( this );
66*b1cdbd2cSJim Jagielski 		}
67*b1cdbd2cSJim Jagielski 
68*b1cdbd2cSJim Jagielski 		m_bClipboardOwner = sal_True;
69*b1cdbd2cSJim Jagielski 		CopyToClipboard( _pWindow );
70*b1cdbd2cSJim Jagielski 	}
71*b1cdbd2cSJim Jagielski 
72*b1cdbd2cSJim Jagielski 	//--------------------------------------------------------------------
clear()73*b1cdbd2cSJim Jagielski 	void OLocalExchange::clear()
74*b1cdbd2cSJim Jagielski 	{
75*b1cdbd2cSJim Jagielski 		if ( isClipboardOwner() )
76*b1cdbd2cSJim Jagielski 		{
77*b1cdbd2cSJim Jagielski 			try
78*b1cdbd2cSJim Jagielski 			{
79*b1cdbd2cSJim Jagielski 				Reference< clipboard::XClipboard > xClipBoard( getOwnClipboard() );
80*b1cdbd2cSJim Jagielski 				if ( xClipBoard.is() )
81*b1cdbd2cSJim Jagielski 					xClipBoard->setContents( NULL, NULL );
82*b1cdbd2cSJim Jagielski 			}
83*b1cdbd2cSJim Jagielski 			catch( const Exception& )
84*b1cdbd2cSJim Jagielski 			{
85*b1cdbd2cSJim Jagielski                 DBG_UNHANDLED_EXCEPTION();
86*b1cdbd2cSJim Jagielski 			}
87*b1cdbd2cSJim Jagielski 			m_bClipboardOwner = sal_False;
88*b1cdbd2cSJim Jagielski 		}
89*b1cdbd2cSJim Jagielski 	}
90*b1cdbd2cSJim Jagielski 
91*b1cdbd2cSJim Jagielski 	//--------------------------------------------------------------------
lostOwnership(const Reference<clipboard::XClipboard> & _rxClipboard,const Reference<XTransferable> & _rxTrans)92*b1cdbd2cSJim Jagielski     void SAL_CALL OLocalExchange::lostOwnership( const Reference< clipboard::XClipboard >& _rxClipboard, const Reference< XTransferable >& _rxTrans ) throw(RuntimeException)
93*b1cdbd2cSJim Jagielski 	{
94*b1cdbd2cSJim Jagielski 		TransferableHelper::implCallOwnLostOwnership( _rxClipboard, _rxTrans );
95*b1cdbd2cSJim Jagielski 		m_bClipboardOwner = sal_False;
96*b1cdbd2cSJim Jagielski 
97*b1cdbd2cSJim Jagielski 		if ( m_aClipboardListener.IsSet() )
98*b1cdbd2cSJim Jagielski 			m_aClipboardListener.Call( this );
99*b1cdbd2cSJim Jagielski 	}
100*b1cdbd2cSJim Jagielski 
101*b1cdbd2cSJim Jagielski 	//--------------------------------------------------------------------
startDrag(Window * _pWindow,sal_Int8 _nDragSourceActions,const GrantAccess &)102*b1cdbd2cSJim Jagielski 	void OLocalExchange::startDrag( Window* _pWindow, sal_Int8 _nDragSourceActions, const GrantAccess& )
103*b1cdbd2cSJim Jagielski 	{
104*b1cdbd2cSJim Jagielski 		m_bDragging = sal_True;
105*b1cdbd2cSJim Jagielski 		StartDrag( _pWindow, _nDragSourceActions );
106*b1cdbd2cSJim Jagielski 	}
107*b1cdbd2cSJim Jagielski 
108*b1cdbd2cSJim Jagielski 	//--------------------------------------------------------------------
DragFinished(sal_Int8 nDropAction)109*b1cdbd2cSJim Jagielski 	void OLocalExchange::DragFinished( sal_Int8 nDropAction )
110*b1cdbd2cSJim Jagielski 	{
111*b1cdbd2cSJim Jagielski 		TransferableHelper::DragFinished( nDropAction );
112*b1cdbd2cSJim Jagielski 		m_bDragging = sal_False;
113*b1cdbd2cSJim Jagielski 	}
114*b1cdbd2cSJim Jagielski 
115*b1cdbd2cSJim Jagielski 	//--------------------------------------------------------------------
hasFormat(const DataFlavorExVector & _rFormats,sal_uInt32 _nFormatId)116*b1cdbd2cSJim Jagielski 	sal_Bool OLocalExchange::hasFormat( const DataFlavorExVector& _rFormats, sal_uInt32 _nFormatId )
117*b1cdbd2cSJim Jagielski 	{
118*b1cdbd2cSJim Jagielski 		DataFlavorExVector::const_iterator aSearch;
119*b1cdbd2cSJim Jagielski 
120*b1cdbd2cSJim Jagielski 		for	( aSearch = _rFormats.begin(); aSearch != _rFormats.end(); ++aSearch )
121*b1cdbd2cSJim Jagielski 			if ( aSearch->mnSotId == _nFormatId )
122*b1cdbd2cSJim Jagielski 				break;
123*b1cdbd2cSJim Jagielski 
124*b1cdbd2cSJim Jagielski 		return aSearch != _rFormats.end();
125*b1cdbd2cSJim Jagielski 	}
126*b1cdbd2cSJim Jagielski 
127*b1cdbd2cSJim Jagielski 	//--------------------------------------------------------------------
GetData(const::com::sun::star::datatransfer::DataFlavor &)128*b1cdbd2cSJim Jagielski 	sal_Bool OLocalExchange::GetData( const ::com::sun::star::datatransfer::DataFlavor& /*_rFlavor*/ )
129*b1cdbd2cSJim Jagielski 	{
130*b1cdbd2cSJim Jagielski 		return sal_False;	// do not have any formats by default
131*b1cdbd2cSJim Jagielski 	}
132*b1cdbd2cSJim Jagielski 
133*b1cdbd2cSJim Jagielski 	//====================================================================
134*b1cdbd2cSJim Jagielski 	//= OControlTransferData
135*b1cdbd2cSJim Jagielski 	//====================================================================
136*b1cdbd2cSJim Jagielski 	//--------------------------------------------------------------------
OControlTransferData()137*b1cdbd2cSJim Jagielski 	OControlTransferData::OControlTransferData( )
138*b1cdbd2cSJim Jagielski 		:m_pFocusEntry( NULL )
139*b1cdbd2cSJim Jagielski 	{
140*b1cdbd2cSJim Jagielski 	}
141*b1cdbd2cSJim Jagielski 
142*b1cdbd2cSJim Jagielski 	//--------------------------------------------------------------------
OControlTransferData(const Reference<XTransferable> & _rxTransferable)143*b1cdbd2cSJim Jagielski 	OControlTransferData::OControlTransferData( const Reference< XTransferable >& _rxTransferable )
144*b1cdbd2cSJim Jagielski 		:m_pFocusEntry( NULL )
145*b1cdbd2cSJim Jagielski 	{
146*b1cdbd2cSJim Jagielski 		TransferableDataHelper aExchangedData( _rxTransferable );
147*b1cdbd2cSJim Jagielski 
148*b1cdbd2cSJim Jagielski 		// try the formats we know
149*b1cdbd2cSJim Jagielski 		if ( OControlExchange::hasControlPathFormat( aExchangedData.GetDataFlavorExVector() ) )
150*b1cdbd2cSJim Jagielski 		{	// paths to the controls, relative to a root
151*b1cdbd2cSJim Jagielski 			Sequence< Any > aControlPathData;
152*b1cdbd2cSJim Jagielski 			if ( aExchangedData.GetAny( OControlExchange::getControlPathFormatId() ) >>= aControlPathData )
153*b1cdbd2cSJim Jagielski 			{
154*b1cdbd2cSJim Jagielski 				DBG_ASSERT( aControlPathData.getLength() >= 2, "OControlTransferData::OControlTransferData: invalid data for the control path format!" );
155*b1cdbd2cSJim Jagielski 				if ( aControlPathData.getLength() >= 2 )
156*b1cdbd2cSJim Jagielski 				{
157*b1cdbd2cSJim Jagielski 					aControlPathData[0] >>= m_xFormsRoot;
158*b1cdbd2cSJim Jagielski 					aControlPathData[1] >>= m_aControlPaths;
159*b1cdbd2cSJim Jagielski 				}
160*b1cdbd2cSJim Jagielski 			}
161*b1cdbd2cSJim Jagielski 			else
162*b1cdbd2cSJim Jagielski 			{
163*b1cdbd2cSJim Jagielski 				DBG_ERROR( "OControlTransferData::OControlTransferData: invalid data for the control path format (2)!" );
164*b1cdbd2cSJim Jagielski 			}
165*b1cdbd2cSJim Jagielski 		}
166*b1cdbd2cSJim Jagielski 		if ( OControlExchange::hasHiddenControlModelsFormat( aExchangedData.GetDataFlavorExVector() ) )
167*b1cdbd2cSJim Jagielski 		{	// sequence of models of hidden controls
168*b1cdbd2cSJim Jagielski 			aExchangedData.GetAny( OControlExchange::getHiddenControlModelsFormatId() ) >>= m_aHiddenControlModels;
169*b1cdbd2cSJim Jagielski 		}
170*b1cdbd2cSJim Jagielski 
171*b1cdbd2cSJim Jagielski 		updateFormats( );
172*b1cdbd2cSJim Jagielski 	}
173*b1cdbd2cSJim Jagielski 
174*b1cdbd2cSJim Jagielski 	//--------------------------------------------------------------------
lcl_fillDataFlavorEx(SotFormatStringId nId,DataFlavorEx & _rFlavor)175*b1cdbd2cSJim Jagielski 	static sal_Bool lcl_fillDataFlavorEx( SotFormatStringId nId, DataFlavorEx& _rFlavor )
176*b1cdbd2cSJim Jagielski 	{
177*b1cdbd2cSJim Jagielski 		_rFlavor.mnSotId = nId;
178*b1cdbd2cSJim Jagielski 		return SotExchange::GetFormatDataFlavor( _rFlavor.mnSotId, _rFlavor );
179*b1cdbd2cSJim Jagielski 	}
180*b1cdbd2cSJim Jagielski 
181*b1cdbd2cSJim Jagielski 	//--------------------------------------------------------------------
updateFormats()182*b1cdbd2cSJim Jagielski 	void OControlTransferData::updateFormats( )
183*b1cdbd2cSJim Jagielski 	{
184*b1cdbd2cSJim Jagielski 		m_aCurrentFormats.clear();
185*b1cdbd2cSJim Jagielski 		m_aCurrentFormats.reserve( 3 );
186*b1cdbd2cSJim Jagielski 
187*b1cdbd2cSJim Jagielski 		DataFlavorEx aFlavor;
188*b1cdbd2cSJim Jagielski 
189*b1cdbd2cSJim Jagielski 		if ( m_aHiddenControlModels.getLength() )
190*b1cdbd2cSJim Jagielski 		{
191*b1cdbd2cSJim Jagielski 			if ( lcl_fillDataFlavorEx( OControlExchange::getHiddenControlModelsFormatId(), aFlavor ) )
192*b1cdbd2cSJim Jagielski 				m_aCurrentFormats.push_back( aFlavor );
193*b1cdbd2cSJim Jagielski 		}
194*b1cdbd2cSJim Jagielski 
195*b1cdbd2cSJim Jagielski 		if ( m_xFormsRoot.is() && m_aControlPaths.getLength() )
196*b1cdbd2cSJim Jagielski 		{
197*b1cdbd2cSJim Jagielski 			if ( lcl_fillDataFlavorEx( OControlExchange::getControlPathFormatId(), aFlavor ) )
198*b1cdbd2cSJim Jagielski 				m_aCurrentFormats.push_back( aFlavor );
199*b1cdbd2cSJim Jagielski 		}
200*b1cdbd2cSJim Jagielski 
201*b1cdbd2cSJim Jagielski 		if ( !m_aSelectedEntries.empty() )
202*b1cdbd2cSJim Jagielski 		{
203*b1cdbd2cSJim Jagielski 			if ( lcl_fillDataFlavorEx( OControlExchange::getFieldExchangeFormatId(), aFlavor ) )
204*b1cdbd2cSJim Jagielski 				m_aCurrentFormats.push_back( aFlavor );
205*b1cdbd2cSJim Jagielski 		}
206*b1cdbd2cSJim Jagielski 	}
207*b1cdbd2cSJim Jagielski 
208*b1cdbd2cSJim Jagielski 	//--------------------------------------------------------------------
onEntryRemoved(SvLBoxEntry * _pEntry)209*b1cdbd2cSJim Jagielski 	size_t OControlTransferData::onEntryRemoved( SvLBoxEntry* _pEntry )
210*b1cdbd2cSJim Jagielski 	{
211*b1cdbd2cSJim Jagielski         m_aSelectedEntries.erase( _pEntry );
212*b1cdbd2cSJim Jagielski         return m_aSelectedEntries.size();
213*b1cdbd2cSJim Jagielski 	}
214*b1cdbd2cSJim Jagielski 
215*b1cdbd2cSJim Jagielski 	//--------------------------------------------------------------------
addSelectedEntry(SvLBoxEntry * _pEntry)216*b1cdbd2cSJim Jagielski 	void OControlTransferData::addSelectedEntry( SvLBoxEntry* _pEntry )
217*b1cdbd2cSJim Jagielski 	{
218*b1cdbd2cSJim Jagielski 		m_aSelectedEntries.insert( _pEntry );
219*b1cdbd2cSJim Jagielski 	}
220*b1cdbd2cSJim Jagielski 
221*b1cdbd2cSJim Jagielski 	//--------------------------------------------------------------------
setFocusEntry(SvLBoxEntry * _pFocusEntry)222*b1cdbd2cSJim Jagielski 	void OControlTransferData::setFocusEntry( SvLBoxEntry* _pFocusEntry )
223*b1cdbd2cSJim Jagielski 	{
224*b1cdbd2cSJim Jagielski 		m_pFocusEntry = _pFocusEntry;
225*b1cdbd2cSJim Jagielski 	}
226*b1cdbd2cSJim Jagielski 
227*b1cdbd2cSJim Jagielski 	//------------------------------------------------------------------------
addHiddenControlsFormat(const::com::sun::star::uno::Sequence<::com::sun::star::uno::Reference<::com::sun::star::uno::XInterface>> seqInterfaces)228*b1cdbd2cSJim Jagielski 	void OControlTransferData::addHiddenControlsFormat(const ::com::sun::star::uno::Sequence< ::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface > > seqInterfaces)
229*b1cdbd2cSJim Jagielski 	{
230*b1cdbd2cSJim Jagielski 		m_aHiddenControlModels = seqInterfaces;
231*b1cdbd2cSJim Jagielski 	}
232*b1cdbd2cSJim Jagielski 
233*b1cdbd2cSJim Jagielski 	//------------------------------------------------------------------------
buildPathFormat(SvTreeListBox * pTreeBox,SvLBoxEntry * pRoot)234*b1cdbd2cSJim Jagielski 	void OControlTransferData::buildPathFormat(SvTreeListBox* pTreeBox, SvLBoxEntry* pRoot)
235*b1cdbd2cSJim Jagielski 	{
236*b1cdbd2cSJim Jagielski 		m_aControlPaths.realloc(0);
237*b1cdbd2cSJim Jagielski 
238*b1cdbd2cSJim Jagielski 		sal_Int32 nEntryCount = m_aSelectedEntries.size();
239*b1cdbd2cSJim Jagielski 		if (nEntryCount == 0)
240*b1cdbd2cSJim Jagielski 			return;
241*b1cdbd2cSJim Jagielski 
242*b1cdbd2cSJim Jagielski 		m_aControlPaths.realloc(nEntryCount);
243*b1cdbd2cSJim Jagielski 		::com::sun::star::uno::Sequence<sal_uInt32>* pAllPaths = m_aControlPaths.getArray();
244*b1cdbd2cSJim Jagielski         for (   ListBoxEntrySet::const_iterator loop = m_aSelectedEntries.begin();
245*b1cdbd2cSJim Jagielski                 loop != m_aSelectedEntries.end();
246*b1cdbd2cSJim Jagielski                 ++loop, ++pAllPaths
247*b1cdbd2cSJim Jagielski             )
248*b1cdbd2cSJim Jagielski 		{
249*b1cdbd2cSJim Jagielski 			// erst mal sammeln wir den Pfad in einem Array ein
250*b1cdbd2cSJim Jagielski 			::std::vector< sal_uInt32 > aCurrentPath;
251*b1cdbd2cSJim Jagielski 			SvLBoxEntry* pCurrentEntry = *loop;
252*b1cdbd2cSJim Jagielski 
253*b1cdbd2cSJim Jagielski 			SvLBoxEntry* pLoop = pCurrentEntry;
254*b1cdbd2cSJim Jagielski 			while (pLoop != pRoot)
255*b1cdbd2cSJim Jagielski 			{
256*b1cdbd2cSJim Jagielski 				aCurrentPath.push_back(pLoop->GetChildListPos());
257*b1cdbd2cSJim Jagielski 				pLoop = pTreeBox->GetParent(pLoop);
258*b1cdbd2cSJim Jagielski 				DBG_ASSERT((pLoop != NULL) || (pRoot == 0), "OControlTransferData::buildPathFormat: invalid root or entry !");
259*b1cdbd2cSJim Jagielski 					// pLoop == NULL heisst, dass ich am oberen Ende angelangt bin, dann sollte das Ganze abbrechen, was nur bei pRoot == NULL der Fall sein wird
260*b1cdbd2cSJim Jagielski 			}
261*b1cdbd2cSJim Jagielski 
262*b1cdbd2cSJim Jagielski 			// dann koennen wir ihn in die ::com::sun::star::uno::Sequence uebertragen
263*b1cdbd2cSJim Jagielski 			Sequence<sal_uInt32>& rCurrentPath = *pAllPaths;
264*b1cdbd2cSJim Jagielski 			sal_Int32 nDepth = aCurrentPath.size();
265*b1cdbd2cSJim Jagielski 
266*b1cdbd2cSJim Jagielski 			rCurrentPath.realloc(nDepth);
267*b1cdbd2cSJim Jagielski 			sal_uInt32* pSeq = rCurrentPath.getArray();
268*b1cdbd2cSJim Jagielski 			sal_Int32 j,k;
269*b1cdbd2cSJim Jagielski 			for (j = nDepth - 1, k = 0; k<nDepth; --j, ++k)
270*b1cdbd2cSJim Jagielski 				pSeq[j] = aCurrentPath[k];
271*b1cdbd2cSJim Jagielski 		}
272*b1cdbd2cSJim Jagielski 	}
273*b1cdbd2cSJim Jagielski 
274*b1cdbd2cSJim Jagielski 	//------------------------------------------------------------------------
buildListFromPath(SvTreeListBox * pTreeBox,SvLBoxEntry * pRoot)275*b1cdbd2cSJim Jagielski 	void OControlTransferData::buildListFromPath(SvTreeListBox* pTreeBox, SvLBoxEntry* pRoot)
276*b1cdbd2cSJim Jagielski 	{
277*b1cdbd2cSJim Jagielski         ListBoxEntrySet aEmpty;
278*b1cdbd2cSJim Jagielski 		m_aSelectedEntries.swap( aEmpty );
279*b1cdbd2cSJim Jagielski 
280*b1cdbd2cSJim Jagielski 		sal_Int32 nControls = m_aControlPaths.getLength();
281*b1cdbd2cSJim Jagielski 		const ::com::sun::star::uno::Sequence<sal_uInt32>* pPaths = m_aControlPaths.getConstArray();
282*b1cdbd2cSJim Jagielski 		for (sal_Int32 i=0; i<nControls; ++i)
283*b1cdbd2cSJim Jagielski 		{
284*b1cdbd2cSJim Jagielski 			sal_Int32 nThisPatLength = pPaths[i].getLength();
285*b1cdbd2cSJim Jagielski 			const sal_uInt32* pThisPath = pPaths[i].getConstArray();
286*b1cdbd2cSJim Jagielski 			SvLBoxEntry* pSearch = pRoot;
287*b1cdbd2cSJim Jagielski 			for (sal_Int32 j=0; j<nThisPatLength; ++j)
288*b1cdbd2cSJim Jagielski 				pSearch = pTreeBox->GetEntry(pSearch, pThisPath[j]);
289*b1cdbd2cSJim Jagielski 
290*b1cdbd2cSJim Jagielski 			m_aSelectedEntries.insert( pSearch );
291*b1cdbd2cSJim Jagielski 		}
292*b1cdbd2cSJim Jagielski 	}
293*b1cdbd2cSJim Jagielski 
294*b1cdbd2cSJim Jagielski 	//====================================================================
295*b1cdbd2cSJim Jagielski 	//= OControlExchange
296*b1cdbd2cSJim Jagielski 	//====================================================================
297*b1cdbd2cSJim Jagielski 	//--------------------------------------------------------------------
OControlExchange()298*b1cdbd2cSJim Jagielski 	OControlExchange::OControlExchange( )
299*b1cdbd2cSJim Jagielski 	{
300*b1cdbd2cSJim Jagielski 	}
301*b1cdbd2cSJim Jagielski 
302*b1cdbd2cSJim Jagielski 	//--------------------------------------------------------------------
GetData(const DataFlavor & _rFlavor)303*b1cdbd2cSJim Jagielski 	sal_Bool OControlExchange::GetData( const DataFlavor& _rFlavor )
304*b1cdbd2cSJim Jagielski 	{
305*b1cdbd2cSJim Jagielski 		const sal_uInt32 nFormatId = SotExchange::GetFormat( _rFlavor );
306*b1cdbd2cSJim Jagielski 
307*b1cdbd2cSJim Jagielski 		if ( getControlPathFormatId( ) == nFormatId )
308*b1cdbd2cSJim Jagielski 		{
309*b1cdbd2cSJim Jagielski 			// ugly. We have to pack all the info into one object
310*b1cdbd2cSJim Jagielski 			Sequence< Any > aCompleteInfo( 2 );
311*b1cdbd2cSJim Jagielski 			OSL_ENSURE( m_xFormsRoot.is(), "OLocalExchange::GetData: invalid forms root for this format!" );
312*b1cdbd2cSJim Jagielski 			aCompleteInfo.getArray()[ 0 ] <<= m_xFormsRoot;
313*b1cdbd2cSJim Jagielski 			aCompleteInfo.getArray()[ 1 ] <<= m_aControlPaths;
314*b1cdbd2cSJim Jagielski 
315*b1cdbd2cSJim Jagielski 			SetAny( makeAny( aCompleteInfo ), _rFlavor );
316*b1cdbd2cSJim Jagielski 		}
317*b1cdbd2cSJim Jagielski 		else if ( getHiddenControlModelsFormatId() == nFormatId )
318*b1cdbd2cSJim Jagielski 		{
319*b1cdbd2cSJim Jagielski 			// just need to transfer the models
320*b1cdbd2cSJim Jagielski 			SetAny( makeAny( m_aHiddenControlModels ), _rFlavor );
321*b1cdbd2cSJim Jagielski 		}
322*b1cdbd2cSJim Jagielski 		else
323*b1cdbd2cSJim Jagielski 			return OLocalExchange::GetData( _rFlavor );
324*b1cdbd2cSJim Jagielski 
325*b1cdbd2cSJim Jagielski 		return sal_True;
326*b1cdbd2cSJim Jagielski 	}
327*b1cdbd2cSJim Jagielski 
328*b1cdbd2cSJim Jagielski 	//--------------------------------------------------------------------
AddSupportedFormats()329*b1cdbd2cSJim Jagielski 	void OControlExchange::AddSupportedFormats()
330*b1cdbd2cSJim Jagielski 	{
331*b1cdbd2cSJim Jagielski 		if (m_pFocusEntry && !m_aSelectedEntries.empty())
332*b1cdbd2cSJim Jagielski 			AddFormat(getFieldExchangeFormatId());
333*b1cdbd2cSJim Jagielski 
334*b1cdbd2cSJim Jagielski 		if (m_aControlPaths.getLength())
335*b1cdbd2cSJim Jagielski 			AddFormat(getControlPathFormatId());
336*b1cdbd2cSJim Jagielski 
337*b1cdbd2cSJim Jagielski 		if (m_aHiddenControlModels.getLength())
338*b1cdbd2cSJim Jagielski 			AddFormat(getHiddenControlModelsFormatId());
339*b1cdbd2cSJim Jagielski 	}
340*b1cdbd2cSJim Jagielski 
341*b1cdbd2cSJim Jagielski 	//--------------------------------------------------------------------
getControlPathFormatId()342*b1cdbd2cSJim Jagielski 	sal_uInt32 OControlExchange::getControlPathFormatId()
343*b1cdbd2cSJim Jagielski 	{
344*b1cdbd2cSJim Jagielski 		static sal_uInt32 s_nFormat = (sal_uInt32)-1;
345*b1cdbd2cSJim Jagielski 		if ((sal_uInt32)-1 == s_nFormat)
346*b1cdbd2cSJim Jagielski 		{
347*b1cdbd2cSJim Jagielski 			s_nFormat = SotExchange::RegisterFormatName(String::CreateFromAscii("application/x-openoffice;windows_formatname=\"svxform.ControlPathExchange\""));
348*b1cdbd2cSJim Jagielski 			DBG_ASSERT((sal_uInt32)-1 != s_nFormat, "OControlExchange::getControlPathFormatId: bad exchange id!");
349*b1cdbd2cSJim Jagielski 		}
350*b1cdbd2cSJim Jagielski 		return s_nFormat;
351*b1cdbd2cSJim Jagielski 	}
352*b1cdbd2cSJim Jagielski 
353*b1cdbd2cSJim Jagielski 	//--------------------------------------------------------------------
getHiddenControlModelsFormatId()354*b1cdbd2cSJim Jagielski 	sal_uInt32 OControlExchange::getHiddenControlModelsFormatId()
355*b1cdbd2cSJim Jagielski 	{
356*b1cdbd2cSJim Jagielski 		static sal_uInt32 s_nFormat = (sal_uInt32)-1;
357*b1cdbd2cSJim Jagielski 		if ((sal_uInt32)-1 == s_nFormat)
358*b1cdbd2cSJim Jagielski 		{
359*b1cdbd2cSJim Jagielski 			s_nFormat = SotExchange::RegisterFormatName(String::CreateFromAscii("application/x-openoffice;windows_formatname=\"svxform.HiddenControlModelsExchange\""));
360*b1cdbd2cSJim Jagielski 			DBG_ASSERT((sal_uInt32)-1 != s_nFormat, "OControlExchange::getHiddenControlModelsFormatId: bad exchange id!");
361*b1cdbd2cSJim Jagielski 		}
362*b1cdbd2cSJim Jagielski 		return s_nFormat;
363*b1cdbd2cSJim Jagielski 	}
364*b1cdbd2cSJim Jagielski 
365*b1cdbd2cSJim Jagielski 	//--------------------------------------------------------------------
getFieldExchangeFormatId()366*b1cdbd2cSJim Jagielski 	sal_uInt32 OControlExchange::getFieldExchangeFormatId()
367*b1cdbd2cSJim Jagielski 	{
368*b1cdbd2cSJim Jagielski 		static sal_uInt32 s_nFormat = (sal_uInt32)-1;
369*b1cdbd2cSJim Jagielski 		if ((sal_uInt32)-1 == s_nFormat)
370*b1cdbd2cSJim Jagielski 		{
371*b1cdbd2cSJim Jagielski 			s_nFormat = SotExchange::RegisterFormatName(String::CreateFromAscii("application/x-openoffice;windows_formatname=\"svxform.FieldNameExchange\""));
372*b1cdbd2cSJim Jagielski 			DBG_ASSERT((sal_uInt32)-1 != s_nFormat, "OControlExchange::getFieldExchangeFormatId: bad exchange id!");
373*b1cdbd2cSJim Jagielski 		}
374*b1cdbd2cSJim Jagielski 		return s_nFormat;
375*b1cdbd2cSJim Jagielski 	}
376*b1cdbd2cSJim Jagielski 
377*b1cdbd2cSJim Jagielski 	//====================================================================
378*b1cdbd2cSJim Jagielski 	//= OControlExchangeHelper
379*b1cdbd2cSJim Jagielski 	//====================================================================
createExchange() const380*b1cdbd2cSJim Jagielski 	OLocalExchange* OControlExchangeHelper::createExchange() const
381*b1cdbd2cSJim Jagielski 	{
382*b1cdbd2cSJim Jagielski 		return new OControlExchange;
383*b1cdbd2cSJim Jagielski 	}
384*b1cdbd2cSJim Jagielski 
385*b1cdbd2cSJim Jagielski 	//====================================================================
386*b1cdbd2cSJim Jagielski 	//= OLocalExchangeHelper
387*b1cdbd2cSJim Jagielski 	//====================================================================
388*b1cdbd2cSJim Jagielski 	//--------------------------------------------------------------------
OLocalExchangeHelper(Window * _pDragSource)389*b1cdbd2cSJim Jagielski 	OLocalExchangeHelper::OLocalExchangeHelper(Window* _pDragSource)
390*b1cdbd2cSJim Jagielski 		:m_pDragSource(_pDragSource)
391*b1cdbd2cSJim Jagielski 		,m_pTransferable(NULL)
392*b1cdbd2cSJim Jagielski 	{
393*b1cdbd2cSJim Jagielski 	}
394*b1cdbd2cSJim Jagielski 
395*b1cdbd2cSJim Jagielski 	//--------------------------------------------------------------------
~OLocalExchangeHelper()396*b1cdbd2cSJim Jagielski 	OLocalExchangeHelper::~OLocalExchangeHelper()
397*b1cdbd2cSJim Jagielski 	{
398*b1cdbd2cSJim Jagielski 		implReset();
399*b1cdbd2cSJim Jagielski 	}
400*b1cdbd2cSJim Jagielski 
401*b1cdbd2cSJim Jagielski 	//--------------------------------------------------------------------
startDrag(sal_Int8 nDragSourceActions)402*b1cdbd2cSJim Jagielski 	void OLocalExchangeHelper::startDrag( sal_Int8 nDragSourceActions )
403*b1cdbd2cSJim Jagielski 	{
404*b1cdbd2cSJim Jagielski 		DBG_ASSERT(m_pTransferable, "OLocalExchangeHelper::startDrag: not prepared!");
405*b1cdbd2cSJim Jagielski 		m_pTransferable->startDrag( m_pDragSource, nDragSourceActions, OLocalExchange::GrantAccess() );
406*b1cdbd2cSJim Jagielski 	}
407*b1cdbd2cSJim Jagielski 
408*b1cdbd2cSJim Jagielski 	//--------------------------------------------------------------------
copyToClipboard() const409*b1cdbd2cSJim Jagielski 	void OLocalExchangeHelper::copyToClipboard( ) const
410*b1cdbd2cSJim Jagielski 	{
411*b1cdbd2cSJim Jagielski 		DBG_ASSERT( m_pTransferable, "OLocalExchangeHelper::copyToClipboard: not prepared!" );
412*b1cdbd2cSJim Jagielski 		m_pTransferable->copyToClipboard( m_pDragSource, OLocalExchange::GrantAccess() );
413*b1cdbd2cSJim Jagielski 	}
414*b1cdbd2cSJim Jagielski 
415*b1cdbd2cSJim Jagielski 	//--------------------------------------------------------------------
implReset()416*b1cdbd2cSJim Jagielski 	void OLocalExchangeHelper::implReset()
417*b1cdbd2cSJim Jagielski 	{
418*b1cdbd2cSJim Jagielski 		if (m_pTransferable)
419*b1cdbd2cSJim Jagielski 		{
420*b1cdbd2cSJim Jagielski 			m_pTransferable->setClipboardListener( Link() );
421*b1cdbd2cSJim Jagielski 			m_pTransferable->release();
422*b1cdbd2cSJim Jagielski 			m_pTransferable = NULL;
423*b1cdbd2cSJim Jagielski 		}
424*b1cdbd2cSJim Jagielski 	}
425*b1cdbd2cSJim Jagielski 
426*b1cdbd2cSJim Jagielski 	//--------------------------------------------------------------------
prepareDrag()427*b1cdbd2cSJim Jagielski 	void OLocalExchangeHelper::prepareDrag( )
428*b1cdbd2cSJim Jagielski 	{
429*b1cdbd2cSJim Jagielski 		DBG_ASSERT(!m_pTransferable || !m_pTransferable->isDragging(), "OLocalExchangeHelper::prepareDrag: recursive DnD?");
430*b1cdbd2cSJim Jagielski 
431*b1cdbd2cSJim Jagielski 		implReset();
432*b1cdbd2cSJim Jagielski 		m_pTransferable = createExchange();
433*b1cdbd2cSJim Jagielski 		m_pTransferable->acquire();
434*b1cdbd2cSJim Jagielski 	}
435*b1cdbd2cSJim Jagielski 
436*b1cdbd2cSJim Jagielski //........................................................................
437*b1cdbd2cSJim Jagielski }
438*b1cdbd2cSJim Jagielski //........................................................................
439*b1cdbd2cSJim Jagielski 
440