Subversion Repositories Scribus

Rev

Rev 5880 | Rev 5980 | 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
*/
3 paul 7
/***************************************************************************
8
                        scribusXml.cpp the document xml library for scribus
9
                             -------------------
10
    begin                : Sam Jul 14 10:00:00 CEST 2001
167 Franz 11
    copyright            : (C) 2001 by Christian T�p
3 paul 12
    email                : christian.toepp@mr-ct@gmx.de
13
 ***************************************************************************/
75 Franz 14
 
3 paul 15
#include "scribusXml.h"
16
#include "scribusXml.moc"
17
#include <qfile.h>
18
#include <qtextstream.h>
19
#include <qapplication.h>
20
#include <qtl.h>
21
#include <qcursor.h>
22
#include <qregexp.h>
23
#include <qdir.h>
24
#include <qtextcodec.h>
25
#include <cstdlib>
26
#include <cmath>
27
#include "missing.h"
3670 cbradney 28
#include "page.h"
456 fschmid 29
#include "pageitem.h"
1525 cbradney 30
#include "units.h"
2834 cbradney 31
#include "prefsmanager.h"
3252 craig 32
#include "scribusview.h"
4546 subik 33
#include "commonstrings.h"
5184 avox 34
#include "text/nlsconfig.h"
128 Franz 35
 
3646 craig 36
// We use some common routines defined in fileloader.h
37
#include "fileloader.h"
38
 
1542 cbradney 39
#include <iostream>
40
 
2688 craig 41
#include "scconfig.h"
128 Franz 42
 
3 paul 43
#ifdef HAVE_LIBZ
44
#include <zlib.h>
45
#endif
2531 craig 46
#include "util.h"
325 Franz 47
 
504 cbradney 48
using namespace std;
49
 
2834 cbradney 50
ScriXmlDoc::ScriXmlDoc()
51
{
52
        prefsManager=PrefsManager::instance();
5444 cbradney 53
        dummyFois.setAutoDelete(true);
2834 cbradney 54
}
55
 
5642 cbradney 56
// bool ScriXmlDoc::IsScribus(QString fileName)
57
// {
58
//      QString fText(FileLoader::readSLA(fileName));
59
//      if ((fText.isEmpty()) || (!fText.startsWith("<SCRIBUS")) || (fText.contains("<PAGE ", true) == 0))
60
//              return false;
61
//      return true;
62
// }
383 Franz 63
 
3197 fschmid 64
void ScriXmlDoc::GetItemText(QDomElement *it, ScribusDoc *doc, bool VorLFound, bool impo, PageItem* obj)
332 Franz 65
{
3197 fschmid 66
        QString tmp2, tmf, tmpf, tmp3;
517 fschmid 67
        tmp2 = it->attribute("CH");
68
        tmp2.replace(QRegExp("\r"), QChar(5));
69
        tmp2.replace(QRegExp("\n"), QChar(5));
70
        tmp2.replace(QRegExp("\t"), QChar(4));
1194 fschmid 71
        tmpf = it->attribute("CFONT", doc->toolSettings.defFont);
3197 fschmid 72
        bool unknown = false;
5569 avox 73
        Foi* dummy = NULL;
5387 avox 74
        if ((!prefsManager->appPrefs.AvailFonts.find(tmpf)) || (!prefsManager->appPrefs.AvailFonts[tmpf]->usable()))
1428 fschmid 75
        {
3197 fschmid 76
                bool isThere = false;
77
                for (uint dl = 0; dl < dummyFois.count(); ++dl)
1428 fschmid 78
                {
3544 avox 79
                        if (dummyFois.at(dl)->scName() == tmpf)
1789 fschmid 80
                        {
3197 fschmid 81
                                isThere = true;
82
                                dummy = dummyFois.at(dl);
83
                                break;
1789 fschmid 84
                        }
1428 fschmid 85
                }
3197 fschmid 86
                if (!isThere)
1428 fschmid 87
                {
3577 fschmid 88
                        dummy = new Foi(tmpf, "", tmpf, "", "", 1, false);
3197 fschmid 89
                        dummyFois.append(dummy);
1428 fschmid 90
                }
3197 fschmid 91
                unknown = true;
5387 avox 92
                if ((!prefsManager->appPrefs.GFontSub.contains(tmpf)) || (!prefsManager->appPrefs.AvailFonts[prefsManager->appPrefs.GFontSub[tmpf]]->usable()))
1789 fschmid 93
                {
3197 fschmid 94
                        newReplacement = true;
95
                        ReplacedFonts.insert(tmpf, prefsManager->appPrefs.toolSettings.defFont);
1789 fschmid 96
                }
3197 fschmid 97
                else
98
                        ReplacedFonts.insert(tmpf, prefsManager->appPrefs.GFontSub[tmpf]);
1428 fschmid 99
        }
332 Franz 100
        else
1428 fschmid 101
        {
3197 fschmid 102
                if (!doc->UsedFonts.contains(tmpf))
103
                {
3544 avox 104
//                      QFont fo = prefsManager->appPrefs.AvailFonts[tmpf]->Font;
105
//                      fo.setPointSize(qRound(doc->toolSettings.defSize / 10.0));
106
                        doc->AddFont(tmpf);
3197 fschmid 107
                }
1428 fschmid 108
        }
4026 craig 109
        int size = qRound(it->attribute("CSIZE").toDouble() * 10);
3197 fschmid 110
        QString fcolor = it->attribute("CCOLOR");
2382 fschmid 111
        int extra;
112
        if (it->hasAttribute("CEXTRA"))
4026 craig 113
                extra = qRound(it->attribute("CEXTRA").toDouble() / it->attribute("CSIZE").toDouble() * 1000.0);
2382 fschmid 114
        else
4026 craig 115
                extra = it->attribute("CKERN").toInt();
116
        int shade = it->attribute("CSHADE").toInt();
5184 avox 117
        int cstyle = it->attribute("CSTYLE").toInt() & 255;
4026 craig 118
        int ab = it->attribute("CAB", "0").toInt();
4546 subik 119
        QString stroke = it->attribute("CSTROKE",CommonStrings::None);
4026 craig 120
        int shade2 = it->attribute("CSHADE2", "100").toInt();
121
        int scale = qRound(it->attribute("CSCALE", "100").toDouble() * 10);
122
        int scalev = qRound(it->attribute("CSCALEV", "100").toDouble() * 10);
123
        int base = qRound(it->attribute("CBASE", "0").toDouble() * 10);
124
        int shX = qRound(it->attribute("CSHX", "5").toDouble() * 10);
125
        int shY = qRound(it->attribute("CSHY", "-5").toDouble() * 10);
126
        int outL = qRound(it->attribute("COUT", "1").toDouble() * 10);
127
        int ulp = qRound(it->attribute("CULP", "-0.1").toDouble() * 10);
128
        int ulw = qRound(it->attribute("CULW", "-0.1").toDouble() * 10);
129
        int stp = qRound(it->attribute("CSTP", "-0.1").toDouble() * 10);
130
        int stw = qRound(it->attribute("CSTW", "-0.1").toDouble() * 10);
5721 avox 131
#if 0
517 fschmid 132
        for (uint cxx=0; cxx<tmp2.length(); ++cxx)
3197 fschmid 133
        {
134
                hg = new ScText;
135
                hg->ch = tmp2.at(cxx);
136
                if (hg->ch == QChar(5))
137
                        hg->ch = QChar(13);
138
                if (hg->ch == QChar(4))
139
                        hg->ch = QChar(9);
140
                if (unknown)
5691 avox 141
                        hg->setFont(dummy);
3197 fschmid 142
                else
5691 avox 143
                        hg->setFont((*doc->AllFonts)[tmpf]);
144
                hg->setFontSize(size);
145
                hg->setFillColor(fcolor);
146
                hg->setTracking(extra);
147
                hg->setFillShade(shade);
148
                hg->setEffects(static_cast<StyleFlag>(cstyle));
3197 fschmid 149
                if (impo)
150
                {
151
                        if (VorLFound)
152
                                hg->cab = DoVorl[ab].toUInt();
153
                        else
154
                        {
155
                                if (ab < 5)
156
                                        hg->cab = ab;
157
                                else
158
                                        hg->cab = 0;
159
                        }
160
                }
161
                else
162
                        hg->cab = ab;
5691 avox 163
                hg->setStrokeColor(stroke);
164
                hg->setStrokeShade(shade2);
165
                hg->setScaleH(QMIN(QMAX(scale, 100), 4000));
166
                hg->setScaleV(QMIN(QMAX(scalev, 100), 4000));
167
                hg->setBaselineOffset(base);
168
                hg->setShadowXOffset(shX);
169
                hg->setShadowYOffset(shY);
170
                hg->setOutlineWidth(outL);
171
                hg->setUnderlineOffset(ulp);
172
                hg->setUnderlineWidth(ulw);
173
                hg->setStrikethruOffset(stp);
174
                hg->setStrikethruWidth(stw);
3197 fschmid 175
                obj->itemText.append(hg);
176
        }
5184 avox 177
#else
178
        for (uint cxx=0; cxx<tmp2.length(); ++cxx)
179
        {
180
                CharStyle style;
181
                QChar ch = tmp2.at(cxx);
182
                if (ch == QChar(5))
5721 avox 183
                        ch = SpecialChars::PARSEP;
5184 avox 184
                if (ch == QChar(4))
5721 avox 185
                        ch = SpecialChars::TAB;
5184 avox 186
                if (unknown)
5721 avox 187
                        style.setFont(dummy);
5184 avox 188
                else
5721 avox 189
                        style.setFont((*doc->AllFonts)[tmpf]);
190
                style.setFontSize(size);
191
                style.setFillColor(fcolor);
192
                style.setTracking(extra);
193
                style.setFillShade(shade);
194
                style.setEffects(static_cast<StyleFlag>(cstyle));
195
                int pstyleNr;
196
                if (impo)
5184 avox 197
                {
198
                                if (VorLFound)
5721 avox 199
                                        pstyleNr = DoVorl[ab].toUInt();
5184 avox 200
                                else
201
                                {
202
                                        if (ab < 5)
5721 avox 203
                                                pstyleNr = ab;
5184 avox 204
                                        else
5721 avox 205
                                                pstyleNr = 0;
5184 avox 206
                                }
207
                }
208
                else
5721 avox 209
                        pstyleNr = ab;
210
 
211
                style.setStrokeColor(stroke);
212
                style.setStrokeShade(shade2);
213
                style.setScaleH(QMIN(QMAX(scale, 100), 4000));
214
                style.setScaleV(QMIN(QMAX(scalev, 100), 4000));
215
                style.setBaselineOffset(base);
216
                style.setShadowXOffset(shX);
217
                style.setShadowYOffset(shY);
218
                style.setOutlineWidth(outL);
219
                style.setUnderlineOffset(ulp);
220
                style.setUnderlineWidth(ulw);
221
                style.setStrikethruOffset(stp);
222
                style.setStrikethruWidth(stw);
5184 avox 223
                int pos = obj->itemText.length();
224
                obj->itemText.insertChars(pos, QString(ch));
5721 avox 225
                if (ch == SpecialChars::PARSEP)                
226
                        obj->itemText.applyStyle(pos, doc->docParagraphStyles[pstyleNr]);
227
                else
228
                        obj->itemText.applyCharStyle(pos, 1, style);
5184 avox 229
        }
230
#endif  
3197 fschmid 231
        return;
517 fschmid 232
}
233
 
