Line data Source code
1 : /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 : /* ListStyle: Stores (and writes) list-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 :
10 : /* "This product is not manufactured, approved, or supported by
11 : * Corel Corporation or Corel Corporation Limited."
12 : */
13 : #include "FilterInternal.hxx"
14 : #include "ListStyle.hxx"
15 : #include "DocumentElement.hxx"
16 :
17 0 : OrderedListLevelStyle::OrderedListLevelStyle(const WPXPropertyList &xPropList) :
18 0 : mPropList(xPropList)
19 : {
20 0 : }
21 :
22 0 : void OrderedListStyle::updateListLevel(const int iLevel, const WPXPropertyList &xPropList)
23 : {
24 0 : if (iLevel < 0)
25 0 : return;
26 0 : if (!isListLevelDefined(iLevel))
27 0 : setListLevel(iLevel, new OrderedListLevelStyle(xPropList));
28 : }
29 :
30 0 : void OrderedListLevelStyle::write(OdfDocumentHandler *pHandler, int iLevel) const
31 : {
32 0 : WPXString sLevel;
33 0 : sLevel.sprintf("%i", (iLevel+1));
34 :
35 0 : TagOpenElement listLevelStyleOpen("text:list-level-style-number");
36 0 : listLevelStyleOpen.addAttribute("text:level", sLevel);
37 0 : listLevelStyleOpen.addAttribute("text:style-name", "Numbering_Symbols");
38 0 : if (mPropList["style:num-prefix"])
39 : {
40 0 : WPXString sEscapedString(mPropList["style:num-prefix"]->getStr(), true);
41 0 : listLevelStyleOpen.addAttribute("style:num-prefix", sEscapedString);
42 : }
43 0 : if (mPropList["style:num-suffix"])
44 : {
45 0 : WPXString sEscapedString(mPropList["style:num-suffix"]->getStr(), true);
46 0 : listLevelStyleOpen.addAttribute("style:num-suffix", sEscapedString);
47 : }
48 0 : if (mPropList["style:num-format"])
49 0 : listLevelStyleOpen.addAttribute("style:num-format", mPropList["style:num-format"]->getStr());
50 0 : if (mPropList["text:start-value"])
51 : {
52 : // odf as to the version 1.1 does require the text:start-value to be a positive integer, means > 0
53 0 : if (mPropList["text:start-value"]->getInt() > 0)
54 0 : listLevelStyleOpen.addAttribute("text:start-value", mPropList["text:start-value"]->getStr());
55 : else
56 0 : listLevelStyleOpen.addAttribute("text:start-value", "1");
57 : }
58 0 : listLevelStyleOpen.write(pHandler);
59 :
60 0 : TagOpenElement stylePropertiesOpen("style:list-level-properties");
61 0 : if (mPropList["text:space-before"] && mPropList["text:space-before"]->getDouble() > 0.0)
62 0 : stylePropertiesOpen.addAttribute("text:space-before", mPropList["text:space-before"]->getStr());
63 0 : if (mPropList["text:min-label-width"] && mPropList["text:min-label-width"]->getDouble() > 0.0)
64 0 : stylePropertiesOpen.addAttribute("text:min-label-width", mPropList["text:min-label-width"]->getStr());
65 0 : if (mPropList["text:min-label-distance"] && mPropList["text:min-label-distance"]->getDouble() > 0.0)
66 0 : stylePropertiesOpen.addAttribute("text:min-label-distance", mPropList["text:min-label-distance"]->getStr());
67 0 : stylePropertiesOpen.write(pHandler);
68 :
69 0 : pHandler->endElement("style:list-level-properties");
70 0 : pHandler->endElement("text:list-level-style-number");
71 0 : }
72 :
73 0 : UnorderedListLevelStyle::UnorderedListLevelStyle(const WPXPropertyList &xPropList)
74 0 : : mPropList(xPropList)
75 : {
76 0 : }
77 :
78 0 : void UnorderedListStyle::updateListLevel(const int iLevel, const WPXPropertyList &xPropList)
79 : {
80 0 : if (iLevel < 0)
81 0 : return;
82 0 : if (!isListLevelDefined(iLevel))
83 0 : setListLevel(iLevel, new UnorderedListLevelStyle(xPropList));
84 : }
85 :
86 0 : void UnorderedListLevelStyle::write(OdfDocumentHandler *pHandler, int iLevel) const
87 : {
88 0 : WPXString sLevel;
89 0 : sLevel.sprintf("%i", (iLevel+1));
90 0 : TagOpenElement listLevelStyleOpen("text:list-level-style-bullet");
91 0 : listLevelStyleOpen.addAttribute("text:level", sLevel);
92 0 : listLevelStyleOpen.addAttribute("text:style-name", "Bullet_Symbols");
93 0 : if (mPropList["text:bullet-char"] && (mPropList["text:bullet-char"]->getStr().len()))
94 : {
95 : // The following is needed because the odf format does not accept bullet chars longer than one character
96 0 : WPXString::Iter i(mPropList["text:bullet-char"]->getStr());
97 0 : i.rewind();
98 0 : WPXString sEscapedString(".");
99 0 : if (i.next())
100 0 : sEscapedString = WPXString(i(), true);
101 0 : listLevelStyleOpen.addAttribute("text:bullet-char", sEscapedString);
102 :
103 : }
104 : else
105 0 : listLevelStyleOpen.addAttribute("text:bullet-char", ".");
106 0 : listLevelStyleOpen.write(pHandler);
107 :
108 0 : TagOpenElement stylePropertiesOpen("style:list-level-properties");
109 0 : if (mPropList["text:space-before"] && mPropList["text:space-before"]->getDouble() > 0.0)
110 0 : stylePropertiesOpen.addAttribute("text:space-before", mPropList["text:space-before"]->getStr());
111 0 : if (mPropList["text:min-label-width"] && mPropList["text:min-label-width"]->getDouble() > 0.0)
112 0 : stylePropertiesOpen.addAttribute("text:min-label-width", mPropList["text:min-label-width"]->getStr());
113 0 : if (mPropList["text:min-label-distance"] && mPropList["text:min-label-distance"]->getDouble() > 0.0)
114 0 : stylePropertiesOpen.addAttribute("text:min-label-distance", mPropList["text:min-label-distance"]->getStr());
115 0 : stylePropertiesOpen.addAttribute("style:font-name", "OpenSymbol");
116 0 : stylePropertiesOpen.write(pHandler);
117 :
118 0 : pHandler->endElement("style:list-level-properties");
119 0 : pHandler->endElement("text:list-level-style-bullet");
120 0 : }
121 :
122 0 : ListStyle::ListStyle(const char *psName, const int iListID) :
123 : Style(psName),
124 0 : miListID(iListID)
125 : {
126 0 : for (int i=0; i<WP6_NUM_LIST_LEVELS; ++i)
127 0 : mppListLevels[i] = 0;
128 :
129 0 : }
130 :
131 0 : ListStyle::~ListStyle()
132 : {
133 0 : for (int i=0; i<WP6_NUM_LIST_LEVELS; ++i)
134 : {
135 0 : if (mppListLevels[i])
136 0 : delete(mppListLevels[i]);
137 : }
138 :
139 0 : }
140 :
141 0 : bool ListStyle::isListLevelDefined(int iLevel) const
142 : {
143 0 : if (!mppListLevels[iLevel])
144 0 : return false;
145 :
146 0 : return true;
147 : }
148 :
149 0 : void ListStyle::setListLevel(int iLevel, ListLevelStyle *iListLevelStyle)
150 : {
151 : // can't uncomment this next line without adding some extra logic.
152 : // figure out which is best: use the initial message, or constantly
153 : // update?
154 0 : if (!mppListLevels[iLevel])
155 0 : mppListLevels[iLevel] = iListLevelStyle;
156 0 : }
157 :
158 0 : void ListStyle::write(OdfDocumentHandler *pHandler) const
159 : {
160 0 : TagOpenElement listStyleOpenElement("text:list-style");
161 0 : listStyleOpenElement.addAttribute("style:name", getName());
162 0 : listStyleOpenElement.write(pHandler);
163 :
164 0 : for (int i=0; i<WP6_NUM_LIST_LEVELS; ++i)
165 : {
166 0 : if (mppListLevels[i])
167 0 : mppListLevels[i]->write(pHandler, i);
168 : }
169 :
170 0 : pHandler->endElement("text:list-style");
171 0 : }
172 :
173 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|