Subversion Repositories Scribus

Rev

Rev 18084 | 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
*/
1579 tsoots 7
 /***************************************************************************
8
  *   Copyright (C) 2004 by Riku Leino                                      *
9
  *   tsoots@gmail.com                                                      *
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.             *
1579 tsoots 25
  ***************************************************************************/
26
 
10223 cbradney 27
#include "stylereader.h"
1579 tsoots 28
 
10223 cbradney 29
#include <scribusstructs.h>
30
#include <gtmeasure.h>
31
#include <gtparagraphstyle.h>
32
#include <gtframestyle.h>
33
#include <gtfont.h>
9535 fschmid 34
#include <QByteArray>
1579 tsoots 35
 
10223 cbradney 36
StyleReader* StyleReader::sreader = NULL;
1579 tsoots 37
 
10223 cbradney 38
extern xmlSAXHandlerPtr sSAXHandler;
1579 tsoots 39
 
40
StyleReader::StyleReader(QString documentName, gtWriter *w,
41
                         bool textOnly, bool prefix, bool combineStyles)
42
{
43
        sreader      = this;
44
        docname      = documentName;
45
        readProperties = false;
46
        writer       = w;
47
        importTextOnly = textOnly;
48
        usePrefix    = prefix;
49
        packStyles   = combineStyles;
2212 tsoots 50
        currentStyle = 0;
51
        currentListStyle = 0;
52
        parentStyle  = 0;
1579 tsoots 53
        inList       = false;
54
        currentList  = "";
55
        defaultStyleCreated = false;
56
}
57
 
58
 bool StyleReader::startElement(const QString&, const QString&, const QString &name, const QXmlAttributes &attrs)
59
 {
60
        if (name == "style:default-style")
61
                defaultStyle(attrs);
62
        else if (name == "style:paragraph-properties" ||
63
                 name == "style:text-properties" ||
64
                 name == "style:list-level-properties")
65
                styleProperties(attrs);
66
        else if (name == "style:style")
67
                styleStyle(attrs);
68
        else if (name == "style:tab-stop")
69
                tabStop(attrs);
70
        else if (name == "text:list-style")
71
        {
72
                for (int i = 0; i < attrs.count(); ++i)
73
                        if (attrs.localName(i) == "style:name")
74
                                currentList = attrs.value(i);
2212 tsoots 75
                currentListStyle = new ListStyle(currentList);
1579 tsoots 76
                inList = true;
77
        }
78
        else if (((name == "text:list-level-style-bullet") ||
79
                  (name == "text:list-level-style-number") ||
80
                  (name == "text:list-level-style-image")) && (inList))
81
        {
2212 tsoots 82
                BulletType bstyle = Bullet;
83
                QString prefix = "";
84
                QString suffix = "";
85
                QString bullet = "-";
86
                uint ulevel = 0;
87
                uint displayLevels = 1;
88
                uint startAt = 0;
1579 tsoots 89
                QString level = "";
90
                for (int i = 0; i < attrs.count(); ++i)
91
                {
92
                        if (attrs.localName(i) == "text:level")
93
                        {
2212 tsoots 94
                                ulevel = QString(attrs.value(i)).toUInt();
1579 tsoots 95
                                gtStyle *plist;
96
                                if (attrs.value(i) == "1")
97
                                {
98
                                        plist = listParents[currentList];
99
                                }
100
                                else
101
                                {
102
                                        int level = (attrs.value(i)).toInt();
103
                                        --level;
104
                                        plist = styles[QString(currentList + "_%1").arg(level)];
105
                                }
106
                                gtParagraphStyle *pstyle;
107
                                if (plist == NULL)
13014 jghali 108
                                {
109
                                        if (styles.contains("default-style"))
110
                                                plist = new gtStyle(*(styles["default-style"]));
111
                                        else
112
                                        {
113
                                                gtParagraphStyle* pstyle = new gtParagraphStyle(*(writer->getDefaultStyle()));
114
                                                pstyle->setDefaultStyle(true);
115
                                                plist = dynamic_cast<gtStyle*>(pstyle);
116
                                        }
117
                                }
1579 tsoots 118
 
119
                                if (plist->target() == "paragraph")
120
                                {
121
                                        pstyle = dynamic_cast<gtParagraphStyle*>(plist);
9810 avox 122
                                        assert(pstyle != NULL);
1579 tsoots 123
                                        gtParagraphStyle* tmp = new gtParagraphStyle(*pstyle);
124
                                        currentStyle = tmp;
125
                                }
126
                                else
127
                                {
128
                                        gtParagraphStyle* tmp = new gtParagraphStyle(*plist);
129
                                        currentStyle = tmp;
130
                                }
131
                                currentStyle->setName(currentList + "_" + attrs.value(i));
132
                        }
2212 tsoots 133
                        else if (attrs.localName(i) == "style:num-prefix")
134
                                prefix = attrs.value(i);
135
                        else if (attrs.localName(i) == "style:num-suffix")
136
                                suffix = attrs.value(i);
18084 jghali 137
                        else if (attrs.localName(i) == "text:bullet-char")
138
                                bullet = attrs.value(i);
2212 tsoots 139
                        else if (attrs.localName(i) == "style:num-format") {
140
                                QString tmp = attrs.value(i);
141
                                if (tmp == "i")
142
                                        bstyle = LowerRoman;
143
                                else if (tmp == "I")
144
                                        bstyle = UpperRoman;
145
                                else if (tmp == "a")
146
                                        bstyle = LowerAlpha;
147
                                else if (tmp == "A")
148
                                        bstyle = UpperAlpha;
149
                                else if (tmp == "1")
150
                                        bstyle = Number;
151
                        }
152
                        else if (attrs.localName(i) == "text:start-value") {
153
                                startAt = QString(attrs.value(i)).toUInt();
154
                                if (startAt > 0)
155
                                        --startAt;
156
                        }
157
                        else if (attrs.localName(i) == "text:display-levels") {
158
                                displayLevels = QString(attrs.value(i)).toUInt();
159
                                if (displayLevels == 0)
160
                                        displayLevels = 1;
161
                        }
1579 tsoots 162
                }
2212 tsoots 163
                if (bstyle == Bullet) {
164
                        prefix = "";
165
                        suffix = "";
166
                }
167
                ListLevel *llevel = new ListLevel(ulevel, bstyle, prefix, suffix, bullet, displayLevels, startAt);
168
                currentListStyle->addLevel(ulevel, llevel);
1579 tsoots 169
                readProperties = true;
18047 craig 170
 
171
                gtParagraphStyle* s = dynamic_cast<gtParagraphStyle*>(currentStyle);
172
                assert(s != NULL);
173
                if (bstyle == Bullet || bstyle == Graphic)
18084 jghali 174
                {
175
                        s->setBullet(true, bullet);
176
                }
18047 craig 177
                else
178
                {
179
                        Q_ASSERT(((int) bstyle > 0) && ((int) bstyle < 6));
18084 jghali 180
                        s->setNum(true, (int) bstyle -1, ulevel, startAt+1, prefix, suffix);
18047 craig 181
                }
1579 tsoots 182
        }
183
        else if ((name == "style:drop-cap") && (readProperties))
184
        {
185
                if (currentStyle->target() == "paragraph")
186
                {
187
                        for (int i = 0; i < attrs.count(); ++i)
188
                        {
189
                                if (attrs.localName(i) == "style:lines")
190
                                {
191
                                        bool ok = false;
192
                                        QString sd = attrs.value(i);
193
                                        int dh = sd.toInt(&ok);
194
                                        if (ok)
195
                                        {
196
                                                gtParagraphStyle* s = dynamic_cast<gtParagraphStyle*>(currentStyle);
9810 avox 197
                                                assert(s != NULL);
1579 tsoots 198
                                                s->setDropCapHeight(dh);
199
                                                s->setDropCap(true);
200
                                        }
201
                                }
202
                        }
203
                }
204
        }
205
        else if (name == "style:font-face")
206
        {
207
                QString key = "";
208
                QString family = "";
209
                QString style = "";
210
                for (int i = 0; i < attrs.count(); ++i)
211
                {
212
                        if (attrs.localName(i) == "style:name")
213
                                key = attrs.value(i);
214
                        else if (attrs.localName(i) == "svg:font-family")
215
                        {
216
                                family = attrs.value(i);
217
                                family = family.remove("'");
218
                        }
219
                        else if (attrs.localName(i) == "style:font-style-name")
220
                                style += attrs.value(i) + " ";
221
                }
222
                QString name = family + " " + style;
10394 cbradney 223
                name = name.simplified();
1579 tsoots 224
                fonts[key] = name;
225
        }
226
        return true;
227
 }
