Statistics
| Branch: | Tag: | Revision:

root / pithos-macos / PithosPreferencesController.m @ d8426ffb

History | View | Annotate | Download (10.2 kB)

1
//
2
//  PithosPreferencesController.m
3
//  pithos-macos
4
//
5
// Copyright 2011-2012 GRNET S.A. All rights reserved.
6
//
7
// Redistribution and use in source and binary forms, with or
8
// without modification, are permitted provided that the following
9
// conditions are met:
10
// 
11
//   1. Redistributions of source code must retain the above
12
//      copyright notice, this list of conditions and the following
13
//      disclaimer.
14
// 
15
//   2. Redistributions in binary form must reproduce the above
16
//      copyright notice, this list of conditions and the following
17
//      disclaimer in the documentation and/or other materials
18
//      provided with the distribution.
19
// 
20
// THIS SOFTWARE IS PROVIDED BY GRNET S.A. ``AS IS'' AND ANY EXPRESS
21
// OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
22
// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
23
// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL GRNET S.A OR
24
// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
25
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
26
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
27
// USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
28
// AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
29
// LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
30
// ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
31
// POSSIBILITY OF SUCH DAMAGE.
32
// 
33
// The views and conclusions contained in the software and
34
// documentation are those of the authors and should not be
35
// interpreted as representing official policies, either expressed
36
// or implied, of GRNET S.A.
37

    
38
#import "PithosPreferencesController.h"
39
#import "PithosBrowserController.h"
40
#import "PithosAccountNode.h"
41
#import "PithosAccount.h"
42
#import "pithos_macosAppDelegate.h"
43

    
44
@implementation PithosPreferencesController
45
@synthesize pithosBrowserController, selectedPithosAccount;
46
@synthesize accountsArrayController;
47
@synthesize accountRemoveEnable;
48
@synthesize serverURL, authUser, authToken, manual, loginEnable, loginCancelEnable;
49
@synthesize groupsDictionaryController, selectedGroupMembersDictionaryController;
50
@synthesize syncActive, syncDirectoryPath, syncApplyEnable, syncCancelEnable;
51

    
52
#pragma mark -
53
#pragma mark Object Lifecycle
54

    
55
- (id)init {
56
    return [super initWithWindowNibName:@"PithosPreferencesController"];
57
}
58

    
59
- (void)windowDidLoad {
60
    [super windowDidLoad];
61
    
62
    NSWindow *window = [self window];
63
    [window setHidesOnDeactivate:NO];
64
    [window setExcludedFromWindowsMenu:YES];
65
    
66
//	// Select the first tab when the window is loaded for the first time.
67
//	[[window valueForKeyPath:@"toolbar"] setSelectedItemIdentifier:@"0"];
68

    
69
    [groupsDictionaryController setInitialKey:@"group"];
70
    [groupsDictionaryController setInitialValue:@"user"];
71
    [selectedGroupMembersDictionaryController setInitialKey:@"user"];
72
    [selectedGroupMembersDictionaryController setInitialValue:@""];
73

    
74
    [window setDelegate:self];
75
    
76
    self.selectedPithosAccount = [[accountsArrayController selectedObjects] objectAtIndex:0];
77
    [accountsArrayController addObserver:self forKeyPath:@"selection" options:NSKeyValueObservingOptionNew context:NULL];
78
}
79

    
80
- (BOOL)windowShouldClose:(id)sender {
81
    return [(pithos_macosAppDelegate *)[[NSApplication sharedApplication] delegate] activated];
82
}
83

    
84
//- (void)windowWillClose:(NSNotification *)notification {
85
//}
86

    
87
//- (IBAction)toolbarItemSelected:(id)sender {
88
//}
89

    
90
#pragma mark -
91
#pragma Observers
92

    
93
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context {
94
    if ([object isEqualTo:accountsArrayController] && 
95
        [keyPath isEqualToString:@"selection"] && 
96
        [[accountsArrayController selectedObjects] count]) {
97
        self.selectedPithosAccount = [[accountsArrayController selectedObjects] objectAtIndex:0];
98
    }
99
}
100

    
101
#pragma mark -
102
#pragma Update
103

    
104
- (void)updateAccounts {
105
    pithos_macosAppDelegate *delegate = (pithos_macosAppDelegate *)[[NSApplication sharedApplication] delegate];
106
    self.accountRemoveEnable = (delegate.activated && ([delegate.pithosAccounts count] > 1));
107
}
108

    
109
- (void)updateLogin {
110
    self.loginEnable = ([selectedPithosAccount urlIsValid:serverURL] && (!manual || ([authUser length] && [authToken length])));
111
    self.loginCancelEnable = (![selectedPithosAccount.serverURL isEqualToString:serverURL] || 
112
                              (selectedPithosAccount.authUser && ![selectedPithosAccount.authUser isEqualToString:authUser]) || 
113
                              (selectedPithosAccount.authToken && ![selectedPithosAccount.authToken isEqualToString:authToken]));
114
}
115

    
116
- (void)updateSync {
117
    BOOL isDirectory;
118
    self.syncApplyEnable = (selectedPithosAccount.active && 
119
                            ((selectedPithosAccount.syncActive != syncActive) || 
120
                             (![selectedPithosAccount.syncDirectoryPath isEqualToString:syncDirectoryPath] && 
121
                              (![[NSFileManager defaultManager] fileExistsAtPath:syncDirectoryPath isDirectory:&isDirectory] || 
122
                               isDirectory))));
123
    self.syncCancelEnable = (selectedPithosAccount.active && 
124
                             ((selectedPithosAccount.syncActive != syncActive) || 
125
                              ![selectedPithosAccount.syncDirectoryPath isEqualToString:syncDirectoryPath]));
126
}
127

    
128
#pragma mark -
129
#pragma Properties
130

    
131
- (void)setSelectedPithosAccount:(PithosAccount *)aSelectedPithosAccount {
132
    if (aSelectedPithosAccount && ![aSelectedPithosAccount isEqualTo:selectedPithosAccount]) {
133
        [selectedPithosAccount release];
134
        selectedPithosAccount = [aSelectedPithosAccount retain];
135
        
136
        [self updateAccounts];
137
        [self loginCancel:self];
138
        [self syncCancel:self];
139
        [self groupsRevert:self];
140
    }
141
}
142

    
143
#pragma Login Properties
144

    
145
- (void)setServerURL:(NSString *)aServerURL {
146
    [serverURL release];
147
    serverURL = [aServerURL copy];
148
    [self updateLogin];
149
}
150

    
151
- (void)setAuthUser:(NSString *)anAuthUser {
152
    [authUser release];
153
    authUser = [anAuthUser copy];
154
    [self updateLogin];
155
}
156

    
157
- (void)setAuthToken:(NSString *)anAuthToken {
158
    [authToken release];
159
    authToken = [anAuthToken copy];
160
    [self updateLogin];
161
}
162

    
163
- (void)setManual:(BOOL)aManual {
164
    manual = aManual;
165
    [self updateLogin];
166
    if (!manual) {
167
        self.authUser = [[selectedPithosAccount.authUser copy] autorelease];
168
        self.authToken = [[selectedPithosAccount.authToken copy] autorelease];
169
    }
170
}
171

    
172
#pragma Sync Properties
173

    
174
- (void)setSyncActive:(BOOL)aSyncActive {
175
    syncActive = aSyncActive;
176
    [self updateSync];
177
}
178

    
179
- (void)setSyncDirectoryPath:(NSString *)aSyncDirectoryPath {
180
    [syncDirectoryPath release];
181
    syncDirectoryPath = [aSyncDirectoryPath copy];
182
    [self updateSync];
183
}
184

    
185
#pragma mark -
186
#pragma Actions
187

    
188
- (IBAction)addAccount:(id)sender {
189
    [accountsArrayController addObject:[PithosAccount pithosAccount]];
190
    [self updateAccounts];
191
    pithos_macosAppDelegate *delegate = (pithos_macosAppDelegate *)[[NSApplication sharedApplication] delegate];
192
    [delegate.pithosAccountsDictionary setObject:selectedPithosAccount forKey:selectedPithosAccount.name];
193
    [delegate savePithosAccounts:self];
194
}
195

    
196
- (IBAction)removeAccount:(id)sender {
197
    [self updateAccounts];
198
    if (!accountRemoveEnable)
199
        return;
200
    PithosAccount *removedPithosAccount = [selectedPithosAccount retain];
201
    pithos_macosAppDelegate *delegate = (pithos_macosAppDelegate *)[[NSApplication sharedApplication] delegate];
202
    if ([delegate.currentPithosAccount isEqualTo:removedPithosAccount] && [delegate.pithosBrowserController operationsPending]) {
203
        NSAlert *alert = [[[NSAlert alloc] init] autorelease];
204
        [alert setMessageText:@"Operations Pending"];
205
        [alert setInformativeText:@"There are pending operations in the browser, do you want to remove the account and cancel them?"];
206
        [alert addButtonWithTitle:@"OK"];
207
        [alert addButtonWithTitle:@"Cancel"];
208
        NSInteger choice = [alert runModal];
209
        if (choice == NSAlertSecondButtonReturn) {
210
            [removedPithosAccount release];
211
            return;
212
        }
213
    }
214
    [accountsArrayController removeObject:selectedPithosAccount];
215
    [delegate.pithosAccountsDictionary removeObjectForKey:removedPithosAccount.name];
216
    [delegate removedPithosAccount:removedPithosAccount];
217
    [delegate savePithosAccounts:self];
218
    [removedPithosAccount release];
219
    [self updateAccounts];
220
}
221

    
222
#pragma Login Actions
223

    
224
- (IBAction)login:(id)sender {
225
    if (!manual) {
226
        [selectedPithosAccount loginWithServerURL:serverURL];
227
    } else {
228
        [selectedPithosAccount authenticateWithServerURL:serverURL authUser:authUser authToken:authToken];
229
        self.manual = NO;
230
        pithos_macosAppDelegate *delegate = (pithos_macosAppDelegate *)[[NSApplication sharedApplication] delegate];
231
        [delegate savePithosAccounts:self];
232
        if (!delegate.activated) {
233
            delegate.activated = YES;
234
            [delegate showPithosBrowser:self];
235
        }
236
        if ([selectedPithosAccount isEqualTo:delegate.currentPithosAccount])
237
            delegate.pithosBrowserController.pithos = selectedPithosAccount.pithos;
238
    }
239
}
240

    
241
- (IBAction)loginCancel:(id)server {
242
    self.serverURL = [[selectedPithosAccount.serverURL copy] autorelease];
243
    self.authUser = [[selectedPithosAccount.authUser copy] autorelease];
244
    self.authToken = [[selectedPithosAccount.authToken copy] autorelease];
245
}
246

    
247
#pragma Sync Actions
248

    
249
- (IBAction)syncApply:(id)sender {
250
    [selectedPithosAccount updateSyncWithSyncActive:syncActive syncDirectoryPath:syncDirectoryPath];
251
    [self updateSync];
252
    pithos_macosAppDelegate *delegate = (pithos_macosAppDelegate *)[[NSApplication sharedApplication] delegate];
253
    [delegate savePithosAccounts:self];
254
}
255

    
256
- (IBAction)syncCancel:(id)sender {
257
    self.syncActive = selectedPithosAccount.syncActive;
258
    self.syncDirectoryPath = [[selectedPithosAccount.syncDirectoryPath copy] autorelease];
259
}
260

    
261
#pragma mark Groups Actions
262

    
263
- (IBAction)groupsApply:(id)sender {
264
    [[self window] makeFirstResponder:nil];
265
    if (selectedPithosAccount.active)
266
        [selectedPithosAccount.accountNode applyInfo];
267
}
268

    
269
- (IBAction)groupsRevert:(id)sender {
270
    if (selectedPithosAccount.active && selectedPithosAccount.accountNode)
271
        [selectedPithosAccount.accountNode refreshInfo];
272
}
273

    
274
@end