X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2FBufferView.C;h=01cfc41d8eef8fbf3e737869f29d0133340a3e2b;hb=e94889a041628203c50b66b9a4add63210de6928;hp=53c9c3c310016a81cd0bc286278c79d03d707def;hpb=4bcfc43c2958ef6dd083210ed25db4eb5a290a87;p=lyx.git diff --git a/src/BufferView.C b/src/BufferView.C index 53c9c3c310..01cfc41d8e 100644 --- a/src/BufferView.C +++ b/src/BufferView.C @@ -20,17 +20,20 @@ #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" @@ -42,13 +45,11 @@ #include "frontends/WorkArea.h" #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; @@ -60,9 +61,8 @@ 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)) +BufferView::BufferView(LyXView * owner, int width, int height) + : pimpl_(new Pimpl(*this, owner, width, height)) {} @@ -102,15 +102,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); } @@ -141,9 +141,9 @@ bool BufferView::fitCursor() } -void BufferView::update() +void BufferView::update(Update::flags flags) { - pimpl_->update(); + pimpl_->update(flags); } @@ -159,12 +159,6 @@ void BufferView::scrollDocView(int value) } -void BufferView::redoCurrentBuffer() -{ - pimpl_->redoCurrentBuffer(); -} - - bool BufferView::available() const { return pimpl_->available(); @@ -194,6 +188,10 @@ bool BufferView::isSavedPosition(unsigned int i) return pimpl_->isSavedPosition(i); } +void BufferView::saveSavedPositions() +{ + return pimpl_->saveSavedPositions(); +} void BufferView::switchKeyMap() { @@ -213,69 +211,70 @@ void BufferView::center() } -int BufferView::top_y() const +string const BufferView::getClipboard() const { - return pimpl_->top_y(); + return pimpl_->workarea().getClipboard(); } -void BufferView::top_y(int y) +void BufferView::stuffClipboard(string const & stuff) const { - pimpl_->top_y(y); + pimpl_->stuffClipboard(stuff); } -string const BufferView::getClipboard() const +FuncStatus BufferView::getStatus(FuncRequest const & cmd) { - return pimpl_->workarea().getClipboard(); + return pimpl_->getStatus(cmd); } -void BufferView::stuffClipboard(string const & stuff) const +bool BufferView::dispatch(FuncRequest const & ev) { - pimpl_->stuffClipboard(stuff); + return pimpl_->dispatch(ev); } -bool BufferView::dispatch(FuncRequest const & ev) +void BufferView::selectionRequested() { - return pimpl_->dispatch(ev); + pimpl_->selectionRequested(); } -void BufferView::scroll(int lines) +void BufferView::selectionLost() { - pimpl_->scroll(lines); + pimpl_->selectionLost(); } -// 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::workAreaResize() { - BOOST_ASSERT(!filen.empty()); + pimpl_->workAreaResize(); +} - string const fname = MakeAbsPath(filen); - cursor().clearSelection(); - text()->breakParagraph(cursor()); +void BufferView::workAreaKeyPress(LyXKeySymPtr key, key_modifier::state state) +{ + pimpl_->workAreaKeyPress(key, state); +} - bool res = buffer()->readFile(fname, text()->cursorPar()); - resize(); - return res; + +bool BufferView::workAreaDispatch(FuncRequest const & ev) +{ + return pimpl_->workAreaDispatch(ev); +} + + +void BufferView::scroll(int lines) +{ + pimpl_->scroll(lines); } void BufferView::showErrorList(string const & action) const { if (getErrorList().size()) { - string const title = bformat(_("LyX: %1$s errors (%2$s)"), + string const title = bformat(_("%1$s Errors (%2$s)"), action, buffer()->fileName()); owner()->getDialogs().show("errorlist", title); pimpl_->errorlist_.clear(); @@ -297,26 +296,19 @@ 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( - text()->parOffset(buffer()->getParFromID(tmpid).pit()), - tmppos); + 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()) { - cursor().clearSelection(); - text()->setCursor( - distance(text()->paragraphs().begin(), it.getPar()), - it.getPos()); - cursor().resetAnchor(); + setCursor(it); update(); return; } @@ -329,44 +321,19 @@ void BufferView::hideCursor() screen().hideCursor(); } - -bool BufferView::ChangeRefsIfUnique(string const & from, string const & to) +LyXText * BufferView::getLyXText() { - // 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); + LyXText * text = cursor().innerText(); + BOOST_ASSERT(text); + return text; } -LyXText * BufferView::getLyXText() const +LyXText const * BufferView::getLyXText() const { - return cursor().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; - CursorSlice const & cur = cursor().innerTextSlice(); - return t->getPar(cur.par())->getFont( - buffer()->params(), cur.pos(), - outerFont(t->getPar(cur.par()), t->paragraphs()) - ).language()->encoding(); + LyXText const * text = cursor().innerText(); + BOOST_ASSERT(text); + return text; } @@ -384,65 +351,67 @@ int BufferView::workHeight() const LyXText * BufferView::text() const { - return pimpl_->buffer_ ? &pimpl_->buffer_->text() : 0; + return buffer() ? &buffer()->text() : 0; } -void BufferView::setCursor(ParIterator const & par, - lyx::pos_type pos) +void BufferView::setCursor(DocIterator const & dit) { - LCursor & cur = cursor(); - cur.reset(); - ParIterator::PosHolder const & positions = par.positions(); - int const last = par.size() - 1; - for (int i = 0; i < last; ++i) - (*positions[i].it)->inset->edit(cur, true); - cur.resetAnchor(); - LyXText * lt = par.text(*buffer()); - lt->setCursor(lt->parOffset(par.pit()), pos); + size_t const n = dit.depth(); + for (size_t i = 0; i < n; ++i) + dit[i].inset().edit(cursor(), true); + + cursor().setCursor(dit); + cursor().selection() = false; } -/* -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 putSelectionAt with: +void BufferView::mouseSetCursor(LCursor & cur) +{ + BOOST_ASSERT(&cur.bv() == this); + + // Has the cursor just left the inset? + if (&cursor().inset() != &cur.inset()) + cursor().inset().notifyCursorLeaves(cursor()); -- setting top_y to the y of the outerPar (that has good info) -- calling update -- calling cursor().updatePos() -- then call fitCursor() + // do the dEPM magic if needed + if (cursor().inTexted()) + cursor().text()->deleteEmptyParagraphMechanism(cur, cursor()); -Ab. -*/ + cursor() = cur; + cursor().clearSelection(); + cursor().setTargetX(); + finishUndo(); -void BufferView::putSelectionAt(PosIterator const & cur, - int length, bool backwards) -{ - ParIterator par(cur); +} + +void BufferView::putSelectionAt(DocIterator const & cur, + int length, bool backwards) +{ cursor().clearSelection(); - LyXText * text = par.text(*buffer()); - setCursor(par, cur.pos()); - - // hack for the chicken and egg problem - if (par.inset()) - top_y(par.outerPar()->y); - update(); - text->setCursor(text->parOffset(cur.pit()), cur.pos()); - cursor().updatePos(); + setCursor(cur); if (length) { - text->setSelectionRange(cursor(), length); - cursor().setSelection(); - if (backwards) - swap(cursor().cursor_, cursor().anchor_); + if (backwards) { + cursor().pos() += length; + cursor().setSelection(cursor(), -length); + } else + cursor().setSelection(cursor(), length); } +} - fitCursor(); - update(); + +bool const BufferView::repaintAll() const +{ + return pimpl_->repaintAll(); +} + + +void const BufferView::repaintAll(bool r) const +{ + pimpl_->repaintAll(r); } @@ -456,3 +425,15 @@ LCursor const & BufferView::cursor() const { return pimpl_->cursor_; } + + +lyx::pit_type BufferView::anchor_ref() const +{ + return pimpl_->anchor_ref_; +} + + +int BufferView::offset_ref() const +{ + return pimpl_->offset_ref_; +}