Line data Source code
1 : /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 : /* TableStyle: Stores (and writes) table-based information that is
3 : * needed at the head of an OO document.
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 : * For further information visit http://libwpd.sourceforge.net
10 : */
11 :
12 : /* "This product is not manufactured, approved, or supported by
13 : * Corel Corporation or Corel Corporation Limited."
14 : */
15 : #include <math.h>
16 : #include "FilterInternal.hxx"
17 : #include "TableStyle.hxx"
18 : #include "DocumentElement.hxx"
19 :
20 : #ifdef _MSC_VER
21 : #include <minmax.h>
22 : #endif
23 :
24 : #include <string.h>
25 :
26 0 : TableCellStyle::TableCellStyle(const WPXPropertyList &xPropList, const char *psName) :
27 : Style(psName),
28 0 : mPropList(xPropList)
29 : {
30 0 : }
31 :
32 0 : void TableCellStyle::write(OdfDocumentHandler *pHandler) const
33 : {
34 0 : TagOpenElement styleOpen("style:style");
35 0 : styleOpen.addAttribute("style:name", getName());
36 0 : styleOpen.addAttribute("style:family", "table-cell");
37 0 : styleOpen.write(pHandler);
38 :
39 : // WLACH_REFACTORING: Only temporary.. a much better solution is to
40 : // generalize this sort of thing into the "Style" superclass
41 0 : WPXPropertyList stylePropList;
42 0 : WPXPropertyList::Iter i(mPropList);
43 0 : for (i.rewind(); i.next();)
44 : {
45 0 : if (strlen(i.key()) > 2 && strncmp(i.key(), "fo", 2) == 0)
46 0 : stylePropList.insert(i.key(), i()->clone());
47 : }
48 0 : stylePropList.insert("fo:padding", "0.0382in");
49 0 : pHandler->startElement("style:table-cell-properties", stylePropList);
50 0 : pHandler->endElement("style:table-cell-properties");
51 :
52 0 : pHandler->endElement("style:style");
53 0 : }
54 :
55 0 : TableRowStyle::TableRowStyle(const WPXPropertyList &propList, const char *psName) :
56 : Style(psName),
57 0 : mPropList(propList)
58 : {
59 0 : }
60 :
61 0 : void TableRowStyle::write(OdfDocumentHandler *pHandler) const
62 : {
63 0 : TagOpenElement styleOpen("style:style");
64 0 : styleOpen.addAttribute("style:name", getName());
65 0 : styleOpen.addAttribute("style:family", "table-row");
66 0 : styleOpen.write(pHandler);
67 :
68 0 : TagOpenElement stylePropertiesOpen("style:table-row-properties");
69 0 : if (mPropList["style:min-row-height"])
70 0 : stylePropertiesOpen.addAttribute("style:min-row-height", mPropList["style:min-row-height"]->getStr());
71 0 : else if (mPropList["style:row-height"])
72 0 : stylePropertiesOpen.addAttribute("style:row-height", mPropList["style:row-height"]->getStr());
73 0 : stylePropertiesOpen.addAttribute("fo:keep-together", "auto");
74 0 : stylePropertiesOpen.write(pHandler);
75 0 : pHandler->endElement("style:table-row-properties");
76 :
77 0 : pHandler->endElement("style:style");
78 0 : }
79 :
80 :
81 0 : TableStyle::TableStyle(const WPXPropertyList &xPropList, const WPXPropertyListVector &columns, const char *psName) :
82 : Style(psName),
83 : mPropList(xPropList),
84 0 : mColumns(columns)
85 : {
86 0 : }
87 :
88 0 : TableStyle::~TableStyle()
89 : {
90 : typedef std::vector<TableCellStyle *>::iterator TCSVIter;
91 : typedef std::vector<TableRowStyle *>::iterator TRSVIter;
92 0 : for (TCSVIter iterTableCellStyles = mTableCellStyles.begin() ; iterTableCellStyles != mTableCellStyles.end(); ++iterTableCellStyles)
93 0 : delete(*iterTableCellStyles);
94 0 : for (TRSVIter iterTableRowStyles = mTableRowStyles.begin() ; iterTableRowStyles != mTableRowStyles.end(); ++iterTableRowStyles)
95 0 : delete(*iterTableRowStyles);
96 0 : }
97 :
98 0 : void TableStyle::write(OdfDocumentHandler *pHandler) const
99 : {
100 0 : TagOpenElement styleOpen("style:style");
101 0 : styleOpen.addAttribute("style:name", getName());
102 0 : styleOpen.addAttribute("style:family", "table");
103 0 : if (getMasterPageName())
104 0 : styleOpen.addAttribute("style:master-page-name", getMasterPageName()->cstr());
105 0 : styleOpen.write(pHandler);
106 :
107 0 : TagOpenElement stylePropertiesOpen("style:table-properties");
108 0 : if (mPropList["table:align"])
109 0 : stylePropertiesOpen.addAttribute("table:align", mPropList["table:align"]->getStr());
110 0 : if (mPropList["fo:margin-left"])
111 0 : stylePropertiesOpen.addAttribute("fo:margin-left", mPropList["fo:margin-left"]->getStr());
112 0 : if (mPropList["fo:margin-right"])
113 0 : stylePropertiesOpen.addAttribute("fo:margin-right", mPropList["fo:margin-right"]->getStr());
114 0 : if (mPropList["style:width"])
115 0 : stylePropertiesOpen.addAttribute("style:width", mPropList["style:width"]->getStr());
116 0 : if (mPropList["fo:break-before"])
117 0 : stylePropertiesOpen.addAttribute("fo:break-before", mPropList["fo:break-before"]->getStr());
118 0 : stylePropertiesOpen.write(pHandler);
119 :
120 0 : pHandler->endElement("style:table-properties");
121 :
122 0 : pHandler->endElement("style:style");
123 :
124 0 : int i=1;
125 0 : WPXPropertyListVector::Iter j(mColumns);
126 0 : for (j.rewind(); j.next();)
127 : {
128 0 : TagOpenElement columnStyleOpen("style:style");
129 0 : WPXString sColumnName;
130 0 : sColumnName.sprintf("%s.Column%i", getName().cstr(), i);
131 0 : columnStyleOpen.addAttribute("style:name", sColumnName);
132 0 : columnStyleOpen.addAttribute("style:family", "table-column");
133 0 : columnStyleOpen.write(pHandler);
134 :
135 0 : pHandler->startElement("style:table-column-properties", j());
136 0 : pHandler->endElement("style:table-column-properties");
137 :
138 0 : pHandler->endElement("style:style");
139 :
140 0 : i++;
141 0 : }
142 :
143 : typedef std::vector<TableRowStyle *>::const_iterator TRSVIter;
144 0 : for (TRSVIter iterTableRow = mTableRowStyles.begin() ; iterTableRow != mTableRowStyles.end(); ++iterTableRow)
145 0 : (*iterTableRow)->write(pHandler);
146 :
147 : typedef std::vector<TableCellStyle *>::const_iterator TCSVIter;
148 0 : for (TCSVIter iterTableCell = mTableCellStyles.begin() ; iterTableCell != mTableCellStyles.end(); ++iterTableCell)
149 0 : (*iterTableCell)->write(pHandler);
150 0 : }
151 :
152 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|