]> git.lyx.org Git - lyx.git/blobdiff - src/Text3.cpp
Fix part of bug #6127: Roundtrip Lyx->Latex->Lyx fails.
[lyx.git] / src / Text3.cpp
index 7c8678158c0ac3816284709f30476c8625675f3f..617a3ef6d7665a55bdf201acad70bd7f90ef24be 100644 (file)
@@ -56,6 +56,7 @@
 #include "insets/InsetCollapsable.h"
 #include "insets/InsetCommand.h"
 #include "insets/InsetExternal.h"
+#include "insets/InsetFloat.h"
 #include "insets/InsetFloatList.h"
 #include "insets/InsetGraphics.h"
 #include "insets/InsetGraphicsParams.h"
@@ -63,6 +64,7 @@
 #include "insets/InsetQuotes.h"
 #include "insets/InsetSpecialChar.h"
 #include "insets/InsetText.h"
+#include "insets/InsetWrap.h"
 
 #include "support/convert.h"
 #include "support/debug.h"
@@ -233,6 +235,9 @@ static bool doInsertInset(Cursor & cur, Text * text,
        if (!inset)
                return false;
 
+       if (InsetCollapsable * ci = inset->asInsetCollapsable())
+               ci->setButtonLabel();
+
        cur.recordUndo();
        if (cmd.action == LFUN_INDEX_INSERT) {
                docstring ds = subst(text->getStringToIndex(cur), '\n', ' ');
@@ -1048,49 +1053,6 @@ void Text::dispatch(Cursor & cur, FuncRequest & cmd)
                cur.resetAnchor();
                break;
 
-       // TODO
-       // With the creation of LFUN_PARAGRAPH_PARAMS, this is now redundant,
-       // as its duties can be performed there. Should it be removed??
-       // FIXME For now, it can just dispatch LFUN_PARAGRAPH_PARAMS...
-       case LFUN_PARAGRAPH_SPACING: {
-               Paragraph & par = cur.paragraph();
-               Spacing::Space cur_spacing = par.params().spacing().getSpace();
-               string cur_value = "1.0";
-               if (cur_spacing == Spacing::Other)
-                       cur_value = par.params().spacing().getValueAsString();
-
-               istringstream is(to_utf8(cmd.argument()));
-               string tmp;
-               is >> tmp;
-               Spacing::Space new_spacing = cur_spacing;
-               string new_value = cur_value;
-               if (tmp.empty()) {
-                       lyxerr << "Missing argument to `paragraph-spacing'"
-                              << endl;
-               } else if (tmp == "single") {
-                       new_spacing = Spacing::Single;
-               } else if (tmp == "onehalf") {
-                       new_spacing = Spacing::Onehalf;
-               } else if (tmp == "double") {
-                       new_spacing = Spacing::Double;
-               } else if (tmp == "other") {
-                       new_spacing = Spacing::Other;
-                       string tmpval = "0.0";
-                       is >> tmpval;
-                       lyxerr << "new_value = " << tmpval << endl;
-                       if (tmpval != "0.0")
-                               new_value = tmpval;
-               } else if (tmp == "default") {
-                       new_spacing = Spacing::Default;
-               } else {
-                       lyxerr << to_utf8(_("Unknown spacing argument: "))
-                              << to_utf8(cmd.argument()) << endl;
-               }
-               if (cur_spacing != new_spacing || cur_value != new_value)
-                       par.params().spacing(Spacing(new_spacing, new_value));
-               break;
-       }
-
        case LFUN_INSET_INSERT: {
                cur.recordUndo();
 
@@ -2326,9 +2288,36 @@ bool Text::getStatus(Cursor & cur, FuncRequest const & cmd,
                break;
        case LFUN_FLOAT_INSERT:
        case LFUN_FLOAT_WIDE_INSERT:
+               // FIXME: If there is a selection, we should check whether there
+               // are floats in the selection, but this has performance issues, see
+               // LFUN_CHANGE_ACCEPT/REJECT.
                code = FLOAT_CODE;
-               // not allowed in description items
-               enable = !inDescriptionItem(cur);
+               if (inDescriptionItem(cur))
+                       // not allowed in description items
+                       enable = false;
+               else {
+                       InsetCode const inset_code = cur.inset().lyxCode();
+
+                       // algorithm floats cannot be put in another float
+                       if (to_utf8(cmd.argument()) == "algorithm") {
+                               enable = inset_code != WRAP_CODE && inset_code != FLOAT_CODE;
+                               break;
+                       }
+
+                       // for figures and tables: only allow in another
+                       // float or wrap if it is of the same type and
+                       // not a subfloat already
+                       if(cur.inset().lyxCode() == code) {
+                               InsetFloat const & ins =
+                                       static_cast<InsetFloat const &>(cur.inset());
+                               enable = ins.params().type == to_utf8(cmd.argument())
+                                       && !ins.params().subfloat;
+                       } else if(cur.inset().lyxCode() == WRAP_CODE) {
+                               InsetWrap const & ins =
+                                       static_cast<InsetWrap const &>(cur.inset());
+                               enable = ins.params().type == to_utf8(cmd.argument());
+                       }
+               }
                break;
        case LFUN_WRAP_INSERT:
                code = WRAP_CODE;
@@ -2380,6 +2369,9 @@ bool Text::getStatus(Cursor & cur, FuncRequest const & cmd,
        case LFUN_LABEL_INSERT:
                code = LABEL_CODE;
                break;
+       case LFUN_LINE_INSERT:
+               code = LINE_CODE;
+               break;
        case LFUN_INFO_INSERT:
                code = INFO_CODE;
                break;
@@ -2433,6 +2425,19 @@ bool Text::getStatus(Cursor & cur, FuncRequest const & cmd,
                        code = SPACE_CODE;
                break;
 
+       case LFUN_MATH_INSERT:
+       case LFUN_MATH_AMS_MATRIX:
+       case LFUN_MATH_MATRIX:
+       case LFUN_MATH_DELIM:
+       case LFUN_MATH_BIGDELIM:
+       case LFUN_MATH_DISPLAY:
+       case LFUN_MATH_MODE:
+       case LFUN_MATH_MACRO:
+       case LFUN_MATH_SUBSCRIPT:
+       case LFUN_MATH_SUPERSCRIPT:
+               code = MATH_HULL_CODE;
+               break;
+
        case LFUN_INSET_MODIFY:
                // We need to disable this, because we may get called for a
                // tabular cell via
@@ -2552,10 +2557,9 @@ bool Text::getStatus(Cursor & cur, FuncRequest const & cmd,
                // However, without proper optimizations, this will inevitably
                // result in unacceptable performance - just imagine a user who
                // wants to select the complete content of a long document.
-               if (!cur.selection()) {
-                       Change const & change = cur.paragraph().lookupChange(cur.pos());
-                       enable = change.changed();
-               } else
+               if (!cur.selection())
+                       enable = cur.paragraph().isChanged(cur.pos());
+               else
                        // TODO: context-sensitive enabling of LFUN_CHANGE_ACCEPT/REJECT
                        // for selections.
                        enable = true;
@@ -2592,18 +2596,10 @@ bool Text::getStatus(Cursor & cur, FuncRequest const & cmd,
 
        case LFUN_NEWPAGE_INSERT:
                // not allowed in description items
+               code = NEWPAGE_CODE;
                enable = !inDescriptionItem(cur);
                break;
 
-       case LFUN_MATH_INSERT:
-       case LFUN_MATH_AMS_MATRIX:
-       case LFUN_MATH_MATRIX:
-       case LFUN_MATH_DELIM:
-       case LFUN_MATH_BIGDELIM:
-               // not allowed in ERT, for example.
-               enable = cur.inset().insetAllowed(MATH_CODE);
-               break;
-
        case LFUN_DATE_INSERT: {
                string const format = cmd.argument().empty()
                        ? lyxrc.date_insert_format : to_utf8(cmd.argument());
@@ -2612,8 +2608,7 @@ bool Text::getStatus(Cursor & cur, FuncRequest const & cmd,
        }
 
        case LFUN_LANGUAGE:
-               // FIXME: use isPassThru() here?
-               enable = !cur.inset().forceLTR();
+               enable = !cur.inset().getLayout().isPassThru();
 
        case LFUN_BREAK_PARAGRAPH:
                enable = cur.inset().getLayout().isMultiPar();
@@ -2653,7 +2648,6 @@ bool Text::getStatus(Cursor & cur, FuncRequest const & cmd,
        case LFUN_LINE_END:
        case LFUN_CHAR_DELETE_FORWARD:
        case LFUN_CHAR_DELETE_BACKWARD:
-       case LFUN_PARAGRAPH_SPACING:
        case LFUN_INSET_INSERT:
        case LFUN_WORD_UPCASE:
        case LFUN_WORD_LOWCASE:
@@ -2664,12 +2658,6 @@ bool Text::getStatus(Cursor & cur, FuncRequest const & cmd,
        case LFUN_SERVER_GET_LAYOUT:
        case LFUN_LAYOUT:
        case LFUN_SELF_INSERT:
-       case LFUN_LINE_INSERT:
-       case LFUN_MATH_DISPLAY:
-       case LFUN_MATH_MODE:
-       case LFUN_MATH_MACRO:
-       case LFUN_MATH_SUBSCRIPT:
-       case LFUN_MATH_SUPERSCRIPT:
        case LFUN_FONT_DEFAULT:
        case LFUN_FONT_UNDERLINE:
        case LFUN_FONT_STRIKEOUT:
@@ -2718,7 +2706,9 @@ bool Text::getStatus(Cursor & cur, FuncRequest const & cmd,
        }
 
        if (code != NO_CODE
-           && (cur.empty() || !cur.inset().insetAllowed(code)))
+           && (cur.empty() 
+               || !cur.inset().insetAllowed(code)
+               || cur.paragraph().layout().pass_thru))
                enable = false;
 
        switch (cmd.action) {
@@ -2739,17 +2729,9 @@ bool Text::getStatus(Cursor & cur, FuncRequest const & cmd,
        case LFUN_ACCENT_UNDERBAR:
        case LFUN_ACCENT_UNDERDOT:
        case LFUN_APPENDIX:
-       case LFUN_BOX_INSERT:
-       case LFUN_BRANCH_INSERT:
-       case LFUN_CAPTION_INSERT:
        case LFUN_DEPTH_DECREMENT:
        case LFUN_DEPTH_INCREMENT:
-       case LFUN_ERT_INSERT:
        case LFUN_FILE_INSERT:
-       case LFUN_FLEX_INSERT:
-       case LFUN_FLOAT_INSERT:
-       case LFUN_FLOAT_LIST_INSERT:
-       case LFUN_FLOAT_WIDE_INSERT:
        case LFUN_FONT_BOLD:
        case LFUN_FONT_BOLDSYMBOL:
        case LFUN_FONT_TYPEWRITER:
@@ -2766,43 +2748,18 @@ bool Text::getStatus(Cursor & cur, FuncRequest const & cmd,
        case LFUN_FONT_STRIKEOUT:
        case LFUN_FONT_UULINE:
        case LFUN_FONT_UWAVE:
-       case LFUN_FOOTNOTE_INSERT:
-       case LFUN_HYPERLINK_INSERT:
-       case LFUN_INDEX_INSERT:
-       case LFUN_INDEX_PRINT:
-       case LFUN_INSET_INSERT:
        case LFUN_LABEL_GOTO:
-       case LFUN_LABEL_INSERT:
        case LFUN_LAYOUT_TABULAR:
-       case LFUN_LINE_INSERT:
-       case LFUN_MARGINALNOTE_INSERT:
-       case LFUN_MATH_DISPLAY:
-       case LFUN_MATH_INSERT:
-       case LFUN_MATH_AMS_MATRIX:
-       case LFUN_MATH_MATRIX:
-       case LFUN_MATH_MODE:
        case LFUN_MENU_OPEN:
-       case LFUN_NEWLINE_INSERT:
-       case LFUN_NEWPAGE_INSERT:
        case LFUN_NOACTION:
-       case LFUN_NOMENCL_INSERT:
-       case LFUN_NOMENCL_PRINT:
-       case LFUN_NOTE_INSERT:
        case LFUN_NOTE_NEXT:
-       case LFUN_OPTIONAL_INSERT:
-       case LFUN_PHANTOM_INSERT:
        case LFUN_REFERENCE_NEXT:
        case LFUN_SERVER_GOTO_FILE_ROW:
        case LFUN_SERVER_NOTIFY:
        case LFUN_SERVER_SET_XY:
-       case LFUN_SPACE_INSERT:
-       case LFUN_SPECIALCHAR_INSERT:
-       case LFUN_TABULAR_INSERT:
        case LFUN_TEXTSTYLE_APPLY:
        case LFUN_TEXTSTYLE_UPDATE:
-       case LFUN_TOC_INSERT:
-       case LFUN_WRAP_INSERT:
-               if (!cur.inset().getLayout().isPassThru())
+               if (cur.inset().getLayout().isPassThru())
                        enable = false;
                break;
        default: