forked from gnachman/iTerm2
-
Notifications
You must be signed in to change notification settings - Fork 0
/
ProfileModelWrapper.m
133 lines (115 loc) · 3.2 KB
/
ProfileModelWrapper.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
131
132
133
//
// ProfileModelWrapper.m
// iTerm
//
// Created by George Nachman on 1/9/12.
//
#import "ProfileModelWrapper.h"
@implementation ProfileModelWrapper
- (id)initWithModel:(ProfileModel*)model
{
self = [super init];
if (self) {
underlyingModel = model;
bookmarks = [[NSMutableArray alloc] init];
filter = [[NSMutableString alloc] init];
[self sync];
}
return self;
}
- (void)dealloc
{
[bookmarks release];
[filter release];
[super dealloc];
}
- (void)setSortDescriptors:(NSArray*)newSortDescriptors
{
[sortDescriptors autorelease];
sortDescriptors = [newSortDescriptors retain];
}
- (void)dump
{
for (int i = 0; i < [self numberOfBookmarks]; ++i) {
NSLog(@"Dump of %p: At %d: %@", self, i, [[self profileTableRowAtIndex:i] name]);
}
}
- (void)sort
{
if ([sortDescriptors count] > 0) {
[bookmarks sortUsingDescriptors:sortDescriptors];
}
}
- (int)numberOfBookmarks
{
return [bookmarks count];
}
- (ProfileTableRow *)profileTableRowAtIndex:(int)i
{
return [bookmarks objectAtIndex:i];
}
- (Profile*)profileAtIndex:(int)i
{
return [[bookmarks objectAtIndex:i] bookmark];
}
- (int)indexOfProfileWithGuid:(NSString*)guid
{
for (int i = 0; i < [bookmarks count]; ++i) {
if ([[[bookmarks objectAtIndex:i] guid] isEqualToString:guid]) {
return i;
}
}
return -1;
}
- (ProfileModel*)underlyingModel
{
return underlyingModel;
}
- (void)sync
{
[bookmarks removeAllObjects];
NSArray* filteredBookmarks = [underlyingModel bookmarkIndicesMatchingFilter:filter];
for (NSNumber* n in filteredBookmarks) {
int i = [n intValue];
//NSLog(@"Wrapper at %p add bookmark %@ at index %d", self, [[underlyingModel profileAtIndex:i] objectForKey:KEY_NAME], i);
[bookmarks addObject:[[[ProfileTableRow alloc] initWithBookmark:[underlyingModel profileAtIndex:i]
underlyingModel:underlyingModel] autorelease]];
}
[self sort];
}
- (void)moveBookmarkWithGuid:(NSString*)guid toIndex:(int)row
{
// Make the change locally.
int origRow = [self indexOfProfileWithGuid:guid];
if (origRow < row) {
[bookmarks insertObject:[bookmarks objectAtIndex:origRow] atIndex:row];
[bookmarks removeObjectAtIndex:origRow];
} else if (origRow > row) {
ProfileTableRow* temp = [[bookmarks objectAtIndex:origRow] retain];
[bookmarks removeObjectAtIndex:origRow];
[bookmarks insertObject:temp atIndex:row];
[temp release];
}
}
- (void)pushOrderToUnderlyingModel
{
// Since we may have a filter, let's ensure that the visible bookmarks occur
// in the same order in the underlying model without regard to how invisible
// bookmarks fit into the order. This also prevents instability when the
// reload happens.
int i = 0;
for (ProfileTableRow* theRow in bookmarks) {
[underlyingModel moveGuid:[theRow guid] toRow:i++];
}
[underlyingModel rebuildMenus];
}
- (NSArray*)sortDescriptors
{
return sortDescriptors;
}
- (void)setFilter:(NSString*)newFilter
{
[filter release];
filter = [[NSString stringWithString:newFilter] retain];
}
@end