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 #ifndef INCLUDED_VCL_SVTABBX_HXX 20 #define INCLUDED_VCL_SVTABBX_HXX 21 22 #include <vcl/dllapi.h> 23 #include <vcl/treelistbox.hxx> 24 #include <vcl/accessibletableprovider.hxx> 25 26 #include <tools/debug.hxx> 27 28 #include <memory> 29 #include <vector> 30 31 enum class SvTabJustify 32 { 33 AdjustRight = static_cast<int>(SvLBoxTabFlags::ADJUST_RIGHT), 34 AdjustLeft = static_cast<int>(SvLBoxTabFlags::ADJUST_LEFT), 35 AdjustCenter = static_cast<int>(SvLBoxTabFlags::ADJUST_CENTER) 36 }; 37 38 struct TabListBoxEventData 39 { 40 SvTreeListEntry* const m_pEntry; 41 sal_uInt16 const m_nColumn; 42 OUString const m_sOldText; 43 TabListBoxEventDataTabListBoxEventData44 TabListBoxEventData( SvTreeListEntry* pEntry, sal_uInt16 nColumn, const OUString& rOldText ) : 45 m_pEntry( pEntry ), m_nColumn( nColumn ), m_sOldText( rOldText ) {} 46 }; 47 48 class VCL_DLLPUBLIC SvTabListBox : public SvTreeListBox 49 { 50 private: 51 std::vector<SvLBoxTab> mvTabList; 52 OUString aCurEntry; 53 54 protected: 55 static OUString GetToken( const OUString &sStr, sal_Int32 &nIndex ); 56 57 virtual void SetTabs() override; 58 virtual void InitEntry(SvTreeListEntry*, const OUString&, const Image&, const Image&) override; 59 60 OUString GetTabEntryText( sal_uLong nPos, sal_uInt16 nCol ) const; 61 SvTreeListEntry* GetEntryOnPos( sal_uLong _nEntryPos ) const; 62 SvTreeListEntry* GetChildOnPos( SvTreeListEntry* _pParent, sal_uLong _nEntryPos, sal_uLong& _rPos ) const; 63 64 public: 65 SvTabListBox( vcl::Window* pParent, WinBits ); 66 virtual ~SvTabListBox() override; 67 virtual void dispose() override; 68 void SetTabs(sal_uInt16 nTabs, long const pTabPositions[], MapUnit = MapUnit::MapAppFont); 69 using SvTreeListBox::GetTab; 70 void SetTab( sal_uInt16 nTab, long nValue, MapUnit = MapUnit::MapAppFont ); 71 long GetLogicTab( sal_uInt16 nTab ); 72 73 virtual SvTreeListEntry* InsertEntry( const OUString& rText, SvTreeListEntry* pParent = nullptr, 74 bool bChildrenOnDemand = false, 75 sal_uLong nPos=TREELIST_APPEND, void* pUserData = nullptr ) override; 76 77 virtual SvTreeListEntry* InsertEntry( const OUString& rText, 78 const Image& rExpandedEntryBmp, 79 const Image& rCollapsedEntryBmp, 80 SvTreeListEntry* pParent = nullptr, 81 bool bChildrenOnDemand = false, 82 sal_uLong nPos = TREELIST_APPEND, void* pUserData = nullptr ) override; 83 84 virtual SvTreeListEntry* InsertEntryToColumn( const OUString&, SvTreeListEntry* pParent, 85 sal_uLong nPos, sal_uInt16 nCol, void* pUserData = nullptr ); 86 virtual SvTreeListEntry* InsertEntryToColumn( const OUString&, const Image& rExpandedEntryBmp, 87 const Image& rCollapsedEntryBmp, SvTreeListEntry* pParent, 88 sal_uLong nPos = TREELIST_APPEND, sal_uInt16 nCol = 0xffff, void* pUserData = nullptr ); 89 90 virtual OUString GetEntryText( SvTreeListEntry* pEntry ) const override; 91 static OUString GetEntryText( SvTreeListEntry*, sal_uInt16 nCol ); 92 OUString GetEntryText( sal_uLong nPos, sal_uInt16 nCol = 0xffff ) const; 93 using SvTreeListBox::SetEntryText; 94 void SetEntryText(const OUString&, SvTreeListEntry*, sal_uInt16 nCol=0xffff); 95 OUString GetCellText( sal_uLong nPos, sal_uInt16 nCol ) const; 96 sal_uLong GetEntryPos( const SvTreeListEntry* pEntry ) const; 97 98 void SetTabJustify( sal_uInt16 nTab, SvTabJustify ); 99 }; 100 101 // class SvHeaderTabListBox --------------------------------------------------- 102 103 class HeaderBar; 104 namespace vcl { 105 struct SvHeaderTabListBoxImpl; 106 } 107 108 class VCL_DLLPUBLIC SvHeaderTabListBox : public SvTabListBox, public vcl::IAccessibleTableProvider 109 { 110 private: 111 typedef ::std::vector< css::uno::Reference< css::accessibility::XAccessible > > AccessibleChildren; 112 113 bool m_bFirstPaint; 114 std::unique_ptr<::vcl::SvHeaderTabListBoxImpl> m_pImpl; 115 ::vcl::IAccessibleTabListBox* m_pAccessible; 116 AccessibleChildren m_aAccessibleChildren; 117 118 DECL_DLLPRIVATE_LINK( ScrollHdl_Impl, SvTreeListBox*, void ); 119 DECL_DLLPRIVATE_LINK( CreateAccessibleHdl_Impl, HeaderBar*, void ); 120 121 void RecalculateAccessibleChildren(); 122 123 public: 124 SvHeaderTabListBox( vcl::Window* pParent, WinBits nBits ); 125 virtual ~SvHeaderTabListBox() override; 126 virtual void dispose() override; 127 128 virtual void Paint( vcl::RenderContext& rRenderContext, const tools::Rectangle& ) override; 129 130 void InitHeaderBar(HeaderBar* pHeaderBar); 131 HeaderBar* GetHeaderBar(); 132 static bool IsItemChecked( SvTreeListEntry* pEntry, sal_uInt16 nCol ); 133 134 virtual SvTreeListEntry* InsertEntryToColumn( const OUString&, SvTreeListEntry* pParent, 135 sal_uLong nPos, sal_uInt16 nCol, void* pUserData = nullptr ) override; 136 virtual SvTreeListEntry* InsertEntryToColumn( const OUString&, const Image& rExpandedEntryBmp, 137 const Image& rCollapsedEntryBmp, SvTreeListEntry* pParent, 138 sal_uLong nPos = TREELIST_APPEND, sal_uInt16 nCol = 0xffff, void* pUserData = nullptr ) override; 139 virtual sal_uLong Insert( SvTreeListEntry* pEnt,SvTreeListEntry* pPar,sal_uLong nPos=TREELIST_APPEND) override; 140 virtual sal_uLong Insert( SvTreeListEntry* pEntry, sal_uLong nRootPos = TREELIST_APPEND ) override; 141 142 // Accessible ------------------------------------------------------------- 143 IsTransientChildrenDisabled() const144 bool IsTransientChildrenDisabled() const { return !AreChildrenTransient(); } 145 146 bool IsCellCheckBox( long _nRow, sal_uInt16 _nColumn, TriState& _rState ); 147 148 /** @return The count of the rows. */ 149 virtual long GetRowCount() const override; 150 /** @return The count of the columns. */ 151 virtual sal_uInt16 GetColumnCount() const override; 152 153 /** @return The position of the current row. */ 154 virtual sal_Int32 GetCurrRow() const override; 155 /** @return The position of the current column. */ 156 virtual sal_uInt16 GetCurrColumn() const override; 157 158 /** @return The description of a row. 159 @param _nRow The row which description is in demand. */ 160 virtual OUString GetRowDescription( sal_Int32 _nRow ) const override; 161 /** @return The description of a column. 162 @param _nColumn The column which description is in demand. */ 163 virtual OUString GetColumnDescription( sal_uInt16 _nColumn ) const override; 164 165 /** @return <TRUE/>, if the object has a row header. */ 166 virtual bool HasRowHeader() const override; //GetColumnId 167 /** @return <TRUE/>, if the object can focus a cell. */ 168 virtual bool GoToCell( sal_Int32 _nRow, sal_uInt16 _nColumn ) override; 169 170 virtual void SetNoSelection() override; 171 using SvTabListBox::SelectAll; 172 virtual void SelectAll() override; 173 virtual void SelectRow( long _nRow, bool _bSelect = true, bool bExpand = true ) override; 174 virtual void SelectColumn( sal_uInt16 _nColumn, bool _bSelect = true ) override; 175 virtual sal_Int32 GetSelectedRowCount() const override; 176 virtual sal_Int32 GetSelectedColumnCount() const override; 177 /** @return <TRUE/>, if the row is selected. */ 178 virtual bool IsRowSelected( long _nRow ) const override; 179 virtual bool IsColumnSelected( long _nColumn ) const override; 180 virtual void GetAllSelectedRows( css::uno::Sequence< sal_Int32 >& _rRows ) const override; 181 virtual void GetAllSelectedColumns( css::uno::Sequence< sal_Int32 >& _rColumns ) const override; 182 183 /** @return <TRUE/>, if the cell is visible. */ 184 virtual bool IsCellVisible( sal_Int32 _nRow, sal_uInt16 _nColumn ) const override; 185 virtual OUString GetAccessibleCellText( long _nRow, sal_uInt16 _nColumnPos ) const override; 186 187 virtual tools::Rectangle calcHeaderRect( bool _bIsColumnBar, bool _bOnScreen = true ) override; 188 virtual tools::Rectangle calcTableRect( bool _bOnScreen = true ) override; 189 virtual tools::Rectangle GetFieldRectPixelAbs( sal_Int32 _nRow, sal_uInt16 _nColumn, bool _bIsHeader, bool _bOnScreen = true ) override; 190 191 virtual css::uno::Reference< css::accessibility::XAccessible > CreateAccessibleCell( sal_Int32 _nRow, sal_uInt16 _nColumn ) override; 192 virtual css::uno::Reference< css::accessibility::XAccessible > CreateAccessibleRowHeader( sal_Int32 _nRow ) override; 193 virtual css::uno::Reference< css::accessibility::XAccessible > CreateAccessibleColumnHeader( sal_uInt16 _nColumnPos ) override; 194 195 virtual sal_Int32 GetAccessibleControlCount() const override; 196 virtual css::uno::Reference< css::accessibility::XAccessible > CreateAccessibleControl( sal_Int32 _nIndex ) override; 197 virtual bool ConvertPointToControlIndex( sal_Int32& _rnIndex, const Point& _rPoint ) override; 198 199 virtual bool ConvertPointToCellAddress( sal_Int32& _rnRow, sal_uInt16& _rnColPos, const Point& _rPoint ) override; 200 virtual bool ConvertPointToRowHeader( sal_Int32& _rnRow, const Point& _rPoint ) override; 201 virtual bool ConvertPointToColumnHeader( sal_uInt16& _rnColPos, const Point& _rPoint ) override; 202 203 virtual OUString GetAccessibleObjectName( ::vcl::AccessibleBrowseBoxObjType _eType, sal_Int32 _nPos = -1 ) const override; 204 virtual OUString GetAccessibleObjectDescription( ::vcl::AccessibleBrowseBoxObjType _eType, sal_Int32 _nPos = -1 ) const override; 205 virtual vcl::Window* GetWindowInstance() override; 206 207 virtual void FillAccessibleStateSet( ::utl::AccessibleStateSetHelper& _rStateSet, ::vcl::AccessibleBrowseBoxObjType _eType ) const override; 208 virtual void FillAccessibleStateSetForCell( ::utl::AccessibleStateSetHelper& _rStateSet, sal_Int32 _nRow, sal_uInt16 _nColumn ) const override; 209 virtual void GrabTableFocus() override; 210 211 // OutputDevice 212 virtual bool GetGlyphBoundRects( const Point& rOrigin, const OUString& rStr, int nIndex, int nLen, MetricVector& rVector ) override; 213 214 // Window 215 virtual tools::Rectangle GetWindowExtentsRelative( vcl::Window *pRelativeWindow ) const override; 216 virtual void GrabFocus() override; 217 virtual css::uno::Reference< css::accessibility::XAccessible > GetAccessible() override; 218 /** Creates and returns the accessible object of the whole BrowseBox. */ 219 virtual css::uno::Reference< css::accessibility::XAccessible > CreateAccessible() override; 220 virtual vcl::Window* GetAccessibleParentWindow() const override; 221 222 virtual tools::Rectangle GetFieldCharacterBounds(sal_Int32 _nRow,sal_Int32 _nColumnPos,sal_Int32 nIndex) override; 223 virtual sal_Int32 GetFieldIndexAtPoint(sal_Int32 _nRow,sal_Int32 _nColumnPos,const Point& _rPoint) override; 224 }; 225 226 #endif // INCLUDED_VCL_SVTABBX_HXX 227 228 229 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ 230