From 84a583230f79f3bef4cc77f7d1635a47fa0022aa Mon Sep 17 00:00:00 2001 From: "Michael J. Rubinsky" Date: Mon, 15 Dec 2008 15:48:21 -0500 Subject: [PATCH] * 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 --- iPhoto2Ansel/AnselExportController.h | 37 +++- iPhoto2Ansel/AnselExportController.m | 154 ++++++++++++++--- .../English.lproj/AnselServers.nib/designable.nib | 192 +++++++++++++++++++++ .../AnselServers.nib/keyedobjects.nib | Bin 0 -> 1885 bytes iPhoto2Ansel/English.lproj/Panel.nib/classes.nib | 10 ++ iPhoto2Ansel/English.lproj/Panel.nib/info.nib | 3 +- .../English.lproj/Panel.nib/keyedobjects.nib | Bin 14435 -> 18029 bytes iPhoto2Ansel/TURAnselServersPanelController.h | 16 ++ iPhoto2Ansel/TURAnselServersPanelController.m | 14 ++ .../iPhoto2Ansel.xcodeproj/project.pbxproj | 20 ++- 10 files changed, 417 insertions(+), 29 deletions(-) create mode 100644 iPhoto2Ansel/English.lproj/AnselServers.nib/designable.nib create mode 100644 iPhoto2Ansel/English.lproj/AnselServers.nib/keyedobjects.nib create mode 100644 iPhoto2Ansel/TURAnselServersPanelController.h create mode 100644 iPhoto2Ansel/TURAnselServersPanelController.m 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 0000000000000000000000000000000000000000..059faac851597cfb96b59937259f3ca1b526f06f GIT binary patch literal 1885 zcmZ`(eNa?Y6o2>Kdj&z^f#0aG>Z%|}3zB@5wxB2)i?XmF0^4J`>66Dk*!N&rSM+9v zHjb9#o3Z!Lx%b?2e&=_7 z_uSXqt}43WaGXOTCUnHexH@|m3+RgGueKXn`zpH}@U2zARcF_l*D;@=Ckv>z?@UZ= zV|huoB<45J(J^!A2OX^oQG&aR6@$3AJTA(Y`^KkFh zM<3g>|G+bS2M;}ar1r$Cuf6`pTPJJm{!UfBC?$_hNR*P2$BZ2}e!|2_DU+v6O--{+ zn?A!nbJpzij5(QEbF=SqcwFu(O*1@ppDOEmqsv`s@dFBagiEREXSzpLI~jN;x!g{l zkLkM7tf-0+s#IE{XOLT}`Tfuww5_jpxm|J_(@h*$mjz%G)B>$$l!a)X)I&W0Fqd!; zN%+4)QEV+>MwV%QqeAw}YgoW5NiMfX0X{0LRs1bl(Bd8KV;FA29eA5%S3z0UZ2*e~ zi;I=OMLw5L;4^p@AIGO~%BOQXpUUTOfsf#md8S18%(Dr(^YWm#NIxcbPB`{Tsns=A zPQT7nHw&0UutN4T71$dAO;uUoY<@vuQJp0>)9bB;AF}(4ikkqeQ#Z6Wi+tViZ9tFZ zC8e5AlW*yGHetcS`#`?v@aTN(K_`#-sx)EI;<6=6%a<*`zrt0yVr7-Py2evmmkG^T z;&>Dm^h)E0w$x4;v1xw|5b4v(#=46NOq?Qo$$myhOB5)ya< zEE4PgB?C9xst%}a#qg%gwjk#gC`cX-1L+9;oWfjK=H%oT^z=Yddq;mqab%36db756 zRW=wL>BfN3SqvIibQ&@YxSJU@z=Roa{lRWNz7Jy7hX=wN%+ZO)I0FGWR14#7T8P`Y ziKh&>9&&=f6M2j|w2#1`PJ(N6w!?4BC!6mTaJFse-%xDEZ-;niS{jdmMy`9hJfR9Gf72s?z`!k}CCg zF2~Dp1+K!?*n{hEJ#N5FIE1(2$MK7J5Pyiz<4gD|zJ{;kU-57FcRWNWi6aSQ9GOOn z$U;&=YDhh4BCVu@bdhcnA{)tOvWx5`2S^_|L=KbZ$P45sIYy3?ljL3U0r`l0OwN%D zC{Qf=u%ovU33LqNja>#vX^4jD7TQa<(;ajt-A$jMd+0v8pB|tC^f0`3_(Wt`;dInS4L$J> DohWpk literal 0 HcmV?d00001 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 b3b6d4d8c0a618c21d1a5d2c51e826100e7f75d9..72e41a5687a40a7251f92516839585673955393f 100644 GIT binary patch literal 18029 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 literal 14435 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

4JJmg-ohTI2+b3b{2JV@H$yAIa< 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 + + +@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 = ( -- 2.11.0