Subversion Repositories Scribus

Rev

Rev 16577 | Rev 20735 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
4430 cbradney 1
/*
2
For general Scribus (>=1.3.2) copyright and licensing information please refer
3
to the COPYING file provided with the program. Following this notice may exist
4
a copyright and/or license notice that predates the release of Scribus 1.3.2
5
for which a new license (GPL+exception) is in place.
6
*/
834 tsoots 7
 /***************************************************************************
8
  *   Copyright (C) 2004 by Riku Leino                                      *
1157 tsoots 9
  *   tsoots@gmail.com                                                      *
834 tsoots 10
  *                                                                         *
11
  *   This program is free software; you can redistribute it and/or modify  *
12
  *   it under the terms of the GNU General Public License as published by  *
13
  *   the Free Software Foundation; either version 2 of the License, or     *
14
  *   (at your option) any later version.                                   *
15
  *                                                                         *
16
  *   This program is distributed in the hope that it will be useful,       *
17
  *   but WITHOUT ANY WARRANTY; without even the implied warranty of        *
18
  *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         *
19
  *   GNU General Public License for more details.                          *
20
  *                                                                         *
21
  *   You should have received a copy of the GNU General Public License     *
22
  *   along with this program; if not, write to the                         *
23
  *   Free Software Foundation, Inc.,                                       *
18122 mrdocs 24
  *   51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.             *
834 tsoots 25
  ***************************************************************************/
26
 
27
 #include "stylereader.h"
28
 
2986 craig 29
 #include <scribusstructs.h>
834 tsoots 30
 #include <gtmeasure.h>
415 Franz 31
 #include <gtparagraphstyle.h>
32
 #include <gtframestyle.h>
33
 #include <gtfont.h>
9535 fschmid 34
#include <QByteArray>
834 tsoots 35
 
36
 StyleReader* StyleReader::sreader = NULL;
37
 
38
 extern xmlSAXHandlerPtr sSAXHandler;
39
 
1157 tsoots 40
StyleReader::StyleReader(QString documentName, gtWriter *w,
41
                         bool textOnly, bool prefix, bool combineStyles)
411 Franz 42
{
834 tsoots 43
        sreader      = this;
44
        docname      = documentName;
45
        readProperties = false;
46
        writer       = w;
47
        importTextOnly = textOnly;
48
        usePrefix    = prefix;
1157 tsoots 49
        packStyles   = combineStyles;
834 tsoots 50
        currentStyle = NULL;
51
        parentStyle  = NULL;
52
        inList       = false;
53
        currentList  = "";
420 Franz 54
        defaultStyleCreated = false;
411 Franz 55
}
834 tsoots 56
 
57
 bool StyleReader::startElement(const QString&, const QString&, const QString &name, const QXmlAttributes &attrs)
58
 {
59
        if (name == "style:default-style")
60
                defaultStyle(attrs);
61
        else if (name == "style:properties")
62
                styleProperties(attrs);
63
        else if (name == "style:style")
64
        {
10118 jghali 65
                /*if (!defaultStyleCreated)
420 Franz 66
                {
10111 jghali 67
                        gtParagraphStyle* pstyle = new gtParagraphStyle(*(writer->getDefaultStyle()));
68
                        pstyle->setDefaultStyle(true);
69
                        currentStyle = dynamic_cast<gtStyle*>(pstyle);
420 Franz 70
                        currentStyle->setName("default-style");
71
                        defaultStyleCreated = true;
10118 jghali 72
                }*/
834 tsoots 73
                styleStyle(attrs);
74
        }
75
        else if (name == "style:tab-stop")
76
                tabStop(attrs);
77
        else if (name == "text:list-style")
78
        {
79
                for (int i = 0; i < attrs.count(); ++i)
80
                        if (attrs.localName(i) == "style:name")
81
                                currentList = attrs.value(i);
82
                inList = true;
83
        }
84
        else if (((name == "text:list-level-style-bullet") ||
439 tsoots 85
                  (name == "text:list-level-style-number") ||
86
                  (name == "text:list-level-style-image")) && (inList))
834 tsoots 87
        {
88
                QString level = "";
89
                for (int i = 0; i < attrs.count(); ++i)
90
                {
91
                        if (attrs.localName(i) == "text:level")
92
                        {
93
                                gtStyle *plist;
94
                                if (attrs.value(i) == "1")
95
                                {
96
                                        plist = listParents[currentList];
97
                                }
98
                                else
99
                                {
100
                                        int level = (attrs.value(i)).toInt();
101
                                        --level;
102
                                        plist = styles[QString(currentList + "_%1").arg(level)];
103
                                }
104
                                gtParagraphStyle *pstyle;
105
                                if (plist == NULL)
106
                                        plist = new gtStyle(*(styles["default-style"]));
107
 
108
                                if (plist->target() == "paragraph")
109
                                {
110
                                        pstyle = dynamic_cast<gtParagraphStyle*>(plist);
9810 avox 111
                                        assert(pstyle != NULL);
834 tsoots 112
                                        gtParagraphStyle* tmp = new gtParagraphStyle(*pstyle);
113
                                        currentStyle = tmp;
114
                                }
115
                                else
116
                                {
117
                                        gtParagraphStyle* tmp = new gtParagraphStyle(*plist);
118
                                        currentStyle = tmp;
119
                                }
120
                                currentStyle->setName(currentList + "_" + attrs.value(i));
121
                        }
122
                }
123
                readProperties = true;
124
        }
125
        else if ((name == "style:drop-cap") && (readProperties))
126
        {
127
                if (currentStyle->target() == "paragraph")
128
                {
129
                        for (int i = 0; i < attrs.count(); ++i)
130
                        {
131
                                if (attrs.localName(i) == "style:lines")
132
                                {
133
                                        bool ok = false;
134
                                        QString sd = attrs.value(i);
135
                                        int dh = sd.toInt(&ok);
136
                                        if (ok)
137
                                        {
138
                                                gtParagraphStyle* s = dynamic_cast<gtParagraphStyle*>(currentStyle);
9810 avox 139
                                                assert(s != NULL);
834 tsoots 140
                                                s->setDropCapHeight(dh);
141
                                                s->setDropCap(true);
142
                                        }
143
                                }
144
                        }
145
                }
146
        }
147
        else if (name == "style:font-decl")
148
        {
149
                QString key = "";
150
                QString family = "";
151
                QString style = "";
152
                for (int i = 0; i < attrs.count(); ++i)
153
                {
154
                        if (attrs.localName(i) == "style:name")
155
                                key = attrs.value(i);
156
                        else if (attrs.localName(i) == "fo:font-family")
157
                        {
158
                                family = attrs.value(i);
159
                                family = family.remove("'");
160
                        }
161
                        else if (attrs.localName(i) == "style:font-style-name")
162
                                style += attrs.value(i) + " ";
163
                }
164
                QString name = family + " " + style;
10394 cbradney 165
                name = name.simplified();
834 tsoots 166
                fonts[key] = name;
167
        }
168
        return true;
169
 }
170
 
171
 void StyleReader::defaultStyle(const QXmlAttributes& attrs)
172
 {
173
        currentStyle = NULL;
174
        for (int i = 0; i < attrs.count(); ++i)
175
                if (attrs.localName(i) == "style:family")
176
                        if (attrs.value(i) == "paragraph")
177
                        {
10111 jghali 178
                                gtParagraphStyle* pstyle = new gtParagraphStyle(*(writer->getDefaultStyle()));
179
                                pstyle->setDefaultStyle(true);
180
                                currentStyle = dynamic_cast<gtStyle*>(pstyle);
420 Franz 181
                                currentStyle->setName("default-style");
834 tsoots 182
                                readProperties = true;
420 Franz 183
                                defaultStyleCreated = true;
834 tsoots 184
                        }
185
 }
186
 
187
 void StyleReader::styleProperties(const QXmlAttributes& attrs)
