20#include <com/sun/star/awt/tree/XMutableTreeDataModel.hpp>
21#include <com/sun/star/lang/IllegalArgumentException.hpp>
22#include <com/sun/star/lang/IndexOutOfBoundsException.hpp>
23#include <com/sun/star/lang/XServiceInfo.hpp>
24#include <com/sun/star/uno/XComponentContext.hpp>
41 enum broadcast_type { nodes_changed, nodes_inserted, nodes_removed, structure_changed };
44class MutableTreeDataModel;
46typedef std::vector< rtl::Reference< MutableTreeNode > > TreeNodeVector;
51 MutableTreeDataModel();
53 void broadcast( broadcast_type eType,
const Reference< XTreeNode >& xParentNode,
const Reference< XTreeNode >& rNode );
56 virtual css::uno::Reference< css::awt::tree::XMutableTreeNode > SAL_CALL createNode(
const css::uno::Any& DisplayValue,
sal_Bool ChildrenOnDemand )
override;
57 virtual void SAL_CALL setRoot(
const css::uno::Reference< css::awt::tree::XMutableTreeNode >& RootNode )
override;
60 virtual css::uno::Reference< css::awt::tree::XTreeNode > SAL_CALL getRoot( )
override;
61 virtual void SAL_CALL addTreeDataModelListener(
const css::uno::Reference< css::awt::tree::XTreeDataModelListener >& Listener )
override;
62 virtual void SAL_CALL removeTreeDataModelListener(
const css::uno::Reference< css::awt::tree::XTreeDataModelListener >& Listener )
override;
65 virtual void SAL_CALL
dispose( )
override;
66 virtual void SAL_CALL addEventListener(
const Reference< XEventListener >& xListener )
override;
67 virtual void SAL_CALL removeEventListener(
const Reference< XEventListener >& aListener )
override;
75 void broadcastImpl( std::unique_lock<std::mutex>& rGuard, broadcast_type eType,
const Reference< XTreeNode >& xParentNode,
const Reference< XTreeNode >& rNode );
86 friend class MutableTreeDataModel;
90 virtual ~MutableTreeNode()
override;
92 void setParent( MutableTreeNode* pParent );
93 void broadcast_changes();
94 void broadcast_changes(std::unique_lock<std::mutex> & rLock,
95 const Reference< XTreeNode >& xNode,
bool bNew);
98 virtual css::uno::Any SAL_CALL getDataValue()
override;
99 virtual void SAL_CALL setDataValue(
const css::uno::Any& _datavalue )
override;
100 virtual void SAL_CALL appendChild(
const css::uno::Reference< css::awt::tree::XMutableTreeNode >& ChildNode )
override;
101 virtual void SAL_CALL insertChildByIndex( ::sal_Int32
Index,
const css::uno::Reference< css::awt::tree::XMutableTreeNode >& ChildNode )
override;
102 virtual void SAL_CALL removeChildByIndex( ::sal_Int32
Index )
override;
103 virtual void SAL_CALL setHasChildrenOnDemand(
sal_Bool ChildrenOnDemand )
override;
104 virtual void SAL_CALL setDisplayValue(
const css::uno::Any& Value )
override;
105 virtual void SAL_CALL setNodeGraphicURL(
const OUString& URL )
override;
106 virtual void SAL_CALL setExpandedGraphicURL(
const OUString& URL )
override;
107 virtual void SAL_CALL setCollapsedGraphicURL(
const OUString& URL )
override;
110 virtual css::uno::Reference< css::awt::tree::XTreeNode > SAL_CALL getChildAt( ::sal_Int32
Index )
override;
111 virtual ::sal_Int32 SAL_CALL getChildCount( )
override;
112 virtual css::uno::Reference< css::awt::tree::XTreeNode > SAL_CALL getParent( )
override;
113 virtual ::sal_Int32 SAL_CALL getIndex(
const css::uno::Reference< css::awt::tree::XTreeNode >&
Node )
override;
114 virtual sal_Bool SAL_CALL hasChildrenOnDemand( )
override;
115 virtual css::uno::Any SAL_CALL getDisplayValue( )
override;
116 virtual OUString SAL_CALL getNodeGraphicURL( )
override;
117 virtual OUString SAL_CALL getExpandedGraphicURL( )
override;
118 virtual OUString SAL_CALL getCollapsedGraphicURL( )
override;
129 bool mbHasChildrenOnDemand;
133 OUString maNodeGraphicURL;
134 OUString maExpandedGraphicURL;
135 OUString maCollapsedGraphicURL;
139MutableTreeDataModel::MutableTreeDataModel()
144void MutableTreeDataModel::broadcast( broadcast_type eType,
const Reference< XTreeNode >& xParentNode,
const Reference< XTreeNode >& rNode )
146 std::unique_lock aGuard(m_aMutex);
147 broadcastImpl(aGuard, eType, xParentNode, rNode);
150void MutableTreeDataModel::broadcastImpl( std::unique_lock<std::mutex>& rGuard, broadcast_type eType,
const Reference< XTreeNode >& xParentNode,
const Reference< XTreeNode >& rNode )
152 if( !maTreeDataModelListeners.getLength(rGuard) )
156 const Sequence< Reference< XTreeNode > > aNodes { rNode };
157 TreeDataModelEvent
aEvent( xSource, aNodes, xParentNode );
161 while(aListIter.hasMoreElements())
163 XTreeDataModelListener* pListener = aListIter.next().get();
166 case nodes_changed: pListener->treeNodesChanged(aEvent);
break;
167 case nodes_inserted: pListener->treeNodesInserted(aEvent);
break;
168 case nodes_removed: pListener->treeNodesRemoved(aEvent);
break;
169 case structure_changed: pListener->treeStructureChanged(aEvent);
break;
174Reference< XMutableTreeNode > SAL_CALL MutableTreeDataModel::createNode(
const Any& aValue,
sal_Bool bChildrenOnDemand )
176 return new MutableTreeNode(
this, aValue, bChildrenOnDemand );
179void SAL_CALL MutableTreeDataModel::setRoot(
const Reference< XMutableTreeNode >& xNode )
182 throw IllegalArgumentException();
184 std::unique_lock aGuard( m_aMutex );
185 if( xNode == mxRootNode )
192 xOldImpl->mbIsInserted =
false;
196 if( !xImpl.is() || xImpl->mbIsInserted )
197 throw IllegalArgumentException();
199 xImpl->mbIsInserted =
true;
202 Reference< XTreeNode > xParentNode;
203 broadcastImpl( aGuard, structure_changed, xParentNode, mxRootNode );
206Reference< XTreeNode > SAL_CALL MutableTreeDataModel::getRoot( )
208 std::unique_lock aGuard( m_aMutex );
212void SAL_CALL MutableTreeDataModel::addTreeDataModelListener(
const Reference< XTreeDataModelListener >& xListener )
214 std::unique_lock aGuard( m_aMutex );
215 maTreeDataModelListeners.addInterface( aGuard, xListener );
218void SAL_CALL MutableTreeDataModel::removeTreeDataModelListener(
const Reference< XTreeDataModelListener >& xListener )
220 std::unique_lock aGuard( m_aMutex );
221 maTreeDataModelListeners.removeInterface( aGuard, xListener );
224void SAL_CALL MutableTreeDataModel::dispose()
226 std::unique_lock aGuard( m_aMutex );
231 css::lang::EventObject
aEvent;
233 maTreeDataModelListeners.disposeAndClear( aGuard, aEvent );
234 maEventListeners.disposeAndClear( aGuard, aEvent );
238void SAL_CALL MutableTreeDataModel::addEventListener(
const Reference< XEventListener >& xListener )
240 std::unique_lock aGuard( m_aMutex );
241 maEventListeners.addInterface( aGuard, xListener );
244void SAL_CALL MutableTreeDataModel::removeEventListener(
const Reference< XEventListener >& xListener )
246 std::unique_lock aGuard( m_aMutex );
247 maEventListeners.removeInterface( aGuard, xListener );
250OUString SAL_CALL MutableTreeDataModel::getImplementationName( )
252 return "toolkit.MutableTreeDataModel";
255sal_Bool SAL_CALL MutableTreeDataModel::supportsService(
const OUString& ServiceName )
260Sequence< OUString > SAL_CALL MutableTreeDataModel::getSupportedServiceNames( )
262 Sequence<OUString>
aSeq {
"com.sun.star.awt.tree.MutableTreeDataModel" };
267: maDisplayValue(
std::move( aValue ))
268, mbHasChildrenOnDemand( bChildrenOnDemand )
271, mbIsInserted( false )
275MutableTreeNode::~MutableTreeNode()
277 for(
auto& rChild : maChildren )
278 rChild->setParent(
nullptr);
281void MutableTreeNode::setParent( MutableTreeNode* pParent )
286void MutableTreeNode::broadcast_changes()
290 mxModel->broadcast( nodes_changed, mpParent,
this );
294void MutableTreeNode::broadcast_changes(std::unique_lock<std::mutex> & rLock,
295 const Reference< XTreeNode >& xNode,
bool const bNew)
297 auto const xModel(mxModel);
301 xModel->broadcast(bNew ? nodes_inserted : nodes_removed,
this, xNode);
305Any SAL_CALL MutableTreeNode::getDataValue()
307 std::scoped_lock aGuard( maMutex );
311void SAL_CALL MutableTreeNode::setDataValue(
const Any& _datavalue )
313 std::scoped_lock aGuard( maMutex );
314 maDataValue = _datavalue;
317void SAL_CALL MutableTreeNode::appendChild(
const Reference< XMutableTreeNode >& xChildNode )
319 std::unique_lock aGuard( maMutex );
322 if( !xImpl.is() || xImpl->mbIsInserted || (
this == xImpl.get()) )
323 throw IllegalArgumentException();
326 xImpl->setParent(
this);
327 xImpl->mbIsInserted =
true;
329 broadcast_changes(aGuard, xChildNode,
true);
332void SAL_CALL MutableTreeNode::insertChildByIndex( sal_Int32 nChildIndex,
const Reference< XMutableTreeNode >& xChildNode )
334 std::unique_lock aGuard( maMutex );
337 throw IndexOutOfBoundsException();
340 if( !xImpl.is() || xImpl->mbIsInserted || (
this == xImpl.get()) )
341 throw IllegalArgumentException();
343 xImpl->mbIsInserted =
true;
345 TreeNodeVector::iterator aIter(
maChildren.begin() );
346 std::advance(aIter, nChildIndex);
349 xImpl->setParent(
this );
351 broadcast_changes(aGuard, xChildNode,
true);
354void SAL_CALL MutableTreeNode::removeChildByIndex( sal_Int32 nChildIndex )
356 std::unique_lock aGuard( maMutex );
359 throw IndexOutOfBoundsException();
363 TreeNodeVector::iterator aIter(
maChildren.begin() );
364 std::advance(aIter, nChildIndex);
370 throw IndexOutOfBoundsException();
372 xImpl->setParent(
nullptr);
373 xImpl->mbIsInserted =
false;
375 broadcast_changes(aGuard, xImpl,
false);
378void SAL_CALL MutableTreeNode::setHasChildrenOnDemand(
sal_Bool bChildrenOnDemand )
383 std::scoped_lock aGuard( maMutex );
384 bChanged = mbHasChildrenOnDemand != bool(bChildrenOnDemand);
385 mbHasChildrenOnDemand = bChildrenOnDemand;
392void SAL_CALL MutableTreeNode::setDisplayValue(
const Any& aValue )
395 std::scoped_lock aGuard( maMutex );
396 maDisplayValue = aValue;
402void SAL_CALL MutableTreeNode::setNodeGraphicURL(
const OUString& rURL )
407 std::scoped_lock aGuard( maMutex );
408 bChanged = maNodeGraphicURL != rURL;
409 maNodeGraphicURL = rURL;
416void SAL_CALL MutableTreeNode::setExpandedGraphicURL(
const OUString& rURL )
421 std::scoped_lock aGuard( maMutex );
422 bChanged = maExpandedGraphicURL != rURL;
423 maExpandedGraphicURL = rURL;
430void SAL_CALL MutableTreeNode::setCollapsedGraphicURL(
const OUString& rURL )
435 std::scoped_lock aGuard( maMutex );
436 bChanged = maCollapsedGraphicURL != rURL;
437 maCollapsedGraphicURL = rURL;
444Reference< XTreeNode > SAL_CALL MutableTreeNode::getChildAt( sal_Int32 nChildIndex )
446 std::scoped_lock aGuard( maMutex );
449 throw IndexOutOfBoundsException();
453sal_Int32 SAL_CALL MutableTreeNode::getChildCount( )
455 std::scoped_lock aGuard( maMutex );
456 return static_cast<sal_Int32
>(
maChildren.size());
459Reference< XTreeNode > SAL_CALL MutableTreeNode::getParent( )
461 std::scoped_lock aGuard( maMutex );
465sal_Int32 SAL_CALL MutableTreeNode::getIndex(
const Reference< XTreeNode >& xNode )
467 std::scoped_lock aGuard( maMutex );
473 while( nChildCount-- )
475 if( maChildren[nChildCount] == xImpl )
483sal_Bool SAL_CALL MutableTreeNode::hasChildrenOnDemand( )
485 std::scoped_lock aGuard( maMutex );
486 return mbHasChildrenOnDemand;
489Any SAL_CALL MutableTreeNode::getDisplayValue( )
491 std::scoped_lock aGuard( maMutex );
492 return maDisplayValue;
495OUString SAL_CALL MutableTreeNode::getNodeGraphicURL( )
497 std::scoped_lock aGuard( maMutex );
498 return maNodeGraphicURL;
501OUString SAL_CALL MutableTreeNode::getExpandedGraphicURL( )
503 std::scoped_lock aGuard( maMutex );
504 return maExpandedGraphicURL;
507OUString SAL_CALL MutableTreeNode::getCollapsedGraphicURL( )
509 std::scoped_lock aGuard( maMutex );
510 return maCollapsedGraphicURL;
513OUString SAL_CALL MutableTreeNode::getImplementationName( )
515 return "toolkit.MutableTreeNode";
518sal_Bool SAL_CALL MutableTreeNode::supportsService(
const OUString& ServiceName )
523Sequence< OUString > SAL_CALL MutableTreeNode::getSupportedServiceNames( )
525 Sequence<OUString>
aSeq {
"com.sun.star.awt.tree.MutableTreeNode" };
531extern "C" SAL_DLLPUBLIC_EXPORT css::uno::XInterface *
533 css::uno::XComponentContext *,
534 css::uno::Sequence<css::uno::Any>
const &)
536 return cppu::acquire(
new MutableTreeDataModel());
css::uno::Reference< css::frame::XModel2 > mxModel
std::vector< Reference< XAnimationNode > > maChildren
RegionData_Impl * mpParent
Sequence< sal_Int8 > aSeq
css::uno::Sequence< OUString > getSupportedServiceNames()
OUString getImplementationName()
bool CPPUHELPER_DLLPUBLIC supportsService(css::lang::XServiceInfo *implementation, rtl::OUString const &name)
constexpr std::enable_if_t< std::is_signed_v< T >, std::make_unsigned_t< T > > make_unsigned(T value)
uno::Reference< animations::XAnimationNode > mxRootNode
Reference< XModel > xModel
SAL_DLLPUBLIC_EXPORT css::uno::XInterface * stardiv_Toolkit_MutableTreeDataModel_get_implementation(css::uno::XComponentContext *, css::uno::Sequence< css::uno::Any > const &)