]> git.lyx.org Git - features.git/blobdiff - src/BufferView.cpp
Refactoring: move check for match in spellignore() to buffer params.
[features.git] / src / BufferView.cpp
index 81b76916e1979a53a456aaf4959de351ce8aae82..29056b13892c8a1d1510247d02620964f0185d14 100644 (file)
@@ -50,7 +50,8 @@
 #include "insets/InsetRef.h"
 #include "insets/InsetText.h"
 
-#include "mathed/InsetMath.h"
+#include "mathed/InsetMathNest.h"
+#include "mathed/InsetMathRef.h"
 #include "mathed/MathData.h"
 #include "mathed/MathRow.h"
 
@@ -459,7 +460,10 @@ void BufferView::setSearchRequestCache(docstring const & text)
        bool matchword;
        bool forward;
        bool wrap;
-       docstring const search = string2find(text, casesensitive, matchword, forward, wrap);
+       bool instant;
+       bool onlysel;
+       docstring const search = string2find(text, casesensitive, matchword,
+                                            forward, wrap, instant, onlysel);
        theClipboard().setFindBuffer(search);
 }
 
@@ -666,13 +670,53 @@ string BufferView::contextMenu(int x, int y) const
 
        // Get inset under mouse, if there is one.
        Inset const * covering_inset = getCoveringInset(buffer_.text(), x, y);
-       if (covering_inset)
+       if (covering_inset) {
+               if (covering_inset->asInsetMath()) {
+                       CoordCache::Insets const & inset_cache =
+                               coordCache().getInsets();
+                       Inset const * inner_inset = mathContextMenu(
+                               covering_inset->asInsetMath()->asNestInset(),
+                               inset_cache, x, y);
+                       if (inner_inset)
+                               return inner_inset->contextMenu(*this, x, y);
+               }
                return covering_inset->contextMenu(*this, x, y);
+       }
 
        return buffer_.inset().contextMenu(*this, x, y);
 }
 
 
+Inset const * BufferView::mathContextMenu(InsetMathNest const * inset,
+               CoordCache::Insets const & inset_cache, int x, int y) const
+{
+       for (size_t i = 0; i < inset->nargs(); ++i) {
+               MathData const & ar = inset->cell(i);
+               for (size_t j = 0; j < ar.size(); ++j) {
+                       string const name = lyxerr.debugging(Debug::MATHED)
+                               ? insetName(ar[j].nucleus()->lyxCode())
+                               : string();
+                       LYXERR(Debug::MATHED, "Examining inset: " << name);
+                       if (!ar[j].nucleus()->contextMenuName().empty()) {
+                               if (inset_cache.covers(ar[j].nucleus(), x, y)) {
+                                       LYXERR(Debug::MATHED, "Hit inset: "
+                                              << name);
+                                       return ar[j].nucleus();
+                               }
+                       }
+                       InsetMathNest const * imn =
+                               ar[j].nucleus()->asNestInset();
+                       if (imn) {
+                               Inset const * inner =
+                                       mathContextMenu(imn, inset_cache, x, y);
+                               if (inner)
+                                       return inner;
+                       }
+               }
+       }
+       return nullptr;
+}
+
 
 void BufferView::scrollDocView(int const pixels, bool update)
 {
@@ -951,7 +995,7 @@ bool BufferView::scrollToCursor(DocIterator const & dit, bool const recenter)
          LYXERR(Debug::SCROLLING, "scrolling to cursor");
 
        CursorSlice const & bot = dit.bottom();
-       TextMetrics & tm = d->text_metrics_[bot.text()];
+       TextMetrics & tm = textMetrics(bot.text());
 
        pos_type const max_pit = pos_type(bot.text()->paragraphs().size() - 1);
        pos_type bot_pit = bot.pit();
@@ -974,15 +1018,8 @@ bool BufferView::scrollToCursor(DocIterator const & dit, bool const recenter)
                CursorSlice const & cs = dit.innerTextSlice();
                int offset = coordOffset(dit).y_;
                int ypos = pm.position() + offset;
-               Row const & row = pm.getRow(cs.pos(), dit.boundary());
-               Dimension row_dim = row.dim();
-               // FIXME: the will not be necessary anymore if Row has both a
-               // dim() which is its full dimension and a contentsDim() which
-               // is the dimension of the text only.
-               if (&row == &pm.rows().front())
-                       row_dim.asc = pm.ascent();
-               if (&row == &pm.rows().back())
-                       row_dim.des = pm.descent();
+               Dimension const & row_dim =
+                       pm.getRow(cs.pos(), dit.boundary()).dim();
                int scrolled = 0;
                if (recenter)
                        scrolled = scroll(ypos - height_/2);
@@ -1025,8 +1062,10 @@ bool BufferView::scrollToCursor(DocIterator const & dit, bool const recenter)
 
        d->anchor_pit_ = bot_pit;
        CursorSlice const & cs = dit.innerTextSlice();
+       ParagraphMetrics const & inner_pm =
+               textMetrics(cs.text()).parMetrics(cs.pit());
        Dimension const & row_dim =
-               pm.getRow(cs.pos(), dit.boundary()).dim();
+               inner_pm.getRow(cs.pos(), dit.boundary()).dim();
 
        if (recenter)
                d->anchor_ypos_ = height_/2;
@@ -1206,7 +1245,8 @@ bool BufferView::getStatus(FuncRequest const & cmd, FuncStatus & flag)
 
        case LFUN_LABEL_GOTO:
                flag.setEnabled(!cmd.argument().empty()
-                   || getInsetByCode<InsetRef>(cur, REF_CODE));
+                   || getInsetByCode<InsetRef>(cur, REF_CODE)
+                   || getInsetByCode<InsetMathRef>(cur, MATH_REF_CODE));
                break;
 
        case LFUN_CHANGES_MERGE:
@@ -1497,6 +1537,12 @@ void BufferView::dispatch(FuncRequest const & cmd, DispatchResult & dr)
                        // eventually call LFUN_PARAGRAPH_GOTO, but it seems best
                        // to have it here.
                        dr.screenUpdate(Update::Force | Update::FitCursor);
+               } else {
+                       InsetMathRef * minset =
+                               getInsetByCode<InsetMathRef>(cur, MATH_REF_CODE);
+                       if (minset)
+                               lyx::dispatch(FuncRequest(LFUN_LABEL_GOTO,
+                                                       minset->getTarget()));
                }
                break;
        }
@@ -1645,7 +1691,8 @@ void BufferView::dispatch(FuncRequest const & cmd, DispatchResult & dr)
                        break;
 
                docstring const data =
-                       find2string(searched_string, false, false, act == LFUN_WORD_FIND_FORWARD, false);
+                       find2string(searched_string, false, false,
+                                   act == LFUN_WORD_FIND_FORWARD, false, false, false);
                bool found = lyxfind(this, FuncRequest(LFUN_WORD_FIND, data));
                if (found)
                        dr.screenUpdate(Update::Force | Update::FitCursor);