2834 cbradney 234
QString ScriXmlDoc::AskForFont(SCFonts &avail, QString fStr, ScribusDoc *doc)
517 fschmid 235
{
5642 cbradney 236
        PrefsManager *prefsManager=PrefsManager::instance();
3544 avox 237
//      QFont fo;
517 fschmid 238
        QString tmpf = fStr;
5387 avox 239
        if ((!avail.find(tmpf)) || (!avail[tmpf]->usable()))
340 Franz 240
        {
5387 avox 241
                if ((!prefsManager->appPrefs.GFontSub.contains(tmpf)) || (!avail[prefsManager->appPrefs.GFontSub[tmpf]]->usable()))
340 Franz 242
                {
517 fschmid 243
                        qApp->setOverrideCursor(QCursor(arrowCursor), true);
2834 cbradney 244
                        MissingFont *dia = new MissingFont(0, tmpf, doc);
517 fschmid 245
                        dia->exec();
713 cbradney 246
                        tmpf = dia->getReplacementFont();
517 fschmid 247
                        delete dia;
248
                        qApp->setOverrideCursor(QCursor(waitCursor), true);
2834 cbradney 249
                        prefsManager->appPrefs.GFontSub[fStr] = tmpf;
340 Franz 250
                }
517 fschmid 251
                else
2834 cbradney 252
                        tmpf = prefsManager->appPrefs.GFontSub[tmpf];
1166 fschmid 253
                ReplacedFonts[fStr] = tmpf;
340 Franz 254
        }
1786 fschmid 255
        if (!doc->UsedFonts.contains(tmpf))
256
        {
3544 avox 257
//              fo = avail[tmpf]->Font;
258
//              fo.setPointSize(qRound(doc->toolSettings.defSize / 10.0));
259
                doc->AddFont(tmpf);
1786 fschmid 260
        }
517 fschmid 261
        DoFonts[fStr] = tmpf;
262
        return tmpf;
332 Franz 263
}
264
 
517 fschmid 265
void ScriXmlDoc::SetItemProps(QDomElement *ob, PageItem* item, bool newFormat)
332 Franz 266
{
2881 fschmid 267
        double xf, yf;
332 Franz 268
        QString tmp, tmpy;
522 fschmid 269
        if (newFormat)
270
                ob->setAttribute("OwnPage", item->OwnPage);
1460 cbradney 271
        ob->setAttribute("PTYPE",item->itemType());
3903 cbradney 272
        ob->setAttribute("XPOS",item->xPos());
273
        ob->setAttribute("YPOS",item->yPos());
3934 cbradney 274
        ob->setAttribute("WIDTH",item->width());
275
        ob->setAttribute("HEIGHT",item->height());
3989 cbradney 276
        ob->setAttribute("RADRECT",item->cornerRadius());
332 Franz 277
        ob->setAttribute("FRTYPE", item->FrameType);
278
        ob->setAttribute("CLIPEDIT", item->ClipEdited ? 1 : 0);
4580 cbradney 279
        ob->setAttribute("PWIDTH",item->lineWidth());
1394 cbradney 280
        ob->setAttribute("PCOLOR",item->fillColor());
281
        ob->setAttribute("PCOLOR2",item->lineColor());
5559 avox 282
        ob->setAttribute("TXTFILL",item->itemText.defaultStyle().charStyle().fillColor());
283
        ob->setAttribute("TXTSTROKE",item->itemText.defaultStyle().charStyle().strokeColor());
284
        ob->setAttribute("TXTSTRSH",item->itemText.defaultStyle().charStyle().strokeShade());
285
        ob->setAttribute("TXTFILLSH",item->itemText.defaultStyle().charStyle().fillShade());
286
        ob->setAttribute("TXTSCALE",item->itemText.defaultStyle().charStyle().scaleH() / 10.0);
287
        ob->setAttribute("TXTSCALEV",item->itemText.defaultStyle().charStyle().scaleV() / 10.0);
288
        ob->setAttribute("TXTBASE",item->itemText.defaultStyle().charStyle().baselineOffset() / 10.0);
289
        ob->setAttribute("TXTSHX",item->itemText.defaultStyle().charStyle().shadowXOffset() / 10.0);
290
        ob->setAttribute("TXTSHY",item->itemText.defaultStyle().charStyle().shadowYOffset() / 10.0);
291
        ob->setAttribute("TXTOUT",item->itemText.defaultStyle().charStyle().outlineWidth() / 10.0);
292
        ob->setAttribute("TXTULP",item->itemText.defaultStyle().charStyle().underlineOffset() / 10.0);
293
        ob->setAttribute("TXTULW",item->itemText.defaultStyle().charStyle().underlineWidth() / 10.0);
294
        ob->setAttribute("TXTSTP",item->itemText.defaultStyle().charStyle().strikethruOffset() / 10.0);
295
        ob->setAttribute("TXTSTW",item->itemText.defaultStyle().charStyle().strikethruWidth() / 10.0);
296
        ob->setAttribute("TXTSTYLE",item->itemText.defaultStyle().charStyle().effects());
297
        ob->setAttribute("COLUMNS", item->columns());
298
        ob->setAttribute("COLGAP", item->columnGap());
332 Franz 299
        ob->setAttribute("NAMEDLST",item->NamedLStyle);
1394 cbradney 300
        ob->setAttribute("SHADE",item->fillShade());
301
        ob->setAttribute("SHADE2",item->lineShade());
332 Franz 302
        ob->setAttribute("GRTYP",item->GrType);
3934 cbradney 303
        ob->setAttribute("ROT",item->rotation());
332 Franz 304
        ob->setAttribute("PLINEART",item->PLineArt);
305
        ob->setAttribute("PLINEEND", item->PLineEnd);
306
        ob->setAttribute("PLINEJOIN", item->PLineJoin);
5559 avox 307
        ob->setAttribute("LINESP",item->itemText.defaultStyle().lineSpacing());
308
        ob->setAttribute("LINESPMode", item->itemText.defaultStyle().lineSpacingMode());
309
        ob->setAttribute("TXTKERN",item->itemText.defaultStyle().charStyle().tracking());
3985 cbradney 310
        ob->setAttribute("LOCALSCX",item->imageXScale());
311
        ob->setAttribute("LOCALSCY",item->imageYScale());
312
        ob->setAttribute("LOCALX",item->imageXOffset());
313
        ob->setAttribute("LOCALY",item->imageYOffset());
4492 cbradney 314
        ob->setAttribute("PICART", item->imageShown() ? 1 : 0);
332 Franz 315
        ob->setAttribute("PLTSHOW", item->PoShow ? 1 : 0);
316
        ob->setAttribute("BASEOF", item->BaseOffs);
1392 cbradney 317
        ob->setAttribute("FLIPPEDH", item->imageFlippedH());
318
        ob->setAttribute("FLIPPEDV", item->imageFlippedV());
4335 fschmid 319
/*      ob->setAttribute("BBOXX",item->BBoxX);
320
        ob->setAttribute("BBOXH",item->BBoxH); */
5559 avox 321
        ob->setAttribute("IFONT",item->itemText.defaultStyle().charStyle().font()->scName());
322
        ob->setAttribute("ISIZE",item->itemText.defaultStyle().charStyle().fontSize() / 10.0 );
332 Franz 323
        ob->setAttribute("SCALETYPE", item->ScaleType ? 1 : 0);
324
        ob->setAttribute("RATIO", item->AspectRatio ? 1 : 0);
4698 cbradney 325
        ob->setAttribute("PRINTABLE", item->printEnabled() ? 1 : 0);
4084 cbradney 326
        if(item->isAnnotation())
332 Franz 327
        {
328
                ob->setAttribute("ANNOTATION",1);
4084 cbradney 329
                ob->setAttribute("ANTYPE", item->annotation().Type());
330
                ob->setAttribute("ANACTION", item->annotation().Action());
331
                ob->setAttribute("ANEACT", item->annotation().E_act());
332
                ob->setAttribute("ANXACT", item->annotation().X_act());
333
                ob->setAttribute("ANDACT", item->annotation().D_act());
334
                ob->setAttribute("ANFOACT", item->annotation().Fo_act());
335
                ob->setAttribute("ANBLACT", item->annotation().Bl_act());
336
                ob->setAttribute("ANKACT", item->annotation().K_act());
337
                ob->setAttribute("ANFACT", item->annotation().F_act());
338
                ob->setAttribute("ANVACT", item->annotation().V_act());
339
                ob->setAttribute("ANCACT", item->annotation().C_act());
340
                if (item->annotation().ActionType() == 8)
341
                        ob->setAttribute("ANEXTERN", item->annotation().Extern());
332 Franz 342
                else
4084 cbradney 343
                        ob->setAttribute("ANEXTERN", Path2Relative(item->annotation().Extern()));
344
                ob->setAttribute("ANZIEL", item->annotation().Ziel());
345
                ob->setAttribute("ANACTYP", item->annotation().ActionType());
346
                ob->setAttribute("ANTOOLTIP", item->annotation().ToolTip());
347
                ob->setAttribute("ANBWID", item->annotation().Bwid());
348
                ob->setAttribute("ANBSTY", item->annotation().Bsty());
349
                ob->setAttribute("ANFEED", item->annotation().Feed());
350
                ob->setAttribute("ANFLAG", item->annotation().Flag());
351
                ob->setAttribute("ANFONT", item->annotation().Font());
352
                ob->setAttribute("ANFORMAT", item->annotation().Format());
353
                ob->setAttribute("ANROLL", item->annotation().RollOver());
354
                ob->setAttribute("ANDOWN", item->annotation().Down());
355
                ob->setAttribute("ANVIS", item->annotation().Vis());
356
                ob->setAttribute("ANMC", item->annotation().MaxChar());
357
                ob->setAttribute("ANCHK", item->annotation().IsChk());
358
                ob->setAttribute("ANAA", item->annotation().AAact());
359
                ob->setAttribute("ANCHKS", item->annotation().ChkStil());
360
                ob->setAttribute("ANBCOL", item->annotation().borderColor());
361
                ob->setAttribute("ANHTML", item->annotation().HTML());
362
                ob->setAttribute("ANICON", item->annotation().UseIcons());
363
                ob->setAttribute("ANPLACE", item->annotation().IPlace());
364
                ob->setAttribute("ANSCALE", item->annotation().ScaleW());
332 Franz 365
        }
366
        else
367
                ob->setAttribute("ANNOTATION",0);
1361 tsoots 368
        ob->setAttribute("ANNAME", !item->AutoName ? item->itemName() : QString(""));
5620 jghali 369
        // "TEXTFLOWMODE" succeed to "TEXTFLOW" "TEXTFLOW2" and "TEXTFLOW3" attributes
370
        ob->setAttribute("TEXTFLOWMODE", (int) item->textFlowMode() );
371
        // Set "TEXTFLOW" "TEXTFLOW2" and "TEXTFLOW3" attributes for compatibility
372
        // with versions prior to 1.3.4
373
        ob->setAttribute("TEXTFLOW" , item->textFlowAroundObject() ? 1 : 0);
1653 craig 374
        ob->setAttribute("TEXTFLOW2", item->textFlowUsesBoundingBox() ? 1 : 0);
1656 craig 375
        ob->setAttribute("TEXTFLOW3", item->textFlowUsesContourLine() ? 1 : 0);
332 Franz 376
        ob->setAttribute("AUTOTEXT", item->isAutoText ? 1 : 0);
3988 cbradney 377
        ob->setAttribute("EXTRA",item->textToFrameDistLeft());
378
        ob->setAttribute("TEXTRA",item->textToFrameDistTop());
379
        ob->setAttribute("BEXTRA",item->textToFrameDistBottom());
380
        ob->setAttribute("REXTRA",item->textToFrameDistRight());
3625 avox 381
        if (((item->asImageFrame()) || (item->asTextFrame())) && (!item->Pfile.isEmpty()))
332 Franz 382
                ob->setAttribute("PFILE",Path2Relative(item->Pfile));
383
        else
384
                ob->setAttribute("PFILE","");
2877 cbradney 385
        if (!item->Pfile2.isEmpty())
332 Franz 386
                ob->setAttribute("PFILE2",Path2Relative(item->Pfile2));
387
        else
388
                ob->setAttribute("PFILE2","");
2877 cbradney 389
        if (!item->Pfile3.isEmpty())
332 Franz 390
                ob->setAttribute("PFILE3",Path2Relative(item->Pfile3));
391
        else
392
                ob->setAttribute("PFILE3","");
393
        ob->setAttribute("PRFILE",item->IProfile);
394
        ob->setAttribute("EPROF", item->EmProfile);
395
        ob->setAttribute("IRENDER",item->IRender);
396
        ob->setAttribute("EMBEDDED", item->UseEmbedded ? 1 : 0);
1392 cbradney 397
        ob->setAttribute("LOCK", item->locked() ? 1 : 0);
398
        ob->setAttribute("LOCKR", item->sizeLocked() ? 1 : 0);
3988 cbradney 399
        ob->setAttribute("REVERS", item->reversed() ? 1 : 0);
1394 cbradney 400
        ob->setAttribute("TransValue", item->fillTransparency());
401
        ob->setAttribute("TransValueS", item->lineTransparency());
5746 fschmid 402
        ob->setAttribute("TransBlend", item->fillBlendmode());
403
        ob->setAttribute("TransBlendS", item->lineBlendmode());
332 Franz 404
        ob->setAttribute("isTableItem", static_cast<int>(item->isTableItem));
405
        ob->setAttribute("TopLine", static_cast<int>(item->TopLine));
406
        ob->setAttribute("LeftLine", static_cast<int>(item->LeftLine));
407
        ob->setAttribute("RightLine", static_cast<int>(item->RightLine));
408
        ob->setAttribute("BottomLine", static_cast<int>(item->BottomLine));
409
        if (item->isTableItem)
410
        {
411
                if (item->TopLink != 0)
412
                        ob->setAttribute("TopLINK", item->TopLink->ItemNr);
413
                else
414
                        ob->setAttribute("TopLINK", -1);
415
                if (item->LeftLink != 0)
416
                        ob->setAttribute("LeftLINK", item->LeftLink->ItemNr);
417
                else
418
                        ob->setAttribute("LeftLINK", -1);
419
                if (item->RightLink != 0)
420
                        ob->setAttribute("RightLINK", item->RightLink->ItemNr);
421
                else
422
                        ob->setAttribute("RightLINK", -1);
423
                if (item->BottomLink != 0)
424
                        ob->setAttribute("BottomLINK", item->BottomLink->ItemNr);
425
                else
426
                        ob->setAttribute("BottomLINK", -1);
427
                ob->setAttribute("OwnLINK", item->ItemNr);
428
        }
429
        ob->setAttribute("NUMDASH", static_cast<int>(item->DashValues.count()));
430
        QString dlp = "";
431
        QValueList<double>::Iterator dax;
432
        for (dax = item->DashValues.begin(); dax != item->DashValues.end(); ++dax)
433
                dlp += tmp.setNum((*dax)) + " ";
434
        ob->setAttribute("DASHS", dlp);
435
        ob->setAttribute("DASHOFF", item->DashOffset);
436
        ob->setAttribute("NUMPO",item->PoLine.size());
437
        QString polp = "";
438
        for (uint nxx=0; nxx<item->PoLine.size(); ++nxx)
439
        {
440
                item->PoLine.point(nxx, &xf, &yf);
441
                polp += tmp.setNum(xf) + " " + tmpy.setNum(yf) + " ";
442
        }
443
        ob->setAttribute("POCOOR", polp);
340 Franz 444
        ob->setAttribute("NUMCO",item->ContourLine.size());
445
        QString colp = "";
446
        for (uint nxx=0; nxx<item->ContourLine.size(); ++nxx)
447
        {
448
                item->ContourLine.point(nxx, &xf, &yf);
449
                colp += tmp.setNum(xf) + " " + tmpy.setNum(yf) + " ";
450
        }
451
        ob->setAttribute("COCOOR", colp);
332 Franz 452
        ob->setAttribute("NUMGROUP", static_cast<int>(item->Groups.count()));
453
        QString glp = "";
454
        QValueStack<int>::Iterator nx;
455
        for (nx = item->Groups.begin(); nx != item->Groups.end(); ++nx)
456
                glp += tmp.setNum((*nx)) + " ";
457
        ob->setAttribute("GROUPS", glp);
5559 avox 458
        ob->setAttribute("LANGUAGE", item->itemText.defaultStyle().charStyle().language());
4061 craig 459
        ob->setAttribute("startArrowIndex", item->startArrowIndex());
460
        ob->setAttribute("endArrowIndex", item->endArrowIndex());
332 Franz 461
}
462
 
