]> git.lyx.org Git - features.git/blobdiff - src/text2.C
Introducing a number of tags parametrizing various
[features.git] / src / text2.C
index 58ca5969be49dcbfc33e7ca722c8138e80318bbf..73d96266eecdc224a1e5295d5fa2298f1ef3b7e9 100644 (file)
@@ -70,11 +70,11 @@ using std::ostringstream;
 using std::string;
 
 
-LyXText::LyXText(BufferView * bv, InsetText * inset, bool ininset,
+LyXText::LyXText(BufferView * bv, InsetText * inset, bool in_inset,
          ParagraphList & paragraphs)
-       : height(0), width(0), inset_owner(inset), bv_owner(bv),
-         in_inset_(ininset), paragraphs_(&paragraphs),
-               cache_pos_(-1)
+       : height(0), width(0), textwidth_(bv ? bv->workWidth() : 100),
+         inset_owner(inset), bv_owner(bv),
+         in_inset_(in_inset), paragraphs_(&paragraphs), xo_(0), yo_(0)
 {}
 
 
@@ -89,7 +89,6 @@ void LyXText::init(BufferView * bview)
 
        width = 0;
        height = 0;
-       cache_pos_ = -1;
 
        current_font = getFont(beg, 0);
 
@@ -256,8 +255,8 @@ void LyXText::toggleInset()
                if (inset_owner && inset_owner->owner()
                    && inset_owner->owner()->isOpen()) {
                        finishUndo();
-                       inset_owner->owner()->close(bv());
-                       bv()->getLyXText()->cursorRight(bv());
+                       inset_owner->owner()->close();
+                       bv()->getLyXText()->cursorRight(true);
                        bv()->updateParagraphDialog();
                }
                return;
@@ -269,15 +268,13 @@ void LyXText::toggleInset()
                recUndo(cursor.par());
 
        if (inset->isOpen())
-               inset->close(bv());
+               inset->close();
        else
-               inset->open(bv());
-
-       bv()->update();
+               inset->open();
 }
 
 
-// used in setLayout 
+// used in setLayout
 // Asger is not sure we want to do this...
 void LyXText::makeFontEntriesLayoutSpecific(BufferParams const & params,
                                            Paragraph & par)
@@ -408,8 +405,6 @@ bool LyXText::changeDepth(bv_funcs::DEPTH_CHANGE type, bool test_only)
                start = pit;
        }
 
-       ParagraphList::iterator pastend = boost::next(end);
-
        if (!test_only)
                recUndo(parOffset(start), parOffset(end));
 
@@ -449,7 +444,7 @@ bool LyXText::changeDepth(bv_funcs::DEPTH_CHANGE type, bool test_only)
        if (test_only)
                return changed;
 
-       redoParagraphs(start, pastend);
+       redoParagraphs(start, boost::next(end));
 
        // We need to actually move the text->cursor. I don't
        // understand why ...
@@ -595,7 +590,8 @@ void LyXText::toggleFree(LyXFont const & font, bool toggleall)
        // If the mask is completely neutral, tell user
        if (font == LyXFont(LyXFont::ALL_IGNORE)) {
                // Could only happen with user style
-               bv()->owner()->message(_("No font change defined. Use Character under the Layout menu to define font change."));
+               bv()->owner()->message(_("No font change defined. "
+                       "Use Character under the Layout menu to define font change."));
                return;
        }
 
@@ -728,8 +724,6 @@ void LyXText::setParagraph(
 }
 
 
