00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
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
00183
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
00257
00258
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
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
00413
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
00458
00459
00460
00461
00462
00463
00464
00465
00466
00467
00468
00469
00470
00471
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
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
00523
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
00589
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
00639 writer.writeAttribute("TEXTFLOWMODE", QString::number((int) item->textFlowMode()) );
00640
00641
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->