X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2Ftext.C;h=a0a3c05f83bb3ed35115edd7e21222b97ea12dc0;hb=d2574b7d8e2716d3d3aea92df6576bd01c421a6c;hp=4e8d5c2fed03d7674f17ca4adc37cd442f89a173;hpb=7b031e5d866f7193c6fedb19c16321f25c89067b;p=lyx.git diff --git a/src/text.C b/src/text.C index 4e8d5c2fed..a0a3c05f83 100644 --- a/src/text.C +++ b/src/text.C @@ -1074,10 +1074,6 @@ void LyXText::setHeightOfRow(BufferView const & bv, pit_type const pit, } -namespace { - -} - void LyXText::breakParagraph(LCursor & cur, bool keep_layout) { BOOST_ASSERT(this == cur.text()); @@ -1090,8 +1086,8 @@ void LyXText::breakParagraph(LCursor & cur, bool keep_layout) // this is only allowed, if the current paragraph is not empty // or caption and if it has not the keepempty flag active - if (cur.lastpos() == 0 && !cpar.allowEmpty() - && layout->labeltype != LABEL_SENSITIVE) + if (cur.lastpos() == 0 && !cpar.allowEmpty() && + layout->labeltype != LABEL_SENSITIVE) return; // a layout change may affect also the following paragraph @@ -1100,10 +1096,9 @@ void LyXText::breakParagraph(LCursor & cur, bool keep_layout) // Always break behind a space // It is better to erase the space (Dekel) if (cur.pos() != cur.lastpos() && cpar.isLineSeparator(cur.pos())) - // FIXME: change tracking (MG) cpar.eraseChar(cur.pos(), cur.buffer().params().trackChanges); - // How should the layout for the new paragraph be? + // What should the layout for the new paragraph be? int preserve_layout = 0; if (keep_layout) preserve_layout = 2; @@ -1136,7 +1131,6 @@ void LyXText::breakParagraph(LCursor & cur, bool keep_layout) } while (!pars_[next_par].empty() && pars_[next_par].isNewline(0)) - // FIXME: change tracking (MG) pars_[next_par].eraseChar(0, cur.buffer().params().trackChanges); ParIterator current_it(cur); @@ -1146,13 +1140,6 @@ void LyXText::breakParagraph(LCursor & cur, bool keep_layout) updateLabels(cur.buffer(), current_it, last_it); - // Mark "carriage return" as inserted if change tracking: - if (cur.buffer().params().trackChanges) { - // FIXME: Change tracking (MG) - cur.paragraph().setChange(cur.paragraph().size(), - Change(Change::INSERTED)); - } - // FIXME: Breaking a paragraph has nothing to do with setting a cursor. // Because of the mix between the model (the paragraph contents) and the // view (the paragraph breaking in rows, we have to do this here before @@ -1163,7 +1150,6 @@ void LyXText::breakParagraph(LCursor & cur, bool keep_layout) // A singlePar update is not enough in this case. cur.updateFlags(Update::Force); - // This check is necessary. Otherwise the new empty paragraph will // be deleted automatically. And it is more friendly for the user! if (cur.pos() != 0 || isempty) @@ -1472,34 +1458,31 @@ bool LyXText::selectWordWhenUnderCursor(LCursor & cur, word_location loc) void LyXText::acceptChange(LCursor & cur) { + // FIXME: change tracking (MG) + BOOST_ASSERT(this == cur.text()); + if (!cur.selection() && cur.lastpos() != 0) return; + // FIXME: we must handle start = end = 0 + recordUndoSelection(cur, Undo::INSERT); DocIterator it = cur.selectionBegin(); DocIterator et = cur.selectionEnd(); pit_type pit = it.pit(); - bool isDeleted = pars_[pit].isDeleted(it.pos()); for (; pit <= et.pit(); ++pit) { - pos_type left = ( pit == it.pit() ? it.pos() : 0 ); - pos_type right = - ( pit == et.pit() ? et.pos() : pars_[pit].size() + 1 ); + pos_type left = (pit == it.pit() ? it.pos() : 0); + pos_type right = (pit == et.pit() ? et.pos() : pars_[pit].size()); pars_[pit].acceptChanges(left, right); - } - if (isDeleted) { - ParagraphList & plist = paragraphs(); - if (it.pit() + 1 < et.pit()) - pars_.erase(boost::next(plist.begin(), it.pit() + 1), - boost::next(plist.begin(), et.pit())); - // Paragraph merge if appropriate: - // FIXME: change tracking (MG) - if (pars_[it.pit()].isDeleted(pars_[it.pit()].size())) { - setCursorIntern(cur, it.pit() + 1, 0); - backspacePos0(cur); - } + // merge paragraph if appropriate: + // if (right >= pars_[pit].size() && pit + 1 < et.pit() && + // pars_[pit].isDeleted(pars_[pit].size())) { + // setCursorIntern(cur, pit + 1, 0); + // backspacePos0(cur); + //} } finishUndo(); cur.clearSelection(); @@ -1509,33 +1492,31 @@ void LyXText::acceptChange(LCursor & cur) void LyXText::rejectChange(LCursor & cur) { + // FIXME: change tracking (MG) + BOOST_ASSERT(this == cur.text()); + if (!cur.selection() && cur.lastpos() != 0) return; + // FIXME: we must handle start = end = 0 + recordUndoSelection(cur, Undo::INSERT); DocIterator it = cur.selectionBegin(); DocIterator et = cur.selectionEnd(); pit_type pit = it.pit(); - bool isInserted = pars_[pit].isInserted(it.pos()); for (; pit <= et.pit(); ++pit) { - pos_type left = ( pit == it.pit() ? it.pos() : 0 ); - pos_type right = - ( pit == et.pit() ? et.pos() : pars_[pit].size() + 1 ); + pos_type left = (pit == it.pit() ? it.pos() : 0); + pos_type right = (pit == et.pit() ? et.pos() : pars_[pit].size()); pars_[pit].rejectChanges(left, right); - } - if (isInserted) { - ParagraphList & plist = paragraphs(); - if (it.pit() + 1 < et.pit()) - pars_.erase(boost::next(plist.begin(), it.pit() + 1), - boost::next(plist.begin(), et.pit())); - // Paragraph merge if appropriate: - // FIXME: change tracking (MG) - if (pars_[it.pit()].isInserted(pars_[it.pit()].size())) { - setCursorIntern(cur, it.pit() + 1, 0); - backspacePos0(cur); - } + + // merge paragraph if appropriate: + // if (right >= pars_[pit].size() && pit + 1 < et.pit() && + // pars_[pit].isInserted(pars_[pit].size())) { + // setCursorIntern(cur, pit + 1, 0); + // backspacePos0(cur); + //} } finishUndo(); cur.clearSelection(); @@ -1662,7 +1643,10 @@ bool LyXText::erase(LCursor & cur) if (par.isDeleted(cur.pos())) cur.forwardPosNoDescend(); needsUpdate = true; - } else if (cur.pit() != cur.lastpit()) { + } else { + if (cur.pit() == cur.lastpit()) + return dissolveInset(cur); + if (!par.isMergedOnEndOfParDeletion(cur.buffer().params().trackChanges)) { par.setChange(cur.pos(), Change(Change::DELETED)); cur.forwardPos(); @@ -1671,8 +1655,6 @@ bool LyXText::erase(LCursor & cur) setCursorIntern(cur, cur.pit() + 1, 0); needsUpdate = backspacePos0(cur); } - } else { - needsUpdate = dissolveInset(cur); } // FIXME: Inserting characters has nothing to do with setting a cursor. @@ -1812,7 +1794,6 @@ bool LyXText::dissolveInset(LCursor & cur) { spos += cur.pos(); spit += cur.pit(); Buffer & b = cur.buffer(); - // FIXME: change tracking (MG) cur.paragraph().eraseChar(cur.pos(), b.params().trackChanges); if (!plist.empty()) { if (in_ert) { @@ -1852,6 +1833,8 @@ bool LyXText::redoParagraph(BufferView & bv, pit_type const pit) Paragraph & par = pars_[pit]; Buffer const & buffer = *bv.buffer(); + bool changed = false; + // Add bibitem insets if necessary if (par.layout()->labeltype == LABEL_BIBLIO) { bool hasbibitem(false); @@ -1880,8 +1863,8 @@ bool LyXText::redoParagraph(BufferView & bv, pit_type const pit) // FIXME: We should always use getFont(), see documentation of // noFontChange() in insetbase.h. LyXFont const bufferfont = buffer.params().getFont(); - InsetList::iterator ii = par.insetlist.begin(); - InsetList::iterator iend = par.insetlist.end(); + InsetList::const_iterator ii = par.insetlist.begin(); + InsetList::const_iterator iend = par.insetlist.end(); for (; ii != iend; ++ii) { Dimension dim; int const w = maxwidth_ - leftMargin(buffer, pit, ii->pos) @@ -1890,7 +1873,7 @@ bool LyXText::redoParagraph(BufferView & bv, pit_type const pit) bufferfont : getFont(buffer, par, ii->pos); MetricsInfo mi(&bv, font, w); - ii->inset->metrics(mi, dim); + changed |= ii->inset->metrics(mi, dim); } // rebreak the paragraph @@ -1927,16 +1910,16 @@ bool LyXText::redoParagraph(BufferView & bv, pit_type const pit) dim.asc += par.rows()[0].ascent(); dim.des -= par.rows()[0].ascent(); - bool const same = dim.height() == par.dim().height(); + changed |= dim.height() != par.dim().height(); par.dim() = dim; //lyxerr << "redoParagraph: " << par.rows().size() << " rows\n"; - return !same; + return changed; } -void LyXText::metrics(MetricsInfo & mi, Dimension & dim) +bool LyXText::metrics(MetricsInfo & mi, Dimension & dim) { //BOOST_ASSERT(mi.base.textwidth); if (mi.base.textwidth) @@ -1946,10 +1929,12 @@ void LyXText::metrics(MetricsInfo & mi, Dimension & dim) // save the caller's font locally: font_ = mi.base.font; + bool changed = false; + unsigned int h = 0; unsigned int w = 0; for (pit_type pit = 0, n = paragraphs().size(); pit != n; ++pit) { - redoParagraph(*mi.base.bv, pit); + changed |= redoParagraph(*mi.base.bv, pit); Paragraph & par = paragraphs()[pit]; h += par.height(); if (w < par.width()) @@ -1960,7 +1945,9 @@ void LyXText::metrics(MetricsInfo & mi, Dimension & dim) dim.asc = pars_[0].ascent(); dim.des = h - dim.asc; + changed |= dim_ != dim; dim_ = dim; + return changed; }