228
 
229
 void StyleReader::defaultStyle(const QXmlAttributes& attrs)
230
 {
231
        currentStyle = NULL;
232
        for (int i = 0; i < attrs.count(); ++i)
233
                if (attrs.localName(i) == "style:family")
234
                        if (attrs.value(i) == "paragraph")
235
                        {
10111 jghali 236
                                gtParagraphStyle* pstyle = new gtParagraphStyle(*(writer->getDefaultStyle()));
237
                                pstyle->setDefaultStyle(true);
238
                                currentStyle = dynamic_cast<gtStyle*>(pstyle);
1579 tsoots 239
                                currentStyle->setName("default-style");
240
                                readProperties = true;
241
                                defaultStyleCreated = true;
242
                        }
243
 }
244
 
245
 void StyleReader::styleProperties(const QXmlAttributes& attrs)
246
 {
247
        if ((currentStyle == NULL) || (!readProperties))
248
                return;
249
        gtParagraphStyle* pstyle = NULL;
250
        if (currentStyle->target() == "paragraph")
251
                pstyle = dynamic_cast<gtParagraphStyle*>(currentStyle);
252
        else
253
                pstyle = NULL;
254
        QString align = NULL;
255
        QString force = NULL;
256
        bool hasColorTag = false;
257
        for (int i = 0; i < attrs.count(); ++i)
258
        {
259
                if ((attrs.localName(i) == "style:font-name") && (!inList))
260
                        currentStyle->getFont()->setName(getFont(attrs.value(i)));
261
                else if (attrs.localName(i) == "fo:font-size")
262
                {
263
                        double size = 0;
264
                        double psize = 0;
265
                        if (parentStyle != NULL)
266
                                psize = static_cast<double>(parentStyle->getFont()->getSize());
267
                        else if (styles.contains("default-style"))
268
                                psize = static_cast<double>(styles["default-style"]->getFont()->getSize());
269
 
270
                        psize = psize / 10;
271
                        size = getSize(attrs.value(i), psize);
272
                        int nsize = static_cast<int>(size * 10);
273
                        currentStyle->getFont()->setSize(nsize);
1622 tsoots 274
                        if (pstyle)
1579 tsoots 275
                                pstyle->setLineSpacing(writer->getPreferredLineSpacing(nsize));
276
                }
277
                else if ((attrs.localName(i) == "fo:line-height") && (parentStyle != NULL))
278
                {
279
                        gtParagraphStyle* ppstyle;
280
                        if (parentStyle->target() == "paragraph")
281
                        {
282
                                ppstyle = dynamic_cast<gtParagraphStyle*>(parentStyle);
9810 avox 283
                                assert(ppstyle != NULL);
284
                                ppstyle->setLineSpacing(getSize(attrs.value(i), writer->getPreferredLineSpacing(currentStyle->getFont()->getSize())));
1579 tsoots 285
                        }
286
                }
287
                else if (attrs.localName(i) == "fo:color")
288
                {
289
                        currentStyle->getFont()->setColor(attrs.value(i));
290
                        hasColorTag = true;
291
                }
292
                else if ((attrs.localName(i) == "style:use-window-font-color") && (attrs.value(i) == "true"))
293
                {
294
                        currentStyle->getFont()->setColor("Black");
295
                        hasColorTag = true;
296
                }
297
                else if ((attrs.localName(i) == "fo:font-weight") && (attrs.value(i) == "bold"))
298
                        currentStyle->getFont()->setWeight(BOLD);
299
                else if ((attrs.localName(i) == "fo:font-style") && (attrs.value(i) == "italic"))
300
                        currentStyle->getFont()->setSlant(ITALIC);
1610 tsoots 301
                else if ((attrs.localName(i) == "style:text-underline-style") && (attrs.value(i) != "none"))
1579 tsoots 302
                        currentStyle->getFont()->toggleEffect(UNDERLINE);
303
                else if ((attrs.localName(i) == "style:text-crossing-out") && (attrs.value(i) != "none"))
304
                        currentStyle->getFont()->toggleEffect(STRIKETHROUGH);
305
                else if ((attrs.localName(i) == "fo:font-variant") && (attrs.value(i) == "small-caps"))
306
                        currentStyle->getFont()->toggleEffect(SMALL_CAPS);
307
                else if ((attrs.localName(i) == "style:text-outline") && (attrs.value(i) == "true"))
308
                {
309
                        currentStyle->getFont()->toggleEffect(OUTLINE);
310
                        currentStyle->getFont()->setStrokeColor("Black");
311
                        currentStyle->getFont()->setColor("White");
312
                }
313
                else if (attrs.localName(i) == "fo:letter-spacing")
2501 fschmid 314
                        currentStyle->getFont()->setKerning(static_cast<int>(getSize(attrs.value(i), -1.0)));
1579 tsoots 315
                else if (attrs.localName(i) == "style:text-scale")
316
                        currentStyle->getFont()->setHscale(static_cast<int>(getSize(attrs.value(i), -1.0)));
317
                else if ((attrs.localName(i) == "style:text-position") &&
10455 cbradney 318
                        (((attrs.value(i)).indexOf("sub") != -1) ||
1579 tsoots 319
                                (((attrs.value(i)).left(1) == "-") && ((attrs.value(i)).left(1) != "0"))))
320
                        currentStyle->getFont()->toggleEffect(SUBSCRIPT);
321
                else if ((attrs.localName(i) == "style:text-position") &&
10455 cbradney 322
                                (((attrs.value(i)).indexOf("super") != -1) ||
1579 tsoots 323
                                (((attrs.value(i)).left(1) != "-") && ((attrs.value(i)).left(1) != "0"))))
324
                        currentStyle->getFont()->toggleEffect(SUPERSCRIPT);
325
                else if ((attrs.localName(i) == "fo:margin-top") && (pstyle != NULL))
326
                        pstyle->setSpaceAbove(getSize(attrs.value(i)));
327
                else if ((attrs.localName(i) == "fo:margin-bottom") && (pstyle != NULL))
328
                        pstyle->setSpaceBelow(getSize(attrs.value(i)));
329
                else if ((attrs.localName(i) == "fo:margin-left") && (pstyle != NULL))
330
                {
331
                        if (inList)
332
                                pstyle->setIndent(pstyle->getIndent() + getSize(attrs.value(i)));
333
                        else
334
                                pstyle->setIndent(getSize(attrs.value(i)));    
335
                }
336
                else if ((attrs.localName(i) == "text:space-before") && (pstyle != NULL))
337
                {
2212 tsoots 338
                        /*if (inList)
1579 tsoots 339
                                pstyle->setIndent(pstyle->getIndent() + getSize(attrs.value(i)));
2212 tsoots 340
                        else*/
1579 tsoots 341
                                pstyle->setIndent(getSize(attrs.value(i)));
342
                }
343
                else if ((attrs.localName(i) == "fo:text-indent") && (pstyle != NULL))
344
                        pstyle->setFirstLineIndent(getSize(attrs.value(i)));
345
                else if ((attrs.localName(i) == "fo:text-align") && (pstyle != NULL))
346
                        align = attrs.value(i);
347
                else if ((attrs.localName(i) == "style:justify-single-word") && (pstyle != NULL))
348
                        force = attrs.value(i);
349
        }
8622 subik 350
        // Qt4 NULL -> isNull()
351
        if (!align.isNull())
1579 tsoots 352
        {
353
                if (align == "end")
354
                        pstyle->setAlignment(RIGHT);
355
                else if (align == "center")
356
                        pstyle->setAlignment(CENTER);
357
                else if (align == "justify")
358
                {
359
                        if (force == "false")
360
                                pstyle->setAlignment(BLOCK);
361
                        else
362
                                pstyle->setAlignment(FORCED);
363
                }
364
        }
365
        if (!hasColorTag)
366
                currentStyle->getFont()->setColor("Black");
367
 }
