#include "Language.h"
#include "Length.h"
#include "Lexer.h"
+#include "lyxfind.h"
#include "LyXRC.h"
#include "Paragraph.h"
#include "paragraph_funcs.h"
#include "insets/InsetSpecialChar.h"
#include "insets/InsetTabular.h"
-#include "support/convert.h"
#include "support/debug.h"
#include "support/docstream.h"
#include "support/gettext.h"
else
lex.printError("Unknown bar font flag "
"`$$Token'");
+ } else if (token == "\\strikeout") {
+ lex.next();
+ font.fontInfo().setStrikeout(font.setLyXMisc(lex.getString()));
+ } else if (token == "\\uuline") {
+ lex.next();
+ font.fontInfo().setUuline(font.setLyXMisc(lex.getString()));
+ } else if (token == "\\uwave") {
+ lex.next();
+ font.fontInfo().setUwave(font.setLyXMisc(lex.getString()));
} else if (token == "\\noun") {
lex.next();
font.fontInfo().setNoun(font.setLyXMisc(lex.getString()));
par.insertInset(par.size(), new InsetLine, font, change);
} else if (token == "\\change_unchanged") {
change = Change(Change::UNCHANGED);
- } else if (token == "\\change_inserted") {
- lex.eatLine();
- istringstream is(lex.getString());
- unsigned int aid;
- time_t ct;
- is >> aid >> ct;
- if (aid >= bp.author_map.size()) {
- errorList.push_back(ErrorItem(_("Change tracking error"),
- bformat(_("Unknown author index for insertion: %1$d\n"), aid),
- par.id(), 0, par.size()));
- change = Change(Change::UNCHANGED);
- } else
- change = Change(Change::INSERTED, bp.author_map[aid], ct);
- } else if (token == "\\change_deleted") {
+ } else if (token == "\\change_inserted" || token == "\\change_deleted") {
lex.eatLine();
istringstream is(lex.getString());
unsigned int aid;
time_t ct;
is >> aid >> ct;
- if (aid >= bp.author_map.size()) {
+ map<unsigned int, int> const & am = bp.author_map;
+ if (am.find(aid) == am.end()) {
errorList.push_back(ErrorItem(_("Change tracking error"),
- bformat(_("Unknown author index for deletion: %1$d\n"), aid),
+ bformat(_("Unknown author index for change: %1$d\n"), aid),
par.id(), 0, par.size()));
change = Change(Change::UNCHANGED);
- } else
- change = Change(Change::DELETED, bp.author_map[aid], ct);
+ } else {
+ if (token == "\\change_inserted")
+ change = Change(Change::INSERTED, am.find(aid)->second, ct);
+ else
+ change = Change(Change::DELETED, am.find(aid)->second, ct);
+ }
} else {
lex.eatLine();
errorList.push_back(ErrorItem(_("Unknown token"),
cur.checkBufferStructure();
// cur.updateFlags(Update::Force);
- setCursor(cur.top(), cur.pit(), cur.pos() + 1);
+ bool boundary = tm.isRTLBoundary(cur.pit(), cur.pos() + 1);
+ setCursor(cur, cur.pit(), cur.pos() + 1, false, boundary);
charInserted(cur);
}
// register word if a non-letter was entered
if (cur.pos() > 1
- && par.isLetter(cur.pos() - 2)
- && !par.isLetter(cur.pos() - 1)) {
+ && !par.isWordSeparator(cur.pos() - 2)
+ && par.isWordSeparator(cur.pos() - 1)) {
// get the word in front of cursor
LASSERT(this == cur.text(), /**/);
- cur.paragraph().updateWords(cur.top());
+ cur.paragraph().updateWords();
}
}
++pos;
// Skip over either a non-char inset or a full word
- if (pos != lastpos && !par.isLetter(pos))
+ if (pos != lastpos && par.isWordSeparator(pos))
++pos;
- else while (pos != lastpos && par.isLetter(pos))
+ else while (pos != lastpos && !par.isWordSeparator(pos))
++pos;
} else {
LASSERT(pos < lastpos, /**/); // see above
- if (par.isLetter(pos))
- while (pos != lastpos && par.isLetter(pos))
+ if (!par.isWordSeparator(pos))
+ while (pos != lastpos && !par.isWordSeparator(pos))
++pos;
else if (par.isChar(pos))
while (pos != lastpos && par.isChar(pos))
--pos;
// Skip over either a non-char inset or a full word
- if (pos != 0 && !par.isLetter(pos - 1) && !par.isChar(pos - 1))
+ if (pos != 0 && par.isWordSeparator(pos - 1) && !par.isChar(pos - 1))
--pos;
- else while (pos != 0 && par.isLetter(pos - 1))
+ else while (pos != 0 && !par.isWordSeparator(pos - 1))
--pos;
} else {
// Skip over white space
while (pos != 0 && par.isSpace(pos - 1))
--pos;
- if (pos != 0 && par.isLetter(pos - 1))
- while (pos != 0 && par.isLetter(pos - 1))
+ if (pos != 0 && !par.isWordSeparator(pos - 1))
+ while (pos != 0 && !par.isWordSeparator(pos - 1))
--pos;
else if (pos != 0 && par.isChar(pos - 1))
while (pos != 0 && par.isChar(pos - 1))
// collect some information about current cursor position
temp_cur.getSurroundingPos(left_pos, right_pos);
left_is_letter =
- (left_pos > -1 ? temp_cur.paragraph().isLetter(left_pos) : false);
+ (left_pos > -1 ? !temp_cur.paragraph().isWordSeparator(left_pos) : false);
right_is_letter =
- (right_pos > -1 ? temp_cur.paragraph().isLetter(right_pos) : false);
+ (right_pos > -1 ? !temp_cur.paragraph().isWordSeparator(right_pos) : false);
// if we're not at a letter/non-letter boundary, continue moving
if (left_is_letter == right_is_letter)
// collect some information about current cursor position
temp_cur.getSurroundingPos(left_pos, right_pos);
left_is_letter =
- (left_pos > -1 ? temp_cur.paragraph().isLetter(left_pos) : false);
+ (left_pos > -1 ? !temp_cur.paragraph().isWordSeparator(left_pos) : false);
right_is_letter =
- (right_pos > -1 ? temp_cur.paragraph().isLetter(right_pos) : false);
+ (right_pos > -1 ? !temp_cur.paragraph().isWordSeparator(right_pos) : false);
// if we're not at a letter/non-letter boundary, continue moving
if (left_is_letter == right_is_letter)
}
+void Text::selectAll(Cursor & cur)
+{
+ LASSERT(this == cur.text(), /**/);
+ if (cur.lastpos() == 0 && cur.lastpit() == 0)
+ return;
+ // If the cursor is at the beginning, make sure the cursor ends there
+ if (cur.pit() == 0 && cur.pos() == 0) {
+ setCursor(cur, cur.lastpit(), getPar(cur.lastpit()).size());
+ cur.resetAnchor();
+ setCursor(cur, 0, 0);
+ } else {
+ setCursor(cur, 0, 0);
+ cur.resetAnchor();
+ setCursor(cur, cur.lastpit(), getPar(cur.lastpit()).size());
+ }
+ cur.setSelection();
+}
+
+
// Select the word currently under the cursor when no
// selection is currently set
bool Text::selectWordWhenUnderCursor(Cursor & cur, word_location loc)
{
LASSERT(this == cur.text(), /**/);
- if (!cur.selection())
- return;
+ if (!cur.selection()) {
+ Change const & change = cur.paragraph().lookupChange(cur.pos());
+ if (!(change.changed() && findNextChange(&cur.bv())))
+ return;
+ }
cur.recordUndoSelection();
pos_type right = (pit == endPit ? endPos : parSize);
if (op == ACCEPT) {
- pars_[pit].acceptChanges(cur.buffer()->params(), left, right);
+ pars_[pit].acceptChanges(left, right);
} else {
- pars_[pit].rejectChanges(cur.buffer()->params(), left, right);
+ pars_[pit].rejectChanges(left, right);
}
}
// (do not consider end-of-par)
for (pit_type pit = 0; pit < pars_size; ++pit) {
if (!pars_[pit].empty()) // prevent assertion failure
- pars_[pit].rejectChanges(bparams, 0, pars_[pit].size());
+ pars_[pit].rejectChanges(0, pars_[pit].size());
}
// next, reject imaginary end-of-par characters
// restore position
cur.pit() = min(cur.lastpit(), spit);
cur.pos() = min(cur.lastpos(), spos);
- }
+ } else
+ // this is the least that needs to be done (bug 6003)
+ // in the above case, pasteParagraphList handles this
+ cur.buffer()->updateLabels();
cur.clearSelection();
cur.resetAnchor();
return true;
void Text::getWord(CursorSlice & from, CursorSlice & to,
word_location const loc) const
{
- Paragraph const & from_par = pars_[from.pit()];
- switch (loc) {
- case WHOLE_WORD_STRICT:
- if (from.pos() == 0 || from.pos() == from_par.size()
- || !from_par.isLetter(from.pos())
- || !from_par.isLetter(from.pos() - 1)) {
- to = from;
- return;
- }
- // no break here, we go to the next
-
- case WHOLE_WORD:
- // If we are already at the beginning of a word, do nothing
- if (!from.pos() || !from_par.isLetter(from.pos() - 1))
- break;
- // no break here, we go to the next
-
- case PREVIOUS_WORD:
- // always move the cursor to the beginning of previous word
- while (from.pos() && from_par.isLetter(from.pos() - 1))
- --from.pos();
- break;
- case NEXT_WORD:
- LYXERR0("Text::getWord: NEXT_WORD not implemented yet");
- break;
- case PARTIAL_WORD:
- // no need to move the 'from' cursor
- break;
- }
to = from;
- Paragraph const & to_par = pars_[to.pit()];
- while (to.pos() < to_par.size() && to_par.isLetter(to.pos()))
- ++to.pos();
+ pars_[to.pit()].locateWord(from.pos(), to.pos(), loc);
}
// register the words in the global word list
CursorSlice sl = CursorSlice(*insetPtr);
sl.pit() = pars_.size() - 1;
- pars_.back().updateWords(sl);
+ pars_.back().updateWords();
} else if (token == "\\begin_deeper") {
++depth;
} else if (token == "\\end_deeper") {
par.params().depth(depth);
par.setFont(0, Font(inherit_font,
buf.params().language));
+ par.setPlainOrDefaultLayout(buf.params().documentClass());
pars_.push_back(par);
}
{
Paragraph const & par = cur.paragraph();
return cur.pos() > 0
- && (cur.pos() >= par.size() || !par.isLetter(cur.pos()))
- && par.isLetter(cur.pos() - 1);
+ && (cur.pos() >= par.size() || par.isWordSeparator(cur.pos()))
+ && !par.isWordSeparator(cur.pos() - 1);
}