X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2Finsets%2FInsetBox.cpp;h=ec99e94b59ab7c24f94bd60513a549c72482d568;hb=76dc2c0d3002db400f4826e6f3b3e8bf84f830f4;hp=91fccc39482f894f9ea84f5725105b5de5a6d365;hpb=42123ab8a71080b6d15fca4e0c43ae76abf00a1e;p=lyx.git diff --git a/src/insets/InsetBox.cpp b/src/insets/InsetBox.cpp index 91fccc3948..ec99e94b59 100644 --- a/src/insets/InsetBox.cpp +++ b/src/insets/InsetBox.cpp @@ -14,47 +14,42 @@ #include "InsetBox.h" +#include "Buffer.h" +#include "BufferParams.h" #include "BufferView.h" #include "Cursor.h" #include "DispatchResult.h" -#include "debug.h" #include "FuncStatus.h" #include "FuncRequest.h" -#include "gettext.h" +#include "support/gettext.h" #include "LaTeXFeatures.h" -#include "LColor.h" #include "Lexer.h" #include "MetricsInfo.h" -#include "Paragraph.h" -#include "TextMetrics.h" +#include "TextClass.h" +#include "support/debug.h" #include "support/Translator.h" #include +using namespace std; namespace lyx { -using std::auto_ptr; -using std::string; -using std::istringstream; -using std::ostream; -using std::ostringstream; -using std::endl; - - namespace { -typedef Translator BoxTranslator; +typedef Translator BoxTranslator; typedef Translator BoxTranslatorLoc; BoxTranslator const init_boxtranslator() { BoxTranslator translator("Boxed", InsetBox::Boxed); translator.addPair("Frameless", InsetBox::Frameless); + translator.addPair("Framed", InsetBox::Framed); translator.addPair("ovalbox", InsetBox::ovalbox); translator.addPair("Ovalbox", InsetBox::Ovalbox); translator.addPair("Shadowbox", InsetBox::Shadowbox); + translator.addPair("Shaded", InsetBox::Shaded); translator.addPair("Doublebox",InsetBox::Doublebox); return translator; } @@ -62,12 +57,14 @@ BoxTranslator const init_boxtranslator() BoxTranslatorLoc const init_boxtranslator_loc() { - BoxTranslatorLoc translator(_("Boxed"), InsetBox::Boxed); - translator.addPair(_("Frameless"), InsetBox::Frameless); - translator.addPair(_("ovalbox"), InsetBox::ovalbox); - translator.addPair(_("Ovalbox"), InsetBox::Ovalbox); - translator.addPair(_("Shadowbox"), InsetBox::Shadowbox); - translator.addPair(_("Doublebox"), InsetBox::Doublebox); + BoxTranslatorLoc translator(_("simple frame"), InsetBox::Boxed); + translator.addPair(_("frameless"), InsetBox::Frameless); + translator.addPair(_("simple frame, page breaks"), InsetBox::Framed); + translator.addPair(_("oval, thin"), InsetBox::ovalbox); + translator.addPair(_("oval, thick"), InsetBox::Ovalbox); + translator.addPair(_("drop shadow"), InsetBox::Shadowbox); + translator.addPair(_("shaded background"), InsetBox::Shaded); + translator.addPair(_("double frame"), InsetBox::Doublebox); return translator; } @@ -88,24 +85,11 @@ BoxTranslatorLoc const & boxtranslator_loc() } // anon -void InsetBox::init() +InsetBox::InsetBox(Buffer const & buffer, string const & label) + : InsetCollapsable(buffer), params_(label) { - setInsetName(from_ascii("Box")); - setButtonLabel(); -} - - -InsetBox::InsetBox(BufferParams const & bp, string const & label) - : InsetCollapsable(bp), params_(label) -{ - init(); -} - - -InsetBox::InsetBox(InsetBox const & in) - : InsetCollapsable(in), params_(in.params_) -{ - init(); + if (forceEmptyLayout()) + paragraphs().back().setLayout(buffer.params().documentClass().emptyLayout()); } @@ -115,39 +99,38 @@ InsetBox::~InsetBox() } -auto_ptr InsetBox::doClone() const +docstring InsetBox::editMessage() const { - return auto_ptr(new InsetBox(*this)); + return _("Opened Box Inset"); } -docstring const InsetBox::editMessage() const +docstring InsetBox::name() const { - return _("Opened Box Inset"); + // FIXME: UNICODE + string name = "Box"; + if (boxtranslator().find(params_.type) == Shaded) + name += string(":Shaded"); + return from_ascii(name); } -void InsetBox::write(Buffer const & buf, ostream & os) const +void InsetBox::write(ostream & os) const { params_.write(os); - InsetCollapsable::write(buf, os); + InsetCollapsable::write(os); } -void InsetBox::read(Buffer const & buf, Lexer & lex) +void InsetBox::read(Lexer & lex) { params_.read(lex); - InsetCollapsable::read(buf, lex); - setButtonLabel(); + InsetCollapsable::read(lex); } void InsetBox::setButtonLabel() { - LyXFont font(LyXFont::ALL_SANE); - font.decSize(); - font.decSize(); - BoxType btype = boxtranslator().find(params_.type); docstring label; @@ -163,37 +146,28 @@ void InsetBox::setButtonLabel() label += ")"; setLabel(label); - - font.setColor(LColor::foreground); - setBackgroundColor(LColor::background); - setLabelFont(font); } bool InsetBox::hasFixedWidth() const { - return params_.inner_box || params_.special != "width"; + return params_.inner_box || params_.special != "width"; } -bool InsetBox::metrics(MetricsInfo & m, Dimension & dim) const +void InsetBox::metrics(MetricsInfo & m, Dimension & dim) const { - MetricsInfo mi = m; - // first round in order to know the minimum size. - InsetCollapsable::metrics(mi, dim); - TextMetrics & tm = mi.base.bv->textMetrics(&text_); + // back up textwidth. + int textwidth_backup = m.base.textwidth; if (hasFixedWidth()) - mi.base.textwidth = - std::max(tm.width() + 2 * border_ + (int) (2.5 * TEXT_TO_INSET_OFFSET), - params_.width.inPixels(m.base.textwidth)); - InsetCollapsable::metrics(mi, dim); - bool const changed = dim_ != dim; - dim_ = dim; - return changed; + m.base.textwidth = params_.width.inPixels(m.base.textwidth); + InsetCollapsable::metrics(m, dim); + // retore textwidth. + m.base.textwidth = textwidth_backup; } -bool InsetBox::forceDefaultParagraphs(idx_type) const +bool InsetBox::forceEmptyLayout() const { return !params_.inner_box; } @@ -213,7 +187,7 @@ void InsetBox::doDispatch(Cursor & cur, FuncRequest & cmd) case LFUN_INSET_MODIFY: { //lyxerr << "InsetBox::dispatch MODIFY" << endl; InsetBoxMailer::string2params(to_utf8(cmd.argument()), params_); - setButtonLabel(); + setLayout(cur.buffer().params()); break; } @@ -259,21 +233,22 @@ bool InsetBox::getStatus(Cursor & cur, FuncRequest const & cmd, } -int InsetBox::latex(Buffer const & buf, odocstream & os, - OutputParams const & runparams) const +int InsetBox::latex(odocstream & os, OutputParams const & runparams) const { BoxType btype = boxtranslator().find(params_.type); string width_string = params_.width.asLatexString(); - bool stdwidth(false); + bool stdwidth = false; if (params_.inner_box && (width_string.find("1.0\\columnwidth") != string::npos || width_string.find("1.0\\textwidth") != string::npos)) { stdwidth = true; switch (btype) { case Frameless: + case Framed: break; case Boxed: + case Shaded: width_string += " - 2\\fboxsep - 2\\fboxrule"; break; case ovalbox: @@ -287,7 +262,7 @@ int InsetBox::latex(Buffer const & buf, odocstream & os, width_string += " - 2\\fboxsep - 2\\fboxrule"/* "-\\shadowsize"*/; break; case Doublebox: - width_string += " - 2\\fboxsep - 7.5\\fboxrule - 1.0pt"; + width_string += " - 2\\fboxsep - 7.5\\fboxrule - 1pt"; break; } } @@ -301,6 +276,10 @@ int InsetBox::latex(Buffer const & buf, odocstream & os, switch (btype) { case Frameless: break; + case Framed: + os << "\\begin{framed}%\n"; + i += 1; + break; case Boxed: os << "\\framebox"; if (!params_.inner_box) { @@ -329,6 +308,9 @@ int InsetBox::latex(Buffer const & buf, odocstream & os, case Shadowbox: os << "\\shadowbox{"; break; + case Shaded: + // later + break; case Doublebox: os << "\\doublebox{"; break; @@ -343,14 +325,20 @@ int InsetBox::latex(Buffer const & buf, odocstream & os, os << "[" << params_.pos << "]"; if (params_.height_special == "none") { // FIXME UNICODE - os << '[' << from_ascii(params_.height.asLatexString()) - << ']'; + os << "[" << from_ascii(params_.height.asLatexString()) << "]"; } else { // Special heights - // FIXME UNICODE - os << "[" << params_.height.value() - << '\\' << from_utf8(params_.height_special) - << ']'; + // set no optional argument when the value is the default "1\height" + // (special units like \height are handled as "in") + // but when the user has chosen a non-default inner_pos, the height + // must be given: \minipage[pos][height][inner-pos]{width} + if ((params_.height != Length("1in") || + params_.height_special != "totalheight") || + params_.inner_pos != params_.pos) { + // FIXME UNICODE + os << "[" << params_.height.value() + << "\\" << from_utf8(params_.height_special) << "]"; + } } if (params_.inner_pos != params_.pos) os << "[" << params_.inner_pos << "]"; @@ -363,8 +351,14 @@ int InsetBox::latex(Buffer const & buf, odocstream & os, os << "%\n"; i += 1; } + if (btype == Shaded) + os << "\\begin{shaded}%\n"; + i += 1; - i += InsetText::latex(buf, os, runparams); + i += InsetText::latex(os, runparams); + + if (btype == Shaded) + os << "\\end{shaded}"; if (params_.inner_box) { if (params_.use_parbox) @@ -376,6 +370,9 @@ int InsetBox::latex(Buffer const & buf, odocstream & os, switch (btype) { case Frameless: break; + case Framed: + os << "\\end{framed}"; + break; case Boxed: if (!params_.inner_box) os << "}"; // for makebox @@ -387,49 +384,81 @@ int InsetBox::latex(Buffer const & buf, odocstream & os, case Shadowbox: os << "}"; break; + case Shaded: + // already done + break; } - os << "%\n"; - i += 3; + i += 2; return i; } -int InsetBox::plaintext(Buffer const & buf, odocstream & os, - OutputParams const & runparams) const +int InsetBox::plaintext(odocstream & os, OutputParams const & runparams) const { BoxType const btype = boxtranslator().find(params_.type); switch (btype) { - case Frameless: break; - case Boxed: os << "[\n"; break; - case ovalbox: os << "(\n"; break; - case Ovalbox: os << "((\n"; break; - case Shadowbox: os << "[/\n"; break; - case Doublebox: os << "[[\n"; break; + case Frameless: + break; + case Framed: + case Boxed: + os << "[\n"; + break; + case ovalbox: + os << "(\n"; + break; + case Ovalbox: + os << "((\n"; + break; + case Shadowbox: + case Shaded: + os << "[/\n"; + break; + case Doublebox: + os << "[[\n"; + break; } - InsetText::plaintext(buf, os, runparams); + InsetText::plaintext(os, runparams); int len = 0; switch (btype) { - case Frameless: os << "\n"; break; - case Boxed: os << "\n]"; len = 1; break; - case ovalbox: os << "\n)"; len = 1; break; - case Ovalbox: os << "\n))"; len = 2; break; - case Shadowbox: os << "\n/]"; len = 2; break; - case Doublebox: os << "\n]]"; len = 2; break; + case Frameless: + os << "\n"; + break; + case Framed: + case Boxed: + os << "\n]"; + len = 1; + break; + case ovalbox: + os << "\n)"; + len = 1; + break; + case Ovalbox: + os << "\n))"; + len = 2; + break; + case Shadowbox: + case Shaded: + os << "\n/]"; + len = 2; + break; + case Doublebox: + os << "\n]]"; + len = 2; + break; } return PLAINTEXT_NEWLINE + len; // len chars on a separate line } -int InsetBox::docbook(Buffer const & buf, odocstream & os, - OutputParams const & runparams) const +int InsetBox::docbook(odocstream & os, OutputParams const & runparams) const { - return InsetText::docbook(buf, os, runparams); + return InsetText::docbook(os, runparams); } @@ -439,6 +468,9 @@ void InsetBox::validate(LaTeXFeatures & features) const switch (btype) { case Frameless: break; + case Framed: + features.require("framed"); + break; case Boxed: features.require("calc"); break; @@ -449,6 +481,10 @@ void InsetBox::validate(LaTeXFeatures & features) const features.require("calc"); features.require("fancybox"); break; + case Shaded: + features.require("color"); + features.require("framed"); + break; } InsetText::validate(features); } @@ -494,7 +530,7 @@ void InsetBoxMailer::string2params(string const & in, return print_mailer_error("InsetBoxMailer", in, 1, name_); // This is part of the inset proper that is usually swallowed - // by LyXText::readInset + // by Text::readInset string id; lex >> id; if (!lex || id != "Box") @@ -508,12 +544,12 @@ InsetBoxParams::InsetBoxParams(string const & label) : type(label), use_parbox(false), inner_box(true), - width(LyXLength("100col%")), + width(Length("100col%")), special("none"), pos('t'), hor_pos('c'), inner_pos('t'), - height(LyXLength("1in")), + height(Length("1in")), height_special("totalheight") // default is 1\\totalheight {} @@ -614,7 +650,7 @@ void InsetBoxParams::read(Lexer & lex) return; if (token == "width") { lex.next(); - width = LyXLength(lex.getString()); + width = Length(lex.getString()); } else { lyxerr << "InsetBox::Read: Missing 'width'-tag!" << endl; lex.pushToken(token); @@ -638,7 +674,7 @@ void InsetBoxParams::read(Lexer & lex) return; if (token == "height") { lex.next(); - height = LyXLength(lex.getString()); + height = Length(lex.getString()); } else { lyxerr << "InsetBox::Read: Missing 'height'-tag!" << endl; lex.pushToken(token);