]> git.lyx.org Git - lyx.git/blobdiff - src/Text3.cpp
Added distribution of a missing file used by tests.
[lyx.git] / src / Text3.cpp
index 8da40fc7d7f7d2f77f5159a0f5047bf5f42ce9be..533afd22329c11bc43f6ff213583fb4b1ae4291c 100644 (file)
@@ -586,7 +586,7 @@ void Text::dispatch(Cursor & cur, FuncRequest & cmd)
                if (cur.selection())
                        cutSelection(cur, true, false);
                else
-                       deleteWordForward(cur);
+                       deleteWordForward(cur, cmd.getArg(0) == "force");
                finishChange(cur, false);
                break;
 
@@ -594,7 +594,7 @@ void Text::dispatch(Cursor & cur, FuncRequest & cmd)
                if (cur.selection())
                        cutSelection(cur, true, false);
                else
-                       deleteWordBackward(cur);
+                       deleteWordBackward(cur, cmd.getArg(0) == "force");
                finishChange(cur, false);
                break;
 
@@ -1054,6 +1054,13 @@ void Text::dispatch(Cursor & cur, FuncRequest & cmd)
                        if (cur.pos() == cur.paragraph().size())
                                // Par boundary, force full-screen update
                                singleParUpdate = false;
+                       else if (cmd.getArg(0) != "force" && cur.confirmDeletion()) {
+                               cur.resetAnchor();
+                               cur.selection(true);
+                               cur.posForward();
+                               cur.setSelection();
+                               break;
+                       }
                        needsUpdate |= erase(cur);
                        cur.resetAnchor();
                } else {
@@ -1071,6 +1078,13 @@ void Text::dispatch(Cursor & cur, FuncRequest & cmd)
                                // Par boundary, full-screen update
                                if (par_boundary)
                                        singleParUpdate = false;
+                               else if (cmd.getArg(0) != "force" && cur.confirmDeletion(true)) {
+                                       cur.resetAnchor();
+                                       cur.selection(true);
+                                       cur.posBackward();
+                                       cur.setSelection();
+                                       break;
+                               }
                                needsUpdate |= backspace(cur);
                                cur.resetAnchor();
                                if (par_boundary && !first_par && cur.pos() > 0
@@ -1229,6 +1243,8 @@ void Text::dispatch(Cursor & cur, FuncRequest & cmd)
                string const name = to_utf8(cmd.argument());
                if (name == "hyphenation")
                        specialChar(cur, InsetSpecialChar::HYPHENATION);
+               else if (name == "allowbreak")
+                       specialChar(cur, InsetSpecialChar::ALLOWBREAK);
                else if (name == "ligature-break")
                        specialChar(cur, InsetSpecialChar::LIGATURE_BREAK);
                else if (name == "slash")
@@ -1548,11 +1564,41 @@ void Text::dispatch(Cursor & cur, FuncRequest & cmd)
                while (pos > 0 && par.isDeleted(pos - 1))
                        --pos;
 
+               bool const inner = (cmd.getArg(0) == "single" || cmd.getArg(0) == "inner");
+
+               // Guess quote side.
+               // A space triggers an opening quote. This is passed if the preceding
+               // char/inset is a space or at paragraph start.
                char_type c = ' ';
-               if (pos > 0 && (!cur.prevInset() || !cur.prevInset()->isSpace()))
-                       c = par.getChar(pos - 1);
-               InsetQuotes::QuoteLevel const quote_level = (cmd.getArg(0) == "single")
-                       ? InsetQuotes::SingleQuotes : InsetQuotes::DoubleQuotes;
+               if (pos > 0 && !par.isSpace(pos - 1)) {
+                       if (cur.prevInset() && cur.prevInset()->lyxCode() == QUOTE_CODE) {
+                               // If an opening double quotation mark precedes, and this
+                               // is a single quote, make it opening as well
+                               InsetQuotes & ins =
+                                       static_cast<InsetQuotes &>(*cur.prevInset());
+                               string const type = ins.getType();
+                               if (!suffixIs(type, "ld") || !inner)
+                                       c = par.getChar(pos - 1);
+                       }
+                       else if (!cur.prevInset()
+                           || (cur.prevInset() && cur.prevInset()->isChar()))
+                               // If a char precedes, pass that and let InsetQuote decide
+                               c = par.getChar(pos - 1);
+                       else {
+                               while (pos > 0) {
+                                       if (par.getInset(pos - 1)
+                                           && !par.getInset(pos - 1)->isPartOfTextSequence()) {
+                                               // skip "invisible" insets
+                                               --pos;
+                                               continue;
+                                       }
+                                       c = par.getChar(pos - 1);
+                                       break;
+                               }
+                       }
+               }
+               InsetQuotesParams::QuoteLevel const quote_level = inner
+                               ? InsetQuotesParams::SecondaryQuotes : InsetQuotesParams::PrimaryQuotes;
                cur.insert(new InsetQuotes(cur.buffer(), c, quote_level, cmd.getArg(1), cmd.getArg(2)));
                cur.buffer()->updateBuffer();
                cur.posForward();
@@ -1745,13 +1791,9 @@ void Text::dispatch(Cursor & cur, FuncRequest & cmd)
        }
 
        case LFUN_HREF_INSERT: {
-               // FIXME If we're actually given an argument, shouldn't
-               // we use it, whether or not we have a selection?
                docstring content = cmd.argument();
-               if (cur.selection()) {
+               if (content.empty() && cur.selection())
                        content = cur.selectionAsString(false);
-                       cutSelection(cur, true, false);
-               }
 
                InsetCommandParams p(HYPERLINK_CODE);
                if (!content.empty()){
@@ -2126,6 +2168,13 @@ void Text::dispatch(Cursor & cur, FuncRequest & cmd)
                break;
        }
 
+       case LFUN_FONT_CROSSOUT: {
+               Font font(ignore_font, ignore_language);
+               font.fontInfo().setXout(FONT_TOGGLE);
+               toggleAndShow(cur, this, font);
+               break;
+       }
+
        case LFUN_FONT_UNDERUNDERLINE: {
                Font font(ignore_font, ignore_language);
                font.fontInfo().setUuline(FONT_TOGGLE);
@@ -3163,6 +3212,7 @@ bool Text::getStatus(Cursor & cur, FuncRequest const & cmd,
        case LFUN_FONT_STATE:
        case LFUN_FONT_UNDERLINE:
        case LFUN_FONT_STRIKEOUT:
+       case LFUN_FONT_CROSSOUT:
        case LFUN_FONT_UNDERUNDERLINE:
        case LFUN_FONT_UNDERWAVE:
        case LFUN_TEXTSTYLE_APPLY: