Statistics
| Revision:

svn-gvsig-desktop / trunk / libraries / libDataSource / src / org / gvsig / data / commands / CommandsRecord.java @ 20606

History | View | Annotate | Download (7.16 KB)

1
package org.gvsig.data.commands;
2

    
3
import java.util.ArrayList;
4
import java.util.List;
5
import java.util.Stack;
6

    
7
import org.gvsig.data.commands.implementation.AttributeCommand;
8
import org.gvsig.data.commands.implementation.FeatureCommand;
9
import org.gvsig.util.observer.IObserver;
10
import org.gvsig.util.observer.Observable;
11

    
12
/**
13
 * Clase en memoria para registrar y gestionar los comandos que vamos
14
 * realizando. La forma en que ha sido implementada esta clase, en vez de una
15
 * ?nica lista para albergar los comandos de deshacer(undos) y los de
16
 * rehacer(redos), se ha optado por dos pilas una para deshacer(undos) y otra
17
 * para rehacer(redos), de esta forma :  Cuando se a?ade un nuevo comando, se
18
 * inserta este a la pila de deshacer(undos) y se borra de la de
19
 * rehacer(redos). Si se realiza un deshacer se desapila este comando de la
20
 * pila deshacer(undos) y se apila en la de rehacer(redos). Y de la misma
21
 * forma cuando se realiza un rehacer se desapila este comando de la pila de
22
 * rehacer(redos) y pasa a la de deshacer(undos).
23
 *
24
 * @author Vicente Caballero Navarro
25
 */
