From 88b5d739b5f25ff9012be11620256e98ba3789bb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9=20P=C3=B6nitz?= Date: Tue, 10 Jul 2001 13:17:43 +0000 Subject: [PATCH] MathAccentInset rewritten git-svn-id: svn://svn.lyx.org/lyx/lyx-devel/trunk@2215 a592a061-630c-0410-9148-cb99ea01b6c8 --- src/mathed/ChangeLog | 10 ++- src/mathed/formulabase.C | 54 ++++++++-------- src/mathed/math_accentinset.C | 106 +++++++----------------------- src/mathed/math_accentinset.h | 18 ++---- src/mathed/math_cursor.C | 112 ++++++++------------------------ src/mathed/math_cursor.h | 18 ++---- src/mathed/math_macrotable.C | 8 ++- src/mathed/math_parser.C | 117 ++++++++-------------------------- 8 files changed, 126 insertions(+), 317 deletions(-) diff --git a/src/mathed/ChangeLog b/src/mathed/ChangeLog index a9b9ed3b62..7cf5a8f7ba 100644 --- a/src/mathed/ChangeLog +++ b/src/mathed/ChangeLog @@ -1,4 +1,12 @@ -2001-07-04 André Pönitz + +2001-07-10 André Pönitz + + * math_accentinset.[hC]: rewrite + + * math_parser.C: + math_cursor.C: subsequent changes + +2001-07-10 André Pönitz * math_grid.C: in the first cell of a completely empty row deletes that row, places the cursor in the first of the diff --git a/src/mathed/formulabase.C b/src/mathed/formulabase.C index 491845ce82..b048f29c46 100644 --- a/src/mathed/formulabase.C +++ b/src/mathed/formulabase.C @@ -39,7 +39,6 @@ #include "font.h" #include "math_arrayinset.h" #include "math_spaceinset.h" -#include "math_deliminset.h" #include "support/lyxlib.h" #include "mathed/support.h" #include "undo_funcs.h" @@ -78,6 +77,18 @@ void handleFont(BufferView * bv, MathTextCodes t) mathcursor->handleFont(t); } +void handleAccent(BufferView * bv, int code) +{ + bv->lockedInsetStoreUndo(Undo::EDIT); + mathcursor->handleAccent(code); +} + +void handleDelim(BufferView * bv, int l, int r) +{ + bv->lockedInsetStoreUndo(Undo::EDIT); + mathcursor->handleDelim(l, r); +} + bool openNewInset(BufferView * bv, UpdatableInset * new_inset) { LyXText * lt = bv->getLyXText(); @@ -92,6 +103,7 @@ bool openNewInset(BufferView * bv, UpdatableInset * new_inset) return true; } + } // namespaces @@ -621,16 +633,16 @@ InsetFormulaBase::localDispatch(BufferView * bv, kb_action action, // --- accented characters ------------------------------ - case LFUN_UMLAUT: mathcursor->setAccent(LM_ddot); break; - case LFUN_CIRCUMFLEX: mathcursor->setAccent(LM_hat); break; - case LFUN_GRAVE: mathcursor->setAccent(LM_grave); break; - case LFUN_ACUTE: mathcursor->setAccent(LM_acute); break; - case LFUN_TILDE: mathcursor->setAccent(LM_tilde); break; - case LFUN_MACRON: mathcursor->setAccent(LM_bar); break; - case LFUN_DOT: mathcursor->setAccent(LM_dot); break; - case LFUN_CARON: mathcursor->setAccent(LM_check); break; - case LFUN_BREVE: mathcursor->setAccent(LM_breve); break; - case LFUN_VECTOR: mathcursor->setAccent(LM_vec); break; + case LFUN_UMLAUT: handleAccent(bv, LM_ddot); break; + case LFUN_CIRCUMFLEX: handleAccent(bv, LM_hat); break; + case LFUN_GRAVE: handleAccent(bv, LM_grave); break; + case LFUN_ACUTE: handleAccent(bv, LM_acute); break; + case LFUN_TILDE: handleAccent(bv, LM_tilde); break; + case LFUN_MACRON: handleAccent(bv, LM_bar); break; + case LFUN_DOT: handleAccent(bv, LM_dot); break; + case LFUN_CARON: handleAccent(bv, LM_check); break; + case LFUN_BREVE: handleAccent(bv, LM_breve); break; + case LFUN_VECTOR: handleAccent(bv, LM_vec); break; // Greek mode case LFUN_GREEK: @@ -735,16 +747,7 @@ InsetFormulaBase::localDispatch(BufferView * bv, kb_action action, } else if (vdelim.find(rt[0]) != string::npos) irt = rt[0]; - if (mathcursor->selection) { - MathDelimInset * p = new MathDelimInset(ilt, irt); - MathArray ar; - mathcursor->selArray(ar); - lyxerr << "selarray: " << ar << "\n"; - p->cell(0) = ar; - mathcursor->insert(p); - } else { - mathcursor->insert(new MathDelimInset(ilt, irt)); - } + handleDelim(bv, ilt, irt); updateLocal(bv); break; } @@ -843,16 +846,11 @@ InsetFormulaBase::localDispatch(BufferView * bv, kb_action action, default: if ((action == -1 || action == LFUN_SELFINSERT) && !arg.empty()) { unsigned char c = arg[0]; - lyxerr << "char: '" << c << "' int: " << int(c) << endl; + //lyxerr << "char: '" << c << "' int: " << int(c) << endl; //owner_->getIntl()->getTrans().TranslateAndInsert(c, lt); - lyxerr << "trans: '" << c << "' int: " << int(c) << endl; + //lyxerr << "trans: '" << c << "' int: " << int(c) << endl; bv->lockedInsetStoreUndo(Undo::INSERT); - if (c == ' ' && mathcursor->getAccent() == LM_hat) { - c = '^'; - mathcursor->setAccent(0); - } - if (c == 0) { // Dead key, do nothing //lyxerr << "deadkey" << endl; break; diff --git a/src/mathed/math_accentinset.C b/src/mathed/math_accentinset.C index 32712c9f87..3bfb5ca2ff 100644 --- a/src/mathed/math_accentinset.C +++ b/src/mathed/math_accentinset.C @@ -7,60 +7,24 @@ using std::ostream; -MathAccentInset::MathAccentInset(byte cx, MathTextCodes f, int cd) - : MathInset(1), c(cx), fn(f), code(cd), inset(0) +MathAccentInset::MathAccentInset(int f) + : MathInset(1), code(f) {} -MathAccentInset::MathAccentInset(MathInset * ins, int cd) - : MathInset(0), c(0), fn(LM_TC_MIN), code(cd), inset(ins) -{} - - -MathAccentInset::~MathAccentInset() -{ - delete inset; -} - - MathInset * MathAccentInset::clone() const { - MathAccentInset * p; - - if (inset) - p = new MathAccentInset(inset->clone(), code); - else - p = new MathAccentInset(c, fn, code); - - return p; + return new MathAccentInset(*this); } - -void MathAccentInset::draw(Painter & pain, int x, int y) -{ - int const dw = width() - 2; - - if (inset) - inset->draw(pain, x, y); - else - drawChar(pain, fn, size(), x, y, c); - x += (code == LM_not) ? (width() - dw) / 2 : 2; - mathed_draw_deco(pain, x, y - dy, dw, dh, code); -} - - void MathAccentInset::Metrics(MathStyles st) { - if (inset) { - inset->Metrics(st); - ascent_ = inset->ascent(); - descent_ = inset->descent(); - width_ = inset->width(); - dh = ascent_; - } else { - mathed_char_dim(fn, size(), c, ascent_, descent_, width_); - dh = width() / 2 - 1; - } + xcell(0).Metrics(st); + ascent_ = xcell(0).ascent(); + descent_ = xcell(0).descent(); + width_ = xcell(0).width(); + dh = 5; + if (code == LM_not) { ascent_ += dh; descent_ += dh; @@ -69,8 +33,14 @@ void MathAccentInset::Metrics(MathStyles st) ascent_ += dh + 2; dy = ascent_; -// if (MathIsBinary(fn)) -// width += 2*mathed_char_width(fn, size, ' '); +} + +void MathAccentInset::draw(Painter & pain, int x, int y) +{ + int const dw = width() - 2; + xcell(0).draw(pain, x, y); + x += (code == LM_not) ? (width() - dw) / 2 : 2; + mathed_draw_deco(pain, x, y - dy, dw, dh, code); } @@ -78,28 +48,14 @@ void MathAccentInset::Write(ostream & os, bool fragile) const { latexkeys const * l = lm_get_key_by_id(code, LM_TK_ACCENT); os << '\\' << l->name; - if (code!= LM_not) - os << '{'; - else + if (code == LM_not) os << ' '; + else + os << '{'; - if (inset) - inset->Write(os, fragile); - else { - if (fn>= LM_TC_RM && fn <= LM_TC_TEXTRM) - os << '\\' << math_font_name[fn - LM_TC_RM] << '{'; - if (MathIsSymbol(fn)) { - latexkeys const * l = lm_get_key_by_id(c, LM_TK_SYM); - if (l) - os << '\\' << l->name << ' '; - } else - os << char(c); - - if (fn>= LM_TC_RM && fn<= LM_TC_TEXTRM) - os << '}'; - } + cell(0).Write(os, fragile); - if (code!= LM_not) + if (code != LM_not) os << '}'; } @@ -109,23 +65,7 @@ void MathAccentInset::WriteNormal(ostream & os) const latexkeys const * l = lm_get_key_by_id(code, LM_TK_ACCENT); os << "[accent " << l->name << " "; - if (inset) - inset->WriteNormal(os); - else { - if (fn >= LM_TC_RM && fn <= LM_TC_TEXTRM) - os << "[font " << math_font_name[fn - LM_TC_RM] << "]"; - if (MathIsSymbol(fn)) { - latexkeys const * l = lm_get_key_by_id(c, LM_TK_SYM); - if (l) - os << "[symbol " << l->name << "] "; - } else - os << "[char " << char(c) << "] "; - } + cell(0).WriteNormal(os); os << "] "; } - -int MathAccentInset::getAccentCode() const -{ - return code; -} diff --git a/src/mathed/math_accentinset.h b/src/mathed/math_accentinset.h index 0888c1606e..e75f69fe0d 100644 --- a/src/mathed/math_accentinset.h +++ b/src/mathed/math_accentinset.h @@ -10,13 +10,9 @@ class MathAccentInset : public MathInset { public: /// - MathAccentInset(byte, MathTextCodes, int); + explicit MathAccentInset(int); /// - MathAccentInset(MathInset *, int); - /// - ~MathAccentInset(); - /// - MathInset * clone() const; + MathInset * clone() const; /// void draw(Painter &, int, int); /// @@ -29,17 +25,13 @@ public: int getAccentCode() const; /// bool isAccentInset() const { return true; } -protected: - /// - byte c; - /// - MathTextCodes fn; +private: /// int code; /// - MathInset * inset; + int dh; /// - int dh, dy; + int dy; }; #endif diff --git a/src/mathed/math_cursor.C b/src/mathed/math_cursor.C index c23a395021..558f398acc 100644 --- a/src/mathed/math_cursor.C +++ b/src/mathed/math_cursor.C @@ -42,6 +42,7 @@ #include "math_fracinset.h" #include "math_decorationinset.h" #include "math_dotsinset.h" +#include "math_deliminset.h" #include "math_accentinset.h" #include "math_macrotemplate.h" #include "math_sqrtinset.h" @@ -79,7 +80,6 @@ bool IsMacro(short tok, int id) MathCursor::MathCursor(InsetFormulaBase * formula) : formula_(formula) { - accent = 0; lastcode = LM_TC_MIN; macro_mode = false; first(); @@ -345,10 +345,9 @@ void MathCursor::End() } - void MathCursor::insert(char c, MathTextCodes t) { - lyxerr << "inserting '" << c << "'\n"; + //lyxerr << "inserting '" << c << "'\n"; if (selection) SelDel(); @@ -366,15 +365,10 @@ void MathCursor::insert(char c, MathTextCodes t) } } - if (accent) - doAccent(c, t); - else { - array().insert(cursor_, c, t); - array().next(cursor_); - } + array().insert(cursor_, c, t); + array().next(cursor_); lastcode = t; - return; } @@ -389,15 +383,8 @@ void MathCursor::insert(MathInset * p) SelDel(); } - if (accent && !p->nargs()) - doAccent(p); - else { - array().insert(cursor_, p); - array().next(cursor_); - } - - //if (p->nargs()) - // push(p, true); + array().insert(cursor_, p); + array().next(cursor_); } @@ -670,7 +657,7 @@ in_word_set(s) << " \n"; break; case LM_TK_ACCENT: - setAccent(l->id); + p = new MathAccentInset(l->id); break; case LM_TK_MACRO: @@ -727,9 +714,6 @@ void MathCursor::MacroModeClose() imacro->SetName(l->name); } else { Left(); - if (nextInset()->isAccentInset()) - setAccent( - static_cast(nextInset())->getAccentCode()); array().erase(cursor_); if (l || MathMacroTable::hasTemplate(imacro->name())) Interpret(imacro->name()); @@ -753,16 +737,6 @@ void MathCursor::SelCopy() } } -void MathCursor::selArray(MathArray & ar) const -{ - int const p1 = min(cursor_, anchor_); - int const p2 = max(cursor_, anchor_); - ar = array(); - ar.erase(p2, ar.size()); - ar.erase(0, p1); -} - - void MathCursor::SelCut() { seldump("SelCut"); @@ -892,57 +866,6 @@ void MathCursor::SelGetArea(int * xpoint, int * ypoint, int & n) } -void MathCursor::setAccent(int ac) -{ - if (ac > 0 && accent < 8) - nestaccent[accent++] = ac; - else - accent = 0; // consumed! -} - - -int MathCursor::getAccent() const -{ - return accent > 0 ? nestaccent[accent - 1] : 0; -} - - -void MathCursor::doAccent(char c, MathTextCodes t) -{ - MathInset * ac = 0; - - for (int i = accent - 1; i >= 0; --i) { - if (i == accent - 1) - ac = new MathAccentInset(c, t, nestaccent[i]); - else - ac = new MathAccentInset(ac, nestaccent[i]); - } - - if (ac) - insert(ac); - - accent = 0; // consumed! -} - - -void MathCursor::doAccent(MathInset * p) -{ - MathInset * ac = 0; - - for (int i = accent - 1; i >= 0; --i) { - if (i == accent - 1) - ac = new MathAccentInset(p, nestaccent[i]); - else - ac = new MathAccentInset(ac, nestaccent[i]); - } - - if (ac) - insert(ac); - - accent = 0; // consumed! -} - - void MathCursor::handleFont(MathTextCodes t) { if (selection) { @@ -963,6 +886,27 @@ void MathCursor::handleFont(MathTextCodes t) } +void MathCursor::handleAccent(int code) +{ + MathAccentInset * p = new MathAccentInset(code); + if (selection) { + SelCut(); + p->cell(0) = selarray; + } + insert(p); +} + +void MathCursor::handleDelim(int l, int r) +{ + MathDelimInset * p = new MathDelimInset(l, r); + if (selection) { + SelCut(); + p->cell(0) = selarray; + } + insert(p); +} + + void MathCursor::GetPos(int & x, int & y) { x = xarray().xo() + xarray().pos2x(cursor_); diff --git a/src/mathed/math_cursor.h b/src/mathed/math_cursor.h index 92184db894..3f316d96b7 100644 --- a/src/mathed/math_cursor.h +++ b/src/mathed/math_cursor.h @@ -80,10 +80,6 @@ public: void SetSize(MathStyles); /// bool toggleLimits(); - /// Set accent: if argument = 0 it's considered consumed - void setAccent(int ac = 0); - /// Returns last accent - int getAccent() const; /// // Macro mode methods void MacroModeOpen(); @@ -117,6 +113,10 @@ public: void setLastCode(MathTextCodes t); /// void handleFont(MathTextCodes t); + /// + void handleAccent(int code); + /// + void handleDelim(int l, int r); /// Splits cells and shifts right part to the next cell void splitCell(); /// Splits line and insert new row of cell @@ -138,8 +138,6 @@ public: /// MathTextCodes prevCode() const; /// - void selArray(MathArray &) const; - /// char valign() const; /// char halign() const; @@ -166,14 +164,6 @@ public: /// InsetFormulaBase * const formula_; /// - void doAccent(char c, MathTextCodes t); - /// - void doAccent(MathInset * p); - /// - int accent; - /// - int nestaccent[8]; - /// MathTextCodes lastcode; /// diff --git a/src/mathed/math_macrotable.C b/src/mathed/math_macrotable.C index 4eec360664..4f3368fa07 100644 --- a/src/mathed/math_macrotable.C +++ b/src/mathed/math_macrotable.C @@ -94,7 +94,9 @@ void MathMacroTable::builtinMacros() // This macro doesn't have arguments { MathMacroTemplate * t = new MathMacroTemplate("notin", 0); - t->push_back(new MathAccentInset(LM_in, LM_TC_BOPS, LM_not)); + MathAccentInset * p = new MathAccentInset(LM_not); + p->cell(0).push_back(LM_in, LM_TC_BOPS); + t->push_back(p); insertTemplate(t); } @@ -111,7 +113,9 @@ void MathMacroTable::builtinMacros() { MathMacroTemplate * t = new MathMacroTemplate("emptyset", 0); - t->push_back(new MathAccentInset('0', LM_TC_RM, LM_not)); + MathAccentInset * p = new MathAccentInset(LM_not); + p->cell(0).push_back('0', LM_TC_VAR); + t->push_back(p); insertTemplate(t); } diff --git a/src/mathed/math_parser.C b/src/mathed/math_parser.C index 20e4c73276..a00cbb681b 100644 --- a/src/mathed/math_parser.C +++ b/src/mathed/math_parser.C @@ -227,9 +227,12 @@ unsigned char LexGetArg(unsigned char lf, bool accept_spaces = false) int yylex() { - static int init_done; + static bool init_done = false; - if (!init_done) LexInitCodes(); + if (!init_done) { + LexInitCodes(); + init_done = true; + } while (yyis->good()) { unsigned char c = getuchar(yyis); @@ -330,68 +333,6 @@ int yylex() } -// Accent hacks only for 0.12. Stolen from Cursor. -int accent = 0; -int nestaccent[8]; - -void setAccent(int ac) -{ - if (ac > 0 && accent < 8) - nestaccent[accent++] = ac; - else - accent = 0; // consumed! -} - - -MathInset * doAccent(unsigned char c, MathTextCodes t) -{ - MathInset * ac = 0; - - for (int i = accent - 1; i >= 0; --i) { - if (i == accent - 1) - ac = new MathAccentInset(c, t, nestaccent[i]); - else - ac = new MathAccentInset(ac, nestaccent[i]); - } - accent = 0; // consumed! - - return ac; -} - - -MathInset * doAccent(MathInset * p) -{ - MathInset * ac = 0; - - for (int i = accent - 1; i >= 0; --i) { - if (i == accent - 1) - ac = new MathAccentInset(p, nestaccent[i]); - else - ac = new MathAccentInset(ac, nestaccent[i]); - } - accent = 0; // consumed! - - return ac; -} - - -void do_insert(MathArray & dat, MathInset * m) -{ - if (accent) - dat.push_back(doAccent(m)); - else - dat.push_back(m); -} - -void do_insert(MathArray & dat, unsigned char ch, MathTextCodes fcode) -{ - if (accent) - dat.push_back(doAccent(ch, fcode)); - else - dat.push_back(ch, fcode); -} - - void handle_frac(MathArray & dat, string const & name) { MathFracInset * p = new MathFracInset(name); @@ -548,8 +489,6 @@ void mathed_parse(MathArray & array, unsigned flags) yyvarcode = LM_TC_VAR; int brace = 0; - int acc_brace = 0; - int acc_braces[8]; ++plevel; while (t) { @@ -569,7 +508,7 @@ void mathed_parse(MathArray & array, unsigned flags) switch (t) { case LM_TK_ALPHA: - do_insert(array, yylval.i, yyvarcode); + array.push_back(yylval.i, yyvarcode); break; case LM_TK_ARGUMENT: @@ -581,15 +520,11 @@ void mathed_parse(MathArray & array, unsigned flags) break; case LM_TK_STR: - do_insert(array, yylval.i, LM_TC_CONST); + array.push_back(yylval.i, LM_TC_CONST); break; case LM_TK_OPEN: ++brace; - if (accent && tprev == LM_TK_ACCENT) { - acc_braces[acc_brace++] = brace; - break; - } if (flags & FLAG_BRACE_OPT) { flags &= ~FLAG_BRACE_OPT; flags |= FLAG_BRACE; @@ -608,10 +543,6 @@ void mathed_parse(MathArray & array, unsigned flags) panic = true; break; } - if (acc_brace && brace == acc_braces[acc_brace - 1] - 1) { - --acc_brace; - break; - } if (flags & FLAG_BRACE_FONT) { yyvarcode = LM_TC_VAR; flags &= ~FLAG_BRACE_FONT; @@ -704,13 +635,13 @@ void mathed_parse(MathArray & array, unsigned flags) case LM_TK_SYM: if (yylval.l->id < 256) { MathTextCodes tc = MathIsBOPS(yylval.l->id) ? LM_TC_BOPS: LM_TC_SYMB; - do_insert(array, yylval.l->id, tc); + array.push_back(yylval.l->id, tc); } else - do_insert(array, new MathFuncInset(yylval.l->name)); + array.push_back(new MathFuncInset(yylval.l->name)); break; case LM_TK_BOP: - do_insert(array, yylval.i, LM_TC_BOP); + array.push_back(yylval.i, LM_TC_BOP); break; case LM_TK_SPACE: @@ -801,15 +732,19 @@ void mathed_parse(MathArray & array, unsigned flags) case LM_TK_WIDE: { - MathDecorationInset * sq = new MathDecorationInset(yylval.l->id); - mathed_parse(sq->cell(0), FLAG_BRACE | FLAG_BRACE_LAST); - array.push_back(sq); + MathDecorationInset * p = new MathDecorationInset(yylval.l->id); + mathed_parse(p->cell(0), FLAG_BRACE | FLAG_BRACE_LAST); + array.push_back(p); break; } case LM_TK_ACCENT: - setAccent(yylval.l->id); + { + MathAccentInset * p = new MathAccentInset(yylval.l->id); + mathed_parse(p->cell(0), FLAG_BRACE | FLAG_BRACE_LAST); + array.push_back(p); break; + } case LM_TK_NONUM: curr_num = false; @@ -817,9 +752,9 @@ void mathed_parse(MathArray & array, unsigned flags) case LM_TK_PMOD: case LM_TK_FUNC: - if (accent) - array.push_back(t, LM_TC_CONST); - else + //if (accent) + // array.push_back(t, LM_TC_CONST); + //else array.push_back(new MathFuncInset(yylval.l->name)); break; @@ -832,10 +767,10 @@ void mathed_parse(MathArray & array, unsigned flags) MathMacro * m = MathMacroTable::cloneTemplate(yytext); for (int i = 0; i < m->nargs(); ++i) mathed_parse(m->cell(i), FLAG_BRACE_OPT | FLAG_BRACE_LAST); - do_insert(array, m); + array.push_back(m); m->Metrics(LM_ST_TEXT); } else - do_insert(array, new MathFuncInset(yytext, LM_OT_UNDEF)); + array.push_back(new MathFuncInset(yytext, LM_OT_UNDEF)); break; case LM_TK_END: @@ -862,7 +797,7 @@ void mathed_parse(MathArray & array, unsigned flags) mm->halign(halign); mathed_parse_lines(mm, halign.size(), latex_mathenv[i].numbered, false); - do_insert(array, mm); + array.push_back(mm); //lyxerr << "read matrix " << *mm << "\n"; break; } else @@ -871,7 +806,7 @@ void mathed_parse(MathArray & array, unsigned flags) } case LM_TK_MACRO: - do_insert(array, MathMacroTable::cloneTemplate(yylval.l->name)); + array.push_back(MathMacroTable::cloneTemplate(yylval.l->name)); break; case LM_TK_LABEL: @@ -944,5 +879,3 @@ MathInset * mathed_parse(LyXLex & lex) return p; } - -