X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2Finsets%2FinsetgraphicsParams.C;h=405368d2fff93711a48d207ddd486cf875bf461a;hb=4a5b7a5952ad2381fcdf4830511293e184c7c5a1;hp=0896fac9cfca8bee07581045d04adba02543f089;hpb=b8a28930dfdf2c3d568547a29a9ed5b38dd2681e;p=lyx.git diff --git a/src/insets/insetgraphicsParams.C b/src/insets/insetgraphicsParams.C index 0896fac9cf..405368d2ff 100644 --- a/src/insets/insetgraphicsParams.C +++ b/src/insets/insetgraphicsParams.C @@ -1,449 +1,342 @@ -// -*- 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 * - * This file Copyright 2000 Baruch Even * ================================================= */ +#include + #ifdef __GNUG__ #pragma implementation -#endif +#endif -#include #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 -using std::endl; -/// This variable keeps a tab on whether the translator was set with the -/// translations. -static bool translatorsSet = false; +using std::ostream; -/// This is the translator between the Resize enum and corresponding lyx -/// file strings. -static Translator - resizeTranslator(InsetGraphicsParams::DEFAULT_SIZE, "default"); -/// This is the translator between the Origin enum and corresponding lyx -/// file strings. -static Translator - 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 - displayTranslator(InsetGraphicsParams::MONOCHROME, "monochrome"); +Translator< InsetGraphicsParams::DisplayType, string > +displayTranslator(InsetGraphicsParams::DEFAULT, "default"); + +// this is only compatibility stuff for the first 1.2 version +// it is obselete until 1.3 +LyXLength convertResizeValue(string const token, LyXLex & lex) { + lex.next(); + string value = lex.getString(); // "width" or "height" + lex.next(); // anyway not interesting + value = lex.getString(); + if (token == "default") + return (LyXLength(value+"pt")); + else if (token == "cm") + return (LyXLength(value+"cm")); + else if (token == "inch") + return (LyXLength(value+"in")); + else if (token == "percentOfColumn") + return (LyXLength(value+"c%")); + else if (token == "percentOfPage") + return (LyXLength(value+"p%")); + else return LyXLength("0pt"); // nothing with figinset +} +} // 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 -} - -void InsetGraphicsParams::testInvariant() const -{ -#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 + 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; } -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; + 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; } -static void writeResize(ostream & os, char const * key, - InsetGraphicsParams::Resize resize, double size) +bool operator!=(InsetGraphicsParams const & left, + InsetGraphicsParams const & right) { - 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; + return !(left == right); } -static void writeOrigin(ostream & os, - InsetGraphicsParams::Origin origin) -{ - 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; -} 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; + // If there is no filename, write nothing for it. + if (! filename.empty()) { + os << "\tfilename " + << MakeRelPath(filename, buf->filePath()) + << '\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 (!lyx::float_equal(rotateAngle, 0.0, 0.001)) + 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'; } - -static void 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 void 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) -{ - 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; +bool InsetGraphicsParams::Read(Buffer const * buf, 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, buf->filePath()); + } + } 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(); + // now the compytibility stuff for "old" 1.2.0 files which uses + // the first try of the new graphic inset. Can be deleted, when + // 1.3 comes out + } else if (token == "widthResize") { + if (lex.next()) { + string const token = lex.getString(); + if (token == "scale") { + lex.next(); + scale = lex.getInteger(); + size_type = SCALE; + } + else { + width = convertResizeValue(token, lex); + size_type = WH; + } + } + } else if (token == "heightResize") { + if (lex.next()) + height = convertResizeValue(lex.getString(), lex); + // end compytibility stuff + } else { // If it's none of the above, its not ours. + return false; + } + return true; }