]> git.lyx.org Git - lyx.git/blobdiff - src/text2.C
the spellcheck cleanup
[lyx.git] / src / text2.C
index 66751d14bdb6f68a386c4c83b35ddcf0b50bff4a..6b5d4328a010480700d85101f05b9548d01c617a 100644 (file)
@@ -29,6 +29,7 @@
 #include "counters.h"
 #include "CutAndPaste.h"
 #include "debug.h"
+#include "dispatchresult.h"
 #include "errorlist.h"
 #include "Floating.h"
 #include "FloatList.h"
@@ -70,9 +71,10 @@ using std::string;
 
 LyXText::LyXText(BufferView * bv, InsetText * inset, bool ininset,
          ParagraphList & paragraphs)
-       : height(0), width(0), anchor_y_(0),
+       : height(0), width(0),
          inset_owner(inset), the_locking_inset(0), bv_owner(bv),
-         in_inset_(ininset), paragraphs_(&paragraphs)
+         in_inset_(ininset), paragraphs_(&paragraphs),
+               cache_pos_(-1)
 {
 }
 
@@ -88,8 +90,7 @@ void LyXText::init(BufferView * bview)
 
        width = 0;
        height = 0;
-
-       anchor_y_ = 0;
+       cache_pos_ = -1;
 
        current_font = getFont(beg, 0);
 
@@ -560,13 +561,18 @@ void LyXText::clearSelection()
 
 void LyXText::cursorHome()
 {
-       setCursor(cursorPar(), cursorRow()->pos());
+       ParagraphList::iterator cpit = cursorPar();
+       setCursor(cpit, cpit->getRow(cursor.pos())->pos());
 }
 
 
 void LyXText::cursorEnd()
 {
-       setCursor(cursorPar(), cursorRow()->endpos() - 1);
+       ParagraphList::iterator cpit = cursorPar();
+       pos_type end = cpit->getRow(cursor.pos())->endpos();
+       /* if not on the last row of the par, put the cursor before
+         the final space */
+       setCursor(cpit, end == cpit->size() ? end : end - 1);
 }
 
 
@@ -597,9 +603,10 @@ void LyXText::toggleFree(LyXFont const & font, bool toggleall)
        // If there is a change in the language the implicit word selection
        // is disabled.
        LyXCursor resetCursor = cursor;
-       bool implicitSelection = (font.language() == ignore_language
-                                 && font.number() == LyXFont::IGNORE)
-               ? selectWordWhenUnderCursor(lyx::WHOLE_WORD_STRICT) : false;
+       bool implicitSelection =
+               font.language() == ignore_language
+               && font.number() == LyXFont::IGNORE
+               && selectWordWhenUnderCursor(lyx::WHOLE_WORD_STRICT);
 
        // Set font
        setFont(font, toggleall);
@@ -651,8 +658,7 @@ string LyXText::getStringToIndex()
 // they do not duplicate themself and you cannnot make dirty things with
 // them!
 
