* Created: January 1996
* Description: Allows the edition of math paragraphs inside Lyx.
*
- * Copyright: (c) 1996, 1997 Alejandro Aguilar Sierra
+ * Copyright: 1996, 1997 Alejandro Aguilar Sierra
*
* Version: 0.4, Lyx project.
*
*/
#include <config.h>
-#include <cstdlib>
#ifdef __GNUG__
-#pragma implementation "formulamacro.h"
+#pragma implementation
#endif
#include "formulamacro.h"
#include "math_cursor.h"
#include "math_parser.h"
#include "math_macro.h"
+#include "math_macrotable.h"
+#include "math_macrotemplate.h"
#include "lyx_main.h"
-#include "bufferlist.h"
-#include "lyx_cb.h"
#include "BufferView.h"
-#include "lyxscreen.h"
-#include "lyxdraw.h"
#include "gettext.h"
+#include "Painter.h"
+#include "font.h"
+#include "support/lyxlib.h"
+#include "mathed/support.h"
+#include "support/LOstream.h"
+using std::ostream;
+using std::istream;
-InsetFormulaMacro::InsetFormulaMacro():
- InsetFormula(true)
+InsetFormulaMacro::InsetFormulaMacro()
+ : InsetFormula(true)
{
- tmacro = 0;
- opened = false;
+ tmacro = 0;
+ opened = false;
}
-InsetFormulaMacro::InsetFormulaMacro(string nm, int na, bool /*e*/):
- InsetFormula(true), name(nm)
+InsetFormulaMacro::InsetFormulaMacro(string nm, int na, bool /*e*/)
+ : InsetFormula(true), name(nm)
{
- tmacro = MathMacroTable::mathMTable.getTemplate(name.c_str());
- if (!tmacro) {
- tmacro = new MathMacroTemplate(name.c_str(), na);
- MathMacroTable::mathMTable.addTemplate(tmacro);
- }
- opened = false;
+ tmacro = MathMacroTable::mathMTable.getTemplate(name);
+ if (!tmacro) {
+ tmacro = new MathMacroTemplate(name.c_str(), na);
+ MathMacroTable::mathMTable.addTemplate(tmacro);
+ }
+ opened = false;
}
InsetFormulaMacro::~InsetFormulaMacro()
{
- par = 0;
+ par = 0;
}
-InsetFormulaMacro * InsetFormulaMacro::Clone() const
+Inset * InsetFormulaMacro::Clone(Buffer const &) const
{
- return new InsetFormulaMacro(name);
+ return new InsetFormulaMacro(name);
}
-void InsetFormulaMacro::Write(FILE *file)
+void InsetFormulaMacro::Write(Buffer const *, ostream & os) const
{
- fprintf(file, "FormulaMacro ");
- Latex(file, 0);
+ os << "FormulaMacro ";
+ tmacro->WriteDef(os, false);
}
-int InsetFormulaMacro::Latex(FILE *file, signed char /*fragile*/)
+int InsetFormulaMacro::Latex(Buffer const *, ostream & os, bool /*fragile*/,
+ bool /*free_spacing*/) const
{
- int ret = 1;
- tmacro->WriteDef(file);
- return ret;
+ tmacro->WriteDef(os, true); // or false?
+ return 2;
}
-int InsetFormulaMacro::Latex(string &file, signed char /*fragile*/)
+int InsetFormulaMacro::Linuxdoc(Buffer const * buf, ostream & os) const
{
- int ret = 1;
- tmacro->WriteDef(file);
- return ret;
+ return Ascii(buf, os, 0);
}
-int InsetFormulaMacro::Linuxdoc(string &/*file*/)
+int InsetFormulaMacro::DocBook(Buffer const * buf, ostream & os) const
{
- return 0;
+ return Ascii(buf, os, 0);
}
-int InsetFormulaMacro::DocBook(string &/*file*/)
+void InsetFormulaMacro::Read(Buffer const *, LyXLex & lex)
{
- return 0;
+ istream & is = lex.getStream();
+ mathed_parser_file(is, lex.GetLineNo());
+ mathed_parse(0, 0, reinterpret_cast<MathParInset **>(&tmacro));
+
+ // Update line number
+ lex.setLineNo(mathed_parser_lineno());
+
+ MathMacroTable::mathMTable.addTemplate(tmacro);
+ name = tmacro->GetName();
+ par = tmacro;
+ // reading of end_inset in the inset!!!
+ while (lex.IsOK()) {
+ lex.nextToken();
+ if (lex.GetString() == "\\end_inset")
+ break;
+ }
}
-void InsetFormulaMacro::Read(LyXLex &lex)
+int InsetFormulaMacro::ascent(BufferView * pain, LyXFont const & f) const
{
- FILE *file = lex.getFile();
- mathed_parser_file(file, lex.GetLineNo());
- mathed_parse(0, 0, (MathParInset **)&tmacro);
-
- // Update line number
- lex.setLineNo(mathed_parser_lineno());
-
- MathMacroTable::mathMTable.addTemplate(tmacro);
- name = tmacro->GetName();
- par = tmacro;
+ if (opened) {
+ tmacro->update();
+ return InsetFormula::ascent(pain, f);
+ }
+ return lyxfont::maxAscent(f) + 3;
}
-int InsetFormulaMacro::Ascent(LyXFont const &f) const
+int InsetFormulaMacro::descent(BufferView * pain, LyXFont const & f) const
{
- if (opened) {
- tmacro->update();
- return InsetFormula::Ascent(f);
- }
- return f.maxAscent()+3;
+ if (opened) {
+ tmacro->update();
+ return InsetFormula::descent(pain, f);
+ }
+ return lyxfont::maxDescent(f) + 1;
}
-int InsetFormulaMacro::Descent(LyXFont const &f) const
+int InsetFormulaMacro::width(BufferView * bv, LyXFont const & f) const
{
- if (opened) {
- tmacro->update();
- return InsetFormula::Descent(f);
- }
- return f.maxDescent()+1;
+ if (opened) {
+ tmacro->update();
+ return InsetFormula::width(bv, f);
+ }
+ string ilabel(_("Macro: "));
+ ilabel += name;
+ return 6 + lyxfont::width(ilabel, f);
}
-int InsetFormulaMacro::Width(LyXFont const &f) const
+void InsetFormulaMacro::draw(BufferView * bv, LyXFont const & f,
+ int baseline, float & x, bool cleared) const
{
- if (opened) {
+ Painter & pain = bv->painter();
+ LyXFont font(f);
tmacro->update();
- return InsetFormula::Width(f);
- }
- string ilabel(_("Macro: "));
- ilabel += name;
- return 6 + f.stringWidth(ilabel);
+ if (opened) {
+ tmacro->setEditMode(true);
+ InsetFormula::draw(bv, font, baseline, x, cleared);
+ tmacro->setEditMode(false);
+ } else {
+ font.setColor(LColor::math);
+
+ int const y = baseline - ascent(bv, font) + 1;
+ int const w = width(bv, font) - 2;
+ int const h = (ascent(bv, font) + descent(bv, font) - 2);
+
+ pain.fillRectangle(int(x), y, w, h, LColor::mathbg);
+ pain.rectangle(int(x), y, w, h, LColor::mathframe);
+
+ string s(_("Macro: "));
+ s += name;
+ pain.text(int(x + 2), baseline, s, font);
+ x += width(bv, font) - 1;
+ }
}
-void InsetFormulaMacro::Draw(LyXFont font, LyXScreen &scr,
- int baseline, float &x)
+string const InsetFormulaMacro::EditMessage() const
{
- tmacro->update();
- if (opened) {
- tmacro->setEditMode(true);
- InsetFormula::Draw(font, scr, baseline, x);
- tmacro->setEditMode(false);
- } else {
- font.setColor(LyXFont::MATH);
-
- int y= baseline - Ascent(font)+1;
- int w= Width(font) - 2, h= (Ascent(font)+Descent(font)-2);
-
-
- scr.fillRectangle(gc_lighted, int(x), y, w, h);
- scr.drawFrame(FL_UP_FRAME, int(x), y, w, h, FL_BLACK, -1);
-
- string s(_("Macro: "));
- s += name;
- scr.drawString(font, s, baseline, int(x +2));
- x += Width(font) - 1;
- }
+ return _("Math macro editor mode");
}
-void InsetFormulaMacro::Edit(int x, int y)
+void InsetFormulaMacro::Edit(BufferView * bv, int x, int y,unsigned int button)
{
- opened = true;
- par = static_cast<MathParInset*>(tmacro->Clone());
- InsetFormula::Edit(x, y);
+ opened = true;
+ par = static_cast<MathParInset*>(tmacro->Clone());
+ InsetFormula::Edit(bv, x, y, button);
}
-void InsetFormulaMacro::InsetUnlock()
+void InsetFormulaMacro::InsetUnlock(BufferView * bv)
{
- opened = false;
- LyxArrayBase * tarray = tmacro->GetData();
- MathedIter it(tarray);
- it.Clear();
- tmacro->SetData(par->GetData());
- tmacro->setEditMode(false);
- InsetFormula::InsetUnlock();
+ opened = false;
+ MathedArray * tarray = tmacro->GetData();
+ MathedIter it(tarray);
+ it.Clear();
+ tmacro->setData(par->GetData());
+ tmacro->setEditMode(false);
+ InsetFormula::InsetUnlock(bv);
}
-bool InsetFormulaMacro::LocalDispatch(int action, char const *arg)
+UpdatableInset::RESULT
+InsetFormulaMacro::LocalDispatch(BufferView * bv,
+ int action, string const & arg)
{
- if (action == LFUN_MATH_MACROARG) {
- int i = atoi(arg) - 1;
- if (i >= 0 && i < tmacro->getNoArgs()) {
- mathcursor->Insert(tmacro->getMacroPar(i), LM_TC_INSET);
- InsetFormula::UpdateLocal();
- }
+ if (action == LFUN_MATH_MACROARG) {
+ int i = lyx::atoi(arg) - 1;
+ if (i >= 0 && i < tmacro->getNoArgs()) {
+ mathcursor->Insert(tmacro->getMacroPar(i),
+ LM_TC_INSET);
+ InsetFormula::UpdateLocal(bv);
+ }
- return true;
- }
- tmacro->setEditMode(true);
- tmacro->Metrics();
- bool result = InsetFormula::LocalDispatch(action, arg);
- tmacro->setEditMode(false);
+ return DISPATCHED;
+ }
+ tmacro->setEditMode(true);
+ tmacro->Metrics();
+ RESULT result = InsetFormula::LocalDispatch(bv, action, arg);
+ tmacro->setEditMode(false);
- return result;
+ return result;
}