]> git.lyx.org Git - lyx.git/blobdiff - src/BufferView.cpp
The logic of the endParagraph() routine is wrong. We should first
[lyx.git] / src / BufferView.cpp
index a06b6fec4561d10a01bf02d006f931043d0d43d4..9a4e5d326adad34122b887751e460443f673a29c 100644 (file)
@@ -1034,9 +1034,17 @@ bool BufferView::getStatus(FuncRequest const & cmd, FuncStatus & flag)
                // buffer clean/dirty status by itself.
                flag.setEnabled(!buffer_.isReadonly() && buffer_.undo().hasRedoStack());
                break;
-       case LFUN_FILE_INSERT:
        case LFUN_FILE_INSERT_PLAINTEXT_PARA:
-       case LFUN_FILE_INSERT_PLAINTEXT:
+       case LFUN_FILE_INSERT_PLAINTEXT: {
+               docstring const fname = cmd.argument();
+               if (!FileName::isAbsolute(to_utf8(fname))) {
+                       flag.message(_("Absolute filename expected."));
+                       return false;
+               }
+               flag.setEnabled(cur.inTexted());
+               break;
+       }
+       case LFUN_FILE_INSERT:
        case LFUN_BOOKMARK_SAVE:
                // FIXME: Actually, these LFUNS should be moved to Text
                flag.setEnabled(cur.inTexted());
@@ -1051,7 +1059,6 @@ bool BufferView::getStatus(FuncRequest const & cmd, FuncStatus & flag)
        case LFUN_WORD_FIND:
        case LFUN_WORD_FIND_FORWARD:
        case LFUN_WORD_FIND_BACKWARD:
-       case LFUN_WORD_FINDADV:
        case LFUN_WORD_REPLACE:
        case LFUN_MARK_OFF:
        case LFUN_MARK_ON:
@@ -1069,6 +1076,14 @@ bool BufferView::getStatus(FuncRequest const & cmd, FuncStatus & flag)
                flag.setEnabled(true);
                break;
 
+       case LFUN_WORD_FINDADV: {
+               FindAndReplaceOptions opt;
+               istringstream iss(to_utf8(cmd.argument()));
+               iss >> opt;
+               flag.setEnabled(opt.repl_buf_name.empty()
+                               || !buffer_.isReadonly());
+       }
+
        case LFUN_LABEL_GOTO: {
                flag.setEnabled(!cmd.argument().empty()
                    || getInsetByCode<InsetRef>(cur, REF_CODE));
@@ -1640,9 +1655,10 @@ void BufferView::dispatch(FuncRequest const & cmd, DispatchResult & dr)
                        from = doc_iterator_begin(&buffer_);
                        to = doc_iterator_end(&buffer_);
                }
-               int const words = countWords(from, to);
-               int const chars = countChars(from, to, false);
-               int const chars_blanks = countChars(from, to, true);
+               buffer_.updateStatistics(from, to);
+               int const words = buffer_.wordCount();
+               int const chars = buffer_.charCount(false);
+               int const chars_blanks = buffer_.charCount(true);
                docstring message;
                if (cur.selection())
                        message = _("Statistics for the selection:");
@@ -1707,10 +1723,11 @@ void BufferView::dispatch(FuncRequest const & cmd, DispatchResult & dr)
                //FIXME: what to do with cur.x_target()?
                bool update = in_texted && cur.bv().checkDepm(cur, old);
                cur.finishUndo();
-               if (update || cur.selection()) {
-                       dr.screenUpdate(Update::Force | Update::FitCursor);
+
+               if (update || cur.mark())
+                       dr.screenUpdate(Update::Force | Update::FitCursor);     
+               if (update)
                        dr.forceBufferUpdate();
-               }
                break;
        }
 
@@ -1740,6 +1757,7 @@ void BufferView::dispatch(FuncRequest const & cmd, DispatchResult & dr)
        }
 
        case LFUN_SCREEN_UP_SELECT: {
+               // FIXME: why is the algorithm different from LFUN_SCREEN_UP?
                cur.selHandle(true);
                if (isTopScreen()) {
                        lyx::dispatch(FuncRequest(LFUN_BUFFER_BEGIN_SELECT));
@@ -1757,6 +1775,7 @@ void BufferView::dispatch(FuncRequest const & cmd, DispatchResult & dr)
        }
 
        case LFUN_SCREEN_DOWN_SELECT: {
+               // FIXME: why is the algorithm different from LFUN_SCREEN_DOWN?
                cur.selHandle(true);
                if (isBottomScreen()) {
                        lyx::dispatch(FuncRequest(LFUN_BUFFER_END_SELECT));
@@ -1782,7 +1801,7 @@ void BufferView::dispatch(FuncRequest const & cmd, DispatchResult & dr)
                FuncRequest const fr = lyxaction.lookupFunc(commandstr);
 
                // an arbitrary number to limit number of iterations
-               const int max_iter = 10000;
+               const int max_iter = 100000;
                int iterations = 0;
                Cursor & cur = d->cursor_;
                Cursor const savecur = cur;
@@ -1937,6 +1956,16 @@ void BufferView::dispatch(FuncRequest const & cmd, DispatchResult & dr)
                        cur.setCurrentFont();
                        dr.forceBufferUpdate();
                }
+       }
+
+       case LFUN_FILE_INSERT_PLAINTEXT_PARA:
+       case LFUN_FILE_INSERT_PLAINTEXT: {
+               bool const as_paragraph = (act == LFUN_FILE_INSERT_PLAINTEXT_PARA);
+               string const fname = to_utf8(cmd.argument());
+               if (!FileName::isAbsolute(fname))
+                       dr.setMessage(_("Absolute filename expected."));
+               else
+                       insertPlaintextFile(FileName(fname), as_paragraph);
                break;
        }