]> git.lyx.org Git - lyx.git/blobdiff - src/Text3.cpp
Russian layouttranslations reviewed by Yuriy, Dec 13 2017.
[lyx.git] / src / Text3.cpp
index cf90c4d73a6eb905f9410d91a275a99a6c5a5596..305a1d28b21b1640a8d5e43c741fec00fed1a4c6 100644 (file)
@@ -53,7 +53,7 @@
 #include "frontends/Selection.h"
 
 #include "insets/InsetArgument.h"
-#include "insets/InsetCollapsable.h"
+#include "insets/InsetCollapsible.h"
 #include "insets/InsetCommand.h"
 #include "insets/InsetExternal.h"
 #include "insets/InsetFloat.h"
@@ -78,7 +78,7 @@
 #include "support/regex.h"
 
 #include "mathed/InsetMathHull.h"
-#include "mathed/MathMacroTemplate.h"
+#include "mathed/InsetMathMacroTemplate.h"
 
 #include <clocale>
 #include <sstream>
@@ -245,7 +245,7 @@ static bool doInsertInset(Cursor & cur, Text * text,
        if (!inset)
                return false;
 
-       if (InsetCollapsable * ci = inset->asInsetCollapsable())
+       if (InsetCollapsible * ci = inset->asInsetCollapsible())
                ci->setButtonLabel();
 
        cur.recordUndo();
@@ -452,7 +452,7 @@ static void outline(OutlineOp mode, Cursor & cur)
                                DocumentClass const & tc = buf.params().documentClass();
                                DocumentClass::const_iterator lit = tc.begin();
                                DocumentClass::const_iterator len = tc.end();
-                               int const newtoclevel = 
+                               int const newtoclevel =
                                        (mode == OutlineIn ? toclevel + 1 : toclevel - 1);
                                LabelType const oldlabeltype = start->layout().labeltype;
 
@@ -484,14 +484,14 @@ bool Text::isRTL(Paragraph const & par) const
        return par.isRTL(buffer.params());
 }
 
-       
+
 namespace {
-               
+
        Language const * getLanguage(Cursor const & cur, string const & lang) {
                return lang.empty() ? cur.getFont().language() : languages.getLanguage(lang);
        }
 
-}
+} // namespace
 
 
 void Text::dispatch(Cursor & cur, FuncRequest & cmd)
@@ -518,7 +518,7 @@ void Text::dispatch(Cursor & cur, FuncRequest & cmd)
        cur.noScreenUpdate();
 
        LBUFERR(this == cur.text());
-       
+
        // NOTE: This should NOT be a reference. See commit 94a5481a.
        CursorSlice const oldTopSlice = cur.top();
        bool const oldBoundary = cur.boundary();
@@ -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;
 
@@ -770,6 +770,18 @@ void Text::dispatch(Cursor & cur, FuncRequest & cmd)
                        cur.upDownInText(up, needsUpdate);
                        needsUpdate |= cur.beforeDispatchCursor().inMathed();
                } else {
+                       pos_type newpos = up ? 0 : cur.lastpos();
+                       if (lyxrc.mac_like_cursor_movement && cur.pos() != newpos) {
+                               needsUpdate |= cur.selHandle(select);
+                               // we do not reset the targetx of the cursor
+                               cur.pos() = newpos;
+                               needsUpdate |= bv->checkDepm(cur, bv->cursor());
+                               cur.updateTextTargetOffset();
+                               if (needsUpdate)
+                                       cur.forceBufferUpdate();
+                               break;
+                       }
+
                        // if the cursor cannot be moved up or down do not remove
                        // the selection right now, but wait for the next dispatch.
                        if (select)
@@ -835,6 +847,8 @@ void Text::dispatch(Cursor & cur, FuncRequest & cmd)
                                break;
                }
                cur.pos() = cur.lastpos();
+               cur.boundary(false);
+               cur.setCurrentFont();
 
                needsUpdate |= cur != old_cur;
                break;
@@ -1054,6 +1068,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 +1092,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
@@ -1213,6 +1241,7 @@ void Text::dispatch(Cursor & cur, FuncRequest & cmd)
                }
 
                ins->setParams(inspar);
+               break;
        }
 
        case LFUN_SPACE_INSERT:
@@ -1229,6 +1258,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 +1579,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);
-               InsetQuotesParams::QuoteLevel const quote_level = (cmd.getArg(0) == "single")
-                       ? InsetQuotesParams::SingleQuotes : InsetQuotesParams::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();
@@ -1666,6 +1727,7 @@ void Text::dispatch(Cursor & cur, FuncRequest & cmd)
                // reset the anchor.
                bvcur.setCursor(cur);
                bvcur.selection(true);
+               bvcur.setCurrentFont();
                if (cur.top() == old) {
                        // We didn't move one iota, so no need to update the screen.
                        cur.screenUpdateFlags(Update::SinglePar | Update::FitCursor);
@@ -1745,13 +1807,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()){
@@ -2002,7 +2060,7 @@ void Text::dispatch(Cursor & cur, FuncRequest & cmd)
                        // don't pass "on" as argument
                        // (it would appear literally in the first cell)
                        docstring sel = cur.selectionAsString(false);
-                       MathMacroTemplate * macro = new MathMacroTemplate(cur.buffer());
+                       InsetMathMacroTemplate * macro = new InsetMathMacroTemplate(cur.buffer());
                        // create a macro template if we see "\\newcommand" somewhere, and
                        // an ordinary formula otherwise
                        if (!sel.empty()
@@ -2038,7 +2096,7 @@ void Text::dispatch(Cursor & cur, FuncRequest & cmd)
                        MacroType type = MacroTypeNewcommand;
                        if (s2 == "def")
                                type = MacroTypeDef;
-                       MathMacroTemplate * inset = new MathMacroTemplate(cur.buffer(),
+                       InsetMathMacroTemplate * inset = new InsetMathMacroTemplate(cur.buffer(),
                                from_utf8(token(s, ' ', 0)), nargs, false, type);
                        inset->setBuffer(bv->buffer());
                        insertInset(cur, inset);
@@ -2126,6 +2184,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);
@@ -2792,19 +2857,13 @@ bool Text::getStatus(Cursor & cur, FuncRequest const & cmd,
                        for (; pit <= lastpit; ++pit) {
                                if (pars_[pit].layout() != lay)
                                        break;
-                               InsetList::const_iterator it = pars_[pit].insetList().begin();
-                               InsetList::const_iterator end = pars_[pit].insetList().end();
-                               for (; it != end; ++it) {
-                                       if (it->inset->lyxCode() == ARG_CODE) {
-                                               InsetArgument const * ins =
-                                                       static_cast<InsetArgument const *>(it->inset);
+                               for (auto const & table : pars_[pit].insetList())
+                                       if (InsetArgument const * ins = table.inset->asInsetArgument())
                                                if (ins->name() == arg) {
                                                        // we have this already
                                                        enable = false;
                                                        break;
                                                }
-                                       }
-                               }
                        }
                } else
                        enable = false;
@@ -3163,6 +3222,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: