}
+Text::Text(InsetText * owner, bool use_default_layout)
+ : owner_(owner), autoBreakRows_(false), undo_counter_(0)
+{
+ pars_.push_back(Paragraph());
+ Paragraph & par = pars_.back();
+ par.setInsetOwner(owner);
+ DocumentClass const & dc = owner->buffer().params().documentClass();
+ if (use_default_layout)
+ par.setDefaultLayout(dc);
+ else
+ par.setPlainLayout(dc);
+}
+
+
+Text::Text(InsetText * owner, Text const & text)
+ : owner_(owner), autoBreakRows_(text.autoBreakRows_), undo_counter_(0)
+{
+ pars_ = text.pars_;
+ ParagraphList::iterator const end = pars_.end();
+ ParagraphList::iterator it = pars_.begin();
+ for (; it != end; ++it)
+ it->setInsetOwner(owner);
+}
+
+
pit_type Text::depthHook(pit_type pit, depth_type depth) const
{
pit_type newpit = pit;
void Text::readParToken(Paragraph & par, Lexer & lex,
string const & token, Font & font, Change & change, ErrorList & errorList)
{
- Buffer const & buf = owner_->buffer();
- BufferParams const & bp = buf.params();
+ Buffer * buf = const_cast<Buffer *>(&owner_->buffer());
+ BufferParams const & bp = buf->params();
if (token[0] != '\\') {
docstring dstr = lex.getDocString();
}
} else if (token == "\\numeric") {
lex.next();
- font.fontInfo().setNumber(font.setLyXMisc(lex.getString()));
+ font.fontInfo().setNumber(setLyXMisc(lex.getString()));
} else if (token == "\\emph") {
lex.next();
- font.fontInfo().setEmph(font.setLyXMisc(lex.getString()));
+ font.fontInfo().setEmph(setLyXMisc(lex.getString()));
} else if (token == "\\bar") {
lex.next();
string const tok = lex.getString();
"`$$Token'");
} else if (token == "\\strikeout") {
lex.next();
- font.fontInfo().setStrikeout(font.setLyXMisc(lex.getString()));
+ font.fontInfo().setStrikeout(setLyXMisc(lex.getString()));
} else if (token == "\\uuline") {
lex.next();
- font.fontInfo().setUuline(font.setLyXMisc(lex.getString()));
+ font.fontInfo().setUuline(setLyXMisc(lex.getString()));
} else if (token == "\\uwave") {
lex.next();
- font.fontInfo().setUwave(font.setLyXMisc(lex.getString()));
+ font.fontInfo().setUwave(setLyXMisc(lex.getString()));
} else if (token == "\\noun") {
lex.next();
- font.fontInfo().setNoun(font.setLyXMisc(lex.getString()));
+ font.fontInfo().setNoun(setLyXMisc(lex.getString()));
} else if (token == "\\color") {
lex.next();
setLyXColor(lex.getString(), font.fontInfo());
auto_ptr<Inset> inset;
inset.reset(new InsetSpecialChar);
inset->read(lex);
- inset->setBuffer(const_cast<Buffer &>(buf));
+ inset->setBuffer(*buf);
par.insertInset(par.size(), inset.release(), font, change);
} else if (token == "\\backslash") {
par.appendChar('\\', font, change);
} else if (token == "\\LyXTable") {
- auto_ptr<Inset> inset(new InsetTabular(const_cast<Buffer &>(buf)));
+ auto_ptr<Inset> inset(new InsetTabular(buf));
inset->read(lex);
par.insertInset(par.size(), inset.release(), font, change);
} else if (token == "\\lyxline") {
auto_ptr<Inset> inset;
inset.reset(new InsetLine);
- inset->setBuffer(const_cast<Buffer &>(buf));
+ inset->setBuffer(*buf);
par.insertInset(par.size(), inset.release(), font, change);
} else if (token == "\\change_unchanged") {
change = Change(Change::UNCHANGED);
{
public:
///
- TextCompletionList(Cursor const & cur)
- : buffer_(cur.buffer()), pos_(0)
+ TextCompletionList(Cursor const & cur, WordList const * list)
+ : buffer_(cur.buffer()), pos_(0), list_(list)
{}
///
virtual ~TextCompletionList() {}
///
virtual size_t size() const
{
- return theWordList().size();
+ return list_->size();
}
///
virtual docstring const & data(size_t idx) const
{
- return theWordList().word(idx);
+ return list_->word(idx);
}
private:
Buffer const * buffer_;
///
size_t pos_;
+ ///
+ WordList const * list_;
};
DocumentClass const & tclass = cur.buffer()->params().documentClass();
Layout const & layout = cpar.layout();
- // this is only allowed, if the current paragraph is not empty
- // or caption and if it has not the keepempty flag active
- if (cur.lastpos() == 0 && !cpar.allowEmpty() &&
- layout.labeltype != LABEL_SENSITIVE)
+ if (cur.lastpos() == 0 && !cpar.allowEmpty()) {
+ if (changeDepthAllowed(cur, DEC_DEPTH))
+ changeDepth(cur, DEC_DEPTH);
+ else
+ setLayout(cur, tclass.defaultLayoutName());
return;
+ }
// a layout change may affect also the following paragraph
recUndo(cur, cur.pit(), undoSpan(cur.pit()) - 1);
break; // the character couldn't be deleted physically due to change tracking
}
- cur.buffer()->updateLabels();
+ cur.buffer()->updateBuffer();
// A singlePar update is not enough in this case.
cur.updateFlags(Update::Force);
cur.checkBufferStructure();
// cur.updateFlags(Update::Force);
- bool boundary = tm.isRTLBoundary(cur.pit(), cur.pos() + 1);
+ bool boundary = cur.boundary()
+ || tm.isRTLBoundary(cur.pit(), cur.pos() + 1);
setCursor(cur, cur.pit(), cur.pos() + 1, false, boundary);
charInserted(cur);
}
// Here we call finishUndo for every 20 characters inserted.
// This is from my experience how emacs does it. (Lgb)
- static unsigned int counter;
- if (counter < 20) {
- ++counter;
+ if (undo_counter_ < 20) {
+ ++undo_counter_;
} else {
cur.finishUndo();
- counter = 0;
+ undo_counter_ = 0;
}
// register word if a non-letter was entered
setCursor(cur, from.pit(), from.pos());
if (to == from)
return;
- cur.resetAnchor();
+ if (!cur.selection())
+ cur.resetAnchor();
setCursor(cur, to.pit(), to.pos());
cur.setSelection();
+ cur.setWordSelection(true);
}
cur.clearSelection();
setCursorIntern(cur, begPit, begPos);
cur.updateFlags(Update::Force);
- cur.buffer()->updateLabels();
+ cur.buffer()->updateBuffer();
}
cur.recordUndo(ATOMIC_UNDO, prevcur.pit());
mergeParagraph(bufparams, cur.text()->paragraphs(),
prevcur.pit());
- cur.buffer()->updateLabels();
+ cur.buffer()->updateBuffer();
setCursorIntern(cur, prevcur.pit(), prevcur.pos());
cur.updateFlags(Update::Force);
return true;
cur.top().forwardPos();
if (was_inset)
- cur.buffer()->updateLabels();
+ cur.buffer()->updateBuffer();
else
cur.checkBufferStructure();
needsUpdate = true;
}
if (needsUpdate) {
- cur.buffer()->updateLabels();
+ cur.buffer()->updateBuffer();
setCursorIntern(cur, prevcur.pit(), prevcur.pos());
}
bool const was_inset = cur.paragraph().isInset(cur.pos());
cur.paragraph().eraseChar(cur.pos(), cur.buffer()->params().trackChanges);
if (was_inset)
- cur.buffer()->updateLabels();
+ cur.buffer()->updateBuffer();
else
cur.checkBufferStructure();
}
} else
// this is the least that needs to be done (bug 6003)
// in the above case, pasteParagraphList handles this
- cur.buffer()->updateLabels();
+ cur.buffer()->updateBuffer();
+
+ // Ensure the current language is set correctly (bug 6292)
+ cur.text()->setCursor(cur, cur.pit(), cur.pos());
cur.clearSelection();
cur.resetAnchor();
return true;
CompletionList const * Text::createCompletionList(Cursor const & cur) const
{
- return new TextCompletionList(cur);
+ WordList const * list = theWordList(*cur.getFont().language());
+ return new TextCompletionList(cur, list);
}