]> git.lyx.org Git - lyx.git/blobdiff - src/insets/InsetText.cpp
requires is a keyword in C++2a
[lyx.git] / src / insets / InsetText.cpp
index 2126fb15b2f6a94f87a4e5e8b66143bfd76dd7a2..3d7de487f6d1b224327d4bc36a999e8079ed75a8 100644 (file)
@@ -79,14 +79,15 @@ using graphics::PreviewLoader;
 /////////////////////////////////////////////////////////////////////
 
 InsetText::InsetText(Buffer * buf, UsePlain type)
-       : Inset(buf), drawFrame_(false), frame_color_(Color_insetframe),
+       : Inset(buf), drawFrame_(false), is_changed_(false), frame_color_(Color_insetframe),
        text_(this, type == DefaultLayout)
 {
 }
 
 
 InsetText::InsetText(InsetText const & in)
-       : Inset(in), drawFrame_(in.drawFrame_), frame_color_(in.frame_color_),
+       : Inset(in), drawFrame_(in.drawFrame_), is_changed_(in.is_changed_),
+         frame_color_(in.frame_color_),
          text_(this, in.text_)
 {
 }
@@ -140,9 +141,9 @@ Dimension const InsetText::dimensionHelper(BufferView const & bv) const
 {
        TextMetrics const & tm = bv.textMetrics(&text_);
        Dimension dim = tm.dim();
-       dim.wid += 2 * TEXT_TO_INSET_OFFSET;
-       dim.des += TEXT_TO_INSET_OFFSET;
-       dim.asc += TEXT_TO_INSET_OFFSET;
+       dim.wid += leftOffset(&bv) + rightOffset(&bv);
+       dim.des += bottomOffset(&bv);
+       dim.asc += topOffset(&bv);
        return dim;
 }
 
@@ -189,9 +190,11 @@ void InsetText::metrics(MetricsInfo & mi, Dimension & dim) const
 
        //lyxerr << "InsetText::metrics: width: " << mi.base.textwidth << endl;
 
+       int const horiz_offset = leftOffset(mi.base.bv) + rightOffset(mi.base.bv);
+
        // Hand font through to contained lyxtext:
        tm.font_.fontInfo() = mi.base.font;
-       mi.base.textwidth -= 2 * TEXT_TO_INSET_OFFSET;
+       mi.base.textwidth -= horiz_offset;
 
        // This can happen when a layout has a left and right margin,
        // and the view is made very narrow. We can't do better than
@@ -203,10 +206,10 @@ void InsetText::metrics(MetricsInfo & mi, Dimension & dim) const
                tm.metrics(mi, dim, mi.base.textwidth);
        else
                tm.metrics(mi, dim);
-       mi.base.textwidth += 2 * TEXT_TO_INSET_OFFSET;
-       dim.asc += TEXT_TO_INSET_OFFSET;
-       dim.des += TEXT_TO_INSET_OFFSET;
-       dim.wid += 2 * TEXT_TO_INSET_OFFSET;
+       mi.base.textwidth += horiz_offset;
+       dim.asc += topOffset(mi.base.bv);
+       dim.des += bottomOffset(mi.base.bv);
+       dim.wid += horiz_offset;
 }
 
 
@@ -214,10 +217,11 @@ void InsetText::draw(PainterInfo & pi, int x, int y) const
 {
        TextMetrics & tm = pi.base.bv->textMetrics(&text_);
 
-       int const w = tm.width() + TEXT_TO_INSET_OFFSET;
-       int const yframe = y - TEXT_TO_INSET_OFFSET - tm.ascent();
-       int const h = tm.height() + 2 * TEXT_TO_INSET_OFFSET;
-       int const xframe = x + TEXT_TO_INSET_OFFSET / 2;
+       int const horiz_offset = leftOffset(pi.base.bv) + rightOffset(pi.base.bv);
+       int const w = tm.width() + (horiz_offset - horiz_offset / 2);
+       int const yframe = y - topOffset(pi.base.bv) - tm.ascent();
+       int const h = tm.height() + topOffset(pi.base.bv) + bottomOffset(pi.base.bv);
+       int const xframe = x + leftOffset(pi.base.bv) / 2;
        bool change_drawn = false;
        if (pi.full_repaint)
                        pi.pain.fillRectangle(xframe, yframe, w, h,
@@ -227,8 +231,8 @@ void InsetText::draw(PainterInfo & pi, int x, int y) const
                Changer dummy = make_change(pi.background_color,
                                            pi.backgroundColor(this, false));
                // The change tracking cue must not be inherited
-               Changer dummy2 = make_change(pi.change_, Change());
-               tm.draw(pi, x + TEXT_TO_INSET_OFFSET, y);
+               Changer dummy2 = make_change(pi.change, Change());
+               tm.draw(pi, x + leftOffset(pi.base.bv), y);
        }
 
        if (drawFrame_) {
@@ -236,7 +240,7 @@ void InsetText::draw(PainterInfo & pi, int x, int y) const
                // Only do so if the color is not custom. But do so even if RowPainter
                // handles the strike-through already.
                Color c;
-               if (pi.change_.changed()
+               if (pi.change.changed()
                    // Originally, these are the colors with role Text, from role() in
                    // ColorCache.cpp.  The code is duplicated to avoid depending on Qt
                    // types, and also maybe it need not match in the future.
@@ -245,18 +249,18 @@ void InsetText::draw(PainterInfo & pi, int x, int y) const
                        || frameColor() == Color_preview
                        || frameColor() == Color_tabularline
                        || frameColor() == Color_previewframe)) {
-                       c = pi.change_.color();
+                       c = pi.change.color();
                        change_drawn = true;
                } else
                        c = frameColor();
                pi.pain.rectangle(xframe, yframe, w, h, c);
        }
 
-       if (canPaintChange(*pi.base.bv) && (!change_drawn || pi.change_.deleted()))
+       if (canPaintChange(*pi.base.bv) && (!change_drawn || pi.change.deleted()))
                // Do not draw the change tracking cue if already done by RowPainter and
                // do not draw the cue for INSERTED if the information is already in the
                // color of the frame
-               pi.change_.paintCue(pi, xframe, yframe, xframe + w, yframe + h);
+               pi.change.paintCue(pi, xframe, yframe, xframe + w, yframe + h);
 }
 
 
@@ -410,6 +414,18 @@ void InsetText::fixParagraphsFont()
 }
 
 
+// bool InsetText::isChanged() const
+// {
+//     ParagraphList::const_iterator pit = paragraphs().begin();
+//     ParagraphList::const_iterator end = paragraphs().end();
+//     for (; pit != end; ++pit) {
+//             if (pit->isChanged())
+//                     return true;
+//     }
+//     return false;
+// }
+
+
 void InsetText::setChange(Change const & change)
 {
        ParagraphList::iterator pit = paragraphs().begin();
@@ -686,7 +702,7 @@ void InsetText::getArgs(otexstream & os, OutputParams const & runparams_in,
 void InsetText::cursorPos(BufferView const & bv,
                CursorSlice const & sl, bool boundary, int & x, int & y) const
 {
-       x = bv.textMetrics(&text_).cursorX(sl, boundary) + TEXT_TO_INSET_OFFSET;
+       x = bv.textMetrics(&text_).cursorX(sl, boundary) + leftOffset(&bv);
        y = bv.textMetrics(&text_).cursorY(sl, boundary);
 }
 
@@ -799,7 +815,7 @@ bool InsetText::insetAllowed(InsetCode code) const
 }
 
 
-void InsetText::updateBuffer(ParIterator const & it, UpdateType utype)
+void InsetText::updateBuffer(ParIterator const & it, UpdateType utype, bool const deleted)
 {
        ParIterator it2 = it;
        it2.forwardPos();
@@ -813,7 +829,7 @@ void InsetText::updateBuffer(ParIterator const & it, UpdateType utype)
                        cnt.clearLastLayout();
                        // FIXME cnt.saveLastCounter()?
                }
-               buffer().updateBuffer(it2, utype);
+               buffer().updateBuffer(it2, utype, deleted);
                if (save_layouts) {
                        // LYXERR0("Exiting " << name());
                        cnt.restoreLastLayout();
@@ -829,7 +845,7 @@ void InsetText::updateBuffer(ParIterator const & it, UpdateType utype)
                // we need float information even in note insets (#9760)
                tclass.counters().current_float(savecnt.current_float());
                tclass.counters().isSubfloat(savecnt.isSubfloat());
-               buffer().updateBuffer(it2, utype);
+               buffer().updateBuffer(it2, utype, deleted);
                tclass.counters() = move(savecnt);
        }
 }
@@ -1084,12 +1100,12 @@ docstring InsetText::toolTipText(docstring prefix, size_t const len) const
                if ((*it).isRTL(buffer().params()))
                        oss << "<div dir=\"rtl\">";
                writePlaintextParagraph(buffer(), *it, oss, rp, ref_printed, len);
-               if ((*it).isRTL(buffer().params()))
-                       oss << "</div>";
                if (oss.tellp() >= 0 && size_t(oss.tellp()) > len)
                        break;
        }
        docstring str = oss.str();
+       if (isChanged())
+               str += from_ascii("\n\n") + _("[contains tracked changes]");
        support::truncateWithEllipsis(str, len);
        return str;
 }