aboutsummaryrefslogtreecommitdiffhomepage
path: root/undo.h
diff options
context:
space:
mode:
authorRobin Haberkorn <robin.haberkorn@googlemail.com>2012-11-06 20:42:40 +0100
committerRobin Haberkorn <robin.haberkorn@googlemail.com>2012-11-06 20:42:40 +0100
commit8cd29b9b30400e4275f1a65744cd0b3c2669cc98 (patch)
treef6297b44f6b7d9d6546311878070383d2d064f45 /undo.h
downloadsciteco-8cd29b9b30400e4275f1a65744cd0b3c2669cc98.tar.gz
initial commit of SciTECO based on THECO
Diffstat (limited to 'undo.h')
-rw-r--r--undo.h82
1 files changed, 82 insertions, 0 deletions
diff --git a/undo.h b/undo.h
new file mode 100644
index 0000000..29ec70f
--- /dev/null
+++ b/undo.h
@@ -0,0 +1,82 @@
+#ifndef __UNDO_H
+#define __UNDO_H
+
+#include <bsd/sys/queue.h>
+
+#include <glib.h>
+
+#include <Scintilla.h>
+
+class UndoToken {
+public:
+ SLIST_ENTRY(UndoToken) tokens;
+
+ gint pos;
+
+ UndoToken();
+
+ virtual void run() = 0;
+};
+
+class UndoTokenMessage : public UndoToken {
+ unsigned int iMessage;
+ uptr_t wParam;
+ sptr_t lParam;
+
+public:
+ UndoTokenMessage(unsigned int _iMessage,
+ uptr_t _wParam = 0, sptr_t _lParam = 0)
+ : UndoToken(), iMessage(_iMessage),
+ wParam(_wParam), lParam(_lParam) {}
+
+ void run(void);
+};
+
+template <typename Type>
+class UndoTokenVariable : public UndoToken {
+ Type *ptr;
+ Type value;
+
+public:
+ UndoTokenVariable(Type &variable, Type _value)
+ : UndoToken(), ptr(&variable), value(_value) {}
+
+ void
+ run(void)
+ {
+ *ptr = value;
+ }
+};
+
+extern class UndoStack {
+ SLIST_HEAD(undo_head, UndoToken) head;
+
+public:
+ UndoStack()
+ {
+ SLIST_INIT(&head);
+ }
+ ~UndoStack();
+
+ void push_msg(unsigned int iMessage,
+ uptr_t wParam = 0, sptr_t lParam = 0);
+
+ template <typename Type>
+ void
+ push_var(Type &variable, Type value)
+ {
+ UndoToken *token = new UndoTokenVariable<Type>(variable, value);
+ SLIST_INSERT_HEAD(&head, token, tokens);
+ }
+
+ template <typename Type>
+ inline void
+ push_var(Type &variable)
+ {
+ push_var<Type>(variable, variable);
+ }
+
+ void pop(gint pos);
+} undo;
+
+#endif \ No newline at end of file