Scribus Developer Documentation - API
logo-pen

Scribus Developer Documentation - API

scribus134format_save.cpp

Go to the documentation of this file.
00001 /*
00002 For general Scribus (>=1.3.2) copyright and licensing information please refer
00003 to the COPYING file provided with the program. Following this notice may exist
00004 a copyright and/or license notice that predates the release of Scribus 1.3.2
00005 for which a new license (GPL+exception) is in place.
00006 */
00007 #include "scribus134format.h"
00008 #include "scribus134formatimpl.h"
00009 
00010 #include "../../formatidlist.h"
00011 #include "commonstrings.h"
00012 #include "missing.h"
00013 #include "prefsmanager.h"
00014 #include "scconfig.h"
00015 #include "scpattern.h"
00016 #include "scribusdoc.h"
00017 #include "scribusview.h"
00018 #include "hyphenator.h"
00019 #include "pageitem_latexframe.h"
00020 
00021 #include "units.h"
00022 #include "util.h"
00023 #include "util_math.h"
00024 #include "util_color.h"
00025 #include "scgzfile.h"
00026 #include "scpattern.h"
00027 #include <QCursor>
00028 #include <QFileInfo>
00029 #include <QList>
00030 #include <QDataStream>
00031 
00032 
00033 bool Scribus134Format::saveFile(const QString & fileName, const FileFormat & /* fmt */)
00034 {
00035     QString text, tf, tf2, tc, tc2;
00036     QString fileDir = QFileInfo(fileName).absolutePath();
00037     m_lastSavedFile = "";
00038     QDomDocument docu("scribus");
00039     QString st="<SCRIBUSUTF8NEW></SCRIBUSUTF8NEW>";
00040     docu.setContent(st);
00041     QDomElement elem=docu.documentElement();
00042     elem.setAttribute("Version", QString(VERSION));
00043     QDomElement dc=docu.createElement("DOCUMENT");
00044     dc.setAttribute("ANZPAGES",m_Doc->DocPages.count());
00045     dc.setAttribute("PAGEWIDTH",m_Doc->pageWidth);
00046     dc.setAttribute("PAGEHEIGHT",m_Doc->pageHeight);
00047     dc.setAttribute("BORDERLEFT",m_Doc->pageMargins.Left);
00048     dc.setAttribute("BORDERRIGHT",m_Doc->pageMargins.Right);
00049     dc.setAttribute("BORDERTOP",m_Doc->pageMargins.Top);
00050     dc.setAttribute("BORDERBOTTOM",m_Doc->pageMargins.Bottom);
00051     dc.setAttribute("BleedTop", m_Doc->bleeds.Top);
00052     dc.setAttribute("BleedLeft", m_Doc->bleeds.Left);
00053     dc.setAttribute("BleedRight", m_Doc->bleeds.Right);
00054     dc.setAttribute("BleedBottom", m_Doc->bleeds.Bottom);
00055     dc.setAttribute("ORIENTATION",m_Doc->PageOri);
00056     dc.setAttribute("PAGESIZE",m_Doc->m_pageSize);
00057     dc.setAttribute("FIRSTNUM",m_Doc->FirstPnum);
00058     dc.setAttribute("BOOK", m_Doc->currentPageLayout);
00059     if(m_Doc->usesAutomaticTextFrames())
00060         dc.setAttribute("AUTOTEXT",1);
00061     dc.setAttribute("AUTOSPALTEN",m_Doc->PageSp);
00062     dc.setAttribute("ABSTSPALTEN",m_Doc->PageSpa);
00063     dc.setAttribute("UNITS",m_Doc->unitIndex());
00064     dc.setAttribute("DFONT",m_Doc->toolSettings.defFont);
00065     dc.setAttribute("DSIZE",m_Doc->toolSettings.defSize / 10.0);
00066     dc.setAttribute("DCOL",m_Doc->toolSettings.dCols);
00067     dc.setAttribute("DGAP",m_Doc->toolSettings.dGap);
00068     dc.setAttribute("TabFill",m_Doc->toolSettings.tabFillChar);
00069     dc.setAttribute("TabWidth",m_Doc->toolSettings.dTabWidth);
00070     dc.setAttribute("AUTHOR",m_Doc->documentInfo.getAuthor());
00071     dc.setAttribute("COMMENTS",m_Doc->documentInfo.getComments());
00072     dc.setAttribute("KEYWORDS",m_Doc->documentInfo.getKeywords());
00073     dc.setAttribute("PUBLISHER",m_Doc->documentInfo.getPublisher());
00074     dc.setAttribute("DOCDATE",m_Doc->documentInfo.getDate());
00075     dc.setAttribute("DOCTYPE",m_Doc->documentInfo.getType());
00076     dc.setAttribute("DOCFORMAT",m_Doc->documentInfo.getFormat());
00077     dc.setAttribute("DOCIDENT",m_Doc->documentInfo.getIdent());
00078     dc.setAttribute("DOCSOURCE",m_Doc->documentInfo.getSource());
00079     dc.setAttribute("DOCLANGINFO",m_Doc->documentInfo.getLangInfo());
00080     dc.setAttribute("DOCRELATION",m_Doc->documentInfo.getRelation());
00081     dc.setAttribute("DOCCOVER",m_Doc->documentInfo.getCover());
00082     dc.setAttribute("DOCRIGHTS",m_Doc->documentInfo.getRights());
00083     dc.setAttribute("DOCCONTRIB",m_Doc->documentInfo.getContrib());
00084     dc.setAttribute("TITLE",m_Doc->documentInfo.getTitle());
00085     dc.setAttribute("VHOCH",m_Doc->typographicSettings.valueSuperScript);
00086     dc.setAttribute("VHOCHSC",m_Doc->typographicSettings.scalingSuperScript);
00087     dc.setAttribute("VTIEF",m_Doc->typographicSettings.valueSubScript);
00088     dc.setAttribute("VTIEFSC",m_Doc->typographicSettings.scalingSubScript);
00089     dc.setAttribute("VKAPIT",m_Doc->typographicSettings.valueSmallCaps);
00090     dc.setAttribute("BASEGRID",m_Doc->typographicSettings.valueBaseGrid);
00091     dc.setAttribute("BASEO", m_Doc->typographicSettings.offsetBaseGrid);
00092     dc.setAttribute("AUTOL", m_Doc->typographicSettings.autoLineSpacing);
00093     dc.setAttribute("UnderlinePos", m_Doc->typographicSettings.valueUnderlinePos);
00094     dc.setAttribute("UnderlineWidth", m_Doc->typographicSettings.valueUnderlineWidth);
00095     dc.setAttribute("StrikeThruPos", m_Doc->typographicSettings.valueStrikeThruPos);
00096     dc.setAttribute("StrikeThruWidth", m_Doc->typographicSettings.valueStrikeThruWidth);
00097     dc.setAttribute("GROUPC",m_Doc->GroupCounter);
00098     dc.setAttribute("HCMS", static_cast<int>(m_Doc->HasCMS));
00099     dc.setAttribute("DPSo", static_cast<int>(m_Doc->CMSSettings.SoftProofOn));
00100     dc.setAttribute("DPSFo", static_cast<int>(m_Doc->CMSSettings.SoftProofFullOn));
00101     dc.setAttribute("DPuse", static_cast<int>(m_Doc->CMSSettings.CMSinUse));
00102     dc.setAttribute("DPgam", static_cast<int>(m_Doc->CMSSettings.GamutCheck));
00103     dc.setAttribute("DPbla", static_cast<int>(m_Doc->CMSSettings.BlackPoint));
00104     dc.setAttribute("DPMo",m_Doc->CMSSettings.DefaultMonitorProfile);
00105     dc.setAttribute("DPPr",m_Doc->CMSSettings.DefaultPrinterProfile);
00106     dc.setAttribute("DPIn",m_Doc->CMSSettings.DefaultImageRGBProfile);
00107     dc.setAttribute("DPInCMYK",m_Doc->CMSSettings.DefaultImageCMYKProfile);
00108     dc.setAttribute("DPIn2",m_Doc->CMSSettings.DefaultSolidColorRGBProfile);
00109     dc.setAttribute("DPIn3",m_Doc->CMSSettings.DefaultSolidColorCMYKProfile);
00110     dc.setAttribute("DISc",m_Doc->CMSSettings.DefaultIntentColors);
00111     dc.setAttribute("DIIm",m_Doc->CMSSettings.DefaultIntentImages);
00112     dc.setAttribute("ALAYER", m_Doc->activeLayer());
00113     dc.setAttribute("LANGUAGE", m_Doc->Language);
00114     dc.setAttribute("MINWORDLEN", m_Doc->MinWordLen);
00115     dc.setAttribute("HYCOUNT", m_Doc->HyCount);
00116     dc.setAttribute("AUTOMATIC", static_cast<int>(m_Doc->Automatic));
00117     dc.setAttribute("AUTOCHECK", static_cast<int>(m_Doc->AutoCheck));
00118     dc.setAttribute("GUIDELOCK", static_cast<int>(m_Doc->GuideLock));
00119     dc.setAttribute("SnapToGuides", static_cast<int>(m_Doc->SnapGuides));
00120     dc.setAttribute("SnapToGrid", static_cast<int>(m_Doc->useRaster));
00121     dc.setAttribute("MINGRID", m_Doc->guidesSettings.minorGrid);
00122     dc.setAttribute("MAJGRID", m_Doc->guidesSettings.majorGrid);
00123     dc.setAttribute("SHOWGRID", static_cast<int>(m_Doc->guidesSettings.gridShown));
00124     dc.setAttribute("SHOWGUIDES", static_cast<int>(m_Doc->guidesSettings.guidesShown));
00125     dc.setAttribute("showcolborders", static_cast<int>(m_Doc->guidesSettings.colBordersShown));
00126     dc.setAttribute("SHOWFRAME", static_cast<int>(m_Doc->guidesSettings.framesShown));
00127     dc.setAttribute("SHOWLAYERM", static_cast<int>(m_Doc->guidesSettings.layerMarkersShown));
00128     dc.setAttribute("SHOWMARGIN", static_cast<int>(m_Doc->guidesSettings.marginsShown));
00129     dc.setAttribute("SHOWBASE", static_cast<int>(m_Doc->guidesSettings.baseShown));
00130     dc.setAttribute("SHOWPICT", static_cast<int>(m_Doc->guidesSettings.showPic));
00131     dc.setAttribute("SHOWControl", static_cast<int>(m_Doc->guidesSettings.showControls));
00132     dc.setAttribute("SHOWLINK", static_cast<int>(m_Doc->guidesSettings.linkShown));
00133     dc.setAttribute("rulerMode", static_cast<int>(m_Doc->guidesSettings.rulerMode));
00134     dc.setAttribute("showrulers", static_cast<int>(m_Doc->guidesSettings.rulersShown));
00135     dc.setAttribute("showBleed", static_cast<int>(m_Doc->guidesSettings.showBleed));
00136     dc.setAttribute("rulerXoffset", m_Doc->rulerXoffset);
00137     dc.setAttribute("rulerYoffset", m_Doc->rulerYoffset);
00138     dc.setAttribute("GuideRad", m_Doc->guidesSettings.guideRad);
00139     dc.setAttribute("GRAB",m_Doc->guidesSettings.grabRad);
00140     dc.setAttribute("POLYC", m_Doc->toolSettings.polyC);
00141     dc.setAttribute("POLYF", m_Doc->toolSettings.polyF);
00142     dc.setAttribute("POLYR", m_Doc->toolSettings.polyR);
00143     dc.setAttribute("POLYFD", m_Doc->toolSettings.polyFd);
00144     dc.setAttribute("POLYS", static_cast<int>(m_Doc->toolSettings.polyS));
00145     dc.setAttribute("AutoSave", static_cast<int>(m_Doc->AutoSave));
00146     dc.setAttribute("AutoSaveTime", m_Doc->AutoSaveTime);
00147     dc.setAttribute("ScratchBottom", m_Doc->scratch.Bottom);
00148     dc.setAttribute("ScratchLeft", m_Doc->scratch.Left);
00149     dc.setAttribute("ScratchRight", m_Doc->scratch.Right);
00150     dc.setAttribute("ScratchTop", m_Doc->scratch.Top);
00151     dc.setAttribute("GapHorizontal", m_Doc->GapHorizontal);
00152     dc.setAttribute("GapVertical", m_Doc->GapVertical);
00153     dc.setAttribute("StartArrow", m_Doc->toolSettings.dStartArrow);
00154     dc.setAttribute("EndArrow", m_Doc->toolSettings.dEndArrow);
00155     dc.setAttribute("PEN",m_Doc->toolSettings.dPen);
00156     dc.setAttribute("BRUSH",m_Doc->toolSettings.dBrush);
00157     dc.setAttribute("PENLINE",m_Doc->toolSettings.dPenLine);
00158     dc.setAttribute("PENTEXT",m_Doc->toolSettings.dPenText);
00159     dc.setAttribute("StrokeText",m_Doc->toolSettings.dStrokeText);
00160     dc.setAttribute("TextBackGround", m_Doc->toolSettings.dTextBackGround);
00161     dc.setAttribute("TextLineColor", m_Doc->toolSettings.dTextLineColor);
00162     dc.setAttribute("TextBackGroundShade", m_Doc->toolSettings.dTextBackGroundShade);
00163     dc.setAttribute("TextLineShade", m_Doc->toolSettings.dTextLineShade);
00164     dc.setAttribute("TextPenShade", m_Doc->toolSettings.dTextPenShade);
00165     dc.setAttribute("TextStrokeShade", m_Doc->toolSettings.dTextStrokeShade);
00166     dc.setAttribute("STIL",m_Doc->toolSettings.dLineArt);
00167     dc.setAttribute("STILLINE",m_Doc->toolSettings.dLstyleLine);
00168     dc.setAttribute("WIDTH",m_Doc->toolSettings.dWidth);
00169     dc.setAttribute("WIDTHLINE",m_Doc->toolSettings.dWidthLine);
00170     dc.setAttribute("PENSHADE",m_Doc->toolSettings.dShade2);
00171     dc.setAttribute("LINESHADE",m_Doc->toolSettings.dShadeLine);
00172     dc.setAttribute("BRUSHSHADE",m_Doc->toolSettings.dShade);
00173     dc.setAttribute("MAGMIN",m_Doc->toolSettings.magMin);
00174     dc.setAttribute("MAGMAX",m_Doc->toolSettings.magMax);
00175     dc.setAttribute("MAGSTEP",m_Doc->toolSettings.magStep);
00176     dc.setAttribute("CPICT",m_Doc->toolSettings.dBrushPict);
00177     dc.setAttribute("PICTSHADE",m_Doc->toolSettings.shadePict);
00178     dc.setAttribute("PICTSCX",m_Doc->toolSettings.scaleX);
00179     dc.setAttribute("PICTSCY",m_Doc->toolSettings.scaleY);
00180     dc.setAttribute("PSCALE", static_cast<int>(m_Doc->toolSettings.scaleType));
00181     dc.setAttribute("PASPECT", static_cast<int>(m_Doc->toolSettings.aspectRatio));
00182     dc.setAttribute("EmbeddedPath", static_cast<int>(m_Doc->toolSettings.useEmbeddedPath));
00183     dc.setAttribute("HalfRes", m_Doc->toolSettings.lowResType);
00184     dc.setAttribute("dispX", m_Doc->toolSettings.dispX);
00185     dc.setAttribute("dispY", m_Doc->toolSettings.dispY);
00186     dc.setAttribute("constrain", m_Doc->toolSettings.constrain);
00187     dc.setAttribute("MINORC",m_Doc->guidesSettings.minorColor.name());
00188     dc.setAttribute("MAJORC",m_Doc->guidesSettings.majorColor.name());
00189     dc.setAttribute("GuideC", m_Doc->guidesSettings.guideColor.name());
00190     dc.setAttribute("BaseC", m_Doc->guidesSettings.baseColor.name());
00191     dc.setAttribute("GuideZ", m_Doc->guidesSettings.guideRad);
00192     dc.setAttribute("BACKG", static_cast<int>(m_Doc->guidesSettings.before));
00193     dc.setAttribute("PAGEC",m_Doc->papColor.name());
00194     dc.setAttribute("MARGC",m_Doc->guidesSettings.margColor.name());
00195     dc.setAttribute("RANDF", static_cast<int>(m_Doc->marginColored));
00196     dc.setAttribute("currentProfile", m_Doc->curCheckProfile);
00197     elem.appendChild(dc);
00198     writeCheckerProfiles(docu);
00199     writeLinestyles(docu);
00200     writeJavascripts(docu);
00201     writeBookmarks(docu);
00202     writeColors(docu);
00203     writeHyphenatorLists(docu);
00204     writePStyles(docu);
00205     writeCStyles(docu);
00206     writeLayers(docu);
00207     writePrintOptions(docu);
00208     writePdfOptions(docu);
00209     writeDocItemAttributes(docu);
00210     writeTOC(docu);
00211     writePageSets(docu);
00212     writeSections(docu);
00213     writePatterns(docu, fileDir);
00214     writeContent (docu, fileDir);
00215     
00223     // Create a random temporary file name
00224     srand(time(NULL)); // initialize random sequence each time
00225     long     randt = 0, randn = 1 + (int) (((double) rand() / ((double) RAND_MAX + 1)) * 10000);
00226     QString  tmpFileName  = QString("%1.%2").arg(fileName).arg(randn);
00227     while (QFile::exists(tmpFileName) && (randt < 100))
00228     {
00229         randn = 1 + (int) (((double) rand() / ((double) RAND_MAX + 1)) * 10000);
00230         tmpFileName = QString("%1.%2").arg(fileName).arg(randn);
00231         ++randt;
00232     }
00233     if (QFile::exists(tmpFileName))
00234         return false;
00235 
00236     bool   writeSucceed = false;
00237     static const char xmlpi[] = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n";
00238     QByteArray cs = docu.toByteArray(); // UTF-8 QCString
00239     if(fileName.right(2) == "gz")
00240     {
00241         ScGzFile gzf(tmpFileName, cs);
00242         writeSucceed = gzf.write(xmlpi);
00243     }
00244     else
00245     {
00246         QFile f(tmpFileName);
00247         if(f.open(QIODevice::WriteOnly))
00248         {
00249             QDataStream s(&f);
00250             int  xmlpilen = strlen(xmlpi);
00251             int  bytesWritten1 = s.writeRawData(xmlpi, xmlpilen);
00252             int  bytesWritten2 = s.writeRawData(cs, cs.length());
00253             bool writeSuccess1 = (bytesWritten1 > 0 && (bytesWritten1 == xmlpilen));
00254             bool writeSuccess2 = (bytesWritten2 > 0 && (bytesWritten2 == cs.length()));
00255             writeSucceed = (writeSuccess1 && writeSuccess2 && f.error() == QFile::NoError);
00256             f.close();
00257         }
00258     }
00259     if (writeSucceed)
00260     {
00261         if (QFile::exists(fileName))
00262             writeSucceed = QFile::remove(fileName) ? QFile::rename(tmpFileName, fileName) : false;
00263         else
00264             writeSucceed = QFile::rename(tmpFileName, fileName);
00265         m_lastSavedFile = writeSucceed ? fileName : tmpFileName;
00266     }
00267     else if (QFile::exists(tmpFileName))
00268         QFile::remove(tmpFileName);
00269     if (writeSucceed) 
00270         QFile::remove(tmpFileName);
00271     return writeSucceed;
00272 }
00273 
00274 void Scribus134Format::writeCheckerProfiles(QDomDocument & docu) 
00275 {
00276     QDomElement dc=docu.documentElement().firstChild().toElement();
00277 
00278     CheckerPrefsList::Iterator itcp;
00279     CheckerPrefsList::Iterator itcpend=m_Doc->checkerProfiles.end();
00280     for (itcp = m_Doc->checkerProfiles.begin(); itcp != itcpend; ++itcp)
00281     {
00282         QDomElement dc79a=docu.createElement("CheckProfile");
00283         dc79a.setAttribute("Name",itcp.key());
00284         dc79a.setAttribute("ignoreErrors", static_cast<int>(itcp.value().ignoreErrors));
00285         dc79a.setAttribute("autoCheck", static_cast<int>(itcp.value().autoCheck));
00286         dc79a.setAttribute("checkGlyphs", static_cast<int>(itcp.value().checkGlyphs));
00287         dc79a.setAttribute("checkOrphans", static_cast<int>(itcp.value().checkOrphans));
00288         dc79a.setAttribute("checkOverflow", static_cast<int>(itcp.value().checkOverflow));
00289         dc79a.setAttribute("checkPictures", static_cast<int>(itcp.value().checkPictures));
00290         dc79a.setAttribute("checkResolution", static_cast<int>(itcp.value().checkResolution));
00291         dc79a.setAttribute("checkTransparency", static_cast<int>(itcp.value().checkTransparency));
00292         dc79a.setAttribute("minResolution",itcp.value().minResolution);
00293         dc79a.setAttribute("maxResolution",itcp.value().maxResolution);
00294         dc79a.setAttribute("checkAnnotations", static_cast<int>(itcp.value().checkAnnotations));
00295         dc79a.setAttribute("checkRasterPDF", static_cast<int>(itcp.value().checkRasterPDF));
00296         dc79a.setAttribute("checkForGIF", static_cast<int>(itcp.value().checkForGIF));
00297         dc79a.setAttribute("ignoreOffLayers", static_cast<int>(itcp.value().ignoreOffLayers));
00298         dc.appendChild(dc79a);
00299     }
00300 }
00301 
00302 void Scribus134Format::writeLinestyles(QDomDocument & docu) 
00303 {
00304     QDomElement dc=docu.documentElement().firstChild().toElement();
00305 
00306     QMap<QString,multiLine>::Iterator itMU;
00307     for (itMU = m_Doc->MLineStyles.begin(); itMU != m_Doc->MLineStyles.end(); ++itMU)
00308     {
00309         QDomElement MuL=docu.createElement("MultiLine");
00310         MuL.setAttribute("Name",itMU.key());
00311         multiLine ml = itMU.value();
00312         multiLine::iterator itMU2;
00313         for (itMU2 = ml.begin(); itMU2 != ml.end(); ++itMU2)
00314         {
00315             QDomElement SuL=docu.createElement("SubLine");
00316             SuL.setAttribute("Color", (*itMU2).Color);
00317             SuL.setAttribute("Shade", (*itMU2).Shade);
00318             SuL.setAttribute("Dash", (*itMU2).Dash);
00319             SuL.setAttribute("LineEnd", (*itMU2).LineEnd);
00320             SuL.setAttribute("LineJoin", (*itMU2).LineJoin);
00321             SuL.setAttribute("Width", (*itMU2).Width);
00322             SuL.setAttribute("Shortcut", ml.shortcut);
00323             MuL.appendChild(SuL);
00324         }
00325         dc.appendChild(MuL);
00326     }
00327     QList<ArrowDesc>::Iterator itar;
00328     for (itar = m_Doc->arrowStyles.begin(); itar != m_Doc->arrowStyles.end(); ++itar)
00329     {
00330         if ((*itar).userArrow)
00331         {
00332             QDomElement ar=docu.createElement("Arrows");
00333             ar.setAttribute("NumPoints", (*itar).points.size());
00334             QString arp = "";
00335             QString tmp, tmpy;
00336             double xa, ya;
00337             for (uint nxx = 0; nxx < (*itar).points.size(); ++nxx)
00338             {
00339                 (*itar).points.point(nxx, &xa, &ya);
00340                 arp += tmp.setNum(xa) + " " + tmpy.setNum(ya) + " ";
00341             }
00342             ar.setAttribute("Points", arp);
00343             ar.setAttribute("Name", (*itar).name);
00344             dc.appendChild(ar);
00345         }
00346     }
00347 }
00348 
00349 
00350 void Scribus134Format::writeJavascripts(QDomDocument & docu) 
00351 {
00352     QDomElement dc=docu.documentElement().firstChild().toElement();
00353 
00354     QMap<QString,QString>::Iterator itja;
00355     for (itja = m_Doc->JavaScripts.begin(); itja != m_Doc->JavaScripts.end(); ++itja)
00356     {
00357         QDomElement jav=docu.createElement("JAVA");
00358         jav.setAttribute("NAME",itja.key());
00359         jav.setAttribute("SCRIPT",itja.value());
00360         dc.appendChild(jav);
00361     }
00362     
00363 }
00364 
00365 
00366 void Scribus134Format::writeBookmarks(QDomDocument & docu) 
00367 {   
00368     QDomElement dc=docu.documentElement().firstChild().toElement();
00369 
00370     QList<ScribusDoc::BookMa>::Iterator itbm;
00371     for (itbm = m_Doc->BookMarks.begin(); itbm != m_Doc->BookMarks.end(); ++itbm)
00372     {
00373         QDomElement fn=docu.createElement("Bookmark");
00374         fn.setAttribute("Title",(*itbm).Title);
00375         fn.setAttribute("Text",(*itbm).Text);
00376         fn.setAttribute("Aktion",(*itbm).Aktion);
00377         fn.setAttribute("ItemNr", (*itbm).ItemNr);
00378         fn.setAttribute("Element", (*itbm).PageObject->ItemNr);
00379         fn.setAttribute("First", (*itbm).First);
00380         fn.setAttribute("Last", (*itbm).Last);
00381         fn.setAttribute("Prev", (*itbm).Prev);
00382         fn.setAttribute("Next", (*itbm).Next);
00383         fn.setAttribute("Parent", (*itbm).Parent);
00384         dc.appendChild(fn);
00385     }
00386 }
00387 
00388 
00389 void Scribus134Format::writeColors(QDomDocument & docu) 
00390 {   
00391     QDomElement dc=docu.documentElement().firstChild().toElement();
00392 
00393     ColorList::Iterator itc;
00394     for (itc = m_Doc->PageColors.begin(); itc != m_Doc->PageColors.end(); ++itc)
00395     {
00396         QDomElement co=docu.createElement("COLOR");
00397         co.setAttribute("NAME",itc.key());
00398         if (m_Doc->PageColors[itc.key()].getColorModel() == colorModelRGB)
00399             co.setAttribute("RGB",m_Doc->PageColors[itc.key()].nameRGB());
00400         else
00401             co.setAttribute("CMYK",m_Doc->PageColors[itc.key()].nameCMYK());
00402         co.setAttribute("Spot",static_cast<int>(m_Doc->PageColors[itc.key()].isSpotColor()));
00403         co.setAttribute("Register",static_cast<int>(m_Doc->PageColors[itc.key()].isRegistrationColor()));
00404         dc.appendChild(co);
00405     }
00406     
00407 }
00408 
00409 void Scribus134Format::writeHyphenatorLists(QDomDocument &docu)
00410 {
00411     QDomElement dc=docu.documentElement().firstChild().toElement();
00412     QDomElement rde = docu.createElement("HYPHEN");
00413     for (QHash<QString, QString>::Iterator hyit = m_Doc->docHyphenator->specialWords.begin(); hyit != m_Doc->docHyphenator->specialWords.end(); ++hyit)
00414     {
00415         QDomElement hyelm = docu.createElement("EXCEPTION");
00416         hyelm.setAttribute("WORD", hyit.key());
00417         hyelm.setAttribute("HYPHENATED", hyit.value());
00418         rde.appendChild(hyelm);
00419     }
00420     for (QSet<QString>::Iterator hyit2 = m_Doc->docHyphenator->ignoredWords.begin(); hyit2 != m_Doc->docHyphenator->ignoredWords.end(); ++hyit2)
00421     {
00422         QDomElement hyelm2 = docu.createElement("IGNORE");
00423         hyelm2.setAttribute("WORD", (*hyit2));
00424         rde.appendChild(hyelm2);
00425     }
00426     dc.appendChild(rde);
00427 }
00428 
00429 void Scribus134Format::writePStyles(QDomDocument & docu) 
00430 {
00431     QDomElement dc=docu.documentElement().firstChild().toElement();
00432 
00433     //  if (m_Doc->docParagraphStyles.count() > 5)
00434     {
00435         for (int ff = 0; ff < m_Doc->paragraphStyles().count(); ++ff)
00436         {
00437             QDomElement fo=docu.createElement("STYLE");
00438             putPStyle(docu, fo, m_Doc->paragraphStyles()[ff]);
00439             dc.appendChild(fo);
00440         }
00441     }
00442 }
00443 
00444 void Scribus134Format::putPStyle(QDomDocument & docu, QDomElement & fo, const ParagraphStyle & style)
00445 {
00446     if ( ! style.name().isEmpty() )
00447         fo.setAttribute("NAME", style.name());
00448     if ( ! style.parent().isEmpty())
00449         fo.setAttribute("PARENT", style.parent());
00450     
00451     if ( ! style.isInhAlignment())
00452         fo.setAttribute("ALIGN", style.alignment());
00453     if ( ! style.isInhLineSpacingMode())
00454         fo.setAttribute("LINESPMode", style.lineSpacingMode());
00455     if ( ! style.isInhLineSpacing())
00456         fo.setAttribute("LINESP", style.lineSpacing());
00457     if ( ! style.isInhLeftMargin())
00458         fo.setAttribute("INDENT", style.leftMargin());
00459     if ( ! style.isInhRightMargin())
00460         fo.setAttribute("RMARGIN", style.rightMargin());
00461     if ( ! style.isInhFirstIndent())
00462         fo.setAttribute("FIRST", style.firstIndent());
00463     if ( ! style.isInhGapBefore())
00464         fo.setAttribute("VOR", style.gapBefore());
00465     if ( ! style.isInhGapAfter())
00466         fo.setAttribute("NACH", style.gapAfter());
00467     if ( ! style.isInhHasDropCap())
00468         fo.setAttribute("DROP", static_cast<int>(style.hasDropCap()));
00469     if ( ! style.isInhDropCapLines())
00470         fo.setAttribute("DROPLIN", style.dropCapLines());
00471     if ( ! style.isInhDropCapOffset())
00472         fo.setAttribute("DROPDIST", style.dropCapOffset());
00473     if ( ! style.isInhOpticalMargins())
00474         fo.setAttribute("OpticalMargins", style.opticalMargins());
00475     if ( ! style.isInhHyphenationMode())
00476         fo.setAttribute("HyphenationMode", style.hyphenationMode());
00477     if ( ! style.isInhMinWordTracking())
00478         fo.setAttribute("MinWordTrack", style.minWordTracking());
00479     if ( ! style.isInhMinGlyphExtension())
00480         fo.setAttribute("MinGlyphShrink", style.minGlyphExtension());
00481     if ( ! style.isInhMaxGlyphExtension())
00482         fo.setAttribute("MaxGlyphExtend", style.maxGlyphExtension());
00483 
00484     if ( ! style.isInhTabValues())
00485     {
00486         for (int a = 0; a < style.tabValues().count(); ++a)
00487         {
00488             QDomElement tabs = docu.createElement("Tabs");
00489             tabs.setAttribute("Type", (style.tabValues().at(a)).tabType);
00490             tabs.setAttribute("Pos", (style.tabValues().at(a)).tabPosition);
00491             QString tabCh = "";
00492             if (!(style.tabValues().at(a)).tabFillChar.isNull())
00493                 tabCh = QString((style.tabValues().at(a)).tabFillChar);
00494             tabs.setAttribute("Fill", tabCh);
00495             fo.appendChild(tabs);
00496         }
00497     }
00498     if ( ! style.shortcut().isEmpty() )
00499         fo.setAttribute("PSHORTCUT", style.shortcut()); // shortcuts won't be inherited
00500     
00501     putCStyle(docu, fo, style.charStyle());
00502 
00503 }
00504 
00505 
00506 void Scribus134Format::writeCStyles(QDomDocument & docu) 
00507 {
00508     QDomElement dc=docu.documentElement().firstChild().toElement();
00509     
00510     for (int ff = 0; ff < m_Doc->charStyles().count(); ++ff)
00511     {
00512         QDomElement fo=docu.createElement("CHARSTYLE");
00513         putCStyle(docu, fo, m_Doc->charStyles()[ff]);
00514         dc.appendChild(fo);
00515     }
00516 }
00517 
00518 void Scribus134Format::putCStyle(QDomDocument & docu, QDomElement & fo, const CharStyle & style)
00519 {
00520     if ( ! style.name().isEmpty() )
00521         fo.setAttribute("CNAME", style.name());
00522     if ( ! style.parent().isEmpty() )
00523         fo.setAttribute("CPARENT", style.parent());
00524     if ( ! style.isInhFont())   
00525         fo.setAttribute("FONT", style.font().scName());
00526     if ( ! style.isInhFontSize())
00527         fo.setAttribute("FONTSIZE", style.fontSize() / 10.0);
00528     if ( ! style.isInhFeatures())
00529         fo.setAttribute("FEATURES", style.features().join(" "));
00530     if ( ! style.isInhFillColor())
00531         fo.setAttribute("FCOLOR", style.fillColor());
00532     if ( ! style.isInhFillShade())
00533         fo.setAttribute("FSHADE", style.fillShade());
00534     if ( ! style.isInhStrokeColor())
00535         fo.setAttribute("SCOLOR", style.strokeColor());
00536     if ( ! style.isInhStrokeShade())
00537         fo.setAttribute("SSHADE", style.strokeShade());
00538     if ( ! style.isInhShadowXOffset())
00539         fo.setAttribute("TXTSHX", style.shadowXOffset() / 10.0);
00540     if ( ! style.isInhShadowYOffset())
00541         fo.setAttribute("TXTSHY", style.shadowYOffset() / 10.0);
00542     if ( ! style.isInhOutlineWidth())
00543         fo.setAttribute("TXTOUT", style.outlineWidth() / 10.0);
00544     if ( ! style.isInhUnderlineOffset())
00545         fo.setAttribute("TXTULP", style.underlineOffset() / 10.0);
00546     if ( ! style.isInhUnderlineWidth())
00547         fo.setAttribute("TXTULW", style.underlineWidth() / 10.0);
00548     if ( ! style.isInhStrikethruOffset())
00549         fo.setAttribute("TXTSTP", style.strikethruOffset() / 10.0);
00550     if ( ! style.isInhStrikethruWidth())
00551         fo.setAttribute("TXTSTW", style.strikethruWidth() / 10.0);
00552     if ( ! style.isInhScaleH())
00553         fo.setAttribute("SCALEH", style.scaleH() / 10.0);
00554     if ( ! style.isInhScaleV())
00555         fo.setAttribute("SCALEV", style.scaleV() / 10.0);
00556     if ( ! style.isInhBaselineOffset())
00557         fo.setAttribute("BASEO", style.baselineOffset() / 10.0);
00558     if ( ! style.isInhTracking())
00559         fo.setAttribute("KERN", style.tracking() / 10.0); 
00560     if ( ! style.isInhWordTracking())
00561         fo.setAttribute("wordTrack", style.wordTracking());
00562     if ( ! style.shortcut().isEmpty() )
00563         fo.setAttribute("SHORTCUT", style.shortcut()); // shortcuts won't be inherited
00564 }
00565 
00566 void Scribus134Format::writeLayers(QDomDocument & docu) 
00567 {   
00568     QDomElement dc=docu.documentElement().firstChild().toElement();
00569 
00570     uint layerCount=m_Doc->layerCount();
00571     for (uint lay = 0; lay < layerCount; ++lay)
00572     {
00573         QDomElement la = docu.createElement("LAYERS");
00574         la.setAttribute("NUMMER",m_Doc->Layers[lay].LNr);
00575         la.setAttribute("LEVEL",m_Doc->Layers[lay].Level);
00576         la.setAttribute("NAME",m_Doc->Layers[lay].Name);
00577         la.setAttribute("SICHTBAR", static_cast<int>(m_Doc->Layers[lay].isViewable));
00578         la.setAttribute("DRUCKEN", static_cast<int>(m_Doc->Layers[lay].isPrintable));
00579         la.setAttribute("EDIT", static_cast<int>(m_Doc->Layers[lay].isEditable));
00580         la.setAttribute("FLOW", static_cast<int>(m_Doc->Layers[lay].flowControl));
00581         la.setAttribute("TRANS", m_Doc->Layers[lay].transparency);
00582         la.setAttribute("BLEND", m_Doc->Layers[lay].blendMode);
00583         la.setAttribute("OUTL", static_cast<int>(m_Doc->Layers[lay].outlineMode));
00584         la.setAttribute("LAYERC",m_Doc->Layers[lay].markerColor.name());
00585         dc.appendChild(la);
00586     }
00587 }
00588 
00589 void Scribus134Format::writePrintOptions(QDomDocument & docu) 
00590 {
00591     QDomElement dc=docu.documentElement().firstChild().toElement();
00592 
00593     QDomElement pri = docu.createElement("Printer");
00594     pri.setAttribute("firstUse", static_cast<int>(m_Doc->Print_Options.firstUse));
00595     pri.setAttribute("toFile", static_cast<int>(m_Doc->Print_Options.toFile));
00596     pri.setAttribute("useAltPrintCommand", static_cast<int>(m_Doc->Print_Options.useAltPrintCommand));
00597     pri.setAttribute("outputSeparations", static_cast<int>(m_Doc->Print_Options.outputSeparations));
00598     pri.setAttribute("useSpotColors", static_cast<int>(m_Doc->Print_Options.useSpotColors));
00599     pri.setAttribute("useColor", static_cast<int>(m_Doc->Print_Options.useColor));
00600     pri.setAttribute("mirrorH", static_cast<int>(m_Doc->Print_Options.mirrorH));
00601     pri.setAttribute("mirrorV", static_cast<int>(m_Doc->Print_Options.mirrorV));
00602     pri.setAttribute("useICC", static_cast<int>(m_Doc->Print_Options.useICC));
00603     pri.setAttribute("doGCR", static_cast<int>(m_Doc->Print_Options.doGCR));
00604     pri.setAttribute("doClip", static_cast<int>(m_Doc->Print_Options.doClip));
00605     pri.setAttribute("setDevParam", static_cast<int>(m_Doc->Print_Options.setDevParam));
00606     pri.setAttribute("doOverprint", static_cast<int>(m_Doc->Print_Options.doOverprint));
00607     pri.setAttribute("cropMarks", static_cast<int>(m_Doc->Print_Options.cropMarks));
00608     pri.setAttribute("bleedMarks", static_cast<int>(m_Doc->Print_Options.bleedMarks));
00609     pri.setAttribute("registrationMarks", static_cast<int>(m_Doc->Print_Options.registrationMarks));
00610     pri.setAttribute("colorMarks", static_cast<int>(m_Doc->Print_Options.colorMarks));
00611     pri.setAttribute("PSLevel", (m_Doc->Print_Options.prnEngine < WindowsGDI) ? m_Doc->Print_Options.prnEngine : PostScript3);
00612     pri.setAttribute("PDLanguage" , m_Doc->Print_Options.prnEngine);
00613     pri.setAttribute("markOffset" , m_Doc->Print_Options.markOffset);
00614     pri.setAttribute("BleedTop"   , m_Doc->Print_Options.bleeds.Top);
00615     pri.setAttribute("BleedLeft"  , m_Doc->Print_Options.bleeds.Left);
00616     pri.setAttribute("BleedRight" , m_Doc->Print_Options.bleeds.Right);
00617     pri.setAttribute("BleedBottom", m_Doc->Print_Options.bleeds.Bottom);
00618     pri.setAttribute("printer" , m_Doc->Print_Options.printer);
00619     pri.setAttribute("filename", m_Doc->Print_Options.filename);
00620     pri.setAttribute("separationName", m_Doc->Print_Options.separationName);
00621     pri.setAttribute("printerCommand", m_Doc->Print_Options.printerCommand);
00622     for (int p = 0; p < m_Doc->Print_Options.allSeparations.count(); ++p)
00623     {
00624         QDomElement pri2 = docu.createElement("Separation");
00625         pri2.setAttribute("Name", m_Doc->Print_Options.allSeparations[p]);
00626         pri.appendChild(pri2);
00627     }
00628     dc.appendChild(pri);
00629 }
00630 
00631 void Scribus134Format::writePdfOptions(QDomDocument & docu) 
00632 {
00633     QDomElement dc=docu.documentElement().firstChild().toElement();
00634 
00635     QDomElement pdf = docu.createElement("PDF");
00636     pdf.setAttribute("firstUse", static_cast<int>(m_Doc->PDF_Options.firstUse));
00637     pdf.setAttribute("Thumbnails", static_cast<int>(m_Doc->PDF_Options.Thumbnails));
00638     pdf.setAttribute("Articles", static_cast<int>(m_Doc->PDF_Options.Articles));
00639     pdf.setAttribute("Bookmarks", static_cast<int>(m_Doc->PDF_Options.Bookmarks));
00640     pdf.setAttribute("Compress", static_cast<int>(m_Doc->PDF_Options.Compress));
00641     pdf.setAttribute("CMethod", m_Doc->PDF_Options.CompressMethod);
00642     pdf.setAttribute("Quality", m_Doc->PDF_Options.Quality);
00643     pdf.setAttribute("MirrorH", static_cast<int>(m_Doc->PDF_Options.MirrorH));
00644     pdf.setAttribute("MirrorV", static_cast<int>(m_Doc->PDF_Options.MirrorV));
00645     pdf.setAttribute("Clip", static_cast<int>(m_Doc->PDF_Options.doClip));
00646     pdf.setAttribute("RotateDeg", static_cast<int>(m_Doc->PDF_Options.RotateDeg));
00647     pdf.setAttribute("PresentMode", static_cast<int>(m_Doc->PDF_Options.PresentMode));
00648     pdf.setAttribute("RecalcPic", static_cast<int>(m_Doc->PDF_Options.RecalcPic));
00649     pdf.setAttribute("Grayscale", static_cast<int>(m_Doc->PDF_Options.isGrayscale));
00650     pdf.setAttribute("RGBMo