///
vector<int> par_height_;
+ ///
+ DocIterator inlineCompletionPos;
+ ///
+ docstring inlineCompletion;
+ ///
+ size_t inlineCompletionUniqueChars;
+
/// keyboard mapping object.
Intl intl_;
return;
}
+ // fix inline completion position
+ if (d->inlineCompletionPos.fixIfBroken())
+ d->inlineCompletionPos = DocIterator();
+
tm.redoParagraph(bot_pit);
ParagraphMetrics const & pm = tm.parMetrics(bot_pit);
int offset = coordOffset(dit, dit.boundary()).y_;
// LFUN_FILE_OPEN generated by drag-and-drop.
FuncRequest cmd = cmd0;
+ Cursor old = cursor();
Cursor cur(*this);
cur.push(buffer_.inset());
cur.selection() = d->cursor_.selection();
if (!cur.result().dispatched())
cur.dispatch(cmd);
- //Do we have a selection?
+ // Notify left insets
+ if (cur != old) {
+ old.fixIfBroken();
+ bool badcursor = notifyCursorLeaves(old, cur);
+ if (badcursor)
+ cursor().fixIfBroken();
+ }
+
+ // Do we have a selection?
theSelection().haveSelection(cursor().selection());
// If the command has been dispatched,
- if (cur.result().dispatched()
- // an update is asked,
- && cur.result().update())
+ if (cur.result().dispatched() || cur.result().update())
processUpdateFlags(cur.result().update());
}
// Has the cursor just left the inset?
bool badcursor = false;
bool leftinset = (&d->cursor_.inset() != &cur.inset());
- if (leftinset)
+ if (leftinset) {
+ d->cursor_.fixIfBroken();
badcursor = notifyCursorLeaves(d->cursor_, cur);
+ if (badcursor)
+ cur.fixIfBroken();
+ }
// FIXME: shift-mouse selection doesn't work well across insets.
bool do_selection = select && &d->cursor_.anchor().inset() == &cur.inset();
if (!do_selection && !badcursor && d->cursor_.inTexted())
update |= checkDepm(cur, d->cursor_);
- // if the cursor was in an empty script inset and the new
- // position is in the nucleus of the inset, notifyCursorLeaves
- // will kill the script inset itself. So we check all the
- // elements of the cursor to make sure that they are correct.
- // For an example, see bug 2933:
- // http://bugzilla.lyx.org/show_bug.cgi?id=2933
- // The code below could maybe be moved to a DocIterator method.
- //lyxerr << "cur before " << cur << endl;
- DocIterator dit = doc_iterator_begin(cur.inset());
- dit.bottom() = cur.bottom();
- size_t i = 1;
- while (i < cur.depth() && dit.nextInset() == &cur[i].inset()) {
- dit.push_back(cur[i]);
- ++i;
- }
- //lyxerr << "5 cur after" << dit <<endl;
-
- d->cursor_.setCursor(dit);
+ d->cursor_.setCursor(cur);
d->cursor_.boundary(cur.boundary());
if (do_selection)
d->cursor_.setSelection();
TextMetrics & tm = textMetrics(&buftext);
int old_height = tm.parMetrics(bottom_pit).height();
+ // make sure inline completion pointer is ok
+ if (d->inlineCompletionPos.fixIfBroken())
+ d->inlineCompletionPos = DocIterator();
+
// In Single Paragraph mode, rebreak only
// the (main text, not inset!) paragraph containing the cursor.
// (if this paragraph contains insets etc., rebreaking will
TextMetrics & tm = textMetrics(&buftext);
+ // make sure inline completion pointer is ok
+ if (d->inlineCompletionPos.fixIfBroken())
+ d->inlineCompletionPos = DocIterator();
+
// Rebreak anchor paragraph.
tm.redoParagraph(d->anchor_pit_);
ParagraphMetrics & anchor_pm = tm.par_metrics_[d->anchor_pit_];
buffer_.changed();
}
+
+docstring const & BufferView::inlineCompletion() const
+{
+ return d->inlineCompletion;
+}
+
+
+size_t const & BufferView::inlineCompletionUniqueChars() const
+{
+ return d->inlineCompletionUniqueChars;
+}
+
+
+DocIterator const & BufferView::inlineCompletionPos() const
+{
+ return d->inlineCompletionPos;
+}
+
+
+bool samePar(DocIterator const & a, DocIterator const & b)
+{
+ if (a.empty() && b.empty())
+ return true;
+ if (a.empty() || b.empty())
+ return false;
+ return &a.innerParagraph() == &b.innerParagraph();
+}
+
+
+void BufferView::setInlineCompletion(Cursor & cur, DocIterator const & pos,
+ docstring const & completion, size_t uniqueChars)
+{
+ uniqueChars = min(completion.size(), uniqueChars);
+ bool changed = d->inlineCompletion != completion
+ || d->inlineCompletionUniqueChars != uniqueChars;
+ bool singlePar = true;
+ d->inlineCompletion = completion;
+ d->inlineCompletionUniqueChars = min(completion.size(), uniqueChars);
+
+ //lyxerr << "setInlineCompletion pos=" << pos << " completion=" << completion << " uniqueChars=" << uniqueChars << std::endl;
+
+ // at new position?
+ DocIterator const & old = d->inlineCompletionPos;
+ if (old != pos) {
+ //lyxerr << "inlineCompletionPos changed" << std::endl;
+ // old or pos are in another paragraph?
+ if ((!samePar(cur, pos) && !pos.empty())
+ || (!samePar(cur, old) && !old.empty())) {
+ singlePar = false;
+ //lyxerr << "different paragraph" << std::endl;
+ }
+ d->inlineCompletionPos = pos;
+ }
+
+ // set update flags
+ if (changed) {
+ //lyxerr << "inlineCompletion changed" << std::endl;
+
+ Update::flags flags
+ = cur.disp_.update() | Update::Force;
+ if (singlePar && !(flags | Update::SinglePar))
+ flags = flags | Update::SinglePar;
+ cur.updateFlags(flags);
+ }
+}
+
} // namespace lyx