-
Notifications
You must be signed in to change notification settings - Fork 8
/
Copy pathSSYDooDooUndoManager.m
130 lines (104 loc) · 3.43 KB
/
SSYDooDooUndoManager.m
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
123
124
125
126
127
128
129
130
#import "SSYDooDooUndoManager.h"
#import "SSYMOCManager.h"
#import "BSManagedDocument.h"
/* BSManagedDocument is a open source replacement for NSPersistentDocument.
It is recommended for any Core Data document-based app.
https://github.com/jerrykrinock/BSManagedDocument
*/
NSString* const SSYUndoManagerWillEndUndoGroupNotification = @"SSYUndoManagerWillEndUndoGroupNotification" ;
NSString* const SSYUndoManagerDocumentWillSaveNotification = @"SSYUndoManagerDocumentWillSaveNotification" ;
NSString* const SSYUndoManagerDocumentDidOpenNotification = @"SSYUndoManagerDocumentDidOpenNotification" ;
NSString* const SSYUndoManagerDocumentWillCloseNotification = @"SSYUndoManagerDocumentWillCloseNotification" ;
NSString* const SSYUndoManagerDidCloseUndoGroupNotification = @"SSYUndoManagerDidCloseUndoGroupNotification" ;
static NSInteger scheduledGroupSequenceNumber = 1 ;
@interface SSYDooDooUndoManager ()
@property (assign) NSManagedObjectContext* managedObjectContext ;
@end
@implementation SSYDooDooUndoManager
#if DEBUG
- (NSInteger)nLivingAutoEndingGroups {
return nLivingAutoEndingGroups ;
}
- (NSInteger)nLivingManualGroups {
return nLivingManualGroups ;
}
#endif
@synthesize managedObjectContext = m_managedObjectContext ;
- (void)dealloc {
[[NSNotificationCenter defaultCenter] removeObserver:self] ;
[super dealloc] ;
}
- (void)beginManualUndoGrouping {
if ([self isUndoRegistrationEnabled]) {
nLivingManualGroups++ ;
[self beginUndoGrouping] ;
}
}
- (void)beginUndoGrouping {
[super beginUndoGrouping] ;
}
#if 0
#warning Hokey Code
- (void)undo {
id bkmxDoc = [SSYMOCManager ownerOfManagedObjectContext:[self managedObjectContext]] ;
[bkmxDoc endEditing:nil] ;
[super undo] ;
}
#endif
- (void)endUndoGrouping {
[[self managedObjectContext] processPendingChanges] ;
[super endUndoGrouping] ;
[[NSNotificationCenter defaultCenter] postNotificationName:SSYUndoManagerDidCloseUndoGroupNotification
object:self];
}
- (void)endManualUndoGrouping {
if (nLivingManualGroups > 0) {
nLivingManualGroups-- ;
[self endUndoGrouping] ;
}
}
- (void)beginAutoEndingUndoGrouping {
if (
(nLivingAutoEndingGroups == 0)
&&
![self isUndoing]
&&
![self isRedoing]
&&
[self isUndoRegistrationEnabled]
) {
[self performSelector:@selector(autoEndUndoGroupingSequenceNumber:)
withObject:[NSNumber numberWithInteger:scheduledGroupSequenceNumber++]
afterDelay:0.01] ;
// It is important that we set our state variable before
// beginning the undo grouping, because sometimes -beginUndoGrouping
// could immediately cause another -beginAutoEndingUndoGrouping
// to be received; i.e. this method can be re-entered before it ends.
nLivingAutoEndingGroups++ ;
[self beginUndoGrouping] ;
}
}
- (void)autoEndUndoGroupingSequenceNumber:(NSNumber*)number {
[[NSNotificationCenter defaultCenter] postNotificationName:SSYUndoManagerWillEndUndoGroupNotification
object:self] ;
nLivingAutoEndingGroups-- ;
[self endUndoGrouping] ;
}
- (NSInteger)endAnyUndoGroupings {
NSInteger i ;
NSInteger result = 0 ;
for (i=0; i<nLivingManualGroups; i++) {
[self endManualUndoGrouping] ;
result++ ;
}
if (nLivingAutoEndingGroups > 0) {
[NSObject cancelPreviousPerformRequestsWithTarget:self] ;
[self autoEndUndoGroupingSequenceNumber:[NSNumber numberWithInteger:-1]] ;
result++ ;
}
return result ;
}
- (void)endAnyUndoGroupings:(NSNotification*)note {
[self endAnyUndoGroupings] ;
}
@end