368
 
369
 void StyleReader::styleStyle(const QXmlAttributes& attrs)
370
 {
371
        QString name = "";
372
        QString listName = NULL;
10118 jghali 373
        bool setDefaultStyle = false;
1579 tsoots 374
        bool isParaStyle = false;
375
        bool create = true;
10118 jghali 376
 
377
        if (!defaultStyleCreated)
378
        {
379
                gtParagraphStyle* pstyle = new gtParagraphStyle(*(writer->getDefaultStyle()));
380
                pstyle->setDefaultStyle(true);
381
                currentStyle = dynamic_cast<gtStyle*>(pstyle);
382
                currentStyle->setName("default-style");
383
                setDefaultStyle     = true;
384
                defaultStyleCreated = true;
385
                parentStyle  = currentStyle;
386
        }
387
 
1579 tsoots 388
        for (int i = 0; i < attrs.count(); ++i)
389
        {
390
                if (attrs.localName(i) == "style:family")
391
                {
392
                        if (attrs.value(i) == "paragraph")
393
                        {
394
                                isParaStyle = true;
395
                                readProperties = true;
396
                        }
397
                        else if (attrs.value(i) == "text")
398
                        {
399
                                isParaStyle = false;
400
                                readProperties = true;
401
                        }
402
                        else
403
                        {
404
                                readProperties = false;
405
                                return;
406
                        }
407
                }
408
                else if (attrs.localName(i) == "style:name")
409
                        name = attrs.value(i);
410
                else if (attrs.localName(i) == "style:parent-style-name")
411
                {
412
                        if (styles.contains(attrs.value(i)))
413
                                parentStyle = styles[attrs.value(i)];
414
                        else
415
                                parentStyle = NULL;
416
                }
417
                else if (attrs.localName(i) == "style:list-style-name")
418
                        listName = attrs.value(i);
419
        }
420
        if ((parentStyle == NULL) && (styles.contains("default-style")))
421
                parentStyle = styles["default-style"];
422
 
423
        if (create)
424
        {
425
                if (parentStyle == NULL)
426
                {
427
                        parentStyle = new gtStyle("tmp-parent");
428
                }
429
                if (isParaStyle)
430
                {
431
                        gtParagraphStyle *tmpP;
432
                        if (parentStyle->target() == "paragraph")
433
                        {
434
                                tmpP = dynamic_cast<gtParagraphStyle*>(parentStyle);
9810 avox 435
                                assert(tmpP != NULL);
1579 tsoots 436
                                gtParagraphStyle* tmp = new gtParagraphStyle(*tmpP);
437
 //                             tmp->setAutoLineSpacing(true);
438
                                currentStyle = tmp;
439
                        }
440
                        else
441
                        {
442
                                gtParagraphStyle* tmp = new gtParagraphStyle(*parentStyle);
443
 //                             tmp->setAutoLineSpacing(true);
444
                                currentStyle = tmp;
445
                        }
8622 subik 446
                        if (!listName.isNull())
1579 tsoots 447
                        {
448
                                listParents[listName] = currentStyle;
449
                        }
450
                }
451
                else
452
                        currentStyle = new gtStyle(*parentStyle);
453
 
454
                currentStyle->setName(name);
10118 jghali 455
                if (setDefaultStyle)
456
                {
457
                        gtParagraphStyle* tmp = dynamic_cast<gtParagraphStyle*>(currentStyle);
458
                        if (tmp)
459
                                tmp->setDefaultStyle(true);
460
                }
1579 tsoots 461
        }
462
        else
463
                currentStyle = NULL;
464
 }
