mirror of
https://git.lyx.org/repos/lyx.git
synced 2024-11-14 06:57:01 +00:00
more mathed cleanup
git-svn-id: svn://svn.lyx.org/lyx/lyx-devel/trunk@1499 a592a061-630c-0410-9148-cb99ea01b6c8
This commit is contained in:
parent
7d7ec758c0
commit
26428cdf19
@ -1,3 +1,23 @@
|
|||||||
|
2001-02-13 Lars Gullik Bjønnes <larsbj@lyx.org>
|
||||||
|
|
||||||
|
* math_parser.C: include macrotable and macrotemplate
|
||||||
|
|
||||||
|
* math_macrotemplate.[Ch]: new files
|
||||||
|
|
||||||
|
* math_macrotable.[Ch]: new files
|
||||||
|
|
||||||
|
* math_macroarg.[Ch]: new files
|
||||||
|
|
||||||
|
* math_macro.C: move stuff to the new files.
|
||||||
|
|
||||||
|
* math_cursor.C: include math_macrotable.h
|
||||||
|
|
||||||
|
* macro_support.[Ch]: new files
|
||||||
|
|
||||||
|
* formulamacro.C: add more includes
|
||||||
|
|
||||||
|
* Makefile.am (libmathed_la_SOURCES): add new files.
|
||||||
|
|
||||||
2001-02-13 Jean-Marc Lasgouttes <Jean-Marc.Lasgouttes@inria.fr>
|
2001-02-13 Jean-Marc Lasgouttes <Jean-Marc.Lasgouttes@inria.fr>
|
||||||
|
|
||||||
* Makefile.am (libmathed_la_SOURCES): remove duplicate
|
* Makefile.am (libmathed_la_SOURCES): remove duplicate
|
||||||
|
@ -14,6 +14,8 @@ libmathed_la_SOURCES = \
|
|||||||
formula.h \
|
formula.h \
|
||||||
formulamacro.C \
|
formulamacro.C \
|
||||||
formulamacro.h \
|
formulamacro.h \
|
||||||
|
macro_support.C \
|
||||||
|
macro_support.h \
|
||||||
math_sqrtinset.C \
|
math_sqrtinset.C \
|
||||||
math_sqrtinset.h \
|
math_sqrtinset.h \
|
||||||
math_accentinset.C \
|
math_accentinset.C \
|
||||||
@ -43,6 +45,12 @@ libmathed_la_SOURCES = \
|
|||||||
math_iter.h \
|
math_iter.h \
|
||||||
math_macro.C \
|
math_macro.C \
|
||||||
math_macro.h \
|
math_macro.h \
|
||||||
|
math_macroarg.C \
|
||||||
|
math_macroarg.h \
|
||||||
|
math_macrotemplate.C \
|
||||||
|
math_macrotemplate.h \
|
||||||
|
math_macrotable.C \
|
||||||
|
math_macrotable.h \
|
||||||
math_matrixinset.C \
|
math_matrixinset.C \
|
||||||
math_matrixinset.h \
|
math_matrixinset.h \
|
||||||
math_panel.C \
|
math_panel.C \
|
||||||
|
@ -25,6 +25,8 @@
|
|||||||
#include "math_cursor.h"
|
#include "math_cursor.h"
|
||||||
#include "math_parser.h"
|
#include "math_parser.h"
|
||||||
#include "math_macro.h"
|
#include "math_macro.h"
|
||||||
|
#include "math_macrotable.h"
|
||||||
|
#include "math_macrotemplate.h"
|
||||||
#include "lyx_main.h"
|
#include "lyx_main.h"
|
||||||
#include "BufferView.h"
|
#include "BufferView.h"
|
||||||
#include "gettext.h"
|
#include "gettext.h"
|
||||||
|
11
src/mathed/macro_support.C
Normal file
11
src/mathed/macro_support.C
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
#include <config.h>
|
||||||
|
|
||||||
|
#include "support/LOstream.h"
|
||||||
|
#include "macro_support.h"
|
||||||
|
|
||||||
|
using std::ostream;
|
||||||
|
|
||||||
|
ostream & operator<<(ostream & o, MathedMacroFlag mmf)
|
||||||
|
{
|
||||||
|
return o << int(mmf);
|
||||||
|
}
|
15
src/mathed/macro_support.h
Normal file
15
src/mathed/macro_support.h
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
// -*- C++ -*-
|
||||||
|
#ifndef MACROSUPPORT_H
|
||||||
|
#define MACROSUPPORT_H
|
||||||
|
|
||||||
|
#include <iosfwd>
|
||||||
|
|
||||||
|
enum MathedMacroFlag {
|
||||||
|
MMF_Env = 1,
|
||||||
|
MMF_Exp = 2,
|
||||||
|
MMF_Edit = 4
|
||||||
|
};
|
||||||
|
|
||||||
|
extern
|
||||||
|
std::ostream & operator<<(std::ostream & o, MathedMacroFlag mmf);
|
||||||
|
#endif
|
@ -25,6 +25,7 @@
|
|||||||
#include "math_parser.h"
|
#include "math_parser.h"
|
||||||
#include "math_cursor.h"
|
#include "math_cursor.h"
|
||||||
#include "math_macro.h"
|
#include "math_macro.h"
|
||||||
|
#include "math_macrotable.h"
|
||||||
#include "math_root.h"
|
#include "math_root.h"
|
||||||
#include "support/lstrings.h"
|
#include "support/lstrings.h"
|
||||||
#include "debug.h"
|
#include "debug.h"
|
||||||
|
@ -33,6 +33,9 @@
|
|||||||
#include "math_rowst.h"
|
#include "math_rowst.h"
|
||||||
#include "support/lstrings.h"
|
#include "support/lstrings.h"
|
||||||
#include "debug.h"
|
#include "debug.h"
|
||||||
|
#include "mathed/support.h"
|
||||||
|
#include "math_macrotemplate.h"
|
||||||
|
#include "macro_support.h"
|
||||||
|
|
||||||
using std::ostream;
|
using std::ostream;
|
||||||
using std::endl;
|
using std::endl;
|
||||||
@ -42,20 +45,9 @@ ostream & operator<<(ostream & o, MathedTextCodes mtc)
|
|||||||
return o << int(mtc);
|
return o << int(mtc);
|
||||||
}
|
}
|
||||||
|
|
||||||
enum MathedMacroFlag {
|
|
||||||
MMF_Env= 1,
|
|
||||||
MMF_Exp= 2,
|
|
||||||
MMF_Edit= 4
|
|
||||||
};
|
|
||||||
|
|
||||||
ostream & operator<<(ostream & o, MathedMacroFlag mmf)
|
|
||||||
{
|
|
||||||
return o << int(mmf);
|
|
||||||
}
|
|
||||||
|
|
||||||
extern int mathed_string_width(short type, int style, string const & s);
|
|
||||||
extern int mathed_string_height(short, int, string const &, int &, int &);
|
|
||||||
|
|
||||||
|
//extern int mathed_string_width(short type, int style, string const & s);
|
||||||
|
//extern int mathed_string_height(short, int, string const &, int &, int &);
|
||||||
|
|
||||||
MathMacro::MathMacro(MathMacroTemplate * t):
|
MathMacro::MathMacro(MathMacroTemplate * t):
|
||||||
MathParInset(LM_ST_TEXT, "", LM_OT_MACRO), tmplate(t)
|
MathParInset(LM_ST_TEXT, "", LM_OT_MACRO), tmplate(t)
|
||||||
@ -129,6 +121,34 @@ void MathMacro::draw(Painter & pain, int x, int y)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
bool MathMacro::setArgumentIdx(int i)
|
||||||
|
{
|
||||||
|
if (i >= 0 && i < nargs) {
|
||||||
|
idx = i;
|
||||||
|
return true;
|
||||||
|
} else
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int MathMacro::getArgumentIdx() const
|
||||||
|
{
|
||||||
|
return idx;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int MathMacro::getMaxArgumentIdx() const
|
||||||
|
{
|
||||||
|
return nargs - 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
MathedArray * MathMacro::GetData()
|
||||||
|
{
|
||||||
|
return args_[idx].array;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
int MathMacro::GetColumns() const
|
int MathMacro::GetColumns() const
|
||||||
{
|
{
|
||||||
return tmplate->getMacroPar(idx)->GetColumns();
|
return tmplate->getMacroPar(idx)->GetColumns();
|
||||||
@ -155,6 +175,26 @@ void MathMacro::SetFocus(int x, int y)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void MathMacro::SetData(MathedArray * a)
|
||||||
|
{
|
||||||
|
args_[idx].array = a;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
MathedRowSt * MathMacro::getRowSt() const
|
||||||
|
{
|
||||||
|
return args_[idx].row;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
MathedTextCodes MathMacro::getTCode() const
|
||||||
|
{
|
||||||
|
return tcode;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
void MathMacro::Write(ostream & os, bool fragile)
|
void MathMacro::Write(ostream & os, bool fragile)
|
||||||
{
|
{
|
||||||
if (tmplate->flags & MMF_Exp) {
|
if (tmplate->flags & MMF_Exp) {
|
||||||
@ -197,322 +237,3 @@ void MathMacro::Write(ostream & os, bool fragile)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/*--------------- Macro argument -----------------------------------*/
|
|
||||||
|
|
||||||
MathMacroArgument::MathMacroArgument(int n)
|
|
||||||
{
|
|
||||||
number = n;
|
|
||||||
expnd_mode = false;
|
|
||||||
SetType(LM_OT_MACRO_ARG);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void MathMacroArgument::draw(Painter & pain, int x, int baseline)
|
|
||||||
{
|
|
||||||
if (expnd_mode) {
|
|
||||||
MathParInset::draw(pain, x, baseline);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
std::ostringstream ost;
|
|
||||||
ost << '#' << number;
|
|
||||||
drawStr(pain, LM_TC_TEX, size, x, baseline, ost.str().c_str());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void MathMacroArgument::Metrics()
|
|
||||||
{
|
|
||||||
if (expnd_mode) {
|
|
||||||
MathParInset::Metrics();
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
std::ostringstream ost;
|
|
||||||
ost << '#' << number;
|
|
||||||
width = mathed_string_width(LM_TC_TEX, size, ost.str().c_str());
|
|
||||||
mathed_string_height(LM_TC_TEX, size, ost.str().c_str(),
|
|
||||||
ascent, descent);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void MathMacroArgument::Write(ostream & os, bool fragile)
|
|
||||||
{
|
|
||||||
if (expnd_mode) {
|
|
||||||
MathParInset::Write(os, fragile);
|
|
||||||
} else {
|
|
||||||
os << '#' << number << ' ';
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/* --------------------- MathMacroTemplate ---------------------------*/
|
|
||||||
|
|
||||||
MathMacroTemplate::MathMacroTemplate(string const & nm, int na, int flg):
|
|
||||||
MathParInset(LM_ST_TEXT, nm, LM_OT_MACRO),
|
|
||||||
flags(flg), nargs(na)
|
|
||||||
{
|
|
||||||
if (nargs > 0) {
|
|
||||||
tcode = LM_TC_ACTIVE_INSET;
|
|
||||||
args_.resize(nargs);
|
|
||||||
for (int i = 0; i < nargs; ++i) {
|
|
||||||
args_[i].setNumber(i + 1);
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
tcode = LM_TC_INSET;
|
|
||||||
// Here is nargs != args_.size()
|
|
||||||
//args = 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
MathMacroTemplate::~MathMacroTemplate()
|
|
||||||
{
|
|
||||||
// prevent to delete already deleted objects
|
|
||||||
for (int i = 0; i < nargs; ++i) {
|
|
||||||
args_[i].SetData(0);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void MathMacroTemplate::setEditMode(bool ed)
|
|
||||||
{
|
|
||||||
if (ed) {
|
|
||||||
flags |= MMF_Edit;
|
|
||||||
for (int i = 0; i < nargs; ++i) {
|
|
||||||
args_[i].setExpand(false);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
flags &= ~MMF_Edit;
|
|
||||||
for (int i = 0; i < nargs; ++i) {
|
|
||||||
args_[i].setExpand(true);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void MathMacroTemplate::draw(Painter & pain, int x, int y)
|
|
||||||
{
|
|
||||||
int x2, y2;
|
|
||||||
bool expnd = (nargs > 0) ? args_[0].getExpand(): false;
|
|
||||||
if (flags & MMF_Edit) {
|
|
||||||
for (int i = 0; i < nargs; ++i) {
|
|
||||||
args_[i].setExpand(false);
|
|
||||||
}
|
|
||||||
x2 = x; y2 = y;
|
|
||||||
} else {
|
|
||||||
for (int i = 0; i < nargs; ++i) {
|
|
||||||
args_[i].setExpand(true);
|
|
||||||
}
|
|
||||||
x2 = xo; y2 = yo;
|
|
||||||
}
|
|
||||||
MathParInset::draw(pain, x, y);
|
|
||||||
xo = x2; yo = y2;
|
|
||||||
|
|
||||||
for (int i = 0; i < nargs; ++i) {
|
|
||||||
args_[i].setExpand(expnd);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void MathMacroTemplate::Metrics()
|
|
||||||
{
|
|
||||||
bool expnd = (nargs > 0) ? args_[0].getExpand(): false;
|
|
||||||
|
|
||||||
if (flags & MMF_Edit) {
|
|
||||||
for (int i = 0; i < nargs; ++i) {
|
|
||||||
args_[i].setExpand(false);
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
for (int i = 0; i < nargs; ++i) {
|
|
||||||
args_[i].setExpand(true);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
MathParInset::Metrics();
|
|
||||||
|
|
||||||
for (int i = 0; i < nargs; ++i) {
|
|
||||||
args_[i].setExpand(expnd);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void MathMacroTemplate::update(MathMacro * macro)
|
|
||||||
{
|
|
||||||
int idx = (macro) ? macro->getArgumentIdx() : 0;
|
|
||||||
for (int i = 0; i < nargs; ++i) {
|
|
||||||
if (macro) {
|
|
||||||
macro->setArgumentIdx(i);
|
|
||||||
args_[i].SetData(macro->GetData());
|
|
||||||
MathedRowSt * row = macro->getRowSt();
|
|
||||||
args_[i].setRowSt(row);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (macro)
|
|
||||||
macro->setArgumentIdx(idx);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void MathMacroTemplate::WriteDef(ostream & os, bool fragile)
|
|
||||||
{
|
|
||||||
os << "\n\\newcommand{\\" << name << "}";
|
|
||||||
|
|
||||||
if (nargs > 0 )
|
|
||||||
os << "[" << nargs << "]";
|
|
||||||
|
|
||||||
os << "{";
|
|
||||||
|
|
||||||
for (int i = 0; i < nargs; ++i) {
|
|
||||||
args_[i].setExpand(false);
|
|
||||||
}
|
|
||||||
Write(os, fragile);
|
|
||||||
os << "}\n";
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void MathMacroTemplate::setArgument(MathedArray * a, int i)
|
|
||||||
{
|
|
||||||
args_[i].SetData(a);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void MathMacroTemplate::GetMacroXY(int i, int & x, int & y) const
|
|
||||||
{
|
|
||||||
args_[i].GetXY(x, y);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
MathParInset * MathMacroTemplate::getMacroPar(int i) const
|
|
||||||
{
|
|
||||||
if (i >= 0 && i < nargs)
|
|
||||||
return const_cast<MathParInset *>
|
|
||||||
(static_cast<MathParInset const *>(&args_[i]));
|
|
||||||
else
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void MathMacroTemplate::SetMacroFocus(int &idx, int x, int y)
|
|
||||||
{
|
|
||||||
for (int i = 0; i < nargs; ++i) {
|
|
||||||
if (args_[i].Inside(x, y)) {
|
|
||||||
idx = i;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/* -------------------------- MathMacroTable -----------------------*/
|
|
||||||
|
|
||||||
// The search is currently linear but will be binary or hash, later.
|
|
||||||
MathMacroTemplate * MathMacroTable::getTemplate(string const & name) const
|
|
||||||
{
|
|
||||||
for (size_type i = 0; i < macro_table.size(); ++i) {
|
|
||||||
if (name == macro_table[i]->GetName())
|
|
||||||
return macro_table[i];
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
void MathMacroTable::addTemplate(MathMacroTemplate * m)
|
|
||||||
{
|
|
||||||
macro_table.push_back(m);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// All this stuff aparently leaks because it's created here and is not
|
|
||||||
// deleted never, but it have to live all the LyX sesion. OK, would not
|
|
||||||
// so hard to do it in the MacroTable destructor, but this doesn't harm
|
|
||||||
// seriously, so don't bother me with purify results here. ;-)
|
|
||||||
|
|
||||||
void MathMacroTable::builtinMacros()
|
|
||||||
{
|
|
||||||
MathedIter iter;
|
|
||||||
MathParInset * inset;// *arg;
|
|
||||||
MathedArray * array2;
|
|
||||||
|
|
||||||
built = true;
|
|
||||||
|
|
||||||
lyxerr[Debug::MATHED] << "Building macros" << endl;
|
|
||||||
|
|
||||||
// This macro doesn't have arguments
|
|
||||||
MathMacroTemplate * m = new MathMacroTemplate("notin"); // this leaks
|
|
||||||
addTemplate(m);
|
|
||||||
MathedArray * array = new MathedArray; // this leaks
|
|
||||||
iter.SetData(array);
|
|
||||||
iter.Insert(new MathAccentInset(LM_in, LM_TC_BOPS, LM_not)); // this leaks
|
|
||||||
m->SetData(array);
|
|
||||||
|
|
||||||
// These two are only while we are still with LyX 2.x
|
|
||||||
m = new MathMacroTemplate("emptyset"); // this leaks
|
|
||||||
addTemplate(m);
|
|
||||||
array = new MathedArray; // this leaks
|
|
||||||
iter.SetData(array);
|
|
||||||
iter.Insert(new MathAccentInset('O', LM_TC_RM, LM_not)); // this leaks
|
|
||||||
m->SetData(array);
|
|
||||||
|
|
||||||
m = new MathMacroTemplate("perp"); // this leaks
|
|
||||||
addTemplate(m);
|
|
||||||
array = new MathedArray; // this leaks
|
|
||||||
iter.SetData(array);
|
|
||||||
iter.Insert(LM_bot, LM_TC_BOP);
|
|
||||||
m->SetData(array);
|
|
||||||
|
|
||||||
// binom has two arguments
|
|
||||||
m = new MathMacroTemplate("binom", 2);
|
|
||||||
addTemplate(m);
|
|
||||||
array = new MathedArray;
|
|
||||||
m->SetData(array);
|
|
||||||
iter.SetData(array);
|
|
||||||
inset = new MathDelimInset('(', ')');
|
|
||||||
iter.Insert(inset, LM_TC_ACTIVE_INSET);
|
|
||||||
array = new MathedArray;
|
|
||||||
iter.SetData(array);
|
|
||||||
MathFracInset * frac = new MathFracInset(LM_OT_ATOP);
|
|
||||||
iter.Insert(frac, LM_TC_ACTIVE_INSET);
|
|
||||||
inset->SetData(array);
|
|
||||||
array = new MathedArray;
|
|
||||||
array2 = new MathedArray;
|
|
||||||
iter.SetData(array);
|
|
||||||
iter.Insert(m->getMacroPar(0));
|
|
||||||
iter.SetData(array2);
|
|
||||||
iter.Insert(m->getMacroPar(1));
|
|
||||||
frac->SetData(array, array2);
|
|
||||||
|
|
||||||
/*
|
|
||||||
// Cases has 1 argument
|
|
||||||
m = new MathMacroTemplate("cases", 1, MMF_Env); // this leaks
|
|
||||||
addTemplate(m);
|
|
||||||
array = new MathedArray; // this leaks
|
|
||||||
iter.SetData(array);
|
|
||||||
arg = new MathMatrixInset(2, 1); // this leaks
|
|
||||||
|
|
||||||
m->setArgument(arg);
|
|
||||||
arg->SetAlign('c', "ll");
|
|
||||||
iter.Insert(arg, LM_TC_ACTIVE_INSET);
|
|
||||||
inset = new MathDelimInset('{', '.'); // this leaks
|
|
||||||
inset->SetData(array);
|
|
||||||
array = new MathedArray; // this leaks
|
|
||||||
iter.SetData(array);
|
|
||||||
iter.Insert(inset, LM_TC_ACTIVE_INSET);
|
|
||||||
m->SetData(array);
|
|
||||||
|
|
||||||
|
|
||||||
// the environment substack has 1 argument
|
|
||||||
m = new MathMacroTemplate("substack", 1, MMF_Env); // this leaks
|
|
||||||
addTemplate(m);
|
|
||||||
arg = new MathMatrixInset(1, 1); // this leaks
|
|
||||||
m->setArgument(arg);
|
|
||||||
arg->SetType(LM_OT_MACRO);
|
|
||||||
array = new MathedArray; // this leaks
|
|
||||||
iter.SetData(array);
|
|
||||||
iter.Insert(arg, LM_TC_ACTIVE_INSET);
|
|
||||||
m->SetData(array);*/
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
MathMacroTable MathMacroTable::mathMTable;
|
|
||||||
bool MathMacroTable::built = false;
|
|
||||||
|
@ -64,11 +64,11 @@ public:
|
|||||||
///
|
///
|
||||||
MathedArray * GetData();
|
MathedArray * GetData();
|
||||||
///
|
///
|
||||||
MathedRowSt * getRowSt() const { return args_[idx].row; }
|
MathedRowSt * getRowSt() const;
|
||||||
///
|
///
|
||||||
void SetData(MathedArray *);
|
void SetData(MathedArray *);
|
||||||
///
|
///
|
||||||
MathedTextCodes getTCode() const { return tcode; }
|
MathedTextCodes getTCode() const;
|
||||||
///
|
///
|
||||||
bool Permit(short) const;
|
bool Permit(short) const;
|
||||||
|
|
||||||
@ -97,168 +97,9 @@ private:
|
|||||||
friend class MathMacroTemplate;
|
friend class MathMacroTemplate;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
/// An argument
|
|
||||||
class MathMacroArgument: public MathParInset {
|
|
||||||
public:
|
|
||||||
///
|
///
|
||||||
MathMacroArgument() {
|
//typedef MathMacro * MathMacroP;
|
||||||
expnd_mode = false;
|
|
||||||
number = 1;
|
|
||||||
SetType(LM_OT_MACRO_ARG);
|
|
||||||
}
|
|
||||||
///
|
///
|
||||||
explicit
|
//typedef MathMacroTemplate * MathMacroTemplateP;
|
||||||
MathMacroArgument(int);
|
|
||||||
///
|
|
||||||
~MathMacroArgument() { lyxerr << "help, destroyme!" << std::endl; }
|
|
||||||
///
|
|
||||||
MathedInset * Clone() { return this; }
|
|
||||||
///
|
|
||||||
void Metrics();
|
|
||||||
///
|
|
||||||
void draw(Painter &, int x, int baseline);
|
|
||||||
///
|
|
||||||
void Write(std::ostream &, bool fragile);
|
|
||||||
///
|
|
||||||
void setNumber(int n) { number = n; }
|
|
||||||
/// Is expanded or not
|
|
||||||
void setExpand(bool e) { expnd_mode = e; }
|
|
||||||
/// Is expanded or not
|
|
||||||
bool getExpand() const { return expnd_mode; }
|
|
||||||
private:
|
|
||||||
///
|
|
||||||
bool expnd_mode;
|
|
||||||
///
|
|
||||||
int number;
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
/// This class contains the macro definition
|
|
||||||
class MathMacroTemplate: public MathParInset {
|
|
||||||
public:
|
|
||||||
/// A template constructor needs all the data
|
|
||||||
explicit
|
|
||||||
MathMacroTemplate(string const &, int na = 0, int f = 0);
|
|
||||||
///
|
|
||||||
~MathMacroTemplate();
|
|
||||||
///
|
|
||||||
void draw(Painter &, int, int);
|
|
||||||
///
|
|
||||||
void Metrics();
|
|
||||||
///
|
|
||||||
void WriteDef(std::ostream &, bool fragile);
|
|
||||||
/// useful for special insets
|
|
||||||
void setTCode(MathedTextCodes t) { tcode = t; }
|
|
||||||
///
|
|
||||||
MathedTextCodes getTCode() const { return tcode; }
|
|
||||||
///
|
|
||||||
void setArgument(MathedArray *, int i= 0);
|
|
||||||
/// Number of arguments
|
|
||||||
int getNoArgs() const { return nargs; }
|
|
||||||
///
|
|
||||||
void GetMacroXY(int, int &, int &) const;
|
|
||||||
///
|
|
||||||
MathParInset * getMacroPar(int) const;
|
|
||||||
///
|
|
||||||
void SetMacroFocus(int &, int, int);
|
|
||||||
///
|
|
||||||
void setEditMode(bool);
|
|
||||||
|
|
||||||
/// Replace the appropriate arguments with a specific macro's data
|
|
||||||
void update(MathMacro * m = 0);
|
|
||||||
|
|
||||||
private:
|
|
||||||
///
|
|
||||||
short flags;
|
|
||||||
///
|
|
||||||
MathedTextCodes tcode;
|
|
||||||
///
|
|
||||||
std::vector<MathMacroArgument> args_;
|
|
||||||
///
|
|
||||||
int nargs;
|
|
||||||
///
|
|
||||||
friend class MathMacro;
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
///
|
|
||||||
typedef MathMacro * MathMacroP;
|
|
||||||
///
|
|
||||||
typedef MathMacroTemplate * MathMacroTemplateP;
|
|
||||||
|
|
||||||
///
|
|
||||||
class MathMacroTable {
|
|
||||||
public:
|
|
||||||
///
|
|
||||||
void addTemplate(MathMacroTemplate *);
|
|
||||||
///
|
|
||||||
MathMacro * getMacro(string const &) const;
|
|
||||||
///
|
|
||||||
MathMacroTemplate * getTemplate(string const &) const;
|
|
||||||
///
|
|
||||||
void builtinMacros();
|
|
||||||
///
|
|
||||||
static MathMacroTable mathMTable;
|
|
||||||
///
|
|
||||||
static bool built;
|
|
||||||
|
|
||||||
private:
|
|
||||||
///
|
|
||||||
typedef std::vector<MathMacroTemplateP> table_type;
|
|
||||||
///
|
|
||||||
typedef table_type::size_type size_type;
|
|
||||||
///
|
|
||||||
table_type macro_table;
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/*----------------------- inlines -------------------------*/
|
|
||||||
|
|
||||||
inline
|
|
||||||
bool MathMacro::setArgumentIdx(int i)
|
|
||||||
{
|
|
||||||
if (i >= 0 && i < nargs) {
|
|
||||||
idx = i;
|
|
||||||
return true;
|
|
||||||
} else
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
inline
|
|
||||||
int MathMacro::getArgumentIdx() const
|
|
||||||
{
|
|
||||||
return idx;
|
|
||||||
}
|
|
||||||
|
|
||||||
inline
|
|
||||||
int MathMacro::getMaxArgumentIdx() const
|
|
||||||
{
|
|
||||||
return nargs - 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
inline
|
|
||||||
MathedArray * MathMacro::GetData()
|
|
||||||
{
|
|
||||||
return args_[idx].array;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
inline
|
|
||||||
void MathMacro::SetData(MathedArray * a)
|
|
||||||
{
|
|
||||||
args_[idx].array = a;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
inline
|
|
||||||
MathMacro * MathMacroTable::getMacro(string const & name) const
|
|
||||||
{
|
|
||||||
MathMacroTemplate * mt = getTemplate(name);
|
|
||||||
return (mt) ? new MathMacro(mt): 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
85
src/mathed/math_macroarg.C
Normal file
85
src/mathed/math_macroarg.C
Normal file
@ -0,0 +1,85 @@
|
|||||||
|
#include <config.h>
|
||||||
|
|
||||||
|
#include "math_macroarg.h"
|
||||||
|
#include "mathed/support.h"
|
||||||
|
#include "debug.h"
|
||||||
|
|
||||||
|
|
||||||
|
MathMacroArgument::MathMacroArgument()
|
||||||
|
: expnd_mode_(false), number_(1)
|
||||||
|
{
|
||||||
|
SetType(LM_OT_MACRO_ARG);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
MathMacroArgument::MathMacroArgument(int n)
|
||||||
|
: expnd_mode_(false), number_(n)
|
||||||
|
{
|
||||||
|
SetType(LM_OT_MACRO_ARG);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
MathMacroArgument::~MathMacroArgument()
|
||||||
|
{
|
||||||
|
lyxerr << "help, destroyme!" << std::endl;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
MathedInset * MathMacroArgument::Clone()
|
||||||
|
{
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void MathMacroArgument::setNumber(int n)
|
||||||
|
{
|
||||||
|
number_ = n;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void MathMacroArgument::setExpand(bool e)
|
||||||
|
{
|
||||||
|
expnd_mode_ = e;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
bool MathMacroArgument::getExpand() const
|
||||||
|
{
|
||||||
|
return expnd_mode_;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void MathMacroArgument::draw(Painter & pain, int x, int baseline)
|
||||||
|
{
|
||||||
|
if (expnd_mode_) {
|
||||||
|
MathParInset::draw(pain, x, baseline);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
std::ostringstream ost;
|
||||||
|
ost << '#' << number_;
|
||||||
|
drawStr(pain, LM_TC_TEX, size, x, baseline, ost.str().c_str());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void MathMacroArgument::Metrics()
|
||||||
|
{
|
||||||
|
if (expnd_mode_) {
|
||||||
|
MathParInset::Metrics();
|
||||||
|
} else {
|
||||||
|
std::ostringstream ost;
|
||||||
|
ost << '#' << number_;
|
||||||
|
width = mathed_string_width(LM_TC_TEX, size, ost.str().c_str());
|
||||||
|
mathed_string_height(LM_TC_TEX, size, ost.str().c_str(),
|
||||||
|
ascent, descent);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void MathMacroArgument::Write(ostream & os, bool fragile)
|
||||||
|
{
|
||||||
|
if (expnd_mode_) {
|
||||||
|
MathParInset::Write(os, fragile);
|
||||||
|
} else {
|
||||||
|
os << '#' << number_ << ' ';
|
||||||
|
}
|
||||||
|
}
|
37
src/mathed/math_macroarg.h
Normal file
37
src/mathed/math_macroarg.h
Normal file
@ -0,0 +1,37 @@
|
|||||||
|
// -*- C++ -*-
|
||||||
|
#ifndef MATHMACROARGUMENT_H
|
||||||
|
#define MATHMACROARGUMENT_H
|
||||||
|
|
||||||
|
#include "math_parinset.h"
|
||||||
|
|
||||||
|
/// An argument
|
||||||
|
class MathMacroArgument: public MathParInset {
|
||||||
|
public:
|
||||||
|
///
|
||||||
|
MathMacroArgument();
|
||||||
|
///
|
||||||
|
explicit
|
||||||
|
MathMacroArgument(int);
|
||||||
|
///
|
||||||
|
~MathMacroArgument();
|
||||||
|
///
|
||||||
|
MathedInset * Clone();
|
||||||
|
///
|
||||||
|
void Metrics();
|
||||||
|
///
|
||||||
|
void draw(Painter &, int x, int baseline);
|
||||||
|
///
|
||||||
|
void Write(std::ostream &, bool fragile);
|
||||||
|
///
|
||||||
|
void setNumber(int n);
|
||||||
|
/// Is expanded or not
|
||||||
|
void setExpand(bool e);
|
||||||
|
/// Is expanded or not
|
||||||
|
bool getExpand() const;
|
||||||
|
private:
|
||||||
|
///
|
||||||
|
bool expnd_mode_;
|
||||||
|
///
|
||||||
|
int number_;
|
||||||
|
};
|
||||||
|
#endif
|
131
src/mathed/math_macrotable.C
Normal file
131
src/mathed/math_macrotable.C
Normal file
@ -0,0 +1,131 @@
|
|||||||
|
#include <config.h>
|
||||||
|
|
||||||
|
#include "math_macrotable.h"
|
||||||
|
#include "math_macro.h"
|
||||||
|
#include "math_macrotemplate.h"
|
||||||
|
#include "math_iter.h"
|
||||||
|
#include "array.h"
|
||||||
|
#include "math_accentinset.h"
|
||||||
|
#include "math_deliminset.h"
|
||||||
|
#include "math_fracinset.h"
|
||||||
|
#include "math_parinset.h"
|
||||||
|
|
||||||
|
|
||||||
|
MathMacroTable MathMacroTable::mathMTable;
|
||||||
|
|
||||||
|
bool MathMacroTable::built = false;
|
||||||
|
|
||||||
|
|
||||||
|
MathMacro * MathMacroTable::getMacro(string const & name) const
|
||||||
|
{
|
||||||
|
MathMacroTemplate * mt = getTemplate(name);
|
||||||
|
return (mt) ? new MathMacro(mt): 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// The search is currently linear but will be binary or hash, later.
|
||||||
|
MathMacroTemplate * MathMacroTable::getTemplate(string const & name) const
|
||||||
|
{
|
||||||
|
for (size_type i = 0; i < macro_table.size(); ++i) {
|
||||||
|
if (name == macro_table[i]->GetName())
|
||||||
|
return macro_table[i];
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
void MathMacroTable::addTemplate(MathMacroTemplate * m)
|
||||||
|
{
|
||||||
|
macro_table.push_back(m);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// All this stuff aparently leaks because it's created here and is not
|
||||||
|
// deleted never, but it have to live all the LyX sesion. OK, would not
|
||||||
|
// so hard to do it in the MacroTable destructor, but this doesn't harm
|
||||||
|
// seriously, so don't bother me with purify results here. ;-)
|
||||||
|
|
||||||
|
void MathMacroTable::builtinMacros()
|
||||||
|
{
|
||||||
|
MathedIter iter;
|
||||||
|
MathParInset * inset;// *arg;
|
||||||
|
MathedArray * array2;
|
||||||
|
|
||||||
|
built = true;
|
||||||
|
|
||||||
|
lyxerr[Debug::MATHED] << "Building macros" << endl;
|
||||||
|
|
||||||
|
// This macro doesn't have arguments
|
||||||
|
MathMacroTemplate * m = new MathMacroTemplate("notin"); // this leaks
|
||||||
|
addTemplate(m);
|
||||||
|
MathedArray * array = new MathedArray; // this leaks
|
||||||
|
iter.SetData(array);
|
||||||
|
iter.Insert(new MathAccentInset(LM_in, LM_TC_BOPS, LM_not)); // this leaks
|
||||||
|
m->SetData(array);
|
||||||
|
|
||||||
|
// These two are only while we are still with LyX 2.x
|
||||||
|
m = new MathMacroTemplate("emptyset"); // this leaks
|
||||||
|
addTemplate(m);
|
||||||
|
array = new MathedArray; // this leaks
|
||||||
|
iter.SetData(array);
|
||||||
|
iter.Insert(new MathAccentInset('O', LM_TC_RM, LM_not)); // this leaks
|
||||||
|
m->SetData(array);
|
||||||
|
|
||||||
|
m = new MathMacroTemplate("perp"); // this leaks
|
||||||
|
addTemplate(m);
|
||||||
|
array = new MathedArray; // this leaks
|
||||||
|
iter.SetData(array);
|
||||||
|
iter.Insert(LM_bot, LM_TC_BOP);
|
||||||
|
m->SetData(array);
|
||||||
|
|
||||||
|
// binom has two arguments
|
||||||
|
m = new MathMacroTemplate("binom", 2);
|
||||||
|
addTemplate(m);
|
||||||
|
array = new MathedArray;
|
||||||
|
m->SetData(array);
|
||||||
|
iter.SetData(array);
|
||||||
|
inset = new MathDelimInset('(', ')');
|
||||||
|
iter.Insert(inset, LM_TC_ACTIVE_INSET);
|
||||||
|
array = new MathedArray;
|
||||||
|
iter.SetData(array);
|
||||||
|
MathFracInset * frac = new MathFracInset(LM_OT_ATOP);
|
||||||
|
iter.Insert(frac, LM_TC_ACTIVE_INSET);
|
||||||
|
inset->SetData(array);
|
||||||
|
array = new MathedArray;
|
||||||
|
array2 = new MathedArray;
|
||||||
|
iter.SetData(array);
|
||||||
|
iter.Insert(m->getMacroPar(0));
|
||||||
|
iter.SetData(array2);
|
||||||
|
iter.Insert(m->getMacroPar(1));
|
||||||
|
frac->SetData(array, array2);
|
||||||
|
|
||||||
|
/*
|
||||||
|
// Cases has 1 argument
|
||||||
|
m = new MathMacroTemplate("cases", 1, MMF_Env); // this leaks
|
||||||
|
addTemplate(m);
|
||||||
|
array = new MathedArray; // this leaks
|
||||||
|
iter.SetData(array);
|
||||||
|
arg = new MathMatrixInset(2, 1); // this leaks
|
||||||
|
|
||||||
|
m->setArgument(arg);
|
||||||
|
arg->SetAlign('c', "ll");
|
||||||
|
iter.Insert(arg, LM_TC_ACTIVE_INSET);
|
||||||
|
inset = new MathDelimInset('{', '.'); // this leaks
|
||||||
|
inset->SetData(array);
|
||||||
|
array = new MathedArray; // this leaks
|
||||||
|
iter.SetData(array);
|
||||||
|
iter.Insert(inset, LM_TC_ACTIVE_INSET);
|
||||||
|
m->SetData(array);
|
||||||
|
|
||||||
|
|
||||||
|
// the environment substack has 1 argument
|
||||||
|
m = new MathMacroTemplate("substack", 1, MMF_Env); // this leaks
|
||||||
|
addTemplate(m);
|
||||||
|
arg = new MathMatrixInset(1, 1); // this leaks
|
||||||
|
m->setArgument(arg);
|
||||||
|
arg->SetType(LM_OT_MACRO);
|
||||||
|
array = new MathedArray; // this leaks
|
||||||
|
iter.SetData(array);
|
||||||
|
iter.Insert(arg, LM_TC_ACTIVE_INSET);
|
||||||
|
m->SetData(array);*/
|
||||||
|
}
|
34
src/mathed/math_macrotable.h
Normal file
34
src/mathed/math_macrotable.h
Normal file
@ -0,0 +1,34 @@
|
|||||||
|
// -*- C++ -*-
|
||||||
|
#ifndef MATHMACROTABLE
|
||||||
|
#define MATHMACROTABLE
|
||||||
|
|
||||||
|
#include <vector>
|
||||||
|
#include "LString.h"
|
||||||
|
|
||||||
|
class MathMacroTemplate;
|
||||||
|
class MathMacro;
|
||||||
|
|
||||||
|
///
|
||||||
|
class MathMacroTable {
|
||||||
|
public:
|
||||||
|
///
|
||||||
|
void addTemplate(MathMacroTemplate *);
|
||||||
|
///
|
||||||
|
MathMacro * getMacro(string const &) const;
|
||||||
|
///
|
||||||
|
MathMacroTemplate * getTemplate(string const &) const;
|
||||||
|
///
|
||||||
|
void builtinMacros();
|
||||||
|
///
|
||||||
|
static MathMacroTable mathMTable;
|
||||||
|
///
|
||||||
|
static bool built;
|
||||||
|
private:
|
||||||
|
///
|
||||||
|
typedef std::vector<MathMacroTemplate *> table_type;
|
||||||
|
///
|
||||||
|
typedef table_type::size_type size_type;
|
||||||
|
///
|
||||||
|
table_type macro_table;
|
||||||
|
};
|
||||||
|
#endif
|
178
src/mathed/math_macrotemplate.C
Normal file
178
src/mathed/math_macrotemplate.C
Normal file
@ -0,0 +1,178 @@
|
|||||||
|
#include <config.h>
|
||||||
|
|
||||||
|
#include "math_macrotemplate.h"
|
||||||
|
#include "math_macro.h"
|
||||||
|
#include "macro_support.h"
|
||||||
|
|
||||||
|
|
||||||
|
void MathMacroTemplate::setTCode(MathedTextCodes t)
|
||||||
|
{
|
||||||
|
tcode = t;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
MathedTextCodes MathMacroTemplate::getTCode() const
|
||||||
|
{
|
||||||
|
return tcode;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int MathMacroTemplate::getNoArgs() const
|
||||||
|
{
|
||||||
|
return nargs;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
MathMacroTemplate::MathMacroTemplate(string const & nm, int na, int flg):
|
||||||
|
MathParInset(LM_ST_TEXT, nm, LM_OT_MACRO),
|
||||||
|
flags(flg), nargs(na)
|
||||||
|
{
|
||||||
|
if (nargs > 0) {
|
||||||
|
tcode = LM_TC_ACTIVE_INSET;
|
||||||
|
args_.resize(nargs);
|
||||||
|
for (int i = 0; i < nargs; ++i) {
|
||||||
|
args_[i].setNumber(i + 1);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
tcode = LM_TC_INSET;
|
||||||
|
// Here is nargs != args_.size()
|
||||||
|
//args = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
MathMacroTemplate::~MathMacroTemplate()
|
||||||
|
{
|
||||||
|
// prevent to delete already deleted objects
|
||||||
|
for (int i = 0; i < nargs; ++i) {
|
||||||
|
args_[i].SetData(0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void MathMacroTemplate::setEditMode(bool ed)
|
||||||
|
{
|
||||||
|
if (ed) {
|
||||||
|
flags |= MMF_Edit;
|
||||||
|
for (int i = 0; i < nargs; ++i) {
|
||||||
|
args_[i].setExpand(false);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
flags &= ~MMF_Edit;
|
||||||
|
for (int i = 0; i < nargs; ++i) {
|
||||||
|
args_[i].setExpand(true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void MathMacroTemplate::draw(Painter & pain, int x, int y)
|
||||||
|
{
|
||||||
|
int x2, y2;
|
||||||
|
bool expnd = (nargs > 0) ? args_[0].getExpand(): false;
|
||||||
|
if (flags & MMF_Edit) {
|
||||||
|
for (int i = 0; i < nargs; ++i) {
|
||||||
|
args_[i].setExpand(false);
|
||||||
|
}
|
||||||
|
x2 = x; y2 = y;
|
||||||
|
} else {
|
||||||
|
for (int i = 0; i < nargs; ++i) {
|
||||||
|
args_[i].setExpand(true);
|
||||||
|
}
|
||||||
|
x2 = xo; y2 = yo;
|
||||||
|
}
|
||||||
|
MathParInset::draw(pain, x, y);
|
||||||
|
xo = x2; yo = y2;
|
||||||
|
|
||||||
|
for (int i = 0; i < nargs; ++i) {
|
||||||
|
args_[i].setExpand(expnd);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void MathMacroTemplate::Metrics()
|
||||||
|
{
|
||||||
|
bool expnd = (nargs > 0) ? args_[0].getExpand(): false;
|
||||||
|
|
||||||
|
if (flags & MMF_Edit) {
|
||||||
|
for (int i = 0; i < nargs; ++i) {
|
||||||
|
args_[i].setExpand(false);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
for (int i = 0; i < nargs; ++i) {
|
||||||
|
args_[i].setExpand(true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
MathParInset::Metrics();
|
||||||
|
|
||||||
|
for (int i = 0; i < nargs; ++i) {
|
||||||
|
args_[i].setExpand(expnd);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void MathMacroTemplate::update(MathMacro * macro)
|
||||||
|
{
|
||||||
|
int idx = (macro) ? macro->getArgumentIdx() : 0;
|
||||||
|
for (int i = 0; i < nargs; ++i) {
|
||||||
|
if (macro) {
|
||||||
|
macro->setArgumentIdx(i);
|
||||||
|
args_[i].SetData(macro->GetData());
|
||||||
|
MathedRowSt * row = macro->getRowSt();
|
||||||
|
args_[i].setRowSt(row);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (macro)
|
||||||
|
macro->setArgumentIdx(idx);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void MathMacroTemplate::WriteDef(ostream & os, bool fragile)
|
||||||
|
{
|
||||||
|
os << "\n\\newcommand{\\" << name << "}";
|
||||||
|
|
||||||
|
if (nargs > 0 )
|
||||||
|
os << "[" << nargs << "]";
|
||||||
|
|
||||||
|
os << "{";
|
||||||
|
|
||||||
|
for (int i = 0; i < nargs; ++i) {
|
||||||
|
args_[i].setExpand(false);
|
||||||
|
}
|
||||||
|
Write(os, fragile);
|
||||||
|
os << "}\n";
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void MathMacroTemplate::setArgument(MathedArray * a, int i)
|
||||||
|
{
|
||||||
|
args_[i].SetData(a);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void MathMacroTemplate::GetMacroXY(int i, int & x, int & y) const
|
||||||
|
{
|
||||||
|
args_[i].GetXY(x, y);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
MathParInset * MathMacroTemplate::getMacroPar(int i) const
|
||||||
|
{
|
||||||
|
if (i >= 0 && i < nargs)
|
||||||
|
return const_cast<MathParInset *>
|
||||||
|
(static_cast<MathParInset const *>(&args_[i]));
|
||||||
|
else
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void MathMacroTemplate::SetMacroFocus(int &idx, int x, int y)
|
||||||
|
{
|
||||||
|
for (int i = 0; i < nargs; ++i) {
|
||||||
|
if (args_[i].Inside(x, y)) {
|
||||||
|
idx = i;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
57
src/mathed/math_macrotemplate.h
Normal file
57
src/mathed/math_macrotemplate.h
Normal file
@ -0,0 +1,57 @@
|
|||||||
|
// -*- C++ -*-
|
||||||
|
#ifndef MATHMACROTEMPLATE
|
||||||
|
#define MATHMACROTEMPLATE
|
||||||
|
|
||||||
|
#include <vector>
|
||||||
|
|
||||||
|
#include "math_parinset.h"
|
||||||
|
#include "math_macroarg.h"
|
||||||
|
|
||||||
|
class MathMacro;
|
||||||
|
|
||||||
|
/// This class contains the macro definition
|
||||||
|
class MathMacroTemplate: public MathParInset {
|
||||||
|
public:
|
||||||
|
/// A template constructor needs all the data
|
||||||
|
explicit
|
||||||
|
MathMacroTemplate(string const &, int na = 0, int f = 0);
|
||||||
|
///
|
||||||
|
~MathMacroTemplate();
|
||||||
|
///
|
||||||
|
void draw(Painter &, int, int);
|
||||||
|
///
|
||||||
|
void Metrics();
|
||||||
|
///
|
||||||
|
void WriteDef(std::ostream &, bool fragile);
|
||||||
|
/// useful for special insets
|
||||||
|
void setTCode(MathedTextCodes t);
|
||||||
|
///
|
||||||
|
MathedTextCodes getTCode() const;
|
||||||
|
///
|
||||||
|
void setArgument(MathedArray *, int i= 0);
|
||||||
|
/// Number of arguments
|
||||||
|
int getNoArgs() const;
|
||||||
|
///
|
||||||
|
void GetMacroXY(int, int &, int &) const;
|
||||||
|
///
|
||||||
|
MathParInset * getMacroPar(int) const;
|
||||||
|
///
|
||||||
|
void SetMacroFocus(int &, int, int);
|
||||||
|
///
|
||||||
|
void setEditMode(bool);
|
||||||
|
|
||||||
|
/// Replace the appropriate arguments with a specific macro's data
|
||||||
|
void update(MathMacro * m = 0);
|
||||||
|
private:
|
||||||
|
///
|
||||||
|
short flags;
|
||||||
|
///
|
||||||
|
MathedTextCodes tcode;
|
||||||
|
///
|
||||||
|
std::vector<MathMacroArgument> args_;
|
||||||
|
///
|
||||||
|
int nargs;
|
||||||
|
///
|
||||||
|
friend class MathMacro;
|
||||||
|
};
|
||||||
|
#endif
|
@ -29,6 +29,8 @@
|
|||||||
#include "math_iter.h"
|
#include "math_iter.h"
|
||||||
#include "math_inset.h"
|
#include "math_inset.h"
|
||||||
#include "math_macro.h"
|
#include "math_macro.h"
|
||||||
|
#include "math_macrotable.h"
|
||||||
|
#include "math_macrotemplate.h"
|
||||||
#include "math_root.h"
|
#include "math_root.h"
|
||||||
#include "math_matrixinset.h"
|
#include "math_matrixinset.h"
|
||||||
#include "math_accentinset.h"
|
#include "math_accentinset.h"
|
||||||
|
Loading…
Reference in New Issue
Block a user