1 /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ 2 /* 3 * This file is part of the LibreOffice project. 4 * 5 * This Source Code Form is subject to the terms of the Mozilla Public 6 * License, v. 2.0. If a copy of the MPL was not distributed with this 7 * file, You can obtain one at http://mozilla.org/MPL/2.0/. 8 * 9 * This file incorporates work covered by the following license notice: 10 * 11 * Licensed to the Apache Software Foundation (ASF) under one or more 12 * contributor license agreements. See the NOTICE file distributed 13 * with this work for additional information regarding copyright 14 * ownership. The ASF licenses this file to you under the Apache 15 * License, Version 2.0 (the "License"); you may not use this file 16 * except in compliance with the License. You may obtain a copy of 17 * the License at http://www.apache.org/licenses/LICENSE-2.0 . 18 */ 19 20 #ifndef INCLUDED_SC_INC_OLINETAB_HXX 21 #define INCLUDED_SC_INC_OLINETAB_HXX 22 23 #include "scdllapi.h" 24 #include "address.hxx" 25 26 #include <map> 27 28 #define SC_OL_MAXDEPTH 7 29 30 class ScTable; 31 32 class ScOutlineEntry 33 { 34 SCCOLROW nStart; 35 SCSIZE nSize; 36 bool bHidden; 37 bool bVisible; 38 39 public: 40 ScOutlineEntry( SCCOLROW nNewStart, SCCOLROW nNewSize, bool bNewHidden ); 41 ScOutlineEntry( const ScOutlineEntry& rEntry ); 42 GetStart() const43 SC_DLLPUBLIC SCCOLROW GetStart() const { return nStart;} GetSize() const44 SCSIZE GetSize() const { return nSize;} 45 SC_DLLPUBLIC SCCOLROW GetEnd() const; 46 47 /** 48 * @return true is the group is hidden, false otherwise. 49 */ IsHidden() const50 SC_DLLPUBLIC bool IsHidden() const { return bHidden;} 51 52 /** 53 * @return true if the control is visible, false otherwise. 54 */ IsVisible() const55 SC_DLLPUBLIC bool IsVisible() const { return bVisible;} 56 57 void Move( SCCOLROW nDelta ); 58 void SetSize( SCSIZE nNewSize ); 59 void SetPosSize( SCCOLROW nNewPos, SCSIZE nNewSize ); 60 void SetHidden( bool bNewHidden ); 61 void SetVisible( bool bNewVisible ); 62 }; 63 64 class ScOutlineCollection 65 { 66 typedef std::map<SCCOLROW, ScOutlineEntry> MapType; 67 MapType m_Entries; 68 69 public: 70 typedef MapType::iterator iterator; 71 typedef MapType::const_iterator const_iterator; 72 73 ScOutlineCollection(); 74 75 size_t size() const; 76 void clear(); 77 void insert(ScOutlineEntry const& rEntry); 78 iterator begin(); 79 iterator end(); 80 const_iterator begin() const; 81 const_iterator end() const; 82 void erase(const iterator& pos); 83 bool empty() const; 84 85 iterator FindStart(SCCOLROW nMinStart); 86 }; 87 88 class SC_DLLPUBLIC ScOutlineArray 89 { 90 friend class ScSubOutlineIterator; 91 92 private: 93 size_t nDepth; 94 ScOutlineCollection aCollections[SC_OL_MAXDEPTH]; 95 96 bool DecDepth(); 97 void FindEntry( 98 SCCOLROW nSearchPos, size_t& rFindLevel, size_t& rFindIndex, 99 size_t nMaxLevel = SC_OL_MAXDEPTH); 100 101 void PromoteSub(SCCOLROW nStartPos, SCCOLROW nEndPos, size_t nStartLevel); 102 103 public: 104 ScOutlineArray(); 105 ScOutlineArray( const ScOutlineArray& rArray ); 106 GetDepth() const107 size_t GetDepth() const { return nDepth;} 108 109 bool FindTouchedLevel( 110 SCCOLROW nBlockStart, SCCOLROW nBlockEnd, size_t& rFindLevel) const; 111 112 bool Insert( SCCOLROW nStartPos, SCCOLROW nEndPos, bool& rSizeChanged, 113 bool bHidden = false ); 114 bool Remove( SCCOLROW nBlockStart, SCCOLROW nBlockEnd, bool& rSizeChanged ); 115 116 ScOutlineEntry* GetEntry(size_t nLevel, size_t nIndex); 117 const ScOutlineEntry* GetEntry(size_t nLevel, size_t nIndex) const; 118 size_t GetCount(size_t nLevel) const; 119 const ScOutlineEntry* GetEntryByPos(size_t nLevel, SCCOLROW nPos) const; 120 121 bool GetEntryIndex(size_t nLevel, SCCOLROW nPos, size_t& rnIndex) const; 122 bool GetEntryIndexInRange( 123 size_t nLevel, SCCOLROW nBlockStart, SCCOLROW nBlockEnd, size_t& rnIndex) const; 124 125 void SetVisibleBelow( 126 size_t nLevel, size_t nEntry, bool bValue, bool bSkipHidden = false); 127 128 void GetRange(SCCOLROW& rStart, SCCOLROW& rEnd) const; 129 void ExtendBlock(size_t nLevel, SCCOLROW& rBlkStart, SCCOLROW& rBlkEnd); 130 131 bool TestInsertSpace(SCSIZE nSize, SCCOLROW nMaxVal) const; 132 void InsertSpace(SCCOLROW nStartPos, SCSIZE nSize); 133 bool DeleteSpace(SCCOLROW nStartPos, SCSIZE nSize); 134 135 bool ManualAction( 136 SCCOLROW nStartPos, SCCOLROW nEndPos, bool bShow, const ScTable& rTable, bool bCol); 137 138 void finalizeImport(const ScTable& rTable); 139 140 void RemoveAll(); 141 }; 142 143 class ScOutlineTable 144 { 145 private: 146 ScOutlineArray aColOutline; 147 ScOutlineArray aRowOutline; 148 149 public: 150 ScOutlineTable(); 151 ScOutlineTable( const ScOutlineTable& rOutline ); 152 GetColArray() const153 const ScOutlineArray& GetColArray() const { return aColOutline; } GetColArray()154 ScOutlineArray& GetColArray() { return aColOutline; } GetRowArray() const155 const ScOutlineArray& GetRowArray() const { return aRowOutline; } GetRowArray()156 ScOutlineArray& GetRowArray() { return aRowOutline; } 157 158 bool TestInsertCol( SCSIZE nSize ); 159 void InsertCol( SCCOL nStartCol, SCSIZE nSize ); 160 bool DeleteCol( SCCOL nStartCol, SCSIZE nSize ); // TRUE: Undo only using original 161 bool TestInsertRow( SCSIZE nSize ); 162 void InsertRow( SCROW nStartRow, SCSIZE nSize ); 163 bool DeleteRow( SCROW nStartRow, SCSIZE nSize ); 164 }; 165 166 class ScSubOutlineIterator 167 { 168 private: 169 ScOutlineArray* pArray; 170 SCCOLROW nStart; 171 SCCOLROW nEnd; 172 size_t nSubLevel; 173 size_t nSubEntry; 174 size_t nDepth; 175 176 public: 177 ScSubOutlineIterator( ScOutlineArray* pOutlineArray ); 178 ScSubOutlineIterator( ScOutlineArray* pOutlineArray, size_t nLevel, size_t nEntry ); 179 180 ScOutlineEntry* GetNext(); LastLevel() const181 size_t LastLevel() const { return nSubLevel;} 182 size_t LastEntry() const; 183 void DeleteLast(); 184 }; 185 186 #endif 187 188 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ 189