465
 
466
 void StyleReader::tabStop(const QXmlAttributes& attrs)
467
 {
468
        if (currentStyle->target() == "paragraph")
469
        {
470
                gtParagraphStyle* pstyle = dynamic_cast<gtParagraphStyle*>(currentStyle);
9810 avox 471
                assert(pstyle != NULL);
1579 tsoots 472
                QString pos = NULL;
473
                QString type = NULL;
474
                for (int i = 0; i < attrs.count(); ++i)
475
                {
476
                        if (attrs.localName(i) == "style:position")
477
                                pos = attrs.value(i);
478
                        else if (attrs.localName(i) == "style:type")
479
                                type = attrs.value(i);
480
 
481
                }
8622 subik 482
                if (!pos.isNull())
1579 tsoots 483
                {
8622 subik 484
                        if (type.isNull())
1579 tsoots 485
                                type = "left";
486
                        double posd = getSize(pos);
487
                        if (type == "left")
488
                                pstyle->setTabValue(posd, LEFT_T);
489
                        else if (type == "right")
490
                                pstyle->setTabValue(posd, RIGHT_T);
491
                        else if (type == "center")
492
                                pstyle->setTabValue(posd, CENTER_T);
493
                        else
494
                                pstyle->setTabValue(posd, CENTER_T);
495
                }
496
        }
497
 }
498
 
499
 bool StyleReader::endElement(const QString&, const QString&, const QString &name)
500
 {
501
        if ((name == "style:default-style") && (currentStyle != NULL) && (readProperties))
502
        {
503
                setStyle(currentStyle->getName(), currentStyle);
504
                currentStyle = NULL;
505
                parentStyle = NULL;
506
                readProperties = false;
507
        }
508
        else if (((name == "style:style") ||
509
                  (name == "text:list-level-style-bullet") ||
510
                          (name == "text:list-level-style-number") ||
511
                          (name == "text:list-level-style-image")) && (currentStyle != NULL))
512
        {
18084 jghali 513
                if ((name == "text:list-level-style-bullet"))
514
                {
515
                        gtParagraphStyle* s = dynamic_cast<gtParagraphStyle*>(currentStyle);
516
                        if (s)
517
                                s->setBullet(true, "");
518
                }
519
                else if ((name == "text:list-level-style-number"))
520
                {
521
                        gtParagraphStyle* s = dynamic_cast<gtParagraphStyle*>(currentStyle);
522
                        if (s)
523
                                s->setNum(true);
524
                }
1579 tsoots 525
                setStyle(currentStyle->getName(), currentStyle);
526
                currentStyle = NULL;
527
                parentStyle = NULL;
528
                readProperties = false;
529
        }
530
        else if (name == "text:list-style")
531
        {
2212 tsoots 532
                if (currentListStyle) {
533
                        lists[currentListStyle->name()] = currentListStyle;
534
                        currentListStyle = 0;
535
                }
1579 tsoots 536
                inList = false;
537
        }
538
 
539
        return true;
540
 }
541
 
542
 void StyleReader::parse(QString fileName)
543
 {
7277 jghali 544
#if defined(_WIN32)
16577 craig 545
        QString fname = QDir::toNativeSeparators(fileName);
10723 jghali 546
        QByteArray fn = (QSysInfo::WindowsVersion & QSysInfo::WV_NT_based) ? fname.toUtf8() : fname.toLocal8Bit();
7277 jghali 547
#else
10493 fschmid 548
        QByteArray fn(fileName.toLocal8Bit());
7277 jghali 549
#endif
550
        xmlSAXParseFile(sSAXHandler, fn.data(), 1);
1579 tsoots 551
 }
10111 jghali 552
 
553
 gtStyle* StyleReader::getDefaultStyle(void)
