X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2FBufferView.cpp;h=b46be350b850010964b3c6322381b7dd86cda0ba;hb=2455bc258f3b62c29ec4a41cb88070ff8518e842;hp=85ac21a8e34dc280191ebd2e1d8190c0f1c905a6;hpb=2dfc84a22cafff1de7869b92e85c838da8def49f;p=lyx.git diff --git a/src/BufferView.cpp b/src/BufferView.cpp index 85ac21a8e3..b46be350b8 100644 --- a/src/BufferView.cpp +++ b/src/BufferView.cpp @@ -16,6 +16,7 @@ #include "BufferView.h" +#include "BranchList.h" #include "Buffer.h" #include "buffer_funcs.h" #include "BufferList.h" @@ -58,6 +59,7 @@ #include "insets/InsetGraphics.h" #include "insets/InsetRef.h" #include "insets/InsetText.h" +#include "insets/InsetNote.h" #include "frontends/alert.h" #include "frontends/Application.h" @@ -280,7 +282,7 @@ BufferView::BufferView(Buffer & buf) d->cursor_.setCurrentFont(); if (graphics::Previews::status() != LyXRC::PREVIEW_OFF) - graphics::Previews::get().generateBufferPreviews(buffer_); + thePreviews().generateBufferPreviews(buffer_); } @@ -294,7 +296,7 @@ BufferView::~BufferView() LastFilePosSection::FilePos fp; fp.pit = d->cursor_.bottom().pit(); fp.pos = d->cursor_.bottom().pos(); - LyX::ref().session().lastFilePos().save(buffer_.fileName(), fp); + theSession().lastFilePos().save(buffer_.fileName(), fp); delete d; } @@ -456,7 +458,7 @@ void BufferView::processUpdateFlags(Update::flags flags) void BufferView::updateScrollbar() { - if (height_ == 0) + if (height_ == 0 && width_ == 0) return; // We prefer fixed size line scrolling. @@ -546,6 +548,8 @@ void BufferView::scrollDocView(int value) // If the offset is less than 2 screen height, prefer to scroll instead. if (abs(offset) <= 2 * height_) { scroll(offset); + updateMetrics(); + buffer_.changed(); return; } @@ -655,7 +659,7 @@ void BufferView::saveBookmark(unsigned int idx) // acturately locate a bookmark in a 'live' lyx session. // pit and pos will be updated with bottom level pit/pos // when lyx exits. - LyX::ref().session().bookmarks().save( + theSession().bookmarks().save( buffer_.fileName(), d->cursor_.bottom().pit(), d->cursor_.bottom().pos(), @@ -794,11 +798,16 @@ void BufferView::showCursor(DocIterator const & dit) int ypos = pm.position() + offset; Dimension const & row_dim = pm.getRow(cs.pos(), dit.boundary()).dimension(); + int scrolled = 0; if (ypos - row_dim.ascent() < 0) - scrollUp(- ypos + row_dim.ascent()); + scrolled = scrollUp(- ypos + row_dim.ascent()); else if (ypos + row_dim.descent() > height_) - scrollDown(ypos - height_ + row_dim.descent()); + scrolled = scrollDown(ypos - height_ + row_dim.descent()); // else, nothing to do, the cursor is already visible so we just return. + if (scrolled != 0) { + updateMetrics(); + buffer_.changed(); + } return; } @@ -836,17 +845,17 @@ FuncStatus BufferView::getStatus(FuncRequest const & cmd) switch (cmd.action) { case LFUN_UNDO: - flag.enabled(buffer_.undo().hasUndoStack()); + flag.setEnabled(buffer_.undo().hasUndoStack()); break; case LFUN_REDO: - flag.enabled(buffer_.undo().hasRedoStack()); + flag.setEnabled(buffer_.undo().hasRedoStack()); break; case LFUN_FILE_INSERT: case LFUN_FILE_INSERT_PLAINTEXT_PARA: case LFUN_FILE_INSERT_PLAINTEXT: case LFUN_BOOKMARK_SAVE: // FIXME: Actually, these LFUNS should be moved to Text - flag.enabled(cur.inTexted()); + flag.setEnabled(cur.inTexted()); break; case LFUN_FONT_STATE: case LFUN_LABEL_INSERT: @@ -863,8 +872,11 @@ FuncStatus BufferView::getStatus(FuncRequest const & cmd) case LFUN_SCREEN_RECENTER: case LFUN_BIBTEX_DATABASE_ADD: case LFUN_BIBTEX_DATABASE_DEL: + case LFUN_GRAPHICS_GROUPS_UNIFY: + case LFUN_NOTES_MUTATE: + case LFUN_ALL_INSETS_TOGGLE: case LFUN_STATISTICS: - flag.enabled(true); + flag.setEnabled(true); break; case LFUN_NEXT_INSET_TOGGLE: @@ -882,18 +894,18 @@ FuncStatus BufferView::getStatus(FuncRequest const & cmd) } case LFUN_LABEL_GOTO: { - flag.enabled(!cmd.argument().empty() + flag.setEnabled(!cmd.argument().empty() || getInsetByCode(cur, REF_CODE)); break; } case LFUN_CHANGES_TRACK: - flag.enabled(true); + flag.setEnabled(true); flag.setOnOff(buffer_.params().trackChanges); break; case LFUN_CHANGES_OUTPUT: - flag.enabled(true); + flag.setEnabled(true); flag.setOnOff(buffer_.params().outputChanges); break; @@ -905,7 +917,7 @@ FuncStatus BufferView::getStatus(FuncRequest const & cmd) // In principle, these command should only be enabled if there // is a change in the document. However, without proper // optimizations, this will inevitably result in poor performance. - flag.enabled(true); + flag.setEnabled(true); break; case LFUN_BUFFER_TOGGLE_COMPRESSION: { @@ -918,30 +930,31 @@ FuncStatus BufferView::getStatus(FuncRequest const & cmd) case LFUN_SCROLL: case LFUN_SCREEN_UP_SELECT: case LFUN_SCREEN_DOWN_SELECT: - flag.enabled(true); + flag.setEnabled(true); break; case LFUN_LAYOUT_TABULAR: - flag.enabled(cur.innerInsetOfType(TABULAR_CODE)); + flag.setEnabled(cur.innerInsetOfType(TABULAR_CODE)); break; case LFUN_LAYOUT: - flag.enabled(!cur.inset().forceEmptyLayout(cur.idx())); + flag.setEnabled(!cur.inset().forcePlainLayout(cur.idx())); break; case LFUN_LAYOUT_PARAGRAPH: - flag.enabled(cur.inset().allowParagraphCustomization(cur.idx())); + flag.setEnabled(cur.inset().allowParagraphCustomization(cur.idx())); break; case LFUN_INSET_SETTINGS: { InsetCode code = cur.inset().lyxCode(); if (cmd.getArg(0) == insetName(code)) { - flag.enabled(true); + flag.setEnabled(true); break; } bool enable = false; InsetCode next_code = cur.nextInset() ? cur.nextInset()->lyxCode() : NO_CODE; + //FIXME: remove these special cases: switch (next_code) { case TABULAR_CODE: case ERT_CODE: @@ -957,12 +970,12 @@ FuncStatus BufferView::getStatus(FuncRequest const & cmd) default: break; } - flag.enabled(enable); + flag.setEnabled(enable); break; } case LFUN_DIALOG_SHOW_NEW_INSET: - flag.enabled(cur.inset().lyxCode() != ERT_CODE && + flag.setEnabled(cur.inset().lyxCode() != ERT_CODE && cur.inset().lyxCode() != LISTINGS_CODE); if (cur.inset().lyxCode() == CAPTION_CODE) { FuncStatus flag; @@ -971,8 +984,18 @@ FuncStatus BufferView::getStatus(FuncRequest const & cmd) } break; + case LFUN_BRANCH_ACTIVATE: + case LFUN_BRANCH_DEACTIVATE: { + bool enable = false; + docstring const branchName = cmd.argument(); + if (!branchName.empty()) + enable = buffer_.params().branchlist().find(branchName); + flag.setEnabled(enable); + break; + } + default: - flag.enabled(false); + flag.setEnabled(false); } return flag; @@ -1049,9 +1072,12 @@ bool BufferView::dispatch(FuncRequest const & cmd) if (!inset || !cur.result().dispatched()) cur.dispatch(cmd); + // FIXME I'm adding the last break to solve a crash, + // but that is obviously not right. if (!cur.result().dispatched()) // It did not work too; no action needed. break; + break; } case LFUN_PARAGRAPH_GOTO: { @@ -1142,6 +1168,8 @@ bool BufferView::dispatch(FuncRequest const & cmd) buffer_.text().cursorBottom(d->cursor_); // accept everything in a single step to support atomic undo buffer_.text().acceptOrRejectChanges(d->cursor_, Text::ACCEPT); + // FIXME: Move this LFUN to Buffer so that we don't have to do this: + processUpdateFlags(Update::Force | Update::FitCursor); break; case LFUN_ALL_CHANGES_REJECT: @@ -1152,6 +1180,8 @@ bool BufferView::dispatch(FuncRequest const & cmd) // reject everything in a single step to support atomic undo // Note: reject does not work recursively; the user may have to repeat the operation buffer_.text().acceptOrRejectChanges(d->cursor_, Text::REJECT); + // FIXME: Move this LFUN to Buffer so that we don't have to do this: + processUpdateFlags(Update::Force | Update::FitCursor); break; case LFUN_WORD_FIND: { @@ -1337,8 +1367,15 @@ bool BufferView::dispatch(FuncRequest const & cmd) showCursor(); p = getPos(cur, cur.boundary()); } - scroll(cmd.action == LFUN_SCREEN_UP? - height_ : height_); + int const scrolled = scroll(cmd.action == LFUN_SCREEN_UP + ? - height_ : height_); + if (cmd.action == LFUN_SCREEN_UP && scrolled > - height_) + p = Point(0, 0); + if (cmd.action == LFUN_SCREEN_DOWN && scrolled < height_) + p = Point(width_, height_); cur.reset(buffer_.inset()); + updateMetrics(); + buffer_.changed(); d->text_metrics_[&buffer_.text()].editXY(cur, p.x_, p.y_); //FIXME: what to do with cur.x_target()? cur.finishUndo(); @@ -1383,6 +1420,57 @@ bool BufferView::dispatch(FuncRequest const & cmd) break; } + case LFUN_BRANCH_ACTIVATE: + case LFUN_BRANCH_DEACTIVATE: + buffer_.dispatch(cmd); + processUpdateFlags(Update::Force); + break; + + // These two could be rewriten using some command like forall + // once the insets refactoring is done. + case LFUN_GRAPHICS_GROUPS_UNIFY: { + if (cmd.argument().empty()) + break; + //view()->cursor().recordUndoFullDocument(); let inset-apply do that job + graphics::unifyGraphicsGroups(cur.buffer(), to_utf8(cmd.argument())); + processUpdateFlags(Update::Force | Update::FitCursor); + break; + } + + case LFUN_NOTES_MUTATE: { + if (cmd.argument().empty()) + break; + cur.recordUndoFullDocument(); + + if (mutateNotes(cur, cmd.getArg(0), cmd.getArg(1))) { + processUpdateFlags(Update::Force); + } + break; + } + + case LFUN_ALL_INSETS_TOGGLE: { + string action; + string const name = split(to_utf8(cmd.argument()), action, ' '); + InsetCode const inset_code = insetCode(name); + + FuncRequest fr(LFUN_INSET_TOGGLE, action); + + Inset & inset = cur.buffer().inset(); + InsetIterator it = inset_iterator_begin(inset); + InsetIterator const end = inset_iterator_end(inset); + for (; it != end; ++it) { + if (it->asInsetCollapsable() + && (inset_code == NO_CODE + || inset_code == it->lyxCode())) { + Cursor tmpcur = cur; + tmpcur.pushBackward(*it); + it->dispatch(tmpcur, fr); + } + } + processUpdateFlags(Update::Force | Update::FitCursor); + break; + } + default: return false; } @@ -1395,11 +1483,13 @@ docstring const BufferView::requestSelection() { Cursor & cur = d->cursor_; + LYXERR(Debug::SELECTION, "requestSelection: cur.selection: " << cur.selection()); if (!cur.selection()) { d->xsel_cache_.set = false; return docstring(); } + LYXERR(Debug::SELECTION, "requestSelection: xsel_cache.set: " << d->xsel_cache_.set); if (!d->xsel_cache_.set || cur.top() != d->xsel_cache_.cursor || cur.anchor_.top() != d->xsel_cache_.anchor) @@ -1575,19 +1665,22 @@ void BufferView::lfunScroll(FuncRequest const & cmd) if (scroll_value) scroll(scroll_step * scroll_value); } + updateMetrics(); + buffer_.changed(); } -void BufferView::scroll(int y) +int BufferView::scroll(int y) { if (y > 0) - scrollDown(y); - else if (y < 0) - scrollUp(-y); + return scrollDown(y); + if (y < 0) + return scrollUp(-y); + return 0; } -void BufferView::scrollDown(int offset) +int BufferView::scrollDown(int offset) { Text * text = &buffer_.text(); TextMetrics & tm = d->text_metrics_[text]; @@ -1597,7 +1690,7 @@ void BufferView::scrollDown(int offset) int bottom_pos = last.second->position() + last.second->descent(); if (last.first + 1 == int(text->paragraphs().size())) { if (bottom_pos <= height_) - return; + return 0; offset = min(offset, bottom_pos - height_); break; } @@ -1606,12 +1699,11 @@ void BufferView::scrollDown(int offset) tm.newParMetricsDown(); } d->anchor_ypos_ -= offset; - updateMetrics(); - buffer_.changed(); + return -offset; } -void BufferView::scrollUp(int offset) +int BufferView::scrollUp(int offset) { Text * text = &buffer_.text(); TextMetrics & tm = d->text_metrics_[text]; @@ -1621,7 +1713,7 @@ void BufferView::scrollUp(int offset) int top_pos = first.second->position() - first.second->ascent(); if (first.first == 0) { if (top_pos >= 0) - return; + return 0; offset = min(offset, - top_pos); break; } @@ -1630,8 +1722,7 @@ void BufferView::scrollUp(int offset) tm.newParMetricsUp(); } d->anchor_ypos_ += offset; - updateMetrics(); - buffer_.changed(); + return offset; } @@ -1846,6 +1937,9 @@ bool BufferView::singleParUpdate() void BufferView::updateMetrics() { + if (height_ == 0 || width_ == 0) + return; + Text & buftext = buffer_.text(); pit_type const npit = int(buftext.paragraphs().size()); @@ -2071,6 +2165,8 @@ Point BufferView::getPos(DocIterator const & dit, bool boundary) const void BufferView::draw(frontend::Painter & pain) { + if (height_ == 0 || width_ == 0) + return; LYXERR(Debug::PAINTING, "\t\t*** START DRAWING ***"); Text & text = buffer_.text(); TextMetrics const & tm = d->text_metrics_[&text];