5643 cbradney 463
//CB: Private only now
5215 mrdocs 464
void ScriXmlDoc::GetStyle(QDomElement *pg, ParagraphStyle *vg, QValueList<ParagraphStyle> &docParagraphStyles, ScribusDoc* doc, bool fl)
332 Franz 465
{
466
        bool fou;
467
        QString tmpf, tmf, tmV;
2282 fschmid 468
        double xf, xf2;
332 Franz 469
        fou = false;
5184 avox 470
        vg->setName(pg->attribute("NAME"));
471
        vg->setLineSpacingMode(static_cast<ParagraphStyle::LineSpacingMode>(pg->attribute("LINESPMode", "0").toInt()));
472
        vg->setLineSpacing(pg->attribute("LINESP").toDouble());
473
        vg->setLeftMargin(pg->attribute("INDENT", "0").toDouble());
474
        vg->setFirstIndent(pg->attribute("FIRST", "0").toDouble());
475
        vg->setAlignment(pg->attribute("ALIGN").toInt());
476
        vg->setGapBefore(pg->attribute("VOR", "0").toDouble());
477
        vg->setGapAfter(pg->attribute("NACH", "0").toDouble());
1194 fschmid 478
        tmpf = pg->attribute("FONT", doc->toolSettings.defFont);
2877 cbradney 479
        if (tmpf.isEmpty())
1194 fschmid 480
                tmpf = doc->toolSettings.defFont;
332 Franz 481
        tmf = tmpf;
482
        if (!DoFonts.contains(tmpf))
2834 cbradney 483
                tmpf = AskForFont(prefsManager->appPrefs.AvailFonts, tmpf, doc);
332 Franz 484
        else
485
                tmpf = DoFonts[tmf];
5691 avox 486
        vg->charStyle().setFont(prefsManager->appPrefs.AvailFonts[tmpf]);
487
        vg->charStyle().setFontSize(qRound(pg->attribute("FONTSIZE", "12").toDouble() * 10.0));
5184 avox 488
        vg->setHasDropCap(static_cast<bool>(pg->attribute("DROP", "0").toInt()));
489
        vg->setDropCapLines(pg->attribute("DROPLIN", "2").toInt());
490
        vg->setDropCapOffset(pg->attribute("DROPDIST", "0").toDouble());
5691 avox 491
        vg->charStyle().setEffects(static_cast<StyleFlag>(pg->attribute("EFFECT", "0").toInt()));
492
        vg->charStyle().setFillColor(pg->attribute("FCOLOR", doc->toolSettings.dBrush));
493
        vg->charStyle().setFillShade(pg->attribute("FSHADE", "100").toInt());
494
        vg->charStyle().setStrokeColor(pg->attribute("SCOLOR", doc->toolSettings.dPen));
495
        vg->charStyle().setStrokeShade(pg->attribute("SSHADE", "100").toInt());
5184 avox 496
        vg->setUseBaselineGrid(static_cast<bool>(pg->attribute("BASE", "0").toInt()));
5691 avox 497
        vg->charStyle().setShadowXOffset(qRound(pg->attribute("TXTSHX", "5").toDouble() * 10));
498
        vg->charStyle().setShadowYOffset(qRound(pg->attribute("TXTSHY", "-5").toDouble() * 10));
499
        vg->charStyle().setOutlineWidth(qRound(pg->attribute("TXTOUT", "1").toDouble() * 10));
500
        vg->charStyle().setUnderlineOffset(qRound(pg->attribute("TXTULP", "-0.1").toDouble() * 10));
501
        vg->charStyle().setUnderlineWidth(qRound(pg->attribute("TXTULW", "-0.1").toDouble() * 10));
502
        vg->charStyle().setStrikethruOffset(qRound(pg->attribute("TXTSTP", "-0.1").toDouble() * 10));
503
        vg->charStyle().setStrikethruWidth(qRound(pg->attribute("TXTSTW", "-0.1").toDouble() * 10));
504
        vg->charStyle().setScaleH(qRound(pg->attribute("SCALEH", "100").toDouble() * 10));
505
        vg->charStyle().setScaleV(qRound(pg->attribute("SCALEV", "100").toDouble() * 10));
506
        vg->charStyle().setBaselineOffset(qRound(pg->attribute("BASEO", "0").toDouble() * 10));
507
        vg->charStyle().setTracking(qRound(pg->attribute("KERN", "0").toDouble() * 10));
5184 avox 508
        vg->tabValues().clear();
4026 craig 509
        if ((pg->hasAttribute("NUMTAB")) && (pg->attribute("NUMTAB", "0").toInt() != 0))
332 Franz 510
        {
5184 avox 511
                ParagraphStyle::TabRecord tb;
332 Franz 512
                QString tmp = pg->attribute("TABS");
513
                QTextStream tgv(&tmp, IO_ReadOnly);
5184 avox 514
                vg->tabValues().clear();
4026 craig 515
                for (int cxv = 0; cxv < pg->attribute("NUMTAB", "0").toInt(); cxv += 2)
332 Franz 516
                {
517
                        tgv >> xf;
2282 fschmid 518
                        tgv >> xf2;
519
                        tb.tabPosition = xf2;
520
                        tb.tabType = static_cast<int>(xf);
521
                        tb.tabFillChar = QChar();
5184 avox 522
                        vg->tabValues().append(tb);
332 Franz 523
                }
524
                tmp = "";
525
        }
526
        else
2282 fschmid 527
        {
528
                QDomNode IT = pg->firstChild();
529
                while(!IT.isNull())
530
                {
531
                        QDomElement it = IT.toElement();
532
                        if (it.tagName()=="Tabs")
533
                        {
5184 avox 534
                                ParagraphStyle::TabRecord tb;
4026 craig 535
                                tb.tabPosition = it.attribute("Pos").toDouble();
536
                                tb.tabType = it.attribute("Type").toInt();
2282 fschmid 537
                                QString tbCh = "";
538
                                tbCh = it.attribute("Fill","");
2877 cbradney 539
                                if (tbCh.isEmpty())
2282 fschmid 540
                                        tb.tabFillChar = QChar();
541
                                else
542
                                        tb.tabFillChar = tbCh[0];
5184 avox 543
                                vg->tabValues().append(tb);
2282 fschmid 544
                        }
545
                        IT=IT.nextSibling();
546
                }
547
        }
1065 cbradney 548
        for (uint xx=0; xx<docParagraphStyles.count(); ++xx)
332 Franz 549
        {
5184 avox 550
                if (vg->name() == docParagraphStyles[xx].name())
332 Franz 551
                {
4097 cbradney 552
                        //Compare the attributes of the pasted styles vs existing ones
5184 avox 553
                        if (vg->equiv(docParagraphStyles[xx]))
335 Franz 554
                        {
555
                                if (fl)
556
                                {
557
                                        DoVorl[VorlC] = tmV.setNum(xx);
558
                                        VorlC++;
559
                                }
332 Franz 560
                                fou = true;
335 Franz 561
                        }
332 Franz 562
                        else
563
                        {
5184 avox 564
                                vg->setName("Copy of "+docParagraphStyles[xx].name());
332 Franz 565
                                fou = false;
566
                        }
567
                        break;
568
                }
569
        }
570
        if (!fou)
571
        {
1065 cbradney 572
                for (uint xx=0; xx< docParagraphStyles.count(); ++xx)
332 Franz 573
                {
5184 avox 574
                        if (vg->equiv(docParagraphStyles[xx]))
2282 fschmid 575
                        {
5184 avox 576
                                vg->setName(docParagraphStyles[xx].name());
332 Franz 577
                                fou = true;
578
                                if (fl)
579
                                {
580
                                        DoVorl[VorlC] = tmV.setNum(xx);
581
                                        VorlC++;
582
                                }
583
                                break;
584
                        }
585
                }
586
        }
587
        if (!fou)
588
        {
1065 cbradney 589
                docParagraphStyles.append(*vg);
332 Franz 590
                if (fl)
591
                {
1065 cbradney 592
                        DoVorl[VorlC] = tmV.setNum(docParagraphStyles.count()-1);
332 Franz 593
                        VorlC++;
594
                }
595
        }
596
}
597
 
