X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2Finsets%2FInsetBox.cpp;h=8a867ee234fc4066a81040aae14b2c4847ad46c4;hb=2d48072e664099385b2442f7166b3c57129799bb;hp=28d79c08de85cea8355bde442e0fa9230fcff9b9;hpb=670efa8f646218f2a378f0cc614c4c37a9f6b89a;p=lyx.git diff --git a/src/insets/InsetBox.cpp b/src/insets/InsetBox.cpp index 28d79c08de..8a867ee234 100644 --- a/src/insets/InsetBox.cpp +++ b/src/insets/InsetBox.cpp @@ -92,7 +92,7 @@ BoxTranslatorLoc const & boxtranslator_loc() return translator; } -} // namespace anon +} // namespace ///////////////////////////////////////////////////////////////////////// @@ -102,7 +102,7 @@ BoxTranslatorLoc const & boxtranslator_loc() ///////////////////////////////////////////////////////////////////////// InsetBox::InsetBox(Buffer * buffer, string const & label) - : InsetCollapsable(buffer), params_(label) + : InsetCollapsible(buffer), params_(label) {} @@ -116,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); } @@ -165,7 +165,7 @@ void InsetBox::setButtonLabel() if (btype == Boxed) setFrameColor(lcolor.getFromLaTeXName(params_.framecolor)); else - setFrameColor(Color_collapsableframe); + setFrameColor(Color_collapsibleframe); } @@ -182,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; } @@ -201,6 +201,17 @@ 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 @@ -227,7 +238,9 @@ ColorCode InsetBox::backgroundColor(PainterInfo const &) const LyXAlignment InsetBox::contentAlignment() const { - if (!params_.use_makebox) + // 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 @@ -287,7 +300,7 @@ void InsetBox::doDispatch(Cursor & cur, FuncRequest & cmd) } default: - InsetCollapsable::doDispatch(cur, cmd); + InsetCollapsible::doDispatch(cur, cmd); break; } } @@ -310,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: @@ -318,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); } } @@ -336,6 +349,15 @@ 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(); + // Colored boxes in RTL need to be wrapped into \beginL...\endL + string maybeBeginL; + string maybeEndL; + bool needEndL = false; + if (!runparams.isFullUnicode() && runparams.local_font->isRightToLeft()) { + maybeBeginL = "\\beginL"; + maybeEndL = "\\endL"; + } // 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 @@ -382,6 +404,7 @@ void InsetBox::latex(otexstream & os, OutputParams const & runparams) const if (stdwidth && !(buffer().params().paragraph_separation)) os << "\\noindent"; + bool needendgroup = false; switch (btype) { case Frameless: break; @@ -406,8 +429,9 @@ void InsetBox::latex(otexstream & os, OutputParams const & runparams) const os << "{\\fboxsep " << from_ascii(separation_string); if (!params_.inner_box && !width_string.empty()) { if (params_.framecolor != "black" || params_.backgroundcolor != "none") { - os << "\\fcolorbox{" << params_.framecolor << "}{" << params_.backgroundcolor << "}{"; + os << maybeBeginL << "\\fcolorbox{" << params_.framecolor << "}{" << params_.backgroundcolor << "}{"; os << "\\makebox"; + needEndL = !maybeBeginL.empty(); } else os << "\\framebox"; // Special widths, see usrguide sec. 3.5 @@ -423,10 +447,17 @@ void InsetBox::latex(otexstream & os, OutputParams const & runparams) const 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"; + if (params_.framecolor != "black" || params_.backgroundcolor != "none") { + os << maybeBeginL << "\\fcolorbox{" << params_.framecolor << "}{" << params_.backgroundcolor << "}"; + needEndL = !maybeBeginL.empty(); + } else { + if (!cprotect.empty() && contains(runparams.active_chars, '^')) { + // cprotect relies on ^ being on catcode 7 + os << "\\begingroup\\catcode`\\^=7"; + needendgroup = true; + } + os << cprotect << "\\fbox"; + } } os << "{"; break; @@ -465,6 +496,8 @@ void InsetBox::latex(otexstream & os, OutputParams const & runparams) const case Shaded: // must be set later because e.g. the width settings only work when // it is inside a minipage or parbox + os << maybeBeginL; + needEndL = !maybeBeginL.empty(); break; case Doublebox: if (thickness_string != defaultThick) { @@ -480,13 +513,17 @@ void InsetBox::latex(otexstream & os, OutputParams const & runparams) const if (params_.inner_box) { if (params_.use_parbox) { - if (params_.backgroundcolor != "none" && btype == Frameless) - os << "\\colorbox{" << params_.backgroundcolor << "}{"; + if (params_.backgroundcolor != "none" && btype == Frameless) { + os << maybeBeginL << "\\colorbox{" << params_.backgroundcolor << "}{"; + needEndL = !maybeBeginL.empty(); + } os << "\\parbox"; } else if (params_.use_makebox) { if (!width_string.empty()) { - if (params_.backgroundcolor != "none") - os << "\\colorbox{" << params_.backgroundcolor << "}{"; + if (params_.backgroundcolor != "none") { + os << maybeBeginL << "\\colorbox{" << params_.backgroundcolor << "}{"; + needEndL = !maybeBeginL.empty(); + } os << "\\makebox"; // FIXME UNICODE // output the width and horizontal position @@ -500,16 +537,20 @@ void InsetBox::latex(otexstream & os, OutputParams const & runparams) const if (params_.hor_pos != 'c') os << "[" << params_.hor_pos << "]"; } else { - if (params_.backgroundcolor != "none") - os << "\\colorbox{" << params_.backgroundcolor << "}"; + if (params_.backgroundcolor != "none") { + os << maybeBeginL << "\\colorbox{" << params_.backgroundcolor << "}"; + needEndL = !maybeBeginL.empty(); + } else os << "\\mbox"; } os << "{"; } else { - if (params_.backgroundcolor != "none" && btype == Frameless) - os << "\\colorbox{" << params_.backgroundcolor << "}{"; + if (params_.backgroundcolor != "none" && btype == Frameless) { + os << maybeBeginL << "\\colorbox{" << params_.backgroundcolor << "}{"; + needEndL = !maybeBeginL.empty(); + } os << "\\begin{minipage}"; } @@ -568,7 +609,7 @@ void InsetBox::latex(otexstream & os, OutputParams const & runparams) const break; case Framed: os << "\\end{framed}"; - if (separation_string != defaultSep || thickness_string != defaultThick) + if (separation_string != defaultSep || thickness_string != defaultThick) os << "}"; break; case Boxed: @@ -576,8 +617,10 @@ void InsetBox::latex(otexstream & os, OutputParams const & runparams) const if (!params_.inner_box && !width_string.empty() && (params_.framecolor != "black" || params_.backgroundcolor != "none")) os << "}"; - if (separation_string != defaultSep || thickness_string != defaultThick) + if (separation_string != defaultSep || thickness_string != defaultThick) os << "}"; + if (needendgroup) + os << "\\endgroup"; break; case ovalbox: os << "}"; @@ -605,6 +648,8 @@ void InsetBox::latex(otexstream & os, OutputParams const & runparams) const // already done break; } + if (needEndL) + os << maybeEndL; } @@ -730,7 +775,7 @@ void InsetBox::validate(LaTeXFeatures & features) const features.require("framed"); break; } - InsetCollapsable::validate(features); + InsetCollapsible::validate(features); }