188
 {
189
        if ((currentStyle == NULL) || (!readProperties))
190
                return;
191
        gtParagraphStyle* pstyle = NULL;
192
        if (currentStyle->target() == "paragraph")
193
                pstyle = dynamic_cast<gtParagraphStyle*>(currentStyle);
194
        else
195
                pstyle = NULL;
196
        QString align = NULL;
197
        QString force = NULL;
198
        bool hasColorTag = false;
199
        for (int i = 0; i < attrs.count(); ++i)
200
        {
201
                if ((attrs.localName(i) == "style:font-name") && (!inList))
202
                        currentStyle->getFont()->setName(getFont(attrs.value(i)));
203
                else if (attrs.localName(i) == "fo:font-size")
204
                {
205
                        double size = 0;
206
                        double psize = 0;
207
                        if (parentStyle != NULL)
208
                                psize = static_cast<double>(parentStyle->getFont()->getSize());
209
                        else if (styles.contains("default-style"))
210
                                psize = static_cast<double>(styles["default-style"]->getFont()->getSize());
211
 
212
                        psize = psize / 10;
213
                        size = getSize(attrs.value(i), psize);
214
                        int nsize = static_cast<int>(size * 10);
215
                        currentStyle->getFont()->setSize(nsize);
1622 tsoots 216
                        if (pstyle)
834 tsoots 217
                                pstyle->setLineSpacing(writer->getPreferredLineSpacing(nsize));
218
                }
219
                else if ((attrs.localName(i) == "fo:line-height") && (parentStyle != NULL))
220
                {
221
                        gtParagraphStyle* ppstyle;
222
                        if (parentStyle->target() == "paragraph")
223
                        {
224
                                ppstyle = dynamic_cast<gtParagraphStyle*>(parentStyle);
9810 avox 225
                                assert(ppstyle != NULL);
226
                                ppstyle->setLineSpacing(getSize(attrs.value(i), writer->getPreferredLineSpacing(currentStyle->getFont()->getSize())));
834 tsoots 227
                        }
228
                }
229
                else if (attrs.localName(i) == "fo:color")
230
                {
231
                        currentStyle->getFont()->setColor(attrs.value(i));
232
                        hasColorTag = true;
233
                }
234
                else if ((attrs.localName(i) == "style:use-window-font-color") && (attrs.value(i) == "true"))
235
                {
236
                        currentStyle->getFont()->setColor("Black");
237
                        hasColorTag = true;
238
                }
239
                else if ((attrs.localName(i) == "fo:font-weight") && (attrs.value(i) == "bold"))
240
                        currentStyle->getFont()->setWeight(BOLD);
241
                else if ((attrs.localName(i) == "fo:font-style") && (attrs.value(i) == "italic"))
242
                        currentStyle->getFont()->setSlant(ITALIC);
243
                else if ((attrs.localName(i) == "style:text-underline") && (attrs.value(i) != "none"))
244
                        currentStyle->getFont()->toggleEffect(UNDERLINE);
245
                else if ((attrs.localName(i) == "style:text-crossing-out") && (attrs.value(i) != "none"))
246
                        currentStyle->getFont()->toggleEffect(STRIKETHROUGH);
247
                else if ((attrs.localName(i) == "fo:font-variant") && (attrs.value(i) == "small-caps"))
248
                        currentStyle->getFont()->toggleEffect(SMALL_CAPS);
249
                else if ((attrs.localName(i) == "style:text-outline") && (attrs.value(i) == "true"))
250
                {
251
                        currentStyle->getFont()->toggleEffect(OUTLINE);
252
                        currentStyle->getFont()->setStrokeColor("Black");
253
                        currentStyle->getFont()->setColor("White");
254
                }
255
                else if (attrs.localName(i) == "fo:letter-spacing")
2501 fschmid 256
                        currentStyle->getFont()->setKerning(static_cast<int>(getSize(attrs.value(i), -1.0)));
834 tsoots 257
                else if (attrs.localName(i) == "style:text-scale")
258
                        currentStyle->getFont()->setHscale(static_cast<int>(getSize(attrs.value(i), -1.0)));
259
                else if ((attrs.localName(i) == "style:text-position") &&
10430 cbradney 260
                        (((attrs.value(i)).indexOf("sub") != -1) ||
834 tsoots 261
                                (((attrs.value(i)).left(1) == "-") && ((attrs.value(i)).left(1) != "0"))))
262
                        currentStyle->getFont()->toggleEffect(SUBSCRIPT);
263
                else if ((attrs.localName(i) == "style:text-position") &&
10430 cbradney 264
                        (((attrs.value(i)).indexOf("super") != -1) ||
834 tsoots 265
                                (((attrs.value(i)).left(1) != "-") && ((attrs.value(i)).left(1) != "0"))))
266
                        currentStyle->getFont()->toggleEffect(SUPERSCRIPT);
267
                else if ((attrs.localName(i) == "fo:margin-top") && (pstyle != NULL))
268
                        pstyle->setSpaceAbove(getSize(attrs.value(i)));
269
                else if ((attrs.localName(i) == "fo:margin-bottom") && (pstyle != NULL))
270
                        pstyle->setSpaceBelow(getSize(attrs.value(i)));
271
                else if ((attrs.localName(i) == "fo:margin-left") && (pstyle != NULL))
272
                {
273
                        if (inList)
274
                                pstyle->setIndent(pstyle->getIndent() + getSize(attrs.value(i)));
275
                        else
276
                                pstyle->setIndent(getSize(attrs.value(i)));    
277
                }
278
                else if ((attrs.localName(i) == "text:space-before") && (pstyle != NULL))
279
                {
280
                        if (inList)
281
                                pstyle->setIndent(pstyle->getIndent() + getSize(attrs.value(i)));
282
                        else
283
                                pstyle->setIndent(getSize(attrs.value(i)));
284
                }
285
                else if ((attrs.localName(i) == "fo:text-indent") && (pstyle != NULL))
286
                        pstyle->setFirstLineIndent(getSize(attrs.value(i)));
287
                else if ((attrs.localName(i) == "fo:text-align") && (pstyle != NULL))
288
                        align = attrs.value(i);
289
                else if ((attrs.localName(i) == "style:justify-single-word") && (pstyle != NULL))
290
                        force = attrs.value(i);
291
        }
8623 subik 292
        // Qt4 NULL->isNull()
293
        if (!align.isNull())
834 tsoots 294
        {
295
                if (align == "end")
296
                        pstyle->setAlignment(RIGHT);
297
                else if (align == "center")
298
                        pstyle->setAlignment(CENTER);
299
                else if (align == "justify")
300
                {
301
                        if (force == "false")
302
                                pstyle->setAlignment(BLOCK);
303
                        else
304
                                pstyle->setAlignment(FORCED);
305
                }
306
        }
307
        if (!hasColorTag)
308
                currentStyle->getFont()->setColor("Black");
309
 }