80 Franz 598
bool ScriXmlDoc::ReadElemHeader(QString file, bool isFile, double *x, double *y, double *w, double *h)
3 paul 599
{
600
        QString f;
601
        QDomDocument docu("scridoc");
602
        if (isFile)
167 Franz 603
        {
3 paul 604
                if (!loadText(file, &f))
605
                        return false;
606
                QString ff = "";
607
                if (f.startsWith("<SCRIBUSELEMUTF8"))
608
                        ff = QString::fromUtf8(f);
609
                else
610
                        ff = f;
611
                if(!docu.setContent(ff))
612
                        return false;
167 Franz 613
        }
3 paul 614
        else
167 Franz 615
        {
3 paul 616
                QString ff = "";
617
                if (file.startsWith("<SCRIBUSELEMUTF8"))
618
                        ff = QString::fromUtf8(file);
619
                else
620
                        ff = file;
621
                if(!docu.setContent(ff))
622
                        return false;
167 Franz 623
        }
3 paul 624
        QDomElement elem=docu.documentElement();
625
        if ((elem.tagName() != "SCRIBUSELEM") && (elem.tagName() != "SCRIBUSELEMUTF8"))
626
                return false;
4026 craig 627
        *x = elem.attribute("XP").toDouble();
628
        *y = elem.attribute("YP").toDouble();
629
        *w = elem.attribute("W", "0").toDouble();
630
        *h = elem.attribute("H", "0").toDouble();
3 paul 631
        return true;
632
}
633
 
