]> git.lyx.org Git - lyx.git/blobdiff - src/insets/InsetCharStyle.cpp
Fix text frame drawing.
[lyx.git] / src / insets / InsetCharStyle.cpp
index 84ee71fd0f03d2d7e3db0332c1a370b02fa71462..079d872299e85d07855392320456a3bd208f2d10 100644 (file)
@@ -22,7 +22,6 @@
 #include "FuncStatus.h"
 #include "Cursor.h"
 #include "gettext.h"
-#include "LaTeXFeatures.h"
 #include "Color.h"
 #include "Lexer.h"
 #include "Text.h"
 namespace lyx {
 
 using std::string;
-using std::auto_ptr;
-using std::istringstream;
-using std::max;
 using std::ostream;
-using std::ostringstream;
-
-
-void InsetCharStyle::init()
-{
-       setInlined();
-       setDrawFrame(false);
-}
 
 
 InsetCharStyle::InsetCharStyle(BufferParams const & bp, string const s)
-       : InsetCollapsable(bp)
+       : InsetCollapsable(bp, Collapsed)
 {
-       params_.type = s;
-       setUndefined();
-       init();
+       params_.name = s;
 }
 
 
 InsetCharStyle::InsetCharStyle(BufferParams const & bp,
-                               CharStyles::iterator cs)
-       : InsetCollapsable(bp)
+                               InsetLayout il)
+       : InsetCollapsable(bp, Collapsed)
 {
-       params_.type = cs->name;
-       setDefined(cs);
-       init();
+       params_.name = il.name;
+       setLayout(il);
 }
 
 
 InsetCharStyle::InsetCharStyle(InsetCharStyle const & in)
        : InsetCollapsable(in), params_(in.params_)
-{
-       init();
-}
+{}
 
 
-auto_ptr<Inset> InsetCharStyle::doClone() const
+Inset * InsetCharStyle::clone() const
 {
-       return auto_ptr<Inset>(new InsetCharStyle(*this));
+       return new InsetCharStyle(*this);
 }
 
 
 bool InsetCharStyle::undefined() const
 {
-       return params_.latexname.empty();
-}
-
-
-void InsetCharStyle::setUndefined()
-{
-       params_.latextype.clear();
-       params_.latexname.clear();
-       params_.latexparam.clear();
-       params_.font = Font(Font::ALL_INHERIT);
-       params_.labelfont = Font(Font::ALL_INHERIT);
-       params_.labelfont.setColor(Color::error);
-       params_.show_label = true;
+       return layout_.labelstring == from_utf8("UNDEFINED");
 }
 
 
-void InsetCharStyle::setDefined(CharStyles::iterator cs)
+void InsetCharStyle::setLayout(InsetLayout il)
 {
-       params_.latextype = cs->latextype;
-       params_.latexname = cs->latexname;
-       params_.latexparam = cs->latexparam;
-       params_.font = cs->font;
-       params_.labelfont = cs->labelfont;
-       params_.show_label = true;
+       layout_ = il;
 }
 
 
@@ -134,7 +100,6 @@ void InsetCharStyle::read(Buffer const & buf, Lexer & lex)
 {
        params_.read(lex);
        InsetCollapsable::read(buf, lex);
-       setInlined();
 }
 
 
@@ -144,33 +109,8 @@ bool InsetCharStyle::metrics(MetricsInfo & mi, Dimension & dim) const
        getDrawFont(mi.base.font);
        mi.base.font.reduce(Font(Font::ALL_SANE));
        mi.base.font.realize(tmpfont);
-       mi.base.textwidth -= 2 * TEXT_TO_INSET_OFFSET;
-       InsetText::metrics(mi, dim);
+       bool changed = InsetCollapsable::metrics(mi, dim);
        mi.base.font = tmpfont;
-       if (params_.show_label) {
-               // consider width of the inset label
-               Font font(params_.labelfont);
-               font.realize(Font(Font::ALL_SANE));
-               font.decSize();
-               font.decSize();
-               int w = 0;
-               int a = 0;
-               int d = 0;
-               // FIXME UNICODE
-               docstring s(from_utf8(params_.type));
-               if (undefined())
-                       s = _("Undef: ") + s;
-               theFontMetrics(font).rectText(s, w, a, d);
-               dim.wid = max(dim.wid, w);
-       }
-       dim.asc += TEXT_TO_INSET_OFFSET;
-       dim.des += TEXT_TO_INSET_OFFSET;
-       dim.wid += 2 * TEXT_TO_INSET_OFFSET;
-       mi.base.textwidth += 2 * TEXT_TO_INSET_OFFSET;
-       if (params_.show_label)
-               dim.des += ascent();
-       bool const changed = dim_ != dim;
-       dim_ = dim;
        return changed;
 }
 
@@ -183,85 +123,20 @@ void InsetCharStyle::draw(PainterInfo & pi, int x, int y) const
        getDrawFont(pi.base.font);
        // I don't understand why the above .reduce and .realize aren't
        //needed, or even wanted, here. It just works. -- MV 10.04.2005
-       InsetText::draw(pi, x + TEXT_TO_INSET_OFFSET, y);
+       InsetCollapsable::draw(pi, x, y);
        pi.base.font = tmpfont;
