1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220
|
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
/*
* This file is part of the LibreOffice project.
*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
*
* This file incorporates work covered by the following license notice:
*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed
* with this work for additional information regarding copyright
* ownership. The ASF licenses this file to you under the Apache
* License, Version 2.0 (the "License"); you may not use this file
* except in compliance with the License. You may obtain a copy of
* the License at http://www.apache.org/licenses/LICENSE-2.0 .
*/
#ifndef INCLUDED_SW_SOURCE_FILTER_XML_XMLTBLI_HXX
#define INCLUDED_SW_SOURCE_FILTER_XML_XMLTBLI_HXX
#include <xmloff/XMLTextTableContext.hxx>
// STL include
#include <boost/unordered_map.hpp>
#include <boost/ptr_container/ptr_vector.hpp>
#include <vector>
class SwXMLImport;
class SwTableNode;
class SwTableBox;
class SwTableLine;
class SwStartNode;
class SwTableBoxFmt;
class SwTableLineFmt;
class SwXMLTableCell_Impl;
class SwXMLTableRow_Impl;
typedef boost::ptr_vector<SwXMLTableRow_Impl> SwXMLTableRows_Impl;
class SwXMLDDETableContext_Impl;
class TableBoxIndexHasher;
class TableBoxIndex;
namespace com { namespace sun { namespace star {
namespace text { class XTextContent; }
namespace text { class XTextCursor; }
} } }
class SwXMLTableContext : public XMLTextTableContext
{
OUString aStyleName;
OUString aDfltCellStyleName;
/// NB: this contains the xml:id only if this table is a subtable!
OUString mXmlId;
//! Holds basic information about a column's width.
struct ColumnWidthInfo {
sal_uInt16 width; //!< Column width (absolute or relative).
bool isRelative; //!< True for a relative width, false for absolute.
inline ColumnWidthInfo(sal_uInt16 wdth, bool isRel) : width(wdth), isRelative(isRel) {};
};
std::vector<ColumnWidthInfo> aColumnWidths;
std::vector<OUString> *pColumnDefaultCellStyleNames;
::com::sun::star::uno::Reference <
::com::sun::star::text::XTextCursor > xOldCursor;
::com::sun::star::uno::Reference <
::com::sun::star::text::XTextContent > xTextContent;
SwXMLTableRows_Impl *pRows;
SwTableNode *pTableNode;
SwTableBox *pBox1;
const SwStartNode *pSttNd1;
SwTableBoxFmt *pBoxFmt;
SwTableLineFmt *pLineFmt;
// hash map of shared format, indexed by the (XML) style name,
// the column width, and protection flag
typedef boost::unordered_map<TableBoxIndex,SwTableBoxFmt*,
TableBoxIndexHasher> map_BoxFmt;
map_BoxFmt* pSharedBoxFormats;
SvXMLImportContextRef xParentTable; // if table is a sub table
SwXMLDDETableContext_Impl *pDDESource;
bool bFirstSection : 1;
bool bRelWidth : 1;
bool bHasSubTables : 1;
sal_uInt16 nHeaderRows;
sal_uInt32 nCurRow;
sal_uInt32 nCurCol;
sal_Int32 nWidth;
SwTableBox *NewTableBox( const SwStartNode *pStNd,
SwTableLine *pUpper );
SwTableBox *MakeTableBox( SwTableLine *pUpper,
const SwXMLTableCell_Impl *pStartNode,
sal_uInt32 nTopRow, sal_uInt32 nLeftCol,
sal_uInt32 nBottomRow, sal_uInt32 nRightCol );
SwTableBox *MakeTableBox( SwTableLine *pUpper,
sal_uInt32 nTopRow, sal_uInt32 nLeftCol,
sal_uInt32 nBottomRow, sal_uInt32 nRightCol );
SwTableLine *MakeTableLine( SwTableBox *pUpper,
sal_uInt32 nTopRow, sal_uInt32 nLeftCol,
sal_uInt32 nBottomRow, sal_uInt32 nRightCol );
void _MakeTable( SwTableBox *pBox=0 );
void MakeTable( SwTableBox *pBox, sal_Int32 nWidth );
void MakeTable();
inline SwXMLTableContext *GetParentTable() const;
const SwStartNode *GetPrevStartNode( sal_uInt32 nRow,
sal_uInt32 nCol ) const;
inline const SwStartNode *GetLastStartNode() const;
void FixRowSpan( sal_uInt32 nRow, sal_uInt32 nCol, sal_uInt32 nColSpan );
void ReplaceWithEmptyCell( sal_uInt32 nRow, sal_uInt32 nCol, bool bRows );
/** sets the appropriate SwTblBoxFmt at pBox. */
SwTableBoxFmt* GetSharedBoxFormat(
SwTableBox* pBox, /// the table box
const OUString& rStyleName, /// XML style name
sal_Int32 nColumnWidth, /// width of column
bool bProtected, /// is cell protected?
bool bMayShare, /// may the format be shared (no value, formula...)
bool& bNew, /// true, if the format it not from the cache
bool* pModifyLocked ); /// if set, call pBox->LockModify() and return old lock status
public:
TYPEINFO_OVERRIDE();
SwXMLTableContext( SwXMLImport& rImport, sal_uInt16 nPrfx,
const OUString& rLName,
const ::com::sun::star::uno::Reference<
::com::sun::star::xml::sax::XAttributeList > & xAttrList );
SwXMLTableContext( SwXMLImport& rImport, sal_uInt16 nPrfx,
const OUString& rLName,
const ::com::sun::star::uno::Reference<
::com::sun::star::xml::sax::XAttributeList > & xAttrList,
SwXMLTableContext *pTable,
const OUString& i_rXmlId );
virtual ~SwXMLTableContext();
virtual SvXMLImportContext *CreateChildContext( sal_uInt16 nPrefix,
const OUString& rLocalName,
const ::com::sun::star::uno::Reference<
::com::sun::star::xml::sax::XAttributeList > & xAttrList ) SAL_OVERRIDE;
SwXMLImport& GetSwImport() { return (SwXMLImport&)GetImport(); }
void InsertColumn( sal_Int32 nWidth, bool bRelWidth,
const OUString *pDfltCellStyleName = 0 );
sal_Int32 GetColumnWidth( sal_uInt32 nCol, sal_uInt32 nColSpan=1UL ) const;
OUString GetColumnDefaultCellStyleName( sal_uInt32 nCol ) const;
inline sal_uInt32 GetColumnCount() const;
inline bool HasColumnDefaultCellStyleNames() const;
bool IsInsertCellPossible() const { return nCurCol < GetColumnCount(); }
bool IsInsertColPossible() const { return nCurCol < USHRT_MAX; }
bool IsInsertRowPossible() const { return nCurRow < USHRT_MAX; }
bool IsValid() const { return pTableNode != 0; }
void InsertCell( const OUString& rStyleName,
sal_uInt32 nRowSpan=1U, sal_uInt32 nColSpan=1U,
const SwStartNode *pStNd=0,
const OUString & i_rXmlId = OUString(),
SwXMLTableContext *pTable=0,
bool bIsProtected = false,
const OUString *pFormula=0,
bool bHasValue = false,
double fValue = 0.0,
OUString const*const pStringValue = 0);
void InsertRow( const OUString& rStyleName,
const OUString& rDfltCellStyleName,
bool bInHead,
const OUString & i_rXmlId = OUString() );
void FinishRow();
void InsertRepRows( sal_uInt32 nCount );
const SwXMLTableCell_Impl *GetCell( sal_uInt32 nRow, sal_uInt32 nCol ) const;
SwXMLTableCell_Impl *GetCell( sal_uInt32 nRow, sal_uInt32 nCol );
const SwStartNode *InsertTableSection(const SwStartNode *pPrevSttNd = 0,
OUString const* pStringValueStyleName = 0);
virtual void EndElement() SAL_OVERRIDE;
virtual ::com::sun::star::uno::Reference <
::com::sun::star::text::XTextContent > GetXTextContent() const SAL_OVERRIDE;
void SetHasSubTables( bool bNew ) { bHasSubTables = bNew; }
};
inline SwXMLTableContext *SwXMLTableContext::GetParentTable() const
{
return (SwXMLTableContext *)&xParentTable;
}
inline sal_uInt32 SwXMLTableContext::GetColumnCount() const
{
return aColumnWidths.size();
}
inline const SwStartNode *SwXMLTableContext::GetLastStartNode() const
{
return GetPrevStartNode( 0UL, GetColumnCount() );
}
inline bool SwXMLTableContext::HasColumnDefaultCellStyleNames() const
{
return pColumnDefaultCellStyleNames != 0;
}
#endif
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|