Statistics
| Branch: | Tag: | Revision:

root / pithos-macos / PithosPreferencesController.m @ ef8f82df

History | View | Annotate | Download (22.9 kB)

1 589a14ca Miltiadis Vasilakis
//
2 589a14ca Miltiadis Vasilakis
//  PithosPreferencesController.m
3 589a14ca Miltiadis Vasilakis
//  pithos-macos
4 589a14ca Miltiadis Vasilakis
//
5 d8426ffb Miltiadis Vasilakis
// Copyright 2011-2012 GRNET S.A. All rights reserved.
6 589a14ca Miltiadis Vasilakis
//
7 589a14ca Miltiadis Vasilakis
// Redistribution and use in source and binary forms, with or
8 589a14ca Miltiadis Vasilakis
// without modification, are permitted provided that the following
9 589a14ca Miltiadis Vasilakis
// conditions are met:
10 589a14ca Miltiadis Vasilakis
// 
11 589a14ca Miltiadis Vasilakis
//   1. Redistributions of source code must retain the above
12 589a14ca Miltiadis Vasilakis
//      copyright notice, this list of conditions and the following
13 589a14ca Miltiadis Vasilakis
//      disclaimer.
14 589a14ca Miltiadis Vasilakis
// 
15 589a14ca Miltiadis Vasilakis
//   2. Redistributions in binary form must reproduce the above
16 589a14ca Miltiadis Vasilakis
//      copyright notice, this list of conditions and the following
17 589a14ca Miltiadis Vasilakis
//      disclaimer in the documentation and/or other materials
18 589a14ca Miltiadis Vasilakis
//      provided with the distribution.
19 589a14ca Miltiadis Vasilakis
// 
20 589a14ca Miltiadis Vasilakis
// THIS SOFTWARE IS PROVIDED BY GRNET S.A. ``AS IS'' AND ANY EXPRESS
21 589a14ca Miltiadis Vasilakis
// OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
22 589a14ca Miltiadis Vasilakis
// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
23 589a14ca Miltiadis Vasilakis
// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL GRNET S.A OR
24 589a14ca Miltiadis Vasilakis
// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
25 589a14ca Miltiadis Vasilakis
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
26 589a14ca Miltiadis Vasilakis
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
27 589a14ca Miltiadis Vasilakis
// USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
28 589a14ca Miltiadis Vasilakis
// AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
29 589a14ca Miltiadis Vasilakis
// LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
30 589a14ca Miltiadis Vasilakis
// ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
31 589a14ca Miltiadis Vasilakis
// POSSIBILITY OF SUCH DAMAGE.
32 589a14ca Miltiadis Vasilakis
// 
33 589a14ca Miltiadis Vasilakis
// The views and conclusions contained in the software and
34 589a14ca Miltiadis Vasilakis
// documentation are those of the authors and should not be
35 589a14ca Miltiadis Vasilakis
// interpreted as representing official policies, either expressed
36 589a14ca Miltiadis Vasilakis
// or implied, of GRNET S.A.
37 589a14ca Miltiadis Vasilakis
38 589a14ca Miltiadis Vasilakis
#import "PithosPreferencesController.h"
39 470e6f81 Miltiadis Vasilakis
#import "PithosBrowserController.h"
40 470e6f81 Miltiadis Vasilakis
#import "PithosAccountNode.h"
41 ca913781 Miltiadis Vasilakis
#import "PithosContainerNode.h"
42 ca913781 Miltiadis Vasilakis
#import "PithosSubdirNode.h"
43 ca913781 Miltiadis Vasilakis
#import "PithosObjectNode.h"
44 ca913781 Miltiadis Vasilakis
#import "PithosEmptyNode.h"
45 d8426ffb Miltiadis Vasilakis
#import "PithosAccount.h"
46 589a14ca Miltiadis Vasilakis
#import "pithos_macosAppDelegate.h"
47 589a14ca Miltiadis Vasilakis
48 ca913781 Miltiadis Vasilakis
#import "ImageAndTextCell.h"
49 ca913781 Miltiadis Vasilakis
@interface PithosPreferencesSyncOutlineViewCell : ImageAndTextCell {}
50 ca913781 Miltiadis Vasilakis
@end
51 ca913781 Miltiadis Vasilakis
52 ca913781 Miltiadis Vasilakis
@implementation PithosPreferencesSyncOutlineViewCell
53 ca913781 Miltiadis Vasilakis
54 ca913781 Miltiadis Vasilakis
- (void)setObjectValue:(id)object {
55 ca913781 Miltiadis Vasilakis
    if ([object isKindOfClass:[PithosNode class]]) {
56 ca913781 Miltiadis Vasilakis
        PithosNode *node = (PithosNode *)object;
57 ca913781 Miltiadis Vasilakis
        [self setStringValue:node.displayName];
58 ca913781 Miltiadis Vasilakis
        [self setImage:node.icon];
59 ca913781 Miltiadis Vasilakis
        [self setEditable:NO];
60 ca913781 Miltiadis Vasilakis
    } else {
61 ca913781 Miltiadis Vasilakis
        [super setObjectValue:object];
62 ca913781 Miltiadis Vasilakis
    }
63 ca913781 Miltiadis Vasilakis
}
64 ca913781 Miltiadis Vasilakis
65 ca913781 Miltiadis Vasilakis
@end
66 ca913781 Miltiadis Vasilakis
67 589a14ca Miltiadis Vasilakis
@implementation PithosPreferencesController
68 904acde2 Miltiadis Vasilakis
@synthesize selectedPithosAccount;
69 d8426ffb Miltiadis Vasilakis
@synthesize accountsArrayController;
70 d8426ffb Miltiadis Vasilakis
@synthesize accountRemoveEnable;
71 d8426ffb Miltiadis Vasilakis
@synthesize serverURL, authUser, authToken, manual, loginEnable, loginCancelEnable;
72 ca913781 Miltiadis Vasilakis
@synthesize syncActive, syncDirectoryPath, syncContainersDictionary, syncApplyEnable, syncCancelEnable, 
73 ca913781 Miltiadis Vasilakis
            syncContainersOutlineView, syncContainersRootFilesNodes;
