-// -*- C++ -*-
/* This file is part of
* =================================================
- *
+ *
* LyX, The Document Processor
* Copyright 1995 Matthias Ettrich.
- * Copyright 1995-2000 The LyX Team.
+ * Copyright 1995-2001 The LyX Team.
+ *
+ * \author Baruch Even
+ * \author Herbert Voss <voss@lyx.org>
*
- * This file Copyright 2000 Baruch Even
* ================================================= */
+#include <config.h>
+
#ifdef __GNUG__
#pragma implementation
#endif
-#include <config.h>
#include "insetgraphicsParams.h"
#include "support/translator.h"
#include "support/filetools.h"
-
-#ifdef ENABLE_ASSERTIONS
+#include "support/lyxlib.h"
+#include "support/LOstream.h"
#include "support/LAssert.h"
-#endif
-/// This variable keeps a tab on whether the translator was set with the
-/// translations.
-static bool translatorsSet = false;
-/// This is the translator between the Resize enum and corresponding lyx
-/// file strings.
-static Translator<InsetGraphicsParams::Resize, string>
- resizeTranslator(InsetGraphicsParams::DEFAULT_SIZE, "default");
+using std::ostream;
-/// This is the translator between the Origin enum and corresponding lyx
-/// file strings.
-static Translator<InsetGraphicsParams::Origin, string>
- originTranslator(InsetGraphicsParams::DEFAULT, "default");
+
+namespace {
+
+/// This variable keeps a tab on whether the translator was set with the
+/// translations.
+bool translatorsSet = false;
/// This is the translator between the Display enum and corresponding lyx
/// file strings.
-static Translator<InsetGraphicsParams::DisplayType, string>
- displayTranslator(InsetGraphicsParams::MONOCHROME, "monochrome");
+Translator< InsetGraphicsParams::DisplayType, string >
+displayTranslator(InsetGraphicsParams::DEFAULT, "default");
+} // namespace anon
InsetGraphicsParams::InsetGraphicsParams()
{
- init();
-
- // Set translators
- if (! translatorsSet) {
- translatorsSet = true;
-
- // Fill the resize translator
- resizeTranslator.addPair(DEFAULT_SIZE, "default");
- resizeTranslator.addPair(CM, "cm");
- resizeTranslator.addPair(INCH, "inch");
- resizeTranslator.addPair(PERCENT_PAGE, "percentOfPage");
- resizeTranslator.addPair(PERCENT_COLUMN, "percentOfColumn");
-
- // Fill the origin translator
- originTranslator.addPair(DEFAULT, "default");
- originTranslator.addPair(LEFTTOP, "leftTop");
- originTranslator.addPair(LEFTCENTER, "leftCenter");
- originTranslator.addPair(LEFTBASELINE, "leftBaseLine");
- originTranslator.addPair(LEFTBOTTOM, "leftBottom");
- originTranslator.addPair(CENTERTOP, "centerTop");
- originTranslator.addPair(CENTER, "center");
- originTranslator.addPair(CENTERBASELINE, "centerBaseLine");
- originTranslator.addPair(CENTERBOTTOM, "centerBottom");
- originTranslator.addPair(RIGHTTOP, "rightTop");
- originTranslator.addPair(RIGHTCENTER, "rightCenter");
- originTranslator.addPair(RIGHTBASELINE, "rightBaseLine");
- originTranslator.addPair(RIGHTBOTTOM, "rightBottom");
- originTranslator.addPair(REFERENCE_POINT, "referencePoint");
-
- // Fill the display translator
- displayTranslator.addPair(MONOCHROME, "monochrome");
- displayTranslator.addPair(GRAYSCALE, "grayscale");
- displayTranslator.addPair(COLOR, "color");
- displayTranslator.addPair(NONE, "none");
- }
-
+ init();
+ // Set translators
+ if (! translatorsSet) {
+ translatorsSet = true;
+ // Fill the display translator
+ displayTranslator.addPair(DEFAULT, "default");
+ displayTranslator.addPair(MONOCHROME, "monochrome");
+ displayTranslator.addPair(GRAYSCALE, "grayscale");
+ displayTranslator.addPair(COLOR, "color");
+ displayTranslator.addPair(NONE, "none");
+ }
}
InsetGraphicsParams::InsetGraphicsParams(InsetGraphicsParams const & igp)
{
- // I decided to skip the initialization since the copy will overwrite
- // everything anyway.
-// init();
- copy(igp);
+ // I decided to skip the initialization since the copy will overwrite
+ // everything anyway.
+ // init();
+ copy(igp);
}
-InsetGraphicsParams const &
-InsetGraphicsParams::operator=(InsetGraphicsParams const ¶ms)
+InsetGraphicsParams &
+InsetGraphicsParams::operator=(InsetGraphicsParams const & params)
{
- // Are we assigning the object into itself?
- if (this == ¶ms)
- return *this;
-
- copy(params);
- return *this;
+ // Are we assigning the object into itself?
+ if (this == ¶ms)
+ return * this;
+ copy(params);
+ return *this;
}
void InsetGraphicsParams::init()
{
- subcaptionText = filename = string();
- display = MONOCHROME;
- inlineFigure = false;
- subcaption = false;
- keepAspectRatio = true;
- widthResize = DEFAULT_SIZE;
- widthSize = 0.0;
- heightResize = DEFAULT_SIZE;
- heightSize = 0.0;
- rotateOrigin = DEFAULT;
- rotateAngle = 0;
-
-#ifdef ENABLE_ASSERTION
- testInvariant();
-#endif
+ subcaptionText = filename = string();
+ bb = string(); // bounding box
+ draft = false; // draft mode
+ clip = false; // clip image
+ display = DEFAULT; // see pref
+ subcaption = false; // subfigure
+ noUnzip = false; // unzip files
+ width = LyXLength(); // set to 0pt
+ height = LyXLength();
+ lyxwidth = LyXLength(); // for the view in lyx
+ lyxheight = LyXLength(); // also set to 0pt
+ scale = 0; // unit is %
+ lyxscale = 0; // same for lyxview
+ size_type = DEFAULT_SIZE; // do nothing
+ lyxsize_type = DEFAULT_SIZE; // do nothing
+ keepAspectRatio = false; // only for latex
+ rotate = false; // Rotating
+ rotateOrigin = "center"; // Origin
+ rotateAngle = 0.0; // in degrees
+ special = string(); // userdefined stuff
}
void InsetGraphicsParams::copy(InsetGraphicsParams const & igp)
{
- filename = igp.filename;
- display = igp.display;
- inlineFigure = igp.inlineFigure;
- subcaption = igp.subcaption;
- subcaptionText = igp.subcaptionText;
- keepAspectRatio = igp.keepAspectRatio;
- widthResize = igp.widthResize;
- widthSize = igp.widthSize;
- heightResize = igp.heightResize;
- heightSize = igp.heightSize;
- rotateOrigin = igp.rotateOrigin;
- rotateAngle = igp.rotateAngle;
-
-#ifdef ENABLE_ASSERTIONS
- testInvariant();
-#endif
+ filename = igp.filename;
+ bb = igp.bb;
+ draft = igp.draft;
+ clip = igp.clip;
+ display = igp.display;
+ subcaption = igp.subcaption;
+ subcaptionText = igp.subcaptionText;
+ noUnzip = igp.noUnzip;
+ keepAspectRatio = igp.keepAspectRatio;
+ width = igp.width;
+ height = igp.height;
+ scale = igp.scale;
+ size_type = igp.size_type;
+ lyxsize_type = igp.lyxsize_type;
+ lyxwidth = igp.lyxwidth;
+ lyxheight = igp.lyxheight;
+ lyxscale = igp.lyxscale;
+ rotate = igp.rotate;
+ rotateOrigin = igp.rotateOrigin;
+ rotateAngle = igp.rotateAngle;
+ special = igp.special;
}
-void InsetGraphicsParams::testInvariant() const
+bool operator==(InsetGraphicsParams const & left,
+ InsetGraphicsParams const & right)
{
-#ifdef ENABLE_ASSERTIONS
- // Filename might be empty (when the dialog is first created).
- // Assert(!filename.empty());
-
- Assert(display == COLOR ||
- display == MONOCHROME ||
- display == GRAYSCALE ||
- display == NONE
- );
-
- Assert(widthResize == DEFAULT_SIZE ||
- widthResize == CM ||
- widthResize == INCH ||
- widthResize == PERCENT_PAGE ||
- widthResize == PERCENT_COLUMN
- );
-
- Assert(heightResize == DEFAULT_SIZE ||
- heightResize == CM ||
- heightResize == INCH ||
- heightResize == PERCENT_PAGE
- );
-
- Assert(widthSize >= 0.0);
- Assert(heightSize >= 0.0);
-
- // Angle is in degrees and ranges -360 < angle < 360
- // The reason for this is that in latex there is a meaning for the
- // different angles and they are not necessarliy interchangeable,
- // it depends on the rotation origin.
- Assert(rotateAngle < 360);
- Assert(rotateAngle > -360);
-
-#endif
+ if (left.filename == right.filename &&
+ left.bb == right.bb &&
+ left.draft == right.draft &&
+ left.clip == right.clip &&
+ left.display == right.display &&
+ left.subcaption == right.subcaption &&
+ left.noUnzip == right.noUnzip &&
+ left.subcaptionText == right.subcaptionText &&
+ left.keepAspectRatio == right.keepAspectRatio &&
+ left.width == right.width &&
+ left.height == right.height &&
+ left.scale == right.scale &&
+ left.size_type == right.size_type &&
+ left.lyxsize_type == right.lyxsize_type &&
+ left.lyxwidth == right.lyxwidth &&
+ left.lyxheight == right.lyxheight &&
+ left.lyxscale == right.lyxscale &&
+ left.rotate == right.rotate &&
+ left.rotateOrigin == right.rotateOrigin &&
+ lyx::float_equal(left.rotateAngle, right.rotateAngle, 0.001 &&
+ left.special == right.special)
+ )
+ return true;
+
+ return false;
}
-bool operator==(InsetGraphicsParams const & left,
- InsetGraphicsParams const & right)
+bool operator!=(InsetGraphicsParams const & left,
+ InsetGraphicsParams const & right)
{
- if (left.filename == right.filename &&
- left.display == right.display &&
- left.inlineFigure == right.inlineFigure &&
- left.subcaption == right.subcaption &&
- left.subcaptionText == right.subcaptionText &&
- left.keepAspectRatio == right.keepAspectRatio &&
- left.widthResize == right.widthResize &&
- left.widthSize == right.widthSize &&
- left.heightResize == right.heightResize &&
- left.heightSize == right.heightSize &&
- left.rotateOrigin == right.rotateOrigin &&
- left.rotateAngle == right.rotateAngle
- )
- return true;
-
- return false;
+ return !(left == right);
}
-static void writeResize(ostream & os, char const * key,
- InsetGraphicsParams::Resize resize, double size)
-{
- os << ' ' << key << "Resize ";
-
- os << resizeTranslator.find(resize);
-#if 0
- // Old code, before using translators
- switch (resize) {
- case InsetGraphicsParams::DEFAULT_SIZE:
- os << "default";
- break;
-
- case InsetGraphicsParams::CM:
- os << "cm";
- break;
-
- case InsetGraphicsParams::INCH:
- os << "inch";
- break;
-
- case InsetGraphicsParams::PERCENT_PAGE:
- os << "percentOfPage";
- break;
-
- case InsetGraphicsParams::PERCENT_COLUMN:
- os << "percentOfColumnt";
- break;
- }
-#endif
- os << ' ' << key << ' ' << size << endl;
-}
-static void writeOrigin(ostream & os,
- InsetGraphicsParams::Origin origin)
+void InsetGraphicsParams::Write(ostream & os) const
{
- os << " rotateOrigin " << originTranslator.find(origin);
-
-#if 0
- // Old method.
- switch (origin) {
- case InsetGraphicsParams:: DEFAULT:
- os << "default";
- break;
- case InsetGraphicsParams:: LEFTTOP:
- os << "LeftTop";
- break;
- case InsetGraphicsParams:: LEFTCENTER:
- os << "LeftCenter";
- break;
- case InsetGraphicsParams:: LEFTBASELINE:
- os << "LeftBaseLine";
- break;
- case InsetGraphicsParams:: LEFTBOTTOM:
- os << "LeftBottom";
- break;
- case InsetGraphicsParams:: CENTERTOP:
- os << "CenterTop";
- break;
- case InsetGraphicsParams:: CENTER:
- os << "Center";
- break;
- case InsetGraphicsParams:: CENTERBASELINE:
- os << "CenterBaseLine";
- break;
- case InsetGraphicsParams:: CENTERBOTTOM:
- os << "CenterBottom";
- break;
- case InsetGraphicsParams:: RIGHTTOP:
- os << "RightTop";
- break;
- case InsetGraphicsParams:: RIGHTCENTER:
- os << "RightCenter";
- break;
- case InsetGraphicsParams:: RIGHTBASELINE:
- os << "RightBaseLine";
- break;
- case InsetGraphicsParams:: RIGHTBOTTOM:
- os << "RightBottom";
- break;
- // Current REFERENCE_POINT is aliased to LEFTBASELINE
-// case InsetGraphicsParams:: REFERENCE_POINT:
- }
-#endif
-
- os << endl;
+ // If there is no filename, write nothing for it.
+ if (!filename.empty()) {
+ os << "\tfilename " << filename << '\n';
+ }
+ if (!bb.empty()) // bounding box
+ os << "\tBoundingBox " << bb << '\n';
+ if (clip) // clip image
+ os << "\tclip\n";
+ if (draft) // draft mode
+ os << "\tdraft\n";
+ // Save the display type for the view inside lyx
+ os << "\tdisplay " << displayTranslator.find(display) << '\n';
+ // Save the subcaption status
+ if (subcaption)
+ os << "\tsubcaption\n";
+ if (!subcaptionText.empty())
+ os << "\tsubcaptionText \"" << subcaptionText << '\"' << '\n';
+ if (noUnzip)
+ os << "\tnoUnzip\n";
+ // we always need the size type
+ // 0: no special
+ // 1: width/height combination
+ // 2: scale
+ os << "\tsize_type " << size_type << '\n';
+ if (!width.zero())
+ os << "\twidth " << width.asString() << '\n';
+ if (!height.zero())
+ os << "\theight " << height.asString() << '\n';
+ if (scale != 0)
+ os << "\tscale " << scale << '\n';
+ if (keepAspectRatio)
+ os << "\tkeepAspectRatio\n";
+ if (rotate)
+ os << "\trotate\n";
+ if (rotateAngle != 0.0)
+ os << "\trotateAngle " << rotateAngle << '\n';
+ if (!rotateOrigin.empty())
+ os << "\trotateOrigin " << rotateOrigin << '\n';
+ if (!special.empty())
+ os << "\tspecial " << special << '\n';
+ // the values for the view in lyx
+ os << "\tlyxsize_type " << lyxsize_type << '\n';
+ if (!lyxwidth.zero()) // the lyx-viewsize
+ os << "\tlyxwidth " << lyxwidth.asString() << '\n';
+ if (!lyxheight.zero())
+ os << "\tlyxheight " << lyxheight.asString();
+ if (lyxscale != 0)
+ os << "\tlyxscale " << lyxscale << '\n';
}
-void InsetGraphicsParams::Write(Buffer const * buf, ostream & os) const
-{
- // If there is no filename, write nothing for it.
- if (! filename.empty()) {
- os << "filename "
- << MakeRelPath(filename, OnlyPath(buf->fileName()))
- << endl;
- }
-
- // Save the display type
- os << " display " << displayTranslator.find(display) << endl;
-#if 0
- switch (display) {
- case COLOR:
- os << "color";
- break;
-
- case GRAYSCALE:
- os << "grayscale";
- break;
-
- case MONOCHROME:
- os << "monochrome";
- break;
-
- case NONE:
- os << "none";
- break;
- }
- os << endl;
-#endif
-
- // Save the inline status
- if (inlineFigure)
- os << " inline";
-
- // Save the subcaption status
- if (subcaption)
- os << " subcaption";
-
- if (! subcaptionText.empty())
- os << " subcaptionText \"" << subcaptionText << '\"' << endl;
-
- writeResize(os, "width", widthResize, widthSize);
- writeResize(os, "height", heightResize, heightSize);
-
- writeOrigin(os, rotateOrigin);
- if (rotateAngle != 0)
- os << " rotateAngle " << rotateAngle << endl;
-}
-
-static readResize(InsetGraphicsParams * igp, bool height, string const & token)
-{
- InsetGraphicsParams::Resize resize = InsetGraphicsParams::DEFAULT_SIZE;
- resize = resizeTranslator.find(token);
-#if 0
- // Old code, before translator.
- if (token == "default")
- resize = InsetGraphicsParams::DEFAULT_SIZE;
- else if (token == "cm")
- resize = InsetGraphicsParams::CM;
- else if (token == "inch")
- resize = InsetGraphicsParams::INCH;
- else if (token == "percentOfPage")
- resize = InsetGraphicsParams::PERCENT_PAGE;
- else if (token == "percentOfColumn")
- resize = InsetGraphicsParams::PERCENT_COLUMN;
- else {
- lyxerr << "BUG: When reading resize value of InsetGraphicsParam"
- " unknown token found '" << token << '\'' << endl;
- }
-#endif
-
- if (height)
- igp->heightResize = resize;
- else
- igp->widthResize = resize;
-}
-
-static readOrigin(InsetGraphicsParams * igp, string const & token)
-{ // TODO: complete this function.
- igp->rotateOrigin = originTranslator.find(token);
-}
-
-bool InsetGraphicsParams::Read(Buffer const * buf, LyXLex & lex,
- string const& token)
+bool InsetGraphicsParams::Read(LyXLex & lex, string const& token)
{
- if (token == "filename") {
- lex.next();
- filename = lex.GetString();
-
- if (!filename.empty()) {
- // Make the filename with absolute directory.
- filename = MakeAbsPath(filename, OnlyPath(buf->fileName()));
- }
- } else if (token == "display") {
- lex.next();
- string const type = lex.GetString();
-
- display = displayTranslator.find(type);
-#if 0
- if (type == "color")
- display = COLOR;
- else if (type == "grayscale")
- display = GRAYSCALE;
- else if (type == "monochrome")
- display = MONOCHROME;
- else if (type == "none")
- display = NONE;
- else {
- display = MONOCHROME;
- lyxerr << "BUG: When reading InsetGraphicsParams"
- " display has an unknown type " << type << endl;
- }
-#endif
- } else if (token == "inline") {
- inlineFigure = true;
- } else if (token == "subcaption") {
- subcaption = true;
- } else if (token == "subcaptionText") {
- lex.next();
- subcaptionText = lex.GetString();
- } else if (token == "widthResize") {
- lex.next();
- string const token = lex.GetString();
-
- readResize(this, false, token);
- } else if (token == "width") {
- lex.next();
- widthSize = lex.GetFloat();
- } else if (token == "heightResize") {
- lex.next();
- string const token = lex.GetString();
-
- readResize(this, true, token);
- } else if (token == "height") {
- lex.next();
- heightSize = lex.GetFloat();
- } else if (token == "rotateOrigin") {
- lex.next();
- string const token = lex.GetString();
-
- readOrigin(this, token);
- } else if (token == "rotateAngle") {
- lex.next();
- rotateAngle = lex.GetInteger();
- } else {
- // If it's none of the above, its not ours.
- return false;
- }
-
- return true;
+ if (token == "filename") {
+ lex.next();
+ filename = lex.getString();
+ } else if (token == "BoundingBox") {
+ for (int i=0; i<4 ;i++) {
+ lex.next();
+ bb += (lex.getString()+" ");
+ }
+ } else if (token == "clip") {
+ clip = true;
+ } else if (token == "draft") {
+ draft = true;
+ } else if (token == "display") {
+ lex.next();
+ string const type = lex.getString();
+ display = displayTranslator.find(type);
+ } else if (token == "subcaption") {
+ subcaption = true;
+ } else if (token == "subcaptionText") {
+ lex.next();
+ subcaptionText = lex.getString();
+ } else if (token == "noUnzip") {
+ noUnzip = true;
+ } else if (token == "size_type") {
+ lex.next();
+ switch (lex.getInteger()) {
+ case 0 : size_type = DEFAULT_SIZE;
+ break;
+ case 1 : size_type = WH;
+ break;
+ case 2 : size_type = SCALE;
+ }
+ } else if (token == "width") {
+ lex.next();
+ width = LyXLength(lex.getString());
+ size_type = WH;
+ } else if (token == "height") {
+ lex.next();
+ height = LyXLength(lex.getString());
+ size_type = WH;
+ } else if (token == "keepAspectRatio") {
+ keepAspectRatio = true;
+ } else if (token == "scale") {
+ lex.next();
+ scale = lex.getInteger();
+ } else if (token == "rotate") {
+ rotate = true;
+ } else if (token == "rotateAngle") {
+ lex.next();
+ rotateAngle = lex.getFloat();
+ } else if (token == "rotateOrigin") {
+ lex.next();
+ rotateOrigin=lex.getString();
+ } else if (token == "lyxsize_type") {
+ lex.next();
+ switch (lex.getInteger()) {
+ case 0 : lyxsize_type = DEFAULT_SIZE;
+ break;
+ case 1 : lyxsize_type = WH;
+ break;
+ case 2 : lyxsize_type = SCALE;
+ }
+ } else if (token == "lyxwidth") {
+ lex.next();
+ lyxwidth = LyXLength(lex.getString());
+ } else if (token == "lyxheight") {
+ lex.next();
+ lyxheight = LyXLength(lex.getString());
+ } else if (token == "lyxscale") {
+ lex.next();
+ lyxscale = lex.getInteger();
+ } else if (token == "special") {
+ lex.eatLine();
+ special = lex.getString();
+ } else { // If it's none of the above, its not ours.
+ return false;
+ }
+ return true;
}