X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2FTextMetrics.cpp;h=4e70dc0b82091b5b207a45e49d8f3c43d648796d;hb=4db3e641ed6765e005343010cb90ee8af26f8f99;hp=f291e397f01ffe1da1c6bab78c91a8f49429c652;hpb=a756403301ff8fb78df4dc1e131e4cd50cd976e1;p=lyx.git diff --git a/src/TextMetrics.cpp b/src/TextMetrics.cpp index f291e397f0..4e70dc0b82 100644 --- a/src/TextMetrics.cpp +++ b/src/TextMetrics.cpp @@ -51,6 +51,7 @@ #include "support/debug.h" #include "support/docstring_list.h" +#include "support/gettext.h" #include "support/lassert.h" #include @@ -128,7 +129,7 @@ static int numberOfHfills(Paragraph const & par, Row const & row) TextMetrics::TextMetrics(BufferView * bv, Text * text) : bv_(bv), text_(text) { - LASSERT(bv_, /**/); + LBUFERR(bv_); max_width_ = bv_->workWidth(); dim_.wid = max_width_; dim_.asc = 10; @@ -158,7 +159,7 @@ pair TextMetrics::first() const pair TextMetrics::last() const { - LASSERT(!par_metrics_.empty(), /**/); + LBUFERR(!par_metrics_.empty()); ParMetricsCache::const_reverse_iterator it = par_metrics_.rbegin(); return make_pair(it->first, &it->second); } @@ -179,7 +180,7 @@ ParagraphMetrics & TextMetrics::parMetrics(pit_type pit, bool redo) bool TextMetrics::metrics(MetricsInfo & mi, Dimension & dim, int min_width) { - LASSERT(mi.base.textwidth > 0, /**/); + LBUFERR(mi.base.textwidth > 0); max_width_ = mi.base.textwidth; // backup old dimension. Dimension const old_dim = dim_; @@ -239,7 +240,7 @@ void TextMetrics::applyOuterFont(Font & font) const Font TextMetrics::displayFont(pit_type pit, pos_type pos) const { - LASSERT(pos >= 0, /**/); + LASSERT(pos >= 0, { static Font f; return f; }); ParagraphList const & pars = text_->paragraphs(); Paragraph const & par = pars[pit]; @@ -375,19 +376,28 @@ bool TextMetrics::redoParagraph(pit_type const pit) main_text_ = (text_ == &buffer.text()); bool changed = false; + // Check whether there are InsetBibItems that need fixing // FIXME: This check ought to be done somewhere else. It is the reason - // why text_ is not const. But then, where else to do it? + // why text_ is not const. But then, where else to do it? // Well, how can you end up with either (a) a biblio environment that // has no InsetBibitem or (b) a biblio environment with more than one // InsetBibitem? I think the answer is: when paragraphs are merged; // when layout is set; when material is pasted. - int const moveCursor = par.checkBiblio(buffer); - if (moveCursor > 0) - const_cast(bv_->cursor()).posForward(); - else if (moveCursor < 0) { - Cursor & cursor = const_cast(bv_->cursor()); - if (cursor.pos() >= -moveCursor) - cursor.posBackward(); + if (par.brokenBiblio()) { + Cursor & cur = const_cast(bv_->cursor()); + // In some cases, we do not know how to record undo + if (&cur.inset() == &text_->inset()) + cur.recordUndo(ATOMIC_UNDO, pit, pit); + + int const moveCursor = par.fixBiblio(buffer); + + // Is it necessary to update the cursor? + if (&cur.inset() == &text_->inset() && cur.pit() == pit) { + if (moveCursor > 0) + cur.posForward(); + else if (moveCursor < 0 && cur.pos() >= -moveCursor) + cur.posBackward(); + } } // Optimisation: this is used in the next two loops @@ -407,7 +417,7 @@ bool TextMetrics::redoParagraph(pit_type const pit) // should be. bv_->buffer().updateBuffer(); parPos = text_->macrocontextPosition(); - LASSERT(!parPos.empty(), /**/); + LBUFERR(!parPos.empty()); parPos.pit() = pit; } @@ -683,7 +693,7 @@ int TextMetrics::labelFill(pit_type const pit, Row const & row) const Paragraph const & par = text_->getPar(pit); pos_type last = par.beginOfBody(); - LASSERT(last > 0, /**/); + LBUFERR(last > 0); // -1 because a label ends with a space that is in the label --last; @@ -761,7 +771,7 @@ public: FontIterator & operator++() { ++pos_; - if (pos_ > endspan_ || pos_ == bodypos_) { + if (pos_ < par_.size() && (pos_ > endspan_ || pos_ == bodypos_)) { font_ = tm_.displayFont(pit_, pos_); endspan_ = par_.fontSpan(pos_).last; } @@ -1093,20 +1103,9 @@ Dimension TextMetrics::rowHeight(pit_type const pit, pos_type const first, if (par.params().startOfAppendix()) maxasc += int(3 * dh); - // This is special code for the chapter, since the label of this - // layout is printed in an extra row - if (layout.counter == "chapter" - && !par.params().labelString().empty()) { - labeladdon = int(labelfont_metrics.maxHeight() - * layout.spacing.getValue() - * text_->spacing(par)); - } - // special code for the top label - if ((layout.labeltype == LABEL_TOP_ENVIRONMENT - || layout.labeltype == LABEL_BIBLIO - || layout.labeltype == LABEL_CENTERED_TOP_ENVIRONMENT) - && text_->isFirstInSequence(pit) + if (layout.labelIsAbove() + && (!layout.isParagraphGroup() || text_->isFirstInSequence(pit)) && !par.labelString().empty()) { labeladdon = int( @@ -1270,7 +1269,8 @@ pos_type TextMetrics::getColumnNearX(pit_type const pit, left_side = true; } - LASSERT(vc <= end, /**/); // This shouldn't happen. + // This shouldn't happen. But we can reset and try to continue. + LASSERT(vc <= end, vc = end); boundary = false; @@ -1343,7 +1343,7 @@ pos_type TextMetrics::x2pos(pit_type pit, int row, int x) const // upDownInText() while in selection mode. ParagraphMetrics const & pm = parMetrics(pit); - LASSERT(row < int(pm.rows().size()), /**/); + LBUFERR(row < int(pm.rows().size())); bool bound = false; Row const & r = pm.rows()[row]; return r.pos() + getColumnNearX(pit, r, x, bound); @@ -1446,7 +1446,7 @@ Row const & TextMetrics::getPitAndRowNearY(int & y, pit_type & pit, ParagraphMetrics const & pm = par_metrics_[pit]; int yy = pm.position() - pm.ascent(); - LASSERT(!pm.rows().empty(), /**/); + LBUFERR(!pm.rows().empty()); RowList::const_iterator rit = pm.rows().begin(); RowList::const_iterator rlast = pm.rows().end(); --rlast; @@ -1546,8 +1546,8 @@ Inset * TextMetrics::editXY(Cursor & cur, int x, int y, void TextMetrics::setCursorFromCoordinates(Cursor & cur, int const x, int const y) { - LASSERT(text_ == cur.text(), /**/); - pit_type pit = getPitNearY(y); + LASSERT(text_ == cur.text(), return); + pit_type const pit = getPitNearY(y); LASSERT(pit != -1, return); ParagraphMetrics const & pm = par_metrics_[pit]; @@ -1557,7 +1557,7 @@ void TextMetrics::setCursorFromCoordinates(Cursor & cur, int const x, int const " pit: " << pit << " yy: " << yy); int r = 0; - LASSERT(pm.rows().size(), /**/); + LBUFERR(pm.rows().size()); for (; r < int(pm.rows().size()) - 1; ++r) { Row const & row = pm.rows()[r]; if (int(yy + row.height()) > y) @@ -1627,7 +1627,7 @@ Inset * TextMetrics::checkInsetHit(int x, int y) int TextMetrics::cursorX(CursorSlice const & sl, bool boundary) const { - LASSERT(sl.text() == text_, /**/); + LASSERT(sl.text() == text_, return 0); pit_type const pit = sl.pit(); Paragraph const & par = text_->paragraphs()[pit]; ParagraphMetrics const & pm = par_metrics_[pit]; @@ -1802,7 +1802,7 @@ int TextMetrics::cursorY(CursorSlice const & sl, bool boundary) const bool TextMetrics::cursorHome(Cursor & cur) { - LASSERT(text_ == cur.text(), /**/); + LASSERT(text_ == cur.text(), return false); ParagraphMetrics const & pm = par_metrics_[cur.pit()]; Row const & row = pm.getRow(cur.pos(),cur.boundary()); return text_->setCursor(cur, cur.pit(), row.pos()); @@ -1811,7 +1811,7 @@ bool TextMetrics::cursorHome(Cursor & cur) bool TextMetrics::cursorEnd(Cursor & cur) { - LASSERT(text_ == cur.text(), /**/); + LASSERT(text_ == cur.text(), return false); // if not on the last row of the par, put the cursor before // the final space exept if I have a spanning inset or one string // is so long that we force a break. @@ -1833,7 +1833,7 @@ bool TextMetrics::cursorEnd(Cursor & cur) void TextMetrics::deleteLineForward(Cursor & cur) { - LASSERT(text_ == cur.text(), /**/); + LASSERT(text_ == cur.text(), return); if (cur.lastpos() == 0) { // Paragraph is empty, so we just go forward text_->cursorForward(cur); @@ -1868,8 +1868,6 @@ bool TextMetrics::isFirstRow(pit_type pit, Row const & row) const int TextMetrics::leftMargin(int max_width, pit_type pit) const { - LASSERT(pit >= 0, /**/); - LASSERT(pit < int(text_->paragraphs().size()), /**/); return leftMargin(max_width, pit, text_->paragraphs()[pit].size()); } @@ -1879,11 +1877,11 @@ int TextMetrics::leftMargin(int max_width, { ParagraphList const & pars = text_->paragraphs(); - LASSERT(pit >= 0, /**/); - LASSERT(pit < int(pars.size()), /**/); + LASSERT(pit >= 0, return 0); + LASSERT(pit < int(pars.size()), return 0); Paragraph const & par = pars[pit]; - LASSERT(pos >= 0, /**/); - LASSERT(pos <= par.size(), /**/); + LASSERT(pos >= 0, return 0); + LASSERT(pos <= par.size(), return 0); Buffer const & buffer = bv_->buffer(); //lyxerr << "TextMetrics::leftMargin: pit: " << pit << " pos: " << pos << endl; DocumentClass const & tclass = buffer.params().documentClass(); @@ -1972,10 +1970,7 @@ int TextMetrics::leftMargin(int max_width, && layout.latextype == LATEX_ENVIRONMENT && !text_->isFirstInSequence(pit))) { l_margin += labelfont_metrics.signedWidth(layout.leftmargin); - } else if (layout.labeltype != LABEL_TOP_ENVIRONMENT - && layout.labeltype != LABEL_BIBLIO - && layout.labeltype != - LABEL_CENTERED_TOP_ENVIRONMENT) { + } else if (!layout.labelIsAbove()) { l_margin += labelfont_metrics.signedWidth(layout.labelindent); l_margin += labelfont_metrics.width(layout.labelsep); l_margin += labelfont_metrics.width(par.labelString()); @@ -2017,8 +2012,8 @@ int TextMetrics::leftMargin(int max_width, // set the correct parindent if (pos == 0 && (layout.labeltype == LABEL_NO_LABEL - || layout.labeltype == LABEL_TOP_ENVIRONMENT - || layout.labeltype == LABEL_CENTERED_TOP_ENVIRONMENT + || layout.labeltype == LABEL_ABOVE + || layout.labeltype == LABEL_CENTERED || (layout.labeltype == LABEL_STATIC && layout.latextype == LATEX_ENVIRONMENT && !text_->isFirstInSequence(pit)))