Scribus Developer Documentation - API
logo-pen

Scribus Developer Documentation - API

scribusXml.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 /***************************************************************************
00008                     scribusXml.cpp the document xml library for scribus
00009                              -------------------
00010     begin                : Sam Jul 14 10:00:00 CEST 2001
00011     copyright            : (C) 2001 by Christian T�p
00012     email                : christian.toepp@mr-ct@gmx.de
00013  ***************************************************************************/
00014 
00015 #include "scribusXml.h"
00016 
00017 #include <QtAlgorithms>
00018 #include <QApplication>
00019 #include <QByteArray>
00020 #include <QCursor>
00021 #include <QDir>
00022 #include <QFile>
00023 #include <QRegExp>
00024 #include <QTextCodec>
00025 #include <QTextStream>
00026 #include <QXmlSimpleReader>
00027 #include <QXmlStreamReader>
00028 #include <QXmlStreamWriter>
00029 
00030 #include <cstdlib>
00031 #include <cmath>
00032 #include "missing.h"
00033 #include "page.h"
00034 #include "pageitem.h"
00035 #include "pageitem_latexframe.h"
00036 #include "units.h"
00037 #include "prefsmanager.h"
00038 #include "scribusview.h"
00039 #include "commonstrings.h"
00040 #include "text/nlsconfig.h"
00041 
00042 #include <iostream>
00043 
00044 #include "scconfig.h"
00045 
00046 #include <zlib.h>
00047 #include "util.h"
00048 #include "util_math.h"
00049 #include "util_color.h"
00050 #include "scpattern.h"
00051 
00052 using namespace std;
00053 
00054 ScriXmlDoc::ScriXmlDoc()
00055 {
00056     prefsManager=PrefsManager::instance();
00057 }
00058 
00059 bool ScriXmlDoc::attrAsBool(const QXmlStreamAttributes& attrs, const char* attName, bool defVal)
00060 {
00061     QLatin1String attString(attName);
00062     bool value = defVal;
00063     QStringRef att = attrs.value(attString);
00064     if (!att.isEmpty())
00065         value = static_cast<bool>(att.toString().toInt());
00066     return value;
00067 }
00068 
00069 int ScriXmlDoc::attrAsInt(const QXmlStreamAttributes& attrs, const char* attName, int defVal)
00070 {
00071     QLatin1String attString(attName);
00072     int value = defVal;
00073     QStringRef att = attrs.value(attString);
00074     if (!att.isEmpty())
00075         value = att.toString().toInt();
00076     return value;
00077 }
00078 
00079 double ScriXmlDoc::attrAsDbl(const QXmlStreamAttributes& attrs, const char* attName, double defVal)
00080 {
00081     QLatin1String attString(attName);
00082     double value = defVal;
00083     QStringRef att = attrs.value(attString);
00084     if (!att.isEmpty())
00085         value = att.toString().toDouble();
00086     return value;
00087 }
00088 
00089 QString ScriXmlDoc::attrAsString (const QXmlStreamAttributes& attrs, const char* attName, const QString& defVal)
00090 {
00091     QLatin1String attString(attName);
00092     QStringRef att = attrs.value(attString);
00093     if (!att.isNull())
00094         return att.toString();
00095     return defVal;
00096 }
00097 
00098 void ScriXmlDoc::GetItemProps(const QXmlStreamAttributes& attrs, struct CopyPasteBuffer *OB, const QString& baseDir, bool newVersion)
00099 {
00100     QString tmp;
00101     int x, y;
00102     double xf, yf, xf2;
00103     OB->PType   = static_cast<PageItem::ItemType>(attrAsInt(attrs, "PTYPE"));
00104     OB->Width   = attrAsDbl(attrs, "WIDTH", 0.0);
00105     OB->Height  = attrAsDbl(attrs, "HEIGHT", 0.);
00106     OB->RadRect = attrAsDbl(attrs, "RADRECT", 0.0);
00107     OB->ClipEdited = attrAsInt(attrs, "CLIPEDIT", 0);
00108     OB->FrameType  = attrAsInt(attrs, "FRTYPE", 0);
00109     OB->Pwidth     = attrAsDbl(attrs, "PWIDTH");
00110     OB->Pcolor     = attrAsString(attrs, "PCOLOR", CommonStrings::None);
00111     if ((!newVersion) && (OB->PType == 4))
00112     {
00113         OB->TxtFill = attrAsString(attrs, "PCOLOR2", CommonStrings::None);
00114         OB->Pcolor2 = CommonStrings::None;
00115     }
00116     else
00117     {
00118         OB->Pcolor2 = attrAsString(attrs, "PCOLOR2", CommonStrings::None);
00119         OB->TxtFill = attrAsString(attrs, "TXTFILL", "Black");
00120     }
00121     OB->Shade      = attrAsInt(attrs, "SHADE");
00122     OB->Shade2     = attrAsInt(attrs, "SHADE2");
00123     OB->FillRule   = attrAsInt(attrs, "fillRule", 1);
00124     OB->TxtStroke  = attrAsString(attrs, "TXTSTROKE", CommonStrings::None);
00125     OB->ShTxtFill  = attrAsInt(attrs, "TXTFILLSH", 100);
00126     OB->ShTxtStroke= attrAsInt(attrs, "TXTSTRSH", 100);
00127     OB->TxtScale   = qRound(attrAsDbl(attrs, "TXTSCALE", 100.0) * 10);
00128     OB->TxtScaleV  = qRound(attrAsDbl(attrs, "TXTSCALEV", 100.0) * 10);
00129     OB->TxTBase    = qRound(attrAsDbl(attrs, "TXTBASE", 0) * 10);
00130     OB->TxTStyle   = attrAsInt(attrs, "TXTSTYLE", 0);
00131     OB->TxtShadowX = qRound(attrAsDbl(attrs, "TXTSHX", 5.0) * 10);
00132     OB->TxtShadowY = qRound(attrAsDbl(attrs, "TXTSHY", -5.0)* 10);
00133     OB->TxtOutline = qRound(attrAsDbl(attrs, "TXTOUT", 1.0) * 10);
00134     OB->TxtUnderPos   = qRound(attrAsDbl(attrs, "TXTULP", -0.1) * 10);
00135     OB->TxtUnderWidth = qRound(attrAsDbl(attrs, "TXTULW", -0.1) * 10);
00136     OB->TxtStrikePos  = qRound(attrAsDbl(attrs, "TXTSTP", -0.1) * 10);
00137     OB->TxtStrikeWidth= qRound(attrAsDbl(attrs, "TXTSTW", -0.1) * 10);
00138     OB->Cols   = attrAsInt(attrs, "COLUMNS", 1);
00139     OB->ColGap = attrAsDbl(attrs, "COLGAP" , 0.0);
00140     OB->GrType = attrAsInt(attrs, "GRTYP"  , 0);
00141     OB->fill_gradient.clearStops();
00142     if (OB->GrType != 0)
00143     {
00144         if (OB->GrType == 8)
00145         {
00146             OB->pattern = attrAsString(attrs, "pattern", "");
00147             OB->patternScaleX   = attrAsDbl(attrs, "pScaleX", 100.0);
00148             OB->patternScaleY   = attrAsDbl(attrs, "pScaleY", 100.0);
00149             OB->patternOffsetX  = attrAsDbl(attrs, "pOffsetX", 0.0);
00150             OB->patternOffsetY  = attrAsDbl(attrs, "pOffsetY", 0.0);
00151             OB->patternRotation = attrAsDbl(attrs, "pRotation", 0.0);
00152         }
00153         else
00154         {
00155             OB->GrStartX = attrAsDbl(attrs, "GRSTARTX", 0.0);
00156             OB->GrStartY = attrAsDbl(attrs, "GRSTARTY", 0.0);
00157             OB->GrEndX   = attrAsDbl(attrs, "GRENDX", 0.0);
00158             OB->GrEndY   = attrAsDbl(attrs, "GRENDY", 0.0);
00159             OB->GrColor  = attrAsString(attrs, "GRCOLOR", "Black");
00160             if (OB->GrColor.isEmpty())
00161                 OB->GrColor = "Black";
00162             OB->GrColor2 = attrAsString(attrs, "GRCOLOR2","Black");
00163             if (OB->GrColor2.isEmpty())
00164                 OB->GrColor2 = "Black";
00165             OB->GrShade  = attrAsInt(attrs, "GRSHADE", 100);
00166             OB->GrShade2 = attrAsInt(attrs, "GRSHADE2", 100);
00167         }
00168     }
00169     OB->Rot        = attrAsDbl(attrs, "ROT", 0.0);
00170     OB->PLineArt   = Qt::PenStyle    ( attrAsInt(attrs, "PLINEART", 0) );
00171     OB->PLineEnd   = Qt::PenCapStyle ( attrAsInt(attrs, "PLINEEND", 0) );
00172     OB->PLineJoin  = Qt::PenJoinStyle( attrAsInt(attrs, "PLINEJOIN", 0));
00173     OB->LineSp     = attrAsDbl(attrs, "LINESP");
00174     OB->LineSpMode = attrAsInt(attrs, "LINESPMode", 0);
00175     OB->LocalScX   = attrAsDbl(attrs, "LOCALSCX");
00176     OB->LocalScY   = attrAsDbl(attrs, "LOCALSCY");
00177     OB->LocalX     = attrAsDbl(attrs, "LOCALX");
00178     OB->LocalY     = attrAsDbl(attrs, "LOCALY");
00179     OB->PicArt     = attrAsInt(attrs, "PICART");
00180     OB->flippedH   = attrAsInt(attrs, "FLIPPEDH") % 2;
00181     OB->flippedV   = attrAsInt(attrs, "FLIPPEDV") % 2;
00182 /*  OB->BBoxX=obj->attribute("BBOXX").toDouble();
00183     OB->BBoxH=obj->attribute("BBOXH").toDouble(); */
00184     OB->ScaleType  = attrAsInt(attrs, "SCALETYPE", 1);
00185     OB->AspectRatio= attrAsInt(attrs, "RATIO", 0);
00186     OB->isPrintable= attrAsInt(attrs, "PRINTABLE");
00187     OB->m_isAnnotation = attrAsInt(attrs, "ANNOTATION", 0);
00188     OB->m_annotation.setType  (attrAsInt(attrs, "ANTYPE", 0));
00189     OB->m_annotation.setAction(attrAsString(attrs, "ANACTION",""));
00190     OB->m_annotation.setE_act (attrAsString(attrs, "ANEACT",""));
00191     OB->m_annotation.setX_act (attrAsString(attrs, "ANXACT",""));
00192     OB->m_annotation.setD_act (attrAsString(attrs, "ANDACT",""));
00193     OB->m_annotation.setFo_act(attrAsString(attrs, "ANFOACT",""));
00194     OB->m_annotation.setBl_act(attrAsString(attrs, "ANBLACT",""));
00195     OB->m_annotation.setK_act (attrAsString(attrs, "ANKACT",""));
00196     OB->m_annotation.setF_act (attrAsString(attrs, "ANFACT",""));
00197     OB->m_annotation.setV_act (attrAsString(attrs, "ANVACT",""));
00198     OB->m_annotation.setC_act (attrAsString(attrs, "ANCACT",""));
00199     OB->m_annotation.setActionType(attrAsInt(attrs, "ANACTYP", 0));
00200     OB->m_annotation.setExtern    (attrAsString(attrs, "ANEXTERN",""));
00201     if ((!OB->m_annotation.Extern().isEmpty()) && (OB->m_annotation.ActionType() != 8))
00202     {
00203         QFileInfo efp(OB->m_annotation.Extern());
00204         OB->m_annotation.setExtern(efp.absoluteFilePath());
00205     }
00206     OB->m_annotation.setZiel (attrAsInt(attrs, "ANZIEL", 0));
00207     OB->AnName = attrAsString(attrs, "ANNAME","");
00208     OB->m_annotation.setToolTip (attrAsString(attrs, "ANTOOLTIP",""));
00209     OB->m_annotation.setRollOver(attrAsString(attrs, "ANROLL",""));
00210     OB->m_annotation.setDown  (attrAsString(attrs, "ANDOWN",""));
00211     OB->m_annotation.setBwid  (attrAsInt(attrs, "ANBWID", 1));
00212     OB->m_annotation.setBsty  (attrAsInt(attrs, "ANBSTY", 0));
00213     OB->m_annotation.setFeed  (attrAsInt(attrs, "ANFEED", 1));
00214     OB->m_annotation.setFlag  (attrAsInt(attrs, "ANFLAG", 0));
00215     OB->m_annotation.setFont  (attrAsInt(attrs, "ANFONT", 4));
00216     OB->m_annotation.setFormat(attrAsInt(attrs, "ANFORMAT", 0));
00217     OB->m_annotation.setVis   (attrAsInt(attrs, "ANVIS", 0));
00218     OB->m_annotation.setIsChk (attrAsBool(attrs, "ANCHK", false));
00219     OB->m_annotation.setAAact (attrAsBool(attrs, "ANAA", false));
00220     OB->m_annotation.setHTML  (attrAsBool(attrs, "ANHTML", false));
00221     OB->m_annotation.setUseIcons(attrAsBool(attrs, "ANICON", false));
00222     OB->m_annotation.setChkStil (attrAsInt(attrs, "ANCHKS", 0));
00223     OB->m_annotation.setMaxChar (attrAsInt(attrs, "ANMC", -1));
00224     OB->m_annotation.setBorderColor(attrAsString(attrs, "ANBCOL",CommonStrings::None));
00225     OB->m_annotation.setIPlace  (attrAsInt(attrs, "ANPLACE", 1));
00226     OB->m_annotation.setScaleW  (attrAsInt(attrs, "ANSCALE", 0));
00227     if (attrAsInt(attrs, "TRANSPARENT", 0) == 1)
00228         OB->Pcolor = CommonStrings::None;
00229     OB->textAlignment = attrAsInt(attrs, "ALIGN", 0);
00230     if (!attrs.value("TEXTFLOWMODE").isEmpty() )
00231         OB->TextflowMode = (PageItem::TextFlowMode) attrAsInt(attrs, "TEXTFLOWMODE", 0);
00232     else if (attrAsInt(attrs, "TEXTFLOW", 0))
00233     {
00234         if (attrAsInt(attrs, "TEXTFLOW2", 0))
00235             OB->TextflowMode = PageItem::TextFlowUsesBoundingBox;
00236         else if (attrAsInt(attrs, "TEXTFLOW3", 0))
00237             OB->TextflowMode = PageItem::TextFlowUsesContourLine;
00238         else
00239             OB->TextflowMode = PageItem::TextFlowUsesFrameShape;    
00240     }
00241     else
00242         OB->TextflowMode = PageItem::TextFlowDisabled;
00243     OB->Extra    = attrAsDbl(attrs, "EXTRA", 0.0);
00244     OB->TExtra   = attrAsDbl(attrs, "TEXTRA", 1.0);
00245     OB->BExtra   = attrAsDbl(attrs, "BEXTRA", 1.0);
00246     OB->RExtra   = attrAsDbl(attrs, "REXTRA", 1.0);
00247     OB->PoShow   = attrAsInt(attrs, "PLTSHOW", 0);
00248     OB->BaseOffs = attrAsDbl(attrs, "BASEOF", 0.0);
00249     OB->textPathType    = attrAsInt (attrs, "textPathType", 0);
00250     OB->textPathFlipped = attrAsBool(attrs, "textPathFlipped", false);
00251     OB->ISize      = qRound(attrAsDbl(attrs, "ISIZE", 12.0) * 10);
00252     if (!attrs.value("EXTRAV").isEmpty())
00253         OB->ExtraV = qRound( attrAsDbl(attrs, "EXTRAV", 0.0) / attrAsDbl(attrs, "ISIZE", 12.0) * 1000.0);
00254     else
00255         OB->ExtraV = attrAsInt(attrs, "TXTKERN");
00256 /*  OB->Pfile      = Relative2Path( attrAsString(attrs, "PFILE" ,""), baseDir);
00257     OB->Pfile2     = Relative2Path( attrAsString(attrs, "PFILE2",""), baseDir);
00258     OB->Pfile3     = Relative2Path( attrAsString(attrs, "PFILE3",""), baseDir); */
00259     OB->Pfile      = attrAsString(attrs, "PFILE" ,"");
00260     OB->Pfile2     = attrAsString(attrs, "PFILE2","");
00261     OB->Pfile3     = attrAsString(attrs, "PFILE3","");
00262     OB->IProfile   = attrAsString(attrs, "PRFILE","");
00263     OB->EmProfile  = attrAsString(attrs, "EPROF","");
00264     OB->IRender    = attrAsInt (attrs, "IRENDER", 1);
00265     OB->UseEmbedded= attrAsInt (attrs, "EMBEDDED", 1);
00266     OB->Locked       = attrAsBool(attrs, "LOCK", false);
00267     OB->LockRes      = attrAsBool(attrs, "LOCKR", false);
00268     OB->Reverse      = attrAsBool(attrs, "REVERS", false);
00269     OB->isTableItem  = attrAsBool(attrs, "isTableItem", false);
00270     OB->TopLine      = attrAsBool(attrs, "TopLine", false);
00271     OB->LeftLine     = attrAsBool(attrs, "LeftLine", false);
00272     OB->RightLine    = attrAsBool(attrs, "RightLine", false);
00273     OB->BottomLine   = attrAsBool(attrs, "BottomLine", false);
00274     OB->TopLinkID    = attrAsInt(attrs, "TopLINK", -1);
00275     OB->LeftLinkID   = attrAsInt(attrs, "LeftLINK", -1);
00276     OB->RightLinkID  = attrAsInt(attrs, "RightLINK", -1);
00277     OB->BottomLinkID = attrAsInt(attrs, "BottomLINK", -1);
00278     OB->Transparency = attrAsDbl(attrs, "TransValue", 0.0);
00279     if (!attrs.value("TransValueS").isEmpty())
00280         OB->TranspStroke = attrAsDbl(attrs, "TransValueS", 0.0);
00281     else
00282         OB->TranspStroke = OB->Transparency;
00283     OB->TransBlend  = attrAsInt(attrs, "TransBlend", 0);
00284     OB->TransBlendS = attrAsInt(attrs, "TransBlendS", 0);
00285     tmp = "";
00286     int numClip = attrAsInt(attrs, "NUMCLIP", 0);
00287     if (numClip > 0)
00288     {
00289         OB->Clip.resize(numClip);
00290         tmp = attrAsString(attrs, "CLIPCOOR", "");
00291         QTextStream fc(&tmp, QIODevice::ReadOnly);
00292         for (int c=0; c < numClip; ++c)
00293         {
00294             fc >> x;
00295             fc >> y;
00296             OB->Clip.setPoint(c, x, y);
00297         }
00298     }
00299     else
00300         OB->Clip.resize(0);
00301     tmp = "";
00302     int numPo = attrAsInt(attrs, "NUMPO", 0);
00303     if (numPo > 0 )
00304     {
00305         OB->PoLine.resize(numPo);
00306         tmp = attrAsString(attrs, "POCOOR", "");
00307         QTextStream fp(&tmp, QIODevice::ReadOnly);
00308         for (int cx=0; cx < numPo; ++cx)
00309         {
00310             fp >> xf;
00311             fp >> yf;
00312             OB->PoLine.setPoint(cx, xf, yf);
00313         }
00314     }
00315     else
00316         OB->PoLine.resize(0);
00317     tmp = "";
00318     int numCo = attrAsInt(attrs, "NUMCO", 0); 
00319     if (numCo > 0)
00320     {
00321         OB->ContourLine.resize(numCo);
00322         tmp = attrAsString(attrs, "COCOOR", "");
00323         QTextStream fp(&tmp, QIODevice::ReadOnly);
00324         for (int cx=0; cx < numCo; ++cx)
00325         {
00326             fp >> xf;
00327             fp >> yf;
00328             OB->ContourLine.setPoint(cx, xf, yf);
00329         }
00330     }
00331     else
00332         OB->ContourLine.resize(0);
00333     tmp = "";
00334     int numTab = attrAsInt(attrs, "NUMTAB", 0); 
00335     if (numTab > 0)
00336     {
00337         ParagraphStyle::TabRecord tb;
00338         tmp = attrAsString(attrs, "TABS", "");
00339         QTextStream tgv(&tmp, QIODevice::ReadOnly);
00340         OB->TabValues.clear();
00341         for (int cxv = 0; cxv < numTab; cxv += 2)
00342         {
00343             tgv >> xf;
00344             tgv >> xf2;
00345             tb.tabPosition = xf2;
00346             tb.tabType = static_cast<int>(xf);
00347             tb.tabFillChar = QChar();
00348             OB->TabValues.append(tb);
00349         }
00350         tmp = "";
00351     }
00352     else
00353         OB->TabValues.clear();
00354     int numDash = attrAsInt(attrs, "NUMDASH", 0); 
00355     if (numDash > 0)
00356     {
00357         tmp = attrAsString(attrs, "DASHS", "");
00358         QTextStream dgv(&tmp, QIODevice::ReadOnly);
00359         OB->DashValues.clear();
00360         for (int cxv = 0; cxv < numDash; ++cxv)
00361         {
00362             dgv >> xf;
00363             OB->DashValues.append(xf);
00364         }
00365         tmp = "";
00366     }
00367     else
00368         OB->DashValues.clear();
00369     OB->DashOffset = attrAsDbl(attrs, "DASHOFF", 0.0);
00370 }
00371 
00372 void ScriXmlDoc::GetItemText(const QXmlStreamAttributes& attrs, ScribusDoc *doc, bool VorLFound, bool impo, PageItem* obj)
00373 {
00374     QString tmp2, tmf, tmpf, tmp3;
00375     tmp2 = attrAsString(attrs, "CH", "");
00376     tmp2.replace(QRegExp("\r"), QChar(5));
00377     tmp2.replace(QRegExp("\n"), QChar(5));
00378     tmp2.replace(QRegExp("\t"), QChar(4));
00379     tmpf = attrAsString(attrs, "CFONT", doc->toolSettings.defFont);
00380     bool unknown = false;
00381     ScFace dummy = ScFace::none();
00382     if ((!prefsManager->appPrefs.AvailFonts.contains(tmpf)) || (!prefsManager->appPrefs.AvailFonts[tmpf].usable()))
00383     {
00384         bool isThere = false;
00385         for (int dl = 0; dl < dummyScFaces.count(); ++dl)
00386         {
00387             if (dummyScFaces.at(dl).scName() == tmpf)
00388             {
00389                 isThere = true;
00390                 dummy = dummyScFaces.at(dl);
00391                 break;
00392             }
00393         }
00394         if (!isThere)
00395         {
00396 //FIXME         dummy = new ScFace(tmpf, "", tmpf, "", "", 1, false);
00397             dummyScFaces.append(dummy);
00398         }
00399         unknown = true;
00400         if ((!prefsManager->appPrefs.GFontSub.contains(tmpf)) || (!prefsManager->appPrefs.AvailFonts[prefsManager->appPrefs.GFontSub[tmpf]].usable()))
00401         {
00402             newReplacement = true;
00403             ReplacedFonts.insert(tmpf, prefsManager->appPrefs.toolSettings.defFont);
00404         }
00405         else
00406             ReplacedFonts.insert(tmpf, prefsManager->appPrefs.GFontSub[tmpf]);
00407     }
00408     else
00409     {
00410         if (!doc->UsedFonts.contains(tmpf))
00411         {
00412 //          QFont fo = prefsManager->appPrefs.AvailFonts[tmpf]->Font;
00413 //          fo.setPointSize(qRound(doc->toolSettings.defSize / 10.0));
00414             doc->AddFont(tmpf);
00415         }
00416     }
00417     int size = qRound(attrAsDbl(attrs, "CSIZE") * 10);
00418     QString fcolor = attrAsString(attrs, "CCOLOR", CommonStrings::None);
00419     int extra;
00420     if (!attrs.value("CEXTRA").isEmpty())
00421         extra = qRound(attrAsDbl(attrs, "CEXTRA") / attrAsDbl(attrs, "CSIZE", 1.0) * 1000.0);
00422     else
00423         extra = attrAsInt(attrs, "CKERN");
00424     int shade  = attrAsInt(attrs, "CSHADE");
00425     int cstyle = attrAsInt(attrs, "CSTYLE") & 2047;
00426     QString stroke = attrAsString(attrs, "CSTROKE", CommonStrings::None);
00427     int shade2 = attrAsInt(attrs, "CSHADE2", 100);
00428     int scale  = qRound(attrAsDbl(attrs, "CSCALE", 100.0) * 10);
00429     int scalev = qRound(attrAsDbl(attrs, "CSCALEV", 100.0) * 10);
00430     int base   = qRound(attrAsDbl(attrs, "CBASE", 0.0) * 10);
00431     int shX    = qRound(attrAsDbl(attrs, "CSHX", 5.0) * 10);
00432     int shY    = qRound(attrAsDbl(attrs, "CSHY", -5.0) * 10);
00433     int outL   = qRound(attrAsDbl(attrs, "COUT", 1.0) * 10);
00434     int ulp    = qRound(attrAsDbl(attrs, "CULP", -0.1) * 10);
00435     int ulw    = qRound(attrAsDbl(attrs, "CULW", -0.1) * 10);
00436     int stp    = qRound(attrAsDbl(attrs, "CSTP", -0.1) * 10);
00437     int stw    = qRound(attrAsDbl(attrs, "CSTW", -0.1) * 10);
00438     QString pstyleName = attrAsString(attrs, "PSTYLE", "");
00439     for (int cxx=0; cxx<tmp2.length(); ++cxx)
00440     {
00441         CharStyle style;
00442         QChar ch = tmp2.at(cxx);
00443         if (ch == QChar(5))
00444             ch = SpecialChars::PARSEP;
00445         if (ch == QChar(4))
00446             ch = SpecialChars::TAB;
00447         if (unknown)
00448             style.setFont(dummy);
00449         else
00450             style.setFont((*doc->AllFonts)[tmpf]);
00451         style.setFontSize(size);
00452         style.setFillColor(fcolor);
00453         style.setTracking(extra);
00454         style.setFillShade(shade);
00455         style.setFeatures(static_cast<StyleFlag>(cstyle).featureList());
00456 /*
00457  int pstyleNr;
00458         if (impo)
00459         {
00460                 if (VorLFound)
00461                     pstyleNr = DoVorl[ab].toUInt();
00462                 else
00463                 {
00464                     if (ab < 5)
00465                         pstyleNr = ab;
00466                     else
00467                         pstyleNr = 0;
00468                 }
00469         }
00470         else
00471             pstyleNr = ab;
00472 */      
00473         style.setStrokeColor(stroke);
00474         style.setStrokeShade(shade2);
00475         style.setScaleH(qMin(qMax(scale, 100), 4000));
00476         style.setScaleV(qMin(qMax(scalev, 100), 4000));
00477         style.setBaselineOffset(base);
00478         style.setShadowXOffset(shX);
00479         style.setShadowYOffset(shY);
00480         style.setOutlineWidth(outL);
00481         style.setUnderlineOffset(ulp);
00482         style.setUnderlineWidth(ulw);
00483         style.setStrikethruOffset(stp);
00484         style.setStrikethruWidth(stw);
00485         int pos = obj->itemText.length();
00486         obj->itemText.insertChars(pos, QString(ch));
00487         if (ch == SpecialChars::PARSEP)
00488         {
00489             ParagraphStyle pstyle;
00490             pstyle.setParent(pstyleName);
00491             obj->itemText.applyStyle(pos, pstyle);
00492         }
00493         else
00494             obj->itemText.applyCharStyle(pos, 1, style);
00495     }
00496     return;
00497 }
00498 
00499 QString ScriXmlDoc::AskForFont(SCFonts &avail, QString fStr, ScribusDoc *doc)
00500 {
00501     PrefsManager *prefsManager=PrefsManager::instance();
00502 //  QFont fo;
00503     QString tmpf = fStr;
00504     if ((!avail.contains(tmpf)) || (!avail[tmpf].usable()))
00505     {
00506         if ((!prefsManager->appPrefs.GFontSub.contains(tmpf)) || (!avail[prefsManager->appPrefs.GFontSub[tmpf]].usable()))
00507         {
00508             qApp->changeOverrideCursor(QCursor(Qt::ArrowCursor));
00509             MissingFont *dia = new MissingFont(0, tmpf, doc);
00510             dia->exec();
00511             tmpf = dia->getReplacementFont();
00512             delete dia;
00513             qApp->changeOverrideCursor(QCursor(Qt::WaitCursor));
00514             prefsManager->appPrefs.GFontSub[fStr] = tmpf;
00515         }
00516         else
00517             tmpf = prefsManager->appPrefs.GFontSub[tmpf];
00518         ReplacedFonts[fStr] = tmpf;
00519     }
00520     if (!doc->UsedFonts.contains(tmpf))
00521     {
00522 //      fo = avail[tmpf]->Font;
00523 //      fo.setPointSize(qRound(doc->toolSettings.defSize / 10.0));
00524         doc->AddFont(tmpf);
00525     }
00526     DoFonts[fStr] = tmpf;
00527     return tmpf;
00528 }
00529 
00530 void ScriXmlDoc::SetItemProps(QXmlStreamWriter& writer, ScribusDoc *doc, PageItem* item, const QString& baseDir, bool newFormat)
00531 {
00532     double xf, yf;
00533     QString tmp, tmpy;
00534     if (newFormat)
00535         writer.writeAttribute("OwnPage", QString::number(item->OwnPage));
00536     const ParagraphStyle& defaultStyle = item->itemText.defaultStyle();
00537     const CharStyle&      charStyle    = item->itemText.defaultStyle().charStyle();
00538     writer.writeAttribute("PTYPE"    ,QString::number(item->realItemType()));
00539     writer.writeAttribute("XPOS"     ,QString::number(item->xPos() - doc->currentPage()->xOffset()));
00540     writer.writeAttribute("YPOS"     ,QString::number(item->yPos() - doc->currentPage()->yOffset()));
00541     writer.writeAttribute("WIDTH"    ,QString::number(item->width()));
00542     writer.writeAttribute("HEIGHT"   ,QString::number(item->height()));
00543     writer.writeAttribute("RADRECT"  ,QString::number(item->cornerRadius()));
00544     writer.writeAttribute("FRTYPE"   ,QString::number(item->FrameType));
00545     writer.writeAttribute("CLIPEDIT" ,item->ClipEdited ? "1" : "0");
00546     writer.writeAttribute("PWIDTH"   ,QString::number(item->lineWidth()));
00547     writer.writeAttribute("PCOLOR"   ,item->fillColor());
00548     writer.writeAttribute("PCOLOR2"  ,item->lineColor());
00549     writer.writeAttribute("TXTFILL"  ,charStyle.fillColor());
00550     writer.writeAttribute("TXTSTROKE",charStyle.strokeColor());
00551     writer.writeAttribute("TXTSTRSH" ,QString::number(charStyle.strokeShade()));
00552     writer.writeAttribute("TXTFILLSH",QString::number(charStyle.fillShade()));
00553     writer.writeAttribute("TXTSCALE" ,QString::number(charStyle.scaleH() / 10.0));
00554     writer.writeAttribute("TXTSCALEV",QString::number(charStyle.scaleV() / 10.0));
00555     writer.writeAttribute("TXTBASE"  ,QString::number(charStyle.baselineOffset() / 10.0));
00556     writer.writeAttribute("TXTSHX"   ,QString::number(charStyle.shadowXOffset() / 10.0));
00557     writer.writeAttribute("TXTSHY"   ,QString::number(charStyle.shadowYOffset() / 10.0));
00558     writer.writeAttribute("TXTOUT"   ,QString::number(charStyle.outlineWidth() / 10.0));
00559     writer.writeAttribute("TXTULP"   ,QString::number(charStyle.underlineOffset() / 10.0));
00560     writer.writeAttribute("TXTULW"   ,QString::number(charStyle.underlineWidth() / 10.0));
00561     writer.writeAttribute("TXTSTP"   ,QString::number(charStyle.strikethruOffset() / 10.0));
00562     writer.writeAttribute("TXTSTW"   ,QString::number(charStyle.strikethruWidth() / 10.0));
00563     writer.writeAttribute("TXTSTYLE" ,QString::number(charStyle.effects()));
00564     writer.writeAttribute("COLUMNS"  ,QString::number(item->columns()));
00565     writer.writeAttribute("COLGAP"   ,QString::number(item->columnGap()));
00566     writer.writeAttribute("NAMEDLST" ,item->NamedLStyle);
00567     writer.writeAttribute("SHADE"    ,QString::number(item->fillShade()));
00568     writer.writeAttribute("SHADE2"   ,QString::number(item->lineShade()));
00569     writer.writeAttribute("GRTYP"    ,QString::number(item->GrType));
00570     writer.writeAttribute("ROT"      ,QString::number(item->rotation()));
00571     writer.writeAttribute("PLINEART" ,QString::number(item->PLineArt));
00572     writer.writeAttribute("PLINEEND" ,QString::number(item->PLineEnd));
00573     writer.writeAttribute("PLINEJOIN",QString::number(item->PLineJoin));
00574     writer.writeAttribute("LINESP"   ,QString::number(defaultStyle.lineSpacing()));
00575     writer.writeAttribute("LINESPMode",QString::number(defaultStyle.lineSpacingMode()));
00576     writer.writeAttribute("TXTKERN"  ,QString::number(charStyle.tracking()));
00577     writer.writeAttribute("LOCALSCX" ,QString::number(item->imageXScale()));
00578     writer.writeAttribute("LOCALSCY" ,QString::number(item->imageYScale()));
00579     writer.writeAttribute("LOCALX"   ,QString::number(item->imageXOffset()));
00580     writer.writeAttribute("LOCALY"   ,QString::number(item->imageYOffset()));
00581     writer.writeAttribute("PICART"   ,item->imageShown() ? "1" : "0");
00582     writer.writeAttribute("PLTSHOW"  ,item->PoShow ? "1" : "0");
00583     writer.writeAttribute("BASEOF"   ,QString::number(item->BaseOffs));
00584     writer.writeAttribute("textPathType",QString::number(item->textPathType));
00585     writer.writeAttribute("textPathFlipped",item->textPathFlipped ? "1" : "0");
00586     writer.writeAttribute("FLIPPEDH" , item->imageFlippedH() ? "1" : "0");
00587     writer.writeAttribute("FLIPPEDV" , item->imageFlippedV() ? "1" : "0");
00588 /*  writer.writeAttribute("BBOXX",item->BBoxX);
00589     writer.writeAttribute("BBOXH",item->BBoxH); */
00590     writer.writeAttribute("IFONT"    ,charStyle.font().scName());
00591     writer.writeAttribute("ISIZE"    ,QString::number(charStyle.fontSize() / 10.0) );
00592     writer.writeAttribute("SCALETYPE",item->ScaleType ? "1" : "0");
00593     writer.writeAttribute("RATIO"    ,item->AspectRatio ? "1" : "0");
00594     writer.writeAttribute("PRINTABLE",item->printEnabled() ? "1" : "0");
00595     if(item->isAnnotation())
00596     {
00597         writer.writeAttribute("ANNOTATION","1");
00598         writer.writeAttribute("ANTYPE"  , QString::number(item->annotation().Type()));
00599         writer.writeAttribute("ANACTION", item->annotation().Action());
00600         writer.writeAttribute("ANEACT"  , item->annotation().E_act());
00601         writer.writeAttribute("ANXACT"  , item->annotation().X_act());
00602         writer.writeAttribute("ANDACT"  , item->annotation().D_act());
00603         writer.writeAttribute("ANFOACT" , item->annotation().Fo_act());
00604         writer.writeAttribute("ANBLACT" , item->annotation().Bl_act());
00605         writer.writeAttribute("ANKACT"  , item->annotation().K_act());
00606         writer.writeAttribute("ANFACT"  , item->annotation().F_act());
00607         writer.writeAttribute("ANVACT"  , item->annotation().V_act());
00608         writer.writeAttribute("ANCACT"  , item->annotation().C_act());
00609         if (item->annotation().ActionType() == 8)
00610             writer.writeAttribute("ANEXTERN", item->annotation().Extern());
00611         else
00612             writer.writeAttribute("ANEXTERN", Path2Relative(item->annotation().Extern(), baseDir));
00613         writer.writeAttribute("ANZIEL"  , QString::number(item->annotation().Ziel()));
00614         writer.writeAttribute("ANACTYP" , QString::number(item->annotation().ActionType()));
00615         writer.writeAttribute("ANTOOLTIP", item->annotation().ToolTip());
00616         writer.writeAttribute("ANBWID"  , QString::number(item->annotation().Bwid()));
00617         writer.writeAttribute("ANBSTY"  , QString::number(item->annotation().Bsty()));
00618         writer.writeAttribute("ANFEED"  , QString::number(item->annotation().Feed()));
00619         writer.writeAttribute("ANFLAG"  , QString::number(item->annotation().Flag()));
00620         writer.writeAttribute("ANFONT"  , QString::number(item->annotation().Font()));
00621         writer.writeAttribute("ANFORMAT", QString::number(item->annotation().Format()));
00622         writer.writeAttribute("ANROLL"  , item->annotation().RollOver());
00623         writer.writeAttribute("ANDOWN"  , item->annotation().Down());
00624         writer.writeAttribute("ANVIS"   , QString::number(item->annotation().Vis()));
00625         writer.writeAttribute("ANMC"    , QString::number(item->annotation().MaxChar()));
00626         writer.writeAttribute("ANCHK"   , item->annotation().IsChk() ? "1" : "0");
00627         writer.writeAttribute("ANAA"    , item->annotation().AAact() ? "1" : "0");
00628         writer.writeAttribute("ANCHKS"  , QString::number(item->annotation().ChkStil()));
00629         writer.writeAttribute("ANBCOL"  , item->annotation().borderColor());
00630         writer.writeAttribute("ANHTML"  , item->annotation().HTML() ? "1" : "0");
00631         writer.writeAttribute("ANICON"  , item->annotation().UseIcons() ? "1" : "0");
00632         writer.writeAttribute("ANPLACE" , item->annotation().IPlace() ? "1" : "0");
00633         writer.writeAttribute("ANSCALE" , item->annotation().ScaleW() ? "1" : "0");
00634     }
00635     else
00636         writer.writeAttribute("ANNOTATION","0");
00637     writer.writeAttribute("ANNAME", !item->AutoName ? item->itemName() : QString(""));
00638     // "TEXTFLOWMODE" succeed to "TEXTFLOW" "TEXTFLOW2" and "TEXTFLOW3" attributes
00639     writer.writeAttribute("TEXTFLOWMODE", QString::number((int) item->textFlowMode()) );
00640     // Set "TEXTFLOW" "TEXTFLOW2" and "TEXTFLOW3" attributes for compatibility
00641     // with versions prior to 1.3.4
00642     writer.writeAttribute("TEXTFLOW" , item->textFlowAroundObject()    ? "1" : "0");
00643     writer.writeAttribute("TEXTFLOW2", item->textFlowUsesBoundingBox() ? "1" : "0");
00644     writer.writeAttribute("TEXTFLOW3", item->textFlowUsesContourLine() ? "1" : "0");
00645     writer.writeAttribute("AUTOTEXT" , item->isAutoText ? "1" : "0");
00646     writer.writeAttribute("EXTRA"    , QString::number(item->textToFrameDistLeft()));
00647     writer.writeAttribute("TEXTRA"   , QString::number(item->textToFrameDistTop()));
00648     writer.writeAttribute("BEXTRA"   , QString::number(item->textToFrameDistBottom()));
00649     writer.writeAttribute("REXTRA"   , QString::number(item->textToFrameDistRight()));
00650     if (((item->asImageFrame() && !item->asLatexFrame()) || (item->asTextFrame())) && (!item->Pfile.isEmpty()))
00651         writer.writeAttribute("PFILE",Path2Relative(item->Pfile, baseDir));
00652     if (!item->Pfile2.isEmpty())
00653         writer.writeAttribute("PFILE2",Path2Relative(item->Pfile2, baseDir));
00654     else
00655         writer.writeAttribute("PFILE2","");
00656     if (!item->Pfile3.isEmpty())
00657         writer.writeAttribute("PFILE3",Path2Relative(item->Pfile3, baseDir));
00658     else
00659         writer.writeAttribute("PFILE3","");
00660     writer.writeAttribute("PRFILE"     , item->IProfile);
00661     writer.writeAttribute("EPROF"      , item->EmProfile);
00662     writer.writeAttribute("IRENDER"    , QString::number(item->IRender));
00663     writer.writeAttribute("EMBEDDED"   , item->UseEmbedded ? "1" : "0");
00664     writer.writeAttribute("LOCK"       , item->locked() ? "1" : "0");
00665     writer.writeAttribute("LOCKR"      , item->sizeLocked() ? "1" : "0");
00666     writer.writeAttribute("REVERS"     , item->reversed() ? "1" : "0");
00667     writer.writeAttribute("TransValue" , QString::number(item->fillTransparency()));
00668     writer.writeAttribute("TransValueS", QString::number(item->lineTransparency()));
00669     writer.writeAttribute("TransBlend" , QString::number(item->fillBlendmode()));
00670     writer.writeAttribute("TransBlendS", QString::number(item->lineBlendmode()));
00671     writer.writeAttribute("isTableItem", QString::number(static_cast<int>(item->isTableItem)));
00672     writer.writeAttribute("TopLine"    , QString::number(static_cast<int>(item->TopLine)));
00673     writer.writeAttribute("LeftLine"   , QString::number(static_cast<int>(item->LeftLine)));
00674     writer.writeAttribute("RightLine"  , QString::number(static_cast<int>(item->