* \author John Levon
* \author André Pönitz
* \author Allan Rae
+ * \author Stefan Schimanski
* \author Dekel Tsur
* \author Jürgen Vigna
*
BOOST_ASSERT(pos >= 0);
Layout_ptr const & layout = par.layout();
-#ifdef WITH_WARNINGS
-#warning broken?
-#endif
+ // FIXME: broken?
BufferParams const & params = buffer.params();
pos_type const body_pos = par.beginOfBody();
void Text::setLayout(Buffer const & buffer, pit_type start, pit_type end,
- string const & layout)
+ docstring const & layout)
{
BOOST_ASSERT(start != end);
// set layout over selection and make a total rebreak of those paragraphs
-void Text::setLayout(Cursor & cur, string const & layout)
+void Text::setLayout(Cursor & cur, docstring const & layout)
{
BOOST_ASSERT(this == cur.text());
// special handling of new environment insets
Layout_ptr const & lyxlayout = params.getTextClass()[layout];
if (lyxlayout->is_environment) {
// move everything in a new environment inset
- LYXERR(Debug::DEBUG) << "setting layout " << layout << endl;
+ LYXERR(Debug::DEBUG) << "setting layout " << to_utf8(layout) << endl;
lyx::dispatch(FuncRequest(LFUN_LINE_BEGIN));
lyx::dispatch(FuncRequest(LFUN_LINE_END_SELECT));
lyx::dispatch(FuncRequest(LFUN_CUT));
params.spacing(spacing);
// does the layout allow the new alignment?
- Layout_ptr const & layout = par.layout();
-
- if (align == LYX_ALIGN_LAYOUT)
- align = layout->align;
- if (align & layout->alignpossible) {
- if (align == layout->align)
- params.align(LYX_ALIGN_LAYOUT);
- else
- params.align(align);
- }
+ if (align & par.layout()->alignpossible)
+ params.align(align);
par.setLabelWidthString(labelwidthstring);
params.noindent(noindent);
}
{
BOOST_ASSERT(this == cur.text());
BOOST_ASSERT(inset);
- cur.paragraph().insertInset(cur.pos(), inset,
+ cur.paragraph().insertInset(cur.pos(), inset, current_font,
Change(cur.buffer().params().trackChanges ?
Change::INSERTED : Change::UNCHANGED));
}
pos_type pos = cur.pos();
Paragraph & par = cur.paragraph();
- // ignore empty paragraph
- if (par.empty())
- return;
-
- // if on boundary or at paragraph end, set font of previous char
- if ((pos > 0 && cur.boundary()) || pos == cur.lastpos())
+ // are we behind previous char in fact? -> go to that char
+ if (pos > 0 && cur.boundary())
--pos;
-
- // we changed the line and the bidi tables are outdated?
- if (!bidi.inRange(pos))
- bidi.computeTables(par, cur.buffer(), cur.textRow());
- // now in range?
- if (!bidi.inRange(pos))
- return;
-
- if (pos > 0) {
+ // find position to take the font from
+ if (pos != 0) {
+ // paragraph end? -> font of last char
if (pos == cur.lastpos())
--pos;
- else // potentional bug... BUG (Lgb)
- if (par.isSeparator(pos)) {
- if (pos > cur.textRow().pos() &&
- bidi.level(pos) % 2 ==
- bidi.level(pos - 1) % 2)
- --pos;
- else if (pos + 1 < cur.lastpos())
- ++pos;
- }
+ // on space? -> look at the words in front of space
+ else if (pos > 0 && par.isSeparator(pos)) {
+ // abc| def -> font of c
+ // abc |[WERBEH], i.e. boundary==true -> font of c
+ // abc [WERBEH]| def, font of the space
+ if (!isRTLBoundary(cur.buffer(), par, pos))
+ --pos;
+ }
}
+ // get font
BufferParams const & bufparams = cur.buffer().params();
current_font = par.getFontSettings(bufparams, pos);
real_current_font = getFont(cur.buffer(), par, pos);
+ // special case for paragraph end
if (cur.pos() == cur.lastpos()
- && bidi.isBoundary(cur.buffer(), par, cur.pos())
+ && isRTLBoundary(cur.buffer(), par, cur.pos())
&& !cur.boundary()) {
Language const * lang = par.getParLanguage(bufparams);
current_font.setLanguage(lang);
// -> skip it, i.e. set boundary to true, i.e. go only logically left
// there are some exceptions to ignore this: lineseps, newlines, spaces
#if 0
+ // some effectless debug code to see the values in the debugger
bool bound = cur.boundary();
int rowpos = cur.textRow().pos();
int pos = cur.pos();
// not at paragraph end?
if (cur.pos() != cur.lastpos()) {
- // if left of boundary -> just jump to right side
- if (cur.boundary())
- return setCursor(cur, cur.pit(), cur.pos(), true, false);
-
// in front of editable inset, i.e. jump into it?
if (checkAndActivateInset(cur, true))
return false;
-
+
+ // if left of boundary -> just jump to right side
+ // but for RTL boundaries don't, because: abc|DDEEFFghi -> abcDDEEF|Fghi
+ if (cur.boundary() &&
+ !isRTLBoundary(cur.buffer(), cur.paragraph(), cur.pos()))
+ return setCursor(cur, cur.pit(), cur.pos(), true, false);
+
// next position is left of boundary,
// but go to next line for special cases like space, newline, linesep
#if 0
+ // some effectless debug code to see the values in the debugger
int endpos = cur.textRow().endpos();
int lastpos = cur.lastpos();
int pos = cur.pos();
return setCursor(cur, cur.pit(), cur.pos() + 1, true, true);
}
+ // in front of RTL boundary? Stay on this side of the boundary because:
+ // ab|cDDEEFFghi -> abc|DDEEFFghi
+ if (isRTLBoundary(cur.buffer(), cur.paragraph(), cur.pos() + 1))
+ return setCursor(cur, cur.pit(), cur.pos() + 1, true, true);
+
// move right
return setCursor(cur, cur.pit(), cur.pos() + 1, true, false);
}
&& oldpar.isLineSeparator(old.pos() - 1)
&& !oldpar.isDeleted(old.pos() - 1)) {
oldpar.eraseChar(old.pos() - 1, cur.buffer().params().trackChanges);
-#ifdef WITH_WARNINGS
-#warning This will not work anymore when we have multiple views of the same buffer
+// FIXME: This will not work anymore when we have multiple views of the same buffer
// In this case, we will have to correct also the cursors held by
// other bufferviews. It will probably be easier to do that in a more
// automated way in CursorSlice code. (JMarc 26/09/2001)
-#endif
// correct all cursor parts
if (same_par) {
fixCursorAfterDelete(cur.top(), old.top());
ParagraphList & plist = old.text()->paragraphs();
plist.erase(boost::next(plist.begin(), old.pit()));
- // see #warning above
+ // see #warning (FIXME?) above
if (cur.depth() >= old.depth()) {
CursorSlice & curslice = cur[old.depth() - 1];
if (&curslice.inset() == &old.inset()