From d34600cd3e5822abcc5790efbd0e944a72c9dc8b Mon Sep 17 00:00:00 2001 From: Alfredo Braunstein Date: Thu, 1 Apr 2004 08:58:45 +0000 Subject: [PATCH] add BufferView::getStatus and use it + some lyx::find fixes git-svn-id: svn://svn.lyx.org/lyx/lyx-devel/trunk@8582 a592a061-630c-0410-9148-cb99ea01b6c8 --- src/BufferView.C | 7 +++++ src/BufferView.h | 3 +++ src/BufferView_pimpl.C | 60 +++++++++++++++++++++++++++++++++++++++--- src/BufferView_pimpl.h | 3 +++ src/ChangeLog | 9 +++++++ src/cursor.C | 3 +-- src/lyxfind.C | 25 +++++++++--------- src/lyxfunc.C | 28 +++----------------- 8 files changed, 95 insertions(+), 43 deletions(-) diff --git a/src/BufferView.C b/src/BufferView.C index f517757966..e1176d8f32 100644 --- a/src/BufferView.C +++ b/src/BufferView.C @@ -23,6 +23,7 @@ #include "CutAndPaste.h" #include "debug.h" #include "funcrequest.h" +#include "FuncStatus.h" #include "gettext.h" #include "insetiterator.h" #include "language.h" @@ -241,6 +242,12 @@ void BufferView::stuffClipboard(string const & stuff) const } +FuncStatus BufferView::getStatus(FuncRequest const & cmd) +{ + return pimpl_->getStatus(cmd); +} + + bool BufferView::dispatch(FuncRequest const & ev) { return pimpl_->dispatch(ev); diff --git a/src/BufferView.h b/src/BufferView.h index 10ee911ab7..a7f3c952d5 100644 --- a/src/BufferView.h +++ b/src/BufferView.h @@ -27,6 +27,7 @@ class DocIterator; class Encoding; class ErrorList; class FuncRequest; +class FuncStatus; class InsetBase; class InsetOld; class Language; @@ -158,6 +159,8 @@ public: /// tell the window system we have a selection void haveSelection(bool sel); + /// return true for events that will handle + FuncStatus getStatus(FuncRequest const & cmd); /// execute the given function bool dispatch(FuncRequest const & argument); diff --git a/src/BufferView_pimpl.C b/src/BufferView_pimpl.C index 718984a5cf..20fefddfd6 100644 --- a/src/BufferView_pimpl.C +++ b/src/BufferView_pimpl.C @@ -29,6 +29,7 @@ #include "factory.h" #include "FloatList.h" #include "funcrequest.h" +#include "FuncStatus.h" #include "gettext.h" #include "intl.h" #include "insetiterator.h" @@ -918,6 +919,61 @@ bool BufferView::Pimpl::workAreaDispatch(FuncRequest const & cmd0) } +FuncStatus BufferView::Pimpl::getStatus(FuncRequest const & cmd) +{ + Buffer * buf = bv_->buffer(); + + FuncStatus flag; + + switch (cmd.action) { + + case LFUN_UNDO: + flag.enabled(!buf->undostack().empty()); + break; + case LFUN_REDO: + flag.enabled(!buf->redostack().empty()); + break; + case LFUN_FILE_INSERT: + case LFUN_FILE_INSERT_ASCII_PARA: + case LFUN_FILE_INSERT_ASCII: + case LFUN_FONT_STATE: + case LFUN_INSERT_LABEL: + case LFUN_BOOKMARK_SAVE: + case LFUN_REF_GOTO: + case LFUN_WORD_FIND: + case LFUN_WORD_REPLACE: + case LFUN_MARK_OFF: + case LFUN_MARK_ON: + case LFUN_SETMARK: + case LFUN_CENTER: + case LFUN_BEGINNINGBUFSEL: + case LFUN_ENDBUFSEL: + flag.enabled(true); + break; + case LFUN_BOOKMARK_GOTO: + flag.enabled(bv_->isSavedPosition(strToUnsignedInt(cmd.argument))); + break; + case LFUN_TRACK_CHANGES: + flag.enabled(true); + flag.setOnOff(buf->params().tracking_changes); + break; + + case LFUN_MERGE_CHANGES: + case LFUN_ACCEPT_CHANGE: // what about these two + case LFUN_REJECT_CHANGE: // what about these two + case LFUN_ACCEPT_ALL_CHANGES: + case LFUN_REJECT_ALL_CHANGES: + flag.enabled(buf && buf->params().tracking_changes); + break; + default: + flag.enabled(false); + } + + return flag; +} + + + bool BufferView::Pimpl::dispatch(FuncRequest const & cmd) { //lyxerr << "BufferView::Pimpl::dispatch cmd: " << cmd << std::endl; @@ -1068,10 +1124,6 @@ bool BufferView::Pimpl::dispatch(FuncRequest const & cmd) update(); break; - case LFUN_UNKNOWN_ACTION: - cur.errorMessage(N_("Unknown function!")); - break; - case LFUN_CENTER: bv_->center(); break; diff --git a/src/BufferView_pimpl.h b/src/BufferView_pimpl.h index bb969dff47..d98925866c 100644 --- a/src/BufferView_pimpl.h +++ b/src/BufferView_pimpl.h @@ -40,6 +40,7 @@ class LyXView; class WorkArea; class LyXScreen; class FuncRequest; +class FuncStatus; /// @@ -99,6 +100,8 @@ struct BufferView::Pimpl : public boost::signals::trackable { void center(); /// a function should be executed from the workarea bool workAreaDispatch(FuncRequest const & ev); + /// return true for events that will handle + FuncStatus getStatus(FuncRequest const & cmd); /// a function should be executed bool dispatch(FuncRequest const & ev); /// diff --git a/src/ChangeLog b/src/ChangeLog index 2c06800ea8..8db9bff172 100644 --- a/src/ChangeLog +++ b/src/ChangeLog @@ -1,4 +1,13 @@ +2004-04-01 Alfredo Braunstein + + * lyxfind.C: add a couple of inTexted() tests + other small fixes + * BufferView_pimpl.[Ch] (getStatus) + * BufferView.[Ch] (getStatus): add + * lyxfunc.C (getStatus): move lfuns handled in + BufferView::dispatch to te function above + * Cursor.C (setSelection): set selection() = true + 2004-04-01 Alfredo Braunstein * lyxfunc.C (getStatus): enable LFUN_WORD_{FIND,REPLACE} diff --git a/src/cursor.C b/src/cursor.C index 926c341e86..5b27a79b7c 100644 --- a/src/cursor.C +++ b/src/cursor.C @@ -371,8 +371,7 @@ void LCursor::setSelection() void LCursor::setSelection(DocIterator const & where, size_t n) { - selection() = true; - setCursor(where, false); + setCursor(where, true); anchor_ = where; pos() += n; } diff --git a/src/lyxfind.C b/src/lyxfind.C index ba654484c7..bca895c002 100644 --- a/src/lyxfind.C +++ b/src/lyxfind.C @@ -75,7 +75,7 @@ public: for (i = 0; pos + i < parsize; ++i) { if (string::size_type(i) >= size) break; - if (cs && str[i] != par.getChar(pos + i)) + if (cs && str[i] != par.getChar(pos + i)) break; if (!cs && uppercase(str[i]) != uppercase(par.getChar(pos + i))) break; @@ -86,7 +86,7 @@ public: // if necessary, check whether string matches word if (mw) { - if (pos > 0 && IsLetterCharOrDigit(par.getChar(pos - 1))) + if (pos > 0 && IsLetterCharOrDigit(par.getChar(pos - 1))) return false; if (pos + lyx::pos_type(size) < parsize && IsLetterCharOrDigit(par.getChar(pos + size))); @@ -108,8 +108,8 @@ private: bool findForward(DocIterator & cur, MatchString const & match) { - for (; cur.size(); cur.forwardChar()) - if (match(cur.paragraph(), cur.pos())) + for (; cur; cur.forwardChar()) + if (cur.inTexted() && match(cur.paragraph(), cur.pos())) return true; return false; } @@ -117,8 +117,8 @@ bool findForward(DocIterator & cur, MatchString const & match) bool findBackwards(DocIterator & cur, MatchString const & match) { - for (; cur.size(); cur.backwardChar()) - if (match(cur.paragraph(), cur.pos())) + for (; cur; cur.backwardChar()) + if (cur.inTexted() && match(cur.paragraph(), cur.pos())) return true; return false; } @@ -126,9 +126,10 @@ bool findBackwards(DocIterator & cur, MatchString const & match) bool findChange(DocIterator & cur) { - for (; cur.size(); cur.forwardChar()) - if ((cur.paragraph().empty() || !cur.empty()) - && cur.paragraph().lookupChange(cur.pos()) != Change::UNCHANGED) + for (; cur; cur.forwardChar()) + if (cur.inTexted() && !cur.paragraph().empty() && + cur.paragraph().lookupChange(cur.pos()) + != Change::UNCHANGED) return true; return false; } @@ -179,7 +180,7 @@ int replaceAll(BufferView * bv, int const rsize = replacestr.size(); int const ssize = searchstr.size(); - DocIterator cur = DocIterator(buf.inset()); + DocIterator cur = doc_iterator_begin(buf.inset()); while (findForward(cur, match)) { lyx::pos_type pos = cur.pos(); LyXFont const font @@ -192,7 +193,7 @@ int replaceAll(BufferView * bv, } bv->text()->init(bv); - bv->putSelectionAt(DocIterator(buf.inset()), 0, false); + bv->putSelectionAt(doc_iterator_begin(buf.inset()), 0, false); if (num) buf.markDirty(); return num; @@ -337,7 +338,7 @@ bool findNextChange(BufferView * bv) if (!bv->available()) return false; - DocIterator cur = DocIterator(bv->buffer()->inset()); + DocIterator cur = DocIterator(bv->cursor()); if (!findChange(cur)) return false; diff --git a/src/lyxfunc.C b/src/lyxfunc.C index 27651bfd5b..550b627fe3 100644 --- a/src/lyxfunc.C +++ b/src/lyxfunc.C @@ -328,20 +328,10 @@ FuncStatus LyXFunc::getStatus(FuncRequest const & cmd) const flag.setOnOff(true); break; - case LFUN_TRACK_CHANGES: - flag.setOnOff(buf->params().tracking_changes); - break; - case LFUN_EXPORT: enable = cmd.argument == "custom" || Exporter::IsExportable(*buf, cmd.argument); break; - case LFUN_UNDO: - enable = !buf->undostack().empty(); - break; - case LFUN_REDO: - enable = !buf->redostack().empty(); - break; case LFUN_CUT: case LFUN_COPY: enable = cur.selection(); @@ -380,17 +370,7 @@ FuncStatus LyXFunc::getStatus(FuncRequest const & cmd) const case LFUN_MENURELOAD: enable = !buf->isUnnamed() && !buf->isClean(); break; - case LFUN_BOOKMARK_GOTO: - enable = view()->isSavedPosition(strToUnsignedInt(cmd.argument)); - break; - case LFUN_MERGE_CHANGES: - case LFUN_ACCEPT_CHANGE: - case LFUN_REJECT_CHANGE: - case LFUN_ACCEPT_ALL_CHANGES: - case LFUN_REJECT_ALL_CHANGES: - enable = buf && buf->params().tracking_changes; - break; case LFUN_INSET_SETTINGS: { enable = false; @@ -497,9 +477,6 @@ FuncStatus LyXFunc::getStatus(FuncRequest const & cmd) const case LFUN_SET_COLOR: case LFUN_MESSAGE: case LFUN_EXTERNAL_EDIT: - case LFUN_FILE_INSERT: - case LFUN_FILE_INSERT_ASCII: - case LFUN_FILE_INSERT_ASCII_PARA: case LFUN_ALL_INSETS_TOGGLE: case LFUN_LANGUAGE_BUFFER: case LFUN_TEXTCLASS_APPLY: @@ -507,13 +484,14 @@ FuncStatus LyXFunc::getStatus(FuncRequest const & cmd) const case LFUN_SAVE_AS_DEFAULT: case LFUN_BUFFERPARAMS_APPLY: case LFUN_LYXRC_APPLY: - case LFUN_WORD_FIND: - case LFUN_WORD_REPLACE: // these are handled in our dispatch() break; default: + cur.getStatus(cmd, flag); + if (!flag.enabled()) + flag = view()->getStatus(cmd); } if (!enable) -- 2.39.2