1 /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
3 * This file is part of the LibreOffice project.
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/.
9 * This file incorporates work covered by the following license notice:
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 .
22 #include <com/sun/star/text/XTextRange.hpp>
24 #include "PropertyMap.hxx"
29 namespace writerfilter::dmapper
33 Class containing the data to describe a table cell.
35 class CellData final
: public virtual SvRefBase
38 Handle to start of cell.
40 css::uno::Reference
<css::text::XTextRange
> mStart
;
43 Handle to end of cell.
45 css::uno::Reference
<css::text::XTextRange
> mEnd
;
48 Pointer to properties of cell.
50 TablePropertyMapPtr mpProps
;
54 sal_uInt32 m_nGridSpan
; ///< number of grid columns in the parent table's table grid which this cell defines
57 typedef tools::SvRef
<CellData
> Pointer_t
;
59 CellData(css::uno::Reference
<css::text::XTextRange
> const & start
, TablePropertyMapPtr pProps
)
60 : mStart(start
), mEnd(start
), mpProps(std::move(pProps
)), mbOpen(true)
66 Set the end handle of a cell.
68 @param end the end handle of the cell
70 void setEnd(css::uno::Reference
<css::text::XTextRange
> const & end
) { mEnd
= end
; mbOpen
= false; }
73 Adds properties to the cell.
75 @param pProps the properties to add
77 void insertProperties(TablePropertyMapPtr pProps
)
80 mpProps
->InsertProps(pProps
.get());
86 Return start handle of the cell.
88 const css::uno::Reference
<css::text::XTextRange
>& getStart() const { return mStart
; }
91 Return end handle of the cell.
93 const css::uno::Reference
<css::text::XTextRange
>& getEnd() const { return mEnd
; }
96 Return properties of the cell.
98 const TablePropertyMapPtr
& getProperties() const { return mpProps
; }
100 bool isOpen() const { return mbOpen
; }
102 sal_uInt32
getGridSpan() const { return m_nGridSpan
; }
103 void setGridSpan( sal_uInt32 nSpan
) { m_nGridSpan
= nSpan
; }
105 void SetStart(const css::uno::Reference
<css::text::XTextRange
>& xStart
) { mStart
= xStart
; }
107 bool IsValid() const;
111 Class to handle data of a table row.
113 class RowData final
: public virtual SvRefBase
115 typedef ::std::vector
<CellData::Pointer_t
> Cells
;
118 the cell data of the row
123 the properties of the row
125 mutable TablePropertyMapPtr mpProperties
;
127 sal_uInt32 m_nGridBefore
; ///< number of grid columns in the parent table's table grid which must be skipped before the contents of this table row are added to the parent table
128 sal_uInt32 m_nGridAfter
; ///< number of grid columns in the parent table's table grid which shall be left after the last cell in the table row
131 typedef tools::SvRef
<RowData
> Pointer_t
;
139 RowData(const RowData
& rRowData
)
140 : SvRefBase(), mCells(rRowData
.mCells
), mpProperties(rRowData
.mpProperties
)
141 , m_nGridBefore(rRowData
.m_nGridBefore
)
142 , m_nGridAfter(rRowData
.m_nGridAfter
)
147 Add a cell to the row.
149 @param start the start handle of the cell
150 @param end the end handle of the cell
151 @param pProps the properties of the cell
152 @param bAddBefore true: add an empty cell at beginning of the row for gridBefore
154 void addCell(const css::uno::Reference
<css::text::XTextRange
>& start
, TablePropertyMapPtr pProps
, bool bAddBefore
= false)
156 CellData::Pointer_t
pCellData(new CellData(start
, pProps
));
159 mCells
.insert(mCells
.begin(), pCellData
);
160 mCells
[0]->setEnd(start
);
163 mCells
.push_back(pCellData
);
166 void endCell(const css::uno::Reference
<css::text::XTextRange
>& end
)
168 if (mCells
.size() > 0)
169 mCells
.back()->setEnd(end
);
172 bool isCellOpen() const
174 return mCells
.size() > 0 && mCells
.back()->isOpen();
177 void SetCellStart(const css::uno::Reference
<css::text::XTextRange
>& xStart
)
184 mCells
.back()->SetStart(xStart
);
187 bool IsCellValid() const
189 return !mCells
.empty() && mCells
.back()->IsValid();
193 Add properties to the row.
195 @param pProperties the properties to set
197 void insertProperties(TablePropertyMapPtr pProperties
)
202 mpProperties
= pProperties
;
204 mpProperties
->InsertProps(pProperties
.get());
209 Add properties to the last cell of the row.
211 void insertCellProperties(TablePropertyMapPtr pProps
)
214 mCells
.back()->insertProperties(pProps
);
218 Return number of cells in the row.
220 unsigned int getCellCount() const
222 return mCells
.size();
226 Return start handle of a cell in the row.
228 @param i index of the cell
230 const css::uno::Reference
<css::text::XTextRange
>& getCellStart(unsigned int i
) const
232 return mCells
[i
]->getStart();
236 Return end handle of a cell in the row.
238 @param i index of the cell
240 const css::uno::Reference
<css::text::XTextRange
>& getCellEnd(unsigned int i
) const
242 return mCells
[i
]->getEnd();
246 Return the properties of a cell in the row.
248 @param i index of the cell
250 TablePropertyMapPtr
const & getCellProperties(unsigned int i
) const
252 return mCells
[i
]->getProperties();
256 Return properties of the row.
258 const TablePropertyMapPtr
& getProperties() const
263 sal_uInt32
getGridBefore() const { return m_nGridBefore
; }
264 void setGridBefore(sal_uInt32 nSkipGrids
) { m_nGridBefore
= nSkipGrids
; }
265 sal_uInt32
getGridAfter() const { return m_nGridAfter
; }
266 void setGridAfter(sal_uInt32 nSkipGrids
) { m_nGridAfter
= nSkipGrids
; }
267 sal_uInt32
getGridSpan(sal_uInt32 i
) { return mCells
[i
]->getGridSpan(); }
268 std::vector
< sal_uInt32
> getGridSpans()
270 std::vector
< sal_uInt32
> nRet
;
271 for (auto const& aCell
: mCells
)
272 nRet
.push_back(aCell
->getGridSpan());
275 void setCurrentGridSpan(sal_uInt32 nSpan
, bool bFirstCell
= false)
280 mCells
.front()->setGridSpan(nSpan
);
282 mCells
.back()->setGridSpan(nSpan
);
288 Class that holds the data of a table.
290 class TableData
: public virtual SvRefBase
292 typedef RowData::Pointer_t RowPointer_t
;
293 typedef ::std::vector
<RowPointer_t
> Rows
;
296 the data of the rows of the table
301 pointer to the data of the current row (while building up the table data).
306 depth of the current table in a hierarchy of tables
308 unsigned int mnDepth
;
313 void newRow() { mpRow
= RowPointer_t(new RowData()); }
316 typedef tools::SvRef
<TableData
> Pointer_t
;
318 explicit TableData(unsigned int nDepth
) : mnDepth(nDepth
) { newRow(); }
323 Sets properties of the current row and pushes the row to the
324 back of the rows currently contained in the table.
326 @param pProperties properties of the row to be ended
328 void endRow(TablePropertyMapPtr pProperties
)
330 mpRow
->insertProperties(pProperties
);
331 mRows
.push_back(mpRow
);
336 Add a cell to the current row.
338 @param start start handle of the cell
339 @param end end handle of the cell
340 @param pProps properties of the cell
342 void addCell(const css::uno::Reference
<css::text::XTextRange
>& start
, TablePropertyMapPtr pProps
)
344 mpRow
->addCell(start
, pProps
);
348 End the current cell of the current row.
350 @parm end end handle of the cell
352 void endCell(const css::uno::Reference
<css::text::XTextRange
>& end
)
358 Return if the current cell of the current row is open.
360 bool isCellOpen() const
362 return mpRow
->isCellOpen();
365 void SetCellStart(const css::uno::Reference
<css::text::XTextRange
>& xStart
)
367 mpRow
->SetCellStart(xStart
);
370 bool IsCellValid() const
372 return mpRow
->IsCellValid();
376 Insert properties to the current cell of the current row.
378 @param pProps the properties to add
380 void insertCellProperties(TablePropertyMapPtr pProps
)
382 mpRow
->insertCellProperties(pProps
);
386 Return number of rows in the table.
388 unsigned int getRowCount() const
394 Return depth of table in surrounding table hierarchy.
396 unsigned int getDepth() const
402 Return row data of a certain row.
404 @param i index of the row
406 RowPointer_t
const & getRow(unsigned int i
) const
411 const RowPointer_t
& getCurrentRow() const
420 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */