From 6778eeaa36d9e394f1a074fa2d7b9c39cbf62e78 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Lars=20Gullik=20Bj=C3=B8nnes?= Date: Sun, 30 Mar 2003 07:27:36 +0000 Subject: [PATCH] rowlist3 git-svn-id: svn://svn.lyx.org/lyx/lyx-devel/trunk@6647 a592a061-630c-0410-9148-cb99ea01b6c8 --- src/ChangeLog | 11 ++++++++ src/frontends/ChangeLog | 4 +++ src/frontends/screen.C | 8 +++--- src/lyxtext.h | 5 ++-- src/text.C | 31 ++++++++++++----------- src/text2.C | 56 +++++++++++++++++++++-------------------- src/text3.C | 2 +- 7 files changed, 70 insertions(+), 47 deletions(-) diff --git a/src/ChangeLog b/src/ChangeLog index 8664dc0b68..521495f05c 100644 --- a/src/ChangeLog +++ b/src/ChangeLog @@ -1,5 +1,16 @@ 2003-03-30 Lars Gullik Bjønnes + * text3.C (dispatch): adjust + + * text2.C (checkParagraph): adjust + (setCursor): adjust + (setCursorFromCoordinates): adjust + + * text.C (top_y): adjust + (workWidth): adjust + (getRow): make it return a RowList::iterator, adjust + (getRowNearY): make it return a RowList::iterator, adjust + * text2.C (init): adjust (insertRow): remove function (insertParagraph): adjust diff --git a/src/frontends/ChangeLog b/src/frontends/ChangeLog index 9ecdbe6530..1b4145b59d 100644 --- a/src/frontends/ChangeLog +++ b/src/frontends/ChangeLog @@ -1,3 +1,7 @@ +2003-03-30 Lars Gullik Bjønnes + + * screen.C (drawFromTo): adjust for RowList. + 2003-03-29 John Levon * Alert.h: diff --git a/src/frontends/screen.C b/src/frontends/screen.C index a7e6f67c9f..c3bc00cb7c 100644 --- a/src/frontends/screen.C +++ b/src/frontends/screen.C @@ -413,18 +413,20 @@ void LyXScreen::drawFromTo(LyXText * text, BufferView * bv, int y_text = text->top_y() + y1; // get the first needed row - Row * row = text->getRowNearY(y_text); + RowList::iterator row = text->getRowNearY(y_text); + RowList::iterator end = text->rows().end(); + // y_text is now the real beginning of the row int y = y_text - text->top_y(); // y1 is now the real beginning of row on the screen - while (row != 0 && y < y2) { + while (row != end && y < y2) { RowPainter rp(*bv, *text, *row); rp.paint(y + yo, xo, y + text->top_y()); y += row->height(); - row = row->next(); + ++row; } // maybe we have to clear the screen at the bottom diff --git a/src/lyxtext.h b/src/lyxtext.h index fc1a76e127..12877ec0b7 100644 --- a/src/lyxtext.h +++ b/src/lyxtext.h @@ -233,7 +233,7 @@ public: (relative to the whole text). y is set to the real beginning of this row */ - Row * getRowNearY(int & y) const; + RowList::iterator getRowNearY(int & y) const; /** returns the column near the specified x-coordinate of the row x is set to the real beginning of this column @@ -244,7 +244,8 @@ public: /** returns a pointer to a specified row. y is set to the beginning of the row */ - Row * getRow(Paragraph * par, lyx::pos_type pos, int & y) const; + RowList::iterator + getRow(Paragraph * par, lyx::pos_type pos, int & y) const; RowList & rows() { return rowlist_; diff --git a/src/text.C b/src/text.C index 3a735c3c0e..4dbfbb19c4 100644 --- a/src/text.C +++ b/src/text.C @@ -95,14 +95,14 @@ void LyXText::top_y(int newy) lyxerr[Debug::GUI] << "setting top y = " << newy << endl; int y = newy; - Row * row = getRowNearY(y); + RowList::iterator rit = getRowNearY(y); - if (row == anchor_row_ && anchor_row_offset_ == newy - y) { + if (rit == anchor_row_ && anchor_row_offset_ == newy - y) { lyxerr[Debug::GUI] << "top_y to same value, skipping update" << endl; return; } - anchor_row_ = row; + anchor_row_ = &*rit; anchor_row_offset_ = newy - y; lyxerr[Debug::GUI] << "changing reference to row: " << anchor_row_ << " offset: " << anchor_row_offset_ << endl; @@ -152,10 +152,12 @@ int LyXText::workWidth(Inset * inset) const return workWidth() - leftMargin(&dummyrow); } else { int dummy_y; - Row * row = getRow(par, pos, dummy_y); - Row * frow = row; - while (frow->previous() && frow->par() == frow->previous()->par()) - frow = frow->previous(); + RowList::iterator row = getRow(par, pos, dummy_y); + RowList::iterator frow = row; + RowList::iterator beg = rows().begin(); + + while (frow != beg && frow->par() == boost::prior(frow)->par()) + --frow; // FIXME: I don't understand this code - jbl @@ -163,7 +165,7 @@ int LyXText::workWidth(Inset * inset) const while (!frow->isParEnd()) { if ((frow != row) && (maxw < frow->width())) maxw = frow->width(); - frow = frow->next(); + ++frow; } if (maxw) return maxw; @@ -2770,10 +2772,11 @@ void LyXText::backspace() // returns pointer to a specified row -Row * LyXText::getRow(Paragraph * par, pos_type pos, int & y) const +RowList::iterator +LyXText::getRow(Paragraph * par, pos_type pos, int & y) const { if (rows().empty()) - return 0; + return rows().end(); y = 0; @@ -2794,11 +2797,11 @@ Row * LyXText::getRow(Paragraph * par, pos_type pos, int & y) const ++rit; } - return &*rit; + return rit; } -Row * LyXText::getRowNearY(int & y) const +RowList::iterator LyXText::getRowNearY(int & y) const { // If possible we should optimize this method. (Lgb) int tmpy = 0; @@ -2806,7 +2809,7 @@ Row * LyXText::getRowNearY(int & y) const RowList::iterator rit = rows().begin(); RowList::iterator end = rows().end(); - while (boost::next(rit) != end && tmpy + rit->height() <= y) { + while (rit != end && boost::next(rit) != end && tmpy + rit->height() <= y) { tmpy += rit->height(); ++rit; } @@ -2815,7 +2818,7 @@ Row * LyXText::getRowNearY(int & y) const //lyxerr << "returned y = " << y << endl; - return &*rit; + return rit; } diff --git a/src/text2.C b/src/text2.C index 23aa876815..c7cf5547d2 100644 --- a/src/text2.C +++ b/src/text2.C @@ -733,7 +733,7 @@ void LyXText::redoParagraphs(LyXCursor const & cur, } else { insertParagraph(tmppar, tmprow->next()); } - + if (!tmprow) { tmprow = &*rows().begin(); @@ -1558,24 +1558,25 @@ void LyXText::insertStringAsParagraphs(string const & str) } -void LyXText::checkParagraph(Paragraph * par, - pos_type pos) +void LyXText::checkParagraph(Paragraph * par, pos_type pos) { LyXCursor tmpcursor; int y = 0; pos_type z; - Row * row = getRow(par, pos, y); + RowList::iterator row = getRow(par, pos, y); + RowList::iterator beg = rows().begin(); // is there a break one row above - if (row->previous() && row->previous()->par() == row->par()) { - z = rowBreakPoint(*row->previous()); + if (row != beg + && boost::prior(row)->par() == row->par()) { + z = rowBreakPoint(*boost::prior(row)); if (z >= row->pos()) { // set the dimensions of the row above - y -= row->previous()->height(); + y -= boost::prior(row)->height(); postPaint(y); - breakAgain(row->previous()); + breakAgain(&*boost::prior(row)); // set the cursor again. Otherwise // dangling pointers are possible @@ -1589,9 +1590,9 @@ void LyXText::checkParagraph(Paragraph * par, int const tmpheight = row->height(); pos_type const tmplast = row->lastPos(); - breakAgain(row); + breakAgain(&*row); if (row->height() == tmpheight && row->lastPos() == tmplast) { - postRowPaint(row, y); + postRowPaint(&*row, y); } else { postPaint(y); } @@ -1599,7 +1600,7 @@ void LyXText::checkParagraph(Paragraph * par, // check the special right address boxes if (par->layout()->margintype == MARGIN_RIGHT_ADDRESS_BOX) { tmpcursor.par(par); - tmpcursor.row(row); + tmpcursor.row(&*row); tmpcursor.y(y); tmpcursor.x(0); tmpcursor.x_fix(0); @@ -1681,25 +1682,27 @@ void LyXText::setCursor(LyXCursor & cur, Paragraph * par, // get the cursor y position in text int y = 0; - Row * row = getRow(par, pos, y); - Row * old_row = row; - cur.irow(row); + RowList::iterator row = getRow(par, pos, y); + RowList::iterator beg = rows().begin(); + + RowList::iterator old_row = row; + cur.irow(&*row); // if we are before the first char of this row and are still in the // same paragraph and there is a previous row then put the cursor on // the end of the previous row cur.iy(y + row->baseline()); Inset * ins; - if (row->previous() && pos && - row->previous()->par() == row->par() && + if (row != beg && pos && + boost::prior(row)->par() == row->par() && pos < par->size() && par->getChar(pos) == Paragraph::META_INSET && (ins = par->getInset(pos)) && (ins->needFullRow() || ins->display())) { - row = row->previous(); + --row; y -= row->height(); } - cur.row(row); + cur.row(&*row); // y is now the beginning of the cursor row y += row->baseline(); // y is now the cursor baseline @@ -1724,18 +1727,18 @@ void LyXText::setCursor(LyXCursor & cur, Paragraph * par, } // now get the cursors x position - float x = getCursorX(row, pos, last, boundary); + float x = getCursorX(&*row, pos, last, boundary); cur.x(int(x)); cur.x_fix(cur.x()); if (old_row != row) { - x = getCursorX(old_row, pos, last, boundary); + x = getCursorX(&*old_row, pos, last, boundary); cur.ix(int(x)); } else cur.ix(cur.x()); //if the cursor is in a visible row, anchor to it int topy = top_y(); if (topy < y && y < topy + bv()->workHeight()) - anchor_row(row); + anchor_row(&*row); } @@ -2019,19 +2022,18 @@ namespace { } -void LyXText::setCursorFromCoordinates(LyXCursor & cur, - int x, int y) +void LyXText::setCursorFromCoordinates(LyXCursor & cur, int x, int y) { // Get the row first. - Row * row = getRowNearY(y); + RowList::iterator row = getRowNearY(y); bool bound = false; - pos_type const column = getColumnNearX(row, x, bound); + pos_type const column = getColumnNearX(&*row, x, bound); cur.par(row->par()); cur.pos(row->pos() + column); cur.x(x); cur.y(y + row->baseline()); - cur.row(row); + cur.row(&*row); if (beforeFullRowInset(*row, cur)) { pos_type last = row->lastPrintablePos(); @@ -2042,7 +2044,7 @@ void LyXText::setCursorFromCoordinates(LyXCursor & cur, } else { cur.iy(cur.y()); cur.ix(cur.x()); - cur.irow(row); + cur.irow(&*row); } cur.boundary(bound); } diff --git a/src/text3.C b/src/text3.C index 34885b6803..12f940c04e 100644 --- a/src/text3.C +++ b/src/text3.C @@ -416,7 +416,7 @@ Inset::RESULT LyXText::dispatch(FuncRequest const & cmd) setUndo(bv, Undo::EDIT, tmp, tmp->next()); tmp->params().startOfAppendix(false); int tmpy; - setHeightOfRow(getRow(tmp, 0, tmpy)); + setHeightOfRow(&*getRow(tmp, 0, tmpy)); break; } } -- 2.39.2