X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2Finsets%2FInsetFoot.cpp;h=29890d136523a4845b3ad3e91ef9d8b41d4ea190;hb=00e00b32fd1df4e3c90a63ff067400f0f7153dee;hp=44998604198acb5413cf9e8d7716388e7c6bfa1c;hpb=9383f4c3c6f9cfab2d658701ba66e2b54cd68bea;p=lyx.git diff --git a/src/insets/InsetFoot.cpp b/src/insets/InsetFoot.cpp index 4499860419..29890d1365 100644 --- a/src/insets/InsetFoot.cpp +++ b/src/insets/InsetFoot.cpp @@ -3,119 +3,142 @@ * This file is part of LyX, the document processor. * Licence details can be found in the file COPYING. * - * \author Jürgen Vigna - * \author Lars Gullik Bjønnes + * \author Jürgen Vigna + * \author Lars Gullik Bjønnes * * Full author contact details are available in file CREDITS. */ #include -#include "support/debug.h" #include "InsetFoot.h" +#include "InsetBox.h" #include "Buffer.h" #include "BufferParams.h" #include "Counters.h" -#include "support/gettext.h" +#include "Language.h" +#include "LaTeXFeatures.h" #include "Layout.h" -// FIXME: the following is needed just to get the layout of the enclosing -// paragraph. This seems a bit too much to me (JMarc) #include "OutputParams.h" #include "ParIterator.h" #include "TextClass.h" +#include "TocBackend.h" +#include "support/debug.h" +#include "support/docstream.h" +#include "support/gettext.h" #include "support/lstrings.h" -#include - using namespace std; namespace lyx { - -InsetFoot::InsetFoot(BufferParams const & bp) - : InsetFootlike(bp) +InsetFoot::InsetFoot(Buffer * buf) + : InsetFootlike(buf), intitle_(false), infloattable_(false) {} -InsetFoot::InsetFoot(InsetFoot const & in) - : InsetFootlike(in) -{} - - -Inset * InsetFoot::clone() const +docstring InsetFoot::layoutName() const { - return new InsetFoot(*this); + if (intitle_) + return from_ascii("Foot:InTitle"); + else if (infloattable_) + return from_ascii("Foot:InFloatTable"); + return from_ascii("Foot"); } -docstring const InsetFoot::editMessage() const +void InsetFoot::updateBuffer(ParIterator const & it, UpdateType utype) { - return _("Opened Footnote Inset"); -} - + BufferParams const & bp = buffer().masterBuffer()->params(); + Counters & cnts = bp.documentClass().counters(); + if (utype == OutputUpdate) { + // the footnote counter is local to this inset + cnts.saveLastCounter(); + } -void InsetFoot::updateLabels(Buffer const & buf, ParIterator const & it) -{ - TextClass const & tclass = buf.params().getTextClass(); - Counters & cnts = tclass.counters(); - docstring const & foot = from_ascii("footnote"); - Paragraph const & outer = it.paragraph(); - if (!outer.layout()->intitle && cnts.hasCounter(foot)) { - cnts.step(foot); - //FIXME: the counter should format itself. - setLabel(support::bformat(from_ascii("%1$s %2$s"), - getLayout(buf.params()).labelstring, - cnts.theCounter(foot))); - + intitle_ = false; + infloattable_ = false; + bool intable = false; + if (it.innerInsetOfType(TABULAR_CODE) != 0) + intable = true; + if (it.innerInsetOfType(FLOAT_CODE) != 0) + infloattable_ = intable; + // If we are in a table in a float, but the table is also in a minipage, + // we do not use tablefootnote, since minipages provide their own footnotes. + if (intable && infloattable_ && it.innerInsetOfType(BOX_CODE) != 0) { + InsetBoxParams const & boxp = + static_cast(it.innerInsetOfType(BOX_CODE))->params(); + if (boxp.inner_box && !boxp.use_parbox && !boxp.use_makebox) + infloattable_ = false; } - InsetCollapsable::updateLabels(buf, it); + for (size_type sl = 0 ; sl < it.depth() ; ++sl) { + if (it[sl].text() && it[sl].paragraph().layout().intitle) { + intitle_ = true; + break; + } + } + + Language const * lang = it.paragraph().getParLanguage(bp); + InsetLayout const & il = getLayout(); + docstring const & count = il.counter(); + custom_label_ = translateIfPossible(il.labelstring()); + if (cnts.hasCounter(count)) + cnts.step(count, utype); + custom_label_ += ' ' + cnts.theCounter(count, lang->code()); + setLabel(custom_label_); + + InsetCollapsible::updateBuffer(it, utype); + if (utype == OutputUpdate) + cnts.restoreLastCounter(); } -int InsetFoot::latex(Buffer const & buf, odocstream & os, - OutputParams const & runparams_in) const +docstring InsetFoot::toolTip(BufferView const & bv, int x, int y) const { - OutputParams runparams = runparams_in; - // footnotes in titling commands like \title have moving arguments - runparams.moving_arg |= runparams_in.intitle; - - // in titling commands, \thanks should be used instead of \footnote. - // some classes (e.g. memoir) do not understand \footnote. - if (runparams_in.intitle) - os << "%\n\\thanks{"; - else - os << "%\n\\footnote{"; - - int const i = InsetText::latex(buf, os, runparams); - os << "%\n}"; - runparams_in.encoding = runparams.encoding; - - return i + 2; + if (isOpen(bv)) + // this will give us something useful if there is no button + return InsetCollapsible::toolTip(bv, x, y); + return toolTipText(custom_label_+ ": "); } -int InsetFoot::plaintext(Buffer const & buf, odocstream & os, - OutputParams const & runparams) const +int InsetFoot::plaintext(odocstringstream & os, + OutputParams const & runparams, size_t max_length) const { - os << '[' << buf.B_("footnote") << ":\n"; - InsetText::plaintext(buf, os, runparams); + os << '[' << buffer().B_("footnote") << ":\n"; + InsetText::plaintext(os, runparams, max_length); os << "\n]"; return PLAINTEXT_NEWLINE + 1; // one char on a separate line } -int InsetFoot::docbook(Buffer const & buf, odocstream & os, - OutputParams const & runparams) const +int InsetFoot::docbook(odocstream & os, OutputParams const & runparams) const { os << ""; - int const i = InsetText::docbook(buf, os, runparams); + int const i = InsetText::docbook(os, runparams); os << ""; return i; } +void InsetFoot::validate(LaTeXFeatures & features) const +{ + // Use footnote package to provide footnotes in tables + // unless an alternative approach is built in the class. + if (!features.saveNoteEnv().empty() + && !features.isProvided("footnote-alternative")) { + features.require("footnote"); + features.addPreambleSnippet( + from_ascii("\\makesavenoteenv{" + + features.saveNoteEnv() + + "}\n")); + } + + InsetText::validate(features); +} + } // namespace lyx