74 470e6f81 Miltiadis Vasilakis
@synthesize groupsDictionaryController, selectedGroupMembersDictionaryController;
75 470e6f81 Miltiadis Vasilakis
76 470e6f81 Miltiadis Vasilakis
#pragma mark -
77 470e6f81 Miltiadis Vasilakis
#pragma mark Object Lifecycle
78 589a14ca Miltiadis Vasilakis
79 589a14ca Miltiadis Vasilakis
- (id)init {
80 589a14ca Miltiadis Vasilakis
    return [super initWithWindowNibName:@"PithosPreferencesController"];
81 589a14ca Miltiadis Vasilakis
}
82 589a14ca Miltiadis Vasilakis
83 589a14ca Miltiadis Vasilakis
- (void)windowDidLoad {
84 589a14ca Miltiadis Vasilakis
    [super windowDidLoad];
85 589a14ca Miltiadis Vasilakis
    
86 589a14ca Miltiadis Vasilakis
    NSWindow *window = [self window];
87 589a14ca Miltiadis Vasilakis
    [window setHidesOnDeactivate:NO];
88 589a14ca Miltiadis Vasilakis
    [window setExcludedFromWindowsMenu:YES];
89 589a14ca Miltiadis Vasilakis
    
90 d8426ffb Miltiadis Vasilakis
//	// Select the first tab when the window is loaded for the first time.
91 d8426ffb Miltiadis Vasilakis
//	[[window valueForKeyPath:@"toolbar"] setSelectedItemIdentifier:@"0"];
92 ca913781 Miltiadis Vasilakis
    
93 ca913781 Miltiadis Vasilakis
    [[[syncContainersOutlineView tableColumns] objectAtIndex:1] setDataCell:[[[PithosPreferencesSyncOutlineViewCell alloc] init] autorelease]];
94 ca913781 Miltiadis Vasilakis
    
95 470e6f81 Miltiadis Vasilakis
    [groupsDictionaryController setInitialKey:@"group"];
96 470e6f81 Miltiadis Vasilakis
    [groupsDictionaryController setInitialValue:@"user"];
97 470e6f81 Miltiadis Vasilakis
    [selectedGroupMembersDictionaryController setInitialKey:@"user"];
98 470e6f81 Miltiadis Vasilakis
    [selectedGroupMembersDictionaryController setInitialValue:@""];
99 470e6f81 Miltiadis Vasilakis
100 2d9996a2 Miltiadis Vasilakis
    [window setDelegate:self];
101 d8426ffb Miltiadis Vasilakis
    
102 d8426ffb Miltiadis Vasilakis
    self.selectedPithosAccount = [[accountsArrayController selectedObjects] objectAtIndex:0];
103 d8426ffb Miltiadis Vasilakis
    [accountsArrayController addObserver:self forKeyPath:@"selection" options:NSKeyValueObservingOptionNew context:NULL];
104 ca913781 Miltiadis Vasilakis
    [[NSNotificationCenter defaultCenter] addObserver:self 
105 ca913781 Miltiadis Vasilakis
                                             selector:@selector(selectedPithosAccountNodeChildrenUpdated:) 
106 ca913781 Miltiadis Vasilakis
                                                 name:@"SelectedPithosAccountNodeChildrenUpdated" 
107 ca913781 Miltiadis Vasilakis
                                               object:nil];
108 589a14ca Miltiadis Vasilakis
}
109 589a14ca Miltiadis Vasilakis
110 d8426ffb Miltiadis Vasilakis
- (BOOL)windowShouldClose:(id)sender {
111 d8426ffb Miltiadis Vasilakis
    return [(pithos_macosAppDelegate *)[[NSApplication sharedApplication] delegate] activated];
112 589a14ca Miltiadis Vasilakis
}
113 589a14ca Miltiadis Vasilakis
114 d8426ffb Miltiadis Vasilakis
//- (void)windowWillClose:(NSNotification *)notification {
115 d8426ffb Miltiadis Vasilakis
//}
116 d8426ffb Miltiadis Vasilakis
117 d8426ffb Miltiadis Vasilakis
//- (IBAction)toolbarItemSelected:(id)sender {
118 d8426ffb Miltiadis Vasilakis
//}
119 d8426ffb Miltiadis Vasilakis
120 d8426ffb Miltiadis Vasilakis
#pragma mark -
121 d8426ffb Miltiadis Vasilakis
#pragma Observers
122 d8426ffb Miltiadis Vasilakis
123 d8426ffb Miltiadis Vasilakis
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context {
124 d8426ffb Miltiadis Vasilakis
    if ([object isEqualTo:accountsArrayController] && 
125 d8426ffb Miltiadis Vasilakis
        [keyPath isEqualToString:@"selection"] && 
126 d8426ffb Miltiadis Vasilakis
        [[accountsArrayController selectedObjects] count]) {
127 d8426ffb Miltiadis Vasilakis
        self.selectedPithosAccount = [[accountsArrayController selectedObjects] objectAtIndex:0];
128 d8426ffb Miltiadis Vasilakis
    }
129 d8426ffb Miltiadis Vasilakis
}
130 d8426ffb Miltiadis Vasilakis
131 ca913781 Miltiadis Vasilakis
- (void)selectedPithosAccountNodeChildrenUpdated:(NSNotification *)notification {
132 ca913781 Miltiadis Vasilakis
    [syncContainersOutlineView reloadData];
133 ca913781 Miltiadis Vasilakis
    [syncContainersOutlineView expandItem:nil expandChildren:YES];
134 ca913781 Miltiadis Vasilakis
}
135 ca913781 Miltiadis Vasilakis
136 d8426ffb Miltiadis Vasilakis
#pragma mark -
137 d8426ffb Miltiadis Vasilakis
#pragma Update
138 d8426ffb Miltiadis Vasilakis
139 d8426ffb Miltiadis Vasilakis
- (void)updateAccounts {
140 d8426ffb Miltiadis Vasilakis
    pithos_macosAppDelegate *delegate = (pithos_macosAppDelegate *)[[NSApplication sharedApplication] delegate];
141 d8426ffb Miltiadis Vasilakis
    self.accountRemoveEnable = (delegate.activated && ([delegate.pithosAccounts count] > 1));
142 d8426ffb Miltiadis Vasilakis
}
143 d8426ffb Miltiadis Vasilakis
144 d8426ffb Miltiadis Vasilakis
- (void)updateLogin {
145 d8426ffb Miltiadis Vasilakis
    self.loginEnable = ([selectedPithosAccount urlIsValid:serverURL] && (!manual || ([authUser length] && [authToken length])));
146 d8426ffb Miltiadis Vasilakis
    self.loginCancelEnable = (![selectedPithosAccount.serverURL isEqualToString:serverURL] || 
147 d8426ffb Miltiadis Vasilakis
                              (selectedPithosAccount.authUser && ![selectedPithosAccount.authUser isEqualToString:authUser]) || 
148 d8426ffb Miltiadis Vasilakis
                              (selectedPithosAccount.authToken && ![selectedPithosAccount.authToken isEqualToString:authToken]));
149 d8426ffb Miltiadis Vasilakis
}
150 d8426ffb Miltiadis Vasilakis
151 d8426ffb Miltiadis Vasilakis
- (void)updateSync {
152 d8426ffb Miltiadis Vasilakis
    BOOL isDirectory;
153 d8426ffb Miltiadis Vasilakis
    self.syncApplyEnable = (selectedPithosAccount.active && 
154 d8426ffb Miltiadis Vasilakis
                            ((selectedPithosAccount.syncActive != syncActive) || 
155 d8426ffb Miltiadis Vasilakis
                             (![selectedPithosAccount.syncDirectoryPath isEqualToString:syncDirectoryPath] && 
156 d8426ffb Miltiadis Vasilakis
                              (![[NSFileManager defaultManager] fileExistsAtPath:syncDirectoryPath isDirectory:&isDirectory] || 
157 ca913781 Miltiadis Vasilakis
                               isDirectory)) ||
158 ca913781 Miltiadis Vasilakis
                             ![selectedPithosAccount.syncContainersDictionary isEqualToDictionary:syncContainersDictionary]));
159 d8426ffb Miltiadis Vasilakis
    self.syncCancelEnable = (selectedPithosAccount.active && 
160 d8426ffb Miltiadis Vasilakis
                             ((selectedPithosAccount.syncActive != syncActive) || 
161 ca913781 Miltiadis Vasilakis
                              ![selectedPithosAccount.syncDirectoryPath isEqualToString:syncDirectoryPath] ||
162 ca913781 Miltiadis Vasilakis
                              ![selectedPithosAccount.syncContainersDictionary isEqualToDictionary:syncContainersDictionary]));
163 589a14ca Miltiadis Vasilakis
}
164 589a14ca Miltiadis Vasilakis
165 589a14ca Miltiadis Vasilakis
#pragma mark -
166 dbfd951b Miltiadis Vasilakis
#pragma Properties
167 589a14ca Miltiadis Vasilakis
168 d8426ffb Miltiadis Vasilakis
- (void)setSelectedPithosAccount:(PithosAccount *)aSelectedPithosAccount {
169 d8426ffb Miltiadis Vasilakis
    if (aSelectedPithosAccount && ![aSelectedPithosAccount isEqualTo:selectedPithosAccount]) {
170 ca913781 Miltiadis Vasilakis
        selectedPithosAccount.accountNode.childrenUpdatedNotificationName = nil;
171 d8426ffb Miltiadis Vasilakis
        [selectedPithosAccount release];
172 d8426ffb Miltiadis Vasilakis
        selectedPithosAccount = [aSelectedPithosAccount retain];
173 ca913781 Miltiadis Vasilakis
        selectedPithosAccount.accountNode.childrenUpdatedNotificationName = [NSString stringWithString:@"SelectedPithosAccountNodeChildrenUpdated"];
174 d8426ffb Miltiadis Vasilakis
        
175 d8426ffb Miltiadis Vasilakis
        [self updateAccounts];
176 d8426ffb Miltiadis Vasilakis
        [self loginCancel:self];
177 d8426ffb Miltiadis Vasilakis
        [self syncCancel:self];
178 d8426ffb Miltiadis Vasilakis
        [self groupsRevert:self];
179 d8426ffb Miltiadis Vasilakis
    }
180 d8426ffb Miltiadis Vasilakis
}
181 d8426ffb Miltiadis Vasilakis
182 d8426ffb Miltiadis Vasilakis
#pragma Login Properties
183 d8426ffb Miltiadis Vasilakis
184 d8426ffb Miltiadis Vasilakis
- (void)setServerURL:(NSString *)aServerURL {
185 d8426ffb Miltiadis Vasilakis
    [serverURL release];
186 d8426ffb Miltiadis Vasilakis
    serverURL = [aServerURL copy];
187 d8426ffb Miltiadis Vasilakis
    [self updateLogin];
188 d8426ffb Miltiadis Vasilakis
}
189 d8426ffb Miltiadis Vasilakis
190 d8426ffb Miltiadis Vasilakis
- (void)setAuthUser:(NSString *)anAuthUser {
191 d8426ffb Miltiadis Vasilakis
    [authUser release];
192 d8426ffb Miltiadis Vasilakis
    authUser = [anAuthUser copy];
193 d8426ffb Miltiadis Vasilakis
    [self updateLogin];
194 d8426ffb Miltiadis Vasilakis
}
195 d8426ffb Miltiadis Vasilakis
196 d8426ffb Miltiadis Vasilakis
- (void)setAuthToken:(NSString *)anAuthToken {
197 d8426ffb Miltiadis Vasilakis
    [authToken release];
198 d8426ffb Miltiadis Vasilakis
    authToken = [anAuthToken copy];
199 d8426ffb Miltiadis Vasilakis
    [self updateLogin];
200 d8426ffb Miltiadis Vasilakis
}
201 d8426ffb Miltiadis Vasilakis
202 dbfd951b Miltiadis Vasilakis
- (void)setManual:(BOOL)aManual {
203 dbfd951b Miltiadis Vasilakis
    manual = aManual;
204 d8426ffb Miltiadis Vasilakis
    [self updateLogin];
205 dbfd951b Miltiadis Vasilakis
    if (!manual) {
206 ca913781 Miltiadis Vasilakis
        self.authUser = selectedPithosAccount.authUser;
207 ca913781 Miltiadis Vasilakis
        self.authToken = selectedPithosAccount.authToken;
208 dbfd951b Miltiadis Vasilakis
    }
209 74314fd6 Miltiadis Vasilakis
}
210 74314fd6 Miltiadis Vasilakis
211 d8426ffb Miltiadis Vasilakis
#pragma Sync Properties
212 d8426ffb Miltiadis Vasilakis
213 d8426ffb Miltiadis Vasilakis
- (void)setSyncActive:(BOOL)aSyncActive {
214 d8426ffb Miltiadis Vasilakis
    syncActive = aSyncActive;
215 d8426ffb Miltiadis Vasilakis
    [self updateSync];
216 d8426ffb Miltiadis Vasilakis
}
217 d8426ffb Miltiadis Vasilakis
218 d8426ffb Miltiadis Vasilakis
- (void)setSyncDirectoryPath:(NSString *)aSyncDirectoryPath {
219 d8426ffb Miltiadis Vasilakis
    [syncDirectoryPath release];
220 d8426ffb Miltiadis Vasilakis
    syncDirectoryPath = [aSyncDirectoryPath copy];
221 d8426ffb Miltiadis Vasilakis
    [self updateSync];
222 d8426ffb Miltiadis Vasilakis
}
223 d8426ffb Miltiadis Vasilakis
224 ca913781 Miltiadis Vasilakis
- (void)setSyncContainersDictionary:(NSMutableDictionary *)aSyncContainersDictionary {
225 ca913781 Miltiadis Vasilakis
    [syncContainersDictionary release];
226 ca913781 Miltiadis Vasilakis
    syncContainersDictionary = [[NSMutableDictionary alloc] initWithCapacity:[aSyncContainersDictionary count]];
227 ca913781 Miltiadis Vasilakis
    for (NSString *containerName in aSyncContainersDictionary) {
228 ca913781 Miltiadis Vasilakis
        [syncContainersDictionary setObject:[NSMutableArray arrayWithArray:[aSyncContainersDictionary objectForKey:containerName]] 
229 ca913781 Miltiadis Vasilakis
                                                                    forKey:containerName];
230 ca913781 Miltiadis Vasilakis
    }
231 ca913781 Miltiadis Vasilakis
    [self updateSync];
232 ca913781 Miltiadis Vasilakis
}
233 ca913781 Miltiadis Vasilakis
234 dbfd951b Miltiadis Vasilakis
#pragma mark -
235 d8426ffb Miltiadis Vasilakis
#pragma Actions
236 d8426ffb Miltiadis Vasilakis
237 d8426ffb Miltiadis Vasilakis
- (IBAction)addAccount:(id)sender {
238 d8426ffb Miltiadis Vasilakis
    [accountsArrayController addObject:[PithosAccount pithosAccount]];
239 d8426ffb Miltiadis Vasilakis
    [self updateAccounts];
240 d8426ffb Miltiadis Vasilakis
    pithos_macosAppDelegate *delegate = (pithos_macosAppDelegate *)[[NSApplication sharedApplication] delegate];
241 d8426ffb Miltiadis Vasilakis
    [delegate.pithosAccountsDictionary setObject:selectedPithosAccount forKey:selectedPithosAccount.name];
242 d8426ffb Miltiadis Vasilakis
    [delegate savePithosAccounts:self];
243 d8426ffb Miltiadis Vasilakis
}
244 d8426ffb Miltiadis Vasilakis
245 d8426ffb Miltiadis Vasilakis
- (IBAction)removeAccount:(id)sender {
246 d8426ffb Miltiadis Vasilakis
    [self updateAccounts];
247 d8426ffb Miltiadis Vasilakis
    if (!accountRemoveEnable)
248 d8426ffb Miltiadis Vasilakis
        return;
249 d8426ffb Miltiadis Vasilakis
    PithosAccount *removedPithosAccount = [selectedPithosAccount retain];
250 d8426ffb Miltiadis Vasilakis
    pithos_macosAppDelegate *delegate = (pithos_macosAppDelegate *)[[NSApplication sharedApplication] delegate];
251 d8426ffb Miltiadis Vasilakis
    if ([delegate.currentPithosAccount isEqualTo:removedPithosAccount] && [delegate.pithosBrowserController operationsPending]) {
252 d8426ffb Miltiadis Vasilakis
        NSAlert *alert = [[[NSAlert alloc] init] autorelease];
253 d8426ffb Miltiadis Vasilakis
        [alert setMessageText:@"Operations Pending"];
254 d8426ffb Miltiadis Vasilakis
        [alert setInformativeText:@"There are pending operations in the browser, do you want to remove the account and cancel them?"];
255 d8426ffb Miltiadis Vasilakis
        [alert addButtonWithTitle:@"OK"];
256 d8426ffb Miltiadis Vasilakis
        [alert addButtonWithTitle:@"Cancel"];
257 d8426ffb Miltiadis Vasilakis
        NSInteger choice = [alert runModal];
258 d8426ffb Miltiadis Vasilakis
        if (choice == NSAlertSecondButtonReturn) {
259 d8426ffb Miltiadis Vasilakis
            [removedPithosAccount release];
260 d8426ffb Miltiadis Vasilakis
            return;
261 d8426ffb Miltiadis Vasilakis
        }
262 d8426ffb Miltiadis Vasilakis
    }
263 d8426ffb Miltiadis Vasilakis
    [accountsArrayController removeObject:selectedPithosAccount];
264 d8426ffb Miltiadis Vasilakis
    [delegate.pithosAccountsDictionary removeObjectForKey:removedPithosAccount.name];
265 d8426ffb Miltiadis Vasilakis
    [delegate removedPithosAccount:removedPithosAccount];
266 d8426ffb Miltiadis Vasilakis
    [delegate savePithosAccounts:self];
267 d8426ffb Miltiadis Vasilakis
    [removedPithosAccount release];
268 d8426ffb Miltiadis Vasilakis
    [self updateAccounts];
269 d8426ffb Miltiadis Vasilakis
}
270 d8426ffb Miltiadis Vasilakis
271 d8426ffb Miltiadis Vasilakis
#pragma Login Actions
272 dbfd951b Miltiadis Vasilakis
273 d8426ffb Miltiadis Vasilakis
- (IBAction)login:(id)sender {
274 d8426ffb Miltiadis Vasilakis
    if (!manual) {
275 d8426ffb Miltiadis Vasilakis
        [selectedPithosAccount loginWithServerURL:serverURL];
276 dbfd951b Miltiadis Vasilakis
    } else {
277 d8426ffb Miltiadis Vasilakis
        [selectedPithosAccount authenticateWithServerURL:serverURL authUser:authUser authToken:authToken];
278 d8426ffb Miltiadis Vasilakis
        self.manual = NO;
279 d8426ffb Miltiadis Vasilakis
        pithos_macosAppDelegate *delegate = (pithos_macosAppDelegate *)[[NSApplication sharedApplication] delegate];
280 d8426ffb Miltiadis Vasilakis
        [delegate savePithosAccounts:self];
281 d8426ffb Miltiadis Vasilakis
        if (!delegate.activated) {
282 d8426ffb Miltiadis Vasilakis
            delegate.activated = YES;
283 d8426ffb Miltiadis Vasilakis
            [delegate showPithosBrowser:self];
284 d8426ffb Miltiadis Vasilakis
        }
285 d8426ffb Miltiadis Vasilakis
        if ([selectedPithosAccount isEqualTo:delegate.currentPithosAccount])
286 d8426ffb Miltiadis Vasilakis
            delegate.pithosBrowserController.pithos = selectedPithosAccount.pithos;
287 dbfd951b Miltiadis Vasilakis
    }
288 589a14ca Miltiadis Vasilakis
}
289 589a14ca Miltiadis Vasilakis
290 d8426ffb Miltiadis Vasilakis
- (IBAction)loginCancel:(id)server {
291 ca913781 Miltiadis Vasilakis
    self.serverURL = selectedPithosAccount.serverURL;
292 ca913781 Miltiadis Vasilakis
    self.authUser = selectedPithosAccount.authUser;
293 ca913781 Miltiadis Vasilakis
    self.authToken = selectedPithosAccount.authToken;
294 d8426ffb Miltiadis Vasilakis
}
295 d8426ffb Miltiadis Vasilakis
296 d8426ffb Miltiadis Vasilakis
#pragma Sync Actions
297 d8426ffb Miltiadis Vasilakis
298 d8426ffb Miltiadis Vasilakis
- (IBAction)syncApply:(id)sender {
299 ca913781 Miltiadis Vasilakis
    [selectedPithosAccount updateSyncWithSyncActive:syncActive 
300 ca913781 Miltiadis Vasilakis
                                  syncDirectoryPath:syncDirectoryPath 
301 ca913781 Miltiadis Vasilakis
                           syncContainersDictionary:syncContainersDictionary];
302 d8426ffb Miltiadis Vasilakis
    [self updateSync];
303 d8426ffb Miltiadis Vasilakis
    pithos_macosAppDelegate *delegate = (pithos_macosAppDelegate *)[[NSApplication sharedApplication] delegate];
304 d8426ffb Miltiadis Vasilakis
    [delegate savePithosAccounts:self];
305 ca913781 Miltiadis Vasilakis
    [delegate sync];
306 d8426ffb Miltiadis Vasilakis
}
307 d8426ffb Miltiadis Vasilakis
308 d8426ffb Miltiadis Vasilakis
- (IBAction)syncCancel:(id)sender {
309 d8426ffb Miltiadis Vasilakis
    self.syncActive = selectedPithosAccount.syncActive;
310 ca913781 Miltiadis Vasilakis
    self.syncDirectoryPath = selectedPithosAccount.syncDirectoryPath;
311 ca913781 Miltiadis Vasilakis
    self.syncContainersDictionary = selectedPithosAccount.syncContainersDictionary;
312 ca913781 Miltiadis Vasilakis
    self.syncContainersRootFilesNodes = [NSMutableDictionary dictionary];
313 ca913781 Miltiadis Vasilakis
    [self selectedPithosAccountNodeChildrenUpdated:nil];
314 ca913781 Miltiadis Vasilakis
}
315 ca913781 Miltiadis Vasilakis
316 ca913781 Miltiadis Vasilakis
- (IBAction)syncRefresh:(id)sender {
317 ca913781 Miltiadis Vasilakis
    selectedPithosAccount.accountNode.forcedRefresh = YES;
318 ca913781 Miltiadis Vasilakis
    [selectedPithosAccount.accountNode invalidateChildrenRecursive];
319 ca913781 Miltiadis Vasilakis
    if (selectedPithosAccount.accountNode.children) {
320 ca913781 Miltiadis Vasilakis
    }
321 d8426ffb Miltiadis Vasilakis
}
322 d8426ffb Miltiadis Vasilakis
323 470e6f81 Miltiadis Vasilakis
#pragma mark Groups Actions
324 470e6f81 Miltiadis Vasilakis
325 d8426ffb Miltiadis Vasilakis
- (IBAction)groupsApply:(id)sender {
326 470e6f81 Miltiadis Vasilakis
    [[self window] makeFirstResponder:nil];
327 d8426ffb Miltiadis Vasilakis
    if (selectedPithosAccount.active)
328 d8426ffb Miltiadis Vasilakis
        [selectedPithosAccount.accountNode applyInfo];
329 d8426ffb Miltiadis Vasilakis
}
330 d8426ffb Miltiadis Vasilakis
331 d8426ffb Miltiadis Vasilakis
- (IBAction)groupsRevert:(id)sender {
332 d8426ffb Miltiadis Vasilakis
    if (selectedPithosAccount.active && selectedPithosAccount.accountNode)
333 d8426ffb Miltiadis Vasilakis
        [selectedPithosAccount.accountNode refreshInfo];
334 470e6f81 Miltiadis Vasilakis
}
335 470e6f81 Miltiadis Vasilakis
336 ca913781 Miltiadis Vasilakis
#pragma mark -
337 ca913781 Miltiadis Vasilakis
#pragma mark NSOutlineViewDataSource
338 ca913781 Miltiadis Vasilakis
339 ca913781 Miltiadis Vasilakis
- (NSInteger)outlineView:(NSOutlineView *)outlineView numberOfChildrenOfItem:(id)item {
340 3916144e Miltiadis Vasilakis
    if (!selectedPithosAccount.active)
341 3916144e Miltiadis Vasilakis
        return 0;
342 ca913781 Miltiadis Vasilakis
    if (outlineView == syncContainersOutlineView) {
343 3916144e Miltiadis Vasilakis
        if (item == nil) {
344 3916144e Miltiadis Vasilakis
            if (selectedPithosAccount.accountNode.children)
345 3916144e Miltiadis Vasilakis
                return selectedPithosAccount.accountNode.children.count;
346 3916144e Miltiadis Vasilakis
        } else if ([item class] == [PithosContainerNode class]) {
347 ca913781 Miltiadis Vasilakis
            // We add 1 for the root files node
348 ca913781 Miltiadis Vasilakis
            NSInteger subdirCount = 1;
349 ca913781 Miltiadis Vasilakis
            for (PithosNode *node in [(PithosContainerNode *)item children]) {
350 ca913781 Miltiadis Vasilakis
                if ([node class] == [PithosSubdirNode class])
351 ca913781 Miltiadis Vasilakis
                    subdirCount++;
352 ca913781 Miltiadis Vasilakis
            }
353 ca913781 Miltiadis Vasilakis
            return subdirCount;
354 ca913781 Miltiadis Vasilakis
        }
355 ca913781 Miltiadis Vasilakis
    }
356 ca913781 Miltiadis Vasilakis
    return 0;
357 ca913781 Miltiadis Vasilakis
}
358 ca913781 Miltiadis Vasilakis
359 ca913781 Miltiadis Vasilakis
- (id)outlineView:(NSOutlineView *)outlineView child:(NSInteger)index ofItem:(id)item {
360 ca913781 Miltiadis Vasilakis
    if (outlineView == syncContainersOutlineView) {
361 ca913781 Miltiadis Vasilakis
        if (item == nil)
362 ca913781 Miltiadis Vasilakis
            return [selectedPithosAccount.accountNode.children objectAtIndex:index];
363 ca913781 Miltiadis Vasilakis
        if ([item class] == [PithosContainerNode class]) {
364 ca913781 Miltiadis Vasilakis
            PithosContainerNode *containerNode = (PithosContainerNode *)item;
365 ca913781 Miltiadis Vasilakis
            NSInteger currentSubdirIndex = -1;
366 ca913781 Miltiadis Vasilakis
            for (PithosNode *node in containerNode.children) {
367 ca913781 Miltiadis Vasilakis
                if ([node class] == [PithosSubdirNode class]) {
368 ca913781 Miltiadis Vasilakis
                    currentSubdirIndex++;
369 ca913781 Miltiadis Vasilakis
                    if (currentSubdirIndex == index)
370 ca913781 Miltiadis Vasilakis
                        return node;
371 ca913781 Miltiadis Vasilakis
                }
372 ca913781 Miltiadis Vasilakis
            }
373 ca913781 Miltiadis Vasilakis
            if (++currentSubdirIndex == index) {
374 ca913781 Miltiadis Vasilakis
                PithosEmptyNode *rootFilesNode = [syncContainersRootFilesNodes objectForKey:containerNode.displayName];
375 ca913781 Miltiadis Vasilakis
                if (!rootFilesNode) {
376 ca913781 Miltiadis Vasilakis
                    rootFilesNode = [[[PithosEmptyNode alloc] initWithDisplayName:@"<root files>" 
377 ca913781 Miltiadis Vasilakis
                                                                             icon:[[NSWorkspace sharedWorkspace] iconForFileType:@""]] 
378 ca913781 Miltiadis Vasilakis
                                     autorelease];
379 ca913781 Miltiadis Vasilakis
                    rootFilesNode.parent = containerNode;
380 ca913781 Miltiadis Vasilakis
                    [syncContainersRootFilesNodes setObject:rootFilesNode forKey:containerNode.displayName];
381 ca913781 Miltiadis Vasilakis
                }
382 ca913781 Miltiadis Vasilakis
                return rootFilesNode;
383 ca913781 Miltiadis Vasilakis
            }
384 ca913781 Miltiadis Vasilakis
        }
385 ca913781 Miltiadis Vasilakis
    }
386 ca913781 Miltiadis Vasilakis
    return nil;
387 ca913781 Miltiadis Vasilakis
}
388 ca913781 Miltiadis Vasilakis
389 ca913781 Miltiadis Vasilakis
- (BOOL)outlineView:(NSOutlineView *)outlineView isItemExpandable:(id)item {
390 ca913781 Miltiadis Vasilakis
    if (outlineView == syncContainersOutlineView) {
391 ca913781 Miltiadis Vasilakis
        if ([item class] == [PithosContainerNode class])
392 ca913781 Miltiadis Vasilakis
            return YES;
393 ca913781 Miltiadis Vasilakis
    }
394 ca913781 Miltiadis Vasilakis
    return NO;
395 ca913781 Miltiadis Vasilakis
}
396 ca913781 Miltiadis Vasilakis
397 ca913781 Miltiadis Vasilakis
- (id)outlineView:(NSOutlineView *)outlineView objectValueForTableColumn:(NSTableColumn *)tableColumn byItem:(id)item {
398 ca913781 Miltiadis Vasilakis
    if (outlineView == syncContainersOutlineView) {
399 ca913781 Miltiadis Vasilakis
        if ([[tableColumn identifier] isEqualToString:@"sync"]) {
400 ca913781 Miltiadis Vasilakis
            if ([item class] == [PithosContainerNode class]) {
401 ca913781 Miltiadis Vasilakis
                // A container is 
402 ca913781 Miltiadis Vasilakis
                // off if not in dictionary
403 ca913781 Miltiadis Vasilakis
                // mixed if in dictionary with exclusions
404 ca913781 Miltiadis Vasilakis
                // on if in dictionary without exclusions
405 ca913781 Miltiadis Vasilakis
                PithosContainerNode *node = (PithosContainerNode *)item;
406 ca913781 Miltiadis Vasilakis
                NSMutableArray *containerExcludedDirectories = [syncContainersDictionary objectForKey:node.displayName];
407 ca913781 Miltiadis Vasilakis
                if (containerExcludedDirectories) {
408 ca913781 Miltiadis Vasilakis
                    if ([containerExcludedDirectories count])
409 ca913781 Miltiadis Vasilakis
                        return [NSNumber numberWithUnsignedInteger:NSMixedState];
410 ca913781 Miltiadis Vasilakis
                    else
411 ca913781 Miltiadis Vasilakis
                        return [NSNumber numberWithUnsignedInteger:NSOnState];
412 ca913781 Miltiadis Vasilakis
                }
413 ca913781 Miltiadis Vasilakis
                return [NSNumber numberWithUnsignedInteger:NSOffState];
414 ca913781 Miltiadis Vasilakis
            } else if ([item class] == [PithosSubdirNode class]) {
415 ca913781 Miltiadis Vasilakis
                // Root files are off if parent container not in dictionary or if excluded
416 ca913781 Miltiadis Vasilakis
                // displayName should be localized and lowercased
417 ca913781 Miltiadis Vasilakis
                PithosSubdirNode *node = (PithosSubdirNode *)item;
418 ca913781 Miltiadis Vasilakis
                NSMutableArray *containerExcludedDirectories = [syncContainersDictionary objectForKey:node.parent.displayName];
419 ca913781 Miltiadis Vasilakis
                NSString *directoryName = [[node.displayName lowercaseString] stringByReplacingOccurrencesOfString:@"/" withString:@":"];
420 ca913781 Miltiadis Vasilakis
                if (!containerExcludedDirectories || [containerExcludedDirectories containsObject:directoryName])
421 ca913781 Miltiadis Vasilakis
                    return [NSNumber numberWithUnsignedInteger:NSOffState];
422 ca913781 Miltiadis Vasilakis
                else
423 ca913781 Miltiadis Vasilakis
                    return [NSNumber numberWithUnsignedInteger:NSOnState];
424 ca913781 Miltiadis Vasilakis
            } else if ([item class] == [PithosEmptyNode class]) {
425 ca913781 Miltiadis Vasilakis
                // Root files are off if parent container not in dictionary or if excluded
426 ca913781 Miltiadis Vasilakis
                PithosEmptyNode *node = (PithosEmptyNode *)item;
427 ca913781 Miltiadis Vasilakis
                NSMutableArray *containerExcludedDirectories = [syncContainersDictionary objectForKey:node.parent.displayName];
428 ca913781 Miltiadis Vasilakis
                if (!containerExcludedDirectories || [containerExcludedDirectories containsObject:@""])
429 ca913781 Miltiadis Vasilakis
                    return [NSNumber numberWithUnsignedInteger:NSOffState];
430 ca913781 Miltiadis Vasilakis
                else
431 ca913781 Miltiadis Vasilakis
                    return [NSNumber numberWithUnsignedInteger:NSOnState];
432 ca913781 Miltiadis Vasilakis
            }
433 ca913781 Miltiadis Vasilakis
            return [NSNumber numberWithUnsignedInteger:NSOffState];
434 ca913781 Miltiadis Vasilakis
        } else if ([[tableColumn identifier] isEqualToString:@"path"]) {
435 ca913781 Miltiadis Vasilakis
            return (PithosNode *)item;
436 ca913781 Miltiadis Vasilakis
        }
437 ca913781 Miltiadis Vasilakis
    }
438 ca913781 Miltiadis Vasilakis
    return nil;
439 ca913781 Miltiadis Vasilakis
}
440 ca913781 Miltiadis Vasilakis
441 ca913781 Miltiadis Vasilakis
- (void)outlineView:(NSOutlineView *)outlineView setObjectValue:(id)object forTableColumn:(NSTableColumn *)tableColumn byItem:(id)item {
442 ca913781 Miltiadis Vasilakis
    if (outlineView == syncContainersOutlineView) {
443 ca913781 Miltiadis Vasilakis
        if ([[tableColumn identifier] isEqualToString:@"sync"]) {
444 ca913781 Miltiadis Vasilakis
            NSCellStateValue newState = [object unsignedIntegerValue];
445 ca913781 Miltiadis Vasilakis
            if ([item class] == [PithosContainerNode class]) {
446 ca913781 Miltiadis Vasilakis
                // If new state is
447 ca913781 Miltiadis Vasilakis
                // mixed/on include container with no excluded directories
448 ca913781 Miltiadis Vasilakis
                // off exclude container
449 ca913781 Miltiadis Vasilakis
                PithosContainerNode *node = (PithosContainerNode *)item;
450 ca913781 Miltiadis Vasilakis
                if ((newState == NSOnState) || (newState == NSMixedState)) {
451 ca913781 Miltiadis Vasilakis
                    [syncContainersDictionary setObject:[NSMutableArray array] forKey:node.displayName];
452 ca913781 Miltiadis Vasilakis
                } else {
453 ca913781 Miltiadis Vasilakis
                    [syncContainersDictionary removeObjectForKey:node.displayName];
454 ca913781 Miltiadis Vasilakis
                }
455 ca913781 Miltiadis Vasilakis
                [outlineView reloadItem:item reloadChildren:YES];
456 ca913781 Miltiadis Vasilakis
            } else if ([item class] == [PithosSubdirNode class]) {
457 ca913781 Miltiadis Vasilakis
                // If new state is
458 ca913781 Miltiadis Vasilakis
                // mixed/on include directory (if container not included, include and exclude all others)
459 ca913781 Miltiadis Vasilakis
                // off exclude directory
460 ca913781 Miltiadis Vasilakis
                PithosSubdirNode *node = (PithosSubdirNode *)item;
461 ca913781 Miltiadis Vasilakis
                NSMutableArray *containerExcludedDirectories = [syncContainersDictionary objectForKey:node.parent.displayName];
462 ca913781 Miltiadis Vasilakis
                NSString *directoryName = [[node.displayName lowercaseString] stringByReplacingOccurrencesOfString:@"/" withString:@":"];
463 ca913781 Miltiadis Vasilakis
                if ((newState == NSOnState) || (newState == NSMixedState)) {
464 ca913781 Miltiadis Vasilakis
                    if (containerExcludedDirectories) {
465 ca913781 Miltiadis Vasilakis
                        [containerExcludedDirectories removeObject:directoryName];
466 ca913781 Miltiadis Vasilakis
                    } else {
467 ca913781 Miltiadis Vasilakis
                        NSMutableArray *newContainerExcludeDirectories = [NSMutableArray arrayWithObject:@""];
468 ca913781 Miltiadis Vasilakis
                        for (PithosNode *siblingNode in node.parent.children) {
469 ca913781 Miltiadis Vasilakis
                            if ([siblingNode class] == [PithosSubdirNode class]) {
470 ca913781 Miltiadis Vasilakis
                                NSString *siblingDirectoryName = [[siblingNode.displayName lowercaseString] stringByReplacingOccurrencesOfString:@"/" withString:@":"];
471 ca913781 Miltiadis Vasilakis
                                if (![siblingDirectoryName isEqualToString:directoryName] && 
472 ca913781 Miltiadis Vasilakis
                                    ![newContainerExcludeDirectories containsObject:siblingDirectoryName])
473 ca913781 Miltiadis Vasilakis
                                    [newContainerExcludeDirectories addObject:siblingDirectoryName];
474 ca913781 Miltiadis Vasilakis
                            }
475 ca913781 Miltiadis Vasilakis
                        }
476 ca913781 Miltiadis Vasilakis
                        [syncContainersDictionary setObject:newContainerExcludeDirectories forKey:node.parent.displayName];
477 ca913781 Miltiadis Vasilakis
                    }
478 ca913781 Miltiadis Vasilakis
                } else if (![containerExcludedDirectories containsObject:directoryName]) {
479 ca913781 Miltiadis Vasilakis
                    [containerExcludedDirectories addObject:directoryName];
480 ca913781 Miltiadis Vasilakis
                }
481 ca913781 Miltiadis Vasilakis
                [outlineView reloadItem:[outlineView parentForItem:item]];
482 ca913781 Miltiadis Vasilakis
            } else if ([item class] == [PithosEmptyNode class]) {
483 ca913781 Miltiadis Vasilakis
                // If new state is
484 ca913781 Miltiadis Vasilakis
                // mixed/on include root files (if container not included, include and exclude all others)
485 ca913781 Miltiadis Vasilakis
                // off exclude root files
486 ca913781 Miltiadis Vasilakis
                PithosEmptyNode *node = (PithosEmptyNode *)item;
487 ca913781 Miltiadis Vasilakis
                NSMutableArray *containerExcludedDirectories = [syncContainersDictionary objectForKey:node.parent.displayName];
488 ca913781 Miltiadis Vasilakis
                if ((newState == NSOnState) || (newState == NSMixedState)) {
489 ca913781 Miltiadis Vasilakis
                    if (containerExcludedDirectories) {
490 ca913781 Miltiadis Vasilakis
                        [containerExcludedDirectories removeObject:@""];
491 ca913781 Miltiadis Vasilakis
                    } else {
492 ca913781 Miltiadis Vasilakis
                        NSMutableArray *newContainerExcludeDirectories = [NSMutableArray array];
493 ca913781 Miltiadis Vasilakis
                        for (PithosNode *siblingNode in node.parent.children) {
494 ca913781 Miltiadis Vasilakis
                            if ([siblingNode class] == [PithosSubdirNode class]) {
495 ca913781 Miltiadis Vasilakis
                                NSString *siblingDirectoryName = [[siblingNode.displayName lowercaseString] stringByReplacingOccurrencesOfString:@"/" withString:@":"];
496 ca913781 Miltiadis Vasilakis
                                if (![newContainerExcludeDirectories containsObject:siblingDirectoryName])
497 ca913781 Miltiadis Vasilakis
                                    [newContainerExcludeDirectories addObject:siblingDirectoryName];
498 ca913781 Miltiadis Vasilakis
                            }
499 ca913781 Miltiadis Vasilakis
                        }
500 ca913781 Miltiadis Vasilakis
                        [syncContainersDictionary setObject:newContainerExcludeDirectories forKey:node.parent.displayName];
501 ca913781 Miltiadis Vasilakis
                    }
502 ca913781 Miltiadis Vasilakis
                } else if (![containerExcludedDirectories containsObject:@""]) {
503 ca913781 Miltiadis Vasilakis
                    [containerExcludedDirectories addObject:@""];
504 ca913781 Miltiadis Vasilakis
                }
505 ca913781 Miltiadis Vasilakis
                [outlineView reloadItem:[outlineView parentForItem:item]];
506 ca913781 Miltiadis Vasilakis
            }
507 ca913781 Miltiadis Vasilakis
            [self updateSync];
508 ca913781 Miltiadis Vasilakis
        }
509 ca913781 Miltiadis Vasilakis
    }
510 ca913781 Miltiadis Vasilakis
}
511 ca913781 Miltiadis Vasilakis
512 589a14ca Miltiadis Vasilakis
@end