]> git.lyx.org Git - lyx.git/blobdiff - src/lyxfunc.C
layout file converter for layout files in old format
[lyx.git] / src / lyxfunc.C
index 36ec96f45b027951f4776528efd40d91926fd93e..5429843cfd30bd1054cfd18f4b6c3711fd70a5fb 100644 (file)
@@ -64,6 +64,7 @@
 #include "insets/insetexternal.h"
 #include "insets/insetfloat.h"
 #include "insets/insetgraphics.h"
+#include "insets/insetinclude.h"
 #include "insets/insetnote.h"
 #include "insets/insettabular.h"
 #include "insets/insetvspace.h"
@@ -173,6 +174,28 @@ bool getStatus(LCursor cursor,
        return res;
 }
 
+
+/** Return the change status at cursor position, taking in account the
+ * status at each level of the document iterator (a table in a deleted
+ * footnote is deleted).
+ * When \param outer is true, the top slice is not looked at.
+ */
+Change::Type lookupChange(DocIterator const & dit, bool outer = false)
+{
+       size_t const depth = dit.depth() - (outer ? 1 : 0);
+
+       for (size_t i = 0 ; i < depth ; ++i) {
+               CursorSlice const & slice = dit[i];
+               if (!slice.inset().inMathed() 
+                   && slice.pos() < slice.paragraph().size()) {
+                       Change::Type const ch = slice.paragraph().lookupChange(slice.pos());
+                       if (ch != Change::UNCHANGED)
+                               return ch;
+               }
+       }
+       return Change::UNCHANGED;
+}
+
 }
 
 LyXFunc::LyXFunc(LyXView * lv)
@@ -315,6 +338,9 @@ FuncStatus LyXFunc::getStatus(FuncRequest const & cmd) const
           application can still be accessed without giving focus to
           the main window. In this case, we want to disable the menu
           entries that are buffer-related.
+
+          Note that this code is not perfect, as bug 1941 attests:
+          http://bugzilla.lyx.org/show_bug.cgi?id=1941#c4
        */
        Buffer * buf;
        if (cmd.origin == FuncRequest::UI && !owner->hasFocus())
@@ -428,12 +454,7 @@ FuncStatus LyXFunc::getStatus(FuncRequest const & cmd) const
                enable = false;
                if (!cur)
                        break;
-               UpdatableInset * inset = cur.inset().asUpdatableInset();
-               lyxerr << "inset: " << inset << endl;
-               if (!inset)
-                       break;
-
-               InsetBase::Code code = inset->lyxCode();
+               InsetBase::Code code = cur.inset().lyxCode();
                switch (code) {
                        case InsetBase::TABULAR_CODE:
                                enable = cmd.argument == "tabular";
@@ -515,6 +536,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: {
@@ -598,6 +625,15 @@ FuncStatus LyXFunc::getStatus(FuncRequest const & cmd) const
                flag.enabled(false);
        }
 
+       // Are we in a DELETED change-tracking region?
+       if (buf && buf->params().tracking_changes
+           && lookupChange(cur, true) == Change::DELETED
+           && !lyxaction.funcHasFlag(cmd.action, LyXAction::ReadOnly)
+           && !lyxaction.funcHasFlag(cmd.action, LyXAction::NoBuffer)) {
+               flag.message(N_("This portion of the document is deleted."));
+               flag.enabled(false);
+       }
+
        // the default error message if we disable the command
        if (!flag.enabled() && flag.message().empty())
                flag.message(N_("Command disabled"));
@@ -957,7 +993,7 @@ void LyXFunc::dispatch(FuncRequest const & cmd)
                        break;
 
                case LFUN_QUIT:
-                       QuitLyX();
+                       QuitLyX(argument == "force");
                        break;
 
                case LFUN_TOCVIEW: {
@@ -1143,7 +1179,6 @@ void LyXFunc::dispatch(FuncRequest const & cmd)
                        string data = trim(cmd.argument.substr(name.size()));
                        if (name == "bibitem" ||
                            name == "bibtex" ||
-                           name == "include" ||
                            name == "index" ||
                            name == "label" ||
                            name == "ref" ||
@@ -1151,6 +1186,9 @@ void LyXFunc::dispatch(FuncRequest const & cmd)
                            name == "url") {
                                InsetCommandParams p(name);
                                data = InsetCommandMailer::params2string(name, p);
+                       } else if (name == "include") {
+                               InsetCommandParams p(data);
+                               data = InsetIncludeMailer::params2string(p);
                        } else if (name == "box") {
                                // \c data == "Boxed" || "Frameless" etc
                                InsetBoxParams p(data);
@@ -1214,6 +1252,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());
@@ -1379,6 +1441,7 @@ void LyXFunc::dispatch(FuncRequest const & cmd)
                                    || inset_code == it->lyxCode())
                                        it->dispatch(cur, fr);
                        }
+                       update = true;
                        break;
                }
 
@@ -1474,11 +1537,15 @@ void LyXFunc::dispatch(FuncRequest const & cmd)
                                break;
 
                        owner->message(_("Converting document to new document class..."));
+                       recordUndoFullDocument(view());
+                       buffer->params().textclass = new_class;
+                       StableDocIterator backcur(view()->cursor());
                        ErrorList el;
                        lyx::cap::SwitchBetweenClasses(
                                old_class, new_class,
                                buffer->paragraphs(), el);
 
+                       view()->setCursor(backcur.asDocIterator(&(buffer->inset())));
                        bufferErrors(*buffer, el);
                        view()->showErrorList(_("Class switch"));
                        updateCounters(*buffer);
@@ -1510,10 +1577,8 @@ void LyXFunc::dispatch(FuncRequest const & cmd)
                default: {
                        view()->cursor().dispatch(cmd);
                        update |= view()->cursor().result().update();
-                       if (!view()->cursor().result().dispatched()) {
+                       if (!view()->cursor().result().dispatched())
                                update |= view()->dispatch(cmd);
-                       }
-
                        break;
                }
                }
@@ -1545,8 +1610,15 @@ void LyXFunc::dispatch(FuncRequest const & cmd)
 
 void LyXFunc::sendDispatchMessage(string const & msg, FuncRequest const & cmd)
 {
-       owner->updateMenubar();
-       owner->updateToolbars();
+       /* When an action did not originate from the UI/kbd, it makes
+        * sense to avoid updating the GUI. It turns out that this
+        * fixes bug 1941, for reasons that are described here:
+        * http://bugzilla.lyx.org/show_bug.cgi?id=1941#c4 
+        */
+       if (cmd.origin != FuncRequest::INTERNAL) {
+               owner->updateMenubar();
+               owner->updateToolbars();
+       }
 
        const bool verbose = (cmd.origin == FuncRequest::UI
                              || cmd.origin == FuncRequest::COMMANDBUFFER);
@@ -1575,15 +1647,14 @@ void LyXFunc::sendDispatchMessage(string const & msg, FuncRequest const & cmd)
 
        string const shortcuts = toplevel_keymap->printbindings(cmd);
 
-       if (!shortcuts.empty()) {
+       if (!shortcuts.empty())
                comname += ": " + shortcuts;
-       } else if (!argsadded && !cmd.argument.empty()) {
+       else if (!argsadded && !cmd.argument.empty())
                comname += ' ' + cmd.argument;
-       }
 
        if (!comname.empty()) {
                comname = rtrim(comname);
-               dispatch_msg += '(' + comname + ')';
+               dispatch_msg += '(' + rtrim(comname) + ')';
        }
 
        lyxerr[Debug::ACTION] << "verbose dispatch msg " << dispatch_msg << endl;