X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2Finsets%2FInsetBox.cpp;h=25911bc985f4f0b0612c1a0b4b8a0cc56e818652;hb=4a1be58591ea5a7431d9426abb27d8b946c634cb;hp=cd4a1d62b80619d4632d3ff7c522d4f4170db031;hpb=a3dfd2f10bfc1c07a6a569a63f33be246ee31924;p=lyx.git diff --git a/src/insets/InsetBox.cpp b/src/insets/InsetBox.cpp index cd4a1d62b8..25911bc985 100644 --- a/src/insets/InsetBox.cpp +++ b/src/insets/InsetBox.cpp @@ -15,19 +15,23 @@ #include "InsetBox.h" #include "Buffer.h" +#include "BufferParams.h" #include "BufferView.h" #include "Cursor.h" #include "DispatchResult.h" -#include "support/debug.h" #include "FuncStatus.h" #include "FuncRequest.h" #include "support/gettext.h" #include "LaTeXFeatures.h" #include "Lexer.h" #include "MetricsInfo.h" +#include "TextClass.h" +#include "support/debug.h" #include "support/Translator.h" +#include "frontends/Application.h" + #include using namespace std; @@ -39,7 +43,7 @@ namespace { typedef Translator BoxTranslator; typedef Translator BoxTranslatorLoc; -BoxTranslator const init_boxtranslator() +BoxTranslator initBoxtranslator() { BoxTranslator translator("Boxed", InsetBox::Boxed); translator.addPair("Frameless", InsetBox::Frameless); @@ -53,7 +57,7 @@ BoxTranslator const init_boxtranslator() } -BoxTranslatorLoc const init_boxtranslator_loc() +BoxTranslatorLoc initBoxtranslatorLoc() { BoxTranslatorLoc translator(_("simple frame"), InsetBox::Boxed); translator.addPair(_("frameless"), InsetBox::Frameless); @@ -69,43 +73,41 @@ BoxTranslatorLoc const init_boxtranslator_loc() BoxTranslator const & boxtranslator() { - static BoxTranslator translator = init_boxtranslator(); + static BoxTranslator translator = initBoxtranslator(); return translator; } BoxTranslatorLoc const & boxtranslator_loc() { - static BoxTranslatorLoc translator = init_boxtranslator_loc(); + static BoxTranslatorLoc translator = initBoxtranslatorLoc(); return translator; } -} // anon +} // namespace anon -InsetBox::InsetBox(BufferParams const & bp, string const & label) - : InsetCollapsable(bp), params_(label) -{} - +///////////////////////////////////////////////////////////////////////// +// +// InsetBox +// +///////////////////////////////////////////////////////////////////////// -InsetBox::InsetBox(InsetBox const & in) - : InsetCollapsable(in), params_(in.params_) -{} - - -InsetBox::~InsetBox() +InsetBox::InsetBox(Buffer const & buffer, string const & label) + : InsetCollapsable(buffer), params_(label) { - InsetBoxMailer(*this).hideDialog(); + if (forceEmptyLayout()) + paragraphs().back().setLayout(buffer.params().documentClass().emptyLayout()); } -Inset * InsetBox::clone() const +InsetBox::~InsetBox() { - return new InsetBox(*this); + hideDialogs("box", this); } -docstring const InsetBox::editMessage() const +docstring InsetBox::editMessage() const { return _("Opened Box Inset"); } @@ -114,24 +116,24 @@ docstring const InsetBox::editMessage() const docstring InsetBox::name() const { // FIXME: UNICODE - string name = string("Box"); + string name = "Box"; if (boxtranslator().find(params_.type) == Shaded) - name += string(":Shaded"); + name += ":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); + InsetCollapsable::read(lex); } @@ -147,8 +149,9 @@ void InsetBox::setButtonLabel() label += _("Parbox"); else label += _("Minipage"); - } else + } else { label += boxtranslator_loc().find(btype); + } label += ")"; setLabel(label); @@ -157,7 +160,7 @@ void InsetBox::setButtonLabel() bool InsetBox::hasFixedWidth() const { - return params_.inner_box || params_.special != "width"; + return params_.inner_box || params_.special != "width"; } @@ -173,15 +176,16 @@ void InsetBox::metrics(MetricsInfo & m, Dimension & dim) const } -bool InsetBox::forceDefaultParagraphs(idx_type) const +bool InsetBox::forceEmptyLayout(idx_type) const { - return !params_.inner_box; + return !params_.inner_box && params_.type != "Framed"; } bool InsetBox::showInsetDialog(BufferView * bv) const { - InsetBoxMailer(const_cast(*this)).showDialog(bv); + bv->showDialog("box", params2string(params_), + const_cast(this)); return true; } @@ -192,21 +196,16 @@ void InsetBox::doDispatch(Cursor & cur, FuncRequest & cmd) case LFUN_INSET_MODIFY: { //lyxerr << "InsetBox::dispatch MODIFY" << endl; - InsetBoxMailer::string2params(to_utf8(cmd.argument()), params_); + if (cmd.getArg(0) == "changetype") + params_.type = cmd.getArg(1); + else + string2params(to_utf8(cmd.argument()), params_); setLayout(cur.buffer().params()); break; } case LFUN_INSET_DIALOG_UPDATE: - InsetBoxMailer(*this).updateDialog(&cur.bv()); - break; - - case LFUN_MOUSE_RELEASE: - if (cmd.button() == mouse_button::button3 && hitButton(cmd)) { - InsetBoxMailer(*this).showDialog(&cur.bv()); - break; - } - InsetCollapsable::doDispatch(cur, cmd); + cur.bv().updateDialog("box", params2string(params_)); break; default: @@ -222,16 +221,20 @@ bool InsetBox::getStatus(Cursor & cur, FuncRequest const & cmd, switch (cmd.action) { case LFUN_INSET_MODIFY: + if (cmd.getArg(0) == "changetype") + flag.setOnOff(cmd.getArg(1) == params_.type); + flag.setEnabled(true); + return true; + case LFUN_INSET_DIALOG_UPDATE: - flag.enabled(true); + flag.setEnabled(true); return true; + case LFUN_BREAK_PARAGRAPH: - if (params_.inner_box) { + if (params_.inner_box || params_.type == "Framed") return InsetCollapsable::getStatus(cur, cmd, flag); - } else { - flag.enabled(false); - return true; - } + flag.setEnabled(false); + return true; default: return InsetCollapsable::getStatus(cur, cmd, flag); @@ -239,20 +242,12 @@ bool InsetBox::getStatus(Cursor & cur, FuncRequest const & cmd, } -bool InsetBox::isMacroScope(Buffer const &) const -{ - BoxType btype = boxtranslator().find(params_.type); - return btype != Frameless || params_.inner_box; -} - - -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)) { @@ -363,13 +358,14 @@ int InsetBox::latex(Buffer const & buf, odocstream & os, if (params_.use_parbox) os << "{"; os << "%\n"; - i += 1; + ++i; } - if (btype == Shaded) + if (btype == Shaded) { os << "\\begin{shaded}%\n"; - i += 1; + ++i; + } - i += InsetText::latex(buf, os, runparams); + i += InsetText::latex(os, runparams); if (btype == Shaded) os << "\\end{shaded}"; @@ -409,8 +405,7 @@ int InsetBox::latex(Buffer const & buf, odocstream & os, } -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); @@ -436,7 +431,7 @@ int InsetBox::plaintext(Buffer const & buf, odocstream & os, break; } - InsetText::plaintext(buf, os, runparams); + InsetText::plaintext(os, runparams); int len = 0; switch (btype) { @@ -471,10 +466,9 @@ int InsetBox::plaintext(Buffer const & buf, odocstream & os, } -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); } @@ -506,21 +500,13 @@ void InsetBox::validate(LaTeXFeatures & features) const } -InsetBoxMailer::InsetBoxMailer(InsetBox & inset) - : inset_(inset) -{} - - -string const InsetBoxMailer::name_ = "box"; - - -string const InsetBoxMailer::inset2string(Buffer const &) const +docstring InsetBox::contextMenu(BufferView const &, int, int) const { - return params2string(inset_.params()); + return from_ascii("context-box"); } -string const InsetBoxMailer::params2string(InsetBoxParams const & params) +string InsetBox::params2string(InsetBoxParams const & params) { ostringstream data; data << "box" << ' '; @@ -529,33 +515,43 @@ string const InsetBoxMailer::params2string(InsetBoxParams const & params) } -void InsetBoxMailer::string2params(string const & in, - InsetBoxParams & params) +void InsetBox::string2params(string const & in, InsetBoxParams & params) { params = InsetBoxParams(string()); if (in.empty()) return; istringstream data(in); - Lexer lex(0,0); + Lexer lex; lex.setStream(data); string name; lex >> name; - if (!lex || name != name_) - return print_mailer_error("InsetBoxMailer", in, 1, name_); + if (!lex || name != "box") { + LYXERR0("InsetBox::string2params(" << in << ")\n" + "Expected arg 1 to be \"box\"\n"); + return; + } // This is part of the inset proper that is usually swallowed // by Text::readInset string id; lex >> id; - if (!lex || id != "Box") - return print_mailer_error("InsetBoxMailer", in, 2, "Box"); + if (!lex || id != "Box") { + LYXERR0("InsetBox::string2params(" << in << ")\n" + "Expected arg 2 to be \"Box\"\n"); + } params.read(lex); } +///////////////////////////////////////////////////////////////////////// +// +// InsetBoxParams +// +///////////////////////////////////////////////////////////////////////// + InsetBoxParams::InsetBoxParams(string const & label) : type(label), use_parbox(false), @@ -587,126 +583,19 @@ void InsetBoxParams::write(ostream & os) const void InsetBoxParams::read(Lexer & lex) { - if (!lex.isOK()) - return; - - lex.next(); - type = lex.getString(); - - if (!lex) - return; - - lex.next(); - string token; - token = lex.getString(); - if (!lex) - return; - if (token == "position") { - lex.next(); - // The [0] is needed. We need the first and only char in - // this string -- MV - pos = lex.getString()[0]; - } else { - lyxerr << "InsetBox::Read: Missing 'position'-tag!" << token << endl; - lex.pushToken(token); - } - - lex.next(); - token = lex.getString(); - if (!lex) - return; - if (token == "hor_pos") { - lex.next(); - hor_pos = lex.getString()[0]; - } else { - lyxerr << "InsetBox::Read: Missing 'hor_pos'-tag!" << token << endl; - lex.pushToken(token); - } - - lex.next(); - token = lex.getString(); - if (!lex) - return; - if (token == "has_inner_box") { - lex.next(); - inner_box = lex.getInteger(); - } else { - lyxerr << "InsetBox::Read: Missing 'has_inner_box'-tag!" << endl; - lex.pushToken(token); - } - - lex.next(); - token = lex.getString(); - if (!lex) - return; - if (token == "inner_pos") { - lex.next(); - inner_pos = lex.getString()[0]; - } else { - lyxerr << "InsetBox::Read: Missing 'inner_pos'-tag!" - << token << endl; - lex.pushToken(token); - } - - lex.next(); - token = lex.getString(); - if (!lex) - return; - if (token == "use_parbox") { - lex.next(); - use_parbox = lex.getInteger(); - } else { - lyxerr << "InsetBox::Read: Missing 'use_parbox'-tag!" << endl; - lex.pushToken(token); - } - - lex.next(); - token = lex.getString(); - if (!lex) - return; - if (token == "width") { - lex.next(); - width = Length(lex.getString()); - } else { - lyxerr << "InsetBox::Read: Missing 'width'-tag!" << endl; - lex.pushToken(token); - } - - lex.next(); - token = lex.getString(); - if (!lex) - return; - if (token == "special") { - lex.next(); - special = lex.getString(); - } else { - lyxerr << "InsetBox::Read: Missing 'special'-tag!" << endl; - lex.pushToken(token); - } - - lex.next(); - token = lex.getString(); - if (!lex) - return; - if (token == "height") { - lex.next(); - height = Length(lex.getString()); - } else { - lyxerr << "InsetBox::Read: Missing 'height'-tag!" << endl; - lex.pushToken(token); - } - - lex.next(); - token = lex.getString(); - if (!lex) - return; - if (token == "height_special") { - lex.next(); - height_special = lex.getString(); - } else { - lyxerr << "InsetBox::Read: Missing 'height_special'-tag!" << endl; - lex.pushToken(token); - } + lex.setContext("InsetBoxParams::read"); + lex >> type; + lex >> "position" >> pos; + lex >> "hor_pos" >> hor_pos; + lex >> "has_inner_box" >> inner_box; + if (type == "Framed") + inner_box = false; + lex >> "inner_pos" >> inner_pos; + lex >> "use_parbox" >> use_parbox; + lex >> "width" >> width; + lex >> "special" >> special; + lex >> "height" >> height; + lex >> "height_special" >> height_special; }