554
 {
555
         gtStyle* defStyle = writer->getDefaultStyle();
556
         StyleMap::Iterator it, itEnd = styles.end();
557
         for (it = styles.begin(); it != itEnd; ++it)
558
         {
10455 cbradney 559
                 gtParagraphStyle *pStyle = dynamic_cast<gtParagraphStyle*> (it.value());
10111 jghali 560
                 if (pStyle && pStyle->isDefaultStyle())
561
                 {
562
                         defStyle = pStyle;
563
                         break;
564
                 }
565
         }
566
         return defStyle;
567
 }
1579 tsoots 568
 
569
 gtStyle* StyleReader::getStyle(const QString& name)
570
 {
571
        if (styles.contains(name))
572
        {
573
                gtStyle* tmp = styles[name];
574
                QString tname = tmp->getName();
10455 cbradney 575
                if ((tname.indexOf(docname) == -1) && (usePrefix))
1579 tsoots 576
                        tmp->setName(docname + "_" + tname);
577
 
578
                return tmp;
579
        }
580
        else
10111 jghali 581
                return getDefaultStyle();
1579 tsoots 582
 }
583
 
584
 void StyleReader::setStyle(const QString& name, gtStyle* style)
585
 {
586
        gtParagraphStyle *s;
587
        QString tname = style->getName();
588
        if ((style->target() == "paragraph") && (packStyles))
589
        {
590
                s = dynamic_cast<gtParagraphStyle*>(style);
9810 avox 591
                assert(s != NULL);
1579 tsoots 592
                QString nameByAttrs = QString("%1-").arg(s->getSpaceAbove());
593
                nameByAttrs += QString("%1-").arg(s->getSpaceBelow());
594
                nameByAttrs += QString("%1-").arg(s->getLineSpacing());
595
                nameByAttrs += QString("%1-").arg(s->getIndent());
596
                nameByAttrs += QString("%1-").arg(s->getFirstLineIndent());
597
                nameByAttrs += QString("%1-").arg(s->getAlignment());
598
                nameByAttrs += QString("%1-").arg(s->hasDropCap());
18047 craig 599
                nameByAttrs += QString("%1-").arg(s->hasBullet());
18084 jghali 600
                nameByAttrs += QString("%1-").arg(s->getBullet());
601
                nameByAttrs += QString("%1-").arg(s->hasNum());
602
                nameByAttrs += QString("%1-").arg(s->getNumFormat());
603
                nameByAttrs += QString("%1-").arg(s->getNumLevel());
604
                nameByAttrs += QString("%1-").arg(s->getNumPrefix());
605
                nameByAttrs += QString("%1-").arg(s->getNumStart());
606
                nameByAttrs += QString("%1-").arg(s->getNumSuffix());
1579 tsoots 607
                nameByAttrs += QString("%1-").arg(s->getFont()->getColor());
608
                nameByAttrs += QString("%1-").arg(s->getFont()->getStrokeColor());
2282 fschmid 609
// TODO is this important ??
610
/*              QValueList<double>* tmp = s->getTabValues();
1579 tsoots 611
                for (uint i = 0; i < tmp->count(); ++i)
612
                {
613
                        double td = (*tmp)[i];
614
                        nameByAttrs += QString("%1-").arg(td);
2282 fschmid 615
                } */
1579 tsoots 616
                if (attrsStyles.contains(nameByAttrs))
617
                {
618
                        tname = attrsStyles[nameByAttrs]->getName();
619
                        ++pstyleCounts[nameByAttrs];
620
                        style->setName(tname);
621
                }
622
                else
623
                {
624
                        attrsStyles[nameByAttrs] = style;
625
                        pstyleCounts[nameByAttrs] = 1;
626
                        tname = style->getName();
627
                }
628
        }
629
        else if (!packStyles)
630
        {
631
                attrsStyles[name] = style;
632
                pstyleCounts[name] = 1;
633
                tname = style->getName();
634
        }
635
        if (!styles.contains(name))
636
        {
10455 cbradney 637
                if ((tname.indexOf(docname) == -1) && (usePrefix))
1579 tsoots 638
                        style->setName(docname + "_" + tname);
639
                styles[name] = style;
640
        }
641
 }
642
 
643
 QString StyleReader::getFont(const QString& key)
644
 {
645
        if (fonts.contains(key))
646
                return fonts[key];
647
        else
648
                return key;
649
 }
650
 
651
 void StyleReader::setupFrameStyle()
652
 {
653
        QString fstyleName = "";
654
        int count = 0;
655
        CounterMap::Iterator it;
656
        for (it = pstyleCounts.begin(); it != pstyleCounts.end(); ++it)
657
        {
10455 cbradney 658
                if (it.value() > count)
1579 tsoots 659
                {
10455 cbradney 660
                        count = it.value();
1579 tsoots 661
                        fstyleName = it.key();
662
                }
663
        }
664
        gtFrameStyle* fstyle;
665
        gtParagraphStyle* pstyle = dynamic_cast<gtParagraphStyle*>(attrsStyles[fstyleName]);
666
        fstyle = new gtFrameStyle(*pstyle);
667
 
668
        if (!importTextOnly)
669
                writer->setFrameStyle(fstyle);
670
        delete fstyle;
671
 }
672
 
2212 tsoots 673
ListStyle* StyleReader::getList(const QString &name)
674
{
675
        ListStyle *tmp = 0;
676
        if (lists.contains(name))
677
                tmp = lists[name];
678
        return tmp;
679
}
680
 
1579 tsoots 681
 bool StyleReader::updateStyle(gtStyle* style, gtStyle* parent2Style, const QString& key, const QString& value)