310
 
311
 void StyleReader::styleStyle(const QXmlAttributes& attrs)
312
 {
313
        QString name = "";
314
        QString listName = NULL;
10118 jghali 315
        bool setDefaultStyle = false;
834 tsoots 316
        bool isParaStyle = false;
317
        bool create = true;
10118 jghali 318
 
319
        if (!defaultStyleCreated)
320
        {
321
                gtParagraphStyle* pstyle = new gtParagraphStyle(*(writer->getDefaultStyle()));
322
                pstyle->setDefaultStyle(true);
323
                currentStyle = dynamic_cast<gtStyle*>(pstyle);
324
                currentStyle->setName("default-style");
325
                setDefaultStyle     = true;
326
                defaultStyleCreated = true;
327
                parentStyle  = currentStyle;
328
        }
329
 
834 tsoots 330
        for (int i = 0; i < attrs.count(); ++i)
331
        {
332
                if (attrs.localName(i) == "style:family")
333
                {
334
                        if (attrs.value(i) == "paragraph")
335
                        {
336
                                isParaStyle = true;
337
                                readProperties = true;
338
                        }
339
                        else if (attrs.value(i) == "text")
340
                        {
341
                                isParaStyle = false;
342
                                readProperties = true;
343
                        }
344
                        else
345
                        {
346
                                readProperties = false;
347
                                return;
348
                        }
349
                }
350
                else if (attrs.localName(i) == "style:name")
351
                        name = attrs.value(i);
352
                else if (attrs.localName(i) == "style:parent-style-name")
353
                {
354
                        if (styles.contains(attrs.value(i)))
355
                                parentStyle = styles[attrs.value(i)];
356
                        else
357
                                parentStyle = NULL;
358
                }
359
                else if (attrs.localName(i) == "style:list-style-name")
360
                        listName = attrs.value(i);
361
        }
362
        if ((parentStyle == NULL) && (styles.contains("default-style")))
363
                parentStyle = styles["default-style"];
364
 
365
        if (create)
366
        {
367
                if (parentStyle == NULL)
368
                {
369
                        parentStyle = new gtStyle("tmp-parent");
370
                }
371
                if (isParaStyle)
372
                {
373
                        gtParagraphStyle *tmpP;
374
                        if (parentStyle->target() == "paragraph")
375
                        {
376
                                tmpP = dynamic_cast<gtParagraphStyle*>(parentStyle);
9810 avox 377
                                assert(tmpP != NULL);
834 tsoots 378
                                gtParagraphStyle* tmp = new gtParagraphStyle(*tmpP);
379
 //                             tmp->setAutoLineSpacing(true);
380
                                currentStyle = tmp;
381
                        }
382
                        else
383
                        {
384
                                gtParagraphStyle* tmp = new gtParagraphStyle(*parentStyle);
385
 //                             tmp->setAutoLineSpacing(true);
386
                                currentStyle = tmp;
387
                        }
8623 subik 388
                        if (!listName.isNull())
834 tsoots 389
                        {
390
                                listParents[listName] = currentStyle;
391
                        }
392
                }
393
                else
394
                        currentStyle = new gtStyle(*parentStyle);
395
 
396
                currentStyle->setName(name);
10118 jghali 397
                if (setDefaultStyle)
398
                {
399
                        gtParagraphStyle* tmp = dynamic_cast<gtParagraphStyle*>(currentStyle);
400
                        if (tmp)
401
                                tmp->setDefaultStyle(true);
402
                }
834 tsoots 403
        }
404
        else
405
                currentStyle = NULL;
406
 }
407
 
408
 void StyleReader::tabStop(const QXmlAttributes& attrs)
