X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2Ftext.C;h=da326879c5cc2c15f1fddf8e00f71e23b5337bc0;hb=ae348f8af96100a154b3792d27732d621d44ec89;hp=e85a5b4c7a6a0e39ca59c92594a27762e2be89a9;hpb=f6bcac72853d41ff9e1750817a39fe5bd9b7ba42;p=lyx.git diff --git a/src/text.C b/src/text.C index e85a5b4c7a..da326879c5 100644 --- a/src/text.C +++ b/src/text.C @@ -135,7 +135,7 @@ int numberOfLabelHfills(Paragraph const & par, Row const & row) int numberOfHfills(Paragraph const & par, Row const & row) { - pos_type const last = row.endpos() - 1; + pos_type const last = row.endpos(); pos_type first = row.pos(); // hfill *DO* count at the beginning of paragraphs! @@ -325,17 +325,31 @@ void readParToken(Buffer const & buf, Paragraph & par, LyXLex & lex, } else if (token == "\\change_inserted") { lex.eatLine(); std::istringstream is(lex.getString()); - int aid; + unsigned int aid; lyx::time_type ct; is >> aid >> ct; - change = Change(Change::INSERTED, bp.author_map[aid], ct); + if (aid >= bp.author_map.size()) { + buf.error(ErrorItem(_("Change tracking error"), + bformat(_("Unknown author index for insertion: %1$d\n"), aid), + par.id(), 0, par.size())); + + change = Change(Change::UNCHANGED); + } else + change = Change(Change::INSERTED, bp.author_map[aid], ct); } else if (token == "\\change_deleted") { lex.eatLine(); std::istringstream is(lex.getString()); - int aid; + unsigned int aid; lyx::time_type ct; is >> aid >> ct; - change = Change(Change::DELETED, bp.author_map[aid], ct); + if (aid >= bp.author_map.size()) { + buf.error(ErrorItem(_("Change tracking error"), + bformat(_("Unknown author index for deletion: %1$d\n"), aid), + par.id(), 0, par.size())); + + change = Change(Change::UNCHANGED); + } else + change = Change(Change::DELETED, bp.author_map[aid], ct); } else { lex.eatLine(); buf.error(ErrorItem(_("Unknown token"), @@ -380,7 +394,7 @@ void readParagraph(Buffer const & buf, Paragraph & par, LyXLex & lex) } } // Final change goes to paragraph break: - par.setChangeFull(par.size(), change); + par.setChange(par.size(), change); // Initialize begin_of_body_ on load; redoParagraph maintains par.setBeginOfBody(); @@ -467,8 +481,8 @@ int LyXText::leftMargin(pit_type const pit, pos_type const pos) const BOOST_ASSERT(pos >= 0); BOOST_ASSERT(pos <= par.size()); //lyxerr << "LyXText::leftMargin: pit: " << pit << " pos: " << pos << endl; - LyXTextClass const & tclass = - bv()->buffer()->params().getLyXTextClass(); + BufferParams const & params = bv()->buffer()->params(); + LyXTextClass const & tclass = params.getLyXTextClass(); LyXLayout_ptr const & layout = par.layout(); string parindent = layout->parindent; @@ -478,7 +492,7 @@ int LyXText::leftMargin(pit_type const pit, pos_type const pos) const if (isMainText()) l_margin += changebarMargin(); - l_margin += font_metrics::signedWidth(tclass.leftmargin(), tclass.defaultfont()); + l_margin += font_metrics::signedWidth(tclass.leftmargin(), params.getFont()); if (par.getDepth() != 0) { // find the next level paragraph @@ -508,7 +522,7 @@ int LyXText::leftMargin(pit_type const pit, pos_type const pos) const case MARGIN_DYNAMIC: if (!layout->leftmargin.empty()) l_margin += font_metrics::signedWidth(layout->leftmargin, - tclass.defaultfont()); + params.getFont()); if (!par.getLabelstring().empty()) { l_margin += font_metrics::signedWidth(layout->labelindent, labelfont); @@ -531,7 +545,7 @@ int LyXText::leftMargin(pit_type const pit, pos_type const pos) const break; case MARGIN_STATIC: - l_margin += font_metrics::signedWidth(layout->leftmargin, tclass.defaultfont()) * 4 + l_margin += font_metrics::signedWidth(layout->leftmargin, params.getFont()) * 4 / (par.getDepth() + 4); break; @@ -578,7 +592,7 @@ int LyXText::leftMargin(pit_type const pit, pos_type const pos) const if (rit->fill() < minfill) minfill = rit->fill(); l_margin += font_metrics::signedWidth(layout->leftmargin, - tclass.defaultfont()); + params.getFont()); l_margin += minfill; #endif // also wrong, but much shorter. @@ -617,7 +631,7 @@ int LyXText::leftMargin(pit_type const pit, pos_type const pos) const || bv()->buffer()->params().paragraph_separation == BufferParams::PARSEP_INDENT)) { - l_margin += font_metrics::signedWidth(parindent, tclass.defaultfont()); + l_margin += font_metrics::signedWidth(parindent, params.getFont()); } return l_margin; @@ -630,13 +644,14 @@ int LyXText::rightMargin(Paragraph const & par) const if (bv()->text() != this) return 0; - LyXTextClass const & tclass = bv()->buffer()->params().getLyXTextClass(); + BufferParams const & params = bv()->buffer()->params(); + LyXTextClass const & tclass = params.getLyXTextClass(); int const r_margin = ::rightMargin() + font_metrics::signedWidth(tclass.rightmargin(), - tclass.defaultfont()) + params.getFont()) + font_metrics::signedWidth(par.layout()->rightmargin, - tclass.defaultfont()) + params.getFont()) * 4 / (par.getDepth() + 4); return r_margin; @@ -1411,7 +1426,7 @@ void LyXText::acceptChange(LCursor & cur) DocIterator it = cur.selectionBegin(); DocIterator et = cur.selectionEnd(); pit_type pit = it.pit(); - Change::Type const type = pars_[pit].lookupChange(it.pos()); + Change::Type const type = pars_[pit].lookupChange(it.pos()).type; for (; pit <= et.pit(); ++pit) { pos_type left = ( pit == it.pit() ? it.pos() : 0 ); pos_type right = @@ -1448,7 +1463,7 @@ void LyXText::rejectChange(LCursor & cur) DocIterator it = cur.selectionBegin(); DocIterator et = cur.selectionEnd(); pit_type pit = it.pit(); - Change::Type const type = pars_[pit].lookupChange(it.pos()); + Change::Type const type = pars_[pit].lookupChange(it.pos()).type; for (; pit <= et.pit(); ++pit) { pos_type left = ( pit == it.pit() ? it.pos() : 0 ); pos_type right = @@ -2230,6 +2245,9 @@ int LyXText::cursorY(CursorSlice const & sl, bool boundary) const { //lyxerr << "LyXText::cursorY: boundary: " << boundary << std::endl; Paragraph const & par = getPar(sl.pit()); + if (par.rows().empty()) + return 0; + int h = 0; h -= pars_[0].rows()[0].ascent(); for (pit_type pit = 0; pit < sl.pit(); ++pit) @@ -2260,7 +2278,7 @@ string LyXText::currentState(LCursor & cur) os << "[C] "; if (show_change) { - Change change = par.lookupChangeFull(cur.pos()); + Change change = par.lookupChange(cur.pos()); Author const & a = buf.params().authors().get(change.author); os << _("Change: ") << a.name(); if (!a.email().empty())