]> git.lyx.org Git - lyx.git/blobdiff - src/text.C
added a parseError signal to Buffer and use it
[lyx.git] / src / text.C
index b79fb2347599ced4074095c119a330d0ab16a3c1..d416acde64784f49f925dc7752edc99c7a8f4d4b 100644 (file)
@@ -87,16 +87,24 @@ void LyXText::updateRowPositions()
 
 int LyXText::top_y() const
 {
-       if (isInInset() || anchor_row_ == rowlist_.end() )
+       if (anchor_row_ == rowlist_.end())
                return 0;
+
        return anchor_row_->y() + anchor_row_offset_;
 }
 
 
 void LyXText::top_y(int newy)
 {
-       if (rows().empty() || isInInset())
+       if (rows().empty())
                return;
+
+       if (isInInset()) {
+               anchor_row_ = rows().begin();
+               anchor_row_offset_ = newy;
+               return;
+       }
+
        lyxerr[Debug::GUI] << "setting top y = " << newy << endl;
 
        int y = newy;
@@ -137,10 +145,12 @@ int LyXText::workWidth() const
 }
 
 
-int LyXText::workWidth(Inset * inset) const
+int LyXText::workWidth(Inset const * inset) const
 {
-       Paragraph * par = inset->parOwner();
-       lyx::Assert(par);
+       ParagraphList::iterator par = std::find(ownerParagraphs().begin(),
+                                               ownerParagraphs().end(),
+                                               *inset->parOwner());
+       //lyx::Assert(par);
 
        pos_type pos = par->getPositionOfInset(inset);
        lyx::Assert(pos != -1);
@@ -760,8 +770,7 @@ pos_type addressBreakPoint(pos_type i, Paragraph const & par)
 };
 
 