3743 fschmid 634
bool ScriXmlDoc::ReadElem(QString fileName, SCFonts &avail, ScribusDoc *doc, double Xp, double Yp, bool Fi, bool loc, QMap<QString,QString> &FontSub, ScribusView *view)
3 paul 635
{
1065 cbradney 636
        struct CopyPasteBuffer OB;
5184 avox 637
        ParagraphStyle vg;
121 Franz 638
        QString tmp, tmpf, tmp2, tmp3, tmp4, f, tmV, tmf;
28 Franz 639
        QMap<QString,QString> DoMul;
234 Franz 640
        QMap<int,int> TableID;
741 fschmid 641
        QMap<int,int> arrowID;
234 Franz 642
        QPtrList<PageItem> TableItems;
3 paul 643
        bool VorLFound = false;
68 Franz 644
        bool newVersion = false;
332 Franz 645
        int x;
646
        double GrX, GrY;
3 paul 647
        int GrMax = doc->GroupCounter;
2886 fschmid 648
        ScColor lf = ScColor();
3 paul 649
        QDomDocument docu("scridoc");
650
        if (Fi)
167 Franz 651
        {
3 paul 652
                if (!loadText(fileName, &f))
653
                        return false;
654
                QString ff = "";
655
                if (f.startsWith("<SCRIBUSELEMUTF8"))
656
                        ff = QString::fromUtf8(f);
657
                else
658
                        ff = f;
659
                if(!docu.setContent(ff))
660
                        return false;
167 Franz 661
        }
3 paul 662
        else
167 Franz 663
        {
3 paul 664
                QString ff = "";
665
                if (fileName.startsWith("<SCRIBUSELEMUTF8"))
666
                        ff = QString::fromUtf8(fileName);
667
                else
668
                        ff = fileName;
669
                if(!docu.setContent(ff))
670
                        return false;
167 Franz 671
        }
3 paul 672
        QDomElement elem=docu.documentElement();
673
        if ((elem.tagName() != "SCRIBUSELEM") && (elem.tagName() != "SCRIBUSELEMUTF8"))
674
                return false;
675
        if (loc)
167 Franz 676
        {
3743 fschmid 677
                GrX = 0.0;
678
                GrY = 0.0;
167 Franz 679
        }
3 paul 680
        else
167 Franz 681
        {
4026 craig 682
                GrX = elem.attribute("XP").toDouble();
683
                GrY = elem.attribute("YP").toDouble();
167 Franz 684
        }
68 Franz 685
        if (elem.hasAttribute("Version"))
686
                newVersion = true;
3 paul 687
        QDomNode DOC=elem.firstChild();
688
        DoFonts.clear();
1194 fschmid 689
        DoFonts[doc->toolSettings.defFont] = doc->toolSettings.defFont;
3 paul 690
        DoVorl.clear();
113 Franz 691
        DoVorl[0] = "0";
692
        DoVorl[1] = "1";
693
        DoVorl[2] = "2";
694
        DoVorl[3] = "3";
695
        DoVorl[4] = "4";
3 paul 696
        VorlC = 5;
234 Franz 697
        TableItems.clear();
698
        TableID.clear();
741 fschmid 699
        arrowID.clear();
63 Franz 700
        QString CurDirP = QDir::currentDirPath();
282 Franz 701
        QDir::setCurrent(QDir::homeDirPath());
741 fschmid 702
        int startNumArrows = doc->arrowStyles.count();
3 paul 703
        while(!DOC.isNull())
167 Franz 704
        {
3 paul 705
                QDomElement pg=DOC.toElement();
741 fschmid 706
                if(pg.tagName()=="Arrows")
707
                {
4026 craig 708
                        if (pg.attribute("Index").toInt() > startNumArrows)
741 fschmid 709
                        {
1065 cbradney 710
                                struct ArrowDesc arrow;
741 fschmid 711
                                double xa, ya;
760 fschmid 712
                                arrow.name = pg.attribute("Name");
776 fschmid 713
                                arrow.userArrow = true;
741 fschmid 714
                                QString tmp = pg.attribute("Points");
715
                                QTextStream fp(&tmp, IO_ReadOnly);
716
                                for (uint cx = 0; cx < pg.attribute("NumPoints").toUInt(); ++cx)
717
                                {
718
                                        fp >> xa;
719
                                        fp >> ya;
760 fschmid 720
                                        arrow.points.addPoint(xa, ya);
741 fschmid 721
                                }
722
                                doc->arrowStyles.append(arrow);
4026 craig 723
                                arrowID.insert(pg.attribute("Index").toInt(), doc->arrowStyles.count());
741 fschmid 724
                        }
725
                        else
4026 craig 726
                                arrowID.insert(pg.attribute("Index").toInt(), pg.attribute("Index").toInt());
741 fschmid 727
                }
3 paul 728
                if(pg.tagName()=="FONT")
167 Franz 729
                {
3 paul 730
                        tmpf = pg.attribute("NAME");
5387 avox 731
                        if ((!avail.find(tmpf)) || (!avail[tmpf]->usable()))
167 Franz 732
                        {
5387 avox 733
                                if (!FontSub.contains(tmpf) || (!avail[FontSub[tmpf]]->usable()))
3 paul 734
                                {
2834 cbradney 735
                                        MissingFont *dia = new MissingFont(0, tmpf, doc);
3 paul 736
                                        dia->exec();
713 cbradney 737
                                        tmpf = dia->getReplacementFont();
3 paul 738
                                        FontSub[pg.attribute("NAME")] = tmpf;
739
                                        delete dia;
167 Franz 740
                                }
3 paul 741
                                else
742
                                        tmpf = FontSub[tmpf];
167 Franz 743
                        }
3544 avox 744
//                      fo = avail[tmpf]->Font;
745
//                      fo.setPointSize(qRound(doc->toolSettings.defSize / 10.0));
3 paul 746
                        if(!doc->UsedFonts.contains(tmpf))
3544 avox 747
                                doc->AddFont(tmpf);
3 paul 748
                        DoFonts[pg.attribute("NAME")] = tmpf;
167 Franz 749
                }
516 fschmid 750
                // 10/25/2004 pv - None is "reserved" color. cannot be defined in any file...
4546 subik 751
                if(pg.tagName()=="COLOR" && pg.attribute("Name")!=CommonStrings::None)
167 Franz 752
                {
5880 jghali 753
                        lf.setDocument(doc);
28 Franz 754
                        if (pg.hasAttribute("CMYK"))
755
                                lf.setNamedColor(pg.attribute("CMYK"));
756
                        else
757
                                lf.fromQColor(QColor(pg.attribute("RGB")));
3051 fschmid 758
                        if (pg.hasAttribute("Spot"))
4618 fschmid 759
                                lf.setSpotColor(static_cast<bool>(pg.attribute("Spot").toInt()));
3051 fschmid 760
                        else
761
                                lf.setSpotColor(false);
4618 fschmid 762
                        if (pg.hasAttribute("Register"))
763
                                lf.setRegistrationColor(static_cast<bool>(pg.attribute("Register").toInt()));
764
                        else
765
                                lf.setRegistrationColor(false);
3 paul 766
                        if (!doc->PageColors.contains(pg.attribute("NAME")))
167 Franz 767
                                doc->PageColors[pg.attribute("NAME")] = lf;
768
                }
28 Franz 769
                if(pg.tagName()=="MultiLine")
167 Franz 770
                {
28 Franz 771
                        multiLine ml;
772
                        QDomNode MuLn = DOC.firstChild();
773
                        while(!MuLn.isNull())
167 Franz 774
                        {
28 Franz 775
                                QDomElement MuL = MuLn.toElement();
1065 cbradney 776
                                struct SingleLine sl;
28 Franz 777
                                sl.Color = MuL.attribute("Color");
4026 craig 778
                                sl.Dash = MuL.attribute("Dash").toInt();
779
                                sl.LineEnd = MuL.attribute("LineEnd").toInt();
780
                                sl.LineJoin = MuL.attribute("LineJoin").toInt();
781
                                sl.Shade = MuL.attribute("Shade").toInt();
782
                                sl.Width = MuL.attribute("Width").toDouble();
33 Franz 783
                                ml.push_back(sl);
28 Franz 784
                                MuLn = MuLn.nextSibling();
167 Franz 785
                        }
28 Franz 786
                        if (!doc->MLineStyles.contains(pg.attribute("Name")))
787
                                doc->MLineStyles.insert(pg.attribute("Name"), ml);
167 Franz 788
                }
3 paul 789
                if(pg.tagName()=="STYLE")
167 Franz 790
                {
2834 cbradney 791
                        GetStyle(&pg, &vg, doc->docParagraphStyles, doc, true);
3 paul 792
                        VorLFound = true;
167 Franz 793
                }
3 paul 794
                DOC=DOC.nextSibling();
167 Franz 795
        }
3 paul 796
        DOC=elem.firstChild();
797
        while(!DOC.isNull())
167 Franz 798
        {
3 paul 799
                QDomElement pg=DOC.toElement();
800
                if(pg.tagName()=="ITEM")
167 Franz 801
                {
332 Franz 802
                        GetItemProps(newVersion, &pg, &OB);
4026 craig 803
                        OB.Xpos = Xp + pg.attribute("XPOS").toDouble() - GrX;
804
                        OB.Ypos = Yp + pg.attribute("YPOS").toDouble() - GrY;
805
                        OB.startArrowIndex =  arrowID[pg.attribute("startArrowIndex", "0").toInt()];
806
                        OB.endArrowIndex =  arrowID[pg.attribute("endArrowIndex", "0").toInt()];
807
                        OB.isBookmark=pg.attribute("BOOKMARK").toInt();
27 Franz 808
                        OB.NamedLStyle = pg.attribute("NAMEDLST", "");
809
                        if (!doc->MLineStyles.contains(OB.NamedLStyle))
810
                                OB.NamedLStyle = "";
4026 craig 811
                        OB.textAlignment = DoVorl[pg.attribute("ALIGN", "0").toInt()].toUInt();
1194 fschmid 812
                        tmf = pg.attribute("IFONT", doc->toolSettings.defFont);
2877 cbradney 813
                        if (tmf.isEmpty())
1194 fschmid 814
                                tmf = doc->toolSettings.defFont;
2877 cbradney 815
                        if (DoFonts[tmf].isEmpty())
1194 fschmid 816
                                OB.IFont = doc->toolSettings.defFont;
323 Franz 817
                        else
818
                                OB.IFont = DoFonts[tmf];
332 Franz 819
                        OB.LayerNr = 0;
75 Franz 820
                        OB.Language = pg.attribute("LANGUAGE", doc->Language);
3 paul 821
                        tmp = "";
4026 craig 822
                        if ((pg.hasAttribute("GROUPS")) && (pg.attribute("NUMGROUP", "0").toInt() != 0))
167 Franz 823
                        {
3 paul 824
                                tmp = pg.attribute("GROUPS");
825
                                QTextStream fg(&tmp, IO_ReadOnly);
826
                                OB.Groups.clear();
4026 craig 827
                                for (int cx = 0; cx < pg.attribute("NUMGROUP", "0").toInt(); ++cx)
167 Franz 828
                                {
3 paul 829
                                        fg >> x;
830
                                        OB.Groups.push(x+doc->GroupCounter);
831
                                        GrMax = QMAX(GrMax, x+doc->GroupCounter);
167 Franz 832
                                }
3 paul 833
                                tmp = "";
167 Franz 834
                        }
3 paul 835
                        else
836
                                OB.Groups.clear();
837
                        tmp = "";
838
                        QDomNode IT=DOC.firstChild();
839
                        while(!IT.isNull())
167 Franz 840
                        {
3 paul 841
                                QDomElement it=IT.toElement();
295 Franz 842
                                if (it.tagName()=="CSTOP")
843
                                {
844
                                        QString name = it.attribute("NAME");
4026 craig 845
                                        double ramp = it.attribute("RAMP", "0.0").toDouble();
846
                                        int shade = it.attribute("SHADE", "100").toInt();
847
                                        double opa = it.attribute("TRANS", "1").toDouble();
690 cbradney 848
                                        OB.fill_gradient.addStop(SetColor(doc, name, shade), ramp, 0.5, opa, name, shade);
2180 fschmid 849
                                        OB.GrColor = "";
850
                                        OB.GrColor2 = "";
295 Franz 851
                                }
2282 fschmid 852
                                if (it.tagName()=="Tabs")
853
                                {
5184 avox 854
                                        ParagraphStyle::TabRecord tb;
4026 craig 855
                                        tb.tabPosition = it.attribute("Pos").toDouble();
856
                                        tb.tabType = it.attribute("Type").toInt();
2282 fschmid 857
                                        QString tbCh = "";
858
                                        tbCh = it.attribute("Fill","");
2877 cbradney 859
                                        if (tbCh.isEmpty())
2282 fschmid 860
                                                tb.tabFillChar = QChar();
861
                                        else
862
                                                tb.tabFillChar = tbCh[0];
863
                                        OB.TabValues.append(tb);
864
                                }
167 Franz 865
                                IT=IT.nextSibling();
866
                        }
2858 fschmid 867
                        OB.itemText = "";
3 paul 868
                        OB.LayerNr = -1;
456 fschmid 869
                        view->PasteItem(&OB, true, true);
3727 cbradney 870
                        PageItem* Neu = doc->Items->at(doc->Items->count()-1);
2858 fschmid 871
                        IT=DOC.firstChild();
872
                        while(!IT.isNull())
873
                        {
874
                                QDomElement it=IT.toElement();
875
                                if (it.tagName()=="ITEXT")
3197 fschmid 876
                                        GetItemText(&it, doc, VorLFound, true, Neu);
4055 fschmid 877
                                if (it.tagName()=="ImageEffect")
878
                                {
879
                                        struct ScImage::imageEffect ef;
880
                                        ef.effectParameters = it.attribute("Param");
881
                                        ef.effectCode = it.attribute("Code").toInt();
882
                                        Neu->effectsInUse.append(ef);
883
                                }
4326 fschmid 884
                                if (it.tagName() == "PSDLayer")
885
                                {
5937 jghali 886
                                        struct ImageLoadRequest loadingInfo;
4326 fschmid 887
                                        loadingInfo.blend = it.attribute("Blend");
888
                                        loadingInfo.opacity = it.attribute("Opacity").toInt();
889
                                        loadingInfo.visible = static_cast<bool>(it.attribute("Visible").toInt());
890
                                        Neu->pixm.imgInfo.RequestProps.insert(it.attribute("Layer").toInt(), loadingInfo);
891
                                        Neu->pixm.imgInfo.isRequest = true;
892
                                }
2858 fschmid 893
                                IT=IT.nextSibling();
894
                        }
4326 fschmid 895
                        if ((Neu->effectsInUse.count() != 0) || (Neu->pixm.imgInfo.RequestProps.count() != 0))
4055 fschmid 896
                                doc->LoadPict(Neu->Pfile, Neu->ItemNr, true);
234 Franz 897
                        if (Neu->isTableItem)
898
                        {
899
                                TableItems.append(Neu);
4026 craig 900
                                TableID.insert(pg.attribute("OwnLINK", "0").toInt(), Neu->ItemNr);
234 Franz 901
                        }
4536 fschmid 902
                        if (Neu->asPathText())
4688 cbradney 903
                                Neu->updatePolyClip();
167 Franz 904
                }
3 paul 905
                DOC=DOC.nextSibling();
167 Franz 906
        }
234 Franz 907
        if (TableItems.count() != 0)
908
        {
909
                for (uint ttc = 0; ttc < TableItems.count(); ++ttc)
910
                {
911
                        PageItem* ta = TableItems.at(ttc);
912
                        if (ta->TopLinkID != -1)
3727 cbradney 913
                                ta->TopLink = doc->Items->at(TableID[ta->TopLinkID]);
234 Franz 914
                        else
915
                                ta->TopLink = 0;
916
                        if (ta->LeftLinkID != -1)
3727 cbradney 917
                                ta->LeftLink = doc->Items->at(TableID[ta->LeftLinkID]);
234 Franz 918
                        else
919
                                ta->LeftLink = 0;
920
                        if (ta->RightLinkID != -1)
3727 cbradney 921
                                ta->RightLink = doc->Items->at(TableID[ta->RightLinkID]);
234 Franz 922
                        else
923
                                ta->RightLink = 0;
924
                        if (ta->BottomLinkID != -1)
3727 cbradney 925
                                ta->BottomLink = doc->Items->at(TableID[ta->BottomLinkID]);
234 Franz 926
                        else
927
                                ta->BottomLink = 0;
928
                }
929
        }
3 paul 930
        doc->GroupCounter = GrMax + 1;
63 Franz 931
        QDir::setCurrent(CurDirP);
3 paul 932
        return true;
933
}
934
 
