mirror of
https://git.lyx.org/repos/lyx.git
synced 2024-11-05 13:26:21 +00:00
Improve Inset dissolve capability (bug 2201).
* src/insets/insettabular.C (getStatus): * src/insets/insettext.C (doDispatch,getStatus): remove special code for LFUN_INSET_DISSOLVE. * src/text.C (dissolveInset): new method. (erase, backspace): use dissolveInset. * src/text3.C (dispatch): use dissolveInset for LFUN_INSET_DISSOLVE. (getStatus): disable LFUN_INSET_DISSOLVE if the inset has more than one cell. git-svn-id: svn://svn.lyx.org/lyx/lyx-devel/trunk@14940 a592a061-630c-0410-9148-cb99ea01b6c8
This commit is contained in:
parent
45808381d0
commit
fe8d08d72f
@ -1045,28 +1045,6 @@ bool InsetTabular::getStatus(LCursor & cur, FuncRequest const & cmd,
|
||||
return true;
|
||||
}
|
||||
|
||||
case LFUN_INSET_DISSOLVE: {
|
||||
status.enabled(false);
|
||||
return true;
|
||||
}
|
||||
|
||||
// because of the dissolve handling in insettext:
|
||||
case LFUN_CHAR_DELETE_FORWARD:
|
||||
if (!cur.selection() && cur.depth() > 1
|
||||
&& cur.pit() == cur.lastpit()
|
||||
&& cur.pos() == cur.lastpos()) {
|
||||
status.enabled(false);
|
||||
return true;
|
||||
}
|
||||
// Fall through
|
||||
|
||||
case LFUN_CHAR_DELETE_BACKWARD:
|
||||
if (cur.depth() > 1 && cur.pit() == 0 && cur.pos() == 0) {
|
||||
status.enabled(false);
|
||||
return true;
|
||||
}
|
||||
// Fall through
|
||||
|
||||
case LFUN_INSET_MODIFY:
|
||||
if (translate(cmd.getArg(0)) == TABULAR_CODE) {
|
||||
status.enabled(true);
|
||||
|
@ -22,7 +22,6 @@
|
||||
#include "dispatchresult.h"
|
||||
#include "errorlist.h"
|
||||
#include "funcrequest.h"
|
||||
#include "FuncStatus.h"
|
||||
#include "gettext.h"
|
||||
#include "intl.h"
|
||||
#include "LColor.h"
|
||||
@ -268,47 +267,14 @@ void InsetText::doDispatch(LCursor & cur, FuncRequest & cmd)
|
||||
<< " [ cmd.action = "
|
||||
<< cmd.action << ']' << endl;
|
||||
setViewCache(&cur.bv());
|
||||
|
||||
switch (cmd.action) {
|
||||
|
||||
case LFUN_CHAR_DELETE_FORWARD: {
|
||||
if (!cur.selection() && cur.depth() > 1
|
||||
&& cur.pit() == cur.lastpit()
|
||||
&& cur.pos() == cur.lastpos())
|
||||
// Merge inset with owner
|
||||
cmd = FuncRequest(LFUN_INSET_DISSOLVE);
|
||||
text_.dispatch(cur, cmd);
|
||||
break;
|
||||
}
|
||||
|
||||
case LFUN_CHAR_DELETE_BACKWARD: {
|
||||
if (cur.depth() > 1 && cur.pit() == 0 && cur.pos() == 0)
|
||||
// Merge inset with owner
|
||||
cmd = FuncRequest(LFUN_INSET_DISSOLVE);
|
||||
text_.dispatch(cur, cmd);
|
||||
break;
|
||||
}
|
||||
|
||||
default:
|
||||
text_.dispatch(cur, cmd);
|
||||
break;
|
||||
}
|
||||
text_.dispatch(cur, cmd);
|
||||
}
|
||||
|
||||
|
||||
bool InsetText::getStatus(LCursor & cur, FuncRequest const & cmd,
|
||||
FuncStatus & status) const
|
||||
{
|
||||
switch (cmd.action) {
|
||||
|
||||
case LFUN_CHAR_DELETE_FORWARD:
|
||||
case LFUN_CHAR_DELETE_BACKWARD:
|
||||
status.enabled(true);
|
||||
return true;
|
||||
|
||||
default:
|
||||
return text_.getStatus(cur, cmd, status);
|
||||
}
|
||||
return text_.getStatus(cur, cmd, status);
|
||||
}
|
||||
|
||||
|
||||
|
@ -232,6 +232,8 @@ public:
|
||||
bool backspacePos0(LCursor & cur);
|
||||
/// Delete character before cursor. Honour CT
|
||||
bool backspace(LCursor & cur);
|
||||
// Dissolve the inset under cursor
|
||||
bool dissolveInset(LCursor & cur);
|
||||
///
|
||||
bool selectWordWhenUnderCursor(LCursor & cur, lyx::word_location);
|
||||
///
|
||||
|
42
src/text.C
42
src/text.C
@ -88,6 +88,7 @@ using lyx::support::split;
|
||||
using lyx::support::uppercase;
|
||||
|
||||
using lyx::cap::cutSelection;
|
||||
using lyx::cap::pasteParagraphList;
|
||||
|
||||
using std::auto_ptr;
|
||||
using std::advance;
|
||||
@ -1671,7 +1672,9 @@ bool LyXText::erase(LCursor & cur)
|
||||
} else {
|
||||
setCursorIntern(scur, scur.pit(), scur.pos(), false, scur.boundary());
|
||||
}
|
||||
}
|
||||
} else
|
||||
needsUpdate = dissolveInset(cur);
|
||||
|
||||
return needsUpdate;
|
||||
}
|
||||
|
||||
@ -1757,6 +1760,9 @@ bool LyXText::backspace(LCursor & cur)
|
||||
BOOST_ASSERT(this == cur.text());
|
||||
bool needsUpdate = false;
|
||||
if (cur.pos() == 0) {
|
||||
if (cur.pit() == 0)
|
||||
return dissolveInset(cur);
|
||||
|
||||
// The cursor is at the beginning of a paragraph, so
|
||||
// the the backspace will collapse two paragraphs into
|
||||
// one.
|
||||
@ -1797,6 +1803,40 @@ bool LyXText::backspace(LCursor & cur)
|
||||
}
|
||||
|
||||
|
||||
bool LyXText::dissolveInset(LCursor & cur) {
|
||||
BOOST_ASSERT(this == cur.text());
|
||||
|
||||
if (isMainText() || cur.inset().nargs() != 1)
|
||||
return false;
|
||||
|
||||
recordUndoInset(cur);
|
||||
cur.selHandle(false);
|
||||
// save position
|
||||
lyx::pos_type spos = cur.pos();
|
||||
lyx::pit_type spit = cur.pit();
|
||||
ParagraphList plist;
|
||||
if (cur.lastpit() != 0 || cur.lastpos() != 0)
|
||||
plist = paragraphs();
|
||||
cur.popLeft();
|
||||
// store cursor offset
|
||||
if (spit == 0)
|
||||
spos += cur.pos();
|
||||
spit += cur.pit();
|
||||
cur.paragraph().erase(cur.pos());
|
||||
if (!plist.empty()) {
|
||||
Buffer & b = cur.buffer();
|
||||
pasteParagraphList(cur, plist, b.params().textclass,
|
||||
b.errorList("Paste"));
|
||||
// restore position
|
||||
cur.pit() = std::min(cur.lastpit(), spit);
|
||||
cur.pos() = std::min(cur.lastpos(), spos);
|
||||
}
|
||||
cur.clearSelection();
|
||||
cur.resetAnchor();
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
Row const & LyXText::firstRow() const
|
||||
{
|
||||
return *paragraphs().front().rows().begin();
|
||||
|
41
src/text3.C
41
src/text3.C
@ -79,7 +79,6 @@ using lyx::pos_type;
|
||||
|
||||
using lyx::cap::copySelection;
|
||||
using lyx::cap::cutSelection;
|
||||
using lyx::cap::pasteParagraphList;
|
||||
using lyx::cap::pasteSelection;
|
||||
using lyx::cap::replaceSelection;
|
||||
|
||||
@ -709,34 +708,9 @@ void LyXText::dispatch(LCursor & cur, FuncRequest & cmd)
|
||||
break;
|
||||
}
|
||||
|
||||
case LFUN_INSET_DISSOLVE: {
|
||||
recordUndoInset(cur);
|
||||
cur.selHandle(false);
|
||||
// save position
|
||||
lyx::pos_type spos = cur.pos();
|
||||
lyx::pit_type spit = cur.pit();
|
||||
ParagraphList plist;
|
||||
if (cur.lastpit() != 0 || cur.lastpos() != 0)
|
||||
plist = paragraphs();
|
||||
cur.popLeft();
|
||||
// store cursor offset
|
||||
if (spit == 0)
|
||||
spos += cur.pos();
|
||||
spit += cur.pit();
|
||||
cur.paragraph().erase(cur.pos());
|
||||
if (!plist.empty()) {
|
||||
Buffer * b = bv->buffer();
|
||||
pasteParagraphList(cur, plist, b->params().textclass,
|
||||
b->errorList("Paste"));
|
||||
// restore position
|
||||
cur.pit() = std::min(cur.lastpit(), spit);
|
||||
cur.pos() = std::min(cur.lastpos(), spos);
|
||||
}
|
||||
cur.clearSelection();
|
||||
cur.resetAnchor();
|
||||
needsUpdate = true;
|
||||
case LFUN_INSET_DISSOLVE:
|
||||
needsUpdate = dissolveInset(cur);
|
||||
break;
|
||||
}
|
||||
|
||||
case LFUN_INSET_SETTINGS:
|
||||
cur.inset().showInsetDialog(bv);
|
||||
@ -1720,20 +1694,17 @@ bool LyXText::getStatus(LCursor & cur, FuncRequest const & cmd,
|
||||
enable = lyx::cap::numberOfSelections() > 0;
|
||||
break;
|
||||
|
||||
case LFUN_PARAGRAPH_MOVE_UP: {
|
||||
case LFUN_PARAGRAPH_MOVE_UP:
|
||||
enable = cur.pit() > 0 && !cur.selection();
|
||||
break;
|
||||
}
|
||||
|
||||
case LFUN_PARAGRAPH_MOVE_DOWN: {
|
||||
case LFUN_PARAGRAPH_MOVE_DOWN:
|
||||
enable = cur.pit() < cur.lastpit() && !cur.selection();
|
||||
break;
|
||||
}
|
||||
|
||||
case LFUN_INSET_DISSOLVE: {
|
||||
enable = !isMainText() && cur.inTexted();
|
||||
case LFUN_INSET_DISSOLVE:
|
||||
enable = !isMainText() && cur.inset().nargs() == 1;
|
||||
break;
|
||||
}
|
||||
|
||||
case LFUN_WORD_DELETE_FORWARD:
|
||||
case LFUN_WORD_DELETE_BACKWARD:
|
||||
|
Loading…
Reference in New Issue
Block a user