-pos_type
-LyXText::rowBreakPoint(Row const & row) const
+pos_type LyXText::rowBreakPoint(Row const & row) const
 {
        ParagraphList::iterator pit = row.par();
 
@@ -790,7 +799,7 @@ LyXText::rowBreakPoint(Row const & row) const
        // or the end of the par, then choose the possible break
        // nearest that.
 
-       int const left = leftMargin(const_cast<Row&>(row));
+       int const left = leftMargin(row);
        int x = left;
 
        // pixel width since last breakpoint
@@ -1451,13 +1460,12 @@ void LyXText::breakParagraph(ParagraphList & paragraphs, char keep_layout)
        LyXLayout_ptr const & layout = cursor.par()->layout();
 
        // this is only allowed, if the current paragraph is not empty or caption
-       // and if it has not the keepempty flag aktive
-       if (cursor.par()->empty()
-          && layout->labeltype != LABEL_SENSITIVE
-          && !layout->keepempty)
+       // and if it has not the keepempty flag active
+       if (cursor.par()->empty() && !cursor.par()->allowEmpty()
+          && layout->labeltype != LABEL_SENSITIVE)
                return;
 
-       setUndo(bv(), Undo::FINISH, cursor.par(), boost::next(cursor.par()));
+       setUndo(bv(), Undo::FINISH, cursor.par());
 
        // Always break behind a space
        //
@@ -1477,7 +1485,7 @@ void LyXText::breakParagraph(ParagraphList & paragraphs, char keep_layout)
        // breakParagraph call should return a bool if it inserts the
        // paragraph before or behind and we should react on that one
        // but we can fix this in 1.3.0 (Jug 20020509)
-       bool const isempty = (layout->keepempty && cursor.par()->empty());
+       bool const isempty = (cursor.par()->allowEmpty() && cursor.par()->empty());
        ::breakParagraph(bv()->buffer()->params, paragraphs, cursor.par(), cursor.pos(),
                       keep_layout);
 
@@ -1562,7 +1570,7 @@ void LyXText::redoParagraph()
 // same Paragraph one to the right and make a rebreak
 void LyXText::insertChar(char c)
 {
-       setUndo(bv(), Undo::INSERT, cursor.par(), boost::next(cursor.par()));
+       setUndo(bv(), Undo::INSERT, cursor.par());
 
        // When the free-spacing option is set for the current layout,
        // disable the double-space checking
@@ -1723,9 +1731,10 @@ void LyXText::insertChar(char c)
                                  false, cursor.boundary());
                        // cursor MUST be in row now.
 
-                       if (boost::next(row) != rows().end() &&
-                           boost::next(row)->par() == row->par())
-                               need_break_row = boost::next(row);
+                       RowList::iterator next_row = boost::next(row);
+                       if (next_row != rows().end() &&
+                           next_row->par() == row->par())
+                               need_break_row = next_row;
                        else
                                need_break_row = rows().end();
 
@@ -1749,13 +1758,18 @@ void LyXText::insertChar(char c)
        if (c == Paragraph::META_INSET || row->fill() < 0) {
                postPaint(y);
                breakAgainOneRow(row);
+
+               RowList::iterator next_row = boost::next(row);
+
                // will the cursor be in another row now?
                if (lastPos(*this, row) <= cursor.pos() + 1 &&
-                   boost::next(row) != rows().end()) {
-                       if (boost::next(row) != rows().end() &&
-                           boost::next(row)->par() == row->par())
+                   next_row != rows().end()) {
+                       if (next_row != rows().end() &&
+                           next_row->par() == row->par()) {
                                // this should always be true
                                ++row;
+                       }
+
                        breakAgainOneRow(row);
                }
                current_font = rawtmpfont;
@@ -1767,9 +1781,12 @@ void LyXText::insertChar(char c)
                    != cursor.boundary())
                        setCursor(cursor.par(), cursor.pos(), false,
                          !cursor.boundary());
-               if (boost::next(row) != rows().end() &&
-                   boost::next(row)->par() == row->par())
-                       need_break_row = boost::next(row);
+
+               next_row = boost::next(row);
+
+               if (next_row != rows().end() &&
+                   next_row->par() == row->par())
+                       need_break_row = next_row;
                else
                        need_break_row = rows().end();
        } else {
@@ -2112,7 +2129,7 @@ void LyXText::acceptChange()
        if (selection.start.par() == selection.end.par()) {
                LyXCursor & startc = selection.start;
                LyXCursor & endc = selection.end;
-               setUndo(bv(), Undo::INSERT, startc.par(), boost::next(startc.par()));
+               setUndo(bv(), Undo::INSERT, startc.par());
                startc.par()->acceptChange(startc.pos(), endc.pos());
                finishUndo();
                clearSelection();
@@ -2131,8 +2148,7 @@ void LyXText::rejectChange()
        if (selection.start.par() == selection.end.par()) {
                LyXCursor & startc = selection.start;
                LyXCursor & endc = selection.end;
-               setUndo(bv(), Undo::INSERT, startc.par(),
-                       boost::next(startc.par()));
+               setUndo(bv(), Undo::INSERT, startc.par());
                startc.par()->rejectChange(startc.pos(), endc.pos());
                finishUndo();
                clearSelection();
@@ -2349,7 +2365,7 @@ void LyXText::changeCase(LyXText::TextCase action)
 
        lyx::Assert(from <= to);
 
-       setUndo(bv(), Undo::FINISH, from.par(), boost::next(to.par()));
+       setUndo(bv(), Undo::FINISH, from.par(), to.par());
 
        pos_type pos = from.pos();
        ParagraphList::iterator pit = from.par();
@@ -2419,8 +2435,7 @@ void LyXText::Delete()
                LyXCursor tmpcursor = cursor;
                // to make sure undo gets the right cursor position
                cursor = old_cursor;
-               setUndo(bv(), Undo::DELETE,
-                       cursor.par(), boost::next(cursor.par()));
+               setUndo(bv(), Undo::DELETE, cursor.par());
                cursor = tmpcursor;
                backspace();
        }
@@ -2479,7 +2494,7 @@ void LyXText::backspace()
                if (cursor.par() != ownerParagraphs().begin()) {
                        setUndo(bv(), Undo::DELETE,
                                boost::prior(cursor.par()),
-                               boost::next(cursor.par()));
+                               cursor.par());
                }
 
                ParagraphList::iterator tmppit = cursor.par();
@@ -2545,8 +2560,7 @@ void LyXText::backspace()
        } else {
                // this is the code for a normal backspace, not pasting
                // any paragraphs
-               setUndo(bv(), Undo::DELETE,
-                       cursor.par(), boost::next(cursor.par()));
+               setUndo(bv(), Undo::DELETE, cursor.par());
                // We used to do cursorLeftIntern() here, but it is
                // not a good idea since it triggers the auto-delete
                // mechanism. So we do a cursorLeftIntern()-lite,