]> git.lyx.org Git - lyx.git/blobdiff - src/insets/InsetCollapsable.cpp
Inset::addToToc(): change signature. Use DocIterator instead of ParConstIterator...
[lyx.git] / src / insets / InsetCollapsable.cpp
index 91d477bed72a363b2485d60b9275fab80494f5ea..c255d24709b367f42d91db9bcd62cfe43fc6e094 100644 (file)
 #include "frontends/FontMetrics.h"
 #include "frontends/Painter.h"
 
+#include "support/lassert.h"
 #include "support/debug.h"
 #include "support/docstream.h"
 #include "support/gettext.h"
 
 using namespace std;
 
-namespace lyx {
 
+namespace lyx {
 
 InsetCollapsable::CollapseStatus InsetCollapsable::status() const
 {
@@ -76,15 +77,16 @@ InsetCollapsable::Geometry InsetCollapsable::geometry() const
 
 
 InsetCollapsable::InsetCollapsable(Buffer const & buf,
-               CollapseStatus status, DocumentClass * dc)
+               CollapseStatus status)
        : InsetText(buf), status_(status),
          openinlined_(false), autoOpen_(false), mouse_hover_(false)
 {
-       setLayout(dc);
+       DocumentClass const & dc = buf.params().documentClass();
+       setLayout(&dc);
        setAutoBreakRows(true);
        setDrawFrame(true);
        setFrameColor(Color_collapsableframe);
-       paragraphs().back().setLayout(buf.params().documentClass().emptyLayout());
+       paragraphs().back().setLayout(dc.emptyLayout());
 }
 
 
@@ -106,17 +108,30 @@ docstring InsetCollapsable::toolTip(BufferView const & bv, int x, int y) const
 {
        Dimension dim = dimensionCollapsed();
        if (geometry() == NoButton)
-               return layout_->labelstring();
+               return translateIfPossible(layout_->labelstring());
        if (x > xo(bv) + dim.wid || y > yo(bv) + dim.des)
                return docstring();
 
+       docstring default_tip;
        switch (status_) {
        case Open:
-               return _("Left-click to collapse the inset");
+               default_tip = _("Left-click to collapse the inset");
+               break;
        case Collapsed:
-               return _("Left-click to open the inset");
+               default_tip = _("Left-click to open the inset");
+               break;
        }
-       return docstring();
+
+       OutputParams rp(&buffer().params().encoding());
+       odocstringstream ods;
+       InsetText::plaintext(ods, rp);
+       docstring content_tip = ods.str();
+       // shorten it if necessary
+       if (content_tip.size() > 200)
+               content_tip = content_tip.substr(0, 200) + "...";
+       if (!isOpen() && !content_tip.empty())
+               return content_tip + '\n' + default_tip;
+       return default_tip;
 }
 
 
@@ -130,7 +145,7 @@ void InsetCollapsable::setLayout(DocumentClass const * const dc)
 {
        if (dc) {
                layout_ = &(dc->insetLayout(name()));
-               labelstring_ = layout_->labelstring();
+               labelstring_ = translateIfPossible(layout_->labelstring());
        } else {
                layout_ = &DocumentClass::emptyInsetLayout();
                labelstring_ = _("UNDEFINED");
@@ -161,8 +176,7 @@ void InsetCollapsable::read(Lexer & lex)
        lex.setContext("InsetCollapsable::read");
        string tmp_token;
        status_ = Collapsed;
-       lex >> "status";
-       lex >> tmp_token;
+       lex >> "status" >> tmp_token;
        if (tmp_token == "open")
                status_ = Open;
 
@@ -184,7 +198,7 @@ void InsetCollapsable::read(Lexer & lex)
 
 Dimension InsetCollapsable::dimensionCollapsed() const
 {
-       BOOST_ASSERT(layout_);
+       LASSERT(layout_, /**/);
        Dimension dim;
        theFontMetrics(layout_->labelfont()).buttonText(
                labelstring_, dim.wid, dim.asc, dim.des);
@@ -194,7 +208,7 @@ Dimension InsetCollapsable::dimensionCollapsed() const
 
 void InsetCollapsable::metrics(MetricsInfo & mi, Dimension & dim) const
 {
-       BOOST_ASSERT(layout_);
+       LASSERT(layout_, /**/);
 
        autoOpen_ = mi.base.bv->cursor().isInside(this);
 
@@ -259,7 +273,7 @@ bool InsetCollapsable::setMouseHover(bool mouse_hover)
 
 void InsetCollapsable::draw(PainterInfo & pi, int x, int y) const
 {
-       BOOST_ASSERT(layout_);
+       LASSERT(layout_, /**/);
 
        autoOpen_ = pi.base.bv->cursor().isInside(this);
        ColorCode const old_color = pi.background_color;
@@ -384,7 +398,7 @@ void InsetCollapsable::cursorPos(BufferView const & bv,
 {
        if (geometry() == ButtonOnly)
                status_ = Open;
-       BOOST_ASSERT(geometry() != ButtonOnly);
+       LASSERT(geometry() != ButtonOnly, /**/);
 
        InsetText::cursorPos(bv, sl, boundary, x, y);
        Dimension const textdim = InsetText::dimension(bv);
@@ -448,8 +462,7 @@ docstring const InsetCollapsable::getNewLabel(docstring const & l) const
 }
 
 
-void InsetCollapsable::edit(
-               Cursor & cur, bool front, EntryDirection entry_from)
+void InsetCollapsable::edit(Cursor & cur, bool front, EntryDirection entry_from)
 {
        //lyxerr << "InsetCollapsable: edit left/right" << endl;
        cur.push(*this);
@@ -628,7 +641,6 @@ bool InsetCollapsable::getStatus(Cursor & cur, FuncRequest const & cmd,
        case LFUN_ACCENT_HUNGARIAN_UMLAUT:
        case LFUN_ACCENT_MACRON:
        case LFUN_ACCENT_OGONEK:
-       case LFUN_ACCENT_SPECIAL_CARON:
        case LFUN_ACCENT_TIE:
        case LFUN_ACCENT_TILDE:
        case LFUN_ACCENT_UMLAUT:
@@ -707,11 +719,14 @@ bool InsetCollapsable::getStatus(Cursor & cur, FuncRequest const & cmd,
                return InsetText::getStatus(cur, cmd, flag);
 
        case LFUN_INSET_TOGGLE:
-               if ((cmd.argument() == "open" && status_ != Open)
-                     || (cmd.argument() == "close" && status_ == Open)
-                     || cmd.argument() == "toggle" || cmd.argument().empty())
-                               flag.enabled(true);
-               else
+               if (cmd.argument() == "open")
+                       flag.enabled(status_ != Open);
+               else if (cmd.argument() == "close")
+                       flag.enabled(status_ == Open);
+               else if (cmd.argument() == "toggle" || cmd.argument().empty()) {
+                       flag.enabled(true);
+                       flag.setOnOff(status_ == Open);
+               } else
                        flag.enabled(false);
                return true;
 
@@ -740,8 +755,10 @@ void InsetCollapsable::setStatus(Cursor & cur, CollapseStatus status)
 {
        status_ = status;
        setButtonLabel();
-       if (status_ == Collapsed)
+       if (status_ == Collapsed) {
                cur.leaveInset(*this);
+               mouse_hover_ = false;
+       }
 }