1*b0724fc6SAndrew Rist /**************************************************************
2cdf0e10cSrcweir *
3*b0724fc6SAndrew Rist * Licensed to the Apache Software Foundation (ASF) under one
4*b0724fc6SAndrew Rist * or more contributor license agreements. See the NOTICE file
5*b0724fc6SAndrew Rist * distributed with this work for additional information
6*b0724fc6SAndrew Rist * regarding copyright ownership. The ASF licenses this file
7*b0724fc6SAndrew Rist * to you under the Apache License, Version 2.0 (the
8*b0724fc6SAndrew Rist * "License"); you may not use this file except in compliance
9*b0724fc6SAndrew Rist * with the License. You may obtain a copy of the License at
10*b0724fc6SAndrew Rist *
11*b0724fc6SAndrew Rist * http://www.apache.org/licenses/LICENSE-2.0
12*b0724fc6SAndrew Rist *
13*b0724fc6SAndrew Rist * Unless required by applicable law or agreed to in writing,
14*b0724fc6SAndrew Rist * software distributed under the License is distributed on an
15*b0724fc6SAndrew Rist * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*b0724fc6SAndrew Rist * KIND, either express or implied. See the License for the
17*b0724fc6SAndrew Rist * specific language governing permissions and limitations
18*b0724fc6SAndrew Rist * under the License.
19*b0724fc6SAndrew Rist *
20*b0724fc6SAndrew Rist *************************************************************/
21*b0724fc6SAndrew Rist
22*b0724fc6SAndrew Rist
23cdf0e10cSrcweir
24cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove
25cdf0e10cSrcweir #include "precompiled_toolkit.hxx"
26cdf0e10cSrcweir #include <com/sun/star/awt/tree/XMutableTreeDataModel.hpp>
27cdf0e10cSrcweir #include <com/sun/star/lang/XServiceInfo.hpp>
28cdf0e10cSrcweir #include <com/sun/star/lang/XUnoTunnel.hpp>
29cdf0e10cSrcweir #include <cppuhelper/implbase2.hxx>
30cdf0e10cSrcweir #include <cppuhelper/implbase3.hxx>
31cdf0e10cSrcweir #include <rtl/ref.hxx>
32cdf0e10cSrcweir #include <toolkit/helper/mutexandbroadcasthelper.hxx>
33cdf0e10cSrcweir #include <toolkit/helper/servicenames.hxx>
34cdf0e10cSrcweir
35cdf0e10cSrcweir using ::rtl::OUString;
36cdf0e10cSrcweir using namespace ::com::sun::star;
37cdf0e10cSrcweir using namespace ::com::sun::star::uno;
38cdf0e10cSrcweir using namespace ::com::sun::star::awt;
39cdf0e10cSrcweir using namespace ::com::sun::star::awt::tree;
40cdf0e10cSrcweir using namespace ::com::sun::star::lang;
41cdf0e10cSrcweir
42cdf0e10cSrcweir namespace toolkit
43cdf0e10cSrcweir {
44cdf0e10cSrcweir
45cdf0e10cSrcweir enum broadcast_type { nodes_changed, nodes_inserted, nodes_removed, structure_changed };
46cdf0e10cSrcweir
47cdf0e10cSrcweir class MutableTreeNode;
48cdf0e10cSrcweir class MutableTreeDataModel;
49cdf0e10cSrcweir
50cdf0e10cSrcweir typedef rtl::Reference< MutableTreeNode > MutableTreeNodeRef;
51cdf0e10cSrcweir typedef std::vector< MutableTreeNodeRef > TreeNodeVector;
52cdf0e10cSrcweir typedef rtl::Reference< MutableTreeDataModel > MutableTreeDataModelRef;
53cdf0e10cSrcweir
implThrowIllegalArgumentException()54cdf0e10cSrcweir static void implThrowIllegalArgumentException() throw( IllegalArgumentException )
55cdf0e10cSrcweir {
56cdf0e10cSrcweir throw IllegalArgumentException();
57cdf0e10cSrcweir }
58cdf0e10cSrcweir
59cdf0e10cSrcweir class MutableTreeDataModel : public ::cppu::WeakAggImplHelper2< XMutableTreeDataModel, XServiceInfo >,
60cdf0e10cSrcweir public MutexAndBroadcastHelper
61cdf0e10cSrcweir {
62cdf0e10cSrcweir public:
63cdf0e10cSrcweir MutableTreeDataModel();
64cdf0e10cSrcweir virtual ~MutableTreeDataModel();
65cdf0e10cSrcweir
66cdf0e10cSrcweir void broadcast( broadcast_type eType, const Reference< XTreeNode >& xParentNode, const Reference< XTreeNode >* pNodes, sal_Int32 nNodes );
67cdf0e10cSrcweir
68cdf0e10cSrcweir // XMutableTreeDataModel
69cdf0e10cSrcweir virtual ::com::sun::star::uno::Reference< ::com::sun::star::awt::tree::XMutableTreeNode > SAL_CALL createNode( const ::com::sun::star::uno::Any& DisplayValue, ::sal_Bool ChildsOnDemand ) throw (::com::sun::star::uno::RuntimeException);
70cdf0e10cSrcweir virtual void SAL_CALL setRoot( const ::com::sun::star::uno::Reference< ::com::sun::star::awt::tree::XMutableTreeNode >& RootNode ) throw (::com::sun::star::lang::IllegalArgumentException, ::com::sun::star::uno::RuntimeException);
71cdf0e10cSrcweir
72cdf0e10cSrcweir // XTreeDataModel
73cdf0e10cSrcweir virtual ::com::sun::star::uno::Reference< ::com::sun::star::awt::tree::XTreeNode > SAL_CALL getRoot( ) throw (::com::sun::star::uno::RuntimeException);
74cdf0e10cSrcweir virtual void SAL_CALL addTreeDataModelListener( const ::com::sun::star::uno::Reference< ::com::sun::star::awt::tree::XTreeDataModelListener >& Listener ) throw (::com::sun::star::uno::RuntimeException);
75cdf0e10cSrcweir virtual void SAL_CALL removeTreeDataModelListener( const ::com::sun::star::uno::Reference< ::com::sun::star::awt::tree::XTreeDataModelListener >& Listener ) throw (::com::sun::star::uno::RuntimeException);
76cdf0e10cSrcweir
77cdf0e10cSrcweir // XComponent
78cdf0e10cSrcweir virtual void SAL_CALL dispose( ) throw (RuntimeException);
79cdf0e10cSrcweir virtual void SAL_CALL addEventListener( const Reference< XEventListener >& xListener ) throw (RuntimeException);
80cdf0e10cSrcweir virtual void SAL_CALL removeEventListener( const Reference< XEventListener >& aListener ) throw (RuntimeException);
81cdf0e10cSrcweir
82cdf0e10cSrcweir // XServiceInfo
83cdf0e10cSrcweir virtual OUString SAL_CALL getImplementationName( ) throw (RuntimeException);
84cdf0e10cSrcweir virtual sal_Bool SAL_CALL supportsService( const OUString& ServiceName ) throw (RuntimeException);
85cdf0e10cSrcweir virtual Sequence< OUString > SAL_CALL getSupportedServiceNames( ) throw (RuntimeException);
86cdf0e10cSrcweir
87cdf0e10cSrcweir private:
88cdf0e10cSrcweir bool mbDisposed;
89cdf0e10cSrcweir Reference< XTreeNode > mxRootNode;
90cdf0e10cSrcweir };
91cdf0e10cSrcweir
92cdf0e10cSrcweir class MutableTreeNode: public ::cppu::WeakAggImplHelper2< XMutableTreeNode, XServiceInfo >
93cdf0e10cSrcweir {
94cdf0e10cSrcweir friend class MutableTreeDataModel;
95cdf0e10cSrcweir
96cdf0e10cSrcweir public:
97cdf0e10cSrcweir MutableTreeNode( const MutableTreeDataModelRef& xModel, const Any& rValue, sal_Bool bChildsOnDemand );
98cdf0e10cSrcweir virtual ~MutableTreeNode();
99cdf0e10cSrcweir
100cdf0e10cSrcweir void setParent( MutableTreeNode* pParent );
101cdf0e10cSrcweir void broadcast_changes();
102cdf0e10cSrcweir void broadcast_changes(const Reference< XTreeNode >& xNode, bool bNew);
103cdf0e10cSrcweir
104cdf0e10cSrcweir // XMutableTreeNode
105cdf0e10cSrcweir virtual ::com::sun::star::uno::Any SAL_CALL getDataValue() throw (::com::sun::star::uno::RuntimeException);
106cdf0e10cSrcweir virtual void SAL_CALL setDataValue( const ::com::sun::star::uno::Any& _datavalue ) throw (::com::sun::star::uno::RuntimeException);
107cdf0e10cSrcweir virtual void SAL_CALL appendChild( const ::com::sun::star::uno::Reference< ::com::sun::star::awt::tree::XMutableTreeNode >& ChildNode ) throw (::com::sun::star::lang::IllegalArgumentException, ::com::sun::star::uno::RuntimeException);
108cdf0e10cSrcweir virtual void SAL_CALL insertChildByIndex( ::sal_Int32 Index, const ::com::sun::star::uno::Reference< ::com::sun::star::awt::tree::XMutableTreeNode >& ChildNode ) throw (::com::sun::star::lang::IllegalArgumentException, ::com::sun::star::lang::IndexOutOfBoundsException, ::com::sun::star::uno::RuntimeException);
109cdf0e10cSrcweir virtual void SAL_CALL removeChildByIndex( ::sal_Int32 Index ) throw (::com::sun::star::lang::IndexOutOfBoundsException, ::com::sun::star::uno::RuntimeException);
110cdf0e10cSrcweir virtual void SAL_CALL setHasChildrenOnDemand( ::sal_Bool ChildrenOnDemand ) throw (::com::sun::star::uno::RuntimeException);
111cdf0e10cSrcweir virtual void SAL_CALL setDisplayValue( const ::com::sun::star::uno::Any& Value ) throw (::com::sun::star::uno::RuntimeException);
112cdf0e10cSrcweir virtual void SAL_CALL setNodeGraphicURL( const ::rtl::OUString& URL ) throw (::com::sun::star::uno::RuntimeException);
113cdf0e10cSrcweir virtual void SAL_CALL setExpandedGraphicURL( const ::rtl::OUString& URL ) throw (::com::sun::star::uno::RuntimeException);
114cdf0e10cSrcweir virtual void SAL_CALL setCollapsedGraphicURL( const ::rtl::OUString& URL ) throw (::com::sun::star::uno::RuntimeException);
115cdf0e10cSrcweir
116cdf0e10cSrcweir // XTreeNode
117cdf0e10cSrcweir virtual ::com::sun::star::uno::Reference< ::com::sun::star::awt::tree::XTreeNode > SAL_CALL getChildAt( ::sal_Int32 Index ) throw (::com::sun::star::lang::IndexOutOfBoundsException, ::com::sun::star::uno::RuntimeException);
118cdf0e10cSrcweir virtual ::sal_Int32 SAL_CALL getChildCount( ) throw (::com::sun::star::uno::RuntimeException);
119cdf0e10cSrcweir virtual ::com::sun::star::uno::Reference< ::com::sun::star::awt::tree::XTreeNode > SAL_CALL getParent( ) throw (::com::sun::star::uno::RuntimeException);
120cdf0e10cSrcweir virtual ::sal_Int32 SAL_CALL getIndex( const ::com::sun::star::uno::Reference< ::com::sun::star::awt::tree::XTreeNode >& Node ) throw (::com::sun::star::uno::RuntimeException);
121cdf0e10cSrcweir virtual ::sal_Bool SAL_CALL hasChildrenOnDemand( ) throw (::com::sun::star::uno::RuntimeException);
122cdf0e10cSrcweir virtual ::com::sun::star::uno::Any SAL_CALL getDisplayValue( ) throw (::com::sun::star::uno::RuntimeException);
123cdf0e10cSrcweir virtual ::rtl::OUString SAL_CALL getNodeGraphicURL( ) throw (::com::sun::star::uno::RuntimeException);
124cdf0e10cSrcweir virtual ::rtl::OUString SAL_CALL getExpandedGraphicURL( ) throw (::com::sun::star::uno::RuntimeException);
125cdf0e10cSrcweir virtual ::rtl::OUString SAL_CALL getCollapsedGraphicURL( ) throw (::com::sun::star::uno::RuntimeException);
126cdf0e10cSrcweir
127cdf0e10cSrcweir // XServiceInfo
128cdf0e10cSrcweir virtual OUString SAL_CALL getImplementationName( ) throw (RuntimeException);
129cdf0e10cSrcweir virtual sal_Bool SAL_CALL supportsService( const OUString& ServiceName ) throw (RuntimeException);
130cdf0e10cSrcweir virtual Sequence< OUString > SAL_CALL getSupportedServiceNames( ) throw (RuntimeException);
131cdf0e10cSrcweir
132cdf0e10cSrcweir static MutableTreeNode* getImplementation( const Reference< XTreeNode >& xNode, bool bThrows ) throw (IllegalArgumentException);
getReference(MutableTreeNode * pNode)133cdf0e10cSrcweir Reference< XTreeNode > getReference( MutableTreeNode* pNode )
134cdf0e10cSrcweir {
135cdf0e10cSrcweir return Reference< XTreeNode >( pNode );
136cdf0e10cSrcweir }
137cdf0e10cSrcweir
138cdf0e10cSrcweir private:
139cdf0e10cSrcweir TreeNodeVector maChilds;
140cdf0e10cSrcweir Any maDisplayValue;
141cdf0e10cSrcweir Any maDataValue;
142cdf0e10cSrcweir sal_Bool mbHasChildsOnDemand;
143cdf0e10cSrcweir ::osl::Mutex maMutex;
144cdf0e10cSrcweir MutableTreeNode* mpParent;
145cdf0e10cSrcweir MutableTreeDataModelRef mxModel;
146cdf0e10cSrcweir OUString maNodeGraphicURL;
147cdf0e10cSrcweir OUString maExpandedGraphicURL;
148cdf0e10cSrcweir OUString maCollapsedGraphicURL;
149cdf0e10cSrcweir bool mbIsInserted;
150cdf0e10cSrcweir };
151cdf0e10cSrcweir
152cdf0e10cSrcweir ///////////////////////////////////////////////////////////////////////
153cdf0e10cSrcweir // class MutableTreeDataModel
154cdf0e10cSrcweir ///////////////////////////////////////////////////////////////////////
155cdf0e10cSrcweir
MutableTreeDataModel()156cdf0e10cSrcweir MutableTreeDataModel::MutableTreeDataModel()
157cdf0e10cSrcweir : mbDisposed( false )
158cdf0e10cSrcweir {
159cdf0e10cSrcweir }
160cdf0e10cSrcweir
161cdf0e10cSrcweir //---------------------------------------------------------------------
162cdf0e10cSrcweir
~MutableTreeDataModel()163cdf0e10cSrcweir MutableTreeDataModel::~MutableTreeDataModel()
164cdf0e10cSrcweir {
165cdf0e10cSrcweir }
166cdf0e10cSrcweir
167cdf0e10cSrcweir //---------------------------------------------------------------------
168cdf0e10cSrcweir
broadcast(broadcast_type eType,const Reference<XTreeNode> & xParentNode,const Reference<XTreeNode> * pNodes,sal_Int32 nNodes)169cdf0e10cSrcweir void MutableTreeDataModel::broadcast( broadcast_type eType, const Reference< XTreeNode >& xParentNode, const Reference< XTreeNode >* pNodes, sal_Int32 nNodes )
170cdf0e10cSrcweir {
171cdf0e10cSrcweir ::cppu::OInterfaceContainerHelper* pIter = BrdcstHelper.getContainer( XTreeDataModelListener::static_type() );
172cdf0e10cSrcweir if( pIter )
173cdf0e10cSrcweir {
174cdf0e10cSrcweir Reference< XInterface > xSource( static_cast< ::cppu::OWeakObject* >( this ) );
175cdf0e10cSrcweir const Sequence< Reference< XTreeNode > > aNodes( pNodes, nNodes );
176cdf0e10cSrcweir TreeDataModelEvent aEvent( xSource, aNodes, xParentNode );
177cdf0e10cSrcweir
178cdf0e10cSrcweir ::cppu::OInterfaceIteratorHelper aListIter(*pIter);
179cdf0e10cSrcweir while(aListIter.hasMoreElements())
180cdf0e10cSrcweir {
181cdf0e10cSrcweir XTreeDataModelListener* pListener = static_cast<XTreeDataModelListener*>(aListIter.next());
182cdf0e10cSrcweir switch( eType )
183cdf0e10cSrcweir {
184cdf0e10cSrcweir case nodes_changed: pListener->treeNodesChanged(aEvent); break;
185cdf0e10cSrcweir case nodes_inserted: pListener->treeNodesInserted(aEvent); break;
186cdf0e10cSrcweir case nodes_removed: pListener->treeNodesRemoved(aEvent); break;
187cdf0e10cSrcweir case structure_changed: pListener->treeStructureChanged(aEvent); break;
188cdf0e10cSrcweir }
189cdf0e10cSrcweir }
190cdf0e10cSrcweir }
191cdf0e10cSrcweir }
192cdf0e10cSrcweir
193cdf0e10cSrcweir //---------------------------------------------------------------------
194cdf0e10cSrcweir // XMutableTreeDataModel
195cdf0e10cSrcweir //---------------------------------------------------------------------
196cdf0e10cSrcweir
createNode(const Any & aValue,sal_Bool bChildsOnDemand)197cdf0e10cSrcweir Reference< XMutableTreeNode > SAL_CALL MutableTreeDataModel::createNode( const Any& aValue, sal_Bool bChildsOnDemand ) throw (RuntimeException)
198cdf0e10cSrcweir {
199cdf0e10cSrcweir return new MutableTreeNode( this, aValue, bChildsOnDemand );
200cdf0e10cSrcweir }
201cdf0e10cSrcweir
202cdf0e10cSrcweir //---------------------------------------------------------------------
203cdf0e10cSrcweir
setRoot(const Reference<XMutableTreeNode> & xNode)204cdf0e10cSrcweir void SAL_CALL MutableTreeDataModel::setRoot( const Reference< XMutableTreeNode >& xNode ) throw (IllegalArgumentException, RuntimeException)
205cdf0e10cSrcweir {
206cdf0e10cSrcweir if( !xNode.is() )
207cdf0e10cSrcweir throw IllegalArgumentException();
208cdf0e10cSrcweir
209cdf0e10cSrcweir ::osl::Guard< ::osl::Mutex > aGuard( GetMutex() );
210cdf0e10cSrcweir if( xNode != mxRootNode )
211cdf0e10cSrcweir {
212cdf0e10cSrcweir if( mxRootNode.is() )
213cdf0e10cSrcweir {
214cdf0e10cSrcweir MutableTreeNodeRef xOldImpl( dynamic_cast< MutableTreeNode* >( mxRootNode.get() ) );
215cdf0e10cSrcweir if( xOldImpl.is() )
216cdf0e10cSrcweir xOldImpl->mbIsInserted = false;
217cdf0e10cSrcweir }
218cdf0e10cSrcweir
219cdf0e10cSrcweir MutableTreeNodeRef xImpl( dynamic_cast< MutableTreeNode* >( xNode.get() ) );
220cdf0e10cSrcweir if( !xImpl.is() || xImpl->mbIsInserted )
221cdf0e10cSrcweir throw IllegalArgumentException();
222cdf0e10cSrcweir
223cdf0e10cSrcweir xImpl->mbIsInserted = true;
224cdf0e10cSrcweir mxRootNode.set(xImpl.get());
225cdf0e10cSrcweir
226cdf0e10cSrcweir Reference< XTreeNode > xParentNode;
227cdf0e10cSrcweir broadcast( structure_changed, xParentNode, &mxRootNode, 1 );
228cdf0e10cSrcweir }
229cdf0e10cSrcweir }
230cdf0e10cSrcweir
231cdf0e10cSrcweir //---------------------------------------------------------------------
232cdf0e10cSrcweir // XTreeDataModel
233cdf0e10cSrcweir //---------------------------------------------------------------------
234cdf0e10cSrcweir
getRoot()235cdf0e10cSrcweir Reference< XTreeNode > SAL_CALL MutableTreeDataModel::getRoot( ) throw (RuntimeException)
236cdf0e10cSrcweir {
237cdf0e10cSrcweir ::osl::Guard< ::osl::Mutex > aGuard( GetMutex() );
238cdf0e10cSrcweir return mxRootNode;
239cdf0e10cSrcweir }
240cdf0e10cSrcweir
241cdf0e10cSrcweir //---------------------------------------------------------------------
242cdf0e10cSrcweir
addTreeDataModelListener(const Reference<XTreeDataModelListener> & xListener)243cdf0e10cSrcweir void SAL_CALL MutableTreeDataModel::addTreeDataModelListener( const Reference< XTreeDataModelListener >& xListener ) throw (RuntimeException)
244cdf0e10cSrcweir {
245cdf0e10cSrcweir BrdcstHelper.addListener( XTreeDataModelListener::static_type(), xListener );
246cdf0e10cSrcweir }
247cdf0e10cSrcweir
248cdf0e10cSrcweir //---------------------------------------------------------------------
249cdf0e10cSrcweir
removeTreeDataModelListener(const Reference<XTreeDataModelListener> & xListener)250cdf0e10cSrcweir void SAL_CALL MutableTreeDataModel::removeTreeDataModelListener( const Reference< XTreeDataModelListener >& xListener ) throw (RuntimeException)
251cdf0e10cSrcweir {
252cdf0e10cSrcweir BrdcstHelper.removeListener( XTreeDataModelListener::static_type(), xListener );
253cdf0e10cSrcweir }
254cdf0e10cSrcweir
255cdf0e10cSrcweir //---------------------------------------------------------------------
256cdf0e10cSrcweir // XComponent
257cdf0e10cSrcweir //---------------------------------------------------------------------
258cdf0e10cSrcweir
dispose()259cdf0e10cSrcweir void SAL_CALL MutableTreeDataModel::dispose() throw (RuntimeException)
260cdf0e10cSrcweir {
261cdf0e10cSrcweir ::osl::Guard< ::osl::Mutex > aGuard( GetMutex() );
262cdf0e10cSrcweir
263cdf0e10cSrcweir if( !mbDisposed )
264cdf0e10cSrcweir {
265cdf0e10cSrcweir mbDisposed = true;
266cdf0e10cSrcweir ::com::sun::star::lang::EventObject aEvent;
267cdf0e10cSrcweir aEvent.Source.set( static_cast< ::cppu::OWeakObject* >( this ) );
268cdf0e10cSrcweir BrdcstHelper.aLC.disposeAndClear( aEvent );
269cdf0e10cSrcweir }
270cdf0e10cSrcweir }
271cdf0e10cSrcweir
272cdf0e10cSrcweir //---------------------------------------------------------------------
273cdf0e10cSrcweir
addEventListener(const Reference<XEventListener> & xListener)274cdf0e10cSrcweir void SAL_CALL MutableTreeDataModel::addEventListener( const Reference< XEventListener >& xListener ) throw (RuntimeException)
275cdf0e10cSrcweir {
276cdf0e10cSrcweir BrdcstHelper.addListener( XEventListener::static_type(), xListener );
277cdf0e10cSrcweir }
278cdf0e10cSrcweir
279cdf0e10cSrcweir //---------------------------------------------------------------------
280cdf0e10cSrcweir
removeEventListener(const Reference<XEventListener> & xListener)281cdf0e10cSrcweir void SAL_CALL MutableTreeDataModel::removeEventListener( const Reference< XEventListener >& xListener ) throw (RuntimeException)
282cdf0e10cSrcweir {
283cdf0e10cSrcweir BrdcstHelper.removeListener( XEventListener::static_type(), xListener );
284cdf0e10cSrcweir }
285cdf0e10cSrcweir
286cdf0e10cSrcweir //---------------------------------------------------------------------
287cdf0e10cSrcweir // XServiceInfo
288cdf0e10cSrcweir //---------------------------------------------------------------------
289cdf0e10cSrcweir
getImplementationName()290cdf0e10cSrcweir OUString SAL_CALL MutableTreeDataModel::getImplementationName( ) throw (RuntimeException)
291cdf0e10cSrcweir {
292cdf0e10cSrcweir ::osl::Guard< ::osl::Mutex > aGuard( GetMutex() );
293cdf0e10cSrcweir static const OUString aImplName( RTL_CONSTASCII_USTRINGPARAM( "toolkit.MutableTreeDataModel" ) );
294cdf0e10cSrcweir return aImplName;
295cdf0e10cSrcweir }
296cdf0e10cSrcweir
297cdf0e10cSrcweir //---------------------------------------------------------------------
298cdf0e10cSrcweir
supportsService(const OUString & ServiceName)299cdf0e10cSrcweir sal_Bool SAL_CALL MutableTreeDataModel::supportsService( const OUString& ServiceName ) throw (RuntimeException)
300cdf0e10cSrcweir {
301cdf0e10cSrcweir ::osl::Guard< ::osl::Mutex > aGuard( GetMutex() );
302cdf0e10cSrcweir return ServiceName.equalsAscii( szServiceName_MutableTreeDataModel );
303cdf0e10cSrcweir }
304cdf0e10cSrcweir
305cdf0e10cSrcweir //---------------------------------------------------------------------
306cdf0e10cSrcweir
getSupportedServiceNames()307cdf0e10cSrcweir Sequence< OUString > SAL_CALL MutableTreeDataModel::getSupportedServiceNames( ) throw (RuntimeException)
308cdf0e10cSrcweir {
309cdf0e10cSrcweir ::osl::Guard< ::osl::Mutex > aGuard( GetMutex() );
310cdf0e10cSrcweir static const OUString aServiceName( OUString::createFromAscii( szServiceName_MutableTreeDataModel ) );
311cdf0e10cSrcweir static const Sequence< OUString > aSeq( &aServiceName, 1 );
312cdf0e10cSrcweir return aSeq;
313cdf0e10cSrcweir }
314cdf0e10cSrcweir
315cdf0e10cSrcweir ///////////////////////////////////////////////////////////////////////
316cdf0e10cSrcweir // class MutabelTreeNode
317cdf0e10cSrcweir ///////////////////////////////////////////////////////////////////////
318cdf0e10cSrcweir
MutableTreeNode(const MutableTreeDataModelRef & xModel,const Any & rValue,sal_Bool bChildsOnDemand)319cdf0e10cSrcweir MutableTreeNode::MutableTreeNode( const MutableTreeDataModelRef& xModel, const Any& rValue, sal_Bool bChildsOnDemand )
320cdf0e10cSrcweir : maDisplayValue( rValue )
321cdf0e10cSrcweir , mbHasChildsOnDemand( bChildsOnDemand )
322cdf0e10cSrcweir , mpParent( 0 )
323cdf0e10cSrcweir , mxModel( xModel )
324cdf0e10cSrcweir , mbIsInserted( false )
325cdf0e10cSrcweir {
326cdf0e10cSrcweir }
327cdf0e10cSrcweir
328cdf0e10cSrcweir //---------------------------------------------------------------------
329cdf0e10cSrcweir
~MutableTreeNode()330cdf0e10cSrcweir MutableTreeNode::~MutableTreeNode()
331cdf0e10cSrcweir {
332cdf0e10cSrcweir TreeNodeVector::iterator aIter( maChilds.begin() );
333cdf0e10cSrcweir while( aIter != maChilds.end() )
334cdf0e10cSrcweir (*aIter++)->setParent(0);
335cdf0e10cSrcweir }
336cdf0e10cSrcweir
337cdf0e10cSrcweir //---------------------------------------------------------------------
338cdf0e10cSrcweir
setParent(MutableTreeNode * pParent)339cdf0e10cSrcweir void MutableTreeNode::setParent( MutableTreeNode* pParent )
340cdf0e10cSrcweir {
341cdf0e10cSrcweir mpParent = pParent;
342cdf0e10cSrcweir }
343cdf0e10cSrcweir
344cdf0e10cSrcweir //---------------------------------------------------------------------
345cdf0e10cSrcweir
getImplementation(const Reference<XTreeNode> & xNode,bool bThrows)346cdf0e10cSrcweir MutableTreeNode* MutableTreeNode::getImplementation( const Reference< XTreeNode >& xNode, bool bThrows ) throw (IllegalArgumentException)
347cdf0e10cSrcweir {
348cdf0e10cSrcweir MutableTreeNode* pImpl = dynamic_cast< MutableTreeNode* >( xNode.get() );
349cdf0e10cSrcweir if( bThrows && !pImpl )
350cdf0e10cSrcweir implThrowIllegalArgumentException();
351cdf0e10cSrcweir
352cdf0e10cSrcweir return pImpl;
353cdf0e10cSrcweir }
354cdf0e10cSrcweir
355cdf0e10cSrcweir //---------------------------------------------------------------------
356cdf0e10cSrcweir
broadcast_changes()357cdf0e10cSrcweir void MutableTreeNode::broadcast_changes()
358cdf0e10cSrcweir {
359cdf0e10cSrcweir if( mxModel.is() )
360cdf0e10cSrcweir {
361cdf0e10cSrcweir Reference< XTreeNode > xParent( getReference( mpParent ) );
362cdf0e10cSrcweir Reference< XTreeNode > xNode( getReference( this ) );
363cdf0e10cSrcweir mxModel->broadcast( nodes_changed, xParent, &xNode, 1 );
364cdf0e10cSrcweir }
365cdf0e10cSrcweir }
366cdf0e10cSrcweir
367cdf0e10cSrcweir //---------------------------------------------------------------------
368cdf0e10cSrcweir
broadcast_changes(const Reference<XTreeNode> & xNode,bool bNew)369cdf0e10cSrcweir void MutableTreeNode::broadcast_changes(const Reference< XTreeNode >& xNode, bool bNew)
370cdf0e10cSrcweir {
371cdf0e10cSrcweir if( mxModel.is() )
372cdf0e10cSrcweir {
373cdf0e10cSrcweir Reference< XTreeNode > xParent( getReference( this ) );
374cdf0e10cSrcweir mxModel->broadcast( bNew ? nodes_inserted : nodes_removed, xParent, &xNode, 1 );
375cdf0e10cSrcweir }
376cdf0e10cSrcweir }
377cdf0e10cSrcweir
378cdf0e10cSrcweir //---------------------------------------------------------------------
379cdf0e10cSrcweir // XMutableTreeNode
380cdf0e10cSrcweir //---------------------------------------------------------------------
381cdf0e10cSrcweir
getDataValue()382cdf0e10cSrcweir Any SAL_CALL MutableTreeNode::getDataValue() throw (RuntimeException)
383cdf0e10cSrcweir {
384cdf0e10cSrcweir ::osl::Guard< ::osl::Mutex > aGuard( maMutex );
385cdf0e10cSrcweir return maDataValue;
386cdf0e10cSrcweir }
387cdf0e10cSrcweir
388cdf0e10cSrcweir //---------------------------------------------------------------------
389cdf0e10cSrcweir
setDataValue(const Any & _datavalue)390cdf0e10cSrcweir void SAL_CALL MutableTreeNode::setDataValue( const Any& _datavalue ) throw (RuntimeException)
391cdf0e10cSrcweir {
392cdf0e10cSrcweir ::osl::Guard< ::osl::Mutex > aGuard( maMutex );
393cdf0e10cSrcweir maDataValue = _datavalue;
394cdf0e10cSrcweir }
395cdf0e10cSrcweir
396cdf0e10cSrcweir //---------------------------------------------------------------------
397cdf0e10cSrcweir
appendChild(const Reference<XMutableTreeNode> & xChildNode)398cdf0e10cSrcweir void SAL_CALL MutableTreeNode::appendChild( const Reference< XMutableTreeNode >& xChildNode ) throw (IllegalArgumentException, RuntimeException)
399cdf0e10cSrcweir {
400cdf0e10cSrcweir ::osl::Guard< ::osl::Mutex > aGuard( maMutex );
401cdf0e10cSrcweir Reference< XTreeNode > xNode( xChildNode.get() );
402cdf0e10cSrcweir MutableTreeNodeRef xImpl( dynamic_cast< MutableTreeNode* >( xNode.get() ) );
403cdf0e10cSrcweir
404cdf0e10cSrcweir if( !xImpl.is() || xImpl->mbIsInserted || (this == xImpl.get()) )
405cdf0e10cSrcweir throw IllegalArgumentException();
406cdf0e10cSrcweir
407cdf0e10cSrcweir maChilds.push_back( xImpl );
408cdf0e10cSrcweir xImpl->setParent(this);
409cdf0e10cSrcweir xImpl->mbIsInserted = true;
410cdf0e10cSrcweir
411cdf0e10cSrcweir broadcast_changes( xNode, true );
412cdf0e10cSrcweir }
413cdf0e10cSrcweir
414cdf0e10cSrcweir //---------------------------------------------------------------------
415cdf0e10cSrcweir
insertChildByIndex(sal_Int32 nChildIndex,const Reference<XMutableTreeNode> & xChildNode)416cdf0e10cSrcweir void SAL_CALL MutableTreeNode::insertChildByIndex( sal_Int32 nChildIndex, const Reference< XMutableTreeNode >& xChildNode ) throw (IllegalArgumentException, IndexOutOfBoundsException, RuntimeException)
417cdf0e10cSrcweir {
418cdf0e10cSrcweir ::osl::Guard< ::osl::Mutex > aGuard( maMutex );
419cdf0e10cSrcweir
420cdf0e10cSrcweir if( (nChildIndex < 0) || (nChildIndex > (sal_Int32)maChilds.size()) )
421cdf0e10cSrcweir throw IndexOutOfBoundsException();
422cdf0e10cSrcweir
423cdf0e10cSrcweir Reference< XTreeNode > xNode( xChildNode.get() );
424cdf0e10cSrcweir MutableTreeNodeRef xImpl( dynamic_cast< MutableTreeNode* >( xNode.get() ) );
425cdf0e10cSrcweir if( !xImpl.is() || xImpl->mbIsInserted || (this == xImpl.get()) )
426cdf0e10cSrcweir throw IllegalArgumentException();
427cdf0e10cSrcweir
428cdf0e10cSrcweir xImpl->mbIsInserted = true;
429cdf0e10cSrcweir
430cdf0e10cSrcweir TreeNodeVector::iterator aIter( maChilds.begin() );
431cdf0e10cSrcweir while( (nChildIndex-- > 0) && (aIter != maChilds.end()) )
432cdf0e10cSrcweir aIter++;
433cdf0e10cSrcweir
434cdf0e10cSrcweir maChilds.insert( aIter, xImpl );
435cdf0e10cSrcweir xImpl->setParent( this );
436cdf0e10cSrcweir
437cdf0e10cSrcweir broadcast_changes( xNode, true );
438cdf0e10cSrcweir }
439cdf0e10cSrcweir
440cdf0e10cSrcweir //---------------------------------------------------------------------
441cdf0e10cSrcweir
removeChildByIndex(sal_Int32 nChildIndex)442cdf0e10cSrcweir void SAL_CALL MutableTreeNode::removeChildByIndex( sal_Int32 nChildIndex ) throw (IndexOutOfBoundsException, RuntimeException)
443cdf0e10cSrcweir {
444cdf0e10cSrcweir ::osl::Guard< ::osl::Mutex > aGuard( maMutex );
445cdf0e10cSrcweir
446cdf0e10cSrcweir MutableTreeNodeRef xImpl;
447cdf0e10cSrcweir
448cdf0e10cSrcweir if( (nChildIndex >= 0) && (nChildIndex < (sal_Int32)maChilds.size()) )
449cdf0e10cSrcweir {
450cdf0e10cSrcweir TreeNodeVector::iterator aIter( maChilds.begin() );
451cdf0e10cSrcweir while( nChildIndex-- && (aIter != maChilds.end()) )
452cdf0e10cSrcweir aIter++;
453cdf0e10cSrcweir
454cdf0e10cSrcweir if( aIter != maChilds.end() )
455cdf0e10cSrcweir {
456cdf0e10cSrcweir xImpl = (*aIter);
457cdf0e10cSrcweir maChilds.erase( aIter );
458cdf0e10cSrcweir }
459cdf0e10cSrcweir }
460cdf0e10cSrcweir
461cdf0e10cSrcweir if( !xImpl.is() )
462cdf0e10cSrcweir throw IndexOutOfBoundsException();
463cdf0e10cSrcweir
464cdf0e10cSrcweir xImpl->setParent(0);
465cdf0e10cSrcweir xImpl->mbIsInserted = false;
466cdf0e10cSrcweir
467cdf0e10cSrcweir broadcast_changes( getReference( xImpl.get() ), false );
468cdf0e10cSrcweir }
469cdf0e10cSrcweir
470cdf0e10cSrcweir //---------------------------------------------------------------------
471cdf0e10cSrcweir
setHasChildrenOnDemand(sal_Bool bChildsOnDemand)472cdf0e10cSrcweir void SAL_CALL MutableTreeNode::setHasChildrenOnDemand( sal_Bool bChildsOnDemand ) throw (RuntimeException)
473cdf0e10cSrcweir {
474cdf0e10cSrcweir bool bChanged;
475cdf0e10cSrcweir
476cdf0e10cSrcweir {
477cdf0e10cSrcweir ::osl::Guard< ::osl::Mutex > aGuard( maMutex );
478cdf0e10cSrcweir bChanged = mbHasChildsOnDemand != bChildsOnDemand;
479cdf0e10cSrcweir mbHasChildsOnDemand = bChildsOnDemand;
480cdf0e10cSrcweir }
481cdf0e10cSrcweir
482cdf0e10cSrcweir if( bChanged )
483cdf0e10cSrcweir broadcast_changes();
484cdf0e10cSrcweir }
485cdf0e10cSrcweir
486cdf0e10cSrcweir //---------------------------------------------------------------------
487cdf0e10cSrcweir
setDisplayValue(const Any & aValue)488cdf0e10cSrcweir void SAL_CALL MutableTreeNode::setDisplayValue( const Any& aValue ) throw (RuntimeException)
489cdf0e10cSrcweir {
490cdf0e10cSrcweir {
491cdf0e10cSrcweir ::osl::Guard< ::osl::Mutex > aGuard( maMutex );
492cdf0e10cSrcweir maDisplayValue = aValue;
493cdf0e10cSrcweir }
494cdf0e10cSrcweir
495cdf0e10cSrcweir broadcast_changes();
496cdf0e10cSrcweir }
497cdf0e10cSrcweir
498cdf0e10cSrcweir //---------------------------------------------------------------------
499cdf0e10cSrcweir
setNodeGraphicURL(const OUString & rURL)500cdf0e10cSrcweir void SAL_CALL MutableTreeNode::setNodeGraphicURL( const OUString& rURL ) throw (RuntimeException)
501cdf0e10cSrcweir {
502cdf0e10cSrcweir bool bChanged;
503cdf0e10cSrcweir
504cdf0e10cSrcweir {
505cdf0e10cSrcweir ::osl::Guard< ::osl::Mutex > aGuard( maMutex );
506cdf0e10cSrcweir bChanged = maNodeGraphicURL != rURL;
507cdf0e10cSrcweir maNodeGraphicURL = rURL;
508cdf0e10cSrcweir }
509cdf0e10cSrcweir
510cdf0e10cSrcweir if( bChanged )
511cdf0e10cSrcweir broadcast_changes();
512cdf0e10cSrcweir }
513cdf0e10cSrcweir
514cdf0e10cSrcweir //---------------------------------------------------------------------
515cdf0e10cSrcweir
setExpandedGraphicURL(const OUString & rURL)516cdf0e10cSrcweir void SAL_CALL MutableTreeNode::setExpandedGraphicURL( const OUString& rURL ) throw (RuntimeException)
517cdf0e10cSrcweir {
518cdf0e10cSrcweir bool bChanged;
519cdf0e10cSrcweir
520cdf0e10cSrcweir {
521cdf0e10cSrcweir ::osl::Guard< ::osl::Mutex > aGuard( maMutex );
522cdf0e10cSrcweir bChanged = maExpandedGraphicURL != rURL;
523cdf0e10cSrcweir maExpandedGraphicURL = rURL;
524cdf0e10cSrcweir }
525cdf0e10cSrcweir
526cdf0e10cSrcweir if( bChanged )
527cdf0e10cSrcweir broadcast_changes();
528cdf0e10cSrcweir }
529cdf0e10cSrcweir
530cdf0e10cSrcweir //---------------------------------------------------------------------
531cdf0e10cSrcweir
setCollapsedGraphicURL(const OUString & rURL)532cdf0e10cSrcweir void SAL_CALL MutableTreeNode::setCollapsedGraphicURL( const OUString& rURL ) throw (RuntimeException)
533cdf0e10cSrcweir {
534cdf0e10cSrcweir bool bChanged;
535cdf0e10cSrcweir
536cdf0e10cSrcweir {
537cdf0e10cSrcweir ::osl::Guard< ::osl::Mutex > aGuard( maMutex );
538cdf0e10cSrcweir bChanged = maCollapsedGraphicURL != rURL;
539cdf0e10cSrcweir maCollapsedGraphicURL = rURL;
540cdf0e10cSrcweir }
541cdf0e10cSrcweir
542cdf0e10cSrcweir if( bChanged )
543cdf0e10cSrcweir broadcast_changes();
544cdf0e10cSrcweir }
545cdf0e10cSrcweir
546cdf0e10cSrcweir //---------------------------------------------------------------------
547cdf0e10cSrcweir // XTreeNode
548cdf0e10cSrcweir //---------------------------------------------------------------------
549cdf0e10cSrcweir
getChildAt(sal_Int32 nChildIndex)550cdf0e10cSrcweir Reference< XTreeNode > SAL_CALL MutableTreeNode::getChildAt( sal_Int32 nChildIndex ) throw (IndexOutOfBoundsException,RuntimeException)
551cdf0e10cSrcweir {
552cdf0e10cSrcweir ::osl::Guard< ::osl::Mutex > aGuard( maMutex );
553cdf0e10cSrcweir
554cdf0e10cSrcweir if( (nChildIndex < 0) || (nChildIndex >= (sal_Int32)maChilds.size()) )
555cdf0e10cSrcweir throw IndexOutOfBoundsException();
556cdf0e10cSrcweir return getReference( maChilds[nChildIndex].get() );
557cdf0e10cSrcweir }
558cdf0e10cSrcweir
559cdf0e10cSrcweir //---------------------------------------------------------------------
560cdf0e10cSrcweir
getChildCount()561cdf0e10cSrcweir sal_Int32 SAL_CALL MutableTreeNode::getChildCount( ) throw (RuntimeException)
562cdf0e10cSrcweir {
563cdf0e10cSrcweir ::osl::Guard< ::osl::Mutex > aGuard( maMutex );
564cdf0e10cSrcweir return (sal_Int32)maChilds.size();
565cdf0e10cSrcweir }
566cdf0e10cSrcweir
567cdf0e10cSrcweir //---------------------------------------------------------------------
568cdf0e10cSrcweir
getParent()569cdf0e10cSrcweir Reference< XTreeNode > SAL_CALL MutableTreeNode::getParent( ) throw (RuntimeException)
570cdf0e10cSrcweir {
571cdf0e10cSrcweir ::osl::Guard< ::osl::Mutex > aGuard( maMutex );
572cdf0e10cSrcweir return getReference( mpParent );
573cdf0e10cSrcweir }
574cdf0e10cSrcweir
575cdf0e10cSrcweir //---------------------------------------------------------------------
576cdf0e10cSrcweir
getIndex(const Reference<XTreeNode> & xNode)577cdf0e10cSrcweir sal_Int32 SAL_CALL MutableTreeNode::getIndex( const Reference< XTreeNode >& xNode ) throw (RuntimeException)
578cdf0e10cSrcweir {
579cdf0e10cSrcweir ::osl::Guard< ::osl::Mutex > aGuard( maMutex );
580cdf0e10cSrcweir
581cdf0e10cSrcweir MutableTreeNodeRef xImpl( MutableTreeNode::getImplementation( xNode, false ) );
582cdf0e10cSrcweir if( xImpl.is() )
583cdf0e10cSrcweir {
584cdf0e10cSrcweir sal_Int32 nChildCount = maChilds.size();
585cdf0e10cSrcweir while( nChildCount-- )
586cdf0e10cSrcweir {
587cdf0e10cSrcweir if( maChilds[nChildCount] == xImpl )
588cdf0e10cSrcweir return nChildCount;
589cdf0e10cSrcweir }
590cdf0e10cSrcweir }
591cdf0e10cSrcweir
592cdf0e10cSrcweir return -1;
593cdf0e10cSrcweir }
594cdf0e10cSrcweir
595cdf0e10cSrcweir //---------------------------------------------------------------------
596cdf0e10cSrcweir
hasChildrenOnDemand()597cdf0e10cSrcweir sal_Bool SAL_CALL MutableTreeNode::hasChildrenOnDemand( ) throw (RuntimeException)
598cdf0e10cSrcweir {
599cdf0e10cSrcweir ::osl::Guard< ::osl::Mutex > aGuard( maMutex );
600cdf0e10cSrcweir return mbHasChildsOnDemand;
601cdf0e10cSrcweir }
602cdf0e10cSrcweir
603cdf0e10cSrcweir //---------------------------------------------------------------------
604cdf0e10cSrcweir
getDisplayValue()605cdf0e10cSrcweir Any SAL_CALL MutableTreeNode::getDisplayValue( ) throw (RuntimeException)
606cdf0e10cSrcweir {
607cdf0e10cSrcweir ::osl::Guard< ::osl::Mutex > aGuard( maMutex );
608cdf0e10cSrcweir return maDisplayValue;
609cdf0e10cSrcweir }
610cdf0e10cSrcweir
611cdf0e10cSrcweir //---------------------------------------------------------------------
612cdf0e10cSrcweir
getNodeGraphicURL()613cdf0e10cSrcweir OUString SAL_CALL MutableTreeNode::getNodeGraphicURL( ) throw (RuntimeException)
614cdf0e10cSrcweir {
615cdf0e10cSrcweir ::osl::Guard< ::osl::Mutex > aGuard( maMutex );
616cdf0e10cSrcweir return maNodeGraphicURL;
617cdf0e10cSrcweir }
618cdf0e10cSrcweir
619cdf0e10cSrcweir //---------------------------------------------------------------------
620cdf0e10cSrcweir
getExpandedGraphicURL()621cdf0e10cSrcweir OUString SAL_CALL MutableTreeNode::getExpandedGraphicURL( ) throw (RuntimeException)
622cdf0e10cSrcweir {
623cdf0e10cSrcweir ::osl::Guard< ::osl::Mutex > aGuard( maMutex );
624cdf0e10cSrcweir return maExpandedGraphicURL;
625cdf0e10cSrcweir }
626cdf0e10cSrcweir
627cdf0e10cSrcweir //---------------------------------------------------------------------
628cdf0e10cSrcweir
getCollapsedGraphicURL()629cdf0e10cSrcweir OUString SAL_CALL MutableTreeNode::getCollapsedGraphicURL( ) throw (RuntimeException)
630cdf0e10cSrcweir {
631cdf0e10cSrcweir ::osl::Guard< ::osl::Mutex > aGuard( maMutex );
632cdf0e10cSrcweir return maCollapsedGraphicURL;
633cdf0e10cSrcweir }
634cdf0e10cSrcweir
635cdf0e10cSrcweir //---------------------------------------------------------------------
636cdf0e10cSrcweir // XServiceInfo
637cdf0e10cSrcweir //---------------------------------------------------------------------
638cdf0e10cSrcweir
getImplementationName()639cdf0e10cSrcweir OUString SAL_CALL MutableTreeNode::getImplementationName( ) throw (RuntimeException)
640cdf0e10cSrcweir {
641cdf0e10cSrcweir ::osl::Guard< ::osl::Mutex > aGuard( maMutex );
642cdf0e10cSrcweir static const OUString aImplName( RTL_CONSTASCII_USTRINGPARAM( "toolkit.MutableTreeNode" ) );
643cdf0e10cSrcweir return aImplName;
644cdf0e10cSrcweir }
645cdf0e10cSrcweir
646cdf0e10cSrcweir //---------------------------------------------------------------------
647cdf0e10cSrcweir
supportsService(const OUString & ServiceName)648cdf0e10cSrcweir sal_Bool SAL_CALL MutableTreeNode::supportsService( const OUString& ServiceName ) throw (RuntimeException)
649cdf0e10cSrcweir {
650cdf0e10cSrcweir ::osl::Guard< ::osl::Mutex > aGuard( maMutex );
651cdf0e10cSrcweir return ServiceName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( "com.sun.star.awt.tree.MutableTreeNode" ) );
652cdf0e10cSrcweir }
653cdf0e10cSrcweir
654cdf0e10cSrcweir //---------------------------------------------------------------------
655cdf0e10cSrcweir
getSupportedServiceNames()656cdf0e10cSrcweir Sequence< OUString > SAL_CALL MutableTreeNode::getSupportedServiceNames( ) throw (RuntimeException)
657cdf0e10cSrcweir {
658cdf0e10cSrcweir ::osl::Guard< ::osl::Mutex > aGuard( maMutex );
659cdf0e10cSrcweir static const OUString aServiceName( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.awt.tree.MutableTreeNode" ) );
660cdf0e10cSrcweir static const Sequence< OUString > aSeq( &aServiceName, 1 );
661cdf0e10cSrcweir return aSeq;
662cdf0e10cSrcweir }
663cdf0e10cSrcweir
664cdf0e10cSrcweir }
665cdf0e10cSrcweir
MutableTreeDataModel_CreateInstance(const Reference<XMultiServiceFactory> &)666cdf0e10cSrcweir Reference< XInterface > SAL_CALL MutableTreeDataModel_CreateInstance( const Reference< XMultiServiceFactory >& )
667cdf0e10cSrcweir {
668cdf0e10cSrcweir return Reference < XInterface >( ( ::cppu::OWeakObject* ) new ::toolkit::MutableTreeDataModel );
669cdf0e10cSrcweir }
670