2 /* This file is part of
3 * =================================================
5 * LyX, The Document Processor
6 * Copyright 1995 Matthias Ettrich.
7 * Copyright 1995-2000 The LyX Team.
9 * This file Copyright 2000 Baruch Even
10 * ================================================= */
15 #pragma implementation
18 #include "insetgraphicsParams.h"
20 #include "support/translator.h"
21 #include "support/filetools.h"
23 #include "support/LAssert.h"
27 /// This variable keeps a tab on whether the translator was set with the
29 static bool translatorsSet = false;
31 /// This is the translator between the Resize enum and corresponding lyx
33 static Translator < InsetGraphicsParams::Resize, string >
34 resizeTranslator(InsetGraphicsParams::DEFAULT_SIZE, "default");
36 /// This is the translator between the Origin enum and corresponding lyx
38 static Translator < InsetGraphicsParams::Origin, string >
39 originTranslator(InsetGraphicsParams::DEFAULT, "default");
41 /// This is the translator between the Display enum and corresponding lyx
43 static Translator < InsetGraphicsParams::DisplayType, string >
44 displayTranslator(InsetGraphicsParams::MONOCHROME, "monochrome");
48 InsetGraphicsParams::InsetGraphicsParams()
53 if (! translatorsSet) {
54 translatorsSet = true;
56 // Fill the resize translator
57 resizeTranslator.addPair(DEFAULT_SIZE, "default");
58 resizeTranslator.addPair(CM, "cm");
59 resizeTranslator.addPair(INCH, "inch");
60 resizeTranslator.addPair(PERCENT_PAGE, "percentOfPage");
61 resizeTranslator.addPair(PERCENT_COLUMN, "percentOfColumn");
63 // Fill the origin translator
64 originTranslator.addPair(DEFAULT, "default");
65 originTranslator.addPair(LEFTTOP, "leftTop");
66 originTranslator.addPair(LEFTCENTER, "leftCenter");
67 originTranslator.addPair(LEFTBASELINE, "leftBaseLine");
68 originTranslator.addPair(LEFTBOTTOM, "leftBottom");
69 originTranslator.addPair(CENTERTOP, "centerTop");
70 originTranslator.addPair(CENTER, "center");
71 originTranslator.addPair(CENTERBASELINE, "centerBaseLine");
72 originTranslator.addPair(CENTERBOTTOM, "centerBottom");
73 originTranslator.addPair(RIGHTTOP, "rightTop");
74 originTranslator.addPair(RIGHTCENTER, "rightCenter");
75 originTranslator.addPair(RIGHTBASELINE, "rightBaseLine");
76 originTranslator.addPair(RIGHTBOTTOM, "rightBottom");
77 originTranslator.addPair(REFERENCE_POINT, "referencePoint");
79 // Fill the display translator
80 displayTranslator.addPair(MONOCHROME, "monochrome");
81 displayTranslator.addPair(GRAYSCALE, "grayscale");
82 displayTranslator.addPair(COLOR, "color");
83 displayTranslator.addPair(NONE, "none");
89 InsetGraphicsParams::InsetGraphicsParams(InsetGraphicsParams const & igp)
91 // I decided to skip the initialization since the copy will overwrite
98 InsetGraphicsParams::operator=(InsetGraphicsParams const & params)
100 // Are we assigning the object into itself?
108 void InsetGraphicsParams::init()
110 subcaptionText = filename = string();
111 display = MONOCHROME;
112 inlineFigure = false;
114 keepAspectRatio = true;
115 widthResize = DEFAULT_SIZE;
117 heightResize = DEFAULT_SIZE;
119 rotateOrigin = DEFAULT;
125 void InsetGraphicsParams::copy(InsetGraphicsParams const & igp)
127 filename = igp.filename;
128 display = igp.display;
129 inlineFigure = igp.inlineFigure;
130 subcaption = igp.subcaption;
131 subcaptionText = igp.subcaptionText;
132 keepAspectRatio = igp.keepAspectRatio;
133 widthResize = igp.widthResize;
134 widthSize = igp.widthSize;
135 heightResize = igp.heightResize;
136 heightSize = igp.heightSize;
137 rotateOrigin = igp.rotateOrigin;
138 rotateAngle = igp.rotateAngle;
143 void InsetGraphicsParams::testInvariant() const
145 // Filename might be empty (when the dialog is first created).
146 // Assert(!filename.empty());
148 Assert(display == COLOR ||
149 display == MONOCHROME ||
150 display == GRAYSCALE ||
154 Assert(widthResize == DEFAULT_SIZE ||
156 widthResize == INCH ||
157 widthResize == PERCENT_PAGE ||
158 widthResize == PERCENT_COLUMN
161 Assert(heightResize == DEFAULT_SIZE ||
162 heightResize == CM ||
163 heightResize == INCH ||
164 heightResize == PERCENT_PAGE
167 Assert(widthSize >= 0.0);
168 Assert(heightSize >= 0.0);
170 // Angle is in degrees and ranges -360 < angle < 360
171 // The reason for this is that in latex there is a meaning for the
172 // different angles and they are not necessarliy interchangeable,
173 // it depends on the rotation origin.
174 Assert(rotateAngle < 360);
175 Assert(rotateAngle > -360);
179 bool operator==(InsetGraphicsParams const & left,
180 InsetGraphicsParams const & right)
182 if (left.filename == right.filename &&
183 left.display == right.display &&
184 left.inlineFigure == right.inlineFigure &&
185 left.subcaption == right.subcaption &&
186 left.subcaptionText == right.subcaptionText &&
187 left.keepAspectRatio == right.keepAspectRatio &&
188 left.widthResize == right.widthResize &&
189 left.widthSize == right.widthSize &&
190 left.heightResize == right.heightResize &&
191 left.heightSize == right.heightSize &&
192 left.rotateOrigin == right.rotateOrigin &&
193 left.rotateAngle == right.rotateAngle
202 void writeResize(ostream & os, string const & key,
203 InsetGraphicsParams::Resize resize, double size)
205 os << ' ' << key << "Resize ";
207 os << resizeTranslator.find(resize);
209 // Old code, before using translators
211 case InsetGraphicsParams::DEFAULT_SIZE:
215 case InsetGraphicsParams::CM:
219 case InsetGraphicsParams::INCH:
223 case InsetGraphicsParams::PERCENT_PAGE:
224 os << "percentOfPage";
227 case InsetGraphicsParams::PERCENT_COLUMN:
228 os << "percentOfColumnt";
232 os << ' ' << key << ' ' << size << endl;
235 static void writeOrigin(ostream & os,
236 InsetGraphicsParams::Origin origin)
238 os << " rotateOrigin " << originTranslator.find(origin);
243 case InsetGraphicsParams:: DEFAULT:
246 case InsetGraphicsParams:: LEFTTOP:
249 case InsetGraphicsParams:: LEFTCENTER:
252 case InsetGraphicsParams:: LEFTBASELINE:
253 os << "LeftBaseLine";
255 case InsetGraphicsParams:: LEFTBOTTOM:
258 case InsetGraphicsParams:: CENTERTOP:
261 case InsetGraphicsParams:: CENTER:
264 case InsetGraphicsParams:: CENTERBASELINE:
265 os << "CenterBaseLine";
267 case InsetGraphicsParams:: CENTERBOTTOM:
268 os << "CenterBottom";
270 case InsetGraphicsParams:: RIGHTTOP:
273 case InsetGraphicsParams:: RIGHTCENTER:
276 case InsetGraphicsParams:: RIGHTBASELINE:
277 os << "RightBaseLine";
279 case InsetGraphicsParams:: RIGHTBOTTOM:
282 // Current REFERENCE_POINT is aliased to LEFTBASELINE
283 // case InsetGraphicsParams:: REFERENCE_POINT:
291 void InsetGraphicsParams::Write(Buffer const * buf, ostream & os) const
293 // If there is no filename, write nothing for it.
294 if (! filename.empty()) {
296 << MakeRelPath(filename, OnlyPath(buf->fileName()))
300 // Save the display type
301 os << " display " << displayTranslator.find(display) << endl;
323 // Save the inline status
327 // Save the subcaption status
331 if (! subcaptionText.empty())
332 os << " subcaptionText \"" << subcaptionText << '\"' << endl;
334 writeResize(os, "width", widthResize, widthSize);
335 writeResize(os, "height", heightResize, heightSize);
337 writeOrigin(os, rotateOrigin);
338 if (rotateAngle != 0)
339 os << " rotateAngle " << rotateAngle << endl;
342 static void readResize(InsetGraphicsParams * igp, bool height,
343 string const & token)
345 InsetGraphicsParams::Resize resize = InsetGraphicsParams::DEFAULT_SIZE;
347 resize = resizeTranslator.find(token);
349 // Old code, before translator.
350 if (token == "default")
351 resize = InsetGraphicsParams::DEFAULT_SIZE;
352 else if (token == "cm")
353 resize = InsetGraphicsParams::CM;
354 else if (token == "inch")
355 resize = InsetGraphicsParams::INCH;
356 else if (token == "percentOfPage")
357 resize = InsetGraphicsParams::PERCENT_PAGE;
358 else if (token == "percentOfColumn")
359 resize = InsetGraphicsParams::PERCENT_COLUMN;
361 lyxerr << "BUG: When reading resize value of InsetGraphicsParam"
362 " unknown token found '" << token << '\'' << endl;
367 igp->heightResize = resize;
369 igp->widthResize = resize;
372 static void readOrigin(InsetGraphicsParams * igp, string const & token)
373 { // TODO: complete this function.
374 igp->rotateOrigin = originTranslator.find(token);
377 bool InsetGraphicsParams::Read(Buffer const * buf, LyXLex & lex,
380 if (token == "filename") {
382 filename = lex.GetString();
384 if (!filename.empty()) {
385 // Make the filename with absolute directory.
386 filename = MakeAbsPath(filename, OnlyPath(buf->fileName()));
388 } else if (token == "display") {
390 string const type = lex.GetString();
392 display = displayTranslator.find(type);
396 else if (type == "grayscale")
398 else if (type == "monochrome")
399 display = MONOCHROME;
400 else if (type == "none")
403 display = MONOCHROME;
404 lyxerr << "BUG: When reading InsetGraphicsParams"
405 " display has an unknown type " << type << endl;
408 } else if (token == "inline") {
410 } else if (token == "subcaption") {
412 } else if (token == "subcaptionText") {
414 subcaptionText = lex.GetString();
415 } else if (token == "widthResize") {
417 string const token = lex.GetString();
419 readResize(this, false, token);
420 } else if (token == "width") {
422 widthSize = lex.GetFloat();
423 } else if (token == "heightResize") {
425 string const token = lex.GetString();
427 readResize(this, true, token);
428 } else if (token == "height") {
430 heightSize = lex.GetFloat();
431 } else if (token == "rotateOrigin") {
433 string const token = lex.GetString();
435 readOrigin(this, token);
436 } else if (token == "rotateAngle") {
438 rotateAngle = lex.GetInteger();
440 // If it's none of the above, its not ours.