OSDN Git Service

b28a9c00b8ab07bfd3da483da4e35be608082c58
[eliscolors/main.git] / ElisUndoManager.m
1 //
2 //  ElisUndoManager.m
3 //  Elis Colors
4 //
5 //  Created by 柳 on 09/09/24.
6 //  Copyright 2009 __MyCompanyName__. All rights reserved.
7 //
8
9 #import "ElisUndoManager.h"
10
11
12 @implementation ElisUndoManager
13
14 - (void)awakeFromNib
15 {
16     undoStack = [[NSMutableArray alloc] init];
17     index = 0;
18 }
19
20 - (void)pushOperation:(ElisLayer*)layer
21 {
22     NSMutableData* data = [[NSMutableData alloc] init];
23     NSKeyedArchiver* encoder = [[NSKeyedArchiver alloc] initForWritingWithMutableData:data];
24     
25     [layer saveToEncoder:encoder];
26     [encoder finishEncoding];
27     
28 //    [undoStack addObject:layer];
29 //    [undoStack addObject:data];
30     [undoStack removeObjectsInRange:NSMakeRange(index, [undoStack count] - index)];
31     
32     if(index != 0)
33         if([data isEqualToData:[undoStack objectAtIndex:index-1]])
34             return;
35     
36     [undoStack insertObject:layer atIndex:index];
37     [undoStack insertObject:data atIndex:index+1];
38     index += 2;
39 }
40
41 - (ElisLayer*)popOperation
42 {
43     NSData* data = [undoStack objectAtIndex:index-1];
44     ElisLayer* layer = [undoStack objectAtIndex:index-2];
45     
46     NSKeyedUnarchiver* decoder = [[NSKeyedUnarchiver alloc] initForReadingWithData:data];    
47     [layer loadFromDecoder:decoder];
48     [decoder finishDecoding];
49     
50     index -= 2;
51     
52     return layer;
53 }
54
55 - (void)redoOperation
56 {
57     index += 4;
58     [self popOperation];
59 }
60
61 - (BOOL)canUndo
62 {
63     return index != 0;
64     return [undoStack count] != 0;
65 }
66
67 - (BOOL)canRedo
68 {
69     return index+2 < [undoStack count];
70 }
71
72 @end