X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2Flyxrow_funcs.C;h=e4cd8c26ddd1cd767e0b52edb5716cb9ee24f8a9;hb=67f9c9fdae42211aa3ff8d0c6f62485bd721d8eb;hp=897377de20ce095207b61804770931ed46ecfb97;hpb=3566eaa4066d301374376696d98e8d5b09873e8a;p=lyx.git diff --git a/src/lyxrow_funcs.C b/src/lyxrow_funcs.C index 897377de20..e4cd8c26dd 100644 --- a/src/lyxrow_funcs.C +++ b/src/lyxrow_funcs.C @@ -1,181 +1,123 @@ +/** + * \file lyxrow_funcs.C + * This file is part of LyX, the document processor. + * Licence details can be found in the file COPYING. + * + * \author Lars Gullik Bjønnes + * \author André Pönitz + * + * Full author contact details are available in file CREDITS. + */ + #include #include "lyxrow_funcs.h" -#include "lyxtext.h" -#include "paragraph.h" +#include "debug.h" #include "lyxlayout.h" - -#include -#include +#include "lyxrow.h" +#include "paragraph.h" using lyx::pos_type; + using std::max; using std::min; +using std::endl; -bool isParEnd(LyXText const & lt, RowList::iterator rit) +int numberOfSeparators(Paragraph const & par, Row const & row) { - RowList::iterator next_row = boost::next(rit); - - return next_row == lt.rows().end() || - next_row->par() != rit->par(); -} - - -pos_type lastPos(LyXText const & lt, RowList::iterator rit) -{ - if (rit->par()->empty()) - return 0; - - if (isParEnd(lt, rit)) { - return rit->par()->size() - 1; - } else { - return boost::next(rit)->pos() - 1; + pos_type const first = max(row.pos(), par.beginOfBody()); + pos_type const last = row.endpos() - 1; + int n = 0; + for (pos_type p = first; p < last; ++p) { + if (par.isSeparator(p)) + ++n; } -} - - -namespace { - -bool nextRowIsAllInset(Row const & row, pos_type last) -{ - Paragraph const * par = row.par(); - - if (last + 1 >= par->size()) - return false; - if (!par->isInset(last + 1)) - return false; - - Inset const * i = par->getInset(last + 1); - return i->needFullRow() || i->display(); -} - -} // anon namespace - - -pos_type lastPrintablePos(LyXText const & lt, RowList::iterator rit) -{ - pos_type const last = lastPos(lt, rit); - - // if this row is an end of par, just act like lastPos() - if (isParEnd(lt, rit)) - return last; - - bool const nextrownotinset = !nextRowIsAllInset(*rit, last); - - if (nextrownotinset && rit->par()->isSeparator(last)) - return last - 1; - - return last; -} - - -int numberOfSeparators(LyXText const & lt, RowList::iterator rit) -{ - pos_type const last = lastPrintablePos(lt, rit); - Paragraph const * par = rit->par(); - - int n = 0; - - pos_type p = max(rit->pos(), par->beginningOfBody()); - for (; p < last; ++p) { - if (par->isSeparator(p)) { - ++n; - } - } - return n; + return n; } // This is called _once_ from LyXText and should at least be moved into // an anonymous namespace there. (Lgb) -int numberOfHfills(LyXText const & lt, RowList::iterator rit) +int numberOfHfills(Paragraph const & par, Row const & row) { - pos_type const last = lastPos(lt, rit); - pos_type first = rit->pos(); - Paragraph const * par = rit->par(); + pos_type const last = row.endpos() - 1; + pos_type first = row.pos(); // hfill *DO* count at the beginning of paragraphs! if (first) { - while (first < last && par->isHfill(first)) { + while (first < last && par.isHfill(first)) ++first; - } } - first = max(first, par->beginningOfBody()); + first = max(first, par.beginOfBody()); int n = 0; // last, because the end is ignored! for (pos_type p = first; p < last; ++p) { - if (par->isHfill(p)) + if (par.isHfill(p)) ++n; } + return n; } // This is called _once_ from LyXText and should at least be moved into // an anonymous namespace there. (Lgb) -int numberOfLabelHfills(LyXText const & lt, RowList::iterator rit) +int numberOfLabelHfills(Paragraph const & par, Row const & row) { - pos_type last = lastPos(lt, rit); - pos_type first = rit->pos(); - Paragraph const * par = rit->par(); + pos_type last = row.endpos() - 1; + pos_type first = row.pos(); // hfill *DO* count at the beginning of paragraphs! if (first) { - while (first < last && par->isHfill(first)) + while (first < last && par.isHfill(first)) ++first; } - last = min(last, par->beginningOfBody()); + last = min(last, par.beginOfBody()); int n = 0; - // last, because the end is ignored! + // last, because the end is ignored for (pos_type p = first; p < last; ++p) { - if (par->isHfill(p)) + if (par.isHfill(p)) ++n; } + return n; } -bool hfillExpansion(LyXText const & lt, RowList::iterator rit, pos_type pos) +bool hfillExpansion(Paragraph const & par, Row const & row, pos_type pos) { - Paragraph const * par = rit->par(); - - if (!par->isHfill(pos)) + if (!par.isHfill(pos)) return false; // at the end of a row it does not count // unless another hfill exists on the line - if (pos >= lastPos(lt, rit)) { - pos_type i = rit->pos(); - while (i < pos && !par->isHfill(i)) { - ++i; - } - if (i == pos) { + if (pos >= row.endpos()) { + for (pos_type i = row.pos(); i < pos && !par.isHfill(i); ++i) return false; - } } // at the beginning of a row it does not count, if it is not // the first row of a paragaph - if (rit->isParStart()) + if (row.pos() == 0) return true; // in some labels it does not count - if (par->layout()->margintype != MARGIN_MANUAL - && pos < par->beginningOfBody()) + if (par.layout()->margintype != MARGIN_MANUAL + && pos < par.beginOfBody()) return false; // if there is anything between the first char of the row and // the specified position that is not a newline and not a hfill, // the hfill will count, otherwise not - pos_type i = rit->pos(); - while (i < pos && (par->isNewline(i) || par->isHfill(i))) + pos_type i = row.pos(); + while (i < pos && (par.isNewline(i) || par.isHfill(i))) ++i; return i != pos;