409
 {
410
        if (currentStyle->target() == "paragraph")
411
        {
412
                gtParagraphStyle* pstyle = dynamic_cast<gtParagraphStyle*>(currentStyle);
9810 avox 413
                assert(pstyle != NULL);
834 tsoots 414
                QString pos = NULL;
415
                QString type = NULL;
416
                for (int i = 0; i < attrs.count(); ++i)
417
                {
418
                        if (attrs.localName(i) == "style:position")
419
                                pos = attrs.value(i);
420
                        else if (attrs.localName(i) == "style:type")
421
                                type = attrs.value(i);
422
 
423
                }
8623 subik 424
                if (!pos.isNull())
834 tsoots 425
                {
8623 subik 426
                        if (!type.isNull())
834 tsoots 427
                                type = "left";
428
                        double posd = getSize(pos);
429
                        if (type == "left")
430
                                pstyle->setTabValue(posd, LEFT_T);
431
                        else if (type == "right")
432
                                pstyle->setTabValue(posd, RIGHT_T);
433
                        else if (type == "center")
434
                                pstyle->setTabValue(posd, CENTER_T);
435
                        else
436
                                pstyle->setTabValue(posd, CENTER_T);
437
                }
438
        }
439
 }
440
 
441
 bool StyleReader::endElement(const QString&, const QString&, const QString &name)
442
 {
443
        if ((name == "style:default-style") && (currentStyle != NULL) && (readProperties))
444
        {
445
                setStyle(currentStyle->getName(), currentStyle);
446
                currentStyle = NULL;
447
                parentStyle = NULL;
448
                readProperties = false;
449
        }
450
        else if (((name == "style:style") ||
451
                  (name == "text:list-level-style-bullet") ||
439 tsoots 452
                          (name == "text:list-level-style-number") ||
453
                          (name == "text:list-level-style-image")) && (currentStyle != NULL))
834 tsoots 454
        {
455
                setStyle(currentStyle->getName(), currentStyle);
456
                currentStyle = NULL;
457
                parentStyle = NULL;
458
                readProperties = false;
459
        }
460
        else if (name == "text:list-style")
461
        {
462
                inList = false;
463
        }
456 fschmid 464
 
834 tsoots 465
        return true;
466
 }
467
 
468
 void StyleReader::parse(QString fileName)
469
 {
7277 jghali 470
#if defined(_WIN32)
16577 craig 471
        QString fname = QDir::toNativeSeparators(fileName);
10723 jghali 472
        QByteArray fn = (QSysInfo::WindowsVersion & QSysInfo::WV_NT_based) ? fname.toUtf8() : fname.toLocal8Bit();
7277 jghali 473
#else
10493 fschmid 474
        QByteArray fn(fileName.toLocal8Bit());
7277 jghali 475
#endif
476
        xmlSAXParseFile(sSAXHandler, fn.data(), 1);
834 tsoots 477
 }
10111 jghali 478
 
479
 gtStyle* StyleReader::getDefaultStyle(void)
480
 {
481
         gtStyle* defStyle = writer->getDefaultStyle();
482
         StyleMap::Iterator it, itEnd = styles.end();
483
         for (it = styles.begin(); it != itEnd; ++it)
484
         {
10430 cbradney 485
                 gtParagraphStyle *pStyle = dynamic_cast<gtParagraphStyle*> (it.value());
10111 jghali 486
                 if (pStyle && pStyle->isDefaultStyle())
487
                 {
488
                         defStyle = pStyle;
489
                         break;
490
                 }
491
         }
492
         return defStyle;
493
 }
834 tsoots 494
 
495
 gtStyle* StyleReader::getStyle(const QString& name)
496
 {
497
        if (styles.contains(name))
498
        {
499
                gtStyle* tmp = styles[name];
500
                QString tname = tmp->getName();
10430 cbradney 501
                if ((tname.indexOf(docname) == -1) && (usePrefix))
834 tsoots 502
                        tmp->setName(docname + "_" + tname);
503
 
504
                return tmp;
505
        }
506
        else
10111 jghali 507
                return getDefaultStyle();
834 tsoots 508
 }
509
 
510
 void StyleReader::setStyle(const QString& name, gtStyle* style)
