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_svtools.hxx"
26*b1cdbd2cSJim Jagielski 
27*b1cdbd2cSJim Jagielski #define _SVTREEBX_CXX
28*b1cdbd2cSJim Jagielski #include <tools/debug.hxx>
29*b1cdbd2cSJim Jagielski #include <com/sun/star/lang/XServiceInfo.hpp>
30*b1cdbd2cSJim Jagielski #include <com/sun/star/lang/DisposedException.hpp>
31*b1cdbd2cSJim Jagielski #include <com/sun/star/view/SelectionType.hpp>
32*b1cdbd2cSJim Jagielski #include <toolkit/helper/property.hxx>
33*b1cdbd2cSJim Jagielski #include <toolkit/helper/vclunohelper.hxx>
34*b1cdbd2cSJim Jagielski 
35*b1cdbd2cSJim Jagielski #include <com/sun/star/awt/tree/XMutableTreeNode.hpp>
36*b1cdbd2cSJim Jagielski #include <treecontrolpeer.hxx>
37*b1cdbd2cSJim Jagielski #include <comphelper/processfactory.hxx>
38*b1cdbd2cSJim Jagielski 
39*b1cdbd2cSJim Jagielski #include <rtl/ref.hxx>
40*b1cdbd2cSJim Jagielski #include <vcl/graph.hxx>
41*b1cdbd2cSJim Jagielski #include <svtools/svtreebx.hxx>
42*b1cdbd2cSJim Jagielski 
43*b1cdbd2cSJim Jagielski #include <map>
44*b1cdbd2cSJim Jagielski 
45*b1cdbd2cSJim Jagielski using ::rtl::OUString;
46*b1cdbd2cSJim Jagielski using namespace ::com::sun::star;
47*b1cdbd2cSJim Jagielski using namespace ::com::sun::star::uno;
48*b1cdbd2cSJim Jagielski using namespace ::com::sun::star::lang;
49*b1cdbd2cSJim Jagielski using namespace ::com::sun::star::awt::tree;
50*b1cdbd2cSJim Jagielski using namespace ::com::sun::star::beans;
51*b1cdbd2cSJim Jagielski using namespace ::com::sun::star::view;
52*b1cdbd2cSJim Jagielski using namespace ::com::sun::star::container;
53*b1cdbd2cSJim Jagielski using namespace ::com::sun::star::util;
54*b1cdbd2cSJim Jagielski using namespace ::com::sun::star::graphic;
55*b1cdbd2cSJim Jagielski 
56*b1cdbd2cSJim Jagielski #define O(x) OUString( RTL_CONSTASCII_USTRINGPARAM(x) )
57*b1cdbd2cSJim Jagielski 
58*b1cdbd2cSJim Jagielski struct LockGuard
59*b1cdbd2cSJim Jagielski {
60*b1cdbd2cSJim Jagielski public:
LockGuardLockGuard61*b1cdbd2cSJim Jagielski 	LockGuard( sal_Int32& rLock )
62*b1cdbd2cSJim Jagielski 	: mrLock( rLock )
63*b1cdbd2cSJim Jagielski 	{
64*b1cdbd2cSJim Jagielski 		rLock++;
65*b1cdbd2cSJim Jagielski 	}
66*b1cdbd2cSJim Jagielski 
~LockGuardLockGuard67*b1cdbd2cSJim Jagielski 	~LockGuard()
68*b1cdbd2cSJim Jagielski 	{
69*b1cdbd2cSJim Jagielski 		mrLock--;
70*b1cdbd2cSJim Jagielski 	}
71*b1cdbd2cSJim Jagielski 
72*b1cdbd2cSJim Jagielski 	sal_Int32& mrLock;
73*b1cdbd2cSJim Jagielski };
74*b1cdbd2cSJim Jagielski 
75*b1cdbd2cSJim Jagielski // --------------------------------------------------------------------
76*b1cdbd2cSJim Jagielski 
77*b1cdbd2cSJim Jagielski class ImplGraphicItem : public SvLBoxBmp
78*b1cdbd2cSJim Jagielski {
79*b1cdbd2cSJim Jagielski public:
ImplGraphicItem(SvLBoxEntry * pEntry,sal_uInt16 nFlags,Image & aImage)80*b1cdbd2cSJim Jagielski 	ImplGraphicItem( SvLBoxEntry* pEntry, sal_uInt16 nFlags, Image& aImage ) : SvLBoxBmp( pEntry, nFlags, aImage ) {}
81*b1cdbd2cSJim Jagielski 
82*b1cdbd2cSJim Jagielski 	OUString msGraphicURL;
83*b1cdbd2cSJim Jagielski };
84*b1cdbd2cSJim Jagielski 
85*b1cdbd2cSJim Jagielski // --------------------------------------------------------------------
86*b1cdbd2cSJim Jagielski 
87*b1cdbd2cSJim Jagielski class ImplContextGraphicItem : public SvLBoxContextBmp
88*b1cdbd2cSJim Jagielski {
89*b1cdbd2cSJim Jagielski public:
ImplContextGraphicItem(SvLBoxEntry * pEntry,sal_uInt16 nFlags,Image & rI1,Image & rI2,sal_uInt16 nEntryFlagsBmp1)90*b1cdbd2cSJim Jagielski 	ImplContextGraphicItem( SvLBoxEntry* pEntry,sal_uInt16 nFlags,Image& rI1,Image& rI2, sal_uInt16 nEntryFlagsBmp1)
91*b1cdbd2cSJim Jagielski 		: SvLBoxContextBmp( pEntry, nFlags, rI1, rI2, nEntryFlagsBmp1 ) {}
92*b1cdbd2cSJim Jagielski 
93*b1cdbd2cSJim Jagielski 	OUString msExpandedGraphicURL;
94*b1cdbd2cSJim Jagielski 	OUString msCollapsedGraphicURL;
95*b1cdbd2cSJim Jagielski };
96*b1cdbd2cSJim Jagielski 
97*b1cdbd2cSJim Jagielski // --------------------------------------------------------------------
98*b1cdbd2cSJim Jagielski 
99*b1cdbd2cSJim Jagielski class UnoTreeListBoxImpl : public SvTreeListBox
100*b1cdbd2cSJim Jagielski {
101*b1cdbd2cSJim Jagielski public:
102*b1cdbd2cSJim Jagielski 	UnoTreeListBoxImpl( TreeControlPeer* pPeer, Window* pParent, WinBits nWinStyle );
103*b1cdbd2cSJim Jagielski 	~UnoTreeListBoxImpl();
104*b1cdbd2cSJim Jagielski 
105*b1cdbd2cSJim Jagielski 	sal_uInt32 insert( SvLBoxEntry* pEntry,SvLBoxEntry* pParent,sal_uLong nPos=LIST_APPEND );
106*b1cdbd2cSJim Jagielski 
107*b1cdbd2cSJim Jagielski 	virtual void	RequestingChilds( SvLBoxEntry* pParent );
108*b1cdbd2cSJim Jagielski 
109*b1cdbd2cSJim Jagielski 	virtual sal_Bool	EditingEntry( SvLBoxEntry* pEntry, Selection& );
110*b1cdbd2cSJim Jagielski 	virtual sal_Bool	EditedEntry( SvLBoxEntry* pEntry, const XubString& rNewText );
111*b1cdbd2cSJim Jagielski 
112*b1cdbd2cSJim Jagielski 	DECL_LINK( OnSelectionChangeHdl, UnoTreeListBoxImpl* );
113*b1cdbd2cSJim Jagielski 	DECL_LINK( OnExpandingHdl, UnoTreeListBoxImpl* );
114*b1cdbd2cSJim Jagielski 	DECL_LINK( OnExpandedHdl, UnoTreeListBoxImpl* );
115*b1cdbd2cSJim Jagielski 
116*b1cdbd2cSJim Jagielski private:
117*b1cdbd2cSJim Jagielski 	rtl::Reference< TreeControlPeer > mxPeer;
118*b1cdbd2cSJim Jagielski };
119*b1cdbd2cSJim Jagielski 
120*b1cdbd2cSJim Jagielski // --------------------------------------------------------------------
121*b1cdbd2cSJim Jagielski 
122*b1cdbd2cSJim Jagielski class SVT_DLLPUBLIC UnoTreeListItem : public SvLBoxItem
123*b1cdbd2cSJim Jagielski {
124*b1cdbd2cSJim Jagielski public:
125*b1cdbd2cSJim Jagielski 					UnoTreeListItem( SvLBoxEntry* );
126*b1cdbd2cSJim Jagielski 					UnoTreeListItem();
127*b1cdbd2cSJim Jagielski 	virtual			~UnoTreeListItem();
128*b1cdbd2cSJim Jagielski 	virtual sal_uInt16	IsA();
129*b1cdbd2cSJim Jagielski 	void			InitViewData( SvLBox*,SvLBoxEntry*,SvViewDataItem* );
130*b1cdbd2cSJim Jagielski 	OUString		GetText() const;
131*b1cdbd2cSJim Jagielski 	void 			SetText( const OUString& rText );
132*b1cdbd2cSJim Jagielski 	Image			GetImage() const;
133*b1cdbd2cSJim Jagielski 	void			SetImage( const Image& rImage );
134*b1cdbd2cSJim Jagielski 	OUString		GetGraphicURL() const;
135*b1cdbd2cSJim Jagielski 	void			SetGraphicURL( const OUString& rGraphicURL );
136*b1cdbd2cSJim Jagielski 	void			Paint( const Point&, SvLBox& rDev, sal_uInt16 nFlags,SvLBoxEntry* );
137*b1cdbd2cSJim Jagielski 	SvLBoxItem* 	Create() const;
138*b1cdbd2cSJim Jagielski 	void 			Clone( SvLBoxItem* pSource );
139*b1cdbd2cSJim Jagielski 
140*b1cdbd2cSJim Jagielski private:
141*b1cdbd2cSJim Jagielski 	OUString		maText;
142*b1cdbd2cSJim Jagielski 	OUString		maGraphicURL;
143*b1cdbd2cSJim Jagielski 	Image			maImage;
144*b1cdbd2cSJim Jagielski };
145*b1cdbd2cSJim Jagielski 
146*b1cdbd2cSJim Jagielski // --------------------------------------------------------------------
147*b1cdbd2cSJim Jagielski 
148*b1cdbd2cSJim Jagielski class UnoTreeListEntry : public SvLBoxEntry
149*b1cdbd2cSJim Jagielski {
150*b1cdbd2cSJim Jagielski public:
151*b1cdbd2cSJim Jagielski 	UnoTreeListEntry( const Reference< XTreeNode >& xNode, TreeControlPeer* pPeer );
152*b1cdbd2cSJim Jagielski 	virtual ~UnoTreeListEntry();
153*b1cdbd2cSJim Jagielski 
154*b1cdbd2cSJim Jagielski 	Reference< XTreeNode > mxNode;
155*b1cdbd2cSJim Jagielski 	TreeControlPeer* mpPeer;
156*b1cdbd2cSJim Jagielski };
157*b1cdbd2cSJim Jagielski 
158*b1cdbd2cSJim Jagielski // --------------------------------------------------------------------
159*b1cdbd2cSJim Jagielski 
160*b1cdbd2cSJim Jagielski class TreeNodeMap : public std::map< Reference< XTreeNode >, UnoTreeListEntry* >
161*b1cdbd2cSJim Jagielski {
162*b1cdbd2cSJim Jagielski };
163*b1cdbd2cSJim Jagielski 
164*b1cdbd2cSJim Jagielski // --------------------------------------------------------------------
165*b1cdbd2cSJim Jagielski 
TreeControlPeer()166*b1cdbd2cSJim Jagielski TreeControlPeer::TreeControlPeer()
167*b1cdbd2cSJim Jagielski : maSelectionListeners( *this )
168*b1cdbd2cSJim Jagielski , maTreeExpansionListeners( *this )
169*b1cdbd2cSJim Jagielski , maTreeEditListeners( *this )
170*b1cdbd2cSJim Jagielski , mpTreeImpl( 0 )
171*b1cdbd2cSJim Jagielski , mnEditLock( 0 )
172*b1cdbd2cSJim Jagielski , mpTreeNodeMap( 0 )
173*b1cdbd2cSJim Jagielski {
174*b1cdbd2cSJim Jagielski }
175*b1cdbd2cSJim Jagielski 
176*b1cdbd2cSJim Jagielski // --------------------------------------------------------------------
177*b1cdbd2cSJim Jagielski 
~TreeControlPeer()178*b1cdbd2cSJim Jagielski TreeControlPeer::~TreeControlPeer()
179*b1cdbd2cSJim Jagielski {
180*b1cdbd2cSJim Jagielski 	if( mpTreeImpl )
181*b1cdbd2cSJim Jagielski 		mpTreeImpl->Clear();
182*b1cdbd2cSJim Jagielski 	delete mpTreeNodeMap;
183*b1cdbd2cSJim Jagielski }
184*b1cdbd2cSJim Jagielski 
185*b1cdbd2cSJim Jagielski // --------------------------------------------------------------------
186*b1cdbd2cSJim Jagielski 
addEntry(UnoTreeListEntry * pEntry)187*b1cdbd2cSJim Jagielski void TreeControlPeer::addEntry( UnoTreeListEntry* pEntry )
188*b1cdbd2cSJim Jagielski {
189*b1cdbd2cSJim Jagielski 	if( pEntry && pEntry->mxNode.is() )
190*b1cdbd2cSJim Jagielski 	{
191*b1cdbd2cSJim Jagielski 		if( !mpTreeNodeMap )
192*b1cdbd2cSJim Jagielski 		{
193*b1cdbd2cSJim Jagielski 			mpTreeNodeMap = new TreeNodeMap();
194*b1cdbd2cSJim Jagielski 		}
195*b1cdbd2cSJim Jagielski 
196*b1cdbd2cSJim Jagielski 		(*mpTreeNodeMap)[ pEntry->mxNode ] = pEntry;
197*b1cdbd2cSJim Jagielski 	}
198*b1cdbd2cSJim Jagielski }
199*b1cdbd2cSJim Jagielski 
200*b1cdbd2cSJim Jagielski // --------------------------------------------------------------------
201*b1cdbd2cSJim Jagielski 
removeEntry(UnoTreeListEntry * pEntry)202*b1cdbd2cSJim Jagielski void TreeControlPeer::removeEntry( UnoTreeListEntry* pEntry )
203*b1cdbd2cSJim Jagielski {
204*b1cdbd2cSJim Jagielski 	if( mpTreeNodeMap && pEntry && pEntry->mxNode.is() )
205*b1cdbd2cSJim Jagielski 	{
206*b1cdbd2cSJim Jagielski 		TreeNodeMap::iterator aIter( mpTreeNodeMap->find( pEntry->mxNode ) );
207*b1cdbd2cSJim Jagielski 		if( aIter != mpTreeNodeMap->end() )
208*b1cdbd2cSJim Jagielski         {
209*b1cdbd2cSJim Jagielski 			mpTreeNodeMap->erase( aIter );
210*b1cdbd2cSJim Jagielski         }
211*b1cdbd2cSJim Jagielski 	}
212*b1cdbd2cSJim Jagielski }
213*b1cdbd2cSJim Jagielski 
214*b1cdbd2cSJim Jagielski // --------------------------------------------------------------------
215*b1cdbd2cSJim Jagielski 
getEntry(const Reference<XTreeNode> & xNode,bool bThrow)216*b1cdbd2cSJim Jagielski UnoTreeListEntry* TreeControlPeer::getEntry( const Reference< XTreeNode >& xNode, bool bThrow /* = true */ ) throw( IllegalArgumentException )
217*b1cdbd2cSJim Jagielski {
218*b1cdbd2cSJim Jagielski 	if( mpTreeNodeMap )
219*b1cdbd2cSJim Jagielski 	{
220*b1cdbd2cSJim Jagielski 		TreeNodeMap::iterator aIter( mpTreeNodeMap->find( xNode ) );
221*b1cdbd2cSJim Jagielski 		if( aIter != mpTreeNodeMap->end() )
222*b1cdbd2cSJim Jagielski 			return (*aIter).second;
223*b1cdbd2cSJim Jagielski 	}
224*b1cdbd2cSJim Jagielski 
225*b1cdbd2cSJim Jagielski 	if( bThrow )
226*b1cdbd2cSJim Jagielski 		throw IllegalArgumentException();
227*b1cdbd2cSJim Jagielski 
228*b1cdbd2cSJim Jagielski 	return 0;
229*b1cdbd2cSJim Jagielski }
230*b1cdbd2cSJim Jagielski 
231*b1cdbd2cSJim Jagielski // --------------------------------------------------------------------
232*b1cdbd2cSJim Jagielski 
createVclControl(Window * pParent,sal_Int64 nWinStyle)233*b1cdbd2cSJim Jagielski Window* TreeControlPeer::createVclControl( Window* pParent, sal_Int64 nWinStyle )
234*b1cdbd2cSJim Jagielski {
235*b1cdbd2cSJim Jagielski 	mpTreeImpl = new UnoTreeListBoxImpl( this, pParent, nWinStyle );
236*b1cdbd2cSJim Jagielski 	return mpTreeImpl;
237*b1cdbd2cSJim Jagielski }
238*b1cdbd2cSJim Jagielski 
239*b1cdbd2cSJim Jagielski // --------------------------------------------------------------------
240*b1cdbd2cSJim Jagielski 
241*b1cdbd2cSJim Jagielski /** called from the UnoTreeListBoxImpl when it gets deleted */
disposeControl()242*b1cdbd2cSJim Jagielski void TreeControlPeer::disposeControl()
243*b1cdbd2cSJim Jagielski {
244*b1cdbd2cSJim Jagielski 	delete mpTreeNodeMap;
245*b1cdbd2cSJim Jagielski 	mpTreeNodeMap = 0;
246*b1cdbd2cSJim Jagielski 	mpTreeImpl = 0;
247*b1cdbd2cSJim Jagielski }
248*b1cdbd2cSJim Jagielski 
249*b1cdbd2cSJim Jagielski // --------------------------------------------------------------------
250*b1cdbd2cSJim Jagielski 
SetWindow(Window * pWindow)251*b1cdbd2cSJim Jagielski void TreeControlPeer::SetWindow( Window* pWindow )
252*b1cdbd2cSJim Jagielski {
253*b1cdbd2cSJim Jagielski 	VCLXWindow::SetWindow( pWindow );
254*b1cdbd2cSJim Jagielski }
255*b1cdbd2cSJim Jagielski 
256*b1cdbd2cSJim Jagielski // --------------------------------------------------------------------
257*b1cdbd2cSJim Jagielski 
createEntry(const Reference<XTreeNode> & xNode,UnoTreeListEntry * pParent,sal_uLong nPos)258*b1cdbd2cSJim Jagielski UnoTreeListEntry* TreeControlPeer::createEntry( const Reference< XTreeNode >& xNode, UnoTreeListEntry* pParent, sal_uLong nPos /* = LIST_APPEND */ )
259*b1cdbd2cSJim Jagielski {
260*b1cdbd2cSJim Jagielski 	UnoTreeListEntry* pEntry = 0;
261*b1cdbd2cSJim Jagielski 	if( mpTreeImpl )
262*b1cdbd2cSJim Jagielski 	{
263*b1cdbd2cSJim Jagielski 		Image aImage;
264*b1cdbd2cSJim Jagielski 		pEntry = new UnoTreeListEntry( xNode, this );
265*b1cdbd2cSJim Jagielski 		ImplContextGraphicItem* pContextBmp= new ImplContextGraphicItem( pEntry,0, aImage, aImage, SVLISTENTRYFLAG_EXPANDED );
266*b1cdbd2cSJim Jagielski 
267*b1cdbd2cSJim Jagielski 		pEntry->AddItem( pContextBmp );
268*b1cdbd2cSJim Jagielski 
269*b1cdbd2cSJim Jagielski 		UnoTreeListItem * pUnoItem = new UnoTreeListItem( pEntry );
270*b1cdbd2cSJim Jagielski 
271*b1cdbd2cSJim Jagielski 		if( xNode->getNodeGraphicURL().getLength() )
272*b1cdbd2cSJim Jagielski 		{
273*b1cdbd2cSJim Jagielski 			pUnoItem->SetGraphicURL( xNode->getNodeGraphicURL() );
274*b1cdbd2cSJim Jagielski 			Image aNodeImage;
275*b1cdbd2cSJim Jagielski 			loadImage( xNode->getNodeGraphicURL(), aNodeImage );
276*b1cdbd2cSJim Jagielski 			pUnoItem->SetImage( aNodeImage );
277*b1cdbd2cSJim Jagielski 			mpTreeImpl->AdjustEntryHeight( aNodeImage );
278*b1cdbd2cSJim Jagielski 		}
279*b1cdbd2cSJim Jagielski 
280*b1cdbd2cSJim Jagielski 		pEntry->AddItem( pUnoItem );
281*b1cdbd2cSJim Jagielski 
282*b1cdbd2cSJim Jagielski 		mpTreeImpl->insert( pEntry, pParent, nPos );
283*b1cdbd2cSJim Jagielski 
284*b1cdbd2cSJim Jagielski         if( msDefaultExpandedGraphicURL.getLength() )
285*b1cdbd2cSJim Jagielski 			mpTreeImpl->SetExpandedEntryBmp( pEntry, maDefaultExpandedImage );
286*b1cdbd2cSJim Jagielski 
287*b1cdbd2cSJim Jagielski 		if( msDefaultCollapsedGraphicURL.getLength() )
288*b1cdbd2cSJim Jagielski 			mpTreeImpl->SetCollapsedEntryBmp( pEntry, maDefaultCollapsedImage );
289*b1cdbd2cSJim Jagielski 
290*b1cdbd2cSJim Jagielski 		updateEntry( pEntry );
291*b1cdbd2cSJim Jagielski 	}
292*b1cdbd2cSJim Jagielski 	return pEntry;
293*b1cdbd2cSJim Jagielski }
294*b1cdbd2cSJim Jagielski 
295*b1cdbd2cSJim Jagielski // --------------------------------------------------------------------
296*b1cdbd2cSJim Jagielski 
updateEntry(UnoTreeListEntry * pEntry)297*b1cdbd2cSJim Jagielski bool TreeControlPeer::updateEntry( UnoTreeListEntry* pEntry )
298*b1cdbd2cSJim Jagielski {
299*b1cdbd2cSJim Jagielski 	bool bChanged = false;
300*b1cdbd2cSJim Jagielski 	if( pEntry && pEntry->mxNode.is() && mpTreeImpl )
301*b1cdbd2cSJim Jagielski 	{
302*b1cdbd2cSJim Jagielski 		const OUString aValue( getEntryString( pEntry->mxNode->getDisplayValue() ) );
303*b1cdbd2cSJim Jagielski 		UnoTreeListItem* pUnoItem = dynamic_cast< UnoTreeListItem* >( pEntry->GetItem( 1 ) );
304*b1cdbd2cSJim Jagielski 		if( pUnoItem )
305*b1cdbd2cSJim Jagielski 		{
306*b1cdbd2cSJim Jagielski 			if( aValue != pUnoItem->GetText() )
307*b1cdbd2cSJim Jagielski 			{
308*b1cdbd2cSJim Jagielski 				pUnoItem->SetText( aValue );
309*b1cdbd2cSJim Jagielski 				bChanged = true;
310*b1cdbd2cSJim Jagielski 			}
311*b1cdbd2cSJim Jagielski 
312*b1cdbd2cSJim Jagielski 			if( pUnoItem->GetGraphicURL() != pEntry->mxNode->getNodeGraphicURL() )
313*b1cdbd2cSJim Jagielski 			{
314*b1cdbd2cSJim Jagielski 				Image aImage;
315*b1cdbd2cSJim Jagielski 				if( loadImage( pEntry->mxNode->getNodeGraphicURL(), aImage ) )
316*b1cdbd2cSJim Jagielski 				{
317*b1cdbd2cSJim Jagielski 					pUnoItem->SetGraphicURL( pEntry->mxNode->getNodeGraphicURL() );
318*b1cdbd2cSJim Jagielski 					pUnoItem->SetImage( aImage );
319*b1cdbd2cSJim Jagielski 					mpTreeImpl->AdjustEntryHeight( aImage );
320*b1cdbd2cSJim Jagielski 					bChanged = true;
321*b1cdbd2cSJim Jagielski 				}
322*b1cdbd2cSJim Jagielski 			}
323*b1cdbd2cSJim Jagielski 		}
324*b1cdbd2cSJim Jagielski 
325*b1cdbd2cSJim Jagielski 		if( (pEntry->mxNode->hasChildrenOnDemand() == sal_True) != (pEntry->HasChildsOnDemand() == sal_True) )
326*b1cdbd2cSJim Jagielski 		{
327*b1cdbd2cSJim Jagielski 			pEntry->EnableChildsOnDemand( pEntry->mxNode->hasChildrenOnDemand() ? sal_True : sal_False );
328*b1cdbd2cSJim Jagielski 			bChanged = true;
329*b1cdbd2cSJim Jagielski 		}
330*b1cdbd2cSJim Jagielski 
331*b1cdbd2cSJim Jagielski 		ImplContextGraphicItem* pContextGraphicItem = dynamic_cast< ImplContextGraphicItem* >( pEntry->GetItem( 0 ) );
332*b1cdbd2cSJim Jagielski 		if( pContextGraphicItem )
333*b1cdbd2cSJim Jagielski 		{
334*b1cdbd2cSJim Jagielski 			if( pContextGraphicItem->msExpandedGraphicURL != pEntry->mxNode->getExpandedGraphicURL() )
335*b1cdbd2cSJim Jagielski 			{
336*b1cdbd2cSJim Jagielski 				Image aImage;
337*b1cdbd2cSJim Jagielski 				if(	loadImage( pEntry->mxNode->getExpandedGraphicURL(), aImage ) )
338*b1cdbd2cSJim Jagielski 				{
339*b1cdbd2cSJim Jagielski 					pContextGraphicItem->msExpandedGraphicURL = pEntry->mxNode->getExpandedGraphicURL();
340*b1cdbd2cSJim Jagielski 					mpTreeImpl->SetExpandedEntryBmp( pEntry, aImage );
341*b1cdbd2cSJim Jagielski 					bChanged = true;
342*b1cdbd2cSJim Jagielski 				}
343*b1cdbd2cSJim Jagielski 			}
344*b1cdbd2cSJim Jagielski 			if( pContextGraphicItem->msCollapsedGraphicURL != pEntry->mxNode->getCollapsedGraphicURL() )
345*b1cdbd2cSJim Jagielski 			{
346*b1cdbd2cSJim Jagielski 				Image aImage;
347*b1cdbd2cSJim Jagielski 				if(	loadImage( pEntry->mxNode->getCollapsedGraphicURL(), aImage ) )
348*b1cdbd2cSJim Jagielski 				{
349*b1cdbd2cSJim Jagielski 					pContextGraphicItem->msCollapsedGraphicURL = pEntry->mxNode->getCollapsedGraphicURL();
350*b1cdbd2cSJim Jagielski 					mpTreeImpl->SetCollapsedEntryBmp( pEntry, aImage );
351*b1cdbd2cSJim Jagielski 					bChanged = true;
352*b1cdbd2cSJim Jagielski 				}
353*b1cdbd2cSJim Jagielski 			}
354*b1cdbd2cSJim Jagielski 		}
355*b1cdbd2cSJim Jagielski 
356*b1cdbd2cSJim Jagielski 		if( bChanged )
357*b1cdbd2cSJim Jagielski 			mpTreeImpl->GetModel()->InvalidateEntry( pEntry );
358*b1cdbd2cSJim Jagielski 	}
359*b1cdbd2cSJim Jagielski 
360*b1cdbd2cSJim Jagielski 	return bChanged;
361*b1cdbd2cSJim Jagielski }
362*b1cdbd2cSJim Jagielski 
363*b1cdbd2cSJim Jagielski // --------------------------------------------------------------------
364*b1cdbd2cSJim Jagielski 
onSelectionChanged()365*b1cdbd2cSJim Jagielski void TreeControlPeer::onSelectionChanged()
366*b1cdbd2cSJim Jagielski {
367*b1cdbd2cSJim Jagielski 	Reference< XInterface > xSource( static_cast< ::cppu::OWeakObject* >( this ) );
368*b1cdbd2cSJim Jagielski 	EventObject aEvent( xSource );
369*b1cdbd2cSJim Jagielski 	maSelectionListeners.selectionChanged( aEvent );
370*b1cdbd2cSJim Jagielski }
371*b1cdbd2cSJim Jagielski 
372*b1cdbd2cSJim Jagielski // --------------------------------------------------------------------
373*b1cdbd2cSJim Jagielski 
onRequestChildNodes(const Reference<XTreeNode> & xNode)374*b1cdbd2cSJim Jagielski void TreeControlPeer::onRequestChildNodes( const Reference< XTreeNode >& xNode )
375*b1cdbd2cSJim Jagielski {
376*b1cdbd2cSJim Jagielski 	try
377*b1cdbd2cSJim Jagielski 	{
378*b1cdbd2cSJim Jagielski 		Reference< XInterface > xSource( static_cast< ::cppu::OWeakObject* >( this ) );
379*b1cdbd2cSJim Jagielski 		TreeExpansionEvent aEvent( xSource, xNode );
380*b1cdbd2cSJim Jagielski 		maTreeExpansionListeners.requestChildNodes( aEvent );
381*b1cdbd2cSJim Jagielski 	}
382*b1cdbd2cSJim Jagielski 	catch( Exception& )
383*b1cdbd2cSJim Jagielski 	{
384*b1cdbd2cSJim Jagielski 	}
385*b1cdbd2cSJim Jagielski }
386*b1cdbd2cSJim Jagielski 
387*b1cdbd2cSJim Jagielski // --------------------------------------------------------------------
388*b1cdbd2cSJim Jagielski 
onExpanding(const Reference<XTreeNode> & xNode,bool bExpanding)389*b1cdbd2cSJim Jagielski bool TreeControlPeer::onExpanding( const Reference< XTreeNode >& xNode, bool bExpanding )
390*b1cdbd2cSJim Jagielski {
391*b1cdbd2cSJim Jagielski 	try
392*b1cdbd2cSJim Jagielski 	{
393*b1cdbd2cSJim Jagielski 		Reference< XInterface > xSource( static_cast< ::cppu::OWeakObject* >( this ) );
394*b1cdbd2cSJim Jagielski 		TreeExpansionEvent aEvent( xSource, xNode );
395*b1cdbd2cSJim Jagielski 		if( bExpanding )
396*b1cdbd2cSJim Jagielski 		{
397*b1cdbd2cSJim Jagielski 			maTreeExpansionListeners.treeExpanding( aEvent );
398*b1cdbd2cSJim Jagielski 		}
399*b1cdbd2cSJim Jagielski 		else
400*b1cdbd2cSJim Jagielski 		{
401*b1cdbd2cSJim Jagielski 			maTreeExpansionListeners.treeCollapsing( aEvent );
402*b1cdbd2cSJim Jagielski 		}
403*b1cdbd2cSJim Jagielski 	}
404*b1cdbd2cSJim Jagielski 	catch( Exception& )
405*b1cdbd2cSJim Jagielski 	{
406*b1cdbd2cSJim Jagielski 		return false;
407*b1cdbd2cSJim Jagielski 	}
408*b1cdbd2cSJim Jagielski 	return true;
409*b1cdbd2cSJim Jagielski }
410*b1cdbd2cSJim Jagielski 
411*b1cdbd2cSJim Jagielski // --------------------------------------------------------------------
412*b1cdbd2cSJim Jagielski 
onExpanded(const Reference<XTreeNode> & xNode,bool bExpanding)413*b1cdbd2cSJim Jagielski void TreeControlPeer::onExpanded( const Reference< XTreeNode >& xNode, bool bExpanding )
414*b1cdbd2cSJim Jagielski {
415*b1cdbd2cSJim Jagielski 	try
416*b1cdbd2cSJim Jagielski 	{
417*b1cdbd2cSJim Jagielski 		Reference< XInterface > xSource( static_cast< ::cppu::OWeakObject* >( this ) );
418*b1cdbd2cSJim Jagielski 		TreeExpansionEvent aEvent( xSource, xNode );
419*b1cdbd2cSJim Jagielski 
420*b1cdbd2cSJim Jagielski 		if( bExpanding )
421*b1cdbd2cSJim Jagielski 		{
422*b1cdbd2cSJim Jagielski 			maTreeExpansionListeners.treeExpanded( aEvent );
423*b1cdbd2cSJim Jagielski 		}
424*b1cdbd2cSJim Jagielski 		else
425*b1cdbd2cSJim Jagielski 		{
426*b1cdbd2cSJim Jagielski 			maTreeExpansionListeners.treeCollapsed( aEvent );
427*b1cdbd2cSJim Jagielski 		}
428*b1cdbd2cSJim Jagielski 	}
429*b1cdbd2cSJim Jagielski 	catch( Exception& )
430*b1cdbd2cSJim Jagielski 	{
431*b1cdbd2cSJim Jagielski 	}
432*b1cdbd2cSJim Jagielski }
433*b1cdbd2cSJim Jagielski 
434*b1cdbd2cSJim Jagielski // --------------------------------------------------------------------
435*b1cdbd2cSJim Jagielski 
fillTree(UnoTreeListBoxImpl & rTree,const Reference<XTreeDataModel> & xDataModel)436*b1cdbd2cSJim Jagielski void TreeControlPeer::fillTree( UnoTreeListBoxImpl& rTree, const Reference< XTreeDataModel >& xDataModel )
437*b1cdbd2cSJim Jagielski {
438*b1cdbd2cSJim Jagielski 	rTree.Clear();
439*b1cdbd2cSJim Jagielski 
440*b1cdbd2cSJim Jagielski 	if( xDataModel.is() )
441*b1cdbd2cSJim Jagielski 	{
442*b1cdbd2cSJim Jagielski 		Reference< XTreeNode > xRootNode( xDataModel->getRoot() );
443*b1cdbd2cSJim Jagielski 		if( xRootNode.is() )
444*b1cdbd2cSJim Jagielski 		{
445*b1cdbd2cSJim Jagielski 			if( mbIsRootDisplayed )
446*b1cdbd2cSJim Jagielski 			{
447*b1cdbd2cSJim Jagielski 				addNode( rTree, xRootNode, 0 );
448*b1cdbd2cSJim Jagielski 			}
449*b1cdbd2cSJim Jagielski 			else
450*b1cdbd2cSJim Jagielski 			{
451*b1cdbd2cSJim Jagielski 				const sal_Int32 nChildCount = xRootNode->getChildCount();
452*b1cdbd2cSJim Jagielski 				for( sal_Int32 nChild = 0; nChild < nChildCount; nChild++ )
453*b1cdbd2cSJim Jagielski 					addNode( rTree, xRootNode->getChildAt( nChild ), 0 );
454*b1cdbd2cSJim Jagielski 			}
455*b1cdbd2cSJim Jagielski 		}
456*b1cdbd2cSJim Jagielski 	}
457*b1cdbd2cSJim Jagielski }
458*b1cdbd2cSJim Jagielski 
459*b1cdbd2cSJim Jagielski // --------------------------------------------------------------------
460*b1cdbd2cSJim Jagielski 
addNode(UnoTreeListBoxImpl & rTree,const Reference<XTreeNode> & xNode,UnoTreeListEntry * pParentEntry)461*b1cdbd2cSJim Jagielski void TreeControlPeer::addNode( UnoTreeListBoxImpl& rTree, const Reference< XTreeNode >& xNode, UnoTreeListEntry* pParentEntry )
462*b1cdbd2cSJim Jagielski {
463*b1cdbd2cSJim Jagielski 	if( xNode.is() )
464*b1cdbd2cSJim Jagielski 	{
465*b1cdbd2cSJim Jagielski 		UnoTreeListEntry* pEntry = createEntry( xNode, pParentEntry, LIST_APPEND );
466*b1cdbd2cSJim Jagielski 		const sal_Int32 nChildCount = xNode->getChildCount();
467*b1cdbd2cSJim Jagielski 		for( sal_Int32 nChild = 0; nChild < nChildCount; nChild++ )
468*b1cdbd2cSJim Jagielski 			addNode( rTree, xNode->getChildAt( nChild ), pEntry );
469*b1cdbd2cSJim Jagielski 	}
470*b1cdbd2cSJim Jagielski }
471*b1cdbd2cSJim Jagielski 
472*b1cdbd2cSJim Jagielski // --------------------------------------------------------------------
473*b1cdbd2cSJim Jagielski 
getTreeListBoxOrThrow() const474*b1cdbd2cSJim Jagielski UnoTreeListBoxImpl& TreeControlPeer::getTreeListBoxOrThrow() const throw (RuntimeException )
475*b1cdbd2cSJim Jagielski {
476*b1cdbd2cSJim Jagielski 	if( !mpTreeImpl )
477*b1cdbd2cSJim Jagielski 		throw DisposedException();
478*b1cdbd2cSJim Jagielski 	return *mpTreeImpl;
479*b1cdbd2cSJim Jagielski }
480*b1cdbd2cSJim Jagielski 
481*b1cdbd2cSJim Jagielski // --------------------------------------------------------------------
482*b1cdbd2cSJim Jagielski 
ChangeNodesSelection(const Any & rSelection,bool bSelect,bool bSetSelection)483*b1cdbd2cSJim Jagielski void TreeControlPeer::ChangeNodesSelection( const Any& rSelection, bool bSelect, bool bSetSelection ) throw( RuntimeException, IllegalArgumentException )
484*b1cdbd2cSJim Jagielski {
485*b1cdbd2cSJim Jagielski 	::vos::OGuard aGuard( GetMutex() );
486*b1cdbd2cSJim Jagielski 
487*b1cdbd2cSJim Jagielski 	UnoTreeListBoxImpl& rTree = getTreeListBoxOrThrow();
488*b1cdbd2cSJim Jagielski 
489*b1cdbd2cSJim Jagielski 	Reference< XTreeNode > xTempNode;
490*b1cdbd2cSJim Jagielski 	Sequence< XTreeNode > aTempSeq;
491*b1cdbd2cSJim Jagielski 
492*b1cdbd2cSJim Jagielski 	const Reference< XTreeNode > *pNodes = 0;
493*b1cdbd2cSJim Jagielski 	sal_Int32 nCount = 0;
494*b1cdbd2cSJim Jagielski 
495*b1cdbd2cSJim Jagielski 	if( rSelection.hasValue() )
496*b1cdbd2cSJim Jagielski 	{
497*b1cdbd2cSJim Jagielski 		switch( rSelection.getValueTypeClass() )
498*b1cdbd2cSJim Jagielski 		{
499*b1cdbd2cSJim Jagielski 		case TypeClass_INTERFACE:
500*b1cdbd2cSJim Jagielski 			{
501*b1cdbd2cSJim Jagielski 				rSelection >>= xTempNode;
502*b1cdbd2cSJim Jagielski 				if( xTempNode.is() )
503*b1cdbd2cSJim Jagielski 				{
504*b1cdbd2cSJim Jagielski 					nCount = 1;
505*b1cdbd2cSJim Jagielski 					pNodes = &xTempNode;
506*b1cdbd2cSJim Jagielski 				}
507*b1cdbd2cSJim Jagielski 				break;
508*b1cdbd2cSJim Jagielski 			}
509*b1cdbd2cSJim Jagielski 		case TypeClass_SEQUENCE:
510*b1cdbd2cSJim Jagielski 			{
511*b1cdbd2cSJim Jagielski 				if( rSelection.getValueType() == ::getCppuType( (const Sequence< Reference< XTreeNode > > *) 0 ) )
512*b1cdbd2cSJim Jagielski 				{
513*b1cdbd2cSJim Jagielski 					const Sequence< Reference< XTreeNode > >& rSeq( *(const Sequence< Reference< XTreeNode > > *)rSelection.getValue() );
514*b1cdbd2cSJim Jagielski 					nCount = rSeq.getLength();
515*b1cdbd2cSJim Jagielski 					if( nCount )
516*b1cdbd2cSJim Jagielski 						pNodes = rSeq.getConstArray();
517*b1cdbd2cSJim Jagielski 				}
518*b1cdbd2cSJim Jagielski 				break;
519*b1cdbd2cSJim Jagielski 			}
520*b1cdbd2cSJim Jagielski 		default:
521*b1cdbd2cSJim Jagielski 			break;
522*b1cdbd2cSJim Jagielski 		}
523*b1cdbd2cSJim Jagielski 
524*b1cdbd2cSJim Jagielski 		if( nCount == 0 )
525*b1cdbd2cSJim Jagielski 			throw IllegalArgumentException();
526*b1cdbd2cSJim Jagielski 	}
527*b1cdbd2cSJim Jagielski 
528*b1cdbd2cSJim Jagielski 	if( bSetSelection )
529*b1cdbd2cSJim Jagielski 		rTree.SelectAll( sal_False );
530*b1cdbd2cSJim Jagielski 
531*b1cdbd2cSJim Jagielski 	if( pNodes && nCount )
532*b1cdbd2cSJim Jagielski 	{
533*b1cdbd2cSJim Jagielski 		while( nCount-- )
534*b1cdbd2cSJim Jagielski 		{
535*b1cdbd2cSJim Jagielski 			UnoTreeListEntry* pEntry = getEntry( *pNodes++ );
536*b1cdbd2cSJim Jagielski 			rTree.Select( pEntry, bSelect ? sal_True : sal_False );
537*b1cdbd2cSJim Jagielski 		}
538*b1cdbd2cSJim Jagielski 	}
539*b1cdbd2cSJim Jagielski }
540*b1cdbd2cSJim Jagielski 
541*b1cdbd2cSJim Jagielski // -------------------------------------------------------------------
542*b1cdbd2cSJim Jagielski // ::com::sun::star::view::XSelectionSupplier
543*b1cdbd2cSJim Jagielski // -------------------------------------------------------------------
544*b1cdbd2cSJim Jagielski 
select(const Any & rSelection)545*b1cdbd2cSJim Jagielski sal_Bool SAL_CALL TreeControlPeer::select( const Any& rSelection ) throw (IllegalArgumentException, RuntimeException)
546*b1cdbd2cSJim Jagielski {
547*b1cdbd2cSJim Jagielski 	::vos::OGuard aGuard( GetMutex() );
548*b1cdbd2cSJim Jagielski 	ChangeNodesSelection( rSelection, true, true );
549*b1cdbd2cSJim Jagielski 	return sal_True;
550*b1cdbd2cSJim Jagielski }
551*b1cdbd2cSJim Jagielski 
552*b1cdbd2cSJim Jagielski // -------------------------------------------------------------------
553*b1cdbd2cSJim Jagielski 
getSelection()554*b1cdbd2cSJim Jagielski Any SAL_CALL TreeControlPeer::getSelection() throw (RuntimeException)
555*b1cdbd2cSJim Jagielski {
556*b1cdbd2cSJim Jagielski 	::vos::OGuard aGuard( GetMutex() );
557*b1cdbd2cSJim Jagielski 
558*b1cdbd2cSJim Jagielski 	UnoTreeListBoxImpl& rTree = getTreeListBoxOrThrow();
559*b1cdbd2cSJim Jagielski 
560*b1cdbd2cSJim Jagielski 	Any aRet;
561*b1cdbd2cSJim Jagielski 
562*b1cdbd2cSJim Jagielski 	sal_uLong nSelectionCount = rTree.GetSelectionCount();
563*b1cdbd2cSJim Jagielski 	if( nSelectionCount == 1 )
564*b1cdbd2cSJim Jagielski 	{
565*b1cdbd2cSJim Jagielski 		UnoTreeListEntry* pEntry = dynamic_cast< UnoTreeListEntry* >( rTree.FirstSelected() );
566*b1cdbd2cSJim Jagielski 		if( pEntry && pEntry->mxNode.is() )
567*b1cdbd2cSJim Jagielski 			aRet <<= pEntry->mxNode;
568*b1cdbd2cSJim Jagielski 	}
569*b1cdbd2cSJim Jagielski 	else if( nSelectionCount > 1 )
570*b1cdbd2cSJim Jagielski 	{
571*b1cdbd2cSJim Jagielski 		Sequence< Reference< XTreeNode > > aSelection( nSelectionCount );
572*b1cdbd2cSJim Jagielski 		Reference< XTreeNode >* pNodes = aSelection.getArray();
573*b1cdbd2cSJim Jagielski 		UnoTreeListEntry* pEntry = dynamic_cast< UnoTreeListEntry* >( rTree.FirstSelected() );
574*b1cdbd2cSJim Jagielski 		while( pEntry && nSelectionCount )
575*b1cdbd2cSJim Jagielski 		{
576*b1cdbd2cSJim Jagielski 			*pNodes++ = pEntry->mxNode;
577*b1cdbd2cSJim Jagielski 			pEntry = dynamic_cast< UnoTreeListEntry* >( rTree.NextSelected( pEntry ) );
578*b1cdbd2cSJim Jagielski 			--nSelectionCount;
579*b1cdbd2cSJim Jagielski 		}
580*b1cdbd2cSJim Jagielski 
581*b1cdbd2cSJim Jagielski 		OSL_ASSERT( (pEntry == 0) && (nSelectionCount == 0) );
582*b1cdbd2cSJim Jagielski 		aRet <<= aSelection;
583*b1cdbd2cSJim Jagielski 	}
584*b1cdbd2cSJim Jagielski 
585*b1cdbd2cSJim Jagielski 	return aRet;
586*b1cdbd2cSJim Jagielski }
587*b1cdbd2cSJim Jagielski 
588*b1cdbd2cSJim Jagielski // -------------------------------------------------------------------
589*b1cdbd2cSJim Jagielski 
addSelectionChangeListener(const Reference<XSelectionChangeListener> & xListener)590*b1cdbd2cSJim Jagielski void SAL_CALL TreeControlPeer::addSelectionChangeListener( const Reference< XSelectionChangeListener >& xListener ) throw (RuntimeException)
591*b1cdbd2cSJim Jagielski {
592*b1cdbd2cSJim Jagielski 	maSelectionListeners.addInterface( xListener );
593*b1cdbd2cSJim Jagielski }
594*b1cdbd2cSJim Jagielski 
595*b1cdbd2cSJim Jagielski // -------------------------------------------------------------------
596*b1cdbd2cSJim Jagielski 
removeSelectionChangeListener(const Reference<XSelectionChangeListener> & xListener)597*b1cdbd2cSJim Jagielski void SAL_CALL TreeControlPeer::removeSelectionChangeListener( const Reference< XSelectionChangeListener >& xListener ) throw (RuntimeException)
598*b1cdbd2cSJim Jagielski {
599*b1cdbd2cSJim Jagielski 	maSelectionListeners.addInterface( xListener );
600*b1cdbd2cSJim Jagielski }
601*b1cdbd2cSJim Jagielski 
602*b1cdbd2cSJim Jagielski // -------------------------------------------------------------------
603*b1cdbd2cSJim Jagielski // ::com::sun::star::view::XMultiSelectionSupplier
604*b1cdbd2cSJim Jagielski // -------------------------------------------------------------------
605*b1cdbd2cSJim Jagielski 
addSelection(const Any & rSelection)606*b1cdbd2cSJim Jagielski sal_Bool SAL_CALL TreeControlPeer::addSelection( const Any& rSelection ) throw (IllegalArgumentException, RuntimeException)
607*b1cdbd2cSJim Jagielski {
608*b1cdbd2cSJim Jagielski 	ChangeNodesSelection( rSelection, true, false );
609*b1cdbd2cSJim Jagielski 	return sal_True;
610*b1cdbd2cSJim Jagielski }
611*b1cdbd2cSJim Jagielski 
612*b1cdbd2cSJim Jagielski // -------------------------------------------------------------------
613*b1cdbd2cSJim Jagielski 
removeSelection(const Any & rSelection)614*b1cdbd2cSJim Jagielski void SAL_CALL TreeControlPeer::removeSelection( const Any& rSelection ) throw (IllegalArgumentException, RuntimeException)
615*b1cdbd2cSJim Jagielski {
616*b1cdbd2cSJim Jagielski 	ChangeNodesSelection( rSelection, false, false );
617*b1cdbd2cSJim Jagielski }
618*b1cdbd2cSJim Jagielski 
619*b1cdbd2cSJim Jagielski // -------------------------------------------------------------------
620*b1cdbd2cSJim Jagielski 
clearSelection()621*b1cdbd2cSJim Jagielski void SAL_CALL TreeControlPeer::clearSelection() throw (RuntimeException)
622*b1cdbd2cSJim Jagielski {
623*b1cdbd2cSJim Jagielski 	::vos::OGuard aGuard( GetMutex() );
624*b1cdbd2cSJim Jagielski 	getTreeListBoxOrThrow().SelectAll( sal_False );
625*b1cdbd2cSJim Jagielski }
626*b1cdbd2cSJim Jagielski 
627*b1cdbd2cSJim Jagielski // -------------------------------------------------------------------
628*b1cdbd2cSJim Jagielski 
getSelectionCount()629*b1cdbd2cSJim Jagielski sal_Int32 SAL_CALL TreeControlPeer::getSelectionCount() throw (RuntimeException)
630*b1cdbd2cSJim Jagielski {
631*b1cdbd2cSJim Jagielski 	::vos::OGuard aGuard( GetMutex() );
632*b1cdbd2cSJim Jagielski 	return getTreeListBoxOrThrow().GetSelectionCount();
633*b1cdbd2cSJim Jagielski }
634*b1cdbd2cSJim Jagielski 
635*b1cdbd2cSJim Jagielski // -------------------------------------------------------------------
636*b1cdbd2cSJim Jagielski 
637*b1cdbd2cSJim Jagielski class TreeSelectionEnumeration : public ::cppu::WeakImplHelper1< XEnumeration >
638*b1cdbd2cSJim Jagielski {
639*b1cdbd2cSJim Jagielski public:
640*b1cdbd2cSJim Jagielski 	TreeSelectionEnumeration( std::list< Any >& rSelection );
641*b1cdbd2cSJim Jagielski     virtual ::sal_Bool SAL_CALL hasMoreElements() throw (RuntimeException);
642*b1cdbd2cSJim Jagielski     virtual Any SAL_CALL nextElement() throw (NoSuchElementException, WrappedTargetException, RuntimeException);
643*b1cdbd2cSJim Jagielski 
644*b1cdbd2cSJim Jagielski 	std::list< Any > maSelection;
645*b1cdbd2cSJim Jagielski 	std::list< Any >::iterator maIter;
646*b1cdbd2cSJim Jagielski };
647*b1cdbd2cSJim Jagielski 
648*b1cdbd2cSJim Jagielski // -------------------------------------------------------------------
649*b1cdbd2cSJim Jagielski 
TreeSelectionEnumeration(std::list<Any> & rSelection)650*b1cdbd2cSJim Jagielski TreeSelectionEnumeration::TreeSelectionEnumeration( std::list< Any >& rSelection )
651*b1cdbd2cSJim Jagielski {
652*b1cdbd2cSJim Jagielski 	maSelection.swap( rSelection );
653*b1cdbd2cSJim Jagielski 	maIter = maSelection.begin();
654*b1cdbd2cSJim Jagielski }
655*b1cdbd2cSJim Jagielski 
656*b1cdbd2cSJim Jagielski // -------------------------------------------------------------------
657*b1cdbd2cSJim Jagielski 
hasMoreElements()658*b1cdbd2cSJim Jagielski ::sal_Bool SAL_CALL TreeSelectionEnumeration::hasMoreElements() throw (RuntimeException)
659*b1cdbd2cSJim Jagielski {
660*b1cdbd2cSJim Jagielski 	return maIter != maSelection.end();
661*b1cdbd2cSJim Jagielski }
662*b1cdbd2cSJim Jagielski 
663*b1cdbd2cSJim Jagielski // -------------------------------------------------------------------
664*b1cdbd2cSJim Jagielski 
nextElement()665*b1cdbd2cSJim Jagielski Any SAL_CALL TreeSelectionEnumeration::nextElement() throw (NoSuchElementException, WrappedTargetException, RuntimeException)
666*b1cdbd2cSJim Jagielski {
667*b1cdbd2cSJim Jagielski 	if( maIter == maSelection.end() )
668*b1cdbd2cSJim Jagielski 		throw NoSuchElementException();
669*b1cdbd2cSJim Jagielski 
670*b1cdbd2cSJim Jagielski 	return (*maIter++);
671*b1cdbd2cSJim Jagielski }
672*b1cdbd2cSJim Jagielski 
673*b1cdbd2cSJim Jagielski // -------------------------------------------------------------------
674*b1cdbd2cSJim Jagielski 
createSelectionEnumeration()675*b1cdbd2cSJim Jagielski Reference< XEnumeration > SAL_CALL TreeControlPeer::createSelectionEnumeration() throw (RuntimeException)
676*b1cdbd2cSJim Jagielski {
677*b1cdbd2cSJim Jagielski 	::vos::OGuard aGuard( GetMutex() );
678*b1cdbd2cSJim Jagielski 
679*b1cdbd2cSJim Jagielski 	UnoTreeListBoxImpl& rTree = getTreeListBoxOrThrow();
680*b1cdbd2cSJim Jagielski 
681*b1cdbd2cSJim Jagielski 	sal_uInt32 nSelectionCount = rTree.GetSelectionCount();
682*b1cdbd2cSJim Jagielski 	std::list< Any > aSelection( nSelectionCount );
683*b1cdbd2cSJim Jagielski 
684*b1cdbd2cSJim Jagielski 	UnoTreeListEntry* pEntry = dynamic_cast< UnoTreeListEntry* >( rTree.FirstSelected() );
685*b1cdbd2cSJim Jagielski 	while( pEntry && nSelectionCount )
686*b1cdbd2cSJim Jagielski 	{
687*b1cdbd2cSJim Jagielski 		aSelection.push_back( Any( pEntry->mxNode ) );
688*b1cdbd2cSJim Jagielski 		pEntry = dynamic_cast< UnoTreeListEntry* >( rTree.NextSelected( pEntry ) );
689*b1cdbd2cSJim Jagielski 		--nSelectionCount;
690*b1cdbd2cSJim Jagielski 	}
691*b1cdbd2cSJim Jagielski 
692*b1cdbd2cSJim Jagielski 	OSL_ASSERT( (pEntry == 0) && (nSelectionCount == 0) );
693*b1cdbd2cSJim Jagielski 
694*b1cdbd2cSJim Jagielski 	return Reference< XEnumeration >( new TreeSelectionEnumeration( aSelection ) );
695*b1cdbd2cSJim Jagielski }
696*b1cdbd2cSJim Jagielski 
697*b1cdbd2cSJim Jagielski // -------------------------------------------------------------------
698*b1cdbd2cSJim Jagielski 
createReverseSelectionEnumeration()699*b1cdbd2cSJim Jagielski Reference< XEnumeration > SAL_CALL TreeControlPeer::createReverseSelectionEnumeration() throw (RuntimeException)
700*b1cdbd2cSJim Jagielski {
701*b1cdbd2cSJim Jagielski 	::vos::OGuard aGuard( GetMutex() );
702*b1cdbd2cSJim Jagielski 
703*b1cdbd2cSJim Jagielski 	UnoTreeListBoxImpl& rTree = getTreeListBoxOrThrow();
704*b1cdbd2cSJim Jagielski 
705*b1cdbd2cSJim Jagielski 	sal_uInt32 nSelectionCount = rTree.GetSelectionCount();
706*b1cdbd2cSJim Jagielski 	std::list< Any > aSelection;
707*b1cdbd2cSJim Jagielski 
708*b1cdbd2cSJim Jagielski 	UnoTreeListEntry* pEntry = dynamic_cast< UnoTreeListEntry* >( rTree.FirstSelected() );
709*b1cdbd2cSJim Jagielski 	while( pEntry && nSelectionCount )
710*b1cdbd2cSJim Jagielski 	{
711*b1cdbd2cSJim Jagielski 		aSelection.push_front( Any( pEntry->mxNode ) );
712*b1cdbd2cSJim Jagielski 		pEntry = dynamic_cast< UnoTreeListEntry* >( rTree.NextSelected( pEntry ) );
713*b1cdbd2cSJim Jagielski 		--nSelectionCount;
714*b1cdbd2cSJim Jagielski 	}
715*b1cdbd2cSJim Jagielski 
716*b1cdbd2cSJim Jagielski 	OSL_ASSERT( (pEntry == 0) && (nSelectionCount == 0) );
717*b1cdbd2cSJim Jagielski 
718*b1cdbd2cSJim Jagielski 	return Reference< XEnumeration >( new TreeSelectionEnumeration( aSelection ) );
719*b1cdbd2cSJim Jagielski }
720*b1cdbd2cSJim Jagielski 
721*b1cdbd2cSJim Jagielski // --------------------------------------------------------------------
722*b1cdbd2cSJim Jagielski // ::com::sun::star::awt::XTreeControl
723*b1cdbd2cSJim Jagielski // --------------------------------------------------------------------
724*b1cdbd2cSJim Jagielski 
getDefaultExpandedGraphicURL()725*b1cdbd2cSJim Jagielski OUString SAL_CALL TreeControlPeer::getDefaultExpandedGraphicURL() throw (::com::sun::star::uno::RuntimeException)
726*b1cdbd2cSJim Jagielski {
727*b1cdbd2cSJim Jagielski 	::vos::OGuard aGuard( GetMutex() );
728*b1cdbd2cSJim Jagielski 	return msDefaultExpandedGraphicURL;
729*b1cdbd2cSJim Jagielski }
730*b1cdbd2cSJim Jagielski 
731*b1cdbd2cSJim Jagielski // --------------------------------------------------------------------
732*b1cdbd2cSJim Jagielski 
setDefaultExpandedGraphicURL(const::rtl::OUString & sDefaultExpandedGraphicURL)733*b1cdbd2cSJim Jagielski void SAL_CALL TreeControlPeer::setDefaultExpandedGraphicURL( const ::rtl::OUString& sDefaultExpandedGraphicURL ) throw (::com::sun::star::uno::RuntimeException)
734*b1cdbd2cSJim Jagielski {
735*b1cdbd2cSJim Jagielski 	::vos::OGuard aGuard( GetMutex() );
736*b1cdbd2cSJim Jagielski 	if( msDefaultExpandedGraphicURL != sDefaultExpandedGraphicURL )
737*b1cdbd2cSJim Jagielski 	{
738*b1cdbd2cSJim Jagielski 		if( sDefaultExpandedGraphicURL.getLength() )
739*b1cdbd2cSJim Jagielski 			loadImage( sDefaultExpandedGraphicURL, maDefaultExpandedImage );
740*b1cdbd2cSJim Jagielski 		else
741*b1cdbd2cSJim Jagielski 			maDefaultExpandedImage = Image();
742*b1cdbd2cSJim Jagielski 
743*b1cdbd2cSJim Jagielski 		UnoTreeListBoxImpl& rTree = getTreeListBoxOrThrow();
744*b1cdbd2cSJim Jagielski 
745*b1cdbd2cSJim Jagielski 		SvLBoxEntry* pEntry = rTree.First();
746*b1cdbd2cSJim Jagielski 		while( pEntry )
747*b1cdbd2cSJim Jagielski 		{
748*b1cdbd2cSJim Jagielski 			ImplContextGraphicItem* pContextGraphicItem = dynamic_cast< ImplContextGraphicItem* >( pEntry->GetItem( 0 ) );
749*b1cdbd2cSJim Jagielski 			if( pContextGraphicItem )
750*b1cdbd2cSJim Jagielski 			{
751*b1cdbd2cSJim Jagielski 				if( pContextGraphicItem->msExpandedGraphicURL.getLength() == 0 )
752*b1cdbd2cSJim Jagielski 					rTree.SetExpandedEntryBmp( pEntry, maDefaultExpandedImage );
753*b1cdbd2cSJim Jagielski 			}
754*b1cdbd2cSJim Jagielski 			pEntry = rTree.Next( pEntry );
755*b1cdbd2cSJim Jagielski 		}
756*b1cdbd2cSJim Jagielski 
757*b1cdbd2cSJim Jagielski 		msDefaultExpandedGraphicURL = sDefaultExpandedGraphicURL;
758*b1cdbd2cSJim Jagielski 	}
759*b1cdbd2cSJim Jagielski }
760*b1cdbd2cSJim Jagielski 
761*b1cdbd2cSJim Jagielski // --------------------------------------------------------------------
762*b1cdbd2cSJim Jagielski 
getDefaultCollapsedGraphicURL()763*b1cdbd2cSJim Jagielski OUString SAL_CALL TreeControlPeer::getDefaultCollapsedGraphicURL() throw (::com::sun::star::uno::RuntimeException)
764*b1cdbd2cSJim Jagielski {
765*b1cdbd2cSJim Jagielski 	::vos::OGuard aGuard( GetMutex() );
766*b1cdbd2cSJim Jagielski 	return msDefaultCollapsedGraphicURL;
767*b1cdbd2cSJim Jagielski }
768*b1cdbd2cSJim Jagielski 
769*b1cdbd2cSJim Jagielski // --------------------------------------------------------------------
770*b1cdbd2cSJim Jagielski 
setDefaultCollapsedGraphicURL(const::rtl::OUString & sDefaultCollapsedGraphicURL)771*b1cdbd2cSJim Jagielski void SAL_CALL TreeControlPeer::setDefaultCollapsedGraphicURL( const ::rtl::OUString& sDefaultCollapsedGraphicURL ) throw (::com::sun::star::uno::RuntimeException)
772*b1cdbd2cSJim Jagielski {
773*b1cdbd2cSJim Jagielski 	::vos::OGuard aGuard( GetMutex() );
774*b1cdbd2cSJim Jagielski 	if( msDefaultCollapsedGraphicURL != sDefaultCollapsedGraphicURL )
775*b1cdbd2cSJim Jagielski 	{
776*b1cdbd2cSJim Jagielski 		if( sDefaultCollapsedGraphicURL.getLength() )
777*b1cdbd2cSJim Jagielski 			loadImage( sDefaultCollapsedGraphicURL, maDefaultCollapsedImage );
778*b1cdbd2cSJim Jagielski 		else
779*b1cdbd2cSJim Jagielski 			maDefaultCollapsedImage = Image();
780*b1cdbd2cSJim Jagielski 
781*b1cdbd2cSJim Jagielski 		UnoTreeListBoxImpl& rTree = getTreeListBoxOrThrow();
782*b1cdbd2cSJim Jagielski 
783*b1cdbd2cSJim Jagielski 		SvLBoxEntry* pEntry = rTree.First();
784*b1cdbd2cSJim Jagielski 		while( pEntry )
785*b1cdbd2cSJim Jagielski 		{
786*b1cdbd2cSJim Jagielski 			ImplContextGraphicItem* pContextGraphicItem = dynamic_cast< ImplContextGraphicItem* >( pEntry->GetItem( 0 ) );
787*b1cdbd2cSJim Jagielski 			if( pContextGraphicItem )
788*b1cdbd2cSJim Jagielski 			{
789*b1cdbd2cSJim Jagielski 				if( pContextGraphicItem->msCollapsedGraphicURL.getLength() == 0 )
790*b1cdbd2cSJim Jagielski 					rTree.SetCollapsedEntryBmp( pEntry, maDefaultCollapsedImage );
791*b1cdbd2cSJim Jagielski 			}
792*b1cdbd2cSJim Jagielski 			pEntry = rTree.Next( pEntry );
793*b1cdbd2cSJim Jagielski 		}
794*b1cdbd2cSJim Jagielski 
795*b1cdbd2cSJim Jagielski 		msDefaultCollapsedGraphicURL = sDefaultCollapsedGraphicURL;
796*b1cdbd2cSJim Jagielski 	}
797*b1cdbd2cSJim Jagielski }
798*b1cdbd2cSJim Jagielski 
799*b1cdbd2cSJim Jagielski // --------------------------------------------------------------------
800*b1cdbd2cSJim Jagielski 
isNodeExpanded(const Reference<XTreeNode> & xNode)801*b1cdbd2cSJim Jagielski sal_Bool SAL_CALL TreeControlPeer::isNodeExpanded( const Reference< XTreeNode >& xNode ) throw (RuntimeException, IllegalArgumentException)
802*b1cdbd2cSJim Jagielski {
803*b1cdbd2cSJim Jagielski 	::vos::OGuard aGuard( GetMutex() );
804*b1cdbd2cSJim Jagielski 
805*b1cdbd2cSJim Jagielski 	UnoTreeListBoxImpl& rTree = getTreeListBoxOrThrow();
806*b1cdbd2cSJim Jagielski 	UnoTreeListEntry* pEntry = getEntry( xNode );
807*b1cdbd2cSJim Jagielski 	return ( pEntry && rTree.IsExpanded( pEntry ) ) ? sal_True : sal_False;
808*b1cdbd2cSJim Jagielski }
809*b1cdbd2cSJim Jagielski 
810*b1cdbd2cSJim Jagielski // -------------------------------------------------------------------
811*b1cdbd2cSJim Jagielski 
isNodeCollapsed(const Reference<XTreeNode> & xNode)812*b1cdbd2cSJim Jagielski sal_Bool SAL_CALL TreeControlPeer::isNodeCollapsed( const Reference< XTreeNode >& xNode ) throw (RuntimeException, IllegalArgumentException)
813*b1cdbd2cSJim Jagielski {
814*b1cdbd2cSJim Jagielski 	::vos::OGuard aGuard( GetMutex() );
815*b1cdbd2cSJim Jagielski 	return !isNodeExpanded( xNode );
816*b1cdbd2cSJim Jagielski }
817*b1cdbd2cSJim Jagielski 
818*b1cdbd2cSJim Jagielski // -------------------------------------------------------------------
819*b1cdbd2cSJim Jagielski 
makeNodeVisible(const Reference<XTreeNode> & xNode)820*b1cdbd2cSJim Jagielski void SAL_CALL TreeControlPeer::makeNodeVisible( const Reference< XTreeNode >& xNode ) throw (RuntimeException, ExpandVetoException, IllegalArgumentException)
821*b1cdbd2cSJim Jagielski {
822*b1cdbd2cSJim Jagielski 	::vos::OGuard aGuard( GetMutex() );
823*b1cdbd2cSJim Jagielski 
824*b1cdbd2cSJim Jagielski 	UnoTreeListBoxImpl& rTree = getTreeListBoxOrThrow();
825*b1cdbd2cSJim Jagielski 	UnoTreeListEntry* pEntry = getEntry( xNode );
826*b1cdbd2cSJim Jagielski 	if( pEntry )
827*b1cdbd2cSJim Jagielski 		rTree.MakeVisible( pEntry );
828*b1cdbd2cSJim Jagielski }
829*b1cdbd2cSJim Jagielski 
830*b1cdbd2cSJim Jagielski // -------------------------------------------------------------------
831*b1cdbd2cSJim Jagielski 
isNodeVisible(const Reference<XTreeNode> & xNode)832*b1cdbd2cSJim Jagielski sal_Bool SAL_CALL TreeControlPeer::isNodeVisible( const Reference< XTreeNode >& xNode ) throw (RuntimeException, IllegalArgumentException)
833*b1cdbd2cSJim Jagielski {
834*b1cdbd2cSJim Jagielski 	::vos::OGuard aGuard( GetMutex() );
835*b1cdbd2cSJim Jagielski 
836*b1cdbd2cSJim Jagielski 	UnoTreeListBoxImpl& rTree = getTreeListBoxOrThrow();
837*b1cdbd2cSJim Jagielski 	UnoTreeListEntry* pEntry = getEntry( xNode );
838*b1cdbd2cSJim Jagielski 	return ( pEntry && rTree.IsEntryVisible( pEntry ) ) ? sal_True : sal_False;
839*b1cdbd2cSJim Jagielski }
840*b1cdbd2cSJim Jagielski 
841*b1cdbd2cSJim Jagielski // -------------------------------------------------------------------
842*b1cdbd2cSJim Jagielski 
expandNode(const Reference<XTreeNode> & xNode)843*b1cdbd2cSJim Jagielski void SAL_CALL TreeControlPeer::expandNode( const Reference< XTreeNode >& xNode ) throw (RuntimeException, ExpandVetoException, IllegalArgumentException)
844*b1cdbd2cSJim Jagielski {
845*b1cdbd2cSJim Jagielski 	::vos::OGuard aGuard( GetMutex() );
846*b1cdbd2cSJim Jagielski 
847*b1cdbd2cSJim Jagielski 	UnoTreeListBoxImpl& rTree = getTreeListBoxOrThrow();
848*b1cdbd2cSJim Jagielski 	UnoTreeListEntry* pEntry = getEntry( xNode );
849*b1cdbd2cSJim Jagielski 	if( pEntry )
850*b1cdbd2cSJim Jagielski 		rTree.Expand( pEntry );
851*b1cdbd2cSJim Jagielski }
852*b1cdbd2cSJim Jagielski 
853*b1cdbd2cSJim Jagielski // -------------------------------------------------------------------
854*b1cdbd2cSJim Jagielski 
collapseNode(const Reference<XTreeNode> & xNode)855*b1cdbd2cSJim Jagielski void SAL_CALL TreeControlPeer::collapseNode( const Reference< XTreeNode >& xNode ) throw (RuntimeException, ExpandVetoException, IllegalArgumentException)
856*b1cdbd2cSJim Jagielski {
857*b1cdbd2cSJim Jagielski 	::vos::OGuard aGuard( GetMutex() );
858*b1cdbd2cSJim Jagielski 
859*b1cdbd2cSJim Jagielski 	UnoTreeListBoxImpl& rTree = getTreeListBoxOrThrow();
860*b1cdbd2cSJim Jagielski 	UnoTreeListEntry* pEntry = getEntry( xNode );
861*b1cdbd2cSJim Jagielski 	if( pEntry )
862*b1cdbd2cSJim Jagielski 		rTree.Collapse( pEntry );
863*b1cdbd2cSJim Jagielski }
864*b1cdbd2cSJim Jagielski 
865*b1cdbd2cSJim Jagielski // -------------------------------------------------------------------
866*b1cdbd2cSJim Jagielski 
addTreeExpansionListener(const Reference<XTreeExpansionListener> & xListener)867*b1cdbd2cSJim Jagielski void SAL_CALL TreeControlPeer::addTreeExpansionListener( const Reference< XTreeExpansionListener >& xListener ) throw (RuntimeException)
868*b1cdbd2cSJim Jagielski {
869*b1cdbd2cSJim Jagielski 	maTreeExpansionListeners.addInterface( xListener );
870*b1cdbd2cSJim Jagielski }
871*b1cdbd2cSJim Jagielski 
872*b1cdbd2cSJim Jagielski // -------------------------------------------------------------------
873*b1cdbd2cSJim Jagielski 
removeTreeExpansionListener(const Reference<XTreeExpansionListener> & xListener)874*b1cdbd2cSJim Jagielski void SAL_CALL TreeControlPeer::removeTreeExpansionListener( const Reference< XTreeExpansionListener >& xListener ) throw (RuntimeException)
875*b1cdbd2cSJim Jagielski {
876*b1cdbd2cSJim Jagielski 	maTreeExpansionListeners.removeInterface( xListener );
877*b1cdbd2cSJim Jagielski }
878*b1cdbd2cSJim Jagielski 
879*b1cdbd2cSJim Jagielski // -------------------------------------------------------------------
880*b1cdbd2cSJim Jagielski 
getNodeForLocation(sal_Int32 x,sal_Int32 y)881*b1cdbd2cSJim Jagielski Reference< XTreeNode > SAL_CALL TreeControlPeer::getNodeForLocation( sal_Int32 x, sal_Int32 y ) throw (RuntimeException)
882*b1cdbd2cSJim Jagielski {
883*b1cdbd2cSJim Jagielski 	::vos::OGuard aGuard( GetMutex() );
884*b1cdbd2cSJim Jagielski 
885*b1cdbd2cSJim Jagielski 	UnoTreeListBoxImpl& rTree = getTreeListBoxOrThrow();
886*b1cdbd2cSJim Jagielski 
887*b1cdbd2cSJim Jagielski 	Reference< XTreeNode > xNode;
888*b1cdbd2cSJim Jagielski 
889*b1cdbd2cSJim Jagielski 	const Point aPos( x, y );
890*b1cdbd2cSJim Jagielski 	UnoTreeListEntry* pEntry = dynamic_cast< UnoTreeListEntry* >( rTree.GetEntry( aPos, sal_True ) );
891*b1cdbd2cSJim Jagielski 	if( pEntry )
892*b1cdbd2cSJim Jagielski 		xNode = pEntry->mxNode;
893*b1cdbd2cSJim Jagielski 
894*b1cdbd2cSJim Jagielski 	return xNode;
895*b1cdbd2cSJim Jagielski }
896*b1cdbd2cSJim Jagielski 
897*b1cdbd2cSJim Jagielski // -------------------------------------------------------------------
898*b1cdbd2cSJim Jagielski 
getClosestNodeForLocation(sal_Int32 x,sal_Int32 y)899*b1cdbd2cSJim Jagielski Reference< XTreeNode > SAL_CALL TreeControlPeer::getClosestNodeForLocation( sal_Int32 x, sal_Int32 y ) throw (RuntimeException)
900*b1cdbd2cSJim Jagielski {
901*b1cdbd2cSJim Jagielski 	::vos::OGuard aGuard( GetMutex() );
902*b1cdbd2cSJim Jagielski 
903*b1cdbd2cSJim Jagielski 	UnoTreeListBoxImpl& rTree = getTreeListBoxOrThrow();
904*b1cdbd2cSJim Jagielski 
905*b1cdbd2cSJim Jagielski 	Reference< XTreeNode > xNode;
906*b1cdbd2cSJim Jagielski 
907*b1cdbd2cSJim Jagielski 	const Point aPos( x, y );
908*b1cdbd2cSJim Jagielski 	UnoTreeListEntry* pEntry = dynamic_cast< UnoTreeListEntry* >( rTree.GetEntry( aPos, sal_True ) );
909*b1cdbd2cSJim Jagielski 	if( pEntry )
910*b1cdbd2cSJim Jagielski 		xNode = pEntry->mxNode;
911*b1cdbd2cSJim Jagielski 
912*b1cdbd2cSJim Jagielski 	return xNode;
913*b1cdbd2cSJim Jagielski }
914*b1cdbd2cSJim Jagielski 
915*b1cdbd2cSJim Jagielski // -------------------------------------------------------------------
916*b1cdbd2cSJim Jagielski 
getNodeRect(const Reference<XTreeNode> & i_Node)917*b1cdbd2cSJim Jagielski awt::Rectangle SAL_CALL TreeControlPeer::getNodeRect( const Reference< XTreeNode >& i_Node ) throw (IllegalArgumentException, RuntimeException)
918*b1cdbd2cSJim Jagielski {
919*b1cdbd2cSJim Jagielski 	::vos::OGuard aGuard( GetMutex() );
920*b1cdbd2cSJim Jagielski 
921*b1cdbd2cSJim Jagielski 	UnoTreeListBoxImpl& rTree = getTreeListBoxOrThrow();
922*b1cdbd2cSJim Jagielski 	UnoTreeListEntry* pEntry = getEntry( i_Node, true );
923*b1cdbd2cSJim Jagielski 
924*b1cdbd2cSJim Jagielski     ::Rectangle aEntryRect( rTree.GetFocusRect( pEntry, rTree.GetEntryPosition( pEntry ).Y() ) );
925*b1cdbd2cSJim Jagielski     return VCLUnoHelper::ConvertToAWTRect( aEntryRect );
926*b1cdbd2cSJim Jagielski }
927*b1cdbd2cSJim Jagielski 
928*b1cdbd2cSJim Jagielski // -------------------------------------------------------------------
929*b1cdbd2cSJim Jagielski 
isEditing()930*b1cdbd2cSJim Jagielski sal_Bool SAL_CALL TreeControlPeer::isEditing(  ) throw (RuntimeException)
931*b1cdbd2cSJim Jagielski {
932*b1cdbd2cSJim Jagielski 	::vos::OGuard aGuard( GetMutex() );
933*b1cdbd2cSJim Jagielski 
934*b1cdbd2cSJim Jagielski 	UnoTreeListBoxImpl& rTree = getTreeListBoxOrThrow();
935*b1cdbd2cSJim Jagielski 	return rTree.IsEditingActive() ? sal_True : sal_False;
936*b1cdbd2cSJim Jagielski }
937*b1cdbd2cSJim Jagielski 
938*b1cdbd2cSJim Jagielski // -------------------------------------------------------------------
939*b1cdbd2cSJim Jagielski 
stopEditing()940*b1cdbd2cSJim Jagielski sal_Bool SAL_CALL TreeControlPeer::stopEditing() throw (RuntimeException)
941*b1cdbd2cSJim Jagielski {
942*b1cdbd2cSJim Jagielski 	::vos::OGuard aGuard( GetMutex() );
943*b1cdbd2cSJim Jagielski 
944*b1cdbd2cSJim Jagielski 	UnoTreeListBoxImpl& rTree = getTreeListBoxOrThrow();
945*b1cdbd2cSJim Jagielski 	if( rTree.IsEditingActive() )
946*b1cdbd2cSJim Jagielski 	{
947*b1cdbd2cSJim Jagielski 		rTree.EndEditing(sal_False);
948*b1cdbd2cSJim Jagielski 		return sal_True;
949*b1cdbd2cSJim Jagielski 	}
950*b1cdbd2cSJim Jagielski 	else
951*b1cdbd2cSJim Jagielski 	{
952*b1cdbd2cSJim Jagielski 		return sal_False;
953*b1cdbd2cSJim Jagielski 	}
954*b1cdbd2cSJim Jagielski }
955*b1cdbd2cSJim Jagielski 
956*b1cdbd2cSJim Jagielski // -------------------------------------------------------------------
957*b1cdbd2cSJim Jagielski 
cancelEditing()958*b1cdbd2cSJim Jagielski void SAL_CALL TreeControlPeer::cancelEditing(  ) throw (RuntimeException)
959*b1cdbd2cSJim Jagielski {
960*b1cdbd2cSJim Jagielski 	::vos::OGuard aGuard( GetMutex() );
961*b1cdbd2cSJim Jagielski 
962*b1cdbd2cSJim Jagielski 	UnoTreeListBoxImpl& rTree = getTreeListBoxOrThrow();
963*b1cdbd2cSJim Jagielski 	rTree.EndEditing(sal_False);
964*b1cdbd2cSJim Jagielski }
965*b1cdbd2cSJim Jagielski 
966*b1cdbd2cSJim Jagielski // -------------------------------------------------------------------
967*b1cdbd2cSJim Jagielski 
startEditingAtNode(const Reference<XTreeNode> & xNode)968*b1cdbd2cSJim Jagielski void SAL_CALL TreeControlPeer::startEditingAtNode( const Reference< XTreeNode >& xNode ) throw (IllegalArgumentException, RuntimeException)
969*b1cdbd2cSJim Jagielski {
970*b1cdbd2cSJim Jagielski 	::vos::OGuard aGuard( GetMutex() );
971*b1cdbd2cSJim Jagielski 
972*b1cdbd2cSJim Jagielski 	UnoTreeListBoxImpl& rTree = getTreeListBoxOrThrow();
973*b1cdbd2cSJim Jagielski 	UnoTreeListEntry* pEntry = getEntry( xNode );
974*b1cdbd2cSJim Jagielski 	rTree.EditEntry( pEntry );
975*b1cdbd2cSJim Jagielski }
976*b1cdbd2cSJim Jagielski 
addTreeEditListener(const Reference<XTreeEditListener> & xListener)977*b1cdbd2cSJim Jagielski void SAL_CALL TreeControlPeer::addTreeEditListener( const Reference< XTreeEditListener >& xListener ) throw (RuntimeException)
978*b1cdbd2cSJim Jagielski {
979*b1cdbd2cSJim Jagielski 	maTreeEditListeners.addInterface( xListener );
980*b1cdbd2cSJim Jagielski }
981*b1cdbd2cSJim Jagielski 
removeTreeEditListener(const Reference<XTreeEditListener> & xListener)982*b1cdbd2cSJim Jagielski void SAL_CALL TreeControlPeer::removeTreeEditListener( const Reference< XTreeEditListener >& xListener ) throw (RuntimeException)
983*b1cdbd2cSJim Jagielski {
984*b1cdbd2cSJim Jagielski 	maTreeEditListeners.removeInterface( xListener );
985*b1cdbd2cSJim Jagielski }
986*b1cdbd2cSJim Jagielski 
onEditingEntry(UnoTreeListEntry * pEntry)987*b1cdbd2cSJim Jagielski bool TreeControlPeer::onEditingEntry( UnoTreeListEntry* pEntry )
988*b1cdbd2cSJim Jagielski {
989*b1cdbd2cSJim Jagielski 	if( mpTreeImpl && pEntry && pEntry->mxNode.is() && (maTreeEditListeners.getLength() > 0)  )
990*b1cdbd2cSJim Jagielski 	{
991*b1cdbd2cSJim Jagielski 		try
992*b1cdbd2cSJim Jagielski 		{
993*b1cdbd2cSJim Jagielski 			maTreeEditListeners.nodeEditing( pEntry->mxNode );
994*b1cdbd2cSJim Jagielski 		}
995*b1cdbd2cSJim Jagielski 		catch( VetoException& )
996*b1cdbd2cSJim Jagielski 		{
997*b1cdbd2cSJim Jagielski 			return false;
998*b1cdbd2cSJim Jagielski 		}
999*b1cdbd2cSJim Jagielski 		catch( Exception& )
1000*b1cdbd2cSJim Jagielski 		{
1001*b1cdbd2cSJim Jagielski 		}
1002*b1cdbd2cSJim Jagielski 	}
1003*b1cdbd2cSJim Jagielski 	return true;
1004*b1cdbd2cSJim Jagielski }
1005*b1cdbd2cSJim Jagielski 
onEditedEntry(UnoTreeListEntry * pEntry,const XubString & rNewText)1006*b1cdbd2cSJim Jagielski bool TreeControlPeer::onEditedEntry( UnoTreeListEntry* pEntry, const XubString& rNewText )
1007*b1cdbd2cSJim Jagielski {
1008*b1cdbd2cSJim Jagielski 	if( mpTreeImpl && pEntry && pEntry->mxNode.is() ) try
1009*b1cdbd2cSJim Jagielski 	{
1010*b1cdbd2cSJim Jagielski 		LockGuard aLockGuard( mnEditLock );
1011*b1cdbd2cSJim Jagielski 		const OUString aNewText( rNewText );
1012*b1cdbd2cSJim Jagielski 		if( maTreeEditListeners.getLength() > 0 )
1013*b1cdbd2cSJim Jagielski 		{
1014*b1cdbd2cSJim Jagielski 			maTreeEditListeners.nodeEdited( pEntry->mxNode, aNewText );
1015*b1cdbd2cSJim Jagielski 			return false;
1016*b1cdbd2cSJim Jagielski 		}
1017*b1cdbd2cSJim Jagielski 		else
1018*b1cdbd2cSJim Jagielski 		{
1019*b1cdbd2cSJim Jagielski 			Reference< XMutableTreeNode > xMutableNode( pEntry->mxNode, UNO_QUERY );
1020*b1cdbd2cSJim Jagielski 			if( xMutableNode.is() )
1021*b1cdbd2cSJim Jagielski 				xMutableNode->setDisplayValue( Any( aNewText ) );
1022*b1cdbd2cSJim Jagielski 			else
1023*b1cdbd2cSJim Jagielski 				return false;
1024*b1cdbd2cSJim Jagielski 		}
1025*b1cdbd2cSJim Jagielski 
1026*b1cdbd2cSJim Jagielski 	}
1027*b1cdbd2cSJim Jagielski 	catch( Exception& )
1028*b1cdbd2cSJim Jagielski 	{
1029*b1cdbd2cSJim Jagielski 	}
1030*b1cdbd2cSJim Jagielski 
1031*b1cdbd2cSJim Jagielski 	return true;
1032*b1cdbd2cSJim Jagielski }
1033*b1cdbd2cSJim Jagielski 
1034*b1cdbd2cSJim Jagielski // --------------------------------------------------------------------
1035*b1cdbd2cSJim Jagielski // ::com::sun::star::awt::tree::TreeDataModelListener
1036*b1cdbd2cSJim Jagielski // --------------------------------------------------------------------
1037*b1cdbd2cSJim Jagielski 
treeNodesChanged(const::com::sun::star::awt::tree::TreeDataModelEvent & rEvent)1038*b1cdbd2cSJim Jagielski void SAL_CALL TreeControlPeer::treeNodesChanged( const ::com::sun::star::awt::tree::TreeDataModelEvent& rEvent ) throw (RuntimeException)
1039*b1cdbd2cSJim Jagielski {
1040*b1cdbd2cSJim Jagielski 	::vos::OGuard aGuard( GetMutex() );
1041*b1cdbd2cSJim Jagielski 
1042*b1cdbd2cSJim Jagielski 	if( mnEditLock != 0 )
1043*b1cdbd2cSJim Jagielski 		return;
1044*b1cdbd2cSJim Jagielski 
1045*b1cdbd2cSJim Jagielski 	updateTree( rEvent, true );
1046*b1cdbd2cSJim Jagielski }
1047*b1cdbd2cSJim Jagielski 
treeNodesInserted(const::com::sun::star::awt::tree::TreeDataModelEvent & rEvent)1048*b1cdbd2cSJim Jagielski void SAL_CALL TreeControlPeer::treeNodesInserted( const ::com::sun::star::awt::tree::TreeDataModelEvent& rEvent ) throw (RuntimeException)
1049*b1cdbd2cSJim Jagielski {
1050*b1cdbd2cSJim Jagielski 	::vos::OGuard aGuard( GetMutex() );
1051*b1cdbd2cSJim Jagielski 
1052*b1cdbd2cSJim Jagielski 	if( mnEditLock != 0 )
1053*b1cdbd2cSJim Jagielski 		return;
1054*b1cdbd2cSJim Jagielski 
1055*b1cdbd2cSJim Jagielski 	updateTree( rEvent, true );
1056*b1cdbd2cSJim Jagielski }
1057*b1cdbd2cSJim Jagielski 
treeNodesRemoved(const::com::sun::star::awt::tree::TreeDataModelEvent & rEvent)1058*b1cdbd2cSJim Jagielski void SAL_CALL TreeControlPeer::treeNodesRemoved( const ::com::sun::star::awt::tree::TreeDataModelEvent& rEvent ) throw (RuntimeException)
1059*b1cdbd2cSJim Jagielski {
1060*b1cdbd2cSJim Jagielski 	::vos::OGuard aGuard( GetMutex() );
1061*b1cdbd2cSJim Jagielski 
1062*b1cdbd2cSJim Jagielski 	if( mnEditLock != 0 )
1063*b1cdbd2cSJim Jagielski 		return;
1064*b1cdbd2cSJim Jagielski 
1065*b1cdbd2cSJim Jagielski 	updateTree( rEvent, true );
1066*b1cdbd2cSJim Jagielski }
1067*b1cdbd2cSJim Jagielski 
treeStructureChanged(const::com::sun::star::awt::tree::TreeDataModelEvent & rEvent)1068*b1cdbd2cSJim Jagielski void SAL_CALL TreeControlPeer::treeStructureChanged( const ::com::sun::star::awt::tree::TreeDataModelEvent& rEvent ) throw (RuntimeException)
1069*b1cdbd2cSJim Jagielski {
1070*b1cdbd2cSJim Jagielski 	::vos::OGuard aGuard( GetMutex() );
1071*b1cdbd2cSJim Jagielski 
1072*b1cdbd2cSJim Jagielski 	if( mnEditLock != 0 )
1073*b1cdbd2cSJim Jagielski 		return;
1074*b1cdbd2cSJim Jagielski 
1075*b1cdbd2cSJim Jagielski 	updateTree( rEvent, true );
1076*b1cdbd2cSJim Jagielski }
1077*b1cdbd2cSJim Jagielski 
updateTree(const::com::sun::star::awt::tree::TreeDataModelEvent & rEvent,bool bRecursive)1078*b1cdbd2cSJim Jagielski void TreeControlPeer::updateTree( const ::com::sun::star::awt::tree::TreeDataModelEvent& rEvent, bool bRecursive )
1079*b1cdbd2cSJim Jagielski {
1080*b1cdbd2cSJim Jagielski 	UnoTreeListBoxImpl& rTree = getTreeListBoxOrThrow();
1081*b1cdbd2cSJim Jagielski 
1082*b1cdbd2cSJim Jagielski 	Sequence< Reference< XTreeNode > > Nodes;
1083*b1cdbd2cSJim Jagielski 	Reference< XTreeNode > xNode( rEvent.ParentNode );
1084*b1cdbd2cSJim Jagielski 	if( !xNode.is() && Nodes.getLength() )
1085*b1cdbd2cSJim Jagielski 	{
1086*b1cdbd2cSJim Jagielski 		xNode = Nodes[0];
1087*b1cdbd2cSJim Jagielski 	}
1088*b1cdbd2cSJim Jagielski 
1089*b1cdbd2cSJim Jagielski 	if( xNode.is() )
1090*b1cdbd2cSJim Jagielski 		updateNode( rTree, xNode, bRecursive );
1091*b1cdbd2cSJim Jagielski }
1092*b1cdbd2cSJim Jagielski 
updateNode(UnoTreeListBoxImpl & rTree,const Reference<XTreeNode> & xNode,bool bRecursive)1093*b1cdbd2cSJim Jagielski void TreeControlPeer::updateNode( UnoTreeListBoxImpl& rTree, const Reference< XTreeNode >& xNode, bool bRecursive )
1094*b1cdbd2cSJim Jagielski {
1095*b1cdbd2cSJim Jagielski 	if( xNode.is() )
1096*b1cdbd2cSJim Jagielski 	{
1097*b1cdbd2cSJim Jagielski 		UnoTreeListEntry* pNodeEntry = getEntry( xNode, false );
1098*b1cdbd2cSJim Jagielski 
1099*b1cdbd2cSJim Jagielski 		if( !pNodeEntry )
1100*b1cdbd2cSJim Jagielski 		{
1101*b1cdbd2cSJim Jagielski 			Reference< XTreeNode > xParentNode( xNode->getParent() );
1102*b1cdbd2cSJim Jagielski 			UnoTreeListEntry* pParentEntry = 0;
1103*b1cdbd2cSJim Jagielski 			sal_uLong nChild = LIST_APPEND;
1104*b1cdbd2cSJim Jagielski 
1105*b1cdbd2cSJim Jagielski 			if( xParentNode.is() )
1106*b1cdbd2cSJim Jagielski 			{
1107*b1cdbd2cSJim Jagielski 				pParentEntry = getEntry( xParentNode  );
1108*b1cdbd2cSJim Jagielski 				nChild = xParentNode->getIndex( xNode );
1109*b1cdbd2cSJim Jagielski 			}
1110*b1cdbd2cSJim Jagielski 
1111*b1cdbd2cSJim Jagielski 			pNodeEntry = createEntry( xNode, pParentEntry, nChild );
1112*b1cdbd2cSJim Jagielski 		}
1113*b1cdbd2cSJim Jagielski 
1114*b1cdbd2cSJim Jagielski 		if( bRecursive )
1115*b1cdbd2cSJim Jagielski 			updateChildNodes( rTree, xNode, pNodeEntry );
1116*b1cdbd2cSJim Jagielski 	}
1117*b1cdbd2cSJim Jagielski }
1118*b1cdbd2cSJim Jagielski 
updateChildNodes(UnoTreeListBoxImpl & rTree,const Reference<XTreeNode> & xParentNode,UnoTreeListEntry * pParentEntry)1119*b1cdbd2cSJim Jagielski void TreeControlPeer::updateChildNodes( UnoTreeListBoxImpl& rTree, const Reference< XTreeNode >& xParentNode, UnoTreeListEntry* pParentEntry )
1120*b1cdbd2cSJim Jagielski {
1121*b1cdbd2cSJim Jagielski 	if( xParentNode.is() && pParentEntry )
1122*b1cdbd2cSJim Jagielski 	{
1123*b1cdbd2cSJim Jagielski 		UnoTreeListEntry* pCurrentChild = dynamic_cast< UnoTreeListEntry* >( rTree.FirstChild( pParentEntry ) );
1124*b1cdbd2cSJim Jagielski 
1125*b1cdbd2cSJim Jagielski 		const sal_Int32 nChildCount = xParentNode->getChildCount();
1126*b1cdbd2cSJim Jagielski 		for( sal_Int32 nChild = 0; nChild < nChildCount; nChild++ )
1127*b1cdbd2cSJim Jagielski 		{
1128*b1cdbd2cSJim Jagielski 			Reference< XTreeNode > xNode( xParentNode->getChildAt( nChild ) );
1129*b1cdbd2cSJim Jagielski 			if( !pCurrentChild || ( pCurrentChild->mxNode != xNode ) )
1130*b1cdbd2cSJim Jagielski 			{
1131*b1cdbd2cSJim Jagielski 				UnoTreeListEntry* pNodeEntry = getEntry( xNode, false );
1132*b1cdbd2cSJim Jagielski 				if( pNodeEntry == 0 )
1133*b1cdbd2cSJim Jagielski 				{
1134*b1cdbd2cSJim Jagielski 					// child node is not yet part of the tree, add it
1135*b1cdbd2cSJim Jagielski 					pCurrentChild = createEntry( xNode, pParentEntry, nChild );
1136*b1cdbd2cSJim Jagielski 				}
1137*b1cdbd2cSJim Jagielski 				else if( pNodeEntry != pCurrentChild )
1138*b1cdbd2cSJim Jagielski 				{
1139*b1cdbd2cSJim Jagielski 					// node is already part of the tree, but not on the correct position
1140*b1cdbd2cSJim Jagielski 					rTree.GetModel()->Move( pNodeEntry, pParentEntry, nChild );
1141*b1cdbd2cSJim Jagielski 					pCurrentChild = pNodeEntry;
1142*b1cdbd2cSJim Jagielski 					updateEntry( pCurrentChild );
1143*b1cdbd2cSJim Jagielski 				}
1144*b1cdbd2cSJim Jagielski 			}
1145*b1cdbd2cSJim Jagielski 			else
1146*b1cdbd2cSJim Jagielski 			{
1147*b1cdbd2cSJim Jagielski 				// child node has entry and entry is equal to current entry,
1148*b1cdbd2cSJim Jagielski 				// so no structural changes happened
1149*b1cdbd2cSJim Jagielski 				updateEntry( pCurrentChild );
1150*b1cdbd2cSJim Jagielski 			}
1151*b1cdbd2cSJim Jagielski 
1152*b1cdbd2cSJim Jagielski 			pCurrentChild = dynamic_cast< UnoTreeListEntry* >( rTree.NextSibling( pCurrentChild ) );
1153*b1cdbd2cSJim Jagielski 		}
1154*b1cdbd2cSJim Jagielski 
1155*b1cdbd2cSJim Jagielski 		// check if we have entries without nodes left, we need to remove them
1156*b1cdbd2cSJim Jagielski 		while( pCurrentChild )
1157*b1cdbd2cSJim Jagielski 		{
1158*b1cdbd2cSJim Jagielski 			UnoTreeListEntry* pNextChild = dynamic_cast< UnoTreeListEntry* >( rTree.NextSibling( pCurrentChild ) );
1159*b1cdbd2cSJim Jagielski 			rTree.GetModel()->Remove( pCurrentChild );
1160*b1cdbd2cSJim Jagielski 			pCurrentChild = pNextChild;
1161*b1cdbd2cSJim Jagielski 		}
1162*b1cdbd2cSJim Jagielski 	}
1163*b1cdbd2cSJim Jagielski }
1164*b1cdbd2cSJim Jagielski 
getEntryString(const Any & rValue)1165*b1cdbd2cSJim Jagielski OUString TreeControlPeer::getEntryString( const Any& rValue )
1166*b1cdbd2cSJim Jagielski {
1167*b1cdbd2cSJim Jagielski 	OUString sValue;
1168*b1cdbd2cSJim Jagielski 	if( rValue.hasValue() )
1169*b1cdbd2cSJim Jagielski 	{
1170*b1cdbd2cSJim Jagielski 		switch( rValue.getValueTypeClass() )
1171*b1cdbd2cSJim Jagielski 		{
1172*b1cdbd2cSJim Jagielski 		case TypeClass_SHORT:
1173*b1cdbd2cSJim Jagielski 		case TypeClass_LONG:
1174*b1cdbd2cSJim Jagielski 			{
1175*b1cdbd2cSJim Jagielski 				sal_Int32 nValue = 0;
1176*b1cdbd2cSJim Jagielski 				if( rValue >>= nValue )
1177*b1cdbd2cSJim Jagielski 					sValue = OUString::valueOf( nValue );
1178*b1cdbd2cSJim Jagielski 				break;
1179*b1cdbd2cSJim Jagielski 			}
1180*b1cdbd2cSJim Jagielski 		case TypeClass_BYTE:
1181*b1cdbd2cSJim Jagielski 		case TypeClass_UNSIGNED_SHORT:
1182*b1cdbd2cSJim Jagielski 		case TypeClass_UNSIGNED_LONG:
1183*b1cdbd2cSJim Jagielski 			{
1184*b1cdbd2cSJim Jagielski 				sal_uInt32 nValue = 0;
1185*b1cdbd2cSJim Jagielski 				if( rValue >>= nValue )
1186*b1cdbd2cSJim Jagielski 					sValue = OUString::valueOf( (sal_Int64)nValue );
1187*b1cdbd2cSJim Jagielski 				break;
1188*b1cdbd2cSJim Jagielski 			}
1189*b1cdbd2cSJim Jagielski 		case TypeClass_HYPER:
1190*b1cdbd2cSJim Jagielski 			{
1191*b1cdbd2cSJim Jagielski 				sal_Int64 nValue = 0;
1192*b1cdbd2cSJim Jagielski 				if( rValue >>= nValue )
1193*b1cdbd2cSJim Jagielski 					sValue = OUString::valueOf( nValue );
1194*b1cdbd2cSJim Jagielski 				break;
1195*b1cdbd2cSJim Jagielski 			}
1196*b1cdbd2cSJim Jagielski 		case TypeClass_UNSIGNED_HYPER:
1197*b1cdbd2cSJim Jagielski 			{
1198*b1cdbd2cSJim Jagielski 				sal_uInt64 nValue = 0;
1199*b1cdbd2cSJim Jagielski 				if( rValue >>= nValue )
1200*b1cdbd2cSJim Jagielski 					sValue = OUString::valueOf( (sal_Int64)nValue );
1201*b1cdbd2cSJim Jagielski 				break;
1202*b1cdbd2cSJim Jagielski 			}
1203*b1cdbd2cSJim Jagielski 		case TypeClass_FLOAT:
1204*b1cdbd2cSJim Jagielski 		case TypeClass_DOUBLE:
1205*b1cdbd2cSJim Jagielski 			{
1206*b1cdbd2cSJim Jagielski 				double fValue = 0.0;
1207*b1cdbd2cSJim Jagielski 				if( rValue >>= fValue )
1208*b1cdbd2cSJim Jagielski 					sValue = OUString::valueOf( fValue );
1209*b1cdbd2cSJim Jagielski 				break;
1210*b1cdbd2cSJim Jagielski 			}
1211*b1cdbd2cSJim Jagielski 		case TypeClass_STRING:
1212*b1cdbd2cSJim Jagielski 			rValue >>= sValue;
1213*b1cdbd2cSJim Jagielski 			break;
1214*b1cdbd2cSJim Jagielski 	/*
1215*b1cdbd2cSJim Jagielski 		case TypeClass_INTERFACE:
1216*b1cdbd2cSJim Jagielski 			// @todo
1217*b1cdbd2cSJim Jagielski 			break;
1218*b1cdbd2cSJim Jagielski 		case TypeClass_SEQUENCE:
1219*b1cdbd2cSJim Jagielski 			{
1220*b1cdbd2cSJim Jagielski 				Sequence< Any > aValues;
1221*b1cdbd2cSJim Jagielski 				if( aValue >>= aValues )
1222*b1cdbd2cSJim Jagielski 				{
1223*b1cdbd2cSJim Jagielski 					updateEntry( SvLBoxEntry& rEntry, aValues );
1224*b1cdbd2cSJim Jagielski 					return;
1225*b1cdbd2cSJim Jagielski 				}
1226*b1cdbd2cSJim Jagielski 			}
1227*b1cdbd2cSJim Jagielski 			break;
1228*b1cdbd2cSJim Jagielski 	*/
1229*b1cdbd2cSJim Jagielski 		default:
1230*b1cdbd2cSJim Jagielski 			break;
1231*b1cdbd2cSJim Jagielski 		}
1232*b1cdbd2cSJim Jagielski 	}
1233*b1cdbd2cSJim Jagielski 	return sValue;
1234*b1cdbd2cSJim Jagielski }
1235*b1cdbd2cSJim Jagielski 
1236*b1cdbd2cSJim Jagielski // XEventListener
disposing(const::com::sun::star::lang::EventObject &)1237*b1cdbd2cSJim Jagielski void SAL_CALL TreeControlPeer::disposing( const ::com::sun::star::lang::EventObject& ) throw(::com::sun::star::uno::RuntimeException)
1238*b1cdbd2cSJim Jagielski {
1239*b1cdbd2cSJim Jagielski 	// model is disposed, so we clear our tree
1240*b1cdbd2cSJim Jagielski 	::vos::OGuard aGuard( GetMutex() );
1241*b1cdbd2cSJim Jagielski 	UnoTreeListBoxImpl& rTree = getTreeListBoxOrThrow();
1242*b1cdbd2cSJim Jagielski 	rTree.Clear();
1243*b1cdbd2cSJim Jagielski 	mxDataModel.clear();
1244*b1cdbd2cSJim Jagielski }
1245*b1cdbd2cSJim Jagielski 
onChangeDataModel(UnoTreeListBoxImpl & rTree,const Reference<XTreeDataModel> & xDataModel)1246*b1cdbd2cSJim Jagielski void TreeControlPeer::onChangeDataModel( UnoTreeListBoxImpl& rTree, const Reference< XTreeDataModel >& xDataModel )
1247*b1cdbd2cSJim Jagielski {
1248*b1cdbd2cSJim Jagielski 	if( xDataModel.is() && (mxDataModel == xDataModel) )
1249*b1cdbd2cSJim Jagielski 		return; // do nothing
1250*b1cdbd2cSJim Jagielski 
1251*b1cdbd2cSJim Jagielski 	Reference< XTreeDataModelListener > xListener( this );
1252*b1cdbd2cSJim Jagielski 
1253*b1cdbd2cSJim Jagielski 	if( mxDataModel.is() )
1254*b1cdbd2cSJim Jagielski 		mxDataModel->removeTreeDataModelListener( xListener );
1255*b1cdbd2cSJim Jagielski 
1256*b1cdbd2cSJim Jagielski 	if( !xDataModel.is() )
1257*b1cdbd2cSJim Jagielski 	{
1258*b1cdbd2cSJim Jagielski 		static const OUString aSN( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.awt.tree.DefaultTreeDataModel" ) );
1259*b1cdbd2cSJim Jagielski 		Reference< XMultiServiceFactory > xORB( ::comphelper::getProcessServiceFactory() );
1260*b1cdbd2cSJim Jagielski 		if( xORB.is() )
1261*b1cdbd2cSJim Jagielski 		{
1262*b1cdbd2cSJim Jagielski 			mxDataModel.query( xORB->createInstance( aSN ) );
1263*b1cdbd2cSJim Jagielski 		}
1264*b1cdbd2cSJim Jagielski 	}
1265*b1cdbd2cSJim Jagielski 
1266*b1cdbd2cSJim Jagielski 	mxDataModel = xDataModel;
1267*b1cdbd2cSJim Jagielski 
1268*b1cdbd2cSJim Jagielski 	fillTree( rTree, mxDataModel );
1269*b1cdbd2cSJim Jagielski 
1270*b1cdbd2cSJim Jagielski 	if( mxDataModel.is() )
1271*b1cdbd2cSJim Jagielski 		mxDataModel->addTreeDataModelListener( xListener );
1272*b1cdbd2cSJim Jagielski }
1273*b1cdbd2cSJim Jagielski 
1274*b1cdbd2cSJim Jagielski // --------------------------------------------------------------------
1275*b1cdbd2cSJim Jagielski // ::com::sun::star::awt::XLayoutConstrains
1276*b1cdbd2cSJim Jagielski // --------------------------------------------------------------------
1277*b1cdbd2cSJim Jagielski 
getMinimumSize()1278*b1cdbd2cSJim Jagielski ::com::sun::star::awt::Size TreeControlPeer::getMinimumSize() throw(RuntimeException)
1279*b1cdbd2cSJim Jagielski {
1280*b1cdbd2cSJim Jagielski 	::vos::OGuard aGuard( GetMutex() );
1281*b1cdbd2cSJim Jagielski 
1282*b1cdbd2cSJim Jagielski 	::com::sun::star::awt::Size aSz;
1283*b1cdbd2cSJim Jagielski /* todo
1284*b1cdbd2cSJim Jagielski 	MultiLineEdit* pEdit = (MultiLineEdit*) GetWindow();
1285*b1cdbd2cSJim Jagielski 	if ( pEdit )
1286*b1cdbd2cSJim Jagielski 		aSz = AWTSize(pEdit->CalcMinimumSize());
1287*b1cdbd2cSJim Jagielski */
1288*b1cdbd2cSJim Jagielski 	return aSz;
1289*b1cdbd2cSJim Jagielski }
1290*b1cdbd2cSJim Jagielski 
getPreferredSize()1291*b1cdbd2cSJim Jagielski ::com::sun::star::awt::Size TreeControlPeer::getPreferredSize() throw(RuntimeException)
1292*b1cdbd2cSJim Jagielski {
1293*b1cdbd2cSJim Jagielski 	return getMinimumSize();
1294*b1cdbd2cSJim Jagielski }
1295*b1cdbd2cSJim Jagielski 
calcAdjustedSize(const::com::sun::star::awt::Size & rNewSize)1296*b1cdbd2cSJim Jagielski ::com::sun::star::awt::Size TreeControlPeer::calcAdjustedSize( const ::com::sun::star::awt::Size& rNewSize ) throw(RuntimeException)
1297*b1cdbd2cSJim Jagielski {
1298*b1cdbd2cSJim Jagielski 	::vos::OGuard aGuard( GetMutex() );
1299*b1cdbd2cSJim Jagielski 
1300*b1cdbd2cSJim Jagielski 	::com::sun::star::awt::Size aSz = rNewSize;
1301*b1cdbd2cSJim Jagielski /* todo
1302*b1cdbd2cSJim Jagielski 	MultiLineEdit* pEdit = (MultiLineEdit*) GetWindow();
1303*b1cdbd2cSJim Jagielski 	if ( pEdit )
1304*b1cdbd2cSJim Jagielski 		aSz = AWTSize(pEdit->CalcAdjustedSize( VCLSize(rNewSize )));
1305*b1cdbd2cSJim Jagielski */
1306*b1cdbd2cSJim Jagielski 	return aSz;
1307*b1cdbd2cSJim Jagielski }
1308*b1cdbd2cSJim Jagielski 
1309*b1cdbd2cSJim Jagielski // --------------------------------------------------------------------
1310*b1cdbd2cSJim Jagielski // ::com::sun::star::awt::XVclWindowPeer
1311*b1cdbd2cSJim Jagielski // --------------------------------------------------------------------
1312*b1cdbd2cSJim Jagielski 
setProperty(const::rtl::OUString & PropertyName,const Any & aValue)1313*b1cdbd2cSJim Jagielski void TreeControlPeer::setProperty( const ::rtl::OUString& PropertyName, const Any& aValue) throw(RuntimeException)
1314*b1cdbd2cSJim Jagielski {
1315*b1cdbd2cSJim Jagielski 	::vos::OGuard aGuard( GetMutex() );
1316*b1cdbd2cSJim Jagielski 
1317*b1cdbd2cSJim Jagielski 	UnoTreeListBoxImpl& rTree = getTreeListBoxOrThrow();
1318*b1cdbd2cSJim Jagielski 
1319*b1cdbd2cSJim Jagielski 	switch( GetPropertyId( PropertyName ) )
1320*b1cdbd2cSJim Jagielski 	{
1321*b1cdbd2cSJim Jagielski         case BASEPROPERTY_HIDEINACTIVESELECTION:
1322*b1cdbd2cSJim Jagielski         {
1323*b1cdbd2cSJim Jagielski             sal_Bool bEnabled = sal_False;
1324*b1cdbd2cSJim Jagielski             if ( aValue >>= bEnabled )
1325*b1cdbd2cSJim Jagielski             {
1326*b1cdbd2cSJim Jagielski                 WinBits nStyle = rTree.GetStyle();
1327*b1cdbd2cSJim Jagielski                 if ( bEnabled )
1328*b1cdbd2cSJim Jagielski                     nStyle |= WB_HIDESELECTION;
1329*b1cdbd2cSJim Jagielski                 else
1330*b1cdbd2cSJim Jagielski                     nStyle &= ~WB_HIDESELECTION;
1331*b1cdbd2cSJim Jagielski                 rTree.SetStyle( nStyle );
1332*b1cdbd2cSJim Jagielski             }
1333*b1cdbd2cSJim Jagielski         }
1334*b1cdbd2cSJim Jagielski         break;
1335*b1cdbd2cSJim Jagielski 
1336*b1cdbd2cSJim Jagielski 		case BASEPROPERTY_TREE_SELECTIONTYPE:
1337*b1cdbd2cSJim Jagielski 		{
1338*b1cdbd2cSJim Jagielski 			SelectionType eSelectionType;
1339*b1cdbd2cSJim Jagielski 			if( aValue >>= eSelectionType )
1340*b1cdbd2cSJim Jagielski 			{
1341*b1cdbd2cSJim Jagielski 				SelectionMode eSelMode;
1342*b1cdbd2cSJim Jagielski 				switch( eSelectionType )
1343*b1cdbd2cSJim Jagielski 				{
1344*b1cdbd2cSJim Jagielski 				case SelectionType_SINGLE:	eSelMode = SINGLE_SELECTION; break;
1345*b1cdbd2cSJim Jagielski 				case SelectionType_RANGE:	eSelMode = RANGE_SELECTION; break;
1346*b1cdbd2cSJim Jagielski 				case SelectionType_MULTI:	eSelMode = MULTIPLE_SELECTION; break;
1347*b1cdbd2cSJim Jagielski 	//			case SelectionType_NONE:
1348*b1cdbd2cSJim Jagielski 				default:					eSelMode = NO_SELECTION; break;
1349*b1cdbd2cSJim Jagielski 				}
1350*b1cdbd2cSJim Jagielski 				if( rTree.GetSelectionMode() != eSelMode )
1351*b1cdbd2cSJim Jagielski 					rTree.SetSelectionMode( eSelMode );
1352*b1cdbd2cSJim Jagielski 			}
1353*b1cdbd2cSJim Jagielski 			break;
1354*b1cdbd2cSJim Jagielski 		}
1355*b1cdbd2cSJim Jagielski 
1356*b1cdbd2cSJim Jagielski 		case BASEPROPERTY_TREE_DATAMODEL:
1357*b1cdbd2cSJim Jagielski 			onChangeDataModel( rTree, Reference< XTreeDataModel >( aValue, UNO_QUERY ) );
1358*b1cdbd2cSJim Jagielski 			break;
1359*b1cdbd2cSJim Jagielski 		case BASEPROPERTY_ROW_HEIGHT:
1360*b1cdbd2cSJim Jagielski 		{
1361*b1cdbd2cSJim Jagielski 			sal_Int32 nHeight = 0;
1362*b1cdbd2cSJim Jagielski 			if( aValue >>= nHeight )
1363*b1cdbd2cSJim Jagielski 				rTree.SetEntryHeight( (short)nHeight );
1364*b1cdbd2cSJim Jagielski 			break;
1365*b1cdbd2cSJim Jagielski 		}
1366*b1cdbd2cSJim Jagielski 		case BASEPROPERTY_TREE_EDITABLE:
1367*b1cdbd2cSJim Jagielski 		{
1368*b1cdbd2cSJim Jagielski 			sal_Bool bEnabled = false;
1369*b1cdbd2cSJim Jagielski 			if( aValue >>= bEnabled )
1370*b1cdbd2cSJim Jagielski 				rTree.EnableInplaceEditing( bEnabled ? sal_True : sal_False );
1371*b1cdbd2cSJim Jagielski 			break;
1372*b1cdbd2cSJim Jagielski 		}
1373*b1cdbd2cSJim Jagielski 		case BASEPROPERTY_TREE_INVOKESSTOPNODEEDITING:
1374*b1cdbd2cSJim Jagielski 			break; // @todo
1375*b1cdbd2cSJim Jagielski 		case BASEPROPERTY_TREE_ROOTDISPLAYED:
1376*b1cdbd2cSJim Jagielski         {
1377*b1cdbd2cSJim Jagielski 			sal_Bool bDisplayed = false;
1378*b1cdbd2cSJim Jagielski 			if( (aValue >>= bDisplayed) && ( bDisplayed != mbIsRootDisplayed) )
1379*b1cdbd2cSJim Jagielski 			{
1380*b1cdbd2cSJim Jagielski 				onChangeRootDisplayed(bDisplayed);
1381*b1cdbd2cSJim Jagielski 			}
1382*b1cdbd2cSJim Jagielski 			break;
1383*b1cdbd2cSJim Jagielski         }
1384*b1cdbd2cSJim Jagielski 		case BASEPROPERTY_TREE_SHOWSHANDLES:
1385*b1cdbd2cSJim Jagielski 		{
1386*b1cdbd2cSJim Jagielski 			sal_Bool bEnabled = false;
1387*b1cdbd2cSJim Jagielski 			if( aValue >>= bEnabled )
1388*b1cdbd2cSJim Jagielski 			{
1389*b1cdbd2cSJim Jagielski 				WinBits nBits = rTree.GetStyle() & (~WB_HASLINES);
1390*b1cdbd2cSJim Jagielski 				if( bEnabled )
1391*b1cdbd2cSJim Jagielski 					nBits |= WB_HASLINES;
1392*b1cdbd2cSJim Jagielski 				if( nBits != rTree.GetStyle() )
1393*b1cdbd2cSJim Jagielski 					rTree.SetStyle( nBits );
1394*b1cdbd2cSJim Jagielski 			}
1395*b1cdbd2cSJim Jagielski 			break;
1396*b1cdbd2cSJim Jagielski 		}
1397*b1cdbd2cSJim Jagielski 		case BASEPROPERTY_TREE_SHOWSROOTHANDLES:
1398*b1cdbd2cSJim Jagielski 		{
1399*b1cdbd2cSJim Jagielski 			sal_Bool bEnabled = false;
1400*b1cdbd2cSJim Jagielski 			if( aValue >>= bEnabled )
1401*b1cdbd2cSJim Jagielski 			{
1402*b1cdbd2cSJim Jagielski 				WinBits nBits = rTree.GetStyle() & (~WB_HASLINESATROOT);
1403*b1cdbd2cSJim Jagielski 				if( bEnabled )
1404*b1cdbd2cSJim Jagielski 					nBits |= WB_HASLINESATROOT;
1405*b1cdbd2cSJim Jagielski 				if( nBits != rTree.GetStyle() )
1406*b1cdbd2cSJim Jagielski 					rTree.SetStyle( nBits );
1407*b1cdbd2cSJim Jagielski 			}
1408*b1cdbd2cSJim Jagielski 			break;
1409*b1cdbd2cSJim Jagielski 		}
1410*b1cdbd2cSJim Jagielski 		default:
1411*b1cdbd2cSJim Jagielski 		VCLXWindow::setProperty( PropertyName, aValue );
1412*b1cdbd2cSJim Jagielski 		break;
1413*b1cdbd2cSJim Jagielski 	}
1414*b1cdbd2cSJim Jagielski }
1415*b1cdbd2cSJim Jagielski 
getProperty(const::rtl::OUString & PropertyName)1416*b1cdbd2cSJim Jagielski Any TreeControlPeer::getProperty( const ::rtl::OUString& PropertyName ) throw(RuntimeException)
1417*b1cdbd2cSJim Jagielski {
1418*b1cdbd2cSJim Jagielski 	::vos::OGuard aGuard( GetMutex() );
1419*b1cdbd2cSJim Jagielski 
1420*b1cdbd2cSJim Jagielski 	const sal_uInt16 nPropId = GetPropertyId( PropertyName );
1421*b1cdbd2cSJim Jagielski 	if( (nPropId >= BASEPROPERTY_TREE_START) && (nPropId <= BASEPROPERTY_TREE_END) )
1422*b1cdbd2cSJim Jagielski 	{
1423*b1cdbd2cSJim Jagielski 		UnoTreeListBoxImpl& rTree = getTreeListBoxOrThrow();
1424*b1cdbd2cSJim Jagielski 		switch(nPropId)
1425*b1cdbd2cSJim Jagielski 		{
1426*b1cdbd2cSJim Jagielski         case BASEPROPERTY_HIDEINACTIVESELECTION:
1427*b1cdbd2cSJim Jagielski 			return Any( ( rTree.GetStyle() & WB_HIDESELECTION ) != 0 ? sal_True : sal_False );
1428*b1cdbd2cSJim Jagielski 
1429*b1cdbd2cSJim Jagielski 		case BASEPROPERTY_TREE_SELECTIONTYPE:
1430*b1cdbd2cSJim Jagielski 		{
1431*b1cdbd2cSJim Jagielski 			SelectionType eSelectionType;
1432*b1cdbd2cSJim Jagielski 
1433*b1cdbd2cSJim Jagielski 			SelectionMode eSelMode = rTree.GetSelectionMode();
1434*b1cdbd2cSJim Jagielski 			switch( eSelMode )
1435*b1cdbd2cSJim Jagielski 			{
1436*b1cdbd2cSJim Jagielski 			case SINGLE_SELECTION:	eSelectionType = SelectionType_SINGLE; break;
1437*b1cdbd2cSJim Jagielski 			case RANGE_SELECTION:	eSelectionType = SelectionType_RANGE; break;
1438*b1cdbd2cSJim Jagielski 			case MULTIPLE_SELECTION:eSelectionType = SelectionType_MULTI; break;
1439*b1cdbd2cSJim Jagielski //			case NO_SELECTION:
1440*b1cdbd2cSJim Jagielski 			default:				eSelectionType = SelectionType_NONE; break;
1441*b1cdbd2cSJim Jagielski 			}
1442*b1cdbd2cSJim Jagielski 			return Any( eSelectionType );
1443*b1cdbd2cSJim Jagielski 		}
1444*b1cdbd2cSJim Jagielski 		case BASEPROPERTY_ROW_HEIGHT:
1445*b1cdbd2cSJim Jagielski 			return Any( (sal_Int32)rTree.GetEntryHeight() );
1446*b1cdbd2cSJim Jagielski 		case BASEPROPERTY_TREE_DATAMODEL:
1447*b1cdbd2cSJim Jagielski 			return Any( mxDataModel );
1448*b1cdbd2cSJim Jagielski 		case BASEPROPERTY_TREE_EDITABLE:
1449*b1cdbd2cSJim Jagielski 			return Any( rTree.IsInplaceEditingEnabled() ? sal_True : sal_False );
1450*b1cdbd2cSJim Jagielski 		case BASEPROPERTY_TREE_INVOKESSTOPNODEEDITING:
1451*b1cdbd2cSJim Jagielski 			return Any( sal_True ); // @todo
1452*b1cdbd2cSJim Jagielski 		case BASEPROPERTY_TREE_ROOTDISPLAYED:
1453*b1cdbd2cSJim Jagielski 			return Any( mbIsRootDisplayed );
1454*b1cdbd2cSJim Jagielski 		case BASEPROPERTY_TREE_SHOWSHANDLES:
1455*b1cdbd2cSJim Jagielski 			return Any( (rTree.GetStyle() & WB_HASLINES) != 0 ? sal_True : sal_False );
1456*b1cdbd2cSJim Jagielski 		case BASEPROPERTY_TREE_SHOWSROOTHANDLES:
1457*b1cdbd2cSJim Jagielski 			return Any( (rTree.GetStyle() & WB_HASLINESATROOT) != 0 ? sal_True : sal_False );
1458*b1cdbd2cSJim Jagielski 		}
1459*b1cdbd2cSJim Jagielski 	}
1460*b1cdbd2cSJim Jagielski 	return VCLXWindow::getProperty( PropertyName );
1461*b1cdbd2cSJim Jagielski }
1462*b1cdbd2cSJim Jagielski 
onChangeRootDisplayed(sal_Bool bIsRootDisplayed)1463*b1cdbd2cSJim Jagielski void TreeControlPeer::onChangeRootDisplayed( sal_Bool bIsRootDisplayed )
1464*b1cdbd2cSJim Jagielski {
1465*b1cdbd2cSJim Jagielski 	if( mbIsRootDisplayed == bIsRootDisplayed )
1466*b1cdbd2cSJim Jagielski 		return;
1467*b1cdbd2cSJim Jagielski 
1468*b1cdbd2cSJim Jagielski 	mbIsRootDisplayed = bIsRootDisplayed;
1469*b1cdbd2cSJim Jagielski 
1470*b1cdbd2cSJim Jagielski 	UnoTreeListBoxImpl& rTree = getTreeListBoxOrThrow();
1471*b1cdbd2cSJim Jagielski 
1472*b1cdbd2cSJim Jagielski 	if( rTree.GetEntryCount() == 0 )
1473*b1cdbd2cSJim Jagielski 		return;
1474*b1cdbd2cSJim Jagielski 
1475*b1cdbd2cSJim Jagielski 	// todo
1476*b1cdbd2cSJim Jagielski 	fillTree( rTree, mxDataModel );
1477*b1cdbd2cSJim Jagielski 	if( mbIsRootDisplayed )
1478*b1cdbd2cSJim Jagielski 	{
1479*b1cdbd2cSJim Jagielski 	}
1480*b1cdbd2cSJim Jagielski 	else
1481*b1cdbd2cSJim Jagielski 	{
1482*b1cdbd2cSJim Jagielski 	}
1483*b1cdbd2cSJim Jagielski }
1484*b1cdbd2cSJim Jagielski 
loadImage(const::rtl::OUString & rURL,Image & rImage)1485*b1cdbd2cSJim Jagielski bool TreeControlPeer::loadImage( const ::rtl::OUString& rURL, Image& rImage )
1486*b1cdbd2cSJim Jagielski {
1487*b1cdbd2cSJim Jagielski 	if( !mxGraphicProvider.is() )
1488*b1cdbd2cSJim Jagielski 	{
1489*b1cdbd2cSJim Jagielski 		static const OUString aSN( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.graphic.GraphicProvider" ) );
1490*b1cdbd2cSJim Jagielski 		Reference< XMultiServiceFactory > xORB( ::comphelper::getProcessServiceFactory() );
1491*b1cdbd2cSJim Jagielski 		if( xORB.is() )
1492*b1cdbd2cSJim Jagielski 		{
1493*b1cdbd2cSJim Jagielski 			Reference< XInterface > x( xORB->createInstance( aSN ) );
1494*b1cdbd2cSJim Jagielski 			mxGraphicProvider.query( x );
1495*b1cdbd2cSJim Jagielski 			mxGraphicProvider = Reference< XGraphicProvider >( x, UNO_QUERY );
1496*b1cdbd2cSJim Jagielski 		}
1497*b1cdbd2cSJim Jagielski 	}
1498*b1cdbd2cSJim Jagielski 
1499*b1cdbd2cSJim Jagielski 	if( mxGraphicProvider.is() ) try
1500*b1cdbd2cSJim Jagielski 	{
1501*b1cdbd2cSJim Jagielski 		::com::sun::star::beans::PropertyValues aProps( 1 );
1502*b1cdbd2cSJim Jagielski 		aProps[0].Name = OUString( RTL_CONSTASCII_USTRINGPARAM( "URL" ) );
1503*b1cdbd2cSJim Jagielski 		aProps[0].Value <<= rURL;
1504*b1cdbd2cSJim Jagielski 
1505*b1cdbd2cSJim Jagielski 		Reference< XGraphic > xGraphic( mxGraphicProvider->queryGraphic( aProps ) );
1506*b1cdbd2cSJim Jagielski 
1507*b1cdbd2cSJim Jagielski 		Graphic aGraphic( xGraphic );
1508*b1cdbd2cSJim Jagielski 		rImage = aGraphic.GetBitmapEx();
1509*b1cdbd2cSJim Jagielski 		return true;
1510*b1cdbd2cSJim Jagielski 	}
1511*b1cdbd2cSJim Jagielski 	catch( Exception& )
1512*b1cdbd2cSJim Jagielski 	{
1513*b1cdbd2cSJim Jagielski 	}
1514*b1cdbd2cSJim Jagielski 
1515*b1cdbd2cSJim Jagielski 	return false;
1516*b1cdbd2cSJim Jagielski }
1517*b1cdbd2cSJim Jagielski 
1518*b1cdbd2cSJim Jagielski // ====================================================================
1519*b1cdbd2cSJim Jagielski // class UnoTreeListBoxImpl
1520*b1cdbd2cSJim Jagielski // ====================================================================
1521*b1cdbd2cSJim Jagielski 
UnoTreeListBoxImpl(TreeControlPeer * pPeer,Window * pParent,WinBits nWinStyle)1522*b1cdbd2cSJim Jagielski UnoTreeListBoxImpl::UnoTreeListBoxImpl( TreeControlPeer* pPeer, Window* pParent, WinBits nWinStyle )
1523*b1cdbd2cSJim Jagielski : SvTreeListBox( pParent, nWinStyle )
1524*b1cdbd2cSJim Jagielski , mxPeer( pPeer )
1525*b1cdbd2cSJim Jagielski {
1526*b1cdbd2cSJim Jagielski 	SetStyle( WB_BORDER | WB_HASLINES |WB_HASBUTTONS | WB_HASLINESATROOT | WB_HASBUTTONSATROOT | WB_HSCROLL );
1527*b1cdbd2cSJim Jagielski 	SetNodeDefaultImages();
1528*b1cdbd2cSJim Jagielski 	SetSelectHdl( LINK(this, UnoTreeListBoxImpl, OnSelectionChangeHdl) );
1529*b1cdbd2cSJim Jagielski 	SetDeselectHdl( LINK(this, UnoTreeListBoxImpl, OnSelectionChangeHdl) );
1530*b1cdbd2cSJim Jagielski 
1531*b1cdbd2cSJim Jagielski 	SetExpandingHdl( LINK(this, UnoTreeListBoxImpl, OnExpandingHdl) );
1532*b1cdbd2cSJim Jagielski 	SetExpandedHdl( LINK(this, UnoTreeListBoxImpl, OnExpandedHdl) );
1533*b1cdbd2cSJim Jagielski 
1534*b1cdbd2cSJim Jagielski }
1535*b1cdbd2cSJim Jagielski 
1536*b1cdbd2cSJim Jagielski // --------------------------------------------------------------------
1537*b1cdbd2cSJim Jagielski 
~UnoTreeListBoxImpl()1538*b1cdbd2cSJim Jagielski UnoTreeListBoxImpl::~UnoTreeListBoxImpl()
1539*b1cdbd2cSJim Jagielski {
1540*b1cdbd2cSJim Jagielski 	if( mxPeer.is() )
1541*b1cdbd2cSJim Jagielski 		mxPeer->disposeControl();
1542*b1cdbd2cSJim Jagielski }
1543*b1cdbd2cSJim Jagielski 
1544*b1cdbd2cSJim Jagielski // --------------------------------------------------------------------
1545*b1cdbd2cSJim Jagielski 
IMPL_LINK(UnoTreeListBoxImpl,OnSelectionChangeHdl,UnoTreeListBoxImpl *,EMPTYARG)1546*b1cdbd2cSJim Jagielski IMPL_LINK( UnoTreeListBoxImpl, OnSelectionChangeHdl, UnoTreeListBoxImpl*, EMPTYARG )
1547*b1cdbd2cSJim Jagielski {
1548*b1cdbd2cSJim Jagielski 	if( mxPeer.is() )
1549*b1cdbd2cSJim Jagielski 		mxPeer->onSelectionChanged();
1550*b1cdbd2cSJim Jagielski 	return 0;
1551*b1cdbd2cSJim Jagielski }
1552*b1cdbd2cSJim Jagielski 
1553*b1cdbd2cSJim Jagielski // --------------------------------------------------------------------
1554*b1cdbd2cSJim Jagielski 
IMPL_LINK(UnoTreeListBoxImpl,OnExpandingHdl,UnoTreeListBoxImpl *,EMPTYARG)1555*b1cdbd2cSJim Jagielski IMPL_LINK(UnoTreeListBoxImpl, OnExpandingHdl, UnoTreeListBoxImpl*, EMPTYARG )
1556*b1cdbd2cSJim Jagielski {
1557*b1cdbd2cSJim Jagielski 	UnoTreeListEntry* pEntry = dynamic_cast< UnoTreeListEntry* >( GetHdlEntry() );
1558*b1cdbd2cSJim Jagielski 
1559*b1cdbd2cSJim Jagielski 	if( pEntry && mxPeer.is() )
1560*b1cdbd2cSJim Jagielski 	{
1561*b1cdbd2cSJim Jagielski 		return mxPeer->onExpanding( pEntry->mxNode, !IsExpanded( pEntry ) ) ? 1 : 0;
1562*b1cdbd2cSJim Jagielski 	}
1563*b1cdbd2cSJim Jagielski 	return 0;
1564*b1cdbd2cSJim Jagielski }
1565*b1cdbd2cSJim Jagielski 
1566*b1cdbd2cSJim Jagielski // --------------------------------------------------------------------
1567*b1cdbd2cSJim Jagielski 
IMPL_LINK(UnoTreeListBoxImpl,OnExpandedHdl,UnoTreeListBoxImpl *,EMPTYARG)1568*b1cdbd2cSJim Jagielski IMPL_LINK(UnoTreeListBoxImpl, OnExpandedHdl, UnoTreeListBoxImpl*, EMPTYARG )
1569*b1cdbd2cSJim Jagielski {
1570*b1cdbd2cSJim Jagielski 	UnoTreeListEntry* pEntry = dynamic_cast< UnoTreeListEntry* >( GetHdlEntry() );
1571*b1cdbd2cSJim Jagielski 	if( pEntry && mxPeer.is() )
1572*b1cdbd2cSJim Jagielski 	{
1573*b1cdbd2cSJim Jagielski 		mxPeer->onExpanded( pEntry->mxNode, IsExpanded( pEntry ) );
1574*b1cdbd2cSJim Jagielski 	}
1575*b1cdbd2cSJim Jagielski 	return 0;
1576*b1cdbd2cSJim Jagielski }
1577*b1cdbd2cSJim Jagielski 
1578*b1cdbd2cSJim Jagielski // --------------------------------------------------------------------
1579*b1cdbd2cSJim Jagielski 
insert(SvLBoxEntry * pEntry,SvLBoxEntry * pParent,sal_uLong nPos)1580*b1cdbd2cSJim Jagielski sal_uInt32 UnoTreeListBoxImpl::insert( SvLBoxEntry* pEntry,SvLBoxEntry* pParent,sal_uLong nPos )
1581*b1cdbd2cSJim Jagielski {
1582*b1cdbd2cSJim Jagielski 	if( pParent )
1583*b1cdbd2cSJim Jagielski 		return SvTreeListBox::Insert( pEntry, pParent, nPos );
1584*b1cdbd2cSJim Jagielski 	else
1585*b1cdbd2cSJim Jagielski 		return SvTreeListBox::Insert( pEntry, nPos );
1586*b1cdbd2cSJim Jagielski }
1587*b1cdbd2cSJim Jagielski 
1588*b1cdbd2cSJim Jagielski // --------------------------------------------------------------------
1589*b1cdbd2cSJim Jagielski 
RequestingChilds(SvLBoxEntry * pParent)1590*b1cdbd2cSJim Jagielski void UnoTreeListBoxImpl::RequestingChilds( SvLBoxEntry* pParent )
1591*b1cdbd2cSJim Jagielski {
1592*b1cdbd2cSJim Jagielski 	UnoTreeListEntry* pEntry = dynamic_cast< UnoTreeListEntry* >( pParent );
1593*b1cdbd2cSJim Jagielski 	if( pEntry && pEntry->mxNode.is() && mxPeer.is() )
1594*b1cdbd2cSJim Jagielski 		mxPeer->onRequestChildNodes( pEntry->mxNode );
1595*b1cdbd2cSJim Jagielski }
1596*b1cdbd2cSJim Jagielski 
1597*b1cdbd2cSJim Jagielski // --------------------------------------------------------------------
1598*b1cdbd2cSJim Jagielski 
EditingEntry(SvLBoxEntry * pEntry,Selection &)1599*b1cdbd2cSJim Jagielski sal_Bool UnoTreeListBoxImpl::EditingEntry( SvLBoxEntry* pEntry, Selection& )
1600*b1cdbd2cSJim Jagielski {
1601*b1cdbd2cSJim Jagielski 	return mxPeer.is() ? mxPeer->onEditingEntry( dynamic_cast< UnoTreeListEntry* >( pEntry ) ) : false;
1602*b1cdbd2cSJim Jagielski }
1603*b1cdbd2cSJim Jagielski 
1604*b1cdbd2cSJim Jagielski // --------------------------------------------------------------------
1605*b1cdbd2cSJim Jagielski 
EditedEntry(SvLBoxEntry * pEntry,const XubString & rNewText)1606*b1cdbd2cSJim Jagielski sal_Bool UnoTreeListBoxImpl::EditedEntry( SvLBoxEntry* pEntry, const XubString& rNewText )
1607*b1cdbd2cSJim Jagielski {
1608*b1cdbd2cSJim Jagielski 	return mxPeer.is() ? mxPeer->onEditedEntry( dynamic_cast< UnoTreeListEntry* >( pEntry ), rNewText ) : false;
1609*b1cdbd2cSJim Jagielski }
1610*b1cdbd2cSJim Jagielski 
1611*b1cdbd2cSJim Jagielski // ====================================================================
1612*b1cdbd2cSJim Jagielski // class UnoTreeListItem
1613*b1cdbd2cSJim Jagielski // ====================================================================
1614*b1cdbd2cSJim Jagielski 
UnoTreeListItem(SvLBoxEntry * pEntry)1615*b1cdbd2cSJim Jagielski UnoTreeListItem::UnoTreeListItem( SvLBoxEntry* pEntry )
1616*b1cdbd2cSJim Jagielski : SvLBoxItem( pEntry, 0 )
1617*b1cdbd2cSJim Jagielski {
1618*b1cdbd2cSJim Jagielski }
1619*b1cdbd2cSJim Jagielski 
1620*b1cdbd2cSJim Jagielski // --------------------------------------------------------------------
1621*b1cdbd2cSJim Jagielski 
UnoTreeListItem()1622*b1cdbd2cSJim Jagielski UnoTreeListItem::UnoTreeListItem()
1623*b1cdbd2cSJim Jagielski : SvLBoxItem()
1624*b1cdbd2cSJim Jagielski {
1625*b1cdbd2cSJim Jagielski }
1626*b1cdbd2cSJim Jagielski 
1627*b1cdbd2cSJim Jagielski // --------------------------------------------------------------------
1628*b1cdbd2cSJim Jagielski 
~UnoTreeListItem()1629*b1cdbd2cSJim Jagielski UnoTreeListItem::~UnoTreeListItem()
1630*b1cdbd2cSJim Jagielski {
1631*b1cdbd2cSJim Jagielski }
1632*b1cdbd2cSJim Jagielski 
1633*b1cdbd2cSJim Jagielski // --------------------------------------------------------------------
1634*b1cdbd2cSJim Jagielski 
IsA()1635*b1cdbd2cSJim Jagielski sal_uInt16 UnoTreeListItem::IsA()
1636*b1cdbd2cSJim Jagielski {
1637*b1cdbd2cSJim Jagielski 	return SV_ITEM_ID_LBOXSTRING;
1638*b1cdbd2cSJim Jagielski }
1639*b1cdbd2cSJim Jagielski 
1640*b1cdbd2cSJim Jagielski // --------------------------------------------------------------------
1641*b1cdbd2cSJim Jagielski 
Paint(const Point & rPos,SvLBox & rDev,sal_uInt16,SvLBoxEntry * _pEntry)1642*b1cdbd2cSJim Jagielski void UnoTreeListItem::Paint( const Point& rPos, SvLBox& rDev, sal_uInt16 /* nFlags */, SvLBoxEntry* _pEntry)
1643*b1cdbd2cSJim Jagielski {
1644*b1cdbd2cSJim Jagielski 	Point aPos( rPos );
1645*b1cdbd2cSJim Jagielski 	if( _pEntry )
1646*b1cdbd2cSJim Jagielski 	{
1647*b1cdbd2cSJim Jagielski 		Size aSize( GetSize(&rDev,_pEntry) );
1648*b1cdbd2cSJim Jagielski 		if( !!maImage )
1649*b1cdbd2cSJim Jagielski 		{
1650*b1cdbd2cSJim Jagielski 			rDev.DrawImage( aPos, maImage, rDev.IsEnabled() ? 0 : IMAGE_DRAW_DISABLE );
1651*b1cdbd2cSJim Jagielski 			int nWidth = maImage.GetSizePixel().Width() + 6;
1652*b1cdbd2cSJim Jagielski 			aPos.X() += nWidth;
1653*b1cdbd2cSJim Jagielski 			aSize.Width() -= nWidth;
1654*b1cdbd2cSJim Jagielski 		}
1655*b1cdbd2cSJim Jagielski 		rDev.DrawText( Rectangle(aPos,aSize),maText, rDev.IsEnabled() ? 0 : TEXT_DRAW_DISABLE );
1656*b1cdbd2cSJim Jagielski 	}
1657*b1cdbd2cSJim Jagielski 	else
1658*b1cdbd2cSJim Jagielski 	{
1659*b1cdbd2cSJim Jagielski 		if( !!maImage )
1660*b1cdbd2cSJim Jagielski 		{
1661*b1cdbd2cSJim Jagielski 			rDev.DrawImage( aPos, maImage, rDev.IsEnabled() ? 0 : IMAGE_DRAW_DISABLE);
1662*b1cdbd2cSJim Jagielski 			aPos.X() += maImage.GetSizePixel().Width() + 6;
1663*b1cdbd2cSJim Jagielski 		}
1664*b1cdbd2cSJim Jagielski 		rDev.DrawText( aPos, maText);
1665*b1cdbd2cSJim Jagielski 	}
1666*b1cdbd2cSJim Jagielski }
1667*b1cdbd2cSJim Jagielski 
1668*b1cdbd2cSJim Jagielski // --------------------------------------------------------------------
1669*b1cdbd2cSJim Jagielski 
Create() const1670*b1cdbd2cSJim Jagielski SvLBoxItem* UnoTreeListItem::Create() const
1671*b1cdbd2cSJim Jagielski {
1672*b1cdbd2cSJim Jagielski 	return new UnoTreeListItem;
1673*b1cdbd2cSJim Jagielski }
1674*b1cdbd2cSJim Jagielski 
1675*b1cdbd2cSJim Jagielski // --------------------------------------------------------------------
1676*b1cdbd2cSJim Jagielski 
Clone(SvLBoxItem * pSource)1677*b1cdbd2cSJim Jagielski void UnoTreeListItem::Clone( SvLBoxItem* pSource )
1678*b1cdbd2cSJim Jagielski {
1679*b1cdbd2cSJim Jagielski 	UnoTreeListItem* pSourceItem = dynamic_cast< UnoTreeListItem* >( pSource );
1680*b1cdbd2cSJim Jagielski 	if( pSourceItem )
1681*b1cdbd2cSJim Jagielski 	{
1682*b1cdbd2cSJim Jagielski 		maText = pSourceItem->maText;
1683*b1cdbd2cSJim Jagielski 		maImage = pSourceItem->maImage;
1684*b1cdbd2cSJim Jagielski 	}
1685*b1cdbd2cSJim Jagielski }
1686*b1cdbd2cSJim Jagielski 
1687*b1cdbd2cSJim Jagielski // --------------------------------------------------------------------
1688*b1cdbd2cSJim Jagielski 
GetText() const1689*b1cdbd2cSJim Jagielski OUString UnoTreeListItem::GetText() const
1690*b1cdbd2cSJim Jagielski {
1691*b1cdbd2cSJim Jagielski 	return maText;
1692*b1cdbd2cSJim Jagielski }
1693*b1cdbd2cSJim Jagielski 
1694*b1cdbd2cSJim Jagielski // --------------------------------------------------------------------
1695*b1cdbd2cSJim Jagielski 
SetText(const OUString & rText)1696*b1cdbd2cSJim Jagielski void UnoTreeListItem::SetText( const OUString& rText )
1697*b1cdbd2cSJim Jagielski {
1698*b1cdbd2cSJim Jagielski 	maText = rText;
1699*b1cdbd2cSJim Jagielski }
1700*b1cdbd2cSJim Jagielski 
1701*b1cdbd2cSJim Jagielski // --------------------------------------------------------------------
1702*b1cdbd2cSJim Jagielski 
SetImage(const Image & rImage)1703*b1cdbd2cSJim Jagielski void UnoTreeListItem::SetImage( const Image& rImage )
1704*b1cdbd2cSJim Jagielski {
1705*b1cdbd2cSJim Jagielski 	maImage = rImage;
1706*b1cdbd2cSJim Jagielski }
1707*b1cdbd2cSJim Jagielski 
1708*b1cdbd2cSJim Jagielski // --------------------------------------------------------------------
1709*b1cdbd2cSJim Jagielski 
GetGraphicURL() const1710*b1cdbd2cSJim Jagielski OUString UnoTreeListItem::GetGraphicURL() const
1711*b1cdbd2cSJim Jagielski {
1712*b1cdbd2cSJim Jagielski 	return maGraphicURL;
1713*b1cdbd2cSJim Jagielski }
1714*b1cdbd2cSJim Jagielski 
1715*b1cdbd2cSJim Jagielski // --------------------------------------------------------------------
1716*b1cdbd2cSJim Jagielski 
SetGraphicURL(const OUString & rGraphicURL)1717*b1cdbd2cSJim Jagielski void UnoTreeListItem::SetGraphicURL( const OUString& rGraphicURL )
1718*b1cdbd2cSJim Jagielski {
1719*b1cdbd2cSJim Jagielski 	maGraphicURL = rGraphicURL;
1720*b1cdbd2cSJim Jagielski }
1721*b1cdbd2cSJim Jagielski 
1722*b1cdbd2cSJim Jagielski // --------------------------------------------------------------------
1723*b1cdbd2cSJim Jagielski 
InitViewData(SvLBox * pView,SvLBoxEntry * pEntry,SvViewDataItem * pViewData)1724*b1cdbd2cSJim Jagielski void UnoTreeListItem::InitViewData( SvLBox* pView,SvLBoxEntry* pEntry, SvViewDataItem* pViewData)
1725*b1cdbd2cSJim Jagielski {
1726*b1cdbd2cSJim Jagielski 	if( !pViewData )
1727*b1cdbd2cSJim Jagielski 		pViewData = pView->GetViewDataItem( pEntry, this );
1728*b1cdbd2cSJim Jagielski 
1729*b1cdbd2cSJim Jagielski 	pViewData->aSize = maImage.GetSizePixel();
1730*b1cdbd2cSJim Jagielski 
1731*b1cdbd2cSJim Jagielski 	const Size aTextSize(pView->GetTextWidth( maText ), pView->GetTextHeight());
1732*b1cdbd2cSJim Jagielski 	if( pViewData->aSize.Width() )
1733*b1cdbd2cSJim Jagielski 	{
1734*b1cdbd2cSJim Jagielski 		pViewData->aSize.Width() += 6 + aTextSize.Width();
1735*b1cdbd2cSJim Jagielski 		if( pViewData->aSize.Height() < aTextSize.Height() )
1736*b1cdbd2cSJim Jagielski 			pViewData->aSize.Height() = aTextSize.Height();
1737*b1cdbd2cSJim Jagielski 	}
1738*b1cdbd2cSJim Jagielski 	else
1739*b1cdbd2cSJim Jagielski 	{
1740*b1cdbd2cSJim Jagielski 		pViewData->aSize = aTextSize;
1741*b1cdbd2cSJim Jagielski 	}
1742*b1cdbd2cSJim Jagielski }
1743*b1cdbd2cSJim Jagielski 
1744*b1cdbd2cSJim Jagielski // --------------------------------------------------------------------
1745*b1cdbd2cSJim Jagielski 
UnoTreeListEntry(const Reference<XTreeNode> & xNode,TreeControlPeer * pPeer)1746*b1cdbd2cSJim Jagielski UnoTreeListEntry::UnoTreeListEntry( const Reference< XTreeNode >& xNode, TreeControlPeer* pPeer )
1747*b1cdbd2cSJim Jagielski : SvLBoxEntry()
1748*b1cdbd2cSJim Jagielski , mxNode( xNode )
1749*b1cdbd2cSJim Jagielski , mpPeer( pPeer )
1750*b1cdbd2cSJim Jagielski {
1751*b1cdbd2cSJim Jagielski 	if( mpPeer )
1752*b1cdbd2cSJim Jagielski 		mpPeer->addEntry( this );
1753*b1cdbd2cSJim Jagielski }
1754*b1cdbd2cSJim Jagielski 
1755*b1cdbd2cSJim Jagielski // --------------------------------------------------------------------
1756*b1cdbd2cSJim Jagielski 
~UnoTreeListEntry()1757*b1cdbd2cSJim Jagielski UnoTreeListEntry::~UnoTreeListEntry()
1758*b1cdbd2cSJim Jagielski {
1759*b1cdbd2cSJim Jagielski 	if( mpPeer )
1760*b1cdbd2cSJim Jagielski 		mpPeer->removeEntry( this );
1761*b1cdbd2cSJim Jagielski }
1762