-
-       int desc = InsetText::descent();
-       if (params_.show_label)
-               desc -= ascent();
-
-       pi.pain.line(x, y + desc - 4, x, y + desc, params_.labelfont.color());
-       pi.pain.line(x, y + desc, x + dim_.wid - 3, y + desc,
-               params_.labelfont.color());
-       pi.pain.line(x + dim_.wid - 3, y + desc, x + dim_.wid - 3, y + desc - 4,
-               params_.labelfont.color());
-
-       // the name of the charstyle. Can be toggled.
-       if (params_.show_label) {
-               Font font(params_.labelfont);
-               font.realize(Font(Font::ALL_SANE));
-               font.decSize();
-               font.decSize();
-               int w = 0;
-               int a = 0;
-               int d = 0;
-               // FIXME UNICODE
-               docstring s(from_utf8(params_.type));
-               if (undefined())
-                       s = _("Undef: ") + s;
-               theFontMetrics(font).rectText(s, w, a, d);
-               pi.pain.rectText(x + (dim_.wid - w) / 2, y + desc + a,
-                       s, font, Color::none, Color::none);
-       }
-
-       // a visual clue when the cursor is inside the inset
-       Cursor & cur = pi.base.bv->cursor();
-       if (cur.isInside(this)) {
-               y -= ascent();
-               pi.pain.line(x, y + 4, x, y, params_.labelfont.color());
-               pi.pain.line(x + 4, y, x, y, params_.labelfont.color());
-               pi.pain.line(x + dim_.wid - 3, y + 4, x + dim_.wid - 3, y,
-                       params_.labelfont.color());
-               pi.pain.line(x + dim_.wid - 7, y, x + dim_.wid - 3, y,
-                       params_.labelfont.color());
-       }
 }
 
 
 void InsetCharStyle::getDrawFont(Font & font) const
 {
-       font = params_.font;
+       font = layout_.font;
 }
 
 
 void InsetCharStyle::doDispatch(Cursor & cur, FuncRequest & cmd)
 {
-       setInlined();
-       switch (cmd.action) {
-       
-       case LFUN_MOUSE_PRESS:
-                       if (cmd.button() == mouse_button::button3)
-                               params_.show_label = !params_.show_label;
-                       else
-                               InsetText::doDispatch(cur, cmd);
-                       break;
-
-       case LFUN_INSET_TOGGLE:
-               if (cmd.argument() == "open")
-                       params_.show_label = true;
-               else if (cmd.argument() == "close")
-                       params_.show_label = false;
-               else if (cmd.argument() == "toggle" || cmd.argument().empty())
-                       params_.show_label = !params_.show_label;
-               else // if assign or anything else
-                       cur.undispatched();
-               cur.dispatched();
-               break;
-
-       default:
-               InsetCollapsable::doDispatch(cur, cmd);
-               break;
-       }
+       InsetCollapsable::doDispatch(cur, cmd);
 }
 
 
@@ -282,41 +157,24 @@ bool InsetCharStyle::getStatus(Cursor & cur, FuncRequest const & cmd,
 }
 
 
-int InsetCharStyle::latex(Buffer const & buf, odocstream & os,
-                          OutputParams const & runparams) const
-{
-       if (!undefined()) {
-               // FIXME UNICODE
-               os << '\\' << from_utf8(params_.latexname);
-               if (!params_.latexparam.empty())
-                       os << from_utf8(params_.latexparam);
-               os << '{';
-       }
-       int i = InsetText::latex(buf, os, runparams);
-       if (!undefined())
-               os << "}";
-       return i;
-}
-
-
 int InsetCharStyle::plaintext(Buffer const & buf, odocstream & os,
-                              OutputParams const & runparams) const
+                             OutputParams const & runparams) const
 {
        return InsetText::plaintext(buf, os, runparams);
 }
 
 
 int InsetCharStyle::docbook(Buffer const & buf, odocstream & os,
-                            OutputParams const & runparams) const
+                           OutputParams const & runparams) const
 {
        ParagraphList::const_iterator beg = paragraphs().begin();
        ParagraphList::const_iterator par = paragraphs().begin();
        ParagraphList::const_iterator end = paragraphs().end();
 
        if (!undefined())
-                // FIXME UNICODE
-                sgml::openTag(os, params_.latexname,
-                              par->getID(buf, runparams) + params_.latexparam);
+               // FIXME UNICODE
+               sgml::openTag(os, layout_.latexname,
+                             par->getID(buf, runparams) + layout_.latexparam);
 
        for (; par != end; ++par) {
                par->simpleDocBookOnePar(buf, os, runparams,
@@ -325,7 +183,7 @@ int InsetCharStyle::docbook(Buffer const & buf, odocstream & os,
        }
 
        if (!undefined())
-               sgml::closeTag(os, params_.latexname);
+               sgml::closeTag(os, layout_.latexname);
 
        return 0;
 }
@@ -337,18 +195,9 @@ void InsetCharStyle::textString(Buffer const & buf, odocstream & os) const
 }
 
 
-void InsetCharStyle::validate(LaTeXFeatures & features) const
-{
-       // Force inclusion of preamble snippet in layout file
-       features.require(params_.type);
-       InsetText::validate(features);
-}
-
-
 void InsetCharStyleParams::write(ostream & os) const
 {
-       os << "CharStyle " << type << "\n";
-       os << "show_label " << convert<string>(show_label) << "\n";
+       os << "CharStyle " << name << "\n";
 }
 
 
@@ -360,14 +209,10 @@ void InsetCharStyleParams::read(Lexer & lex)
 
                if (token == "CharStyle") {
                        lex.next();
-                       type = lex.getString();
-               }
-
-               else if (token == "show_label") {
-                       lex.next();
-                       show_label = lex.getBool();
+                       name = lex.getString();
                }
 
+               // This is handled in Collapsable
                else if (token == "status") {
                        lex.pushToken(token);
                        break;