#include "TextClass.h"
#include "TextMetrics.h"
-#include "insets/InsetCollapsable.h"
+#include "insets/InsetCollapsible.h"
#include "mathed/InsetMathHull.h"
// Ok, we have a selection.
Font newfont = font;
- if (toggleall) {
+ if (toggleall) {
// Toggling behaves as follows: We check the first character of the
// selection. If it's (say) got EMPH on, then we set to off; if off,
// then to on. With families and the like, we set it to INHERIT, if
CursorSlice const & sl = cur.selBegin();
Text const & text = *sl.text();
Paragraph const & par = text.getPar(sl.pit());
-
+
// get font at the position
Font oldfont = par.getFont(cur.bv().buffer().params(), sl.pos(),
text.outerFont(sl.pit()));
FontInfo const & oldfi = oldfont.fontInfo();
-
+
FontInfo & newfi = newfont.fontInfo();
-
+
FontFamily newfam = newfi.family();
if (newfam != INHERIT_FAMILY && newfam != IGNORE_FAMILY &&
newfam == oldfi.family())
newfi.setFamily(INHERIT_FAMILY);
-
+
FontSeries newser = newfi.series();
if (newser == BOLD_SERIES && oldfi.series() == BOLD_SERIES)
newfi.setSeries(INHERIT_SERIES);
-
+
FontShape newshp = newfi.shape();
if (newshp != INHERIT_SHAPE && newshp != IGNORE_SHAPE &&
newshp == oldfi.shape())
newfi.setShape(INHERIT_SHAPE);
ColorCode newcol = newfi.color();
- if (newcol != Color_none && newcol != Color_inherit
+ if (newcol != Color_none && newcol != Color_inherit
&& newcol != Color_ignore && newcol == oldfi.color())
newfi.setColor(Color_none);
newfi.setNoun(oldfi.noun() == FONT_OFF ? FONT_ON : FONT_OFF);
if (newfi.number() == FONT_TOGGLE)
newfi.setNumber(oldfi.number() == FONT_OFF ? FONT_ON : FONT_OFF);
+ if (newfi.nospellcheck() == FONT_TOGGLE)
+ newfi.setNoSpellcheck(oldfi.nospellcheck() == FONT_OFF ? FONT_ON : FONT_OFF);
}
- setFont(cur.bv(), cur.selectionBegin().top(),
+ setFont(cur.bv(), cur.selectionBegin().top(),
cur.selectionEnd().top(), newfont);
}
Font f = tm.displayFont(pit, pos);
f.update(font, language);
setCharFont(pit, pos, f, tm.font_);
- // font change may change language...
+ // font change may change language...
// spell checker has to know that
pars_[pit].requestSpellCheck(pos);
}
}
-docstring Text::getStringToIndex(Cursor const & cur)
+docstring Text::getStringForDialog(Cursor & cur)
{
LBUFERR(this == cur.text());
// Try implicit word selection. If there is a change
// in the language the implicit word selection is
// disabled.
- Cursor tmpcur = cur;
- selectWord(tmpcur, PREVIOUS_WORD);
-
- if (!tmpcur.selection())
- cur.message(_("Nothing to index!"));
- else if (tmpcur.selBegin().pit() != tmpcur.selEnd().pit())
- cur.message(_("Cannot index more than one paragraph!"));
- else
- return tmpcur.selectionAsString(false);
-
- return docstring();
+ selectWordWhenUnderCursor(cur, WHOLE_WORD);
+ docstring const & retval = cur.selectionAsString(false);
+ cur.clearSelection();
+ return retval;
}
return false;
if (cur.selection() && cur.realAnchor().find(inset) == -1)
return false;
- inset->edit(cur, movingForward,
+ inset->edit(cur, movingForward,
movingLeft ? Inset::ENTRY_DIRECTION_RIGHT : Inset::ENTRY_DIRECTION_LEFT);
cur.setCurrentFont();
cur.boundary(false);
!cur.paragraph().isSeparator(cur.pos() - 1)) {
return setCursor(cur, cur.pit(), cur.pos(), true, true);
}
-
+
// go left and try to enter inset
if (checkAndActivateInset(cur, false))
return false;
-
+
// normal character left
return setCursor(cur, cur.pit(), cur.pos() - 1, true, false);
}
cur = temp_cur;
return false;
}
- return setCursor(cur, temp_cur.pit(), temp_cur.pos(),
+ return setCursor(cur, temp_cur.pit(), temp_cur.pos(),
true, temp_cur.boundary());
}
if (cur.boundary() && !tm.isRTLBoundary(cur.pit(), cur.pos()))
return setCursor(cur, cur.pit(), cur.pos(), true, false);
- // next position is left of boundary,
+ // 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
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 (tm.isRTLBoundary(cur.pit(), 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);
}
}
-// fix the cursor `cur' after a characters has been deleted at `where'
+namespace {
+// fix the cursor `cur' after characters has been deleted at `where'
// position. Called by deleteEmptyParagraphMechanism
-void Text::fixCursorAfterDelete(CursorSlice & cur, CursorSlice const & where)
+void fixCursorAfterDelete(CursorSlice & cur, CursorSlice const & where,
+ pos_type from, pos_type to)
{
// Do nothing if cursor is not in the paragraph where the
// deletion occurred,
return;
// If cursor position is after the deletion place update it
- if (cur.pos() > where.pos())
- --cur.pos();
+ if (cur.pos() > from)
+ cur.pos() = max(from, cur.pos() - (to - from));
// Check also if we don't want to set the cursor on a spot behind the
// pagragraph because we erased the last character.
cur.pos() = cur.lastpos();
}
+}
+
bool Text::deleteEmptyParagraphMechanism(Cursor & cur,
Cursor & old, bool & need_anchor_change)
if (&old.inset() == &cur[depth].inset())
break;
- // Whether a common inset is found and whether the cursor is still in
+ // Whether a common inset is found and whether the cursor is still in
// the same paragraph (possibly nested).
bool const same_par = depth < cur.depth() && old.pit() == cur[depth].pit();
- bool const same_par_pos = depth == cur.depth() - 1 && same_par
+ bool const same_par_pos = depth == cur.depth() - 1 && same_par
&& old.pos() == cur[depth].pos();
-
- // If the chars around the old cursor were spaces, delete one of them.
+
+ // If the chars around the old cursor were spaces, delete some of
+ // them , but only if the cursor has really moved.
if (!same_par_pos) {
- // Only if the cursor has really moved.
- if (old.pos() > 0
- && old.pos() < oldpar.size()
- && oldpar.isLineSeparator(old.pos())
- && oldpar.isLineSeparator(old.pos() - 1)
- && !oldpar.isDeleted(old.pos() - 1)
- && !oldpar.isDeleted(old.pos())) {
- oldpar.eraseChar(old.pos() - 1, cur.buffer()->params().track_changes);
+ // find range of spaces around cursors
+ int from = old.pos();
+ while (from > 0
+ && oldpar.isLineSeparator(from - 1)
+ && !oldpar.isDeleted(from - 1))
+ --from;
+ int to = old.pos();
+ while (to < oldpar.size() - 1
+ && oldpar.isLineSeparator(to)
+ && !oldpar.isDeleted(to))
+ ++to;
+
+ // If we are not at the extremity of the paragraph, keep one space
+ if (from != to && from > 0 && to < oldpar.size())
+ ++from;
+
+ // Remove spaces and adapt cursor.
+ if (from < to) {
+ oldpar.eraseChars(from, to, cur.buffer()->params().track_changes);
// 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)
// correct all cursor parts
if (same_par) {
- fixCursorAfterDelete(cur[depth], old.top());
+ fixCursorAfterDelete(cur[depth], old.top(), from, to);
need_anchor_change = true;
}
return true;
if (soa && old.pit() < pit_type(plist.size()))
plist[old.pit()].params().startOfAppendix(true);
- // see #warning (FIXME?) above
+ // see #warning (FIXME?) above
if (cur.depth() >= old.depth()) {
CursorSlice & curslice = cur[old.depth() - 1];
if (&curslice.inset() == &old.inset()
if (par.isFreeSpacing())
continue;
- for (pos_type pos = 1; pos < par.size(); ++pos) {
- if (par.isLineSeparator(pos) && par.isLineSeparator(pos - 1)
- && !par.isDeleted(pos - 1)) {
- if (par.eraseChar(pos - 1, trackChanges)) {
- --pos;
- }
- }
+ pos_type from = 0;
+ while (from < par.size()) {
+ // skip non-spaces
+ while (from < par.size()
+ && (!par.isLineSeparator(from) || par.isDeleted(from)))
+ ++from;
+ // find string of spaces
+ pos_type to = from;
+ while (to < par.size()
+ && par.isLineSeparator(to) && !par.isDeleted(to))
+ ++to;
+ // empty? We are done
+ if (from == to)
+ break;
+ // if inside the line, keep one space
+ if (from > 0 && to < par.size())
+ ++from;
+ // remove the extra spaces
+ if (from < to)
+ par.eraseChars(from, to, trackChanges);
}
// don't delete anything if this is the only remaining paragraph