mirror of
https://git.lyx.org/repos/lyx.git
synced 2025-01-19 05:53:35 +00:00
* text.C (backspacePos0): rewrite to make it simple and allow
deleting empty paragraphs even when keepempty is true. Do not rely on dEPM, since this was silly (bugs 2587 and 2882) (Delete): simplify also and avoid calling backspace. (backspace): small tweak. git-svn-id: svn://svn.lyx.org/lyx/lyx-devel/branches/BRANCH_1_4_X@15547 a592a061-630c-0410-9148-cb99ea01b6c8
This commit is contained in:
parent
e48fd46d5f
commit
c57bff5fa5
@ -1,3 +1,11 @@
|
|||||||
|
2006-10-25 Jean-Marc Lasgouttes <lasgouttes@lyx.org>
|
||||||
|
|
||||||
|
* text.C (backspacePos0): rewrite to make it simple and allow
|
||||||
|
deleting empty paragraphs even when keepempty is true. Do not rely
|
||||||
|
on dEPM, since this was silly (bugs 2587 and 2882)
|
||||||
|
(Delete): simplify also and avoid calling backspace.
|
||||||
|
(backspace): small tweak.
|
||||||
|
|
||||||
2006-10-09 Jürgen Spitzmüller <j.spitzmueller@gmx.de>
|
2006-10-09 Jürgen Spitzmüller <j.spitzmueller@gmx.de>
|
||||||
|
|
||||||
* buffer.[Ch] (changeRefsIfUnique): extend to handle bibitems
|
* buffer.[Ch] (changeRefsIfUnique): extend to handle bibitems
|
||||||
|
140
src/text.C
140
src/text.C
@ -1589,32 +1589,36 @@ bool LyXText::Delete(LCursor & cur)
|
|||||||
{
|
{
|
||||||
BOOST_ASSERT(this == cur.text());
|
BOOST_ASSERT(this == cur.text());
|
||||||
bool needsUpdate = false;
|
bool needsUpdate = false;
|
||||||
|
Paragraph & par = cur.paragraph();
|
||||||
|
|
||||||
if (cur.pos() != cur.lastpos()) {
|
if (cur.pos() != cur.lastpos()) {
|
||||||
recordUndo(cur, Undo::DELETE, cur.pit());
|
// this is the code for a normal delete, not pasting
|
||||||
setCursorIntern(cur, cur.pit(), cur.pos() + 1, false, cur.boundary());
|
// any paragraphs
|
||||||
needsUpdate = backspace(cur);
|
recordUndo(cur, Undo::DELETE);
|
||||||
if (cur.paragraph().lookupChange(cur.pos()) == Change::DELETED)
|
par.erase(cur.pos());
|
||||||
cur.posRight();
|
if (par.lookupChange(cur.pos()) == Change::DELETED)
|
||||||
|
cur.forwardPos();
|
||||||
|
needsUpdate = true;
|
||||||
} else if (cur.pit() != cur.lastpit()) {
|
} else if (cur.pit() != cur.lastpit()) {
|
||||||
LCursor scur = cur;
|
if (cur.buffer().params().tracking_changes
|
||||||
|
&& par.lookupChange(cur.pos()) != Change::INSERTED) {
|
||||||
setCursorIntern(cur, cur.pit() + 1, 0, false, false);
|
// mark "carriage return" as deleted:
|
||||||
if (pars_[cur.pit()].layout() == pars_[scur.pit()].layout()) {
|
par.setChange(cur.pos(), Change::DELETED);
|
||||||
recordUndo(scur, Undo::DELETE, scur.pit());
|
cur.forwardPos();
|
||||||
needsUpdate = backspace(cur);
|
needsUpdate = true;
|
||||||
if (cur.buffer().params().tracking_changes) {
|
|
||||||
// move forward after the paragraph break is DELETED
|
|
||||||
Paragraph & par = cur.paragraph();
|
|
||||||
if (par.lookupChange(par.size()) == Change::DELETED)
|
|
||||||
setCursorIntern(cur, cur.pit() + 1, 0);
|
|
||||||
}
|
|
||||||
} else {
|
} else {
|
||||||
setCursorIntern(scur, scur.pit(), scur.pos(), false, scur.boundary());
|
setCursorIntern(cur, cur.pit() + 1, 0);
|
||||||
|
needsUpdate = backspacePos0(cur);
|
||||||
|
if (cur.paragraph().lookupChange(cur.pos()) == Change::DELETED)
|
||||||
|
cur.forwardPos();
|
||||||
}
|
}
|
||||||
} else
|
} else
|
||||||
needsUpdate = dissolveInset(cur);
|
needsUpdate = dissolveInset(cur);
|
||||||
|
|
||||||
|
// Make sure the cursor is correct. Is this really needed?
|
||||||
|
if (needsUpdate)
|
||||||
|
setCursorIntern(cur, cur.pit(), cur.pos());
|
||||||
|
|
||||||
return needsUpdate;
|
return needsUpdate;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1622,73 +1626,50 @@ bool LyXText::Delete(LCursor & cur)
|
|||||||
bool LyXText::backspacePos0(LCursor & cur)
|
bool LyXText::backspacePos0(LCursor & cur)
|
||||||
{
|
{
|
||||||
BOOST_ASSERT(this == cur.text());
|
BOOST_ASSERT(this == cur.text());
|
||||||
|
if (cur.pit() == 0)
|
||||||
|
return false;
|
||||||
|
|
||||||
bool needsUpdate = false;
|
bool needsUpdate = false;
|
||||||
|
|
||||||
Paragraph & par = cur.paragraph();
|
BufferParams const & bufparams = cur.buffer().params();
|
||||||
|
LyXTextClass const & tclass = bufparams.getLyXTextClass();
|
||||||
|
ParagraphList & plist = cur.text()->paragraphs();
|
||||||
|
Paragraph const & par = cur.paragraph();
|
||||||
|
LCursor prevcur = cur;
|
||||||
|
--prevcur.pit();
|
||||||
|
prevcur.pos() = prevcur.lastpos();
|
||||||
|
Paragraph const & prevpar = prevcur.paragraph();
|
||||||
|
|
||||||
// is it an empty paragraph?
|
// is it an empty paragraph?
|
||||||
pos_type lastpos = cur.lastpos();
|
if (cur.lastpos() == 0
|
||||||
if (lastpos == 0 || (lastpos == 1 && par.isSeparator(0))) {
|
|| (cur.lastpos() == 1 && par.isSeparator(0))) {
|
||||||
// This is an empty paragraph and we delete it just
|
recordUndo(cur, Undo::ATOMIC, prevcur.pit(), cur.pit());
|
||||||
// by moving the cursor one step
|
plist.erase(boost::next(plist.begin(), cur.pit()));
|
||||||
// left and let the DeleteEmptyParagraphMechanism
|
needsUpdate = true;
|
||||||
// handle the actual deletion of the paragraph.
|
|
||||||
|
|
||||||
if (cur.pit() != 0) {
|
|
||||||
// For KeepEmpty layouts we need to get
|
|
||||||
// rid of the keepEmpty setting first.
|
|
||||||
// And the only way to do this is to
|
|
||||||
// reset the layout to something
|
|
||||||
// else: f.ex. the default layout.
|
|
||||||
if (par.allowEmpty()) {
|
|
||||||
Buffer & buf = cur.buffer();
|
|
||||||
BufferParams const & bparams = buf.params();
|
|
||||||
par.layout(bparams.getLyXTextClass().defaultLayout());
|
|
||||||
}
|
}
|
||||||
|
// is previous par empty?
|
||||||
cursorLeft(cur);
|
else if (prevcur.lastpos() == 0
|
||||||
return true;
|
|| (prevcur.lastpos() == 1 && prevpar.isSeparator(0))) {
|
||||||
|
recordUndo(cur, Undo::ATOMIC, prevcur.pit(), cur.pit());
|
||||||
|
plist.erase(boost::next(plist.begin(), prevcur.pit()));
|
||||||
|
needsUpdate = true;
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
if (cur.pit() != 0)
|
|
||||||
recordUndo(cur, Undo::DELETE, cur.pit() - 1);
|
|
||||||
|
|
||||||
pit_type tmppit = cur.pit();
|
|
||||||
// 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,
|
|
||||||
// without the dreaded mechanism. (JMarc)
|
|
||||||
if (cur.pit() != 0) {
|
|
||||||
// steps into the above paragraph.
|
|
||||||
setCursorIntern(cur, cur.pit() - 1,
|
|
||||||
pars_[cur.pit() - 1].size(),
|
|
||||||
false);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Pasting is not allowed, if the paragraphs have different
|
// Pasting is not allowed, if the paragraphs have different
|
||||||
// layout. I think it is a real bug of all other
|
// layout. I think it is a real bug of all other
|
||||||
// word processors to allow it. It confuses the user.
|
// word processors to allow it. It confuses the user.
|
||||||
// Correction: Pasting is always allowed with standard-layout
|
// Correction: Pasting is always allowed with standard-layout
|
||||||
// Correction (Jug 20050717): Remove check about alignment!
|
else if (par.layout() == prevpar.layout()
|
||||||
Buffer & buf = cur.buffer();
|
|| par.layout() == tclass.defaultLayout()) {
|
||||||
BufferParams const & bufparams = buf.params();
|
recordUndo(cur, Undo::ATOMIC, prevcur.pit());
|
||||||
LyXTextClass const & tclass = bufparams.getLyXTextClass();
|
mergeParagraph(bufparams, plist, prevcur.pit());
|
||||||
pit_type const cpit = cur.pit();
|
|
||||||
|
|
||||||
if (cpit != tmppit
|
|
||||||
&& (pars_[cpit].layout() == pars_[tmppit].layout()
|
|
||||||
|| pars_[tmppit].layout() == tclass.defaultLayout()))
|
|
||||||
{
|
|
||||||
mergeParagraph(bufparams, pars_, cpit);
|
|
||||||
needsUpdate = true;
|
needsUpdate = true;
|
||||||
|
|
||||||
if (cur.pos() != 0 && pars_[cpit].isSeparator(cur.pos() - 1))
|
|
||||||
--cur.pos();
|
|
||||||
|
|
||||||
// the counters may have changed
|
|
||||||
updateCounters(cur.buffer());
|
|
||||||
setCursor(cur, cur.pit(), cur.pos(), false);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (needsUpdate) {
|
||||||
|
updateCounters(cur.buffer());
|
||||||
|
setCursorIntern(cur, prevcur.pit(), prevcur.pos());
|
||||||
|
}
|
||||||
|
|
||||||
return needsUpdate;
|
return needsUpdate;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1701,11 +1682,7 @@ bool LyXText::backspace(LCursor & cur)
|
|||||||
if (cur.pit() == 0)
|
if (cur.pit() == 0)
|
||||||
return dissolveInset(cur);
|
return dissolveInset(cur);
|
||||||
|
|
||||||
// The cursor is at the beginning of a paragraph, so
|
if (cur.buffer().params().tracking_changes) {
|
||||||
// the the backspace will collapse two paragraphs into
|
|
||||||
// one.
|
|
||||||
|
|
||||||
if (cur.pit() != 0 && cur.buffer().params().tracking_changes) {
|
|
||||||
// Previous paragraph, mark "carriage return" as
|
// Previous paragraph, mark "carriage return" as
|
||||||
// deleted:
|
// deleted:
|
||||||
Paragraph & par = pars_[cur.pit() - 1];
|
Paragraph & par = pars_[cur.pit() - 1];
|
||||||
@ -1717,6 +1694,8 @@ bool LyXText::backspace(LCursor & cur)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// The cursor is at the beginning of a paragraph, so
|
||||||
|
// the backspace will collapse two paragraphs into one.
|
||||||
needsUpdate = backspacePos0(cur);
|
needsUpdate = backspacePos0(cur);
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
@ -1727,8 +1706,7 @@ bool LyXText::backspace(LCursor & cur)
|
|||||||
// not a good idea since it triggers the auto-delete
|
// not a good idea since it triggers the auto-delete
|
||||||
// mechanism. So we do a cursorLeftIntern()-lite,
|
// mechanism. So we do a cursorLeftIntern()-lite,
|
||||||
// without the dreaded mechanism. (JMarc)
|
// without the dreaded mechanism. (JMarc)
|
||||||
setCursorIntern(cur, cur.pit(), cur.pos() - 1,
|
setCursorIntern(cur, cur.pit(), cur.pos() - 1);
|
||||||
false, cur.boundary());
|
|
||||||
cur.paragraph().erase(cur.pos());
|
cur.paragraph().erase(cur.pos());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -54,6 +54,10 @@ What's new
|
|||||||
windows). This fix was already used by the official windows installer for
|
windows). This fix was already used by the official windows installer for
|
||||||
1.4.3.
|
1.4.3.
|
||||||
|
|
||||||
|
- Fix deletion of empty paragraph in various situations: paragraphs
|
||||||
|
with different layouts, layouts with KeepEmpty property, ERT insets
|
||||||
|
(bugs 2587 and 2882)
|
||||||
|
|
||||||
- Fix cursor positioning when opening the VSpace dialog (bug 2869).
|
- Fix cursor positioning when opening the VSpace dialog (bug 2869).
|
||||||
|
|
||||||
- Give a better error message for missing layout include files
|
- Give a better error message for missing layout include files
|
||||||
|
Loading…
x
Reference in New Issue
Block a user