]> git.lyx.org Git - lyx.git/blobdiff - src/TextMetrics.cpp
es.po: fix a typo introduced by last commit
[lyx.git] / src / TextMetrics.cpp
index ee101b39877164431d6544c4275c831bc5fcf370..cb1c4bd2bd16c98095c1060d2ee7ee19627e4ff4 100644 (file)
@@ -80,15 +80,18 @@ int numberOfLabelHfills(Paragraph const & par, Row const & row)
        return n;
 }
 
-
-int numberOfHfills(Row const & row, pos_type const body_pos)
+// FIXME: this needs to be rewritten, probably by merging it into some
+// code that, besides counting, sets the active status of the space
+// inset in the row element.
+int numberOfHfills(Row const & row, ParagraphMetrics const & pm,
+                   pos_type const body_pos)
 {
        int n = 0;
        Row::const_iterator cit = row.begin();
        Row::const_iterator const end = row.end();
        for ( ; cit != end ; ++cit)
                if (cit->pos >= body_pos
-                   && cit->inset && cit->inset->isHfill())
+                   && cit->inset && pm.hfillExpansion(row, cit->pos))
                        ++n;
        return n;
 }
@@ -444,11 +447,17 @@ bool TextMetrics::redoParagraph(pit_type const pit)
                breakRow(row, right_margin, pit);
                setRowHeight(row, pit);
                row.setChanged(false);
-               if (row_index || row.right_boundary() || row.endpos() < par.size())
-                       // If there is more than one row or the row has been
-                       // broken by a display inset or a newline, expand the text
-                       // to the full allowable width. This setting here is
-                       // needed for the computeRowMetrics() below.
+               if (row_index || row.endpos() < par.size()
+                       || (row.right_boundary() && par.inInset().lyxCode() != CELL_CODE))
+                       /* If there is more than one row or the row has been
+                        * broken by a display inset or a newline, expand the text
+                        * to the full allowable width. This setting here is
+                        * needed for the computeRowMetrics() below. In the case
+                        * of a display inset, we do nothing when inside a table
+                        * cell, because the tabular code is not prepared for
+                        * that, and it triggers when using a caption in a
+                        * longtable (see bugs #9945 and #9757).
+                        */
                        dim_.wid = max_width_;
                int const max_row_width = max(dim_.wid, row.width());
                computeRowMetrics(pit, row, max_row_width);
@@ -585,20 +594,20 @@ void TextMetrics::computeRowMetrics(pit_type const pit,
        }
 
        // are there any hfills in the row?
-       int nh = numberOfHfills(row, par.beginOfBody());
+       ParagraphMetrics & pm = par_metrics_[pit];
+       int nh = numberOfHfills(row, pm, par.beginOfBody());
        int hfill = 0;
        int hfill_rem = 0;
 
-       // We don't have to look at the alignment if
-       // * we use hfills, or
-       // * the row is already larger then the permitted width as then we
-       //   force the LEFT_ALIGN'edness!
-       if (nh > 0) {
-               hfill = w / nh;
-               hfill_rem = w % nh;
-       } else if (nh == 0 && int(row.width()) < max_width_) {
-               // is it block, flushleft or flushright?
-               // set x how you need it
+       // We don't have to look at the alignment if the row is already
+       // larger then the permitted width as then we force the
+       // LEFT_ALIGN'edness!
+       if (int(row.width()) >= max_width_)
+               return;
+
+       if (nh == 0) {
+               // Common case : there is no hfill, and the alignment will be
+               // meaningful
                switch (getAlign(par, row)) {
                case LYX_ALIGN_BLOCK: {
                        int const ns = row.countSeparators();
@@ -627,15 +636,19 @@ void TextMetrics::computeRowMetrics(pit_type const pit,
                case LYX_ALIGN_DECIMAL:
                        break;
                }
+               return;
        }
 
-       // Finally,  handle hfill insets
+       hfill = w / nh;
+       hfill_rem = w % nh;
+       row.dimension().wid += w;
+       // Set size of hfill insets
        pos_type const endpos = row.endpos();
        pos_type body_pos = par.beginOfBody();
        if (body_pos > 0
            && (body_pos > endpos || !par.isLineSeparator(body_pos - 1)))
                body_pos = 0;
-       ParagraphMetrics & pm = par_metrics_[pit];
+
        CoordCache::Insets & insetCache = bv_->coordCache().insets();
        Row::iterator cit = row.begin();
        Row::iterator const cend = row.end();
@@ -643,9 +656,7 @@ void TextMetrics::computeRowMetrics(pit_type const pit,
                if (row.label_hfill && cit->endpos == body_pos
                    && cit->type == Row::SPACE)
                        cit->dim.wid -= int(row.label_hfill * (nlh - 1));
-               if (!cit->inset || !cit->inset->isHfill())
-                       continue;
-               if (pm.hfillExpansion(row, cit->pos)) {
+               if (cit->inset && pm.hfillExpansion(row, cit->pos)) {
                        if (cit->pos >= body_pos) {
                                cit->dim.wid += hfill;
                                --nh;
@@ -653,9 +664,9 @@ void TextMetrics::computeRowMetrics(pit_type const pit,
                                        cit->dim.wid += hfill_rem;
                        } else
                                cit->dim.wid += int(row.label_hfill);
+                       // Cache the inset dimension.
+                       insetCache.add(cit->inset, cit->dim);
                }
-               // Cache the inset dimension.
-               insetCache.add(cit->inset, cit->dim);
        }
 }