LibreOffice Module toolkit (master) 1
treecontrolpeer.cxx
Go to the documentation of this file.
1/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2/*
3 * This file is part of the LibreOffice project.
4 *
5 * This Source Code Form is subject to the terms of the Mozilla Public
6 * License, v. 2.0. If a copy of the MPL was not distributed with this
7 * file, You can obtain one at http://mozilla.org/MPL/2.0/.
8 *
9 * This file incorporates work covered by the following license notice:
10 *
11 * Licensed to the Apache Software Foundation (ASF) under one or more
12 * contributor license agreements. See the NOTICE file distributed
13 * with this work for additional information regarding copyright
14 * ownership. The ASF licenses this file to you under the Apache
15 * License, Version 2.0 (the "License"); you may not use this file
16 * except in compliance with the License. You may obtain a copy of
17 * the License at http://www.apache.org/licenses/LICENSE-2.0 .
18 */
19
20
21#include <com/sun/star/graphic/GraphicProvider.hpp>
22#include <com/sun/star/lang/DisposedException.hpp>
23#include <com/sun/star/view/SelectionType.hpp>
24#include <com/sun/star/util/VetoException.hpp>
25#include <o3tl/any.hxx>
26#include <helper/property.hxx>
28
29#include <com/sun/star/awt/tree/XMutableTreeNode.hpp>
33
35#include <rtl/ref.hxx>
36#include <vcl/graph.hxx>
37#include <vcl/svapp.hxx>
42
43#include <map>
44#include <memory>
45#include <list>
46
47using namespace ::com::sun::star;
48using namespace css::uno;
49using namespace css::lang;
50using namespace css::awt::tree;
51using namespace css::beans;
52using namespace css::view;
53using namespace css::container;
54using namespace css::util;
55using namespace css::graphic;
56
57namespace {
58
59struct LockGuard
60{
61public:
62 explicit LockGuard( sal_Int32& rLock )
63 : mrLock( rLock )
64 {
65 rLock++;
66 }
67
68 ~LockGuard()
69 {
70 mrLock--;
71 }
72
73 sal_Int32& mrLock;
74};
75
76
77class ImplContextGraphicItem : public SvLBoxContextBmp
78{
79public:
80 ImplContextGraphicItem( Image const & rI1, Image const & rI2, bool bExpanded)
81 : SvLBoxContextBmp(rI1, rI2, bExpanded) {}
82
83 OUString msExpandedGraphicURL;
84 OUString msCollapsedGraphicURL;
85};
86
87
88}
89
91{
92public:
93 UnoTreeListBoxImpl( TreeControlPeer* pPeer, vcl::Window* pParent, WinBits nWinStyle );
94 virtual ~UnoTreeListBoxImpl() override;
95 virtual void dispose() override;
96
97 void insert( SvTreeListEntry* pEntry, SvTreeListEntry* pParent, sal_uLong nPos );
98
99 virtual void RequestingChildren( SvTreeListEntry* pParent ) override;
100
101 virtual bool EditingEntry( SvTreeListEntry* pEntry ) override;
102 virtual bool EditedEntry( SvTreeListEntry* pEntry, const OUString& rNewText ) override;
103
104 DECL_LINK(OnSelectionChangeHdl, SvTreeListBox*, void);
105 DECL_LINK(OnExpandingHdl, SvTreeListBox*, bool);
106 DECL_LINK(OnExpandedHdl, SvTreeListBox*, void);
107
108private:
110};
111
112
113namespace {
114
115class UnoTreeListItem : public SvLBoxString
116{
117public:
118 UnoTreeListItem();
119
120 void InitViewData( SvTreeListBox*,SvTreeListEntry*,SvViewDataItem * = nullptr ) override;
121 void SetImage( const Image& rImage );
122 const OUString& GetGraphicURL() const { return maGraphicURL;}
123 void SetGraphicURL( const OUString& rGraphicURL );
124 virtual void Paint(const Point& rPos, SvTreeListBox& rOutDev, vcl::RenderContext& rRenderContext,
125 const SvViewDataEntry* pView, const SvTreeListEntry& rEntry) override;
126 std::unique_ptr<SvLBoxItem> Clone( SvLBoxItem const * pSource ) const override;
127
128private:
129 OUString maGraphicURL;
130 Image maImage;
131};
132
133}
134
136{
137public:
138 UnoTreeListEntry( const Reference< XTreeNode >& xNode, TreeControlPeer* pPeer );
139 virtual ~UnoTreeListEntry() override;
140
141 Reference< XTreeNode > mxNode;
143};
144
146 : maSelectionListeners( *this )
147 , maTreeExpansionListeners( *this )
148 , maTreeEditListeners( *this )
149 , mbIsRootDisplayed(false)
150 , mpTreeImpl( nullptr )
151 , mnEditLock( 0 )
152{
153}
154
155
157{
158 if( mpTreeImpl )
159 mpTreeImpl->Clear();
160}
161
162
164{
165 if( pEntry && pEntry->mxNode.is() )
166 {
167 if( !mpTreeNodeMap )
168 {
169 mpTreeNodeMap.reset( new TreeNodeMap );
170 }
171
172 (*mpTreeNodeMap)[ pEntry->mxNode ] = pEntry;
173 }
174}
175
176
178{
179 if( mpTreeNodeMap && pEntry && pEntry->mxNode.is() )
180 {
181 TreeNodeMap::iterator aIter( mpTreeNodeMap->find( pEntry->mxNode ) );
182 if( aIter != mpTreeNodeMap->end() )
183 {
184 mpTreeNodeMap->erase( aIter );
185 }
186 }
187}
188
189
190UnoTreeListEntry* TreeControlPeer::getEntry( const Reference< XTreeNode >& xNode, bool bThrow /* = true */ )
191{
192 if( mpTreeNodeMap )
193 {
194 TreeNodeMap::iterator aIter( mpTreeNodeMap->find( xNode ) );
195 if( aIter != mpTreeNodeMap->end() )
196 return (*aIter).second;
197 }
198
199 if( bThrow )
200 throw IllegalArgumentException();
201
202 return nullptr;
203}
204
205
207{
208 mpTreeImpl = VclPtr<UnoTreeListBoxImpl>::Create( this, pParent, nWinStyle );
209 return mpTreeImpl;
210}
211
212
215{
216 mpTreeNodeMap.reset();
217 mpTreeImpl = nullptr;
218}
219
220
221UnoTreeListEntry* TreeControlPeer::createEntry( const Reference< XTreeNode >& xNode, UnoTreeListEntry* pParent, sal_uLong nPos /* = TREELIST_APPEND */ )
222{
223 UnoTreeListEntry* pEntry = nullptr;
224 if( mpTreeImpl )
225 {
226 Image aImage;
227 pEntry = new UnoTreeListEntry( xNode, this );
228 pEntry->AddItem(std::make_unique<ImplContextGraphicItem>(aImage, aImage, true));
229
230 std::unique_ptr<UnoTreeListItem> pUnoItem(new UnoTreeListItem);
231
232 if( !xNode->getNodeGraphicURL().isEmpty() )
233 {
234 pUnoItem->SetGraphicURL( xNode->getNodeGraphicURL() );
235 Image aNodeImage;
236 loadImage( xNode->getNodeGraphicURL(), aNodeImage );
237 pUnoItem->SetImage( aNodeImage );
238 mpTreeImpl->AdjustEntryHeight( aNodeImage );
239 }
240
241 pEntry->AddItem(std::move(pUnoItem));
242
243 mpTreeImpl->insert( pEntry, pParent, nPos );
244
245 if( !msDefaultExpandedGraphicURL.isEmpty() )
246 mpTreeImpl->SetExpandedEntryBmp( pEntry, maDefaultExpandedImage );
247
248 if( !msDefaultCollapsedGraphicURL.isEmpty() )
249 mpTreeImpl->SetCollapsedEntryBmp( pEntry, maDefaultCollapsedImage );
250
251 updateEntry( pEntry );
252 }
253 return pEntry;
254}
255
256
258{
259 bool bChanged = false;
260 if( !(pEntry && pEntry->mxNode.is() && mpTreeImpl) )
261 return;
262
263 const OUString aValue( getEntryString( pEntry->mxNode->getDisplayValue() ) );
264 UnoTreeListItem* pUnoItem = dynamic_cast< UnoTreeListItem* >( &pEntry->GetItem( 1 ) );
265 if( pUnoItem )
266 {
267 if( aValue != pUnoItem->GetText() )
268 {
269 pUnoItem->SetText( aValue );
270 bChanged = true;
271 }
272
273 if( pUnoItem->GetGraphicURL() != pEntry->mxNode->getNodeGraphicURL() )
274 {
275 Image aImage;
276 if( loadImage( pEntry->mxNode->getNodeGraphicURL(), aImage ) )
277 {
278 pUnoItem->SetGraphicURL( pEntry->mxNode->getNodeGraphicURL() );
279 pUnoItem->SetImage( aImage );
280 mpTreeImpl->AdjustEntryHeight( aImage );
281 bChanged = true;
282 }
283 }
284 }
285
286 if( bool(pEntry->mxNode->hasChildrenOnDemand()) != pEntry->HasChildrenOnDemand() )
287 {
288 pEntry->EnableChildrenOnDemand( pEntry->mxNode->hasChildrenOnDemand() );
289 bChanged = true;
290 }
291
292 ImplContextGraphicItem* pContextGraphicItem = dynamic_cast< ImplContextGraphicItem* >( &pEntry->GetItem( 0 ) );
293 if( pContextGraphicItem )
294 {
295 if( pContextGraphicItem->msExpandedGraphicURL != pEntry->mxNode->getExpandedGraphicURL() )
296 {
297 Image aImage;
298 if( loadImage( pEntry->mxNode->getExpandedGraphicURL(), aImage ) )
299 {
300 pContextGraphicItem->msExpandedGraphicURL = pEntry->mxNode->getExpandedGraphicURL();
301 mpTreeImpl->SetExpandedEntryBmp( pEntry, aImage );
302 bChanged = true;
303 }
304 }
305 if( pContextGraphicItem->msCollapsedGraphicURL != pEntry->mxNode->getCollapsedGraphicURL() )
306 {
307 Image aImage;
308 if( loadImage( pEntry->mxNode->getCollapsedGraphicURL(), aImage ) )
309 {
310 pContextGraphicItem->msCollapsedGraphicURL = pEntry->mxNode->getCollapsedGraphicURL();
311 mpTreeImpl->SetCollapsedEntryBmp( pEntry, aImage );
312 bChanged = true;
313 }
314 }
315 }
316
317 if( bChanged )
318 mpTreeImpl->GetModel()->InvalidateEntry( pEntry );
319}
320
321
323{
324 Reference< XInterface > xSource( static_cast< ::cppu::OWeakObject* >( this ) );
325 EventObject aEvent( xSource );
326 maSelectionListeners.selectionChanged( aEvent );
327}
328
329
330void TreeControlPeer::onRequestChildNodes( const Reference< XTreeNode >& xNode )
331{
332 try
333 {
334 Reference< XInterface > xSource( static_cast< ::cppu::OWeakObject* >( this ) );
335 TreeExpansionEvent aEvent( xSource, xNode );
336 maTreeExpansionListeners.requestChildNodes( aEvent );
337 }
338 catch( Exception& )
339 {
340 }
341}
342
343
344bool TreeControlPeer::onExpanding( const Reference< XTreeNode >& xNode, bool bExpanding )
345{
346 try
347 {
348 Reference< XInterface > xSource( static_cast< ::cppu::OWeakObject* >( this ) );
349 TreeExpansionEvent aEvent( xSource, xNode );
350 if( bExpanding )
351 {
352 maTreeExpansionListeners.treeExpanding( aEvent );
353 }
354 else
355 {
356 maTreeExpansionListeners.treeCollapsing( aEvent );
357 }
358 }
359 catch( Exception& )
360 {
361 return false;
362 }
363 return true;
364}
365
366
367void TreeControlPeer::onExpanded( const Reference< XTreeNode >& xNode, bool bExpanding )
368{
369 try
370 {
371 Reference< XInterface > xSource( static_cast< ::cppu::OWeakObject* >( this ) );
372 TreeExpansionEvent aEvent( xSource, xNode );
373
374 if( bExpanding )
375 {
376 maTreeExpansionListeners.treeExpanded( aEvent );
377 }
378 else
379 {
380 maTreeExpansionListeners.treeCollapsed( aEvent );
381 }
382 }
383 catch( Exception& )
384 {
385 }
386}
387
388
389void TreeControlPeer::fillTree( UnoTreeListBoxImpl& rTree, const Reference< XTreeDataModel >& xDataModel )
390{
391 rTree.Clear();
392
393 if( !xDataModel.is() )
394 return;
395
396 Reference< XTreeNode > xRootNode( xDataModel->getRoot() );
397 if( !xRootNode.is() )
398 return;
399
401 {
402 addNode( rTree, xRootNode, nullptr );
403 }
404 else
405 {
406 const sal_Int32 nChildCount = xRootNode->getChildCount();
407 for( sal_Int32 nChild = 0; nChild < nChildCount; nChild++ )
408 addNode( rTree, xRootNode->getChildAt( nChild ), nullptr );
409 }
410}
411
412
413void TreeControlPeer::addNode( UnoTreeListBoxImpl& rTree, const Reference< XTreeNode >& xNode, UnoTreeListEntry* pParentEntry )
414{
415 if( xNode.is() )
416 {
417 UnoTreeListEntry* pEntry = createEntry( xNode, pParentEntry, TREELIST_APPEND );
418 const sal_Int32 nChildCount = xNode->getChildCount();
419 for( sal_Int32 nChild = 0; nChild < nChildCount; nChild++ )
420 addNode( rTree, xNode->getChildAt( nChild ), pEntry );
421 }
422}
423
424
426{
427 if( !mpTreeImpl )
428 throw DisposedException();
429 return *mpTreeImpl;
430}
431
432
433void TreeControlPeer::ChangeNodesSelection( const Any& rSelection, bool bSelect, bool bSetSelection )
434{
435 SolarMutexGuard aGuard;
436
438
439 Reference< XTreeNode > xTempNode;
440
441 Sequence<Reference<XTreeNode>> pNodes;
442 sal_Int32 nCount = 0;
443
444 if( rSelection.hasValue() )
445 {
446 switch( rSelection.getValueTypeClass() )
447 {
448 case TypeClass_INTERFACE:
449 {
450 rSelection >>= xTempNode;
451 if( xTempNode.is() )
452 {
453 nCount = 1;
454 pNodes = {xTempNode};
455 }
456 break;
457 }
458 case TypeClass_SEQUENCE:
459 {
460 if( auto rSeq = o3tl::tryAccess<Sequence<Reference<XTreeNode>>>(
461 rSelection) )
462 {
463 nCount = rSeq->getLength();
464 pNodes = *rSeq;
465 }
466 break;
467 }
468 default:
469 break;
470 }
471
472 if( nCount == 0 )
473 throw IllegalArgumentException();
474 }
475
476 if( bSetSelection )
477 rTree.SelectAll( false );
478
479 for( sal_Int32 i = 0; i != nCount; ++i )
480 {
481 UnoTreeListEntry* pEntry = getEntry( pNodes[i] );
482 rTree.Select( pEntry, bSelect );
483 }
484}
485
486
487// css::view::XSelectionSupplier
488
489
490sal_Bool SAL_CALL TreeControlPeer::select( const Any& rSelection )
491{
492 SolarMutexGuard aGuard;
493 ChangeNodesSelection( rSelection, true, true );
494 return true;
495}
496
497
499{
500 SolarMutexGuard aGuard;
501
503
504 Any aRet;
505
506 sal_uLong nSelectionCount = rTree.GetSelectionCount();
507 if( nSelectionCount == 1 )
508 {
509 UnoTreeListEntry* pEntry = dynamic_cast< UnoTreeListEntry* >( rTree.FirstSelected() );
510 if( pEntry && pEntry->mxNode.is() )
511 aRet <<= pEntry->mxNode;
512 }
513 else if( nSelectionCount > 1 )
514 {
515 Sequence< Reference< XTreeNode > > aSelection( nSelectionCount );
516 Reference< XTreeNode >* pNodes = aSelection.getArray();
517 UnoTreeListEntry* pEntry = dynamic_cast< UnoTreeListEntry* >( rTree.FirstSelected() );
518 while( pEntry && nSelectionCount )
519 {
520 *pNodes++ = pEntry->mxNode;
521 pEntry = dynamic_cast< UnoTreeListEntry* >( rTree.NextSelected( pEntry ) );
522 --nSelectionCount;
523 }
524
525 OSL_ASSERT( (pEntry == nullptr) && (nSelectionCount == 0) );
526 aRet <<= aSelection;
527 }
528
529 return aRet;
530}
531
532
533void SAL_CALL TreeControlPeer::addSelectionChangeListener( const Reference< XSelectionChangeListener >& xListener )
534{
535 maSelectionListeners.addInterface( xListener );
536}
537
538
539void SAL_CALL TreeControlPeer::removeSelectionChangeListener( const Reference< XSelectionChangeListener >& xListener )
540{
541 maSelectionListeners.addInterface( xListener );
542}
543
544
545// css::view::XMultiSelectionSupplier
546
547
548sal_Bool SAL_CALL TreeControlPeer::addSelection( const Any& rSelection )
549{
550 ChangeNodesSelection( rSelection, true, false );
551 return true;
552}
553
554
555void SAL_CALL TreeControlPeer::removeSelection( const Any& rSelection )
556{
557 ChangeNodesSelection( rSelection, false, false );
558}
559
560
562{
563 SolarMutexGuard aGuard;
565}
566
567
569{
570 SolarMutexGuard aGuard;
572}
573
574namespace {
575
576class TreeSelectionEnumeration : public ::cppu::WeakImplHelper< XEnumeration >
577{
578public:
579 explicit TreeSelectionEnumeration( std::list< Any >& rSelection );
580 virtual sal_Bool SAL_CALL hasMoreElements() override;
581 virtual Any SAL_CALL nextElement() override;
582
583 std::list< Any > maSelection;
584 std::list< Any >::iterator maIter;
585};
586
587}
588
589TreeSelectionEnumeration::TreeSelectionEnumeration( std::list< Any >& rSelection )
590{
591 maSelection.swap( rSelection );
592 maIter = maSelection.begin();
593}
594
595
596sal_Bool SAL_CALL TreeSelectionEnumeration::hasMoreElements()
597{
598 return maIter != maSelection.end();
599}
600
601
602Any SAL_CALL TreeSelectionEnumeration::nextElement()
603{
604 if( maIter == maSelection.end() )
605 throw NoSuchElementException();
606
607 return (*maIter++);
608}
609
610
611Reference< XEnumeration > SAL_CALL TreeControlPeer::createSelectionEnumeration()
612{
613 SolarMutexGuard aGuard;
614
616
617 sal_uInt32 nSelectionCount = rTree.GetSelectionCount();
618 std::list< Any > aSelection( nSelectionCount );
619
620 UnoTreeListEntry* pEntry = dynamic_cast< UnoTreeListEntry* >( rTree.FirstSelected() );
621 while( pEntry && nSelectionCount )
622 {
623 aSelection.emplace_back( pEntry->mxNode );
624 pEntry = dynamic_cast< UnoTreeListEntry* >( rTree.NextSelected( pEntry ) );
625 --nSelectionCount;
626 }
627
628 OSL_ASSERT( (pEntry == nullptr) && (nSelectionCount == 0) );
629
630 return Reference< XEnumeration >( new TreeSelectionEnumeration( aSelection ) );
631}
632
633
634Reference< XEnumeration > SAL_CALL TreeControlPeer::createReverseSelectionEnumeration()
635{
636 SolarMutexGuard aGuard;
637
639
640 sal_uInt32 nSelectionCount = rTree.GetSelectionCount();
641 std::list< Any > aSelection;
642
643 UnoTreeListEntry* pEntry = dynamic_cast< UnoTreeListEntry* >( rTree.FirstSelected() );
644 while( pEntry && nSelectionCount )
645 {
646 aSelection.push_front( Any( pEntry->mxNode ) );
647 pEntry = dynamic_cast< UnoTreeListEntry* >( rTree.NextSelected( pEntry ) );
648 --nSelectionCount;
649 }
650
651 OSL_ASSERT( (pEntry == nullptr) && (nSelectionCount == 0) );
652
653 return Reference< XEnumeration >( new TreeSelectionEnumeration( aSelection ) );
654}
655
656
657// css::awt::XTreeControl
658
659
661{
662 SolarMutexGuard aGuard;
664}
665
666
667void SAL_CALL TreeControlPeer::setDefaultExpandedGraphicURL( const OUString& sDefaultExpandedGraphicURL )
668{
669 SolarMutexGuard aGuard;
670 if( msDefaultExpandedGraphicURL == sDefaultExpandedGraphicURL )
671 return;
672
673 if( !sDefaultExpandedGraphicURL.isEmpty() )
674 loadImage( sDefaultExpandedGraphicURL, maDefaultExpandedImage );
675 else
677
679
680 SvTreeListEntry* pEntry = rTree.First();
681 while( pEntry )
682 {
683 ImplContextGraphicItem* pContextGraphicItem = dynamic_cast< ImplContextGraphicItem* >( &pEntry->GetItem( 0 ) );
684 if( pContextGraphicItem )
685 {
686 if( pContextGraphicItem->msExpandedGraphicURL.isEmpty() )
688 }
689 pEntry = rTree.Next( pEntry );
690 }
691
692 msDefaultExpandedGraphicURL = sDefaultExpandedGraphicURL;
693}
694
695
697{
698 SolarMutexGuard aGuard;
700}
701
702
703void SAL_CALL TreeControlPeer::setDefaultCollapsedGraphicURL( const OUString& sDefaultCollapsedGraphicURL )
704{
705 SolarMutexGuard aGuard;
706 if( msDefaultCollapsedGraphicURL == sDefaultCollapsedGraphicURL )
707 return;
708
709 if( !sDefaultCollapsedGraphicURL.isEmpty() )
710 loadImage( sDefaultCollapsedGraphicURL, maDefaultCollapsedImage );
711 else
713
715
716 SvTreeListEntry* pEntry = rTree.First();
717 while( pEntry )
718 {
719 ImplContextGraphicItem* pContextGraphicItem = dynamic_cast< ImplContextGraphicItem* >( &pEntry->GetItem( 0 ) );
720 if( pContextGraphicItem )
721 {
722 if( pContextGraphicItem->msCollapsedGraphicURL.isEmpty() )
724 }
725 pEntry = rTree.Next( pEntry );
726 }
727
728 msDefaultCollapsedGraphicURL = sDefaultCollapsedGraphicURL;
729}
730
731
732sal_Bool SAL_CALL TreeControlPeer::isNodeExpanded( const Reference< XTreeNode >& xNode )
733{
734 SolarMutexGuard aGuard;
735
737 UnoTreeListEntry* pEntry = getEntry( xNode );
738 return pEntry && rTree.IsExpanded( pEntry );
739}
740
741
742sal_Bool SAL_CALL TreeControlPeer::isNodeCollapsed( const Reference< XTreeNode >& xNode )
743{
744 SolarMutexGuard aGuard;
745 return !isNodeExpanded( xNode );
746}
747
748
749void SAL_CALL TreeControlPeer::makeNodeVisible( const Reference< XTreeNode >& xNode )
750{
751 SolarMutexGuard aGuard;
752
754 UnoTreeListEntry* pEntry = getEntry( xNode );
755 if( pEntry )
756 rTree.MakeVisible( pEntry );
757}
758
759
760sal_Bool SAL_CALL TreeControlPeer::isNodeVisible( const Reference< XTreeNode >& xNode )
761{
762 SolarMutexGuard aGuard;
763
765 UnoTreeListEntry* pEntry = getEntry( xNode );
766 return pEntry && rTree.IsEntryVisible( pEntry );
767}
768
769
770void SAL_CALL TreeControlPeer::expandNode( const Reference< XTreeNode >& xNode )
771{
772 SolarMutexGuard aGuard;
773
775 UnoTreeListEntry* pEntry = getEntry( xNode );
776 if( pEntry )
777 rTree.Expand( pEntry );
778}
779
780
781void SAL_CALL TreeControlPeer::collapseNode( const Reference< XTreeNode >& xNode )
782{
783 SolarMutexGuard aGuard;
784
786 UnoTreeListEntry* pEntry = getEntry( xNode );
787 if( pEntry )
788 rTree.Collapse( pEntry );
789}
790
791
792void SAL_CALL TreeControlPeer::addTreeExpansionListener( const Reference< XTreeExpansionListener >& xListener )
793{
794 maTreeExpansionListeners.addInterface( xListener );
795}
796
797
798void SAL_CALL TreeControlPeer::removeTreeExpansionListener( const Reference< XTreeExpansionListener >& xListener )
799{
800 maTreeExpansionListeners.removeInterface( xListener );
801}
802
803
804Reference< XTreeNode > SAL_CALL TreeControlPeer::getNodeForLocation( sal_Int32 x, sal_Int32 y )
805{
806 SolarMutexGuard aGuard;
807
809
810 Reference< XTreeNode > xNode;
811
812 const Point aPos( x, y );
813 UnoTreeListEntry* pEntry = dynamic_cast< UnoTreeListEntry* >( rTree.GetEntry( aPos, true ) );
814 if( pEntry )
815 xNode = pEntry->mxNode;
816
817 return xNode;
818}
819
820
821Reference< XTreeNode > SAL_CALL TreeControlPeer::getClosestNodeForLocation( sal_Int32 x, sal_Int32 y )
822{
823 SolarMutexGuard aGuard;
824
826
827 Reference< XTreeNode > xNode;
828
829 const Point aPos( x, y );
830 UnoTreeListEntry* pEntry = dynamic_cast< UnoTreeListEntry* >( rTree.GetEntry( aPos, true ) );
831 if( pEntry )
832 xNode = pEntry->mxNode;
833
834 return xNode;
835}
836
837
838awt::Rectangle SAL_CALL TreeControlPeer::getNodeRect( const Reference< XTreeNode >& i_Node )
839{
840 SolarMutexGuard aGuard;
841
843 UnoTreeListEntry* pEntry = getEntry( i_Node );
844
845 ::tools::Rectangle aEntryRect( rTree.GetFocusRect( pEntry, rTree.GetEntryPosition( pEntry ).Y() ) );
846 return VCLUnoHelper::ConvertToAWTRect( aEntryRect );
847}
848
849
851{
852 SolarMutexGuard aGuard;
853
855 return rTree.IsEditingActive();
856}
857
858
860{
861 SolarMutexGuard aGuard;
862
864 if( rTree.IsEditingActive() )
865 {
866 rTree.EndEditing();
867 return true;
868 }
869 else
870 {
871 return false;
872 }
873}
874
875
877{
878 SolarMutexGuard aGuard;
879
881 rTree.EndEditing();
882}
883
884
885void SAL_CALL TreeControlPeer::startEditingAtNode( const Reference< XTreeNode >& xNode )
886{
887 SolarMutexGuard aGuard;
888
890 UnoTreeListEntry* pEntry = getEntry( xNode );
891 rTree.EditEntry( pEntry );
892}
893
894void SAL_CALL TreeControlPeer::addTreeEditListener( const Reference< XTreeEditListener >& xListener )
895{
896 maTreeEditListeners.addInterface( xListener );
897}
898
899void SAL_CALL TreeControlPeer::removeTreeEditListener( const Reference< XTreeEditListener >& xListener )
900{
901 maTreeEditListeners.removeInterface( xListener );
902}
903
905{
906 if( mpTreeImpl && pEntry && pEntry->mxNode.is() && (maTreeEditListeners.getLength() > 0) )
907 {
908 try
909 {
910 maTreeEditListeners.nodeEditing( pEntry->mxNode );
911 }
912 catch( VetoException& )
913 {
914 return false;
915 }
916 catch( Exception& )
917 {
918 }
919 }
920 return true;
921}
922
923bool TreeControlPeer::onEditedEntry( UnoTreeListEntry const * pEntry, const OUString& rNewText )
924{
925 if( mpTreeImpl && pEntry && pEntry->mxNode.is() ) try
926 {
927 LockGuard aLockGuard( mnEditLock );
928 if( maTreeEditListeners.getLength() > 0 )
929 {
930 maTreeEditListeners.nodeEdited( pEntry->mxNode, rNewText );
931 return false;
932 }
933 else
934 {
935 Reference< XMutableTreeNode > xMutableNode( pEntry->mxNode, UNO_QUERY );
936 if( xMutableNode.is() )
937 xMutableNode->setDisplayValue( Any( rNewText ) );
938 else
939 return false;
940 }
941
942 }
943 catch( Exception& )
944 {
945 }
946
947 return true;
948}
949
950
951// css::awt::tree::TreeDataModelListener
952
953
954void SAL_CALL TreeControlPeer::treeNodesChanged( const css::awt::tree::TreeDataModelEvent& rEvent )
955{
956 SolarMutexGuard aGuard;
957
958 if( mnEditLock != 0 )
959 return;
960
961 updateTree( rEvent );
962}
963
964void SAL_CALL TreeControlPeer::treeNodesInserted( const css::awt::tree::TreeDataModelEvent& rEvent )
965{
966 SolarMutexGuard aGuard;
967
968 if( mnEditLock != 0 )
969 return;
970
971 updateTree( rEvent );
972}
973
974void SAL_CALL TreeControlPeer::treeNodesRemoved( const css::awt::tree::TreeDataModelEvent& rEvent )
975{
976 SolarMutexGuard aGuard;
977
978 if( mnEditLock != 0 )
979 return;
980
981 updateTree( rEvent );
982}
983
984void SAL_CALL TreeControlPeer::treeStructureChanged( const css::awt::tree::TreeDataModelEvent& rEvent )
985{
986 SolarMutexGuard aGuard;
987
988 if( mnEditLock != 0 )
989 return;
990
991 updateTree( rEvent );
992}
993
994void TreeControlPeer::updateTree( const css::awt::tree::TreeDataModelEvent& rEvent )
995{
997
998 Sequence< Reference< XTreeNode > > Nodes;
999 Reference< XTreeNode > xNode( rEvent.ParentNode );
1000 if( !xNode.is() && Nodes.hasElements() )
1001 {
1002 xNode = Nodes[0];
1003 }
1004
1005 if( xNode.is() )
1006 updateNode( rTree, xNode );
1007}
1008
1009void TreeControlPeer::updateNode( UnoTreeListBoxImpl const & rTree, const Reference< XTreeNode >& xNode )
1010{
1011 if( !xNode.is() )
1012 return;
1013
1014 UnoTreeListEntry* pNodeEntry = getEntry( xNode, false );
1015
1016 if( !pNodeEntry )
1017 {
1018 Reference< XTreeNode > xParentNode( xNode->getParent() );
1019 UnoTreeListEntry* pParentEntry = nullptr;
1020 sal_uLong nChild = TREELIST_APPEND;
1021
1022 if( xParentNode.is() )
1023 {
1024 pParentEntry = getEntry( xParentNode );
1025 nChild = xParentNode->getIndex( xNode );
1026 }
1027
1028 pNodeEntry = createEntry( xNode, pParentEntry, nChild );
1029 }
1030
1031 updateChildNodes( rTree, xNode, pNodeEntry );
1032}
1033
1034void TreeControlPeer::updateChildNodes( UnoTreeListBoxImpl const & rTree, const Reference< XTreeNode >& xParentNode, UnoTreeListEntry* pParentEntry )
1035{
1036 if( !(xParentNode.is() && pParentEntry) )
1037 return;
1038
1039 UnoTreeListEntry* pCurrentChild = dynamic_cast< UnoTreeListEntry* >( rTree.FirstChild( pParentEntry ) );
1040
1041 const sal_Int32 nChildCount = xParentNode->getChildCount();
1042 for( sal_Int32 nChild = 0; nChild < nChildCount; nChild++ )
1043 {
1044 Reference< XTreeNode > xNode( xParentNode->getChildAt( nChild ) );
1045 if( !pCurrentChild || ( pCurrentChild->mxNode != xNode ) )
1046 {
1047 UnoTreeListEntry* pNodeEntry = getEntry( xNode, false );
1048 if( pNodeEntry == nullptr )
1049 {
1050 // child node is not yet part of the tree, add it
1051 pCurrentChild = createEntry( xNode, pParentEntry, nChild );
1052 }
1053 else if( pNodeEntry != pCurrentChild )
1054 {
1055 // node is already part of the tree, but not on the correct position
1056 rTree.GetModel()->Move( pNodeEntry, pParentEntry, nChild );
1057 pCurrentChild = pNodeEntry;
1058 updateEntry( pCurrentChild );
1059 }
1060 }
1061 else
1062 {
1063 // child node has entry and entry is equal to current entry,
1064 // so no structural changes happened
1065 updateEntry( pCurrentChild );
1066 }
1067
1068 pCurrentChild = dynamic_cast< UnoTreeListEntry* >( pCurrentChild->NextSibling() );
1069 }
1070
1071 // check if we have entries without nodes left, we need to remove them
1072 while( pCurrentChild )
1073 {
1074 UnoTreeListEntry* pNextChild = dynamic_cast< UnoTreeListEntry* >( pCurrentChild->NextSibling() );
1075 rTree.GetModel()->Remove( pCurrentChild );
1076 pCurrentChild = pNextChild;
1077 }
1078}
1079
1080OUString TreeControlPeer::getEntryString( const Any& rValue )
1081{
1082 OUString sValue;
1083 if( rValue.hasValue() )
1084 {
1085 switch( rValue.getValueTypeClass() )
1086 {
1087 case TypeClass_SHORT:
1088 case TypeClass_LONG:
1089 {
1090 sal_Int32 nValue = 0;
1091 if( rValue >>= nValue )
1092 sValue = OUString::number( nValue );
1093 break;
1094 }
1095 case TypeClass_BYTE:
1096 case TypeClass_UNSIGNED_SHORT:
1097 case TypeClass_UNSIGNED_LONG:
1098 {
1099 sal_uInt32 nValue = 0;
1100 if( rValue >>= nValue )
1101 sValue = OUString::number( nValue );
1102 break;
1103 }
1104 case TypeClass_HYPER:
1105 {
1106 sal_Int64 nValue = 0;
1107 if( rValue >>= nValue )
1108 sValue = OUString::number( nValue );
1109 break;
1110 }
1111 case TypeClass_UNSIGNED_HYPER:
1112 {
1113 sal_uInt64 nValue = 0;
1114 if( rValue >>= nValue )
1115 sValue = OUString::number( nValue );
1116 break;
1117 }
1118 case TypeClass_FLOAT:
1119 case TypeClass_DOUBLE:
1120 {
1121 double fValue = 0.0;
1122 if( rValue >>= fValue )
1123 sValue = OUString::number( fValue );
1124 break;
1125 }
1126 case TypeClass_STRING:
1127 rValue >>= sValue;
1128 break;
1129 /*
1130 case TypeClass_INTERFACE:
1131 // @todo
1132 break;
1133 case TypeClass_SEQUENCE:
1134 {
1135 Sequence< Any > aValues;
1136 if( aValue >>= aValues )
1137 {
1138 updateEntry( SvTreeListEntry& rEntry, aValues );
1139 return;
1140 }
1141 }
1142 break;
1143 */
1144 default:
1145 break;
1146 }
1147 }
1148 return sValue;
1149}
1150
1151// XEventListener
1152void SAL_CALL TreeControlPeer::disposing( const css::lang::EventObject& )
1153{
1154 // model is disposed, so we clear our tree
1155 SolarMutexGuard aGuard;
1157 rTree.Clear();
1158 mxDataModel.clear();
1159}
1160
1161void TreeControlPeer::onChangeDataModel( UnoTreeListBoxImpl& rTree, const Reference< XTreeDataModel >& xDataModel )
1162{
1163 if( xDataModel.is() && (mxDataModel == xDataModel) )
1164 return; // do nothing
1165
1166 Reference< XTreeDataModelListener > xListener( this );
1167
1168 if( mxDataModel.is() )
1169 mxDataModel->removeTreeDataModelListener( xListener );
1170
1171 mxDataModel = xDataModel;
1172
1173 fillTree( rTree, mxDataModel );
1174
1175 if( mxDataModel.is() )
1176 mxDataModel->addTreeDataModelListener( xListener );
1177}
1178
1179
1180// css::awt::XLayoutConstrains
1181
1182
1184{
1185 SolarMutexGuard aGuard;
1186
1187 css::awt::Size aSz;
1188/* todo
1189 MultiLineEdit* pEdit = (MultiLineEdit*) GetWindow();
1190 if ( pEdit )
1191 aSz = AWTSize(pEdit->CalcMinimumSize());
1192*/
1193 return aSz;
1194}
1195
1197{
1198 return getMinimumSize();
1199}
1200
1201css::awt::Size TreeControlPeer::calcAdjustedSize( const css::awt::Size& rNewSize )
1202{
1203 SolarMutexGuard aGuard;
1204
1205 css::awt::Size aSz = rNewSize;
1206/* todo
1207 MultiLineEdit* pEdit = (MultiLineEdit*) GetWindow();
1208 if ( pEdit )
1209 aSz = AWTSize(pEdit->CalcAdjustedSize( VCLSize(rNewSize )));
1210*/
1211 return aSz;
1212}
1213
1214
1215// css::awt::XVclWindowPeer
1216
1217
1218void TreeControlPeer::setProperty( const OUString& PropertyName, const Any& aValue)
1219{
1220 SolarMutexGuard aGuard;
1221
1223
1224 switch( GetPropertyId( PropertyName ) )
1225 {
1227 {
1228 bool bEnabled = false;
1229 if ( aValue >>= bEnabled )
1230 {
1231 WinBits nStyle = rTree.GetStyle();
1232 if ( bEnabled )
1233 nStyle |= WB_HIDESELECTION;
1234 else
1235 nStyle &= ~WB_HIDESELECTION;
1236 rTree.SetStyle( nStyle );
1237 }
1238 }
1239 break;
1240
1242 {
1243 SelectionType eSelectionType;
1244 if( aValue >>= eSelectionType )
1245 {
1246 SelectionMode eSelMode;
1247 switch( eSelectionType )
1248 {
1249 case SelectionType_SINGLE: eSelMode = SelectionMode::Single; break;
1250 case SelectionType_RANGE: eSelMode = SelectionMode::Range; break;
1251 case SelectionType_MULTI: eSelMode = SelectionMode::Multiple; break;
1252 // case SelectionType_NONE:
1253 default: eSelMode = SelectionMode::NONE; break;
1254 }
1255 if( rTree.GetSelectionMode() != eSelMode )
1256 rTree.SetSelectionMode( eSelMode );
1257 }
1258 break;
1259 }
1260
1262 onChangeDataModel( rTree, Reference< XTreeDataModel >( aValue, UNO_QUERY ) );
1263 break;
1265 {
1266 sal_Int32 nHeight = 0;
1267 if( aValue >>= nHeight )
1268 rTree.SetEntryHeight( static_cast<short>(nHeight) );
1269 break;
1270 }
1272 {
1273 bool bEnabled = false;
1274 if( aValue >>= bEnabled )
1275 rTree.EnableInplaceEditing( bEnabled );
1276 break;
1277 }
1279 break; // @todo
1281 {
1282 bool bDisplayed = false;
1283 if( (aValue >>= bDisplayed) && ( bDisplayed != mbIsRootDisplayed) )
1284 {
1285 onChangeRootDisplayed(bDisplayed);
1286 }
1287 break;
1288 }
1290 {
1291 bool bEnabled = false;
1292 if( aValue >>= bEnabled )
1293 {
1294 WinBits nBits = rTree.GetStyle() & (~WB_HASLINES);
1295 if( bEnabled )
1296 nBits |= WB_HASLINES;
1297 if( nBits != rTree.GetStyle() )
1298 rTree.SetStyle( nBits );
1299 }
1300 break;
1301 }
1303 {
1304 bool bEnabled = false;
1305 if( aValue >>= bEnabled )
1306 {
1307 WinBits nBits = rTree.GetStyle() & (~WB_HASLINESATROOT);
1308 if( bEnabled )
1309 nBits |= WB_HASLINESATROOT;
1310 if( nBits != rTree.GetStyle() )
1311 rTree.SetStyle( nBits );
1312 }
1313 break;
1314 }
1315 default:
1316 VCLXWindow::setProperty( PropertyName, aValue );
1317 break;
1318 }
1319}
1320
1321Any TreeControlPeer::getProperty( const OUString& PropertyName )
1322{
1323 SolarMutexGuard aGuard;
1324
1325 const sal_uInt16 nPropId = GetPropertyId( PropertyName );
1326 if( (nPropId >= BASEPROPERTY_TREE_START) && (nPropId <= BASEPROPERTY_TREE_END) )
1327 {
1329 switch(nPropId)
1330 {
1332 {
1333 SelectionType eSelectionType;
1334
1335 SelectionMode eSelMode = rTree.GetSelectionMode();
1336 switch( eSelMode )
1337 {
1338 case SelectionMode::Single: eSelectionType = SelectionType_SINGLE; break;
1339 case SelectionMode::Range: eSelectionType = SelectionType_RANGE; break;
1340 case SelectionMode::Multiple:eSelectionType = SelectionType_MULTI; break;
1341// case SelectionMode::NONE:
1342 default: eSelectionType = SelectionType_NONE; break;
1343 }
1344 return Any( eSelectionType );
1345 }
1347 return Any( static_cast<sal_Int32>(rTree.GetEntryHeight()) );
1349 return Any( mxDataModel );
1351 return Any( rTree.IsInplaceEditingEnabled() );
1353 return Any( true ); // @todo
1355 return Any( mbIsRootDisplayed );
1357 return Any( (rTree.GetStyle() & WB_HASLINES) != 0 );
1359 return Any( (rTree.GetStyle() & WB_HASLINESATROOT) != 0 );
1360 }
1361 }
1362 return VCLXWindow::getProperty( PropertyName );
1363}
1364
1365void TreeControlPeer::onChangeRootDisplayed( bool bIsRootDisplayed )
1366{
1367 if( mbIsRootDisplayed == bIsRootDisplayed )
1368 return;
1369
1370 mbIsRootDisplayed = bIsRootDisplayed;
1371
1373
1374 if( rTree.GetEntryCount() == 0 )
1375 return;
1376
1377 // todo
1378 fillTree( rTree, mxDataModel );
1379}
1380
1381bool TreeControlPeer::loadImage( const OUString& rURL, Image& rImage )
1382{
1383 if( !mxGraphicProvider.is() )
1384 {
1385 mxGraphicProvider = graphic::GraphicProvider::create(
1387 }
1388
1389 try
1390 {
1391 css::beans::PropertyValues aProps{ comphelper::makePropertyValue("URL", rURL) };
1392 Reference< XGraphic > xGraphic( mxGraphicProvider->queryGraphic( aProps ) );
1393
1394 Graphic aGraphic( xGraphic );
1395 rImage = Image(aGraphic.GetBitmapEx());
1396 return true;
1397 }
1398 catch( Exception& )
1399 {
1400 }
1401
1402 return false;
1403}
1404
1405
1406
1407
1409: SvTreeListBox( pParent, nWinStyle )
1410, mxPeer( pPeer )
1411{
1414 SetSelectHdl( LINK(this, UnoTreeListBoxImpl, OnSelectionChangeHdl) );
1415 SetDeselectHdl( LINK(this, UnoTreeListBoxImpl, OnSelectionChangeHdl) );
1416
1417 SetExpandingHdl( LINK(this, UnoTreeListBoxImpl, OnExpandingHdl) );
1418 SetExpandedHdl( LINK(this, UnoTreeListBoxImpl, OnExpandedHdl) );
1419
1420}
1421
1422
1424{
1425 disposeOnce();
1426}
1427
1429{
1430 if( mxPeer.is() )
1431 mxPeer->disposeControl();
1432 mxPeer.clear();
1434}
1435
1436
1438{
1439 if( mxPeer.is() )
1440 mxPeer->onSelectionChanged();
1441}
1442
1443
1445{
1446 UnoTreeListEntry* pEntry = dynamic_cast< UnoTreeListEntry* >( GetHdlEntry() );
1447
1448 if( pEntry && mxPeer.is() )
1449 {
1450 return mxPeer->onExpanding( pEntry->mxNode, !IsExpanded( pEntry ) );
1451 }
1452 return false;
1453}
1454
1455
1457{
1458 UnoTreeListEntry* pEntry = dynamic_cast< UnoTreeListEntry* >( GetHdlEntry() );
1459 if( pEntry && mxPeer.is() )
1460 {
1461 mxPeer->onExpanded( pEntry->mxNode, IsExpanded( pEntry ) );
1462 }
1463}
1464
1465
1467{
1468 if( pParent )
1469 SvTreeListBox::Insert( pEntry, pParent, nPos );
1470 else
1471 SvTreeListBox::Insert( pEntry, nPos );
1472}
1473
1474
1476{
1477 UnoTreeListEntry* pEntry = dynamic_cast< UnoTreeListEntry* >( pParent );
1478 if( pEntry && pEntry->mxNode.is() && mxPeer.is() )
1479 mxPeer->onRequestChildNodes( pEntry->mxNode );
1480}
1481
1482
1484{
1485 return mxPeer.is() && mxPeer->onEditingEntry( dynamic_cast< UnoTreeListEntry* >( pEntry ) );
1486}
1487
1488
1489bool UnoTreeListBoxImpl::EditedEntry( SvTreeListEntry* pEntry, const OUString& rNewText )
1490{
1491 return mxPeer.is() && mxPeer->onEditedEntry( dynamic_cast< UnoTreeListEntry* >( pEntry ), rNewText );
1492}
1493
1494
1495
1496
1497UnoTreeListItem::UnoTreeListItem()
1498: SvLBoxString(OUString())
1499{
1500}
1501
1502void UnoTreeListItem::Paint(
1503 const Point& rPos, SvTreeListBox& rDev, vcl::RenderContext& rRenderContext, const SvViewDataEntry* /*pView*/, const SvTreeListEntry& rEntry)
1504{
1505 Point aPos(rPos);
1506 Size aSize(GetWidth(&rDev, &rEntry), GetHeight(&rDev, &rEntry));
1507 if (!!maImage)
1508 {
1509 rRenderContext.DrawImage(aPos, maImage, rDev.IsEnabled() ? DrawImageFlags::NONE : DrawImageFlags::Disable);
1510 int nWidth = maImage.GetSizePixel().Width() + 6;
1511 aPos.AdjustX(nWidth );
1512 aSize.AdjustWidth( -nWidth );
1513 }
1514 rRenderContext.DrawText(tools::Rectangle(aPos,aSize),maText, rDev.IsEnabled() ? DrawTextFlags::NONE : DrawTextFlags::Disable);
1515}
1516
1517
1518std::unique_ptr<SvLBoxItem> UnoTreeListItem::Clone(SvLBoxItem const * pSource) const
1519{
1520 std::unique_ptr<UnoTreeListItem> pNew(new UnoTreeListItem);
1521 UnoTreeListItem const * pSourceItem = static_cast< UnoTreeListItem const * >( pSource );
1522 pNew->maText = pSourceItem->maText;
1523 pNew->maImage = pSourceItem->maImage;
1524 return std::unique_ptr<SvLBoxItem>(pNew.release());
1525}
1526
1527
1528void UnoTreeListItem::SetImage( const Image& rImage )
1529{
1530 maImage = rImage;
1531}
1532
1533
1534void UnoTreeListItem::SetGraphicURL( const OUString& rGraphicURL )
1535{
1536 maGraphicURL = rGraphicURL;
1537}
1538
1539
1540void UnoTreeListItem::InitViewData( SvTreeListBox* pView,SvTreeListEntry* pEntry, SvViewDataItem* pViewData)
1541{
1542 if( !pViewData )
1543 pViewData = pView->GetViewDataItem( pEntry, this );
1544
1545 Size aSize(maImage.GetSizePixel());
1546 pViewData->mnWidth = aSize.Width();
1547 pViewData->mnHeight = aSize.Height();
1548
1549 const Size aTextSize(pView->GetTextWidth( maText ), pView->GetTextHeight());
1550 if( pViewData->mnWidth )
1551 {
1552 pViewData->mnWidth += (6 + aTextSize.Width());
1553 if( pViewData->mnHeight < aTextSize.Height() )
1554 pViewData->mnHeight = aTextSize.Height();
1555 }
1556 else
1557 {
1558 pViewData->mnWidth = aTextSize.Width();
1559 pViewData->mnHeight = aTextSize.Height();
1560 }
1561}
1562
1563
1564UnoTreeListEntry::UnoTreeListEntry( const Reference< XTreeNode >& xNode, TreeControlPeer* pPeer )
1565: mxNode( xNode )
1566, mpPeer( pPeer )
1567{
1568 if( mpPeer )
1569 mpPeer->addEntry( this );
1570}
1571
1572
1574{
1575 if( mpPeer )
1576 mpPeer->removeEntry( this );
1577}
1578
1579/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
std::vector< Reference< XAnimationNode > >::iterator maIter
AnyEventRef aEvent
BitmapEx GetBitmapEx(const GraphicConversionParameters &rParameters=GraphicConversionParameters()) const
void DrawImage(const Point &rPos, const Image &rImage, DrawImageFlags nStyle=DrawImageFlags::NONE)
void DrawText(const Point &rStartPt, const OUString &rStr, sal_Int32 nIndex=0, sal_Int32 nLen=-1, std::vector< tools::Rectangle > *pVector=nullptr, OUString *pDisplayText=nullptr, const SalLayoutGlyphs *pLayoutCache=nullptr)
constexpr tools::Long Y() const
virtual void InitViewData(SvTreeListBox *pView, SvTreeListEntry *pEntry, SvViewDataItem *pViewData=nullptr) override
virtual void Paint(const Point &rPos, SvTreeListBox &rOutDev, vcl::RenderContext &rRenderContext, const SvViewDataEntry *pView, const SvTreeListEntry &rEntry) override
virtual std::unique_ptr< SvLBoxItem > Clone(SvLBoxItem const *pSource) const override
bool IsEntryVisible(SvTreeListEntry *pEntry) const
sal_uInt32 GetSelectionCount() const
SvTreeListEntry * NextSelected(SvTreeListEntry *pEntry) const
SvTreeListEntry * FirstSelected() const
bool IsExpanded(SvTreeListEntry *pEntry) const
void SetDeselectHdl(const Link< SvTreeListBox *, void > &rNewHdl)
SvTreeListEntry * FirstChild(SvTreeListEntry *pParent) const
sal_uInt32 GetEntryCount() const
void EnableInplaceEditing(bool bEnable)
void SetExpandedHdl(const Link< SvTreeListBox *, void > &rNewHdl)
void MakeVisible(SvTreeListEntry *pEntry)
SvTreeListEntry * Next(SvTreeListEntry *pEntry) const
Point GetEntryPosition(const SvTreeListEntry *) const
SvTreeListEntry * GetEntry(SvTreeListEntry *pParent, sal_uInt32 nPos) const
void SetEntryHeight(short nHeight)
void SetCollapsedEntryBmp(SvTreeListEntry *_pEntry, const Image &_rImage)
bool Collapse(SvTreeListEntry *pParent)
bool IsInplaceEditingEnabled() const
bool Select(SvTreeListEntry *pEntry, bool bSelect=true)
void SetExpandedEntryBmp(SvTreeListEntry *_pEntry, const Image &_rImage)
SvViewDataItem * GetViewDataItem(SvTreeListEntry const *, SvLBoxItem const *)
bool IsEditingActive() const
short GetEntryHeight() const
virtual void dispose() override
void EditEntry(SvTreeListEntry *pEntry)
void SetSelectionMode(SelectionMode)
void SetNodeDefaultImages()
void EndEditing(bool bCancel=false)
SvTreeListEntry * First() const
void SetSelectHdl(const Link< SvTreeListBox *, void > &rNewHdl)
SelectionMode GetSelectionMode() const
virtual tools::Rectangle GetFocusRect(const SvTreeListEntry *, tools::Long nLine)
void SetExpandingHdl(const Link< SvTreeListBox *, bool > &rNewHdl)
void SelectAll(bool bSelect)
virtual sal_uInt32 Insert(SvTreeListEntry *pEnt, SvTreeListEntry *pPar, sal_uInt32 nPos=TREELIST_APPEND)
SvTreeList * GetModel() const
bool Expand(SvTreeListEntry *pParent)
SvTreeListEntry * NextSibling() const
bool HasChildrenOnDemand() const
const SvLBoxItem & GetItem(size_t nPos) const
void EnableChildrenOnDemand(bool bEnable=true)
void AddItem(std::unique_ptr< SvLBoxItem > pItem)
void Move(SvTreeListEntry *pSource, SvTreeListEntry *pTarget)
bool Remove(const SvTreeListEntry *pEntry)
OUString msDefaultExpandedGraphicURL
virtual OUString SAL_CALL getDefaultCollapsedGraphicURL() override
TreeSelectionListenerMultiplexer maSelectionListeners
virtual void SAL_CALL startEditingAtNode(const css::uno::Reference< css::awt::tree::XTreeNode > &Node) override
virtual void SAL_CALL clearSelection() override
virtual css::uno::Any SAL_CALL getSelection() override
virtual void SAL_CALL setDefaultExpandedGraphicURL(const OUString &_defaultexpandedgraphicurl) override
virtual OUString SAL_CALL getDefaultExpandedGraphicURL() override
void updateChildNodes(UnoTreeListBoxImpl const &rTree, const css::uno::Reference< css::awt::tree::XTreeNode > &xParentNode, UnoTreeListEntry *pParentEntry)
void updateTree(const css::awt::tree::TreeDataModelEvent &rEvent)
virtual void SAL_CALL removeSelectionChangeListener(const css::uno::Reference< css::view::XSelectionChangeListener > &xListener) override
virtual void SAL_CALL treeStructureChanged(const css::awt::tree::TreeDataModelEvent &aEvent) override
virtual sal_Bool SAL_CALL isNodeExpanded(const css::uno::Reference< css::awt::tree::XTreeNode > &Node) override
virtual void SAL_CALL removeSelection(const css::uno::Any &Selection) override
virtual void SAL_CALL treeNodesInserted(const css::awt::tree::TreeDataModelEvent &aEvent) override
UnoTreeListBoxImpl & getTreeListBoxOrThrow() const
OUString msDefaultCollapsedGraphicURL
virtual void SAL_CALL cancelEditing() override
VclPtr< UnoTreeListBoxImpl > mpTreeImpl
virtual css::awt::Rectangle SAL_CALL getNodeRect(const css::uno::Reference< css::awt::tree::XTreeNode > &Node) override
TreeEditListenerMultiplexer maTreeEditListeners
std::unique_ptr< TreeNodeMap > mpTreeNodeMap
void onExpanded(const css::uno::Reference< css::awt::tree::XTreeNode > &xNode, bool bExpanding)
virtual sal_Bool SAL_CALL addSelection(const css::uno::Any &Selection) override
virtual void SAL_CALL treeNodesChanged(const css::awt::tree::TreeDataModelEvent &aEvent) override
virtual void SAL_CALL setDefaultCollapsedGraphicURL(const OUString &_defaultcollapsedgraphicurl) override
virtual void SAL_CALL addSelectionChangeListener(const css::uno::Reference< css::view::XSelectionChangeListener > &xListener) override
void onChangeDataModel(UnoTreeListBoxImpl &rTree, const css::uno::Reference< css::awt::tree::XTreeDataModel > &xDataModel)
virtual void SAL_CALL collapseNode(const css::uno::Reference< css::awt::tree::XTreeNode > &Node) override
UnoTreeListEntry * getEntry(const css::uno::Reference< css::awt::tree::XTreeNode > &xNode, bool bThrow=true)
void ChangeNodesSelection(const css::uno::Any &rSelection, bool bSelect, bool bSetSelection)
virtual void SAL_CALL removeTreeEditListener(const css::uno::Reference< css::awt::tree::XTreeEditListener > &Listener) override
bool onExpanding(const css::uno::Reference< css::awt::tree::XTreeNode > &xNode, bool bExpanding)
void removeEntry(UnoTreeListEntry const *pEntry)
virtual css::uno::Reference< css::container::XEnumeration > SAL_CALL createSelectionEnumeration() override
virtual css::uno::Reference< css::container::XEnumeration > SAL_CALL createReverseSelectionEnumeration() override
virtual sal_Bool SAL_CALL isNodeCollapsed(const css::uno::Reference< css::awt::tree::XTreeNode > &Node) override
void onRequestChildNodes(const css::uno::Reference< css::awt::tree::XTreeNode > &xNode)
std::map< css::uno::Reference< css::awt::tree::XTreeNode >, UnoTreeListEntry * > TreeNodeMap
virtual sal_Bool SAL_CALL select(const css::uno::Any &xSelection) override
void addNode(UnoTreeListBoxImpl &rTree, const css::uno::Reference< css::awt::tree::XTreeNode > &xNode, UnoTreeListEntry *pParentEntry)
bool onEditedEntry(UnoTreeListEntry const *pEntry, const OUString &rNewText)
virtual void SAL_CALL makeNodeVisible(const css::uno::Reference< css::awt::tree::XTreeNode > &Node) override
void disposeControl()
called from the UnoTreeListBoxImpl when it gets deleted
css::awt::Size SAL_CALL calcAdjustedSize(const css::awt::Size &aNewSize) override
void addEntry(UnoTreeListEntry *pEntry)
static OUString getEntryString(const css::uno::Any &rValue)
virtual void SAL_CALL addTreeEditListener(const css::uno::Reference< css::awt::tree::XTreeEditListener > &Listener) override
virtual void SAL_CALL expandNode(const css::uno::Reference< css::awt::tree::XTreeNode > &Node) override
virtual void SAL_CALL removeTreeExpansionListener(const css::uno::Reference< css::awt::tree::XTreeExpansionListener > &Listener) override
virtual css::uno::Reference< css::awt::tree::XTreeNode > SAL_CALL getNodeForLocation(::sal_Int32 x, ::sal_Int32 y) override
css::awt::Size SAL_CALL getPreferredSize() override
void fillTree(UnoTreeListBoxImpl &rTree, const css::uno::Reference< css::awt::tree::XTreeDataModel > &xDataModel)
void updateNode(UnoTreeListBoxImpl const &rTree, const css::uno::Reference< css::awt::tree::XTreeNode > &xNode)
void SAL_CALL disposing(const css::lang::EventObject &Source) override
virtual ::sal_Int32 SAL_CALL getSelectionCount() override
virtual ~TreeControlPeer() override
virtual css::uno::Reference< css::awt::tree::XTreeNode > SAL_CALL getClosestNodeForLocation(::sal_Int32 x, ::sal_Int32 y) override
vcl::Window * createVclControl(vcl::Window *pParent, sal_Int64 nWinStyle)
TreeExpansionListenerMultiplexer maTreeExpansionListeners
void SAL_CALL setProperty(const OUString &PropertyName, const css::uno::Any &Value) override
virtual sal_Bool SAL_CALL isNodeVisible(const css::uno::Reference< css::awt::tree::XTreeNode > &Node) override
void onChangeRootDisplayed(bool bIsRootDisplayed)
css::awt::Size SAL_CALL getMinimumSize() override
virtual sal_Bool SAL_CALL stopEditing() override
friend class UnoTreeListEntry
css::uno::Reference< css::graphic::XGraphicProvider > mxGraphicProvider
void updateEntry(UnoTreeListEntry *pEntry)
css::uno::Any SAL_CALL getProperty(const OUString &PropertyName) override
bool onEditingEntry(UnoTreeListEntry const *pEntry)
virtual void SAL_CALL addTreeExpansionListener(const css::uno::Reference< css::awt::tree::XTreeExpansionListener > &Listener) override
virtual void SAL_CALL treeNodesRemoved(const css::awt::tree::TreeDataModelEvent &aEvent) override
virtual sal_Bool SAL_CALL isEditing() override
bool loadImage(const OUString &rURL, Image &rImage)
UnoTreeListEntry * createEntry(const css::uno::Reference< css::awt::tree::XTreeNode > &xNode, UnoTreeListEntry *pParent, sal_uLong nPos)
css::uno::Reference< css::awt::tree::XTreeDataModel > mxDataModel
virtual bool EditingEntry(SvTreeListEntry *pEntry) override
DECL_LINK(OnExpandingHdl, SvTreeListBox *, bool)
virtual void RequestingChildren(SvTreeListEntry *pParent) override
DECL_LINK(OnExpandedHdl, SvTreeListBox *, void)
void insert(SvTreeListEntry *pEntry, SvTreeListEntry *pParent, sal_uLong nPos)
virtual void dispose() override
rtl::Reference< TreeControlPeer > mxPeer
virtual ~UnoTreeListBoxImpl() override
virtual bool EditedEntry(SvTreeListEntry *pEntry, const OUString &rNewText) override
UnoTreeListBoxImpl(TreeControlPeer *pPeer, vcl::Window *pParent, WinBits nWinStyle)
DECL_LINK(OnSelectionChangeHdl, SvTreeListBox *, void)
virtual ~UnoTreeListEntry() override
TreeControlPeer * mpPeer
UnoTreeListEntry(const Reference< XTreeNode > &xNode, TreeControlPeer *pPeer)
Reference< XTreeNode > mxNode
static css::awt::Rectangle ConvertToAWTRect(::tools::Rectangle const &_rRect)
css::uno::Any SAL_CALL getProperty(const OUString &PropertyName) override
void SAL_CALL setProperty(const OUString &PropertyName, const css::uno::Any &Value) override
static VclPtr< reference_type > Create(Arg &&... arg)
tools::Long GetTextWidth(const OUString &rStr, sal_Int32 nIndex=0, sal_Int32 nLen=-1, vcl::text::TextLayoutCache const *=nullptr, SalLayoutGlyphs const *const pLayoutCache=nullptr) const
void SetStyle(WinBits nStyle)
tools::Long GetTextHeight() const
WinBits GetStyle() const
bool IsEnabled() const
#define TREELIST_APPEND
int nCount
float y
float x
sal_Int16 nValue
sal_uInt16 nPos
@ Exception
Reference< XComponentContext > getProcessComponentContext()
css::beans::PropertyValue makePropertyValue(const OUString &rName, T &&rValue)
int i
std::enable_if<!(detail::IsDerivedReference< T >::value||detail::IsUnoSequenceType< T >::value||std::is_base_of< css::uno::XInterface, T >::value), typenamedetail::Optional< T >::type >::type tryAccess(css::uno::Any const &any)
sal_uInt16 GetPropertyId(const OUString &rPropertyName)
Definition: property.cxx:278
#define BASEPROPERTY_TREE_SHOWSROOTHANDLES
Definition: property.hxx:163
#define BASEPROPERTY_TREE_SHOWSHANDLES
Definition: property.hxx:162
#define BASEPROPERTY_TREE_DATAMODEL
Definition: property.hxx:160
#define BASEPROPERTY_HIDEINACTIVESELECTION
Definition: property.hxx:143
#define BASEPROPERTY_TREE_END
Definition: property.hxx:166
#define BASEPROPERTY_TREE_ROOTDISPLAYED
Definition: property.hxx:161
#define BASEPROPERTY_TREE_EDITABLE
Definition: property.hxx:159
#define BASEPROPERTY_TREE_INVOKESSTOPNODEEDITING
Definition: property.hxx:165
#define BASEPROPERTY_TREE_START
Definition: property.hxx:157
#define BASEPROPERTY_ROW_HEIGHT
Definition: property.hxx:164
#define BASEPROPERTY_TREE_SELECTIONTYPE
Definition: property.hxx:158
sal_uIntPtr sal_uLong
IMPL_LINK_NOARG(UnoTreeListBoxImpl, OnSelectionChangeHdl, SvTreeListBox *, void)
unsigned char sal_Bool
SelectionMode
sal_Int64 WinBits
WinBits const WB_HIDESELECTION
WinBits const WB_HASBUTTONS
WinBits const WB_HASLINESATROOT
WinBits const WB_HASLINES
WinBits const WB_HASBUTTONSATROOT
WinBits const WB_BORDER
WinBits const WB_HSCROLL
SelectionType