682
 {
683
        gtParagraphStyle* pstyle = NULL;
684
        if (style->target() == "paragraph")
685
                pstyle = dynamic_cast<gtParagraphStyle*>(style);
686
        else
687
                pstyle = NULL;
688
        QString align = NULL;
689
        QString force = NULL;
690
 
691
        if (key == "style:font-name")
692
                style->getFont()->setName(getFont(value));
693
        else if (key == "fo:font-size")
694
        {
695
                double size = 0;
696
                double psize = 0;
697
                if (parent2Style != NULL)
698
                        psize = static_cast<double>(parent2Style->getFont()->getSize());
699
                else if (styles.contains("default-style"))
700
                        psize = static_cast<double>(styles["default-style"]->getFont()->getSize());
701
                        psize = psize / 10;
702
                size = getSize(value, psize);
703
                int nsize = static_cast<int>(size * 10);
704
                style->getFont()->setSize(nsize);
1622 tsoots 705
                if (pstyle)
1579 tsoots 706
                        pstyle->setLineSpacing(writer->getPreferredLineSpacing(nsize));
707
        }
708
        else if ((key == "fo:line-height") && (parent2Style != NULL))
709
        {
710
                gtParagraphStyle* ppstyle;
711
                if (parent2Style->target() == "paragraph")
712
                {
713
                        ppstyle = dynamic_cast<gtParagraphStyle*>(parent2Style);
9810 avox 714
                        assert(ppstyle != NULL);
715
                        ppstyle->setLineSpacing(getSize(value, writer->getPreferredLineSpacing(style->getFont()->getSize())));
1579 tsoots 716
                }
717
        }
718
        else if (key == "fo:color")
719
                style->getFont()->setColor(value);
720
        else if ((key == "style:use-window-font-color") && (value == "true"))
721
                        style->getFont()->setColor("Black");
722
        else if ((key == "fo:font-weight") && (value == "bold"))
723
                style->getFont()->setWeight(BOLD);
724
        else if ((key == "fo:font-style") && (value == "italic"))
725
                style->getFont()->setSlant(ITALIC);
1610 tsoots 726
        else if ((key == "style:text-underline-style") && (value != "none"))
1579 tsoots 727
                style->getFont()->toggleEffect(UNDERLINE);
728
        else if ((key == "style:text-crossing-out") && (value != "none"))
729
                style->getFont()->toggleEffect(STRIKETHROUGH);
730
        else if ((key == "fo:font-variant") && (value == "small-caps"))
731
                style->getFont()->toggleEffect(SMALL_CAPS);
732
        else if ((key == "style:text-outline") && (value == "true"))
733
        {
734
                style->getFont()->toggleEffect(OUTLINE);
735
                style->getFont()->setStrokeColor("Black");
736
                style->getFont()->setColor("White");
737
        }
738
        else if (key == "fo:letter-spacing")
2501 fschmid 739
                style->getFont()->setKerning(static_cast<int>(getSize(value, -1.0)));
1579 tsoots 740
        else if (key == "style:text-scale")
741
                style->getFont()->setHscale(static_cast<int>(getSize(value, -1.0)));
742
        else if ((key == "style:text-position") &&
10455 cbradney 743
                        (((value).indexOf("sub") != -1) ||
1579 tsoots 744
                        (((value).left(1) == "-") && ((value).left(1) != "0"))))
745
                style->getFont()->toggleEffect(SUBSCRIPT);
746
        else if ((key == "style:text-position") &&
10455 cbradney 747
                        (((value).indexOf("super") != -1) ||
1579 tsoots 748
                        (((value).left(1) != "-") && ((value).left(1) != "0"))))
749
                style->getFont()->toggleEffect(SUPERSCRIPT);
750
        else if ((key == "fo:margin-top") && (pstyle != NULL))
751
                pstyle->setSpaceAbove(getSize(value));
752
        else if ((key == "fo:margin-bottom") && (pstyle != NULL))
753
                pstyle->setSpaceBelow(getSize(value));
754
        else if ((key == "fo:margin-left") && (pstyle != NULL))
755
        {
756
                if (inList)
757
                        pstyle->setIndent(pstyle->getIndent() + getSize(value));
758
                else
759
                        pstyle->setIndent(getSize(value));     
760
        }
761
        else if ((key == "text:space-before") && (pstyle != NULL))
762
        {
763
                if (inList)
764
                        pstyle->setIndent(pstyle->getIndent() + getSize(value));
765
                else
766
                        pstyle->setIndent(getSize(value));     
767
        }
768
        else if ((key == "fo:text-indent") && (pstyle != NULL))
769
                pstyle->setFirstLineIndent(getSize(value));
770
        else if ((key == "fo:text-align") && (pstyle != NULL))
771
                align = value;
772
        else if ((key == "style:justify-single-word") && (pstyle != NULL))
773
                force = value;
774
 
8622 subik 775
        if (!align.isNull())
1579 tsoots 776
        {
9810 avox 777
                assert(pstyle);
1579 tsoots 778
                if (align == "end")
779
                        pstyle->setAlignment(RIGHT);
780
                else if (align == "center")
781
                        pstyle->setAlignment(CENTER);
782
                else if (align == "justify")
783
                {
784
                        if (force != "false")
785
                                pstyle->setAlignment(FORCED);
786
                        else
787
                                pstyle->setAlignment(BLOCK);
788
                }
789
        }
790
 
791
        return true;
792
 }
793
 
794
 double StyleReader::getSize(QString s, double parentSize)
