X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2Fbufferview_funcs.cpp;h=fff484cd4893803c547323ae2e5687792d150940;hb=8db4a8dd4663cdd6a3cf67777ea2538a380d0dd2;hp=a5e104e7fc81e761c9f0dd23a0d53cf65bbe02b4;hpb=f630be890494c849981e4fb52ea4740506e92bed;p=lyx.git diff --git a/src/bufferview_funcs.cpp b/src/bufferview_funcs.cpp index a5e104e7fc..fff484cd48 100644 --- a/src/bufferview_funcs.cpp +++ b/src/bufferview_funcs.cpp @@ -16,22 +16,17 @@ #include "bufferview_funcs.h" -#include "Author.h" #include "Buffer.h" #include "BufferParams.h" #include "BufferView.h" -#include "LCursor.h" +#include "Cursor.h" #include "CoordCache.h" #include "gettext.h" #include "Language.h" -#include "LColor.h" -#include "LyXLex.h" -#include "Row.h" -#include "Paragraph.h" -#include "ParagraphParameters.h" -#include "ParIterator.h" +#include "Color.h" +#include "Lexer.h" -#include "frontends/Alert.h" +#include "frontends/alert.h" #include "insets/InsetCommand.h" #include "insets/InsetText.h" @@ -40,11 +35,6 @@ #include - -namespace lyx { - -using support::bformat; - using std::istringstream; using std::ostringstream; using std::string; @@ -52,11 +42,15 @@ using std::vector; using std::find; +namespace lyx { + +using support::bformat; + namespace bv_funcs { // Set data using font and toggle // If successful, returns true -bool font2string(LyXFont const & font, bool const toggle, string & data) +bool font2string(Font const & font, bool const toggle, string & data) { string lang = "ignore"; if (font.language()) @@ -81,10 +75,10 @@ bool font2string(LyXFont const & font, bool const toggle, string & data) // Set font and toggle using data // If successful, returns true -bool string2font(string const & data, LyXFont & font, bool & toggle) +bool string2font(string const & data, Font & font, bool & toggle) { istringstream is(data); - LyXLex lex(0,0); + Lexer lex(0,0); lex.setStream(is); int nset = 0; @@ -98,26 +92,26 @@ bool string2font(string const & data, LyXFont & font, bool & toggle) if (token == "family") { int const next = lex.getInteger(); - font.setFamily(LyXFont::FONT_FAMILY(next)); + font.setFamily(Font::FONT_FAMILY(next)); } else if (token == "series") { int const next = lex.getInteger(); - font.setSeries(LyXFont::FONT_SERIES(next)); + font.setSeries(Font::FONT_SERIES(next)); } else if (token == "shape") { int const next = lex.getInteger(); - font.setShape(LyXFont::FONT_SHAPE(next)); + font.setShape(Font::FONT_SHAPE(next)); } else if (token == "size") { int const next = lex.getInteger(); - font.setSize(LyXFont::FONT_SIZE(next)); + font.setSize(Font::FONT_SIZE(next)); } else if (token == "emph" || token == "underbar" || token == "noun" || token == "number") { int const next = lex.getInteger(); - LyXFont::FONT_MISC_STATE const misc = - LyXFont::FONT_MISC_STATE(next); + Font::FONT_MISC_STATE const misc = + Font::FONT_MISC_STATE(next); if (token == "emph") font.setEmph(misc); @@ -130,7 +124,7 @@ bool string2font(string const & data, LyXFont & font, bool & toggle) } else if (token == "color") { int const next = lex.getInteger(); - font.setColor(LColor::color(next)); + font.setColor(Color::color(next)); } else if (token == "language") { string const next = lex.getString(); @@ -161,16 +155,35 @@ Point coordOffset(BufferView const & bv, DocIterator const & dit, { 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; - //lyxerr << "LCursor::getPos, i: " + + // 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; } @@ -180,6 +193,7 @@ Point coordOffset(BufferView const & bv, DocIterator const & dit, 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(); @@ -195,8 +209,18 @@ Point coordOffset(BufferView const & bv, DocIterator const & dit, 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); } @@ -204,7 +228,7 @@ Point coordOffset(BufferView const & bv, DocIterator const & dit, 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); @@ -239,13 +263,13 @@ CurStatus status(BufferView const * bv, DocIterator const & dit) namespace { bool findNextInset(DocIterator & dit, - vector const & codes, + vector const & codes, string const & contents) { DocIterator tmpdit = dit; while (tmpdit) { - InsetBase const * inset = tmpdit.nextInset(); + Inset const * inset = tmpdit.nextInset(); if (inset && find(codes.begin(), codes.end(), inset->lyxCode()) != codes.end() && (contents.empty() || @@ -262,7 +286,7 @@ bool findNextInset(DocIterator & dit, } // namespace anon -bool findInset(DocIterator & dit, vector const & codes, +bool findInset(DocIterator & dit, vector const & codes, bool same_content) { string contents; @@ -272,7 +296,7 @@ bool findInset(DocIterator & dit, vector const & codes, return false; if (same_content) { - InsetBase const * inset = tmpdit.nextInset(); + Inset const * inset = tmpdit.nextInset(); if (inset && find(codes.begin(), codes.end(), inset->lyxCode()) != codes.end()) { contents = static_cast(inset)->getContents(); @@ -294,16 +318,16 @@ bool findInset(DocIterator & dit, vector const & codes, } -void findInset(DocIterator & dit, InsetBase_code code, bool same_content) +void findInset(DocIterator & dit, Inset_code code, bool same_content) { - findInset(dit, vector(1, code), same_content); + findInset(dit, vector(1, code), same_content); } -void gotoInset(BufferView * bv, vector const & codes, +void gotoInset(BufferView * bv, vector const & codes, bool same_content) { - LCursor tmpcur = bv->cursor(); + Cursor tmpcur = bv->cursor(); if (!findInset(tmpcur, codes, same_content)) { bv->cursor().message(_("No more insets")); return; @@ -314,9 +338,9 @@ void gotoInset(BufferView * bv, vector const & codes, } -void gotoInset(BufferView * bv, InsetBase_code code, bool same_content) +void gotoInset(BufferView * bv, Inset_code code, bool same_content) { - gotoInset(bv, vector(1, code), same_content); + gotoInset(bv, vector(1, code), same_content); }