511
 {
512
        gtParagraphStyle *s;
513
        QString tname = style->getName();
1157 tsoots 514
        if ((style->target() == "paragraph") && (packStyles))
834 tsoots 515
        {
516
                s = dynamic_cast<gtParagraphStyle*>(style);
9810 avox 517
                assert(s != NULL);
834 tsoots 518
                QString nameByAttrs = QString("%1-").arg(s->getSpaceAbove());
519
                nameByAttrs += QString("%1-").arg(s->getSpaceBelow());
520
                nameByAttrs += QString("%1-").arg(s->getLineSpacing());
521
                nameByAttrs += QString("%1-").arg(s->getIndent());
522
                nameByAttrs += QString("%1-").arg(s->getFirstLineIndent());
523
                nameByAttrs += QString("%1-").arg(s->getAlignment());
524
                nameByAttrs += QString("%1-").arg(s->hasDropCap());
525
                nameByAttrs += QString("%1-").arg(s->getFont()->getColor());
526
                nameByAttrs += QString("%1-").arg(s->getFont()->getStrokeColor());
2282 fschmid 527
// TODO is this important ??
528
/*              QValueList<double>* tmp = s->getTabValues();
834 tsoots 529
                for (uint i = 0; i < tmp->count(); ++i)
530
                {
531
                        double td = (*tmp)[i];
532
                        nameByAttrs += QString("%1-").arg(td);
2282 fschmid 533
                } */
834 tsoots 534
                if (attrsStyles.contains(nameByAttrs))
535
                {
536
                        tname = attrsStyles[nameByAttrs]->getName();
537
                        ++pstyleCounts[nameByAttrs];
538
                        style->setName(tname);
539
                }
540
                else
541
                {
542
                        attrsStyles[nameByAttrs] = style;
543
                        pstyleCounts[nameByAttrs] = 1;
544
                        tname = style->getName();
545
                }
546
        }
1157 tsoots 547
        else if (!packStyles)
548
        {
549
                attrsStyles[name] = style;
550
                pstyleCounts[name] = 1;
551
                tname = style->getName();
552
        }
834 tsoots 553
        if (!styles.contains(name))
554
        {
10430 cbradney 555
                if ((tname.indexOf(docname) == -1) && (usePrefix))
834 tsoots 556
                        style->setName(docname + "_" + tname);
557
                styles[name] = style;
558
        }
559
 }
560
 
561
 QString StyleReader::getFont(const QString& key)
562
 {
563
        if (fonts.contains(key))
564
                return fonts[key];
565
        else
566
                return key;
567
 }
568
 
569
 void StyleReader::setupFrameStyle()
570
 {
571
        QString fstyleName = "";
572
        int count = 0;
573
        CounterMap::Iterator it;
574
        for (it = pstyleCounts.begin(); it != pstyleCounts.end(); ++it)
575
        {
10430 cbradney 576
                if (it.value() > count)
834 tsoots 577
                {
10430 cbradney 578
                        count = it.value();
834 tsoots 579
                        fstyleName = it.key();
580
                }
581
        }
582
        gtFrameStyle* fstyle;
583
        gtParagraphStyle* pstyle = dynamic_cast<gtParagraphStyle*>(attrsStyles[fstyleName]);
584
        fstyle = new gtFrameStyle(*pstyle);
585
 
586
        if (!importTextOnly)
587
                writer->setFrameStyle(fstyle);
588
        delete fstyle;
589
 }
590
 
591
 bool StyleReader::updateStyle(gtStyle* style, gtStyle* parent2Style, const QString& key, const QString& value)
