aboutsummaryrefslogtreecommitdiffhomepage
path: root/undo.h
blob: 29ec70ffe0a9a4305fb1bd8e64b2b87a93a0c316 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
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