diff --git a/src/BufferView.C b/src/BufferView.C index 8dfbdbb964..8a7bee84b1 100644 --- a/src/BufferView.C +++ b/src/BufferView.C @@ -625,8 +625,7 @@ bool BufferView::ChangeInsets(InsetOld::Code code, // How to set the cursor corretly when it.size()>1 ?? if (it.size() == 1) { text->setCursorIntern(it.pit(), 0); - text->redoParagraphs(text->cursor, - boost::next(text->cursor.par())); + text->redoParagraph(text->cursor.par()); text->partialRebreak(); } } diff --git a/src/ChangeLog b/src/ChangeLog index 1015416b2f..506cbb779f 100644 --- a/src/ChangeLog +++ b/src/ChangeLog @@ -2,6 +2,13 @@ * buffer.[Ch]: file_format is no longer a buffer data element. +2003-08-01 André Pönitz + + * BufferView.C: + * lyxtext.h: + * text.C: + * text2.C: make redoParagraph more independent of current cursor + 2003-07-30 André Pönitz * paragraph.[Ch] (copyIntoMinibuffer): removed unused function diff --git a/src/insets/insetcollapsable.C b/src/insets/insetcollapsable.C index b70653314a..5cb670318b 100644 --- a/src/insets/insetcollapsable.C +++ b/src/insets/insetcollapsable.C @@ -289,8 +289,8 @@ bool InsetCollapsable::hitButton(FuncRequest const & cmd) const InsetOld::RESULT InsetCollapsable::localDispatch(FuncRequest const & cmd) { - lyxerr << "InsetCollapsable::localDispatch: " - << cmd.action << " '" << cmd.argument << "'\n"; + //lyxerr << "InsetCollapsable::localDispatch: " + // << cmd.action << " '" << cmd.argument << "'\n"; BufferView * bv = cmd.view(); switch (cmd.action) { case LFUN_INSET_EDIT: { diff --git a/src/lyxtext.h b/src/lyxtext.h index 83027e9c43..c45f319f34 100644 --- a/src/lyxtext.h +++ b/src/lyxtext.h @@ -131,15 +131,15 @@ public: */ void setFont(LyXFont const &, bool toggleall = false); - /** deletes and inserts again all paragaphs between the cursor - and the specified par. The Cursor is needed to set the refreshing - parameters. - This function is needed after SetLayout and SetFont etc. - */ - void redoParagraphs(LyXCursor const & cursor, - ParagraphList::iterator endpit); - /// + /// rebreaks all paragaphs between the given pars. + void redoParagraphs(ParagraphList::iterator begin, + ParagraphList::iterator end); + /// rebreaks the given par + void redoParagraph(ParagraphList::iterator pit); + /// rebreaks the cursor par void redoParagraph(); + /// returns first row belongin to some par + RowList::iterator firstRow(ParagraphList::iterator pit); /// void toggleFree(LyXFont const &, bool toggleall = false); diff --git a/src/text.C b/src/text.C index a4ad945e4b..53211171d2 100644 --- a/src/text.C +++ b/src/text.C @@ -1579,7 +1579,7 @@ void LyXText::breakParagraph(ParagraphList & paragraphs, char keep_layout) void LyXText::redoParagraph() { clearSelection(); - redoParagraphs(cursor, boost::next(cursor.par())); + redoParagraph(cursor.par()); setCursorIntern(cursor.par(), cursor.pos()); } @@ -2007,7 +2007,7 @@ void LyXText::acceptChange() startc.par()->acceptChange(startc.pos(), endc.pos()); finishUndo(); clearSelection(); - redoParagraphs(startc, boost::next(startc.par())); + redoParagraph(startc.par()); setCursorIntern(startc.par(), 0); } #warning handle multi par selection @@ -2026,7 +2026,7 @@ void LyXText::rejectChange() startc.par()->rejectChange(startc.pos(), endc.pos()); finishUndo(); clearSelection(); - redoParagraphs(startc, boost::next(startc.par())); + redoParagraph(startc.par()); setCursorIntern(startc.par(), 0); } #warning handle multi par selection diff --git a/src/text2.C b/src/text2.C index dcb79784ce..0c798d4bc8 100644 --- a/src/text2.C +++ b/src/text2.C @@ -443,7 +443,7 @@ void LyXText::setLayout(string const & layout) ParagraphList::iterator endpit = setLayout(cursor, selection.start, selection.end, layout); - redoParagraphs(selection.start, endpit); + redoParagraphs(selection.start.par(), endpit); // we have to reset the selection, because the // geometry could have changed @@ -511,15 +511,12 @@ bool LyXText::changeDepth(bv_funcs::DEPTH_CHANGE type, bool test_only) if (test_only) return changed; - // Wow, redoParagraphs is stupid. - LyXCursor tmpcursor; - setCursor(tmpcursor, start, 0); - redoParagraphs(tmpcursor, pastend); + redoParagraphs(start, pastend); // We need to actually move the text->cursor. I don't // understand why ... - tmpcursor = cursor; + LyXCursor tmpcursor = cursor; // we have to reset the visual selection because the // geometry could have changed @@ -589,7 +586,7 @@ void LyXText::setFont(LyXFont const & font, bool toggleall) } unFreezeUndo(); - redoParagraphs(selection.start, boost::next(selection.end.par())); + redoParagraph(selection.start.par()); // we have to reset the selection, because the // geometry could have changed, but we keep @@ -621,17 +618,31 @@ void LyXText::redoHeightOfParagraph() } -// deletes and inserts again all paragraphs between the cursor -// and the specified par -// This function is needed after SetLayout and SetFont etc. -void LyXText::redoParagraphs(LyXCursor const & cur, - ParagraphList::iterator endpit) +RowList::iterator LyXText::firstRow(ParagraphList::iterator pit) { - RowList::iterator tmprit = getRow(cur); + RowList::iterator rit; + for (rit = rows().begin(); rit != rows().end(); ++rit) + if (rit->par() == pit) + break; + return rit; +} + + +// rebreaks all paragraphs between the specified pars +// This function is needed after SetLayout and SetFont etc. +void LyXText::redoParagraphs(ParagraphList::iterator start, + ParagraphList::iterator endpit) +{ + RowList::iterator rit = firstRow(start); + + if (rit == rows().end()) { + lyxerr << "LyXText::redoParagraphs: should not happen\n"; + Assert(0); + } ParagraphList::iterator first_phys_pit; RowList::iterator prevrit; - if (tmprit == rows().begin()) { + if (rit == rows().begin()) { // A trick/hack for UNDO. // This is needed because in an UNDO/REDO we could have // changed the ownerParagraph() so the paragraph inside @@ -640,30 +651,28 @@ void LyXText::redoParagraphs(LyXCursor const & cur, first_phys_pit = ownerParagraphs().begin(); prevrit = rows().end(); } else { - first_phys_pit = tmprit->par(); - while (tmprit != rows().begin() - && boost::prior(tmprit)->par() == first_phys_pit) + first_phys_pit = rit->par(); + while (rit != rows().begin() + && boost::prior(rit)->par() == first_phys_pit) { - --tmprit; + --rit; } - prevrit = boost::prior(tmprit); + prevrit = boost::prior(rit); } // remove it - while (tmprit != rows().end() && tmprit->par() != endpit) { - RowList::iterator tmprit2 = tmprit++; - removeRow(tmprit2); + while (rit != rows().end() && rit->par() != endpit) { + RowList::iterator rit2 = rit++; + removeRow(rit2); } // Reinsert the paragraphs. ParagraphList::iterator tmppit = first_phys_pit; while (tmppit != ownerParagraphs().end()) { - insertParagraph(tmppit, tmprit); - while (tmprit != rows().end() - && tmprit->par() == tmppit) { - ++tmprit; - } + insertParagraph(tmppit, rit); + while (rit != rows().end() && rit->par() == tmppit) + ++rit; ++tmppit; if (tmppit == endpit) break; @@ -673,13 +682,19 @@ void LyXText::redoParagraphs(LyXCursor const & cur, else setHeightOfRow(rows().begin()); postPaint(); - if (tmprit != rows().end()) - setHeightOfRow(tmprit); + if (rit != rows().end()) + setHeightOfRow(rit); updateCounters(); } +void LyXText::redoParagraph(ParagraphList::iterator pit) +{ + redoParagraphs(pit, boost::next(pit)); +} + + void LyXText::fullRebreak() { init(bv()); @@ -948,7 +963,7 @@ void LyXText::setParagraph(bool line_top, bool line_bottom, } postPaint(); - redoParagraphs(selection.start, endpit); + redoParagraphs(selection.start.par(), endpit); clearSelection(); setCursor(selection.start.par(), selection.start.pos()); @@ -1279,7 +1294,7 @@ void LyXText::cutSelection(bool doclear, bool realcut) if (doclear) selection.start.par()->stripLeadingSpaces(); - redoParagraphs(selection.start, boost::next(endpit)); + redoParagraphs(selection.start.par(), boost::next(endpit)); #warning FIXME latent bug // endpit will be invalidated on redoParagraphs once ParagraphList // becomes a std::list? There are maybe other places on which this @@ -1347,7 +1362,7 @@ void LyXText::pasteSelection(size_t sel_index) bufferErrors(*bv()->buffer(), el); bv()->showErrorList(_("Paste")); - redoParagraphs(cursor, endpit); + redoParagraphs(cursor.par(), endpit); setCursor(cursor.par(), cursor.pos()); clearSelection(); @@ -1417,7 +1432,7 @@ void LyXText::insertStringAsLines(string const & str) bv()->buffer()->insertStringAsLines(pit, pos, current_font, str); - redoParagraphs(cursor, endpit); + redoParagraphs(cursor.par(), endpit); setCursor(cursor.par(), cursor.pos()); selection.cursor = cursor; setCursor(pit, pos); @@ -2067,7 +2082,7 @@ bool LyXText::deleteEmptyParagraphMechanism(LyXCursor const & old_cursor) && old_cursor.par()->isLineSeparator(old_cursor.pos()) && old_cursor.par()->isLineSeparator(old_cursor.pos() - 1)) { old_cursor.par()->erase(old_cursor.pos() - 1); - redoParagraphs(old_cursor, boost::next(old_cursor.par())); + redoParagraph(old_cursor.par()); #ifdef WITH_WARNINGS #warning This will not work anymore when we have multiple views of the same buffer @@ -2185,7 +2200,7 @@ bool LyXText::deleteEmptyParagraphMechanism(LyXCursor const & old_cursor) } if (!deleted) { if (old_cursor.par()->stripLeadingSpaces()) { - redoParagraphs(old_cursor, boost::next(old_cursor.par())); + redoParagraph(old_cursor.par()); // correct cursor y setCursorIntern(cursor.par(), cursor.pos()); selection.cursor = cursor;