592
 {
593
        gtParagraphStyle* pstyle = NULL;
594
        if (style->target() == "paragraph")
595
                pstyle = dynamic_cast<gtParagraphStyle*>(style);
596
        else
597
                pstyle = NULL;
598
        QString align = NULL;
599
        QString force = NULL;
600
 
601
        if (key == "style:font-name")
602
                style->getFont()->setName(getFont(value));
603
        else if (key == "fo:font-size")
604
        {
605
                double size = 0;
606
                double psize = 0;
607
                if (parent2Style != NULL)
608
                        psize = static_cast<double>(parent2Style->getFont()->getSize());
609
                else if (styles.contains("default-style"))
610
                        psize = static_cast<double>(styles["default-style"]->getFont()->getSize());
611
                        psize = psize / 10;
612
                size = getSize(value, psize);
613
                int nsize = static_cast<int>(size * 10);
614
                style->getFont()->setSize(nsize);
1622 tsoots 615
                if (pstyle)
834 tsoots 616
                        pstyle->setLineSpacing(writer->getPreferredLineSpacing(nsize));
617
        }
618
        else if ((key == "fo:line-height") && (parent2Style != NULL))
619
        {
620
                gtParagraphStyle* ppstyle;
621
                if (parent2Style->target() == "paragraph")
622
                {
623
                        ppstyle = dynamic_cast<gtParagraphStyle*>(parent2Style);
9810 avox 624
                        assert(ppstyle != NULL);
625
                        ppstyle->setLineSpacing(getSize(value, writer->getPreferredLineSpacing(style->getFont()->getSize())));
834 tsoots 626
                }
627
        }
628
        else if (key == "fo:color")
629
                style->getFont()->setColor(value);
630
        else if ((key == "style:use-window-font-color") && (value == "true"))
631
                        style->getFont()->setColor("Black");
632
        else if ((key == "fo:font-weight") && (value == "bold"))
633
                style->getFont()->setWeight(BOLD);
634
        else if ((key == "fo:font-style") && (value == "italic"))
635
                style->getFont()->setSlant(ITALIC);
636
        else if ((key == "style:text-underline") && (value != "none"))
637
                style->getFont()->toggleEffect(UNDERLINE);
638
        else if ((key == "style:text-crossing-out") && (value != "none"))
639
                style->getFont()->toggleEffect(STRIKETHROUGH);
640
        else if ((key == "fo:font-variant") && (value == "small-caps"))
641
                style->getFont()->toggleEffect(SMALL_CAPS);
642
        else if ((key == "style:text-outline") && (value == "true"))
643
        {
644
                style->getFont()->toggleEffect(OUTLINE);
645
                style->getFont()->setStrokeColor("Black");
646
                style->getFont()->setColor("White");
647
        }
648
        else if (key == "fo:letter-spacing")
2501 fschmid 649
                style->getFont()->setKerning(static_cast<int>(getSize(value, -1.0)));
834 tsoots 650
        else if (key == "style:text-scale")
651
                style->getFont()->setHscale(static_cast<int>(getSize(value, -1.0)));
652
        else if ((key == "style:text-position") &&
10430 cbradney 653
                (((value).indexOf("sub") != -1) ||
834 tsoots 654
                        (((value).left(1) == "-") && ((value).left(1) != "0"))))
655
                style->getFont()->toggleEffect(SUBSCRIPT);
656
        else if ((key == "style:text-position") &&
10430 cbradney 657
                (((value).indexOf("super") != -1) ||
834 tsoots 658
                        (((value).left(1) != "-") && ((value).left(1) != "0"))))
659
                style->getFont()->toggleEffect(SUPERSCRIPT);
660
        else if ((key == "fo:margin-top") && (pstyle != NULL))
661
                pstyle->setSpaceAbove(getSize(value));
662
        else if ((key == "fo:margin-bottom") && (pstyle != NULL))
663
                pstyle->setSpaceBelow(getSize(value));
664
        else if ((key == "fo:margin-left") && (pstyle != NULL))
665
        {
666
                if (inList)
667
                        pstyle->setIndent(pstyle->getIndent() + getSize(value));
668
                else
669
                        pstyle->setIndent(getSize(value));     
670
        }
671
        else if ((key == "text:space-before") && (pstyle != NULL))
672
        {
673
                if (inList)
674
                        pstyle->setIndent(pstyle->getIndent() + getSize(value));
675
                else
676
                        pstyle->setIndent(getSize(value));     
677
        }
678
        else if ((key == "fo:text-indent") && (pstyle != NULL))
679
                pstyle->setFirstLineIndent(getSize(value));
680
        else if ((key == "fo:text-align") && (pstyle != NULL))
681
                align = value;
682
        else if ((key == "style:justify-single-word") && (pstyle != NULL))
683
                force = value;
684
 
8623 subik 685
        if (!align.isNull())
834 tsoots 686
        {
9810 avox 687
                assert(pstyle);
834 tsoots 688
                if (align == "end")
689
                        pstyle->setAlignment(RIGHT);
690
                else if (align == "center")
691
                        pstyle->setAlignment(CENTER);
692
                else if (align == "justify")
693
                {
694
                        if (force != "false")
695
                                pstyle->setAlignment(FORCED);
696
                        else
697
                                pstyle->setAlignment(BLOCK);
698
                }
699
        }
700
 
701
        return true;
702
 }
703
 
704
 double StyleReader::getSize(QString s, double parentSize)
