X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2Finsets%2Finsetfloat.C;h=e31523429f107f9da5c754b0923f0d5a92981d9b;hb=4a5b7a5952ad2381fcdf4830511293e184c7c5a1;hp=ed0236ef776ab345a39196748ccdd6f729a0673c;hpb=85a5ea7bfc80e179a61a99f2955455e84d3384cc;p=lyx.git diff --git a/src/insets/insetfloat.C b/src/insets/insetfloat.C index ed0236ef77..e31523429f 100644 --- a/src/insets/insetfloat.C +++ b/src/insets/insetfloat.C @@ -20,10 +20,14 @@ #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 "LyXView.h" +#include "frontends/Dialogs.h" using std::ostream; using std::endl; @@ -106,12 +110,23 @@ InsetFloat::InsetFloat(string const & type) font.decSize(); font.setColor(LColor::collapsable); setLabelFont(font); - setAutoCollapse(false); floatType_ = type; setInsetName(type); } +InsetFloat::InsetFloat(InsetFloat const & in, bool same_id) + : InsetCollapsable(in, same_id), floatType_(in.floatType_), + floatPlacement_(in.floatPlacement_), wide_(in.wide_) +{} + + +InsetFloat::~InsetFloat() +{ + hideDialog(); +} + + void InsetFloat::write(Buffer const * buf, ostream & os) const { os << "Float " // getInsetName() @@ -135,21 +150,23 @@ void InsetFloat::write(Buffer const * buf, ostream & os) const void InsetFloat::read(Buffer const * buf, LyXLex & lex) { - if (lex.IsOK()) { + if (lex.isOK()) { lex.next(); - string token = lex.GetString(); + string token = lex.getString(); if (token == "placement") { lex.next(); - floatPlacement_ = lex.GetString(); + floatPlacement_ = lex.getString(); } else { lyxerr << "InsetFloat::Read: Missing placement!" << endl; + // take countermeasures + lex.pushToken(token); } lex.next(); - token = lex.GetString(); + token = lex.getString(); if (token == "wide") { lex.next(); - string const tmptoken = lex.GetString(); + string const tmptoken = lex.getString(); if (tmptoken == "true") wide(true); else @@ -157,6 +174,8 @@ void InsetFloat::read(Buffer const * buf, LyXLex & lex) } else { lyxerr << "InsetFloat::Read:: Missing wide!" << endl; + // take countermeasures + lex.pushToken(token); } } InsetCollapsable::read(buf, lex); @@ -165,18 +184,18 @@ void InsetFloat::read(Buffer const * buf, LyXLex & lex) void InsetFloat::validate(LaTeXFeatures & features) const { - features.usedFloats.insert(floatType_); + if (contains(placement(), "H")) { + features.require("float"); + } + + features.useFloat(floatType_); InsetCollapsable::validate(features); } -Inset * InsetFloat::clone(Buffer const &) const +Inset * InsetFloat::clone(Buffer const &, bool same_id) const { - InsetFloat * result = new InsetFloat(floatType_); - result->inset.init(&inset); - - result->collapsed = collapsed; - return result; + return new InsetFloat(*const_cast(this), same_id); } @@ -190,11 +209,28 @@ int InsetFloat::latex(Buffer const * buf, ostream & os, bool fragile, bool fp) const { string const tmptype = (wide_ ? floatType_ + "*" : floatType_); + // 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 = floatList.defaultPlacement(floatType_); + if (!floatPlacement_.empty() + && floatPlacement_ != def_placement) { + placement = floatPlacement_; + } else if (!buf_placement.empty() + && buf_placement != def_placement) { + placement = buf_placement; + } os << "\\begin{" << tmptype << "}"; - if (!floatPlacement_.empty() - && floatPlacement_ != floatList.defaultPlacement(floatType_)) - os << "[" << floatPlacement_ << "]"; + // We only output placement if different from the def_placement. + if (!placement.empty()) { + os << "[" << placement << "]"; + } + os << "%\n"; int const i = inset.latex(buf, os, fragile, fp); @@ -204,40 +240,34 @@ int InsetFloat::latex(Buffer const * buf, } -int InsetFloat::docBook(Buffer const * buf, ostream & os) const +int InsetFloat::docbook(Buffer const * buf, ostream & os) const { os << "<" << floatType_ << ">"; - int const i = inset.docBook(buf, os); + int const i = inset.docbook(buf, os); os << ""; return i; } -bool InsetFloat::insertInsetAllowed(Inset * in) const +bool InsetFloat::insetAllowed(Inset::Code code) const { - if ((in->lyxCode() == Inset::FOOT_CODE) || - (in->lyxCode() == Inset::MARGIN_CODE)) { + if (code == Inset::FLOAT_CODE) + return false; + if (inset.getLockingInset() != const_cast(this)) + return inset.insetAllowed(code); + if ((code == Inset::FOOT_CODE) || (code == Inset::MARGIN_CODE)) return false; - } return true; } -void InsetFloat::insetButtonRelease(BufferView * bv, int x, int y, int button) +bool InsetFloat::showInsetDialog(BufferView * bv) const { - if (x >= top_x - && x < button_length - && y >= button_top_y - && y < button_bottom_y - && button == 3) { - // This obviously need to change. - lyxerr << "InsetFloat: Let's edit this floats parameters!" - << endl; - //bv->owner()->getDialogs()->showFloat(this); - } else { - InsetCollapsable::insetButtonRelease(bv, x, y, button); + if (!inset.showInsetDialog(bv)) { + bv->owner()->getDialogs()->showFloat(const_cast(this)); } + return true; } @@ -249,11 +279,8 @@ string const & InsetFloat::type() const void InsetFloat::placement(string const & p) { - // Here we should only allow the placement to be set + // FIX: Here we should only allow the placement to be set // if a valid value. -#ifdef WITH_WARNINGS -#warning FIX! -#endif floatPlacement_ = p; }