]> git.lyx.org Git - lyx.git/blobdiff - src/lyxfunc.C
Fix bug 2195: Slowness in rendering inside insets, especially on the Mac
[lyx.git] / src / lyxfunc.C
index 274ff9678e57a053bf7917f45d33028228d9baa6..7a7882d85f4688cfea484db224cccb1dfbddb5fe 100644 (file)
@@ -307,7 +307,8 @@ void LyXFunc::processKeySym(LyXKeySymPtr keysym, key_modifier::state state)
                // by a binding
                if (keysym->isText() && keyseq.length() == 1) {
                        lyxerr[Debug::KEY] << "isText() is true, inserting." << endl;
-                       func = FuncRequest(LFUN_SELFINSERT);
+                       func = FuncRequest(LFUN_SELFINSERT, 
+                                          FuncRequest::KEYBOARD);
                } else {
                        lyxerr[Debug::KEY] << "Unknown, !isText() - giving up" << endl;
                        owner->message(_("Unknown function."));
@@ -318,7 +319,8 @@ void LyXFunc::processKeySym(LyXKeySymPtr keysym, key_modifier::state state)
        if (func.action == LFUN_SELFINSERT) {
                if (encoded_last_key != 0) {
                        string const arg(1, encoded_last_key);
-                       dispatch(FuncRequest(LFUN_SELFINSERT, arg));
+                       dispatch(FuncRequest(LFUN_SELFINSERT, arg, 
+                                            FuncRequest::KEYBOARD));
                        lyxerr[Debug::KEY]
                                << "SelfInsert arg[`" << arg << "']" << endl;
                }
@@ -411,10 +413,6 @@ FuncStatus LyXFunc::getStatus(FuncRequest const & cmd) const
                enable = cmd.argument == "custom"
                        || Exporter::IsExportable(*buf, cmd.argument);
                break;
-       case LFUN_CUT:
-       case LFUN_COPY:
-               enable = cur.selection();
-               break;
 
        case LFUN_RUNCHKTEX:
                enable = buf->isLatex() && lyxrc.chktex_command != "none";
@@ -430,7 +428,7 @@ FuncStatus LyXFunc::getStatus(FuncRequest const & cmd) const
 
        case LFUN_LAYOUT:
        case LFUN_LAYOUT_PARAGRAPH:
-               enable = !cur.inset().forceDefaultParagraphs(&cur.inset());
+               enable = !cur.inset().forceDefaultParagraphs(cur.idx());
                break;
 
        case LFUN_VC_REGISTER:
@@ -536,6 +534,12 @@ FuncStatus LyXFunc::getStatus(FuncRequest const & cmd) const
                break;
        }
 
+       case LFUN_INSERT_CITATION: {
+               FuncRequest fr(LFUN_INSET_INSERT, "citation");
+               enable = getStatus(fr).enabled();
+               break;
+       }
+
        // this one is difficult to get right. As a half-baked
        // solution, we consider only the first action of the sequence
        case LFUN_SEQUENCE: {
@@ -1246,6 +1250,30 @@ void LyXFunc::dispatch(FuncRequest const & cmd)
                        owner->getDialogs().disconnect(argument);
                        break;
 
+               
+               case LFUN_INSERT_CITATION: {
+                       if (!argument.empty()) {
+                               // we can have one optional argument, delimited by '|'
+                               // citation-insert <key>|<text_before>
+                               // this should be enhanced to also support text_after 
+                               // and citation style
+                               string arg = argument;
+                               string opt1;
+                               if (contains(argument, "|")) {
+                                       arg = token(argument, '|', 0);
+                                       opt1 = '[' + token(argument, '|', 1) + ']';
+                               }
+                               std::ostringstream os;
+                               os << "citation LatexCommand\n"
+                                  << "\\cite" << opt1 << "{" << arg << "}\n"
+                                  << "\\end_inset";
+                               FuncRequest fr(LFUN_INSET_INSERT, os.str());
+                               dispatch(fr);
+                       } else
+                               dispatch(FuncRequest(LFUN_DIALOG_SHOW, "citation"));
+                       break;
+               }
+
                case LFUN_CHILDOPEN: {
                        string const filename =
                                MakeAbsPath(argument, owner->buffer()->filePath());
@@ -1408,8 +1436,11 @@ void LyXFunc::dispatch(FuncRequest const & cmd)
                        InsetIterator const end = inset_iterator_end(inset);
                        for (; it != end; ++it) {
                                if (inset_code == InsetBase::NO_CODE
-                                   || inset_code == it->lyxCode())
-                                       it->dispatch(cur, fr);
+                                   || inset_code == it->lyxCode()) {
+                                       LCursor tmpcur = cur;
+                                       tmpcur.pushLeft(*it);
+                                       it->dispatch(tmpcur, fr);
+                               }
                        }
                        update = true;
                        break;
@@ -1563,10 +1594,9 @@ void LyXFunc::dispatch(FuncRequest const & cmd)
                                view()->update(Update::FitCursor);
 
                        // if we executed a mutating lfun, mark the buffer as dirty
-                       // FIXME: Why not use flag.enabled() but call getStatus again?
-                       if (getStatus(cmd).enabled()
-                                       && !lyxaction.funcHasFlag(cmd.action, LyXAction::NoBuffer)
-                                       && !lyxaction.funcHasFlag(cmd.action, LyXAction::ReadOnly))
+                       if (flag.enabled()
+                           && !lyxaction.funcHasFlag(cmd.action, LyXAction::NoBuffer)
+                           && !lyxaction.funcHasFlag(cmd.action, LyXAction::ReadOnly))
                                view()->buffer()->markDirty();
                }