-void LyXText::setParagraph(bool line_top, bool line_bottom,
-                          bool pagebreak_top, bool pagebreak_bottom,
+void LyXText::setParagraph(
                           VSpace const & space_top,
                           VSpace const & space_bottom,
                           Spacing const & spacing,
@@ -691,14 +697,10 @@ void LyXText::setParagraph(bool line_top, bool line_bottom,
 
                ParagraphList::iterator const pit = cursorPar();
                ParagraphParameters & params = pit->params();
-
-               params.lineTop(line_top);
-               params.lineBottom(line_bottom);
-               params.pagebreakTop(pagebreak_top);
-               params.pagebreakBottom(pagebreak_bottom);
                params.spaceTop(space_top);
                params.spaceBottom(space_bottom);
                params.spacing(spacing);
+
                // does the layout allow the new alignment?
                LyXLayout_ptr const & layout = pit->layout();
 
@@ -1297,7 +1299,7 @@ void LyXText::setCursor(LyXCursor & cur, paroffset_type par,
        // get the cursor y position in text
 
        ParagraphList::iterator pit = getPar(par);
-       Row const & row = *getRow(*pit, pos);
+       Row const & row = *pit->getRow(pos);
        int y = pit->y + row.y_offset();
 
        // y is now the beginning of the cursor row
@@ -1305,33 +1307,45 @@ void LyXText::setCursor(LyXCursor & cur, paroffset_type par,
        // y is now the cursor baseline
        cur.y(y);
 
-       pos_type last = lastPos(*pit, row);
+       pos_type const end = row.endpos();
 
        // None of these should happen, but we're scaredy-cats
-       if (pos > pit->size()) {
-               lyxerr << "dont like 1, pos: " << pos << " size: " << pit->size() << endl;
+       if (pos < 0) {
+               lyxerr << "dont like -1" << endl;
+               pos = 0;
+               cur.pos(0);
+               BOOST_ASSERT(false);
+       } else if (pos > pit->size()) {
+               lyxerr << "dont like 1, pos: " << pos
+                      << " size: " << pit->size()
+                      << " row.pos():" << row.pos()
+                      << " paroffset: " << par << endl;
                pos = 0;
                cur.pos(0);
-       } else if (pos > last + 1) {
+               BOOST_ASSERT(false);
+       } else if (pos > end) {
                lyxerr << "dont like 2 please report" << endl;
                // This shouldn't happen.
-               pos = last + 1;
+               pos = end;
                cur.pos(pos);
+               BOOST_ASSERT(false);
        } else if (pos < row.pos()) {
-               lyxerr << "dont like 3 please report" << endl;
+               lyxerr << "dont like 3 please report pos:" << pos
+                      << " size: " << pit->size()
+                      << " row.pos():" << row.pos()
+                      << " paroffset: " << par << endl;
                pos = row.pos();
                cur.pos(pos);
+               BOOST_ASSERT(false);
        }
-
        // now get the cursors x position
-       float x = getCursorX(pit, row, pos, last, boundary);
-       cur.x(int(x));
-       cur.x_fix(cur.x());
+       cur.x(int(getCursorX(pit, row, pos, boundary)));
+       bv()->x_target(cur.x());
 }
 
 
 float LyXText::getCursorX(ParagraphList::iterator pit, Row const & row,
-                         pos_type pos, pos_type last, bool boundary) const
+                         pos_type pos, bool boundary) const
 {
        pos_type cursor_vpos    = 0;
        double x                = row.x();
@@ -1339,13 +1353,14 @@ float LyXText::getCursorX(ParagraphList::iterator pit, Row const & row,
        double fill_hfill       = row.fill_hfill();
        double fill_label_hfill = row.fill_label_hfill();
        pos_type const row_pos  = row.pos();
+       pos_type const end = row.endpos();
 
-       if (last < row_pos)
+       if (end <= row_pos)
                cursor_vpos = row_pos;
-       else if (pos > last && !boundary)
+       else if (pos >= end && !boundary)
                cursor_vpos = (pit->isRightToLeftPar(bv()->buffer()->params()))
-                       ? row_pos : last + 1;
-       else if (pos > row_pos && (pos > last || boundary))
+                       ? row_pos : end;
+       else if (pos > row_pos && (pos >= end || boundary))
                // Place cursor after char at (logical) position pos - 1
                cursor_vpos = (bidi.level(pos - 1) % 2 == 0)
                        ? bidi.log2vis(pos - 1) + 1 : bidi.log2vis(pos - 1);
@@ -1356,15 +1371,15 @@ float LyXText::getCursorX(ParagraphList::iterator pit, Row const & row,
 
        pos_type body_pos = pit->beginningOfBody();
        if (body_pos > 0 &&
-           (body_pos - 1 > last || !pit->isLineSeparator(body_pos - 1)))
+           (body_pos > end || !pit->isLineSeparator(body_pos - 1)))
                body_pos = 0;
 
        for (pos_type vpos = row_pos; vpos < cursor_vpos; ++vpos) {
                pos_type pos = bidi.vis2log(vpos);
                if (body_pos > 0 && pos == body_pos - 1) {
-                       x += fill_label_hfill +
-                               font_metrics::width(
-                                       pit->layout()->labelsep, getLabelFont(pit));
+                       x += fill_label_hfill
+                               + font_metrics::width(pit->layout()->labelsep,
+                                                     getLabelFont(pit));
                        if (pit->isLineSeparator(body_pos - 1))
                                x -= singleWidth(pit, body_pos - 1);
                }
@@ -1408,7 +1423,7 @@ void LyXText::setCurrentFont()
                        --pos;
                else // potentional bug... BUG (Lgb)
                        if (pit->isSeparator(pos)) {
-                               if (pos > cursorRow()->pos() &&
+                               if (pos > pit->getRow(pos)->pos() &&
                                    bidi.level(pos) % 2 ==
                                    bidi.level(pos - 1) % 2)
                                        --pos;
@@ -1445,7 +1460,7 @@ pos_type LyXText::getColumnNearX(ParagraphList::iterator pit,
        double fill_label_hfill = row.fill_label_hfill();
 
        pos_type vc = row.pos();
-       pos_type last = lastPos(*pit, row);
+       pos_type end = row.endpos();
        pos_type c = 0;
        LyXLayout_ptr const & layout = pit->layout();
 
@@ -1455,17 +1470,17 @@ pos_type LyXText::getColumnNearX(ParagraphList::iterator pit,
        double last_tmpx = tmpx;
 
        if (body_pos > 0 &&
-           (body_pos - 1 > last ||
+           (body_pos > end ||
             !pit->isLineSeparator(body_pos - 1)))
                body_pos = 0;
 
        // check for empty row
-       if (!pit->size()) {
+       if (vc == end) {
                x = int(tmpx);
                return 0;
        }
 
-       while (vc <= last && tmpx <= x) {
+       while (vc < end && tmpx <= x) {
                c = bidi.vis2log(vc);
                last_tmpx = tmpx;
                if (body_pos > 0 && c == body_pos - 1) {
@@ -1496,8 +1511,7 @@ pos_type LyXText::getColumnNearX(ParagraphList::iterator pit,
                left_side = true;
        }
 
-       if (vc > last + 1)  // This shouldn't happen.
-               vc = last + 1;
+       BOOST_ASSERT(vc <= end);  // This shouldn't happen.
 
        boundary = false;
        // This (rtl_support test) is not needed, but gives
@@ -1511,8 +1525,8 @@ pos_type LyXText::getColumnNearX(ParagraphList::iterator pit,
                : false;
        if (lastrow &&
                 ((rtl  &&  left_side && vc == row.pos() && x < tmpx - 5) ||
-                 (!rtl && !left_side && vc == last + 1  && x > tmpx + 5)))
-               c = last + 1;
+                 (!rtl && !left_side && vc == end  && x > tmpx + 5)))
+               c = end;
        else if (vc == row.pos()) {
                c = bidi.vis2log(vc);
                if (bidi.level(c) % 2 == 1)
@@ -1526,12 +1540,12 @@ pos_type LyXText::getColumnNearX(ParagraphList::iterator pit,
                }
        }
 
-       if (row.pos() <= last && c > last && pit->isNewline(last)) {
-               if (bidi.level(last) % 2 == 0)
-                       tmpx -= singleWidth(pit, last);
+       if (row.pos() < end && c >= end && pit->isNewline(end - 1)) {
+               if (bidi.level(end -1) % 2 == 0)
+                       tmpx -= singleWidth(pit, end - 1);
                else
-                       tmpx += singleWidth(pit, last);
-               c = last;
+                       tmpx += singleWidth(pit, end - 1);
+               c = end - 1;
        }
 
        c -= row.pos();
@@ -1602,9 +1616,11 @@ void LyXText::cursorRight(bool internal)
 
 void LyXText::cursorUp(bool selecting)
 {
+       ParagraphList::iterator cpit = cursorPar();
+       Row const & crow = *cpit->getRow(cursor.pos());
 #if 1
-       int x = cursor.x_fix();
-       int y = cursor.y() - cursorRow()->baseline() - 1;
+       int x = bv()->x_target();
+       int y = cursor.y() - crow.baseline() - 1;
        setCursorFromCoordinates(x, y);
        if (!selecting) {
                int topy = bv_owner->top_y();
@@ -1619,18 +1635,20 @@ void LyXText::cursorUp(bool selecting)
        }
 #else
        lyxerr << "cursorUp: y " << cursor.y() << " bl: " <<
-               cursorRow()->baseline() << endl;
-       setCursorFromCoordinates(cursor.x_fix(),
-               cursor.y() - cursorRow()->baseline() - 1);
+               crow.baseline() << endl;
+       setCursorFromCoordinates(bv()->x_target(),
+               cursor.y() - crow.baseline() - 1);
 #endif
 }
 
 
 void LyXText::cursorDown(bool selecting)
 {
+       ParagraphList::iterator cpit = cursorPar();
+       Row const & crow = *cpit->getRow(cursor.pos());
 #if 1
-       int x = cursor.x_fix();
-       int y = cursor.y() - cursorRow()->baseline() + cursorRow()->height() + 1;
+       int x = bv()->x_target();
+       int y = cursor.y() - crow.baseline() + crow.height() + 1;
        setCursorFromCoordinates(x, y);
        if (!selecting) {
                int topy = bv_owner->top_y();
@@ -1644,30 +1662,31 @@ void LyXText::cursorDown(bool selecting)
                }
        }
 #else
-       setCursorFromCoordinates(cursor.x_fix(),
-                cursor.y() - cursorRow()->baseline() + cursorRow()->height() + 1);
+       setCursorFromCoordinates(bv()->x_target(),
+                cursor.y() - crow.baseline() + crow.height() + 1);
 #endif
 }
 
 
 void LyXText::cursorUpParagraph()
 {
+       ParagraphList::iterator cpit = cursorPar();
        if (cursor.pos() > 0)
-               setCursor(cursorPar(), 0);
-       else if (cursorPar() != ownerParagraphs().begin())
-               setCursor(boost::prior(cursorPar()), 0);
+               setCursor(cpit, 0);
+       else if (cpit != ownerParagraphs().begin())
+               setCursor(boost::prior(cpit), 0);
 }
 
 
 void LyXText::cursorDownParagraph()
 {
-       ParagraphList::iterator par = cursorPar();
-       ParagraphList::iterator next_par = boost::next(par);
+       ParagraphList::iterator pit = cursorPar();
+       ParagraphList::iterator next_pit = boost::next(pit);
 
-       if (next_par != ownerParagraphs().end())
-               setCursor(next_par, 0);
+       if (next_pit != ownerParagraphs().end())
+               setCursor(next_pit, 0);
        else
-               setCursor(par, par->size());
+               setCursor(pit, pit->size());
 }
 
 
@@ -1778,8 +1797,8 @@ bool LyXText::deleteEmptyParagraphMechanism(LyXCursor const & old_cursor)
        // we can't possibly have deleted a paragraph before this point
        bool deleted = false;
 
-       if (old_pit->empty() ||
-           (old_pit->size() == 1 && old_pit->isLineSeparator(0))) {
+       if (old_pit->empty()
+           || (old_pit->size() == 1 && old_pit->isLineSeparator(0))) {
                // ok, we will delete something
                LyXCursor tmpcursor;
 
@@ -1811,15 +1830,17 @@ bool LyXText::deleteEmptyParagraphMechanism(LyXCursor const & old_cursor)
                        selection.cursor = cursor;
                }
        }
-       if (!deleted) {
-               if (old_pit->stripLeadingSpaces()) {
-                       redoParagraph(old_pit);
-                       // correct cursor y
-                       setCursorIntern(cursor.par(), cursor.pos());
-                       selection.cursor = cursor;
-               }
+
+       if (deleted)
+               return true;
+
+       if (old_pit->stripLeadingSpaces()) {
+               redoParagraph(old_pit);
+               // correct cursor y
+               setCursorIntern(cursor.par(), cursor.pos());
+               selection.cursor = cursor;
        }
-       return deleted;
+       return false;
 }
 
 
@@ -1851,6 +1872,5 @@ bool LyXText::isInInset() const
 int defaultRowHeight()
 {
        LyXFont const font(LyXFont::ALL_SANE);
-       return int(font_metrics::maxAscent(font)
-                + font_metrics::maxDescent(font) * 1.5);
+       return int(font_metrics::maxHeight(font) *  1.2);
 }