#include <config.h>
#include "Bidi.h"
-#include "BufferView.h"
#include "Buffer.h"
-#include "Cursor.h"
+#include "BufferView.h"
#include "CoordCache.h"
+#include "Cursor.h"
#include "CutAndPaste.h"
-#include "debug.h"
#include "DispatchResult.h"
#include "Encoding.h"
+#include "Font.h"
#include "FuncRequest.h"
#include "Language.h"
#include "lfuns.h"
-#include "Font.h"
#include "LyXFunc.h" // only for setMessage()
#include "LyXRC.h"
-#include "Row.h"
-#include "Text.h"
-#include "Paragraph.h"
#include "paragraph_funcs.h"
+#include "Paragraph.h"
#include "ParIterator.h"
+#include "Row.h"
+#include "Text.h"
#include "TextMetrics.h"
+#include "TocBackend.h"
+#include "support/debug.h"
#include "support/docstream.h"
#include "insets/InsetTabular.h"
#include <boost/assert.hpp>
#include <boost/bind.hpp>
-#include <boost/current_function.hpp>
#include <sstream>
#include <limits>
#include <map>
-using std::string;
-using std::vector;
-using std::endl;
-using std::min;
-using std::for_each;
-
+using namespace std;
namespace lyx {
// Used only in mathed
DocIterator bruteFind2(Cursor const & c, int x, int y)
{
- double best_dist = std::numeric_limits<double>::max();
+ double best_dist = numeric_limits<double>::max();
DocIterator result;
int xo;
int yo;
Inset const * inset = &it.inset();
- std::map<Inset const *, Geometry> const & data =
+ map<Inset const *, Geometry> const & data =
c.bv().coordCache().getInsets().getData();
- std::map<Inset const *, Geometry>::const_iterator I = data.find(inset);
+ map<Inset const *, Geometry>::const_iterator I = data.find(inset);
// FIXME: in the case where the inset is not in the cache, this
// means that no part of it is visible on screen. In this case
else
++et.pit();
- double best_dist = std::numeric_limits<double>::max();;
+ double best_dist = numeric_limits<double>::max();;
DocIterator best_cursor = et;
for ( ; it != et; it.forwardPos(true)) {
it.pit() = from;
DocIterator et = doc_iterator_end(inset);
- double best_dist = std::numeric_limits<double>::max();
+ double best_dist = numeric_limits<double>::max();
DocIterator best_cursor = et;
for ( ; it != et; it.forwardPos()) {
void Cursor::dispatch(FuncRequest const & cmd0)
{
- LYXERR(Debug::DEBUG, BOOST_CURRENT_FUNCTION
- << " cmd: " << cmd0 << '\n' << *this);
+ LYXERR(Debug::DEBUG, "cmd: " << cmd0 << '\n' << *this);
if (empty())
return;
Cursor safe = *this;
// store some values to be used inside of the handlers
- getPos(beforeDispX_, beforeDispY_);
beforeDispatchCursor_ = *this;
for (; depth(); pop()) {
LYXERR(Debug::DEBUG, "Cursor::dispatch: cmd: "
Row const & Cursor::textRow() const
{
- ParagraphMetrics const & pm = bv().parMetrics(text(), pit());
+ CursorSlice const & cs = innerTextSlice();
+ ParagraphMetrics const & pm = bv().parMetrics(cs.text(), cs.pit());
BOOST_ASSERT(!pm.rows().empty());
return pm.getRow(pos(), boundary());
}
bool Cursor::selHandle(bool sel)
{
//lyxerr << "Cursor::selHandle" << endl;
+ if (mark())
+ sel = true;
if (sel == selection())
return false;
}
-std::ostream & operator<<(std::ostream & os, Cursor const & cur)
+ostream & operator<<(ostream & os, Cursor const & cur)
{
os << "\n cursor: | anchor:\n";
for (size_t i = 0, n = cur.depth(); i != n; ++i) {
//#define FILEDEBUG 1
-bool Cursor::isInside(Inset const * p)
+bool Cursor::isInside(Inset const * p) const
{
for (size_t i = 0; i != depth(); ++i)
if (&operator[](i).inset() == p)
int xo = 0;
int yo = 0;
getPos(xo, yo);
- xo = beforeDispX_;
-
+ xo = theLyXFunc().cursorBeforeDispatchX();
+
// check if we had something else in mind, if not, this is the future
// target
if (x_target_ == -1)
int x;
int y;
getPos(x, y);
- if ((!up && y <= beforeDispY_) ||
- (up && y >= beforeDispY_))
+ int oy = theLyXFunc().cursorBeforeDispatchY();
+ if ((!up && y <= oy) ||
+ (up && y >= oy))
operator=(old);
else
return true;
int x;
int y;
getPos(x, y);
- if ((!up && y <= beforeDispY_) ||
- (up && y >= beforeDispY_))
+ int oy = theLyXFunc().cursorBeforeDispatchY();
+ if ((!up && y <= oy) ||
+ (up && y >= oy))
operator=(old);
else
return true;
//lyxerr << "updown: popBackward succeeded" << endl;
int xnew;
int ynew;
+ int yold = theLyXFunc().cursorBeforeDispatchY();
getPos(xnew, ynew);
- if (up ? ynew < beforeDispY_ : ynew > beforeDispY_)
+ if (up ? ynew < yold : ynew > yold)
return true;
}
int xo = 0;
int yo = 0;
getPos(xo, yo);
- xo = beforeDispX_;
-
+ xo = theLyXFunc().cursorBeforeDispatchX();
+
// update the targetX - this is here before the "return false"
// to set a new target which can be used by InsetTexts above
// if we cannot move up/down inside this inset anymore
Cursor old = *this;
if (up) {
if (row > 0) {
- top().pos() = std::min(tm.x2pos(pit(), row - 1, xo), top().lastpos());
+ top().pos() = min(tm.x2pos(pit(), row - 1, xo), top().lastpos());
} else if (pit() > 0) {
--pit();
ParagraphMetrics const & pmcur = bv_->parMetrics(text(), pit());
- top().pos() = std::min(tm.x2pos(pit(), pmcur.rows().size() - 1, xo), top().lastpos());
+ top().pos() = min(tm.x2pos(pit(), pmcur.rows().size() - 1, xo), top().lastpos());
}
} else {
if (row + 1 < int(pm.rows().size())) {
- top().pos() = std::min(tm.x2pos(pit(), row + 1, xo), top().lastpos());
+ top().pos() = min(tm.x2pos(pit(), row + 1, xo), top().lastpos());
} else if (pit() + 1 < int(text()->paragraphs().size())) {
++pit();
- top().pos() = std::min(tm.x2pos(pit(), 0, xo), top().lastpos());
+ top().pos() = min(tm.x2pos(pit(), 0, xo), top().lastpos());
}
}
void Cursor::handleFont(string const & font)
{
- LYXERR(Debug::DEBUG, BOOST_CURRENT_FUNCTION << ": " << font);
+ LYXERR(Debug::DEBUG, font);
docstring safe;
if (selection()) {
macroModeClose();
{
if (empty())
return 0;
- int s = 0;
- // go up until first non-0 text is hit
- // (innermost text is 0 in mathed)
- for (s = depth() - 1; s >= 0; --s)
- if (operator[](s).text())
- break;
- CursorSlice const & sl = operator[](s);
+ CursorSlice const & sl = innerTextSlice();
Text const & text = *sl.text();
Font font = text.getPar(sl.pit()).getFont(
bv().buffer().params(), sl.pos(), outerFont(sl.pit(), text.paragraphs()));
// if a character is entered.
// HACK. far from being perfect...
- // go up until first non-0 text is hit
- // (innermost text is 0 in mathed)
- int s = 0;
- for (s = depth() - 1; s >= 0; --s)
- if (operator[](s).text())
- break;
- CursorSlice const & sl = operator[](s);
+
+ CursorSlice const & sl = innerTextSlice();
Text const & text = *sl.text();
Paragraph const & par = text.getPar(sl.pit());
}
+void Cursor::checkBufferStructure()
+{
+ if (paragraph().layout()->toclevel == Layout::NOT_IN_TOC)
+ return;
+ Buffer const * master = buffer().masterBuffer();
+ master->tocBackend().updateItem(ParConstIterator(*this));
+ master->structureChanged();
+}
+
+
} // namespace lyx