]> git.lyx.org Git - features.git/blobdiff - src/insets/InsetFlex.cpp
Completion: handle undo in insets' insertCompletion methods
[features.git] / src / insets / InsetFlex.cpp
index 0b14973faa46fe06c323f4738371e5a62aa4a44d..30ed7bf04586c30fb6c99fbb980859fdb6f7c53e 100644 (file)
@@ -24,6 +24,7 @@
 #include "ParIterator.h"
 #include "TextClass.h"
 
+#include "support/debug.h"
 #include "support/gettext.h"
 #include "support/lstrings.h"
 
@@ -35,12 +36,12 @@ namespace lyx {
 
 
 InsetFlex::InsetFlex(Buffer * buf, string const & layoutName)
-       : InsetCollapsable(buf), name_(layoutName)
+       : InsetCollapsible(buf), name_(layoutName)
 {}
 
 
 InsetFlex::InsetFlex(InsetFlex const & in)
-       : InsetCollapsable(in), name_(in.name_)
+       : InsetCollapsible(in), name_(in.name_)
 {}
 
 
@@ -51,17 +52,17 @@ InsetLayout const & InsetFlex::getLayout() const
                return DocumentClass::plainInsetLayout();
 
        DocumentClass const & dc = buffer().params().documentClass();
-       docstring const dname = from_utf8(name_); 
+       docstring const dname = from_utf8(name_);
        if (dc.hasInsetLayout(dname))
                return dc.insetLayout(dname);
        return dc.insetLayout(from_utf8("Flex:" + name_));
 }
 
 
-InsetLayout::InsetDecoration InsetFlex::decoration() const
+InsetDecoration InsetFlex::decoration() const
 {
-       InsetLayout::InsetDecoration const dec = getLayout().decoration();
-       return dec == InsetLayout::DEFAULT ? InsetLayout::CONGLOMERATE : dec;
+       InsetDecoration const dec = getLayout().decoration();
+       return dec == InsetDecoration::DEFAULT ? InsetDecoration::CONGLOMERATE : dec;
 }
 
 
@@ -86,7 +87,7 @@ void InsetFlex::write(ostream & os) const
                }
        }
        os << name << "\n";
-       InsetCollapsable::write(os);
+       InsetCollapsible::write(os);
 }
 
 
@@ -94,20 +95,23 @@ bool InsetFlex::getStatus(Cursor & cur, FuncRequest const & cmd,
                FuncStatus & flag) const
 {
        switch (cmd.action()) {
+       case LFUN_INSET_SPLIT:
        case LFUN_INSET_DISSOLVE:
                if (!cmd.argument().empty()) {
                        InsetLayout const & il = getLayout();
-                       InsetLayout::InsetLyXType const type = 
+                       InsetLyXType const type =
                                translateLyXType(to_utf8(cmd.argument()));
-                       if (il.lyxtype() == type) {
-                               FuncRequest temp_cmd(LFUN_INSET_DISSOLVE);
-                               return InsetCollapsable::getStatus(cur, temp_cmd, flag);
+                       if (il.lyxtype() == type
+                           || (il.name() == DocumentClass::plainInsetLayout().name()
+                                   && type == InsetLyXType::CHARSTYLE)) {
+                               FuncRequest temp_cmd(cmd.action());
+                               return InsetCollapsible::getStatus(cur, temp_cmd, flag);
                        } else
                                return false;
                }
                // fall-through
        default:
-               return InsetCollapsable::getStatus(cur, cmd, flag);
+               return InsetCollapsible::getStatus(cur, cmd, flag);
        }
 }
 
@@ -115,43 +119,73 @@ bool InsetFlex::getStatus(Cursor & cur, FuncRequest const & cmd,
 void InsetFlex::doDispatch(Cursor & cur, FuncRequest & cmd)
 {
        switch (cmd.action()) {
+       case LFUN_INSET_SPLIT:
        case LFUN_INSET_DISSOLVE:
                if (!cmd.argument().empty()) {
                        InsetLayout const & il = getLayout();
-                       InsetLayout::InsetLyXType const type = 
+                       InsetLyXType const type =
                                translateLyXType(to_utf8(cmd.argument()));
-                       
-                       if (il.lyxtype() == type) {
-                               FuncRequest temp_cmd(LFUN_INSET_DISSOLVE);
-                               InsetCollapsable::doDispatch(cur, temp_cmd);
+
+                       if (il.lyxtype() == type
+                           || (il.name() == DocumentClass::plainInsetLayout().name()
+                                   && type == InsetLyXType::CHARSTYLE)) {
+                               FuncRequest temp_cmd(cmd.action());
+                               InsetCollapsible::doDispatch(cur, temp_cmd);
                        } else
                                cur.undispatched();
                        break;
                }
                // fall-through
        default:
-               InsetCollapsable::doDispatch(cur, cmd);
+               InsetCollapsible::doDispatch(cur, cmd);
                break;
        }
 }
 
 
-void InsetFlex::updateBuffer(ParIterator const & it, UpdateType utype)
+void InsetFlex::updateBuffer(ParIterator const & it, UpdateType utype, bool const deleted)
 {
        BufferParams const & bp = buffer().masterBuffer()->params();
        InsetLayout const & il = getLayout();
        docstring custom_label = translateIfPossible(il.labelstring());
 
        Counters & cnts = bp.documentClass().counters();
+
+       // Special case for `subequations' module.
+       if (il.latextype() == InsetLaTeXType::ENVIRONMENT &&
+           il.latexname() == "subequations") {
+               docstring equation(from_ascii("equation"));
+               docstring parentequation(from_ascii("parentequation"));
+               if (!deleted)
+                       cnts.step(equation, utype);
+               // save a copy of the equation counter definition
+               cnts.copy(equation, parentequation);
+               // redefine the equation counter definition
+               docstring const eqlabel = deleted ? from_ascii("#")
+                       : cnts.theCounter(equation, it->getParLanguage(bp)->code());
+               cnts.newCounter(equation, parentequation,
+                               eqlabel + from_ascii("\\alph{equation}"),
+                               eqlabel + from_ascii("\\alph{equation}"),
+                               cnts.guiName(parentequation));
+               InsetCollapsible::updateBuffer(it, utype, deleted);
+               // reset equation counter as it was.
+               cnts.copy(parentequation, equation);
+               cnts.remove(parentequation);
+               return;
+       }
+
        docstring const & count = il.counter();
        bool const have_counter = cnts.hasCounter(count);
        if (have_counter) {
-               cnts.step(count, utype);
-               custom_label += ' ' +
-                       cnts.theCounter(count, it.paragraph().getParLanguage(bp)->code());
+               if (!deleted) {
+                       cnts.step(count, utype);
+                       custom_label += ' ' +
+                               cnts.theCounter(count, it.paragraph().getParLanguage(bp)->code());
+               } else
+                       custom_label += ' ' + from_ascii("#");
        }
        setLabel(custom_label);
-       
+
        bool const save_counter = have_counter && utype == OutputUpdate;
        if (save_counter) {
                // we assume the counter is local to this inset
@@ -159,7 +193,7 @@ void InsetFlex::updateBuffer(ParIterator const & it, UpdateType utype)
                // need a layout flag
                cnts.saveLastCounter();
        }
-       InsetCollapsable::updateBuffer(it, utype);
+       InsetCollapsible::updateBuffer(it, utype, deleted);
        if (save_counter)
                cnts.restoreLastCounter();
 }