X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2Finsets%2Finsetfloat.C;h=4640c0578417fc48b5ae48b0cdcb0061c08fae58;hb=fd36f5ad7612a4034c21c3162e29c3bca42e353e;hp=24c196a0701360800663a77ffe0b45312128b3ab;hpb=0507b8600d40ac155d6576dafe1218db643a8970;p=lyx.git diff --git a/src/insets/insetfloat.C b/src/insets/insetfloat.C index 24c196a070..4640c05784 100644 --- a/src/insets/insetfloat.C +++ b/src/insets/insetfloat.C @@ -6,33 +6,38 @@ * \author Jürgen Vigna * \author Lars Gullik Bjønnes * - * Full author contact details are available in file CREDITS + * Full author contact details are available in file CREDITS. */ -#include -#ifdef __GNUG__ -#pragma implementation -#endif +#include #include "insetfloat.h" -#include "gettext.h" -#include "lyxfont.h" + +#include "buffer.h" #include "BufferView.h" -#include "lyxtext.h" -#include "insets/insettext.h" -#include "support/LOstream.h" -#include "support/lstrings.h" -#include "FloatList.h" -#include "LaTeXFeatures.h" #include "debug.h" #include "Floating.h" -#include "buffer.h" -#include "frontends/LyXView.h" -#include "frontends/Dialogs.h" +#include "FloatList.h" +#include "funcrequest.h" +#include "gettext.h" +#include "iterators.h" +#include "LaTeXFeatures.h" #include "lyxlex.h" +#include "paragraph.h" + +#include "support/lstrings.h" +#include "support/tostr.h" + +#include "support/std_sstream.h" + +using namespace lyx::support; -using std::ostream; using std::endl; +using std::auto_ptr; +using std::istringstream; +using std::ostream; +using std::ostringstream; + // With this inset it will be possible to support the latex package // float.sty, and I am sure that with this and some additional support @@ -121,7 +126,7 @@ string floatname(string const & type, BufferParams const & bp) InsetFloat::InsetFloat(BufferParams const & bp, string const & type) - : InsetCollapsable(bp), wide_(false) + : InsetCollapsable(bp) { string lab(_("float: ")); lab += floatname(type, bp); @@ -131,52 +136,76 @@ InsetFloat::InsetFloat(BufferParams const & bp, string const & type) font.decSize(); font.setColor(LColor::collapsable); setLabelFont(font); - floatType_ = type; + params_.type = type; setInsetName(type); LyXTextClass const & tclass = bp.getLyXTextClass(); if (tclass.hasLayout(caplayout)) - inset.paragraph()->layout(tclass[caplayout]); + inset.paragraphs.begin()->layout(tclass[caplayout]); } -InsetFloat::InsetFloat(InsetFloat const & in, bool same_id) - : InsetCollapsable(in, same_id), floatType_(in.floatType_), - floatPlacement_(in.floatPlacement_), wide_(in.wide_) +InsetFloat::InsetFloat(InsetFloat const & in) + : InsetCollapsable(in), params_(in.params_) {} InsetFloat::~InsetFloat() { - hideDialog(); + InsetFloatMailer mailer(*this); + mailer.hideDialog(); } -void InsetFloat::write(Buffer const * buf, ostream & os) const +dispatch_result InsetFloat::localDispatch(FuncRequest const & cmd) { - os << "Float " // getInsetName() - << floatType_ << '\n'; + switch (cmd.action) { + + case LFUN_INSET_MODIFY: { + InsetFloatParams params; + InsetFloatMailer::string2params(cmd.argument, params); - if (!floatPlacement_.empty()) { - os << "placement " << floatPlacement_ << "\n"; + params_.placement = params.placement; + params_.wide = params.wide; + + wide(params_.wide, cmd.view()->buffer()->params()); + cmd.view()->updateInset(this); + return DISPATCHED; } - if (wide_) { - os << "wide true\n"; - } else { - os << "wide false\n"; + + case LFUN_INSET_DIALOG_UPDATE: { + InsetFloatMailer(*this).updateDialog(cmd.view()); + return DISPATCHED; } - InsetCollapsable::write(buf, os); + default: + return InsetCollapsable::localDispatch(cmd); + } +} + + +void InsetFloatParams::write(ostream & os) const +{ + os << "Float " // getInsetName() + << type << '\n'; + + if (!placement.empty()) + os << "placement " << placement << "\n"; + + if (wide) + os << "wide true\n"; + else + os << "wide false\n"; } -void InsetFloat::read(Buffer const * buf, LyXLex & lex) +void InsetFloatParams::read(LyXLex & lex) { if (lex.isOK()) { lex.next(); string token = lex.getString(); if (token == "placement") { lex.next(); - floatPlacement_ = lex.getString(); + placement = lex.getString(); } else { // take countermeasures lex.pushToken(token); @@ -186,10 +215,7 @@ void InsetFloat::read(Buffer const * buf, LyXLex & lex) if (token == "wide") { lex.next(); string const tmptoken = lex.getString(); - if (tmptoken == "true") - wide(true, buf->params); - else - wide(false, buf->params); + wide = (tmptoken == "true"); } else { lyxerr << "InsetFloat::Read:: Missing wide!" << endl; @@ -197,24 +223,38 @@ void InsetFloat::read(Buffer const * buf, LyXLex & lex) lex.pushToken(token); } } +} + + +void InsetFloat::write(Buffer const & buf, ostream & os) const +{ + params_.write(os); + InsetCollapsable::write(buf, os); +} + + +void InsetFloat::read(Buffer const & buf, LyXLex & lex) +{ + params_.read(lex); + wide(params_.wide, buf.params()); InsetCollapsable::read(buf, lex); } void InsetFloat::validate(LaTeXFeatures & features) const { - if (contains(placement(), "H")) { + if (contains(params_.placement, "H")) { features.require("float"); } - features.useFloat(floatType_); + features.useFloat(params_.type); InsetCollapsable::validate(features); } -Inset * InsetFloat::clone(Buffer const &, bool same_id) const +auto_ptr InsetFloat::clone() const { - return new InsetFloat(*const_cast(this), same_id); + return auto_ptr(new InsetFloat(*this)); } @@ -224,23 +264,24 @@ string const InsetFloat::editMessage() const } -int InsetFloat::latex(Buffer const * buf, - ostream & os, bool fragile, bool fp) const +int InsetFloat::latex(Buffer const & buf, ostream & os, + LatexRunParams const & runparams) const { - FloatList const & floats = buf->params.getLyXTextClass().floats(); - string const tmptype = (wide_ ? floatType_ + "*" : floatType_); + FloatList const & floats = buf.params().getLyXTextClass().floats(); + string const tmptype = (params_.wide ? params_.type + "*" : params_.type); // Figure out the float placement to use. // From lowest to highest: // - float default placement // - document wide default placement // - specific float placement string placement; - string const buf_placement = buf->params.float_placement; - string const def_placement = floats.defaultPlacement(floatType_); - if (!floatPlacement_.empty() - && floatPlacement_ != def_placement) { - placement = floatPlacement_; - } else if (!buf_placement.empty() + string const buf_placement = buf.params().float_placement; + string const def_placement = floats.defaultPlacement(params_.type); + if (!params_.placement.empty() + && params_.placement != def_placement) { + placement = params_.placement; + } else if (params_.placement.empty() + && !buf_placement.empty() && buf_placement != def_placement) { placement = buf_placement; } @@ -248,14 +289,14 @@ int InsetFloat::latex(Buffer const * buf, // The \n is used to force \begin{} to appear in a new line. // The % is needed to prevent two consecutive \n chars in the case // when the current output line is empty. - os << "%\n\\begin{" << tmptype << "}"; + os << "%\n\\begin{" << tmptype << '}'; // We only output placement if different from the def_placement. if (!placement.empty()) { - os << "[" << placement << "]"; + os << '[' << placement << ']'; } - os << "\n"; + os << '\n'; - int const i = inset.latex(buf, os, fragile, fp); + int const i = inset.latex(buf, os, runparams); // The \n is used to force \end{} to appear in a new line. // In this case, we do not case if the current output line is empty. @@ -265,23 +306,60 @@ int InsetFloat::latex(Buffer const * buf, } -int InsetFloat::docbook(Buffer const * buf, ostream & os, bool mixcont) const +int InsetFloat::linuxdoc(Buffer const & buf, ostream & os) const { - os << "<" << floatType_ << ">"; + FloatList const & floats = buf.params().getLyXTextClass().floats(); + string const tmptype = params_.type; + // Figure out the float placement to use. + // From lowest to highest: + // - float default placement + // - document wide default placement + // - specific float placement + // This is the same as latex, as linuxdoc is modeled after latex. + + string placement; + string const buf_placement = buf.params().float_placement; + string const def_placement = floats.defaultPlacement(params_.type); + if (!params_.placement.empty() + && params_.placement != def_placement) { + placement = params_.placement; + } else if (params_.placement.empty() + && !buf_placement.empty() + && buf_placement != def_placement) { + placement = buf_placement; + } + + os << "\n<" << tmptype ; + // We only output placement if different from the def_placement. + if (!placement.empty()) { + os << " loc=\"" << placement << '"'; + } + os << ">"; + + int const i = inset.linuxdoc(buf, os); + os << "\n"; + + return i; +} + + +int InsetFloat::docbook(Buffer const & buf, ostream & os, bool mixcont) const +{ + os << '<' << params_.type << '>'; int const i = inset.docbook(buf, os, mixcont); - os << ""; + os << "'; return i; } -bool InsetFloat::insetAllowed(Inset::Code code) const +bool InsetFloat::insetAllowed(InsetOld::Code code) const { - if (code == Inset::FLOAT_CODE) + if (code == InsetOld::FLOAT_CODE) return false; if (inset.getLockingInset() != const_cast(this)) return inset.insetAllowed(code); - if ((code == Inset::FOOT_CODE) || (code == Inset::MARGIN_CODE)) + if ((code == InsetOld::FOOT_CODE) || (code == InsetOld::MARGIN_CODE)) return false; return true; } @@ -290,66 +368,98 @@ bool InsetFloat::insetAllowed(Inset::Code code) const bool InsetFloat::showInsetDialog(BufferView * bv) const { if (!inset.showInsetDialog(bv)) { - bv->owner()->getDialogs().showFloat(const_cast(this)); + InsetFloat * tmp = const_cast(this); + InsetFloatMailer mailer(*tmp); + mailer.showDialog(bv); } return true; } -string const & InsetFloat::type() const +void InsetFloat::wide(bool w, BufferParams const & bp) { - return floatType_; + params_.wide = w; + + string lab(_("float: ")); + lab += floatname(params_.type, bp); + + if (params_.wide) + lab += '*'; + + setLabel(lab); } -void InsetFloat::placement(string const & p) +void InsetFloat::addToToc(lyx::toc::TocList & toclist, Buffer const & buf) const { - // FIX: Here we should only allow the placement to be set - // if a valid value. - floatPlacement_ = p; + ParIterator pit(inset.paragraphs.begin(), inset.paragraphs); + ParIterator end(inset.paragraphs.end(), inset.paragraphs); + + // Find a caption layout in one of the (child inset's) pars + for (; pit != end; ++pit) { + if (pit->layout()->name() == caplayout) { + string const name = floatname(params_.type, buf.params()); + string const str = + tostr(toclist[name].size() + 1) + + ". " + pit->asString(buf, false); + lyx::toc::TocItem const item(pit->id(), 0 , str); + toclist[name].push_back(item); + } + } } -string const & InsetFloat::placement() const +string const InsetFloatMailer::name_("float"); + +InsetFloatMailer::InsetFloatMailer(InsetFloat & inset) + : inset_(inset) +{} + + +string const InsetFloatMailer::inset2string(Buffer const &) const { - return floatPlacement_; + return params2string(inset_.params()); } -void InsetFloat::wide(bool w, BufferParams const & bp) +void InsetFloatMailer::string2params(string const & in, + InsetFloatParams & params) { - wide_ = w; + params = InsetFloatParams(); - string lab(_("float:")); - lab += floatname(floatType_, bp); + if (in.empty()) + return; - if (wide_) - lab += "*"; + istringstream data(STRCONV(in)); + LyXLex lex(0,0); + lex.setStream(data); - setLabel(lab); -} + if (lex.isOK()) { + lex.next(); + string const token = lex.getString(); + if (token != name_) + return; + } + // This is part of the inset proper that is usually swallowed + // by Buffer::readInset + if (lex.isOK()) { + lex.next(); + string const token = lex.getString(); + if (token != "Float" || !lex.eatLine()) + return; + } -bool InsetFloat::wide() const -{ - return wide_; + if (lex.isOK()) { + params.read(lex); + } } -void InsetFloat::addToToc(toc::TocList & toclist, Buffer const * buf) const +string const InsetFloatMailer::params2string(InsetFloatParams const & params) { - // Now find the caption in the float... - // We now tranverse the paragraphs of - // the inset... - Paragraph * tmp = inset.paragraph(); - while (tmp) { - if (tmp->layout()->name() == caplayout) { - string const str = - tostr(toclist[type()].size() + 1) - + ". " + tmp->asString(buf, false); - toc::TocItem const item(tmp, 0 , str); - toclist[type()].push_back(item); - } - tmp = tmp->next(); - } + ostringstream data; + data << name_ << ' '; + params.write(data); + return STRCONV(data.str()); }