// // ElisUndoManager.m // Elis Colors // // Created by 柳 on 09/09/24. // Copyright 2009 __MyCompanyName__. All rights reserved. // #import "ElisUndoManager.h" @implementation ElisUndoManager - (void)awakeFromNib { undoStack = [[NSMutableArray alloc] init]; index = 0; } - (void)pushOperation:(ElisLayer*)layer { NSMutableData* data = [[NSMutableData alloc] init]; NSKeyedArchiver* encoder = [[NSKeyedArchiver alloc] initForWritingWithMutableData:data]; [layer saveToEncoder:encoder]; [encoder finishEncoding]; // [undoStack addObject:layer]; // [undoStack addObject:data]; [undoStack removeObjectsInRange:NSMakeRange(index, [undoStack count] - index)]; if(index != 0) if([data isEqualToData:[undoStack objectAtIndex:index-1]]) return; [undoStack insertObject:layer atIndex:index]; [undoStack insertObject:data atIndex:index+1]; index += 2; } - (void)popOperation { NSData* data = [undoStack objectAtIndex:index-1]; ElisLayer* layer = [undoStack objectAtIndex:index-2]; NSKeyedUnarchiver* decoder = [[NSKeyedUnarchiver alloc] initForReadingWithData:data]; [layer loadFromDecoder:decoder]; [decoder finishDecoding]; index -= 2; } - (void)redoOperation { index += 4; [self popOperation]; } - (BOOL)canUndo { return index != 0; return [undoStack count] != 0; } - (BOOL)canRedo { return index+2 < [undoStack count]; } @end