795
 {
796
        QString dbl = "0.0";
10398 cbradney 797
        QString lowerValue = s.toLower();
1579 tsoots 798
        double ret = 0.0;
10517 cbradney 799
        if (lowerValue.indexOf("pt") != -1)
1579 tsoots 800
        {
801
                dbl = lowerValue.remove("pt");
2594 cbradney 802
                ret = gtMeasure::d2d(dbl.toDouble(), SC_PT);
1579 tsoots 803
        }
10455 cbradney 804
        else if (lowerValue.indexOf("mm") != -1)
1579 tsoots 805
        {
806
                dbl = lowerValue.remove("mm");
2594 cbradney 807
                ret = gtMeasure::d2d(dbl.toDouble(), SC_MM);
1579 tsoots 808
        }
10455 cbradney 809
        else if (lowerValue.indexOf("cm") != -1)
1579 tsoots 810
        {
811
                dbl = lowerValue.remove("cm");
2594 cbradney 812
                ret = gtMeasure::d2d(dbl.toDouble() * 10, SC_MM);
1579 tsoots 813
        }
10455 cbradney 814
        else if (lowerValue.indexOf("in") != -1)
1579 tsoots 815
        {
816
                dbl = lowerValue.remove("inch");
817
                dbl = lowerValue.remove("in");
2594 cbradney 818
                ret = gtMeasure::d2d(dbl.toDouble(), SC_IN);
1579 tsoots 819
        }
10455 cbradney 820
        else if (lowerValue.indexOf("pi") != -1)
1579 tsoots 821
        {
822
                dbl = lowerValue.remove("pica");
823
                dbl = lowerValue.remove("pi");
2594 cbradney 824
                ret = gtMeasure::d2d(dbl.toDouble(), SC_P);
1579 tsoots 825
        }
10455 cbradney 826
        else if (lowerValue.indexOf("c") != -1)
2594 cbradney 827
        {
828
                dbl = lowerValue.remove("cicero");
829
                dbl = lowerValue.remove("c");
830
                ret = gtMeasure::d2d(dbl.toDouble(), SC_C);
831
        }
10455 cbradney 832
        else if (lowerValue.indexOf("%") != -1)
1579 tsoots 833
        {
834
                dbl = lowerValue.remove("%");
835
                double factor = dbl.toDouble();
836
                if (parentSize != -1.0)
837
                {
838
                        factor = factor / 100;
839
                        ret = factor * parentSize;
840
                }
841
                else
842
                        ret = factor;
843
        }
844
        return ret;
845
 }
846
 
847
 StyleReader::~StyleReader()
848
 {
849
        sreader = NULL;
850
        StyleMap::Iterator it;
851
        for (it = styles.begin(); it != styles.end(); ++it)
852
        {
10427 cbradney 853
                if (it.value())
1579 tsoots 854
                {
10427 cbradney 855
                        delete it.value();
856
                        it.value() = NULL;
1579 tsoots 857
                }
858
        }
859
 }
860
 
861
 xmlSAXHandler sSAXHandlerStruct = {
862
        NULL, // internalSubset,
863
        NULL, // isStandalone,
864
        NULL, // hasInternalSubset,
865
        NULL, // hasExternalSubset,
866
        NULL, // resolveEntity,
867
        NULL, // getEntity,
868
        NULL, // entityDecl,
869
        NULL, // notationDecl,
870
        NULL, // attributeDecl,
871
        NULL, // elementDecl,
872
        NULL, // unparsedEntityDecl,
873
        NULL, // setDocumentLocator,
874
        NULL, // startDocument,
875
        NULL, // endDocument,
876
        StyleReader::startElement,
877
        StyleReader::endElement,
878
        NULL, // reference,
879
        NULL, // characters
880
        NULL, // ignorableWhitespace,
881
        NULL, // processingInstruction,
882
        NULL, // comment,
883
        NULL, // warning,
884
        NULL, // error,
885
        NULL, // fatalError,
886
        NULL, // getParameterEntity,
887
        NULL, // cdata,
888
        NULL,
889
        1
890
 #ifdef HAVE_XML26
891
        ,
892
        NULL,
893
        NULL,
894
        NULL,
895
        NULL
896
 #endif
897
 };
898
 
899
 xmlSAXHandlerPtr sSAXHandler = &sSAXHandlerStruct;
900
 
901
 void StyleReader::startElement(void*, const xmlChar * fullname, const xmlChar ** atts)
902
 {
903
        QString* name = new QString((const char*) fullname);
10398 cbradney 904
        name = new QString(name->toLower());
1579 tsoots 905
        QXmlAttributes* attrs = new QXmlAttributes();
906
        if (atts)
907
        {
908
                for(const xmlChar** cur = atts; cur && *cur; cur += 2)
909
                        attrs->append(QString((char*)*cur), NULL, QString((char*)*cur), QString((char*)*(cur + 1)));
910
        }
911
        sreader->startElement(NULL, NULL, *name, *attrs);
912
 }
913
 
914
 void StyleReader::endElement(void*, const xmlChar * name)
915
 {
916
        QString *nname = new QString((const char*) name);
10398 cbradney 917
        nname = new QString(nname->toLower());
1579 tsoots 918
        sreader->endElement(NULL, NULL, *nname);
919
 }
2212 tsoots 920
 
921
/*** ListLevel *****************************************************************************************/
922
 
923
const QString ListLevel::lowerUnits[10] = {"", "i", "ii", "iii", "iv", "v", "vi", "vii", "viii", "ix"};
924
const QString ListLevel::lowerTens[10] = {"", "x", "xx", "xxx", "xl", "l", "lx", "lxx", "lxxx", "xc"};
925
const QString ListLevel::lowerHundreds[10] = {"", "c", "cc", "ccc", "cd", "d", "dc", "dcc", "dccc", "cm"};
926
const QString ListLevel::lowerThousands[4] = {"", "m", "mm", "mmm"};
927
const QString ListLevel::upperUnits[10] = {"", "I", "II", "III", "IV", "V", "VI", "VII", "VIII", "IX"};
928
const QString ListLevel::upperTens[10] = {"", "X", "XX", "XXX", "XL", "L", "LX", "LXX", "LXXX", "XC"};
929
const QString ListLevel::upperHundreds[10] = {"", "C", "CC", "CCC", "CD", "D", "DC", "DCC", "DCC", "CM"};
930
const QString ListLevel::upperThousands[4] = {"", "M", "MM", "MMM"};
931
const QString ListLevel::lowerAlphabets[27] = {"", "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m",
932
                                    "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z"};
933
const QString ListLevel::upperAlphabets[27] = {"", "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M",
934
                                    "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z"};
935
 
936
ListLevel::ListLevel(uint level,
937
                         BulletType btype,
938
                         const QString &prefix,
939
                         const QString &suffix,
940
                         const QString &bullet,
941
                         uint displayLevels,
942
                         uint startValue) :
