#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 (edit)
inset->edit(cur, true);
// Now put this into inset
- static_cast<InsetCollapsable *>(inset)->text_.insertStringAsParagraphs(cur, ds);
+ static_cast<InsetCollapsable *>(inset)->text().insertStringAsParagraphs(cur, ds);
return true;
}
cur.clearSelection(); // bug 393
cur.finishUndo();
InsetText * insetText = dynamic_cast<InsetText *>(inset);
- if (insetText && !insetText->allowMultiPar() || cur.lastpit() == 0) {
+ if (insetText && (!insetText->allowMultiPar() || cur.lastpit() == 0)) {
// reset first par to default
cur.text()->paragraphs().begin()
->setPlainOrDefaultLayout(bparams.documentClass());
} else {
cur.leaveInset(*inset);
// reset surrounding par to default
- docstring const layoutname = insetText->usePlainLayout()
- ? bparams.documentClass().emptyLayoutName()
- : bparams.documentClass().defaultLayoutName();
+ DocumentClass const & dc = bparams.documentClass();
+ docstring const layoutname = inset->usePlainLayout()
+ ? dc.plainLayoutName()
+ : dc.defaultLayoutName();
text->setLayout(cur, layoutname);
}
}
} else {
if (reverseDirectionNeeded(cur)) {
- cmd.action = cmd.action == LFUN_CHAR_LEFT_SELECT ?
+ cmd.action = cmd.action == LFUN_CHAR_LEFT_SELECT ?
LFUN_CHAR_FORWARD_SELECT : LFUN_CHAR_FORWARD;
} else {
- cmd.action = cmd.action == LFUN_CHAR_LEFT_SELECT ?
+ cmd.action = cmd.action == LFUN_CHAR_LEFT_SELECT ?
LFUN_CHAR_BACKWARD_SELECT : LFUN_CHAR_BACKWARD;
}
dispatch(cur, cmd);
}
} else {
if (reverseDirectionNeeded(cur)) {
- cmd.action = cmd.action == LFUN_CHAR_RIGHT_SELECT ?
+ cmd.action = cmd.action == LFUN_CHAR_RIGHT_SELECT ?
LFUN_CHAR_BACKWARD_SELECT : LFUN_CHAR_BACKWARD;
} else {
- cmd.action = cmd.action == LFUN_CHAR_RIGHT_SELECT ?
+ cmd.action = cmd.action == LFUN_CHAR_RIGHT_SELECT ?
LFUN_CHAR_FORWARD_SELECT : LFUN_CHAR_FORWARD;
}
dispatch(cur, cmd);
return;
}
break;
-
+
case LFUN_UP_SELECT:
case LFUN_DOWN_SELECT:
bool select = cmd.action == LFUN_DOWN_SELECT ||
cmd.action == LFUN_UP_SELECT;
cur.selHandle(select);
-
+
// move cursor up/down
bool up = cmd.action == LFUN_UP_SELECT || cmd.action == LFUN_UP;
bool const successful = cur.upDownInText(up, needsUpdate);
needsUpdate |= cur.beforeDispatchCursor().inMathed();
} else
cur.undispatched();
-
+
break;
}
moveCursor(cur, false);
break;
}
-
+
case LFUN_CHAR_DELETE_FORWARD:
if (!cur.selection()) {
if (cur.pos() == cur.paragraph().size())
if (!ins)
break;
- cur.recordUndoFullDocument();
+ cur.recordUndo();
string id = to_utf8(cmd.argument());
string grp = graphics::getGroupParams(bv->buffer(), id);
case LFUN_PASTE: {
cur.message(_("Paste"));
+ LASSERT(cur.selBegin().idx() == cur.selEnd().idx(), /**/);
cap::replaceSelection(cur);
// without argument?
if (layout.empty())
layout = tclass.defaultLayoutName();
- if (para.forcePlainLayout())
+ if (para.forcePlainLayout())
// in this case only the empty layout is allowed
- layout = tclass.emptyLayoutName();
+ layout = tclass.plainLayoutName();
else if (para.usePlainLayout()) {
- // in this case, default layout maps to empty layout
+ // in this case, default layout maps to empty layout
if (layout == tclass.defaultLayoutName())
- layout = tclass.emptyLayoutName();
- } else {
+ layout = tclass.plainLayoutName();
+ } else {
// otherwise, the empty layout maps to the default
- if (layout == tclass.emptyLayoutName())
+ if (layout == tclass.plainLayoutName())
layout = tclass.defaultLayoutName();
}
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
if (!bv->mouseSetCursor(cur, cmd.argument() == "region-select"))
cur.updateFlags(Update::SinglePar | Update::FitCursor);
- break;
+ break;
case mouse_button::button2:
// Middle mouse pasting.
- if (!cap::selection()) {
+ bv->mouseSetCursor(cur);
+ if (!cap::selection()) {
// There is no local selection in the current buffer, so try to
// paste primary selection instead.
lyx::dispatch(FuncRequest(LFUN_PRIMARY_SELECTION_PASTE,
bv->cursor().finishUndo();
break;
- case mouse_button::button3:
- if (cur.selection()) {
- DocIterator const selbeg = cur.selectionBegin();
- DocIterator const selend = cur.selectionEnd();
- Cursor tmpcur = cur;
- tm.setCursorFromCoordinates(tmpcur, cmd.x, cmd.y);
- // Don't do anything if we right-click a selection, a selection
- // context menu should popup instead.
- if (tmpcur < selbeg || tmpcur >= selend) {
- cur.noUpdate();
- return;
- }
+ case mouse_button::button3: {
+ Cursor const & bvcur = cur.bv().cursor();
+ // 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.noUpdate();
+ return;
}
- if (!bv->mouseSetCursor(cur, false)) {
+ if (!bv->mouseSetCursor(cur, false))
cur.updateFlags(Update::SinglePar | Update::FitCursor);
- break;
- }
+ break;
+ }
+
default:
break;
} // switch (cmd.button())
// 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);
}
}
case LFUN_NOMENCL_INSERT: {
- FuncRequest cmd1 = cmd;
+ InsetCommandParams p(NOMENCL_CODE);
if (cmd.argument().empty())
- cmd1 = FuncRequest(cmd,
- bv->cursor().innerText()->getStringToIndex(bv->cursor()));
- Inset * inset = createInset(cur.bv().buffer(), cmd1);
- if (!inset)
- break;
- cur.recordUndo();
- cur.clearSelection();
- insertInset(cur, inset);
- // Show the dialog for the nomenclature entry, since the
- // description entry still needs to be filled in.
- if (cmd.action == LFUN_NOMENCL_INSERT)
- inset->edit(cur, true);
- cur.posForward();
+ p["symbol"] = bv->cursor().innerText()->getStringToIndex(bv->cursor());
+ else
+ p["symbol"] = cmd.argument();
+ string const data = InsetCommand::params2string("nomenclature", p);
+ bv->showDialog("nomenclature", data);
break;
}
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);
case LFUN_FINISHED_LEFT:
LYXERR(Debug::DEBUG, "handle LFUN_FINISHED_LEFT:\n" << cur);
- // We're leaving an inset, going left. If the inset is LTR, we're
+ // We're leaving an inset, going left. If the inset is LTR, we're
// leaving from the front, so we should not move (remain at --- but
- // not in --- the inset). If the inset is RTL, move left, without
+ // not in --- the inset). If the inset is RTL, move left, without
// entering the inset itself; i.e., move to after the inset.
if (cur.paragraph().getFontSettings(
cur.bv().buffer().params(), cur.pos()).isRightToLeft())
case LFUN_FINISHED_RIGHT:
LYXERR(Debug::DEBUG, "handle LFUN_FINISHED_RIGHT:\n" << cur);
- // We're leaving an inset, going right. If the inset is RTL, we're
+ // We're leaving an inset, going right. If the inset is RTL, we're
// leaving from the front, so we should not move (remain at --- but
- // not in --- the inset). If the inset is LTR, move right, without
+ // not in --- the inset). If the inset is LTR, move right, without
// entering the inset itself; i.e., move to after the inset.
if (!cur.paragraph().getFontSettings(
cur.bv().buffer().params(), cur.pos()).isRightToLeft())
params2string(cur.paragraph(), data);
// Will the paragraph accept changes from the dialog?
- bool const accept =
+ bool const accept =
cur.inset().allowParagraphCustomization(cur.idx());
data = "update " + convert<string>(accept) + '\n' + data;
}
docstring const laystr = cur.inset().usePlainLayout() ?
- tclass.emptyLayoutName() :
+ tclass.plainLayoutName() :
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
+ // FIXME This should be simplified when InsetFloatList takes a
// Buffer in its constructor.
InsetFloatList * ifl = new InsetFloatList(to_utf8(cmd.argument()));
ifl->setBuffer(bv->buffer());
// Given data, an encoding of the ParagraphParameters
// generated in the Paragraph dialog, this function sets
// the current paragraph, or currently selected paragraphs,
- // appropriately.
+ // appropriately.
// NOTE: This function overrides all existing settings.
setParagraphs(cur, cmd.argument());
cur.message(_("Paragraph layout set"));
break;
}
-
+
case LFUN_PARAGRAPH_PARAMS: {
// Given data, an encoding of the ParagraphParameters as we'd
- // find them in a LyX file, this function modifies the current paragraph,
- // or currently selected paragraphs.
+ // find them in a LyX file, this function modifies the current paragraph,
+ // or currently selected paragraphs.
// NOTE: This function only modifies, and does not override, existing
// settings.
setParagraphs(cur, cmd.argument(), true);
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
case LFUN_FLEX_INSERT: {
code = FLEX_CODE;
string s = cmd.getArg(0);
- InsetLayout il =
+ InsetLayout il =
cur.buffer().params().documentClass().insetLayout(from_utf8(s));
if (il.lyxtype() != "charstyle" &&
il.lyxtype() != "custom" &&
code = INDEX_PRINT_CODE;
break;
case LFUN_NOMENCL_INSERT:
+ if (cur.selIsMultiCell() || cur.selIsMultiLine()) {
+ enable = false;
+ break;
+ }
code = NOMENCL_CODE;
break;
case LFUN_NOMENCL_PRINT:
code = TOC_CODE;
break;
case LFUN_HYPERLINK_INSERT:
+ if (cur.selIsMultiCell() || cur.selIsMultiLine()) {
+ enable = false;
+ break;
+ }
code = HYPERLINK_CODE;
break;
case LFUN_QUOTE_INSERT:
break;
case LFUN_FONT_BOLD:
+ case LFUN_FONT_BOLDSYMBOL:
flag.setOnOff(fontinfo.series() == BOLD_SERIES);
break;
enable = !theClipboard().empty();
break;
}
-
+
// we have an argument
string const arg = to_utf8(cmd.argument());
if (isStrUnsignedInt(arg)) {
enable = cap::numberOfSelections() > n;
break;
}
-
+
// explicit graphics type?
if ((arg == "pdf" && theClipboard().hasGraphicsContents(Clipboard::PdfGraphicsType))
|| (arg == "png" && theClipboard().hasGraphicsContents(Clipboard::PngGraphicsType))
enable = true;
break;
}
-
+
// unknown argument
enable = false;
break;
enable = cur.inset().lyxCode() == FLEX_CODE
&& il.lyxtype() == to_utf8(cmd.argument());
} else {
- enable = !isMainText(cur.bv().buffer())
+ enable = !isMainText(cur.bv().buffer())
&& cur.inset().nargs() == 1;
}
break;
case LFUN_SET_GRAPHICS_GROUP: {
InsetGraphics * ins = graphics::getCurrentGraphicsInset(cur);
- if (!ins)
+ if (!ins)
enable = false;
else
flag.setOnOff(to_utf8(cmd.argument()) == ins->getParams().groupId);