]> git.lyx.org Git - lyx.git/blobdiff - src/BufferView.cpp
Account for old versions of Pygments
[lyx.git] / src / BufferView.cpp
index fad015480ec97a8f49f0c26d5dd782ca6f5872e8..77ab989d193962f602d96435b8c0fbc1f41e0128 100644 (file)
@@ -351,8 +351,8 @@ BufferView::~BufferView()
 
 int BufferView::rightMargin() const
 {
-       // The value used to be hardcoded to 10, which is 2.5mm at 100dpi
-       int const default_margin = Length(2.5, Length::MM).inPixels(0);
+       // The value used to be hardcoded to 10, which is 0.1in at 100dpi
+       int const default_margin = Length(0.1, Length::IN).inPixels(0);
        // The additional test for the case the outliner is opened.
        if (!full_screen_ || !lyxrc.full_screen_limit
            || width_ < lyxrc.full_screen_width + 2 * default_margin)
@@ -368,6 +368,13 @@ int BufferView::leftMargin() const
 }
 
 
+int BufferView::inPixels(Length const & len) const
+{
+       Font const font = buffer().params().getFont();
+       return len.inPixels(workWidth(), theFontMetrics(font).em());
+}
+
+
 bool BufferView::isTopScreen() const
 {
        return 0 == d->scrollbarParameters_.min;
@@ -495,9 +502,7 @@ void BufferView::processUpdateFlags(Update::flags flags)
 
        // updateMetrics() does not update paragraph position
        // This is done at draw() time. So we need a redraw!
-       // We pass true so that metrics are computed for the sake
-       // of having MacroData updated.
-       buffer_.changed(true);
+       buffer_.changed(false);
 
        if (needsFitCursor()) {
                // The cursor is off screen so ensure it is visible.
@@ -1030,7 +1035,10 @@ bool BufferView::getStatus(FuncRequest const & cmd, FuncStatus & flag)
        if (buffer_.isReadonly()
            && !lyxaction.funcHasFlag(act, LyXAction::ReadOnly)
            && !lyxaction.funcHasFlag(act, LyXAction::NoBuffer)) {
-               flag.message(from_utf8(N_("Document is read-only")));
+               if (buffer_.hasReadonlyFlag())
+                       flag.message(from_utf8(N_("Document is read-only")));
+               else
+                       flag.message(from_utf8(N_("Document has been modified externally")));
                flag.setEnabled(false);
                return true;
        }
@@ -1413,7 +1421,11 @@ void BufferView::dispatch(FuncRequest const & cmd, DispatchResult & dr)
 
        case LFUN_PARAGRAPH_GOTO: {
                int const id = convert<int>(cmd.getArg(0));
-               int const pos = convert<int>(cmd.getArg(1));
+               pos_type const pos = convert<int>(cmd.getArg(1));
+               if (id < 0)
+                       break;
+               string const str_id_end = cmd.getArg(2);
+               string const str_pos_end = cmd.getArg(3);
                int i = 0;
                for (Buffer * b = &buffer_; i == 0 || b != &buffer_;
                        b = theBufferList().next(b)) {
@@ -1430,10 +1442,20 @@ void BufferView::dispatch(FuncRequest const & cmd, DispatchResult & dr)
                                << b->absFileName() << "'.");
 
                        if (b == &buffer_) {
-                               // Set the cursor
-                               cur.pos() = pos;
-                               mouseSetCursor(cur);
-                               dr.screenUpdate(Update::Force | Update::FitCursor);
+                               bool success;
+                               if (str_id_end.empty() || str_pos_end.empty()) {
+                                       // Set the cursor
+                                       cur.pos() = pos;
+                                       mouseSetCursor(cur);
+                                       success = true;
+                               } else {
+                                       int const id_end = convert<int>(str_id_end);
+                                       pos_type const pos_end = convert<int>(str_pos_end);
+                                       success = setCursorFromEntries({id, pos},
+                                                                      {id_end, pos_end});
+                               }
+                               if (success)
+                                       dr.screenUpdate(Update::Force | Update::FitCursor);
                        } else {
                                // Switch to other buffer view and resend cmd
                                lyx::dispatch(FuncRequest(
@@ -2167,9 +2189,7 @@ void BufferView::updateHoveredInset() const
 
                // This event (moving without mouse click) is not passed further.
                // This should be changed if it is further utilized.
-               // We pass true so that metrics are computed for the sake
-               // of having MacroData updated.
-               buffer_.changed(true);
+               buffer_.changed(false);
        }
 }
 
@@ -2333,58 +2353,35 @@ int BufferView::scrollUp(int offset)
 }
 
 
-void BufferView::setCursorFromRow(int row)
+bool BufferView::setCursorFromRow(int row)
 {
-       setCursorFromRow(row, buffer_.texrow());
+       TexRow::TextEntry start, end;
+       tie(start,end) = buffer_.texrow().getEntriesFromRow(row);
+       LYXERR(Debug::LATEX,
+              "setCursorFromRow: for row " << row << ", TexRow has found "
+              "start (id=" << start.id << ",pos=" << start.pos << "), "
+              "end (id=" << end.id << ",pos=" << end.pos << ")");
+       return setCursorFromEntries(start, end);
 }
 
 
-void BufferView::setCursorFromRow(int row, TexRow const & texrow)
+bool BufferView::setCursorFromEntries(TexRow::TextEntry start,
+                                      TexRow::TextEntry end)
 {
-       int tmpid;
-       int tmppos;
-       pit_type newpit = 0;
-       pos_type newpos = 0;
-
-       texrow.getIdFromRow(row, tmpid, tmppos);
-
-       bool posvalid = (tmpid != -1);
-       if (posvalid) {
-               // we need to make sure that the row and position
-               // we got back are valid, because the buffer may well
-               // have changed since we last generated the LaTeX.
-               DocIterator dit = buffer_.getParFromID(tmpid);
-               if (dit == doc_iterator_end(&buffer_))
-                       posvalid = false;
-               else if (dit.depth() > 1) {
-                       // We are in an inset.
-                       pos_type lastpos = dit.lastpos();
-                       dit.pos() = tmppos > lastpos ? lastpos : tmppos;
-                       setCursor(dit);
-                       recenter();
-                       return;
-               } else {
-                       newpit = dit.pit();
-                       // now have to check pos.
-                       newpos = tmppos;
-                       Paragraph const & par = buffer_.text().getPar(newpit);
-                       if (newpos > par.size()) {
-                               LYXERR0("Requested position no longer valid.");
-                               newpos = par.size() - 1;
-                       }
-               }
-       }
-       if (!posvalid) {
-               frontend::Alert::error(_("Inverse Search Failed"),
-                       _("Invalid position requested by inverse search.\n"
-                   "You need to update the viewed document."));
-               return;
+       DocIterator dit_start, dit_end;
+       tie(dit_start,dit_end) =
+               TexRow::getDocIteratorsFromEntries(start, end, buffer_);
+       if (!dit_start)
+               return false;
+       // Setting selection start
+       d->cursor_.clearSelection();
+       setCursor(dit_start);
+       // Setting selection end
+       if (dit_end) {
+               d->cursor_.resetAnchor();
+               setCursorSelectionTo(dit_end);
        }
-       d->cursor_.reset();
-       buffer_.text().setCursor(d->cursor_, newpit, newpos);
-       d->cursor_.selection(false);
-       d->cursor_.resetAnchor();
-       recenter();
+       return true;
 }
 
 
@@ -2478,6 +2475,18 @@ void BufferView::setCursor(DocIterator const & dit)
 }
 
 
+void BufferView::setCursorSelectionTo(DocIterator const & dit)
+{
+       size_t const n = dit.depth();
+       for (size_t i = 0; i < n; ++i)
+               dit[i].inset().edit(d->cursor_, true);
+
+       d->cursor_.selection(true);
+       d->cursor_.setCursorSelectionTo(dit);
+       d->cursor_.setCurrentFont();
+}
+
+
 bool BufferView::checkDepm(Cursor & cur, Cursor & old)
 {
        // Would be wrong to delete anything if we have a selection.
@@ -2505,7 +2514,7 @@ bool BufferView::checkDepm(Cursor & cur, Cursor & old)
 }
 
 
-bool BufferView::mouseSetCursor(Cursor & cur, bool select)
+bool BufferView::mouseSetCursor(Cursor & cur, bool const select)
 {
        LASSERT(&cur.bv() == this, return false);
 
@@ -2523,27 +2532,23 @@ bool BufferView::mouseSetCursor(Cursor & cur, bool select)
        if (leftinset)
                d->cursor_.fixIfBroken();
 
-       // FIXME: shift-mouse selection doesn't work well across insets.
-       bool const do_selection =
-                       select && &d->cursor_.normalAnchor().inset() == &cur.inset();
-
        // do the dEPM magic if needed
        // FIXME: (1) move this to InsetText::notifyCursorLeaves?
        // FIXME: (2) if we had a working InsetText::notifyCursorLeaves,
        // the leftinset bool would not be necessary (badcursor instead).
        bool update = leftinset;
-       if (!do_selection && d->cursor_.inTexted())
-               update |= checkDepm(cur, d->cursor_);
 
-       if (!do_selection)
-               d->cursor_.resetAnchor();
-       d->cursor_.setCursor(cur);
-       d->cursor_.boundary(cur.boundary());
-       if (do_selection)
+       if (select) {
                d->cursor_.setSelection();
-       else
+               d->cursor_.setCursorSelectionTo(cur);
+       } else {
+               if (d->cursor_.inTexted())
+                       update |= checkDepm(cur, d->cursor_);
+               d->cursor_.resetAnchor();
+               d->cursor_.setCursor(cur);
                d->cursor_.clearSelection();
-
+       }
+       d->cursor_.boundary(cur.boundary());
        d->cursor_.finishUndo();
        d->cursor_.setCurrentFont();
        if (update)
@@ -2809,19 +2814,7 @@ Point BufferView::coordOffset(DocIterator const & dit) const
                }
 
                // remember width for the case that sl.inset() is positioned in an RTL inset
-               if (i && dit[i - 1].text()) {
-                       // If this Inset is inside a Text Inset, retrieve the Dimension
-                       // from the containing text instead of using Inset::dimension() which
-                       // might not be implemented.
-                       // FIXME (Abdel 23/09/2007): this is a bit messy because of the
-                       // elimination of Inset::dim_ cache. This coordOffset() method needs
-                       // to be rewritten in light of the new design.
-                       Dimension const & dim = coordCache().getInsets().dim(&sl.inset());
-                       lastw = dim.wid;
-               } else {
-                       Dimension const dim = sl.inset().dimension(*this);
-                       lastw = dim.wid;
-               }
+               lastw = sl.inset().dimension(*this).wid;
 
                //lyxerr << "Cursor::getPos, i: "
                // << i << " x: " << xx << " y: " << y << endl;
@@ -2896,7 +2889,7 @@ bool BufferView::paragraphVisible(DocIterator const & dit) const
 void BufferView::cursorPosAndHeight(Point & p, int & h) const
 {
        Cursor const & cur = cursor();
-       Font const font = cur.getFont();
+       Font const font = cur.real_current_font;
        frontend::FontMetrics const & fm = theFontMetrics(font);
        int const asc = fm.maxAscent();
        int const des = fm.maxDescent();