#include "insets/InsetQuotes.h"
#include "insets/InsetSpecialChar.h"
#include "insets/InsetText.h"
-#include "insets/InsetInfo.h"
#include "insets/InsetGraphics.h"
#include "insets/InsetGraphicsParams.h"
#include "mathed/InsetMathHull.h"
#include "mathed/MathMacroTemplate.h"
+#include "mathed/MathParser.h"
#include <boost/next_prior.hpp>
// 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();
&& 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")));
}
if (!ins)
break;
- cur.recordUndoFullDocument();
+ cur.recordUndo();
string id = to_utf8(cmd.argument());
string grp = graphics::getGroupParams(bv->buffer(), id);
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
// 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
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.
// 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;
}
// 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);
// 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:
// 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;
// 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);
}
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;
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);
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);
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.
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
break;
case LFUN_FONT_BOLD:
+ case LFUN_FONT_BOLDSYMBOL:
flag.setOnOff(fontinfo.series() == BOLD_SERIES);
break;