-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathProjectFilesSource.m
More file actions
237 lines (197 loc) · 5.76 KB
/
Copy pathProjectFilesSource.m
File metadata and controls
237 lines (197 loc) · 5.76 KB
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
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
//
// ProjectFilesSource.m
// GitBuddy
//
// Created by Stanislav Yudin on 8/9/2010.
// Copyright 2010 Endless Insomnia Labs. All rights reserved.
//
#import "ProjectFilesSource.h"
@implementation ProjectFilesSource
@synthesize data;
static NSArray *_arrayDataKeys;
//
// Keys Arrays to read groups
// in [self data]
//
+ (NSArray*) dataKeys
{
if (!_arrayDataKeys) {
_arrayDataKeys = [[NSArray alloc] initWithObjects:
@"modified",
@"added",
@"removed",
@"renamed",
nil];
}
return _arrayDataKeys;
}
- (id) init
{
if ( !(self = [super init])) {
return nil;
}
return self;
}
- (void)loadProjectData:(NSDictionary*)pData forPath:(NSString*)p
{
//clear data
if (data) {
[data release];
data = nil;
[foreign release];
foreign = nil;
}
//init data
data = [[NSMutableDictionary alloc] init];
for (NSString *k in [ProjectFilesSource dataKeys]) {
[data setObject:[[NSMutableArray alloc] initWithArray:[pData objectForKey:k] copyItems:YES] forKey:k];
}
[data setObject:[NSNumber numberWithInt:[[pData objectForKey:@"count"] intValue]] forKey:@"count"];
//init drag & grop container
foreign = [[NSMutableArray alloc] init];
//copy path
path = [[NSString alloc] initWithString:p];
NSLog(@"Loading Project File Source Data (%@):", self);
NSLog(@"%@", data);
NSLog(@" *** ");
}
- (void) dealloc
{
[data release];
[path release];
[foreign release];
[super dealloc];
}
//
// Files Inspection API
//
- (NSString *)fileAtIndex:(int)index
{
NSString *grp = nil;
int grpOffset = 0;
NSString *file = [self fileAtIndex:index inGroup:&grp groupIndexOffset:&grpOffset];
return file;
}
-(NSString *)fileInGroup:(NSString*)file
{
for(NSString *k in [ProjectFilesSource dataKeys]) {
if ([[data objectForKey:k] indexOfObject:file] != NSNotFound) {
return k;
}
}
return nil;
}
- (NSString *)fileAtIndex:(int)index inGroup:(NSString**)grp groupIndexOffset:(int*)offset
{
*offset = 0;
int groupOffset = 0;
for(NSString *k in [ProjectFilesSource dataKeys]) {
*offset += [[data objectForKey:k] count];
NSLog(@"offset: %d", *offset);
if ( index < *offset ) {
*grp = k;
NSLog(@"reading: %@[%d]", k, index - groupOffset);
return [[data objectForKey:k] objectAtIndex:index - groupOffset];
}
groupOffset += [[data objectForKey:k] count];
NSLog(@"total += len(%@) => %d", k, groupOffset);
}
return nil;
}
- (void)addFile:(NSString*)file toGroup:(NSString*)group
{
NSLog(@"Adding file %@ from %@", file, group);
[(NSMutableArray*)[data objectForKey:group] addObject:file];
int count = [[data objectForKey:@"count"] intValue];
count++;
[data setObject:[NSNumber numberWithInt:count] forKey:@"count"];
[foreign addObject:file];
}
- (void)removeFile:(NSString*)file fromGroup:(NSString*)group
{
NSLog(@"Removing file %@ from %@", file, group);
[(NSMutableArray*)[data objectForKey:group] removeObject:file];
int count = [[data objectForKey:@"count"] intValue];
count--;
[data setObject:[NSNumber numberWithInt:count] forKey:@"count"];
[foreign removeObject:file];
}
- (BOOL) isForeignFile:(NSString*)file
{
return [foreign indexOfObject:file] != NSNotFound;
}
- (void) copyFilesFrom:(ProjectFilesSource *)source
{
for (NSString *k in [ProjectFilesSource dataKeys] ) {
for (NSString * file in [[source data] objectForKey:k]) {
[self addFile:file toGroup:k];
}
}
[[source data] removeAllObjects];
}
//
// Table View Data Source
//
- (NSInteger)numberOfRowsInTableView:(NSTableView *)aTableView
{
int rows = [[data objectForKey:@"count"] intValue];
return rows;
}
- (id)tableView:(NSTableView *)aTableView objectValueForTableColumn:(NSTableColumn *)aTableColumn row:(NSInteger)rowIndex
{
NSString *file = [self fileAtIndex:rowIndex];
NSString *col = [aTableColumn identifier];
if ([col isEqual:@"icon"]) {
return [[NSWorkspace sharedWorkspace] iconForFile:[path stringByAppendingPathComponent:file]];
}
else if ([col isEqual:@"file"]) {
return file;
}
else {
return nil;
}
}
//validate received drop
- (NSDragOperation)tableView:(NSTableView *)aTableView validateDrop:(id < NSDraggingInfo >)info proposedRow:(NSInteger)row proposedDropOperation:(NSTableViewDropOperation)operation
{
if ([info draggingSource] != aTableView && operation == NSTableViewDropAbove) {
return NSDragOperationMove;
}
return NSDragOperationNone;
}
//accept drop
- (BOOL)tableView:(NSTableView *)aTableView acceptDrop:(id<NSDraggingInfo>)info row:(NSInteger)row dropOperation:(NSTableViewDropOperation)operation
{
NSPasteboard* pboard = [info draggingPasteboard];
NSArray * droppedFiles = [NSKeyedUnarchiver unarchiveObjectWithData:[pboard dataForType:@"StageItem"]];
//add & remove dropped files
for (NSString *droppedFile in droppedFiles) {
NSString *grp = [ (ProjectFilesSource*)[[info draggingSource] dataSource] fileInGroup:droppedFile];
NSLog(@"Dropped file %@ (%@)", droppedFile, grp);
ProjectFilesSource* source = (ProjectFilesSource*)[[info draggingSource] dataSource];
[self addFile:droppedFile toGroup:grp];
[source removeFile:droppedFile fromGroup:grp];
}
NSLog(@"Project File Sources Modified");
NSLog(@"Receiver: %@", self);
NSLog(@"%@", data);
NSLog(@" *** ");
//reload receiver
[aTableView reloadData];
//reload source
[[info draggingSource] reloadData];
return YES;
}
//start dragging
- (BOOL)tableView:(NSTableView *)aTableView writeRowsWithIndexes:(NSIndexSet *)rowIndexes toPasteboard:(NSPasteboard *)pboard
{
NSMutableArray *dragged = [[NSMutableArray alloc] init];
[rowIndexes enumerateIndexesUsingBlock: ^(NSUInteger idx, BOOL *stop) {
[dragged addObject:[self fileAtIndex:idx]];
}];
NSData *d = [NSKeyedArchiver archivedDataWithRootObject:dragged];
[pboard declareTypes:[NSArray arrayWithObject:@"StageItem"] owner:self];
[pboard setData:d forType:@"StageItem"];
return YES;
}
@end