Subversion Repositories Scribus

Rev

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

Rev Author Line No. Line
5641 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
*/
7
#include "scribus12format.h"
8
#include "scribus12format.moc"
9
#include "scribus12formatimpl.h"
10
 
11
#include "../../formatidlist.h"
12
#include "commonstrings.h"
13
#include "missing.h"
14
#include "prefsmanager.h"
15
#include "scconfig.h"
16
#include "scribusdoc.h"
17
#include "scribusview.h"
18
 
19
#include "units.h"
20
#include "util.h"
21
#ifdef HAVE_LIBZ
22
        #include <zlib.h>
23
#endif
24
#include <qcursor.h>
25
#include <qfileinfo.h>
26
#include <qvaluelist.h>
27
 
28
 
29
// See scplugin.h and pluginmanager.{cpp,h} for detail on what these methods
30
// do. That documentatation is not duplicated here.
31
// Please don't implement the functionality of your plugin here; do that
32
// in scribus12formatimpl.h and scribus12formatimpl.cpp .
33
 
34
Scribus12Format::Scribus12Format() :
35
        LoadSavePlugin()
36
{
37
        // Set action info in languageChange, so we only have to do
38
        // it in one place. This includes registering file formats.
39
        languageChange();
40
}
41
 
42
Scribus12Format::~Scribus12Format()
43
{
44
        unregisterAll();
45
};
46
 
47
void Scribus12Format::languageChange()
48
{
49
        //(Re)register file formats.
50
        unregisterAll();
51
        registerFormats();
52
}
53
 
54
const QString Scribus12Format::fullTrName() const
55
{
56
        return QObject::tr("Scribus 1.2.x Support");
57
}
58
 
59
const ScActionPlugin::AboutData* Scribus12Format::getAboutData() const
60
{
61
        AboutData* about = new AboutData;
62
        Q_CHECK_PTR(about);
63
        return about;
64
}
65
 
66
void Scribus12Format::deleteAboutData(const AboutData* about) const
67
{
68
        Q_ASSERT(about);
69
        delete about;
70
}
71
 
72
// Low level plugin API
73
int scribus12format_getPluginAPIVersion()
74
{
75
        return PLUGIN_API_VERSION;
76
}
77
 
78
ScPlugin* scribus12format_getPlugin()
79
{
80
        Scribus12Format* plug = new Scribus12Format();
81
        Q_CHECK_PTR(plug);
82
        return plug;
83
}
84
 
85
void scribus12format_freePlugin(ScPlugin* plugin)
86
{
87
        Scribus12Format* plug = dynamic_cast<Scribus12Format*>(plugin);
88
        Q_ASSERT(plug);
89
        delete plug;
90
}
91
 
92
 
93
 
94
void Scribus12Format::registerFormats()
95
{
96
        FileFormat fmt(this);
97
        fmt.trName = tr("Scribus 1.2.x Document");
98
        fmt.formatId = FORMATID_SLA12XIMPORT;
99
        fmt.load = true;
100
        fmt.save = false;
101
#ifdef HAVE_LIBZ
102
        fmt.filter = fmt.trName + " (*.sla *.SLA *.sla.gz *.SLA.GZ *.scd *.SCD *.scd.gz *.SCD.GZ)";
103
        fmt.nameMatch = QRegExp("\\.(sla|scd)(\\.gz)?", false);
104
#else
105
        fmt.filter = fmt.trName + " (*.sla *.SLA *.scd *.SCD)";
106
        fmt.nameMatch = QRegExp("\\.(sla|scd)", false);
107
#endif
108
        fmt.mimeTypes = QStringList();
109
        fmt.mimeTypes.append("application/x-scribus");
110
        fmt.priority = 64;
111
        registerFormat(fmt);
112
}
113
 
114
bool Scribus12Format::fileSupported(QIODevice* /* file */, const QString & fileName) const
115
{
116
        QCString docBytes("");
117
        if(fileName.right(2) == "gz")
118
        {
119
#ifdef HAVE_LIBZ
120
                static const int gzipExpansionFactor=8;
121
                // The file is gzip encoded and we can load gzip files.
122
                // Set up to read the gzip file
123
                gzFile gzDoc;
124
                int i;
125
                gzDoc = gzopen(fileName.latin1(),"rb");
126
                if(gzDoc == NULL)
127
                {
128
                        // FIXME: Needs better error return
129
                        return "";
130
                }
131
                // Allocate a buffer of a multiple of the compressed size of the file
132
                // as a starting point for loading. We'll expand this buffer by powers
133
                // of two if we run out of space.
134
                const QFileInfo fi(fileName);
135
                uint bufSize = QMIN(4096, fi.size()*gzipExpansionFactor);
136
                docBytes = QCString(bufSize);
137
                char* buf = docBytes.data();
138
                uint bytesRead = 0;
139
                // While there's free space, read into the buffer....
140
                while (bytesRead<4096 && (i = gzread(gzDoc,buf,bufSize-bytesRead-1)) > 0)
141
                {
142
                        // Ensure the string is null-terminated and move the
143
                        // write pointer to the current position.
144
                        buf[i]=0;
145
                        buf+=i;
146
                        bytesRead += i;
147
                        // And check that there's free space to work with, expanding the
148
                        // buffer if there's not.
149
                        if (bufSize - bytesRead < 4096)
150
                        {
151
                                bufSize *= 2;
152
                                docBytes.resize(bufSize);
153
                                buf = docBytes.data() + bytesRead;
154
                        }
155
                }
156
                gzclose(gzDoc);
157
#else
158
                // The file is gzip encoded but we can't load gzip files.
159
                // Leave `f' empty, since we have no way to
160
                // report a failure condition from here.
161
                return false;
162
#endif
163
        }
164
        else
165
        {
166
                // Not gzip encoded, just load it
167
                loadRawText(fileName, docBytes);
168
        }
5645 cbradney 169
        if (docBytes.left(16) != "<SCRIBUSUTF8NEW " && (docBytes.left(12) == "<SCRIBUSUTF8" || docBytes.left(9) == "<SCRIBUS>"))
5641 cbradney 170
                return true;
171
        return false;
172
}
173
 
174
QString Scribus12Format::readSLA(const QString & fileName)
175
{
176
        QCString docBytes("");
177
        if(fileName.right(2) == "gz")
178
        {
179
#ifdef HAVE_LIBZ
180
                static const int gzipExpansionFactor=8;
181
                // The file is gzip encoded and we can load gzip files.
182
                // Set up to read the gzip file
183
                gzFile gzDoc;
184
                int i;
185
                gzDoc = gzopen(fileName.latin1(),"rb");
186
                if(gzDoc == NULL)
187
                {
188
                        // FIXME: Needs better error return
189
                        return "";
190
                }
191
                // Allocate a buffer of a multiple of the compressed size of the file
192
                // as a starting point for loading. We'll expand this buffer by powers
193
                // of two if we run out of space.
194
                const QFileInfo fi(fileName);
195
                uint bufSize = fi.size()*gzipExpansionFactor;
196
                docBytes = QCString(bufSize);
197
                char* buf = docBytes.data();
198
                uint bytesRead = 0;
199
                // While there's free space, read into the buffer....
200
                while ((i = gzread(gzDoc,buf,bufSize-bytesRead-1)) > 0)
201
                {
202
                        // Ensure the string is null-terminated and move the
203
                        // write pointer to the current position.
204
                        buf[i]=0;
205
                        buf+=i;
206
                        bytesRead += i;
207
                        // And check that there's free space to work with, expanding the
208
                        // buffer if there's not.
209
                        if (bufSize - bytesRead < 4096)
210
                        {
211
                                bufSize *= 2;
212
                                docBytes.resize(bufSize);
213
                                buf = docBytes.data() + bytesRead;
214
                        }
215
                }
216
                gzclose(gzDoc);
217
#else
218
                // The file is gzip encoded but we can't load gzip files.
219
                // Leave `f' empty, since we have no way to
220
                // report a failure condition from here.
221
                return false;
222
#endif
223
        }
224
        else
225
        {
226
                // Not gzip encoded, just load it
227
                loadRawText(fileName, docBytes);
228
        }
229
        QString docText("");
5645 cbradney 230
        if (docBytes.left(16) != "<SCRIBUSUTF8NEW " && (docBytes.left(12) == "<SCRIBUSUTF8" || docBytes.left(9) == "<SCRIBUS>"))
5641 cbradney 231
                docText = QString::fromLocal8Bit(docBytes);
232
        else
233
                return QString::null;
234
        if (docText.endsWith(QChar(10)) || docText.endsWith(QChar(13)))
235
                docText.truncate(docText.length()-1);
236
        return docText;
237
}
238
 
239
 
240
void Scribus12Format::getReplacedFontData(bool & getNewReplacement, QMap<QString,QString> &getReplacedFonts, QPtrList<Foi> &getDummyFois)
241
{
242
        getNewReplacement=newReplacement;
243
        getReplacedFonts=ReplacedFonts;
244
        getDummyFois=dummyFois;
245
}
246
 