26
public abstract class CommandsRecord implements ICommandsRecord {
27
        private Stack undos = new Stack();
28
        private Stack redos = new Stack();
29
        private boolean refresh=true;
30
        private int undosCount=0;
31
        private Observable observable=new Observable();
32
//        private ComplexObservable observable=new ComplexObservable();
33
        /* (non-Javadoc)
34
         * @see org.gvsig.data.commands.ICommandsRecord#add(org.gvsig.data.commands.ICommand)
35
         */
36
        public void add(ICommand command){
37
                undos.add(command);
38
                redos.clear();
39
                refresh=true;
40
                observable.notifyObservers(this,new CommandNotification(command,CommandNotification.ADD));
41
        }
42

    
43
        /* (non-Javadoc)
44
         * @see org.gvsig.data.commands.ICommandsRecord#undo()
45
         */
46
        public void undo() {
47
                ICommand command = (ICommand)undos.pop();
48
                command.undo();
49
                redos.add(command);
50
                observable.notifyObservers(this,new CommandNotification(command,CommandNotification.UNDO));
51
        }
52

    
53
        /* (non-Javadoc)
54
         * @see org.gvsig.data.commands.ICommandsRecord#redo()
55
         */
56
        public void redo() {
57
                ICommand command = (ICommand)redos.pop();
58
                command.redo();
59
                undos.add(command);
60
                observable.notifyObservers(this,new CommandNotification(command,CommandNotification.REDO));
61
        }
62

    
63
        /* (non-Javadoc)
64
         * @see org.gvsig.data.commands.ICommandsRecord#moreUndoCommands()
65
         */
66
        public boolean moreUndoCommands() {
67
                return (!undos.isEmpty());
68
        }
69

    
70
        /* (non-Javadoc)
71
         * @see org.gvsig.data.commands.ICommandsRecord#moreRedoCommands()
72
         */
73
        public boolean moreRedoCommands() {
74
                return (!redos.isEmpty());
75
        }
76
        /* (non-Javadoc)
77
         * @see org.gvsig.data.commands.ICommandsRecord#getUndoCommands()
78
         */
79
        public List getUndoCommands(){
80
                Stack clonedUndos=(Stack)undos.clone();
81

    
82
                ArrayList commands=new ArrayList();
83
                while (!clonedUndos.isEmpty()){
84
                        commands.add(clonedUndos.pop());
85
                }
86

    
87
                return commands;
88
        }
89
        /* (non-Javadoc)
90
         * @see org.gvsig.data.commands.ICommandsRecord#getRedoCommands()
91
         */
92
        public List getRedoCommands(){
93
                Stack clonedRedos=(Stack)redos.clone();
94

    
95
                ArrayList commands=new ArrayList();
96
                while (!clonedRedos.isEmpty()){
97
                        commands.add(clonedRedos.pop());
98
                }
99
                return commands;
100
        }
101
        /* (non-Javadoc)
102
         * @see org.gvsig.data.commands.ICommandsRecord#getPointer()
103
         */
104
        public int getPointer(){
105
                if (refresh){
106
                        undosCount=undos.size()-1;
107
                }
108
                return undosCount;
109
        }
110
        /* (non-Javadoc)
111
         * @see org.gvsig.data.commands.ICommandsRecord#setPointer(int)
112
         */
113
        public void setPointer(int newpos){
114
                int pos=getPointer();
115
                if (newpos>pos){
116
                        for (int i=pos;i<newpos;i++){
117
                                redo();
118
                                System.out.println("redos = "+i);
119
                        }
120
                }else if (pos>newpos){
121
                        for (int i=pos-1;i>=newpos;i--){
122
                                undo();
123
                                System.out.println("undos = "+i);
124
                        }
125
                }
126
        }
127
        /* (non-Javadoc)
128
         * @see org.gvsig.data.commands.ICommandsRecord#size()
129
         */
130
        public int size() {
131
                return undos.size()+redos.size();
132
        }
133

    
134
        /* (non-Javadoc)
135
         * @see org.gvsig.data.commands.ICommandsRecord#clear()
136
         */
137
        public void clear() {
138
                redos.clear();
139
                undos.clear();
140
        }
141

    
142
        /* (non-Javadoc)
143
         * @see org.gvsig.data.commands.ICommandsRecord#getNextUndoCommand()
144
         */
145
        public ICommand getNextUndoCommand() {
146
                return (ICommand)undos.peek();
147
        }
148

    
149
        /* (non-Javadoc)
150
         * @see org.gvsig.data.commands.ICommandsRecord#getNextRedoCommand()
151
         */
152
        public ICommand getNextRedoCommand() {
153
                return (ICommand)redos.peek();
154
        }
155

    
156
        /* (non-Javadoc)
157
         * @see org.gvsig.data.IObservable#addObserver(java.util.Observer)
158
         */
159
        public void addObserver(IObserver o) {
160
                observable.addObserver(o);
161

    
162
        }
163

    
164
        /* (non-Javadoc)
165
         * @see org.gvsig.data.IObservable#deleteObserver(java.util.Observer)
166
         */
167
        public void deleteObserver(IObserver o) {
168
                observable.deleteObserver(o);
169
        }
170

    
171
        /* (non-Javadoc)
172
         * @see org.gvsig.data.IObservable#deleteObservers()
173
         */
174
        public void deleteObservers() {
175
                observable.deleteObservers();
176
        }
177
        public List getCommandsFeatureDeleted() { // List of IFeature
178
                Stack clonedUndos=(Stack)undos.clone();
179

    
180
                ArrayList commands=new ArrayList();
181
                while (!clonedUndos.isEmpty()){
182
                        ICommand command=(ICommand)clonedUndos.pop();
183
                        if (command.getType().equals(ICommand.DELETE) && command instanceof FeatureCommand)
184
                                commands.add(command);
185
                }
186

    
187
                return commands;
188
        }
189

    
190
        public List getCommandsFeatureUpdated() { // List of IFeature
191
                Stack clonedUndos=(Stack)undos.clone();
192

    
193
                ArrayList commands=new ArrayList();
194
                while (!clonedUndos.isEmpty()){
195
                        ICommand command=(ICommand)clonedUndos.pop();
196
                        if (command.getType().equals(ICommand.UPDATE) && command instanceof FeatureCommand)
197
                                commands.add(command);
198
                }
199

    
200
                return commands;
201
        }
202
        public List getCommandsFeatureInserted() { // List of IFeature
203
                Stack clonedUndos=(Stack)undos.clone();
204

    
205
                ArrayList commands=new ArrayList();
206
                while (!clonedUndos.isEmpty()){
207
                        ICommand command=(ICommand)clonedUndos.pop();
208
                        if (command.getType().equals(ICommand.INSERT) && command instanceof FeatureCommand)
209
                                commands.add(command);
210
                }
211

    
212
                return commands;
213
        }
214

    
215
        public List getCommandsAttributeDeleted() { // List of IFeature
216
                Stack clonedUndos=(Stack)undos.clone();
217

    
218
                ArrayList commands=new ArrayList();
219
                while (!clonedUndos.isEmpty()){
220
                        ICommand command=(ICommand)clonedUndos.pop();
221
                        if (command.getType().equals(ICommand.DELETE) && command instanceof AttributeCommand)
222
                                commands.add(command);
223
                }
224

    
225
                return commands;
226
        }
227

    
228
        public List getCommandsAttributeUpdated() { // List of IFeature
229
                Stack clonedUndos=(Stack)undos.clone();
230

    
231
                ArrayList commands=new ArrayList();
232
                while (!clonedUndos.isEmpty()){
233
                        ICommand command=(ICommand)clonedUndos.pop();
234
                        if (command.getType().equals(ICommand.UPDATE) && command instanceof AttributeCommand)
235
                                commands.add(command);
236
                }
237

    
238
                return commands;
239
        }
240
        public List getCommandsAttributeInserted() { // List of IFeature
241
                Stack clonedUndos=(Stack)undos.clone();
242

    
243
                ArrayList commands=new ArrayList();
244
                while (!clonedUndos.isEmpty()){
245
                        ICommand command=(ICommand)clonedUndos.pop();
246
                        if (command.getType().equals(ICommand.INSERT) && command instanceof AttributeCommand)
247
                                commands.add(command);
248
                }
249

    
250
                return commands;
251
        }
252

    
253
}