X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2Finsets%2FInsetBox.cpp;h=7711277e0a90f2d6c22348fc8ebb1e3188ad19f2;hb=87a7f728ca9b8b4d358cf06de980f61b67a927ac;hp=0f5408751cf9be809ed8a7e7089de618ed2c6587;hpb=46671b58366c3112bceb8e9b44c2e7c225407a93;p=lyx.git diff --git a/src/insets/InsetBox.cpp b/src/insets/InsetBox.cpp index 0f5408751c..7711277e0a 100644 --- a/src/insets/InsetBox.cpp +++ b/src/insets/InsetBox.cpp @@ -27,6 +27,8 @@ #include "Lexer.h" #include "MetricsInfo.h" #include "output_xhtml.h" +#include "TexRow.h" +#include "texstream.h" #include "TextClass.h" #include "support/debug.h" @@ -90,7 +92,7 @@ BoxTranslatorLoc const & boxtranslator_loc() return translator; } -} // namespace anon +} // namespace ///////////////////////////////////////////////////////////////////////// @@ -100,7 +102,7 @@ BoxTranslatorLoc const & boxtranslator_loc() ///////////////////////////////////////////////////////////////////////// InsetBox::InsetBox(Buffer * buffer, string const & label) - : InsetCollapsable(buffer), params_(label) + : InsetCollapsible(buffer), params_(label) {} @@ -114,14 +116,14 @@ docstring InsetBox::layoutName() const void InsetBox::write(ostream & os) const { params_.write(os); - InsetCollapsable::write(os); + InsetCollapsible::write(os); } void InsetBox::read(Lexer & lex) { params_.read(lex); - InsetCollapsable::read(lex); + InsetCollapsible::read(lex); } @@ -158,12 +160,18 @@ void InsetBox::setButtonLabel() label = bformat(_("%1$s (%2$s, %3$s)"), type, inner, frame); setLabel(label); + + // set the frame color for the inset if the type is Boxed + if (btype == Boxed) + setFrameColor(lcolor.getFromLaTeXName(params_.framecolor)); + else + setFrameColor(Color_collapsibleframe); } bool InsetBox::hasFixedWidth() const { - return !params_.width.empty(); + return !params_.width.empty() && params_.special == "none"; } @@ -174,15 +182,15 @@ bool InsetBox::allowMultiPar() const } -void InsetBox::metrics(MetricsInfo & m, Dimension & dim) const +void InsetBox::metrics(MetricsInfo & mi, Dimension & dim) const { // back up textwidth. - int textwidth_backup = m.base.textwidth; + int textwidth_backup = mi.base.textwidth; if (hasFixedWidth()) - m.base.textwidth = params_.width.inPixels(m.base); - InsetCollapsable::metrics(m, dim); + mi.base.textwidth = mi.base.inPixels(params_.width); + InsetCollapsible::metrics(mi, dim); // retore textwidth. - m.base.textwidth = textwidth_backup; + mi.base.textwidth = textwidth_backup; } @@ -193,30 +201,68 @@ bool InsetBox::forcePlainLayout(idx_type) const } +bool InsetBox::needsCProtection(bool const maintext, bool const fragile) const +{ + // We need to cprotect boxes that use minipages as inner box + // in fragile context + if (fragile && params_.inner_box && !params_.use_parbox && !params_.use_makebox) + return true; + + return InsetText::needsCProtection(maintext, fragile); +} + + ColorCode InsetBox::backgroundColor(PainterInfo const &) const { // we only support background color for 3 types if (params_.type != "Shaded" && params_.type != "Frameless" && params_.type != "Boxed") return getLayout().bgcolor(); + if (params_.type == "Shaded") { // FIXME: This hardcoded color is a hack! if (buffer().params().boxbgcolor == lyx::rgbFromHexName("#ff0000")) return getLayout().bgcolor(); - + ColorCode c = lcolor.getFromLyXName("boxbgcolor"); if (c == Color_none) return getLayout().bgcolor(); return c; - } else { - if (params_.backgroundcolor == "none") - return getLayout().bgcolor(); - ColorCode boxbackground = lcolor.getFromLyXName(params_.backgroundcolor); - return boxbackground; } + + if (params_.backgroundcolor != "none") + return lcolor.getFromLaTeXName(params_.backgroundcolor); + return getLayout().bgcolor(); } +LyXAlignment InsetBox::contentAlignment() const +{ + // Custom horizontal alignment is only allowed with a fixed width + // and if either makebox or no inner box are used + if (params_.width.empty() || !(params_.use_makebox || !params_.inner_box)) + return LYX_ALIGN_NONE; + + // The default value below is actually irrelevant + LyXAlignment align = LYX_ALIGN_NONE; + switch (params_.hor_pos) { + case 'l': + align = LYX_ALIGN_LEFT; + break; + case 'c': + align = LYX_ALIGN_CENTER; + break; + case 'r': + align = LYX_ALIGN_RIGHT; + break; + case 's': + align = LYX_ALIGN_BLOCK; + break; + } + return align; +} + + void InsetBox::doDispatch(Cursor & cur, FuncRequest & cmd) { switch (cmd.action()) { @@ -233,16 +279,28 @@ void InsetBox::doDispatch(Cursor & cur, FuncRequest & cmd) return; } cur.recordUndoInset(this); - if (change_type) + if (change_type) { params_.type = cmd.getArg(1); - else // if (for_box) + // set a makebox if there is no inner box but Frameless was exectued + // otherwise the result would be a non existent box (no inner AND outer box) + // (this was LyX bug 8712) + if (params_.type == "Frameless" && !params_.inner_box) { + params_.use_makebox = true; + params_.inner_box = true; + } + // handle the opposite case + if (params_.type == "Boxed" && params_.use_makebox) { + params_.use_makebox = false; + params_.inner_box = false; + } + } else string2params(to_utf8(cmd.argument()), params_); setButtonLabel(); break; } default: - InsetCollapsable::doDispatch(cur, cmd); + InsetCollapsible::doDispatch(cur, cmd); break; } } @@ -265,7 +323,7 @@ bool InsetBox::getStatus(Cursor & cur, FuncRequest const & cmd, flag.setEnabled(true); return true; } - return InsetCollapsable::getStatus(cur, cmd, flag); + return InsetCollapsible::getStatus(cur, cmd, flag); } case LFUN_INSET_DIALOG_UPDATE: @@ -273,7 +331,7 @@ bool InsetBox::getStatus(Cursor & cur, FuncRequest const & cmd, return true; default: - return InsetCollapsable::getStatus(cur, cmd, flag); + return InsetCollapsible::getStatus(cur, cmd, flag); } } @@ -291,6 +349,7 @@ void InsetBox::latex(otexstream & os, OutputParams const & runparams) const string separation_string = params_.separation.asLatexString(); string shadowsize_string = params_.shadowsize.asLatexString(); bool stdwidth = false; + string const cprotect = hasCProtectContent(runparams.moving_arg) ? "\\cprotect" : string(); // in general the overall width of some decorated boxes is wider thean the inner box // we could therefore calculate the real width for all sizes so that if the user wants // e.g. 0.1\columnwidth or 2cm he gets exactly this size @@ -374,13 +433,14 @@ void InsetBox::latex(otexstream & os, OutputParams const & runparams) const } else os << '[' << from_ascii(width_string) << ']'; + // default horizontal alignment is 'c' if (params_.hor_pos != 'c') os << "[" << params_.hor_pos << "]"; } else { if (params_.framecolor != "black" || params_.backgroundcolor != "none") os << "\\fcolorbox{" << params_.framecolor << "}{" << params_.backgroundcolor << "}"; else - os << "\\fbox"; + os << cprotect << "\\fbox"; } os << "{"; break; @@ -441,7 +501,7 @@ void InsetBox::latex(otexstream & os, OutputParams const & runparams) const if (!width_string.empty()) { if (params_.backgroundcolor != "none") os << "\\colorbox{" << params_.backgroundcolor << "}{"; - os << "\\makebox{"; + os << "\\makebox"; // FIXME UNICODE // output the width and horizontal position if (params_.special != "none") { @@ -455,10 +515,11 @@ void InsetBox::latex(otexstream & os, OutputParams const & runparams) const os << "[" << params_.hor_pos << "]"; } else { if (params_.backgroundcolor != "none") - os << "\\colorbox{" << params_.backgroundcolor << "}{"; + os << "\\colorbox{" << params_.backgroundcolor << "}"; else - os << "\\mbox{"; + os << "\\mbox"; } + os << "{"; } else { if (params_.backgroundcolor != "none" && btype == Frameless) @@ -501,23 +562,6 @@ void InsetBox::latex(otexstream & os, OutputParams const & runparams) const os << "\\begin{shaded}%\n"; } - // \framebox and \makebox handle hor_pos their own way - // hor_pos is senseless for \mbox and \fbox - if (!(params_.use_makebox) - && !(btype == Boxed && !params_.inner_box)) { - switch (params_.hor_pos) { - case 'l': - // do nothing because this is LaTeX's default - break; - case 'c': - os << "\\centering "; - break; - case 'r': - os << "\\raggedleft "; - break; - } - } - InsetText::latex(os, runparams); if (btype == Shaded) @@ -700,7 +744,7 @@ void InsetBox::validate(LaTeXFeatures & features) const features.require("framed"); break; } - InsetCollapsable::validate(features); + InsetCollapsible::validate(features); }