247
bool Scribus12Format::loadFile(const QString & fileName, const FileFormat & /* fmt */, int /* flags */, int /* index */)
248
{
5653 cbradney 249
        if (m_Doc==0 || m_View==0 || m_AvailableFonts==0)
5641 cbradney 250
        {
5653 cbradney 251
                Q_ASSERT(m_Doc==0 || m_View==0 || m_AvailableFonts==0);
5641 cbradney 252
                return false;
253
        }
254
        ReplacedFonts.clear();
255
        newReplacement = false;
256
        dummyFois.clear();
257
 
258
//start old ReadDoc
259
        //Scribus 1.2 docs, see fileloader.cpp for 1.3 docs
260
        struct CopyPasteBuffer OB;
261
        ParagraphStyle vg;
262
        struct Layer la;
263
        struct ScribusDoc::BookMa bok;
264
        int counter;
265
        bool newVersion = false;
266
        struct Linked Link;
267
        QString tmp, tmpf, tmp2, tmp3, tmp4, PgNam, Defont, tmf;
268
        QMap<int,int> TableID;
269
        QPtrList<PageItem> TableItems;
270
        int x, a;
271
        double xf, xf2;
272
        PageItem *Neu;
273
        LFrames.clear();
274
        QDomDocument docu("scridoc");
275
        QFile fi(fileName);
276
        // Load the document text
277
        QString f(readSLA(fileName));
278
        if (f.isEmpty())
279
                return false;
280
        // Build the DOM from it
281
        if (!docu.setContent(f))
282
                return false;
283
        // and begin loading the doc
284
        m_Doc->PageColors.clear();
285
        m_Doc->Layers.clear();
286
        ScColor lf = ScColor();
287
        QDomElement elem=docu.documentElement();
288
        if ((elem.tagName() != "SCRIBUS") && (elem.tagName() != "SCRIBUSUTF8"))
289
                return false;
290
        if (elem.hasAttribute("Version"))
291
                newVersion = true;
292
        QDomNode DOC=elem.firstChild();
5653 cbradney 293
        if (m_mwProgressBar!=0)
294
        {
295
                m_mwProgressBar->setTotalSteps(DOC.childNodes().count());
296
                m_mwProgressBar->setProgress(0);
297
        }
5641 cbradney 298
        int ObCount = 0;
299
        int activeLayer = 0;
300
        PrefsManager* prefsManager=PrefsManager::instance();
301
        while(!DOC.isNull())
302
        {
303
                QDomElement dc=DOC.toElement();
304
        /*
305
        * Attribute von DOCUMENT auslesen
306
        */
307
                if (dc.hasAttribute("PAGEWIDTH"))
308
                        m_Doc->pageWidth=dc.attribute("PAGEWIDTH").toDouble();
309
                else
310
                        m_Doc->pageWidth=dc.attribute("PAGEWITH").toDouble();
311
                m_Doc->pageHeight=dc.attribute("PAGEHEIGHT").toDouble();
312
                m_Doc->pageMargins.Left=QMAX(0.0, dc.attribute("BORDERLEFT").toDouble());
313
                m_Doc->pageMargins.Right=QMAX(0.0, dc.attribute("BORDERRIGHT").toDouble());
314
                m_Doc->pageMargins.Top=QMAX(0.0, dc.attribute("BORDERTOP").toDouble());
315
                m_Doc->pageMargins.Bottom=QMAX(0.0, dc.attribute("BORDERBOTTOM").toDouble());
316
                m_Doc->PageOri = dc.attribute("ORIENTATION", "0").toInt();
5789 cbradney 317
                m_Doc->m_pageSize = dc.attribute("PAGESIZE");
5641 cbradney 318
                m_Doc->FirstPnum = dc.attribute("FIRSTNUM", "1").toInt();
319
                m_Doc->currentPageLayout=dc.attribute("BOOK", "0").toInt();
320
                int fp;
321
                if (dc.attribute("FIRSTLEFT", "0").toInt() == 1)
322
                        fp = 0;
323
                else
324
                        fp = 1;
325
                if (m_Doc->currentPageLayout == 0)
326
                        fp = 0;
327
                m_Doc->pageSets[m_Doc->currentPageLayout].FirstPage = fp;
328
                m_Doc->setUsesAutomaticTextFrames(dc.attribute("AUTOTEXT").toInt());
329
                m_Doc->PageSp=dc.attribute("AUTOSPALTEN").toInt();
330
                m_Doc->PageSpa=dc.attribute("ABSTSPALTEN").toDouble();
331
                m_Doc->setUnitIndex(dc.attribute("UNITS", "0").toInt());
332
                m_Doc->guidesSettings.gridShown = prefsManager->appPrefs.guidesSettings.gridShown;
333
                m_Doc->guidesSettings.guidesShown = prefsManager->appPrefs.guidesSettings.guidesShown;
334
                m_Doc->guidesSettings.colBordersShown = prefsManager->appPrefs.guidesSettings.colBordersShown;
335
                m_Doc->guidesSettings.framesShown = prefsManager->appPrefs.guidesSettings.framesShown;
336
                m_Doc->guidesSettings.layerMarkersShown = prefsManager->appPrefs.guidesSettings.layerMarkersShown;
337
                m_Doc->guidesSettings.marginsShown = prefsManager->appPrefs.guidesSettings.marginsShown;
338
                m_Doc->guidesSettings.baseShown = prefsManager->appPrefs.guidesSettings.baseShown;
339
                m_Doc->guidesSettings.linkShown = prefsManager->appPrefs.guidesSettings.linkShown;
340
                m_Doc->guidesSettings.showPic = true;
341
                m_Doc->guidesSettings.showControls = false;
342
                DoFonts.clear();
343
                m_Doc->toolSettings.defSize=qRound(dc.attribute("DSIZE").toDouble() * 10);
344
                Defont=dc.attribute("DFONT");
345
                if ((!m_AvailableFonts->find(Defont)) || (!(*m_AvailableFonts)[Defont]->usable()))
346
                {
347
                        ReplacedFonts.insert(Defont, prefsManager->appPrefs.toolSettings.defFont);
348
                        Defont = prefsManager->appPrefs.toolSettings.defFont;
349
                }
350
                else
351
                {
352
                        if (!m_Doc->UsedFonts.contains(tmpf))
353
                        {
354
//                              QFont fo = avail[Defont]->Font;
355
//                              fo.setPointSize(qRound(m_Doc->toolSettings.defSize / 10.0));
356
                                m_Doc->AddFont(Defont);
357
                        }
358
                }
359
                m_Doc->toolSettings.defFont = Defont;
360
                m_Doc->toolSettings.dCols=dc.attribute("DCOL", "1").toInt();
361
                m_Doc->toolSettings.dGap=dc.attribute("DGAP", "0.0").toDouble();
362
                m_Doc->documentInfo.setAuthor(dc.attribute("AUTHOR"));
363
                m_Doc->documentInfo.setComments(dc.attribute("COMMENTS"));
364
                m_Doc->documentInfo.setKeywords(dc.attribute("KEYWORDS",""));
365
                m_Doc->documentInfo.setTitle(dc.attribute("TITLE"));
366
                m_Doc->documentInfo.setPublisher(dc.attribute("PUBLISHER", ""));
367
                m_Doc->documentInfo.setDate(dc.attribute("DOCDATE", ""));
368
                m_Doc->documentInfo.setType(dc.attribute("DOCTYPE", ""));
369
                m_Doc->documentInfo.setFormat(dc.attribute("DOCFORMAT", ""));
370
                m_Doc->documentInfo.setIdent(dc.attribute("DOCIDENT", ""));
371
                m_Doc->documentInfo.setSource(dc.attribute("DOCSOURCE", ""));
372
                m_Doc->documentInfo.setLangInfo(dc.attribute("DOCLANGINFO", ""));
373
                m_Doc->documentInfo.setRelation(dc.attribute("DOCRELATION", ""));
374
                m_Doc->documentInfo.setCover(dc.attribute("DOCCOVER", ""));
375
                m_Doc->documentInfo.setRights(dc.attribute("DOCRIGHTS", ""));
376
                m_Doc->documentInfo.setContrib(dc.attribute("DOCCONTRIB", ""));
377
                m_Doc->typographicSettings.valueSuperScript = dc.attribute("VHOCH").toInt();
378
                m_Doc->typographicSettings.scalingSuperScript = dc.attribute("VHOCHSC").toInt();
379
                m_Doc->typographicSettings.valueSubScript = dc.attribute("VTIEF").toInt();
380
                m_Doc->typographicSettings.scalingSubScript = dc.attribute("VTIEFSC").toInt();
381
                m_Doc->typographicSettings.valueSmallCaps = dc.attribute("VKAPIT").toInt();
382
                m_Doc->typographicSettings.valueBaseGrid = dc.attribute("BASEGRID", "12").toDouble();
383
                m_Doc->typographicSettings.offsetBaseGrid = dc.attribute("BASEO", "0").toDouble();
384
                m_Doc->typographicSettings.autoLineSpacing = dc.attribute("AUTOL", "20").toInt();
385
                m_Doc->GroupCounter=dc.attribute("GROUPC", "1").toInt();
5880 jghali 386
                //m_Doc->HasCMS = static_cast<bool>(dc.attribute("HCMS", "0").toInt());
5641 cbradney 387
                m_Doc->CMSSettings.SoftProofOn = static_cast<bool>(dc.attribute("DPSo", "0").toInt());
388
                m_Doc->CMSSettings.SoftProofFullOn = static_cast<bool>(dc.attribute("DPSFo", "0").toInt());
389
                m_Doc->CMSSettings.CMSinUse = static_cast<bool>(dc.attribute("DPuse", "0").toInt());
390
                m_Doc->CMSSettings.GamutCheck = static_cast<bool>(dc.attribute("DPgam", "0").toInt());
391
                m_Doc->CMSSettings.BlackPoint = static_cast<bool>(dc.attribute("DPbla", "1").toInt());
392
                m_Doc->CMSSettings.DefaultMonitorProfile = dc.attribute("DPMo","");
393
                m_Doc->CMSSettings.DefaultPrinterProfile = dc.attribute("DPPr","");
394
                m_Doc->CMSSettings.DefaultImageRGBProfile = dc.attribute("DPIn","");
395
                m_Doc->CMSSettings.DefaultSolidColorRGBProfile = dc.attribute("DPIn2","");
396
                m_Doc->CMSSettings.DefaultSolidColorCMYKProfile = dc.attribute("DPIn3","");
397
                //m_Doc->CMSSettings.DefaultIntentPrinter = dc.attribute("DIPr", "0").toInt();
398
                //m_Doc->CMSSettings.DefaultIntentMonitor = dc.attribute("DIMo", "1").toInt();
399
                m_Doc->CMSSettings.DefaultIntentColors = dc.attribute("DISc", "1").toInt();
400
                m_Doc->CMSSettings.DefaultIntentImages = dc.attribute("DIIm", "0").toInt();
401
                activeLayer = dc.attribute("ALAYER", "0").toInt();
402
                m_Doc->Language = dc.attribute("LANGUAGE", "");
403
                m_Doc->MinWordLen = dc.attribute("MINWORDLEN", "3").toInt();
404
                m_Doc->HyCount = dc.attribute("HYCOUNT", "2").toInt();
405
                m_Doc->Automatic = static_cast<bool>(dc.attribute("AUTOMATIC", "1").toInt());
406
                m_Doc->AutoCheck = static_cast<bool>(dc.attribute("AUTOCHECK", "0").toInt());
407
                m_Doc->GuideLock = static_cast<bool>(dc.attribute("GUIDELOCK", "0").toInt());
408
                m_Doc->SnapGuides = static_cast<bool>(dc.attribute("SnapToGuides", "0").toInt());
409
                m_Doc->useRaster = static_cast<bool>(dc.attribute("SnapToGrid", "0").toInt());
410
                m_Doc->guidesSettings.minorGrid = dc.attribute("MINGRID", tmp.setNum(prefsManager->appPrefs.guidesSettings.minorGrid)).toDouble();
411
                m_Doc->guidesSettings.majorGrid = dc.attribute("MAJGRID", tmp.setNum(prefsManager->appPrefs.guidesSettings.majorGrid)).toDouble();
412
                m_Doc->toolSettings.dStartArrow = 0;
413
                m_Doc->toolSettings.dEndArrow = 0;
414
                m_Doc->LastAuto = 0;
415
                QDomNode PAGE=DOC.firstChild();
416
                counter = 0;
417
                while(!PAGE.isNull())
418
                {
419
                        ObCount++;
5653 cbradney 420
                        if (m_mwProgressBar!=0)
421
                                m_mwProgressBar->setProgress(ObCount);
5641 cbradney 422
                        QDomElement pg=PAGE.toElement();
423
                        // 10/25/2004 pv - None is "reserved" color. cannot be defined in any file...
424
                        if(pg.tagName()=="COLOR" && pg.attribute("NAME")!=CommonStrings::None)
425
                        {
426
                                if (pg.hasAttribute("CMYK"))
427
                                        lf.setNamedColor(pg.attribute("CMYK"));
428
                                else
429
                                        lf.fromQColor(QColor(pg.attribute("RGB")));
430
                                lf.setSpotColor(false);
431
                                lf.setRegistrationColor(false);
5880 jghali 432
                                m_Doc->PageColors.insert(pg.attribute("NAME"), lf);
5641 cbradney 433
                        }
434
                        if(pg.tagName()=="STYLE")
435
                        {
436
                                vg.setName(pg.attribute("NAME"));
437
                                vg.setLineSpacingMode(static_cast<ParagraphStyle::LineSpacingMode>(pg.attribute("LINESPMode", "0").toInt()));
438
                                vg.setLineSpacing(pg.attribute("LINESP").toDouble());
439
                                vg.setLeftMargin(pg.attribute("INDENT", "0").toDouble());
440
                                vg.setFirstIndent(pg.attribute("FIRST", "0").toDouble());
441
                                vg.setAlignment(pg.attribute("ALIGN").toInt());
442
                                vg.setGapBefore(pg.attribute("VOR", "0").toDouble());
443
                                vg.setGapAfter(pg.attribute("NACH", "0").toDouble());
444
                                tmpf = pg.attribute("FONT", m_Doc->toolSettings.defFont);
445
                                if ((!m_AvailableFonts->find(tmpf)) || (!(*m_AvailableFonts)[tmpf]->usable()))
446
                                {
447
                                        if ((!prefsManager->appPrefs.GFontSub.contains(tmpf)) || (!(*m_AvailableFonts)[prefsManager->appPrefs.GFontSub[tmpf]]->usable()))
448
                                        {
449
                                                newReplacement = true;
450
                                                ReplacedFonts.insert(tmpf, prefsManager->appPrefs.toolSettings.defFont);
451
                                        }
452
                                        else
453
                                                ReplacedFonts.insert(tmpf, prefsManager->appPrefs.GFontSub[tmpf]);
454
                                }
455
                                else
456
                                {
457
                                        if (!m_Doc->UsedFonts.contains(tmpf))
458
                                        {
459
//                                              QFont fo = avail[tmpf]->Font;
460
//                                              fo.setPointSize(qRound(m_Doc->toolSettings.defSize / 10.0));
461
                                                m_Doc->AddFont(tmpf);
462
                                        }
463
                                }
5691 avox 464
                                vg.charStyle().setFont((*m_AvailableFonts)[tmpf]);
465
                                vg.charStyle().setFontSize(qRound(pg.attribute("FONTSIZE", "12").toDouble() * 10.0));
5641 cbradney 466
                                vg.setHasDropCap(static_cast<bool>(pg.attribute("DROP", "0").toInt()));
467
                                vg.setDropCapLines(pg.attribute("DROPLIN", "2").toInt());
468
                                vg.setDropCapOffset(pg.attribute("DROPDIST", "0").toDouble());
5691 avox 469
                                vg.charStyle().setEffects(static_cast<StyleFlag>(pg.attribute("EFFECT", "0").toInt()));
470
                                vg.charStyle().setFillColor(pg.attribute("FCOLOR", m_Doc->toolSettings.dBrush));
471
                                vg.charStyle().setFillShade(pg.attribute("FSHADE", "100").toInt());
472
                                vg.charStyle().setStrokeColor(pg.attribute("SCOLOR", m_Doc->toolSettings.dPen));
473
                                vg.charStyle().setStrokeShade(pg.attribute("SSHADE", "100").toInt());
5641 cbradney 474
                                vg.setUseBaselineGrid(static_cast<bool>(pg.attribute("BASE", "0").toInt()));
5691 avox 475
                                vg.charStyle().setShadowXOffset(50);
476
                                vg.charStyle().setShadowYOffset(-50);
477
                                vg.charStyle().setOutlineWidth(10);
478
                                vg.charStyle().setUnderlineOffset(m_Doc->typographicSettings.valueUnderlinePos);
479
                                vg.charStyle().setUnderlineWidth(m_Doc->typographicSettings.valueUnderlineWidth);
480
                                vg.charStyle().setStrikethruOffset(m_Doc->typographicSettings.valueStrikeThruPos);
481
                                vg.charStyle().setStrikethruWidth(m_Doc->typographicSettings.valueStrikeThruPos);
482
                                vg.charStyle().setScaleH(1000);
483
                                vg.charStyle().setScaleV(1000);
484
                                vg.charStyle().setBaselineOffset(0);
485
                                vg.charStyle().setTracking(0);
5641 cbradney 486
                                if ((pg.hasAttribute("NUMTAB")) && (pg.attribute("NUMTAB", "0").toInt() != 0))
487
                                {
488
                                        tmp = pg.attribute("TABS");
489
                                        QTextStream tgv(&tmp, IO_ReadOnly);
490
                                        vg.tabValues().clear();
491
                                        ParagraphStyle::TabRecord tb;
492
                                        for (int cxv = 0; cxv < pg.attribute("NUMTAB", "0").toInt(); cxv += 2)
493
                                        {
494
                                                tgv >> xf;
495
                                                tgv >> xf2;
496
                                                tb.tabPosition = xf2;
497
                                                tb.tabType = static_cast<int>(xf);
498
                                                tb.tabFillChar = QChar();
499
                                                vg.tabValues().append(tb);
500
                                        }
501
                                        tmp = "";
502
                                }
503
                                else
504
                                        vg.tabValues().clear();
505
                                m_Doc->docParagraphStyles.append(vg);
506
                        }
507
                        if(pg.tagName()=="JAVA")
508
                                m_Doc->JavaScripts[pg.attribute("NAME")] = pg.attribute("SCRIPT");
509
                        if(pg.tagName()=="LAYERS")
510
                        {
511
                                la.LNr = pg.attribute("NUMMER").toInt();
512
                                la.Level = pg.attribute("LEVEL").toInt();
513
                                la.Name = pg.attribute("NAME");
514
                                la.isViewable = pg.attribute("SICHTBAR").toInt();
515
                                la.isPrintable = pg.attribute("DRUCKEN").toInt();
516
                                la.isEditable = true;
517
                                la.flowControl = true;
518
                                la.blendMode = 0;
519
                                la.transparency = 1.0;
520
                                QColor marker;
521
                                switch (la.LNr % 7)
522
                                {
523
                                        case 0:
524
                                                marker = Qt::black;
525
                                                break;
526
                                        case 1:
527
                                                marker = Qt::red;
528
                                                break;
529
                                        case 2:
530
                                                marker = Qt::green;
531
                                                break;
532
                                        case 3:
533
                                                marker = Qt::blue;
534
                                                break;
535
                                        case 4:
536
                                                marker = Qt::cyan;
537
                                                break;
538
                                        case 5:
539
                                                marker = Qt::magenta;
540
                                                break;
541
                                        case 6:
542
                                                marker = Qt::yellow;;
543
                                                break;
544
                                }
545
                                la.markerColor = marker;
546
                                la.outlineMode = false;
547
                                m_Doc->Layers.append(la);
548
                        }
549
                        if(pg.tagName()=="MultiLine")
550
                        {
551
                                multiLine ml;
552
                                QDomNode MuLn = PAGE.firstChild();
553
                                while(!MuLn.isNull())
554
                                {
555
                                        QDomElement MuL = MuLn.toElement();
556
                                        struct SingleLine sl;
557
                                        sl.Color = MuL.attribute("Color");
558
                                        sl.Dash = MuL.attribute("Dash").toInt();
559
                                        sl.LineEnd = MuL.attribute("LineEnd").toInt();
560
                                        sl.LineJoin = MuL.attribute("LineJoin").toInt();
561
                                        sl.Shade = MuL.attribute("Shade").toInt();
562
                                        sl.Width = MuL.attribute("Width").toDouble();
563
                                        ml.push_back(sl);
564
                                        MuLn = MuLn.nextSibling();
565
                                }
566
                                m_Doc->MLineStyles.insert(pg.attribute("Name"), ml);
567
                        }
568
                        if(pg.tagName()=="PAGE")
569
                        {
570
                                TableItems.clear();
571
                                TableID.clear();
572
                        /*
573
                        * Attribute von PAGE auslesen
574
                        */
575
                                a = pg.attribute("NUM").toInt();
576
                                PgNam = "";
577
                                PgNam = pg.attribute("NAM", "");
578
                                QString Mus = "";
579
                                Mus = pg.attribute("MNAM","Normal");
580
                                if (PgNam.isEmpty())
581
                                {
582
                                        //We store the pages master page but do not apply it now
583
                                        //as it may not exist yet. They are applied in scribus.cpp for now.
584
                                        m_Doc->setMasterPageMode(false);
585
                                        m_Doc->setCurrentPage(m_Doc->addPage(a));
586
                                        m_Doc->currentPage()->MPageNam=Mus;
587
                                }
588
                                else
589
                                {
590
                                        m_Doc->setMasterPageMode(true);
591
                                        m_Doc->setCurrentPage(m_Doc->addMasterPage(a, PgNam));
592
                                }
593
                                //CB: Remove this unnecessarily "slow" slot call when we have no gui for the doc yet!
594
                                //Items dont appear in the right place if we just m_Doc->addPage(a); for <=1.2.x docs
595
                                //so we have to call the view, but we certainly dont need to emit to the mainwindow!
596
                                //This call now picks up the added page and does some view black magic. A must for
597
                                //1.2.x docs!
598
                                m_View->addPage(a);
599
                                //emit NewPage(a);
600
                                m_Doc->Pages->at(a)->LeftPg=pg.attribute("LEFT", "0").toInt();
601
 
602
                                // guides reading
603
                                tmp = "";
604
                                GuideManagerCore::readVerticalGuides(pg.attribute("VerticalGuides"),
605
                                                        m_Doc->Pages->at(a),
606
                                                        GuideManagerCore::Standard,
607
                                                        pg.hasAttribute("NumVGuides"));
608
                                GuideManagerCore::readHorizontalGuides(pg.attribute("HorizontalGuides"),
609
                                                        m_Doc->Pages->at(a),
610
                                                        GuideManagerCore::Standard,
611
                                                        pg.hasAttribute("NumHGuides"));
612
 
613
                                QDomNode OBJ=PAGE.firstChild();
614
                                while(!OBJ.isNull())
615
                                {
616
                                        QDomElement obj=OBJ.toElement();
617
                                /*
618
                                * Attribute von OBJECT auslesen
619
                                */
620
                                        if ((obj.attribute("NEXTITEM").toInt() != -1) || (static_cast<bool>(obj.attribute("AUTOTEXT").toInt())))
621
                                        {
622
                                                if (obj.attribute("BACKITEM").toInt() == -1)
623
                                                {
624
                                                        Link.Start = counter;
625
                                                        Link.StPag = a;
626
                                                        LFrames.append(Link);
627
                                                }
628
                                        }
629
                                        GetItemProps(newVersion, &obj, &OB);
630
                                        OB.Xpos = obj.attribute("XPOS").toDouble()+m_Doc->Pages->at(a)->xOffset();
631
                                        OB.Ypos=obj.attribute("YPOS").toDouble()+m_Doc->Pages->at(a)->yOffset();
632
                                        OB.NamedLStyle = obj.attribute("NAMEDLST", "");
633
                                        OB.isBookmark=obj.attribute("BOOKMARK").toInt();
634
                                        if ((OB.isBookmark) && (m_Doc->BookMarks.count() == 0))
635
                                                m_Doc->OldBM = true;
636
                                        OB.textAlignment = obj.attribute("ALIGN", "0").toInt();
637
                                        OB.startArrowIndex =  0;
638
                                        OB.endArrowIndex =  0;
639
                                        tmpf = obj.attribute("IFONT", m_Doc->toolSettings.defFont);
640
                                        if ((!m_AvailableFonts->find(tmpf)) || (!(*m_AvailableFonts)[tmpf]->usable()))
641
                                        {
642
                                                if ((!prefsManager->appPrefs.GFontSub.contains(tmpf)) || (!(*m_AvailableFonts)[prefsManager->appPrefs.GFontSub[tmpf]]->usable()))
643
                                                {
644
                                                        newReplacement = true;
645
                                                        ReplacedFonts.insert(tmpf, prefsManager->appPrefs.toolSettings.defFont);
646
                                                }
647
                                                else
648
                                                        ReplacedFonts.insert(tmpf, prefsManager->appPrefs.GFontSub[tmpf]);
649
                                        }
650
                                        else
651
                                        {
652
                                                if (!m_Doc->UsedFonts.contains(tmpf))
653
                                                {
654
//                                                      QFont fo = avail[tmpf]->Font;
655
//                                                      fo.setPointSize(qRound(m_Doc->toolSettings.defSize / 10.0));
656
                                                        m_Doc->AddFont(tmpf);
657
                                                }
658
                                        }
659
                                        OB.IFont = tmpf;
660
                                        OB.LayerNr = obj.attribute("LAYER", "0").toInt();
661
                                        OB.Language = obj.attribute("LANGUAGE", m_Doc->Language);
662
                                        tmp = "";
663
                                        if ((obj.hasAttribute("GROUPS")) && (obj.attribute("NUMGROUP", "0").toInt() != 0))
664
                                        {
665
                                                tmp = obj.attribute("GROUPS");
666
                                                QTextStream fg(&tmp, IO_ReadOnly);
667
                                                OB.Groups.clear();
668
                                                for (int cx = 0; cx < obj.attribute("NUMGROUP", "0").toInt(); ++cx)
669
                                                {
670
                                                        fg >> x;
671
                                                        OB.Groups.push(x);
672
                                                }
673
                                                tmp = "";
674
                                        }
675
                                        else
676
                                                OB.Groups.clear();
677
                                        QDomNode IT=OBJ.firstChild();
678
                                        while(!IT.isNull())
679
                                        {
680
                                                QDomElement it=IT.toElement();
681
                                                if (it.tagName()=="CSTOP")
682
                                                {
683
                                                        QString name = it.attribute("NAME");
684
                                                        double ramp = it.attribute("RAMP", "0.0").toDouble();
685
                                                        int shade = it.attribute("SHADE", "100").toInt();
686
                                                        double opa = it.attribute("TRANS", "1").toDouble();
687
                                                        OB.fill_gradient.addStop(SetColor(m_Doc, name, shade), ramp, 0.5, opa, name, shade);
688
                                                        OB.GrColor = "";
689
                                                        OB.GrColor2 = "";
690
                                                }
691
                                                IT=IT.nextSibling();
692
                                        }
693
                                        OB.itemText = "";
694
                                        int docGc = m_Doc->GroupCounter;
695
                                        m_Doc->GroupCounter = 0;
696
                                        uint last = m_Doc->Items->count();
697
                                        m_View->PasteItem(&OB, true);
698
                                        m_Doc->GroupCounter = docGc;
699
                                        Neu = m_Doc->Items->at(last);
700
                                        Neu->OnMasterPage = PgNam;
701
                                        Neu->OwnPage = a; //No need to scan for OnPage as we know page by page in 1.2.x
702
                                        Neu->oldOwnPage = 0;
703
                                        Neu->setRedrawBounding();
704
                                        IT=OBJ.firstChild();
705
                                        while(!IT.isNull())
706
                                        {
707
                                                QDomElement it=IT.toElement();
708
                                                if (it.tagName()=="ITEXT")
709
                                                        GetItemText(&it, m_Doc, false, false, Neu);
710
                                                IT=IT.nextSibling();
711
                                        }
712
                                        Neu->isAutoText=static_cast<bool>(obj.attribute("AUTOTEXT").toInt());
713
                                        if (Neu->isAutoText)
714
                                                m_Doc->LastAuto = Neu;
715
                                        Neu->NextIt = obj.attribute("NEXTITEM").toInt();
716
                                        Neu->NextPg = obj.attribute("NEXTPAGE").toInt();
717
                                        if (Neu->isTableItem)
718
                                        {
719
                                                TableItems.append(Neu);
720
                                                TableID.insert(obj.attribute("OwnLINK", "0").toInt(), Neu->ItemNr);
721
                                        }
722
                                        counter++;
723
                                        OBJ=OBJ.nextSibling();
724
                                }
725
                                if (TableItems.count() != 0)
726
                                {
727
                                        for (uint ttc = 0; ttc < TableItems.count(); ++ttc)
728
                                        {
729
                                                PageItem* ta = TableItems.at(ttc);
730
                                                if (ta->TopLinkID != -1)
731
                                                        ta->TopLink = m_Doc->Items->at(TableID[ta->TopLinkID]);
732
                                                else
733
                                                        ta->TopLink = 0;
734
                                                if (ta->LeftLinkID != -1)
735
                                                        ta->LeftLink = m_Doc->Items->at(TableID[ta->LeftLinkID]);
736
                                                else
737
                                                        ta->LeftLink = 0;
738
                                                if (ta->RightLinkID != -1)
739
                                                        ta->RightLink = m_Doc->Items->at(TableID[ta->RightLinkID]);
740
                                                else
741
                                                        ta->RightLink = 0;
742
                                                if (ta->BottomLinkID != -1)
743
                                                        ta->BottomLink = m_Doc->Items->at(TableID[ta->BottomLinkID]);
744
                                                else
745
                                                        ta->BottomLink = 0;
746
                                        }
747
                                }
748
                        }
749
                        PAGE=PAGE.nextSibling();
750
                }
751
                PAGE=DOC.firstChild();
752
                while(!PAGE.isNull())
753
                {
754
                        QDomElement pg=PAGE.toElement();
755
                        if(pg.tagName()=="Bookmark")
756
                        {
757
                                bok.Title = pg.attribute("Title");
758
                                bok.Text = pg.attribute("Text");
759
                                bok.Aktion = pg.attribute("Aktion");
760
                                bok.ItemNr = pg.attribute("ItemNr").toInt();
761
                                bok.PageObject = m_Doc->Items->at(pg.attribute("Element").toInt());
762
                                bok.First = pg.attribute("First").toInt();
763
                                bok.Last = pg.attribute("Last").toInt();
764
                                bok.Prev = pg.attribute("Prev").toInt();
765
                                bok.Next = pg.attribute("Next").toInt();
766
                                bok.Parent = pg.attribute("Parent").toInt();
767
                                m_Doc->BookMarks.append(bok);
768
                        }
769
                        if(pg.tagName()=="PDF")
770
                        {
771
                                m_Doc->PDF_Options.Articles = static_cast<bool>(pg.attribute("Articles").toInt());
772
                                m_Doc->PDF_Options.Thumbnails = static_cast<bool>(pg.attribute("Thumbnails").toInt());
773
                                m_Doc->PDF_Options.Compress = static_cast<bool>(pg.attribute("Compress").toInt());
774
                                m_Doc->PDF_Options.CompressMethod = pg.attribute("CMethod", "0").toInt();
775
                                m_Doc->PDF_Options.Quality = pg.attribute("Quality", "0").toInt();
776
                                m_Doc->PDF_Options.RecalcPic = static_cast<bool>(pg.attribute("RecalcPic").toInt());
777
                                m_Doc->PDF_Options.Bookmarks = static_cast<bool>(pg.attribute("Bookmarks").toInt());
778
                                if (pg.hasAttribute("MirrorH"))
779
                                        m_Doc->PDF_Options.MirrorH = static_cast<bool>(pg.attribute("MirrorH").toInt());
780
                                else
781
                                        m_Doc->PDF_Options.MirrorH = false;
782
                                if (pg.hasAttribute("MirrorV"))
783
                                        m_Doc->PDF_Options.MirrorV = static_cast<bool>(pg.attribute("MirrorV").toInt());
784
                                else
785
                                        m_Doc->PDF_Options.MirrorV = false;
786
                                if (pg.hasAttribute("RotateDeg"))
787
                                        m_Doc->PDF_Options.RotateDeg = pg.attribute("RotateDeg", "0").toInt();
788
                                else
789
                                        m_Doc->PDF_Options.RotateDeg = 0;
790
                                m_Doc->PDF_Options.PresentMode = static_cast<bool>(pg.attribute("PresentMode").toInt());
791
                                m_Doc->PDF_Options.PicRes = pg.attribute("PicRes").toInt();
792
                                m_Doc->PDF_Options.Version = (PDFOptions::PDFVersion)pg.attribute("Version").toInt();
793
                                m_Doc->PDF_Options.Resolution = pg.attribute("Resolution").toInt();
794
                                m_Doc->PDF_Options.Binding = pg.attribute("Binding").toInt();
795
                                m_Doc->PDF_Options.Datei = "";
796
                                m_Doc->PDF_Options.isGrayscale = false;
797
                                m_Doc->PDF_Options.UseRGB = static_cast<bool>(pg.attribute("RGBMode", "0").toInt());
798
                                m_Doc->PDF_Options.UseProfiles = static_cast<bool>(pg.attribute("UseProfiles", "0").toInt());
799
                                m_Doc->PDF_Options.UseProfiles2 = static_cast<bool>(pg.attribute("UseProfiles2", "0").toInt());
800
                                m_Doc->PDF_Options.Intent = pg.attribute("Intent", "1").toInt();
801
                                m_Doc->PDF_Options.Intent2 = pg.attribute("Intent2", "1").toInt();
802
                                m_Doc->PDF_Options.SolidProf = pg.attribute("SolidP", "");
803
                                m_Doc->PDF_Options.ImageProf = pg.attribute("ImageP", "");
804
                                m_Doc->PDF_Options.PrintProf = pg.attribute("PrintP", "");
805
                                m_Doc->PDF_Options.Info = pg.attribute("InfoString", "");
806
                                m_Doc->PDF_Options.BleedTop = pg.attribute("BTop", "0").toDouble();
807
                                m_Doc->PDF_Options.BleedLeft = pg.attribute("BLeft", "0").toDouble();
808
                                m_Doc->PDF_Options.BleedRight = pg.attribute("BRight", "0").toDouble();
809
                                m_Doc->PDF_Options.BleedBottom = pg.attribute("BBottom", "0").toDouble();
810
                                m_Doc->PDF_Options.EmbeddedI = static_cast<bool>(pg.attribute("ImagePr", "0").toInt());
811
                                m_Doc->PDF_Options.PassOwner = pg.attribute("PassOwner", "");
812
                                m_Doc->PDF_Options.PassUser = pg.attribute("PassUser", "");
813
                                m_Doc->PDF_Options.Permissions = pg.attribute("Permissions", "-4").toInt();
814
                                m_Doc->PDF_Options.Encrypt = static_cast<bool>(pg.attribute("Encrypt", "0").toInt());
815
                                m_Doc->PDF_Options.useLayers = static_cast<bool>(pg.attribute("UseLayers", "0").toInt());
816
                                m_Doc->PDF_Options.UseLPI = static_cast<bool>(pg.attribute("UseLpi", "0").toInt());
817
                                m_Doc->PDF_Options.UseSpotColors = true;
818
                                m_Doc->PDF_Options.doOverprint = false;
819
                                m_Doc->PDF_Options.doMultiFile = false;
820
                                QDomNode PFO = PAGE.firstChild();
821
                                while(!PFO.isNull())
822
                                {
823
                                        QDomElement pdfF = PFO.toElement();
824
                                        if(pdfF.tagName() == "LPI")
825
                                        {
826
                                                struct LPIData lpo;
827
                                                lpo.Angle = pdfF.attribute("Angle").toInt();
828
                                                lpo.Frequency = pdfF.attribute("Frequency").toInt();
829
                                                lpo.SpotFunc = pdfF.attribute("SpotFunction").toInt();
830
                                                m_Doc->PDF_Options.LPISettings[pdfF.attribute("Color")] = lpo;
831
                                        }
832
                                        if(pdfF.tagName() == "Fonts")
833
                                        {
834
                                                if (!m_Doc->PDF_Options.EmbedList.contains(pdfF.attribute("Name")))
835
                                                        m_Doc->PDF_Options.EmbedList.append(pdfF.attribute("Name"));
836
                                        }
837
                                        if(pdfF.tagName() == "Subset")
838
                                        {
839
                                                if (!m_Doc->PDF_Options.SubsetList.contains(pdfF.attribute("Name")))
840
                                                        m_Doc->PDF_Options.SubsetList.append(pdfF.attribute("Name"));
841
                                        }
842
                                        if(pdfF.tagName() == "Effekte")
843
                                        {
844
                                        struct PDFPresentationData ef;
845
                                        ef.pageEffectDuration = pdfF.attribute("pageEffectDuration").toInt();
846
                                        ef.pageViewDuration = pdfF.attribute("pageViewDuration").toInt();
847
                                        ef.effectType = pdfF.attribute("effectType").toInt();
848
                                        ef.Dm = pdfF.attribute("Dm").toInt();
849
                                        ef.M = pdfF.attribute("M").toInt();
850
                                        ef.Di = pdfF.attribute("Di").toInt();
851
                                                m_Doc->PDF_Options.PresentVals.append(ef);
852
                                        }
853
                                        PFO = PFO.nextSibling();
854
                                }
855
                        }
856
                        PAGE=PAGE.nextSibling();
857
                }
858
                DOC=DOC.nextSibling();
859
        }
860
        //m_Doc->Pages = &m_Doc->DocPages;
861
        //m_Doc->pageCount = m_Doc->Pages->count();
862
        //m_Doc->Items = m_Doc->DocItems;
863
        m_Doc->setMasterPageMode(false);
864
        m_View->reformPages();
865
        if (m_Doc->layerCount() == 0)
866
        {
867
                la.LNr = 0;
868
                la.Level = 0;
869
                la.Name = tr("Background");
870
                la.isViewable = true;
871
                la.isPrintable = true;
872
                m_Doc->Layers.append(la);
873
        }
874
        m_Doc->setActiveLayer(activeLayer);
875
        if (LFrames.count() != 0)
876
        {
877
                PageItem *Its;
878
                PageItem *Itn;
879
                PageItem *Itr;
880
                QValueList<Linked>::Iterator lc;
881
                for (lc = LFrames.begin(); lc != LFrames.end(); ++lc)
882
                {
883
                        Its = m_Doc->Items->at((*lc).Start);
884
                        Itr = Its;
885
                        Its->BackBox = 0;
886
                        if (Its->isAutoText)
887
                                m_Doc->FirstAuto = Its;
888
                        while (Its->NextIt != -1)
889
                        {
890
                                int itnr = 0;
891
                                for (uint nn = 0; nn < m_Doc->Items->count(); ++nn)
892
                                {
893
                                        if (m_Doc->Items->at(nn)->OwnPage == Its->NextPg)
894
                                        {
895
                                                if (itnr == Its->NextIt)
896
                                                {
897
                                                        itnr = nn;
898
                                                        break;
899
                                                }
900
                                                itnr++;
901
                                        }
902
                                }
903
                                Itn = m_Doc->Items->at(itnr);
904
                                Its->NextBox = Itn;
905
                                Itn->BackBox = Its;
5732 avox 906
                                Its->itemText.append(Itn->itemText);
907
                                Itn->itemText = Its->itemText;
5641 cbradney 908
                                Its = Itn;
909
                        }
910
                        Its->NextBox = 0;
911
                }
912
        }
913
        m_View->unitSwitcher->setCurrentText(unitGetStrFromIndex(m_Doc->unitIndex()));
5653 cbradney 914
        if (m_mwProgressBar!=0)
915
                m_mwProgressBar->setProgress(DOC.childNodes().count());
5641 cbradney 916
        return true;
917
//end old ReadDoc
918
 
919
 
920
        //return false;
921
}
922
 
923
bool Scribus12Format::saveFile(const QString & /* fileName */, const FileFormat & /* fmt */)
924
{
925
        return false;
926
}
927
 
928
void Scribus12Format::GetItemText(QDomElement *it, ScribusDoc *doc, bool VorLFound, bool impo, PageItem* obj)
929
{
930
        QString tmp2, tmf, tmpf, tmp3;
931
        tmp2 = it->attribute("CH");
932
        tmp2.replace(QRegExp("\r"), QChar(5));
933
        tmp2.replace(QRegExp("\n"), QChar(5));
934
        tmp2.replace(QRegExp("\t"), QChar(4));
935
        tmpf = it->attribute("CFONT", doc->toolSettings.defFont);
936
        bool unknown = false;
937
        Foi* dummy = NULL;
938
        PrefsManager* prefsManager=PrefsManager::instance();
939
        if ((!prefsManager->appPrefs.AvailFonts.find(tmpf)) || (!prefsManager->appPrefs.AvailFonts[tmpf]->usable()))
940
        {
941
                bool isThere = false;
942
                for (uint dl = 0; dl < dummyFois.count(); ++dl)
943
                {
944
                        if (dummyFois.at(dl)->scName() == tmpf)
945
                        {
946
                                isThere = true;
947
                                dummy = dummyFois.at(dl);
948
                                break;
949
                        }
950
                }
951
                if (!isThere)
952
                {
953
                        dummy = new Foi(tmpf, "", tmpf, "", "", 1, false);
954
                        dummyFois.append(dummy);
955
                }
956
                unknown = true;
957
                if ((!prefsManager->appPrefs.GFontSub.contains(tmpf)) || (!prefsManager->appPrefs.AvailFonts[prefsManager->appPrefs.GFontSub[tmpf]]->usable()))
958
                {
959
                        newReplacement = true;
960
                        ReplacedFonts.insert(tmpf, prefsManager->appPrefs.toolSettings.defFont);
961
                }
962
                else
963
                        ReplacedFonts.insert(tmpf, prefsManager->appPrefs.GFontSub[tmpf]);
964
        }
965
        else
966
        {
967
                if (!doc->UsedFonts.contains(tmpf))
968
                {
969
//                      QFont fo = prefsManager->appPrefs.AvailFonts[tmpf]->Font;
970
//                      fo.setPointSize(qRound(doc->toolSettings.defSize / 10.0));
971
                        doc->AddFont(tmpf);
972
                }
973
        }
974
        int size = qRound(it->attribute("CSIZE").toDouble() * 10);
975
        QString fcolor = it->attribute("CCOLOR");
976
        int extra;
977
        if (it->hasAttribute("CEXTRA"))
978
                extra = qRound(it->attribute("CEXTRA").toDouble() / it->attribute("CSIZE").toDouble() * 1000.0);
979
        else
980
                extra = it->attribute("CKERN").toInt();
981
        int shade = it->attribute("CSHADE").toInt();
982
        int cstyle = it->attribute("CSTYLE").toInt() & 255;
983
        int ab = it->attribute("CAB", "0").toInt();
984
        QString stroke = it->attribute("CSTROKE",CommonStrings::None);
985
        int shade2 = it->attribute("CSHADE2", "100").toInt();
986
        int scale = qRound(it->attribute("CSCALE", "100").toDouble() * 10);
987
        int scalev = qRound(it->attribute("CSCALEV", "100").toDouble() * 10);
988
        int base = qRound(it->attribute("CBASE", "0").toDouble() * 10);
989
        int shX = qRound(it->attribute("CSHX", "5").toDouble() * 10);
990
        int shY = qRound(it->attribute("CSHY", "-5").toDouble() * 10);
991
        int outL = qRound(it->attribute("COUT", "1").toDouble() * 10);
992
        int ulp = qRound(it->attribute("CULP", "-0.1").toDouble() * 10);
993
        int ulw = qRound(it->attribute("CULW", "-0.1").toDouble() * 10);
994
        int stp = qRound(it->attribute("CSTP", "-0.1").toDouble() * 10);
995
        int stw = qRound(it->attribute("CSTW", "-0.1").toDouble() * 10);
5721 avox 996
#if 0
5641 cbradney 997
        for (uint cxx=0; cxx<tmp2.length(); ++cxx)
998
        {
999
                hg = new ScText;
1000
                hg->ch = tmp2.at(cxx);
1001
                if (hg->ch == QChar(5))
1002
                        hg->ch = QChar(13);
1003
                if (hg->ch == QChar(4))
1004
                        hg->ch = QChar(9);
1005
                if (unknown)
5691 avox 1006
                        hg->setFont(dummy);
5641 cbradney 1007
                else
5691 avox 1008
                        hg->setFont((*doc->AllFonts)[tmpf]);
1009
                hg->setFontSize(size);
1010
                hg->setFillColor(fcolor);
1011
                hg->setTracking(extra);
1012
                hg->setFillShade(shade);
1013
                hg->setEffects(static_cast<StyleFlag>(cstyle));
5641 cbradney 1014
                if (impo)
1015
                {
1016
                        if (VorLFound)
1017
                                hg->cab = DoVorl[ab].toUInt();
1018
                        else
1019
                        {
1020
                                if (ab < 5)
1021
                                        hg->cab = ab;
1022
                                else
1023
                                        hg->cab = 0;
1024
                        }
1025
                }
1026
                else
1027
                        hg->cab = ab;
5691 avox 1028
                hg->setStrokeColor(stroke);
1029
                hg->setStrokeShade(shade2);
1030
                hg->setScaleH(QMIN(QMAX(scale, 100), 4000));
1031
                hg->setScaleV(QMIN(QMAX(scalev, 100), 4000));
1032
                hg->setBaselineOffset(base);
1033
                hg->setShadowXOffset(shX);
1034
                hg->setShadowYOffset(shY);
1035
                hg->setOutlineWidth(outL);
1036
                hg->setUnderlineOffset(ulp);
1037
                hg->setUnderlineWidth(ulw);
1038
                hg->setStrikethruOffset(stp);
1039
                hg->setStrikethruWidth(stw);
5641 cbradney 1040
                obj->itemText.append(hg);
1041
        }
1042
#else
1043
        for (uint cxx=0; cxx<tmp2.length(); ++cxx)
1044
        {
1045
                CharStyle style;
1046
                QChar ch = tmp2.at(cxx);
1047
                if (ch == QChar(5))
5721 avox 1048
                        ch = SpecialChars::PARSEP;
5641 cbradney 1049
                if (ch == QChar(4))
5721 avox 1050
                        ch = SpecialChars::TAB;
5641 cbradney 1051
                if (unknown)
5721 avox 1052
                        style.setFont(dummy);
5641 cbradney 1053
                else
5721 avox 1054
                        style.setFont((*doc->AllFonts)[tmpf]);
1055
                style.setFontSize(size);
1056
                style.setFillColor(fcolor);
1057
                style.setTracking(extra);
1058
                style.setFillShade(shade);
1059
                style.setEffects(static_cast<StyleFlag>(cstyle));
1060
                /* FIXME:NLS
1061
                if (impo)
5641 cbradney 1062
                {
5721 avox 1063
                        if (VorLFound)
1064
                                hg->cab = DoVorl[ab].toUInt();
1065
                        else
1066
                        {
1067
                                if (ab < 5)
1068
                                        hg->cab = ab;
5641 cbradney 1069
                                else
5721 avox 1070
                                        hg->cab = 0;
1071
                        }
5641 cbradney 1072
                }
1073
                else
1074
                        hg->cab = ab;
5721 avox 1075
*/
1076
                style.setStrokeColor(stroke);
1077
                style.setStrokeShade(shade2);
1078
                style.setScaleH(QMIN(QMAX(scale, 100), 4000));
1079
                style.setScaleV(QMIN(QMAX(scalev, 100), 4000));
1080
                style.setBaselineOffset(base);
1081
                style.setShadowXOffset(shX);
1082
                style.setShadowYOffset(shY);
1083
                style.setOutlineWidth(outL);
1084
                style.setUnderlineOffset(ulp);
1085
                style.setUnderlineWidth(ulw);
1086
                style.setStrikethruOffset(stp);
1087
                style.setStrikethruWidth(stw);
5641 cbradney 1088
                int pos = obj->itemText.length();
1089
                obj->itemText.insertChars(pos, QString(ch));
5721 avox 1090
                obj->itemText.applyCharStyle(pos, 1, style); // FIXME:NLS
5641 cbradney 1091
        }
1092
#endif  
1093
        return;
1094
}
1095
 
1096
bool Scribus12Format::loadPage(const QString & fileName, int pageNumber, bool Mpage, QString /*renamedPageName*/)
1097
{
1098
        qDebug(QString("loading page %2 from file '%1' from 1.2.x plugin").arg(fileName).arg(pageNumber));
5653 cbradney 1099
        if (m_Doc==0 || m_View==0 || m_AvailableFonts==0)
5641 cbradney 1100
        {
5653 cbradney 1101
                Q_ASSERT(m_Doc==0 || m_View==0 || m_AvailableFonts==0);
5641 cbradney 1102
                return false;
1103
        }
1104
 
1105
        struct CopyPasteBuffer OB;
1106
        ParagraphStyle vg;
1107
        struct Layer la;
1108
        struct ScribusDoc::BookMa bok;
1109
        struct Linked Link;
1110
        PageItem *Neu;
1111
        LFrames.clear();
1112
        QString tmV, tmp, tmpf, tmp2, tmp3, tmp4, PgNam, Defont, tmf;
1113
        QMap<int,int> TableID;
1114
        QPtrList<PageItem> TableItems;
1115
        int x, a, counter, baseobj;
1116
        bool newVersion = false;
1117
        bool VorLFound = false;
1118
        QMap<int,int> layerTrans;
1119
        int maxLayer = 0;
1120
        int maxLevel = 0;
1121
        layerTrans.clear();
1122
        uint layerCount=m_Doc->layerCount();
1123
        for (uint la2 = 0; la2 < layerCount; ++la2)
1124
        {
1125
                maxLayer = QMAX(m_Doc->Layers[la2].LNr, maxLayer);
1126
                maxLevel = QMAX(m_Doc->Layers[la2].Level, maxLevel);
1127
        }
1128
        DoVorl.clear();
1129
        DoFonts.clear();
1130
        DoFonts[m_Doc->toolSettings.defFont] = m_Doc->toolSettings.defFont;
1131
        DoVorl[0] = "0";
1132
        DoVorl[1] = "1";
1133
        DoVorl[2] = "2";
1134
        DoVorl[3] = "3";
1135
        DoVorl[4] = "4";
1136
        VorlC = 5;
1137
        QDomDocument docu("scridoc");
1138
        QString f(readSLA(fileName));
1139
        if (f.isEmpty())
1140
                return false;
1141
        if(!docu.setContent(f))
1142
                return false;
1143
        ScColor lf = ScColor();
1144
        QDomElement elem=docu.documentElement();
1145
        if ((elem.tagName() != "SCRIBUS") && (elem.tagName() != "SCRIBUSUTF8"))
1146
                return false;
1147
        if (elem.hasAttribute("Version"))
1148
                newVersion = true;
1149
        QDomNode DOC=elem.firstChild();
1150
        while(!DOC.isNull())
1151
        {
1152
                QDomElement dc=DOC.toElement();
1153
        /*
1154
        * Attribute von DOCUMENT auslesen
1155
        */
1156
                QDomNode PAGE=DOC.firstChild();
1157
                while(!PAGE.isNull())
1158
                {
1159
                        QDomElement pg=PAGE.toElement();
1160
                        // 10/25/2004 pv - None is "reserved" color. cannot be defined in any file...
1161
                        if(pg.tagName()=="COLOR" && pg.attribute("NAME")!=CommonStrings::None)
1162
                        {
1163
                                if (pg.hasAttribute("CMYK"))
1164
                                        lf.setNamedColor(pg.attribute("CMYK"));
1165
                                else
1166
                                        lf.fromQColor(QColor(pg.attribute("RGB")));
1167
                                lf.setSpotColor(false);
1168
                                lf.setRegistrationColor(false);
5880 jghali 1169
                                m_Doc->PageColors.insert(pg.attribute("NAME"), lf);
5641 cbradney 1170
                        }
1171
                        if(pg.tagName()=="STYLE")
1172
                        {
1173
                                GetStyle(&pg, &vg, m_Doc->docParagraphStyles, m_Doc, true);
1174
                                VorLFound = true;
1175
                        }
1176
                        if(pg.tagName()=="JAVA")
1177
                                m_Doc->JavaScripts[pg.attribute("NAME")] = pg.attribute("SCRIPT");
1178
                        if(pg.tagName()=="LAYERS")
1179
                        {
1180
                                la.LNr = pg.attribute("NUMMER").toInt();
1181
                                la.Level = pg.attribute("LEVEL").toInt();
1182
                                la.Name = pg.attribute("NAME");
1183
                                la.isViewable = pg.attribute("SICHTBAR").toInt();
1184
                                la.isPrintable = pg.attribute("DRUCKEN").toInt();
1185
                                la.isEditable = true;
1186
                                la.flowControl = true;
1187
                                la.transparency = 1.0;
1188
                                la.blendMode = 0;
1189
                                QColor marker;
1190
                                switch (la.LNr % 7)
1191
                                {
1192
                                        case 0:
1193
                                                marker = Qt::black;
1194
                                                break;
1195
                                        case 1:
1196
                                                marker = Qt::red;
1197
                                                break;
1198
                                        case 2:
1199
                                                marker = Qt::green;
1200
                                                break;
1201
                                        case 3:
1202
                                                marker = Qt::blue;
1203
                                                break;
1204
                                        case 4:
1205
                                                marker = Qt::cyan;
1206
                                                break;
1207
                                        case 5:
1208
                                                marker = Qt::magenta;
1209
                                                break;
1210
                                        case 6:
1211
                                                marker = Qt::yellow;;
1212
                                                break;
1213
                                }
1214
                                la.markerColor = marker;
1215
                                la.outlineMode = false;
1216
                                bool laex = false;
1217
                                uint layerCount=m_Doc->layerCount();
1218
                                for (uint la2 = 0; la2 < layerCount; ++la2)
1219
                                {
1220
                                        if (m_Doc->Layers[la2].Name == la.Name)
1221
                                        {
1222
                                                laex = true;
1223
                                                layerTrans.insert(la.LNr, m_Doc->Layers[la2].LNr);
1224
                                        }
1225
                                }
1226
                                if (!laex)
1227
                                {
1228
                                        maxLayer++;
1229
                                        maxLevel++;
1230
                                        layerTrans.insert(la.LNr, maxLayer);
1231
                                        la.LNr = maxLayer;
1232
                                        la.Level = maxLevel;
1233
                                        m_Doc->Layers.append(la);
1234
                                }
1235
                        }
1236
                        if(pg.tagName()=="MultiLine")
1237
                        {
1238
                                multiLine ml;
1239
                                QDomNode MuLn = PAGE.firstChild();
1240
                                while(!MuLn.isNull())
1241
                                {
1242
                                        QDomElement MuL = MuLn.toElement();
1243
                                        struct SingleLine sl;
1244
                                        sl.Color = MuL.attribute("Color");
1245
                                        sl.Dash = MuL.attribute("Dash").toInt();
1246
                                        sl.LineEnd = MuL.attribute("LineEnd").toInt();
1247
                                        sl.LineJoin = MuL.attribute("LineJoin").toInt();
1248
                                        sl.Shade = MuL.attribute("Shade").toInt();
1249
                                        sl.Width = MuL.attribute("Width").toDouble();
1250
                                        ml.push_back(sl);
1251
                                        MuLn = MuLn.nextSibling();
1252
                                }
1253
                                QString Nam = pg.attribute("Name");
1254
                                QString Nam2 = Nam;
1255
                                int copyC = 1;
1256
                                while (m_Doc->MLineStyles.contains(Nam2))
1257
                                {
1258
                                        Nam2 = tr("Copy #%1 of ").arg(copyC)+Nam;
1259
                                        copyC++;
1260
                                }
1261
                                m_Doc->MLineStyles.insert(Nam2, ml);
1262
                        }
1263
                        if ((pg.tagName()=="PAGE") && (pg.attribute("NUM").toInt() == pageNumber))
1264
                        {
1265
                                a = m_Doc->currentPage()->pageNr();
1266
                                if ((pg.attribute("NAM", "").isEmpty()) && (Mpage))
1267
                                {
1268
                                        PAGE=PAGE.nextSibling();
1269
                                        continue;
1270
                                }
1271
                                if (Mpage)
1272
                                {
1273
                                        m_Doc->Pages->at(a)->LeftPg=pg.attribute("LEFT", "0").toInt();
1274
                                        m_Doc->Pages->at(a)->setPageName(pg.attribute("NAM",""));
1275
                                }
1276
                                TableItems.clear();
1277
                                TableID.clear();
1278
                                /*
1279
                                * Attribute von PAGE auslesen
1280
                                */
1281
                                tmp = "";
1282
                                GuideManagerCore::readVerticalGuides(pg.attribute("VerticalGuides"),
1283
                                                m_Doc->Pages->at(a),
1284
                                                GuideManagerCore::Standard,
1285
                                                pg.hasAttribute("NumVGuides"));
1286
                                GuideManagerCore::readHorizontalGuides(pg.attribute("HorizontalGuides"),
1287
                                                m_Doc->Pages->at(a),
1288
                                                GuideManagerCore::Standard,
1289
                                                pg.hasAttribute("NumHGuides"));
1290
 
1291
                                QDomNode OBJ=PAGE.firstChild();
1292
                                counter = m_Doc->Items->count();
1293
                                baseobj = counter;
1294
                                while(!OBJ.isNull())
1295
                                {
1296
                                        QDomElement obj=OBJ.toElement();
1297
                                /*
1298
                                * Attribute von OBJECT auslesen
1299
                                */
1300
                                        if ((obj.attribute("NEXTITEM").toInt() != -1) && (obj.attribute("NEXTPAGE").toInt() == pageNumber))
1301
                                        {
1302
                                                if (obj.attribute("BACKITEM").toInt() == -1)
1303
                                                {
1304
                                                        Link.Start = counter;
1305
                                                        Link.StPag = a;
1306
                                                        LFrames.append(Link);
1307
                                                }
1308
                                        }
1309
                                        GetItemProps(newVersion, &obj, &OB);
1310
                                        OB.Xpos = obj.attribute("XPOS").toDouble()+m_Doc->Pages->at(a)->xOffset();
1311
                                        OB.Ypos=obj.attribute("YPOS").toDouble()+m_Doc->Pages->at(a)->yOffset();
1312
                                        OB.NamedLStyle = obj.attribute("NAMEDLST", "");
1313
                                        if (!m_Doc->MLineStyles.contains(OB.NamedLStyle))
1314
                                                OB.NamedLStyle = "";
1315
                                        OB.isBookmark=obj.attribute("BOOKMARK").toInt();
1316
                                        if ((OB.isBookmark) && (m_Doc->BookMarks.count() == 0))
1317
                                                m_Doc->OldBM = true;
1318
                                        OB.textAlignment = DoVorl[obj.attribute("ALIGN", "0").toInt()].toUInt();
1319
                                        tmpf = obj.attribute("IFONT", m_Doc->toolSettings.defFont);
1320
                                        if (tmpf.isEmpty())
1321
                                                tmpf = m_Doc->toolSettings.defFont;
1322
                                        tmf = tmpf;
1323
                                        if (!DoFonts.contains(tmpf))
1324
                                                tmpf = AskForFont(*m_AvailableFonts, tmpf, m_Doc);
1325
                                        else
1326
                                                tmpf = DoFonts[tmf];
1327
                                        OB.IFont = tmpf;
1328
                                        OB.LayerNr = layerTrans[obj.attribute("LAYER", "0").toInt()];
1329
                                        OB.Language = obj.attribute("LANGUAGE", m_Doc->Language);
1330
                                        tmp = "";
1331
                                        if ((obj.hasAttribute("GROUPS")) && (obj.attribute("NUMGROUP", "0").toInt() != 0))
1332
                                        {
1333
                                                tmp = obj.attribute("GROUPS");
1334
                                                QTextStream fg(&tmp, IO_ReadOnly);
1335
                                                OB.Groups.clear();
1336
                                                for (int cx = 0; cx < obj.attribute("NUMGROUP", "0").toInt(); ++cx)
1337
                                                {
1338
                                                        fg >> x;
1339
                                                        OB.Groups.push(x);
1340
                                                }
1341
                                        tmp = "";
1342
                                        }
1343
                                        else
1344
                                                OB.Groups.clear();
1345
                                        QDomNode IT=OBJ.firstChild();
1346
                                        while(!IT.isNull())
1347
                                        {
1348
                                                QDomElement it=IT.toElement();
1349
                                                if (it.tagName()=="CSTOP")
1350
                                                {
1351
                                                        QString name = it.attribute("NAME");
1352
                                                        double ramp = it.attribute("RAMP", "0.0").toDouble();
1353
                                                        int shade = it.attribute("SHADE", "100").toInt();
1354
                                                        double opa = it.attribute("TRANS", "1").toDouble();
1355
                                                        OB.fill_gradient.addStop(SetColor(m_Doc, name, shade), ramp, 0.5, opa, name, shade);
1356
                                                        OB.GrColor = "";
1357
                                                        OB.GrColor2 = "";
1358
                                                }
1359
                                                IT=IT.nextSibling();
1360
                                        }
1361
                                        OB.itemText = "";
1362
                                        m_View->PasteItem(&OB, true);
1363
                                        Neu = m_Doc->Items->at(counter);
1364
                                        IT=OBJ.firstChild();
1365
                                        while(!IT.isNull())
1366
                                        {
1367
                                                QDomElement it=IT.toElement();
1368
                                                if (it.tagName()=="ITEXT")
1369
                                                        GetItemText(&it, m_Doc, VorLFound, true, Neu);
1370
                                                IT=IT.nextSibling();
1371
                                        }
1372
                                        if (obj.attribute("NEXTPAGE").toInt() == pageNumber)
1373
                                        {
1374
                                                Neu->NextIt = baseobj + obj.attribute("NEXTITEM").toInt();
1375
                                                Neu->NextPg = a; // obj.attribute("NEXTPAGE").toInt();
1376
                                        }
1377
                                        else
1378
                                                Neu->NextIt = -1;
1379
                                        if (Neu->isTableItem)
1380
                                        {
1381
                                                TableItems.append(Neu);
1382
                                                TableID.insert(obj.attribute("OwnLINK", "0").toInt(), Neu->ItemNr);
1383
                                        }
1384
                                        counter++;
1385
                                        OBJ=OBJ.nextSibling();
1386
                                }
1387
                                if (TableItems.count() != 0)
1388
                                {
1389
                                        for (uint ttc = 0; ttc < TableItems.count(); ++ttc)
1390
                                        {
1391
                                                PageItem* ta = TableItems.at(ttc);
1392
                                                if (ta->TopLinkID != -1)
1393
                                                        ta->TopLink = m_Doc->Items->at(TableID[ta->TopLinkID]);
1394
                                                else
1395
                                                        ta->TopLink = 0;
1396
                                                if (ta->LeftLinkID != -1)
1397
                                                        ta->LeftLink = m_Doc->Items->at(TableID[ta->LeftLinkID]);
1398
                                                else
1399
                                                        ta->LeftLink = 0;
1400
                                                if (ta->RightLinkID != -1)
1401
                                                        ta->RightLink = m_Doc->Items->at(TableID[ta->RightLinkID]);
1402
                                                else
1403
                                                        ta->RightLink = 0;
1404
                                                if (ta->BottomLinkID != -1)
1405
                                                        ta->BottomLink = m_Doc->Items->at(TableID[ta->BottomLinkID]);
1406
                                                else
1407
                                                        ta->BottomLink = 0;
1408
                                        }
1409
                                }
1410
                                if (LFrames.count() != 0)
1411
                                {
1412
                                        PageItem *Its;
1413
                                        PageItem *Itn;
1414
                                        PageItem *Itr;
1415
                                        QValueList<Linked>::Iterator lc;
1416
                                        for (lc = LFrames.begin(); lc != LFrames.end(); ++lc)
1417
                                        {
1418
                                                Its = m_Doc->Items->at((*lc).Start);
1419
                                                Itr = Its;
1420
                                                Its->BackBox = 0;
1421
                                                while (Its->NextIt != -1)
1422
                                                {
1423
                                                        if (Its->NextPg == a)
1424
                                                        {
1425
                                                                Itn = m_Doc->Items->at(Its->NextIt);
1426
                                                                Its->NextBox = Itn;
1427
                                                                Itn->BackBox = Its;
5732 avox 1428
                                                                Its->itemText.append(Itn->itemText);
1429
                                                                Itn->itemText = Its->itemText;
5641 cbradney 1430
                                                                Its = Itn;
1431
                                                        }
1432
                                                        else
1433
                                                                break;
1434
                                                }
1435
                                                Its->NextBox = 0;
1436
                                        }
1437
                                }
1438
                                if (!Mpage)
1439
                                        m_View->reformPages();
1440
                                PAGE=DOC.firstChild();
1441
                                while(!PAGE.isNull())
1442
                                {
1443
                                        QDomElement pg=PAGE.toElement();
1444
                                        if(pg.tagName()=="Bookmark")
1445
                                        {
1446
                                                bok.Title = pg.attribute("Title");
1447
                                                bok.Text = pg.attribute("Text");
1448
                                                bok.Aktion = pg.attribute("Aktion");
1449
                                                bok.ItemNr = pg.attribute("ItemNr").toInt();
1450
                                                bok.PageObject = m_Doc->Items->at(pg.attribute("Element").toInt());
1451
                                                bok.First = pg.attribute("First").toInt();
1452
                                                bok.Last = pg.attribute("Last").toInt();
1453
                                                bok.Prev = pg.attribute("Prev").toInt();
1454
                                                bok.Next = pg.attribute("Next").toInt();
1455
                                                bok.Parent = pg.attribute("Parent").toInt();
1456
                                                m_Doc->BookMarks.append(bok);
1457
                                        }
1458
                                PAGE=PAGE.nextSibling();
1459
                                }
1460
                                return true;
1461
                        }
1462
                        PAGE=PAGE.nextSibling();
1463
                }
1464
                DOC=DOC.nextSibling();
1465
        }
1466
        return false;
1467
}
1468
 
