#include "math_support.h"
#include "math_replace.h"
+#include "coordcache.h"
#include "LColor.h"
#include "BufferView.h"
#include "buffer.h"
MathArray::MathArray()
- : xo_(0), yo_(0)
{}
MathArray::MathArray(const_iterator from, const_iterator to)
- : base_type(from, to), xo_(0), yo_(0)
+ : base_type(from, to)
{}
bool isInside(DocIterator const & it, MathArray const & ar,
lyx::pos_type p1, lyx::pos_type p2)
{
- for (size_t i = 0; i != it.size(); ++i) {
+ for (size_t i = 0; i != it.depth(); ++i) {
CursorSlice const & sl = it[i];
if (sl.inset().inMathed() && &sl.cell() == &ar)
return p1 <= sl.pos() && sl.pos() < p2;
void MathArray::draw(PainterInfo & pi, int x, int y) const
{
//lyxerr << "MathArray::draw: x: " << x << " y: " << y << endl;
- xo_ = x;
- yo_ = y;
+ setXY(x, y);
if (empty()) {
pi.pain.rectangle(x, y - ascent(), width(), height(), LColor::mathline);
}
}
#endif
+ theCoords.insets().add(at.nucleus(), x, y);
at->drawSelection(pi, x, y);
at->draw(pi, x, y);
x += at->width();
void MathArray::drawT(TextPainter & pain, int x, int y) const
{
//lyxerr << "x: " << x << " y: " << y << ' ' << pain.workAreaHeight() << endl;
- xo_ = x;
- yo_ = y;
+ setXY(x, y);
for (const_iterator it = begin(), et = end(); it != et; ++it) {
(*it)->drawT(pain, x, y);
currx += glue;
currx += (*it)->width();
}
+
if (abs(lastx - targetx) < abs(currx - targetx) && it != begin())
--it;
+ // The below code guarantees that in this slice, the cursor will
+ // never be on the right edge of an inset after a mouse click.
+#ifdef WITH_WARNINGS
+#warning A better solution has to be found here!
+ // FIXME: this is too brute! The position left to an inset should
+ // be reachable with the mouse in general.
+#endif
+ if (it != begin()) {
+ --it;
+ if (it < end() && (*it)->getChar())
+ ++it;
+ }
+
return it - begin();
}
int xx = 0;
int yy = 0;
+ const int xo_ = xo();
+ const int yo_ = yo();
+
if (x < xo_)
xx = xo_ - x;
else if (x > xo_ + width())
void MathArray::setXY(int x, int y) const
{
- xo_ = x;
- yo_ = y;
+ //lyxerr << "setting position cache for MathArray " << this << std::endl;
+ theCoords.arrays().add(this, x, y);
+}
+
+
+int MathArray::xo() const
+{
+ return theCoords.getArrays().x(this);
+}
+
+
+int MathArray::yo() const
+{
+ return theCoords.getArrays().y(this);
}