From: Michael J. Rubinsky Date: Mon, 15 Dec 2008 20:48:21 +0000 (-0500) Subject: * The start of implementing the ability to store multiple ansel server X-Git-Url: https://git.internetallee.de/?a=commitdiff_plain;h=84a583230f79f3bef4cc77f7d1635a47fa0022aa;p=horde.git * The start of implementing the ability to store multiple ansel server configurations instead of having to type all the connection info on each load. * Some more playing around with the UI as well --- diff --git a/iPhoto2Ansel/AnselExportController.h b/iPhoto2Ansel/AnselExportController.h index 1cfb926bb..30105d3f3 100644 --- a/iPhoto2Ansel/AnselExportController.h +++ b/iPhoto2Ansel/AnselExportController.h @@ -13,6 +13,16 @@ @class FBProgressController; @class TURNewGalleryController; +// User defaults keys +extern NSString * const TURAnselServersKey; +extern NSString * const TURAnselExportSize; + +// Server property keys +extern NSString * const TURAnselServerNickKey; +extern NSString * const TURAnselServerEndpointKey; +extern NSString * const TURAnselServerUsernameKey; +extern NSString * const TURAnselServerPasswordKey; + @interface AnselExportController : NSObject { // Export manager passed in from iPhoto @@ -24,21 +34,32 @@ //Outlets IBOutlet NSPopUpButton *mSizePopUp; - IBOutlet NSPopUpButton *mQualityPopUp; - IBOutlet NSTextField *anselHostURL; - IBOutlet NSTextField *username; - IBOutlet NSSecureTextField *password; IBOutlet NSComboBox *galleryCombo; + IBOutlet NSComboBox *mServers; IBOutlet NSTextField *connectedLabel; + IBOutlet NSProgressIndicator *spinner; + IBOutlet NSImageView *defaultImageView; IBOutlet NSButton *beginButton; IBOutlet NSButton *newGalleryButton; - IBOutlet NSProgressIndicator *spinner; + IBOutlet NSButton *newServerButton; + + // New Gallery Sheet (uses it's own controller) IBOutlet NSWindow *newGallerySheet; - IBOutlet NSImageView *defaultImageView; - + + // New Server sheet + IBOutlet NSWindow *newServerSheet; + IBOutlet NSTextField *anselHostURL; + IBOutlet NSTextField *username; + IBOutlet NSSecureTextField *password; + IBOutlet NSTextField *serverNickName; + // Progress struct (This one is part of the protocol, but we don't use it) ExportPluginProgress progress; + // Currently selected server data + NSMutableArray *anselServers; + NSDictionary *currentServer; + // This is our real progress controller (stolen from Facebook exporter). FBProgressController *progressController; @@ -60,6 +81,8 @@ // Actions - (IBAction) doConnect: (id)sender; - (IBAction) showNewGallery: (id)sender; +- (IBAction) doAddServer: (id)sender; +- (IBAction) doCancelAddServer: (id)sender; // overrides - (void)awakeFromNib; diff --git a/iPhoto2Ansel/AnselExportController.m b/iPhoto2Ansel/AnselExportController.m index 09fb9af56..9c82bc13e 100644 --- a/iPhoto2Ansel/AnselExportController.m +++ b/iPhoto2Ansel/AnselExportController.m @@ -20,6 +20,16 @@ - (void)canExport; @end +// User default keys +NSString * const TURAnselServersKey = @"AnselServers"; +NSString * const TURAnselExportSize = @"AnselExportSize"; + +// Server property keys +NSString * const TURAnselServerNickKey = @"nickname"; +NSString * const TURAnselServerEndpointKey = @"endpoint"; +NSString * const TURAnselServerUsernameKey = @"username"; +NSString * const TURAnselServerPasswordKey = @"password"; + @implementation AnselExportController @synthesize currentGallery; @@ -30,16 +40,46 @@ */ - (void)awakeFromNib { + // Register Application Defaults + NSMutableDictionary *defaultValues = [NSMutableDictionary dictionary]; + [defaultValues setObject: [NSNumber numberWithInt: 2] + forKey: TURAnselExportSize]; + [defaultValues setObject: [[NSMutableArray alloc] init] forKey: TURAnselServersKey]; + NSUserDefaults *userPrefs = [NSUserDefaults standardUserDefaults]; + [userPrefs registerDefaults: defaultValues]; + + // Get any saved server data + anselServers = [userPrefs objectForKey: TURAnselServersKey]; + // UI Defaults - [mSizePopUp selectItemWithTag:2]; + [mSizePopUp selectItemWithTag: [userPrefs integerForKey:TURAnselExportSize]]; [connectedLabel setStringValue:@"Not Connected"]; [connectedLabel setTextColor: [NSColor redColor]]; [spinner stopAnimation:self]; + + // For now, update the user pref for size every time it changes - will + // eventually put this in a pref sheet. + [[NSNotificationCenter defaultCenter] addObserver: self + selector: @selector(sizeChoiceWillChange:) + name: @"NSPopUpButtonWillPopUpNotification" + object: nil]; + + // See if we have any configured servers + anselServers = [[NSMutableArray alloc] initWithArray: [userPrefs objectForKey:TURAnselServersKey]]; + + // Need to wait until iPhoto's export window is fully loaded before attempting + // to show a sheet? + [[NSNotificationCenter defaultCenter] addObserver: self + selector: @selector(exportWindowDidBecomeKey:) + name: NSWindowDidBecomeKeyNotification + object :nil]; } -(void)dealloc { //anselController is released from the AnselController delegate method. [progressController release]; + [anselServers release]; + [currentServer release]; [super dealloc]; } @@ -53,9 +93,10 @@ -(void)doConnect: (id)sender { NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; - NSDictionary *p = [[NSDictionary alloc] initWithObjects: [NSArray arrayWithObjects:[anselHostURL stringValue], - [username stringValue], - [password stringValue], nil] + NSDictionary *p = [[NSDictionary alloc] initWithObjects: [NSArray arrayWithObjects: + [currentServer objectForKey:TURAnselServerEndpointKey], + [currentServer objectForKey:TURAnselServerUsernameKey], + [currentServer objectForKey:TURAnselServerPasswordKey]] forKeys: [NSArray arrayWithObjects:@"endpoint", @"username", @"password", nil]]; // Create our controller anselController = [[TURAnsel alloc] initWithConnectionParameters:p]; @@ -85,11 +126,40 @@ } } -//- (IBAction)cancelNewGallery: (id)sender -//{ -// [NSApp endSheet: newGallerySheet]; -// [newGallerySheet orderOut: nil]; -//} + +// Server setup sheet +-(IBAction)doAddServer: (id)sender +{ + // Sanity Checking + // TODO - make sure we don't have more than one gallery with the same + // nick?? + if (![[serverNickName stringValue] length]) { + // TODO: Errors - for now, just silently fail, yea, I know.... + return; + } + + NSDictionary *newServer = [[NSDictionary alloc] initWithObjectsAndKeys: + [serverNickName stringValue], TURAnselServerNickKey, + [anselHostURL stringValue], TURAnselServerEndpointKey, + [username stringValue], TURAnselServerUsernameKey, + [password stringValue], TURAnselServerPasswordKey, + nil]; + [anselServers addObject: newServer]; + NSLog(@"After adding it: %@", [anselServers objectAtIndex:0]); + [NSApp endSheet: newServerSheet]; + [newServerSheet orderOut: nil]; + [mServers reloadData]; + + // Save it to the userdefaults + NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults]; + [prefs setObject:anselServers forKey:TURAnselServersKey]; +} + +- (IBAction)doCancelAddServer: (id)sender +{ + [NSApp endSheet: newServerSheet]; + [newServerSheet orderOut: nil]; +} #pragma mark ExportPluginProtocol // Initialize @@ -406,24 +476,68 @@ } #pragma mark comboBoxDelegate +// Probably should have a seperate controller for each combobox, but this is +// pretty small stuff... - (void)comboBoxSelectionDidChange:(NSNotification *)notification -{ - int row = [galleryCombo indexOfSelectedItem]; - [currentGallery setDelegate:nil]; - [currentGallery autorelease]; - currentGallery = [[anselController getGalleryByIndex:row] retain]; - [currentGallery setDelegate: self]; - NSImage *theImage = [[NSImage alloc] initWithContentsOfURL: [currentGallery galleryDefaultImageURL]]; - [defaultImageView setImage: theImage]; - [theImage release]; - [self canExport]; +{ + // Yes, I'm comparing the pointers here on purpose + if ([notification object] == galleryCombo) { + int row = [galleryCombo indexOfSelectedItem]; + [currentGallery setDelegate:nil]; + [currentGallery autorelease]; + currentGallery = [[anselController getGalleryByIndex:row] retain]; + [currentGallery setDelegate: self]; + NSImage *theImage = [[NSImage alloc] initWithContentsOfURL: [currentGallery galleryDefaultImageURL]]; + [defaultImageView setImage: theImage]; + [theImage release]; + [self canExport]; + } else if ([notification object] == mServers) { + NSLog(@"Changed server selection"); + [currentServer release]; + currentServer = [anselServers objectAtIndex: [mServers indexOfSelectedItem]]; + } } +#pragma mark TURAnselGalleryPanel Notifications - (void)TURAnselGalleryPanelDidAddGallery { - NSLog(@"Before reload"); // Reload the NSComboBox and autoselect the last item. [galleryCombo reloadData]; [galleryCombo selectItemAtIndex: [galleryCombo numberOfItems] - 1]; } + +#pragma mark export notifications +- (void)exportWindowDidBecomeKey: (NSNotification *)notification +{ + // Make sure we have a server configured, or throw up the dialog. + if (![anselServers count]) { + NSLog(@"No servers!!"); + [NSApp beginSheet: newServerSheet + modalForWindow: [self window] + modalDelegate: nil + didEndSelector: nil + contextInfo: nil]; + } else { + // We have servers, fill in the drop down + + } +} +- (void)sizeChoiceWillChange: (NSNotification *)notification +{ + NSInteger newSize = [mSizePopUp selectedTag]; + NSUserDefaults *userPrefs = [NSUserDefaults standardUserDefaults]; + [userPrefs setInteger: newSize forKey:TURAnselExportSize]; + [userPrefs synchronize]; +} + +#pragma mark NSComboBoxDatasource delegates (used for server list) +- (id)comboBox: (NSComboBox *)aComboBox objectValueForItemAtIndex: (NSInteger)index +{ + NSDictionary *server = [anselServers objectAtIndex: index]; + return [server objectForKey:TURAnselServerNickKey]; +} +- (NSInteger)numberOfItemsInComboBox: (NSComboBox *)aComboBox +{ + return [anselServers count]; +} @end \ No newline at end of file diff --git a/iPhoto2Ansel/English.lproj/AnselServers.nib/designable.nib b/iPhoto2Ansel/English.lproj/AnselServers.nib/designable.nib new file mode 100644 index 000000000..a4cabc8cb --- /dev/null +++ b/iPhoto2Ansel/English.lproj/AnselServers.nib/designable.nib @@ -0,0 +1,192 @@ + + + + 1050 + 9F33 + 672 + 949.34 + 352.00 + + YES + + + + YES + com.apple.InterfaceBuilder.CocoaPlugin + + + YES + + TURAnselServersPanelController + + + FirstResponder + + + NSApplication + + + 15 + 2 + {{196, 240}, {480, 270}} + 536870912 + Ansel Servers + NSWindow + + {3.40282e+38, 3.40282e+38} + + + 256 + {480, 270} + + + {{0, 0}, {1680, 1028}} + {3.40282e+38, 3.40282e+38} + + + + + YES + + + + YES + + 0 + + YES + + + + + + -2 + + + RmlsZSdzIE93bmVyA + + + -1 + + + First Responder + + + -3 + + + Application + + + 1 + + + YES + + + + + + 2 + + + + + + + YES + + YES + -1.IBPluginDependency + -2.IBPluginDependency + -3.IBPluginDependency + 1.IBEditorWindowLastContentRect + 1.IBPluginDependency + 1.IBWindowTemplateEditedContentRect + 1.NSWindowTemplate.visibleAtLaunch + 1.WindowOrigin + 1.editorWindowContentRectSynchronizationRect + 2.IBPluginDependency + + + YES + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + {{21, 852}, {480, 270}} + com.apple.InterfaceBuilder.CocoaPlugin + {{21, 852}, {480, 270}} + + {196, 240} + {{357, 418}, {480, 270}} + com.apple.InterfaceBuilder.CocoaPlugin + + + + YES + + YES + + + YES + + + + + YES + + YES + + + YES + + + + 2 + + + + YES + + NSObject + + IBProjectSource + TURAnsel.h + + + + NSObject + + IBProjectSource + TURAnselGallery.h + + + + NSObject + + IBProjectSource + TURAnselGalleryPanelController.h + + + + NSObject + + IBProjectSource + xmlrpc-1.5.1/XMLRPCConnection.h + + + + TURAnselServersPanelController + NSObject + + IBProjectSource + TURAnselServersPanelController.h + + + + + 0 + ../iPhoto2Ansel.xcodeproj + 3 + + diff --git a/iPhoto2Ansel/English.lproj/AnselServers.nib/keyedobjects.nib b/iPhoto2Ansel/English.lproj/AnselServers.nib/keyedobjects.nib new file mode 100644 index 000000000..059faac85 Binary files /dev/null and b/iPhoto2Ansel/English.lproj/AnselServers.nib/keyedobjects.nib differ diff --git a/iPhoto2Ansel/English.lproj/Panel.nib/classes.nib b/iPhoto2Ansel/English.lproj/Panel.nib/classes.nib index 38b98a848..e68e9eb3d 100644 --- a/iPhoto2Ansel/English.lproj/Panel.nib/classes.nib +++ b/iPhoto2Ansel/English.lproj/Panel.nib/classes.nib @@ -22,6 +22,10 @@ cancelNewGallery id + doAddServer + id + doCancelAddServer + id doConnect id doNewGallery @@ -59,6 +63,8 @@ id mQualityPopUp NSPopUpButton + mServers + NSComboBox mSettingsBox NSBox mSizePopUp @@ -69,8 +75,12 @@ NSButton newGallerySheet NSWindow + newServerSheet + NSWindow password NSSecureTextField + serverNickName + NSTextField spinner NSProgressIndicator username diff --git a/iPhoto2Ansel/English.lproj/Panel.nib/info.nib b/iPhoto2Ansel/English.lproj/Panel.nib/info.nib index 63f50dec8..9003e369c 100644 --- a/iPhoto2Ansel/English.lproj/Panel.nib/info.nib +++ b/iPhoto2Ansel/English.lproj/Panel.nib/info.nib @@ -10,7 +10,8 @@ 5 IBOpenObjects - 137 + 388 + 7 IBSystem Version 9F33 diff --git a/iPhoto2Ansel/English.lproj/Panel.nib/keyedobjects.nib b/iPhoto2Ansel/English.lproj/Panel.nib/keyedobjects.nib index b3b6d4d8c..72e41a568 100644 Binary files a/iPhoto2Ansel/English.lproj/Panel.nib/keyedobjects.nib and b/iPhoto2Ansel/English.lproj/Panel.nib/keyedobjects.nib differ diff --git a/iPhoto2Ansel/TURAnselServersPanelController.h b/iPhoto2Ansel/TURAnselServersPanelController.h new file mode 100644 index 000000000..7e1d64eda --- /dev/null +++ b/iPhoto2Ansel/TURAnselServersPanelController.h @@ -0,0 +1,16 @@ +// +// TURAnselServersPanelController.h +// iPhoto2Ansel +// +// Created by Michael Rubinsky on 12/14/08. +// Copyright 2008 __MyCompanyName__. All rights reserved. +// + +#import + + +@interface TURAnselServersPanelController : NSObject { + +} + +@end diff --git a/iPhoto2Ansel/TURAnselServersPanelController.m b/iPhoto2Ansel/TURAnselServersPanelController.m new file mode 100644 index 000000000..b00a797ac --- /dev/null +++ b/iPhoto2Ansel/TURAnselServersPanelController.m @@ -0,0 +1,14 @@ +// +// TURAnselServersPanelController.m +// iPhoto2Ansel +// +// Created by Michael Rubinsky on 12/14/08. +// Copyright 2008 __MyCompanyName__. All rights reserved. +// + +#import "TURAnselServersPanelController.h" + + +@implementation TURAnselServersPanelController + +@end diff --git a/iPhoto2Ansel/iPhoto2Ansel.xcodeproj/project.pbxproj b/iPhoto2Ansel/iPhoto2Ansel.xcodeproj/project.pbxproj index 18aedf3dc..d39ba363a 100644 --- a/iPhoto2Ansel/iPhoto2Ansel.xcodeproj/project.pbxproj +++ b/iPhoto2Ansel/iPhoto2Ansel.xcodeproj/project.pbxproj @@ -9,6 +9,8 @@ /* Begin PBXBuildFile section */ 8D5B49B0048680CD000E48DA /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 089C167DFE841241C02AAC07 /* InfoPlist.strings */; }; 8D5B49B4048680CD000E48DA /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7ADFEA557BF11CA2CBB /* Cocoa.framework */; }; + B00EF55A0EF5DD5900A9D71C /* AnselServers.nib in Resources */ = {isa = PBXBuildFile; fileRef = B00EF5580EF5DD5900A9D71C /* AnselServers.nib */; }; + B00EF5670EF5E22900A9D71C /* TURAnselServersPanelController.m in Sources */ = {isa = PBXBuildFile; fileRef = B00EF5660EF5E22900A9D71C /* TURAnselServersPanelController.m */; }; B04FC1A90EEB4A2B008EEB0E /* AnselGalleryPanel.nib in Resources */ = {isa = PBXBuildFile; fileRef = B04FC1A70EEB4A2B008EEB0E /* AnselGalleryPanel.nib */; }; B05C4A060EE9E001005B4B28 /* ImageResizer.m in Sources */ = {isa = PBXBuildFile; fileRef = B05C4A050EE9E001005B4B28 /* ImageResizer.m */; }; B06C1E030EB1644600BFAFCB /* AnselExportPluginBox.m in Sources */ = {isa = PBXBuildFile; fileRef = B06C1E020EB1644600BFAFCB /* AnselExportPluginBox.m */; }; @@ -74,6 +76,9 @@ 32DBCF630370AF2F00C91783 /* iPhoto2Ansel_Prefix.pch */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = iPhoto2Ansel_Prefix.pch; sourceTree = ""; }; 8D5B49B6048680CD000E48DA /* iPhoto2Ansel.iPhotoExporter */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = iPhoto2Ansel.iPhotoExporter; sourceTree = BUILT_PRODUCTS_DIR; }; 8D5B49B7048680CD000E48DA /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + B00EF5590EF5DD5900A9D71C /* English */ = {isa = PBXFileReference; lastKnownFileType = wrapper.nib; name = English; path = English.lproj/AnselServers.nib; sourceTree = ""; }; + B00EF5650EF5E22900A9D71C /* TURAnselServersPanelController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TURAnselServersPanelController.h; sourceTree = ""; }; + B00EF5660EF5E22900A9D71C /* TURAnselServersPanelController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = TURAnselServersPanelController.m; sourceTree = ""; }; B03D3B590ED5BB3800CF5B92 /* XMLRPC-Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = "XMLRPC-Info.plist"; sourceTree = SOURCE_ROOT; }; B04FC1A80EEB4A2B008EEB0E /* English */ = {isa = PBXFileReference; lastKnownFileType = wrapper.nib; name = English; path = English.lproj/AnselGalleryPanel.nib; sourceTree = ""; }; B05C4A040EE9E001005B4B28 /* ImageResizer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ImageResizer.h; sourceTree = ""; }; @@ -151,7 +156,6 @@ 089C167CFE841241C02AAC07 /* Resources */, 089C1671FE841209C02AAC07 /* Frameworks and Libraries */, 19C28FB8FE9D52D311CA2CBB /* Products */, - B04FC1A70EEB4A2B008EEB0E /* AnselGalleryPanel.nib */, ); name = iPhoto2Ansel; sourceTree = ""; @@ -169,6 +173,8 @@ 089C167CFE841241C02AAC07 /* Resources */ = { isa = PBXGroup; children = ( + B00EF5580EF5DD5900A9D71C /* AnselServers.nib */, + B04FC1A70EEB4A2B008EEB0E /* AnselGalleryPanel.nib */, B0C888480ED85DEA000E19FB /* ProgressSheet.nib */, B06C1E3C0EB17E3700BFAFCB /* Panel.nib */, 8D5B49B7048680CD000E48DA /* Info.plist */, @@ -247,6 +253,8 @@ B07D426D0EC230B100B59765 /* TURAnsel.m */, B07D426E0EC230B100B59765 /* TURAnselGallery.h */, B07D426F0EC230B100B59765 /* TURAnselGallery.m */, + B00EF5650EF5E22900A9D71C /* TURAnselServersPanelController.h */, + B00EF5660EF5E22900A9D71C /* TURAnselServersPanelController.m */, ); name = AnselToolkit; sourceTree = ""; @@ -381,6 +389,7 @@ B06C1E3D0EB17E3700BFAFCB /* Panel.nib in Resources */, B0C888490ED85DEA000E19FB /* ProgressSheet.nib in Resources */, B04FC1A90EEB4A2B008EEB0E /* AnselGalleryPanel.nib in Resources */, + B00EF55A0EF5DD5900A9D71C /* AnselServers.nib in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -409,6 +418,7 @@ B0C8884E0ED85E02000E19FB /* FBProgressController.m in Sources */, B05C4A060EE9E001005B4B28 /* ImageResizer.m in Sources */, B0CCED420EEC6E810012D3D3 /* TURAnselGalleryPanelController.m in Sources */, + B00EF5670EF5E22900A9D71C /* TURAnselServersPanelController.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -445,6 +455,14 @@ name = InfoPlist.strings; sourceTree = ""; }; + B00EF5580EF5DD5900A9D71C /* AnselServers.nib */ = { + isa = PBXVariantGroup; + children = ( + B00EF5590EF5DD5900A9D71C /* English */, + ); + name = AnselServers.nib; + sourceTree = ""; + }; B04FC1A70EEB4A2B008EEB0E /* AnselGalleryPanel.nib */ = { isa = PBXVariantGroup; children = (