-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathNavigatorItemView.j
101 lines (89 loc) · 2.78 KB
/
NavigatorItemView.j
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
// (c) 2010-2011 by Anton Korenyushkin
@implementation NavigatorItemController : CPObject
{
id item;
}
- (id)initWithItem:(id)anItem // public
{
if (self = [super init])
item = anItem;
return self;
}
- (void)controlTextDidBlur:(CPNotification)notification // private
{
[self submit:[notification object]];
}
- (void)submit:(CPTextField)sender // public
{
if (!item.textField)
return;
delete item.textField;
[sender removeFromSuperview];
[item.manager submitItem:item withName:[sender stringValue]];
}
@end
@implementation NavigatorItemView : CPView
{
BOOL isLoading;
}
- (id)init // public
{
if (self = [super init]) {
[self addSubview:[[CPImageView alloc] initWithFrame:CGRectMake(2, 3, 16, 16)]];
[self addSubview:[[CPTextField alloc] initWithFrame:CGRectMake(20, 3, 10000, 18)]];
}
return self
}
- (CPTextField)textField // private
{
return [self subviews][1];
}
- (void)setObjectValue:(id)item // public
{
if (!item)
return;
isLoading = item.isLoading;
[[self subviews][0] setImage:[CPImage imageFromPath:isLoading ? "WhiteSpinner16.gif" : [item imageName] + "16.png"]];
if (!item.isEditable) {
[[self textField] setStringValue:[item name]];
return;
}
// FIXME: There should be a better way of displaying fields in small space
var origin = [self frameOrigin];
var textFieldFrame = CGRectMake(origin.x + 20, origin.y - 3, MAX(20, [self boundsSize].width - 20), 28);
if (item.textField) {
[item.textField setFrame:textFieldFrame];
return;
}
var textField = item.textField = [[CPTextField alloc] initWithFrame:textFieldFrame];
var controller = [[NavigatorItemController alloc] initWithItem:item];
[textField setDelegate:controller];
[textField setTarget:controller];
[textField setAction:@selector(submit:)];
[textField setBordered:YES];
[textField setBezeled:YES];
[textField setEditable:YES];
[textField setStringValue:[item name]];
[[self superview] addSubview:textField];
[textField selectAll:nil];
[[textField window] makeFirstResponder:textField];
}
- (BOOL)setThemeState:(CPThemeState)state // protected
{
if (state == CPThemeStateSelectedDataView) {
[[self textField] setTextColor:[CPColor whiteColor]];
if (isLoading)
[[self subviews][0] setImage:[CPImage imageFromPath:"BlueSpinner16.gif"]];
}
return [super setThemeState:state];
}
- (BOOL)unsetThemeState:(CPThemeState)state // protected
{
if (state == CPThemeStateSelectedDataView) {
[[self textField] setTextColor:[CPColor blackColor]];
if (isLoading)
[[self subviews][0] setImage:[CPImage imageFromPath:"WhiteSpinner16.gif"]];
}
return [super unsetThemeState:state];
}
@end