]> git.lyx.org Git - lyx.git/blobdiff - src/Text3.cpp
Typos.
[lyx.git] / src / Text3.cpp
index a34dde66e6b76d00fc33c389b092b1a0ebfc6ec6..e78a4ee68984baf6bcdfc7862be9465f92d87649 100644 (file)
@@ -56,7 +56,6 @@
 #include "insets/InsetQuotes.h"
 #include "insets/InsetSpecialChar.h"
 #include "insets/InsetText.h"
-#include "insets/InsetInfo.h"
 #include "insets/InsetGraphics.h"
 #include "insets/InsetGraphicsParams.h"
 
@@ -68,6 +67,7 @@
 
 #include "mathed/InsetMathHull.h"
 #include "mathed/MathMacroTemplate.h"
+#include "mathed/MathParser.h"
 
 #include <boost/next_prior.hpp>
 
@@ -128,6 +128,9 @@ static void mathDispatch(Cursor & cur, FuncRequest const & cmd, bool display)
        // It may happen that sel is empty but there is a selection
        replaceSelection(cur);
 
+       // Is this a valid formula?
+       bool valid = true;
+
        if (sel.empty()) {
 #ifdef ENABLE_ASSERTIONS
                const int old_pos = cur.pos();
@@ -157,20 +160,35 @@ static void mathDispatch(Cursor & cur, FuncRequest const & cmd, bool display)
                                && sel.find(from_ascii("\\def")) == string::npos)
                {
                        InsetMathHull * formula = new InsetMathHull;
-                       istringstream is(to_utf8(sel));
+                       string const selstr = to_utf8(sel);
+                       istringstream is(selstr);
                        Lexer lex;
                        lex.setStream(is);
+                       mathed_parser_warn_contents(false);
                        formula->read(lex);
-                       if (formula->getType() == hullNone)
-                               // Don't create pseudo formulas if
-                               // delimiters are left out
-                               formula->mutate(hullSimple);
-                       cur.insert(formula);
+                       if (formula->getType() == hullNone) {
+                               // No valid formula, let's try with delims
+                               is.str("$" + selstr + "$");
+                               lex.setStream(is);
+                               formula->read(lex);
+                               if (formula->getType() == hullNone) {
+                                       // Still not valid, leave it as is
+                                       valid = false;
+                                       delete formula;
+                                       cur.insert(sel);
+                               } else
+                                       cur.insert(formula);
+                       } else
+                               cur.insert(formula);
+                       mathed_parser_warn_contents(true);
                } else {
                        cur.insert(new MathMacroTemplate(sel));
                }
        }
-       cur.message(from_utf8(N_("Math editor mode")));
+       if (valid)
+               cur.message(from_utf8(N_("Math editor mode")));
+       else
+               cur.message(from_utf8(N_("No valid math formula")));
 }
 
 
@@ -864,7 +882,7 @@ void Text::dispatch(Cursor & cur, FuncRequest & cmd)
                if (!ins)
                        break;
 
-               cur.recordUndoFullDocument();
+               cur.recordUndo();
 
                string id = to_utf8(cmd.argument());
                string grp = graphics::getGroupParams(bv->buffer(), id);
@@ -1112,9 +1130,8 @@ void Text::dispatch(Cursor & cur, FuncRequest & cmd)
                        else
                                c = par.getChar(pos - 1);
                        string arg = to_utf8(cmd.argument());
-                       cur.insert(new InsetQuotes(c, bufparams.quotes_language,
-                               (arg == "single") ? InsetQuotes::SingleQuotes
-                                       : InsetQuotes::DoubleQuotes));
+                       cur.insert(new InsetQuotes(bv->buffer(), c, (arg == "single")
+                               ? InsetQuotes::SingleQuotes : InsetQuotes::DoubleQuotes));
                        cur.posForward();
                }
                else
@@ -1150,7 +1167,7 @@ void Text::dispatch(Cursor & cur, FuncRequest & cmd)
        // Single-click on work area
        case LFUN_MOUSE_PRESS:
                // We are not marking a selection with the keyboard in any case.
-               cur.bv().cursor().mark() = false;
+               cur.bv().cursor().setMark(false);
                switch (cmd.button()) {
                case mouse_button::button1:
                        // Set the cursor
@@ -1160,6 +1177,7 @@ void Text::dispatch(Cursor & cur, FuncRequest & cmd)
 
                case mouse_button::button2:
                        // Middle mouse pasting.
+                       bv->mouseSetCursor(cur);
                        if (!cap::selection()) {                        
                                // There is no local selection in the current buffer, so try to
                                // paste primary selection instead.
@@ -1184,7 +1202,7 @@ void Text::dispatch(Cursor & cur, FuncRequest & cmd)
                        // Don't do anything if we right-click a
                        // selection, a context menu will popup.
                        if (bvcur.selection() && cur >= bvcur.selectionBegin()
-                           && cur <= bvcur.selectionEnd()) {
+                           && cur < bvcur.selectionEnd()) {
                                cur.noUpdate();
                                return;
                        }
@@ -1231,7 +1249,7 @@ void Text::dispatch(Cursor & cur, FuncRequest & cmd)
                // We continue with our existing selection or start a new one, so don't
                // reset the anchor.
                bvcur.setCursor(cur);
-               bvcur.selection() = true;
+               bvcur.setSelection(true);
                if (cur.top() == old) {
                        // We didn't move one iota, so no need to update the screen.
                        cur.updateFlags(Update::SinglePar | Update::FitCursor);
@@ -1249,13 +1267,17 @@ void Text::dispatch(Cursor & cur, FuncRequest & cmd)
                        // otherwise, single click does not clear persistent selection
                        // buffer.
                        if (cur.selection()) {
-                               // Finish selection.
-                               // If double click, cur is moved to the end of word by selectWord
-                               // but bvcur is current mouse position.
-                               cur.bv().cursor().selection() = true;
-                       }
+                               // Finish selection. If double click,
+                               // cur is moved to the end of word by
+                               // selectWord but bvcur is current
+                               // mouse position.
+                               cur.bv().cursor().setSelection();
+                               // We might have removed an empty but drawn selection
+                               // (probably a margin)
+                               cur.updateFlags(Update::SinglePar | Update::FitCursor);
+                       } else
+                               cur.noUpdate();
                        // FIXME: We could try to handle drag and drop of selection here.
-                       cur.noUpdate();
                        return;
 
                case mouse_button::button2:
@@ -1400,7 +1422,7 @@ void Text::dispatch(Cursor & cur, FuncRequest & cmd)
 
                // add a separate paragraph for the caption inset
                pars.push_back(Paragraph());
-               pars.back().setInsetOwner(pars[0].inInset());
+               pars.back().setInsetOwner(&pars[0].inInset());
                pars.back().setPlainOrDefaultLayout(tclass);
                int cap_pit = pars.size() - 1;
 
@@ -1409,7 +1431,7 @@ void Text::dispatch(Cursor & cur, FuncRequest & cmd)
                // the graphics (or table).
                if (!content) {
                        pars.push_back(Paragraph());
-                       pars.back().setInsetOwner(pars[0].inInset());
+                       pars.back().setInsetOwner(&pars[0].inInset());
                        pars.back().setPlainOrDefaultLayout(tclass);
                }
 
@@ -1480,8 +1502,16 @@ void Text::dispatch(Cursor & cur, FuncRequest & cmd)
                        MacroType type = MacroTypeNewcommand;
                        if (s2 == "def")
                                type = MacroTypeDef;
-                       cur.insert(new MathMacroTemplate(from_utf8(token(s, ' ', 0)), nargs, false, type));
-                       //cur.nextInset()->edit(cur, true);
+                       MathMacroTemplate * inset = new MathMacroTemplate(from_utf8(token(s, ' ', 0)), nargs, false, type);
+                       inset->setBuffer(bv->buffer());
+                       insertInset(cur, inset);
+
+                       // enter macro inset and select the name
+                       cur.push(*inset);
+                       cur.top().pos() = cur.top().lastpos();
+                       cur.resetAnchor();
+                       cur.setSelection(true);
+                       cur.top().pos() = 0;
                }
                break;
 
@@ -1497,6 +1527,7 @@ void Text::dispatch(Cursor & cur, FuncRequest & cmd)
        case LFUN_MATH_MATRIX:
        case LFUN_MATH_DELIM:
        case LFUN_MATH_BIGDELIM: {
+               cur.recordUndo();
                cap::replaceSelection(cur);
                cur.insert(new InsetMathHull(hullSimple));
                checkAndActivateInset(cur, true);
@@ -1512,7 +1543,8 @@ void Text::dispatch(Cursor & cur, FuncRequest & cmd)
                break;
        }
 
-       case LFUN_FONT_BOLD: {
+       case LFUN_FONT_BOLD:
+       case LFUN_FONT_BOLDSYMBOL: {
                Font font(ignore_font, ignore_language);
                font.fontInfo().setSeries(BOLD_SERIES);
                toggleAndShow(cur, this, font);
@@ -1690,6 +1722,8 @@ void Text::dispatch(Cursor & cur, FuncRequest & cmd)
                                tclass.defaultLayoutName();
                        setLayout(cur, laystr);
                        ParagraphParameters p;
+                       // FIXME If this call were replaced with one to clearParagraphParams(),
+                       // then we could get rid of this method altogether.
                        setParagraphs(cur, p);
                        // FIXME This should be simplified when InsetFloatList takes a 
                        // Buffer in its constructor.
@@ -1753,7 +1787,7 @@ void Text::dispatch(Cursor & cur, FuncRequest & cmd)
 
        case LFUN_ESCAPE:
                if (cur.selection()) {
-                       cur.selection() = false;
+                       cur.setSelection(false);
                } else {
                        cur.undispatched();
                        // This used to be LFUN_FINISHED_RIGHT, I think FORWARD is more
@@ -2026,6 +2060,7 @@ bool Text::getStatus(Cursor & cur, FuncRequest const & cmd,
                break;
 
        case LFUN_FONT_BOLD:
+       case LFUN_FONT_BOLDSYMBOL:
                flag.setOnOff(fontinfo.series() == BOLD_SERIES);
                break;