if (par.getDepth() == 0)
return pars_.size();
- return depthHook(par_offset, depth_type(par.getDepth() - 1));
+ return depthHook(par_offset, par.getDepth() - 1);
}
void Text::readParToken(Paragraph & par, Lexer & lex,
string const & token, Font & font, Change & change, ErrorList & errorList)
{
- Buffer * buf = const_cast<Buffer *>(&owner_->buffer());
+ Buffer * buf = &owner_->buffer();
BufferParams & bp = buf->params();
if (token[0] != '\\') {
pos_type pos = cur.pos();
// The special chars we handle
- map<wchar_t, InsetSpecialChar::Kind> specialchars;
- specialchars[0x200c] = InsetSpecialChar::LIGATURE_BREAK;
- specialchars[0x200b] = InsetSpecialChar::ALLOWBREAK;
- specialchars[0x2026] = InsetSpecialChar::LDOTS;
- specialchars[0x2011] = InsetSpecialChar::NOBREAKDASH;
+ static map<wchar_t, InsetSpecialChar::Kind> specialchars = {
+ { 0x200c, InsetSpecialChar::LIGATURE_BREAK },
+ { 0x200b, InsetSpecialChar::ALLOWBREAK },
+ { 0x2026, InsetSpecialChar::LDOTS },
+ { 0x2011, InsetSpecialChar::NOBREAKDASH }
+ };
// insert the string, don't insert doublespace
bool space_inserted = true;
++pos;
space_inserted = true;
}
- } else if (specialchars.find(ch) != specialchars.end()) {
- if (par.insertInset(pos, new InsetSpecialChar(specialchars.find(ch)->second),
- font, bparams.track_changes ?
- Change(Change::INSERTED)
- : Change(Change::UNCHANGED)))
- ++pos;
+ } else if (specialchars.find(ch) != specialchars.end()
+ && (par.insertInset(pos, new InsetSpecialChar(specialchars.find(ch)->second),
+ font, bparams.track_changes
+ ? Change(Change::INSERTED)
+ : Change(Change::UNCHANGED)))) {
+ ++pos;
space_inserted = false;
} else if (!isPrintable(ch)) {
// Ignore (other) unprintables
}
+void Text::expandWordSel(Cursor & cur)
+{
+ // get selection of word around cur
+ Cursor c = cur;
+ c.selection(false);
+ c.text()->selectWord(c, WHOLE_WORD);
+ // use the correct word boundary, depending on selection direction
+ if (cur.top() > cur.normalAnchor())
+ cur.pos() = c.selEnd().pos();
+ else
+ cur.pos() = c.selBegin().pos();
+}
+
+
void Text::selectAll(Cursor & cur)
{
LBUFERR(this == cur.text());
}
// finally, invoke the DEPM
- deleteEmptyParagraphMechanism(begPit, endPit, cur.buffer()->params().track_changes);
+ deleteEmptyParagraphMechanism(begPit, endPit, begPos, endPos,
+ cur.buffer()->params().track_changes);
cur.finishUndo();
cur.clearSelection();
}
pasteParagraphList(cur, plist, b.params().documentClassPtr(),
+ b.params().authors(),
b.errorList("Paste"));
}
if (!par.empty() && cur.pos() < par.size()) {
// Force output of code point, not character
size_t const c = par.getChar(cur.pos());
- os << _(", Char: 0x") << hex << c;
+ if (c == META_INSET)
+ os << ", Char: INSET";
+ else
+ os << _(", Char: 0x") << hex << c;
}
os << _(", Boundary: ") << cur.boundary();
// Row & row = cur.textRow();
bool Text::completionSupported(Cursor const & cur) const
{
Paragraph const & par = cur.paragraph();
- return !cur.selection()
+ return !cur.buffer()->isReadonly()
+ && !cur.selection()
&& cur.pos() > 0
&& (cur.pos() >= par.size() || par.isWordSeparator(cur.pos()))
&& !par.isWordSeparator(cur.pos() - 1);
}
-bool Text::insertCompletion(Cursor & cur, docstring const & s, bool /*finished*/)
+bool Text::insertCompletion(Cursor & cur, docstring const & s)
{
LBUFERR(cur.bv().cursor() == cur);
+ if (cur.buffer()->isReadonly())
+ return false;
+ cur.recordUndo();
cur.insert(s);
cur.bv().cursor() = cur;
if (!(cur.result().screenUpdate() & Update::Force))