From 70a008181aef33272346e7ae45f8838354346ead Mon Sep 17 00:00:00 2001 From: Caolán McNamara Date: Wed, 12 Aug 2020 11:03:48 +0100 Subject: SvTreeListBox can move into toolkit headers now MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Change-Id: I6b3b6ef1530a192f4b6bf87aa9688687063683ea Reviewed-on: https://gerrit.libreoffice.org/c/core/+/100591 Tested-by: Jenkins Reviewed-by: Caolán McNamara --- include/vcl/toolkit/svlbitm.hxx | 2 +- include/vcl/toolkit/svtabbx.hxx | 2 +- include/vcl/toolkit/treelist.hxx | 302 ++++++++++++++ include/vcl/toolkit/treelistbox.hxx | 704 ++++++++++++++++++++++++++++++++ include/vcl/toolkit/treelistentries.hxx | 23 ++ include/vcl/toolkit/treelistentry.hxx | 132 ++++++ include/vcl/toolkit/viewdataentry.hxx | 86 ++++ include/vcl/treelist.hxx | 301 -------------- include/vcl/treelistbox.hxx | 703 ------------------------------- include/vcl/treelistentries.hxx | 21 - include/vcl/treelistentry.hxx | 131 ------ include/vcl/uitest/uiobject.hxx | 1 - include/vcl/viewdataentry.hxx | 85 ---- 13 files changed, 1249 insertions(+), 1244 deletions(-) create mode 100644 include/vcl/toolkit/treelist.hxx create mode 100644 include/vcl/toolkit/treelistbox.hxx create mode 100644 include/vcl/toolkit/treelistentries.hxx create mode 100644 include/vcl/toolkit/treelistentry.hxx create mode 100644 include/vcl/toolkit/viewdataentry.hxx delete mode 100644 include/vcl/treelist.hxx delete mode 100644 include/vcl/treelistbox.hxx delete mode 100644 include/vcl/treelistentries.hxx delete mode 100644 include/vcl/treelistentry.hxx delete mode 100644 include/vcl/viewdataentry.hxx (limited to 'include') diff --git a/include/vcl/toolkit/svlbitm.hxx b/include/vcl/toolkit/svlbitm.hxx index e4e6fbc57a7d..850763abf76d 100644 --- a/include/vcl/toolkit/svlbitm.hxx +++ b/include/vcl/toolkit/svlbitm.hxx @@ -27,7 +27,7 @@ #include #include #include -#include +#include #include class SvTreeListEntry; diff --git a/include/vcl/toolkit/svtabbx.hxx b/include/vcl/toolkit/svtabbx.hxx index 17a0b3282251..3e1a8a00b032 100644 --- a/include/vcl/toolkit/svtabbx.hxx +++ b/include/vcl/toolkit/svtabbx.hxx @@ -23,7 +23,7 @@ #endif #include -#include +#include #include #include diff --git a/include/vcl/toolkit/treelist.hxx b/include/vcl/toolkit/treelist.hxx new file mode 100644 index 000000000000..3ca4a05b009b --- /dev/null +++ b/include/vcl/toolkit/treelist.hxx @@ -0,0 +1,302 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#pragma once + +#if !defined(VCL_DLLIMPLEMENTATION) && !defined(TOOLKIT_DLLIMPLEMENTATION) && !defined(VCL_INTERNALS) +#error "don't use this in new code" +#endif + +#include +#include + +#include +#include +#include + +#include + +enum class SvListAction +{ + INSERTED = 1, + REMOVING = 2, + REMOVED = 3, + MOVING = 4, + MOVED = 5, + CLEARING = 6, + INSERTED_TREE = 7, + INVALIDATE_ENTRY = 8, + RESORTING = 9, + RESORTED = 10, + CLEARED = 11 +}; + +class SvTreeListEntry; +class SvListView; +class SvViewDataEntry; + +enum SvSortMode { SortAscending, SortDescending, SortNone }; + +// For the return values of Sortlink: +// See International::Compare( pLeft, pRight ) +// ( Compare(a,b) ==> b.Compare(a) ==> strcmp(a,b) ) +struct SvSortData +{ + const SvTreeListEntry* pLeft; + const SvTreeListEntry* pRight; +}; + +class VCL_DLLPUBLIC SvTreeList final +{ + friend class SvListView; + + SvListView& mrOwnerListView; + sal_uLong nEntryCount; + + Link aCloneLink; + Link aCompareLink; + SvSortMode eSortMode; + + bool bAbsPositionsValid; + + bool mbEnableInvalidate; + + SvTreeListEntry* FirstVisible() const { return First(); } + SvTreeListEntry* NextVisible( const SvListView*,SvTreeListEntry* pEntry, sal_uInt16* pDepth=nullptr ) const; + SvTreeListEntry* PrevVisible( const SvListView*,SvTreeListEntry* pEntry ) const; + SvTreeListEntry* LastVisible( const SvListView* ) const; + SvTreeListEntry* NextVisible( const SvListView*,SvTreeListEntry* pEntry, sal_uInt16& rDelta ) const; + SvTreeListEntry* PrevVisible( const SvListView*,SvTreeListEntry* pEntry, sal_uInt16& rDelta ) const; + + bool IsEntryVisible( const SvListView*,SvTreeListEntry* pEntry ) const; + SvTreeListEntry* GetEntryAtVisPos( const SvListView*,sal_uLong nVisPos ) const; + sal_uLong GetVisiblePos( const SvListView*,SvTreeListEntry const * pEntry ) const; + sal_uLong GetVisibleCount( SvListView* ) const; + sal_uLong GetVisibleChildCount( const SvListView*,SvTreeListEntry* pParent ) const; + + SvTreeListEntry* FirstSelected( const SvListView*) const; + SvTreeListEntry* NextSelected( const SvListView*,SvTreeListEntry* pEntry ) const; + + sal_uLong GetChildSelectionCount( const SvListView*,SvTreeListEntry* pParent ) const; + + VCL_DLLPRIVATE void SetAbsolutePositions(); + + VCL_DLLPRIVATE void CloneChildren( + SvTreeListEntries& rDst, sal_uLong& rCloneCount, SvTreeListEntries& rSrc, SvTreeListEntry& rNewParent) const; + + /** + * Invalidate the cached position data to have them re-generated before + * the next access. + */ + VCL_DLLPRIVATE static void SetListPositions( SvTreeListEntries& rEntries ); + + // rPos is not changed for SortModeNone + VCL_DLLPRIVATE void GetInsertionPos( + SvTreeListEntry const * pEntry, + SvTreeListEntry* pParent, + sal_uLong& rPos + ); + + VCL_DLLPRIVATE void ResortChildren( SvTreeListEntry* pParent ); + + SvTreeList(const SvTreeList&) = delete; + SvTreeList& operator= (const SvTreeList&) = delete; + + std::unique_ptr pRootItem; + +public: + + SvTreeList() = delete; + SvTreeList(SvListView&); + ~SvTreeList(); + + void Broadcast( + SvListAction nActionId, + SvTreeListEntry* pEntry1=nullptr, + SvTreeListEntry* pEntry2=nullptr, + sal_uLong nPos=0 + ); + + void EnableInvalidate( bool bEnable ); + + // Notify all Listeners + void InvalidateEntry( SvTreeListEntry* ); + + sal_uLong GetEntryCount() const { return nEntryCount; } + SvTreeListEntry* First() const; + SvTreeListEntry* Next( SvTreeListEntry* pEntry, sal_uInt16* pDepth=nullptr ) const; + SvTreeListEntry* Prev( SvTreeListEntry* pEntry ) const; + SvTreeListEntry* Last() const; + + SvTreeListEntry* FirstChild( SvTreeListEntry* pParent ) const; + + sal_uLong Insert( SvTreeListEntry* pEntry,SvTreeListEntry* pPar,sal_uLong nPos = TREELIST_APPEND); + sal_uLong Insert( SvTreeListEntry* pEntry,sal_uLong nRootPos = TREELIST_APPEND ) + { return Insert(pEntry, pRootItem.get(), nRootPos ); } + + void InsertTree( SvTreeListEntry* pTree, SvTreeListEntry* pTargetParent, sal_uLong nListPos ); + + // Entries need to be in the same Model! + void Move( SvTreeListEntry* pSource, SvTreeListEntry* pTarget ); + + // Creates ChildList if needed + sal_uLong Move( SvTreeListEntry* pSource, SvTreeListEntry* pTargetParent, sal_uLong nListPos); + sal_uLong Copy( SvTreeListEntry* pSource, SvTreeListEntry* pTargetParent, sal_uLong nListPos); + + bool Remove( const SvTreeListEntry* pEntry ); + void Clear(); + + bool HasChildren( const SvTreeListEntry* pEntry ) const; + bool HasParent( const SvTreeListEntry* pEntry ) const; + + bool IsChild(const SvTreeListEntry* pParent, const SvTreeListEntry* pChild) const; + SvTreeListEntry* GetEntry( SvTreeListEntry* pParent, sal_uLong nPos ) const; + SvTreeListEntry* GetEntry( sal_uLong nRootPos ) const; + SvTreeListEntry* GetEntryAtAbsPos( sal_uLong nAbsPos ) const; + + const SvTreeListEntry* GetParent( const SvTreeListEntry* pEntry ) const; + SvTreeListEntry* GetParent( SvTreeListEntry* pEntry ); + + SvTreeListEntry* GetRootLevelParent( SvTreeListEntry* pEntry ) const; + const SvTreeListEntries& GetChildList( SvTreeListEntry* pParent ) const; + SvTreeListEntries& GetChildList( SvTreeListEntry* pParent ); + + std::pair + GetChildIterators(SvTreeListEntry* pParent); + + sal_uLong GetAbsPos( const SvTreeListEntry* pEntry ) const; + static sal_uLong GetRelPos( const SvTreeListEntry* pChild ); + + sal_uLong GetChildCount( const SvTreeListEntry* pParent ) const; + sal_uInt16 GetDepth( const SvTreeListEntry* pEntry ) const; + bool IsAtRootDepth( const SvTreeListEntry* pEntry ) const; + + // The Model calls the Clone Link to clone Entries. + // Thus we do not need to derive from the Model if we derive from SvTreeListEntry. + // The Handler needs to return a SvTreeListEntry* + SvTreeListEntry* Clone( SvTreeListEntry* pEntry, sal_uLong& nCloneCount ) const; + void SetCloneLink( const Link& rLink ) + { aCloneLink=rLink; } + + const Link& GetCloneLink() const + { return aCloneLink; } + + SvTreeListEntry* CloneEntry( SvTreeListEntry* pSource ) const; // Calls the Clone Link + + void SetSortMode( SvSortMode eMode ) { eSortMode = eMode; } + SvSortMode GetSortMode() const { return eSortMode; } + sal_Int32 Compare(const SvTreeListEntry* pLeft, const SvTreeListEntry* pRight) const; + void SetCompareHdl( const Link& rLink ) { aCompareLink = rLink; } + void Resort(); +}; + +class VCL_DLLPUBLIC SvListView +{ + friend class SvTreeList; + + struct SAL_DLLPRIVATE Impl; + std::unique_ptr m_pImpl; + +protected: + std::unique_ptr pModel; + + void ExpandListEntry( SvTreeListEntry* pParent ); + void CollapseListEntry( SvTreeListEntry* pParent ); + bool SelectListEntry( SvTreeListEntry* pEntry, bool bSelect ); + +public: + SvListView(); // Sets the Model to 0 + void dispose(); + virtual ~SvListView(); + void Clear(); + virtual void ModelNotification( + SvListAction nActionId, + SvTreeListEntry* pEntry1, + SvTreeListEntry* pEntry2, + sal_uLong nPos + ); + + sal_uLong GetVisibleCount() const + { return pModel->GetVisibleCount( const_cast(this) ); } + + SvTreeListEntry* FirstVisible() const + { return pModel->FirstVisible(); } + + SvTreeListEntry* NextVisible( SvTreeListEntry* pEntry ) const + { return pModel->NextVisible(this,pEntry); } + + SvTreeListEntry* PrevVisible( SvTreeListEntry* pEntry ) const + { return pModel->PrevVisible(this,pEntry); } + + SvTreeListEntry* LastVisible() const + { return pModel->LastVisible(this); } + + SvTreeListEntry* NextVisible( SvTreeListEntry* pEntry, sal_uInt16& rDelta ) const + { return pModel->NextVisible(this,pEntry,rDelta); } + + SvTreeListEntry* PrevVisible( SvTreeListEntry* pEntry, sal_uInt16& rDelta ) const + { return pModel->PrevVisible(this,pEntry,rDelta); } + + sal_uLong GetSelectionCount() const; + + SvTreeListEntry* FirstSelected() const + { return pModel->FirstSelected(this); } + + SvTreeListEntry* NextSelected( SvTreeListEntry* pEntry ) const + { return pModel->NextSelected(this,pEntry); } + + SvTreeListEntry* GetEntryAtAbsPos( sal_uLong nAbsPos ) const + { return pModel->GetEntryAtAbsPos(nAbsPos); } + + SvTreeListEntry* GetEntryAtVisPos( sal_uLong nVisPos ) const + { return pModel->GetEntryAtVisPos(this,nVisPos); } + + sal_uLong GetAbsPos( SvTreeListEntry const * pEntry ) const + { return pModel->GetAbsPos(pEntry); } + + sal_uLong GetVisiblePos( SvTreeListEntry const * pEntry ) const + { return pModel->GetVisiblePos(this,pEntry); } + + sal_uLong GetVisibleChildCount(SvTreeListEntry* pParent ) const + { return pModel->GetVisibleChildCount(this,pParent); } + + bool IsEntryVisible( SvTreeListEntry* pEntry ) const + { return pModel->IsEntryVisible(this,pEntry); } + + bool IsExpanded( SvTreeListEntry* pEntry ) const; + bool IsAllExpanded( SvTreeListEntry* pEntry) const; + bool IsSelected(const SvTreeListEntry* pEntry) const; + void SetEntryFocus( SvTreeListEntry* pEntry, bool bFocus ); + const SvViewDataEntry* GetViewData( const SvTreeListEntry* pEntry ) const; + SvViewDataEntry* GetViewData( SvTreeListEntry* pEntry ); + bool HasViewData() const; + + virtual void InitViewData( SvViewDataEntry*, SvTreeListEntry* pEntry ); + + virtual void ModelHasCleared(); + virtual void ModelHasInserted( SvTreeListEntry* pEntry ); + virtual void ModelHasInsertedTree( SvTreeListEntry* pEntry ); + virtual void ModelIsMoving( SvTreeListEntry* pSource ); + virtual void ModelHasMoved( SvTreeListEntry* pSource ); + virtual void ModelIsRemoving( SvTreeListEntry* pEntry ); + virtual void ModelHasRemoved( SvTreeListEntry* pEntry ); + virtual void ModelHasEntryInvalidated( SvTreeListEntry* pEntry ); +}; + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/include/vcl/toolkit/treelistbox.hxx b/include/vcl/toolkit/treelistbox.hxx new file mode 100644 index 000000000000..c8ccdd775ac3 --- /dev/null +++ b/include/vcl/toolkit/treelistbox.hxx @@ -0,0 +1,704 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#pragma once + +#if !defined(VCL_DLLIMPLEMENTATION) && !defined(TOOLKIT_DLLIMPLEMENTATION) && !defined(VCL_INTERNALS) +#error "don't use this in new code" +#endif + +#include + +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +class SvTreeListBox; +class SvTreeListEntry; +struct SvViewDataItem; +class SvViewDataEntry; +class SvInplaceEdit2; +class SvLBoxString; +class SvImpLBox; +class SvLBoxButtonData; +class Timer; +class Edit; + +namespace utl { + class AccessibleStateSetHelper; +} + +enum class SvButtonState { Unchecked, Checked, Tristate }; + +// ********************************************************************* +// *************************** Tabulators ****************************** +// ********************************************************************* + +enum class SvLBoxTabFlags +{ + NONE = 0x0000, + DYNAMIC = 0x0001, // Item's output column changes according to the Child Depth + ADJUST_RIGHT = 0x0002, // Item's right margin at the tabulator + ADJUST_LEFT = 0x0004, // Left margin + ADJUST_CENTER = 0x0008, // Center the item at the tabulator + + SHOW_SELECTION = 0x0010, // Visualize selection state + // Item needs to be able to return the surrounding polygon (D'n'D cursor) + EDITABLE = 0x0020, // Item editable at the tabulator + FORCE = 0x0040, // Switch off the default calculation of the first tabulator + // (on which Abo Tabpage/Extras/Option/Customize, etc. rely on) + // The first tab's position corresponds precisely to the Flags set + // and column widths +}; +namespace o3tl +{ + template<> struct typed_flags : is_typed_flags {}; +} + +#define SV_TAB_BORDER 8 + +#define SV_ENTRYHEIGHTOFFS_PIXEL 2 + +enum class SvTreeFlags +{ + CHKBTN = 0x01, + USESEL = 0x02, + MANINS = 0x04, + RECALCTABS = 0x08, + FIXEDHEIGHT = 0x10, +}; +namespace o3tl +{ + template<> struct typed_flags : is_typed_flags {}; +} + +enum class SvLBoxItemType {String, Button, ContextBmp}; + +class SvLBoxTab +{ + long nPos; +public: + SvLBoxTab(); + SvLBoxTab( long nPos, SvLBoxTabFlags nFlags ); + SvLBoxTab( const SvLBoxTab& ); + ~SvLBoxTab(); + + SvLBoxTabFlags nFlags; + + bool IsDynamic() const { return bool(nFlags & SvLBoxTabFlags::DYNAMIC); } + void SetPos( long nNewPos) { nPos = nNewPos; } + long GetPos() const { return nPos; } + long CalcOffset( long nItemLength, long nTabWidth ); + bool IsEditable() const { return bool(nFlags & SvLBoxTabFlags::EDITABLE); } +}; + +class VCL_DLLPUBLIC SvLBoxItem +{ +protected: + bool mbDisabled; + +public: + SvLBoxItem(); + virtual ~SvLBoxItem(); + virtual SvLBoxItemType GetType() const = 0; + virtual int CalcWidth(const SvTreeListBox* pView) const; + int GetWidth(const SvTreeListBox* pView, const SvTreeListEntry* pEntry) const; + int GetWidth(const SvTreeListBox* pView, const SvViewDataEntry* pData, sal_uInt16 nItemPos); + int GetHeight(const SvTreeListBox* pView, const SvTreeListEntry* pEntry) const; + static int GetHeight(const SvViewDataEntry* pData, sal_uInt16 nItemPos); + void Enable(bool bEnabled) { mbDisabled = !bEnabled; } + + virtual void Paint(const Point& rPos, SvTreeListBox& rOutDev, vcl::RenderContext& rRenderContext, const SvViewDataEntry* pView, const SvTreeListEntry& rEntry) = 0; + + virtual void InitViewData(SvTreeListBox* pView, SvTreeListEntry* pEntry, + // If != 0: this Pointer must be used! + // If == 0: it needs to be retrieved via the View + SvViewDataItem* pViewData = nullptr) = 0; + // View-dependent data is not cloned + virtual std::unique_ptr Clone(SvLBoxItem const * pSource) const = 0; +}; + +enum class DragDropMode +{ + NONE = 0x0000, + CTRL_MOVE = 0x0001, + APP_COPY = 0x0004, + // Entries may be dropped via the uppermost Entry + // The DropTarget is 0 in that case + ENABLE_TOP = 0x0010, + ALL = 0x0015, +}; +namespace o3tl +{ + template<> struct typed_flags : is_typed_flags {}; +} + +enum class SvTreeListBoxFlags +{ + NONE = 0x0000, + IN_EDT = 0x0001, + EDT_ENABLED = 0x0002, + TARGEMPH_VIS = 0x0004, + EDTEND_CALLED = 0x0008, +}; +namespace o3tl +{ + template<> struct typed_flags : is_typed_flags {}; +} + +struct SvTreeListBoxImpl; + +typedef std::pair svtree_measure_args; +typedef std::tuple svtree_render_args; + +class VCL_DLLPUBLIC SvTreeListBox + :public Control + ,public SvListView + ,public DropTargetHelper + ,public DragSourceHelper + ,public vcl::ISearchableStringList +{ + friend class SvImpLBox; + friend class SvLBoxString; + friend class IconViewImpl; + friend class TreeControlPeer; + friend class SalInstanceIconView; + friend class SalInstanceTreeView; + friend class SalInstanceEntryTreeView; + + std::unique_ptr mpImpl; + Link aScrolledHdl; + Link aExpandedHdl; + Link aExpandingHdl; + Link aSelectHdl; + Link aDeselectHdl; + Link aPopupMenuHdl; + Link aTooltipHdl; + Link aCustomRenderHdl; + Link aCustomMeasureHdl; + + Image aPrevInsertedExpBmp; + Image aPrevInsertedColBmp; + Image aCurInsertedExpBmp; + Image aCurInsertedColBmp; + + short nContextBmpWidthMax; + short nEntryHeightOffs; + short nIndent; + short nFocusWidth; + sal_uInt16 nFirstSelTab; + sal_uInt16 nLastSelTab; + long mnCheckboxItemWidth; + bool mbContextBmpExpanded; + bool mbAlternatingRowColors; + bool mbUpdateAlternatingRows; + bool mbQuickSearch; // Enables type-ahead search in the check list box. + bool mbActivateOnSingleClick; // Make single click "activate" a row like a double-click normally does + bool mbHoverSelection; // Make mouse over a row "select" a row like a single-click normally does + + SvTreeListEntry* pHdlEntry; + + DragDropMode nDragDropMode; + DragDropMode nOldDragMode; + SelectionMode eSelMode; + sal_Int32 nMinWidthInChars; + + sal_Int8 mnDragAction; + + SvTreeListEntry* pEdEntry; + SvLBoxItem* pEdItem; + + rtl::Reference m_xTransferHelper; + +protected: + std::unique_ptr pImpl; + short nColumns; + short nEntryHeight; + short nEntryWidth; + bool mbCenterAndClipText; + + Link aDoubleClickHdl; + SvTreeListEntry* pTargetEntry; + SvLBoxButtonData* pCheckButtonData; + std::vector> aTabs; + SvTreeFlags nTreeFlags; + SvTreeListBoxFlags nImpFlags; + // Move/CopySelection: Position of the current Entry in SelectionList + sal_uInt16 nCurEntrySelPos; + +private: + DECL_DLLPRIVATE_LINK( CheckButtonClick, SvLBoxButtonData *, void ); + DECL_DLLPRIVATE_LINK( TextEditEndedHdl_Impl, SvInplaceEdit2&, void ); + // Handler that is called by TreeList to clone an Entry + DECL_DLLPRIVATE_LINK( CloneHdl_Impl, SvTreeListEntry*, SvTreeListEntry* ); + + // Handler and methods for Drag - finished handler. + // The Handle retrieved by GetDragFinishedHdl can be set on the + // TransferDataContainer. This link is a callback for the DragFinished + // call. The AddBox method is called from the GetDragFinishedHdl() and the + // remove is called in the link callback and in the dtor. So it can't be + // called for a deleted object. + VCL_DLLPRIVATE static void AddBoxToDDList_Impl( const SvTreeListBox& rB ); + VCL_DLLPRIVATE static void RemoveBoxFromDDList_Impl( const SvTreeListBox& rB ); + DECL_DLLPRIVATE_LINK( DragFinishHdl_Impl, sal_Int8, void ); + + // after a checkbox entry is inserted, use this to get its width to support + // autowidth for the 1st checkbox column + VCL_DLLPRIVATE void CheckBoxInserted(SvTreeListEntry* pEntry); + + VCL_DLLPRIVATE void DrawCustomEntry(vcl::RenderContext& rRenderContext, const tools::Rectangle& rRect, const SvTreeListEntry& rEntry); + VCL_DLLPRIVATE Size MeasureCustomEntry(vcl::RenderContext& rRenderContext, const SvTreeListEntry& rEntry); + + /** Handles the given key event. + + At the moment this merely does typeahead if typeahead is enabled. + + @return + if the event has been consumed, otherwise. + */ + VCL_DLLPRIVATE bool HandleKeyInput(const KeyEvent& rKEvt); + + void UnsetDropTarget(); + +protected: + + bool CheckDragAndDropMode( SvTreeListBox const * pSource, sal_Int8 ); + void ImplShowTargetEmphasis( SvTreeListEntry* pEntry, bool bShow); + void EnableSelectionAsDropTarget( bool bEnable = true ); + // Standard impl returns 0; derived classes which support D'n'D must override + using Window::GetDropTarget; + virtual SvTreeListEntry* GetDropTarget( const Point& ); + + // Invalidate children on enable/disable + virtual void StateChanged( StateChangedType eType ) override; + + virtual sal_uLong Insert( SvTreeListEntry* pEnt,SvTreeListEntry* pPar,sal_uLong nPos=TREELIST_APPEND); + virtual sal_uLong Insert( SvTreeListEntry* pEntry,sal_uLong nRootPos = TREELIST_APPEND ); + + // In-place editing + std::unique_ptr pEdCtrl; + void EditText( const OUString&, const tools::Rectangle&,const Selection&); + void CancelTextEditing(); + + // InitViewData is called right after CreateViewData + // The Entry is has not yet been added to the View in InitViewData! + virtual void InitViewData( SvViewDataEntry*, SvTreeListEntry* pEntry ) override; + // Calls InitViewData for all Items + void RecalcViewData(); + + // Handler and methods for Drag - finished handler. This link can be set + // to the TransferDataContainer. The AddBox/RemoveBox methods must be + // called before the StartDrag call. + // The Remove will be called from the handler, which then calls DragFinish. + // The Remove is also called in the DTOR of the SvTreeListBox - + // so it can't be called for a deleted object. + Link GetDragFinishedHdl() const; + + // For asynchronous D'n'D + sal_Int8 ExecuteDrop( const ExecuteDropEvent& rEvt, SvTreeListBox* pSourceView ); + + void OnCurrentEntryChanged(); + + // ISearchableStringList + virtual vcl::StringEntryIdentifier CurrentEntry( OUString& _out_entryText ) const override; + virtual vcl::StringEntryIdentifier NextEntry( vcl::StringEntryIdentifier _currentEntry, OUString& _out_entryText ) const override; + virtual void SelectEntry( vcl::StringEntryIdentifier _entry ) override; + +public: + + SvTreeListBox( vcl::Window* pParent, WinBits nWinStyle=0 ); + virtual ~SvTreeListBox() override; + virtual void dispose() override; + + SvTreeList* GetModel() const + { + return pModel.get(); + } + + sal_uLong GetEntryCount() const + { + return pModel ? pModel->GetEntryCount() : 0; + } + SvTreeListEntry* First() const + { + return pModel ? pModel->First() : nullptr; + } + SvTreeListEntry* Next( SvTreeListEntry* pEntry ) const + { + return pModel->Next(pEntry); + } + SvTreeListEntry* Prev( SvTreeListEntry* pEntry ) const + { + return pModel->Prev(pEntry); + } + SvTreeListEntry* Last() const + { + return pModel ? pModel->Last() : nullptr; + } + + SvTreeListEntry* FirstChild( SvTreeListEntry* pParent ) const; + + bool CopySelection( SvTreeListBox* pSource, SvTreeListEntry* pTarget ); + bool MoveSelectionCopyFallbackPossible( SvTreeListBox* pSource, SvTreeListEntry* pTarget, bool bAllowCopyFallback ); + void RemoveSelection(); + /** + * Removes the entry along with all of its descendants + */ + void RemoveEntry(SvTreeListEntry const * pEntry); + + DragDropMode GetDragDropMode() const { return nDragDropMode; } + SelectionMode GetSelectionMode() const { return eSelMode; } + + // pParent == 0 -> Root level + SvTreeListEntry* GetEntry( SvTreeListEntry* pParent, sal_uLong nPos ) const; + SvTreeListEntry* GetEntry( sal_uLong nRootPos ) const; + + SvTreeListEntry* GetEntryFromPath( const ::std::deque< sal_Int32 >& _rPath ) const; + void FillEntryPath( SvTreeListEntry* pEntry, ::std::deque< sal_Int32 >& _rPath ) const; + + using Window::GetParent; + SvTreeListEntry* GetParent( SvTreeListEntry* pEntry ) const; + SvTreeListEntry* GetRootLevelParent(SvTreeListEntry* pEntry ) const; + + using Window::GetChildCount; + sal_uLong GetChildCount( SvTreeListEntry const * pParent ) const; + sal_uLong GetLevelChildCount( SvTreeListEntry* pParent ) const; + + SvViewDataEntry* GetViewDataEntry( SvTreeListEntry const * pEntry ) const; + SvViewDataItem* GetViewDataItem(SvTreeListEntry const *, SvLBoxItem const *); + const SvViewDataItem* GetViewDataItem(const SvTreeListEntry*, const SvLBoxItem*) const; + + bool IsInplaceEditingEnabled() const { return bool(nImpFlags & SvTreeListBoxFlags::EDT_ENABLED); } + bool IsEditingActive() const { return bool(nImpFlags & SvTreeListBoxFlags::IN_EDT); } + void EndEditing( bool bCancel = false ); + + void Clear(); + + bool TextCenterAndClipEnabled() const { return mbCenterAndClipText; } + + void SetSelectHdl( const Link& rNewHdl ) {aSelectHdl=rNewHdl; } + void SetDeselectHdl( const Link& rNewHdl ) {aDeselectHdl=rNewHdl; } + void SetDoubleClickHdl(const Link& rNewHdl) {aDoubleClickHdl=rNewHdl;} + void SetExpandingHdl(const Link& rNewHdl){aExpandingHdl=rNewHdl;} + void SetExpandedHdl(const Link& rNewHdl){aExpandedHdl=rNewHdl;} + void SetPopupMenuHdl(const Link& rLink) { aPopupMenuHdl = rLink; } + void SetTooltipHdl(const Link& rLink) { aTooltipHdl = rLink; } + void SetCustomRenderHdl(const Link& rLink) { aCustomRenderHdl = rLink; } + void SetCustomMeasureHdl(const Link& rLink) { aCustomMeasureHdl = rLink; } + + void ExpandedHdl(); + bool ExpandingHdl(); + virtual void SelectHdl(); + virtual void DeselectHdl(); + virtual bool DoubleClickHdl(); + SvTreeListEntry* GetHdlEntry() const { return pHdlEntry; } + + // Is called for an Entry that gets expanded with the Flag + // ENTRYFLAG_CHILDREN_ON_DEMAND set. + virtual void RequestingChildren( SvTreeListEntry* pParent ); + + // Drag & Drop + // New D'n'D API + virtual sal_Int8 AcceptDrop( const AcceptDropEvent& rEvt ) override; + virtual sal_Int8 ExecuteDrop( const ExecuteDropEvent& rEvt ) override; + virtual void StartDrag( sal_Int8 nAction, const Point& rPosPixel ) override; + virtual DragDropMode NotifyStartDrag( TransferDataContainer& rData, + SvTreeListEntry* ); + virtual void DragFinished( sal_Int8 nDropAction ); + + SvTreeListEntry* CloneEntry( SvTreeListEntry* pSource ); + + // Return value: TRISTATE_TRUE == Ok, TRISTATE_FALSE == Cancel, TRISTATE_INDET == Ok and Make visible moved entry + TriState NotifyMoving( + SvTreeListEntry* pTarget, // D'n'D DropPosition in GetModel() + SvTreeListEntry* pEntry, // Entry to be moved from GetSourceListBox()->GetModel() + SvTreeListEntry*& rpNewParent, // New TargetParent + sal_uLong& rNewChildPos); // The TargetParent's position in Childlist + + // Return value: TRISTATE_TRUE == Ok, TRISTATE_FALSE == Cancel, TRISTATE_INDET == Ok and Make visible moved entry + TriState NotifyCopying( + SvTreeListEntry* pTarget, // D'n'D DropPosition in GetModel() + SvTreeListEntry* pEntry, // Entry to be copied from GetSourceListBox()->GetModel() + SvTreeListEntry*& rpNewParent, // New TargetParent + sal_uLong& rNewChildPos); // The TargetParent's position in Childlist + + // ACCESSIBILITY ========================================================== + + /** Creates and returns the accessible object of the Box. */ + virtual css::uno::Reference< css::accessibility::XAccessible > CreateAccessible() override; + + /** Fills the StateSet of one entry. */ + void FillAccessibleEntryStateSet( SvTreeListEntry* pEntry, ::utl::AccessibleStateSetHelper& rStateSet ) const; + + /** Calculate and return the bounding rectangle of an entry. + @param pEntry + The entry. + @return The bounding rectangle of an entry. */ + tools::Rectangle GetBoundingRect(const SvTreeListEntry* pEntry); + + SvTreeFlags GetTreeFlags() const {return nTreeFlags;} + + static OUString SearchEntryTextWithHeadTitle(SvTreeListEntry* pEntry); + + void set_min_width_in_chars(sal_Int32 nChars); + + virtual bool set_property(const OString &rKey, const OUString &rValue) override; + +protected: + + VCL_DLLPRIVATE void SetEntryHeight( SvTreeListEntry const * pEntry ); + void AdjustEntryHeight( const Image& rBmp ); + VCL_DLLPRIVATE void AdjustEntryHeight(); + + VCL_DLLPRIVATE void ImpEntryInserted( SvTreeListEntry* pEntry ); + VCL_DLLPRIVATE void PaintEntry1( SvTreeListEntry&, long nLine, vcl::RenderContext& rRenderContext ); + + VCL_DLLPRIVATE void InitTreeView(); + VCL_DLLPRIVATE SvLBoxItem* GetItem_Impl( SvTreeListEntry*, long nX, SvLBoxTab** ppTab ); + VCL_DLLPRIVATE void ImplInitStyle(); + + void SetupDragOrigin(); + void EditItemText( SvTreeListEntry* pEntry, SvLBoxString* pItem, + const Selection& ); + void EditedText(const OUString&); + + // Recalculate all tabs depending on TreeListStyle and Bitmap sizes + // Is called automatically when inserting/changing Bitmaps, changing the Model etc. + virtual void SetTabs(); + void AddTab( long nPos, SvLBoxTabFlags nFlags ); + sal_uInt16 TabCount() const { return aTabs.size(); } + SvLBoxTab* GetFirstDynamicTab() const; + SvLBoxTab* GetFirstDynamicTab( sal_uInt16& rTabPos ) const; + SvLBoxTab* GetFirstTab( SvLBoxTabFlags nFlagMask, sal_uInt16& rTabPos ); + void GetLastTab( SvLBoxTabFlags nFlagMask, sal_uInt16& rTabPos ); + SvLBoxTab* GetTab( SvTreeListEntry const *, SvLBoxItem const * ) const; + void ClearTabList(); + + virtual void InitEntry(SvTreeListEntry*, const OUString&, const Image&, const Image&); + + void NotifyScrolled(); + void SetScrolledHdl( const Link& rLink ) { aScrolledHdl = rLink; } + long GetXOffset() const { return GetMapMode().GetOrigin().X(); } + + virtual void Command( const CommandEvent& rCEvt ) override; + + virtual void RequestHelp( const HelpEvent& rHEvt ) override; + virtual void PreparePaint(vcl::RenderContext& rRenderContext, SvTreeListEntry& rEntry); + virtual void DataChanged( const DataChangedEvent& rDCEvt ) override; + + void InitSettings(); + + virtual void ApplySettings(vcl::RenderContext& rRenderContext) override; + + void CallImplEventListeners(VclEventId nEvent, void* pData); + + void ImplEditEntry( SvTreeListEntry* pEntry ); + + void AdjustEntryHeightAndRecalc(); + + // true if rPos is over the SvTreeListBox body, i.e. not over a + // scrollbar + VCL_DLLPRIVATE bool PosOverBody(const Point& rPos) const; +public: + + void SetNoAutoCurEntry( bool b ); + + void EnableCheckButton( SvLBoxButtonData* ); + void SetCheckButtonData( SvLBoxButtonData* ); + void SetNodeBitmaps( const Image& rCollapsedNodeBmp, const Image& rExpandedNodeBmp ); + + /** Returns the default image which clients should use for expanded nodes, to have a consistent user + interface experience in the whole product. + */ + static const Image& GetDefaultExpandedNodeImage( ); + + /** Returns the default image which clients should use for expanded nodes, to have a consistent user + interface experience in the whole product. + */ + static const Image& GetDefaultCollapsedNodeImage( ); + + /** Sets default bitmaps for collapsed and expanded nodes. + */ + void SetNodeDefaultImages( ) + { + SetNodeBitmaps( + GetDefaultCollapsedNodeImage( ), + GetDefaultExpandedNodeImage( ) + ); + } + + virtual SvTreeListEntry* InsertEntry( const OUString& rText, SvTreeListEntry* pParent = nullptr, + bool bChildrenOnDemand = false, + sal_uLong nPos=TREELIST_APPEND, void* pUserData = nullptr); + + virtual SvTreeListEntry* InsertEntry( const OUString& rText, + const Image& rExpandedEntryBmp, + const Image& rCollapsedEntryBmp, + SvTreeListEntry* pParent = nullptr, + bool bChildrenOnDemand = false, + sal_uLong nPos = TREELIST_APPEND, void* pUserData = nullptr ); + + const Image& GetDefaultExpandedEntryBmp( ) const; + const Image& GetDefaultCollapsedEntryBmp( ) const; + + void SetDefaultExpandedEntryBmp( const Image& rBmp ); + void SetDefaultCollapsedEntryBmp( const Image& rBmp ); + + void SetCheckButtonState( SvTreeListEntry*, SvButtonState ); + SvButtonState GetCheckButtonState( SvTreeListEntry* ) const; + + void SetEntryText(SvTreeListEntry*, const OUString& ); + void SetExpandedEntryBmp( SvTreeListEntry* _pEntry, const Image& _rImage ); + void SetCollapsedEntryBmp( SvTreeListEntry* _pEntry, const Image& _rImage ); + + virtual OUString GetEntryText( SvTreeListEntry* pEntry ) const; + static const Image& GetExpandedEntryBmp(const SvTreeListEntry* _pEntry ); + static const Image& GetCollapsedEntryBmp(const SvTreeListEntry* _pEntry ); + + virtual void CheckButtonHdl(); + + void SetSublistOpenWithLeftRight(); // open/close sublist with cursor left/right + + void EnableInplaceEditing( bool bEnable ); + // Edits the Entry's first StringItem, 0 == Cursor + void EditEntry( SvTreeListEntry* pEntry ); + virtual bool EditingEntry( SvTreeListEntry* pEntry, Selection& ); + virtual bool EditedEntry( SvTreeListEntry* pEntry, const OUString& rNewText ); + + virtual void Paint( vcl::RenderContext& rRenderContext, const tools::Rectangle& rRect ) override; + virtual void MouseButtonDown( const MouseEvent& rMEvt ) override; + virtual void MouseButtonUp( const MouseEvent& rMEvt ) override; + virtual void MouseMove( const MouseEvent& rMEvt ) override; + virtual void KeyInput( const KeyEvent& rKEvt ) override; + virtual void Resize() override; + virtual void GetFocus() override; + virtual void LoseFocus() override; + void SetUpdateMode( bool ); + + virtual void ModelHasCleared() override; + virtual void ModelHasInserted( SvTreeListEntry* pEntry ) override; + virtual void ModelHasInsertedTree( SvTreeListEntry* pEntry ) override; + virtual void ModelIsMoving(SvTreeListEntry* pSource ) override; + virtual void ModelHasMoved(SvTreeListEntry* pSource ) override; + virtual void ModelIsRemoving( SvTreeListEntry* pEntry ) override; + virtual void ModelHasRemoved( SvTreeListEntry* pEntry ) override; + void ModelHasEntryInvalidated( SvTreeListEntry* pEntry ) override; + + void ScrollOutputArea( short nDeltaEntries ); + + short GetColumnsCount() const { return nColumns; } + short GetEntryHeight() const { return nEntryHeight; } + void SetEntryHeight( short nHeight ); + short GetEntryWidth() const { return nEntryWidth; } + void SetEntryWidth( short nWidth ); + Size GetOutputSizePixel() const; + short GetIndent() const { return nIndent; } + void SetSpaceBetweenEntries( short nSpace ); + Point GetEntryPosition(const SvTreeListEntry*) const; + void MakeVisible( SvTreeListEntry* pEntry ); + void MakeVisible( SvTreeListEntry* pEntry, bool bMoveToTop ); + + void SetCollapsedNodeBmp( const Image& ); + void SetExpandedNodeBmp( const Image& ); + Image const & GetExpandedNodeBmp( ) const; + + void SetFont( const vcl::Font& rFont ); + + using Window::SetCursor; + void SetCursor( SvTreeListEntry* pEntry, bool bForceNoSelect = false ); + + SvTreeListEntry* GetEntry( const Point& rPos, bool bHit = false ) const; + + virtual tools::Rectangle GetFocusRect(const SvTreeListEntry*, long nLine ); + // Respects indentation + sal_IntPtr GetTabPos(const SvTreeListEntry*, SvLBoxTab*); + void InvalidateEntry( SvTreeListEntry* ); + SvLBoxItem* GetItem( SvTreeListEntry*, long nX, SvLBoxTab** ppTab); + SvLBoxItem* GetItem( SvTreeListEntry*, long nX ); + + void SetDragDropMode( DragDropMode ); + void SetSelectionMode( SelectionMode ); + + bool Expand( SvTreeListEntry* pParent ); + bool Collapse( SvTreeListEntry* pParent ); + bool Select( SvTreeListEntry* pEntry, bool bSelect=true ); + sal_uLong SelectChildren( SvTreeListEntry* pParent, bool bSelect ); + void SelectAll( bool bSelect ); + + void SetCurEntry( SvTreeListEntry* _pEntry ); + SvTreeListEntry* GetCurEntry() const; + + using Window::Invalidate; + virtual void Invalidate( InvalidateFlags nFlags = InvalidateFlags::NONE) override; + virtual void Invalidate( const tools::Rectangle&, InvalidateFlags nFlags = InvalidateFlags::NONE ) override; + + void SetHighlightRange(sal_uInt16 nFirstTab=0, sal_uInt16 nLastTab=0xffff); + + sal_Int32 DefaultCompare(const SvLBoxString* pLeftText, const SvLBoxString* pRightText); + + DECL_LINK( DefaultCompare, const SvSortData&, sal_Int32 ); + virtual void ModelNotification( SvListAction nActionId, SvTreeListEntry* pEntry1, + SvTreeListEntry* pEntry2, sal_uLong nPos ) override; + + void EndSelection(); + + SvTreeListEntry* GetFirstEntryInView() const; + SvTreeListEntry* GetNextEntryInView(SvTreeListEntry*) const; + void ScrollToAbsPos( long nPos ); + + void ShowFocusRect( const SvTreeListEntry* pEntry ); + + virtual VclPtr CreateContextMenu(); + + void EnableContextMenuHandling(); + + long getPreferredDimensions(std::vector &rWidths) const; + + virtual Size GetOptimalSize() const override; + + void SetAlternatingRowColors( const bool bEnable ); + + // Enables type-ahead search in the check list box. + void SetQuickSearch(bool bEnable) { mbQuickSearch = bEnable; } + + // Make single click "activate" a row like a double-click normally does + void SetActivateOnSingleClick(bool bEnable) { mbActivateOnSingleClick = bEnable; } + + // Make mouse over a row "select" a row like a single-click normally does + void SetHoverSelection(bool bEnable) { mbHoverSelection = bEnable; } + bool GetHoverSelection() const { return mbHoverSelection; } + + void SetForceMakeVisible(bool bEnable); + + virtual FactoryFunction GetUITestFactory() const override; + + void SetDragHelper(rtl::Reference& rHelper, sal_uInt8 eDNDConstants); +}; + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/include/vcl/toolkit/treelistentries.hxx b/include/vcl/toolkit/treelistentries.hxx new file mode 100644 index 000000000000..fdd86dbfaf5f --- /dev/null +++ b/include/vcl/toolkit/treelistentries.hxx @@ -0,0 +1,23 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ + +#pragma once + +#if !defined(VCL_DLLIMPLEMENTATION) && !defined(TOOLKIT_DLLIMPLEMENTATION) \ + && !defined(VCL_INTERNALS) +#error "don't use this in new code" +#endif + +#include +#include + +class SvTreeListEntry; +typedef std::vector> SvTreeListEntries; + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/include/vcl/toolkit/treelistentry.hxx b/include/vcl/toolkit/treelistentry.hxx new file mode 100644 index 000000000000..dbfa87b204ac --- /dev/null +++ b/include/vcl/toolkit/treelistentry.hxx @@ -0,0 +1,132 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#pragma once + +#if !defined(VCL_DLLIMPLEMENTATION) && !defined(TOOLKIT_DLLIMPLEMENTATION) && !defined(VCL_INTERNALS) +#error "don't use this in new code" +#endif + +#include +#include +#include +#include +#include +#include + +#include +#include +#include + +// flags related to the model +enum class SvTLEntryFlags +{ + NONE = 0x0000, + CHILDREN_ON_DEMAND = 0x0001, + DISABLE_DROP = 0x0002, + // is set if RequestingChildren has not set any children + NO_NODEBMP = 0x0004, + // is set if this is a separator line + IS_SEPARATOR = 0x0008, + // entry had or has children + HAD_CHILDREN = 0x0010, + SEMITRANSPARENT = 0x8000, // draw semi-transparent entry bitmaps +}; +namespace o3tl +{ + template<> struct typed_flags : is_typed_flags {}; +} + +class VCL_DLLPUBLIC SvTreeListEntry +{ + friend class SvTreeList; + friend class SvListView; + friend class SvTreeListBox; + + typedef std::vector> ItemsType; + + SvTreeListEntry* pParent; + SvTreeListEntries m_Children; + sal_uLong nAbsPos; + sal_uLong nListPos; + sal_uInt32 mnExtraIndent; + ItemsType m_Items; + void* pUserData; + SvTLEntryFlags nEntryFlags; + Color maBackColor; + std::optional mxTextColor; + +private: + void ClearChildren(); + void SetListPositions(); + void InvalidateChildrensListPositions(); + + SvTreeListEntry(const SvTreeListEntry& r) = delete; + void operator=(SvTreeListEntry const&) = delete; + +public: + static const size_t ITEM_NOT_FOUND = SAL_MAX_SIZE; + + SvTreeListEntry(); + virtual ~SvTreeListEntry(); + + bool HasChildren() const; + bool HasChildListPos() const; + sal_uLong GetChildListPos() const; + + SvTreeListEntries& GetChildEntries() { return m_Children; } + const SvTreeListEntries& GetChildEntries() const { return m_Children; } + + void Clone(SvTreeListEntry* pSource); + + size_t ItemCount() const; + + // MAY ONLY BE CALLED IF THE ENTRY HAS NOT YET BEEN INSERTED INTO + // THE MODEL, AS OTHERWISE NO VIEW-DEPENDENT DATA ARE ALLOCATED + // FOR THE ITEM! + void AddItem(std::unique_ptr pItem); + void ReplaceItem(std::unique_ptr pNewItem, size_t nPos); + const SvLBoxItem& GetItem( size_t nPos ) const; + SvLBoxItem& GetItem( size_t nPos ); + const SvLBoxItem* GetFirstItem(SvLBoxItemType eType) const; + SvLBoxItem* GetFirstItem(SvLBoxItemType eType); + size_t GetPos( const SvLBoxItem* pItem ) const; + void* GetUserData() const { return pUserData;} + void SetUserData( void* pPtr ); + void EnableChildrenOnDemand( bool bEnable=true ); + bool HasChildrenOnDemand() const; + + SvTLEntryFlags GetFlags() const { return nEntryFlags;} + void SetFlags( SvTLEntryFlags nFlags ); + + void SetBackColor( const Color& rColor ) { maBackColor = rColor; } + const Color& GetBackColor() const { return maBackColor; } + + void SetTextColor( std::optional xColor ) { mxTextColor = xColor; } + std::optional const & GetTextColor() const { return mxTextColor; } + + void SetExtraIndent(sal_uInt32 nExtraIndent) { mnExtraIndent = nExtraIndent; } + sal_uInt32 GetExtraIndent() const { return mnExtraIndent; } + + SvTreeListEntry* NextSibling() const; + SvTreeListEntry* PrevSibling() const; + SvTreeListEntry* LastSibling() const; +}; + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/include/vcl/toolkit/viewdataentry.hxx b/include/vcl/toolkit/viewdataentry.hxx new file mode 100644 index 000000000000..daac693d8893 --- /dev/null +++ b/include/vcl/toolkit/viewdataentry.hxx @@ -0,0 +1,86 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#pragma once + +#if !defined(VCL_DLLIMPLEMENTATION) && !defined(TOOLKIT_DLLIMPLEMENTATION) && !defined(VCL_INTERNALS) +#error "don't use this in new code" +#endif + +#include + +#include + +class SvTreeListBox; + +struct SvViewDataItem +{ + int mnWidth = 0; + int mnHeight = 0; +}; + +/** + * View-dependent data for a tree list entry created in the virtual function + * SvTreeListBox::CreateViewData(). The item array contains the same number + * of items as that of the items in its corresponding tree list entry. + * + * When an entry is selected, it is logically selected and visually + * highlighted. When an entry is only highlighted, it looks visually + * highlighted, but not logically selected. + */ +class SvViewDataEntry +{ + friend class SvTreeList; + + std::vector maItems; + sal_uLong nVisPos; + bool mbSelected:1; + bool mbHighlighted:1; + bool mbExpanded:1; + bool mbFocused:1; + bool mbSelectable:1; + bool mbDragTarget:1; + +public: + SvViewDataEntry(); + SvViewDataEntry( const SvViewDataEntry& ); + ~SvViewDataEntry(); + + bool IsSelected() const { return mbSelected;} + bool IsHighlighted() const { return mbHighlighted;} + bool IsExpanded() const { return mbExpanded;} + bool HasFocus() const { return mbFocused;} + bool IsSelectable() const { return mbSelectable;} + bool IsDragTarget() const { return mbDragTarget;} + void SetFocus( bool bFocus ); + void SetSelected( bool bSelected ); + void SetExpanded( bool bExpanded ); + void SetSelectable( bool bSelectable ); + void SetDragTarget( bool bDragTarget ) + { + mbDragTarget = bDragTarget; + } + + void Init(size_t nSize); + + const SvViewDataItem& GetItem(size_t nPos) const; + SvViewDataItem& GetItem(size_t nPos); +}; + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/include/vcl/treelist.hxx b/include/vcl/treelist.hxx deleted file mode 100644 index 50698ec2b68b..000000000000 --- a/include/vcl/treelist.hxx +++ /dev/null @@ -1,301 +0,0 @@ -/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ -/* - * This file is part of the LibreOffice project. - * - * This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. - * - * This file incorporates work covered by the following license notice: - * - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed - * with this work for additional information regarding copyright - * ownership. The ASF licenses this file to you under the Apache - * License, Version 2.0 (the "License"); you may not use this file - * except in compliance with the License. You may obtain a copy of - * the License at http://www.apache.org/licenses/LICENSE-2.0 . - */ - -#ifndef INCLUDED_VCL_TREELIST_HXX -#define INCLUDED_VCL_TREELIST_HXX - -#include -#include - -#include -#include -#include - -#include - -enum class SvListAction -{ - INSERTED = 1, - REMOVING = 2, - REMOVED = 3, - MOVING = 4, - MOVED = 5, - CLEARING = 6, - INSERTED_TREE = 7, - INVALIDATE_ENTRY = 8, - RESORTING = 9, - RESORTED = 10, - CLEARED = 11 -}; - -class SvTreeListEntry; -class SvListView; -class SvViewDataEntry; - -enum SvSortMode { SortAscending, SortDescending, SortNone }; - -// For the return values of Sortlink: -// See International::Compare( pLeft, pRight ) -// ( Compare(a,b) ==> b.Compare(a) ==> strcmp(a,b) ) -struct SvSortData -{ - const SvTreeListEntry* pLeft; - const SvTreeListEntry* pRight; -}; - -class VCL_DLLPUBLIC SvTreeList final -{ - friend class SvListView; - - SvListView& mrOwnerListView; - sal_uLong nEntryCount; - - Link aCloneLink; - Link aCompareLink; - SvSortMode eSortMode; - - bool bAbsPositionsValid; - - bool mbEnableInvalidate; - - SvTreeListEntry* FirstVisible() const { return First(); } - SvTreeListEntry* NextVisible( const SvListView*,SvTreeListEntry* pEntry, sal_uInt16* pDepth=nullptr ) const; - SvTreeListEntry* PrevVisible( const SvListView*,SvTreeListEntry* pEntry ) const; - SvTreeListEntry* LastVisible( const SvListView* ) const; - SvTreeListEntry* NextVisible( const SvListView*,SvTreeListEntry* pEntry, sal_uInt16& rDelta ) const; - SvTreeListEntry* PrevVisible( const SvListView*,SvTreeListEntry* pEntry, sal_uInt16& rDelta ) const; - - bool IsEntryVisible( const SvListView*,SvTreeListEntry* pEntry ) const; - SvTreeListEntry* GetEntryAtVisPos( const SvListView*,sal_uLong nVisPos ) const; - sal_uLong GetVisiblePos( const SvListView*,SvTreeListEntry const * pEntry ) const; - sal_uLong GetVisibleCount( SvListView* ) const; - sal_uLong GetVisibleChildCount( const SvListView*,SvTreeListEntry* pParent ) const; - - SvTreeListEntry* FirstSelected( const SvListView*) const; - SvTreeListEntry* NextSelected( const SvListView*,SvTreeListEntry* pEntry ) const; - - sal_uLong GetChildSelectionCount( const SvListView*,SvTreeListEntry* pParent ) const; - - VCL_DLLPRIVATE void SetAbsolutePositions(); - - VCL_DLLPRIVATE void CloneChildren( - SvTreeListEntries& rDst, sal_uLong& rCloneCount, SvTreeListEntries& rSrc, SvTreeListEntry& rNewParent) const; - - /** - * Invalidate the cached position data to have them re-generated before - * the next access. - */ - VCL_DLLPRIVATE static void SetListPositions( SvTreeListEntries& rEntries ); - - // rPos is not changed for SortModeNone - VCL_DLLPRIVATE void GetInsertionPos( - SvTreeListEntry const * pEntry, - SvTreeListEntry* pParent, - sal_uLong& rPos - ); - - VCL_DLLPRIVATE void ResortChildren( SvTreeListEntry* pParent ); - - SvTreeList(const SvTreeList&) = delete; - SvTreeList& operator= (const SvTreeList&) = delete; - - std::unique_ptr pRootItem; - -public: - - SvTreeList() = delete; - SvTreeList(SvListView&); - ~SvTreeList(); - - void Broadcast( - SvListAction nActionId, - SvTreeListEntry* pEntry1=nullptr, - SvTreeListEntry* pEntry2=nullptr, - sal_uLong nPos=0 - ); - - void EnableInvalidate( bool bEnable ); - - // Notify all Listeners - void InvalidateEntry( SvTreeListEntry* ); - - sal_uLong GetEntryCount() const { return nEntryCount; } - SvTreeListEntry* First() const; - SvTreeListEntry* Next( SvTreeListEntry* pEntry, sal_uInt16* pDepth=nullptr ) const; - SvTreeListEntry* Prev( SvTreeListEntry* pEntry ) const; - SvTreeListEntry* Last() const; - - SvTreeListEntry* FirstChild( SvTreeListEntry* pParent ) const; - - sal_uLong Insert( SvTreeListEntry* pEntry,SvTreeListEntry* pPar,sal_uLong nPos = TREELIST_APPEND); - sal_uLong Insert( SvTreeListEntry* pEntry,sal_uLong nRootPos = TREELIST_APPEND ) - { return Insert(pEntry, pRootItem.get(), nRootPos ); } - - void InsertTree( SvTreeListEntry* pTree, SvTreeListEntry* pTargetParent, sal_uLong nListPos ); - - // Entries need to be in the same Model! - void Move( SvTreeListEntry* pSource, SvTreeListEntry* pTarget ); - - // Creates ChildList if needed - sal_uLong Move( SvTreeListEntry* pSource, SvTreeListEntry* pTargetParent, sal_uLong nListPos); - sal_uLong Copy( SvTreeListEntry* pSource, SvTreeListEntry* pTargetParent, sal_uLong nListPos); - - bool Remove( const SvTreeListEntry* pEntry ); - void Clear(); - - bool HasChildren( const SvTreeListEntry* pEntry ) const; - bool HasParent( const SvTreeListEntry* pEntry ) const; - - bool IsChild(const SvTreeListEntry* pParent, const SvTreeListEntry* pChild) const; - SvTreeListEntry* GetEntry( SvTreeListEntry* pParent, sal_uLong nPos ) const; - SvTreeListEntry* GetEntry( sal_uLong nRootPos ) const; - SvTreeListEntry* GetEntryAtAbsPos( sal_uLong nAbsPos ) const; - - const SvTreeListEntry* GetParent( const SvTreeListEntry* pEntry ) const; - SvTreeListEntry* GetParent( SvTreeListEntry* pEntry ); - - SvTreeListEntry* GetRootLevelParent( SvTreeListEntry* pEntry ) const; - const SvTreeListEntries& GetChildList( SvTreeListEntry* pParent ) const; - SvTreeListEntries& GetChildList( SvTreeListEntry* pParent ); - - std::pair - GetChildIterators(SvTreeListEntry* pParent); - - sal_uLong GetAbsPos( const SvTreeListEntry* pEntry ) const; - static sal_uLong GetRelPos( const SvTreeListEntry* pChild ); - - sal_uLong GetChildCount( const SvTreeListEntry* pParent ) const; - sal_uInt16 GetDepth( const SvTreeListEntry* pEntry ) const; - bool IsAtRootDepth( const SvTreeListEntry* pEntry ) const; - - // The Model calls the Clone Link to clone Entries. - // Thus we do not need to derive from the Model if we derive from SvTreeListEntry. - // The Handler needs to return a SvTreeListEntry* - SvTreeListEntry* Clone( SvTreeListEntry* pEntry, sal_uLong& nCloneCount ) const; - void SetCloneLink( const Link& rLink ) - { aCloneLink=rLink; } - - const Link& GetCloneLink() const - { return aCloneLink; } - - SvTreeListEntry* CloneEntry( SvTreeListEntry* pSource ) const; // Calls the Clone Link - - void SetSortMode( SvSortMode eMode ) { eSortMode = eMode; } - SvSortMode GetSortMode() const { return eSortMode; } - sal_Int32 Compare(const SvTreeListEntry* pLeft, const SvTreeListEntry* pRight) const; - void SetCompareHdl( const Link& rLink ) { aCompareLink = rLink; } - void Resort(); -}; - -class VCL_DLLPUBLIC SvListView -{ - friend class SvTreeList; - - struct SAL_DLLPRIVATE Impl; - std::unique_ptr m_pImpl; - -protected: - std::unique_ptr pModel; - - void ExpandListEntry( SvTreeListEntry* pParent ); - void CollapseListEntry( SvTreeListEntry* pParent ); - bool SelectListEntry( SvTreeListEntry* pEntry, bool bSelect ); - -public: - SvListView(); // Sets the Model to 0 - void dispose(); - virtual ~SvListView(); - void Clear(); - virtual void ModelNotification( - SvListAction nActionId, - SvTreeListEntry* pEntry1, - SvTreeListEntry* pEntry2, - sal_uLong nPos - ); - - sal_uLong GetVisibleCount() const - { return pModel->GetVisibleCount( const_cast(this) ); } - - SvTreeListEntry* FirstVisible() const - { return pModel->FirstVisible(); } - - SvTreeListEntry* NextVisible( SvTreeListEntry* pEntry ) const - { return pModel->NextVisible(this,pEntry); } - - SvTreeListEntry* PrevVisible( SvTreeListEntry* pEntry ) const - { return pModel->PrevVisible(this,pEntry); } - - SvTreeListEntry* LastVisible() const - { return pModel->LastVisible(this); } - - SvTreeListEntry* NextVisible( SvTreeListEntry* pEntry, sal_uInt16& rDelta ) const - { return pModel->NextVisible(this,pEntry,rDelta); } - - SvTreeListEntry* PrevVisible( SvTreeListEntry* pEntry, sal_uInt16& rDelta ) const - { return pModel->PrevVisible(this,pEntry,rDelta); } - - sal_uLong GetSelectionCount() const; - - SvTreeListEntry* FirstSelected() const - { return pModel->FirstSelected(this); } - - SvTreeListEntry* NextSelected( SvTreeListEntry* pEntry ) const - { return pModel->NextSelected(this,pEntry); } - - SvTreeListEntry* GetEntryAtAbsPos( sal_uLong nAbsPos ) const - { return pModel->GetEntryAtAbsPos(nAbsPos); } - - SvTreeListEntry* GetEntryAtVisPos( sal_uLong nVisPos ) const - { return pModel->GetEntryAtVisPos(this,nVisPos); } - - sal_uLong GetAbsPos( SvTreeListEntry const * pEntry ) const - { return pModel->GetAbsPos(pEntry); } - - sal_uLong GetVisiblePos( SvTreeListEntry const * pEntry ) const - { return pModel->GetVisiblePos(this,pEntry); } - - sal_uLong GetVisibleChildCount(SvTreeListEntry* pParent ) const - { return pModel->GetVisibleChildCount(this,pParent); } - - bool IsEntryVisible( SvTreeListEntry* pEntry ) const - { return pModel->IsEntryVisible(this,pEntry); } - - bool IsExpanded( SvTreeListEntry* pEntry ) const; - bool IsAllExpanded( SvTreeListEntry* pEntry) const; - bool IsSelected(const SvTreeListEntry* pEntry) const; - void SetEntryFocus( SvTreeListEntry* pEntry, bool bFocus ); - const SvViewDataEntry* GetViewData( const SvTreeListEntry* pEntry ) const; - SvViewDataEntry* GetViewData( SvTreeListEntry* pEntry ); - bool HasViewData() const; - - virtual void InitViewData( SvViewDataEntry*, SvTreeListEntry* pEntry ); - - virtual void ModelHasCleared(); - virtual void ModelHasInserted( SvTreeListEntry* pEntry ); - virtual void ModelHasInsertedTree( SvTreeListEntry* pEntry ); - virtual void ModelIsMoving( SvTreeListEntry* pSource ); - virtual void ModelHasMoved( SvTreeListEntry* pSource ); - virtual void ModelIsRemoving( SvTreeListEntry* pEntry ); - virtual void ModelHasRemoved( SvTreeListEntry* pEntry ); - virtual void ModelHasEntryInvalidated( SvTreeListEntry* pEntry ); -}; - -#endif - -/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/include/vcl/treelistbox.hxx b/include/vcl/treelistbox.hxx deleted file mode 100644 index 578d815c641b..000000000000 --- a/include/vcl/treelistbox.hxx +++ /dev/null @@ -1,703 +0,0 @@ -/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ -/* - * This file is part of the LibreOffice project. - * - * This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. - * - * This file incorporates work covered by the following license notice: - * - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed - * with this work for additional information regarding copyright - * ownership. The ASF licenses this file to you under the Apache - * License, Version 2.0 (the "License"); you may not use this file - * except in compliance with the License. You may obtain a copy of - * the License at http://www.apache.org/licenses/LICENSE-2.0 . - */ - -#ifndef INCLUDED_VCL_TREELISTBOX_HXX -#define INCLUDED_VCL_TREELISTBOX_HXX - -#include - -#include -#include -#include - -#include -#include -#include -#include -#include -#include -#include -#include -#include - -class SvTreeListBox; -class SvTreeListEntry; -struct SvViewDataItem; -class SvViewDataEntry; -class SvInplaceEdit2; -class SvLBoxString; -class SvImpLBox; -class SvLBoxButtonData; -class Timer; -class Edit; - -namespace utl { - class AccessibleStateSetHelper; -} - -enum class SvButtonState { Unchecked, Checked, Tristate }; - -// ********************************************************************* -// *************************** Tabulators ****************************** -// ********************************************************************* - -enum class SvLBoxTabFlags -{ - NONE = 0x0000, - DYNAMIC = 0x0001, // Item's output column changes according to the Child Depth - ADJUST_RIGHT = 0x0002, // Item's right margin at the tabulator - ADJUST_LEFT = 0x0004, // Left margin - ADJUST_CENTER = 0x0008, // Center the item at the tabulator - - SHOW_SELECTION = 0x0010, // Visualize selection state - // Item needs to be able to return the surrounding polygon (D'n'D cursor) - EDITABLE = 0x0020, // Item editable at the tabulator - FORCE = 0x0040, // Switch off the default calculation of the first tabulator - // (on which Abo Tabpage/Extras/Option/Customize, etc. rely on) - // The first tab's position corresponds precisely to the Flags set - // and column widths -}; -namespace o3tl -{ - template<> struct typed_flags : is_typed_flags {}; -} - -#define SV_TAB_BORDER 8 - -#define SV_ENTRYHEIGHTOFFS_PIXEL 2 - -enum class SvTreeFlags -{ - CHKBTN = 0x01, - USESEL = 0x02, - MANINS = 0x04, - RECALCTABS = 0x08, - FIXEDHEIGHT = 0x10, -}; -namespace o3tl -{ - template<> struct typed_flags : is_typed_flags {}; -} - -enum class SvLBoxItemType {String, Button, ContextBmp}; - -class SvLBoxTab -{ - long nPos; -public: - SvLBoxTab(); - SvLBoxTab( long nPos, SvLBoxTabFlags nFlags ); - SvLBoxTab( const SvLBoxTab& ); - ~SvLBoxTab(); - - SvLBoxTabFlags nFlags; - - bool IsDynamic() const { return bool(nFlags & SvLBoxTabFlags::DYNAMIC); } - void SetPos( long nNewPos) { nPos = nNewPos; } - long GetPos() const { return nPos; } - long CalcOffset( long nItemLength, long nTabWidth ); - bool IsEditable() const { return bool(nFlags & SvLBoxTabFlags::EDITABLE); } -}; - -class VCL_DLLPUBLIC SvLBoxItem -{ -protected: - bool mbDisabled; - -public: - SvLBoxItem(); - virtual ~SvLBoxItem(); - virtual SvLBoxItemType GetType() const = 0; - virtual int CalcWidth(const SvTreeListBox* pView) const; - int GetWidth(const SvTreeListBox* pView, const SvTreeListEntry* pEntry) const; - int GetWidth(const SvTreeListBox* pView, const SvViewDataEntry* pData, sal_uInt16 nItemPos); - int GetHeight(const SvTreeListBox* pView, const SvTreeListEntry* pEntry) const; - static int GetHeight(const SvViewDataEntry* pData, sal_uInt16 nItemPos); - void Enable(bool bEnabled) { mbDisabled = !bEnabled; } - - virtual void Paint(const Point& rPos, SvTreeListBox& rOutDev, vcl::RenderContext& rRenderContext, const SvViewDataEntry* pView, const SvTreeListEntry& rEntry) = 0; - - virtual void InitViewData(SvTreeListBox* pView, SvTreeListEntry* pEntry, - // If != 0: this Pointer must be used! - // If == 0: it needs to be retrieved via the View - SvViewDataItem* pViewData = nullptr) = 0; - // View-dependent data is not cloned - virtual std::unique_ptr Clone(SvLBoxItem const * pSource) const = 0; -}; - -enum class DragDropMode -{ - NONE = 0x0000, - CTRL_MOVE = 0x0001, - APP_COPY = 0x0004, - // Entries may be dropped via the uppermost Entry - // The DropTarget is 0 in that case - ENABLE_TOP = 0x0010, - ALL = 0x0015, -}; -namespace o3tl -{ - template<> struct typed_flags : is_typed_flags {}; -} - -enum class SvTreeListBoxFlags -{ - NONE = 0x0000, - IN_EDT = 0x0001, - EDT_ENABLED = 0x0002, - TARGEMPH_VIS = 0x0004, - EDTEND_CALLED = 0x0008, -}; -namespace o3tl -{ - template<> struct typed_flags : is_typed_flags {}; -} - -struct SvTreeListBoxImpl; - -typedef std::pair svtree_measure_args; -typedef std::tuple svtree_render_args; - -class VCL_DLLPUBLIC SvTreeListBox - :public Control - ,public SvListView - ,public DropTargetHelper - ,public DragSourceHelper - ,public vcl::ISearchableStringList -{ - friend class SvImpLBox; - friend class SvLBoxString; - friend class IconViewImpl; - friend class TreeControlPeer; - friend class SalInstanceIconView; - friend class SalInstanceTreeView; - friend class SalInstanceEntryTreeView; - - std::unique_ptr mpImpl; - Link aScrolledHdl; - Link aExpandedHdl; - Link aExpandingHdl; - Link aSelectHdl; - Link aDeselectHdl; - Link aPopupMenuHdl; - Link aTooltipHdl; - Link aCustomRenderHdl; - Link aCustomMeasureHdl; - - Image aPrevInsertedExpBmp; - Image aPrevInsertedColBmp; - Image aCurInsertedExpBmp; - Image aCurInsertedColBmp; - - short nContextBmpWidthMax; - short nEntryHeightOffs; - short nIndent; - short nFocusWidth; - sal_uInt16 nFirstSelTab; - sal_uInt16 nLastSelTab; - long mnCheckboxItemWidth; - bool mbContextBmpExpanded; - bool mbAlternatingRowColors; - bool mbUpdateAlternatingRows; - bool mbQuickSearch; // Enables type-ahead search in the check list box. - bool mbActivateOnSingleClick; // Make single click "activate" a row like a double-click normally does - bool mbHoverSelection; // Make mouse over a row "select" a row like a single-click normally does - - SvTreeListEntry* pHdlEntry; - - DragDropMode nDragDropMode; - DragDropMode nOldDragMode; - SelectionMode eSelMode; - sal_Int32 nMinWidthInChars; - - sal_Int8 mnDragAction; - - SvTreeListEntry* pEdEntry; - SvLBoxItem* pEdItem; - - rtl::Reference m_xTransferHelper; - -protected: - std::unique_ptr pImpl; - short nColumns; - short nEntryHeight; - short nEntryWidth; - bool mbCenterAndClipText; - - Link aDoubleClickHdl; - SvTreeListEntry* pTargetEntry; - SvLBoxButtonData* pCheckButtonData; - std::vector> aTabs; - SvTreeFlags nTreeFlags; - SvTreeListBoxFlags nImpFlags; - // Move/CopySelection: Position of the current Entry in SelectionList - sal_uInt16 nCurEntrySelPos; - -private: - DECL_DLLPRIVATE_LINK( CheckButtonClick, SvLBoxButtonData *, void ); - DECL_DLLPRIVATE_LINK( TextEditEndedHdl_Impl, SvInplaceEdit2&, void ); - // Handler that is called by TreeList to clone an Entry - DECL_DLLPRIVATE_LINK( CloneHdl_Impl, SvTreeListEntry*, SvTreeListEntry* ); - - // Handler and methods for Drag - finished handler. - // The Handle retrieved by GetDragFinishedHdl can be set on the - // TransferDataContainer. This link is a callback for the DragFinished - // call. The AddBox method is called from the GetDragFinishedHdl() and the - // remove is called in the link callback and in the dtor. So it can't be - // called for a deleted object. - VCL_DLLPRIVATE static void AddBoxToDDList_Impl( const SvTreeListBox& rB ); - VCL_DLLPRIVATE static void RemoveBoxFromDDList_Impl( const SvTreeListBox& rB ); - DECL_DLLPRIVATE_LINK( DragFinishHdl_Impl, sal_Int8, void ); - - // after a checkbox entry is inserted, use this to get its width to support - // autowidth for the 1st checkbox column - VCL_DLLPRIVATE void CheckBoxInserted(SvTreeListEntry* pEntry); - - VCL_DLLPRIVATE void DrawCustomEntry(vcl::RenderContext& rRenderContext, const tools::Rectangle& rRect, const SvTreeListEntry& rEntry); - VCL_DLLPRIVATE Size MeasureCustomEntry(vcl::RenderContext& rRenderContext, const SvTreeListEntry& rEntry); - - /** Handles the given key event. - - At the moment this merely does typeahead if typeahead is enabled. - - @return - if the event has been consumed, otherwise. - */ - VCL_DLLPRIVATE bool HandleKeyInput(const KeyEvent& rKEvt); - - void UnsetDropTarget(); - -protected: - - bool CheckDragAndDropMode( SvTreeListBox const * pSource, sal_Int8 ); - void ImplShowTargetEmphasis( SvTreeListEntry* pEntry, bool bShow); - void EnableSelectionAsDropTarget( bool bEnable = true ); - // Standard impl returns 0; derived classes which support D'n'D must override - using Window::GetDropTarget; - virtual SvTreeListEntry* GetDropTarget( const Point& ); - - // Invalidate children on enable/disable - virtual void StateChanged( StateChangedType eType ) override; - - virtual sal_uLong Insert( SvTreeListEntry* pEnt,SvTreeListEntry* pPar,sal_uLong nPos=TREELIST_APPEND); - virtual sal_uLong Insert( SvTreeListEntry* pEntry,sal_uLong nRootPos = TREELIST_APPEND ); - - // In-place editing - std::unique_ptr pEdCtrl; - void EditText( const OUString&, const tools::Rectangle&,const Selection&); - void CancelTextEditing(); - - // InitViewData is called right after CreateViewData - // The Entry is has not yet been added to the View in InitViewData! - virtual void InitViewData( SvViewDataEntry*, SvTreeListEntry* pEntry ) override; - // Calls InitViewData for all Items - void RecalcViewData(); - - // Handler and methods for Drag - finished handler. This link can be set - // to the TransferDataContainer. The AddBox/RemoveBox methods must be - // called before the StartDrag call. - // The Remove will be called from the handler, which then calls DragFinish. - // The Remove is also called in the DTOR of the SvTreeListBox - - // so it can't be called for a deleted object. - Link GetDragFinishedHdl() const; - - // For asynchronous D'n'D - sal_Int8 ExecuteDrop( const ExecuteDropEvent& rEvt, SvTreeListBox* pSourceView ); - - void OnCurrentEntryChanged(); - - // ISearchableStringList - virtual vcl::StringEntryIdentifier CurrentEntry( OUString& _out_entryText ) const override; - virtual vcl::StringEntryIdentifier NextEntry( vcl::StringEntryIdentifier _currentEntry, OUString& _out_entryText ) const override; - virtual void SelectEntry( vcl::StringEntryIdentifier _entry ) override; - -public: - - SvTreeListBox( vcl::Window* pParent, WinBits nWinStyle=0 ); - virtual ~SvTreeListBox() override; - virtual void dispose() override; - - SvTreeList* GetModel() const - { - return pModel.get(); - } - - sal_uLong GetEntryCount() const - { - return pModel ? pModel->GetEntryCount() : 0; - } - SvTreeListEntry* First() const - { - return pModel ? pModel->First() : nullptr; - } - SvTreeListEntry* Next( SvTreeListEntry* pEntry ) const - { - return pModel->Next(pEntry); - } - SvTreeListEntry* Prev( SvTreeListEntry* pEntry ) const - { - return pModel->Prev(pEntry); - } - SvTreeListEntry* Last() const - { - return pModel ? pModel->Last() : nullptr; - } - - SvTreeListEntry* FirstChild( SvTreeListEntry* pParent ) const; - - bool CopySelection( SvTreeListBox* pSource, SvTreeListEntry* pTarget ); - bool MoveSelectionCopyFallbackPossible( SvTreeListBox* pSource, SvTreeListEntry* pTarget, bool bAllowCopyFallback ); - void RemoveSelection(); - /** - * Removes the entry along with all of its descendants - */ - void RemoveEntry(SvTreeListEntry const * pEntry); - - DragDropMode GetDragDropMode() const { return nDragDropMode; } - SelectionMode GetSelectionMode() const { return eSelMode; } - - // pParent == 0 -> Root level - SvTreeListEntry* GetEntry( SvTreeListEntry* pParent, sal_uLong nPos ) const; - SvTreeListEntry* GetEntry( sal_uLong nRootPos ) const; - - SvTreeListEntry* GetEntryFromPath( const ::std::deque< sal_Int32 >& _rPath ) const; - void FillEntryPath( SvTreeListEntry* pEntry, ::std::deque< sal_Int32 >& _rPath ) const; - - using Window::GetParent; - SvTreeListEntry* GetParent( SvTreeListEntry* pEntry ) const; - SvTreeListEntry* GetRootLevelParent(SvTreeListEntry* pEntry ) const; - - using Window::GetChildCount; - sal_uLong GetChildCount( SvTreeListEntry const * pParent ) const; - sal_uLong GetLevelChildCount( SvTreeListEntry* pParent ) const; - - SvViewDataEntry* GetViewDataEntry( SvTreeListEntry const * pEntry ) const; - SvViewDataItem* GetViewDataItem(SvTreeListEntry const *, SvLBoxItem const *); - const SvViewDataItem* GetViewDataItem(const SvTreeListEntry*, const SvLBoxItem*) const; - - bool IsInplaceEditingEnabled() const { return bool(nImpFlags & SvTreeListBoxFlags::EDT_ENABLED); } - bool IsEditingActive() const { return bool(nImpFlags & SvTreeListBoxFlags::IN_EDT); } - void EndEditing( bool bCancel = false ); - - void Clear(); - - bool TextCenterAndClipEnabled() const { return mbCenterAndClipText; } - - void SetSelectHdl( const Link& rNewHdl ) {aSelectHdl=rNewHdl; } - void SetDeselectHdl( const Link& rNewHdl ) {aDeselectHdl=rNewHdl; } - void SetDoubleClickHdl(const Link& rNewHdl) {aDoubleClickHdl=rNewHdl;} - void SetExpandingHdl(const Link& rNewHdl){aExpandingHdl=rNewHdl;} - void SetExpandedHdl(const Link& rNewHdl){aExpandedHdl=rNewHdl;} - void SetPopupMenuHdl(const Link& rLink) { aPopupMenuHdl = rLink; } - void SetTooltipHdl(const Link& rLink) { aTooltipHdl = rLink; } - void SetCustomRenderHdl(const Link& rLink) { aCustomRenderHdl = rLink; } - void SetCustomMeasureHdl(const Link& rLink) { aCustomMeasureHdl = rLink; } - - void ExpandedHdl(); - bool ExpandingHdl(); - virtual void SelectHdl(); - virtual void DeselectHdl(); - virtual bool DoubleClickHdl(); - SvTreeListEntry* GetHdlEntry() const { return pHdlEntry; } - - // Is called for an Entry that gets expanded with the Flag - // ENTRYFLAG_CHILDREN_ON_DEMAND set. - virtual void RequestingChildren( SvTreeListEntry* pParent ); - - // Drag & Drop - // New D'n'D API - virtual sal_Int8 AcceptDrop( const AcceptDropEvent& rEvt ) override; - virtual sal_Int8 ExecuteDrop( const ExecuteDropEvent& rEvt ) override; - virtual void StartDrag( sal_Int8 nAction, const Point& rPosPixel ) override; - virtual DragDropMode NotifyStartDrag( TransferDataContainer& rData, - SvTreeListEntry* ); - virtual void DragFinished( sal_Int8 nDropAction ); - - SvTreeListEntry* CloneEntry( SvTreeListEntry* pSource ); - - // Return value: TRISTATE_TRUE == Ok, TRISTATE_FALSE == Cancel, TRISTATE_INDET == Ok and Make visible moved entry - TriState NotifyMoving( - SvTreeListEntry* pTarget, // D'n'D DropPosition in GetModel() - SvTreeListEntry* pEntry, // Entry to be moved from GetSourceListBox()->GetModel() - SvTreeListEntry*& rpNewParent, // New TargetParent - sal_uLong& rNewChildPos); // The TargetParent's position in Childlist - - // Return value: TRISTATE_TRUE == Ok, TRISTATE_FALSE == Cancel, TRISTATE_INDET == Ok and Make visible moved entry - TriState NotifyCopying( - SvTreeListEntry* pTarget, // D'n'D DropPosition in GetModel() - SvTreeListEntry* pEntry, // Entry to be copied from GetSourceListBox()->GetModel() - SvTreeListEntry*& rpNewParent, // New TargetParent - sal_uLong& rNewChildPos); // The TargetParent's position in Childlist - - // ACCESSIBILITY ========================================================== - - /** Creates and returns the accessible object of the Box. */ - virtual css::uno::Reference< css::accessibility::XAccessible > CreateAccessible() override; - - /** Fills the StateSet of one entry. */ - void FillAccessibleEntryStateSet( SvTreeListEntry* pEntry, ::utl::AccessibleStateSetHelper& rStateSet ) const; - - /** Calculate and return the bounding rectangle of an entry. - @param pEntry - The entry. - @return The bounding rectangle of an entry. */ - tools::Rectangle GetBoundingRect(const SvTreeListEntry* pEntry); - - SvTreeFlags GetTreeFlags() const {return nTreeFlags;} - - static OUString SearchEntryTextWithHeadTitle(SvTreeListEntry* pEntry); - - void set_min_width_in_chars(sal_Int32 nChars); - - virtual bool set_property(const OString &rKey, const OUString &rValue) override; - -protected: - - VCL_DLLPRIVATE void SetEntryHeight( SvTreeListEntry const * pEntry ); - void AdjustEntryHeight( const Image& rBmp ); - VCL_DLLPRIVATE void AdjustEntryHeight(); - - VCL_DLLPRIVATE void ImpEntryInserted( SvTreeListEntry* pEntry ); - VCL_DLLPRIVATE void PaintEntry1( SvTreeListEntry&, long nLine, vcl::RenderContext& rRenderContext ); - - VCL_DLLPRIVATE void InitTreeView(); - VCL_DLLPRIVATE SvLBoxItem* GetItem_Impl( SvTreeListEntry*, long nX, SvLBoxTab** ppTab ); - VCL_DLLPRIVATE void ImplInitStyle(); - - void SetupDragOrigin(); - void EditItemText( SvTreeListEntry* pEntry, SvLBoxString* pItem, - const Selection& ); - void EditedText(const OUString&); - - // Recalculate all tabs depending on TreeListStyle and Bitmap sizes - // Is called automatically when inserting/changing Bitmaps, changing the Model etc. - virtual void SetTabs(); - void AddTab( long nPos, SvLBoxTabFlags nFlags ); - sal_uInt16 TabCount() const { return aTabs.size(); } - SvLBoxTab* GetFirstDynamicTab() const; - SvLBoxTab* GetFirstDynamicTab( sal_uInt16& rTabPos ) const; - SvLBoxTab* GetFirstTab( SvLBoxTabFlags nFlagMask, sal_uInt16& rTabPos ); - void GetLastTab( SvLBoxTabFlags nFlagMask, sal_uInt16& rTabPos ); - SvLBoxTab* GetTab( SvTreeListEntry const *, SvLBoxItem const * ) const; - void ClearTabList(); - - virtual void InitEntry(SvTreeListEntry*, const OUString&, const Image&, const Image&); - - void NotifyScrolled(); - void SetScrolledHdl( const Link& rLink ) { aScrolledHdl = rLink; } - long GetXOffset() const { return GetMapMode().GetOrigin().X(); } - - virtual void Command( const CommandEvent& rCEvt ) override; - - virtual void RequestHelp( const HelpEvent& rHEvt ) override; - virtual void PreparePaint(vcl::RenderContext& rRenderContext, SvTreeListEntry& rEntry); - virtual void DataChanged( const DataChangedEvent& rDCEvt ) override; - - void InitSettings(); - - virtual void ApplySettings(vcl::RenderContext& rRenderContext) override; - - void CallImplEventListeners(VclEventId nEvent, void* pData); - - void ImplEditEntry( SvTreeListEntry* pEntry ); - - void AdjustEntryHeightAndRecalc(); - - // true if rPos is over the SvTreeListBox body, i.e. not over a - // scrollbar - VCL_DLLPRIVATE bool PosOverBody(const Point& rPos) const; -public: - - void SetNoAutoCurEntry( bool b ); - - void EnableCheckButton( SvLBoxButtonData* ); - void SetCheckButtonData( SvLBoxButtonData* ); - void SetNodeBitmaps( const Image& rCollapsedNodeBmp, const Image& rExpandedNodeBmp ); - - /** Returns the default image which clients should use for expanded nodes, to have a consistent user - interface experience in the whole product. - */ - static const Image& GetDefaultExpandedNodeImage( ); - - /** Returns the default image which clients should use for expanded nodes, to have a consistent user - interface experience in the whole product. - */ - static const Image& GetDefaultCollapsedNodeImage( ); - - /** Sets default bitmaps for collapsed and expanded nodes. - */ - void SetNodeDefaultImages( ) - { - SetNodeBitmaps( - GetDefaultCollapsedNodeImage( ), - GetDefaultExpandedNodeImage( ) - ); - } - - virtual SvTreeListEntry* InsertEntry( const OUString& rText, SvTreeListEntry* pParent = nullptr, - bool bChildrenOnDemand = false, - sal_uLong nPos=TREELIST_APPEND, void* pUserData = nullptr); - - virtual SvTreeListEntry* InsertEntry( const OUString& rText, - const Image& rExpandedEntryBmp, - const Image& rCollapsedEntryBmp, - SvTreeListEntry* pParent = nullptr, - bool bChildrenOnDemand = false, - sal_uLong nPos = TREELIST_APPEND, void* pUserData = nullptr ); - - const Image& GetDefaultExpandedEntryBmp( ) const; - const Image& GetDefaultCollapsedEntryBmp( ) const; - - void SetDefaultExpandedEntryBmp( const Image& rBmp ); - void SetDefaultCollapsedEntryBmp( const Image& rBmp ); - - void SetCheckButtonState( SvTreeListEntry*, SvButtonState ); - SvButtonState GetCheckButtonState( SvTreeListEntry* ) const; - - void SetEntryText(SvTreeListEntry*, const OUString& ); - void SetExpandedEntryBmp( SvTreeListEntry* _pEntry, const Image& _rImage ); - void SetCollapsedEntryBmp( SvTreeListEntry* _pEntry, const Image& _rImage ); - - virtual OUString GetEntryText( SvTreeListEntry* pEntry ) const; - static const Image& GetExpandedEntryBmp(const SvTreeListEntry* _pEntry ); - static const Image& GetCollapsedEntryBmp(const SvTreeListEntry* _pEntry ); - - virtual void CheckButtonHdl(); - - void SetSublistOpenWithLeftRight(); // open/close sublist with cursor left/right - - void EnableInplaceEditing( bool bEnable ); - // Edits the Entry's first StringItem, 0 == Cursor - void EditEntry( SvTreeListEntry* pEntry ); - virtual bool EditingEntry( SvTreeListEntry* pEntry, Selection& ); - virtual bool EditedEntry( SvTreeListEntry* pEntry, const OUString& rNewText ); - - virtual void Paint( vcl::RenderContext& rRenderContext, const tools::Rectangle& rRect ) override; - virtual void MouseButtonDown( const MouseEvent& rMEvt ) override; - virtual void MouseButtonUp( const MouseEvent& rMEvt ) override; - virtual void MouseMove( const MouseEvent& rMEvt ) override; - virtual void KeyInput( const KeyEvent& rKEvt ) override; - virtual void Resize() override; - virtual void GetFocus() override; - virtual void LoseFocus() override; - void SetUpdateMode( bool ); - - virtual void ModelHasCleared() override; - virtual void ModelHasInserted( SvTreeListEntry* pEntry ) override; - virtual void ModelHasInsertedTree( SvTreeListEntry* pEntry ) override; - virtual void ModelIsMoving(SvTreeListEntry* pSource ) override; - virtual void ModelHasMoved(SvTreeListEntry* pSource ) override; - virtual void ModelIsRemoving( SvTreeListEntry* pEntry ) override; - virtual void ModelHasRemoved( SvTreeListEntry* pEntry ) override; - void ModelHasEntryInvalidated( SvTreeListEntry* pEntry ) override; - - void ScrollOutputArea( short nDeltaEntries ); - - short GetColumnsCount() const { return nColumns; } - short GetEntryHeight() const { return nEntryHeight; } - void SetEntryHeight( short nHeight ); - short GetEntryWidth() const { return nEntryWidth; } - void SetEntryWidth( short nWidth ); - Size GetOutputSizePixel() const; - short GetIndent() const { return nIndent; } - void SetSpaceBetweenEntries( short nSpace ); - Point GetEntryPosition(const SvTreeListEntry*) const; - void MakeVisible( SvTreeListEntry* pEntry ); - void MakeVisible( SvTreeListEntry* pEntry, bool bMoveToTop ); - - void SetCollapsedNodeBmp( const Image& ); - void SetExpandedNodeBmp( const Image& ); - Image const & GetExpandedNodeBmp( ) const; - - void SetFont( const vcl::Font& rFont ); - - using Window::SetCursor; - void SetCursor( SvTreeListEntry* pEntry, bool bForceNoSelect = false ); - - SvTreeListEntry* GetEntry( const Point& rPos, bool bHit = false ) const; - - virtual tools::Rectangle GetFocusRect(const SvTreeListEntry*, long nLine ); - // Respects indentation - sal_IntPtr GetTabPos(const SvTreeListEntry*, SvLBoxTab*); - void InvalidateEntry( SvTreeListEntry* ); - SvLBoxItem* GetItem( SvTreeListEntry*, long nX, SvLBoxTab** ppTab); - SvLBoxItem* GetItem( SvTreeListEntry*, long nX ); - - void SetDragDropMode( DragDropMode ); - void SetSelectionMode( SelectionMode ); - - bool Expand( SvTreeListEntry* pParent ); - bool Collapse( SvTreeListEntry* pParent ); - bool Select( SvTreeListEntry* pEntry, bool bSelect=true ); - sal_uLong SelectChildren( SvTreeListEntry* pParent, bool bSelect ); - void SelectAll( bool bSelect ); - - void SetCurEntry( SvTreeListEntry* _pEntry ); - SvTreeListEntry* GetCurEntry() const; - - using Window::Invalidate; - virtual void Invalidate( InvalidateFlags nFlags = InvalidateFlags::NONE) override; - virtual void Invalidate( const tools::Rectangle&, InvalidateFlags nFlags = InvalidateFlags::NONE ) override; - - void SetHighlightRange(sal_uInt16 nFirstTab=0, sal_uInt16 nLastTab=0xffff); - - sal_Int32 DefaultCompare(const SvLBoxString* pLeftText, const SvLBoxString* pRightText); - - DECL_LINK( DefaultCompare, const SvSortData&, sal_Int32 ); - virtual void ModelNotification( SvListAction nActionId, SvTreeListEntry* pEntry1, - SvTreeListEntry* pEntry2, sal_uLong nPos ) override; - - void EndSelection(); - - SvTreeListEntry* GetFirstEntryInView() const; - SvTreeListEntry* GetNextEntryInView(SvTreeListEntry*) const; - void ScrollToAbsPos( long nPos ); - - void ShowFocusRect( const SvTreeListEntry* pEntry ); - - virtual VclPtr CreateContextMenu(); - - void EnableContextMenuHandling(); - - long getPreferredDimensions(std::vector &rWidths) const; - - virtual Size GetOptimalSize() const override; - - void SetAlternatingRowColors( const bool bEnable ); - - // Enables type-ahead search in the check list box. - void SetQuickSearch(bool bEnable) { mbQuickSearch = bEnable; } - - // Make single click "activate" a row like a double-click normally does - void SetActivateOnSingleClick(bool bEnable) { mbActivateOnSingleClick = bEnable; } - - // Make mouse over a row "select" a row like a single-click normally does - void SetHoverSelection(bool bEnable) { mbHoverSelection = bEnable; } - bool GetHoverSelection() const { return mbHoverSelection; } - - void SetForceMakeVisible(bool bEnable); - - virtual FactoryFunction GetUITestFactory() const override; - - void SetDragHelper(rtl::Reference& rHelper, sal_uInt8 eDNDConstants); -}; - -#endif - -/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/include/vcl/treelistentries.hxx b/include/vcl/treelistentries.hxx deleted file mode 100644 index ffe0cb571c55..000000000000 --- a/include/vcl/treelistentries.hxx +++ /dev/null @@ -1,21 +0,0 @@ -/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ -/* - * This file is part of the LibreOffice project. - * - * This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. - */ - -#ifndef INCLUDED_VCL_TREELISTENTRIES_HXX -#define INCLUDED_VCL_TREELISTENTRIES_HXX - -#include -#include - -class SvTreeListEntry; -typedef std::vector> SvTreeListEntries; - -#endif - -/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/include/vcl/treelistentry.hxx b/include/vcl/treelistentry.hxx deleted file mode 100644 index 14a4dc486f44..000000000000 --- a/include/vcl/treelistentry.hxx +++ /dev/null @@ -1,131 +0,0 @@ -/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ -/* - * This file is part of the LibreOffice project. - * - * This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. - * - * This file incorporates work covered by the following license notice: - * - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed - * with this work for additional information regarding copyright - * ownership. The ASF licenses this file to you under the Apache - * License, Version 2.0 (the "License"); you may not use this file - * except in compliance with the License. You may obtain a copy of - * the License at http://www.apache.org/licenses/LICENSE-2.0 . - */ - -#ifndef INCLUDED_VCL_TREELISTENTRY_HXX -#define INCLUDED_VCL_TREELISTENTRY_HXX - -#include -#include -#include -#include -#include -#include - -#include -#include -#include - -// flags related to the model -enum class SvTLEntryFlags -{ - NONE = 0x0000, - CHILDREN_ON_DEMAND = 0x0001, - DISABLE_DROP = 0x0002, - // is set if RequestingChildren has not set any children - NO_NODEBMP = 0x0004, - // is set if this is a separator line - IS_SEPARATOR = 0x0008, - // entry had or has children - HAD_CHILDREN = 0x0010, - SEMITRANSPARENT = 0x8000, // draw semi-transparent entry bitmaps -}; -namespace o3tl -{ - template<> struct typed_flags : is_typed_flags {}; -} - -class VCL_DLLPUBLIC SvTreeListEntry -{ - friend class SvTreeList; - friend class SvListView; - friend class SvTreeListBox; - - typedef std::vector> ItemsType; - - SvTreeListEntry* pParent; - SvTreeListEntries m_Children; - sal_uLong nAbsPos; - sal_uLong nListPos; - sal_uInt32 mnExtraIndent; - ItemsType m_Items; - void* pUserData; - SvTLEntryFlags nEntryFlags; - Color maBackColor; - std::optional mxTextColor; - -private: - void ClearChildren(); - void SetListPositions(); - void InvalidateChildrensListPositions(); - - SvTreeListEntry(const SvTreeListEntry& r) = delete; - void operator=(SvTreeListEntry const&) = delete; - -public: - static const size_t ITEM_NOT_FOUND = SAL_MAX_SIZE; - - SvTreeListEntry(); - virtual ~SvTreeListEntry(); - - bool HasChildren() const; - bool HasChildListPos() const; - sal_uLong GetChildListPos() const; - - SvTreeListEntries& GetChildEntries() { return m_Children; } - const SvTreeListEntries& GetChildEntries() const { return m_Children; } - - void Clone(SvTreeListEntry* pSource); - - size_t ItemCount() const; - - // MAY ONLY BE CALLED IF THE ENTRY HAS NOT YET BEEN INSERTED INTO - // THE MODEL, AS OTHERWISE NO VIEW-DEPENDENT DATA ARE ALLOCATED - // FOR THE ITEM! - void AddItem(std::unique_ptr pItem); - void ReplaceItem(std::unique_ptr pNewItem, size_t nPos); - const SvLBoxItem& GetItem( size_t nPos ) const; - SvLBoxItem& GetItem( size_t nPos ); - const SvLBoxItem* GetFirstItem(SvLBoxItemType eType) const; - SvLBoxItem* GetFirstItem(SvLBoxItemType eType); - size_t GetPos( const SvLBoxItem* pItem ) const; - void* GetUserData() const { return pUserData;} - void SetUserData( void* pPtr ); - void EnableChildrenOnDemand( bool bEnable=true ); - bool HasChildrenOnDemand() const; - - SvTLEntryFlags GetFlags() const { return nEntryFlags;} - void SetFlags( SvTLEntryFlags nFlags ); - - void SetBackColor( const Color& rColor ) { maBackColor = rColor; } - const Color& GetBackColor() const { return maBackColor; } - - void SetTextColor( std::optional xColor ) { mxTextColor = xColor; } - std::optional const & GetTextColor() const { return mxTextColor; } - - void SetExtraIndent(sal_uInt32 nExtraIndent) { mnExtraIndent = nExtraIndent; } - sal_uInt32 GetExtraIndent() const { return mnExtraIndent; } - - SvTreeListEntry* NextSibling() const; - SvTreeListEntry* PrevSibling() const; - SvTreeListEntry* LastSibling() const; -}; - -#endif - -/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/include/vcl/uitest/uiobject.hxx b/include/vcl/uitest/uiobject.hxx index c5b3f07dbe75..50533157e19b 100644 --- a/include/vcl/uitest/uiobject.hxx +++ b/include/vcl/uitest/uiobject.hxx @@ -16,7 +16,6 @@ #include #include -#include #include diff --git a/include/vcl/viewdataentry.hxx b/include/vcl/viewdataentry.hxx deleted file mode 100644 index c81ab05a97e3..000000000000 --- a/include/vcl/viewdataentry.hxx +++ /dev/null @@ -1,85 +0,0 @@ -/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ -/* - * This file is part of the LibreOffice project. - * - * This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. - * - * This file incorporates work covered by the following license notice: - * - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed - * with this work for additional information regarding copyright - * ownership. The ASF licenses this file to you under the Apache - * License, Version 2.0 (the "License"); you may not use this file - * except in compliance with the License. You may obtain a copy of - * the License at http://www.apache.org/licenses/LICENSE-2.0 . - */ - -#ifndef INCLUDED_VCL_VIEWDATAENTRY_HXX -#define INCLUDED_VCL_VIEWDATAENTRY_HXX - -#include - -#include - -class SvTreeListBox; - -struct SvViewDataItem -{ - int mnWidth = 0; - int mnHeight = 0; -}; - -/** - * View-dependent data for a tree list entry created in the virtual function - * SvTreeListBox::CreateViewData(). The item array contains the same number - * of items as that of the items in its corresponding tree list entry. - * - * When an entry is selected, it is logically selected and visually - * highlighted. When an entry is only highlighted, it looks visually - * highlighted, but not logically selected. - */ -class SvViewDataEntry -{ - friend class SvTreeList; - - std::vector maItems; - sal_uLong nVisPos; - bool mbSelected:1; - bool mbHighlighted:1; - bool mbExpanded:1; - bool mbFocused:1; - bool mbSelectable:1; - bool mbDragTarget:1; - -public: - SvViewDataEntry(); - SvViewDataEntry( const SvViewDataEntry& ); - ~SvViewDataEntry(); - - bool IsSelected() const { return mbSelected;} - bool IsHighlighted() const { return mbHighlighted;} - bool IsExpanded() const { return mbExpanded;} - bool HasFocus() const { return mbFocused;} - bool IsSelectable() const { return mbSelectable;} - bool IsDragTarget() const { return mbDragTarget;} - void SetFocus( bool bFocus ); - void SetSelected( bool bSelected ); - void SetExpanded( bool bExpanded ); - void SetSelectable( bool bSelectable ); - void SetDragTarget( bool bDragTarget ) - { - mbDragTarget = bDragTarget; - } - - void Init(size_t nSize); - - const SvViewDataItem& GetItem(size_t nPos) const; - SvViewDataItem& GetItem(size_t nPos); -}; - -#endif - -/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ -- cgit