]> git.lyx.org Git - lyx.git/blobdiff - src/TextMetrics.cpp
Refactor InsetQuotes.h enums
[lyx.git] / src / TextMetrics.cpp
index ea594e9b9904f8a47d423df830283422f62bca44..214fe89238d5868d7051ba943a4db59903415cc5 100644 (file)
 #include "TextMetrics.h"
 
 #include "Buffer.h"
-#include "buffer_funcs.h"
 #include "BufferParams.h"
 #include "BufferView.h"
 #include "CoordCache.h"
 #include "Cursor.h"
 #include "CutAndPaste.h"
-#include "InsetList.h"
-#include "Language.h"
 #include "Layout.h"
 #include "LyXRC.h"
 #include "MetricsInfo.h"
 
 #include "insets/InsetText.h"
 
-#include "mathed/InsetMathMacroTemplate.h"
+#include "mathed/MacroTable.h"
 
 #include "frontends/FontMetrics.h"
-#include "frontends/Painter.h"
 #include "frontends/NullPainter.h"
 
-#include "support/convert.h"
 #include "support/debug.h"
 #include "support/lassert.h"
-#include "support/lyxlib.h"
-#include "support/RefChanger.h"
+#include "support/Changer.h"
 
 #include <stdlib.h>
 #include <cmath>
@@ -221,7 +215,7 @@ void TextMetrics::newParMetricsUp()
 }
 
 
-bool TextMetrics::metrics(MetricsInfo & mi, Dimension & dim, int min_width,
+bool TextMetrics::metrics(MetricsInfo const & mi, Dimension & dim, int min_width,
                          bool const expand_on_multipars)
 {
        LBUFERR(mi.base.textwidth > 0);
@@ -388,13 +382,13 @@ bool TextMetrics::isRTLBoundary(pit_type pit, pos_type pos,
            || !contains(pit))
                return false;
 
-       ParagraphMetrics & pm = par_metrics_[pit];
+       ParagraphMetrics const & pm = par_metrics_[pit];
        // no RTL boundary in empty paragraph
        if (pm.rows().empty())
                return false;
 
-       pos_type endpos = pm.getRow(pos - 1, false).endpos();
-       pos_type startpos = pm.getRow(pos, false).pos();
+       pos_type const endpos = pm.getRow(pos - 1, false).endpos();
+       pos_type const startpos = pm.getRow(pos, false).pos();
        // no RTL boundary at line start:
        // abc\n   -> toggle to RTL ->    abc\n     (and not:    abc\n|
        // |                              |                               )
@@ -412,7 +406,7 @@ bool TextMetrics::isRTLBoundary(pit_type pit, pos_type pos,
                        || par.isSeparator(pos - 1)))
                return false;
 
-       bool left = font.isVisibleRightToLeft();
+       bool const left = font.isVisibleRightToLeft();
        bool right;
        if (pos == par.size())
                right = par.isRTL(bv_->buffer().params());
@@ -556,7 +550,7 @@ bool TextMetrics::redoParagraph(pit_type const pit, bool const align_rows)
                first = row.endpos();
                ++row_index;
 
-               pm.dim().wid = max(pm.dim().wid, row.width());
+               pm.dim().wid = max(pm.dim().wid, row.width() + row.right_margin);
                pm.dim().des += row.height();
        } while (first < par.size() || need_new_row);
 
@@ -676,7 +670,7 @@ void TextMetrics::setRowAlignment(Row & row, int width) const
        }
 
        // are there any hfills in the row?
-       ParagraphMetrics & pm = par_metrics_[row.pit()];
+       ParagraphMetrics const & pm = par_metrics_[row.pit()];
        int nh = numberOfHfills(row, pm, par.beginOfBody());
        int hfill = 0;
        int hfill_rem = 0;
@@ -1486,7 +1480,7 @@ InsetList::Element * TextMetrics::checkInsetHit(pit_type pit, int x, int y)
        }
 
        LYXERR(Debug::DEBUG, "No inset hit. ");
-       return 0;
+       return nullptr;
 }
 
 
@@ -1818,8 +1812,8 @@ void TextMetrics::drawParagraph(PainterInfo & pi, pit_type const pit, int const
                return;
        size_t const nrows = pm.rows().size();
        // Remember left and right margin for drawing math numbers
-       Changer changeleft = make_change(pi.leftx, x + leftMargin(pit));
-       Changer changeright = make_change(pi.rightx, x + width() - rightMargin(pit));
+       Changer changeleft = changeVar(pi.leftx, x + leftMargin(pit));
+       Changer changeright = changeVar(pi.rightx, x + width() - rightMargin(pit));
 
        // Use fast lane in nodraw stage.
        if (pi.pain.isNull()) {
@@ -1924,16 +1918,8 @@ void TextMetrics::drawParagraph(PainterInfo & pi, pit_type const pit, int const
                        LYXERR(Debug::PAINTING, "Clear rect@("
                               << max(row_x, 0) << ", " << y - row.ascent() << ")="
                               << width() << " x " << row.height());
-                       // FIXME: this is a hack. We clear an amount equal to
-                       // cursor width. This will not work if the caret has a
-                       // ridiculous width like 6. (see ticket #10797)
-                       // This is the same formula as in GuiWorkArea.
-                       int const caret_width = lyxrc.cursor_width
-                               ? lyxrc.cursor_width
-                               : 1 + int((lyxrc.currentZoom + 50) / 200.0);
-                       pi.pain.fillRectangle(max(row_x, 0), y - row.ascent(),
-                                             width() + caret_width,
-                                             row.height(), pi.background_color);
+                       pi.pain.fillRectangle(row_x, y - row.ascent(),
+                                             width(), row.height(), pi.background_color);
                }
 
                // Instrumentation for testing row cache (see also
@@ -1994,26 +1980,22 @@ void TextMetrics::drawParagraph(PainterInfo & pi, pit_type const pit, int const
 void TextMetrics::completionPosAndDim(Cursor const & cur, int & x, int & y,
        Dimension & dim) const
 {
-       Cursor const & bvcur = cur.bv().cursor();
+       DocIterator from = cur.bv().cursor();
+       DocIterator to = from;
+       text_->getWord(from.top(), to.top(), PREVIOUS_WORD);
 
-       // get word in front of cursor
-       docstring word = text_->previousWord(bvcur.top());
-       DocIterator wordStart = bvcur;
-       wordStart.pos() -= word.length();
-
-       // calculate dimensions of the word
-       Row row;
-       row.pit(bvcur.pit());
-       row.pos(wordStart.pos());
-       row.endpos(bvcur.pos());
-       setRowHeight(row);
-       dim = row.dim();
+       // The vertical dimension of the word
+       Font const font = displayFont(cur.pit(), from.pos());
+       FontMetrics const & fm = theFontMetrics(font);
+       // the +1's below are related to the extra pixels added in setRowHeight
+       dim.asc = fm.maxAscent() + 1;
+       dim.des = fm.maxDescent() + 1;
 
        // get position on screen of the word start and end
        //FIXME: Is it necessary to explicitly set this to false?
-       wordStart.boundary(false);
-       Point lxy = cur.bv().getPos(wordStart);
-       Point rxy = cur.bv().getPos(bvcur);
+       from.boundary(false);
+       Point lxy = cur.bv().getPos(from);
+       Point rxy = cur.bv().getPos(to);
        dim.wid = abs(rxy.x_ - lxy.x_);
 
        // calculate position of word