X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2Finsets%2Finsetfloat.C;h=e31523429f107f9da5c754b0923f0d5a92981d9b;hb=4a5b7a5952ad2381fcdf4830511293e184c7c5a1;hp=fe25dc75b2e8be69ea38c43782fce8d00389613e;hpb=74b224fcba406f4ea4d1f1fa91a63aea39ca2712;p=lyx.git diff --git a/src/insets/insetfloat.C b/src/insets/insetfloat.C index fe25dc75b2..e31523429f 100644 --- a/src/insets/insetfloat.C +++ b/src/insets/insetfloat.C @@ -3,7 +3,7 @@ * * LyX, The Document Processor * - * Copyright 1998-2000 The LyX Team. + * Copyright 1998-2001 The LyX Team. * * ====================================================== */ @@ -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; @@ -76,10 +80,27 @@ using std::endl; // \newfloat{algorithm}{htbp}{loa}[] // \floatname{algorithm}{Algorithm} // +// The intention is that floats should be definable from two places: +// - layout files +// - the "gui" (i.e. by the user) +// +// From layout files. +// This should only be done for floats defined in a documentclass and that +// does not need any additional packages. The two most known floats in this +// category is "table" and "figure". Floats defined in layout files are only +// stored in lyx files if the user modifies them. +// +// By the user. +// There should be a gui dialog (and also a collection of lyxfuncs) where +// the user can modify existing floats and/or create new ones. +// +// The individual floats will also have some settable +// variables: wide and placement. +// // Lgb InsetFloat::InsetFloat(string const & type) - : InsetCollapsable() + : InsetCollapsable(), wide_(false) { string lab(_("float:")); lab += type; @@ -87,16 +108,26 @@ InsetFloat::InsetFloat(string const & type) LyXFont font(LyXFont::ALL_SANE); font.decSize(); font.decSize(); - font.setColor(LColor::footnote); + font.setColor(LColor::collapsable); setLabelFont(font); - setAutoCollapse(false); floatType_ = type; setInsetName(type); - //floatPlacement = "H"; } -void InsetFloat::Write(Buffer const * buf, ostream & os) const +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() << floatType_ << '\n'; @@ -107,89 +138,136 @@ void InsetFloat::Write(Buffer const * buf, ostream & os) const } else { os << "placement " << floatPlacement_ << "\n"; } + if (wide_) { + os << "wide true\n"; + } else { + os << "wide false\n"; + } - InsetCollapsable::Write(buf, os); + InsetCollapsable::write(buf, os); } -void InsetFloat::Read(Buffer const * buf, LyXLex & lex) +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(); + if (token == "wide") { + lex.next(); + string const tmptoken = lex.getString(); + if (tmptoken == "true") + wide(true); + else + wide(false); + } else { + lyxerr << "InsetFloat::Read:: Missing wide!" + << endl; + // take countermeasures + lex.pushToken(token); } } - InsetCollapsable::Read(buf, lex); + InsetCollapsable::read(buf, lex); } -void InsetFloat::Validate(LaTeXFeatures & features) const +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); } -string const InsetFloat::EditMessage() const +string const InsetFloat::editMessage() const { return _("Opened Float Inset"); } -int InsetFloat::Latex(Buffer const * buf, +int InsetFloat::latex(Buffer const * buf, ostream & os, bool fragile, bool fp) const { - os << "\\begin{" << floatType_ << "}"; + 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_ != floatList.defaultPlacement(floatType_)) - os << "[" << floatPlacement_ << "]"; + && floatPlacement_ != def_placement) { + placement = floatPlacement_; + } else if (!buf_placement.empty() + && buf_placement != def_placement) { + placement = buf_placement; + } + + os << "\\begin{" << tmptype << "}"; + // 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); - os << "\\end{" << floatType_ << "}%\n"; + int const i = inset.latex(buf, os, fragile, fp); + os << "\\end{" << tmptype << "}%\n"; return i + 2; } -bool InsetFloat::InsertInsetAllowed(Inset * in) const +int InsetFloat::docbook(Buffer const * buf, ostream & os) const { - if ((in->LyxCode() == Inset::FOOT_CODE) || - (in->LyxCode() == Inset::MARGIN_CODE)) { + os << "<" << floatType_ << ">"; + int const i = inset.docbook(buf, os); + os << ""; + + return i; +} + + +bool InsetFloat::insetAllowed(Inset::Code code) const +{ + 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 >= 0 - && 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; - } else { - InsetCollapsable::InsetButtonRelease(bv, x, y, button); + if (!inset.showInsetDialog(bv)) { + bv->owner()->getDialogs()->showFloat(const_cast(this)); } + return true; } @@ -199,6 +277,20 @@ string const & InsetFloat::type() const } +void InsetFloat::placement(string const & p) +{ + // FIX: Here we should only allow the placement to be set + // if a valid value. + floatPlacement_ = p; +} + + +string const & InsetFloat::placement() const +{ + return floatPlacement_; +} + + void InsetFloat::wide(bool w) { wide_ = w;