X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2Ftext.C;h=a0a3c05f83bb3ed35115edd7e21222b97ea12dc0;hb=d2574b7d8e2716d3d3aea92df6576bd01c421a6c;hp=09a490fc40f473d51552ec19f0e36a43a6342be5;hpb=7913b8c652773e112bc147a76c1a6ba7f969c7e8;p=lyx.git diff --git a/src/text.C b/src/text.C index 09a490fc40..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,6 +1458,8 @@ 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) @@ -1484,25 +1472,17 @@ void LyXText::acceptChange(LCursor & cur) 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(); @@ -1512,6 +1492,8 @@ 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) @@ -1524,24 +1506,17 @@ void LyXText::rejectChange(LCursor & cur) 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(); @@ -1858,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); @@ -1896,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 @@ -1933,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) @@ -1952,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()) @@ -1966,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; }