*
* \author Jürgen Vigna
* \author Lars Gullik Bjønnes
+ * \author Jürgen Spitzmüller
*
* Full author contact details are available in file CREDITS.
*/
#include <config.h>
#include "InsetFloat.h"
+#include "InsetCaption.h"
#include "Buffer.h"
#include "BufferParams.h"
#include "FloatList.h"
#include "FuncRequest.h"
#include "FuncStatus.h"
+#include "InsetList.h"
#include "LaTeXFeatures.h"
#include "Lexer.h"
#include "OutputParams.h"
+#include "ParIterator.h"
#include "TextClass.h"
#include "support/debug.h"
// Lgb
-InsetFloat::InsetFloat(BufferParams const & bp, string const & type)
- : InsetCollapsable(bp), name_(from_utf8(type))
+InsetFloat::InsetFloat(Buffer const & buf, string const & type)
+ : InsetCollapsable(buf), name_(from_utf8(type))
{
- setLabel(_("float: ") + floatName(type, bp));
+ setLabel(_("float: ") + floatName(type, buf.params()));
params_.type = type;
}
params_.placement = params.placement;
params_.wide = params.wide;
params_.sideways = params.sideways;
+ params_.subfloat = params.subfloat;
wide(params_.wide, cur.buffer().params());
sideways(params_.sideways, cur.buffer().params());
break;
case LFUN_MOUSE_RELEASE: {
if (cmd.button() == mouse_button::button3 && hitButton(cmd)) {
+ if (params_.subfloat)
+ break;
InsetFloatMailer(*this).showDialog(&cur.bv());
break;
}
{
Counters & cnts = buffer().params().documentClass().counters();
string const saveflt = cnts.current_float();
+ bool const savesubflt = cnts.isSubfloat();
+
+ bool const subflt = it.innerInsetOfType(FLOAT_CODE);
+ // floats can only embed subfloats of their own kind
+ if (subflt)
+ params_.type = saveflt;
+ subfloat(subflt, buffer().params());
// Tell to captions what the current float is
cnts.current_float(params().type);
+ cnts.isSubfloat(subflt);
InsetCollapsable::updateLabels(it);
//reset afterwards
cnts.current_float(saveflt);
+ cnts.isSubfloat(savesubflt);
}
params_.read(lex);
wide(params_.wide, buffer().params());
sideways(params_.sideways, buffer().params());
+ subfloat(params_.subfloat, buffer().params());
InsetCollapsable::read(lex);
}
void InsetFloat::validate(LaTeXFeatures & features) const
{
- if (support::contains(params_.placement, 'H')) {
+ if (support::contains(params_.placement, 'H'))
features.require("float");
- }
if (params_.sideways)
features.require("rotfloat");
- features.useFloat(params_.type);
- InsetCollapsable::validate(features);
-}
-
+ if (params_.subfloat)
+ features.require("subfig");
-Inset * InsetFloat::clone() const
-{
- return new InsetFloat(*this);
+ features.useFloat(params_.type, params_.subfloat);
+ InsetCollapsable::validate(features);
}
int InsetFloat::latex(odocstream & os, OutputParams const & runparams) const
{
+ if (params_.subfloat) {
+ if (runparams.moving_arg)
+ os << "\\protect";
+ os << "\\subfloat";
+
+ OutputParams rp = runparams;
+ docstring const caption = getCaption(rp);
+ if (!caption.empty()) {
+ os << caption;
+ }
+ os << '{';
+ int const i = InsetText::latex(os, runparams);
+ os << "}";
+
+ return i + 1;
+ }
+
FloatList const & floats = buffer().params().documentClass().floats();
string tmptype = params_.type;
if (params_.sideways)
int InsetFloat::docbook(odocstream & os, OutputParams const & runparams) const
{
+ // FIXME Implement subfloat!
// FIXME UNICODE
os << '<' << from_ascii(params_.type) << '>';
int const i = InsetText::docbook(os, runparams);
bool InsetFloat::insetAllowed(InsetCode code) const
{
- return code != FLOAT_CODE
- && code != FOOT_CODE
- && code != MARGIN_CODE;
+ return code != FOOT_CODE
+ && code != MARGIN_CODE
+ && (code != FLOAT_CODE || !params_.subfloat);
}
}
+void InsetFloat::subfloat(bool s, BufferParams const & bp)
+{
+ params_.subfloat = s;
+ docstring lab = _("float: ") + floatName(params_.type, bp);
+ if (s)
+ lab = _("subfloat: ") + floatName(params_.type, bp);
+ setLabel(lab);
+}
+
+
+docstring InsetFloat::getCaption(OutputParams const & runparams) const
+{
+ if (paragraphs().empty())
+ return docstring();
+
+ ParagraphList::const_iterator pit = paragraphs().begin();
+ for (; pit != paragraphs().end(); ++pit) {
+ InsetList::const_iterator it = pit->insetList().begin();
+ for (; it != pit->insetList().end(); ++it) {
+ Inset & inset = *it->inset;
+ if (inset.lyxCode() == CAPTION_CODE) {
+ odocstringstream ods;
+ InsetCaption * ins =
+ static_cast<InsetCaption *>(it->inset);
+ ins->getOptArg(ods, runparams);
+ ods << '[';
+ ins->getArgument(ods, runparams);
+ ods << ']';
+ return ods.str();
+ }
+ }
+ }
+ return docstring();
+}
+
+
string const InsetFloatMailer::name_("float");
InsetFloatMailer::InsetFloatMailer(InsetFloat & inset)