1469
void Scribus12Format::GetStyle(QDomElement *pg, ParagraphStyle *vg, QValueList<ParagraphStyle> &docParagraphStyles, ScribusDoc* doc, bool fl)
1470
{
1471
        bool fou;
1472
        QString tmpf, tmf, tmV;
1473
        double xf, xf2;
1474
        fou = false;
1475
        vg->setName(pg->attribute("NAME"));
1476
        vg->setLineSpacingMode(static_cast<ParagraphStyle::LineSpacingMode>(pg->attribute("LINESPMode", "0").toInt()));
1477
        vg->setLineSpacing(pg->attribute("LINESP").toDouble());
1478
        vg->setLeftMargin(pg->attribute("INDENT", "0").toDouble());
1479
        vg->setFirstIndent(pg->attribute("FIRST", "0").toDouble());
1480
        vg->setAlignment(pg->attribute("ALIGN").toInt());
1481
        vg->setGapBefore(pg->attribute("VOR", "0").toDouble());
1482
        vg->setGapAfter(pg->attribute("NACH", "0").toDouble());
1483
        tmpf = pg->attribute("FONT", doc->toolSettings.defFont);
1484
        if (tmpf.isEmpty())
1485
                tmpf = doc->toolSettings.defFont;
1486
        tmf = tmpf;
1487
        PrefsManager* prefsManager=PrefsManager::instance();
1488
        if (!DoFonts.contains(tmpf))
1489
                tmpf = AskForFont(prefsManager->appPrefs.AvailFonts, tmpf, doc);
1490
        else
1491
                tmpf = DoFonts[tmf];
5691 avox 1492
        vg->charStyle().setFont(prefsManager->appPrefs.AvailFonts[tmpf]);
1493
        vg->charStyle().setFontSize(qRound(pg->attribute("FONTSIZE", "12").toDouble() * 10.0));
5641 cbradney 1494
        vg->setHasDropCap(static_cast<bool>(pg->attribute("DROP", "0").toInt()));
1495
        vg->setDropCapLines(pg->attribute("DROPLIN", "2").toInt());
1496
        vg->setDropCapOffset(pg->attribute("DROPDIST", "0").toDouble());
5691 avox 1497
        vg->charStyle().setEffects(static_cast<StyleFlag>((pg->attribute("EFFECT", "0").toInt())));
1498
        vg->charStyle().setFillColor(pg->attribute("FCOLOR", doc->toolSettings.dBrush));
1499
        vg->charStyle().setFillShade(pg->attribute("FSHADE", "100").toInt());
1500
        vg->charStyle().setStrokeColor(pg->attribute("SCOLOR", doc->toolSettings.dPen));
1501
        vg->charStyle().setStrokeShade(pg->attribute("SSHADE", "100").toInt());
5641 cbradney 1502
        vg->setUseBaselineGrid(static_cast<bool>(pg->attribute("BASE", "0").toInt()));
5691 avox 1503
        vg->charStyle().setShadowXOffset(qRound(pg->attribute("TXTSHX", "5").toDouble() * 10));
1504
        vg->charStyle().setShadowYOffset(qRound(pg->attribute("TXTSHY", "-5").toDouble() * 10));
1505
        vg->charStyle().setOutlineWidth(qRound(pg->attribute("TXTOUT", "1").toDouble() * 10));
1506
        vg->charStyle().setUnderlineOffset(qRound(pg->attribute("TXTULP", "-0.1").toDouble() * 10));
1507
        vg->charStyle().setUnderlineWidth(qRound(pg->attribute("TXTULW", "-0.1").toDouble() * 10));
1508
        vg->charStyle().setStrikethruOffset(qRound(pg->attribute("TXTSTP", "-0.1").toDouble() * 10));
1509
        vg->charStyle().setStrikethruWidth(qRound(pg->attribute("TXTSTW", "-0.1").toDouble() * 10));
1510
        vg->charStyle().setScaleH(qRound(pg->attribute("SCALEH", "100").toDouble() * 10));
1511
        vg->charStyle().setScaleV(qRound(pg->attribute("SCALEV", "100").toDouble() * 10));
1512
        vg->charStyle().setBaselineOffset(qRound(pg->attribute("BASEO", "0").toDouble() * 10));
1513
        vg->charStyle().setTracking(qRound(pg->attribute("KERN", "0").toDouble() * 10));
5641 cbradney 1514
        vg->tabValues().clear();
1515
        if ((pg->hasAttribute("NUMTAB")) && (pg->attribute("NUMTAB", "0").toInt() != 0))
1516
        {
1517
                ParagraphStyle::TabRecord tb;
1518
                QString tmp = pg->attribute("TABS");
1519
                QTextStream tgv(&tmp, IO_ReadOnly);
1520
                vg->tabValues().clear();
1521
                for (int cxv = 0; cxv < pg->attribute("NUMTAB", "0").toInt(); cxv += 2)
1522
                {
1523
                        tgv >> xf;
1524
                        tgv >> xf2;
1525
                        tb.tabPosition = xf2;
1526
                        tb.tabType = static_cast<int>(xf);
1527
                        tb.tabFillChar = QChar();
1528
                        vg->tabValues().append(tb);
1529
                }
1530
                tmp = "";
1531
        }
1532
        else
1533
        {
1534
                QDomNode IT = pg->firstChild();
1535
                while(!IT.isNull())
1536
                {
1537
                        QDomElement it = IT.toElement();
1538
                        if (it.tagName()=="Tabs")
1539
                        {
1540
                                ParagraphStyle::TabRecord tb;
1541
                                tb.tabPosition = it.attribute("Pos").toDouble();
1542
                                tb.tabType = it.attribute("Type").toInt();
1543
                                QString tbCh = "";
1544
                                tbCh = it.attribute("Fill","");
1545
                                if (tbCh.isEmpty())
1546
                                        tb.tabFillChar = QChar();
1547
                                else
1548
                                        tb.tabFillChar = tbCh[0];
1549
                                vg->tabValues().append(tb);
1550
                        }
1551
                        IT=IT.nextSibling();
1552
                }
1553
        }
1554
        for (uint xx=0; xx<docParagraphStyles.count(); ++xx)
1555
        {
1556
                if (vg->name() == docParagraphStyles[xx].name())
1557
                {
1558
                        //Compare the attributes of the pasted styles vs existing ones
1559
                        if (vg->equiv(docParagraphStyles[xx]))
1560
                        {
1561
                                if (fl)
1562
                                {
1563
                                        DoVorl[VorlC] = tmV.setNum(xx);
1564
                                        VorlC++;
1565
                                }
1566
                                fou = true;
1567
                        }
1568
                        else
1569
                        {
1570
                                vg->setName("Copy of "+docParagraphStyles[xx].name());
1571
                                fou = false;
1572
                        }
1573
                        break;
1574
                }
1575
        }
1576
        if (!fou)
1577
        {
1578
                for (uint xx=0; xx< docParagraphStyles.count(); ++xx)
1579
                {
1580
                        if (vg->equiv(docParagraphStyles[xx]))
1581
                        {
1582
                                vg->setName(docParagraphStyles[xx].name());
1583
                                fou = true;
1584
                                if (fl)
1585
                                {
1586
                                        DoVorl[VorlC] = tmV.setNum(xx);
1587
                                        VorlC++;
1588
                                }
1589
                                break;
1590
                        }
1591
                }
1592
        }
1593
        if (!fou)
1594
        {
1595
                docParagraphStyles.append(*vg);
1596
                if (fl)
1597
                {
1598
                        DoVorl[VorlC] = tmV.setNum(docParagraphStyles.count()-1);
1599
                        VorlC++;
1600
                }
1601
        }
1602
}
1603
 
