X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2FBufferView.C;h=2be15d5e9009e3e493bc6c649a330df6f615f08f;hb=37e82a546392d43f787826b85481a11f2a27af15;hp=ecfdd5543b694ae3536646924094e2c4c9d61548;hpb=69bee02a8901793b34ac5ca6d07e93910cef4005;p=lyx.git diff --git a/src/BufferView.C b/src/BufferView.C index ecfdd5543b..2be15d5e90 100644 --- a/src/BufferView.C +++ b/src/BufferView.C @@ -18,17 +18,22 @@ #include "buffer.h" #include "bufferlist.h" +#include "bufferparams.h" #include "BufferView_pimpl.h" +#include "CutAndPaste.h" +#include "coordcache.h" #include "debug.h" #include "funcrequest.h" +#include "FuncStatus.h" #include "gettext.h" -#include "iterators.h" +#include "insetiterator.h" #include "language.h" #include "lyxlayout.h" #include "lyxtext.h" +#include "lyxtextclass.h" #include "paragraph.h" #include "paragraph_funcs.h" -#include "PosIterator.h" +#include "pariterator.h" #include "texrow.h" #include "undo.h" #include "WordLangTuple.h" @@ -41,25 +46,24 @@ #include "insets/insetcommand.h" // ChangeRefs #include "insets/updatableinset.h" - -#include "support/filetools.h" -#include "support/lyxalgo.h" // lyx_count +#include "insets/insettext.h" using lyx::support::bformat; -using lyx::support::MakeAbsPath; +using lyx::cap::setSelectionRange; + +using std::distance; using std::find; using std::string; +using std::swap; using std::vector; extern BufferList bufferlist; -BufferView::BufferView(LyXView * owner, int xpos, int ypos, - int width, int height) - : pimpl_(new Pimpl(*this, owner, xpos, ypos, width, height)), - x_target_(0) +BufferView::BufferView(LyXView * owner, int width, int height) + : pimpl_(new Pimpl(*this, owner, width, height)) {} @@ -99,15 +103,15 @@ Painter & BufferView::painter() const } -void BufferView::buffer(Buffer * b) +void BufferView::setBuffer(Buffer * b) { - pimpl_->buffer(b); + pimpl_->setBuffer(b); } -bool BufferView::newFile(string const & fn, string const & tn, bool named) +void BufferView::newFile(string const & fn, string const & tn, bool named) { - return pimpl_->newFile(fn, tn, named); + pimpl_->newFile(fn, tn, named); } @@ -138,9 +142,9 @@ bool BufferView::fitCursor() } -void BufferView::update() +void BufferView::update(bool fitcursor, bool forceupdate) { - pimpl_->update(); + pimpl_->update(fitcursor, forceupdate); } @@ -156,12 +160,6 @@ void BufferView::scrollDocView(int value) } -void BufferView::redoCurrentBuffer() -{ - pimpl_->redoCurrentBuffer(); -} - - bool BufferView::available() const { return pimpl_->available(); @@ -210,18 +208,6 @@ void BufferView::center() } -int BufferView::top_y() const -{ - return pimpl_->top_y(); -} - - -void BufferView::top_y(int y) -{ - pimpl_->top_y(y); -} - - string const BufferView::getClipboard() const { return pimpl_->workarea().getClipboard(); @@ -234,38 +220,21 @@ void BufferView::stuffClipboard(string const & stuff) const } -bool BufferView::dispatch(FuncRequest const & ev) +FuncStatus BufferView::getStatus(FuncRequest const & cmd) { - return pimpl_->dispatch(ev); + return pimpl_->getStatus(cmd); } -void BufferView::scroll(int lines) +bool BufferView::dispatch(FuncRequest const & ev) { - pimpl_->scroll(lines); + return pimpl_->dispatch(ev); } -// Inserts a file into current document -bool BufferView::insertLyXFile(string const & filen) - // - // Copyright CHT Software Service GmbH - // Uwe C. Schroeder - // - // Insert a LyXformat - file into current buffer - // - // Moved from lyx_cb.C (Lgb) +void BufferView::scroll(int lines) { - BOOST_ASSERT(!filen.empty()); - - string const fname = MakeAbsPath(filen); - - clearSelection(); - text()->breakParagraph(buffer()->paragraphs()); - - bool res = buffer()->readFile(fname, text()->cursorPar()); - resize(); - return res; + pimpl_->scroll(lines); } @@ -294,30 +263,21 @@ void BufferView::setCursorFromRow(int row) buffer()->texrow().getIdFromRow(row, tmpid, tmppos); if (tmpid == -1) - text()->setCursor(0, 0); + text()->setCursor(cursor(), 0, 0); else - text()->setCursor(buffer()->getParFromID(tmpid).pit(), tmppos); -} - - -bool BufferView::insertInset(InsetOld * inset, string const & lout) -{ - return pimpl_->insertInset(inset, lout); + text()->setCursor(cursor(), buffer()->getParFromID(tmpid).pit(), tmppos); } void BufferView::gotoLabel(string const & label) { - for (Buffer::inset_iterator it = buffer()->inset_iterator_begin(); - it != buffer()->inset_iterator_end(); ++it) { + for (InsetIterator it = inset_iterator_begin(buffer()->inset()); it; ++it) { vector labels; it->getLabelList(*buffer(), labels); if (find(labels.begin(),labels.end(),label) != labels.end()) { - clearSelection(); - text()->setCursor( - std::distance(text()->paragraphs().begin(), it.getPar()), - it.getPos()); - resetAnchor(); + cursor().clearSelection(); + text()->setCursor(cursor(), it.pit(), it.pos()); + cursor().resetAnchor(); update(); return; } @@ -325,103 +285,17 @@ void BufferView::gotoLabel(string const & label) } -void BufferView::undo() -{ - if (!available()) - return; - - owner()->message(_("Undo")); - clearSelection(); - if (!textUndo(this)) - owner()->message(_("No further undo information")); - update(); - switchKeyMap(); -} - - -void BufferView::redo() -{ - if (!available()) - return; - - owner()->message(_("Redo")); - clearSelection(); - if (!textRedo(this)) - owner()->message(_("No further redo information")); - update(); - switchKeyMap(); -} - - -void BufferView::replaceWord(string const & replacestring) -{ - if (!available()) - return; - - LyXText * t = getLyXText(); - - t->replaceSelectionWithString(replacestring); - t->setSelectionRange(replacestring.length()); - - // Go back so that replacement string is also spellchecked - for (string::size_type i = 0; i < replacestring.length() + 1; ++i) - t->cursorLeft(this); - - // FIXME: should be done through LFUN - buffer()->markDirty(); - update(); -} - - void BufferView::hideCursor() { screen().hideCursor(); } -bool BufferView::ChangeRefsIfUnique(string const & from, string const & to) -{ - // Check if the label 'from' appears more than once - vector labels; - buffer()->getLabelList(labels); - - if (lyx::count(labels.begin(), labels.end(), from) > 1) - return false; - - return pimpl_->ChangeInsets(InsetOld::REF_CODE, from, to); -} - - -UpdatableInset * BufferView::innerInset() const -{ - return static_cast(fullCursor().innerInset()); -} - - LyXText * BufferView::getLyXText() const { - return fullCursor().innerText(); -} - - -Language const * BufferView::getParentLanguage(InsetOld * inset) const -{ - Paragraph const & par = ownerPar(*buffer(), inset); - return par.getFontSettings(buffer()->params(), - par.getPositionOfInset(inset)).language(); -} - - -Encoding const * BufferView::getEncoding() const -{ - LyXText * t = getLyXText(); - if (!t) - return 0; - return t->cursorPar()->getFont( - buffer()->params(), - t->cursor().pos(), - outerFont(t->cursorPar(), t->paragraphs()) - ).language()->encoding(); + LyXText * text = cursor().innerText(); + BOOST_ASSERT(text); + return text; } @@ -437,185 +311,60 @@ int BufferView::workHeight() const } -void BufferView::fullCursor(LCursor const & cur) -{ - pimpl_->cursor_ = cur; -} - - -LCursor & BufferView::fullCursor() -{ - return pimpl_->cursor_; -} - - -LCursor const & BufferView::fullCursor() const -{ - return pimpl_->cursor_; -} - - -CursorSlice & BufferView::cursor() -{ - return fullCursor().cursor_.back(); -} - - -CursorSlice const & BufferView::cursor() const -{ - return fullCursor().cursor_.back(); -} - - -CursorSlice & BufferView::anchor() -{ - return fullCursor().anchor_.back(); -} - - -CursorSlice const & BufferView::anchor() const -{ - return fullCursor().anchor_.back(); -} - - -Selection & BufferView::selection() -{ - return selection_; -} - - -Selection const & BufferView::selection() const -{ - return selection_; -} - - -void BufferView::x_target(int x) -{ - x_target_ = x; -} - - -int BufferView::x_target() const -{ - return x_target_; -} - - -void BufferView::updateParagraphDialog() -{ - pimpl_->updateParagraphDialog(); -} - - LyXText * BufferView::text() const { - return pimpl_->buffer_ ? &pimpl_->buffer_->text() : 0; + return buffer() ? &buffer()->text() : 0; } -void BufferView::resetAnchor() +void BufferView::setCursor(ParIterator const & par, lyx::pos_type pos) { - return fullCursor().resetAnchor(); -} + for (int i = 0, n = par.size(); i < n; ++i) + par[i].inset().edit(cursor(), true); - -CursorSlice const & BufferView::selStart() const -{ - if (!selection().set()) - return cursor(); - // can't use std::min as this creates a new object - return anchor() < cursor() ? anchor() : cursor(); + cursor().setCursor(makeDocIterator(par, pos)); + cursor().selection() = false; } -CursorSlice const & BufferView::selEnd() const +void BufferView::putSelectionAt(DocIterator const & cur, + int length, bool backwards) { - if (!selection().set()) - return cursor(); - return anchor() > cursor() ? anchor() : cursor(); -} - + ParIterator par(cur); -CursorSlice & BufferView::selStart() -{ - if (!selection().set()) - return cursor(); - return anchor() < cursor() ? anchor() : cursor(); -} + cursor().clearSelection(); + setCursor(par, cur.pos()); -CursorSlice & BufferView::selEnd() -{ - if (selection().set()) - return cursor(); - return anchor() > cursor() ? anchor() : cursor(); + if (length) { + if (backwards) { + cursor().pos() += length; + cursor().setSelection(cursor(), -length); + } else + cursor().setSelection(cursor(), length); + } } -void BufferView::setSelection() +LCursor & BufferView::cursor() { - selection().set(true); - // a selection with no contents is not a selection - if (cursor().par() == anchor().par() && cursor().pos() == anchor().pos()) - selection().set(false); + return pimpl_->cursor_; } -void BufferView::clearSelection() +LCursor const & BufferView::cursor() const { - selection().set(false); - selection().mark(false); - resetAnchor(); - unsetXSel(); + return pimpl_->cursor_; } - -/* -if the fitCursor call refers to some point in never-explored-land, then we -don't have y information in insets there, then we cannot even do an update -to get it (because we need the y infomation for setting top_y first). So -this is solved in put_selection_at with: - -- setting top_y to the y of the outerPar (that has good info) -- calling update -- calling cursor().updatePos() -- then call fitCursor() - -Ab. -*/ - -void BufferView::putSelectionAt(PosIterator const & cur, - int length, bool backwards) +lyx::pit_type BufferView::anchor_ref() const { - ParIterator par(cur); - - clearSelection(); - - LyXText * text = par.text(*buffer()); - par.lockPath(this); - // hack for the chicken and egg problem - if (par.inset()) - top_y(par.outerPar()->y); - update(); - text->setCursor(cur.pit(), cur.pos()); - fullCursor().updatePos(); - - if (length) { - text->setSelectionRange(length); - setSelection(); - if (backwards) - std::swap(cursor(), anchor()); - } - - fitCursor(); - update(); + return pimpl_->anchor_ref_; } -CursorSlice & cursorTip(BufferView & bv) +int BufferView::offset_ref() const { - return bv.cursor(); + return pimpl_->offset_ref_; }