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