#include <config.h>
-#ifdef __GNUG__
-#pragma implementation
-#endif
-
#include "math_data.h"
#include "math_inset.h"
+#include "math_cursor.h"
#include "math_deliminset.h"
-#include "math_charinset.h"
+#include "math_fontinset.h"
#include "math_scriptinset.h"
-#include "math_stringinset.h"
-#include "math_matrixinset.h"
#include "math_mathmlstream.h"
#include "math_support.h"
#include "math_replace.h"
#include "debug.h"
#include "support/LAssert.h"
-#include "math_metricsinfo.h"
+#include "metricsinfo.h"
+#include "math_data.h"
#include "frontends/Painter.h"
#include "textpainter.h"
+using namespace lyx::support;
using std::max;
using std::min;
using std::abs;
-
+using std::endl;
MathArray::MathArray()
}
-MathAtom & MathArray::operator[](size_type pos)
+MathAtom & MathArray::operator[](pos_type pos)
{
- lyx::Assert(pos < size());
+ Assert(pos < size());
return base_type::operator[](pos);
}
-MathAtom const & MathArray::operator[](size_type pos) const
+MathAtom const & MathArray::operator[](pos_type pos) const
{
- lyx::Assert(pos < size());
+ Assert(pos < size());
return base_type::operator[](pos);
}
void MathArray::insert(size_type pos, MathArray const & ar)
{
+ Assert(pos <= size());
base_type::insert(begin() + pos, ar.begin(), ar.end());
}
{
NormalStream ns(lyxerr);
for (const_iterator it = begin(); it != end(); ++it)
- ns << "<" << *it << ">";
+ ns << '<' << *it << '>';
}
for (size_type i = 0; i < size(); ++i) {
if (find1(rep.from, i)) {
// match found
- lyxerr << "match found!\n";
+ lyxerr << "match found!" << endl;
erase(i, i + rep.from.size());
insert(i, rep.to);
}
bool MathArray::find1(MathArray const & ar, size_type pos) const
{
- //lyxerr << "finding '" << ar << "' in '" << *this << "'\n";
+ //lyxerr << "finding '" << ar << "' in '" << *this << "'" << endl;
for (size_type i = 0, n = ar.size(); i < n; ++i)
if (!operator[](pos + i)->match(ar[i]))
return false;
}
-Dimension const & MathArray::metrics(MathMetricsInfo & mi) const
+void MathArray::metrics(MetricsInfo & mi, Dimension & dim) const
+{
+ metrics(mi);
+ dim = dim_;
+}
+
+
+void MathArray::metrics(MetricsInfo & mi) const
{
//if (clean_)
// return;
drawn_ = false;
mathed_char_dim(mi.base.font, 'I', dim_);
- if (empty())
- return dim_;
- dim_.w = 0;
- for (const_iterator it = begin(), et = end(); it != et; ++it) {
- (*it)->metrics(mi);
- dim_ += (*it)->dimensions();
+ if (!empty()) {
+ dim_.wid = 0;
+ Dimension d;
+ for (const_iterator it = begin(), et = end(); it != et; ++it) {
+ (*it)->metrics(mi, d);
+ dim_ += d;
+ it->width_ = d.wid;
+ }
}
- return dim_;
}
-void MathArray::draw(MathPainterInfo & pi, int x, int y) const
+void MathArray::draw(PainterInfo & pi, int x, int y) const
{
//if (drawn_ && x == xo_ && y == yo_)
// return;
}
for (const_iterator it = begin(), et = end(); it != et; ++it) {
+ pi.width = it->width_;
(*it)->draw(pi, x, y);
- x += (*it)->width();
+ x += it->width_;
}
}
-Dimension const & MathArray::metricsT(TextMetricsInfo const & mi) const
+void MathArray::metricsT(TextMetricsInfo const & mi, Dimension & dim) const
{
//if (clean_)
// return;
- dim_.clear();
+ dim.clear();
+ Dimension d;
for (const_iterator it = begin(); it != end(); ++it) {
- (*it)->metricsT(mi);
- dim_ += (*it)->dimensions();
+ (*it)->metricsT(mi, d);
+ dim += d;
}
- return dim_;
}
{
//if (drawn_ && x == xo_ && y == yo_)
// return;
- //lyxerr << "x: " << x << " y: " << y << " " << pain.workAreaHeight() << endl;
+ //lyxerr << "x: " << x << " y: " << y << ' ' << pain.workAreaHeight() << endl;
xo_ = x;
yo_ = y;
drawn_ = true;
for (const_iterator it = begin(), et = end(); it != et; ++it) {
(*it)->drawT(pain, x, y);
- x += (*it)->width();
+ x += it->width_;
}
}
int MathArray::pos2x(size_type pos) const
{
- return pos2x(0, pos, 0);
+ return pos2x(pos, 0);
}
-int MathArray::pos2x(size_type pos1, size_type pos2, int glue) const
+int MathArray::pos2x(size_type pos, int glue) const
{
int x = 0;
- size_type target = min(pos2, size());
- for (size_type i = pos1; i < target; ++i) {
+ size_type target = min(pos, size());
+ for (size_type i = 0; i < target; ++i) {
const_iterator it = begin() + i;
if ((*it)->getChar() == ' ')
x += glue;
- x += (*it)->width();
+ x += it->width_;
}
return x;
}
MathArray::size_type MathArray::x2pos(int targetx) const
{
- return x2pos(0, targetx, 0);
+ return x2pos(targetx, 0);
}
-MathArray::size_type MathArray::x2pos(size_type startpos, int targetx,
- int glue) const
+MathArray::size_type MathArray::x2pos(int targetx, int glue) const
{
- const_iterator it = begin() + startpos;
+ const_iterator it = begin();
int lastx = 0;
int currx = 0;
for (; currx < targetx && it < end(); ++it) {
lastx = currx;
if ((*it)->getChar() == ' ')
currx += glue;
- currx += (*it)->width();
+ currx += it->width_;
}
- if (abs(lastx - targetx) < abs(currx - targetx) && it != begin() + startpos)
+ if (abs(lastx - targetx) < abs(currx - targetx) && it != begin())
--it;
return it - begin();
}
y2 = yo_ + descent();
}
+
void MathArray::center(int & x, int & y) const
{
x = xo_ + width() / 2;
xo_ = x;
yo_ = y;
}
+
+
+void MathArray::notifyCursorLeaves()
+{
+ // do not recurse!
+
+ // remove base-only "scripts"
+ for (pos_type i = 0; i + 1 < size(); ++i) {
+ MathScriptInset * p = operator[](i).nucleus()->asScriptInset();
+ if (p && p->cell(0).empty() && p->cell(1).empty()) {
+ MathArray ar = p->nuc();
+ erase(i);
+ insert(i, ar);
+ mathcursor->adjust(i, ar.size() - 1);
+ }
+ }
+
+ // glue adjacent font insets of the same kind
+ for (pos_type i = 0; i + 1 < size(); ++i) {
+ MathFontInset * p = operator[](i).nucleus()->asFontInset();
+ MathFontInset const * q = operator[](i + 1)->asFontInset();
+ if (p && q && p->name() == q->name()) {
+ p->cell(0).append(q->cell(0));
+ erase(i + 1);
+ mathcursor->adjust(i, -1);
+ }
+ }
+
+}