-
Notifications
You must be signed in to change notification settings - Fork 1
/
HallenprojektStatusAppDelegate.m
164 lines (140 loc) · 4.96 KB
/
HallenprojektStatusAppDelegate.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
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
#import "ASIHTTPRequest.h"
#import "ASIFormDataRequest.h"
#import "ASINetworkQueue.h"
#import "JSON.h"
#import "HallenprojektStatusAppDelegate.h"
@implementation HallenprojektStatusAppDelegate
@synthesize window, sbMenu, placesMenuItem, logoutItem, preferencesController, currentlySelectedItem;
- (void) addItemsToMenu:(NSMenu *) menu fromDictionary:(NSDictionary *) dictionary{
for (NSDictionary *place in dictionary)
{
NSMenuItem *item = [[NSMenuItem alloc] initWithTitle:[[place objectForKey:@"place"] objectForKey:@"name"] action:@selector(selectedItem:) keyEquivalent:@""];
[item setTag:[[[place objectForKey:@"place"] objectForKey:@"id"] intValue]];
[menu addItem:item];
}
}
- (void) fileNotifications
{
[[[NSWorkspace sharedWorkspace] notificationCenter] addObserver: self
selector: @selector(receiveSleepNote:) name: NSWorkspaceWillSleepNotification object: NULL];
[[[NSWorkspace sharedWorkspace] notificationCenter] addObserver: self
selector: @selector(receiveWakeNote:) name: NSWorkspaceDidWakeNotification object: NULL];
}
- (void) setStatusIcon {
NSBundle *bundle = [NSBundle mainBundle];
if(loggedIn){
statusImage = [[NSImage alloc] initWithContentsOfFile: [bundle pathForResource: @"status_bar_icon_active" ofType: @"png"]];
}
else {
statusImage = [[NSImage alloc] initWithContentsOfFile: [bundle pathForResource: @"status_bar_icon_inactive" ofType: @"png"]];
}
[sbItem setImage: statusImage];
[sbItem setAlternateImage: statusImage];
}
- (void) fetchPlaces {
NSURL *url = [NSURL URLWithString:@"http://www.hallenprojekt.de/places.json"];
ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url];
[request start];
NSError *error = [request error];
if (!error) {
NSMenu *menu = [[[NSMenu alloc] initWithTitle:@"the places"] autorelease];
SBJSON *parser = [[SBJSON alloc] init];
NSString *json_string = [[NSString alloc] initWithString:[request responseString]];
NSArray *places = [parser objectWithString:json_string error:nil];
[self addItemsToMenu:menu fromDictionary:[places objectAtIndex:0]];
[self addItemsToMenu:menu fromDictionary:[places objectAtIndex:1]];
[placesMenuItem setSubmenu:menu];
}
else {
NSLog(@"%@",[error localizedDescription]);
}
}
- (void)applicationDidFinishLaunching:(NSNotification *)aNotification {
loggedIn = false;
sbItem = [[NSStatusBar systemStatusBar] statusItemWithLength:NSVariableStatusItemLength];
[sbItem retain];
[self setStatusIcon];
[sbItem setToolTip: @"Hallenprojekt Status App"];
[sbItem setHighlightMode:YES];
[sbItem setEnabled:YES];
[sbItem setMenu:sbMenu];
[sbMenu setAutoenablesItems:false];
[self fetchPlaces];
timer = [NSTimer scheduledTimerWithTimeInterval:600
target:self
selector: @selector(updateLocation)
userInfo:nil
repeats: YES];
[self fileNotifications];
}
- (NSError *)setLocation:(NSString *) place_id {
NSURL *url = [NSURL URLWithString:@"http://www.hallenprojekt.de/set_current_place"];
ASIFormDataRequest *request = [ASIFormDataRequest requestWithURL:url];
[request setPostValue:place_id forKey:@"current_place_id"];
[request setUsername:[preferencesController getUsername]];
[request setPassword:[preferencesController getPassword]];
[request addRequestHeader:@"Accept" value:@"application/json"];
[request setDelegate:self];
[request start];
return [request error];
}
- (void) updateLocation {
if(self.currentlySelectedItem){
[self setLocation: [NSString stringWithFormat:@"%d", [self.currentlySelectedItem tag]]];
}
}
- (void)selectedItem:(id) sender {
NSMenuItem *item = (NSMenuItem *) sender;
NSError *error = [self setLocation: [NSString stringWithFormat:@"%d", [item tag]]];
if(error){
NSLog(@"%@",[error localizedDescription]);
[preferencesController loadPreferences:self];
}
else
{
if(self.currentlySelectedItem)
{
[self.currentlySelectedItem setState:NSOffState];
}
[item setState:NSOnState];
self.currentlySelectedItem = item;
[self.logoutItem setEnabled:true];
[self.logoutItem setTitle:[NSString stringWithFormat:@"Check out from %@", [item title]]];
loggedIn = true;
[self setStatusIcon];
}
}
- (void) updateMenuForLogoutState {
[self.logoutItem setEnabled:false];
[self.currentlySelectedItem setState:NSOffState];
self.currentlySelectedItem = NULL;
[self.logoutItem setTitle:@"Check out"];
loggedIn = false;
[self setStatusIcon];
}
- (IBAction) logout: (id) sender {
[self setLocation: @""];
[self updateMenuForLogoutState];
}
-(IBAction) gotoWebsite: (id) sender{
[[NSWorkspace sharedWorkspace] openURL:[NSURL URLWithString:@"http://www.hallenprojekt.de"]];
}
- (void) receiveSleepNote: (NSNotification*) note
{
[self updateMenuForLogoutState];
}
- (void) receiveWakeNote: (NSNotification*) note
{
// update list of places;
}
-(void) dealloc {
[timer invalidate];
[timer release];
[window release];
[statusImage release];
[preferencesController release];
[selectedItem release];
[logoutItem release];
[super dealloc];
}
@end