]> git.lyx.org Git - lyx.git/blobdiff - src/TextMetrics.cpp
Work-around for bug #6034: Applying preferences confuses window about its size.
[lyx.git] / src / TextMetrics.cpp
index c17bf2180a279a13a23bfedf0b4e08613b7d015b..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"
@@ -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;
 }
 
@@ -1949,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;
 }