]> git.lyx.org Git - lyx.git/blobdiff - src/BufferView.cpp
Revert 23154.
[lyx.git] / src / BufferView.cpp
index 9236ae8d788f2b188b379c368f95bbb39ad99adf..dd0fe6f38559c20aa1b6523caf6895c4d3ab35ae 100644 (file)
@@ -238,6 +238,13 @@ struct BufferView::Private
        ///
        vector<int> par_height_;
 
+       ///
+       DocIterator inlineCompletionPos;
+       ///
+       docstring inlineCompletion;
+       ///
+       size_t inlineCompletionUniqueChars;
+
        /// keyboard mapping object.
        Intl intl_;
 
@@ -286,15 +293,16 @@ BufferView::~BufferView()
        delete d;
 }
 
-// Put this user variable in lyxrc or pass it through setFullScreen()
-static int const max_row_width = 700;
 
 int BufferView::rightMargin() const
 {
-       if (!full_screen_ || width_ < max_row_width + 20)
-               return 10;
+       // The additional test for the case the outliner is opened.
+       if (!full_screen_ ||
+               !lyxrc.full_screen_limit ||
+               width_ < lyxrc.full_screen_width + 20)
+                       return 10;
 
-       return (width_ - max_row_width) / 2;
+       return (width_ - lyxrc.full_screen_width) / 2;
 }
 
 
@@ -777,6 +785,10 @@ void BufferView::showCursor(DocIterator const & dit)
                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_;
@@ -1356,24 +1368,14 @@ void BufferView::clearSelection()
 
 void BufferView::resize(int width, int height)
 {
-       bool initialResize = (height_ == 0);
-       
        // Update from work area
        width_ = width;
        height_ = height;
 
        // Clear the paragraph height cache.
        d->par_height_.clear();
-
+       // Redo the metrics.
        updateMetrics();
-
-       // view got his initial size, make sure that
-       // the cursor has a proper position
-       if (initialResize) {
-               updateScrollbar();
-               showCursor();
-       }
-       processUpdateFlags(Update::Force | Update::FitCursor);
 }
 
 
@@ -1415,6 +1417,7 @@ void BufferView::mouseEventDispatch(FuncRequest const & cmd0)
        // 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();
@@ -1476,13 +1479,19 @@ void BufferView::mouseEventDispatch(FuncRequest const & cmd0)
        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());
 }
 
@@ -1673,8 +1682,12 @@ bool BufferView::mouseSetCursor(Cursor & cur, bool select)
        // 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();
@@ -1687,24 +1700,7 @@ bool BufferView::mouseSetCursor(Cursor & cur, bool select)
        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();
@@ -1762,6 +1758,10 @@ bool BufferView::singleParUpdate()
        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
@@ -1798,6 +1798,10 @@ void BufferView::updateMetrics()
 
        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_];
@@ -2161,4 +2165,70 @@ void BufferView::insertPlaintextFile(FileName const & f, bool asParagraph)
        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