1604
QString Scribus12Format::AskForFont(SCFonts &avail, QString fStr, ScribusDoc *doc)
1605
{
1606
        PrefsManager *prefsManager=PrefsManager::instance();
1607
//      QFont fo;
1608
        QString tmpf = fStr;
1609
        if ((!avail.find(tmpf)) || (!avail[tmpf]->usable()))
1610
        {
1611
                if ((!prefsManager->appPrefs.GFontSub.contains(tmpf)) || (!avail[prefsManager->appPrefs.GFontSub[tmpf]]->usable()))
1612
                {
1613
                        qApp->setOverrideCursor(QCursor(arrowCursor), true);
1614
                        MissingFont *dia = new MissingFont(0, tmpf, doc);
1615
                        dia->exec();
1616
                        tmpf = dia->getReplacementFont();
1617
                        delete dia;
1618
                        qApp->setOverrideCursor(QCursor(waitCursor), true);
1619
                        prefsManager->appPrefs.GFontSub[fStr] = tmpf;
1620
                }
1621
                else
1622
                        tmpf = prefsManager->appPrefs.GFontSub[tmpf];
1623
                ReplacedFonts[fStr] = tmpf;
1624
        }
1625
        if (!doc->UsedFonts.contains(tmpf))
1626
        {
1627
//              fo = avail[tmpf]->Font;
1628
//              fo.setPointSize(qRound(doc->toolSettings.defSize / 10.0));
1629
                doc->AddFont(tmpf);
1630
        }
1631
        DoFonts[fStr] = tmpf;
1632
        return tmpf;
1633
}
1634
 