4130 cbradney 935
QString ScriXmlDoc::WriteElem(ScribusDoc *doc, ScribusView *view, Selection* selection)
3 paul 936
{
2382 fschmid 937
        int te, te2, tsh, tsh2, tst, tst2, tsb, tsb2, tshs, tshs2;
82 Franz 938
        QString text, tf, tf2, tc, tc2, tcs, tcs2, tmp, tmpy;
3735 fschmid 939
        double ts, ts2, tsc, tsc2, tscv, tscv2, tb, tb2, tsx, tsx2, tsy, tsy2, tout, tout2, tulp, tulp2, tulw, tulw2, tstp, tstp2, tstw, tstw2, xp, yp;
3 paul 940
        PageItem *item;
941
        QDomDocument docu("scribus");
942
        QString st="<SCRIBUSELEMUTF8></SCRIBUSELEMUTF8>";
943
        docu.setContent(st);
944
        QDomElement elem=docu.documentElement();
3934 cbradney 945
        //item = Selitems->at(0);
4130 cbradney 946
        item = selection->itemAt(0);
3 paul 947
        QValueList<uint> ELL;
3934 cbradney 948
        //for (uint cor=0; cor<Selitems->count(); ++cor)
4130 cbradney 949
        for (uint cor=0; cor<selection->count(); ++cor)
3934 cbradney 950
                //ELL.append(Selitems->at(cor)->ItemNr);
4130 cbradney 951
                ELL.append(selection->itemAt(cor)->ItemNr);
3 paul 952
        qHeapSort(ELL);
4130 cbradney 953
        if (selection->isMultipleSelection())
167 Franz 954
        {
5087 subik 955
                xp = view->GroupX - doc->currentPage()->xOffset();
956
                yp = view->GroupY - doc->currentPage()->yOffset();
456 fschmid 957
                elem.setAttribute("W", view->GroupW);
958
                elem.setAttribute("H", view->GroupH);
167 Franz 959
        }
3 paul 960
        else
167 Franz 961
        {
5087 subik 962
                xp = item->xPos() - doc->currentPage()->xOffset();
963
                yp = item->yPos() - doc->currentPage()->yOffset();
3934 cbradney 964
                elem.setAttribute("W", item->width());
965
                elem.setAttribute("H", item->height());
167 Franz 966
        }
3735 fschmid 967
        elem.setAttribute("XP", xp);
968
        elem.setAttribute("YP", yp);
3934 cbradney 969
        //elem.setAttribute("COUNT", Selitems->count());
4130 cbradney 970
        elem.setAttribute("COUNT", selection->count());
2800 fschmid 971
        elem.setAttribute("Version", QString(VERSION));
3544 avox 972
        QMap<QString,int>::Iterator itf;
322 Franz 973
        for (itf = doc->UsedFonts.begin(); itf != doc->UsedFonts.end(); ++itf)
974
        {
975
                QDomElement fn=docu.createElement("FONT");
976
                fn.setAttribute("NAME",itf.key());
977
                elem.appendChild(fn);
978
        }
1065 cbradney 979
        ColorList::Iterator itc;
322 Franz 980
        for (itc = doc->PageColors.begin(); itc != doc->PageColors.end(); ++itc)
981
        {
982
                QDomElement co=docu.createElement("COLOR");
983
                co.setAttribute("NAME",itc.key());
4535 fschmid 984
                if (doc->PageColors[itc.key()].getColorModel() == colorModelRGB)
985
                        co.setAttribute("RGB",doc->PageColors[itc.key()].nameRGB());
986
                else
987
                        co.setAttribute("CMYK",doc->PageColors[itc.key()].nameCMYK());
3051 fschmid 988
                co.setAttribute("Spot",static_cast<int>(doc->PageColors[itc.key()].isSpotColor()));
3060 fschmid 989
                co.setAttribute("Register",static_cast<int>(doc->PageColors[itc.key()].isRegistrationColor()));
322 Franz 990
                elem.appendChild(co);
991
        }
1065 cbradney 992
        QMap<int, ParagraphStyle> UsedStyles;
322 Franz 993
        QMap<int, int> UsedMapped2Saved;
994
        int NewStylesNum = 5;
995
        UsedStyles.clear();
996
        UsedMapped2Saved.clear();
5184 avox 997
        ParagraphStyle vg;
1065 cbradney 998
        if (doc->docParagraphStyles.count() > 5)
322 Franz 999
        {
3934 cbradney 1000
                //for (uint co=0; co<Selitems->count(); ++co)
4130 cbradney 1001
                for (uint co=0; co<selection->count(); ++co)
322 Franz 1002
                {
3727 cbradney 1003
                        item = doc->Items->at(ELL[co]);
5569 avox 1004
                        int parstyle = findParagraphStyle(doc, item->itemText.defaultStyle());
1005
                        if (parstyle > 4)
322 Franz 1006
                        {
5569 avox 1007
                                vg = item->itemText.defaultStyle();
1008
                                UsedStyles[parstyle] = vg;
322 Franz 1009
                        }
5184 avox 1010
                        if (((item->asTextFrame()) || (item->asPathText())) && (item->itemText.length() != 0))
322 Franz 1011
                        {
5184 avox 1012
#ifndef NLS_PROTO
5753 jghali 1013
                                for (int tx = 0; tx < item->itemText.length(); ++tx)
322 Franz 1014
                                {
5721 avox 1015
                                        if (item->itemText.text(tx) == SpecialChars::PARSEP)
322 Franz 1016
                                        {
5721 avox 1017
                                                vg = item->itemText.paragraphStyle(tx);
1018
                                                UsedStyles[findParagraphStyle(doc, vg)] = vg;
322 Franz 1019
                                        }
1020
                                }
5184 avox 1021
#endif
322 Franz 1022
                        }
1023
                }
1024
                QValueList<int> StyleNumb = UsedStyles.keys();
1025
                qHeapSort(StyleNumb);
1026
                for (uint ff = 0; ff < StyleNumb.count(); ++ff)
1027
                {
1028
                        int actSt = (*StyleNumb.at(ff));
1029
                        UsedMapped2Saved.insert(actSt, NewStylesNum);
1030
                        NewStylesNum++;
1031
                        QDomElement fo=docu.createElement("STYLE");
5184 avox 1032
                        fo.setAttribute("NAME",UsedStyles[actSt].name());
1033
                        fo.setAttribute("ALIGN",UsedStyles[actSt].alignment());
1034
                        fo.setAttribute("LINESPMode",UsedStyles[actSt].lineSpacingMode());
4546 subik 1035
                        //CB #2738:
4097 cbradney 1036
                        //UsedStyles[actSt].LineSpa is something like this is using automatic from the font:
1037
                        //10.34912109375000000000. Default attribute value is then 10.3491 which then becomes //10.34909999999999996589 and then does not compare. This fixes, should we change our
1038
                        //default precision?
5184 avox 1039
                        fo.setAttribute("LINESP",QString::number(UsedStyles[actSt].lineSpacing(),'f',13));
1040
                        fo.setAttribute("INDENT",UsedStyles[actSt].leftMargin());
1041
                        fo.setAttribute("FIRST",UsedStyles[actSt].firstIndent());
1042
                        fo.setAttribute("VOR",UsedStyles[actSt].gapBefore());
1043
                        fo.setAttribute("NACH",UsedStyles[actSt].gapAfter());
1044
                        fo.setAttribute("FONT",UsedStyles[actSt].charStyle().font()->scName());
1045
                        fo.setAttribute("FONTSIZE",UsedStyles[actSt].charStyle().fontSize() / 10.0);
1046
                        fo.setAttribute("DROP", static_cast<int>(UsedStyles[actSt].hasDropCap()));
1047
                        fo.setAttribute("DROPLIN", UsedStyles[actSt].dropCapLines());
1048
                        fo.setAttribute("DROPDIST", UsedStyles[actSt].dropCapOffset());
1049
                        fo.setAttribute("EFFECT", UsedStyles[actSt].charStyle().effects());
1050
                        if (UsedStyles[actSt].tabValues().count() != 0)
2282 fschmid 1051
                        {
5184 avox 1052
                                for (uint a = 0; a < UsedStyles[actSt].tabValues().count(); ++a)
2282 fschmid 1053
                                {
1054
                                        QDomElement tabs = docu.createElement("Tabs");
5184 avox 1055
                                        tabs.setAttribute("Type", (*UsedStyles[actSt].tabValues().at(a)).tabType);
1056
                                        tabs.setAttribute("Pos", (*UsedStyles[actSt].tabValues().at(a)).tabPosition);
2282 fschmid 1057
                                        QString tabCh = "";
5184 avox 1058
                                        if (!(*UsedStyles[actSt].tabValues().at(a)).tabFillChar.isNull())
1059
                                                tabCh = QString((*UsedStyles[actSt].tabValues().at(a)).tabFillChar);
2282 fschmid 1060
                                        tabs.setAttribute("Fill", tabCh);
1061
                                        fo.appendChild(tabs);
1062
                                }
1063
                        }
5691 avox 1064
                        fo.setAttribute("FCOLOR",UsedStyles[actSt].charStyle().fillColor());
1065
                        fo.setAttribute("FSHADE",UsedStyles[actSt].charStyle().fillShade());
1066
                        fo.setAttribute("SCOLOR",UsedStyles[actSt].charStyle().strokeColor());
1067
                        fo.setAttribute("SSHADE",UsedStyles[actSt].charStyle().strokeShade());
5184 avox 1068
                        fo.setAttribute("BASE", static_cast<int>(UsedStyles[actSt].useBaselineGrid()));
5691 avox 1069
                        fo.setAttribute("TXTSHX",UsedStyles[actSt].charStyle().shadowXOffset() / 10.0);
1070
                        fo.setAttribute("TXTSHY",UsedStyles[actSt].charStyle().shadowYOffset() / 10.0);
1071
                        fo.setAttribute("TXTOUT",UsedStyles[actSt].charStyle().outlineWidth() / 10.0);
1072
                        fo.setAttribute("TXTULP",UsedStyles[actSt].charStyle().underlineOffset() / 10.0);
1073
                        fo.setAttribute("TXTULW",UsedStyles[actSt].charStyle().underlineWidth() / 10.0);
1074
                        fo.setAttribute("TXTSTP",UsedStyles[actSt].charStyle().strikethruOffset() / 10.0);
1075
                        fo.setAttribute("TXTSTW",UsedStyles[actSt].charStyle().strikethruWidth() / 10.0);
1076
                        fo.setAttribute("SCALEH",UsedStyles[actSt].charStyle().scaleH() / 10.0);
1077
                        fo.setAttribute("SCALEV",UsedStyles[actSt].charStyle().scaleV() / 10.0);
1078
                        fo.setAttribute("BASEO",UsedStyles[actSt].charStyle().baselineOffset() / 10.0);
1079
                        fo.setAttribute("KERN",UsedStyles[actSt].charStyle().tracking() / 10.0);
322 Franz 1080
                        elem.appendChild(fo);
1081
                }
1082
        }
1083
        QMap<QString,multiLine>::Iterator itMU;
1084
        for (itMU = doc->MLineStyles.begin(); itMU != doc->MLineStyles.end(); ++itMU)
1085
        {
1086
                QDomElement MuL=docu.createElement("MultiLine");
1087
                MuL.setAttribute("Name",itMU.key());
1088
                multiLine ml = itMU.data();
1089
                multiLine::iterator itMU2;
1090
                for (itMU2 = ml.begin(); itMU2 != ml.end(); ++itMU2)
1091
                {
1092
                        QDomElement SuL=docu.createElement("SubLine");
1093
                        SuL.setAttribute("Color", (*itMU2).Color);
1094
                        SuL.setAttribute("Shade", (*itMU2).Shade);
1095
                        SuL.setAttribute("Dash", (*itMU2).Dash);
1096
                        SuL.setAttribute("LineEnd", (*itMU2).LineEnd);
1097
                        SuL.setAttribute("LineJoin", (*itMU2).LineJoin);
1098
                        SuL.setAttribute("Width", (*itMU2).Width);
1099
                        MuL.appendChild(SuL);
1100
                }
1101
                elem.appendChild(MuL);
1102
        }
1065 cbradney 1103
        QMap<int, ArrowDesc> usedArrows;
1104
        QMap<int, ArrowDesc>::Iterator itar;
1105
        struct ArrowDesc arrow;
3934 cbradney 1106
        //for (uint co=0; co<Selitems->count(); ++co)
4130 cbradney 1107
        for (uint co=0; co<selection->count(); ++co)
167 Franz 1108
        {
3727 cbradney 1109
                item = doc->Items->at(ELL[co]);
4061 craig 1110
                int startIndex = item->startArrowIndex();
1111
                int endIndex = item->endArrowIndex();
1112
                if (startIndex != 0)
741 fschmid 1113
                {
4061 craig 1114
                        arrow.points = (*doc->arrowStyles.at(startIndex-1)).points.copy();
1115
                        arrow.name = (*doc->arrowStyles.at(startIndex-1)).name;
1116
                        usedArrows.insert(startIndex, arrow);
741 fschmid 1117
                }
4061 craig 1118
                if (endIndex != 0)
741 fschmid 1119
                {
4061 craig 1120
                        arrow.points = (*doc->arrowStyles.at(endIndex-1)).points.copy();
1121
                        arrow.name = (*doc->arrowStyles.at(endIndex-1)).name;
1122
                        usedArrows.insert(endIndex, arrow);
741 fschmid 1123
                }
1124
        }
1125
        if (usedArrows.count() != 0)
1126
        {
1127
                for (itar = usedArrows.begin(); itar != usedArrows.end(); ++itar)
1128
                {
776 fschmid 1129
                        if (itar.data().userArrow)
741 fschmid 1130
                        {
776 fschmid 1131
                                QDomElement ar=docu.createElement("Arrows");
1132
                                ar.setAttribute("NumPoints", itar.data().points.size());
1133
                                QString arp = "";
1134
                                double xa, ya;
1135
                                for (uint nxx = 0; nxx < itar.data().points.size(); ++nxx)
1136
                                {
1137
                                        itar.data().points.point(nxx, &xa, &ya);
1138
                                        arp += tmp.setNum(xa) + " " + tmpy.setNum(ya) + " ";
1139
                                }
1140
                                ar.setAttribute("Points", arp);
1141
                                ar.setAttribute("Name", itar.data().name);
1142
                                ar.setAttribute("Index", itar.key());
1143
                                elem.appendChild(ar);
741 fschmid 1144
                        }
1145
                }
1146
        }
3934 cbradney 1147
        //for (uint co=0; co<Selitems->count(); ++co)
4130 cbradney 1148
        for (uint co=0; co<selection->count(); ++co)
741 fschmid 1149
        {
31 Franz 1150
                QString CurDirP = QDir::currentDirPath();
282 Franz 1151
                QDir::setCurrent(QDir::homeDirPath());
3727 cbradney 1152
                item = doc->Items->at(ELL[co]);
3 paul 1153
                QDomElement ob=docu.createElement("ITEM");
5569 avox 1154
                int textAlignment = findParagraphStyle(doc, item->itemText.defaultStyle());
1155
                if (textAlignment > 4)
1156
                        ob.setAttribute("ALIGN",UsedMapped2Saved[textAlignment]);
335 Franz 1157
                else
5569 avox 1158
                        ob.setAttribute("ALIGN",textAlignment);
517 fschmid 1159
                SetItemProps(&ob, item, false);
5087 subik 1160
                ob.setAttribute("XPOS",item->xPos() - doc->currentPage()->xOffset());
1161
                ob.setAttribute("YPOS",item->yPos() - doc->currentPage()->yOffset());
2193 fschmid 1162
                ob.setAttribute("BOOKMARK", item->isBookmark ? 1 : 0);
4477 fschmid 1163
                ob.setAttribute("fillRule", static_cast<int>(item->fillRule));
5320 fschmid 1164
                ob.setAttribute("doOverprint", static_cast<int>(item->doOverprint));
2056 fschmid 1165
                if (item->effectsInUse.count() != 0)
1166
                {
1167
                        for (uint a = 0; a < item->effectsInUse.count(); ++a)
1168
                        {
1169
                                QDomElement imeff = docu.createElement("ImageEffect");
1170
                                imeff.setAttribute("Code", (*item->effectsInUse.at(a)).effectCode);
1171
                                imeff.setAttribute("Param", (*item->effectsInUse.at(a)).effectParameters);
1172
                                ob.appendChild(imeff);
1173
                        }
1174
                }
2282 fschmid 1175
                if (item->TabValues.count() != 0)
1176
                {
1177
                        for (uint a = 0; a < item->TabValues.count(); ++a)
1178
                        {
1179
                                QDomElement tabs = docu.createElement("Tabs");
1180
                                tabs.setAttribute("Type", (*item->TabValues.at(a)).tabType);
1181
                                tabs.setAttribute("Pos", (*item->TabValues.at(a)).tabPosition);
1182
                                QString tabCh = "";
1183
                                if (!(*item->TabValues.at(a)).tabFillChar.isNull())
1184
                                        tabCh = QString((*item->TabValues.at(a)).tabFillChar);
1185
                                tabs.setAttribute("Fill", tabCh);
1186
                                ob.appendChild(tabs);
1187
                        }
1188
                }
4326 fschmid 1189
                if (((item->asImageFrame()) || (item->asTextFrame())) && (!item->Pfile.isEmpty()) && (item->pixm.imgInfo.layerInfo.count() != 0) && (item->pixm.imgInfo.isRequest))
1190
                {
5937 jghali 1191
                        QMap<int, ImageLoadRequest>::iterator it2;
4326 fschmid 1192
                        for (it2 = item->pixm.imgInfo.RequestProps.begin(); it2 != item->pixm.imgInfo.RequestProps.end(); ++it2)
1193
                        {
1194
                                QDomElement psd = docu.createElement("PSDLayer");
1195
                                psd.setAttribute("Layer",it2.key());
1196
                                psd.setAttribute("Visible", static_cast<int>(it2.data().visible));
1197
                                psd.setAttribute("Opacity", it2.data().opacity);
1198
                                psd.setAttribute("Blend", it2.data().blend);
1199
                                ob.appendChild(psd);
1200
                        }
1201
                }
295 Franz 1202
                if (item->GrType != 0)
1203
                {
1204
                        QPtrVector<VColorStop> cstops = item->fill_gradient.colorStops();
1205
                        for (uint cst = 0; cst < item->fill_gradient.Stops(); ++cst)
1206
                        {
1207
                                QDomElement itcl = docu.createElement("CSTOP");
1208
                                itcl.setAttribute("RAMP", cstops.at(cst)->rampPoint);
1209
                                itcl.setAttribute("NAME", cstops.at(cst)->name);
1210
                                itcl.setAttribute("SHADE", cstops.at(cst)->shade);
296 Franz 1211
                                itcl.setAttribute("TRANS", cstops.at(cst)->opacity);
295 Franz 1212
                                ob.appendChild(itcl);
1213
                        }
1214
                        ob.setAttribute("GRSTARTX", item->GrStartX);
1215
                        ob.setAttribute("GRSTARTY", item->GrStartY);
1216
                        ob.setAttribute("GRENDX", item->GrEndX);
1217
                        ob.setAttribute("GRENDY", item->GrEndY);
1218
                }
31 Franz 1219
                QDir::setCurrent(CurDirP);
5569 avox 1220
                for(int k=0;k<item->itemText.length();++k)
167 Franz 1221
                {
5184 avox 1222
                        const CharStyle& style4(item->itemText.charStyle(k));
1223
                        QChar ch = item->itemText.text(k);
3 paul 1224
                        QDomElement it=docu.createElement("ITEXT");
5691 avox 1225
                        ts = style4.fontSize() / 10.0;
1226
                        tf = style4.font()->scName();
1227
                        tc = style4.fillColor();
1228
                        te = style4.tracking();
1229
                        tsh = style4.fillShade();
1230
                        tst = style4.effects() & 2047;
5721 avox 1231
#if 0 // FIXME NLS ndef NLS_PROTO
1232
                        if (item->itemText.item(k)->cab > 4)
1233
                                tsb = UsedMapped2Saved[item->itemText.item(k)->cab];
322 Franz 1234
                        else
5721 avox 1235
                                tsb = item->itemText.item(k)->cab;
5184 avox 1236
#else
1237
                        tsb = 0;
1238
#endif
5691 avox 1239
                        tcs = style4.strokeColor();
1240
                        tshs = style4.strokeShade();
1241
                        tsc = style4.scaleH() / 10.0;
1242
                        tscv = style4.scaleV() / 10.0;
1243
                        tb = style4.baselineOffset() / 10.0;
1244
                        tsx = style4.shadowXOffset() / 10.0;
1245
                        tsy = style4.shadowYOffset() / 10.0;
1246
                        tout = style4.outlineWidth() / 10.0;
1247
                        tulp = style4.underlineOffset() / 10.0;
1248
                        tulw = style4.underlineWidth() / 10.0;
1249
                        tstp = style4.strikethruOffset()/ 10.0;
1250
                        tstw = style4.strikethruWidth() / 10.0;
1251
                        if (ch == SpecialChars::PARSEP)
3 paul 1252
                                text = QChar(5);
5691 avox 1253
                        else if (ch == SpecialChars::TAB)
139 Franz 1254
                                text = QChar(4);
3 paul 1255
                        else
5184 avox 1256
                                text = ch;
3456 avox 1257
                        ++k;
5184 avox 1258
                        if (k == item->itemText.length())
167 Franz 1259
                        {
3 paul 1260
                                it.setAttribute("CH",text);
1261
                                it.setAttribute("CSIZE",ts);
1262
                                it.setAttribute("CFONT",tf);
1263
                                it.setAttribute("CCOLOR",tc);
2382 fschmid 1264
                                it.setAttribute("CKERN",te);
3 paul 1265
                                it.setAttribute("CSHADE",tsh);
1266
                                it.setAttribute("CSTYLE",tst);
1267
                                it.setAttribute("CAB",tsb);
68 Franz 1268
                                it.setAttribute("CSTROKE",tcs);
1269
                                it.setAttribute("CSHADE2",tshs);
1270
                                it.setAttribute("CSCALE",tsc);
2230 fschmid 1271
                                it.setAttribute("CSCALEV",tscv);
2234 fschmid 1272
                                it.setAttribute("CBASE",tb);
2247 fschmid 1273
                                it.setAttribute("CSHX",tsx);
1274
                                it.setAttribute("CSHY",tsy);
2257 fschmid 1275
                                it.setAttribute("COUT",tout);
2262 fschmid 1276
                                it.setAttribute("CULP",tulp);
1277
                                it.setAttribute("CULW",tulw);
2272 fschmid 1278
                                it.setAttribute("CSTP",tstp);
1279
                                it.setAttribute("CSTW",tstw);
3 paul 1280
                                ob.appendChild(it);
1281
                                break;
167 Franz 1282
                        }
5184 avox 1283
                        const CharStyle& style5(item->itemText.charStyle(k));
1284
                        ch = item->itemText.text(k);
5691 avox 1285
                        ts2 = style5.fontSize() / 10.0;
1286
                        tf2 = style5.font()->scName();
1287
                        tc2 = style5.fillColor();
1288
                        te2 = style5.tracking();
1289
                        tsh2 = style5.fillShade();
1290
                        tst2 = style5.effects() & 2047;
5721 avox 1291
#if 0 //FIXME NLS ndef NLS_PROTO
1292
                        if (item->itemText.item(k)->cab > 4)
1293
                                tsb2 = UsedMapped2Saved[item->itemText.item(k)->cab];
322 Franz 1294
                        else
5721 avox 1295
                                tsb2 = item->itemText.item(k)->cab;
5184 avox 1296
#else
1297
                        tsb2 = 0;
1298
#endif
5691 avox 1299
                        tcs2 = style5.strokeColor();
1300
                        tshs2 = style5.strokeShade();
1301
                        tsc2 = style5.scaleH() / 10.0;
1302
                        tscv2 = style5.scaleV() / 10.0;
1303
                        tb2 = style5.baselineOffset() / 10.0;
1304
                        tsx2 = style5.shadowXOffset() / 10.0;
1305
                        tsy2 = style5.shadowYOffset() / 10.0;
1306
                        tout2 = style5.outlineWidth() / 10.0;
1307
                        tulp2 = style5.underlineOffset() / 10.0;
1308
                        tulw2 = style5.underlineWidth() / 10.0;
1309
                        tstp2 = style5.strikethruOffset() / 10.0;
1310
                        tstw2 = style5.strikethruWidth() / 10.0;
68 Franz 1311
                        while ((ts2 == ts)
1312
                                                        && (tsb2 == tsb)
1313
                                                        && (tf2 == tf)
1314
                                                        && (tc2 == tc)
1315
                                                        && (te2 == te)
1316
                                                        && (tsh2 == tsh)
1317
                                                        && (tshs2 == tshs)
1318
                                                        && (tsc2 == tsc)
2230 fschmid 1319
                                                        && (tscv2 == tscv)
68 Franz 1320
                                                        && (tcs2 == tcs)
2234 fschmid 1321
                                                        && (tb2 == tb)
2247 fschmid 1322
                                                        && (tsx2 == tsx)
1323
                                                        && (tsy2 == tsy)
2257 fschmid 1324
                                                        && (tout2 == tout)
2262 fschmid 1325
                                                        && (tulp2 == tulp)
1326
                                                        && (tulw2 == tulw)
2272 fschmid 1327
                                                        && (tstp2 == tstp)
1328
                                                        && (tstw2 == tstw)
68 Franz 1329
                                                        && (tst2 == tst))
167 Franz 1330
                        {
5184 avox 1331
                                if (ch == QChar(13))
3 paul 1332
                                        text += QChar(5);
5184 avox 1333
                                else if (ch == QChar(9))
139 Franz 1334
                                        text += QChar(4);
3 paul 1335
                                else
5184 avox 1336
                                        text += ch;
3456 avox 1337
                                ++k;
5184 avox 1338
                                if (k == item->itemText.length())
3 paul 1339
                                        break;
5184 avox 1340
                                const CharStyle& style6(item->itemText.charStyle(k));
1341
                                ch = item->itemText.text(k);
5691 avox 1342
                                ts2 = style6.fontSize() / 10.0;
1343
                                tf2 = style6.font()->scName();
1344
                                tc2 = style6.fillColor();
1345
                                te2 = style6.tracking();
1346
                                tsh2 = style6.fillShade();
1347
                                tst2 = style6.effects() & 2047;
5721 avox 1348
#if 0 //FIXME NLS ndef NLS_PROTO
1349
                                if (item->itemText.item(k)->cab > 4)
1350
                                        tsb2 = UsedMapped2Saved[item->itemText.item(k)->cab];
322 Franz 1351
                                else
5721 avox 1352
                                        tsb2 = item->itemText.item(k)->cab;
5184 avox 1353
#else
1354
                                tsb2 = 0;
1355
#endif
5691 avox 1356
                                tcs2 = style6.strokeColor();
1357
                                tshs2 = style6.strokeShade();
1358
                                tsc2 = style6.scaleH() / 10.0;
1359
                                tscv2 = style6.scaleV() / 10.0;
1360
                                tb2 = style6.baselineOffset() / 10.0;
1361
                                tsx2 = style6.shadowXOffset() / 10.0;
1362
                                tsy2 = style6.shadowYOffset() / 10.0;
1363
                                tout2 = style6.outlineWidth() / 10.0;
1364
                                tulp2 = style6.underlineOffset() / 10.0;
1365
                                tulw2 = style6.underlineWidth() / 10.0;
1366
                                tstp2 = style6.strikethruOffset() / 10.0;
1367
                                tstw2 = style6.strikethruWidth() / 10.0;
167 Franz 1368
                        }
3 paul 1369
                        it.setAttribute("CH",text);
1370
                        it.setAttribute("CSIZE",ts);
1371
                        it.setAttribute("CFONT",tf);
1372
                        it.setAttribute("CCOLOR",tc);
2382 fschmid 1373
                        it.setAttribute("CKERN",te);
3 paul 1374
                        it.setAttribute("CSHADE",tsh);
1375
                        it.setAttribute("CSTYLE",tst);
1376
                        it.setAttribute("CAB",tsb);
68 Franz 1377
                        it.setAttribute("CSTROKE",tcs);
1378
                        it.setAttribute("CSHADE2",tshs);
1379
                        it.setAttribute("CSCALE",tsc);
2230 fschmid 1380
                        it.setAttribute("CSCALEV",tscv);
2234 fschmid 1381
                        it.setAttribute("CBASE",tb);
2247 fschmid 1382
                        it.setAttribute("CSHX",tsx);
1383
                        it.setAttribute("CSHY",tsy);
2257 fschmid 1384
                        it.setAttribute("COUT",tout);
2262 fschmid 1385
                        it.setAttribute("CULP",tulp);
1386
                        it.setAttribute("CULW",tulw);
2272 fschmid 1387
                        it.setAttribute("CSTP",tstp);
1388
                        it.setAttribute("CSTW",tstw);
3 paul 1389
                        k--;
1390
                        ob.appendChild(it);
167 Franz 1391
                }
5184 avox 1392
                ob.setAttribute("NUMTEXT",item->itemText.length());
3 paul 1393
                QString txnu = "";
5569 avox 1394
                for(int kt = 0; kt < item->itemText.length(); ++kt)
5184 avox 1395
#ifndef NLS_PROTO
5721 avox 1396
                        txnu += tmp.setNum(item->itemText.item(kt)->glyph.xoffset) + " " + tmpy.setNum(item->itemText.item(kt)->glyph.yoffset) + " ";
5184 avox 1397
#else
1398
                        txnu += "0 0 ";
1399
#endif
3 paul 1400
                ob.setAttribute("TEXTCOOR", txnu);
1401
                ob.setAttribute("BACKITEM", -1);
1402
                ob.setAttribute("BACKPAGE", -1);
1403
                ob.setAttribute("NEXTITEM", -1);
1404
                ob.setAttribute("NEXTPAGE", -1);
1405
                elem.appendChild(ob);
167 Franz 1406
        }
3 paul 1407
        return docu.toString().utf8();
1408
}