X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2FBufferView.cpp;h=33d9199f2e573d8075be72ae4dfd4b28800be061;hb=c378fede8bd23299bb88c5d4385beb2b43ce5312;hp=12f9c4600e6226158f99d759d4688f46cf41a862;hpb=2e1d9ee944b3d94a842eab00fc29e12aa5714413;p=lyx.git diff --git a/src/BufferView.cpp b/src/BufferView.cpp index 12f9c4600e..33d9199f2e 100644 --- a/src/BufferView.cpp +++ b/src/BufferView.cpp @@ -58,9 +58,9 @@ #include "insets/InsetCommand.h" // ChangeRefs #include "insets/InsetExternal.h" #include "insets/InsetGraphics.h" +#include "insets/InsetNote.h" #include "insets/InsetRef.h" #include "insets/InsetText.h" -#include "insets/InsetNote.h" #include "frontends/alert.h" #include "frontends/Application.h" @@ -107,10 +107,7 @@ T * getInsetByCode(Cursor const & cur, InsetCode code) return 0; } - -bool findInset(DocIterator & dit, vector const & codes, - bool same_content); - +/// Note that comparing contents can only be used for InsetCommand bool findNextInset(DocIterator & dit, vector const & codes, docstring const & contents) { @@ -118,12 +115,17 @@ bool findNextInset(DocIterator & dit, vector const & codes, while (tmpdit) { Inset const * inset = tmpdit.nextInset(); - if (inset - && std::find(codes.begin(), codes.end(), inset->lyxCode()) != codes.end() - && (contents.empty() || - static_cast(inset)->getFirstNonOptParam() == contents)) { - dit = tmpdit; - return true; + if (inset) { + bool const valid_code = std::find(codes.begin(), codes.end(), + inset->lyxCode()) != codes.end(); + InsetCommand const * ic = inset->asInsetCommand(); + bool const same_or_no_contents = contents.empty() + || (ic && (ic->getFirstNonOptParam() == contents)); + + if (valid_code && same_or_no_contents) { + dit = tmpdit; + return true; + } } tmpdit.forwardInset(); } @@ -133,6 +135,7 @@ bool findNextInset(DocIterator & dit, vector const & codes, /// Looks for next inset with one of the given codes. +/// Note that same_content can only be used for InsetCommand bool findInset(DocIterator & dit, vector const & codes, bool same_content) { @@ -142,11 +145,14 @@ bool findInset(DocIterator & dit, vector const & codes, if (!tmpdit) return false; - if (same_content) { - Inset const * inset = tmpdit.nextInset(); - if (inset - && std::find(codes.begin(), codes.end(), inset->lyxCode()) != codes.end()) { - contents = static_cast(inset)->getFirstNonOptParam(); + Inset const * inset = tmpdit.nextInset(); + if (same_content && inset) { + InsetCommand const * ic = inset->asInsetCommand(); + if (ic) { + bool const valid_code = std::find(codes.begin(), codes.end(), + ic->lyxCode()) != codes.end(); + if (valid_code) + contents = ic->getFirstNonOptParam(); } } @@ -220,7 +226,8 @@ struct BufferView::Private Private(BufferView & bv): wh_(0), cursor_(bv), anchor_pit_(0), anchor_ypos_(0), inlineCompletionUniqueChars_(0), - last_inset_(0), mouse_position_cache_(), + last_inset_(0), clickable_inset_(false), + mouse_position_cache_(), bookmark_edit_position_(-1), gui_(0) {} @@ -263,6 +270,8 @@ struct BufferView::Private * Not owned, so don't delete. */ Inset * last_inset_; + /// are we hovering something that we can click + bool clickable_inset_; /// position of the mouse at the time of the last mouse move /// This is used to update the hovering status of inset in @@ -1484,7 +1493,9 @@ void BufferView::dispatch(FuncRequest const & cmd, DispatchResult & dr) bool const fw = act == LFUN_WORD_FIND_FORWARD; docstring const data = find2string(searched_string, true, false, fw); - find(this, FuncRequest(LFUN_WORD_FIND, data)); + bool found = lyxfind(this, FuncRequest(LFUN_WORD_FIND, data)); + if (found) + dr.screenUpdate(Update::Force | Update::FitCursor); break; } @@ -1496,8 +1507,8 @@ void BufferView::dispatch(FuncRequest const & cmd, DispatchResult & dr) lyx::dispatch(FuncRequest(LFUN_DIALOG_SHOW, "findreplace")); break; } - if (find(this, req)) - showCursor(); + if (lyxfind(this, req)) + dr.screenUpdate(Update::Force | Update::FitCursor); else message(_("String not found!")); d->search_request_cache_ = req; @@ -1511,14 +1522,17 @@ void BufferView::dispatch(FuncRequest const & cmd, DispatchResult & dr) DocIterator end = cur.selectionEnd(); if (beg.pit() == end.pit()) { for (pos_type p = beg.pos() ; p < end.pos() ; ++p) { - if (!cur.inMathed() - && cur.paragraph().isDeleted(p)) + if (!cur.inMathed() && cur.paragraph().isDeleted(p)) { has_deleted = true; + break; + } } } } - replace(this, cmd, has_deleted); - dr.forceBufferUpdate(); + if (lyxreplace(this, cmd, has_deleted)) { + dr.forceBufferUpdate(); + dr.screenUpdate(Update::Force | Update::FitCursor); + } break; } @@ -1527,9 +1541,7 @@ void BufferView::dispatch(FuncRequest const & cmd, DispatchResult & dr) istringstream iss(to_utf8(cmd.argument())); iss >> opt; if (findAdv(this, opt)) - cur.dispatched(); - else - cur.undispatched(); + dr.screenUpdate(Update::Force | Update::FitCursor); break; } @@ -1834,7 +1846,7 @@ void BufferView::dispatch(FuncRequest const & cmd, DispatchResult & dr) icp["key"] = from_utf8(arg); if (!opt1.empty()) icp["before"] = from_utf8(opt1); - string icstr = InsetCommand::params2string("citation", icp); + string icstr = InsetCommand::params2string(icp); FuncRequest fr(LFUN_INSET_INSERT, icstr); lyx::dispatch(fr); break; @@ -1854,12 +1866,10 @@ void BufferView::dispatch(FuncRequest const & cmd, DispatchResult & dr) } cur.recordUndo(); FuncRequest fr(LFUN_INSET_MODIFY, cmd.argument()); - // FIXME There may be some cases where the inset knows that - // single par update would be good enough, but it has no way - // to tell us that at the moment. inset->dispatch(cur, fr); - dr.screenUpdate(Update::Force | Update::FitCursor); - dr.forceBufferUpdate(); + dr.screenUpdate(cur.result().screenUpdate()); + if (cur.result().needBufferUpdate()) + dr.forceBufferUpdate(); break; } @@ -1958,8 +1968,12 @@ Inset const * BufferView::getCoveringInset(Text const & text, void BufferView::updateHoveredInset() const { // Get inset under mouse, if there is one. - Inset const * covering_inset = getCoveringInset(buffer_.text(), - d->mouse_position_cache_.x_, d->mouse_position_cache_.y_); + int const x = d->mouse_position_cache_.x_; + int const y = d->mouse_position_cache_.y_; + Inset const * covering_inset = getCoveringInset(buffer_.text(), x, y); + + d->clickable_inset_ = covering_inset && covering_inset->clickable(x, y); + if (covering_inset == d->last_inset_) // Same inset, no need to do anything... return; @@ -2341,9 +2355,6 @@ void BufferView::putSelectionAt(DocIterator const & cur, } else d->cursor_.setSelection(d->cursor_, length); } - // Ensure a redraw happens in any case because the new selection could - // possibly be on the same screen as the previous selection. - processUpdateFlags(Update::Force | Update::FitCursor); } @@ -2502,7 +2513,7 @@ void BufferView::insertLyXFile(FileName const & fname) docstring res; Buffer buf("", false); - if (buf.loadLyXFile(filename)) { + if (buf.loadLyXFile(filename) == Buffer::ReadSuccess) { ErrorList & el = buffer_.errorList("Parse"); // Copy the inserted document error list into the current buffer one. el = buf.errorList("Parse"); @@ -2890,4 +2901,10 @@ void BufferView::setInlineCompletion(Cursor & cur, DocIterator const & pos, } } + +bool BufferView::clickableInset() const +{ + return d->clickable_inset_; +} + } // namespace lyx