X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2Ftext.C;h=da326879c5cc2c15f1fddf8e00f71e23b5337bc0;hb=ae348f8af96100a154b3792d27732d621d44ec89;hp=937463fedd8f13f3b72b63f9f368a4b9d5c25137;hpb=cf4293824f406c03e940bed6bf7274b57629a857;p=lyx.git diff --git a/src/text.C b/src/text.C index 937463fedd..da326879c5 100644 --- a/src/text.C +++ b/src/text.C @@ -75,6 +75,7 @@ #include +using lyx::char_type; using lyx::pit_type; using lyx::pos_type; using lyx::word_location; @@ -134,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! @@ -324,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"), @@ -379,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(); @@ -424,7 +439,7 @@ int LyXText::singleWidth(Paragraph const & par, pos_type pos) const int LyXText::singleWidth(Paragraph const & par, - pos_type pos, char c, LyXFont const & font) const + pos_type pos, char_type c, LyXFont const & font) const { // The most common case is handled first (Asger) if (isPrintable(c)) { @@ -466,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; @@ -477,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 @@ -507,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); @@ -530,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; @@ -577,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. @@ -616,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; @@ -629,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; @@ -710,7 +726,7 @@ void LyXText::rowBreakPoint(pit_type const pit, Row & row) const pos_type point = end; pos_type i = pos; for ( ; i < end; ++i, ++fi) { - char const c = par.getChar(i); + char_type const c = par.getChar(i); int thiswidth = singleWidth(par, i, c, *fi); // add the auto-hfill from label end to the body @@ -803,7 +819,7 @@ void LyXText::setRowWidth(pit_type const pit, Row & row) const w -= singleWidth(par, i - 1); w = max(w, labelEnd(pit)); } - char const c = par.getChar(i); + char_type const c = par.getChar(i); w += singleWidth(par, i, c, *fi); } } @@ -1089,11 +1105,11 @@ void LyXText::breakParagraph(LCursor & cur, bool keep_layout) pars_[next_par].erase(0); ParIterator current_it(cur); - ParIterator next_it(cur); next_it.pit() = next_par; + ParIterator last_it(cur); + ++last_it; + ++last_it; - if (needsUpdateCounters(cur.buffer(), current_it) - || needsUpdateCounters(cur.buffer(), next_it)) - updateCounters(cur.buffer()); + updateLabels(cur.buffer(), current_it, last_it); // Mark "carriage return" as inserted if change tracking: if (cur.buffer().params().tracking_changes) { @@ -1112,7 +1128,7 @@ void LyXText::breakParagraph(LCursor & cur, bool keep_layout) // insert a character, moves all the following breaks in the // same Paragraph one to the right and make a rebreak -void LyXText::insertChar(LCursor & cur, char c) +void LyXText::insertChar(LCursor & cur, char_type c) { BOOST_ASSERT(this == cur.text()); BOOST_ASSERT(c != Paragraph::META_INSET); @@ -1145,7 +1161,7 @@ void LyXText::insertChar(LCursor & cur, char c) number(cur); // Set current_font.number to ON if (cur.pos() != 0) { - char const c = par.getChar(cur.pos() - 1); + char_type const c = par.getChar(cur.pos() - 1); if (contains(number_unary_operators, c) && (cur.pos() == 1 || par.isSeparator(cur.pos() - 2) @@ -1410,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 = @@ -1447,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 = @@ -1552,7 +1568,7 @@ void LyXText::changeCase(LCursor & cur, LyXText::TextCase action) pos = 0; continue; } - unsigned char c = pars_[pit].getChar(pos); + char_type c = pars_[pit].getChar(pos); if (c != Paragraph::META_INSET) { switch (action) { case text_lowercase: @@ -1676,8 +1692,7 @@ bool LyXText::backspacePos0(LCursor & cur) // the counters may have changed ParIterator par_it(cur); - if (needsUpdateCounters(cur.buffer(), par_it)) - updateCounters(cur.buffer()); + updateLabels(cur.buffer(), par_it); setCursor(cur, cur.pit(), cur.pos(), false); } @@ -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())