summaryrefslogtreecommitdiffstats
path: root/generic/tkUndo.h
blob: a8b053e5e54b58170dab537c3625aa26a1de6273 (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
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
/*
 * tkUndo.h --
 *
 *	Declarations shared among the files that implement an undo stack.
 *
 * Copyright (c) 2002 Ludwig Callewaert.
 *
 * See the file "license.terms" for information on usage and redistribution of
 * this file, and for a DISCLAIMER OF ALL WARRANTIES.
 *
 * RCS: @(#) $Id: tkUndo.h,v 1.4 2005/11/15 15:18:22 dkf Exp $
 */

#ifndef _TKUNDO
#define _TKUNDO

#ifndef _TK
#include "tk.h"
#endif

#ifdef BUILD_tk
# undef TCL_STORAGE_CLASS
# define TCL_STORAGE_CLASS DLLEXPORT
#endif

/*
 * Enum definining the types used in an undo stack.
 */

typedef enum {
    TK_UNDO_SEPARATOR,		/* Marker */
    TK_UNDO_ACTION		/* Command */
} TkUndoAtomType;

/*
 * Callback proc type to carry out an undo or redo action via C code. (Actions
 * can also be defined by Tcl scripts).
 */

typedef int (TkUndoProc)(Tcl_Interp *interp, ClientData clientData,
			Tcl_Obj *objPtr);

/*
 * Struct defining a single action, one or more of which may be defined (and
 * stored in a linked list) separately for each undo and redo action of an
 * undo atom.
 */

typedef struct TkUndoSubAtom {
    Tcl_Command command;	/* Tcl token used to get the current Tcl
				 * command name which will be used to execute
				 * apply/revert scripts. If NULL then it is
				 * assumed the apply/revert scripts already
				 * contain everything. */
    TkUndoProc *funcPtr;        /* Function pointer for callback to perform
				 * undo/redo actions. */
    ClientData clientData;      /* data for 'funcPtr' */
    Tcl_Obj *action;		/* Command to apply the action that was
				 * taken */
    struct TkUndoSubAtom *next; /* Pointer to the next element in the linked
				 * list */
} TkUndoSubAtom;

/*
 * Struct representing a single undo+redo atom to be placed in the stack.
 */

typedef struct TkUndoAtom {
    TkUndoAtomType type;	/* The type that will trigger the required
				 * action. */
    TkUndoSubAtom *apply;       /* Linked list of 'apply' actions to perform
                                 * for this operation. */
    TkUndoSubAtom *revert;      /* Linked list of 'revert' actions to perform
                                 * for this operation. */
    struct TkUndoAtom *next;	/* Pointer to the next element in the stack */
} TkUndoAtom;

/*
 * Struct defining a single undo+redo stack.
 */

typedef struct TkUndoRedoStack {
    TkUndoAtom *undoStack;	/* The undo stack */
    TkUndoAtom *redoStack;	/* The redo stack */
    Tcl_Interp *interp;		/* The interpreter in which to execute the
				 * revert and apply scripts */
    int maxdepth;
    int depth;
} TkUndoRedoStack;

/*
 * Basic functions.
 */

EXTERN void		TkUndoPushStack(TkUndoAtom **stack, TkUndoAtom *elem);
EXTERN TkUndoAtom *	TkUndoPopStack(TkUndoAtom **stack);
EXTERN int		TkUndoInsertSeparator(TkUndoAtom **stack);
EXTERN void		TkUndoClearStack(TkUndoAtom **stack);

/*
 * Functions for working on an undo/redo stack.
 */

EXTERN TkUndoRedoStack *TkUndoInitStack(Tcl_Interp *interp, int maxdepth);
EXTERN void		TkUndoSetDepth(TkUndoRedoStack *stack, int maxdepth);
EXTERN void		TkUndoClearStacks(TkUndoRedoStack *stack);
EXTERN void		TkUndoFreeStack(TkUndoRedoStack *stack);
EXTERN void		TkUndoInsertUndoSeparator(TkUndoRedoStack *stack);
EXTERN TkUndoSubAtom *	TkUndoMakeCmdSubAtom(Tcl_Command command,
			    Tcl_Obj *actionScript, TkUndoSubAtom *subAtomList);
EXTERN TkUndoSubAtom *	TkUndoMakeSubAtom(TkUndoProc *funcPtr,
			    ClientData clientData, Tcl_Obj *actionScript,
			    TkUndoSubAtom *subAtomList);
EXTERN void		TkUndoPushAction(TkUndoRedoStack *stack,
			    TkUndoSubAtom *apply, TkUndoSubAtom *revert);
EXTERN int		TkUndoRevert(TkUndoRedoStack *stack);
EXTERN int		TkUndoApply(TkUndoRedoStack *stack);

# undef TCL_STORAGE_CLASS
# define TCL_STORAGE_CLASS DLLIMPORT

#endif /* _TKUNDO */