X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2Finsets%2Finsetminipage.C;h=c763d727a161ec9c8ce4e2d10a9e623d1a4399de;hb=26f1a5bfcae4b7fd7b946a1884c396d842b24925;hp=1f3ee2e0542aa009da7904f4a2884d25ac2c6383;hpb=37274eb840a7af8ef0acaf12649f31a8d229b110;p=lyx.git diff --git a/src/insets/insetminipage.C b/src/insets/insetminipage.C index 1f3ee2e054..c763d727a1 100644 --- a/src/insets/insetminipage.C +++ b/src/insets/insetminipage.C @@ -1,30 +1,33 @@ -/* This file is part of - * ====================================================== - * - * LyX, The Document Processor - * - * Copyright 1998 The LyX Team. +/** + * \file insetminipage.C + * This file is part of LyX, the document processor. + * Licence details can be found in the file COPYING. * - *======================================================*/ + * \author Jürgen Vigna + * \author Lars Gullik Bjønnes + * + * Full author contact details are available in file CREDITS + */ #include -#ifdef __GNUG__ -#pragma implementation -#endif #include "insetminipage.h" +#include "insettext.h" + +#include "BufferView.h" +#include "debug.h" +#include "funcrequest.h" #include "gettext.h" #include "lyxfont.h" -#include "BufferView.h" -#include "LyXView.h" -#include "frontends/Dialogs.h" +#include "lyxlex.h" #include "lyxtext.h" -#include "insets/insettext.h" + +#include "frontends/LyXView.h" +#include "frontends/Dialogs.h" + #include "support/LOstream.h" #include "support/lstrings.h" -#include "debug.h" -#include "gettext.h" using std::ostream; using std::endl; @@ -58,9 +61,8 @@ using std::endl; // have to output "" for minipages. // (Lgb) -InsetMinipage::InsetMinipage() - : InsetCollapsable(), pos_(center), - inner_pos_(inner_center) +InsetMinipage::InsetMinipage(BufferParams const & bp) + : InsetCollapsable(bp) { setLabel(_("minipage")); LyXFont font(LyXFont::ALL_SANE); @@ -68,136 +70,163 @@ InsetMinipage::InsetMinipage() font.decSize(); font.setColor(LColor::collapsable); setLabelFont(font); +#if 0 setAutoCollapse(false); +#endif + +#if 0 +#ifdef WITH_WARNINGS +#warning Remove this color definitions before 1.2.0 final! +#endif + // just for experimentation :) + setBackgroundColor(LColor::green); +#endif + + inset.setFrameColor(0, LColor::blue); setInsetName("Minipage"); - width_ = "100%"; // set default to 100% of column_width +} + + +InsetMinipage::InsetMinipage(InsetMinipage const & in, bool same_id) + : InsetCollapsable(in, same_id), params_(in.params_) +{} + + +Inset * InsetMinipage::clone(Buffer const &, bool same_id) const +{ + return new InsetMinipage(*const_cast(this), same_id); } InsetMinipage::~InsetMinipage() { - hideDialog(); + InsetMinipageMailer mailer(*this); + mailer.hideDialog(); } -void InsetMinipage::write(Buffer const * buf, ostream & os) const +dispatch_result InsetMinipage::localDispatch(FuncRequest const & cmd) { - os << getInsetName() << "\n" - << "position " << pos_ << "\n" - << "inner_position " << inner_pos_ << "\n" - << "height \"" << height_ << "\"\n" - << "width \"" << width_ << "\"\n"; - InsetCollapsable::write(buf, os); + Inset::RESULT result = UNDISPATCHED; + + switch (cmd.action) { + case LFUN_INSET_MODIFY: { + InsetMinipage::Params params; + InsetMinipageMailer::string2params(cmd.argument, params); + + params_.pos = params.pos; + params_.width = params.width; + + // FIXME: what magical mysterious commands are actually + // needed here to update the bloody size of the inset !!! + cmd.view()->updateInset(this); + result = DISPATCHED; + } + break; + + case LFUN_INSET_DIALOG_UPDATE: { + InsetMinipageMailer mailer(*this); + mailer.updateDialog(cmd.view()); + } + break; + + default: + result = InsetCollapsable::localDispatch(cmd); + } + + return result; } -void InsetMinipage::read(Buffer const * buf, LyXLex & lex) +void InsetMinipage::Params::write(ostream & os) const { - string token; + os << "Minipage" << '\n' + << "position " << pos << '\n' + << "inner_position " << inner_pos << '\n' + << "height \"" << height.asString() << "\"\n" + << "width \"" << width.asString() << "\"\n"; +} - if (lex.IsOK()) { + +void InsetMinipage::Params::read(LyXLex & lex) +{ + if (lex.isOK()) { lex.next(); - token = lex.GetString(); + string const token = lex.getString(); if (token == "position") { lex.next(); - pos_ = static_cast(lex.GetInteger()); - token = string(); + pos = static_cast(lex.getInteger()); } else { lyxerr << "InsetMinipage::Read: Missing 'position'-tag!" << endl; + // take countermeasures + lex.pushToken(token); } } - if (lex.IsOK()) { - if (token.empty()) { - lex.next(); - token = lex.GetString(); - } + if (lex.isOK()) { + lex.next(); + string const token = lex.getString(); if (token == "inner_position") { lex.next(); - inner_pos_ = static_cast(lex.GetInteger()); - token = string(); + inner_pos = static_cast(lex.getInteger()); } else { lyxerr << "InsetMinipage::Read: Missing 'inner_position'-tag!" << endl; + // take countermeasures + lex.pushToken(token); } } - if (lex.IsOK()) { - if (token.empty()) { - lex.next(); - token = lex.GetString(); - } + if (lex.isOK()) { + lex.next(); + string const token = lex.getString(); if (token == "height") { lex.next(); - height_ = lex.GetString(); - token = string(); + height = LyXLength(lex.getString()); } else { lyxerr << "InsetMinipage::Read: Missing 'height'-tag!" << endl; + // take countermeasures + lex.pushToken(token); } } - if (lex.IsOK()) { - if (token.empty()) { - lex.next(); - token = lex.GetString(); - } + if (lex.isOK()) { + lex.next(); + string const token = lex.getString(); if (token == "width") { lex.next(); - width_ = lex.GetString(); - token = string(); + width = LyXLength(lex.getString()); } else { lyxerr << "InsetMinipage::Read: Missing 'width'-tag!" << endl; + // take countermeasures + lex.pushToken(token); } } -#ifdef WITH_WARNINGS -#warning Remove me before final 1.2.0 (Jug) -#warning Can we please remove this as soon as possible? (Lgb) -#endif - // this is only for compatibility to the intermediate format and should - // vanish till the final 1.2.0! - if (lex.IsOK()) { - if (token.empty()) { - lex.next(); - token = lex.GetString(); - } - if (token == "widthp") { - lex.next(); - // only do this if the width_-string was not already set! - if (width_.empty()) - width_ = lex.GetString() + "%"; - token = string(); - } - } - if (!token.empty()) - lex.pushToken(token); - InsetCollapsable::read(buf, lex); } -Inset * InsetMinipage::clone(Buffer const &, bool same_id) const +void InsetMinipage::write(Buffer const * buf, ostream & os) const { - InsetMinipage * result = new InsetMinipage; - result->inset.init(&inset, same_id); - - result->collapsed_ = collapsed_; - result->pos_ = pos_; - result->inner_pos_ = inner_pos_; - result->height_ = height_; - result->width_ = width_; - if (same_id) - result->id_ = id_; - return result; + params_.write(os); + InsetCollapsable::write(buf, os); +} + + +void InsetMinipage::read(Buffer const * buf, LyXLex & lex) +{ + params_.read(lex); + InsetCollapsable::read(buf, lex); } int InsetMinipage::ascent(BufferView * bv, LyXFont const & font) const { if (collapsed_) - return ascent_collapsed(bv->painter()); + return ascent_collapsed(); else { // Take placement into account. int i = 0; - switch (pos_) { + switch (params_.pos) { case top: i = InsetCollapsable::ascent(bv, font); break; @@ -217,11 +246,11 @@ int InsetMinipage::ascent(BufferView * bv, LyXFont const & font) const int InsetMinipage::descent(BufferView * bv, LyXFont const & font) const { if (collapsed_) - return descent_collapsed(bv->painter()); + return descent_collapsed(); else { // Take placement into account. int i = 0; - switch (pos_) { + switch (params_.pos) { case top: i = InsetCollapsable::descent(bv, font); break; @@ -248,20 +277,20 @@ int InsetMinipage::latex(Buffer const * buf, ostream & os, bool fragile, bool fp) const { string s_pos; - switch (pos_) { + switch (params_.pos) { case top: - s_pos += "t"; + s_pos += 't'; break; case center: - s_pos += "c"; + s_pos += 'c'; break; case bottom: - s_pos += "b"; + s_pos += 'b'; break; } os << "\\begin{minipage}[" << s_pos << "]{" - << LyXLength(width_).asLatexString() << "}%\n"; - + << params_.width.asLatexString() << "}%\n"; + int i = inset.latex(buf, os, fragile, fp); os << "\\end{minipage}%\n"; @@ -278,78 +307,101 @@ bool InsetMinipage::insetAllowed(Inset::Code code) const } -InsetMinipage::Position InsetMinipage::pos() const +bool InsetMinipage::showInsetDialog(BufferView * bv) const { - return pos_; -} - + if (!inset.showInsetDialog(bv)) { + InsetMinipage * tmp = const_cast(this); + InsetMinipageMailer mailer(*tmp); + mailer.showDialog(bv); + } -void InsetMinipage::pos(InsetMinipage::Position p) -{ - pos_ = p; + return true; } -InsetMinipage::InnerPosition InsetMinipage::innerPos() const +int InsetMinipage::getMaxWidth(BufferView * bv, UpdatableInset const * inset) + const { - return inner_pos_; + if (owner() && + static_cast(owner())->getMaxWidth(bv, inset) < 0) { + return -1; + } + if (!params_.width.zero()) { + int ww1 = latexTextWidth(bv); + int ww2 = InsetCollapsable::getMaxWidth(bv, inset); + if (ww2 > 0 && ww2 < ww1) { + return ww2; + } + return ww1; + } + // this should not happen! + return InsetCollapsable::getMaxWidth(bv, inset); } -void InsetMinipage::innerPos(InsetMinipage::InnerPosition ip) +int InsetMinipage::latexTextWidth(BufferView * bv) const { - inner_pos_ = ip; + return params_.width.inPixels(InsetCollapsable::latexTextWidth(bv)); } -string const & InsetMinipage::height() const -{ - return height_; -} +InsetMinipage::Params::Params() + : pos(center), + inner_pos(inner_center), + width(100, LyXLength::PCW) +{} -void InsetMinipage::height(string const & ll) -{ - height_ = ll; -} +string const InsetMinipageMailer:: name_("minipage"); + +InsetMinipageMailer::InsetMinipageMailer(InsetMinipage & inset) + : inset_(inset) +{} -string const & InsetMinipage::width() const +string const InsetMinipageMailer::inset2string() const { - return width_; + return params2string(inset_.params()); } -void InsetMinipage::width(string const & ll) +void InsetMinipageMailer::string2params(string const & in, + InsetMinipage::Params & params) { - width_ = ll; -} + params = InsetMinipage::Params(); + istringstream data(in); + LyXLex lex(0,0); + lex.setStream(data); -bool InsetMinipage::showInsetDialog(BufferView * bv) const -{ - if (!inset.showInsetDialog(bv)) - bv->owner()->getDialogs()->showMinipage(const_cast(this)); - return true; -} + if (lex.isOK()) { + lex.next(); + string const token = lex.getString(); + if (token != "minipage") + 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 != "Minipage") + return; + } -void InsetMinipage::insetButtonRelease(BufferView * bv, int x, int y, - int button) -{ - if (button == 3) { - showInsetDialog(bv); - return; + if (lex.isOK()) { + params.read(lex); } - InsetCollapsable::insetButtonRelease(bv, x, y, button); } -int InsetMinipage::getMaxWidth(BufferView * bv, UpdatableInset const * inset) - const +string const +InsetMinipageMailer::params2string(InsetMinipage::Params const & params) { - if (!width_.empty()) - return VSpace(width_).inPixels(bv); - // this should not happen! - return InsetCollapsable::getMaxWidth(bv, inset); + ostringstream data; + data << name_ << ' '; + params.write(data); + + return data.str(); }