X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2Fmathed%2Fformulabase.C;h=a9b75d324d85f00ef5a2c82d363cff917e0a0e25;hb=f5f9c46c35735a5a9d3f186ec5509424e2cffce6;hp=e748bbf137dd05a741fecadda21568e05b89347a;hpb=54e7ddb5d9a348ae9cfc60f399e9c0c2658ab4c5;p=lyx.git diff --git a/src/mathed/formulabase.C b/src/mathed/formulabase.C index e748bbf137..a9b75d324d 100644 --- a/src/mathed/formulabase.C +++ b/src/mathed/formulabase.C @@ -1,9 +1,8 @@ /* -* File: formula.C -* Purpose: Implementation of formula inset +* File: formulabase.C +* Purpose: Implementation of common parts of the LyX math insets * Author: Alejandro Aguilar Sierra * Created: January 1996 -* Description: Allows the edition of math paragraphs inside Lyx. * * Copyright: 1996-1998 Alejandro Aguilar Sierra * @@ -33,6 +32,7 @@ #include "gettext.h" #include "LaTeXFeatures.h" #include "debug.h" +#include "support.h" #include "support/lstrings.h" #include "LyXView.h" #include "Painter.h" @@ -40,16 +40,14 @@ #include "math_arrayinset.h" #include "math_spaceinset.h" #include "math_macrotable.h" +#include "math_factory.h" #include "support/lyxlib.h" -#include "mathed/support.h" #include "undo_funcs.h" using std::endl; using std::ostream; using std::vector; -extern char const * latex_special_chars; - extern char const * latex_mathenv[]; MathCursor * mathcursor = 0; @@ -62,13 +60,6 @@ int sel_x; int sel_y; bool sel_flag; -void mathed_init_fonts(); - -string nicelabel(string const & label) -{ - return "(" + (label.empty() ? "#" : label) + ")"; -} - void handleFont(BufferView * bv, MathTextCodes t) { if (mathcursor->selection()) @@ -76,17 +67,13 @@ void handleFont(BufferView * bv, MathTextCodes t) mathcursor->handleFont(t); } + void handleAccent(BufferView * bv, string const & name) { bv->lockedInsetStoreUndo(Undo::EDIT); - mathcursor->handleAccent(name); + mathcursor->insert(createMathInset(name)); } -void handleDelim(BufferView * bv, int l, int r) -{ - bv->lockedInsetStoreUndo(Undo::EDIT); - mathcursor->handleDelim(l, r); -} bool openNewInset(BufferView * bv, UpdatableInset * new_inset) { @@ -117,48 +104,12 @@ MathArrayInset * matrixpar(int & idx) InsetFormulaBase::InsetFormulaBase() { -#ifdef WITH_WARNINGS -#warning This is needed as long the math parser is not re-entrant -#endif + // This is needed as long the math parser is not re-entrant MathMacroTable::builtinMacros(); //lyxerr << "sizeof MathInset: " << sizeof(MathInset) << "\n"; } -void InsetFormulaBase::read(Buffer const *, LyXLex & lex) -{ - read(lex); -} - - -void InsetFormulaBase::write(Buffer const *, ostream & os) const -{ - write(os); -} - -int InsetFormulaBase::latex(Buffer const *, ostream & os, - bool fragile, bool spacing) const -{ - return latex(os, fragile, spacing); -} - -int InsetFormulaBase::ascii(Buffer const *, ostream & os, int spacing) const -{ - return ascii(os, spacing); -} - -int InsetFormulaBase::linuxdoc(Buffer const *, ostream & os) const -{ - return linuxdoc(os); -} - -int InsetFormulaBase::docBook(Buffer const *, ostream & os) const -{ - return docBook(os); -} - - - // Check if uses AMS macros void InsetFormulaBase::validate(LaTeXFeatures &) const {} @@ -178,7 +129,9 @@ void InsetFormulaBase::edit(BufferView * bv, int x, int /*y*/, unsigned int) lyxerr[Debug::MATHED] << "Cannot lock inset!!!" << endl; metrics(); - //bv->updateInset(this, false); + // if that is removed, we won't get the magenta box when entering an + // inset for the first time + bv->updateInset(this, false); if (x == 0) mathcursor->first(); else @@ -191,8 +144,7 @@ void InsetFormulaBase::edit(BufferView * bv, int x, int /*y*/, unsigned int) void InsetFormulaBase::edit(BufferView * bv, bool front) { -#warning Please have a look if this is right (Jug) -#warning Does not look wrong... although I do not know what it is supposed to do (Andre) + // looks hackish but seems to work edit(bv, front ? 0 : 1, 0, 0); } @@ -216,6 +168,7 @@ void InsetFormulaBase::getCursorPos(BufferView *, int & x, int & y) const mathcursor->getPos(x, y); x -= par()->xo(); y -= par()->yo(); + y -= 3; } @@ -232,10 +185,11 @@ void InsetFormulaBase::toggleInsetCursor(BufferView * bv) mathcursor->getPos(x, y); //x -= par()->xo(); y -= par()->yo(); + y -= 3; int asc; - int desc; - math_font_max_dim(LM_TC_TEXTRM, LM_ST_TEXT, asc, desc); - bv->showLockedInsetCursor(x, y, asc, desc); + int des; + math_font_max_dim(LM_TC_TEXTRM, LM_ST_TEXT, asc, des); + bv->showLockedInsetCursor(x, y, asc, des); } toggleCursorVisible(); @@ -252,9 +206,9 @@ void InsetFormulaBase::showInsetCursor(BufferView * bv, bool) x -= par()->xo(); y -= par()->yo(); int asc; - int desc; - math_font_max_dim(LM_TC_TEXTRM, LM_ST_TEXT, asc, desc); - bv->fitLockedInsetCursor(x, y, asc, desc); + int des; + math_font_max_dim(LM_TC_TEXTRM, LM_ST_TEXT, asc, des); + bv->fitLockedInsetCursor(x, y, asc, des); } toggleInsetCursor(bv); } @@ -351,6 +305,7 @@ void InsetFormulaBase::insetKeyPress(XKeyEvent *) } +int greek_kb_flag = 0; UpdatableInset::RESULT InsetFormulaBase::localDispatch(BufferView * bv, kb_action action, @@ -359,22 +314,17 @@ InsetFormulaBase::localDispatch(BufferView * bv, kb_action action, //lyxerr << "InsetFormulaBase::LocalDispatch: act: " << action // << " arg: '" << arg << "' cursor: " << mathcursor << "\n"; - static int greek_kb_flag = 0; if (!mathcursor) return UNDISPATCHED; - MathTextCodes varcode = LM_TC_MIN; - bool was_macro = mathcursor->inMacroMode(); - bool sel = false; + RESULT result = DISPATCHED; + bool sel = false; + bool was_macro = mathcursor->inMacroMode(); bool was_selection = mathcursor->selection(); - RESULT result = DISPATCHED; hideInsetCursor(bv); - if (mathcursor->getLastCode() == LM_TC_TEX) - varcode = LM_TC_TEX; - mathcursor->normalize(); switch (action) { @@ -385,7 +335,7 @@ InsetFormulaBase::localDispatch(BufferView * bv, kb_action action, sel = true; // fall through... case LFUN_RIGHT: - result = DISPATCH_RESULT(mathcursor->right(sel)); + result = mathcursor->right(sel) ? DISPATCHED : FINISHED_RIGHT; updateLocal(bv, false); break; @@ -394,7 +344,7 @@ InsetFormulaBase::localDispatch(BufferView * bv, kb_action action, sel = true; // fall through case LFUN_LEFT: - result = DISPATCH_RESULT(mathcursor->left(sel)); + result = mathcursor->left(sel) ? DISPATCHED : FINISHED; updateLocal(bv, false); break; @@ -403,7 +353,7 @@ InsetFormulaBase::localDispatch(BufferView * bv, kb_action action, sel = true; case LFUN_UP: - result = DISPATCH_RESULT(mathcursor->up(sel)); + result = mathcursor->up(sel) ? DISPATCHED : FINISHED_UP; updateLocal(bv, false); break; @@ -412,17 +362,23 @@ InsetFormulaBase::localDispatch(BufferView * bv, kb_action action, sel = true; case LFUN_DOWN: - result = DISPATCH_RESULT(mathcursor->down(sel)); + result = mathcursor->down(sel) ? DISPATCHED : FINISHED_DOWN; updateLocal(bv, false); break; + case LFUN_HOMESEL: + sel = true; + case LFUN_HOME: - mathcursor->home(); + mathcursor->home(sel); updateLocal(bv, false); break; + case LFUN_ENDSEL: + sel = true; + case LFUN_END: - mathcursor->end(); + mathcursor->end(sel); updateLocal(bv, false); break; @@ -449,25 +405,14 @@ InsetFormulaBase::localDispatch(BufferView * bv, kb_action action, break; case LFUN_BACKSPACE: - // if (!mathcursor->inMacroMode() && mathcursor->pos() == 0) - if (mathcursor->pos() == 0) { - bv->lockedInsetStoreUndo(Undo::DELETE); - mathcursor->pullArg(false); - bv->updateInset(this, true); - break; - } - if (mathcursor->inMacroMode()) - mathcursor->left(); - else - mathcursor->plainLeft(); - // fall through... + bv->lockedInsetStoreUndo(Undo::DELETE); + mathcursor->backspace(); + bv->updateInset(this, true); + break; case LFUN_DELETE: bv->lockedInsetStoreUndo(Undo::DELETE); - if (mathcursor->pos() == mathcursor->array().size()) - mathcursor->pullArg(true); - else - mathcursor->erase(); + mathcursor->erase(); bv->updateInset(this, true); break; @@ -475,8 +420,7 @@ InsetFormulaBase::localDispatch(BufferView * bv, kb_action action, // sprintf(dispatch_buffer, "%d %d",); // dispatch_result = dispatch_buffer; // break; - case LFUN_SETXY: - { + case LFUN_SETXY: { lyxerr << "LFUN_SETXY broken!\n"; int x; int y; @@ -487,9 +431,8 @@ InsetFormulaBase::localDispatch(BufferView * bv, kb_action action, par()->getXY(x1, y1); mathcursor->setPos(x1 + x, y1 + y); updateLocal(bv, false); + break; } - break; - case LFUN_PASTE: if (was_macro) @@ -509,50 +452,33 @@ InsetFormulaBase::localDispatch(BufferView * bv, kb_action action, mathcursor->selCopy(); break; - case LFUN_HOMESEL: - case LFUN_ENDSEL: case LFUN_WORDRIGHTSEL: case LFUN_WORDLEFTSEL: break; // --- accented characters ------------------------------ - case LFUN_UMLAUT: handleAccent(bv, "ddot"); break; - case LFUN_CIRCUMFLEX: handleAccent(bv, "hat"); break; - case LFUN_GRAVE: handleAccent(bv, "grave"); break; - case LFUN_ACUTE: handleAccent(bv, "acute"); break; - case LFUN_TILDE: handleAccent(bv, "tilde"); break; - case LFUN_MACRON: handleAccent(bv, "bar"); break; - case LFUN_DOT: handleAccent(bv, "dot"); break; - case LFUN_CARON: handleAccent(bv, "check"); break; - case LFUN_BREVE: handleAccent(bv, "breve"); break; - case LFUN_VECTOR: handleAccent(bv, "vec"); break; - - // Greek mode - case LFUN_GREEK: - if (!greek_kb_flag) { - greek_kb_flag = 1; - bv->owner()->message(_("Math greek mode on")); - } else - greek_kb_flag = 0; - break; - - // Greek keyboard - case LFUN_GREEK_TOGGLE: - greek_kb_flag = greek_kb_flag ? 0 : 2; - if (greek_kb_flag) - bv->owner()->message(_("Math greek keyboard on")); - else - bv->owner()->message(_("Math greek keyboard off")); - break; - - // Math fonts - case LFUN_BOLD: handleFont(bv, LM_TC_BF); break; - case LFUN_SANS: handleFont(bv, LM_TC_SF); break; - case LFUN_EMPH: handleFont(bv, LM_TC_CAL); break; - case LFUN_ROMAN: handleFont(bv, LM_TC_RM); break; - case LFUN_CODE: handleFont(bv, LM_TC_TT); break; - case LFUN_DEFAULT: handleFont(bv, LM_TC_VAR); break; + case LFUN_UMLAUT: handleAccent(bv, "ddot"); break; + case LFUN_CIRCUMFLEX: handleAccent(bv, "hat"); break; + case LFUN_GRAVE: handleAccent(bv, "grave"); break; + case LFUN_ACUTE: handleAccent(bv, "acute"); break; + case LFUN_TILDE: handleAccent(bv, "tilde"); break; + case LFUN_MACRON: handleAccent(bv, "bar"); break; + case LFUN_DOT: handleAccent(bv, "dot"); break; + case LFUN_CARON: handleAccent(bv, "check"); break; + case LFUN_BREVE: handleAccent(bv, "breve"); break; + case LFUN_VECTOR: handleAccent(bv, "vec"); break; + + // Math fonts + case LFUN_GREEK: handleFont(bv, LM_TC_GREEK1); break; + case LFUN_GREEK_TOGGLE: handleFont(bv, LM_TC_GREEK); break; + case LFUN_BOLD: handleFont(bv, LM_TC_BF); break; + case LFUN_SANS: handleFont(bv, LM_TC_SF); break; + case LFUN_EMPH: handleFont(bv, LM_TC_CAL); break; + case LFUN_ROMAN: handleFont(bv, LM_TC_RM); break; + case LFUN_CODE: handleFont(bv, LM_TC_TT); break; + case LFUN_NOUN: handleFont(bv, LM_TC_BB); break; + case LFUN_DEFAULT: handleFont(bv, LM_TC_VAR); break; case LFUN_MATH_MODE: handleFont(bv, LM_TC_TEXTRM); @@ -582,22 +508,15 @@ InsetFormulaBase::localDispatch(BufferView * bv, kb_action action, } break; - case LFUN_INSERT_MATH: - if (!arg.empty()) { - bv->lockedInsetStoreUndo(Undo::INSERT); - mathcursor->interpret(arg); - updateLocal(bv, true); - } - break; - case LFUN_MATH_SPACE: { bv->lockedInsetStoreUndo(Undo::EDIT); - MathSpaceInset * p = mathcursor->prevSpaceInset(); - if (p) - p->incSpace(); - else - mathcursor->insert(new MathSpaceInset(1)); + //MathSpaceInset * p = mathcursor->prevSpaceInset(); + //if (p) + // p->incSpace(); + //else + // mathcursor->insert(new MathSpaceInset(1)); + mathcursor->insert(new MathSpaceInset(1)); updateLocal(bv, true); break; } @@ -605,45 +524,17 @@ InsetFormulaBase::localDispatch(BufferView * bv, kb_action action, case LFUN_MATH_DELIM: { bv->lockedInsetStoreUndo(Undo::INSERT); - static const string vdelim("(){}[]./|"); //lyxerr << "formulabase::LFUN_MATH_DELIM, arg: '" << arg << "'\n"; - - if (arg.empty()) - break; - - // try to read integers first - int ilt = '('; - int irt = '.'; + string ls; + string rs; istringstream is(arg.c_str()); - is >> ilt >> irt; - - if (!is) { // ok, the beasties are no integers... try something else - ilt = '('; - irt = '.'; - - istringstream is(arg.c_str()); - string lt; - string rt; - is >> lt >> rt; - //lyxerr << "formulabase::LFUN_MATH_DELIM, lt: '" << lt << "'\n"; - //lyxerr << "formulabase::LFUN_MATH_DELIM, rt: '" << rt << "'\n"; - - if (lt.size() > 1) { - latexkeys const * l = in_word_set(lt); - if (l) - ilt = l->id; - } else if (vdelim.find(lt[0]) != string::npos) - ilt = lt[0]; - - if (rt.size() > 1) { - latexkeys const * l = in_word_set(rt); - if (l) - irt = l->id; - } else if (vdelim.find(rt[0]) != string::npos) - irt = rt[0]; + is >> ls >> rs; + if (!is) { + lyxerr << "can't parse delimeters from '" << arg << "'\n"; + break; } - - handleDelim(bv, ilt, irt); + bv->lockedInsetStoreUndo(Undo::EDIT); + mathcursor->handleDelim(ls, rs); updateLocal(bv, true); break; } @@ -740,134 +631,25 @@ InsetFormulaBase::localDispatch(BufferView * bv, kb_action action, result = UNDISPATCHED; break; - default: - if ((action == -1 || action == LFUN_SELFINSERT) && !arg.empty()) { - unsigned char c = arg[0]; - - lyxerr << "Action: " << action << endl; - - lyxerr << "char: '" << c << "' int: " << int(c) << endl; - //owner_->getIntl()->getTrans().TranslateAndInsert(c, lt); - //lyxerr << "trans: '" << c << "' int: " << int(c) << endl; + case -1: + case LFUN_INSERT_MATH: + case LFUN_SELFINSERT: + if (!arg.empty()) { bv->lockedInsetStoreUndo(Undo::INSERT); - - if (c == 0) { // Dead key, do nothing - //lyxerr << "deadkey" << endl; - break; - } - - if (isalpha(c)) { - if (mathcursor->getLastCode() == LM_TC_TEX) { - mathcursor->macroModeOpen(); - mathcursor->clearLastCode(); - varcode = LM_TC_MIN; - } else if (!varcode) { - MathTextCodes f = mathcursor->getLastCode() ? - mathcursor->getLastCode() : - mathcursor->nextCode(); - varcode = MathIsAlphaFont(f) ? - static_cast(f) : - LM_TC_VAR; - } - - // lyxerr << "Varcode << vardoce; - MathTextCodes char_code = varcode; - if (greek_kb_flag) { - char greek[26] = - {'A', 'B', 'X', 0 , 'E', 0 , 0 , 'H', 'I', 0 , - 'K', 0 , 'M', 'N', 'O', 0 , 0 , 'P', 0 , 'T', - 0, 0, 0, 0, 0 , 'Z' }; - - if ('A' <= c && c <= 'Z' && greek[c - 'A']) { - char_code = LM_TC_RM; - c = greek[c - 'A']; - } else - char_code = LM_TC_SYMB; - } - - mathcursor->insert(c, char_code); - - if (greek_kb_flag && char_code == LM_TC_RM) - mathcursor->setLastCode(LM_TC_VAR); - - varcode = LM_TC_MIN; - - if (greek_kb_flag < 2) - greek_kb_flag = 0; - - } else if (strchr("!,:;{}", c) && (varcode == LM_TC_TEX||was_macro)) { - mathcursor->insert(c, LM_TC_TEX); - if (c == '{') { - mathcursor->insert('}', LM_TC_TEX); - mathcursor->left(); - } - mathcursor->clearLastCode(); - // varcode = LM_TC_MIN; - } else if (c == '_' && varcode == LM_TC_TEX) { - mathcursor->insert(c, LM_TC_SPECIAL); - mathcursor->clearLastCode(); - // varcode = LM_TC_MIN; - } else if ('0' <= c && c <= '9' && (varcode == LM_TC_TEX||was_macro)) { - mathcursor->macroModeOpen(); - mathcursor->clearLastCode(); - mathcursor->insert(c, LM_TC_MIN); - } else if (('0' <= c && c <= '9') || strchr(";:!|[]().,?", c)) { - MathTextCodes code = mathcursor->getLastCode(); - if (code != LM_TC_TEXTRM) - code = LM_TC_CONST; - mathcursor->insert(c, code); - } else if (strchr("+/-*<>=", c)) { - MathTextCodes code = mathcursor->getLastCode(); - if (code != LM_TC_TEXTRM) - code = LM_TC_BOP; - mathcursor->insert(c, code); - } else if (strchr(latex_special_chars, c) && c != '_') { - MathTextCodes code = mathcursor->getLastCode(); - if (code != LM_TC_TEXTRM) - code = LM_TC_SPECIAL; - mathcursor->insert(c, code); - } else if (c == '_' || c == '^') { - char s[2]; - s[0] = c; - s[1] = 0; - mathcursor->interpret(s); - } else if (c == ' ') { - if (!varcode) { - MathTextCodes f = (mathcursor->getLastCode()) ? - mathcursor->getLastCode() : - mathcursor->nextCode(); - varcode = MathIsAlphaFont(f) ? f : LM_TC_VAR; - } - - if (varcode == LM_TC_TEXTRM) - mathcursor->insert(c, LM_TC_TEXTRM); - else if (was_macro) - mathcursor->macroModeClose(); - else if (mathcursor->pop()) - mathcursor->plainRight(); - else { - // this would not work if the inset is in an table! - //bv->text->cursorRight(bv, true); - result = FINISHED; - } - } else if (c == '\'' || c == '@') { - mathcursor->insert(c, LM_TC_VAR); - } else if (c == '\\') { - if (was_macro) - mathcursor->macroModeClose(); - bv->owner()->message(_("TeX mode")); - mathcursor->setLastCode(LM_TC_TEX); - } + mathcursor->interpret(arg); updateLocal(bv, true); - } else if (action == LFUN_MATH_PANEL) { - result = UNDISPATCHED; - } else { - lyxerr << "Closed by action " << action << endl; - result = FINISHED; } + break; + + case LFUN_MATH_PANEL: + result = UNDISPATCHED; + break; + + default: + result = UNDISPATCHED; } - mathcursor->normalize(); + //mathcursor->normalize(); if (was_macro != mathcursor->inMacroMode() && action >= 0 && action != LFUN_BACKSPACE) @@ -892,70 +674,62 @@ Inset::Code InsetFormulaBase::lyxCode() const } -#if 0 -LyXFont const InsetFormulaBase::convertFont(LyXFont const & f) const -{ -#warning Andre, you should be able to remove this now? - // or change it to -#if 1 - return f; -#else - // (Lgb) - - // We have already discussed what was here - LyXFont font(f); - return font; -#endif -} -#endif - - void mathDispatchCreation(BufferView * bv, string const & arg, bool display) { if (bv->available()) { -// Feature "Read math inset from selection" disabled. -// // use selection if available.. -// string sel; -// if (action == LFUN_MATH_IMPORT_SELECTION) -// sel = ""; -// else -// sel = bv->getLyXText()->selectionAsString(bv->buffer()); - - InsetFormula * f; -// if (sel.empty()) { - f = new InsetFormula; - if (openNewInset(bv, f)) { - // don't do that also for LFUN_MATH_MODE unless you want end up with - // always changing to mathrm when opening an inlined inset - // -- I really hate "LyXfunc overloading"... - if (display) - f->localDispatch(bv, LFUN_MATH_DISPLAY, string()); - f->localDispatch(bv, LFUN_INSERT_MATH, arg); - } -// } else { -// f = new InsetFormula(sel); -// bv->getLyXText()->cutSelection(bv); -// openNewInset(bv, f); -// } + // use selection if available.. + //string sel; + //if (action == LFUN_MATH_IMPORT_SELECTION) + // sel = ""; + //else + + string sel = bv->getLyXText()->selectionAsString(bv->buffer(), + false); + + InsetFormulaBase * f; + if (sel.empty()) { + f = new InsetFormula; + if (openNewInset(bv, f)) { + // don't do that also for LFUN_MATH_MODE unless you want end up with + // always changing to mathrm when opening an inlined inset + // -- I really hate "LyXfunc overloading"... + if (display) + f->localDispatch(bv, LFUN_MATH_DISPLAY, string()); + f->localDispatch(bv, LFUN_INSERT_MATH, arg); + } + } else { + // create a macro if we see "\\newcommand" somewhere, and an ordinary + // formula otherwise + if (sel.find("\\newcommand") == string::npos) + f = new InsetFormula(sel); + else + f = new InsetFormulaMacro(sel); + bv->getLyXText()->cutSelection(bv); + openNewInset(bv, f); + } } bv->owner()->getLyXFunc()->setMessage(N_("Math editor mode")); } + void mathDispatchMathDisplay(BufferView * bv, string const & arg) { mathDispatchCreation(bv, arg, true); } + void mathDispatchMathMode(BufferView * bv, string const & arg) { mathDispatchCreation(bv, arg, false); } + void mathDispatchMathImportSelection(BufferView * bv, string const & arg) { mathDispatchCreation(bv, arg, true); } + void mathDispatchMathMacro(BufferView * bv, string const & arg) { if (bv->available()) { @@ -970,6 +744,7 @@ void mathDispatchMathMacro(BufferView * bv, string const & arg) } } + void mathDispatchMathDelim(BufferView * bv, string const & arg) { if (bv->available()) { @@ -987,6 +762,7 @@ void mathDispatchInsertMatrix(BufferView * bv, string const & arg) } } + void mathDispatchInsertMath(BufferView * bv, string const & arg) { if (bv->available()) { @@ -997,3 +773,16 @@ void mathDispatchInsertMath(BufferView * bv, string const & arg) } } + +void mathDispatchGreek(BufferView * bv, string const & arg) +{ + if (bv->available()) { + InsetFormula * f = new InsetFormula; + if (openNewInset(bv, f)) { + bv->theLockingInset()->localDispatch(bv, LFUN_GREEK, string()); + bv->theLockingInset()->localDispatch(bv, LFUN_SELFINSERT, arg); + bv->unlockInset(f); + } + } +} +