LCursor::LCursor(BufferView & bv)
- : DocIterator(), bv_(&bv), anchor_(), x_target_(-1),
+ : DocIterator(), bv_(&bv),
+ anchor_(), cached_y_(0), x_target_(-1),
selection_(false), mark_(false)
{}
clear();
push_back(CursorSlice(inset));
anchor_ = DocIterator(inset);
+ cached_y_ = 0;
clearTargetX();
selection_ = false;
mark_ = false;
BOOST_ASSERT(idx() <= lastidx());
BOOST_ASSERT(par() <= lastpar());
- // The common case is 'LFUN handled, need update', so make the
+ // The common case is 'LFUN handled, need update', so make the
// LFUN handler's life easier by assuming this as default value.
// The handler can reset the update and val flags if necessary.
disp_.update(true);
{
BOOST_ASSERT(!empty());
//lyxerr << "Leaving inset to the left" << endl;
- inset().notifyCursorLeaves(idx());
+ inset().notifyCursorLeaves(*this);
if (depth() == 1)
return false;
pop();
{
BOOST_ASSERT(!empty());
//lyxerr << "Leaving inset to the right" << endl;
- inset().notifyCursorLeaves(idx());
+ inset().notifyCursorLeaves(*this);
if (depth() == 1)
return false;
pop();
}
+void LCursor::updatePos()
+{
+ BOOST_ASSERT(!empty());
+ if (size() > 1)
+ cached_y_ = bv().top_y() + back().inset().yo();
+ //cached_y_ = back().inset().yo();
+}
+
+
void LCursor::getDim(int & asc, int & des) const
{
if (inMathed()) {
y = 0;
if (!empty())
inset().getCursorPos(back(), x, y);
+ // getCursorPos gives _screen_ coordinates. We need to add
+ // top_y to get document coordinates. This is hidden in cached_y_.
+ //y += cached_y_ - inset().yo();
+ // The rest is non-obvious. The reason we have to have these
+ // extra computation is that the getCursorPos() calls rely
+ // on the inset's own knowledge of its screen position.
+ // If we scroll up or down in a big enough increment,
+ // inset->draw() is not called: this doesn't update
+ // inset.yo_, so getCursor() returns an old value.
+ // Ugly as you like.
}
CursorSlice & LCursor::anchor()
{
+ if (anchor_.size() < size()) {
+ lyxerr << "anchor_.size() < cursor_.size() "
+ "should not happen when accessing the anchor" << endl;
+ BOOST_ASSERT(false);
+ }
BOOST_ASSERT(!anchor_.empty());
- return anchor_.back();
+ // this size is cursor_.size()
+ return anchor_[size() - 1];
}
CursorSlice const & LCursor::anchor() const
{
+ if (anchor_.size() < size()) {
+ lyxerr << "anchor_.size() < cursor_.size() "
+ "should not happen when accessing the anchor" << endl;
+ BOOST_ASSERT(false);
+ }
+ // this size is cursor_.size()
BOOST_ASSERT(!anchor_.empty());
- return anchor_.back();
+ return anchor_[size() - 1];
}
{
selection() = true;
// a selection with no contents is not a selection
+#warning doesnt look ok
if (par() == anchor().par() && pos() == anchor().pos())
selection() = false;
}
//lyxerr << "LCursor::eraseSelection" << endl;
CursorSlice const & i1 = selBegin();
CursorSlice const & i2 = selEnd();
+#ifdef WITH_WARNINGS
#warning FIXME
+#endif
if (i1.inset().asMathInset()) {
if (i1.idx() == i2.idx()) {
i1.cell().erase(i1.pos(), i2.pos());
}
-void LCursor::selClear()
-{
- resetAnchor();
- clearSelection();
-}
-
-
void LCursor::selCopy()
{
if (selection()) {
#include "mathed/math_factory.h"
#include "mathed/math_gridinset.h"
#include "mathed/math_macroarg.h"
-#include "mathed/math_macrotemplate.h"
#include "mathed/math_mathmlstream.h"
#include "mathed/math_scriptinset.h"
#include "mathed/math_support.h"
void LCursor::markInsert()
{
- cell().insert(pos(), MathAtom(new MathCharInset(0)));
+ insert(char(0));
}
void LCursor::insert(string const & str)
{
- lyxerr << "LCursor::insert str '" << str << "'" << endl;
+ //lyxerr << "LCursor::insert str '" << str << "'" << endl;
for (string::const_iterator it = str.begin(); it != str.end(); ++it)
insert(*it);
}
BOOST_ASSERT(!empty());
if (inMathed()) {
selClearOrDel();
- plainInsert(MathAtom(new MathCharInset(c)));
+ insert(new MathCharInset(c));
} else {
text()->insertChar(*this, c);
}
macroModeClose();
selClearOrDel();
plainInsert(t);
+ lyxerr << "LCursor::insert MathAtom: cur:\n" << *this << endl;
}
if (pos() != 0 && prevAtom()->nargs() > 0) {
// let's require two backspaces for 'big stuff' and
// highlight on the first
+ resetAnchor();
selection() = true;
--pos();
} else {
return true;
}
+ // 'clever' UI hack: only erase large items if previously slected
if (pos() != lastpos() && inset().nargs() > 0) {
+ resetAnchor();
selection() = true;
++pos();
} else {
}
-bool LCursor::inMacroArgMode() const
-{
- return pos() > 0 && prevAtom()->getChar() == '#';
-}
-
-
-MathGridInset * LCursor::enclosingGrid(idx_type & idx) const
-{
- for (MathInset::difference_type i = depth() - 1; i >= 0; --i) {
- MathInset * m = operator[](i).inset().asMathInset();
- if (!m)
- return 0;
- MathGridInset * p = m->asGridInset();
- if (p) {
- idx = operator[](i).idx();
- return p;
- }
- }
- return 0;
-}
-
-
void LCursor::pullArg()
{
+#ifdef WITH_WARNINGS
#warning Look here
+#endif
MathArray ar = cell();
if (popLeft() && inMathed()) {
plainErase();
void LCursor::touch()
{
+#ifdef WITH_WARNINGS
#warning look here
+#endif
#if 0
DocIterator::const_iterator it = begin();
DocIterator::const_iterator et = end();
}
-char LCursor::valign()
-{
- idx_type idx;
- MathGridInset * p = enclosingGrid(idx);
- return p ? p->valign() : '\0';
-}
-
-
-char LCursor::halign()
-{
- idx_type idx;
- MathGridInset * p = enclosingGrid(idx);
- return p ? p->halign(idx % p->ncols()) : '\0';
-}
-
-
bool LCursor::goUpDown(bool up)
{
// Be warned: The 'logic' implemented in this function is highly
{
BOOST_ASSERT(!empty());
par_type beg, end;
- CursorSlice bottom = operator[](0);
+ CursorSlice bottom = operator[](0);
LyXText * text = bottom.text();
BOOST_ASSERT(text);
getParsInRange(text->paragraphs(), ylow, yhigh, beg, end);
return result;
}
+#ifdef WITH_WARNINGS
#warning and mathed?
+#endif
return string();
}
CursorSlice const & sl = operator[](s);
LyXText & text = *sl.text();
LyXFont font = text.getPar(sl.par()).getFont(
- bv().buffer()->params(), sl.pos(), outerFont(sl.par(), text.paragraphs()));
+ bv().buffer()->params(), sl.pos(), outerFont(sl.par(), text.paragraphs()));
return font.language()->encoding();
}