filters

pptxml.cpp
1/*
2 Copyright (C) 2000, S.R.Haque <shaheedhaque@hotmail.com>.
3 This file is part of the KDE project
4
5 This library is free software; you can redistribute it and/or
6 modify it under the terms of the GNU Library General Public
7 License as published by the Free Software Foundation; either
8 version 2 of the License, or (at your option) any later version.
9
10 This library is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 Library General Public License for more details.
14
15 You should have received a copy of the GNU Library General Public License
16 along with this library; see the file COPYING.LIB. If not, write to
17 the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
18 Boston, MA 02110-1301, USA.
19
20DESCRIPTION
21*/
22
23#include <pptdoc.h>
24#include <pptxml.h>
25#include <tqobject.h>
26#include <KoGlobal.h>
27
28const int PptXml::s_area = 30512;
29
30PptXml::PptXml(
31 const myFile &mainStream,
32 const myFile &currentUser,
33 const myFile &pictures):
34 PptDoc(
35 mainStream,
36 currentUser,
37 pictures)
38{
39 m_isConverted = false;
40 m_success = false;
41 m_half = false;
42 m_y = 0;
43}
44
45PptXml::~PptXml()
46{
47}
48
49bool PptXml::convert()
50{
51 if (!m_isConverted)
52 {
53 // m_y = 30;
54 m_success = parse();
55 m_isConverted = true;
56 }
57 return m_success;
58}
59
60void PptXml::encode(TQString &text)
61{
62 // When encoding the stored form of text to its run-time form,
63 // be sure to do the conversion for "&amp;" to "&" first to avoid
64 // accidentally converting user text into one of the other escape
65 // sequences.
66
67 text.replace('&', "&amp;");
68 text.replace('<', "&lt;");
69 text.replace('>', "&gt;"); // Needed to avoid ]]>
70
71 // Strictly, there is no need to encode " or ', but we do so to allow
72 // them to co-exist!
73
74 text.replace('"', "&quot;");
75 text.replace('\'', "&apos;");
76}
77
78const TQString PptXml::getXml() const
79{
80 TQString body = "<?xml version=\"1.0\" encoding=\"UTF-8\"?><!DOCTYPE DOC>\n"
81 "<DOC mime=\"application/x-kpresenter\" email=\"reggie@kde.org\" syntaxVersion=\"2\" author=\"Reginald Stadlbauer\" editor=\"Powerpoint import filter\">\n"
82 " <PAPER ptWidth=\"680\" unit=\"0\" format=\"5\" orientation=\"0\" ptHeight=\"510\">\n"
83 " <PAPERBORDERS ptRight=\"0\" ptBottom=\"0\" ptLeft=\"0\" ptTop=\"0\"/>\n"
84 " </PAPER>\n"
85 " <BACKGROUND rastX=\"10\" rastY=\"10\" color=\"#ffffff\">\n";
86 body += m_pages;
87 body += " </BACKGROUND>\n"
88 " <HEADER show=\"0\">\n"
89 " <ORIG x=\"0\" y=\"0\"/>\n"
90 " <SIZE width=\"680\" height=\"20\"/>\n"
91 " <PEN width=\"1\" style=\"0\" color=\"#000000\"/>\n"
92 " <TEXTOBJ>\n"
93 " <P/>\n"
94 " </TEXTOBJ>\n"
95 " </HEADER>\n"
96 " <FOOTER show=\"0\">\n"
97 " <ORIG x=\"0\" y=\"430\"/>\n"
98 " <SIZE width=\"680\" height=\"20\"/>\n"
99 " <PEN width=\"1\" style=\"0\" color=\"#000000\"/>\n"
100 " <TEXTOBJ>\n"
101 " <P/>\n"
102 " </TEXTOBJ>\n"
103 " </FOOTER>\n"
104 " <PAGETITLES>\n";
105 body += m_titles;
106 body += " </PAGETITLES>\n"
107 " <PAGENOTES>\n";
108 body += m_notes;
109 body += " </PAGENOTES>\n"
110 " <OBJECTS>\n";
111 body += m_text;
112 body += " </OBJECTS>\n"
113 " <INFINITLOOP value=\"0\"/>\n"
114 " <MANUALSWITCH value=\"1\"/>\n"
115 " <PRESSPEED value=\"1\"/>\n"
116 " <PRESSLIDES value=\"0\"/>\n"
117 " <SELSLIDES>\n"
118 " <SLIDE nr=\"0\" show=\"1\"/>\n"
119 " </SELSLIDES>\n"
120 " <PIXMAPS>\n"
121 " </PIXMAPS>\n"
122 " <CLIPARTS>\n"
123 " </CLIPARTS>\n";
124 body += m_embedded;
125 body += "</DOC>\n";
126 //kdDebug(s_area) << body << endl;
127 return body;
128}
129
130void PptXml::gotDrawing(
131 unsigned id,
132 TQString type,
133 unsigned length,
134 const char *data)
135{
136 TQString ourKey;
137 TQString uid;
138 TQString mimeType;
139 TQString filterArgs;
140
141 // Send the picture to the outside world and get back the UID.
142
143 ourKey = "vectorGraphic" + TQString::number(id) + "." + type;
144 if (type == "msod")
145 {
146 filterArgs = "shape-id=";
147 filterArgs += TQString::number(id);
148 filterArgs += ";delay-stream=";
149 filterArgs += TQString::number(0);
150 }
151 emit signalSavePart(
152 ourKey,
153 uid,
154 mimeType,
155 type,
156 length,
157 data);
158
159 // Add an entry to the list of embedded objects too. TBD: fix
160 // RECT and FRAME settings.
161if (mimeType != "application/x-kontour")
162{
163 m_embedded += " <EMBEDDED>\n"
164 "<OBJECT url=\"" +
165 uid +
166 "\" mime=\"" +
167 mimeType +
168 "\">\n<RECT x=\"30\" y=\"190\" w=\"120\" h=\"80\"/>\n"
169 "</OBJECT>\n"
170 "<SETTINGS>\n"
171 "<EFFECTS effect=\"0\" effect2=\"0\"/>\n"
172 "<PEN red=\"0\" green=\"0\" blue=\"0\" width=\"1\" style=\"0\"/>\n"
173 "<BRUSH red=\"0\" green=\"0\" blue=\"0\" style=\"0\"/>\n"
174 "<PRESNUM value=\"0\"/>\n"
175 "<ANGLE value=\"0\"/>\n"
176 "<FILLTYPE value=\"0\"/>\n"
177 "<GRADIENT red1=\"255\" green1=\"0\" blue1=\"0\" red2=\"0\" green2=\"255\" blue2=\"0\" type=\"1\" unbalanced=\"0\" xfactor=\"100\" yfactor=\"100\"/>\n"
178 "<DISAPPEAR effect=\"0\" doit=\"0\" num=\"1\"/>\n"
179 "</SETTINGS>\n"
180 " </EMBEDDED>\n";
181}
182}
183
184void PptXml::gotSlide(PptSlide &slide)
185{
186 static const unsigned pageHeight = 510;
187 TQ_UINT16 numbOfPholders = 0;
188 m_pages += " <PAGE/>\n";
189 numbOfPholders = slide.getNumberOfPholders();
190 for(TQ_UINT16 i = 0; i < numbOfPholders; i++)
191 {
192 slide.gotoPlaceholder(i);
193 setPlaceholder(slide);
194 }
195 m_y += pageHeight;
196}
197
198void PptXml::setPlaceholder(PptSlide &slide)
199{
200 TQString xml_friendly;
201 unsigned i = 0;
202 bool bulletedList = false; //is this a bulleted list?
203 TQ_UINT16 type; //type of text
204 TQString x; //x of placeholder
205 TQString align; //align of text
206 TQString height ; //height of placeholder
207 TQString width ; //width of placeholder
208 TQString pointSize; //font size
209
210 xml_friendly = *slide.getPlaceholderText().at(i);
211 encode(xml_friendly);
212
213 type = slide.getPlaceholderType();
214 TQ_UINT16 y = 0;
215
216 switch (type)
217 {
218 case TITLE_TEXT:
219 y = 30;
220 height = TQString::number(55);
221 x = TQString::number(30);
222 width = TQString::number(610);
223 align = TQString::number(ALIGN_CENTER);
224 pointSize = TQString::number(44);
225 bulletedList = false;
226 m_titles += " <Title title=\"" + xml_friendly + "\" />\n";
227 break;
228 case CENTER_TITLE_TEXT:
229 y = 130;
230 x = TQString::number(45);
231 height = TQString::number(55);
232 width = TQString::number(610);
233 align = TQString::number(ALIGN_CENTER);
234 pointSize = TQString::number(44);
235 bulletedList = false;
236 m_titles += " <Title title=\"" + xml_friendly + "\" />\n";
237 break;
238 case CENTER_BODY_TEXT:
239 y = 200;
240 x = TQString::number(35);
241 height = TQString::number(37);
242 width = TQString::number(610);
243 align = TQString::number(ALIGN_CENTER);
244 pointSize = TQString::number(32);
245 bulletedList = false;
246 break;
247 case NOTES_TEXT:
248 m_notes += " <Note note=\"\" />\n";
249 break;
250 case BODY_TEXT:
251 y = 130;
252 x = TQString::number(35);
253 height = TQString::number(268);
254 width = TQString::number(610);
255 align = TQString::number(ALIGN_LEFT);
256 pointSize = TQString::number(28);
257 bulletedList = true;
258 break;
259 case OTHER_TEXT:
260 case HALF_BODY_TEXT:
261 case QUARTER_BODY_TEXT:
262 y = 130;
263 if(m_half)
264 {
265 x = TQString::number(335);
266 width = TQString::number(300);
267 m_half = false;
268 }
269 else
270 {
271 x = TQString::number(30);
272 width = TQString::number(300);
273 m_half = true;
274 }
275 height = TQString::number(268);
276 align = TQString::number(ALIGN_LEFT);
277 pointSize = TQString::number(28);
278 bulletedList = true;
279 break;
280 default:
281 return;
282 break;
283 }
284
285 m_text += "<OBJECT type=\"4\">\n"
286 " <ORIG x=\""+x+"\" y=\""+TQString::number(y + m_y)+"\"/>\n"
287 " <SIZE width=\""+width+"\" height=\""+ height +"\"/>\n"
288 " <PEN width=\"1\" style=\"0\" color=\"#000000\"/>\n"
289 " <TEXTOBJ>\n"
290 " <P align=\""+align+"\">\n";
291 if(bulletedList)
292 m_text += " <COUNTER numberingtype=\"0\" type=\"10\" depth=\"0\" />\n";
293 m_text += " <TEXT family=\"utopia\" pointSize=\""+pointSize+"\" color=\"#000000\">";
294
295 for (i = 0; i < slide.getPlaceholderText().count(); i++)
296 {
297 xml_friendly = *slide.getPlaceholderText().at(i);
298 encode(xml_friendly);
299 m_text += xml_friendly;
300 if (i < slide.getPlaceholderText().count() - 1)
301 {
302 m_text += "</TEXT>\n"
303 " </P>\n"
304 " <P align=\"1\">\n";
305 if(bulletedList)
306 m_text += " <COUNTER numberingtype=\"0\" type=\"10\" depth=\"0\" />\n";
307 m_text += " <TEXT family=\"utopia\" pointSize=\""+pointSize+"\" color=\"#000000\">";
308 }
309 }
310 m_text += "</TEXT>\n"
311 " </P>\n"
312 " </TEXTOBJ>\n"
313 "</OBJECT>";
314
315}
316
317#include "pptxml.moc"