X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2FTextMetrics.cpp;h=e28d8fc9785873de5b8d8733a2163d117b502870;hb=1ab314f8e6e145dc73d0a26b7e82a280b497ea3c;hp=360b3c772abf703f4075d20557e219641bd591fc;hpb=e69b723bf9d2e2d8bbd855cac164be4a1a24035e;p=lyx.git diff --git a/src/TextMetrics.cpp b/src/TextMetrics.cpp index 360b3c772a..e28d8fc978 100644 --- a/src/TextMetrics.cpp +++ b/src/TextMetrics.cpp @@ -27,7 +27,6 @@ #include "CoordCache.h" #include "Cursor.h" #include "CutAndPaste.h" -#include "support/debug.h" #include "FontIterator.h" #include "FuncRequest.h" #include "InsetList.h" @@ -49,6 +48,8 @@ #include "frontends/FontMetrics.h" #include "frontends/Painter.h" +#include "support/debug.h" + using namespace std; namespace lyx { @@ -220,13 +221,13 @@ bool TextMetrics::metrics(MetricsInfo & mi, Dimension & dim, int min_width) int TextMetrics::rightMargin(ParagraphMetrics const & pm) const { - return main_text_? pm.rightMargin(bv_->buffer()) : 0; + return main_text_? pm.rightMargin(*bv_) : 0; } int TextMetrics::rightMargin(pit_type const pit) const { - return main_text_? par_metrics_[pit].rightMargin(bv_->buffer()) : 0; + return main_text_? par_metrics_[pit].rightMargin(*bv_) : 0; } @@ -379,7 +380,16 @@ bool TextMetrics::redoParagraph(pit_type const pit) DocIterator parPos = text_->macrocontextPosition(); if (!parPos.empty()) parPos.pit() = pit; - + else { + LYXERR(Debug::INFO, "MacroContext not initialised!" + << " Going through the buffer again and hope" + << " the context is better then."); + updateLabels(bv_->buffer()); + parPos = text_->macrocontextPosition(); + BOOST_ASSERT(!parPos.empty()); + parPos.pit() = pit; + } + // redo insets // FIXME: We should always use getFont(), see documentation of // noFontChange() in Inset.h. @@ -561,11 +571,8 @@ void TextMetrics::computeRowMetrics(pit_type const pit, align = par.params().align(); // Display-style insets should always be on a centred row - // The test on par.size() is to catch zero-size pars, which - // would trigger the assert in Paragraph::getInset(). - //inset = par.size() ? par.getInset(row.pos()) : 0; - if (row.pos() < par.size() && par.isInset(row.pos())) { - switch(par.getInset(row.pos())->display()) { + if (Inset const * inset = par.getInset(row.pos())) { + switch (inset->display()) { case Inset::AlignLeft: align = LYX_ALIGN_BLOCK; break; @@ -774,20 +781,22 @@ pit_type TextMetrics::rowBreakPoint(int width, pit_type const pit, point = i + 1; break; } + Inset const * inset = 0; // Break before... if (i + 1 < end) { - if (par.isInset(i + 1) && par.getInset(i + 1)->display()) { + if ((inset = par.getInset(i + 1)) && inset->display()) { point = i + 1; break; } // ...and after. - if (par.isInset(i) && par.getInset(i)->display()) { + if ((inset = par.getInset(i)) && inset->display()) { point = i + 1; break; } } - if (!par.isInset(i) || par.getInset(i)->isChar()) { + inset = par.getInset(i); + if (!inset || inset->isChar()) { // some insets are line separators too if (par.isLineSeparator(i)) { // register breakpoint: @@ -1116,9 +1125,10 @@ pos_type TextMetrics::getColumnNearX(pit_type const pit, bool const rtl = lastrow ? text_->isRTL(buffer, par) : false; if (lastrow && ((rtl && left_side && vc == row.pos() && x < tmpx - 5) || - (!rtl && !left_side && vc == end && x > tmpx + 5))) - c = end; - else if (vc == row.pos()) { + (!rtl && !left_side && vc == end && x > tmpx + 5))) { + if (!par.isNewline(end - 1)) + c = end; + } else if (vc == row.pos()) { c = bidi.vis2log(vc); if (bidi.level(c) % 2 == 1) ++c; @@ -1688,7 +1698,7 @@ int TextMetrics::leftMargin(int max_width, int l_margin = 0; if (text_->isMainText(buffer)) - l_margin += changebarMargin(); + l_margin += bv_->leftMargin(); l_margin += theFontMetrics(buffer.params().getFont()).signedWidth( tclass.leftmargin()); @@ -1700,6 +1710,7 @@ int TextMetrics::leftMargin(int max_width, if (pars[newpar].layout()->isEnvironment()) { l_margin = leftMargin(max_width, newpar); } + //FIXME Should this check for emptyLayout() as well? if (par.layout() == tclass.defaultLayout()) { if (pars[newpar].params().noindent()) parindent.erase(); @@ -1811,7 +1822,7 @@ int TextMetrics::leftMargin(int max_width, || layout->labeltype == LABEL_TOP_ENVIRONMENT || layout->labeltype == LABEL_CENTERED_TOP_ENVIRONMENT || (layout->labeltype == LABEL_STATIC - && layout->latextype == LATEX_ENVIRONMENT + && layout->latextype == LATEX_ENVIRONMENT && !isFirstInSequence(pit, pars))) && align == LYX_ALIGN_BLOCK && !par.params().noindent() @@ -1821,7 +1832,7 @@ int TextMetrics::leftMargin(int max_width, && !(!par.empty() && par.isInset(pos) && par.getInset(pos)->display()) - && (par.layout() != tclass.defaultLayout() + && (par.layout() != tclass.defaultLayout() //should this check emptyLayout()? || buffer.params().paragraph_separation == BufferParams::PARSEP_INDENT)) {