]> git.lyx.org Git - lyx.git/blobdiff - src/TextMetrics.cpp
Compile fix.
[lyx.git] / src / TextMetrics.cpp
index 6e22bf7852cb692a7a28309145b0da6bf0530bc2..f765236133f5f229245c9d4a59f54b4b2a2c710c 100644 (file)
@@ -28,6 +28,7 @@
 #include "Cursor.h"
 #include "CutAndPaste.h"
 #include "FuncRequest.h"
+#include "HSpace.h"
 #include "InsetList.h"
 #include "Layout.h"
 #include "Length.h"
@@ -187,7 +188,7 @@ int TextMetrics::parPosition(pit_type pit) const
 
 bool TextMetrics::metrics(MetricsInfo & mi, Dimension & dim, int min_width)
 {
-       LASSERT(mi.base.textwidth, /**/);
+       LASSERT(mi.base.textwidth > 0, /**/);
        max_width_ = mi.base.textwidth;
        // backup old dimension.
        Dimension const old_dim = dim_;
@@ -317,7 +318,7 @@ bool TextMetrics::isRTLBoundary(pit_type pit, pos_type pos) const
        if (!lyxrc.rtl_support)
                return false;
 
-       // no RTL boundary at line start
+       // no RTL boundary at paragraph start
        if (pos == 0)
                return false;
 
@@ -333,6 +334,23 @@ bool TextMetrics::isRTLBoundary(pit_type pit, pos_type pos,
        if (!lyxrc.rtl_support)
                return false;
 
+       // no RTL boundary at paragraph start
+       if (pos == 0)
+               return false;
+       
+       ParagraphMetrics & pm = par_metrics_[pit];
+       // no RTL boundary in empty paragraph
+       if (pm.rows().empty())
+               return false;
+
+       pos_type endpos = pm.getRow(pos - 1, false).endpos();
+       pos_type startpos = pm.getRow(pos, false).pos();
+       // no RTL boundary at line start:
+       // abc\n   -> toggle to RTL ->    abc\n     (and not:    abc\n|
+       // |                              |                               )
+       if (pos == startpos && pos == endpos) // start of cur row, end of prev row
+               return false;
+
        Paragraph const & par = text_->getPar(pit);
        bool left = font.isVisibleRightToLeft();
        bool right;
@@ -340,6 +358,16 @@ bool TextMetrics::isRTLBoundary(pit_type pit, pos_type pos,
                right = par.isRTL(bv_->buffer().params());
        else
                right = displayFont(pit, pos).isVisibleRightToLeft();
+       
+       // no RTL boundary at line break:
+       // abc|\n    -> move right ->   abc\n       (and not:    abc\n|
+       // FED                          FED|                     FED     )
+       if (startpos == pos && endpos == pos && endpos != par.size() 
+               && (par.isNewline(pos - 1) 
+                       || par.isLineSeparator(pos - 1) 
+                       || par.isSeparator(pos - 1)))
+               return false;
+       
        return left != right;
 }
 
@@ -561,7 +589,7 @@ void TextMetrics::computeRowMetrics(pit_type const pit,
                                break;
                }
 
-               // Display-style insets should always be on a centred row
+               // Display-style insets should always be on a centered row
                if (Inset const * inset = par.getInset(row.pos())) {
                        switch (inset->display()) {
                                case Inset::AlignLeft:
@@ -571,9 +599,11 @@ void TextMetrics::computeRowMetrics(pit_type const pit,
                                        align = LYX_ALIGN_CENTER;
                                        break;
                                case Inset::Inline:
-                               case Inset::AlignRight:
                                        // unchanged (use align)
                                        break;
+                               case Inset::AlignRight:
+                                       align = LYX_ALIGN_RIGHT;
+                                       break;
                        }
                }
 
@@ -1341,7 +1371,7 @@ pit_type TextMetrics::getPitNearY(int y)
 
        if (y >= last->second.position() + int(pm_last.descent())) {
                // We are looking for a position that is after the last paragraph in
-               // the cache (which is in priciple off-screen, that is before the
+               // the cache (which is in priciple off-screen), that is before the
                // visible part.
                pit = last->first + 1;
                if (pit == int(text_->paragraphs().size()))
@@ -1370,7 +1400,8 @@ pit_type TextMetrics::getPitNearY(int y)
 }
 
 
-Row const & TextMetrics::getRowNearY(int y, pit_type pit) const
+Row const & TextMetrics::getPitAndRowNearY(int y, pit_type & pit,
+       bool assert_in_view, bool up)
 {
        ParagraphMetrics const & pm = par_metrics_[pit];
 
@@ -1382,13 +1413,37 @@ Row const & TextMetrics::getRowNearY(int y, pit_type pit) const
        for (; rit != rlast; yy += rit->height(), ++rit)
                if (yy + rit->height() > y)
                        break;
+
+       if (assert_in_view && yy + rit->height() != y) {
+               if (!up) {
+                       if (rit != pm.rows().begin())
+                               --rit;
+                       else if (pit != 0) {
+                               --pit;
+                               newParMetricsUp();
+                               ParagraphMetrics const & pm2 = par_metrics_[pit];
+                               rit = pm2.rows().end();
+                               --rit;
+                       }
+               } else  {
+                       if (rit != rlast)
+                               ++rit;
+                       else if (pit != int(par_metrics_.size())) {
+                               ++pit;
+                               newParMetricsDown();
+                               ParagraphMetrics const & pm2 = par_metrics_[pit];
+                               rit = pm2.rows().begin();
+                       }
+               }
+       }
        return *rit;
 }
 
 
 // x,y are absolute screen coordinates
 // sets cursor recursively descending into nested editable insets
-Inset * TextMetrics::editXY(Cursor & cur, int x, int y)
+Inset * TextMetrics::editXY(Cursor & cur, int x, int y,
+       bool assert_in_view, bool up)
 {
        if (lyxerr.debugging(Debug::WORKAREA)) {
                LYXERR0("TextMetrics::editXY(cur, " << x << ", " << y << ")");
@@ -1397,7 +1452,7 @@ Inset * TextMetrics::editXY(Cursor & cur, int x, int y)
        pit_type pit = getPitNearY(y);
        LASSERT(pit != -1, return 0);
 
-       Row const & row = getRowNearY(y, pit);
+       Row const & row = getPitAndRowNearY(y, pit, assert_in_view, up);
        bool bound = false;
 
        int xx = x; // is modified by getColumnNearX
@@ -1421,7 +1476,7 @@ Inset * TextMetrics::editXY(Cursor & cur, int x, int y)
        }
 
        ParagraphList const & pars = text_->paragraphs();
-       Inset const * insetBefore = pos? pars[pit].getInset(pos - 1): 0;
+       Inset const * insetBefore = pos ? pars[pit].getInset(pos - 1) : 0;
        //Inset * insetBehind = pars[pit].getInset(pos);
 
        // This should be just before or just behind the
@@ -1922,11 +1977,16 @@ int TextMetrics::leftMargin(int max_width,
                 || tclass.isPlainLayout(par.layout()))
                || buffer.params().paragraph_separation == BufferParams::ParagraphIndentSeparation)
            )
-       {
-               l_margin += theFontMetrics(buffer.params().getFont()).signedWidth(
-                       parindent);
-       }
-
+               {
+                       // use the parindent of the layout when the default indentation is used
+                       // otherwise use the indentation set in the document settings
+                       if (buffer.params().getIndentation().asLyXCommand() == "default")
+                               l_margin += theFontMetrics(buffer.params().getFont()).signedWidth(
+                               parindent);
+                       else
+                               l_margin += buffer.params().getIndentation().inPixels(*bv_);
+               }
+       
        return l_margin;
 }