#include "Cursor.h"
#include "CutAndPaste.h"
#include "FuncRequest.h"
+#include "HSpace.h"
#include "InsetList.h"
#include "Layout.h"
#include "Length.h"
if (!lyxrc.rtl_support)
return false;
- // no RTL boundary at line start
+ // no RTL boundary at paragraph start
if (pos == 0)
return false;
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;
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;
}
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:
align = LYX_ALIGN_CENTER;
break;
case Inset::Inline:
- case Inset::AlignRight:
// unchanged (use align)
break;
+ case Inset::AlignRight:
+ align = LYX_ALIGN_RIGHT;
+ break;
}
}
}
-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];
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 << ")");
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
|| 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;
}