#include "math_hullinset.h"
#include "math_iterator.h"
#include "math_macroarg.h"
+#include "math_macrotemplate.h"
#include "math_mathmlstream.h"
#include "math_parser.h"
#include "math_replace.h"
using std::max;
using std::swap;
using std::isalnum;
+using std::vector;
+using std::ostringstream;
namespace {
c1 = p->col(i1.idx_);
c2 = p->col(i2.idx_);
if (c1 > c2)
- std::swap(c1, c2);
+ swap(c1, c2);
r1 = p->row(i1.idx_);
r2 = p->row(i2.idx_);
if (r1 > r2)
- std::swap(r1, r2);
+ swap(r1, r2);
}
void grab(MathCursor const & cursor)
bool MathCursor::popLeft()
{
- //cerr << "Leaving atom "; par()->write(cerr, false); cerr << " left\n";
+ //cerr << "Leaving atom to the left\n";
if (Cursor_.size() <= 1)
return false;
- if (par()->asScriptInset()) {
- par()->asScriptInset()->removeEmptyScripts();
- if (par()->asScriptInset()->empty())
- plainErase();
- }
Cursor_.pop_back();
return true;
}
//cerr << "Leaving atom "; par()->write(cerr, false); cerr << " right\n";
if (Cursor_.size() <= 1)
return false;
- if (par()->asScriptInset()) {
- par()->asScriptInset()->removeEmptyScripts();
- if (par()->asScriptInset()->empty())
- plainErase();
- }
Cursor_.pop_back();
posRight();
return true;
{
string s;
MathInset::difference_type i = macroNamePos();
- for ( ; i >= 0 && i < int(pos()); ++i)
+ for (; i >= 0 && i < int(pos()); ++i)
s += array().at(i)->getChar();
return s;
}
int y2 = c.yo() + c.descent();
pain.fillRectangle(x1, y1, x2 - x1, y2 - y1, LColor::selection);
} else {
- std::vector<MathInset::idx_type> indices
+ vector<MathInset::idx_type> indices
= i1.par_->idxBetween(i1.idx_, i2.idx_);
for (unsigned i = 0; i < indices.size(); ++i) {
MathXArray & c = i1.xcell(indices[i]);
}
+void MathCursor::touch()
+{
+ cursor_type::const_iterator it = Cursor_.begin();
+ cursor_type::const_iterator et = Cursor_.end();
+ for ( ; it != et; ++it)
+ it->xcell().touch();
+}
+
+
void MathCursor::normalize()
{
+#if 0
// rebreak
{
MathIterator it = ibegin(formula()->par().nucleus());
MathIterator et = iend(formula()->par().nucleus());
- for ( ; it != et; ++it)
+ for (; it != et; ++it)
if (it.par()->asBoxInset())
it.par()->asBoxInset()->rebreak();
}
+#endif
if (idx() >= par()->nargs()) {
lyxerr << "this should not really happen - 1: "
dump("error 4");
}
pos() = min(pos(), size());
+
+ // remove empty scripts if possible
+ for (pos_type i = 0; i < size(); ++i) {
+ MathScriptInset * p = array().at(i)->asScriptInset();
+ if (p) {
+ p->removeEmptyScripts();
+ if (p->empty())
+ array().erase(i);
+ }
+ }
+
+ // fix again position
+ pos() = min(pos(), size());
}
while (1) {
// avoid invalid nesting when selecting
if (!selection_ || positionable(it.cursor(), Anchor_)) {
- int xo = it.position().xpos();
- int yo = it.position().ypos();
+ MathCursorPos const & top = it.position();
+ int xo = top.xpos();
+ int yo = top.ypos();
if (xlow - 2 <= xo && xo <= xhigh + 2 &&
ylow - 2 <= yo && yo <= yhigh + 2)
{
unsigned int n = 1;
istringstream is(s.substr(5).c_str());
is >> n;
- n = std::max(1u, n);
+ n = max(1u, n);
niceInsert(MathAtom(new MathCasesInset(n)));
return true;
}
string h_align;
istringstream is(s.substr(6).c_str());
is >> m >> n >> v_align >> h_align;
- m = std::max(1u, m);
- n = std::max(1u, n);
+ m = max(1u, m);
+ n = max(1u, n);
v_align += 'c';
niceInsert(MathAtom(new MathArrayInset("array", m, n, v_align[0], h_align)));
return true;
if (inMacroArgMode()) {
--pos();
plainErase();
- if ('1' <= c && c <= '9')
+ int n = c - '0';
+ MathMacroTemplate * p = formula()->par()->asMacroTemplate();
+ if (p && 1 <= n && n <= p->numargs())
insert(MathAtom(new MathMacroArgument(c - '0')));
else {
insert(MathAtom(new MathSpecialCharInset('#')));
if (c == '\\')
insert(c, LM_TC_TEX);
+ else if (c != ' ')
+ insert(c, lastcode_);
return true;
}
string MathCursor::info() const
{
- std::ostringstream os;
+ ostringstream os;
if (pos() > 0)
prevAtom()->infoize(os);
return os.str();