xref: /AOO41X/main/sc/source/filter/xml/xmlsubti.hxx (revision 38d50f7b14e1cf975d8c6468d9633894cd59b523)
1 /**************************************************************
2  *
3  * Licensed to the Apache Software Foundation (ASF) under one
4  * or more contributor license agreements.  See the NOTICE file
5  * distributed with this work for additional information
6  * regarding copyright ownership.  The ASF licenses this file
7  * to you under the Apache License, Version 2.0 (the
8  * "License"); you may not use this file except in compliance
9  * with the License.  You may obtain a copy of the License at
10  *
11  *   http://www.apache.org/licenses/LICENSE-2.0
12  *
13  * Unless required by applicable law or agreed to in writing,
14  * software distributed under the License is distributed on an
15  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16  * KIND, either express or implied.  See the License for the
17  * specific language governing permissions and limitations
18  * under the License.
19  *
20  *************************************************************/
21 
22 
23 #ifndef SC_XMLSUBTI_HXX
24 #define SC_XMLSUBTI_HXX
25 
26 #include <xmloff/xmlictxt.hxx>
27 #include <xmloff/xmlimp.hxx>
28 #include <com/sun/star/sheet/XSpreadsheet.hpp>
29 #include <com/sun/star/drawing/XDrawPage.hpp>
30 #include <com/sun/star/table/CellAddress.hpp>
31 #include <com/sun/star/table/XCellRange.hpp>
32 #include <com/sun/star/table/CellRangeAddress.hpp>
33 #include <com/sun/star/frame/XModel.hpp>
34 
35 #include <vector>
36 #include <list>
37 #include "XMLTableShapeResizer.hxx"
38 #include "formula/grammar.hxx"
39 
40 class ScXMLImport;
41 
42 typedef std::vector<sal_Int32> ScMysalIntVec;
43 typedef std::list<sal_Int32> ScMysalIntList;
44 
45 const ScMysalIntVec::size_type nDefaultRowCount = 20;
46 const ScMysalIntVec::size_type nDefaultColCount = 20;
47 const ScMysalIntVec::size_type nDefaultTabCount = 10;
48 
49 class ScMyTableData
50 {
51 private:
52     com::sun::star::table::CellAddress  aTableCellPos;
53     ScMysalIntVec                       nColsPerCol;
54     ScMysalIntVec                       nRealCols;
55     ScMysalIntVec                       nRowsPerRow;
56     ScMysalIntVec                       nRealRows;
57     sal_Int32                           nSpannedCols;
58     sal_Int32                           nColCount;
59     sal_Int32                           nSubTableSpanned;
60     ScMysalIntList                      nChangedCols;
61 public:
62                                         ScMyTableData(sal_Int32 nSheet = -1, sal_Int32 nCol = -1, sal_Int32 nRow = -1);
63                                         ~ScMyTableData();
GetCellPos() const64     com::sun::star::table::CellAddress  GetCellPos() const { return aTableCellPos; }
GetRow() const65     sal_Int32                           GetRow() const { return aTableCellPos.Row; }
GetColumn() const66     sal_Int32                           GetColumn() const { return aTableCellPos.Column; }
67     void                                AddRow();
68     void                                AddColumn();
SetFirstColumn()69     void                                SetFirstColumn() { aTableCellPos.Column = -1; }
GetColsPerCol(const sal_Int32 nIndex) const70     sal_Int32                           GetColsPerCol(const sal_Int32 nIndex) const { return nColsPerCol[nIndex]; }
SetColsPerCol(const sal_Int32 nIndex,sal_Int32 nValue=1)71     void                                SetColsPerCol(const sal_Int32 nIndex, sal_Int32 nValue = 1) { nColsPerCol[nIndex] = nValue; }
72     sal_Int32                           GetRealCols(const sal_Int32 nIndex, const sal_Bool bIsNormal = sal_True) const;
SetRealCols(const sal_Int32 nIndex,const sal_Int32 nValue)73     void                                SetRealCols(const sal_Int32 nIndex, const sal_Int32 nValue) { nRealCols[nIndex] = nValue; }
GetRowsPerRow(const sal_Int32 nIndex) const74     sal_Int32                           GetRowsPerRow(const sal_Int32 nIndex) const { return nRowsPerRow[nIndex]; }
SetRowsPerRow(const sal_Int32 nIndex,const sal_Int32 nValue=1)75     void                                SetRowsPerRow(const sal_Int32 nIndex, const sal_Int32 nValue = 1) { nRowsPerRow[nIndex] = nValue; }
GetRealRows(const sal_Int32 nIndex) const76     sal_Int32                           GetRealRows(const sal_Int32 nIndex) const { return nIndex < 0 ? 0 : nRealRows[nIndex]; }
SetRealRows(const sal_Int32 nIndex,const sal_Int32 nValue)77     void                                SetRealRows(const sal_Int32 nIndex, const sal_Int32 nValue) { nRealRows[nIndex] = nValue; }
GetSpannedCols() const78     sal_Int32                           GetSpannedCols() const { return nSpannedCols; }
SetSpannedCols(const sal_Int32 nTempSpannedCols)79     void                                SetSpannedCols(const sal_Int32 nTempSpannedCols) { nSpannedCols = nTempSpannedCols; }
GetColCount() const80     sal_Int32                           GetColCount() const { return nColCount; }
SetColCount(const sal_Int32 nTempColCount)81     void                                SetColCount(const sal_Int32 nTempColCount) { nColCount = nTempColCount; }
GetSubTableSpanned() const82     sal_Int32                           GetSubTableSpanned() const { return nSubTableSpanned; }
SetSubTableSpanned(const sal_Int32 nValue)83     void                                SetSubTableSpanned(const sal_Int32 nValue) { nSubTableSpanned = nValue; }
84     sal_Int32                           GetChangedCols(const sal_Int32 nFromIndex, const sal_Int32 nToIndex) const;
85     void                                SetChangedCols(const sal_Int32 nValue);
86 };
87 
88 //*******************************************************************************************************************************
89 
90 struct ScMatrixRange
91 {
92     rtl::OUString sFormula;
93     rtl::OUString sFormulaNmsp;
94     formula::FormulaGrammar::Grammar eGrammar;
95     com::sun::star::table::CellRangeAddress aRange;
ScMatrixRangeScMatrixRange96     ScMatrixRange(const com::sun::star::table::CellRangeAddress& rRange, const rtl::OUString& rFormula, const rtl::OUString& rFormulaNmsp, const formula::FormulaGrammar::Grammar eGrammarP) :
97         sFormula(rFormula),
98         sFormulaNmsp(rFormulaNmsp),
99         eGrammar(eGrammarP),
100         aRange(rRange)
101     {
102     }
103 };
104 
105 class ScMyTables
106 {
107 private:
108     typedef std::list<ScMatrixRange>    ScMyMatrixRangeList;
109 
110     ScXMLImport&                        rImport;
111 
112     ScMyShapeResizer                    aResizeShapes;
113 
114     ::com::sun::star::uno::Reference< ::com::sun::star::sheet::XSpreadsheet > xCurrentSheet;
115     ::com::sun::star::uno::Reference< ::com::sun::star::table::XCellRange > xCurrentCellRange;
116     ::com::sun::star::uno::Reference< ::com::sun::star::drawing::XDrawPage > xDrawPage;
117     ::com::sun::star::uno::Reference < ::com::sun::star::drawing::XShapes > xShapes;
118     rtl::OUString                       sCurrentSheetName;
119     rtl::OUString                       sPassword;
120     std::vector<ScMyTableData*>         aTableVec;
121     ScMyMatrixRangeList                 aMatrixRangeList;
122     com::sun::star::table::CellAddress  aRealCellPos;
123     sal_Int32                           nCurrentColStylePos;
124     sal_Int16                           nCurrentDrawPage;
125     sal_Int16                           nCurrentXShapes;
126     sal_Int32                           nTableCount;
127     sal_Int32                           nCurrentSheet;
128     sal_Bool                            bProtection;
129 
130     sal_Bool                            IsMerged (const com::sun::star::uno::Reference <com::sun::star::table::XCellRange>& xCellRange,
131                                                 const sal_Int32 nCol, const sal_Int32 nRow,
132                                                 com::sun::star::table::CellRangeAddress& aCellAddress) const;
133     void                                UnMerge();
134     void                                DoMerge(sal_Int32 nCount = -1);
135     void                                InsertRow();
136     void                                NewRow();
137     void                                InsertColumn();
138     void                                NewColumn(sal_Bool bIsCovered);
139 public:
140                                         ScMyTables(ScXMLImport& rImport);
141                                         ~ScMyTables();
142     void                                NewSheet(const rtl::OUString& sTableName, const rtl::OUString& sStyleName,
143                                                 const sal_Bool bProtection, const rtl::OUString& sPassword);
144     void                                AddRow();
145     void                                SetRowStyle(const rtl::OUString& rCellStyleName);
146     void                                AddColumn(sal_Bool bIsCovered);
147     void                                NewTable(sal_Int32 nTempSpannedCols);
148     void                                UpdateRowHeights();
ResizeShapes()149     void                                ResizeShapes() { aResizeShapes.ResizeShapes(); }
150     void                                DeleteTable();
151     com::sun::star::table::CellAddress  GetRealCellPos();
152     void                                AddColCount(sal_Int32 nTempColCount);
153     void                                AddColStyle(const sal_Int32 nRepeat, const rtl::OUString& rCellStyleName);
GetCurrentSheetName() const154     rtl::OUString                       GetCurrentSheetName() const { return sCurrentSheetName; }
GetCurrentSheet() const155     sal_Int32                           GetCurrentSheet() const { return nCurrentSheet; }
GetCurrentColumn() const156     sal_Int32                           GetCurrentColumn() const { return aTableVec[nTableCount - 1]->GetColCount(); }
GetCurrentRow() const157     sal_Int32                           GetCurrentRow() const { return aTableVec[nTableCount - 1]->GetRow(); }
158     ::com::sun::star::uno::Reference< ::com::sun::star::sheet::XSpreadsheet >
GetCurrentXSheet()159                                         GetCurrentXSheet()  { return xCurrentSheet; }
160     ::com::sun::star::uno::Reference< ::com::sun::star::table::XCellRange >
GetCurrentXCellRange()161                                         GetCurrentXCellRange()  { return xCurrentCellRange; }
162     ::com::sun::star::uno::Reference< ::com::sun::star::drawing::XDrawPage >
163                                         GetCurrentXDrawPage();
164     ::com::sun::star::uno::Reference< ::com::sun::star::drawing::XShapes >
165                                         GetCurrentXShapes();
166     sal_Bool                            HasDrawPage();
167     sal_Bool                            HasXShapes();
168     void                                AddShape(com::sun::star::uno::Reference <com::sun::star::drawing::XShape>& rShape,
169                                                 rtl::OUString* pRangeList,
170                                                 com::sun::star::table::CellAddress& rStartAddress,
171                                                 com::sun::star::table::CellAddress& rEndAddress,
172                                                 sal_Int32 nEndX, sal_Int32 nEndY);
173 
174     void                                AddMatrixRange( sal_Int32 nStartColumn,
175                                                 sal_Int32 nStartRow,
176                                                 sal_Int32 nEndColumn,
177                                                 sal_Int32 nEndRow,
178                                                 const rtl::OUString& rFormula,
179                                                 const rtl::OUString& rFormulaNmsp,
180                                                 const formula::FormulaGrammar::Grammar );
181 
182     sal_Bool                            IsPartOfMatrix(sal_Int32 nColumn, sal_Int32 nRow);
183     void                                SetMatrix( const com::sun::star::table::CellRangeAddress& rRange,
184                                                 const rtl::OUString& rFormula,
185                                                 const rtl::OUString& rFormulaNmsp,
186                                                 const formula::FormulaGrammar::Grammar );
187 };
188 
189 #endif
190