X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2FBufferView_pimpl.C;h=ace9dd401451713b6040c8c6f695eaceaefa0bee;hb=69bee02a8901793b34ac5ca6d07e93910cef4005;hp=e5b694b1c64c385365188b4a00c352031bd0912f;hpb=a7060da1978f9803ffadfa0878e30d506a823590;p=lyx.git diff --git a/src/BufferView_pimpl.C b/src/BufferView_pimpl.C index e5b694b1c6..ace9dd4014 100644 --- a/src/BufferView_pimpl.C +++ b/src/BufferView_pimpl.C @@ -62,27 +62,19 @@ #include "mathed/formulabase.h" #include "support/filetools.h" +#include "support/globbing.h" #include "support/path_defines.h" #include "support/tostr.h" #include -using bv_funcs::bold; -using bv_funcs::code; using bv_funcs::currentState; -using bv_funcs::emph; -using bv_funcs::fontSize; -using bv_funcs::lang; -using bv_funcs::noun; -using bv_funcs::roman; -using bv_funcs::sans; -using bv_funcs::styleReset; -using bv_funcs::underline; using lyx::pos_type; using lyx::support::AddPath; using lyx::support::bformat; +using lyx::support::FileFilterList; using lyx::support::FileSearch; using lyx::support::IsDirWriteable; using lyx::support::MakeDisplayPath; @@ -119,11 +111,13 @@ boost::signals::connection lostcon; } // anon namespace -BufferView::Pimpl::Pimpl(BufferView * bv, LyXView * owner, +BufferView::Pimpl::Pimpl(BufferView & bv, LyXView * owner, int xpos, int ypos, int width, int height) - : bv_(bv), owner_(owner), buffer_(0), cursor_timeout(400), - using_xterm_cursor(false) + : bv_(&bv), owner_(owner), buffer_(0), cursor_timeout(400), + using_xterm_cursor(false), cursor_(bv) { + xsel_cache_.set = false; + workarea_.reset(WorkAreaFactory::create(xpos, ypos, width, height)); screen_.reset(LyXScreenFactory::create(workarea())); @@ -166,13 +160,20 @@ void BufferView::Pimpl::connectBuffer(Buffer & buf) if (errorConnection_.connected()) disconnectBuffer(); - errorConnection_ = buf.error.connect(boost::bind(&BufferView::Pimpl::addError, this, _1)); - messageConnection_ = buf.message.connect(boost::bind(&LyXView::message, owner_, _1)); - busyConnection_ = buf.busy.connect(boost::bind(&LyXView::busy, owner_, _1)); - titleConnection_ = buf.updateTitles.connect(boost::bind(&LyXView::updateWindowTitle, owner_)); - timerConnection_ = buf.resetAutosaveTimers.connect(boost::bind(&LyXView::resetAutosaveTimer, owner_)); - readonlyConnection_ = buf.readonly.connect(boost::bind(&BufferView::Pimpl::showReadonly, this, _1)); - closingConnection_ = buf.closing.connect(boost::bind(&BufferView::Pimpl::buffer, this, (Buffer *)0)); + errorConnection_ = + buf.error.connect(boost::bind(&BufferView::Pimpl::addError, this, _1)); + messageConnection_ = + buf.message.connect(boost::bind(&LyXView::message, owner_, _1)); + busyConnection_ = + buf.busy.connect(boost::bind(&LyXView::busy, owner_, _1)); + titleConnection_ = + buf.updateTitles.connect(boost::bind(&LyXView::updateWindowTitle, owner_)); + timerConnection_ = + buf.resetAutosaveTimers.connect(boost::bind(&LyXView::resetAutosaveTimer, owner_)); + readonlyConnection_ = + buf.readonly.connect(boost::bind(&BufferView::Pimpl::showReadonly, this, _1)); + closingConnection_ = + buf.closing.connect(boost::bind(&BufferView::Pimpl::buffer, this, (Buffer *)0)); } @@ -297,8 +298,8 @@ void BufferView::Pimpl::buffer(Buffer * b) << b << ')' << endl; if (buffer_) { disconnectBuffer(); - delete bv_->text; - bv_->text = 0; + //delete bv_->text(); + //bv_->setText(0); } // set current buffer @@ -318,12 +319,16 @@ void BufferView::Pimpl::buffer(Buffer * b) lyxerr[Debug::INFO] << "Buffer addr: " << buffer_ << endl; connectBuffer(*buffer_); + buffer_->text().init(bv_); + buffer_->text().textwidth_ = workarea().workWidth(); + buffer_->text().fullRebreak(); + // If we don't have a text object for this, we make one - if (bv_->text == 0) + if (bv_->text() == 0) resizeCurrentBuffer(); // FIXME: needed when ? - top_y(screen().topCursorVisible(bv_->text)); + fitCursor(); // Buffer-dependent dialogs should be updated or // hidden. This should go here because some dialogs (eg ToC) @@ -341,12 +346,9 @@ void BufferView::Pimpl::buffer(Buffer * b) owner_->updateLayoutChoice(); owner_->updateWindowTitle(); - if (buffer_) { - // Don't forget to update the Layout - string const layoutname = - bv_->text->cursorPar()->layout()->name(); - owner_->setLayout(layoutname); - } + // Don't forget to update the Layout + if (buffer_) + owner_->setLayout(bv_->text()->cursorPar()->layout()->name()); if (lyx::graphics::Previews::activated() && buffer_) lyx::graphics::Previews::get().generateBufferPreviews(*buffer_); @@ -355,33 +357,22 @@ void BufferView::Pimpl::buffer(Buffer * b) bool BufferView::Pimpl::fitCursor() { - bool ret; - - if (bv_->theLockingInset()) { - bv_->theLockingInset()->fitInsetCursor(bv_); - ret = true; - } else { - ret = screen().fitCursor(bv_->text, bv_); + lyxerr << "BufferView::Pimpl::fitCursor." << endl; + if (screen().fitCursor(bv_)) { + updateScrollbar(); + return true; } - - //dispatch(FuncRequest(LFUN_PARAGRAPH_UPDATE)); - - // We need to always update, in case we did a - // paste and we stayed anchored to a row, but - // the actual height of the doc changed ... - updateScrollbar(); - return ret; + return false; } void BufferView::Pimpl::redoCurrentBuffer() { lyxerr[Debug::INFO] << "BufferView::redoCurrentBuffer" << endl; - if (buffer_ && bv_->text) { + if (buffer_ && bv_->text()) { resizeCurrentBuffer(); updateScrollbar(); owner_->updateLayoutChoice(); - update(); } } @@ -393,58 +384,53 @@ void BufferView::Pimpl::resizeCurrentBuffer() int par = -1; int selstartpar = -1; int selendpar = -1; - UpdatableInset * the_locking_inset = 0; pos_type pos = 0; pos_type selstartpos = 0; pos_type selendpos = 0; - bool selection = false; + bool sel = false; bool mark_set = false; owner_->busy(true); owner_->message(_("Formatting document...")); - if (bv_->text) { - par = bv_->text->cursor.par(); - pos = bv_->text->cursor.pos(); - selstartpar = bv_->text->selection.start.par(); - selstartpos = bv_->text->selection.start.pos(); - selendpar = bv_->text->selection.end.par(); - selendpos = bv_->text->selection.end.pos(); - selection = bv_->text->selection.set(); - mark_set = bv_->text->selection.mark(); - the_locking_inset = bv_->theLockingInset(); - bv_->text->fullRebreak(); - update(); - } else { - lyxerr << "text not available!" << endl; - lyxerr << "no text in cache!" << endl; - bv_->text = new LyXText(bv_, 0, false, bv_->buffer()->paragraphs()); - bv_->text->init(bv_); - } + LyXText * text = bv_->text(); + lyxerr << "### resizeCurrentBuffer: text " << text << endl; + if (!text) + return; + + par = bv_->cursor().par(); + pos = bv_->cursor().pos(); + selstartpar = bv_->selStart().par(); + selstartpos = bv_->selStart().pos(); + selendpar = bv_->selEnd().par(); + selendpos = bv_->selEnd().pos(); + sel = bv_->selection().set(); + mark_set = bv_->selection().mark(); + text->textwidth_ = bv_->workWidth(); + text->fullRebreak(); + update(); if (par != -1) { - bv_->text->selection.set(true); + bv_->selection().set(true); // At this point just to avoid the Delete-Empty-Paragraph- // Mechanism when setting the cursor. - bv_->text->selection.mark(mark_set); - if (selection) { - bv_->text->setCursor(selstartpar, selstartpos); - bv_->text->selection.cursor = bv_->text->cursor; - bv_->text->setCursor(selendpar, selendpos); - bv_->text->setSelection(); - bv_->text->setCursor(par, pos); + bv_->selection().mark(mark_set); + if (sel) { + text->setCursor(selstartpar, selstartpos); + bv_->resetAnchor(); + text->setCursor(selendpar, selendpos); + bv_->setSelection(); + text->setCursor(par, pos); } else { - bv_->text->setCursor(par, pos); - bv_->text->selection.cursor = bv_->text->cursor; - bv_->text->selection.set(false); + text->setCursor(par, pos); + bv_->resetAnchor(); + bv_->selection().set(false); } - // remake the inset locking - bv_->theLockingInset(the_locking_inset); } - top_y(screen().topCursorVisible(bv_->text)); + fitCursor(); switchKeyMap(); owner_->busy(false); @@ -458,13 +444,13 @@ void BufferView::Pimpl::resizeCurrentBuffer() void BufferView::Pimpl::updateScrollbar() { - if (!bv_->text) { + if (!bv_->text()) { lyxerr[Debug::GUI] << "no text in updateScrollbar" << endl; workarea().setScrollbarParams(0, 0, 0); return; } - LyXText const & t = *bv_->text; + LyXText const & t = *bv_->text(); lyxerr[Debug::GUI] << "Updating scrollbar: h " << t.height << ", top_y() " << top_y() << ", default height " << defaultRowHeight() << endl; @@ -492,10 +478,10 @@ void BufferView::Pimpl::scrollDocView(int value) int const first = top_y() + height; int const last = top_y() + workarea().workHeight() - height; - LyXText * text = bv_->text; - if (text->cursor.y() < first) + LyXText * text = bv_->text(); + if (text->cursorY() < first) text->setCursorFromCoordinates(0, first); - else if (text->cursor.y() > last) + else if (text->cursorY() > last) text->setCursorFromCoordinates(0, last); owner_->updateLayoutChoice(); @@ -504,11 +490,10 @@ void BufferView::Pimpl::scrollDocView(int value) void BufferView::Pimpl::scroll(int lines) { - if (!buffer_) { + if (!buffer_) return; - } - LyXText const * t = bv_->text; + LyXText const * t = bv_->text(); int const line_height = defaultRowHeight(); // The new absolute coordinate @@ -553,20 +538,22 @@ void BufferView::Pimpl::selectionRequested() LyXText * text = bv_->getLyXText(); - if (text->selection.set() && - (!bv_->text->xsel_cache.set() || - text->selection.start != bv_->text->xsel_cache.start || - text->selection.end != bv_->text->xsel_cache.end)) + if (!bv_->selection().set()) { + xsel_cache_.set = false; + return; + } + + if (!xsel_cache_.set || + bv_->cursor() != xsel_cache_.cursor || + bv_->anchor() != xsel_cache_.anchor) { - bv_->text->xsel_cache = text->selection; + xsel_cache_.cursor = bv_->cursor(); + xsel_cache_.anchor = bv_->anchor(); + xsel_cache_.set = bv_->selection().set(); sel = text->selectionAsString(*bv_->buffer(), false); - } else if (!text->selection.set()) { - sel = string(); - bv_->text->xsel_cache.set(false); - } - if (!sel.empty()) { - workarea().putClipboard(sel); - } + if (!sel.empty()) + workarea().putClipboard(sel); + } } @@ -574,8 +561,8 @@ void BufferView::Pimpl::selectionLost() { if (available()) { screen().hideCursor(); - bv_->getLyXText()->clearSelection(); - bv_->text->xsel_cache.set(false); + bv_->clearSelection(); + xsel_cache_.set = false; } } @@ -612,9 +599,17 @@ void BufferView::Pimpl::update() { //lyxerr << "BufferView::update()" << endl; // fix cursor coordinate cache in case something went wrong + + // check needed to survive LyX startup if (bv_->getLyXText()) { - // check needed to survive LyX startup - bv_->getLyXText()->redoCursor(); + // update all 'visible' paragraphs + ParagraphList::iterator beg; + ParagraphList::iterator end; + getParsInRange(buffer_->paragraphs(), + top_y(), top_y() + workarea().workHeight(), + beg, end); + bv_->text()->redoParagraphs(beg, end); + updateScrollbar(); } screen().redraw(*bv_); } @@ -629,16 +624,13 @@ void BufferView::Pimpl::cursorToggle() } screen().toggleCursor(*bv_); - cursor_timeout.restart(); } bool BufferView::Pimpl::available() const { - if (buffer_ && bv_->text) - return true; - return false; + return buffer_ && bv_->text(); } @@ -649,17 +641,11 @@ Change const BufferView::Pimpl::getCurrentChange() LyXText * text = bv_->getLyXText(); - if (!text->selection.set()) + if (!bv_->selection().set()) return Change(Change::UNCHANGED); - return text->getPar(text->selection.start) - ->lookupChangeFull(text->selection.start.pos()); -} - - -void BufferView::Pimpl::beforeChange(LyXText * text) -{ - text->clearSelection(); + return text->getPar(bv_->selStart()) + ->lookupChangeFull(bv_->selStart().pos()); } @@ -668,8 +654,8 @@ void BufferView::Pimpl::savePosition(unsigned int i) if (i >= saved_positions_num) return; saved_positions[i] = Position(buffer_->fileName(), - bv_->text->cursorPar()->id(), - bv_->text->cursor.pos()); + bv_->text()->cursorPar()->id(), + bv_->text()->cursor().pos()); if (i > 0) owner_->message(bformat(_("Saved bookmark %1$s"), tostr(i))); } @@ -682,7 +668,7 @@ void BufferView::Pimpl::restorePosition(unsigned int i) string const fname = saved_positions[i].filename; - beforeChange(bv_->text); + bv_->clearSelection(); if (fname != buffer_->fileName()) { Buffer * b = 0; @@ -700,10 +686,9 @@ void BufferView::Pimpl::restorePosition(unsigned int i) if (par == buffer_->par_iterator_end()) return; - bv_->text->setCursor(par.pit(), + bv_->text()->setCursor(par.pit(), min(par->size(), saved_positions[i].par_pos)); - update(); if (i > 0) owner_->message(bformat(_("Moved to bookmark %1$s"), tostr(i))); } @@ -711,10 +696,7 @@ void BufferView::Pimpl::restorePosition(unsigned int i) bool BufferView::Pimpl::isSavedPosition(unsigned int i) { - if (i >= saved_positions_num) - return false; - - return !saved_positions[i].filename.empty(); + return i < saved_positions_num && !saved_positions[i].filename.empty(); } @@ -723,41 +705,26 @@ void BufferView::Pimpl::switchKeyMap() if (!lyxrc.rtl_support) return; - LyXText * text = bv_->getLyXText(); - if (text->real_current_font.isRightToLeft() - && !(bv_->theLockingInset() - && bv_->theLockingInset()->lyxCode() == InsetOld::ERT_CODE)) - { - if (owner_->getIntl().keymap == Intl::PRIMARY) - owner_->getIntl().KeyMapSec(); + Intl & intl = owner_->getIntl(); + if (bv_->getLyXText()->real_current_font.isRightToLeft()) { + if (intl.keymap == Intl::PRIMARY) + intl.KeyMapSec(); } else { - if (owner_->getIntl().keymap == Intl::SECONDARY) - owner_->getIntl().KeyMapPrim(); - } -} - - -void BufferView::Pimpl::insetUnlock() -{ - if (bv_->theLockingInset()) { - bv_->theLockingInset()->insetUnlock(bv_); - bv_->theLockingInset(0); - finishUndo(); + if (intl.keymap == Intl::SECONDARY) + intl.KeyMapPrim(); } } void BufferView::Pimpl::center() { - LyXText * text = bv_->text; + LyXText * text = bv_->text(); - beforeChange(text); + bv_->clearSelection(); int const half_height = workarea().workHeight() / 2; - int new_y = std::max(0, text->cursor.y() - half_height); + int new_y = std::max(0, text->cursorY() - half_height); // FIXME: look at this comment again ... - - // FIXME: can we do this w/o calling screen directly ? // This updates top_y() but means the fitCursor() call // from the update(FITCUR) doesn't realise that we might // have moved (e.g. from GOTOPARAGRAPH), so doesn't cause @@ -767,8 +734,6 @@ void BufferView::Pimpl::center() // updateScrollbar() currently. Never mind that this is a // pretty obfuscated way of updating t->top_y() top_y(new_y); - //screen().draw(); - update(); } @@ -778,19 +743,13 @@ void BufferView::Pimpl::stuffClipboard(string const & stuff) const } -/* - * Dispatch functions for actions which can be valid for BufferView->text - * and/or InsetText->text!!! - */ - - InsetOld * BufferView::Pimpl::getInsetByCode(InsetOld::Code code) { #if 0 - LyXCursor cursor = bv_->getLyXText()->cursor; + CursorSlice cursor = bv_->getLyXText()->cursor; Buffer::inset_iterator it = find_if(Buffer::inset_iterator( - cursorPar(), cursor.pos()), + cursorPar(), cursor().pos()), buffer_->inset_iterator_end(), lyx::compare_memfun(&Inset::lyxCode, code)); return it != buffer_->inset_iterator_end() ? (*it) : 0; @@ -799,20 +758,20 @@ InsetOld * BufferView::Pimpl::getInsetByCode(InsetOld::Code code) // should work for now. Better infrastructure is coming. (Lgb) Buffer * b = bv_->buffer(); - LyXText * text = bv_->getLyXText(); + LyXText * text = bv_->getLyXText(); Buffer::inset_iterator beg = b->inset_iterator_begin(); Buffer::inset_iterator end = b->inset_iterator_end(); - bool cursorPar_seen = false; + bool cursor_par_seen = false; for (; beg != end; ++beg) { if (beg.getPar() == text->cursorPar()) { - cursorPar_seen = true; + cursor_par_seen = true; } - if (cursorPar_seen) { + if (cursor_par_seen) { if (beg.getPar() == text->cursorPar() - && beg.getPos() >= text->cursor.pos()) { + && beg.getPos() >= text->cursor().pos()) { break; } else if (beg.getPar() != text->cursorPar()) { break; @@ -857,7 +816,8 @@ void BufferView::Pimpl::MenuInsertLyXFile(string const & filen) FileDialog::Result result = fileDlg.open(initpath, - _("*.lyx| LyX Documents (*.lyx)")); + FileFilterList(_("LyX Documents (*.lyx)")), + string()); if (result.first == FileDialog::Later) return; @@ -901,10 +861,8 @@ void BufferView::Pimpl::trackChanges() buf->undostack().clear(); } else { update(); - bv_->text->setCursor(0, 0); + bv_->text()->setCursor(0, 0); #warning changes FIXME - //moveCursorUpdate(false); - bool found = lyx::find::findNextChange(bv_); if (found) { owner_->getDialogs().show("changes"); @@ -920,16 +878,73 @@ void BufferView::Pimpl::trackChanges() buf->redostack().clear(); } +#warning remove me +LCursor theTempCursor; + +namespace { -bool BufferView::Pimpl::workAreaDispatch(FuncRequest const & ev) + InsetOld * insetFromCoords(BufferView * bv, int x, int y) + { + lyxerr << "insetFromCoords" << endl; + LyXText * text = bv->text(); + InsetOld * inset = 0; + theTempCursor = LCursor(*bv); + while (true) { + InsetOld * const inset_hit = text->checkInsetHit(x, y); + if (!inset_hit) { + lyxerr << "no further inset hit" << endl; + break; + } + inset = inset_hit; + if (!inset->descendable()) { + lyxerr << "not descendable" << endl; + break; + } + int const cell = inset->getCell(x, y + bv->top_y()); + if (cell == -1) + break; + text = inset_hit->getText(cell); + lyxerr << "Hit inset: " << inset << " at x: " << x + << " text: " << text << " y: " << y << endl; + theTempCursor.push(static_cast(inset)); + } + lyxerr << "theTempCursor: " << theTempCursor << endl; + return inset; + } + +} + + +bool BufferView::Pimpl::workAreaDispatch(FuncRequest const & cmd) { - switch (ev.action) { + switch (cmd.action) { + case LFUN_MOUSE_MOTION: { + if (!available()) + return false; + FuncRequest cmd1 = cmd; + UpdatableInset * inset = bv_->fullCursor().innerInset(); + DispatchResult res; + if (inset) { + cmd1.x -= inset->x(); + cmd1.y -= inset->y(); + res = inset->dispatch(*bv_, cmd1); + } else { + cmd1.y += bv_->top_y(); + res = bv_->fullCursor().innerText()->dispatch(*bv_, cmd1); + } + + if (bv_->fitCursor() || res.update()) { + bv_->update(); + bv_->fullCursor().updatePos(); + } + + return true; + } + case LFUN_MOUSE_PRESS: - case LFUN_MOUSE_MOTION: case LFUN_MOUSE_RELEASE: case LFUN_MOUSE_DOUBLE: - case LFUN_MOUSE_TRIPLE: - { + case LFUN_MOUSE_TRIPLE: { // We pass those directly to the Bufferview, since // otherwise selection handling breaks down @@ -942,37 +957,86 @@ bool BufferView::Pimpl::workAreaDispatch(FuncRequest const & ev) screen().hideCursor(); - bool const res = dispatch(ev); + // either the inset under the cursor or the surrounding LyXText will + // handle this event. + + // built temporary path to inset + InsetOld * inset = insetFromCoords(bv_, cmd.x, cmd.y); + DispatchResult res; + // try to dispatch to that inset + if (inset) { + FuncRequest cmd2 = cmd; + lyxerr << "dispatching action " << cmd2.action + << " to inset " << inset << endl; + cmd2.x -= inset->x(); + cmd2.y -= inset->y(); + res = inset->dispatch(*bv_, cmd2); + if (res.update()) { + bv_->update(); + bv_->fullCursor().updatePos(); + } + res.update(false); + switch (res.val()) { + case FINISHED: + case FINISHED_RIGHT: + case FINISHED_UP: + case FINISHED_DOWN: + theTempCursor.pop(); + bv_->fullCursor(theTempCursor); + bv_->fullCursor().innerText() + ->setCursorFromCoordinates(cmd.x, top_y() + cmd.y); + if (bv_->fitCursor()) + bv_->update(); + return true; + default: + lyxerr << "not dispatched by inner inset val: " << res.val() << endl; + break; + } + } + + // otherwise set cursor to surrounding LyXText + if (!res.dispatched()) { + lyxerr << "temp cursor is: " << theTempCursor << endl; + lyxerr << "dispatching " << cmd + << " to surrounding LyXText " + << theTempCursor.innerText() << endl; + bv_->fullCursor(theTempCursor); + FuncRequest cmd1 = cmd; + cmd1.y += bv_->top_y(); + res = bv_->fullCursor().innerText()->dispatch(*bv_, cmd1); + if (bv_->fitCursor() || res.update()) + bv_->update(); + + //return DispatchResult(true, true); + } // see workAreaKeyPress cursor_timeout.restart(); screen().showCursor(*bv_); - // FIXME: we should skip these when selecting - owner_->updateLayoutChoice(); - owner_->updateToolbar(); - fitCursor(); + // skip these when selecting + if (cmd.action != LFUN_MOUSE_MOTION) { + owner_->updateLayoutChoice(); + owner_->updateToolbar(); + } // slight hack: this is only called currently when we // clicked somewhere, so we force through the display // of the new status here. owner_->clearMessage(); - - return res; + return true; } + default: - owner_->dispatch(ev); + owner_->dispatch(cmd); return true; } } -bool BufferView::Pimpl::dispatch(FuncRequest const & ev_in) +bool BufferView::Pimpl::dispatch(FuncRequest const & ev) { // Make sure that the cached BufferView is correct. - FuncRequest ev = ev_in; - ev.setView(bv_); - lyxerr[Debug::ACTION] << "BufferView::Pimpl::Dispatch:" << " action[" << ev.action << ']' << " arg[" << ev.argument << ']' @@ -1003,57 +1067,6 @@ bool BufferView::Pimpl::dispatch(FuncRequest const & ev_in) InsertAsciiFile(bv_, ev.argument, false); break; - case LFUN_LANGUAGE: - lang(bv_, ev.argument); - switchKeyMap(); - owner_->view_state_changed(); - break; - - case LFUN_EMPH: - emph(bv_); - owner_->view_state_changed(); - break; - - case LFUN_BOLD: - bold(bv_); - owner_->view_state_changed(); - break; - - case LFUN_NOUN: - noun(bv_); - owner_->view_state_changed(); - break; - - case LFUN_CODE: - code(bv_); - owner_->view_state_changed(); - break; - - case LFUN_SANS: - sans(bv_); - owner_->view_state_changed(); - break; - - case LFUN_ROMAN: - roman(bv_); - owner_->view_state_changed(); - break; - - case LFUN_DEFAULT: - styleReset(bv_); - owner_->view_state_changed(); - break; - - case LFUN_UNDERLINE: - underline(bv_); - owner_->view_state_changed(); - break; - - case LFUN_FONT_SIZE: - fontSize(bv_, ev.argument); - owner_->view_state_changed(); - break; - case LFUN_FONT_STATE: owner_->getLyXFunc().setMessage(currentState(bv_)); break; @@ -1065,8 +1078,8 @@ bool BufferView::Pimpl::dispatch(FuncRequest const & ev_in) InsetCommandParams icp("label", contents); string data = InsetCommandMailer::params2string("label", icp); owner_->getDialogs().show("label", data, 0); + break; } - break; case LFUN_BOOKMARK_SAVE: savePosition(strToUnsignedInt(ev.argument)); @@ -1129,43 +1142,17 @@ bool BufferView::Pimpl::dispatch(FuncRequest const & ev_in) case LFUN_MATH_IMPORT_SELECTION: // Imports LaTeX from the X selection case LFUN_MATH_DISPLAY: // Open or create a displayed math inset case LFUN_MATH_MODE: // Open or create an inlined math inset - mathDispatch(ev); + mathDispatch(*bv_, ev); break; - case LFUN_INSET_APPLY: { - string const name = ev.getArg(0); - - InsetBase * inset = owner_->getDialogs().getOpenInset(name); - if (inset) { - // This works both for 'original' and 'mathed' insets. - // Note that the localDispatch performs updateInset - // also. - FuncRequest fr(bv_, LFUN_INSET_MODIFY, ev.argument); - inset->dispatch(fr); - } else { - FuncRequest fr(bv_, LFUN_INSET_INSERT, ev.argument); - dispatch(fr); - } - } - break; - case LFUN_INSET_INSERT: { - InsetOld * inset = createInset(ev); - if (inset && insertInset(inset)) { - updateInset(inset); - - string const name = ev.getArg(0); - if (name == "bibitem") { - // We need to do a redraw because the maximum - // InsetBibitem width could have changed -#warning check whether the update() is needed at all - bv_->update(); - } - } else { + // Same as above. + BOOST_ASSERT(false); + InsetOld * inset = createInset(bv_, ev); + if (!inset || !insertInset(inset)) delete inset; - } + break; } - break; case LFUN_FLOAT_LIST: if (tclass.floats().typeExist(ev.argument)) { @@ -1181,36 +1168,20 @@ bool BufferView::Pimpl::dispatch(FuncRequest const & ev_in) case LFUN_LAYOUT_PARAGRAPH: { string data; params2string(*bv_->getLyXText()->cursorPar(), data); - data = "show\n" + data; bv_->owner()->getDialogs().show("paragraph", data); break; } - case LFUN_PARAGRAPH_UPDATE: { - if (!bv_->owner()->getDialogs().visible("paragraph")) - break; - Paragraph const & par = *bv_->getLyXText()->cursorPar(); - - string data; - params2string(par, data); - - // Will the paragraph accept changes from the dialog? - InsetOld * const inset = par.inInset(); - bool const accept = - !(inset && inset->forceDefaultParagraphs(inset)); - - data = "update " + tostr(accept) + '\n' + data; - bv_->owner()->getDialogs().update("paragraph", data); + case LFUN_PARAGRAPH_UPDATE: + updateParagraphDialog(); break; - } case LFUN_PARAGRAPH_APPLY: setParagraphParams(*bv_, ev.argument); break; - case LFUN_THESAURUS_ENTRY: - { + case LFUN_THESAURUS_ENTRY: { string arg = ev.argument; if (arg.empty()) { @@ -1227,8 +1198,8 @@ bool BufferView::Pimpl::dispatch(FuncRequest const & ev_in) } bv_->owner()->getDialogs().show("thesaurus", arg); - } break; + } case LFUN_TRACK_CHANGES: trackChanges(); @@ -1239,25 +1210,19 @@ bool BufferView::Pimpl::dispatch(FuncRequest const & ev_in) break; case LFUN_ACCEPT_ALL_CHANGES: { - bv_->text->setCursor(0, 0); + bv_->text()->setCursor(0, 0); #warning FIXME changes - //moveCursorUpdate(false); - while (lyx::find::findNextChange(bv_)) bv_->getLyXText()->acceptChange(); - update(); break; } case LFUN_REJECT_ALL_CHANGES: { - bv_->text->setCursor(0, 0); + bv_->text()->setCursor(0, 0); #warning FIXME changes - //moveCursorUpdate(false); - while (lyx::find::findNextChange(bv_)) bv_->getLyXText()->rejectChange(); - update(); break; } @@ -1274,12 +1239,47 @@ bool BufferView::Pimpl::dispatch(FuncRequest const & ev_in) break; } + case LFUN_WORD_FIND: + lyx::find::find(bv_, ev); + break; + + case LFUN_WORD_REPLACE: + lyx::find::replace(bv_, ev); + break; + + case LFUN_MARK_OFF: + bv_->clearSelection(); + bv_->update(); + bv_->resetAnchor(); + ev.message(N_("Mark off")); + break; + + case LFUN_MARK_ON: + bv_->clearSelection(); + bv_->selection().mark(true); + bv_->update(); + bv_->resetAnchor(); + ev.message(N_("Mark on")); + break; + + case LFUN_SETMARK: + bv_->clearSelection(); + if (bv_->selection().mark()) { + ev.message(N_("Mark removed")); + } else { + bv_->selection().mark(true); + ev.message(N_("Mark set")); + } + bv_->resetAnchor(); + bv_->update(); + break; + case LFUN_UNKNOWN_ACTION: ev.errorMessage(N_("Unknown function!")); break; default: - return bv_->getLyXText()->dispatch(FuncRequest(ev, bv_)) >= DispatchResult(DISPATCHED); + return bv_->getLyXText()->dispatch(*bv_, ev).dispatched(); } // end of switch return true; @@ -1288,82 +1288,37 @@ bool BufferView::Pimpl::dispatch(FuncRequest const & ev_in) bool BufferView::Pimpl::insertInset(InsetOld * inset, string const & lout) { - // if we are in a locking inset we should try to insert the - // inset there otherwise this is a illegal function now - if (bv_->theLockingInset()) { - if (bv_->theLockingInset()->insetAllowed(inset)) - return bv_->theLockingInset()->insertInset(bv_, inset); - return false; - } - // not quite sure if we want this... - bv_->text->recUndo(bv_->text->cursor.par()); + bv_->text()->recUndo(bv_->text()->cursor().par()); freezeUndo(); - beforeChange(bv_->text); + bv_->clearSelection(); if (!lout.empty()) { - bv_->text->breakParagraph(bv_->buffer()->paragraphs()); + bv_->text()->breakParagraph(bv_->buffer()->paragraphs()); - if (!bv_->text->cursorPar()->empty()) { - bv_->text->cursorLeft(bv_); - bv_->text->breakParagraph(bv_->buffer()->paragraphs()); + if (!bv_->text()->cursorPar()->empty()) { + bv_->text()->cursorLeft(bv_); + bv_->text()->breakParagraph(bv_->buffer()->paragraphs()); } string lres = lout; LyXTextClass const & tclass = buffer_->params().getLyXTextClass(); bool hasLayout = tclass.hasLayout(lres); - string lay = tclass.defaultLayoutName(); - - if (hasLayout != false) { - // layout found - lay = lres; - } else { - // layout not fount using default - lay = tclass.defaultLayoutName(); - } - - bv_->text->setLayout(lay); - bv_->text->setParagraph( - VSpace(VSpace::NONE), VSpace(VSpace::NONE), - Spacing(), - LYX_ALIGN_LAYOUT, - string(), - 0); + bv_->text()->setLayout(hasLayout ? lres : tclass.defaultLayoutName()); + bv_->text()->setParagraph(Spacing(), LYX_ALIGN_LAYOUT, string(), 0); } - - bv_->text->insertInset(inset); - update(); - + bv_->fullCursor().innerText()->insertInset(inset); unFreezeUndo(); return true; } -void BufferView::Pimpl::updateInset(InsetOld const * inset) -{ - if (!available()) - return; - - bv_->text->redoParagraph(outerPar(*bv_->buffer(), inset)); - - // this should not be needed, but it is... - // bv_->text->redoParagraph(bv_->text->cursorPar()); - // bv_->text->fullRebreak(); - - update(); - updateScrollbar(); -} - - bool BufferView::Pimpl::ChangeInsets(InsetOld::Code code, string const & from, string const & to) { bool need_update = false; - LyXCursor cursor = bv_->text->cursor; - LyXCursor tmpcursor = cursor; - cursor.par(tmpcursor.par()); - cursor.pos(tmpcursor.pos()); + CursorSlice cur = bv_->text()->cursor(); ParIterator end = bv_->buffer()->par_iterator_end(); for (ParIterator it = bv_->buffer()->par_iterator_begin(); @@ -1384,14 +1339,32 @@ bool BufferView::Pimpl::ChangeInsets(InsetOld::Code code, // FIXME - // The test it.size()==1 was needed to prevent crashes. - // How to set the cursor correctly when it.size()>1 ?? + // The test it.size() == 1 was needed to prevent crashes. + // How to set the cursor correctly when it.size() > 1 ?? if (it.size() == 1) { - bv_->text->setCursorIntern(bv_->text->parOffset(it.pit()), 0); - bv_->text->redoParagraph(bv_->text->cursorPar()); + bv_->text()->setCursorIntern(bv_->text()->parOffset(it.pit()), 0); + bv_->text()->redoParagraph(bv_->text()->cursorPar()); } } } - bv_->text->setCursorIntern(cursor.par(), cursor.pos()); + bv_->text()->setCursorIntern(cur.par(), cur.pos()); return need_update; } + + +void BufferView::Pimpl::updateParagraphDialog() +{ + if (!bv_->owner()->getDialogs().visible("paragraph")) + return; + Paragraph const & par = *bv_->getLyXText()->cursorPar(); + string data; + params2string(par, data); + + // Will the paragraph accept changes from the dialog? + InsetOld * const inset = par.inInset(); + bool const accept = + !(inset && inset->forceDefaultParagraphs(inset)); + + data = "update " + tostr(accept) + '\n' + data; + bv_->owner()->getDialogs().update("paragraph", data); +}