#include "insets/InsetQuotes.h"
#include "insets/InsetSpecialChar.h"
#include "insets/InsetText.h"
-#include "insets/InsetInfo.h"
#include "insets/InsetGraphics.h"
#include "insets/InsetGraphicsParams.h"
// 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);
- formula->read(lex);
- if (formula->getType() == hullNone)
- // Don't create pseudo formulas if
- // delimiters are left out
- formula->mutate(hullSimple);
- cur.insert(formula);
+ formula->readQuiet(lex);
+ if (formula->getType() == hullNone) {
+ // No valid formula, let's try with delims
+ is.str("$" + selstr + "$");
+ lex.setStream(is);
+ formula->readQuiet(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);
} 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")));
}
}
} 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);
if (layout.empty())
layout = tclass.defaultLayoutName();
- if (para.forcePlainLayout())
+ if (para.forcePlainLayout())
// in this case only the empty layout is allowed
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.plainLayoutName();
- } else {
+ } else {
// otherwise, the empty layout maps to the default
if (layout == tclass.plainLayoutName())
layout = tclass.defaultLayoutName();
else
c = par.getChar(pos - 1);
string arg = to_utf8(cmd.argument());
- cur.insert(new InsetQuotes(bv->buffer(), 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.
bv->mouseSetCursor(cur);
- if (!cap::selection()) {
+ 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,
}
if (!bv->mouseSetCursor(cur, false))
cur.updateFlags(Update::SinglePar | Update::FitCursor);
- break;
+ break;
}
default:
// 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);
// 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:
cutSelection(cur, false, false);
cur.clearSelection();
- Font const old_font = cur.real_current_font;
docstring::const_iterator cit = cmd.argument().begin();
- docstring::const_iterator end = cmd.argument().end();
+ docstring::const_iterator const end = cmd.argument().end();
for (; cit != end; ++cit)
bv->translateAndInsert(*cit, this, cur);
// 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);
}
else
p["symbol"] = cmd.argument();
string const data = InsetCommand::params2string("nomenclature", p);
- bv->showDialog("nomenclature", data);
+ 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;
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;
// 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
{
LASSERT(cur.text() == this, /**/);
- Font const & font = cur.real_current_font;
- FontInfo const & fontinfo = font.fontInfo();
+ FontInfo const & fontinfo = cur.real_current_font.fontInfo();
bool enable = true;
InsetCode code = NO_CODE;
break;
case LFUN_LISTING_INSERT:
code = LISTINGS_CODE;
+ // not allowed in description items
+ enable = !inDescriptionItem(cur);
break;
case LFUN_FOOTNOTE_INSERT:
code = FOOT_CODE;
case LFUN_FLOAT_INSERT:
case LFUN_FLOAT_WIDE_INSERT:
code = FLOAT_CODE;
+ // not allowed in description items
+ enable = !inDescriptionItem(cur);
break;
case LFUN_WRAP_INSERT:
code = WRAP_CODE;
+ // not allowed in description items
+ enable = !inDescriptionItem(cur);
break;
case LFUN_FLOAT_LIST_INSERT:
code = FLOAT_LIST_CODE;
break;
case LFUN_CAPTION_INSERT:
code = CAPTION_CODE;
+ // not allowed in description items
+ enable = !inDescriptionItem(cur);
break;
case LFUN_NOTE_INSERT:
code = NOTE_CODE;
- // in commands (sections etc., only Notes are allowed)
+ // in commands (sections etc.) and description items,
+ // only Notes are allowed
enable = (cmd.argument().empty() || cmd.getArg(0) == "Note" ||
- !cur.paragraph().layout().isCommand());
+ (!cur.paragraph().layout().isCommand()
+ && !inDescriptionItem(cur)));
break;
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" &&
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);
break;
}
+ case LFUN_NEWPAGE_INSERT:
+ // not allowed in description items
+ enable = !inDescriptionItem(cur);
+ break;
+
case LFUN_WORD_DELETE_FORWARD:
case LFUN_WORD_DELETE_BACKWARD:
case LFUN_LINE_DELETE:
case LFUN_DATE_INSERT:
case LFUN_SELF_INSERT:
case LFUN_LINE_INSERT:
- case LFUN_NEWPAGE_INSERT:
case LFUN_MATH_DISPLAY:
case LFUN_MATH_MODE:
case LFUN_MATH_MACRO:
}
}
+
+// FIXME: an item inset would make things much easier.
+bool Text::inDescriptionItem(Cursor & cur) const
+{
+ Paragraph & par = cur.paragraph();
+ pos_type const pos = cur.pos();
+ pos_type const body_pos = par.beginOfBody();
+
+ if (par.layout().latextype != LATEX_LIST_ENVIRONMENT
+ && (par.layout().latextype != LATEX_ITEM_ENVIRONMENT
+ || par.layout().margintype != MARGIN_FIRST_DYNAMIC))
+ return false;
+
+ return (pos < body_pos
+ || (pos == body_pos
+ && (pos == 0 || par.getChar(pos - 1) != ' ')));
+}
+
} // namespace lyx