#include <config.h>
-#include "Lsstream.h"
-
-#include <ctime>
-#include <clocale>
-
-#include <utility>
-#include <algorithm>
-
-#include <cstdlib>
-#include <cctype>
-
#ifdef __GNUG__
#pragma implementation
#endif
-#include "support/lyxalgo.h"
-#include "support/LAssert.h"
+#include "lyxfunc.h"
#include "version.h"
#include "kbmap.h"
-#include "lyxfunc.h"
#include "lyxrow.h"
#include "bufferlist.h"
#include "BufferView.h"
#include "lyx_main.h"
#include "lyx_cb.h"
#include "LyXAction.h"
+#include "debug.h"
+#include "lyxrc.h"
+#include "lyxtext.h"
+#include "gettext.h"
+#include "Lsstream.h"
+#include "trans_mgr.h"
+#include "layout.h"
+#include "WorkArea.h"
+#include "bufferview_funcs.h"
+#include "minibuffer.h"
+#include "vspace.h"
+#include "LyXView.h"
+#include "lyx_gui_misc.h"
+#include "FloatList.h"
+#include "converter.h"
+#include "exporter.h"
+#include "importer.h"
+#include "FontLoader.h"
+#include "TextCache.h"
+#include "lyxfind.h"
+#include "undo_funcs.h"
+#include "ParagraphParameters.h"
+#include "figureForm.h"
+
#include "insets/inseturl.h"
#include "insets/insetlatexaccent.h"
#include "insets/insettoc.h"
#endif
#include "insets/insettabular.h"
#include "insets/insetcaption.h"
+
#include "mathed/formulamacro.h"
#include "mathed/math_cursor.h"
#include "mathed/math_inset.h"
-#include "minibuffer.h"
-#include "vspace.h"
-#include "LyXView.h"
-#include "lyx_gui_misc.h"
+
+#include "frontends/FileDialog.h"
+#include "frontends/Dialogs.h"
+#include "frontends/Toolbar.h"
+#include "frontends/Menubar.h"
+#include "frontends/Alert.h"
+
+#include "support/lyxalgo.h"
+#include "support/LAssert.h"
#include "support/filetools.h"
#include "support/FileInfo.h"
#include "support/syscall.h"
#include "support/lstrings.h"
#include "support/path.h"
#include "support/lyxfunctional.h"
-#include "debug.h"
-#include "lyxrc.h"
-#include "lyxtext.h"
-#include "gettext.h"
-#include "trans_mgr.h"
-#include "layout.h"
-#include "WorkArea.h"
-#include "bufferview_funcs.h"
-#include "frontends/FileDialog.h"
-#include "frontends/Dialogs.h"
-#include "frontends/Toolbar.h"
-#include "frontends/Menubar.h"
-#include "frontends/Alert.h"
-#include "FloatList.h"
-#include "converter.h"
-#include "exporter.h"
-#include "importer.h"
-#include "FontLoader.h"
-#include "TextCache.h"
-#include "lyxfind.h"
-#include "undo_funcs.h"
-#include "ParagraphParameters.h"
-#include "figureForm.h"
+
+#include <ctime>
+#include <clocale>
+#include <cstdlib>
+#include <cctype>
+
+#include <utility>
+#include <algorithm>
+
using std::pair;
using std::make_pair;
}
-func_status::value_type LyXFunc::getStatus(int ac) const
+FuncStatus LyXFunc::getStatus(int ac) const
{
return getStatus(ac, string());
}
-
-func_status::value_type LyXFunc::getStatus(int ac,
- string const & not_to_use_arg) const
+FuncStatus LyXFunc::getStatus(int ac,
+ string const & not_to_use_arg) const
{
kb_action action;
- func_status::value_type flag = func_status::OK;
+ FuncStatus flag;
string argument;
Buffer * buf = owner->buffer();
else {
action = static_cast<kb_action>(ac);
if (!not_to_use_arg.empty())
- argument = not_to_use_arg; // exept here
+ argument = not_to_use_arg; // except here
}
if (action == LFUN_UNKNOWN_ACTION) {
setErrorMessage(N_("Unknown action"));
- return func_status::Unknown;
+ return flag.unknown(true);
}
// Check whether we need a buffer
LyXAction::ReadOnly)) {
// no
setErrorMessage(N_("Document is read-only"));
- flag |= func_status::Disabled;
+ flag.disabled(true);
}
} else {
// no
setErrorMessage(N_("Command not allowed with"
"out any document open"));
- flag |= func_status::Disabled;
- return flag;
+ return flag.disabled(true);
}
}
case LFUN_TABULAR_FEATURE:
disable = true;
if (owner->view()->theLockingInset()) {
- func_status::value_type ret = func_status::Disabled;
+ FuncStatus ret;
+ ret.disabled(true);
if (owner->view()->theLockingInset()->lyxCode() == Inset::TABULAR_CODE) {
ret = static_cast<InsetTabular *>
(owner->view()->theLockingInset())->
disable = false;
} else {
static InsetTabular inset(*owner->buffer(), 1, 1);
- func_status::value_type ret;
+ FuncStatus ret;
disable = true;
ret = inset.getStatus(argument);
- if ((ret & func_status::ToggleOn) ||
- (ret & func_status::ToggleOff))
- flag |= func_status::ToggleOff;
+ if (ret.onoff(true) || ret.onoff(false)) flag.setOnOff(false);
}
break;
break;
}
if (argument.empty()) {
- flag = func_status::OK;
+ flag.clear();
break;
}
if (!contains("tcb", argument[0])) {
disable = true;
break;
}
- if (argument[0] == align)
- flag |= func_status::ToggleOn;
- else
- flag |= func_status::ToggleOff;
+ flag.setOnOff(argument[0] == align);
} else
disable = true;
break;
break;
}
if (argument.empty()) {
- flag = func_status::OK;
+ flag.clear();
break;
}
if (!contains("lcr", argument[0])) {
disable = true;
break;
}
- if (argument[0] == align)
- flag |= func_status::ToggleOn;
- else
- flag |= func_status::ToggleOff;
+ flag.setOnOff(argument[0] == align);
} else
disable = true;
break;
Inset * tli = owner->view()->theLockingInset();
if (tli && (tli->lyxCode() == Inset::MATH_CODE)) {
MathInsetTypes type = mathcursor->formula()->getType();
- func_status::value_type box = func_status::ToggleOff;
if (argument == "inline") {
- if (type == LM_OT_SIMPLE)
- box = func_status::ToggleOn;
+ flag.setOnOff(type == LM_OT_SIMPLE);
} else if (argument == "display") {
- if (type == LM_OT_EQUATION)
- box = func_status::ToggleOn;
+ flag.setOnOff(type == LM_OT_EQUATION);
} else if (argument == "eqnarray") {
- if (type == LM_OT_EQNARRAY)
- box = func_status::ToggleOn;
+ flag.setOnOff(type == LM_OT_EQNARRAY);
} else if (argument == "align") {
- if (type == LM_OT_ALIGN)
- box = func_status::ToggleOn;
+ flag.setOnOff(type == LM_OT_ALIGN);
} else {
- box = func_status::OK;
disable = true;
}
- flag |= box;
} else
disable = true;
break;
}
if (disable)
- flag |= func_status::Disabled;
+ flag.disabled(true);
- // the font related functions (and a few others)
- func_status::value_type box = func_status::ToggleOff;
- LyXFont const & font =
- TEXT(false)->real_current_font;
+ // A few general toggles
switch (action) {
- case LFUN_EMPH:
- if (font.emph() == LyXFont::ON)
- box = func_status::ToggleOn;
- break;
- case LFUN_NOUN:
- if (font.noun() == LyXFont::ON)
- box = func_status::ToggleOn;
- break;
- case LFUN_BOLD:
- if (font.series() == LyXFont::BOLD_SERIES)
- box = func_status::ToggleOn;
- break;
case LFUN_READ_ONLY_TOGGLE:
- if (buf->isReadonly())
- box = func_status::ToggleOn;
+ flag.setOnOff(buf->isReadonly());
break;
case LFUN_APPENDIX:
- if (TEXT(false)->cursor.par()->params().startOfAppendix())
- box = func_status::ToggleOn;
+ flag.setOnOff(TEXT(false)->cursor.par()->params().startOfAppendix());
break;
default:
- box = func_status::OK;
break;
}
- flag |= box;
+ // the font related toggles
+ if (!mathcursor) {
+ LyXFont const & font = TEXT(false)->real_current_font;
+ switch (action) {
+ case LFUN_EMPH:
+ flag.setOnOff(font.emph() == LyXFont::ON);
+ break;
+ case LFUN_NOUN:
+ flag.setOnOff(font.noun() == LyXFont::ON);
+ break;
+ case LFUN_BOLD:
+ flag.setOnOff(font.series() == LyXFont::BOLD_SERIES);
+ break;
+ case LFUN_SANS:
+ flag.setOnOff(font.family() == LyXFont::SANS_FAMILY);
+ break;
+ case LFUN_ROMAN:
+ flag.setOnOff(font.family() == LyXFont::ROMAN_FAMILY);
+ break;
+ case LFUN_CODE:
+ flag.setOnOff(font.family() == LyXFont::TYPEWRITER_FAMILY);
+ break;
+ default:
+ break;
+ }
+ }
+ else {
+ MathTextCodes tc = mathcursor->getLastCode();
+ switch (action) {
+ case LFUN_BOLD:
+ flag.setOnOff(tc == LM_TC_BF);
+ break;
+ case LFUN_SANS:
+ flag.setOnOff(tc == LM_TC_SF);
+ break;
+ case LFUN_EMPH:
+ flag.setOnOff(tc == LM_TC_CAL);
+ break;
+ case LFUN_ROMAN:
+ flag.setOnOff(tc == LM_TC_RM);
+ break;
+ case LFUN_CODE:
+ flag.setOnOff(tc == LM_TC_TT);
+ break;
+ case LFUN_NOUN:
+ flag.setOnOff(tc == LM_TC_BB);
+ break;
+ case LFUN_DEFAULT:
+ flag.setOnOff(tc == LM_TC_VAR);
+ break;
+ default:
+ break;
+ }
+ }
+
return flag;
}
// temporary dispatch method
void LyXFunc::miniDispatch(string const & s)
{
- if (!s.empty()) {
- dispatch(s);
+ string s2(frontStrip(strip(s)));
+
+ if (!s2.empty()) {
+ dispatch(s2);
}
}
string line = frontStrip(s);
string const arg = strip(frontStrip(split(line, cmd, ' ')));
- return dispatch(lyxaction.LookupFunc(cmd), arg);
+ int action = lyxaction.LookupFunc(cmd);
+
+ if (action == LFUN_UNKNOWN_ACTION) {
+ string const msg = string(_("Unknown function ("))
+ + cmd + ")";
+ owner->message(msg);
+ return string();
+ } else {
+ return dispatch(action, arg);
+ }
}
argument = do_not_use_this_arg; // except here
}
+
#ifdef NEW_DISPATCHER
// We try do call the most specific dispatcher first:
// 1. the lockinginset's dispatch
owner->view()->hideCursor();
// We cannot use this function here
- if (getStatus(ac, do_not_use_this_arg) & func_status::Disabled) {
+ if (getStatus(ac, do_not_use_this_arg).disabled()) {
lyxerr[Debug::ACTION] << "LyXFunc::Dispatch: "
<< lyxaction.getActionName(ac)
<< " [" << ac << "] is disabled at this location"
}
// Undo/Redo is a bit tricky for insets.
if (action == LFUN_UNDO) {
-#ifdef RETHINK_THIS_FOR_NOW_WE_LEAVE_ALL_UNLOCKED
- int slx;
- int sly;
- UpdatableInset * inset =
- owner->view()->theLockingInset()->getLockingInset();
- int inset_id = inset->id();
- inset->getCursorPos(owner->view(), slx, sly);
- owner->view()->unlockInset(inset);
-#else
- owner->view()->unlockInset(owner->view()->theLockingInset());
-#endif
owner->view()->menuUndo();
-#ifdef RETHINK_THIS_FOR_NOW_WE_LEAVE_ALL_UNLOCKED
-#if 0
- if (TEXT()->cursor.par()->
- isInset(TEXT()->cursor.pos())) {
- inset = static_cast<UpdatableInset*>(
- TEXT()->cursor.par()->
- getInset(TEXT()->
- cursor.pos()));
- } else {
- inset = 0;
- }
-#else
- inset = static_cast<UpdatableInset *>(owner->view()->buffer()->getInsetFromID(inset_id));
-#endif
- if (inset)
- inset->edit(owner->view(),slx,sly,0);
-#endif
return string();
} else if (action == LFUN_REDO) {
- int slx;
- int sly;
- UpdatableInset * inset = owner->view()->
- theLockingInset();
- inset->getCursorPos(owner->view(), slx, sly);
- owner->view()->unlockInset(inset);
owner->view()->menuRedo();
- inset = static_cast<UpdatableInset*>(
- TEXT()->cursor.par()->
- getInset(TEXT()->
- cursor.pos()));
- if (inset)
- inset->edit(owner->view(),slx,sly,0);
return string();
} else if (((result=owner->view()->theLockingInset()->
localDispatch(owner->view(), action, argument)) ==
case LFUN_ESCAPE:
{
if (!owner->view()->available()) break;
-
// this function should be used always [asierra060396]
UpdatableInset * tli =
owner->view()->theLockingInset();
lock,
true);
}
+ finishUndo();
}
}
break;
owner->getDialogs()->showLogFile();
break;
- case LFUN_LAYOUTNO:
- {
- lyxerr[Debug::INFO] << "LFUN_LAYOUTNO: (arg) " << argument << endl;
- int sel = strToInt(argument);
- lyxerr[Debug::INFO] << "LFUN_LAYOUTNO: (sel) "<< sel << endl;
-
- // Should this give a setMessage instead?
- if (sel == 0)
- return string(); // illegal argument
-
- --sel; // sel 1..., but layout 0...
-
- // Pretend we got the name instead.
- dispatch(int(LFUN_LAYOUT),
- textclasslist.NameOfLayout(owner->view()
- ->buffer()->params.textclass,
- sel));
- return string();
- }
-
case LFUN_LAYOUT_DOCUMENT:
owner->getDialogs()->showDocument();
break;
}
break;
+ // passthrough hat and underscore outside mathed:
+ case LFUN_SUBSCRIPT:
+ dispatch(LFUN_SELFINSERT, "_");
+ break;
+ case LFUN_SUPERSCRIPT:
+ dispatch(LFUN_SELFINSERT, "^");
+ break;
+
case LFUN_MATH_PANEL:
owner->getDialogs()->showMathPanel();
break;
if (!shortcuts.empty()) {
comname += ": " + shortcuts;
- } else if (!argsadded) {
+ } else if (!argsadded && !argument.empty()) {
comname += " " + argument;
}
// Else, when a non-complete key sequence is pressed,
// show the available options.
- else if (keyseq.length() > 1) {
+ if (keyseq.length() > 0 && !keyseq.deleted()) {
text = keyseq.printOptions();
}