X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2Ftext.C;h=f96bd6408944550d04dc6a6f847e7cc5eb916754;hb=b2f4586c984226bcc945d93891f3d0736d6ffb43;hp=c7778be8b8e6ccb546d5105044f1d1258cc7aea9;hpb=82d23e85387ec03a6258d6e1e33dc1f77447fa5c;p=lyx.git diff --git a/src/text.C b/src/text.C index c7778be8b8..f96bd64089 100644 --- a/src/text.C +++ b/src/text.C @@ -14,7 +14,6 @@ #include "lyxrow.h" #include "lyxtextclasslist.h" #include "paragraph.h" -#include "lyx_gui_misc.h" #include "gettext.h" #include "bufferparams.h" #include "buffer.h" @@ -94,8 +93,7 @@ int LyXText::workWidth(BufferView * bview, Inset * inset) const } LyXLayout const & layout = - textclasslist.Style(bview->buffer()->params.textclass, - par->getLayout()); + textclasslist[bview->buffer()->params.textclass][par->layout()]; if (layout.margintype != MARGIN_RIGHT_ADDRESS_BOX) { // Optimization here: in most cases, the real row is @@ -682,8 +680,8 @@ void LyXText::draw(DrawRowParams & p, pos_type & vpos) int LyXText::leftMargin(BufferView * bview, Row const * row) const { LyXTextClass const & tclass = - textclasslist.TextClass(bview->buffer()->params.textclass); - LyXLayout const & layout = tclass[row->par()->getLayout()]; + textclasslist[bview->buffer()->params.textclass]; + LyXLayout const & layout = tclass[row->par()->layout()]; string parindent = layout.parindent; @@ -695,13 +693,13 @@ int LyXText::leftMargin(BufferView * bview, Row const * row) const // I have had this idea very late, so it seems to be a // later added hack and this is true if (!row->par()->getDepth()) { - if (!row->par()->getLayout()) { + if (row->par()->layout() == tclass.defaultLayoutName()) { // find the previous same level paragraph if (row->par()->previous()) { Paragraph * newpar = row->par() ->depthHook(row->par()->getDepth()); if (newpar && - tclass[newpar->getLayout()].nextnoindent) + tclass[newpar->layout()].nextnoindent) parindent.erase(); } } @@ -713,9 +711,8 @@ int LyXText::leftMargin(BufferView * bview, Row const * row) const // make a corresponding row. Needed to call LeftMargin() - // check wether it is a sufficent paragraph - if (newpar && tclass[newpar->getLayout()].isEnvironment()) - { + // check wether it is a sufficent paragraph + if (newpar && tclass[newpar->layout()].isEnvironment()) { Row dummyrow; dummyrow.par(newpar); dummyrow.pos(newpar->size()); @@ -727,14 +724,13 @@ int LyXText::leftMargin(BufferView * bview, Row const * row) const // LeftMargin() is always called row->par()->params().depth(0); } - - if (newpar && !row->par()->getLayout()) { + + if (newpar && row->par()->layout() == tclass.defaultLayoutName()) { if (newpar->params().noindent()) parindent.erase(); else - parindent = tclass[newpar->getLayout()].parindent; + parindent = tclass[newpar->layout()].parindent; } - } LyXFont const labelfont = getLabelFont(bview->buffer(), row->par()); @@ -838,28 +834,30 @@ int LyXText::leftMargin(BufferView * bview, Row const * row) const && ! row->par()->isFirstInSequence())) && align == LYX_ALIGN_BLOCK && !row->par()->params().noindent() - // in tabulars paragraphs are never indented! - && (!row->par()->inInset() || row->par()->inInset()->owner()->lyxCode() != Inset::TABULAR_CODE) - && (row->par()->layout || + // in tabulars and ert paragraphs are never indented! + && (!row->par()->inInset() || !row->par()->inInset()->owner() || + (row->par()->inInset()->owner()->lyxCode() != Inset::TABULAR_CODE && + row->par()->inInset()->owner()->lyxCode() != Inset::ERT_CODE)) + && (row->par()->layout() != tclass.defaultLayoutName() || bview->buffer()->params.paragraph_separation == - BufferParams::PARSEP_INDENT)) + BufferParams::PARSEP_INDENT)) { x += lyxfont::signedWidth(parindent, tclass.defaultfont()); - else if (layout.labeltype == LABEL_BIBLIO) { + } else if (layout.labeltype == LABEL_BIBLIO) { // ale970405 Right width for bibitems x += bibitemMaxWidth(bview, tclass.defaultfont()); } } + return x; } int LyXText::rightMargin(Buffer const * buf, Row const * row) const { - LyXTextClass const & tclass = - textclasslist.TextClass(buf->params.textclass); - LyXLayout const & layout = tclass[row->par()->getLayout()]; - + LyXTextClass const & tclass = textclasslist[buf->params.textclass]; + LyXLayout const & layout = tclass[row->par()->layout()]; + int x = LYX_PAPER_MARGIN + lyxfont::signedWidth(tclass.rightmargin(), tclass.defaultfont()); @@ -880,8 +878,7 @@ int LyXText::rightMargin(Buffer const * buf, Row const * row) const // make a corresponding row. Needed to call LeftMargin() // check wether it is a sufficent paragraph - if (newpar - && tclass[newpar->getLayout()].isEnvironment()) { + if (newpar && tclass[newpar->layout()].isEnvironment()) { Row dummyrow; dummyrow.par(newpar); dummyrow.pos(0); @@ -904,8 +901,7 @@ int LyXText::rightMargin(Buffer const * buf, Row const * row) const int LyXText::labelEnd(BufferView * bview, Row const * row) const { - if (textclasslist.Style(bview->buffer()->params.textclass, - row->par()->getLayout()).margintype + if (textclasslist[bview->buffer()->params.textclass][row->par()->layout()].margintype == MARGIN_MANUAL) { Row tmprow; tmprow = *row; @@ -938,8 +934,7 @@ LyXText::nextBreakPoint(BufferView * bview, Row const * row, int width) const pos_type const main_body = beginningOfMainBody(bview->buffer(), par); LyXLayout const & layout = - textclasslist.Style(bview->buffer()->params.textclass, - par->getLayout()); + textclasslist[bview->buffer()->params.textclass][par->layout()]; pos_type i = pos; if (layout.margintype == MARGIN_RIGHT_ADDRESS_BOX) { @@ -1058,8 +1053,7 @@ int LyXText::fill(BufferView * bview, Row * row, int paper_width) const pos_type const last = rowLastPrintable(row); // special handling of the right address boxes - if (textclasslist.Style(bview->buffer()->params.textclass, - row->par()->getLayout()).margintype + if (textclasslist[bview->buffer()->params.textclass][row->par()->layout()].margintype == MARGIN_RIGHT_ADDRESS_BOX) { int const tmpfill = row->fill(); @@ -1069,8 +1063,7 @@ int LyXText::fill(BufferView * bview, Row * row, int paper_width) const } else w = leftMargin(bview, row); - LyXLayout const & layout = textclasslist.Style(bview->buffer()->params.textclass, - row->par()->getLayout()); + LyXLayout const & layout = textclasslist[bview->buffer()->params.textclass][row->par()->layout()]; pos_type const main_body = beginningOfMainBody(bview->buffer(), row->par()); pos_type i = row->pos(); @@ -1231,8 +1224,7 @@ bool LyXText::hfillExpansion(Buffer const * buf, Row const * row_ptr, return true; // in some labels it does not count - if (textclasslist.Style(buf->params.textclass, - row_ptr->par()->getLayout()).margintype + if (textclasslist[buf->params.textclass][row_ptr->par()->layout()].margintype != MARGIN_MANUAL && pos < beginningOfMainBody(buf, row_ptr->par())) return false; @@ -1278,8 +1270,7 @@ void LyXText::setHeightOfRow(BufferView * bview, Row * row_ptr) const Paragraph * par = row_ptr->par(); Paragraph * firstpar = row_ptr->par(); - LyXLayout const & layout = textclasslist.Style(bview->buffer()->params.textclass, - firstpar->getLayout()); + LyXLayout const & layout = textclasslist[bview->buffer()->params.textclass][firstpar->layout()]; // as max get the first character of this row then it can increes but not // decrees the height. Just some point to start with so we don't have to @@ -1365,9 +1356,7 @@ void LyXText::setHeightOfRow(BufferView * bview, Row * row_ptr) const { maxasc += bview->buffer()->params.getDefSkip().inPixels(bview); } else if (firstpar->previous() && - textclasslist.Style(bview->buffer()->params.textclass, - firstpar->previous()-> - getLayout()).isParagraph() && + textclasslist[bview->buffer()->params.textclass][firstpar->previous()->layout()].isParagraph() && firstpar->previous()->getDepth() == 0) { // is it right to use defskip here too? (AS) @@ -1444,7 +1433,7 @@ void LyXText::setHeightOfRow(BufferView * bview, Row * row_ptr) const Paragraph * prev = row_ptr->par()->previous(); if (prev) prev = row_ptr->par()->depthHook(row_ptr->par()->getDepth()); - if (prev && prev->getLayout() == firstpar->getLayout() && + if (prev && prev->layout() == firstpar->layout() && prev->getDepth() == firstpar->getDepth() && prev->getLabelWidthString() == firstpar->getLabelWidthString()) { @@ -1453,9 +1442,7 @@ void LyXText::setHeightOfRow(BufferView * bview, Row * row_ptr) const tmptop = layout.topsep; if (row_ptr->previous()->par()->getDepth() >= row_ptr->par()->getDepth()) - tmptop -= textclasslist.Style(bview->buffer()->params.textclass, - row_ptr->previous()->par()-> - getLayout()).bottomsep; + tmptop -= textclasslist[bview->buffer()->params.textclass][row_ptr->previous()->par()->layout()].bottomsep; if (tmptop > 0) layoutasc = (tmptop * defaultHeight()); @@ -1468,13 +1455,12 @@ void LyXText::setHeightOfRow(BufferView * bview, Row * row_ptr) const prev = row_ptr->par()->outerHook(); if (prev) { - maxasc += int(textclasslist.Style(bview->buffer()->params.textclass, - prev->getLayout()).parsep * defaultHeight()); + maxasc += int(textclasslist[bview->buffer()->params.textclass][prev->layout()].parsep * defaultHeight()); } else { if (firstpar->previous() && firstpar->previous()->getDepth() == 0 && - firstpar->previous()->getLayout() != - firstpar->getLayout()) + firstpar->previous()->layout() != + firstpar->layout()) { // avoid parsep } else if (firstpar->previous()) { @@ -1518,15 +1504,13 @@ void LyXText::setHeightOfRow(BufferView * bview, Row * row_ptr) const float unusual = 0; if (comparepar->getDepth() > nextpar->getDepth()) { - usual = (textclasslist.Style(bview->buffer()->params.textclass, - comparepar->getLayout()).bottomsep * defaultHeight()); + usual = (textclasslist[bview->buffer()->params.textclass][comparepar->layout()].bottomsep * defaultHeight()); comparepar = comparepar->depthHook(nextpar->getDepth()); - if (comparepar->getLayout()!= nextpar->getLayout() + if (comparepar->layout()!= nextpar->layout() || nextpar->getLabelWidthString() != comparepar->getLabelWidthString()) { - unusual = (textclasslist.Style(bview->buffer()->params.textclass, - comparepar->getLayout()).bottomsep * defaultHeight()); + unusual = (textclasslist[bview->buffer()->params.textclass][comparepar->layout()].bottomsep * defaultHeight()); } if (unusual > usual) layoutdesc = unusual; @@ -1534,11 +1518,10 @@ void LyXText::setHeightOfRow(BufferView * bview, Row * row_ptr) const layoutdesc = usual; } else if (comparepar->getDepth() == nextpar->getDepth()) { - if (comparepar->getLayout()!= nextpar->getLayout() + if (comparepar->layout() != nextpar->layout() || nextpar->getLabelWidthString() != comparepar->getLabelWidthString()) - layoutdesc = int(textclasslist.Style(bview->buffer()->params.textclass, - comparepar->getLayout()).bottomsep * defaultHeight()); + layoutdesc = int(textclasslist[bview->buffer()->params.textclass][comparepar->layout()].bottomsep * defaultHeight()); } } } @@ -1698,16 +1681,16 @@ void LyXText::breakAgainOneRow(BufferView * bview, Row * row) void LyXText::breakParagraph(BufferView * bview, char keep_layout) { - LyXLayout const & layout = - textclasslist.Style(bview->buffer()->params.textclass, - cursor.par()->getLayout()); + LyXTextClass const & tclass = + textclasslist[bview->buffer()->params.textclass]; + LyXLayout const & layout = tclass[cursor.par()->layout()]; // this is only allowed, if the current paragraph is not empty or caption if ((cursor.par()->size() <= 0) && layout.labeltype!= LABEL_SENSITIVE) return; - setUndo(bview, Undo::INSERT,cursor.par(),cursor.par()->next()); + setUndo(bview, Undo::FINISH, cursor.par(), cursor.par()->next()); // Always break behind a space // @@ -1729,10 +1712,10 @@ void LyXText::breakParagraph(BufferView * bview, char keep_layout) if (layout.labeltype == LABEL_SENSITIVE) { if (!cursor.pos()) // set to standard-layout - cursor.par()->setLayout(0); + cursor.par()->applyLayout(tclass.defaultLayoutName()); else // set to standard-layout - cursor.par()->next()->setLayout(0); + cursor.par()->next()->applyLayout(tclass.defaultLayoutName()); } /* if the cursor is at the beginning of a row without prior newline, @@ -1798,18 +1781,15 @@ void LyXText::redoParagraph(BufferView * bview) const * same Paragraph one to the right and make a rebreak */ void LyXText::insertChar(BufferView * bview, char c) { - setUndo(bview, Undo::INSERT, - cursor.par(), cursor.par()->next()); + setUndo(bview, Undo::INSERT, cursor.par(), cursor.par()->next()); // When the free-spacing option is set for the current layout, // disable the double-space checking bool const freeSpacing = - textclasslist.Style(bview->buffer()->params.textclass, - cursor.row()->par()->getLayout()).free_spacing || + textclasslist[bview->buffer()->params.textclass][cursor.row()->par()->layout()].free_spacing || cursor.row()->par()->isFreeSpacing(); - if (lyxrc.auto_number) { static string const number_operators = "+-/*"; static string const number_unary_operators = "+-"; @@ -1931,7 +1911,7 @@ void LyXText::insertChar(BufferView * bview, char c) Row * row = cursor.row(); int y = cursor.y() - row->baseline(); if (c != Paragraph::META_INSET) /* Here case LyXText::InsertInset - * already insertet the character */ + * already insertet the character */ cursor.par()->insertChar(cursor.pos(), c); setCharFont(bview->buffer(), cursor.par(), cursor.pos(), rawtmpfont); @@ -1950,7 +1930,8 @@ void LyXText::insertChar(BufferView * bview, char c) || ((cursor.pos() < cursor.par()->size()) && cursor.par()->isInset(cursor.pos()+1)) || cursor.row()->fill() == -1) - && row->previous() && row->previous()->par() == row->par()) { + && row->previous() && row->previous()->par() == row->par()) + { pos_type z = nextBreakPoint(bview, row->previous(), workWidth(bview)); @@ -1994,8 +1975,8 @@ void LyXText::insertChar(BufferView * bview, char c) // recalculate the fill of the row if (row->fill() >= 0) /* needed because a newline - * will set fill to -1. Otherwise - * we would not get a rebreak! */ + * will set fill to -1. Otherwise + * we would not get a rebreak! */ row->fill(fill(bview, row, workWidth(bview))); if (row->fill() < 0) { refresh_y = y; @@ -2049,8 +2030,7 @@ void LyXText::insertChar(BufferView * bview, char c) redoHeightOfParagraph(bview, cursor); } else { // now the special right address boxes - if (textclasslist.Style(bview->buffer()->params.textclass, - cursor.par()->getLayout()).margintype + if (textclasslist[bview->buffer()->params.textclass][cursor.par()->layout()].margintype == MARGIN_RIGHT_ADDRESS_BOX) { redoDrawingOfParagraph(bview, cursor); } @@ -2099,12 +2079,12 @@ void LyXText::prepareToPrint(BufferView * bview, x = (workWidth(bview) > 0) ? leftMargin(bview, row) : 0; // is there a manual margin with a manual label - if (textclasslist.Style(bview->buffer()->params.textclass, - row->par()->getLayout()).margintype == MARGIN_MANUAL - && textclasslist.Style(bview->buffer()->params.textclass, - row->par()->getLayout()).labeltype == LABEL_MANUAL) { - - /* one more since labels are left aligned */ + LyXTextClass const & tclass = textclasslist[bview->buffer()->params.textclass]; + LyXLayout const & layout = tclass[row->par()->layout()]; + + if (layout.margintype == MARGIN_MANUAL + && layout.labeltype == LABEL_MANUAL) { + // one more since labels are left aligned nlh = numberOfLabelHfills(bview->buffer(), row) + 1; if (nlh && !row->par()->getLabelWidthString().empty()) { fill_label_hfill = labelFill(bview, row) / nlh; @@ -2125,7 +2105,7 @@ void LyXText::prepareToPrint(BufferView * bview, // set x how you need it int align; if (row->par()->params().align() == LYX_ALIGN_LAYOUT) { - align = textclasslist.Style(bview->buffer()->params.textclass, row->par()->getLayout()).align; + align = layout.align; } else { align = row->par()->params().align(); } @@ -2137,6 +2117,13 @@ void LyXText::prepareToPrint(BufferView * bview, && (inset->display())) // || (inset->scroll() < 0))) align = (inset->lyxCode() == Inset::MATHMACRO_CODE) ? LYX_ALIGN_BLOCK : LYX_ALIGN_CENTER; + // ERT insets should always be LEFT ALIGNED on screen + inset = row->par()->inInset(); + if (inset && inset->owner() && + inset->owner()->lyxCode() == Inset::ERT_CODE) + { + align = LYX_ALIGN_LEFT; + } switch (align) { case LYX_ALIGN_BLOCK: @@ -2171,14 +2158,11 @@ void LyXText::prepareToPrint(BufferView * bview, pos_type last = rowLast(row); if (main_body > 0 && - (main_body-1 > last || - !row->par()->isLineSeparator(main_body-1))) { - LyXLayout const & layout = - textclasslist.Style(bview->buffer()->params.textclass, - row->par()->getLayout()); + (main_body - 1 > last || + !row->par()->isLineSeparator(main_body - 1))) { x += lyxfont::width(layout.labelsep, getLabelFont(bview->buffer(), row->par())); - if (main_body-1 <= last) + if (main_body - 1 <= last) x += fill_label_hfill; } } @@ -2560,8 +2544,7 @@ void LyXText::changeRegionCase(BufferView * bview, { lyx::Assert(from <= to); - setUndo(bview, Undo::FINISH, - from.par(), to.par()->next()); + setUndo(bview, Undo::FINISH, from.par(), to.par()->next()); pos_type pos = from.pos(); Paragraph * par = from.par(); @@ -2603,8 +2586,7 @@ void LyXText::transposeChars(BufferView & bview) { Paragraph * tmppar = cursor.par(); - setUndo(&bview, Undo::FINISH, - tmppar, tmppar->next()); + setUndo(&bview, Undo::FINISH, tmppar, tmppar->next()); pos_type tmppos = cursor.pos(); @@ -2661,7 +2643,7 @@ void LyXText::Delete(BufferView * bview) // to make sure undo gets the right cursor position cursor = old_cursor; setUndo(bview, Undo::DELETE, - cursor.par(), cursor.par()->next()); + cursor.par(), cursor.par()->next()); cursor = tmpcursor; backspace(bview); } @@ -2692,7 +2674,7 @@ void LyXText::backspace(BufferView * bview) if (cursor.par()->previous()) { Paragraph * tmppar = cursor.par()->previous(); - if (cursor.par()->getLayout() == tmppar->getLayout() + if (cursor.par()->layout() == tmppar->layout() && cursor.par()->getAlign() == tmppar->getAlign()) { // Inherit bottom DTD from the paragraph below. // (the one we are deleting) @@ -2744,11 +2726,12 @@ void LyXText::backspace(BufferView * bview) Correction: Pasting is always allowed with standard-layout */ + LyXTextClass const & tclass = textclasslist[bview->buffer()->params.textclass]; + if (cursor.par() != tmppar - && (cursor.par()->getLayout() == tmppar->getLayout() - || tmppar->getLayout() == 0 /*standard*/) - && cursor.par()->getAlign() == tmppar->getAlign()) - { + && (cursor.par()->layout() == tmppar->layout() + || tmppar->layout() == tclass.defaultLayoutName()) + && cursor.par()->getAlign() == tmppar->getAlign()) { removeParagraph(tmprow); removeRow(tmprow); cursor.par()->pasteParagraph(bview->buffer()->params); @@ -2978,8 +2961,9 @@ void LyXText::backspace(BufferView * bview) redoHeightOfParagraph(bview, cursor); } else { // now the special right address boxes - if (textclasslist.Style(bview->buffer()->params.textclass, - cursor.par()->getLayout()).margintype == MARGIN_RIGHT_ADDRESS_BOX) { + if (textclasslist + [bview->buffer()->params.textclass] + [cursor.par()->layout()].margintype == MARGIN_RIGHT_ADDRESS_BOX) { redoDrawingOfParagraph(bview, cursor); } } @@ -3112,8 +3096,10 @@ void LyXText::paintRowSelection(DrawRowParams & p) pos_type pos = vis2log(vpos); float const old_tmpx = tmpx; if (main_body > 0 && pos == main_body - 1) { - LyXLayout const & layout = textclasslist.Style(buffer->params.textclass, - par->getLayout()); + LyXLayout const & layout = + textclasslist + [buffer->params.textclass] + [par->layout()]; LyXFont const lfont = getLabelFont(buffer, par); @@ -3333,9 +3319,9 @@ void LyXText::paintFirstRow(DrawRowParams & p) parparams.spaceTop(), p.yo + y_top); Buffer const * buffer = p.bv->buffer(); - - LyXLayout const & layout = - textclasslist.Style(buffer->params.textclass, par->getLayout()); + + LyXTextClass const & tclass = textclasslist[buffer->params.textclass]; + LyXLayout const & layout = tclass[par->layout()]; // think about the parskip // some parskips VERY EASY IMPLEMENTATION @@ -3346,8 +3332,7 @@ void LyXText::paintFirstRow(DrawRowParams & p) y_top += buffer->params.getDefSkip().inPixels(p.bv); } else { LyXLayout const & playout = - textclasslist.Style(buffer->params.textclass, - par->previous()->getLayout()); + tclass[par->previous()->layout()]; if (playout.latextype == LATEX_PARAGRAPH && !par->previous()->getDepth()) { // is it right to use defskip here, too? (AS) @@ -3562,9 +3547,8 @@ void LyXText::paintLastRow(DrawRowParams & p) case END_LABEL_STATIC: { LyXFont font(LyXFont::ALL_SANE); - LyXTextClass::LayoutList::size_type layout = par->getLayout(); - string const str = textclasslist. - Style(buffer->params.textclass, layout).endlabelstring(); + string const & layout = par->layout(); + string const str = textclasslist[buffer->params.textclass][layout].endlabelstring(); font = getLabelFont(buffer, par); int const x = is_rtl ? int(p.x) - lyxfont::width(str, font) @@ -3592,7 +3576,7 @@ void LyXText::paintRowText(DrawRowParams & p) } LyXLayout const & layout = - textclasslist.Style(buffer->params.textclass, par->getLayout()); + textclasslist[buffer->params.textclass][par->layout()]; pos_type vpos = p.row->pos(); while (vpos <= last) { @@ -3729,8 +3713,8 @@ LyXText::getColumnNearX(BufferView * bview, Row * row, int & x, pos_type last = rowLastPrintable(row); pos_type c = 0; LyXLayout const & layout = - textclasslist.Style(bview->buffer()->params.textclass, - row->par()->getLayout()); + textclasslist[bview->buffer()->params.textclass][ + row->par()->layout()]; bool left_side = false; pos_type main_body = beginningOfMainBody(bview->buffer(), row->par()); @@ -3849,6 +3833,7 @@ Row * LyXText::getRow(Paragraph * par, pos_type pos, int & y) const Row * LyXText::getRowNearY(int & y) const { +#if 1 // If possible we should optimize this method. (Lgb) Row * tmprow = firstrow; int tmpy = 0; @@ -3859,7 +3844,53 @@ Row * LyXText::getRowNearY(int & y) const } y = tmpy; // return the real y + + //lyxerr << "returned y = " << y << endl; + + return tmprow; +#else + // Search from the current cursor position. + + Row * tmprow = cursor.row(); + int tmpy = cursor.y() - tmprow->baseline(); + + lyxerr << "cursor.y() = " << tmpy << endl; + lyxerr << "tmprow->height() = " << tmprow->height() << endl; + lyxerr << "tmprow->baseline() = " << tmprow->baseline() << endl; + lyxerr << "first = " << first << endl; + lyxerr << "y = " << y << endl; + + if (y < tmpy) { + lyxerr << "up" << endl; +#if 0 + while (tmprow && tmpy - tmprow->height() >= y) { + tmpy -= tmprow->height(); + tmprow = tmprow->previous(); + } +#else + do { + tmpy -= tmprow->height(); + tmprow = tmprow->previous(); + } while (tmprow && tmpy - tmprow->height() >= y); +#endif + } else if (y > tmpy) { + lyxerr << "down" << endl; + + while (tmprow->next() && tmpy + tmprow->height() <= y) { + tmpy += tmprow->height(); + tmprow = tmprow->next(); + } + } else { + lyxerr << "equal" << endl; + } + + y = tmpy; // return the real y + + lyxerr << "returned y = " << y << endl; + return tmprow; + +#endif }