]> git.lyx.org Git - lyx.git/blobdiff - src/insets/InsetFlex.cpp
Enable dissolve in undefined Flex inset context menu
[lyx.git] / src / insets / InsetFlex.cpp
index 44b9b034360b0174bd5a306785c9e117dd4fb466..05c48f68eceb2275eb5a45b872f2e7163fc9a448 100644 (file)
@@ -35,12 +35,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,7 +51,7 @@ 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_));
@@ -68,20 +68,25 @@ InsetLayout::InsetDecoration InsetFlex::decoration() const
 void InsetFlex::write(ostream & os) const
 {
        os << "Flex ";
-       InsetLayout const & il = getLayout();
+       string name;
        if (name_.empty())
-               os << "undefined";
+               name = "undefined";
        else {
-               // use il.name(), since this resolves obsoleted
-               // InsetLayout names
-               string name = to_utf8(il.name());
-               // Remove the "Flex:" prefix, if it is present
-               if (support::prefixIs(name, "Flex:"))
-                       name = support::token(name, ':', 1);
-               os << name;
+               InsetLayout const & il = getLayout();
+               // use il.name(), since this resolves obsoleted InsetLayout names
+               if (il.name() == "undefined")
+                       // This is the name of the plain_insetlayout_. We assume that the
+                       // name resolution has failed.
+                       name = name_;
+               else {
+                       name = to_utf8(il.name());
+                       // Remove the "Flex:" prefix, if it is present
+                       if (support::prefixIs(name, "Flex:"))
+                               name = support::split(name, ':');
+               }
        }
-       os << "\n";
-       InsetCollapsable::write(os);
+       os << name << "\n";
+       InsetCollapsible::write(os);
 }
 
 
@@ -92,17 +97,19 @@ bool InsetFlex::getStatus(Cursor & cur, FuncRequest const & cmd,
        case LFUN_INSET_DISSOLVE:
                if (!cmd.argument().empty()) {
                        InsetLayout const & il = getLayout();
-                       InsetLayout::InsetLyXType const type = 
+                       InsetLayout::InsetLyXType const type =
                                translateLyXType(to_utf8(cmd.argument()));
-                       if (il.lyxtype() == type) {
+                       if (il.lyxtype() == type
+                           || (il.name() == DocumentClass::plainInsetLayout().name()
+                                   && type == InsetLayout::CHARSTYLE)) {
                                FuncRequest temp_cmd(LFUN_INSET_DISSOLVE);
-                               return InsetCollapsable::getStatus(cur, temp_cmd, flag);
+                               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);
        }
 }
 
@@ -113,19 +120,21 @@ void InsetFlex::doDispatch(Cursor & cur, FuncRequest & cmd)
        case LFUN_INSET_DISSOLVE:
                if (!cmd.argument().empty()) {
                        InsetLayout const & il = getLayout();
-                       InsetLayout::InsetLyXType const type = 
+                       InsetLayout::InsetLyXType const type =
                                translateLyXType(to_utf8(cmd.argument()));
-                       
-                       if (il.lyxtype() == type) {
+
+                       if (il.lyxtype() == type
+                           || (il.name() == DocumentClass::plainInsetLayout().name()
+                                   && type == InsetLayout::CHARSTYLE)) {
                                FuncRequest temp_cmd(LFUN_INSET_DISSOLVE);
-                               InsetCollapsable::doDispatch(cur, temp_cmd);
+                               InsetCollapsible::doDispatch(cur, temp_cmd);
                        } else
                                cur.undispatched();
                        break;
                }
                // fall-through
        default:
-               InsetCollapsable::doDispatch(cur, cmd);
+               InsetCollapsible::doDispatch(cur, cmd);
                break;
        }
 }
@@ -141,12 +150,16 @@ void InsetFlex::updateBuffer(ParIterator const & it, UpdateType utype)
        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());
+               Paragraph const & par = it.paragraph();
+               if (!par.isDeleted(it.pos())) {
+                       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
@@ -154,7 +167,7 @@ void InsetFlex::updateBuffer(ParIterator const & it, UpdateType utype)
                // need a layout flag
                cnts.saveLastCounter();
        }
-       InsetCollapsable::updateBuffer(it, utype);
+       InsetCollapsible::updateBuffer(it, utype);
        if (save_counter)
                cnts.restoreLastCounter();
 }