/* This file is part of
* ======================================================
- *
+ *
* LyX, The Document Processor
- *
- * Copyright 1998 The LyX Team.
*
- *======================================================*/
+ * Copyright 1998-2001 The LyX Team.
+ *
+ * ====================================================== */
#include <config.h>
#include "gettext.h"
#include "lyxfont.h"
#include "BufferView.h"
-#include "Painter.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 "LyXView.h"
+#include "frontends/Dialogs.h"
using std::ostream;
using std::endl;
// within - This (optional) argument determines whether floats of this
// class will be numbered within some sectional unit of the
// document. For example, if within is equal to chapter, the
-// floats will be numbered within chapters.
+// floats will be numbered within chapters.
// \floatstyle{style}
// style - plain, boxed, ruled
// \floatname{float}{floatname}
// \newfloat{algorithm}{htbp}{loa}[<sect>]
// \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() : InsetCollapsable()
+namespace {
+
+string floatname(string const & type)
{
- setLabel(_("float"));
- LyXFont font(LyXFont::ALL_SANE);
- font.decSize();
- font.decSize();
- font.setColor(LColor::footnote);
- setLabelFont(font);
- setAutoCollapse(false);
- setInsetName("Float");
- floatType = "table";
- floatPlacement = "H";
+ FloatList::const_iterator it = floatList[type];
+ if (it == floatList.end())
+ return type;
+
+ return _(it->second.name());
}
+
+} // namespace anon
-void InsetFloat::Write(Buffer const * buf, ostream & os) const
+InsetFloat::InsetFloat(BufferParams const & bp, string const & type)
+ : InsetCollapsable(bp), wide_(false)
{
- os << getInsetName()
- << "\ntype " << floatType
- << "\nplacement " << floatPlacement << "\n";
- InsetCollapsable::Write(buf, os);
+ string lab(_("float: "));
+ lab += floatname(type);
+ setLabel(lab);
+ LyXFont font(LyXFont::ALL_SANE);
+ font.decSize();
+ font.decSize();
+ font.setColor(LColor::collapsable);
+ setLabelFont(font);
+ floatType_ = type;
+ setInsetName(type);
}
-void InsetFloat::Read(Buffer const * buf, LyXLex & lex)
+InsetFloat::InsetFloat(InsetFloat const & in, bool same_id)
+ : InsetCollapsable(in, same_id), floatType_(in.floatType_),
+ floatPlacement_(in.floatPlacement_), wide_(in.wide_)
+{}
+
+
+InsetFloat::~InsetFloat()
{
- if (lex.IsOK()) {
+ hideDialog();
+}
+
+
+void InsetFloat::write(Buffer const * buf, ostream & os) const
+{
+ os << "Float " // getInsetName()
+ << floatType_ << '\n';
+
+ if (floatPlacement_.empty()) {
+ os << "placement "
+ << floatList.getType(floatType_).placement() << "\n";
+ } else {
+ os << "placement " << floatPlacement_ << "\n";
+ }
+ if (wide_) {
+ os << "wide true\n";
+ } else {
+ os << "wide false\n";
+ }
+
+ InsetCollapsable::write(buf, os);
+}
+
+
+void InsetFloat::read(Buffer const * buf, LyXLex & lex)
+{
+ if (lex.isOK()) {
lex.next();
- string token = lex.GetString();
- if (token == "type") {
+ string token = lex.getString();
+ if (token == "placement") {
lex.next();
- floatType = lex.GetString();
+ floatPlacement_ = lex.getString();
+ } else {
+ lyxerr << "InsetFloat::Read: Missing placement!"
+ << endl;
+ // take countermeasures
+ lex.pushToken(token);
}
lex.next();
- token = lex.GetString();
- if (token == "placement") {
+ token = lex.getString();
+ if (token == "wide") {
lex.next();
- floatPlacement = lex.GetString();
+ 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() const
+Inset * InsetFloat::clone(Buffer const &, bool same_id) const
{
- InsetFloat * result = new InsetFloat;
- result->init(this);
-
- result->collapsed = collapsed;
- return result;
+ return new InsetFloat(*const_cast<InsetFloat *>(this), same_id);
}
-char const * InsetFloat::EditMessage() const
+string const InsetFloat::editMessage() const
{
- return _("Opened Float Inset");
+ 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 << "}";
- if (!floatPlacement.empty()
- && floatPlacement != floatList.defaultPlacement(floatType))
- os << "[" << floatPlacement << "]";
+ 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 << "}";
+ // We only output placement if different from the def_placement.
+ if (!placement.empty()) {
+ os << "[" << placement << "]";
+ }
+
os << "%\n";
-
- int i = InsetText::Latex(buf, os, fragile, fp);
- os << "\\end{" << floatType << "}%\n";
-
- return i + 2;
+
+ int const i = inset.latex(buf, os, fragile, fp);
+ os << "\\end{" << tmptype << "}%\n";
+
+ return i + 2;
}
-bool InsetFloat::InsertInset(BufferView * bv, Inset * inset)
+int InsetFloat::docbook(Buffer const * buf, ostream & os) const
{
- if (!InsertInsetAllowed(inset))
- return false;
+ os << "<" << floatType_ << ">";
+ int const i = inset.docbook(buf, os);
+ os << "</" << floatType_ << ">";
+
+ return i;
+}
+
- return InsetText::InsertInset(bv, inset);
+bool InsetFloat::insetAllowed(Inset::Code code) const
+{
+ if (code == Inset::FLOAT_CODE)
+ return false;
+ if (inset.getLockingInset() != const_cast<InsetFloat *>(this))
+ return inset.insetAllowed(code);
+ if ((code == Inset::FOOT_CODE) || (code == Inset::MARGIN_CODE))
+ return false;
+ return true;
}
-bool InsetFloat::InsertInsetAllowed(Inset * inset) const
+bool InsetFloat::showInsetDialog(BufferView * bv) const
{
- if ((inset->LyxCode() == Inset::FOOT_CODE) ||
- (inset->LyxCode() == Inset::MARGIN_CODE)) {
- return false;
- }
- return true;
+ if (!inset.showInsetDialog(bv)) {
+ bv->owner()->getDialogs()->showFloat(const_cast<InsetFloat *>(this));
+ }
+ return true;
}
-LyXFont InsetFloat::GetDrawFont(BufferView * bv,
- LyXParagraph * p, int pos) const
+string const & InsetFloat::type() const
{
- LyXFont fn = getLyXText(bv)->GetFont(bv->buffer(), p, pos);
- fn.decSize().decSize();
- return fn;
+ return floatType_;
}
-void InsetFloat::InsetButtonRelease(BufferView * bv, int x, int y, int button)
+void InsetFloat::placement(string const & p)
{
- 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);
- }
+ // 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;
+
+ string lab(_("float:"));
+ lab += floatname(floatType_);
+
+ if (wide_)
+ lab += "*";
+
+ setLabel(lab);
+}
+
+
+bool InsetFloat::wide() const
+{
+ return wide_;
}