aboutsummaryrefslogtreecommitdiffhomepage
path: root/src
diff options
context:
space:
mode:
authornyamatongwe <unknown>2009-04-04 23:00:39 +0000
committernyamatongwe <unknown>2009-04-04 23:00:39 +0000
commit89db940cd0d6f3a2da913bc0098c777c5c7c50ee (patch)
tree333fb21b39eee1201632805511bdc539ea23f9dc /src
parent977371ca0595af895bf255b135292e12f80eff01 (diff)
downloadscintilla-mirror-89db940cd0d6f3a2da913bc0098c777c5c7c50ee.tar.gz
Added AddUndoAction call for adding application actions into undo stack.
Diffstat (limited to 'src')
-rw-r--r--src/CellBuffer.cxx8
-rw-r--r--src/CellBuffer.h3
-rw-r--r--src/Document.cxx24
-rw-r--r--src/Document.h8
-rw-r--r--src/Editor.cxx5
5 files changed, 39 insertions, 9 deletions
diff --git a/src/CellBuffer.cxx b/src/CellBuffer.cxx
index 0e9ae6950..ccb357a41 100644
--- a/src/CellBuffer.cxx
+++ b/src/CellBuffer.cxx
@@ -424,6 +424,9 @@ void UndoHistory::AppendAction(actionType at, int position, char *data, int leng
} else if (!actions[currentAction].mayCoalesce) {
// Not allowed to coalesce if this set
currentAction++;
+ } else if (at == containerAction) {
+ // Not allowed to coalesce container actions
+ currentAction++;
} else if (at == removeAction) {
if ((lengthData == 1) || (lengthData == 2)){
if ((position + lengthData) == actPrevious.position) {
@@ -862,6 +865,11 @@ void CellBuffer::EndUndoAction() {
uh.EndUndoAction();
}
+void CellBuffer::AddUndoAction(int token) {
+ bool startSequence;
+ uh.AppendAction(containerAction, token, 0, 0, startSequence);
+}
+
void CellBuffer::DeleteUndoHistory() {
uh.DeleteUndoHistory();
}
diff --git a/src/CellBuffer.h b/src/CellBuffer.h
index 4b83f48e0..6cf8ad056 100644
--- a/src/CellBuffer.h
+++ b/src/CellBuffer.h
@@ -83,7 +83,7 @@ public:
int LineFromHandle(int markerHandle);
};
-enum actionType { insertAction, removeAction, startAction };
+enum actionType { insertAction, removeAction, startAction, containerAction };
/**
* Actions are used to store all the information required to perform one undo/redo step.
@@ -213,6 +213,7 @@ public:
bool IsCollectingUndo();
void BeginUndoAction();
void EndUndoAction();
+ void AddUndoAction(int token);
void DeleteUndoHistory();
/// To perform an undo, StartUndo is called to retrieve the number of steps, then UndoStep is
diff --git a/src/Document.cxx b/src/Document.cxx
index 611da25a0..e5913ad98 100644
--- a/src/Document.cxx
+++ b/src/Document.cxx
@@ -503,21 +503,27 @@ int Document::Undo() {
if (action.at == removeAction) {
NotifyModified(DocModification(
SC_MOD_BEFOREINSERT | SC_PERFORMED_UNDO, action));
+ } else if (action.at == containerAction) {
+ DocModification dm(SC_MOD_CONTAINER | SC_PERFORMED_UNDO);
+ dm.token = action.position;
+ NotifyModified(dm);
} else {
NotifyModified(DocModification(
SC_MOD_BEFOREDELETE | SC_PERFORMED_UNDO, action));
}
cb.PerformUndoStep();
int cellPosition = action.position;
- ModifiedAt(cellPosition);
- newPos = cellPosition;
+ if (action.at != containerAction) {
+ ModifiedAt(cellPosition);
+ newPos = cellPosition;
+ }
int modFlags = SC_PERFORMED_UNDO;
// With undo, an insertion action becomes a deletion notification
if (action.at == removeAction) {
newPos += action.lenData;
modFlags |= SC_MOD_INSERTTEXT;
- } else {
+ } else if (action.at == insertAction) {
modFlags |= SC_MOD_DELETETEXT;
}
if (steps > 1)
@@ -558,19 +564,25 @@ int Document::Redo() {
if (action.at == insertAction) {
NotifyModified(DocModification(
SC_MOD_BEFOREINSERT | SC_PERFORMED_REDO, action));
+ } else if (action.at == containerAction) {
+ DocModification dm(SC_MOD_CONTAINER | SC_PERFORMED_REDO);
+ dm.token = action.position;
+ NotifyModified(dm);
} else {
NotifyModified(DocModification(
SC_MOD_BEFOREDELETE | SC_PERFORMED_REDO, action));
}
cb.PerformRedoStep();
- ModifiedAt(action.position);
- newPos = action.position;
+ if (action.at != containerAction) {
+ ModifiedAt(action.position);
+ newPos = action.position;
+ }
int modFlags = SC_PERFORMED_REDO;
if (action.at == insertAction) {
newPos += action.lenData;
modFlags |= SC_MOD_INSERTTEXT;
- } else {
+ } else if (action.at == removeAction) {
modFlags |= SC_MOD_DELETETEXT;
}
if (steps > 1)
diff --git a/src/Document.h b/src/Document.h
index 0457b475b..2e8c43eeb 100644
--- a/src/Document.h
+++ b/src/Document.h
@@ -173,6 +173,7 @@ public:
bool IsCollectingUndo() { return cb.IsCollectingUndo(); }
void BeginUndoAction() { cb.BeginUndoAction(); }
void EndUndoAction() { cb.EndUndoAction(); }
+ void AddUndoAction(int token) { cb.AddUndoAction(token); }
void SetSavePoint();
bool IsSavePoint() { return cb.IsSavePoint(); }
const char *BufferPointer() { return cb.BufferPointer(); }
@@ -288,6 +289,7 @@ public:
int line;
int foldLevelNow;
int foldLevelPrev;
+ int token;
DocModification(int modificationType_, int position_=0, int length_=0,
int linesAdded_=0, const char *text_=0, int line_=0) :
@@ -298,7 +300,8 @@ public:
text(text_),
line(line_),
foldLevelNow(0),
- foldLevelPrev(0) {}
+ foldLevelPrev(0),
+ token(0) {}
DocModification(int modificationType_, const Action &act, int linesAdded_=0) :
modificationType(modificationType_),
@@ -308,7 +311,8 @@ public:
text(act.data),
line(0),
foldLevelNow(0),
- foldLevelPrev(0) {}
+ foldLevelPrev(0),
+ token(0) {}
};
/**
diff --git a/src/Editor.cxx b/src/Editor.cxx
index 7ba26bb53..5d709fe06 100644
--- a/src/Editor.cxx
+++ b/src/Editor.cxx
@@ -3961,6 +3961,7 @@ void Editor::NotifyModified(Document*, DocModification mh, void *) {
scn.line = mh.line;
scn.foldLevelNow = mh.foldLevelNow;
scn.foldLevelPrev = mh.foldLevelPrev;
+ scn.token = mh.token;
NotifyParent(scn);
}
}
@@ -7635,6 +7636,10 @@ sptr_t Editor::WndProc(unsigned int iMessage, uptr_t wParam, sptr_t lParam) {
case SCI_GETEXTRADESCENT:
return vs.extraDescent;
+ case SCI_ADDUNDOACTION:
+ pdoc->AddUndoAction(wParam);
+ break;
+
default:
return DefWndProc(iMessage, wParam, lParam);
}