-
Notifications
You must be signed in to change notification settings - Fork 2
/
PackageTable.mm
173 lines (134 loc) · 4.68 KB
/
PackageTable.mm
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
#import "PackageTable.h"
@implementation PackageTable
- (void) dealloc {
[list_ setDataSource:nil];
[title_ release];
[packages_ release];
[sections_ release];
[list_ release];
[index_ release];
[indices_ release];
[super dealloc];
}
- (NSInteger) numberOfSectionsInTableView:(UITableView *)list {
NSInteger count([sections_ count]);
return count == 0 ? 1 : count;
}
- (NSString *) tableView:(UITableView *)list titleForHeaderInSection:(NSInteger)section {
if ([sections_ count] == 0)
return nil;
return [[sections_ objectAtIndex:section] name];
}
- (NSInteger) tableView:(UITableView *)list numberOfRowsInSection:(NSInteger)section {
if ([sections_ count] == 0)
return 0;
return [[sections_ objectAtIndex:section] count];
}
- (Package *) packageAtIndexPath:(NSIndexPath *)path {
Section *section([sections_ objectAtIndex:[path section]]);
NSInteger row([path row]);
Package *package([packages_ objectAtIndex:([section row] + row)]);
return package;
}
- (UITableViewCell *) tableView:(UITableView *)table cellForRowAtIndexPath:(NSIndexPath *)path {
PackageCell *cell([table dequeueReusableCellWithIdentifier:@"Package"]);
if (cell == nil)
cell = [[[PackageCell alloc] init] autorelease];
[cell setPackage:[self packageAtIndexPath:path]];
return cell;
}
- (CGFloat) tableView:(UITableView *)table heightForRowAtIndexPath:(NSIndexPath *)path {
return 73;
return [PackageCell heightForPackage:[self packageAtIndexPath:path]];
}
- (NSIndexPath *) tableView:(UITableView *)table willSelectRowAtIndexPath:(NSIndexPath *)path {
Package *package([self packageAtIndexPath:path]);
package = [database_ packageWithName:[package id]];
PackageView *view([delegate_ packageView]);
[view setPackage:package];
[view setDelegate:delegate_];
[book_ pushPage:view];
return path;
}
- (NSArray *) sectionIndexTitlesForTableView:(UITableView *)tableView {
return [packages_ count] > 20 ? index_ : nil;
}
- (NSInteger)tableView:(UITableView *)tableView sectionForSectionIndexTitle:(NSString *)title atIndex:(NSInteger)index {
return index;
}
- (id) initWithBook:(RVBook *)book database:(Database *)database title:(NSString *)title {
if ((self = [super initWithBook:book]) != nil) {
database_ = database;
title_ = [title retain];
index_ = [[NSMutableArray alloc] initWithCapacity:32];
indices_ = [[NSMutableDictionary alloc] initWithCapacity:32];
packages_ = [[NSMutableArray arrayWithCapacity:16] retain];
sections_ = [[NSMutableArray arrayWithCapacity:16] retain];
list_ = [[UITableView alloc] initWithFrame:[self bounds] style:UITableViewStylePlain];
[list_ setDataSource:self];
[list_ setDelegate:self];
[self addSubview:list_];
[self setAutoresizingMask:UIViewAutoresizingFlexibleHeight];
[list_ setAutoresizingMask:UIViewAutoresizingFlexibleHeight];
} return self;
}
- (void) setDelegate:(id)delegate {
delegate_ = delegate;
}
- (bool) hasPackage:(Package *)package {
return true;
}
- (void) reloadData {
NSArray *packages = [database_ packages];
[packages_ removeAllObjects];
[sections_ removeAllObjects];
_profile(PackageTable$reloadData$Filter)
for (Package *package in packages)
if ([self hasPackage:package])
[packages_ addObject:package];
_end
[index_ removeAllObjects];
[indices_ removeAllObjects];
Section *section = nil;
_profile(PackageTable$reloadData$Section)
for (size_t offset(0), end([packages_ count]); offset != end; ++offset) {
Package *package;
unichar index;
_profile(PackageTable$reloadData$Section$Package)
package = [packages_ objectAtIndex:offset];
index = [package index];
_end
if (section == nil || [section index] != index) {
_profile(PackageTable$reloadData$Section$Allocate)
section = [[[Section alloc] initWithIndex:index row:offset] autorelease];
_end
[index_ addObject:[section name]];
//[indices_ setObject:[NSNumber numberForInt:[sections_ count]] forKey:index];
_profile(PackageTable$reloadData$Section$Add)
[sections_ addObject:section];
_end
}
[section addToCount];
}
_end
_profile(PackageTable$reloadData$List)
[list_ reloadData];
_end
}
- (NSString *) title {
return title_;
}
- (void) resetViewAnimated:(BOOL)animated {
[list_ resetViewAnimated:animated];
}
- (void) resetCursor {
[list_ scrollRectToVisible:CGRectMake(0, 0, 0, 0) animated:NO];
}
- (UITableView *) list {
return list_;
}
- (void) setShouldHideHeaderInShortLists:(BOOL)hide {
//XXX:[list_ setShouldHideHeaderInShortLists:hide];
}
@end
/* }}} */