LyXLayout_ptr const & lyxlayout = bufparams.getLyXTextClass()[layout];
for (pit_type pit = start; pit != end; ++pit) {
- pars_[pit].applyLayout(lyxlayout);
+ Paragraph & par = pars_[pit];
+ par.applyLayout(lyxlayout);
if (lyxlayout->margintype == MARGIN_MANUAL)
- pars_[pit].setLabelWidthString(buffer.translateLabel(lyxlayout->labelstring()));
+ par.setLabelWidthString(par.translateIfPossible(
+ lyxlayout->labelstring(), buffer.params()));
}
}
ParagraphMetrics const & pm = tm.parMetrics(cur.pit());
int row;
- int const x = cur.targetX();
-
if (cur.pos() && cur.boundary())
row = pm.pos2row(cur.pos()-1);
else
row = pm.pos2row(cur.pos());
+ // remember current position only if we are not at the end of a row.
+ if (cur.pos() != pm.rows()[row].endpos())
+ cur.setTargetX();
+ int const x = cur.targetX();
+
if (!cur.selection()) {
int const y = bv_funcs::getPos(cur.bv(), cur, cur.boundary()).y_;
LCursor old = cur;
++dummy.pos();
cur.bv().checkDepm(dummy, old);
+ return false;
}
bool updateNeeded = false;
ParagraphMetrics const & pm = tm.parMetrics(cur.pit());
int row;
- int const x = cur.targetX();
-
if (cur.pos() && cur.boundary())
row = pm.pos2row(cur.pos()-1);
else
row = pm.pos2row(cur.pos());
+ // remember current position only if we are not at the end of a row.
+ if (cur.pos() != pm.rows()[row].endpos())
+ cur.setTargetX();
+ int const x = cur.targetX();
+
if (!cur.selection()) {
int const y = bv_funcs::getPos(cur.bv(), cur, cur.boundary()).y_;
LCursor old = cur;
&& oldpar.isLineSeparator(old.pos())
&& oldpar.isLineSeparator(old.pos() - 1)
&& !oldpar.isDeleted(old.pos() - 1)) {
- oldpar.eraseChar(old.pos() - 1, false); // do not track changes in DEPM
+ oldpar.eraseChar(old.pos() - 1, cur.buffer().params().trackChanges);
#ifdef WITH_WARNINGS
#warning This will not work anymore when we have multiple views of the same buffer
// In this case, we will have to correct also the cursors held by
return true;
}
- if (oldpar.stripLeadingSpaces())
+ if (oldpar.stripLeadingSpaces(cur.buffer().params().trackChanges)) {
need_anchor_change = true;
+ // We return true here because the Paragraph contents changed and
+ // we need a redraw before further action is processed.
+ return true;
+ }
return false;
}
+void LyXText::deleteEmptyParagraphMechanism(pit_type first, pit_type last, bool trackChanges)
+{
+ BOOST_ASSERT(first >= 0 && first <= last && last < (int) pars_.size());
+
+ for (pit_type pit = first; pit <= last; ++pit) {
+ Paragraph & par = pars_[pit];
+
+ // We allow all kinds of "mumbo-jumbo" when freespacing.
+ if (par.isFreeSpacing())
+ continue;
+
+ for (pos_type pos = 1; pos < par.size(); ++pos) {
+ if (par.isLineSeparator(pos) && par.isLineSeparator(pos - 1)
+ && !par.isDeleted(pos - 1)) {
+ if (par.eraseChar(pos - 1, trackChanges)) {
+ --pos;
+ }
+ }
+ }
+
+ // don't delete anything if this is the only remaining paragraph within the given range
+ // note: LyXText::acceptOrRejectChanges() sets the cursor to 'first' after calling DEPM
+ if (first == last)
+ continue;
+
+ // don't delete empty paragraphs with keepempty set
+ if (par.allowEmpty())
+ continue;
+
+ if (par.empty() || (par.size() == 1 && par.isLineSeparator(0))) {
+ pars_.erase(boost::next(pars_.begin(), pit));
+ --pit;
+ --last;
+ continue;
+ }
+
+ par.stripLeadingSpaces(trackChanges);
+ }
+}
+
+
void LyXText::recUndo(LCursor & cur, pit_type first, pit_type last) const
{
recordUndo(cur, Undo::ATOMIC, first, last);