]> git.lyx.org Git - lyx.git/blobdiff - src/lyxfunc.C
Fix bug 2029 (RtL space width)
[lyx.git] / src / lyxfunc.C
index fc6ef321c0a6ff559f9fa961ac9cfe47da79822f..b0b0aa610d2cf82af19ff75d0e2f61ab780aab98 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)
@@ -428,12 +451,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";
@@ -598,6 +616,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 +984,7 @@ void LyXFunc::dispatch(FuncRequest const & cmd)
                        break;
 
                case LFUN_QUIT:
-                       QuitLyX();
+                       QuitLyX(argument == "force");
                        break;
 
                case LFUN_TOCVIEW: {
@@ -1143,7 +1170,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 +1177,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);
@@ -1379,6 +1408,7 @@ void LyXFunc::dispatch(FuncRequest const & cmd)
                                    || inset_code == it->lyxCode())
                                        it->dispatch(cur, fr);
                        }
+                       update = true;
                        break;
                }
 
@@ -1455,7 +1485,6 @@ void LyXFunc::dispatch(FuncRequest const & cmd)
                }
 
                case LFUN_TEXTCLASS_APPLY: {
-                       recordUndoFullDocument(view());
                        Buffer * buffer = owner->buffer();
 
                        lyx::textclass_type const old_class =
@@ -1475,6 +1504,8 @@ 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(