#include "bufferview_funcs.h"
-#include "Author.h"
#include "Buffer.h"
#include "BufferParams.h"
#include "BufferView.h"
#include "Language.h"
#include "Color.h"
#include "Lexer.h"
-#include "Row.h"
-#include "Paragraph.h"
-#include "ParagraphParameters.h"
-#include "ParIterator.h"
#include "frontends/alert.h"
#include <sstream>
-
-namespace lyx {
-
-using support::bformat;
-
using std::istringstream;
using std::ostringstream;
using std::string;
using std::find;
+namespace lyx {
+
+using support::bformat;
+
namespace bv_funcs {
// Set data using font and toggle
{
int x = 0;
int y = 0;
+ int lastw = 0;
- // Contribution of nested insets
- for (size_t i = 1; i != dit.depth(); ++i) {
+ // Addup ontribution of nested insets, from inside to outside,
+ // keeping the outer paragraph for a special handling below
+ for (size_t i = dit.depth() - 1; i >= 1; --i) {
CursorSlice const & sl = dit[i];
int xx = 0;
int yy = 0;
+
+ // get relative position inside sl.inset()
sl.inset().cursorPos(bv, sl, boundary && ((i+1) == dit.depth()), xx, yy);
+
+ // Make relative position inside of the edited inset relative to sl.inset()
x += xx;
y += yy;
+
+ // In case of an RTL inset, the edited inset will be positioned to the left
+ // of xx:yy
+ if (sl.text()) {
+ bool boundary_i = boundary && i + 1 == dit.depth();
+ bool rtl = sl.text()->isRTL(bv.buffer(), sl, boundary_i);
+ if (rtl)
+ x -= lastw;
+ }
+
+ // remember width for the case that sl.inset() is positioned in an RTL inset
+ lastw = sl.inset().width();
+
//lyxerr << "Cursor::getPos, i: "
// << i << " x: " << xx << " y: " << y << endl;
}
BOOST_ASSERT(!pm.rows().empty());
y -= pm.rows()[0].ascent();
#if 1
+ // FIXME: document this mess
size_t rend;
if (sl.pos() > 0 && dit.depth() == 1) {
int pos = sl.pos();
for (size_t rit = 0; rit != rend; ++rit)
y += pm.rows()[rit].height();
y += pm.rows()[rend].ascent();
- x += dit.bottom().text()->cursorX(bv, dit.bottom(), boundary && dit.depth() == 1);
-
+
+ // Make relative position from the nested inset now bufferview absolute.
+ int xx = dit.bottom().text()->cursorX(bv, dit.bottom(), boundary && dit.depth() == 1);
+ x += xx;
+
+ // In the RTL case place the nested inset at the left of the cursor in
+ // the outer paragraph
+ bool boundary_1 = boundary && 1 == dit.depth();
+ bool rtl = dit.bottom().text()->isRTL(bv.buffer(), dit.bottom(), boundary_1);
+ if (rtl)
+ x -= lastw;
+
return Point(x, y);
}
Point getPos(BufferView const & bv, DocIterator const & dit, bool boundary)
{
CursorSlice const & bot = dit.bottom();
- CoordCache::ParPosCache::const_iterator cache_it =
+ CoordCache::ParPosCache::const_iterator cache_it =
bv.coordCache().getParPos().find(bot.text());
if (cache_it == bv.coordCache().getParPos().end())
return Point(-1, -1);