#include "LyXView.h"
#include "Painter.h"
#include "font.h"
-#include "math_cursor.h"
#include "math_arrayinset.h"
-#include "math_spaceinset.h"
-#include "math_macrotable.h"
+#include "math_cursor.h"
#include "math_factory.h"
+#include "math_hullinset.h"
+#include "math_macrotable.h"
#include "math_parser.h"
+#include "math_spaceinset.h"
#include "undo_funcs.h"
using std::endl;
break;
case LFUN_MATH_MODE:
- handleFont(bv, LM_TC_TEXTRM);
+ //handleFont(bv, LM_TC_TEXTRM);
+ mathcursor->niceInsert(MathAtom(new MathHullInset(LM_OT_SIMPLE)));
+ updateLocal(bv, true);
//bv->owner()->message(_("math text mode toggled"));
break;
#include "math_boxinset.h"
#include "support/LOstream.h"
-#include "LColor.h"
#include "debug.h"
#include "Painter.h"
#include "math_cursor.h"
-#include "insets/insettext.h"
#include "math_mathmlstream.h"
#include "math_streamstr.h"
MathBoxInset::MathBoxInset(string const & name)
- : MathDimInset(), name_(name), text_(new InsetText), buffer_(0)
+ : MathGridInset(1, 1), name_(name)
{}
-MathBoxInset::MathBoxInset(MathBoxInset const & m)
- : MathDimInset(*this), name_(m.name_), text_(0), buffer_(m.buffer_)
-{
- if (!m.buffer_)
- lyxerr << "no buffer\n";
- else
- text_ = static_cast<InsetText *>(m.text_->clone(*m.buffer_, false));
-}
-
-
-MathBoxInset::~MathBoxInset()
-{
- delete text_;
-}
-
-
MathInset * MathBoxInset::clone() const
{
return new MathBoxInset(*this);
}
-UpdatableInset * MathBoxInset::asHyperActiveInset() const
-{
- return text_;
-}
-
-
void MathBoxInset::write(WriteStream & os) const
{
os << "\\" << name_ << "{" << cell(0) << "}";
void MathBoxInset::normalize(NormalStream & os) const
{
- os << "[mbox ";
+ os << '[' << name_ << ' ';
//text_->write(buffer(), os);
os << "] ";
}
-void MathBoxInset::metrics(MathMetricsInfo const & st) const
+void MathBoxInset::rebreak()
{
- mi_ = st;
- if (text_ && mi_.view) {
- ascent_ = text_->ascent(mi_.view, mi_.font) + 2;
- descent_ = text_->descent(mi_.view, mi_.font) + 2;
- width_ = text_->width(mi_.view, mi_.font) + 4;
- } else {
- ascent_ = 10;
- descent_ = 0;
- width_ = 10;
- }
+ //lyxerr << "trying to rebreak...\n";
}
void MathBoxInset::draw(Painter & pain, int x, int y) const
{
- float fx = x + 2;
- if (text_ && mi_.view)
- text_->draw(mi_.view, mi_.font, y, fx, false);
- if (mathcursor && mathcursor->isInside(this))
- pain.rectangle(x, y - ascent(), xcell(0).width(), height(),
+ MathGridInset::draw(pain, x, y);
+ if (mathcursor && mathcursor->isInside(this)) {
+ pain.rectangle(x - 1, y - ascent() - 1, width(), height(),
LColor::mathframe);
-}
-
-
-void MathBoxInset::edit(BufferView * bv, int x, int y, unsigned int button)
-{
- if (text_)
- text_->edit(bv, x, y, button);
+ }
}
#ifndef MATH_BOXINSET_H
#define MATH_BOXINSET_H
-#include "math_diminset.h"
+#include "math_gridinset.h"
#include "LString.h"
#ifdef __GNUG__
#pragma interface
#endif
-class InsetText;
-class UpdatableInset;
-class BufferView;
-class Buffer;
class LyXFont;
/// Support for \\mbox
-class MathBoxInset : public MathDimInset {
+class MathBoxInset : public MathGridInset {
public:
///
explicit MathBoxInset(string const &);
///
- MathBoxInset(MathBoxInset const &);
- ///
- ~MathBoxInset();
- ///
MathInset * clone() const;
+ /// identifies BoxInsets
+ MathBoxInset * asBoxInset() { return this; }
+ /// identifies BoxInsets
+ MathBoxInset const * asBoxInset() const { return this; }
///
- void draw(Painter &, int x, int y) const;
+ void rebreak();
///
void write(WriteStream & os) const;
///
void normalize(NormalStream &) const;
///
- void metrics(MathMetricsInfo const &) const;
- /// identifies BoxInsets
- MathBoxInset * asBoxInset() { return this; }
- ///
- bool isHyperActive() const { return 1; }
- ///
- void edit(BufferView * bv, int x, int y, unsigned int button);
- /// identifies hyperactive insets
- UpdatableInset * asHyperActiveInset() const;
+ void draw(Painter &, int x, int y) const;
private:
- /// unimplemented
- void operator=(MathBoxInset const &);
-
///
mutable MathMetricsInfo mi_;
///
string name_;
- ///
- InsetText * text_;
- ///
- mutable Buffer * buffer_;
};
#endif
#pragma implementation
#endif
+#include "support/lstrings.h"
+#include "support/LAssert.h"
+#include "debug.h"
+#include "LColor.h"
+#include "Painter.h"
#include "math_cursor.h"
#include "formulabase.h"
#include "math_arrayinset.h"
#include "math_braceinset.h"
+#include "math_boxinset.h"
#include "math_casesinset.h"
#include "math_charinset.h"
#include "math_deliminset.h"
#include "math_specialcharinset.h"
#include "math_support.h"
-#include "debug.h"
-#include "LColor.h"
-#include "Painter.h"
-
-#include "support/lstrings.h"
-#include "support/LAssert.h"
-
#include <algorithm>
#include <cctype>
}
-void MathCursor::normalize() const
+void MathCursor::normalize()
{
-#ifdef WITH_WARNINGS
-#warning This is evil!
-#endif
- MathCursor * it = const_cast<MathCursor *>(this);
+ // rebreak
+ {
+ MathIterator it = ibegin(formula()->par().nucleus());
+ MathIterator et = iend(formula()->par().nucleus());
+ for ( ; it != et; ++it)
+ if (it.par()->asBoxInset())
+ it.par()->asBoxInset()->rebreak();
+ }
if (idx() >= par()->nargs()) {
lyxerr << "this should not really happen - 1: "
<< idx() << " " << par()->nargs() << "\n";
dump("error 2");
}
- it->idx() = min(idx(), par()->nargs() - 1);
+ idx() = min(idx(), par()->nargs() - 1);
if (pos() > size()) {
lyxerr << "this should not really happen - 2: "
- << pos() << " " << size() << " in idx: " << it->idx()
+ << pos() << " " << size() << " in idx: " << idx()
<< " in atom: '";
WriteStream wi(lyxerr, false);
- it->par()->write(wi);
+ par()->write(wi);
lyxerr << "\n";
dump("error 4");
}
- it->pos() = min(pos(), size());
+ pos() = min(pos(), size());
}
// fall through in the other cases
}
- if (lastcode_ == LM_TC_TEXTRM) {
+ if (lastcode_ == LM_TC_TEXTRM || par()->asBoxInset()) {
// suppress direct insertion of two spaces in a row
// the still allows typing '<space>a<space>' and deleting the 'a', but
// it is better than nothing...
prevAtom()->asSpaceInset()->incSpace();
return true;
}
- if (mathcursor->popRight())
+ if (popRight())
return true;
// if are at the very end, leave the formula
return pos() != size();
row_type gridRow() const;
/// make sure cursor position is valid
- void normalize() const;
+ void normalize();
///
UpdatableInset * asHyperActiveInset() const;
#endif
-/** The restrictions of a standard LaTeX math paragraph
- allows to get a small number of text codes (<30) */
+///
enum MathTextCodes {
- /// This must be >= 0
+ ///
LM_TC_MIN = 0,
- /// Math Inset
- LM_TC_INSET,
-
- ///
- LM_FONT_BEGIN,
- /// Internal code for variables
+ /// internal code for variables
LM_TC_VAR,
+ /// internal code for stuff in wrapped in mbox etc
+ LM_TC_BOX,
///
LM_TC_CONST,
///
LM_TC_IT,
///
LM_TC_TEXTRM,
- /// Math mode TeX characters ",;:{}"
+ /// math mode TeX characters ",;:{}"
LM_TC_TEX,
- /// Internal code when typing greek
+ /// internal code when typing greek
LM_TC_GREEK,
- /// Internal code when typing a single greek character
+ /// internal code when typing a single greek character
LM_TC_GREEK1,
- /// Internal code for symbols
+ /// internal code for symbols
LM_TC_SYMB,
/// internal code for symbols that get bigger in displayed math
LM_TC_BOLDSYMB,
LM_TC_MSB,
///
LM_FONT_END,
-
- /// This must be < 32
- LM_TC_MAX
};
{"limsup", LM_TK_FUNCLIM, 0},
{"ln", LM_TK_FUNC, 0},
{"log", LM_TK_FUNC, 0},
+ {"lyxbox", LM_TK_BOX, 0},
{"mathbb", LM_TK_FONT, LM_TC_BB},
{"mathbf", LM_TK_FONT, LM_TC_BF},
{"mathcal", LM_TK_FONT, LM_TC_CAL},
/// identifies certain types of insets
virtual MathArrayInset * asArrayInset() { return 0; }
virtual MathBoxInset * asBoxInset() { return 0; }
+ virtual MathBoxInset const * asBoxInset() const { return 0; }
virtual MathCharInset const * asCharInset() const { return 0; }
virtual MathDelimInset * asDelimInset() { return 0; }
virtual MathDelimInset const * asDelimInset() const { return 0; }
FLAG_RIGHT = 1 << 2, // next \\right ends the parsing process
FLAG_END = 1 << 3, // next \\end ends the parsing process
FLAG_BRACK_END = 1 << 4, // next closing bracket ends the parsing process
+ FLAG_BOX = 1 << 5, // we are in a box
FLAG_ITEM = 1 << 7, // read a (possibly braced token)
FLAG_BLOCK = 1 << 8, // next block ends the parsing process
FLAG_LEAVE = 1 << 9 // leave the loop at the end
fill(theCatcode, theCatcode + 256, catOther);
fill(theCatcode + 'a', theCatcode + 'z' + 1, catLetter);
fill(theCatcode + 'A', theCatcode + 'Z' + 1, catLetter);
-
-// for (int i = 0; i <= 255; ++i)
-// theCatcode[i] = catOther;
-// for (int i = 'a'; i <= 'z'; ++i)
-// theCatcode[i] = catLetter;
-// for (int i = 'A'; i <= 'Z'; ++i)
-// theCatcode[i] = catLetter;
theCatcode['\\'] = catEscape;
theCatcode['{'] = catBegin;
//
// cat codes
//
- if (t.cat() == catMath)
- break;
+ if (t.cat() == catMath) {
+ if (flags & FLAG_BOX) {
+ // we are inside an mbox, so opening new math is allowed
+ array.push_back(MathAtom(new MathHullInset(LM_OT_SIMPLE)));
+ parse_into(array.back()->cell(0), 0);
+ } else {
+ // otherwise this is the end of the formula
+ break;
+ }
+ }
else if (t.cat() == catLetter)
add(array, t.character(), code);
code = static_cast<MathTextCodes>(l->id);
}
+ else if (l->token == LM_TK_BOX) {
+ MathAtom p = createMathInset(t.cs());
+ parse_into(p->cell(0), FLAG_ITEM | FLAG_BOX, LM_TC_BOX);
+ array.push_back(p);
+ }
+
else {
MathAtom p = createMathInset(t.cs());
for (MathInset::idx_type i = 0; i < p->nargs(); ++i)
case LM_TC_TT:
return MathFonts[FONT_TT];
+ case LM_TC_BOX:
case LM_TC_TEXTRM:
case LM_TC_CONST:
case LM_TC_TEX:
break;
}
- if (type != LM_TC_TEXTRM)
+ if (type != LM_TC_TEXTRM && type != LM_TC_BOX)
f.setColor(LColor::math);
if (type == LM_TC_TEX)