-namespace {
-
 string expandLabel(LyXTextClass const & textclass,
        LyXLayout_ptr const & layout, bool appendix)
 {
@@ -752,13 +746,14 @@ string expandLabel(LyXTextClass const & textclass,
 }
 
 
+namespace {
+
 void incrementItemDepth(ParagraphList::iterator pit,
                        ParagraphList::iterator first_pit)
 {
        int const cur_labeltype = pit->layout()->labeltype;
 
-       if (cur_labeltype != LABEL_ENUMERATE &&
-           cur_labeltype != LABEL_ITEMIZE)
+       if (cur_labeltype != LABEL_ENUMERATE && cur_labeltype != LABEL_ITEMIZE)
                return;
 
        int const cur_depth = pit->getDepth();
@@ -985,7 +980,9 @@ void LyXText::setCounter(Buffer const & buf, ParagraphList::iterator pit)
 }
 
 
-// Updates all counters. Paragraphs with changed label string will be rebroken
+// Updates all counters. Paragraphs with changed label string will be
+// not be rebroken as this is too expensive. The next round will get it
+// right anyway...
 void LyXText::updateCounters()
 {
        // start over
@@ -994,8 +991,6 @@ void LyXText::updateCounters()
        ParagraphList::iterator beg = ownerParagraphs().begin();
        ParagraphList::iterator end = ownerParagraphs().end();
        for (ParagraphList::iterator pit = beg; pit != end; ++pit) {
-               string const oldLabel = pit->params().labelString();
-
                size_t maxdepth = 0;
                if (pit != beg)
                        maxdepth = boost::prior(pit)->getMaxDepthAfter();
@@ -1005,11 +1000,6 @@ void LyXText::updateCounters()
 
                // setCounter can potentially change the labelString.
                setCounter(*bv()->buffer(), pit);
-
-               string const & newLabel = pit->params().labelString();
-
-               if (oldLabel != newLabel)
-                       redoParagraph(pit);
        }
 }
 
@@ -1026,11 +1016,12 @@ void LyXText::insertInset(InsetOld * inset)
        // The character will not be inserted a second time
        insertChar(Paragraph::META_INSET);
        // If we enter a highly editable inset the cursor should be before
-       // the inset. After an Undo LyX tries to call inset->edit(...)
+       // the inset. After an undo LyX tries to call inset->edit(...)
        // and fails if the cursor is behind the inset and getInset
        // does not return the inset!
        if (isHighlyEditableInset(inset))
                cursorLeft(true);
+
        unFreezeUndo();
 }
 
@@ -1174,7 +1165,7 @@ void LyXText::setSelectionRange(lyx::pos_type length)
 
        selection.cursor = cursor;
        while (length--)
-               cursorRight(bv());
+               cursorRight(true);
        setSelection();
 }
 
@@ -1299,6 +1290,7 @@ void LyXText::setCursor(LyXCursor & cur, paroffset_type par,
 
        ParagraphList::iterator pit = getPar(par);
        Row const & row = *pit->getRow(pos);
+
        int y = pit->y + row.y_offset();
 
        // y is now the beginning of the cursor row
@@ -1339,7 +1331,6 @@ void LyXText::setCursor(LyXCursor & cur, paroffset_type par,
        }
        // now get the cursors x position
        cur.x(int(getCursorX(pit, row, pos, boundary)));
-       bv()->x_target(cur.x());
 }
 
 
@@ -1404,6 +1395,7 @@ void LyXText::setCursorIntern(paroffset_type par,
                              pos_type pos, bool setfont, bool boundary)
 {
        setCursor(cursor, par, pos, boundary);
+       bv()->x_target(cursor.x() + xo_);
        if (setfont)
                setCurrentFont();
 }
@@ -1561,7 +1553,7 @@ void LyXText::setCursorFromCoordinates(int x, int y)
        deleteEmptyParagraphMechanism(old_cursor);
 }
 
-
+// x,y are coordinates relative to this LyXText
 void LyXText::setCursorFromCoordinates(LyXCursor & cur, int x, int y)
 {
        // Get the row first.
@@ -1580,7 +1572,6 @@ void LyXText::setCursorFromCoordinates(LyXCursor & cur, int x, int y)
 }
 
 