943
m_level(level),
944
m_btype(btype),
945
m_prefix(prefix),
946
m_suffix(suffix),
947
m_bullet(bullet),
948
m_displayLevels(displayLevels),
949
m_next(startValue)
950
{
951
 
952
}
953
 
954
QString ListLevel::bulletString()
955
{
956
        QString tmp;
957
        switch (m_btype) {
958
        case Bullet:
959
                tmp = m_bullet;
960
                break;
961
        case Number:
962
                tmp = QString("%1").arg(m_next);
963
                break;
964
        case LowerRoman:
965
                tmp = lowerRoman(m_next);
966
                break;
967
        case UpperRoman:
968
                tmp = upperRoman(m_next);
969
                break;
970
        case LowerAlpha:
971
                tmp = lowerAlpha(m_next);
972
                break;
973
        case UpperAlpha:
974
                tmp = upperAlpha(m_next);
975
                break;
976
        case Graphic:
977
                tmp = "*";
978
                break;
979
        default:
980
                tmp = "";
981
        };
982
        return tmp;
983
}
984
 
985
QString ListLevel::bullet()
986
{
987
 
988
        return QString(m_prefix + bulletString() + m_suffix);
989
}
990
 
991
QString ListLevel::prefix()
992
{
993
        return m_prefix;
994
}
995
 
996
QString ListLevel::suffix()
997
{
998
        return m_suffix;
999
}
1000
 
1001
void ListLevel::advance()
1002
{
1003
        ++m_next;
1004
}
1005
 
1006
uint ListLevel::level()
1007
{
1008
        return m_level;
1009
}
1010
 
1011
uint ListLevel::displayLevels()
1012
{
1013
        return m_displayLevels;
1014
}
1015
 
1016
void ListLevel::reset()
1017
{
1018
        m_next = 0;
1019
}
1020
 
1021
QString ListLevel::lowerRoman(uint n)
1022
{
1023
        return QString(lowerThousands[(n / 1000)] +
1024
                       lowerHundreds[(n / 100) % 10] +
1025
                       lowerTens[(n / 10) % 10] +
1026
                       lowerUnits[(n) % 10]);
1027
}
1028
 
1029
QString ListLevel::upperRoman(uint n)
1030
{
1031
        return QString(upperThousands[(n / 1000)] +
1032
                       upperHundreds[(n / 100) % 10] +
1033
                       upperTens[(n / 10) % 10] +
1034
                       upperUnits[(n) % 10]);
1035
}
1036
 
1037
QString ListLevel::lowerAlpha(uint n)
1038
{
1039
        QString tmp;
1040
        uint rounds = static_cast<uint>(n / 26);
1041
        if (rounds > 26)
1042
                rounds = 0;
1043
        uint leftover = n % 26;
1044
        return QString(lowerAlphabets[rounds] + lowerAlphabets[leftover]);
1045
}
1046
 
1047
QString ListLevel::upperAlpha(uint n)
1048
{
1049
        QString tmp;
1050
        uint rounds = static_cast<uint>(n / 26);
1051
        if (rounds > 26)
1052
                rounds = 0;
1053
        uint leftover = n % 26;
1054
        return QString(upperAlphabets[rounds] + upperAlphabets[leftover]);
1055
}
1056
 
1057
ListLevel::~ListLevel()
1058
{
1059
 
1060
}
1061
 
1062
/*** ListStyle **********************************************************************************/
1063
 
1064
ListStyle::ListStyle(const QString &name, bool consecutiveNumbering, uint currentLevel) :
1065
m_name(name),
1066
m_consecutiveNumbering(consecutiveNumbering),
1067
m_currentLevel(currentLevel),
1068
m_count(0)
1069
{
1070
        for (uint i = 0; i < 11; ++i)
1071
                levels[i] = 0;
1072
}
1073
 
1074
void ListStyle::addLevel(uint level, ListLevel *llevel)
1075
{
1076
        if (level > 0 && level < 11)
1077
                levels[level] = llevel;
1078
}
1079
 
1080
QString ListStyle::bullet()
1081
{
1082
        uint displayLevels = levels[m_currentLevel]->displayLevels();
1083
        if (displayLevels == 1)
18084 jghali 1084
                return QString(levels[m_currentLevel]->bullet());
2212 tsoots 1085
 
1086
        QString prefix = levels[m_currentLevel]->prefix();
1087
        QString suffix = levels[m_currentLevel]->suffix();
1088
        QString bullet = "";
1089
        int start = m_currentLevel - displayLevels + 1;
1090
        if (start < 1)
18084 jghali 1091
                return QString(levels[m_currentLevel]->bullet());
2212 tsoots 1092
        while (static_cast<uint>(start) <= m_currentLevel)
1093
        {
1094
                if (static_cast<uint>(start) == m_currentLevel)
1095
                        bullet += levels[start]->bulletString();
1096
                else
18084 jghali 1097
                        bullet += levels[start]->bulletString();
2212 tsoots 1098
                ++start;
1099
        }
18084 jghali 1100
        return QString(prefix + bullet + suffix);
2212 tsoots 1101
}
1102
 
1103
void ListStyle::advance()
1104
{
1105
        ++m_count;
1106
        if (levels[m_currentLevel])
1107
                levels[m_currentLevel]->advance();
1108
}
1109
 
1110
void ListStyle::setLevel(uint level)
1111
{
1112
        if (level > 0 && level < 11)
1113
                m_currentLevel = level;
1114
}
1115
 
1116
QString& ListStyle::name()
1117
{
1118
        return m_name;
1119
}
1120
 
1121
void ListStyle::resetLevel()
1122
{
1123
        levels[m_currentLevel]->reset();
1124
}
1125
 
1126
ListStyle::~ListStyle()
1127
{
1128
        for (uint i = 0; i < 11; ++i)
1129
        {
1130
                delete levels[i];
1131
                levels[i] = 0;
1132
        }
10802 cbradney 1133
}