1635
bool Scribus12Format::readStyles(const QString& fileName, ScribusDoc* doc, QValueList<ParagraphStyle> &docParagraphStyles)
1636
{
1637
        ParagraphStyle vg;
1638
        QDomDocument docu("scridoc");
1639
        QString tmpf, tmf;
1640
        DoFonts.clear();
1641
        QString f (readSLA(fileName));
1642
        if (f.isEmpty())
1643
                return false;
1644
        if(!docu.setContent(f))
1645
                return false;
1646
        QDomElement elem=docu.documentElement();
1647
        if ((elem.tagName() != "SCRIBUS") && (elem.tagName() != "SCRIBUSUTF8"))
1648
                return false;
1649
        QDomNode DOC=elem.firstChild();
1650
        while(!DOC.isNull())
1651
        {
1652
                QDomElement dc=DOC.toElement();
1653
                QDomNode PAGE=DOC.firstChild();
1654
                while(!PAGE.isNull())
1655
                {
1656
                        QDomElement pg=PAGE.toElement();
1657
                        if(pg.tagName()=="STYLE")
1658
                                GetStyle(&pg, &vg, docParagraphStyles, doc, false);
1659
                        PAGE=PAGE.nextSibling();
1660
                }
1661
                DOC=DOC.nextSibling();
1662
        }
1663
        return true;
1664
}
1665
 