705
 {
706
        QString dbl = "0.0";
10398 cbradney 707
        QString lowerValue = s.toLower();
834 tsoots 708
        double ret = 0.0;
10430 cbradney 709
        if (lowerValue.indexOf("pt") != -1)
834 tsoots 710
        {
711
                dbl = lowerValue.remove("pt");
2594 cbradney 712
                ret = gtMeasure::d2d(dbl.toDouble(), SC_PT);
834 tsoots 713
        }
10430 cbradney 714
        else if (lowerValue.indexOf("mm") != -1)
834 tsoots 715
        {
716
                dbl = lowerValue.remove("mm");
2594 cbradney 717
                ret = gtMeasure::d2d(dbl.toDouble(), SC_MM);
834 tsoots 718
        }
10430 cbradney 719
        else if (lowerValue.indexOf("cm") != -1)
834 tsoots 720
        {
721
                dbl = lowerValue.remove("cm");
2594 cbradney 722
                ret = gtMeasure::d2d(dbl.toDouble() * 10, SC_MM);
834 tsoots 723
        }
10430 cbradney 724
        else if (lowerValue.indexOf("in") != -1)
834 tsoots 725
        {
726
                dbl = lowerValue.remove("inch");
727
                dbl = lowerValue.remove("in");
2594 cbradney 728
                ret = gtMeasure::d2d(dbl.toDouble(), SC_IN);
834 tsoots 729
        }
10430 cbradney 730
        else if (lowerValue.indexOf("pi") != -1)
834 tsoots 731
        {
732
                dbl = lowerValue.remove("pica");
733
                dbl = lowerValue.remove("pi");
2594 cbradney 734
                ret = gtMeasure::d2d(dbl.toDouble(), SC_P);
834 tsoots 735
        }
10430 cbradney 736
        else if (lowerValue.indexOf("c") != -1)
2594 cbradney 737
        {
738
                dbl = lowerValue.remove("cicero");
739
                dbl = lowerValue.remove("c");
740
                ret = gtMeasure::d2d(dbl.toDouble(), SC_C);
741
        }
10430 cbradney 742
        else if (lowerValue.indexOf("%") != -1)
834 tsoots 743
        {
744
                dbl = lowerValue.remove("%");
745
                double factor = dbl.toDouble();
746
                if (parentSize != -1.0)
747
                {
748
                        factor = factor / 100;
749
                        ret = factor * parentSize;
750
                }
751
                else
752
                        ret = factor;
753
        }
754
        return ret;
755
 }
756
 
757
 StyleReader::~StyleReader()
758
 {
759
        sreader = NULL;
760
        StyleMap::Iterator it;
761
        for (it = styles.begin(); it != styles.end(); ++it)
762
        {
10427 cbradney 763
                if (it.value())
834 tsoots 764
                {
10427 cbradney 765
                        delete it.value();
766
                        it.value() = NULL;
834 tsoots 767
                }
768
        }
769
 }
770
 
771
 xmlSAXHandler sSAXHandlerStruct = {
772
        NULL, // internalSubset,
773
        NULL, // isStandalone,
774
        NULL, // hasInternalSubset,
775
        NULL, // hasExternalSubset,
776
        NULL, // resolveEntity,
777
        NULL, // getEntity,
778
        NULL, // entityDecl,
779
        NULL, // notationDecl,
780
        NULL, // attributeDecl,
781
        NULL, // elementDecl,
782
        NULL, // unparsedEntityDecl,
783
        NULL, // setDocumentLocator,
784
        NULL, // startDocument,
785
        NULL, // endDocument,
786
        StyleReader::startElement,
787
        StyleReader::endElement,
788
        NULL, // reference,
789
        NULL, // characters
790
        NULL, // ignorableWhitespace,
791
        NULL, // processingInstruction,
792
        NULL, // comment,
793
        NULL, // warning,
794
        NULL, // error,
795
        NULL, // fatalError,
796
        NULL, // getParameterEntity,
797
        NULL, // cdata,
798
        NULL,
799
        1
800
 #ifdef HAVE_XML26
801
        ,
802
        NULL,
803
        NULL,
804
        NULL,
805
        NULL
806
 #endif
807
 };
808
 
809
 xmlSAXHandlerPtr sSAXHandler = &sSAXHandlerStruct;
810
 
1157 tsoots 811
 void StyleReader::startElement(void*, const xmlChar * fullname, const xmlChar ** atts)
834 tsoots 812
 {
813
        QString* name = new QString((const char*) fullname);
10398 cbradney 814
        name = new QString(name->toLower());
834 tsoots 815
        QXmlAttributes* attrs = new QXmlAttributes();
816
        if (atts)
817
        {
818
                for(const xmlChar** cur = atts; cur && *cur; cur += 2)
819
                        attrs->append(QString((char*)*cur), NULL, QString((char*)*cur), QString((char*)*(cur + 1)));
820
        }
821
        sreader->startElement(NULL, NULL, *name, *attrs);
822
 }
823
 
1157 tsoots 824
 void StyleReader::endElement(void*, const xmlChar * name)
834 tsoots 825
 {
826
        QString *nname = new QString((const char*) name);
10398 cbradney 827
        nname = new QString(nname->toLower());
834 tsoots 828
        sreader->endElement(NULL, NULL, *nname);
829
 }
830