]> git.lyx.org Git - lyx.git/blobdiff - src/Cursor.cpp
Support for multiple bibliographies setting "per child"
[lyx.git] / src / Cursor.cpp
index e2d1f893ae120d986073905fe3ef217c38b02192..378a138da6b20c0c3daa7e3883d1aaa7a7d35834 100644 (file)
@@ -785,12 +785,11 @@ void Cursor::getSurroundingPos(pos_type & left_pos, pos_type & right_pos) const
        right_pos = -1;
 
        Row const & row = textRow();
-       TextMetrics const & tm = bv_->textMetrics(text());
        double dummy = 0;
-       Row::const_iterator cit = tm.findRowElement(row, pos(), boundary(), dummy);
+       Row::const_iterator cit = row.findElement(pos(), boundary(), dummy);
        // Handle the case of empty row
        if (cit == row.end()) {
-               if (paragraph().isRTL(buffer()->params()))
+               if (row.isRTL())
                        right_pos = row.pos();
                else
                        left_pos = row.pos() - 1;
@@ -864,10 +863,8 @@ void Cursor::getSurroundingPos(pos_type & left_pos, pos_type & right_pos) const
 
 bool Cursor::posVisToNewRow(bool movingLeft)
 {
-       Paragraph const & par = paragraph();
-       Buffer const & buf = *buffer();
        Row const & row = textRow();
-       bool par_is_LTR = !par.isRTL(buf.params());
+       bool par_is_LTR = !row.isRTL();
 
        // Inside a table, determining whether to move to the next or
        // previous row should be done based on the table's direction.
@@ -1742,6 +1739,77 @@ bool Cursor::upDownInMath(bool up)
 }
 
 
+InsetMath & Cursor::nextMath()
+{
+       return *nextAtom().nucleus();
+}
+
+
+InsetMath & Cursor::prevMath()
+{
+       return *prevAtom().nucleus();
+}
+
+
+bool Cursor::mathForward(bool word)
+{
+       LASSERT(inMathed(), return false);
+       if (pos() < lastpos()) {
+               if (word) {
+                       // word: skip a group of insets with same math class
+                       MathClass mc = nextMath().mathClass();
+                       do
+                               posForward();
+                       while (pos() < lastpos() && mc == nextMath().mathClass());
+               } else if (openable(nextAtom())) {
+                       // single step: try to enter the next inset
+                       pushBackward(nextMath());
+                       inset().idxFirst(*this);
+               } else
+                       posForward();
+               return true;
+       }
+       if (inset().idxForward(*this))
+               return true;
+       // try to pop forwards --- but don't pop out of math! leave that to
+       // the FINISH lfuns
+       int s = depth() - 2;
+       if (s >= 0 && operator[](s).inset().asInsetMath())
+               return popForward();
+       return false;
+}
+
+
+bool Cursor::mathBackward(bool word)
+{
+       LASSERT(inMathed(), return false);
+       if (pos() > 0) {
+               if (word) {
+                       // word: skip a group of insets with same math class
+                       MathClass mc = prevMath().mathClass();
+                       do
+                               posBackward();
+                       while (pos() > 0 && mc == prevMath().mathClass());
+               } else if (openable(prevAtom())) {
+                       // single step: try to enter the preceding inset
+                       posBackward();
+                       push(nextMath());
+                       inset().idxLast(*this);
+               } else
+                       posBackward();
+               return true;
+       }
+       if (inset().idxBackward(*this))
+               return true;
+       // try to pop backwards --- but don't pop out of math! leave that to
+       // the FINISH lfuns
+       int s = depth() - 2;
+       if (s >= 0 && operator[](s).inset().asInsetMath())
+               return popBackward();
+       return false;
+}
+
+
 bool Cursor::atFirstOrLastRow(bool up)
 {
        TextMetrics const & tm = bv_->textMetrics(text());
@@ -2174,6 +2242,7 @@ void Cursor::sanitize()
 {
        setBuffer(&bv_->buffer());
        DocIterator::sanitize();
+       new_word_.sanitize();
        if (selection())
                anchor_.sanitize();
        else