1666
bool Scribus12Format::readLineStyles(const QString& fileName, QMap<QString,multiLine> *Sty)
1667
{
1668
        QDomDocument docu("scridoc");
1669
        QString f(readSLA(fileName));
1670
        if (f.isEmpty())
1671
                return false;
1672
        if(!docu.setContent(f))
1673
                return false;
1674
        QDomElement elem=docu.documentElement();
1675
        if ((elem.tagName() != "SCRIBUS") && (elem.tagName() != "SCRIBUSUTF8"))
1676
                return false;
1677
        QDomNode DOC=elem.firstChild();
1678
        while(!DOC.isNull())
1679
        {
1680
                QDomElement dc=DOC.toElement();
1681
                QDomNode PAGE=DOC.firstChild();
1682
                while(!PAGE.isNull())
1683
                {
1684
                        QDomElement pg=PAGE.toElement();
1685
                        if(pg.tagName()=="MultiLine")
1686
                        {
1687
                                multiLine ml;
1688
                                QDomNode MuLn = PAGE.firstChild();
1689
                                while(!MuLn.isNull())
1690
                                {
1691
                                        QDomElement MuL = MuLn.toElement();
1692
                                        struct SingleLine sl;
1693
                                        sl.Color = MuL.attribute("Color");
1694
                                        sl.Dash = MuL.attribute("Dash").toInt();
1695
                                        sl.LineEnd = MuL.attribute("LineEnd").toInt();
1696
                                        sl.LineJoin = MuL.attribute("LineJoin").toInt();
1697
                                        sl.Shade = MuL.attribute("Shade").toInt();
1698
                                        sl.Width = MuL.attribute("Width").toDouble();
1699
                                        ml.push_back(sl);
1700
                                        MuLn = MuLn.nextSibling();
1701
                                }
1702
                                QString Nam = pg.attribute("Name");
1703
                                QString Nam2 = Nam;
1704
                                int copyC = 1;
1705
                                while (Sty->contains(Nam2))
1706
                                {
1707
                                        Nam2 = tr("Copy #%1 of ").arg(copyC)+Nam;
1708
                                        copyC++;
1709
                                }
1710
                                Sty->insert(Nam2, ml);
1711
                        }
1712
                        PAGE=PAGE.nextSibling();
1713
                }
1714
                DOC=DOC.nextSibling();
1715
        }
1716
        return true;
1717
}
1718
 
1719
 
1720
bool Scribus12Format::readColors(const QString& fileName, ColorList & colors)
1721
{
1722
        QString f(readSLA(fileName));
1723
        if (f.isEmpty())
1724
                return false;
1725
        QDomDocument docu("scridoc");
1726
        if(!docu.setContent(f))
1727
                return false;
1728
        colors.clear();
1729
        ScColor lf = ScColor();
1730
        QDomElement elem=docu.documentElement();
1731
        if ((elem.tagName() != "SCRIBUS") && (elem.tagName() != "SCRIBUSUTF8"))
1732
                return false;
1733
        QDomNode DOC=elem.firstChild();
1734
        while(!DOC.isNull())
1735
        {
1736
                QDomElement dc=DOC.toElement();
1737
                QDomNode PAGE=DOC.firstChild();
1738
                while(!PAGE.isNull())
1739
                {
1740
                        QDomElement pg=PAGE.toElement();
1741
                        // 10/25/2004 pv - None is "reserved" color. cannot be defined in any file...
1742
                        if(pg.tagName()=="COLOR" && pg.attribute("NAME")!=CommonStrings::None)
1743
                        {
1744
                                if (pg.hasAttribute("CMYK"))
1745
                                        lf.setNamedColor(pg.attribute("CMYK"));
1746
                                else
1747
                                        lf.fromQColor(QColor(pg.attribute("RGB")));
1748
                                if (pg.hasAttribute("Spot"))
1749
                                        lf.setSpotColor(static_cast<bool>(pg.attribute("Spot").toInt()));
1750
                                else
1751
                                        lf.setSpotColor(false);
1752
                                if (pg.hasAttribute("Register"))
1753
                                        lf.setRegistrationColor(static_cast<bool>(pg.attribute("Register").toInt()));
1754
                                else
1755
                                        lf.setRegistrationColor(false);
5880 jghali 1756
                                colors.insert(pg.attribute("NAME"), lf);
5641 cbradney 1757
                        }
1758
                        PAGE=PAGE.nextSibling();
1759
                }
1760
                DOC=DOC.nextSibling();
1761
        }
1762
        return true;
1763
}
1764
 
1765
bool Scribus12Format::readPageCount(const QString& fileName, int *num1, int *num2, QStringList & masterPageNames)
1766
{
1767
        QString PgNam;
1768
        int counter = 0;
1769
        int counter2 = 0;
1770
        QDomDocument docu("scridoc");
1771
        QString f(readSLA(fileName));
1772
        if (f.isEmpty())
1773
                return false;
1774
        if(!docu.setContent(f))
1775
                return false;
1776
        QDomElement elem=docu.documentElement();
1777
        if ((elem.tagName() != "SCRIBUS") && (elem.tagName() != "SCRIBUSUTF8"))
1778
                return false;
1779
        QDomNode DOC=elem.firstChild();
1780
        while(!DOC.isNull())
1781
        {
1782
                QDomNode PAGE=DOC.firstChild();
1783
                while(!PAGE.isNull())
1784
                {
1785
                        QDomElement pg=PAGE.toElement();
1786
                        if(pg.tagName()=="PAGE")
1787
                        {
1788
                                PgNam = pg.attribute("NAM", "");
1789
                                if (PgNam.isEmpty())
1790
                                        counter++;
1791
                                else
1792
                                {
1793
                                        counter2++;
1794
                                        masterPageNames.append(PgNam);
1795
                                }
1796
                        }
1797
                        PAGE=PAGE.nextSibling();
1798
                }
1799
                DOC=DOC.nextSibling();
1800
        }
1801
        *num1 = counter;
1802
        *num2 = counter2;
1803
        return true;
1804
}