-
 bool LyXText::checkAndActivateInset(bool front)
 {
        if (cursor.pos() == cursorPar()->size())
@@ -1619,7 +1610,7 @@ DispatchResult LyXText::moveRightIntern(bool front, bool activate_inset, bool se
                return DispatchResult(false, FINISHED_RIGHT);
        if (activate_inset && checkAndActivateInset(front))
                return DispatchResult(true, true);
-       cursorRight(bv());
+       cursorRight(true);
        if (!selecting)
                clearSelection();
        return DispatchResult(true);
@@ -1631,7 +1622,7 @@ DispatchResult LyXText::moveLeftIntern(bool front,
 {
        if (cursor.par() == 0 && cursor.pos() <= 0)
                return DispatchResult(false, FINISHED);
-       cursorLeft(bv());
+       cursorLeft(true);
        if (!selecting)
                clearSelection();
        if (activate_inset && checkAndActivateInset(front))
@@ -1642,9 +1633,9 @@ DispatchResult LyXText::moveLeftIntern(bool front,
 
 DispatchResult LyXText::moveUp()
 {
-       if (cursorRow() == firstRow())
+       if (cursorPar() == firstPar() && cursorRow() == firstRow())
                return DispatchResult(false, FINISHED_UP);
-       cursorUp(bv());
+       cursorUp(false);
        clearSelection();
        return DispatchResult(true);
 }
@@ -1652,9 +1643,9 @@ DispatchResult LyXText::moveUp()
 
 DispatchResult LyXText::moveDown()
 {
-       if (cursorRow() == lastRow())
+       if (cursorPar() == lastPar() && cursorRow() == lastRow())
                return DispatchResult(false, FINISHED_DOWN);
-       cursorDown(bv());
+       cursorDown(false);
        clearSelection();
        return DispatchResult(true);
 }
@@ -1707,49 +1698,33 @@ bool LyXText::cursorRight(bool internal)
 
 void LyXText::cursorUp(bool selecting)
 {
-       ParagraphList::iterator cpit = cursorPar();
-       Row const & crow = *cpit->getRow(cursor.pos());
-#if 1
-       int x = bv()->x_target();
-       int y = cursor.y() - crow.baseline() - 1;
+       Row const & row = *cursorRow();
+       int x = bv()->x_target() - xo_;
+       int y = cursor.y() - row.baseline() - 1;
        setCursorFromCoordinates(x, y);
+
        if (!selecting) {
-               int topy = bv()->top_y();
-               int y1 = cursor.y() - topy;
-               y -= topy;
-               InsetOld * inset_hit = checkInsetHit(x, y1);
+               int y_abs = y + yo_ - bv()->top_y();
+               InsetOld * inset_hit = checkInsetHit(bv()->x_target(), y_abs);
                if (inset_hit && isHighlyEditableInset(inset_hit))
-                       inset_hit->edit(bv(), x, y);
+                       inset_hit->edit(bv(), bv()->x_target(), y_abs);
        }
-#else
-       lyxerr << "cursorUp: y " << cursor.y() << " bl: " <<
-               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 = bv()->x_target();
-       int y = cursor.y() - crow.baseline() + crow.height() + 1;
+       Row const & row = *cursorRow();
+       int x = bv()->x_target() - xo_;
+       int y = cursor.y() - row.baseline() + row.height() + 1;
        setCursorFromCoordinates(x, y);
+
        if (!selecting) {
-               int topy = bv()->top_y();
-               int y1 = cursor.y() - topy;
-               y -= topy;
-               InsetOld * inset_hit = checkInsetHit(x, y1);
+               int y_abs = y + yo_ - bv()->top_y();
+               InsetOld * inset_hit = checkInsetHit(bv()->x_target(), y_abs);
                if (inset_hit && isHighlyEditableInset(inset_hit))
-                       inset_hit->edit(bv(), x, y);
+                       inset_hit->edit(bv(), bv()->x_target(), y_abs);
        }
-#else
-       setCursorFromCoordinates(bv()->x_target(),
-                cursor.y() - crow.baseline() + crow.height() + 1);
-#endif
 }