├── Epeg.framework ├── Versions │ ├── A │ │ ├── A │ │ ├── Headers │ │ │ ├── Headers │ │ │ └── EpegWrapper.h │ │ ├── Resources │ │ │ ├── Resources │ │ │ ├── English.lproj │ │ │ │ └── InfoPlist.strings │ │ │ └── Info.plist │ │ └── Epeg │ └── Current ├── Epeg ├── Headers └── Resources ├── Sparkle.framework ├── Versions │ ├── Current │ └── A │ │ ├── Resources │ │ ├── fr_CA.lproj │ │ ├── de.lproj │ │ │ └── Sparkle.strings │ │ ├── en.lproj │ │ │ └── Sparkle.strings │ │ ├── es.lproj │ │ │ └── Sparkle.strings │ │ ├── fr.lproj │ │ │ └── Sparkle.strings │ │ ├── it.lproj │ │ │ └── Sparkle.strings │ │ ├── nl.lproj │ │ │ └── Sparkle.strings │ │ ├── ru.lproj │ │ │ └── Sparkle.strings │ │ ├── sv.lproj │ │ │ └── Sparkle.strings │ │ ├── Info.plist │ │ └── SUModelTranslation.plist │ │ ├── Sparkle │ │ └── Headers │ │ ├── SUAppcast.h │ │ ├── SUVersionComparisonProtocol.h │ │ ├── Sparkle.h │ │ ├── SUAppcastItem.h │ │ └── SUUpdater.h ├── Headers ├── Resources └── Sparkle ├── add.png ├── flag.png ├── gmap.png ├── left.png ├── Flagged.png ├── folder.png ├── remove.png ├── right.png ├── trash.png ├── slideshow.png ├── fullscreen.png ├── CocoaSlideShow.psd ├── FlaggedHeader.png ├── CocoaSlideShow.icns ├── English.lproj ├── InfoPlist.strings └── Localizable.strings ├── art ├── CocoaSlideShow_screenshot_small.jpg ├── CocoaSlideShow_screenshot_map_small.png └── CocoaSlideShow_Spotlight_screenshot_small.png ├── Credits.html ├── CocoaSlideShow_Prefix.pch ├── CSSImageView.h ├── CSSWindow.h ├── appcast ├── sign_update.rb └── appcast.xml ├── CSSBorderlessWindow.h ├── .gitignore ├── main.m ├── CocoaSlideShow.xcodeproj ├── .svn │ ├── all-wcprops │ ├── entries │ └── text-base │ │ └── project.pbxproj.svn-base └── project.pbxproj ├── NSFileManager+CSS.h ├── UserDefaults.plist ├── NSString+CSS.h ├── AppDelegate+Toolbar.h ├── CSSBorderlessWindow.m ├── CSSMapController.h ├── NSImage+CSS.h ├── NSString+CSS.m ├── CSSWindow.m ├── ImagesController.h ├── css_dsa_pub.pem ├── CSSImageInfo.h ├── Info.plist ├── CSSImageView.m ├── RemoteControlContainer.h ├── AppDelegate.h ├── NSFileManager+CSS.m ├── French.lproj └── Localizable.strings ├── RemoteControlContainer.m ├── README.md ├── ImagesController.m ├── NSImage+CSS.m ├── CSSMapController.m ├── AppDelegate+Toolbar.m ├── CSSImageInfo.m └── AppDelegate.m /Epeg.framework/Versions/A/A: -------------------------------------------------------------------------------- 1 | A -------------------------------------------------------------------------------- /Epeg.framework/Versions/Current: -------------------------------------------------------------------------------- 1 | A -------------------------------------------------------------------------------- /Sparkle.framework/Versions/Current: -------------------------------------------------------------------------------- 1 | A -------------------------------------------------------------------------------- /Epeg.framework/Epeg: -------------------------------------------------------------------------------- 1 | Versions/Current/Epeg -------------------------------------------------------------------------------- /Epeg.framework/Headers: -------------------------------------------------------------------------------- 1 | Versions/Current/Headers -------------------------------------------------------------------------------- /Epeg.framework/Resources: -------------------------------------------------------------------------------- 1 | Versions/Current/Resources -------------------------------------------------------------------------------- /Sparkle.framework/Headers: -------------------------------------------------------------------------------- 1 | Versions/Current/Headers -------------------------------------------------------------------------------- /Sparkle.framework/Resources: -------------------------------------------------------------------------------- 1 | Versions/Current/Resources -------------------------------------------------------------------------------- /Sparkle.framework/Sparkle: -------------------------------------------------------------------------------- 1 | Versions/Current/Sparkle -------------------------------------------------------------------------------- /Sparkle.framework/Versions/A/Resources/fr_CA.lproj: -------------------------------------------------------------------------------- 1 | fr.lproj -------------------------------------------------------------------------------- /Epeg.framework/Versions/A/Headers/Headers: -------------------------------------------------------------------------------- 1 | Versions/Current/Headers -------------------------------------------------------------------------------- /Epeg.framework/Versions/A/Resources/Resources: -------------------------------------------------------------------------------- 1 | Versions/Current/Resources -------------------------------------------------------------------------------- /add.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nst/CocoaSlideShow/master/add.png -------------------------------------------------------------------------------- /flag.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nst/CocoaSlideShow/master/flag.png -------------------------------------------------------------------------------- /gmap.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nst/CocoaSlideShow/master/gmap.png -------------------------------------------------------------------------------- /left.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nst/CocoaSlideShow/master/left.png -------------------------------------------------------------------------------- /Flagged.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nst/CocoaSlideShow/master/Flagged.png -------------------------------------------------------------------------------- /folder.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nst/CocoaSlideShow/master/folder.png -------------------------------------------------------------------------------- /remove.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nst/CocoaSlideShow/master/remove.png -------------------------------------------------------------------------------- /right.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nst/CocoaSlideShow/master/right.png -------------------------------------------------------------------------------- /trash.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nst/CocoaSlideShow/master/trash.png -------------------------------------------------------------------------------- /slideshow.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nst/CocoaSlideShow/master/slideshow.png -------------------------------------------------------------------------------- /fullscreen.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nst/CocoaSlideShow/master/fullscreen.png -------------------------------------------------------------------------------- /CocoaSlideShow.psd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nst/CocoaSlideShow/master/CocoaSlideShow.psd -------------------------------------------------------------------------------- /FlaggedHeader.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nst/CocoaSlideShow/master/FlaggedHeader.png -------------------------------------------------------------------------------- /CocoaSlideShow.icns: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nst/CocoaSlideShow/master/CocoaSlideShow.icns -------------------------------------------------------------------------------- /English.lproj/InfoPlist.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nst/CocoaSlideShow/master/English.lproj/InfoPlist.strings -------------------------------------------------------------------------------- /Epeg.framework/Versions/A/Epeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nst/CocoaSlideShow/master/Epeg.framework/Versions/A/Epeg -------------------------------------------------------------------------------- /Sparkle.framework/Versions/A/Sparkle: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nst/CocoaSlideShow/master/Sparkle.framework/Versions/A/Sparkle -------------------------------------------------------------------------------- /art/CocoaSlideShow_screenshot_small.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nst/CocoaSlideShow/master/art/CocoaSlideShow_screenshot_small.jpg -------------------------------------------------------------------------------- /art/CocoaSlideShow_screenshot_map_small.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nst/CocoaSlideShow/master/art/CocoaSlideShow_screenshot_map_small.png -------------------------------------------------------------------------------- /art/CocoaSlideShow_Spotlight_screenshot_small.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nst/CocoaSlideShow/master/art/CocoaSlideShow_Spotlight_screenshot_small.png -------------------------------------------------------------------------------- /Credits.html: -------------------------------------------------------------------------------- 1 |
http://cocoaslideshow.googlecode.com/
2 | -------------------------------------------------------------------------------- /Sparkle.framework/Versions/A/Resources/de.lproj/Sparkle.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nst/CocoaSlideShow/master/Sparkle.framework/Versions/A/Resources/de.lproj/Sparkle.strings -------------------------------------------------------------------------------- /Sparkle.framework/Versions/A/Resources/en.lproj/Sparkle.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nst/CocoaSlideShow/master/Sparkle.framework/Versions/A/Resources/en.lproj/Sparkle.strings -------------------------------------------------------------------------------- /Sparkle.framework/Versions/A/Resources/es.lproj/Sparkle.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nst/CocoaSlideShow/master/Sparkle.framework/Versions/A/Resources/es.lproj/Sparkle.strings -------------------------------------------------------------------------------- /Sparkle.framework/Versions/A/Resources/fr.lproj/Sparkle.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nst/CocoaSlideShow/master/Sparkle.framework/Versions/A/Resources/fr.lproj/Sparkle.strings -------------------------------------------------------------------------------- /Sparkle.framework/Versions/A/Resources/it.lproj/Sparkle.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nst/CocoaSlideShow/master/Sparkle.framework/Versions/A/Resources/it.lproj/Sparkle.strings -------------------------------------------------------------------------------- /Sparkle.framework/Versions/A/Resources/nl.lproj/Sparkle.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nst/CocoaSlideShow/master/Sparkle.framework/Versions/A/Resources/nl.lproj/Sparkle.strings -------------------------------------------------------------------------------- /Sparkle.framework/Versions/A/Resources/ru.lproj/Sparkle.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nst/CocoaSlideShow/master/Sparkle.framework/Versions/A/Resources/ru.lproj/Sparkle.strings -------------------------------------------------------------------------------- /Sparkle.framework/Versions/A/Resources/sv.lproj/Sparkle.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nst/CocoaSlideShow/master/Sparkle.framework/Versions/A/Resources/sv.lproj/Sparkle.strings -------------------------------------------------------------------------------- /Epeg.framework/Versions/A/Resources/English.lproj/InfoPlist.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nst/CocoaSlideShow/master/Epeg.framework/Versions/A/Resources/English.lproj/InfoPlist.strings -------------------------------------------------------------------------------- /CocoaSlideShow_Prefix.pch: -------------------------------------------------------------------------------- 1 | // 2 | // Prefix header for all source files of the 'CocoaSlideShow' target in the 'CocoaSlideShow' project 3 | // 4 | 5 | #ifdef __OBJC__ 6 | #import 7 | #endif 8 | -------------------------------------------------------------------------------- /CSSImageView.h: -------------------------------------------------------------------------------- 1 | /* MyImageView */ 2 | 3 | #import 4 | 5 | @interface CSSImageView : NSImageView 6 | { 7 | IBOutlet id delegate; 8 | BOOL isDraggingFromSelf; 9 | } 10 | 11 | @end 12 | -------------------------------------------------------------------------------- /CSSWindow.h: -------------------------------------------------------------------------------- 1 | /* MyWindow */ 2 | 3 | #import 4 | #import "ImagesController.h" 5 | 6 | @interface CSSWindow : NSWindow 7 | { 8 | IBOutlet ImagesController *imagesController; 9 | } 10 | 11 | @end 12 | -------------------------------------------------------------------------------- /appcast/sign_update.rb: -------------------------------------------------------------------------------- 1 | #!/usr/bin/ruby 2 | if ARGV.length < 2 3 | puts "Usage: ruby sign_update.rb update_archive private_key" 4 | exit 5 | end 6 | 7 | puts `openssl dgst -sha1 -binary < "#{ARGV[0]}" | openssl dgst -dss1 -sign "#{ARGV[1]}" | openssl enc -base64` -------------------------------------------------------------------------------- /CSSBorderlessWindow.h: -------------------------------------------------------------------------------- 1 | // 2 | // CSSBorderlessWindow.h 3 | // CocoaSlideShow 4 | // 5 | // Created by Nicolas Seriot on 13.07.09. 6 | // Copyright 2009 Sen:te. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | 12 | @interface CSSBorderlessWindow : NSPanel { 13 | 14 | } 15 | 16 | @end 17 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Xcode 2 | .DS_Store 3 | build/ 4 | *.pbxuser 5 | !default.pbxuser 6 | *.mode1v3 7 | !default.mode1v3 8 | *.mode2v3 9 | !default.mode2v3 10 | *.perspectivev3 11 | !default.perspectivev3 12 | *.xcworkspace 13 | !default.xcworkspace 14 | xcuserdata 15 | profile 16 | *.moved-aside 17 | DerivedData 18 | .idea/ 19 | -------------------------------------------------------------------------------- /main.m: -------------------------------------------------------------------------------- 1 | // 2 | // main.m 3 | // CocoaSlideShow 4 | // 5 | // Created by Nicolas Seriot on 20.07.07. 6 | // Copyright __MyCompanyName__ 2007. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | int main(int argc, char *argv[]) 12 | { 13 | return NSApplicationMain(argc, (const char **) argv); 14 | } 15 | -------------------------------------------------------------------------------- /CocoaSlideShow.xcodeproj/.svn/all-wcprops: -------------------------------------------------------------------------------- 1 | K 25 2 | svn:wc:ra_dav:version-url 3 | V 48 4 | /svn/!svn/ver/227/trunk/CocoaSlideShow.xcodeproj 5 | END 6 | project.pbxproj 7 | K 25 8 | svn:wc:ra_dav:version-url 9 | V 64 10 | /svn/!svn/ver/232/trunk/CocoaSlideShow.xcodeproj/project.pbxproj 11 | END 12 | nst.perspective 13 | K 25 14 | svn:wc:ra_dav:version-url 15 | V 63 16 | /svn/!svn/ver/48/trunk/CocoaSlideShow.xcodeproj/nst.perspective 17 | END 18 | -------------------------------------------------------------------------------- /NSFileManager+CSS.h: -------------------------------------------------------------------------------- 1 | // 2 | // NSFileManager+CSS.h 3 | // CocoaSlideShow 4 | // 5 | // Created by Nicolas Seriot on 17.08.07. 6 | // Copyright 2007 __MyCompanyName__. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | 12 | @interface NSFileManager (CSS) 13 | 14 | - (BOOL)isDirectory:(NSString *)path; 15 | - (NSArray *)directoryContentFullPaths:(NSString*)dirPath recursive:(BOOL)isRecursive; 16 | - (NSString *)prettyFileSize:(NSString *)path; 17 | 18 | @end 19 | -------------------------------------------------------------------------------- /UserDefaults.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | mapStyle 6 | G_PHYSICAL_MAP 7 | KMLThumbnailsRemoteURLs 8 | http://foo.com/my_trip/images/ 9 | mapZoom 10 | 10 11 | ApplyNaturalSortOrder 12 | 13 | 14 | 15 | -------------------------------------------------------------------------------- /Epeg.framework/Versions/A/Headers/EpegWrapper.h: -------------------------------------------------------------------------------- 1 | // 2 | // EpegWrapper.h 3 | // Epeg 4 | // 5 | // Created by Marc Liyanage on Fri Jan 16 2004. 6 | // Copyright (c) 2004 __MyCompanyName__. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @interface EpegWrapper : NSObject { 12 | 13 | 14 | } 15 | 16 | + (NSImage *)imageWithPath:(NSString *)path boundingBox:(NSSize)boundingBox; 17 | + (NSImage *)imageWithPath2:(NSString *)path boundingBox:(NSSize)boundingBox; 18 | 19 | @end 20 | -------------------------------------------------------------------------------- /NSString+CSS.h: -------------------------------------------------------------------------------- 1 | // 2 | // NSString+CSS.h 3 | // CocoaSlideShow 4 | // 5 | // Created by Nicolas Seriot on 26.08.07. 6 | // Copyright 2007 __MyCompanyName__. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | extern NSString* const G_HYBRID_MAP; 12 | extern NSString* const G_PHYSICAL_MAP; 13 | extern NSString* const G_SATELLITE_MAP; 14 | extern NSString* const G_NORMAL_MAP; 15 | 16 | @interface NSString (CSS) 17 | 18 | - (NSComparisonResult)numericCompare:(NSString *)aString; 19 | 20 | @end 21 | -------------------------------------------------------------------------------- /AppDelegate+Toolbar.h: -------------------------------------------------------------------------------- 1 | // 2 | // CocoaSlideShow+Toolbar.h 3 | // CocoaSlideShow 4 | // 5 | // Created by Nicolas Seriot on 04.05.08. 6 | // Copyright 2008 Sen:te. All rights reserved. 7 | // 8 | 9 | #import 10 | #import "AppDelegate.h" 11 | 12 | @interface AppDelegate (Toolbar) 13 | 14 | - (NSToolbarItem *)toolbar:(NSToolbar *)toolbar 15 | itemForItemIdentifier:(NSString *)itemIdentifier 16 | willBeInsertedIntoToolbar:(BOOL)flag; 17 | - (NSArray *)toolbarAllowedItemIdentifiers:(NSToolbar*)toolbar; 18 | - (NSArray *)toolbarDefaultItemIdentifiers:(NSToolbar*)toolbar; 19 | 20 | @end 21 | -------------------------------------------------------------------------------- /CSSBorderlessWindow.m: -------------------------------------------------------------------------------- 1 | // 2 | // CSSBorderlessWindow.m 3 | // CocoaSlideShow 4 | // 5 | // Created by Nicolas Seriot on 13.07.09. 6 | // Copyright 2009 Sen:te. All rights reserved. 7 | // 8 | 9 | #import "CSSBorderlessWindow.h" 10 | 11 | 12 | @implementation CSSBorderlessWindow 13 | 14 | - (id)initWithContentRect:(NSRect)contentRect styleMask:(NSUInteger)aStyle backing:(NSBackingStoreType)bufferingType defer:(BOOL)flag { 15 | 16 | self = [super initWithContentRect:contentRect styleMask:NSBorderlessWindowMask backing:NSBackingStoreBuffered defer:NO]; 17 | 18 | [self setBackgroundColor:[NSColor blackColor]]; 19 | 20 | [self setLevel:NSStatusWindowLevel]; 21 | 22 | return self; 23 | } 24 | 25 | @end 26 | -------------------------------------------------------------------------------- /Epeg.framework/Versions/A/Resources/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | English 7 | CFBundleExecutable 8 | Epeg 9 | CFBundleIdentifier 10 | ch.entropy.epegwrapper 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundlePackageType 14 | FMWK 15 | CFBundleSignature 16 | ???? 17 | CFBundleVersion 18 | 1.5 19 | 20 | 21 | -------------------------------------------------------------------------------- /CSSMapController.h: -------------------------------------------------------------------------------- 1 | // 2 | // MapController.h 3 | // CocoaSlideShow 4 | // 5 | // Created by Nicolas Seriot on 14.11.08. 6 | // Copyright 2008 Sen:te. All rights reserved. 7 | // 8 | 9 | #import 10 | #import 11 | 12 | @class ImagesController; 13 | 14 | extern NSString *const G_NORMAL_MAP; 15 | 16 | @interface CSSMapController : NSObject { 17 | IBOutlet MKMapView *mapView; 18 | IBOutlet ImagesController *imagesController; 19 | // WebScriptObject *scriptObject; 20 | 21 | NSMutableSet *displayedImages; 22 | } 23 | 24 | - (void)clearMap; 25 | 26 | - (NSArray *)mapStyles; 27 | 28 | - (void)evaluateNewJavaScriptOnArrangedObjectsChange; 29 | - (void)evaluateNewJavaScriptOnSelectedObjectsChange; 30 | 31 | @end 32 | -------------------------------------------------------------------------------- /NSImage+CSS.h: -------------------------------------------------------------------------------- 1 | // 2 | // NSImage+CSS.h 3 | // CocoaSlideShow 4 | // 5 | // Created by Nicolas Seriot on 19.07.09. 6 | // Copyright 2009 Sen:te. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | 12 | @interface NSImage (CSS) 13 | 14 | + (BOOL)scaleAndSaveJPEGThumbnailFromFile:(NSString *)srcPath 15 | toPath:(NSString *)dstPath 16 | boundingBox:(NSSize)boundingBox 17 | rotation:(int)orientationDegrees 18 | size:(NSSize *)mySize; 19 | 20 | - (BOOL)scaleAndSaveAsJPEGWithMaxWidth:(int)width 21 | maxHeight:(int)height 22 | quality:(float)quality 23 | destination:(NSString *)dest; 24 | 25 | - (NSImage *)rotatedWithAngle:(int)alpha; 26 | 27 | @end 28 | -------------------------------------------------------------------------------- /NSString+CSS.m: -------------------------------------------------------------------------------- 1 | // 2 | // NSString+CSS.m 3 | // CocoaSlideShow 4 | // 5 | // Created by Nicolas Seriot on 26.08.07. 6 | // Copyright 2007 __MyCompanyName__. All rights reserved. 7 | // 8 | 9 | #import "NSString+CSS.h" 10 | 11 | 12 | @implementation NSString (CSS) 13 | 14 | - (NSComparisonResult)numericCompare:(NSString *)aString { 15 | return [self compare:aString options:NSNumericSearch | NSCaseInsensitiveSearch]; 16 | } 17 | 18 | - (NSString *)prettyMapStyle { 19 | if ([self isEqualToString:G_HYBRID_MAP]) return NSLocalizedString(@"Hybrid", @""); 20 | if ([self isEqualToString:G_NORMAL_MAP]) return NSLocalizedString(@"Street", @""); 21 | if ([self isEqualToString:G_PHYSICAL_MAP]) return NSLocalizedString(@"Physical", @""); 22 | if ([self isEqualToString:G_SATELLITE_MAP]) return NSLocalizedString(@"Satellite", @""); 23 | return @"Unknown"; 24 | } 25 | 26 | @end 27 | -------------------------------------------------------------------------------- /CSSWindow.m: -------------------------------------------------------------------------------- 1 | #import "CSSWindow.h" 2 | #import "AppDelegate.h" 3 | 4 | @implementation CSSWindow 5 | 6 | - (BOOL)preservesContentDuringLiveResize { 7 | return NO; 8 | } 9 | 10 | // TODO: use notifications instead 11 | - (void)keyDown:(NSEvent *)theEvent { 12 | AppDelegate *css = (AppDelegate *)[[NSApplication sharedApplication] delegate]; 13 | 14 | //NSLog(@"-- %d", [theEvent keyCode]); 15 | 16 | switch([theEvent keyCode]) { 17 | case 49: // space 18 | [css toggleSlideShow:self]; 19 | break; 20 | case 53: // esc 21 | [css exitFullScreen:self]; 22 | break; 23 | case 123: // left 24 | [css invalidateTimer]; 25 | [imagesController selectPreviousImage]; 26 | break; 27 | case 124: // right 28 | [css invalidateTimer]; 29 | [imagesController selectNextImage]; 30 | break; 31 | default: 32 | [super keyDown:theEvent]; 33 | } 34 | } 35 | 36 | @end 37 | -------------------------------------------------------------------------------- /Sparkle.framework/Versions/A/Headers/SUAppcast.h: -------------------------------------------------------------------------------- 1 | // 2 | // SUAppcast.h 3 | // Sparkle 4 | // 5 | // Created by Andy Matuschak on 3/12/06. 6 | // Copyright 2006 Andy Matuschak. All rights reserved. 7 | // 8 | 9 | #ifndef SUAPPCAST_H 10 | #define SUAPPCAST_H 11 | 12 | #if __has_feature(modules) 13 | @import Foundation; 14 | #else 15 | #import 16 | #endif 17 | #import "SUExport.h" 18 | 19 | NS_ASSUME_NONNULL_BEGIN 20 | 21 | @class SUAppcastItem; 22 | SU_EXPORT @interface SUAppcast : NSObject 23 | 24 | @property (copy, nullable) NSString *userAgentString; 25 | @property (copy, nullable) NSDictionary *httpHeaders; 26 | 27 | - (void)fetchAppcastFromURL:(NSURL *)url inBackground:(BOOL)bg completionBlock:(void (^)(NSError *_Nullable))err; 28 | - (SUAppcast *)copyWithoutDeltaUpdates; 29 | 30 | @property (readonly, copy, nullable) NSArray *items; 31 | @end 32 | 33 | NS_ASSUME_NONNULL_END 34 | 35 | #endif 36 | -------------------------------------------------------------------------------- /CocoaSlideShow.xcodeproj/.svn/entries: -------------------------------------------------------------------------------- 1 | 10 2 | 3 | dir 4 | 228 5 | https://cocoaslideshow.googlecode.com/svn/trunk/CocoaSlideShow.xcodeproj 6 | https://cocoaslideshow.googlecode.com/svn 7 | 8 | 9 | 10 | 2011-08-25T14:17:47.438155Z 11 | 227 12 | nseriot@gmail.com 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | e059ab23-0438-0410-81eb-03c85d175112 28 | 29 | project.pbxproj 30 | file 31 | 232 32 | 33 | 34 | 35 | 2012-12-23T07:10:22.000000Z 36 | 49a6fad4b23c1d8ecc5914b6b6f4801e 37 | 2012-12-23T07:12:06.498183Z 38 | 232 39 | nseriot@gmail.com 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 33742 62 | 63 | nst.perspective 64 | file 65 | 66 | 67 | 68 | 69 | 2011-11-12T00:33:38.000000Z 70 | 7e74533547cb5560ac9f2b4d50ec8310 71 | 2008-04-23T22:04:26.319348Z 72 | 48 73 | nseriot 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 47967 96 | 97 | -------------------------------------------------------------------------------- /Sparkle.framework/Versions/A/Headers/SUVersionComparisonProtocol.h: -------------------------------------------------------------------------------- 1 | // 2 | // SUVersionComparisonProtocol.h 3 | // Sparkle 4 | // 5 | // Created by Andy Matuschak on 12/21/07. 6 | // Copyright 2007 Andy Matuschak. All rights reserved. 7 | // 8 | 9 | #ifndef SUVERSIONCOMPARISONPROTOCOL_H 10 | #define SUVERSIONCOMPARISONPROTOCOL_H 11 | 12 | #if __has_feature(modules) 13 | @import Foundation; 14 | #else 15 | #import 16 | #endif 17 | #import "SUExport.h" 18 | 19 | NS_ASSUME_NONNULL_BEGIN 20 | 21 | /*! 22 | Provides version comparison facilities for Sparkle. 23 | */ 24 | @protocol SUVersionComparison 25 | 26 | /*! 27 | An abstract method to compare two version strings. 28 | 29 | Should return NSOrderedAscending if b > a, NSOrderedDescending if b < a, 30 | and NSOrderedSame if they are equivalent. 31 | */ 32 | - (NSComparisonResult)compareVersion:(NSString *)versionA toVersion:(NSString *)versionB; // *** MAY BE CALLED ON NON-MAIN THREAD! 33 | 34 | @end 35 | 36 | NS_ASSUME_NONNULL_END 37 | #endif 38 | -------------------------------------------------------------------------------- /Sparkle.framework/Versions/A/Headers/Sparkle.h: -------------------------------------------------------------------------------- 1 | // 2 | // Sparkle.h 3 | // Sparkle 4 | // 5 | // Created by Andy Matuschak on 3/16/06. (Modified by CDHW on 23/12/07) 6 | // Copyright 2006 Andy Matuschak. All rights reserved. 7 | // 8 | 9 | #ifndef SPARKLE_H 10 | #define SPARKLE_H 11 | 12 | // This list should include the shared headers. It doesn't matter if some of them aren't shared (unless 13 | // there are name-space collisions) so we can list all of them to start with: 14 | 15 | #import "SUAppcast.h" 16 | #import "SUAppcastItem.h" 17 | #import "SUStandardVersionComparator.h" 18 | #import "SUUpdater.h" 19 | #import "SUUpdaterDelegate.h" 20 | #import "SUVersionComparisonProtocol.h" 21 | #import "SUVersionDisplayProtocol.h" 22 | #import "SUErrors.h" 23 | 24 | #import "SPUDownloader.h" 25 | #import "SPUDownloaderDelegate.h" 26 | #import "SPUDownloaderDeprecated.h" 27 | #import "SPUDownloadData.h" 28 | #import "SPUDownloaderProtocol.h" 29 | #import "SPUDownloaderSession.h" 30 | #import "SPUURLRequest.h" 31 | #import "SUCodeSigningVerifier.h" 32 | 33 | #endif 34 | -------------------------------------------------------------------------------- /ImagesController.h: -------------------------------------------------------------------------------- 1 | /* ImagesController */ 2 | 3 | #import 4 | 5 | @class AppDelegate; 6 | @class CSSImageInfo; 7 | 8 | @interface ImagesController : NSArrayController { 9 | IBOutlet AppDelegate *cocoaSlideShow; 10 | 11 | BOOL importDone; 12 | NSArray *allowedExtensions; 13 | NSString *thumbsDir; 14 | } 15 | 16 | - (NSUndoManager *)undoManager; 17 | - (NSIndexSet *)flaggedIndexes; 18 | - (void)flagIndexes:(NSIndexSet *)indexSet; 19 | - (IBAction)flag:(id)sender; 20 | - (IBAction)unflag:(id)sender; 21 | - (IBAction)toggleFlags:(id)sender; 22 | - (IBAction)selectFlags:(id)sender; 23 | - (IBAction)removeAllFlags:(id)sender; 24 | - (IBAction)remove:(id)sender; 25 | - (IBAction)moveToTrash:(id)sender; 26 | - (BOOL)containsPath:(NSString *)path; 27 | - (BOOL)multipleImagesSelected; 28 | - (void)selectPreviousImage; 29 | - (void)selectNextImage; 30 | - (void)selectNextImageOrFirstOne; 31 | - (void)addFiles:(NSArray *)filePaths; 32 | - (void)addDirFiles:(NSString *)dir; 33 | - (BOOL)atLeastOneImageWithGPSSelected; 34 | - (IBAction)openMap:(id)sender; 35 | 36 | @end 37 | -------------------------------------------------------------------------------- /css_dsa_pub.pem: -------------------------------------------------------------------------------- 1 | -----BEGIN PUBLIC KEY----- 2 | MIIDOzCCAi4GByqGSM44BAEwggIhAoIBAQDZOmOZZ5sIpY/GSeovBLMqcHrHZyEd 3 | rkvgccc3MHATzi5PhETxKcComPP9v7dbY1mKONc9xGn4uHbXas3fPT9zU0Br/wsP 4 | GZELdvUarSr/NIutxo8M3NNFy7FMJGXnLrgueY5BszyADLaBzsvT0APMwXOxqulB 5 | VX0HPW+2dPnqw+8cj/+PO3wMy+lRAc4v9WgJEWev50M1FEIANnaMoyWe0rAzB3Ti 6 | k6lyqcazDyJ+Ed6ew7Kynz8zG4t5rKRJqjHZbHOmvjafK6Mqu0LAgGNLqamF3CP6 7 | db+snGHMI4+ebTv8De0lkvNR4YK3Bc6FtociO77PoxFKmEDW9dFCZiYzAhUAow7N 8 | IUvtKeKpYXviM0plSGPiCkUCggEBAKf+51hGTJPzmTyNPG+gAIXkDSS74nKs6n9W 9 | AKBVVILuF6eqRpkLZLXLP5JaMIC2dutYgZj3c+HqBx857KwCnP1hPt3Q6eJfOqXm 10 | cCICWMek40fhS0XbkGeiVg2uKXmBH1Jy0CBNuFabDTyzpYp4n/aso1cyXhqjzLc3 11 | M8PQboUuxe3FXxi9utd+entUke3UiBJhbEGZkSLoL8eQa+tVDPy8ZiR/yED+iYs/ 12 | 4SFk1CmrJwe2oP/NjXYcZ1kTDWgdYiAfILEFneKLfg5aOP9sIU3GfFvpImZrg6ot 13 | kf2O0XCmFlUW76xLiAmnvqTzHZUZt3F2W3bXwgLxCVInPzjrs5gDggEFAAKCAQA1 14 | JS8Wa9MVoDVR6RREJsq3KYlZREJYfkypVJ4DvalthV+j9kb0Cpu/IwVziojUtmAs 15 | h7a3DEjI++QJTpCvu4003359xXyOibQL2bhn3vPzlmgZ2xik64ZrmUxZEtAu41MN 16 | xxQKeztuYvg22uWWSXgubJ9bA+RjEtwiXrNxVasDPg8MG8EWz8VaJp4IUkQ+uvXj 17 | ROeDlhcIpQEbC9DufxXE/tcxH4g+9EaTApQzj6Y+8CUOD1yFs1L4mlRNC7yv4pnr 18 | 7epjTUtyM/WeQClBM+ZGJCIgQU78CZpmtbLUnedqQyW0tahJQqPZqumSalKqThJl 19 | MlSZW5zM+s0QOjRJvObr 20 | -----END PUBLIC KEY----- 21 | -------------------------------------------------------------------------------- /CSSImageInfo.h: -------------------------------------------------------------------------------- 1 | // 2 | // CSSImageContainer.h 3 | // CocoaSlideShow 4 | // 5 | // Created by Nicolas Seriot on 25.08.07. 6 | // Copyright 2007 __MyCompanyName__. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @interface CSSImageInfo : NSObject { 12 | NSString *path; 13 | CGImageSourceRef source; 14 | NSMutableDictionary *metadata; 15 | 16 | BOOL sourceWasRead; 17 | BOOL isFlagged; 18 | BOOL isLoadingCache; 19 | BOOL isJpeg; 20 | 21 | int userRotation; 22 | } 23 | 24 | - (CGImageSourceRef)source; 25 | 26 | + (CSSImageInfo *)containerWithPath:(NSString *)aPath; 27 | 28 | - (NSString *)jsAddPoint; 29 | - (NSString *)jsRemovePoint; 30 | 31 | - (NSString *)jsShowPoint; 32 | - (NSString *)jsHidePoint; 33 | 34 | - (NSString *)exifDateTime; 35 | 36 | - (NSString *)prettyLatitude; 37 | - (NSString *)prettyLongitude; 38 | 39 | - (BOOL)loadSource; 40 | - (BOOL)isJpeg; 41 | 42 | - (NSImage *)image; 43 | 44 | - (void)rotateLeft; 45 | - (void)rotateRight; 46 | 47 | //- (int)orientationDegrees; 48 | 49 | - (NSString *)path; 50 | - (NSImage *)image; 51 | 52 | - (NSDictionary *)exif; 53 | - (NSDictionary *)gps; 54 | 55 | - (NSString *)path; 56 | 57 | - (NSURL *)googleMapsURL; 58 | 59 | - (NSString *)fileName; 60 | - (void)setFileName:(NSString *)s; 61 | 62 | - (void)flag; 63 | - (void)unflag; 64 | - (void)toggleFlag; 65 | - (void)removeFlag; 66 | - (BOOL)isFlagged; 67 | - (NSImage *)flagIcon; 68 | 69 | @end 70 | -------------------------------------------------------------------------------- /Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | English 7 | CFBundleDocumentTypes 8 | 9 | 10 | CFBundleTypeExtensions 11 | 12 | * 13 | 14 | CFBundleTypeName 15 | Any file 16 | CFBundleTypeRole 17 | Viewer 18 | 19 | 20 | CFBundleExecutable 21 | ${EXECUTABLE_NAME} 22 | CFBundleIconFile 23 | CocoaSlideShow 24 | CFBundleIdentifier 25 | ch.seriot.CocoaSlideShow 26 | CFBundleInfoDictionaryVersion 27 | 6.0 28 | CFBundleName 29 | ${PRODUCT_NAME} 30 | CFBundlePackageType 31 | APPL 32 | CFBundleSignature 33 | ???? 34 | CFBundleVersion 35 | $(CURRENT_PROJECT_VERSION) 36 | NSMainNibFile 37 | MainMenu 38 | NSPrincipalClass 39 | NSApplication 40 | SUFeedURL 41 | https://raw.github.com/nst/CocoaSlideShow/master/appcast/appcast.xml 42 | SUPublicDSAKeyFile 43 | css_dsa_pub.pem 44 | 45 | 46 | -------------------------------------------------------------------------------- /Sparkle.framework/Versions/A/Resources/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | BuildMachineOSBuild 6 | 19A558d 7 | CFBundleDevelopmentRegion 8 | en 9 | CFBundleExecutable 10 | Sparkle 11 | CFBundleIdentifier 12 | org.sparkle-project.Sparkle 13 | CFBundleInfoDictionaryVersion 14 | 6.0 15 | CFBundleName 16 | Sparkle 17 | CFBundlePackageType 18 | FMWK 19 | CFBundleShortVersionString 20 | 1.22.0 33-gd5222353e 21 | CFBundleSignature 22 | ???? 23 | CFBundleSupportedPlatforms 24 | 25 | MacOSX 26 | 27 | CFBundleVersion 28 | 1.22.0 29 | DTCompiler 30 | com.apple.compilers.llvm.clang.1_0 31 | DTPlatformBuild 32 | 11M392r 33 | DTPlatformVersion 34 | GM 35 | DTSDKBuild 36 | 19A536d 37 | DTSDKName 38 | macosx10.15 39 | DTXcode 40 | 1100 41 | DTXcodeBuild 42 | 11M392r 43 | LSMinimumSystemVersion 44 | 10.7 45 | 46 | 47 | -------------------------------------------------------------------------------- /CSSImageView.m: -------------------------------------------------------------------------------- 1 | #import "CSSImageView.h" 2 | 3 | @implementation CSSImageView 4 | 5 | - (void)setDelegate:(id)del { 6 | delegate = del; 7 | } 8 | 9 | - (id) delegate { 10 | return (delegate); 11 | } 12 | 13 | - (void)mouseDown:(NSEvent *)theEvent { 14 | //NSLog(@"-- mouseDown: %@", self); 15 | 16 | NSArray *selectedObjects = [(NSObject *)[NSApp delegate] valueForKeyPath:@"imagesController.selectedObjects"]; 17 | if([selectedObjects count] != 1) return; 18 | 19 | NSString *path = [[selectedObjects lastObject] path]; 20 | if(!path) return; 21 | 22 | NSPoint event_location = [theEvent locationInWindow]; 23 | NSPoint p = [self convertPoint:event_location fromView:nil]; 24 | 25 | isDraggingFromSelf = YES; 26 | [self dragFile:path fromRect:NSMakeRect(p.x, p.y, 0.0, 0.0) slideBack:YES event:theEvent]; 27 | isDraggingFromSelf = NO; 28 | } 29 | 30 | - (NSDragOperation)draggingEntered:(id )sender { 31 | if (!isDraggingFromSelf && [delegate respondsToSelector: @selector(draggingEntered:)]) { 32 | return [delegate draggingEntered:sender]; 33 | } 34 | return NSDragOperationNone; 35 | } 36 | 37 | - (BOOL)prepareForDragOperation:(id )sender { 38 | if (!isDraggingFromSelf && [delegate respondsToSelector: @selector(prepareForDragOperation:)]) { 39 | return [delegate prepareForDragOperation:sender]; 40 | } 41 | return NO; 42 | } 43 | 44 | - (BOOL)performDragOperation:(id )sender { 45 | if (!isDraggingFromSelf && [delegate respondsToSelector: @selector(performDragOperation:)]) { 46 | return [delegate performDragOperation:sender]; 47 | } 48 | return NO; 49 | } 50 | 51 | @end 52 | -------------------------------------------------------------------------------- /RemoteControlContainer.h: -------------------------------------------------------------------------------- 1 | /***************************************************************************** 2 | * RemoteControlContainer.h 3 | * RemoteControlWrapper 4 | * 5 | * Created by Martin Kahr on 11.03.06 under a MIT-style license. 6 | * Copyright (c) 2006 martinkahr.com. All rights reserved. 7 | * 8 | * Permission is hereby granted, free of charge, to any person obtaining a 9 | * copy of this software and associated documentation files (the "Software"), 10 | * to deal in the Software without restriction, including without limitation 11 | * the rights to use, copy, modify, merge, publish, distribute, sublicense, 12 | * and/or sell copies of the Software, and to permit persons to whom the 13 | * Software is furnished to do so, subject to the following conditions: 14 | * 15 | * The above copyright notice and this permission notice shall be included 16 | * in all copies or substantial portions of the Software. 17 | * 18 | * THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 19 | * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 20 | * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 21 | * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 22 | * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 23 | * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 24 | * THE SOFTWARE. 25 | * 26 | *****************************************************************************/ 27 | 28 | #import 29 | #import "RemoteControl.h" 30 | 31 | @interface RemoteControlContainer : RemoteControl { 32 | NSMutableArray* remoteControls; 33 | } 34 | 35 | - (BOOL) instantiateAndAddRemoteControlDeviceWithClass: (Class) clazz; 36 | - (unsigned int) count; 37 | 38 | @end 39 | -------------------------------------------------------------------------------- /Sparkle.framework/Versions/A/Headers/SUAppcastItem.h: -------------------------------------------------------------------------------- 1 | // 2 | // SUAppcastItem.h 3 | // Sparkle 4 | // 5 | // Created by Andy Matuschak on 3/12/06. 6 | // Copyright 2006 Andy Matuschak. All rights reserved. 7 | // 8 | 9 | #ifndef SUAPPCASTITEM_H 10 | #define SUAPPCASTITEM_H 11 | 12 | #if __has_feature(modules) 13 | @import Foundation; 14 | #else 15 | #import 16 | #endif 17 | #import "SUExport.h" 18 | @class SUSignatures; 19 | 20 | SU_EXPORT @interface SUAppcastItem : NSObject 21 | @property (copy, readonly) NSString *title; 22 | @property (copy, readonly) NSString *dateString; 23 | @property (copy, readonly) NSDate *date; 24 | @property (copy, readonly) NSString *itemDescription; 25 | @property (strong, readonly) NSURL *releaseNotesURL; 26 | @property (strong, readonly) SUSignatures *signatures; 27 | @property (copy, readonly) NSString *minimumSystemVersion; 28 | @property (copy, readonly) NSString *maximumSystemVersion; 29 | @property (strong, readonly) NSURL *fileURL; 30 | @property (nonatomic, readonly) uint64_t contentLength; 31 | @property (copy, readonly) NSString *versionString; 32 | @property (copy, readonly) NSString *osString; 33 | @property (copy, readonly) NSString *displayVersionString; 34 | @property (copy, readonly) NSDictionary *deltaUpdates; 35 | @property (strong, readonly) NSURL *infoURL; 36 | @property (copy, readonly) NSNumber* phasedRolloutInterval; 37 | 38 | // Initializes with data from a dictionary provided by the RSS class. 39 | - (instancetype)initWithDictionary:(NSDictionary *)dict; 40 | - (instancetype)initWithDictionary:(NSDictionary *)dict failureReason:(NSString **)error; 41 | 42 | @property (getter=isDeltaUpdate, readonly) BOOL deltaUpdate; 43 | @property (getter=isCriticalUpdate, readonly) BOOL criticalUpdate; 44 | @property (getter=isMacOsUpdate, readonly) BOOL macOsUpdate; 45 | @property (getter=isInformationOnlyUpdate, readonly) BOOL informationOnlyUpdate; 46 | 47 | // Returns the dictionary provided in initWithDictionary; this might be useful later for extensions. 48 | @property (readonly, copy) NSDictionary *propertiesDictionary; 49 | 50 | - (NSURL *)infoURL; 51 | 52 | @end 53 | 54 | #endif 55 | -------------------------------------------------------------------------------- /AppDelegate.h: -------------------------------------------------------------------------------- 1 | /* CocoaSlideShow */ 2 | 3 | #import 4 | 5 | //#import "RemoteControl.h" 6 | 7 | #import "CSSImageView.h" 8 | #import "ImagesController.h" 9 | 10 | #import "CSSMapController.h" 11 | 12 | @class CSSBorderlessWindow; 13 | 14 | @interface AppDelegate : NSObject { 15 | IBOutlet NSWindow *mainWindow; 16 | IBOutlet CSSBorderlessWindow *slideShowPanel; 17 | 18 | IBOutlet CSSMapController *mapController; 19 | NSMutableArray *images; 20 | 21 | IBOutlet ImagesController *imagesController; 22 | IBOutlet CSSImageView *imageView; 23 | IBOutlet NSImageView *panelImageView; 24 | IBOutlet NSTextField *userCommentTextField; 25 | IBOutlet NSTableView *tableView; 26 | IBOutlet NSTokenField *keywordsTokenField; 27 | 28 | IBOutlet NSTabView *tabView; 29 | IBOutlet NSTabViewItem *imageTabViewItem; 30 | IBOutlet NSTabViewItem *mapTabViewItem; 31 | 32 | IBOutlet NSView *kmlSavePanelAccessoryView; 33 | IBOutlet NSView *thumbnailsExportAccessoryView; 34 | 35 | IBOutlet NSProgressIndicator *progressIndicator; 36 | 37 | NSToolbar *toolbar; 38 | 39 | // RemoteControl *remoteControl; 40 | NSUndoManager *undoManager; 41 | NSTimer *timer; 42 | 43 | BOOL isFullScreen; 44 | BOOL takeFilesFromDefault; 45 | BOOL isSaving; 46 | BOOL isExporting; 47 | } 48 | 49 | - (BOOL)isFullScreen; 50 | 51 | - (ImagesController *)imagesController; 52 | 53 | - (BOOL)isMap; 54 | 55 | - (IBAction)undo:(id)sender; 56 | - (IBAction)redo:(id)sender; 57 | 58 | - (IBAction)setDirectory:(id)sender; 59 | - (IBAction)addDirectory:(id)sender; 60 | - (IBAction)fullScreenMode:(id)sener; 61 | - (IBAction)exitFullScreen:(id)sender; 62 | - (IBAction)toggleFullScreen:(id)sender; 63 | - (IBAction)rotateLeft:(id)sender; 64 | - (IBAction)rotateRight:(id)sender; 65 | - (IBAction)revealInFinder:(id)sender; 66 | - (IBAction)exportToDirectory:(id)sender; 67 | - (IBAction)open:(id)sender; 68 | 69 | - (IBAction)startSlideShow:(id)sender; 70 | - (IBAction)toggleSlideShow:(id)sender; 71 | 72 | - (IBAction)toggleMap:(id)sender; 73 | 74 | - (IBAction)exportKMLToFile:(id)sender; 75 | - (IBAction)resizeJPEGs:(id)sender; 76 | 77 | - (void)invalidateTimer; 78 | - (NSUndoManager *)undoManager; 79 | 80 | @end 81 | -------------------------------------------------------------------------------- /English.lproj/Localizable.strings: -------------------------------------------------------------------------------- 1 | /* No comment provided by engineer. */ 2 | "%@ %@ is the latest version available." = "%1$@ %2$@ is the latest version available."; 3 | 4 | /* No comment provided by engineer. */ 5 | "%@ version %@ is available!" = "%1$@ version %2$@ is available!"; 6 | 7 | /* Toolbar customize 8 | Toolbar item 9 | Toolbar tooltip */ 10 | "Add Files…" = "Add Files…"; 11 | 12 | /* No comment provided by engineer. */ 13 | "Download now" = "Download now"; 14 | 15 | /* Toolbar customize 16 | Toolbar item 17 | Toolbar tooltip */ 18 | "Flag" = "Flag"; 19 | 20 | /* Toolbar customize 21 | Toolbar item 22 | Toolbar tooltip */ 23 | "Full Screen" = "Full Screen"; 24 | 25 | /* No comment provided by engineer. */ 26 | "Go to %@ website" = "Go to %@ website"; 27 | 28 | /* Toolbar customize 29 | Toolbar item 30 | Toolbar tooltip */ 31 | "Map" = "Map"; 32 | 33 | /* No comment provided by engineer. */ 34 | "Hybrid" = "Hybrid"; 35 | 36 | /* No comment provided by engineer. */ 37 | "Ignore and Continue" = "Ignore and Continue"; 38 | 39 | /* Toolbar item */ 40 | "Move to Trash" = "Move to Trash"; 41 | 42 | /* No comment provided by engineer. */ 43 | "OK" = "OK"; 44 | 45 | /* No comment provided by engineer. */ 46 | "Physical" = "Physical"; 47 | 48 | /* Toolbar customize 49 | Toolbar item 50 | Toolbar tooltip */ 51 | "Remove" = "Remove"; 52 | 53 | /* Toolbar customize 54 | Toolbar item 55 | Toolbar tooltip */ 56 | "Rotate Left" = "Rotate Left"; 57 | 58 | /* Toolbar customize 59 | Toolbar item 60 | Toolbar tooltip */ 61 | "Rotate Right" = "Rotate Right"; 62 | 63 | /* No comment provided by engineer. */ 64 | "Satellite" = "Satellite"; 65 | 66 | /* Toolbar customize 67 | Toolbar item 68 | Toolbar tooltip */ 69 | "Set Directory…" = "Set Directory…"; 70 | 71 | /* Toolbar customize 72 | Toolbar item 73 | Toolbar tooltip */ 74 | "Slideshow" = "Slideshow"; 75 | 76 | /* No comment provided by engineer. */ 77 | "Street" = "Street"; 78 | 79 | /* Toolbar customize 80 | Toolbar tooltip */ 81 | "Trash" = "Trash"; 82 | 83 | /* No comment provided by engineer. */ 84 | "What do you want to do?" = "What do you want to do?"; 85 | 86 | /* No comment provided by engineer. */ 87 | "You are up to date!" = "You are up to date!"; 88 | -------------------------------------------------------------------------------- /NSFileManager+CSS.m: -------------------------------------------------------------------------------- 1 | // 2 | // NSFileManager+CSS.m 3 | // CocoaSlideShow 4 | // 5 | // Created by Nicolas Seriot on 17.08.07. 6 | // Copyright 2007 __MyCompanyName__. All rights reserved. 7 | // 8 | 9 | #import "NSFileManager+CSS.h" 10 | 11 | 12 | @implementation NSFileManager (CSS) 13 | 14 | - (BOOL)isDirectory:(NSString *)path { 15 | BOOL isDir; 16 | [self fileExistsAtPath:path isDirectory:&isDir]; 17 | return isDir; 18 | } 19 | 20 | - (NSArray *)directoryContentFullPaths:(NSString*)dirPath recursive:(BOOL)isRecursive { 21 | if(![self isDirectory:dirPath]) { 22 | return nil; 23 | } 24 | 25 | NSError *error = nil; 26 | NSArray *dirContents = [[NSFileManager defaultManager] contentsOfDirectoryAtPath:dirPath error:&error]; 27 | if(dirContents == nil) { 28 | NSLog(@"-- cannot get contentsOfDirectoryAtPath:%@ error%@", dirPath, error); 29 | return nil; 30 | } 31 | 32 | NSMutableArray *fullPaths = [[NSMutableArray alloc] init]; 33 | 34 | NSString *name; 35 | NSString *currentPath; 36 | for (name in dirContents) { 37 | currentPath = [dirPath stringByAppendingPathComponent:name]; 38 | if([self isDirectory:currentPath]) { 39 | if(isRecursive) { 40 | [fullPaths arrayByAddingObjectsFromArray:[self directoryContentFullPaths:currentPath recursive:YES]]; 41 | } else { 42 | continue; 43 | } 44 | } 45 | 46 | [fullPaths addObject:[dirPath stringByAppendingPathComponent:name]]; 47 | } 48 | 49 | return fullPaths; 50 | } 51 | 52 | - (NSString *)prettyFileSize:(NSString *)path { 53 | // NSDictionary *fileAttributes = [[NSFileManager defaultManager] fileAttributesAtPath:path traverseLink:YES]; 54 | NSError *error = nil; 55 | NSDictionary *fileAttributes = [[NSFileManager defaultManager] attributesOfItemAtPath:path error:&error]; 56 | 57 | if(fileAttributes == nil) { 58 | NSLog(@"-- can't get attributesOfItemAtPath:%@ error:%@", path, error); 59 | return nil; 60 | } 61 | 62 | float fileSize = (float)[fileAttributes fileSize]; 63 | NSString *unit = @"bytes"; 64 | 65 | if(fileSize > 1024) { 66 | fileSize /= 1024; 67 | unit = @"KB"; 68 | } 69 | 70 | if(fileSize > 1024) { 71 | fileSize /= 1024; 72 | unit = @"MB"; 73 | return [NSString stringWithFormat:@"%0.1f %@", fileSize, unit]; 74 | } else { 75 | return [NSString stringWithFormat:@"%d %@", (int)fileSize, unit]; 76 | } 77 | 78 | } 79 | 80 | @end 81 | -------------------------------------------------------------------------------- /French.lproj/Localizable.strings: -------------------------------------------------------------------------------- 1 | /* No comment provided by engineer. */ 2 | "%@ %@ is the latest version available." = "%1$@ %2$@ est la dernière version disponible."; 3 | 4 | /* No comment provided by engineer. */ 5 | "%@ version %@ is available!" = "%1$@ version %2$@ est disponible !"; 6 | 7 | /* Toolbar customize 8 | Toolbar item 9 | Toolbar tooltip */ 10 | "Add Files…" = "Ajouter…"; 11 | 12 | /* No comment provided by engineer. */ 13 | "Download now" = "Télécharger"; 14 | 15 | /* Toolbar customize 16 | Toolbar item 17 | Toolbar tooltip */ 18 | "Flag" = "Drapeau"; 19 | 20 | /* Toolbar customize 21 | Toolbar item 22 | Toolbar tooltip */ 23 | "Full Screen" = "Plein écran"; 24 | 25 | /* No comment provided by engineer. */ 26 | "Go to %@ website" = "Ouvrir le site %@"; 27 | 28 | /* Toolbar customize 29 | Toolbar item 30 | Toolbar tooltip */ 31 | "Map" = "Map"; 32 | 33 | /* No comment provided by engineer. */ 34 | "Hybrid" = "Hybride"; 35 | 36 | /* No comment provided by engineer. */ 37 | "Ignore and Continue" = "Continuer"; 38 | 39 | /* Toolbar item */ 40 | "Move to Trash" = "Placer dans la corbeille"; 41 | 42 | /* No comment provided by engineer. */ 43 | "OK" = "OK"; 44 | 45 | /* No comment provided by engineer. */ 46 | "Physical" = "Terrain"; 47 | 48 | /* Toolbar customize 49 | Toolbar item 50 | Toolbar tooltip */ 51 | "Remove" = "Supprimer"; 52 | 53 | /* Toolbar customize 54 | Toolbar item 55 | Toolbar tooltip */ 56 | "Rotate Left" = "Tourner à gauche"; 57 | 58 | /* Toolbar customize 59 | Toolbar item 60 | Toolbar tooltip */ 61 | "Rotate Right" = "Tourner à droite"; 62 | 63 | /* No comment provided by engineer. */ 64 | "Satellite" = "Satellite"; 65 | 66 | /* Toolbar customize 67 | Toolbar item 68 | Toolbar tooltip */ 69 | "Set Directory…" = "Choisir un dossier…"; 70 | 71 | /* Toolbar customize 72 | Toolbar item 73 | Toolbar tooltip */ 74 | "Slideshow" = "Diaporama"; 75 | 76 | /* No comment provided by engineer. */ 77 | "Street" = "Plan de rue"; 78 | 79 | /* Toolbar customize 80 | Toolbar tooltip */ 81 | "Trash" = "Corbeille"; 82 | 83 | /* No comment provided by engineer. */ 84 | "What do you want to do?" = "Que voulez-vous faire ?"; 85 | 86 | /* No comment provided by engineer. */ 87 | "You are up to date!" = "Vous êtes à jour !"; 88 | 89 | /* Thumbnails export folder name */ 90 | "Thumbnails" = "Vignettes"; 91 | 92 | /* Open panel to choose a folder for thumbnails, message */ 93 | "Choose where to export the thumbnails" = "Choisissez où exporter les vignettes"; 94 | 95 | /* Open panel to choose a folder for thumbnails, title */ 96 | "Thumnails export" = "Exportation des vignettes"; 97 | 98 | /* Open panel to choose a folder for thumbnails, prompt */ 99 | "Export" = "Exporter"; 100 | -------------------------------------------------------------------------------- /RemoteControlContainer.m: -------------------------------------------------------------------------------- 1 | /***************************************************************************** 2 | * RemoteControlContainer.m 3 | * RemoteControlWrapper 4 | * 5 | * Created by Martin Kahr on 11.03.06 under a MIT-style license. 6 | * Copyright (c) 2006 martinkahr.com. All rights reserved. 7 | * 8 | * Permission is hereby granted, free of charge, to any person obtaining a 9 | * copy of this software and associated documentation files (the "Software"), 10 | * to deal in the Software without restriction, including without limitation 11 | * the rights to use, copy, modify, merge, publish, distribute, sublicense, 12 | * and/or sell copies of the Software, and to permit persons to whom the 13 | * Software is furnished to do so, subject to the following conditions: 14 | * 15 | * The above copyright notice and this permission notice shall be included 16 | * in all copies or substantial portions of the Software. 17 | * 18 | * THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 19 | * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 20 | * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 21 | * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 22 | * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 23 | * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 24 | * THE SOFTWARE. 25 | * 26 | *****************************************************************************/ 27 | 28 | #import "RemoteControlContainer.h" 29 | 30 | 31 | @implementation RemoteControlContainer 32 | 33 | - (id) initWithDelegate: (id) _remoteControlDelegate { 34 | if (self = [super initWithDelegate:_remoteControlDelegate]) { 35 | remoteControls = [[NSMutableArray alloc] init]; 36 | } 37 | return self; 38 | } 39 | 40 | - (void) dealloc { 41 | [self stopListening: self]; 42 | [remoteControls release]; 43 | [super dealloc]; 44 | } 45 | 46 | - (BOOL) instantiateAndAddRemoteControlDeviceWithClass: (Class) clazz { 47 | RemoteControl* remoteControl = [[clazz alloc] initWithDelegate: delegate]; 48 | if (remoteControl) { 49 | [remoteControls addObject: remoteControl]; 50 | [remoteControl addObserver: self forKeyPath:@"listeningToRemote" options:NSKeyValueObservingOptionNew context:nil]; 51 | return YES; 52 | } 53 | return NO; 54 | } 55 | 56 | - (unsigned int) count { 57 | return [remoteControls count]; 58 | } 59 | 60 | - (void) reset { 61 | NSLog(@"reset..."); 62 | [self willChangeValueForKey:@"listeningToRemote"]; 63 | [self didChangeValueForKey:@"listeningToRemote"]; 64 | } 65 | 66 | - (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context { 67 | [self reset]; 68 | } 69 | 70 | - (void) setListeningToRemote: (BOOL) value { 71 | int i; 72 | for(i=0; i < [remoteControls count]; i++) { 73 | [[remoteControls objectAtIndex: i] setListeningToRemote: value]; 74 | } 75 | if (value && value != [self isListeningToRemote]) [self performSelector:@selector(reset) withObject:nil afterDelay:0.01]; 76 | } 77 | - (BOOL) isListeningToRemote { 78 | int i; 79 | for(i=0; i < [remoteControls count]; i++) { 80 | if ([[remoteControls objectAtIndex: i] isListeningToRemote]) { 81 | return YES; 82 | } 83 | } 84 | return NO; 85 | } 86 | 87 | - (IBAction) startListening: (id) sender { 88 | int i; 89 | for(i=0; i < [remoteControls count]; i++) { 90 | [[remoteControls objectAtIndex: i] startListening: sender]; 91 | } 92 | } 93 | - (IBAction) stopListening: (id) sender { 94 | int i; 95 | for(i=0; i < [remoteControls count]; i++) { 96 | [[remoteControls objectAtIndex: i] stopListening: sender]; 97 | } 98 | } 99 | 100 | - (BOOL) isOpenInExclusiveMode { 101 | BOOL mode = YES; 102 | int i; 103 | for(i=0; i < [remoteControls count]; i++) { 104 | mode = mode && ([[remoteControls objectAtIndex: i] isOpenInExclusiveMode]); 105 | } 106 | return mode; 107 | } 108 | - (void) setOpenInExclusiveMode: (BOOL) value { 109 | int i; 110 | for(i=0; i < [remoteControls count]; i++) { 111 | [[remoteControls objectAtIndex: i] setOpenInExclusiveMode:value]; 112 | } 113 | } 114 | 115 | @end 116 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | CocoaSlideShow 2 | ============== 3 | 4 | CocoaSlideShow is a Mac OS X simple, fast image viewer, spiritual son of [Slides](http://richardk.info/slides/). 5 | 6 | -- 7 | 8 | Download [CocoaSlideShow 0.8](http://seriot.ch/software/desktop/CocoaSlideShow/CocoaSlideShow_0_8.app.zip) (OS X 10.9+, 1.9 MB) 9 | 10 | -- 11 | 12 | #### CocoaSlideShow is the perfect companion for iPhone GPS tagged photos. 13 | 14 | With CocoaSlideShow you can: 15 | 16 | * easily select a few pictures out of big folders [screencast](http://seriot.ch/software/desktop/CocoaSlideShow/screencasts/spotlight.mov) 17 | * display your photos fullscreen, and use Apple Remote 18 | * see your photos on a Google Map, as in iPhoto [screencast](http://seriot.ch/software/desktop/CocoaSlideShow/screencasts/google_map.mov) 19 | * edit the metadata and find them with Spotlight [screencast](http://seriot.ch/software/desktop/CocoaSlideShow/screencasts/spotlight.mov) 20 | * export lightweight JPEG thumbnails, say for Facebook upload [screencast](http://seriot.ch/software/desktop/CocoaSlideShow/screencasts/resize_images.mov) 21 | * export KML files to Google Maps or Google Earth [screencast](http://seriot.ch/software/desktop/CocoaSlideShow/screencasts/export_kml.mov) 22 | 23 | _I really liked the simplicity of CocoaSlideShow. It's refreshing to use a straightforward, elegant photo viewer that does exactly what it's supposed to with no fuss._ [-Nick Mead, Softonic](http://cocoaslideshow.en.softonic.com/mac) 24 | 25 | ![CocoaSlideShow](art/CocoaSlideShow_screenshot_small.jpg) 26 | ![CocoaSlideShow](art/CocoaSlideShow_Spotlight_screenshot_small.png) 27 | ![CocoaSlideShow](art/CocoaSlideShow_screenshot_map_small.png) 28 | 29 | CocoaSlideShow embeds [EpegWrapper](http://www.entropy.ch/software/macosx/#epegwrapper), a Cocoa Framework for fast thumbnails generation, by entropy.ch. 30 |
 31 | TODO:
 32 |   * show images at pixel resolution, not dpi resolution
 33 |   * update Sparkle
 34 | 
 35 | Known bugs:
 36 |   * you sometimes have to type 'esc' twice to exit fullscreen
 37 | 
 38 | Version 0.8
 39 |   * runs on macOS Catalina, although not well tested
 40 | 
 41 | Version 0.6
 42 |   * slideshow now loops by default (Tim, Brewster K.)
 43 |   * code is signed for OS X 10.8 Gatekeeper
 44 | 
 45 | Version 0.5.8
 46 |   * Mac OS X 10.6 required
 47 |   * display the number of flagged and unflagged images in the tableview header
 48 |   * added an option to sort image names by natural order (germ...@gmail.com)
 49 |   * application could crash when opening corrupted images
 50 | 
 51 | Version 0.5.7
 52 |   * can drag multiple files from tableview
 53 |   * remember window last position
 54 |   * play success sound also after export
 55 |   * speed improvements
 56 |   * new 16x16 icon
 57 | 
 58 | Version 0.5.6
 59 |   * resize and export JPEGs in batch
 60 |   * much better google map integration
 61 |   * fixed crash on startup when default folder had more that 500 images
 62 |   * thumbnails are now properly rotated on the map
 63 | 
 64 | Version 0.5.5
 65 |   * show thumbnails on map
 66 |   * add local or remote thumbnails to KML export
 67 |   * use camera rotation data
 68 |   * remember user rotation
 69 |   * fixed "check updates at startup" setting
 70 | 
 71 | Version 0.5.4
 72 |   * updates with Sparkle
 73 |   * fix crash when setting a new default directory
 74 |   * fullscreen can use any display, not only the first one (thanks to 0xced)
 75 | 
 76 | Version 0.5.3
 77 |   * KML files export (Cyril Godefroy)
 78 |   * French version
 79 |   * important speed and memory optimisations
 80 | 
 81 | Version 0.5.2
 82 |   * fixed GPS mapping with coordinated at South and/or West
 83 | 
 84 | Version 0.5.1
 85 |   * can drag and drop from main image view
 86 |   * better Google Maps integration
 87 |   * fixed delay reset when interrupting slideshow
 88 |   * fixed a memory leak
 89 | 
 90 | Version 0.5:
 91 |   * read GPS tags and show photos on Google Map
 92 |   * slideshow can now run in a window (not fullscreen)
 93 |   * improved multiple files metadata edition
 94 | 
 95 | Version 0.4.6:
 96 | 
 97 |   * new toolbar images by Jan Perratt (perratt.com)
 98 |   * images are now ordered numerically rather than alphabetically
 99 |   * file names are editable by clicking on file name in the tableview
100 | 
101 | Version 0.4.5:
102 | 
103 |   * restored Tiger compatibility broken in 0.4.4
104 |   * new toolbar images
105 | 
106 | Version 0.4.4:
107 | 
108 |   * speed improvement
109 |   * moved window buttons into the toolbar
110 | 
111 | Version 0.4.3:
112 | 
113 |   * opens raw files
114 |   * added an actual automatic slideshow
115 | 
116 | Version 0.4.2:
117 | 
118 |   * images do stretch to occupy full screen
119 |   * enabled left/right arrows, work as up/down arrows
120 | 
121 | Version 0.4.1:
122 | 
123 |   * memory footprint improvement
124 | 
125 | Version 0.4:
126 | 
127 |   * flags
128 |   * minimal undo manager
129 |   * various bug fixes and improvements
130 | 
131 | Version 0.3:
132 | 
133 |   * EXIF user comments editor (a free string)
134 |   * IPTC keywords editor (same as in Preview)
135 |   * various bug fixes and improvements
136 | 
137 | Version 0.2:
138 | 
139 |   * esc key escapes full screen
140 |   * folders drag and drop on application icon
141 |   * check new updates at startup
142 |   * app icon, credits dimensionofdeskmod.net
143 | 
144 | Version 0.1:
145 | 
146 |   * full screen mode
147 |   * handles Apple Remote
148 |   * rotate pictures
149 |   * drag and drop files and folders (recursive)
150 |   * add / remove / export / trash pictures
151 | 
152 | -------------------------------------------------------------------------------- /appcast/appcast.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | CocoaSlideShow Changelog 5 | http://cocoaslideshow.googlecode.com/svn/trunk/appcast/appcast.xml 6 | Most recent changes with links to updates. 7 | en 8 | 9 | 10 | Version 0.5.4 (2 bugs fixed, 1 new feature) 11 | New feature 13 |
 14 | - updates with Sparkle
 15 | 
16 | 17 |

Bug fixes

18 |
 19 | - don't crash when setting a new default directory
 20 | - fullscreen can use any display, not only the first one
 21 | 
22 | ]]>
23 | Mon, 13 Jul 2009 22:00:00 +0000 24 | 25 |
26 | 27 | 28 | Version 0.5.5 (1 bug fixed, 4 new features) 29 | New features 31 |
 32 | - show thumbnails on map
 33 | - add local or remote thumbnails to KML export
 34 | - use camera rotation data
 35 | - remember user rotation
 36 | 
37 | 38 |

Bug fix

39 |
 40 | - fixed "check updates at startup" setting
 41 | 
42 | ]]>
43 | Tue, 21 Jul 2009 23:30:00 +0000 44 | 45 |
46 | 47 | 48 | Version 0.5.6 (2 bugs fixed, 2 new features) 49 | New features 51 |
 52 | - resize and export JPEGs in batch
 53 | - much better google map integration
 54 | 
55 | 56 |

Bug fix

57 |
 58 | - did crash on startup when default folder had more that 500 images
 59 | - thumbnails are now properly rotated on the map
 60 | 
61 | ]]>
62 | Sun, 02 Aug 2009 18:30:00 +0000 63 | 64 |
65 | 66 | 67 | Version 0.5.7 (1 bug fixed, 4 new features) 68 | New features 70 |
 71 | - can drag multiple files from tableview
 72 | - remember window last position
 73 | - play success sound also after export
 74 | - new 16x16 icon
 75 | 
76 | 77 |

Bug fix

78 |
 79 | - speed improvements
 80 | 
81 | ]]>
82 | Fri, 14 Aug 2009 00:30:00 +0000 83 | 84 |
85 | 86 | 87 | Version 0.5.8 (1 bug fixed, 3 new features, Mac OS X 10.6 required) 88 | New features 90 |
 91 | - display the number of flagged and unflagged images in the tableview header
 92 | - added an option to sort image names by natural order (germ...@gmail.com)
 93 | 
94 | 95 |

Bug fix

96 |
 97 | - application could crash when opening corrupted images
 98 | 
99 | ]]>
100 | Thu, 26 May 2011 19:00:00 +0000 101 | 102 |
103 | 104 | 105 | Version 0.6 (2 new features, Mac OS X 10.7 required) 106 | New features 108 |
109 | - slideshow now loops by default (Brewster K.)
110 | - code is signed for OS X 10.8 Gatekeeper
111 | 
112 | ]]>
113 | Thu, 23 December 2012 08:30:00 +0100 114 | 115 |
116 | 117 | 118 | Version 0.7 (2 new features, Mac OS X 10.9 required) 119 | New features 121 |
122 | - runs on macOS Catalina
123 | 
124 | ]]>
125 | Sun, 23 October 2019 11:00:00 +0100 126 | 127 |
128 | 129 |
130 |
131 | -------------------------------------------------------------------------------- /ImagesController.m: -------------------------------------------------------------------------------- 1 | #import "ImagesController.h" 2 | #import "CSSImageInfo.h" 3 | #import "NSFileManager+CSS.h" 4 | #import "AppDelegate.h" 5 | #import "NSImage+CSS.h" 6 | 7 | static NSString *const kApplyNaturalSortOrder = @"ApplyNaturalSortOrder"; 8 | 9 | static NSComparisonResult naturalCompare( CSSImageInfo *img1, CSSImageInfo *img2, void *context ) { 10 | NSString *str1 = [img1 fileName]; 11 | NSString *str2 = [img2 fileName]; 12 | 13 | return [str1 compare:str2 options:NSNumericSearch]; 14 | } 15 | 16 | @implementation ImagesController 17 | 18 | - (void)awakeFromNib { 19 | 20 | allowedExtensions = [NSArray arrayWithObjects:@"jpg", @"jpeg", @"jpe", @"tif", @"tiff", @"gif", @"png", @"pct", @"pict", @"pic", 21 | //@"pdf", @"eps", @"epi", @"epsf", @"epsi", @"ps", 22 | @"ico", @"icns", @"bmp", @"bmpf", 23 | @"dng", @"cr2", @"crw", @"fpx", @"fpix", @"raf", @"dcr", @"ptng", @"pnt", @"mac", @"mrw", @"nef", 24 | @"orf", @"exr", @"psd", @"qti", @"qtif", @"hdr", @"sgi", @"srf", @"targa", @"tga", @"cur", @"xbm", nil]; 25 | 26 | } 27 | 28 | 29 | - (NSUndoManager *)undoManager { 30 | return [cocoaSlideShow undoManager]; 31 | } 32 | 33 | - (NSIndexSet *)flaggedIndexes { 34 | NSMutableIndexSet *flaggedIndexes = [[NSMutableIndexSet alloc] init]; 35 | 36 | for( CSSImageInfo *imageInfo in [self arrangedObjects] ) { 37 | if([imageInfo isFlagged]) { 38 | [flaggedIndexes addIndex:[[self arrangedObjects] indexOfObject:imageInfo]]; 39 | } 40 | } 41 | 42 | return flaggedIndexes; 43 | } 44 | 45 | - (void)flagIndexes:(NSIndexSet *)indexSet { 46 | [[[self arrangedObjects] objectsAtIndexes:indexSet] makeObjectsPerformSelector:@selector(flag)]; 47 | } 48 | 49 | - (IBAction)flag:(id)sender { 50 | [[[self undoManager] prepareWithInvocationTarget:self] unflag:self]; 51 | [[self selectedObjects] makeObjectsPerformSelector:@selector(flag)]; 52 | } 53 | 54 | - (IBAction)unflag:(id)sender { 55 | [[[self undoManager] prepareWithInvocationTarget:self] flag:self]; 56 | [[self selectedObjects] makeObjectsPerformSelector:@selector(unflag)]; 57 | } 58 | 59 | - (IBAction)toggleFlags:(id)sender { 60 | [[[self undoManager] prepareWithInvocationTarget:self] toggleFlags:self]; 61 | [[self selectedObjects] makeObjectsPerformSelector:@selector(toggleFlag)]; 62 | } 63 | 64 | - (IBAction)selectFlags:(id)sender { 65 | [(NSArrayController *)[[self undoManager] prepareWithInvocationTarget:self] setSelectionIndexes:[self selectionIndexes]]; 66 | [self setSelectionIndexes:[self flaggedIndexes]]; 67 | } 68 | 69 | - (IBAction)removeAllFlags:(id)sender { 70 | [[[self undoManager] prepareWithInvocationTarget:self] flagIndexes:[self flaggedIndexes]]; 71 | [[self arrangedObjects] makeObjectsPerformSelector:@selector(removeFlag)]; 72 | } 73 | 74 | - (IBAction)remove:(id)sender { 75 | [[[self undoManager] prepareWithInvocationTarget:self] performSelector:@selector(addFiles:) withObject:[self valueForKeyPath:@"selectedObjects.path"]]; 76 | [super remove:sender]; 77 | } 78 | 79 | - (void)selectPreviousImage { 80 | 81 | if([self canSelectPrevious]) { 82 | [[[self undoManager] prepareWithInvocationTarget:self] selectNext:self]; 83 | [self selectPrevious:self]; 84 | } 85 | } 86 | 87 | - (void)selectNextImage { 88 | 89 | if([self canSelectNext]) { 90 | [[[self undoManager] prepareWithInvocationTarget:self] selectPrevious:self]; 91 | [self selectNext:self]; 92 | } 93 | } 94 | 95 | - (void)selectNextImageOrFirstOne { 96 | 97 | if([self canSelectNext]) { 98 | [[[self undoManager] prepareWithInvocationTarget:self] selectPrevious:self]; 99 | [self selectNext:self]; 100 | } else { 101 | if([[self arrangedObjects] count] == 0) return; 102 | [self setSelectionIndex:0]; 103 | } 104 | } 105 | 106 | - (BOOL)multipleImagesSelected { 107 | return [[self selectedObjects] count] > 1; 108 | } 109 | 110 | - (BOOL)containsPath:(NSString *)path { 111 | NSArray *paths = [self valueForKeyPath:@"arrangedObjects.path"]; 112 | return [paths containsObject:path]; 113 | } 114 | 115 | - (BOOL)extensionIsAllowed:(NSString *)path { 116 | return [allowedExtensions containsObject:[[path pathExtension] lowercaseString]]; 117 | } 118 | 119 | - (void)addFiles:(NSArray *)filePaths { 120 | 121 | NSMutableArray *imagesInfoToAdd = [NSMutableArray array]; 122 | 123 | for(NSString *path in filePaths) { 124 | 125 | if([[NSFileManager defaultManager] isDirectory:path]) { 126 | NSArray *dirContent = [[NSFileManager defaultManager] directoryContentFullPaths:path recursive:YES]; 127 | [self addFiles:dirContent]; 128 | continue; 129 | } 130 | 131 | if([path hasPrefix:@"."] || ![self extensionIsAllowed:path]) { 132 | continue; 133 | } 134 | 135 | [imagesInfoToAdd addObject:[CSSImageInfo containerWithPath:path]]; 136 | } 137 | 138 | if([[NSUserDefaults standardUserDefaults] boolForKey:kApplyNaturalSortOrder]) { 139 | [imagesInfoToAdd sortUsingFunction:&naturalCompare context:nil]; 140 | } 141 | 142 | [self addObjects:imagesInfoToAdd]; 143 | } 144 | 145 | - (void)addDirFiles:(NSString *)dir { 146 | //NSLog(@"-- addDirFiles: %@", dir); 147 | [self addFiles:[NSArray arrayWithObject:dir]]; 148 | 149 | ImagesController *ic = [[self undoManager] prepareWithInvocationTarget:self]; 150 | [ic remove:self]; 151 | } 152 | 153 | - (IBAction)moveToTrash:(id)sender { 154 | [[self selectedObjects] makeObjectsPerformSelector:@selector(moveToTrash)]; 155 | [self removeObjectsAtArrangedObjectIndexes:[self selectionIndexes]]; 156 | } 157 | 158 | /* 159 | - (NSArray *)flagged { 160 | NSPredicate *p = [NSPredicate predicateWithFormat:@"flagged == YES"]; 161 | NSMutableArray *ma = [[self arrangedObjects] mutableCopy]; 162 | [ma filterUsingPredicate:p]; 163 | return [ma autorelease]; 164 | } 165 | */ 166 | 167 | #pragma mark GPS 168 | 169 | - (BOOL)atLeastOneImageWithGPSSelected { 170 | 171 | NSEnumerator *e = [[self selectedObjects] objectEnumerator]; 172 | CSSImageInfo *container = nil; 173 | 174 | while((container = [e nextObject])) { 175 | if([container gps] != nil) return YES; 176 | } 177 | 178 | return NO; 179 | } 180 | 181 | - (IBAction)openMap:(id)sender { 182 | if(![[self selectedObjects] count]) return; 183 | CSSImageInfo *i = [[self selectedObjects] lastObject]; 184 | NSURL *url = [i googleMapsURL]; 185 | if(!url) return; 186 | [[NSWorkspace sharedWorkspace] openURL:url]; 187 | } 188 | 189 | @end 190 | 191 | 192 | -------------------------------------------------------------------------------- /NSImage+CSS.m: -------------------------------------------------------------------------------- 1 | // 2 | // NSImage+CSS.m 3 | // CocoaSlideShow 4 | // 5 | // Created by Nicolas Seriot on 19.07.09. 6 | // Copyright 2009 Sen:te. All rights reserved. 7 | // 8 | 9 | // http://www.cocoadev.com/index.pl?ThumbnailImages 10 | 11 | #import "NSImage+CSS.h" 12 | //#import 13 | #import 14 | 15 | @implementation NSImage (CSS) 16 | 17 | static inline double rad(int alpha) {return ((alpha * M_PI)/180);} 18 | 19 | + (BOOL)scaleAndSaveJPEGThumbnailFromFile:(NSString *)srcPath toPath:(NSString *)dstPath boundingBox:(NSSize)boundingBox rotation:(int)orientationDegrees size:(NSSize *)mySize { 20 | #warning TODO: implement using CIImage 21 | /* 22 | NSImage *thumbnail = [[EpegWrapper imageWithPath2:srcPath boundingBox:boundingBox] rotatedWithAngle:orientationDegrees]; 23 | NSBitmapImageRep *bitmap = [NSBitmapImageRep imageRepWithData: [thumbnail TIFFRepresentation]]; 24 | NSDictionary *properties = [NSDictionary dictionaryWithObjectsAndKeys: [NSNumber numberWithFloat:0.75], NSImageCompressionFactor, [NSNumber numberWithBool:YES], NSImageProgressive, nil]; 25 | NSData *data = [bitmap representationUsingType:NSJPEGFileType properties:properties]; 26 | *mySize = [thumbnail size]; 27 | return [data writeToFile:dstPath atomically:NO]; 28 | */ 29 | return NO; 30 | } 31 | 32 | - (CIImage *)toCIImage { 33 | NSBitmapImageRep *bitmapimagerep = [[NSBitmapImageRep alloc] initWithData:[self TIFFRepresentation]]; 34 | CIImage *im = [[CIImage alloc] 35 | initWithBitmapImageRep:bitmapimagerep]; 36 | return im; 37 | } 38 | 39 | - (BOOL)scaleAndSaveAsJPEGWithMaxWidth:(int)width 40 | maxHeight:(int)height 41 | quality:(float)quality 42 | destination:(NSString *)dest { 43 | 44 | @autoreleasepool { 45 | NSBitmapImageRep *rep = nil; 46 | NSBitmapImageRep *output = nil; 47 | NSImage *scratch = nil; 48 | int w,h,nw,nh; 49 | NSData *bitmapData; 50 | 51 | rep = [NSBitmapImageRep imageRepWithData:[self TIFFRepresentation]]; 52 | 53 | // could not open file 54 | if (!rep) { 55 | NSLog(@"Could not create NSBitmapImageRep"); 56 | return NO; 57 | } 58 | 59 | // validation 60 | if (quality<=0.0) quality = 0.85; 61 | if (quality>1.0) quality = 1.00; 62 | 63 | // source image size 64 | w = nw = [rep pixelsWide]; 65 | h = nh = [rep pixelsHigh]; 66 | 67 | if (w>width || h>height) { 68 | float wr, hr; 69 | 70 | // ratios 71 | wr = w/(float)width; 72 | hr = h/(float)height; 73 | 74 | 75 | if (wr>hr) { // landscape 76 | nw = width; 77 | nh = h/wr; 78 | } else { // portrait 79 | nh = height; 80 | nw = w/hr; 81 | } 82 | } 83 | 84 | // image to render into 85 | scratch = [[NSImage alloc] initWithSize:NSMakeSize(nw, nh)]; 86 | 87 | // could not create image 88 | if (!scratch) { 89 | NSLog(@"Could not render image"); 90 | return NO; 91 | } 92 | 93 | // draw into image, to scale it 94 | [scratch lockFocus]; 95 | [[NSGraphicsContext currentContext] setImageInterpolation:NSImageInterpolationHigh]; 96 | [rep drawInRect:NSMakeRect(0.0, 0.0, nw, nh)]; 97 | output = [[NSBitmapImageRep alloc] initWithFocusedViewRect:NSMakeRect(0,0,nw,nh)]; 98 | [scratch unlockFocus]; 99 | 100 | // could not get result 101 | if (!output) { 102 | NSLog(@"Could not scale image"); 103 | return NO; 104 | } 105 | 106 | // save as JPEG 107 | NSDictionary *properties = 108 | [NSDictionary dictionaryWithObjectsAndKeys: 109 | [NSNumber numberWithFloat:quality], 110 | NSImageCompressionFactor, NULL]; 111 | 112 | bitmapData = [output representationUsingType:NSJPEGFileType 113 | properties:properties]; 114 | 115 | // could not get result 116 | if (!bitmapData) { 117 | NSLog(@"Could not convert to JPEG"); 118 | return NO; 119 | } 120 | 121 | BOOL ret = [bitmapData writeToFile:dest atomically:YES]; 122 | 123 | 124 | return ret; 125 | } 126 | } 127 | 128 | // http://lists.apple.com/archives/Cocoa-dev/2005//Dec/msg00143.html 129 | // TODO: use CIImage? 130 | - (NSImage *)rotatedWithAngle:(int)alpha { 131 | float factorW, factorH, dW, dH; 132 | NSAffineTransform *centreOp, *rotateOp; 133 | NSImage *tmpImage; 134 | NSPoint startPoint; 135 | NSGraphicsContext* graphicsContext; 136 | BOOL wasAntialiasing; 137 | NSImageInterpolation previousImageInterpolation; 138 | 139 | if (0 == alpha) return self; 140 | factorW = fabs(cos(rad(alpha))); 141 | factorH = fabs(sin(rad(alpha))); 142 | dW = [self size].width * factorW + [self size].height * factorH; 143 | dH = [self size].width * factorH + [self size].height * factorW; 144 | tmpImage = [[NSImage alloc] initWithSize: NSMakeSize(dW, dH)]; 145 | 146 | centreOp = [NSAffineTransform transform]; 147 | [centreOp translateXBy: dW / 2 yBy: dH / 2]; 148 | rotateOp = [NSAffineTransform transform]; 149 | [rotateOp rotateByDegrees: alpha]; 150 | [rotateOp appendTransform: centreOp]; 151 | 152 | [self setMatchesOnMultipleResolution: NO]; 153 | [self setUsesEPSOnResolutionMismatch: YES]; 154 | [tmpImage lockFocus]; 155 | graphicsContext = [NSGraphicsContext currentContext]; 156 | wasAntialiasing = [graphicsContext shouldAntialias]; 157 | previousImageInterpolation = [graphicsContext imageInterpolation]; 158 | [graphicsContext setShouldAntialias: YES]; 159 | [graphicsContext setImageInterpolation: NSImageInterpolationHigh]; 160 | 161 | [rotateOp concat]; 162 | startPoint = NSMakePoint(-[self size].width / 2, -[self size].height / 2); 163 | [self drawAtPoint: startPoint 164 | fromRect: NSMakeRect(0, 0, [self size].width, [self size].height) 165 | operation: NSCompositeCopy 166 | fraction: 1.0]; 167 | 168 | [graphicsContext setShouldAntialias: wasAntialiasing]; 169 | [graphicsContext setImageInterpolation: previousImageInterpolation]; 170 | [tmpImage unlockFocus]; 171 | // [tmpImage setDataRetained: YES]; 172 | // [tmpImage setScalesWhenResized: YES]; 173 | 174 | return tmpImage; 175 | } 176 | /* 177 | - (NSImage *)rotatedWithAngle:(int)alpha { 178 | CIImage *ciImage = [self toCIImage]; 179 | 180 | CIImage *rotateImage = [ciImage rotateByDegrees:alpha]; 181 | 182 | return [rotateImage toNSImage]; 183 | } 184 | */ 185 | @end 186 | -------------------------------------------------------------------------------- /CSSMapController.m: -------------------------------------------------------------------------------- 1 | // 2 | // MapController.m 3 | // CocoaSlideShow 4 | // 5 | // Created by Nicolas Seriot on 14.11.08. 6 | // Copyright 2008 Sen:te. All rights reserved. 7 | // 8 | 9 | #import "CSSMapController.h" 10 | #import "CSSImageInfo.h" 11 | #import "AppDelegate.h" 12 | #import "NSImage+CSS.h" 13 | 14 | NSString *const G_NORMAL_MAP = @"G_NORMAL_MAP"; 15 | NSString *const G_HYBRID_MAP = @"G_HYBRID_MAP"; 16 | NSString *const G_SATELLITE_MAP = @"G_SATELLITE_MAP"; 17 | NSString *const G_PHYSICAL_MAP = @"G_PHYSICAL_MAP"; 18 | 19 | static NSString *const kMapStyle = @"mapStyle"; 20 | static NSString *const kMapZoom = @"mapZoom"; 21 | 22 | 23 | @implementation CSSMapController 24 | 25 | - (void)awakeFromNib { 26 | displayedImages = [[NSMutableSet alloc] init]; 27 | 28 | // NSString *filePath = [[NSBundle mainBundle] pathForResource:@"gmap" ofType:@"html"]; 29 | // 30 | // NSURL *url = [NSURL fileURLWithPath:filePath]; 31 | // NSURLRequest *request = [NSURLRequest requestWithURL:url]; 32 | 33 | // // FIXME: webView frame should be set according to current window size, but it doesn't work.. 34 | // [webView setFrame:NSMakeRect(0.0, 0.0, 1500.0, 1000.0)]; 35 | // 36 | // [webView setFrameLoadDelegate:self]; 37 | // [[webView mainFrame] loadRequest:request]; 38 | // 39 | // scriptObject = [webView windowScriptObject]; 40 | // [scriptObject setValue:self forKey:@"mapController"]; 41 | } 42 | /* 43 | + (NSString *)webScriptNameForSelector:(SEL)sel { 44 | if (sel == @selector(setMapType:)) 45 | return @"setMapType"; 46 | return nil; 47 | } 48 | */ 49 | - (void)mapTypeDidChange:(id)mapType { 50 | //NSLog(@"-- mapTypeDidChange:%@", mapType); 51 | 52 | if([[self mapStyles] containsObject:mapType]) { 53 | [[NSUserDefaults standardUserDefaults] setValue:mapType forKey:kMapStyle]; 54 | } 55 | } 56 | 57 | - (void)zoomLevelDidChange:(id)zoomLevel { 58 | //NSLog(@"-- zoomLevelDidChange:%@", zoomLevel); 59 | 60 | [[NSUserDefaults standardUserDefaults] setValue:zoomLevel forKey:kMapZoom]; 61 | } 62 | 63 | + (BOOL)isSelectorExcludedFromWebScript:(SEL)aSelector { return NO; } 64 | + (BOOL)isKeyExcludedFromWebScript:(const char *)name { return NO; } 65 | 66 | 67 | - (NSArray *)mapStyles { 68 | return [NSArray arrayWithObjects:G_PHYSICAL_MAP, G_NORMAL_MAP, G_SATELLITE_MAP, G_HYBRID_MAP, nil]; 69 | } 70 | 71 | - (void)clearMap { 72 | // [[webView mainFrame] loadRequest:nil]; 73 | 74 | assert([mapView isKindOfClass:[MKMapView class]]); 75 | 76 | NSArray *annotations = [mapView annotations]; 77 | 78 | NSLog(@"-- %@", annotations); 79 | 80 | [mapView removeAnnotations:annotations]; 81 | } 82 | 83 | - (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context { 84 | 85 | if(object == imagesController && [keyPath isEqualToString:@"selectedObjects"]) { 86 | [self evaluateNewJavaScriptOnSelectedObjectsChange]; 87 | } else if(object == imagesController && [keyPath isEqualToString:@"arrangedObjects"]) { 88 | [self evaluateNewJavaScriptOnArrangedObjectsChange]; 89 | } 90 | } 91 | 92 | - (void)evaluateNewJavaScriptOnSelectedObjectsChange { 93 | //NSLog(@"-- evaluateNewJavaScriptOnSelectedObjectsChange"); 94 | 95 | NSMutableSet *toShow = [NSMutableSet setWithArray:[imagesController selectedObjects]]; 96 | [toShow minusSet:displayedImages]; 97 | NSMutableSet *toHide = [displayedImages mutableCopy]; 98 | [toHide minusSet:[NSMutableSet setWithArray:[imagesController selectedObjects]]]; 99 | 100 | NSMutableArray *jsCommands = [NSMutableArray array]; 101 | 102 | for(CSSImageInfo *imageInfo in toHide) { 103 | NSString *jsHidePoint = [imageInfo jsHidePoint]; 104 | if(!jsHidePoint) continue; 105 | [jsCommands addObject:jsHidePoint]; 106 | [displayedImages removeObject:imageInfo]; 107 | } 108 | 109 | for(CSSImageInfo *imageInfo in toShow) { 110 | NSString *jsShowPoint = [imageInfo jsShowPoint]; 111 | if(!jsShowPoint) continue; 112 | [jsCommands addObject:jsShowPoint]; 113 | [displayedImages addObject:imageInfo]; 114 | } 115 | 116 | 117 | CSSImageInfo *lastObject = [[imagesController selectedObjects] lastObject]; 118 | 119 | NSString *lat = [lastObject prettyLatitude]; 120 | NSString *lon = [lastObject prettyLongitude]; 121 | NSString *zoom = [[NSUserDefaults standardUserDefaults] valueForKey:kMapZoom]; 122 | if([lat length] && [lon length] && zoom) { 123 | [jsCommands addObject:[NSString stringWithFormat:@"centerToLatitudeAndLongitudeWithZoom(%@, %@, %@);", lat, lon, zoom]]; 124 | } 125 | 126 | //NSString *js = [jsCommands componentsJoinedByString:@"\n"]; 127 | //NSLog(@"-- \n%@", js); 128 | 129 | // [webView stringByEvaluatingJavaScriptFromString:js]; 130 | } 131 | 132 | - (void)evaluateNewJavaScriptOnArrangedObjectsChange { 133 | //NSLog(@"-- evaluateNewJavaScriptOnArrangedObjectsChange"); 134 | 135 | NSMutableSet *toAdd = [NSMutableSet setWithArray:[imagesController arrangedObjects]]; 136 | [toAdd minusSet:displayedImages]; 137 | NSMutableSet *toRemove = [displayedImages mutableCopy]; 138 | [toRemove minusSet:[NSSet setWithArray:[imagesController arrangedObjects]]]; 139 | 140 | NSMutableArray *jsCommands = [NSMutableArray array]; 141 | 142 | for(CSSImageInfo *imageInfo in toRemove) { 143 | NSString *jsRemovePoint = [imageInfo jsRemovePoint]; 144 | if(!jsRemovePoint) continue; 145 | [jsCommands addObject:jsRemovePoint]; 146 | [displayedImages removeObject:imageInfo]; 147 | } 148 | 149 | for(CSSImageInfo *imageInfo in toAdd) { 150 | NSString *jsAddPoint = [imageInfo jsAddPoint]; 151 | if(!jsAddPoint) continue; 152 | [jsCommands addObject:jsAddPoint]; 153 | //NSLog(@" -- add %d", [imageInfo hash]); 154 | } 155 | 156 | 157 | //NSString *js = [jsCommands componentsJoinedByString:@"\n"]; 158 | //NSLog(@"-- \n%@", js); 159 | 160 | // [webView stringByEvaluatingJavaScriptFromString:js]; 161 | 162 | [self evaluateNewJavaScriptOnSelectedObjectsChange]; 163 | } 164 | 165 | #pragma mark WebFrameLoadDelegate 166 | 167 | //- (void)webView:(WebView *)sender didFinishLoadForFrame:(WebFrame *)frame { 168 | // 169 | // NSString *mapStyle = [[NSUserDefaults standardUserDefaults] stringForKey:kMapStyle]; 170 | // if(!mapStyle || ![[self mapStyles] containsObject:mapStyle]) { 171 | // mapStyle = G_PHYSICAL_MAP; 172 | // [[NSUserDefaults standardUserDefaults] setValue:mapStyle forKey:kMapStyle]; 173 | // } 174 | // [webView stringByEvaluatingJavaScriptFromString:[NSString stringWithFormat:@"setMapStyle(%@);", mapStyle]]; 175 | //} 176 | 177 | 178 | @end 179 | -------------------------------------------------------------------------------- /AppDelegate+Toolbar.m: -------------------------------------------------------------------------------- 1 | // 2 | // CocoaSlideShow+Toolbar.m 3 | // CocoaSlideShow 4 | // 5 | // Created by Nicolas Seriot on 04.05.08. 6 | // Copyright 2008 Sen:te. All rights reserved. 7 | // 8 | 9 | #import "AppDelegate+Toolbar.h" 10 | 11 | #define kAlwaysSelected 0 12 | #define kSelectedIfAtLeastOneImageSelected 1 13 | #define kSelectedIfAtLeastOneGPSImageSelected 2 14 | #define kSelectedIfGPSOrCanGoBackToImage 3 15 | 16 | @implementation AppDelegate (Toolbar) 17 | 18 | - (NSToolbarItem *)toolbar:(NSToolbar *)toolbar itemForItemIdentifier:(NSString *)itemIdentifier willBeInsertedIntoToolbar:(BOOL)flag { 19 | 20 | NSToolbarItem *item = [[NSToolbarItem alloc] initWithItemIdentifier:itemIdentifier]; 21 | 22 | if ([itemIdentifier isEqualToString:@"setDirectory"]) { 23 | [item setLabel:NSLocalizedString(@"Set Directory…", @"Toolbar item")]; 24 | [item setPaletteLabel:NSLocalizedString(@"Set Directory…", @"Toolbar customize")]; 25 | [item setToolTip:NSLocalizedString(@"Set Directory…", @"Toolbar tooltip")]; 26 | [item setImage:[NSImage imageNamed:@"folder.png"]]; 27 | [item setTag:kAlwaysSelected]; 28 | [item setTarget:self]; 29 | [item setAction:@selector(setDirectory:)]; 30 | } else if ([itemIdentifier isEqualToString:@"addFiles"]) { 31 | [item setLabel:NSLocalizedString(@"Add Files…", @"Toolbar item")]; 32 | [item setPaletteLabel:NSLocalizedString(@"Add Files…", @"Toolbar customize")]; 33 | [item setToolTip:NSLocalizedString(@"Add Files…", @"Toolbar tooltip")]; 34 | [item setImage:[NSImage imageNamed:@"add.png"]]; 35 | [item setTag:kAlwaysSelected]; 36 | [item setTarget:self]; 37 | [item setAction:@selector(addDirectory:)]; 38 | } else if ([itemIdentifier isEqualToString:@"flag"]) { 39 | [item setLabel:NSLocalizedString(@"Flag", @"Toolbar item")]; 40 | [item setPaletteLabel:NSLocalizedString(@"Flag", @"Toolbar customize")]; 41 | [item setToolTip:NSLocalizedString(@"Flag", @"Toolbar tooltip")]; 42 | [item setImage:[NSImage imageNamed:@"flag.png"]]; 43 | [item setTag:kSelectedIfAtLeastOneImageSelected]; 44 | [item setTarget:self]; 45 | [item setAction:@selector(toggleFlags:)]; 46 | } else if ([itemIdentifier isEqualToString:@"fullScreen"]) { 47 | [item setLabel:NSLocalizedString(@"Full Screen", @"Toolbar item")]; 48 | [item setPaletteLabel:NSLocalizedString(@"Full Screen", @"Toolbar customize")]; 49 | [item setToolTip:NSLocalizedString(@"Full Screen", @"Toolbar tooltip")]; 50 | [item setImage:[NSImage imageNamed:@"fullscreen.png"]]; 51 | [item setTag:kAlwaysSelected]; 52 | [item setTarget:self]; 53 | [item setAction:@selector(fullScreenMode:)]; 54 | } else if ([itemIdentifier isEqualToString:@"slideShow"]) { 55 | [item setLabel:NSLocalizedString(@"Slideshow", @"Toolbar item")]; 56 | [item setPaletteLabel:NSLocalizedString(@"Slideshow", @"Toolbar customize")]; 57 | [item setToolTip:NSLocalizedString(@"Slideshow", @"Toolbar tooltip")]; 58 | [item setImage:[NSImage imageNamed:@"slideshow.png"]]; 59 | [item setTag:kAlwaysSelected]; 60 | [item setTarget:self]; 61 | [item setAction:@selector(startSlideShow:)]; 62 | } else if ([itemIdentifier isEqualToString:@"rotateLeft"]) { 63 | [item setLabel:NSLocalizedString(@"Rotate Left", @"Toolbar item")]; 64 | [item setPaletteLabel:NSLocalizedString(@"Rotate Left", @"Toolbar customize")]; 65 | [item setToolTip:NSLocalizedString(@"Rotate Left", @"Toolbar tooltip")]; 66 | [item setImage:[NSImage imageNamed:@"left.png"]]; 67 | [item setTag:kSelectedIfAtLeastOneImageSelected]; 68 | [item setTarget:self]; 69 | [item setAction:@selector(rotateLeft:)]; 70 | } else if ([itemIdentifier isEqualToString:@"rotateRight"]) { 71 | [item setLabel:NSLocalizedString(@"Rotate Right", @"Toolbar item")]; 72 | [item setPaletteLabel:NSLocalizedString(@"Rotate Right", @"Toolbar customize")]; 73 | [item setToolTip:NSLocalizedString(@"Rotate Right", @"Toolbar tooltip")]; 74 | [item setImage:[NSImage imageNamed:@"right.png"]]; 75 | [item setTag:kSelectedIfAtLeastOneImageSelected]; 76 | [item setTarget:self]; 77 | [item setAction:@selector(rotateRight:)]; 78 | } else if ([itemIdentifier isEqualToString:@"remove"]) { 79 | [item setLabel:NSLocalizedString(@"Remove", @"Toolbar item")]; 80 | [item setPaletteLabel:NSLocalizedString(@"Remove", @"Toolbar customize")]; 81 | [item setToolTip:NSLocalizedString(@"Remove", @"Toolbar tooltip")]; 82 | [item setImage:[NSImage imageNamed:@"remove.png"]]; 83 | [item setTag:kSelectedIfAtLeastOneImageSelected]; 84 | [item setTarget:self]; 85 | [item setAction:@selector(remove:)]; 86 | } else if ([itemIdentifier isEqualToString:@"trash"]) { 87 | [item setLabel:NSLocalizedString(@"Move to Trash", @"Toolbar item")]; 88 | [item setPaletteLabel:NSLocalizedString(@"Trash", @"Toolbar customize")]; 89 | [item setToolTip:NSLocalizedString(@"Trash", @"Toolbar tooltip")]; 90 | [item setImage:[NSImage imageNamed:@"trash.png"]]; 91 | [item setTag:kSelectedIfAtLeastOneImageSelected]; 92 | [item setTarget:self]; 93 | [item setAction:@selector(moveToTrash:)]; 94 | } else if ([itemIdentifier isEqualToString:@"gmap"]) { 95 | [item setLabel:NSLocalizedString(@"Map", @"Toolbar item")]; 96 | [item setPaletteLabel:NSLocalizedString(@"Map", @"Toolbar customize")]; 97 | [item setToolTip:NSLocalizedString(@"Map", @"Toolbar tooltip")]; 98 | [item setImage:[NSImage imageNamed:@"gmap.png"]]; 99 | [item setTag:kSelectedIfGPSOrCanGoBackToImage]; 100 | [item setTarget:self]; 101 | [item setAction:@selector(toggleMap:)]; 102 | } 103 | return item; 104 | } 105 | 106 | - (NSArray *)toolbarDefaultItemIdentifiers:(NSToolbar*)toolbar { 107 | return [NSArray arrayWithObjects:@"setDirectory", @"addFiles", 108 | NSToolbarSeparatorItemIdentifier, @"flag", @"fullScreen", @"slideShow", @"gmap", @"rotateLeft", @"rotateRight", @"remove", 109 | NSToolbarFlexibleSpaceItemIdentifier, @"trash", nil]; 110 | } 111 | 112 | - (NSArray *)toolbarAllowedItemIdentifiers:(NSToolbar*)toolbar { 113 | NSArray *standardItems = [NSArray arrayWithObjects:NSToolbarSeparatorItemIdentifier, 114 | NSToolbarSpaceItemIdentifier, 115 | NSToolbarFlexibleSpaceItemIdentifier, 116 | NSToolbarCustomizeToolbarItemIdentifier, nil]; 117 | NSArray *moreItems = [NSArray array]; 118 | return [[[self toolbarDefaultItemIdentifiers:nil] arrayByAddingObjectsFromArray:standardItems] arrayByAddingObjectsFromArray:moreItems]; 119 | } 120 | 121 | - (BOOL)validateToolbarItem:(NSToolbarItem *)theItem { 122 | //NSLog(@"-- %@", [theItem label]); 123 | if([theItem tag] == kAlwaysSelected) { 124 | return YES; 125 | } else if ([theItem tag] == kSelectedIfAtLeastOneImageSelected) { 126 | return [[imagesController selectedObjects] count] > 0; 127 | } else if ([theItem tag] == kSelectedIfAtLeastOneGPSImageSelected) { 128 | return [imagesController atLeastOneImageWithGPSSelected]; 129 | } else if ([theItem tag] == kSelectedIfGPSOrCanGoBackToImage) { 130 | return [(AppDelegate *)[NSApp delegate] isMap] || [imagesController atLeastOneImageWithGPSSelected]; 131 | } 132 | return NO; 133 | } 134 | 135 | - (void)toggleFlags:(id)sender { 136 | [imagesController toggleFlags:sender]; 137 | } 138 | 139 | - (void)remove:(id)sender { 140 | [imagesController remove:sender]; 141 | } 142 | 143 | - (void)moveToTrash:(id)sender { 144 | [imagesController moveToTrash:sender]; 145 | } 146 | 147 | - (void)openMap:(id)sender { 148 | [imagesController openMap:sender]; 149 | } 150 | 151 | @end 152 | -------------------------------------------------------------------------------- /Sparkle.framework/Versions/A/Headers/SUUpdater.h: -------------------------------------------------------------------------------- 1 | // 2 | // SUUpdater.h 3 | // Sparkle 4 | // 5 | // Created by Andy Matuschak on 1/4/06. 6 | // Copyright 2006 Andy Matuschak. All rights reserved. 7 | // 8 | 9 | #ifndef SUUPDATER_H 10 | #define SUUPDATER_H 11 | 12 | #if __has_feature(modules) 13 | @import Cocoa; 14 | #else 15 | #import 16 | #endif 17 | #import "SUExport.h" 18 | #import "SUVersionComparisonProtocol.h" 19 | #import "SUVersionDisplayProtocol.h" 20 | 21 | @class SUAppcastItem, SUAppcast; 22 | 23 | @protocol SUUpdaterDelegate; 24 | 25 | /*! 26 | The main API in Sparkle for controlling the update mechanism. 27 | 28 | This class is used to configure the update paramters as well as manually 29 | and automatically schedule and control checks for updates. 30 | */ 31 | SU_EXPORT @interface SUUpdater : NSObject 32 | 33 | @property (unsafe_unretained) IBOutlet id delegate; 34 | 35 | /*! 36 | The shared updater for the main bundle. 37 | 38 | This is equivalent to passing [NSBundle mainBundle] to SUUpdater::updaterForBundle: 39 | */ 40 | + (SUUpdater *)sharedUpdater; 41 | 42 | /*! 43 | The shared updater for a specified bundle. 44 | 45 | If an updater has already been initialized for the provided bundle, that shared instance will be returned. 46 | */ 47 | + (SUUpdater *)updaterForBundle:(NSBundle *)bundle; 48 | 49 | /*! 50 | Designated initializer for SUUpdater. 51 | 52 | If an updater has already been initialized for the provided bundle, that shared instance will be returned. 53 | */ 54 | - (instancetype)initForBundle:(NSBundle *)bundle; 55 | 56 | /*! 57 | Explicitly checks for updates and displays a progress dialog while doing so. 58 | 59 | This method is meant for a main menu item. 60 | Connect any menu item to this action in Interface Builder, 61 | and Sparkle will check for updates and report back its findings verbosely 62 | when it is invoked. 63 | 64 | This will find updates that the user has opted into skipping. 65 | */ 66 | - (IBAction)checkForUpdates:(id)sender; 67 | 68 | /*! 69 | The menu item validation used for the -checkForUpdates: action 70 | */ 71 | - (BOOL)validateMenuItem:(NSMenuItem *)menuItem; 72 | 73 | /*! 74 | Checks for updates, but does not display any UI unless an update is found. 75 | 76 | This is meant for programmatically initating a check for updates. That is, 77 | it will display no UI unless it actually finds an update, in which case it 78 | proceeds as usual. 79 | 80 | If automatic downloading of updates it turned on and allowed, however, 81 | this will invoke that behavior, and if an update is found, it will be downloaded 82 | in the background silently and will be prepped for installation. 83 | 84 | This will not find updates that the user has opted into skipping. 85 | */ 86 | - (void)checkForUpdatesInBackground; 87 | 88 | /*! 89 | A property indicating whether or not to check for updates automatically. 90 | 91 | Setting this property will persist in the host bundle's user defaults. 92 | The update schedule cycle will be reset in a short delay after the property's new value is set. 93 | This is to allow reverting this property without kicking off a schedule change immediately 94 | */ 95 | @property BOOL automaticallyChecksForUpdates; 96 | 97 | /*! 98 | A property indicating whether or not updates can be automatically downloaded in the background. 99 | 100 | Note that automatic downloading of updates can be disallowed by the developer 101 | or by the user's system if silent updates cannot be done (eg: if they require authentication). 102 | In this case, -automaticallyDownloadsUpdates will return NO regardless of how this property is set. 103 | 104 | Setting this property will persist in the host bundle's user defaults. 105 | */ 106 | @property BOOL automaticallyDownloadsUpdates; 107 | 108 | /*! 109 | A property indicating the current automatic update check interval. 110 | 111 | Setting this property will persist in the host bundle's user defaults. 112 | The update schedule cycle will be reset in a short delay after the property's new value is set. 113 | This is to allow reverting this property without kicking off a schedule change immediately 114 | */ 115 | @property NSTimeInterval updateCheckInterval; 116 | 117 | /*! 118 | Begins a "probing" check for updates which will not actually offer to 119 | update to that version. 120 | 121 | However, the delegate methods 122 | SUUpdaterDelegate::updater:didFindValidUpdate: and 123 | SUUpdaterDelegate::updaterDidNotFindUpdate: will be called, 124 | so you can use that information in your UI. 125 | 126 | Updates that have been skipped by the user will not be found. 127 | */ 128 | - (void)checkForUpdateInformation; 129 | 130 | /*! 131 | The URL of the appcast used to download update information. 132 | 133 | Setting this property will persist in the host bundle's user defaults. 134 | If you don't want persistence, you may want to consider instead implementing 135 | SUUpdaterDelegate::feedURLStringForUpdater: or SUUpdaterDelegate::feedParametersForUpdater:sendingSystemProfile: 136 | 137 | This property must be called on the main thread. 138 | */ 139 | @property (copy) NSURL *feedURL; 140 | 141 | /*! 142 | The host bundle that is being updated. 143 | */ 144 | @property (readonly, strong) NSBundle *hostBundle; 145 | 146 | /*! 147 | The bundle this class (SUUpdater) is loaded into. 148 | */ 149 | @property (strong, readonly) NSBundle *sparkleBundle; 150 | 151 | /*! 152 | The user agent used when checking for updates. 153 | 154 | The default implementation can be overrided. 155 | */ 156 | @property (nonatomic, copy) NSString *userAgentString; 157 | 158 | /*! 159 | The HTTP headers used when checking for updates. 160 | 161 | The keys of this dictionary are HTTP header fields (NSString) and values are corresponding values (NSString) 162 | */ 163 | @property (copy) NSDictionary *httpHeaders; 164 | 165 | /*! 166 | A property indicating whether or not the user's system profile information is sent when checking for updates. 167 | 168 | Setting this property will persist in the host bundle's user defaults. 169 | */ 170 | @property BOOL sendsSystemProfile; 171 | 172 | /*! 173 | A property indicating the decryption password used for extracting updates shipped as Apple Disk Images (dmg) 174 | */ 175 | @property (nonatomic, copy) NSString *decryptionPassword; 176 | 177 | /*! 178 | This function ignores normal update schedule, ignores user preferences, 179 | and interrupts users with an unwanted immediate app update. 180 | 181 | WARNING: this function should not be used in regular apps. This function 182 | is a user-unfriendly hack only for very special cases, like unstable 183 | rapidly-changing beta builds that would not run correctly if they were 184 | even one day out of date. 185 | 186 | Instead of this function you should set `SUAutomaticallyUpdate` to `YES`, 187 | which will gracefully install updates when the app quits. 188 | 189 | For UI-less/daemon apps that aren't usually quit, instead of this function, 190 | you can use the delegate method 191 | SUUpdaterDelegate::updater:willInstallUpdateOnQuit:immediateInstallationInvocation: 192 | or 193 | SUUpdaterDelegate::updater:willInstallUpdateOnQuit:immediateInstallationBlock: 194 | to immediately start installation when an update was found. 195 | 196 | A progress dialog is shown but the user will never be prompted to read the 197 | release notes. 198 | 199 | This function will cause update to be downloaded twice if automatic updates are 200 | enabled. 201 | 202 | You may want to respond to the userDidCancelDownload delegate method in case 203 | the user clicks the "Cancel" button while the update is downloading. 204 | */ 205 | - (void)installUpdatesIfAvailable; 206 | 207 | /*! 208 | Returns the date of last update check. 209 | 210 | \returns \c nil if no check has been performed. 211 | */ 212 | @property (readonly, copy) NSDate *lastUpdateCheckDate; 213 | 214 | /*! 215 | Appropriately schedules or cancels the update checking timer according to 216 | the preferences for time interval and automatic checks. 217 | 218 | This call does not change the date of the next check, 219 | but only the internal NSTimer. 220 | */ 221 | - (void)resetUpdateCycle; 222 | 223 | /*! 224 | A property indicating whether or not an update is in progress. 225 | 226 | Note this property is not indicative of whether or not user initiated updates can be performed. 227 | Use SUUpdater::validateMenuItem: for that instead. 228 | */ 229 | @property (readonly) BOOL updateInProgress; 230 | 231 | @end 232 | 233 | #endif 234 | -------------------------------------------------------------------------------- /Sparkle.framework/Versions/A/Resources/SUModelTranslation.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | ADP2,1 6 | Developer Transition Kit 7 | iMac1,1 8 | iMac G3 (Rev A-D) 9 | iMac4,1 10 | iMac (Core Duo) 11 | iMac4,2 12 | iMac for Education (17 inch, Core Duo) 13 | iMac5,1 14 | iMac (Core 2 Duo, 17 or 20 inch, SuperDrive) 15 | iMac5,2 16 | iMac (Core 2 Duo, 17 inch, Combo Drive) 17 | iMac6,1 18 | iMac (Core 2 Duo, 24 inch, SuperDrive) 19 | iMac7,1 20 | iMac Intel Core 2 Duo (aluminum enclosure) 21 | iMac8,1 22 | iMac (Core 2 Duo, 20 or 24 inch, Early 2008 ) 23 | iMac9,1 24 | iMac (Core 2 Duo, 20 or 24 inch, Early or Mid 2009 ) 25 | iMac10,1 26 | iMac (Core 2 Duo, 21.5 or 27 inch, Late 2009 ) 27 | iMac11,1 28 | iMac (Core i5 or i7, 27 inch Late 2009) 29 | iMac11,2 30 | 21.5" iMac (mid 2010) 31 | iMac11,3 32 | iMac (Core i5 or i7, 27 inch Mid 2010) 33 | iMac12,1 34 | iMac (Core i3 or i5 or i7, 21.5 inch Mid 2010 or Late 2011) 35 | iMac12,2 36 | iMac (Core i5 or i7, 27 inch Mid 2011) 37 | iMac13,1 38 | iMac (Core i3 or i5 or i7, 21.5 inch Late 2012 or Early 2013) 39 | iMac13,2 40 | iMac (Core i5 or i7, 27 inch Late 2012) 41 | iMac14,1 42 | iMac (Core i5, 21.5 inch Late 2013) 43 | iMac14,2 44 | iMac (Core i5 or i7, 27 inch Late 2013) 45 | iMac14,3 46 | iMac (Core i5 or i7, 21.5 inch Late 2013) 47 | iMac14,4 48 | iMac (Core i5, 21.5 inch Mid 2014) 49 | iMac15,1 50 | iMac (Retina 5K Core i5 or i7, 27 inch Late 2014 or Mid 2015) 51 | iMac16,1 52 | iMac (Core i5, 21,5 inch Late 2015) 53 | iMac16,2 54 | iMac (Retina 4K Core i5 or i7, 21.5 inch Late 2015) 55 | iMac17,1 56 | iMac (Retina 5K Core i5 or i7, 27 inch Late 2015) 57 | MacBook1,1 58 | MacBook (Core Duo) 59 | MacBook2,1 60 | MacBook (Core 2 Duo) 61 | MacBook4,1 62 | MacBook (Core 2 Duo Feb 2008) 63 | MacBook5,1 64 | MacBook (Core 2 Duo, Late 2008, Unibody) 65 | MacBook5,2 66 | MacBook (Core 2 Duo, Early 2009, White) 67 | MacBook6,1 68 | MacBook (Core 2 Duo, Late 2009, Unibody) 69 | MacBook7,1 70 | MacBook (Core 2 Duo, Mid 2010, White) 71 | MacBook8,1 72 | MacBook (Core M, 12 inch, Early 2015) 73 | MacBookAir1,1 74 | MacBook Air (Core 2 Duo, 13 inch, Early 2008) 75 | MacBookAir2,1 76 | MacBook Air (Core 2 Duo, 13 inch, Mid 2009) 77 | MacBookAir3,1 78 | MacBook Air (Core 2 Duo, 11 inch, Late 2010) 79 | MacBookAir3,2 80 | MacBook Air (Core 2 Duo, 13 inch, Late 2010) 81 | MacBookAir4,1 82 | MacBook Air (Core i5 or i7, 11 inch, Mid 2011) 83 | MacBookAir4,2 84 | MacBook Air (Core i5 or i7, 13 inch, Mid 2011) 85 | MacBookAir5,1 86 | MacBook Air (Core i5 or i7, 11 inch, Mid 2012) 87 | MacBookAir5,2 88 | MacBook Air (Core i5 or i7, 13 inch, Mid 2012) 89 | MacBookAir6,1 90 | MacBook Air (Core i5 or i7, 11 inch, Mid 2013 or Early 2014) 91 | MacBookAir6,2 92 | MacBook Air (Core i5 or i7, 13 inch, Mid 2013 or Early 2014) 93 | MacBookAir7,1 94 | MacBook Air (Core i5 or i7, 11 inch, Early 2015) 95 | MacBookAir7,2 96 | MacBook Air (Core i5 or i7, 13 inch, Early 2015) 97 | MacBookPro1,1 98 | MacBook Pro Core Duo (15-inch) 99 | MacBookPro1,2 100 | MacBook Pro Core Duo (17-inch) 101 | MacBookPro2,1 102 | MacBook Pro Core 2 Duo (17-inch) 103 | MacBookPro2,2 104 | MacBook Pro Core 2 Duo (15-inch) 105 | MacBookPro3,1 106 | MacBook Pro Core 2 Duo (15-inch LED, Core 2 Duo) 107 | MacBookPro3,2 108 | MacBook Pro Core 2 Duo (17-inch HD, Core 2 Duo) 109 | MacBookPro4,1 110 | MacBook Pro (Core 2 Duo Feb 2008) 111 | MacBookPro5,1 112 | MacBook Pro Intel Core 2 Duo (aluminum unibody) 113 | MacBookPro5,2 114 | MacBook Pro Intel Core 2 Duo (aluminum unibody) 115 | MacBookPro5,3 116 | MacBook Pro Intel Core 2 Duo (aluminum unibody) 117 | MacBookPro5,4 118 | MacBook Pro Intel Core 2 Duo (aluminum unibody) 119 | MacBookPro5,5 120 | MacBook Pro Intel Core 2 Duo (aluminum unibody) 121 | MacBookPro6,1 122 | MacBook Pro Intel Core i5, Intel Core i7 (mid 2010) 123 | MacBookPro6,2 124 | MacBook Pro Intel Core i5, Intel Core i7 (mid 2010) 125 | MacBookPro7,1 126 | MacBook Pro Intel Core 2 Duo (mid 2010) 127 | MacBookPro8,1 128 | MacBook Pro Intel Core i5, Intel Core i7, 13" (early 2011) 129 | MacBookPro8,2 130 | MacBook Pro Intel Core i7, 15" (early 2011) 131 | MacBookPro8,3 132 | MacBook Pro Intel Core i7, 17" (early 2011) 133 | MacBookPro9,1 134 | MacBook Pro (15-inch, Mid 2012) 135 | MacBookPro9,2 136 | MacBook Pro (13-inch, Mid 2012) 137 | MacBookPro10,1 138 | MacBook Pro (Retina, Mid 2012) 139 | MacBookPro10,2 140 | MacBook Pro (Retina, 13-inch, Late 2012) 141 | MacBookPro11,1 142 | MacBook Pro (Retina, 13-inch, Late 2013) 143 | MacBookPro11,2 144 | MacBook Pro (Retina, 15-inch, Late 2013) 145 | MacBookPro11,3 146 | MacBook Pro (Retina, 15-inch, Late 2013) 147 | MacbookPro11,4 148 | MacBook Pro (Retina, 15-inch, Mid 2015) 149 | MacbookPro11,5 150 | MacBook Pro (Retina, 15-inch, Mid 2015) 151 | MacbookPro12,1  152 | MacBook Pro (Retina, 13-inch, Early 2015) 153 | Macmini1,1 154 | Mac Mini (Core Solo/Duo) 155 | Macmini2,1 156 | Mac mini Intel Core 157 | Macmini3,1 158 | Mac mini Intel Core 159 | Macmini4,1 160 | Mac mini Intel Core (Mid 2010) 161 | Macmini5,1 162 | Mac mini (Core i5, Mid 2011) 163 | Macmini5,2 164 | Mac mini (Core i5 or Core i7, Mid 2011) 165 | Macmini5,3 166 | Mac mini (Core i7, Server, Mid 2011) 167 | Macmini6,1 168 | Mac mini (Core i5, Late 2012) 169 | Macmini6,2 170 | Mac mini (Core i7, Normal or Server, Late 2012) 171 | Macmini7,1 172 | Mac mini (Core i5 or Core i7, Late 2014) 173 | MacPro1,1,Quad 174 | Mac Pro 175 | MacPro1,1 176 | Mac Pro (four-core) 177 | MacPro2,1 178 | Mac Pro (eight-core) 179 | MacPro3,1 180 | Mac Pro (January 2008 4- or 8- core "Harpertown") 181 | MacPro4,1 182 | Mac Pro (March 2009) 183 | MacPro5,1 184 | Mac Pro (2010 or 2012) 185 | MacPro6,1 186 | Mac Pro (Late 2013) 187 | PowerBook1,1 188 | PowerBook G3 189 | PowerBook2,1 190 | iBook G3 191 | PowerBook2,2 192 | iBook G3 (FireWire) 193 | PowerBook2,3 194 | iBook G3 195 | PowerBook2,4 196 | iBook G3 197 | PowerBook3,1 198 | PowerBook G3 (FireWire) 199 | PowerBook3,2 200 | PowerBook G4 201 | PowerBook3,3 202 | PowerBook G4 (Gigabit Ethernet) 203 | PowerBook3,4 204 | PowerBook G4 (DVI) 205 | PowerBook3,5 206 | PowerBook G4 (1GHz / 867MHz) 207 | PowerBook4,1 208 | iBook G3 (Dual USB, Late 2001) 209 | PowerBook4,2 210 | iBook G3 (16MB VRAM) 211 | PowerBook4,3 212 | iBook G3 Opaque 16MB VRAM, 32MB VRAM, Early 2003) 213 | PowerBook5,1 214 | PowerBook G4 (17 inch) 215 | PowerBook5,2 216 | PowerBook G4 (15 inch FW 800) 217 | PowerBook5,3 218 | PowerBook G4 (17-inch 1.33GHz) 219 | PowerBook5,4 220 | PowerBook G4 (15 inch 1.5/1.33GHz) 221 | PowerBook5,5 222 | PowerBook G4 (17-inch 1.5GHz) 223 | PowerBook5,6 224 | PowerBook G4 (15 inch 1.67GHz/1.5GHz) 225 | PowerBook5,7 226 | PowerBook G4 (17-inch 1.67GHz) 227 | PowerBook5,8 228 | PowerBook G4 (Double layer SD, 15 inch) 229 | PowerBook5,9 230 | PowerBook G4 (Double layer SD, 17 inch) 231 | PowerBook6,1 232 | PowerBook G4 (12 inch) 233 | PowerBook6,2 234 | PowerBook G4 (12 inch, DVI) 235 | PowerBook6,3 236 | iBook G4 237 | PowerBook6,4 238 | PowerBook G4 (12 inch 1.33GHz) 239 | PowerBook6,5 240 | iBook G4 (Early-Late 2004) 241 | PowerBook6,7 242 | iBook G4 (Mid 2005) 243 | PowerBook6,8 244 | PowerBook G4 (12 inch 1.5GHz) 245 | PowerMac1,1 246 | Power Macintosh G3 (Blue & White) 247 | PowerMac1,2 248 | Power Macintosh G4 (PCI Graphics) 249 | PowerMac2,1 250 | iMac G3 (Slot-loading CD-ROM) 251 | PowerMac2,2 252 | iMac G3 (Summer 2000) 253 | PowerMac3,1 254 | Power Macintosh G4 (AGP Graphics) 255 | PowerMac3,2 256 | Power Macintosh G4 (AGP Graphics) 257 | PowerMac3,3 258 | Power Macintosh G4 (Gigabit Ethernet) 259 | PowerMac3,4 260 | Power Macintosh G4 (Digital Audio) 261 | PowerMac3,5 262 | Power Macintosh G4 (Quick Silver) 263 | PowerMac3,6 264 | Power Macintosh G4 (Mirrored Drive Door) 265 | PowerMac4,1 266 | iMac G3 (Early/Summer 2001) 267 | PowerMac4,2 268 | iMac G4 (Flat Panel) 269 | PowerMac4,4 270 | eMac 271 | PowerMac4,5 272 | iMac G4 (17-inch Flat Panel) 273 | PowerMac5,1 274 | Power Macintosh G4 Cube 275 | PowerMac5,2 276 | Power Mac G4 Cube 277 | PowerMac6,1 278 | iMac G4 (USB 2.0) 279 | PowerMac6,3 280 | iMac G4 (20-inch Flat Panel) 281 | PowerMac6,4 282 | eMac (USB 2.0, 2005) 283 | PowerMac7,2 284 | Power Macintosh G5 285 | PowerMac7,3 286 | Power Macintosh G5 287 | PowerMac8,1 288 | iMac G5 289 | PowerMac8,2 290 | iMac G5 (Ambient Light Sensor) 291 | PowerMac9,1 292 | Power Macintosh G5 (Late 2005) 293 | PowerMac10,1 294 | Mac Mini G4 295 | PowerMac10,2 296 | Mac Mini (Late 2005) 297 | PowerMac11,2 298 | Power Macintosh G5 (Late 2005) 299 | PowerMac12,1 300 | iMac G5 (iSight) 301 | RackMac1,1 302 | Xserve G4 303 | RackMac1,2 304 | Xserve G4 (slot-loading, cluster node) 305 | RackMac3,1 306 | Xserve G5 307 | Xserve1,1 308 | Xserve (Intel Xeon) 309 | Xserve2,1 310 | Xserve (January 2008 quad-core) 311 | Xserve3,1 312 | Xserve (early 2009) 313 | 314 | 315 | -------------------------------------------------------------------------------- /CSSImageInfo.m: -------------------------------------------------------------------------------- 1 | // 2 | // CSSImageContainer.m 3 | // CocoaSlideShow 4 | // 5 | // Created by Nicolas Seriot on 25.08.07. 6 | // Copyright 2007 __MyCompanyName__. All rights reserved. 7 | // 8 | 9 | #import "CSSImageInfo.h" 10 | #import "NSString+CSS.h" 11 | #import "AppDelegate.h" 12 | #import "NSFileManager+CSS.h" 13 | #import "NSImage+CSS.h" 14 | 15 | static NSString *const kMultipleSelectionAllowsEdition = @"MultipleSelectionAllowsEdition"; 16 | 17 | static NSSet *keyPathsForValuesAffectingFlagIcon = nil; 18 | 19 | @implementation CSSImageInfo 20 | 21 | + (NSSet *)keyPathsForValuesAffectingFlagIcon { 22 | if(keyPathsForValuesAffectingFlagIcon == nil) { 23 | keyPathsForValuesAffectingFlagIcon = [NSSet setWithObject:@"isFlagged"]; 24 | } 25 | 26 | return keyPathsForValuesAffectingFlagIcon; 27 | } 28 | /* 29 | + (NSSet *)keyPathsForValuesAffectingValueForKey:(NSString *)key { 30 | NSMutableSet *set = [NSMutableSet set]; 31 | 32 | if([key isEqualToString:@"flagIcon"]) { 33 | [set addObject:@"isFlagged"]; 34 | } 35 | 36 | return set; 37 | } 38 | */ 39 | //+ (void)initialize { 40 | // [self setKeys:[NSArray arrayWithObjects:@"isFlagged", nil] triggerChangeNotificationsForDependentKey:@"flagIcon"]; 41 | //} 42 | 43 | - (void)setPath:(NSString *)aPath { 44 | 45 | if(aPath == nil) { 46 | NSLog(@"-- error: path is nil"); 47 | return; 48 | } 49 | 50 | if(path != aPath) { 51 | path = aPath; 52 | } 53 | } 54 | 55 | - (NSString *)path { 56 | return path; 57 | } 58 | 59 | - (id)initWithPath:(NSString *)aPath { 60 | self = [super init]; 61 | [self setPath:aPath]; 62 | return self; 63 | } 64 | 65 | + (CSSImageInfo *)containerWithPath:(NSString *)aPath { 66 | return [[CSSImageInfo alloc] initWithPath:aPath]; 67 | } 68 | 69 | - (void)dealloc { 70 | //NSLog(@"-- dealloc %@", path); 71 | 72 | if(source) { 73 | CFRelease(source); 74 | source = nil; 75 | } 76 | 77 | 78 | } 79 | 80 | - (NSMutableDictionary *)metadata { 81 | if(!sourceWasRead) [self loadSource]; 82 | return metadata; 83 | } 84 | 85 | - (NSString *)exifDateTime { 86 | NSDictionary *exif = [[self metadata] valueForKey:(NSString *)kCGImagePropertyExifDictionary]; 87 | return [exif valueForKey:(NSString *)kCGImagePropertyExifDateTimeOriginal]; 88 | } 89 | 90 | - (NSString *)prettyLatitude { 91 | NSDictionary *gps = [self gps]; 92 | 93 | if(!gps) return @""; 94 | 95 | NSNumber *latitude = [gps valueForKey:@"Latitude"]; 96 | NSString *latitudeRef = [gps valueForKey:@"LatitudeRef"]; 97 | 98 | if(!latitude) return @""; 99 | 100 | return [latitudeRef isEqualToString:@"S"] ? [@"-" stringByAppendingFormat:@"%@", latitude] : [latitude description]; 101 | } 102 | 103 | - (NSString *)prettyLongitude { 104 | NSDictionary *gps = [self gps]; 105 | 106 | if(!gps) return @""; 107 | 108 | NSNumber *longitude = [gps valueForKey:@"Longitude"]; 109 | if(!longitude) return @""; 110 | 111 | NSString *longitudeRef = [gps valueForKey:@"LongitudeRef"]; 112 | 113 | return [longitudeRef isEqualToString:@"W"] ? [@"-" stringByAppendingFormat:@"%@", longitude] : [longitude description]; 114 | } 115 | 116 | // FIXME: not thread safe, source might be read while export and released too early while displaying map, @synchronized seems to kill performance though 117 | - (BOOL)loadSource { 118 | NSObject *appDelegate = [NSApp delegate]; 119 | BOOL isMap = [[appDelegate valueForKey:@"isMap"] boolValue]; 120 | BOOL isExporting = [[appDelegate valueForKey:@"isExporting"] boolValue]; 121 | BOOL multipleImagesSelected = [[appDelegate valueForKeyPath:@"imagesController.multipleImagesSelected"] boolValue]; 122 | BOOL readOnMultiSelect = [[NSUserDefaults standardUserDefaults] boolForKey:kMultipleSelectionAllowsEdition]; 123 | 124 | if(!readOnMultiSelect && multipleImagesSelected && !isMap && !isExporting) { 125 | return NO; 126 | } 127 | 128 | if([self source] == NULL) return NO; 129 | 130 | // fill caches 131 | CFDictionaryRef metadataRef = CGImageSourceCopyPropertiesAtIndex(source,0,NULL); 132 | if(metadataRef) { 133 | NSDictionary *immutableMetadata = (__bridge NSDictionary *)metadataRef; 134 | metadata = [immutableMetadata mutableCopy]; 135 | CFRelease(metadataRef); 136 | } 137 | 138 | NSString *UTI = (NSString *)CGImageSourceGetType(source); 139 | 140 | // CFRelease(source); 141 | // source = nil; 142 | 143 | [self willChangeValueForKey:@"isJpeg"]; 144 | isJpeg = [UTI isEqualToString:@"public.jpeg"]; 145 | [self didChangeValueForKey:@"isJpeg"]; 146 | 147 | return YES; 148 | } 149 | 150 | - (void)rotateLeft { 151 | userRotation -= 90; 152 | } 153 | 154 | - (void)rotateRight { 155 | userRotation += 90; 156 | } 157 | 158 | //// http://www.impulseadventure.com/photo/exif-orientation.html 159 | //- (int)orientationDegrees { 160 | // NSNumber *n = [[self metadata] valueForKey:@"Orientation"]; 161 | // NSLog(@"-- n: %@", n); 162 | // 163 | // NSUInteger i = [n unsignedIntValue]; 164 | // NSLog(@"------ %d", i); 165 | // 166 | // if(i == 1) return 0 + userRotation; 167 | // if(i == 8) return 90 + userRotation; 168 | // if(i == 3) return 180 + userRotation; 169 | // if(i == 6) return 270 + userRotation; 170 | // 171 | // return userRotation; 172 | //} 173 | 174 | - (NSString *)fileName { 175 | return [path lastPathComponent]; 176 | } 177 | 178 | - (void)setFileName:(NSString *)s { 179 | NSString *newPath = [[path stringByDeletingLastPathComponent] stringByAppendingPathComponent:s]; 180 | 181 | if([[NSFileManager defaultManager] fileExistsAtPath:newPath]) return; // necessary? 182 | 183 | NSError *error = nil; 184 | if([[NSFileManager defaultManager] moveItemAtPath:path toPath:newPath error:&error]) { 185 | [self setValue:newPath forKey:@"path"]; 186 | } else { 187 | NSLog(@"-- cannot move:%@ to:%@, error: %@", path, newPath, error); 188 | } 189 | } 190 | 191 | - (NSString *)latitude { 192 | return [[self gps] valueForKey:(NSString *)kCGImagePropertyGPSLatitude]; 193 | } 194 | 195 | - (NSString *)longitude { 196 | return [[self gps] valueForKey:(NSString *)kCGImagePropertyGPSLongitude]; 197 | } 198 | 199 | - (NSString *)latitudeRef { 200 | return [[self gps] valueForKey:(NSString *)kCGImagePropertyGPSLatitudeRef]; 201 | } 202 | 203 | - (NSString *)longitudeRef { 204 | return [[self gps] valueForKey:(NSString *)kCGImagePropertyGPSLongitudeRef]; 205 | } 206 | 207 | - (NSDictionary *)exif { 208 | return [[self metadata] valueForKey:(NSString *)kCGImagePropertyExifDictionary]; 209 | } 210 | 211 | - (NSDictionary *)iptc { 212 | return [[self metadata] valueForKey:(NSString *)kCGImagePropertyIPTCDictionary]; 213 | } 214 | 215 | - (NSDictionary *)gps { 216 | return [[self metadata] valueForKey:(NSString *)kCGImagePropertyGPSDictionary]; 217 | } 218 | 219 | - (CGImageSourceRef)source { 220 | if(sourceWasRead) return source; 221 | 222 | if(source) return source; 223 | 224 | if(path == nil) return NULL; 225 | 226 | NSURL *url = [NSURL fileURLWithPath:path]; 227 | if(url == nil) return NULL; 228 | 229 | source = CGImageSourceCreateWithURL((CFURLRef)url, NULL); 230 | 231 | if(source) { 232 | sourceWasRead = YES; 233 | return source; 234 | } 235 | 236 | CGImageSourceStatus status = CGImageSourceGetStatus(source); 237 | NSLog(@"Error: could not create image source. Status: %d", status); 238 | return NULL; 239 | } 240 | 241 | - (BOOL)saveSourceWithMetadata { 242 | 243 | if([self source] == NULL) return NO; 244 | 245 | NSData *data = [NSMutableData data]; 246 | CGImageDestinationRef destination = CGImageDestinationCreateWithData((CFMutableDataRef)data, (CFStringRef)@"public.jpeg", 1, NULL); 247 | if(!destination) { 248 | NSLog(@"Error: could not create image destination"); 249 | if(source) { 250 | CFRelease(source); 251 | source = nil; 252 | } 253 | return NO; 254 | } 255 | 256 | CGImageDestinationAddImageFromSource(destination, source, 0, (CFDictionaryRef)metadata); 257 | BOOL success = CGImageDestinationFinalize(destination); // write metadata into the data object 258 | if(!success) { 259 | NSLog(@"Error: could not finalize destination"); 260 | CFRelease(destination); 261 | if(source) { 262 | CFRelease(source); 263 | source = nil; 264 | } 265 | return NO; 266 | } 267 | 268 | 269 | CFRelease(destination); 270 | /* 271 | if(source) { 272 | CFRelease(source); 273 | source = nil; 274 | } 275 | */ 276 | 277 | NSURL *url = [NSURL fileURLWithPath:path]; 278 | NSError *error = nil; 279 | success = [data writeToURL:url options:NSAtomicWrite error:&error]; 280 | 281 | if(error) { 282 | NSLog(@"-- error: can't write data: %@", [error localizedDescription]); 283 | } 284 | 285 | return success; 286 | } 287 | 288 | - (BOOL)isJpeg { 289 | if(!sourceWasRead) [self loadSource]; 290 | return isJpeg; 291 | } 292 | 293 | - (NSString *)jsAddPoint { 294 | NSString *latitude = [self prettyLatitude]; 295 | NSString *longitude = [self prettyLongitude]; 296 | if([latitude length] == 0 || [longitude length] == 0) return nil; 297 | 298 | NSString *filePath = [self path]; 299 | NSString *fileName = [filePath lastPathComponent]; 300 | // NSDictionary *fileAttributes = [[NSFileManager defaultManager] fileAttributesAtPath:filePath traverseLink:YES]; 301 | NSError *error = nil; 302 | NSDictionary *fileAttributes = [[NSFileManager defaultManager] attributesOfItemAtPath:filePath error:&error]; 303 | if(fileAttributes == nil) { 304 | NSLog(@"-- can't get attributesOfItemAtPath:%@ error:%@", filePath, error); 305 | return nil; 306 | } 307 | 308 | NSString *fileModDateString = fileAttributes ? [[fileAttributes valueForKey:NSFileModificationDate] description] : @""; 309 | 310 | return [NSString stringWithFormat:@"addPoint(\"h%lu\", %@, %@, \"%@\", \"%@\", \"%@\", %d);", [self hash], latitude, longitude, fileName, filePath, fileModDateString, 0]; 311 | } 312 | 313 | - (NSString *)jsRemovePoint { 314 | return [NSString stringWithFormat:@"removePoint(\"h%lu\");", [self hash]]; 315 | } 316 | 317 | - (NSString *)jsShowPoint { 318 | return [NSString stringWithFormat:@"showPoint(\"h%lu\");", (unsigned long)[self hash]]; 319 | } 320 | 321 | - (NSString *)jsHidePoint { 322 | return [NSString stringWithFormat:@"hidePoint(\"h%lu\");", [self hash]]; 323 | } 324 | 325 | - (void)setUserComment:(NSString *)comment { 326 | if(![self isJpeg]) return; 327 | 328 | if(!sourceWasRead) [self loadSource]; 329 | 330 | [self willChangeValueForKey:@"userComment"]; 331 | [self willChangeValueForKey:@"exif"]; 332 | NSMutableDictionary *exifData = [[metadata valueForKey:(NSString *)kCGImagePropertyExifDictionary] mutableCopy]; 333 | if(!exifData) { 334 | exifData = [[NSMutableDictionary alloc] init]; 335 | } 336 | [exifData setObject:comment forKey:(NSString *)kCGImagePropertyExifUserComment]; 337 | [metadata setObject:exifData forKey:(NSString *)kCGImagePropertyExifDictionary]; 338 | [self didChangeValueForKey:@"exif"]; 339 | [self didChangeValueForKey:@"userComment"]; 340 | 341 | BOOL success = [self saveSourceWithMetadata]; 342 | if(!success) { 343 | NSLog(@"Error: can't set user comment"); 344 | } 345 | 346 | return; 347 | } 348 | 349 | - (void)setKeywords:(NSArray *)keywords { 350 | if(![self isJpeg]) return; 351 | 352 | if(!sourceWasRead) [self loadSource]; 353 | 354 | [self willChangeValueForKey:@"keywords"]; 355 | NSMutableDictionary *iptcDict = [[self iptc] mutableCopy]; 356 | if(!iptcDict) { 357 | iptcDict = [[NSMutableDictionary alloc] init]; 358 | } 359 | [iptcDict setObject:keywords forKey:(NSString *)kCGImagePropertyIPTCKeywords]; 360 | [metadata setObject:iptcDict forKey:(NSString *)kCGImagePropertyIPTCDictionary]; 361 | [self didChangeValueForKey:@"keywords"]; 362 | 363 | BOOL success = [self saveSourceWithMetadata]; 364 | if(!success) { 365 | NSLog(@"Error: can't set keywords"); 366 | } 367 | } 368 | 369 | - (NSArray *)keywords { 370 | return [[self iptc] valueForKey:(NSString *)kCGImagePropertyIPTCKeywords]; 371 | } 372 | 373 | - (NSString *)userComment { 374 | return [[self exif] valueForKey:(NSString *)kCGImagePropertyExifUserComment]; 375 | } 376 | 377 | - (NSString *)prettyGPS { 378 | NSDictionary *gps = [self gps]; 379 | if(!gps) return nil; 380 | 381 | NSString *latitude = [[gps valueForKey:(NSString *)kCGImagePropertyGPSLatitude] description]; 382 | NSString *longitude = [[gps valueForKey:(NSString *)kCGImagePropertyGPSLongitude] description]; 383 | NSString *latitudeRef = [gps valueForKey:(NSString *)kCGImagePropertyGPSLatitudeRef]; 384 | NSString *longitudeRef = [gps valueForKey:(NSString *)kCGImagePropertyGPSLongitudeRef]; 385 | 386 | if(!latitude || !longitude || !latitudeRef || !longitudeRef) return nil; 387 | 388 | NSString *trimedLatitude = [latitude length] > 8 ? [latitude substringToIndex:8] : latitude; 389 | NSString *trimedLongitude = [longitude length] > 8 ? [longitude substringToIndex:8] : longitude; 390 | 391 | return [NSString stringWithFormat:@"%@ %@, %@ %@", trimedLatitude, latitudeRef, trimedLongitude, longitudeRef]; 392 | } 393 | 394 | - (NSImage *)image { 395 | //int orientationDegrees = [self orientationDegrees]; 396 | return [[[NSImage alloc] initByReferencingFile:path] rotatedWithAngle:0]; 397 | } 398 | 399 | // just to appear to be KVC compliant, useful when droping an image on the imageView 400 | - (void)setImage:(NSImage *)anImage { 401 | //NSLog(@"-- setImage:%@", anImage); 402 | } 403 | 404 | - (NSURL *)googleMapsURL { 405 | NSString *latitude = [self prettyLatitude]; 406 | NSString *longitude = [self prettyLongitude]; 407 | 408 | if([latitude length] == 0 || [longitude length] == 0) return nil; 409 | 410 | NSString *s = [NSString stringWithFormat:@"http://maps.google.com/?q=%@,%@", latitude, longitude]; 411 | return [NSURL URLWithString:s]; 412 | } 413 | 414 | - (NSString *)prettyImageSize { 415 | NSString *x = [[self exif] valueForKey:(NSString *)kCGImagePropertyExifPixelXDimension]; 416 | NSString *y = [[self exif] valueForKey:(NSString *)kCGImagePropertyExifPixelYDimension]; 417 | if(x && y) { 418 | return [NSString stringWithFormat:@"%@x%@", x, y]; 419 | } 420 | return nil; 421 | } 422 | 423 | - (NSString *)prettyFileSize { 424 | return [[NSFileManager defaultManager] prettyFileSize:path]; 425 | } 426 | 427 | - (void)flag { 428 | [self setValue:[NSNumber numberWithBool:YES] forKey:@"isFlagged"]; 429 | } 430 | 431 | - (void)unflag { 432 | [self setValue:[NSNumber numberWithBool:NO] forKey:@"isFlagged"]; 433 | } 434 | 435 | - (void)toggleFlag { 436 | [self setValue:[NSNumber numberWithBool:!isFlagged] forKey:@"isFlagged"]; 437 | } 438 | 439 | - (void)removeFlag { 440 | [self setValue:[NSNumber numberWithBool:NO] forKey:@"isFlagged"]; 441 | } 442 | 443 | - (BOOL)isFlagged { 444 | return isFlagged; 445 | } 446 | 447 | - (NSImage *)flagIcon { 448 | return isFlagged ? [NSImage imageNamed:@"Flagged.png"] : nil; 449 | } 450 | 451 | - (void)copyToDirectory:(NSURL *)destDirectoryURL { 452 | 453 | if([destDirectoryURL isFileURL] == NO) return; 454 | 455 | NSString *destPath = [[destDirectoryURL path] stringByAppendingPathComponent:[path lastPathComponent]]; 456 | NSFileManager *fm = [NSFileManager defaultManager]; 457 | 458 | if ([fm fileExistsAtPath:path]) { 459 | NSError *error = nil; 460 | BOOL success = [fm copyItemAtPath:path toPath:destPath error:&error]; 461 | if(success == NO) { 462 | NSLog(@"-- cannot copyItemAtPath:%@ toPath:%@ error:%@", path, destPath, error); 463 | } 464 | } 465 | } 466 | 467 | - (BOOL)moveToTrash { 468 | 469 | AppDelegate *appDelegate = [[NSApplication sharedApplication] delegate]; 470 | 471 | NSUndoManager *undoManager = [appDelegate undoManager]; 472 | [undoManager registerUndoWithTarget:appDelegate 473 | selector:@selector(moveFromTrashToPath:) 474 | object:path]; 475 | [undoManager setActionName:@"Move To Trash"]; 476 | 477 | NSString *trashPath = [[@"~/.Trash/" stringByExpandingTildeInPath] stringByAppendingPathComponent:[path lastPathComponent]]; 478 | NSError *error = nil; 479 | BOOL success = [[NSFileManager defaultManager] moveItemAtPath:path toPath:trashPath error:&error]; 480 | if(success == NO) { 481 | NSLog(@"-- cannot move:%@ to:%@, error: %@", path, trashPath, error); 482 | } 483 | return success; 484 | } 485 | 486 | - (void)revealInFinder { 487 | [[NSWorkspace sharedWorkspace] selectFile:path inFileViewerRootedAtPath:@""]; 488 | } 489 | 490 | @end 491 | -------------------------------------------------------------------------------- /AppDelegate.m: -------------------------------------------------------------------------------- 1 | #import "AppDelegate.h" 2 | //#import "AppleRemote.h" 3 | #import "NSFileManager+CSS.h" 4 | #import 5 | #import "CSSBorderlessWindow.h" 6 | #import 7 | #import "NSImage+CSS.h" 8 | #import "CSSImageInfo.h" 9 | 10 | static NSString *const kImagesDirectory = @"ImagesDirectory"; 11 | static NSString *const kKMLThumbnailsRemoteURLs = @"KMLThumbnailsRemoteURLs"; 12 | static NSString *const kRemoteKMLThumbnails = @"RemoteKMLThumbnails"; 13 | static NSString *const kSlideShowSpeed = @"SlideShowSpeed"; 14 | static NSString *const kThumbsExportSizeTag = @"ThumbsExportSizeTag"; 15 | static NSString *const kThumbsExportSizeHeight = @"ThumbsExportSizeHeight"; 16 | static NSString *const kThumbsExportSizeWidth = @"ThumbsExportSizeWidth"; 17 | static NSString *const kSlideshowIsFullscreen = @"SlideshowIsFullscreen"; 18 | 19 | @implementation AppDelegate 20 | 21 | - (id)init { 22 | self = [super init]; 23 | 24 | images = [[NSMutableArray alloc] init]; 25 | isFullScreen = NO; 26 | takeFilesFromDefault = YES; 27 | 28 | undoManager = [[NSUndoManager alloc] init]; 29 | [undoManager setLevelsOfUndo:100]; 30 | 31 | return self; 32 | } 33 | 34 | - (ImagesController *)imagesController { 35 | return imagesController; 36 | } 37 | 38 | - (void)playSuccessSound { 39 | NSString *soundPath = @"/System/Library/Sounds/Hero.aiff"; 40 | if([[NSFileManager defaultManager] fileExistsAtPath:soundPath]) { 41 | NSSound *sound = [[NSSound alloc] initWithContentsOfFile:soundPath byReference:YES]; 42 | [sound play]; 43 | } 44 | } 45 | 46 | - (NSUndoManager *)undoManager { 47 | return undoManager; 48 | } 49 | 50 | - (BOOL)isMap { 51 | return [tabView selectedTabViewItem] == mapTabViewItem; 52 | } 53 | 54 | - (void)setupImagesControllerWithDir:(NSString *)dir recursive:(BOOL)isRecursive { 55 | [images removeAllObjects]; 56 | 57 | NSArray *dirContent = [[NSFileManager defaultManager] directoryContentFullPaths:dir recursive:isRecursive]; 58 | 59 | dirContent = [dirContent sortedArrayUsingSelector:@selector(numericCompare:)]; 60 | 61 | [imagesController addFiles:dirContent]; 62 | if([dirContent count] > 0) [imagesController setSelectionIndex:0]; 63 | } 64 | 65 | - (void)setupToolbar { 66 | toolbar = [[NSToolbar alloc] initWithIdentifier:@"mainToolbar"]; 67 | [toolbar setDelegate:self]; 68 | [toolbar setAllowsUserCustomization:YES]; 69 | [toolbar setAutosavesConfiguration:YES]; 70 | [mainWindow setToolbar:toolbar]; 71 | } 72 | 73 | - (void)awakeFromNib { 74 | 75 | // remoteControl = [[AppleRemote alloc] initWithDelegate: self]; 76 | 77 | [mainWindow registerForDraggedTypes:[NSArray arrayWithObjects: NSFilenamesPboardType, nil]]; 78 | 79 | [self setupToolbar]; 80 | 81 | [[userCommentTextField cell] setSendsActionOnEndEditing:YES]; 82 | [[keywordsTokenField cell] setSendsActionOnEndEditing:YES]; 83 | 84 | [imagesController setAutomaticallyPreparesContent:YES]; 85 | 86 | NSTableColumn *flagColumn = [tableView tableColumnWithIdentifier:@"flag"]; 87 | NSImage *flagHeaderImage = [NSImage imageNamed:@"FlaggedHeader.png"]; 88 | NSImageCell *flagHeaderImageCell = (NSImageCell *)[flagColumn headerCell]; 89 | [flagHeaderImageCell setImage:flagHeaderImage]; 90 | [flagColumn setHeaderCell:(id)flagHeaderImageCell]; 91 | 92 | [tableView setDraggingSourceOperationMask:NSDragOperationCopy forLocal:NO]; 93 | [tableView setDraggingSourceOperationMask:NSDragOperationNone forLocal:YES]; 94 | 95 | [mainWindow setDelegate:self]; 96 | 97 | [progressIndicator setHidden:YES]; 98 | 99 | NSDictionary *defaults = [NSDictionary dictionaryWithObjectsAndKeys: 100 | [NSNumber numberWithInt:1], @"SlideShowSpeed", 101 | [NSNumber numberWithBool:YES], @"SlideshowIsFullscreen", nil]; 102 | [[NSUserDefaults standardUserDefaults] registerDefaults:defaults]; 103 | 104 | [panelImageView setImageScaling:NSImageScaleProportionallyUpOrDown]; 105 | 106 | [imagesController addObserver:self forKeyPath:@"arrangedObjects.isFlagged" options:NSKeyValueChangeSetting context:NULL]; 107 | } 108 | 109 | - (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context { 110 | 111 | if(object == imagesController && [keyPath isEqualToString:@"arrangedObjects.isFlagged"]) { 112 | NSUInteger objectsCount = [[imagesController arrangedObjects] count]; 113 | NSUInteger flaggedCount = [[imagesController flaggedIndexes] count]; 114 | 115 | // TODO: localize 116 | NSString *title = [NSString stringWithFormat:@"%lu images (%lu flags)", objectsCount, flaggedCount]; 117 | 118 | [[[tableView tableColumnWithIdentifier:@"name"] headerCell] setTitle:title]; 119 | [tableView reloadData]; 120 | } 121 | } 122 | 123 | - (NSURL *)chooseDirectoryURL { 124 | NSOpenPanel *oPanel = [NSOpenPanel openPanel]; 125 | [oPanel setAllowsMultipleSelection:NO]; 126 | [oPanel setCanChooseFiles:NO]; 127 | [oPanel setCanChooseDirectories:YES]; 128 | 129 | int result = [oPanel runModal]; 130 | 131 | NSURL *dirURL = nil; 132 | 133 | if (result == NSOKButton) { 134 | dirURL = [[oPanel URLs] lastObject]; 135 | } 136 | 137 | return dirURL; 138 | } 139 | 140 | - (IBAction)open:(id)sender { 141 | NSURL *dirURL = [self chooseDirectoryURL]; 142 | if([dirURL isFileURL]) { 143 | [self setupImagesControllerWithDir:[dirURL path] recursive:YES]; 144 | } 145 | } 146 | 147 | - (IBAction)setDirectory:(id)sender { 148 | NSURL *dirURL = [self chooseDirectoryURL]; 149 | if([dirURL isFileURL]) { 150 | [self setupImagesControllerWithDir:[dirURL path] recursive:YES]; 151 | [[NSUserDefaults standardUserDefaults] setValue:[dirURL path] forKey:kImagesDirectory]; 152 | } 153 | } 154 | 155 | - (IBAction)addDirectory:(id)sender { 156 | NSURL *dirURL = [self chooseDirectoryURL]; 157 | if([dirURL isFileURL]) { 158 | [imagesController addDirFiles:[dirURL path]]; 159 | } 160 | } 161 | 162 | - (IBAction)exportToDirectory:(id)sender { 163 | NSURL *exportDirectoryURL = [self chooseDirectoryURL]; 164 | if(!exportDirectoryURL) { 165 | return; 166 | } 167 | 168 | [[imagesController selectedObjects] makeObjectsPerformSelector:@selector(copyToDirectory:) withObject:exportDirectoryURL]; 169 | [self playSuccessSound]; 170 | } 171 | 172 | - (BOOL)isFullScreen { 173 | return isFullScreen; 174 | } 175 | 176 | - (void)rotate:(NSImageView *)iv clockwise:(BOOL)cw { 177 | [iv setImage:[[iv image] rotatedWithAngle: cw ? -90 : 90]]; 178 | 179 | SEL selector = cw ? @selector(rotateLeft) : @selector(rotateRight); 180 | [[imagesController selectedObjects] makeObjectsPerformSelector:selector]; 181 | } 182 | 183 | - (IBAction)rotateLeft:(id)sender { 184 | NSImageView *iv = isFullScreen ? panelImageView : imageView; 185 | [self rotate:iv clockwise:NO]; 186 | } 187 | 188 | - (IBAction)rotateRight:(id)sender { 189 | NSImageView *iv = isFullScreen ? panelImageView : imageView; 190 | [self rotate:iv clockwise:YES]; 191 | } 192 | 193 | - (IBAction)fullScreenMode:(id)sender { 194 | 195 | if(isFullScreen) return; 196 | 197 | [NSCursor setHiddenUntilMouseMoves:YES]; 198 | 199 | SetSystemUIMode(kUIModeAllHidden, kUIOptionAutoShowMenuBar); 200 | 201 | NSScreen *screen = [mainWindow screen]; 202 | 203 | [slideShowPanel setContentSize:[screen frame].size]; 204 | [slideShowPanel setFrame:[screen frame] display:YES]; 205 | 206 | [self setValue:[NSNumber numberWithBool:YES] forKey:@"isFullScreen"]; 207 | } 208 | 209 | - (IBAction)undo:(id)sender { 210 | [undoManager undo]; 211 | } 212 | 213 | - (IBAction)redo:(id)sender { 214 | [undoManager redo]; 215 | } 216 | 217 | - (void)invalidateTimer { 218 | if([timer isValid]) { 219 | [timer invalidate]; 220 | timer = nil; 221 | } 222 | } 223 | 224 | - (IBAction)exitFullScreen:(id)sender { 225 | 226 | if(!isFullScreen) return; 227 | 228 | SetSystemUIMode(kUIModeNormal, 0); 229 | 230 | [self invalidateTimer]; 231 | 232 | [NSCursor unhide]; 233 | 234 | [slideShowPanel orderOut:self]; 235 | 236 | [self setValue:[NSNumber numberWithBool:NO] forKey:@"isFullScreen"]; 237 | } 238 | 239 | - (IBAction)toggleFullScreen:(id)sender { 240 | if(isFullScreen) { 241 | [self exitFullScreen:nil]; 242 | } else { 243 | [self fullScreenMode:nil]; 244 | } 245 | } 246 | 247 | - (void)timerNextTick { 248 | 249 | BOOL slideshowStopsAtTheEnd = [[NSUserDefaults standardUserDefaults] boolForKey:@"SlideshowStopsAtTheEnd"]; 250 | 251 | if(slideshowStopsAtTheEnd) { 252 | if(![imagesController canSelectNext]) { 253 | [self invalidateTimer]; 254 | if(isFullScreen) [self exitFullScreen:nil]; 255 | } 256 | [imagesController selectNextImage]; 257 | } else { 258 | [imagesController selectNextImageOrFirstOne]; 259 | } 260 | } 261 | 262 | - (IBAction)toggleSlideShow:(id)sender { 263 | if([timer isValid]) { 264 | [self invalidateTimer]; 265 | } else { 266 | timer = [NSTimer scheduledTimerWithTimeInterval:[[[NSUserDefaults standardUserDefaults] valueForKey:kSlideShowSpeed] floatValue] 267 | target:self 268 | selector:@selector(timerNextTick) 269 | userInfo:NULL 270 | repeats:YES]; 271 | } 272 | } 273 | 274 | - (IBAction)startSlideShow:(id)sender { 275 | if([[NSUserDefaults standardUserDefaults] boolForKey:kSlideshowIsFullscreen]) { 276 | [self fullScreenMode:self]; 277 | } 278 | [self toggleSlideShow:self]; 279 | } 280 | 281 | - (void)applicationWillTerminate:(NSNotification *)notification { 282 | [self exitFullScreen:self]; 283 | } 284 | 285 | - (void)hideMap { 286 | [tabView selectTabViewItem:imageTabViewItem]; 287 | [imagesController removeObserver:mapController forKeyPath:@"selectedObjects"]; 288 | [imagesController removeObserver:mapController forKeyPath:@"arrangedObjects"]; 289 | [mapController clearMap]; 290 | } 291 | 292 | - (void)showMap { 293 | [tabView selectTabViewItem:mapTabViewItem]; 294 | [imagesController addObserver:mapController forKeyPath:@"selectedObjects" options:(NSKeyValueObservingOptionOld|NSKeyValueObservingOptionNew) context:NULL]; 295 | [imagesController addObserver:mapController forKeyPath:@"arrangedObjects" options:(NSKeyValueObservingOptionOld|NSKeyValueObservingOptionNew) context:NULL]; 296 | [mapController evaluateNewJavaScriptOnArrangedObjectsChange]; 297 | } 298 | 299 | - (IBAction)toggleMap:(id)sender { 300 | if([tabView selectedTabViewItem] == mapTabViewItem) { 301 | [self hideMap]; 302 | } else { 303 | [self showMap]; 304 | } 305 | } 306 | 307 | // called to undo move to trash 308 | - (BOOL)moveFromTrashToPath:(NSString *)originalPath { 309 | 310 | NSString *trashPath = [[@"~/.Trash/" stringByExpandingTildeInPath] stringByAppendingPathComponent:[originalPath lastPathComponent]]; 311 | NSError *error = nil; 312 | BOOL success = [[NSFileManager defaultManager] moveItemAtPath:trashPath toPath:originalPath error:&error]; 313 | if(success == NO) { 314 | NSLog(@"-- cannot move:%@ to:%@, error: %@", trashPath, originalPath, error); 315 | } 316 | 317 | CSSImageInfo *imageInfo = [CSSImageInfo containerWithPath:originalPath]; 318 | if(imageInfo) { 319 | [imagesController addObject:imageInfo]; 320 | } 321 | 322 | return success; 323 | } 324 | 325 | #pragma mark NSApplication Delegates 326 | 327 | //- (void)applicationWillBecomeActive:(NSNotification *)aNotification { 328 | // [remoteControl startListening: self]; 329 | //} 330 | // 331 | //- (void)applicationWillResignActive:(NSNotification *)aNotification { 332 | // [remoteControl stopListening: self]; 333 | //} 334 | 335 | - (void)applicationDidFinishLaunching:(NSNotification *)aNotification { 336 | if(takeFilesFromDefault) { 337 | NSString *defaultDir = [NSString pathWithComponents:[NSArray arrayWithObjects:NSHomeDirectory(), @"Pictures", nil]]; 338 | NSString *defaultValue = [[NSUserDefaults standardUserDefaults] valueForKey:kImagesDirectory]; 339 | if(defaultValue) { 340 | defaultDir = defaultValue; 341 | } 342 | [self setupImagesControllerWithDir:defaultDir recursive:NO]; 343 | } 344 | 345 | NSDictionary *defaults = [NSDictionary dictionaryWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"UserDefaults" ofType:@"plist"]]; 346 | [[NSUserDefaults standardUserDefaults] registerDefaults:defaults]; 347 | 348 | [[SUUpdater sharedUpdater] checkForUpdatesInBackground]; 349 | } 350 | 351 | - (void)application:(NSApplication *)sender openFiles:(NSArray *)filenames { 352 | if([filenames count] > 0) { 353 | int numberOfImagesBefore = [[imagesController arrangedObjects] count]; 354 | [imagesController addFiles:filenames]; 355 | int numberOfImagesAfter = [[imagesController arrangedObjects] count]; 356 | if(numberOfImagesAfter > numberOfImagesBefore) { 357 | [imagesController setSelectionIndex:numberOfImagesBefore]; 358 | } 359 | takeFilesFromDefault = NO; 360 | } 361 | } 362 | 363 | #pragma mark NSWindow delegates 364 | 365 | - (void)windowWillClose:(NSNotification *)aNotification { 366 | [NSApp terminate:self]; 367 | } 368 | 369 | #pragma mark NSDraggingSource 370 | 371 | - (BOOL)tableView:(NSTableView *)aTableView writeRowsWithIndexes:(NSIndexSet *)rowIndexes toPasteboard:(NSPasteboard *)pboard { 372 | NSArray *files = [[[imagesController arrangedObjects] objectsAtIndexes:rowIndexes] valueForKey:@"path"]; 373 | [pboard declareTypes:[NSArray arrayWithObject:NSFilenamesPboardType] owner:self]; 374 | [pboard setPropertyList:files forType:NSFilenamesPboardType]; 375 | return YES; 376 | } 377 | 378 | #pragma mark NSDraggingDestination 379 | 380 | - (NSDragOperation)draggingEntered:(id )sender { 381 | //NSLog(@"%s", __FUNCTION__); 382 | return NSDragOperationLink; 383 | } 384 | 385 | - (BOOL)prepareForDragOperation:(id )sender { 386 | //NSLog(@"%s", __FUNCTION__); 387 | return YES; 388 | } 389 | 390 | - (BOOL)performDragOperation:(id )sender { 391 | //NSLog(@"%s", __FUNCTION__); 392 | NSPasteboard *pboard; 393 | NSDragOperation sourceDragMask; 394 | 395 | sourceDragMask = [sender draggingSourceOperationMask]; 396 | pboard = [sender draggingPasteboard]; 397 | 398 | if ([[pboard types] containsObject:NSFilenamesPboardType]) { 399 | NSArray *files = [pboard propertyListForType:NSFilenamesPboardType]; 400 | 401 | int numberOfImagesBefore = [[imagesController arrangedObjects] count]; 402 | 403 | //NSLog(@"CocoaSlidesShow.m | performDragOperation | add files: %@", files); 404 | [imagesController addFiles:files]; 405 | 406 | int numberOfImagesAfter = [[imagesController arrangedObjects] count]; 407 | if(numberOfImagesAfter > numberOfImagesBefore) { 408 | [imagesController setSelectionIndex:numberOfImagesBefore]; 409 | } 410 | } 411 | return YES; 412 | } 413 | 414 | - (IBAction)revealInFinder:(id)sender { 415 | [[imagesController selectedObjects] makeObjectsPerformSelector:@selector(revealInFinder)]; 416 | } 417 | 418 | - (BOOL)control:(NSControl *)control textShouldBeginEditing:(NSText *)fieldEditor { 419 | isSaving = YES; 420 | return YES; 421 | } 422 | 423 | - (void)controlTextDidEndEditing:(NSNotification *)aNotification { 424 | isSaving = NO; 425 | } 426 | 427 | #pragma mark NSTableView delegate 428 | 429 | - (void)tableViewSelectionDidChange:(NSNotification *)aNotification { 430 | if([tabView selectedTabViewItem] == mapTabViewItem && [[imagesController selectedObjects] count] == 0) { 431 | [self hideMap]; 432 | } 433 | } 434 | 435 | - (void)prepareProgressIndicator:(unsigned int)count { 436 | [progressIndicator setHidden:NO]; 437 | [progressIndicator setMinValue:(double)0.0]; 438 | [progressIndicator setMaxValue:(double)count]; 439 | [progressIndicator setDoubleValue:0.0]; 440 | } 441 | 442 | - (void)exportFinished { 443 | [self playSuccessSound]; 444 | 445 | [progressIndicator setDoubleValue:1.0]; 446 | [progressIndicator setHidden:YES]; 447 | [progressIndicator setDoubleValue:0.0]; 448 | 449 | [self setValue:[NSNumber numberWithBool:NO] forKey:@"isExporting"]; 450 | } 451 | 452 | #pragma mark KML export 453 | 454 | - (void)incrementExportProgress { 455 | double newValue = [progressIndicator doubleValue] + 1; 456 | [progressIndicator setDoubleValue:newValue]; 457 | } 458 | 459 | #pragma KML File Export 460 | 461 | - (NSURL *)chooseKMLExportDirectoryURL { 462 | NSSavePanel *sPanel = [NSSavePanel savePanel]; 463 | 464 | [sPanel setAccessoryView:kmlSavePanelAccessoryView]; 465 | [sPanel setCanCreateDirectories:YES]; 466 | 467 | NSString *desktopPath = [NSSearchPathForDirectoriesInDomains(NSDesktopDirectory, NSUserDomainMask, YES) objectAtIndex:0]; 468 | 469 | [sPanel setNameFieldStringValue:@"KMLExport"]; 470 | [sPanel setDirectoryURL:[NSURL URLWithString:desktopPath]]; 471 | 472 | int runResult = [sPanel runModal]; 473 | 474 | return (runResult == NSOKButton) ? [sPanel URL] : nil; 475 | } 476 | 477 | - (IBAction)exportKMLToFile:(id)sender { 478 | if(isExporting) return; 479 | 480 | [self setValue:[NSNumber numberWithBool:YES] forKey:@"isExporting"]; 481 | 482 | NSURL *dirURL = [self chooseKMLExportDirectoryURL]; 483 | 484 | if([dirURL isFileURL] == NO) return; 485 | 486 | if(!dirURL) return; 487 | 488 | NSString *dirPath = [dirURL path]; 489 | 490 | BOOL addThumbnails = [[NSUserDefaults standardUserDefaults] boolForKey:@"IncludeThumbsInKMLExport"]; 491 | 492 | NSError *error = nil; 493 | BOOL success = [[NSFileManager defaultManager] createDirectoryAtPath:dirPath withIntermediateDirectories:YES attributes:nil error:&error]; 494 | if(!success) { 495 | NSLog(@"Error: can't create dir at path %@, error:%@", dirPath, error); 496 | //return; 497 | } 498 | 499 | NSString *kmlFilePath = [dirPath stringByAppendingPathComponent:@"CocoaSlideShow.kml"]; 500 | 501 | NSString *thumbsDir = nil; 502 | 503 | if(addThumbnails) { 504 | thumbsDir = [dirPath stringByAppendingPathComponent:@"images"]; 505 | 506 | error = nil; 507 | success = [[NSFileManager defaultManager] createDirectoryAtPath:thumbsDir withIntermediateDirectories:YES attributes:nil error:&error]; 508 | if(!success) { 509 | NSLog(@"Error: can't create dir at path %@, error:%@", dirPath, error); 510 | //return; 511 | } 512 | } 513 | 514 | NSArray *kmlImages = [[imagesController selectedObjects] copy]; 515 | 516 | if(addThumbnails) { 517 | [self prepareProgressIndicator:[kmlImages count]]; 518 | } 519 | 520 | if(addThumbnails) thumbsDir = [[kmlFilePath stringByDeletingLastPathComponent] stringByAppendingPathComponent:@"images"]; 521 | 522 | NSString *XMLContainer = @" \n\n%@\n\n"; 523 | 524 | BOOL useRemoteBaseURL = [[NSUserDefaults standardUserDefaults] boolForKey:kRemoteKMLThumbnails]; 525 | NSString *baseURL = @"images/"; 526 | if(useRemoteBaseURL) { 527 | baseURL = [[NSUserDefaults standardUserDefaults] valueForKey:kKMLThumbnailsRemoteURLs]; 528 | if(![baseURL hasSuffix:@"/"]) { 529 | baseURL = [baseURL stringByAppendingString:@"/"]; 530 | } 531 | } 532 | 533 | NSMutableArray *placemarkStrings = [NSMutableArray array]; 534 | 535 | NSOperationQueue *exportQueue = [[NSOperationQueue alloc] init]; 536 | 537 | NSBlockOperation *exportOperationBlock = [[NSBlockOperation alloc] init]; 538 | 539 | for(CSSImageInfo *cssImageInfo in kmlImages) { 540 | 541 | [exportOperationBlock addExecutionBlock:^{ 542 | 543 | NSString *latitude = [cssImageInfo prettyLatitude]; 544 | NSString *longitude = [cssImageInfo prettyLongitude]; 545 | NSString *timestamp = [cssImageInfo exifDateTime]; 546 | 547 | NSString *imageName = [[[cssImageInfo path] lastPathComponent] lowercaseString]; 548 | 549 | if([latitude length] == 0 || [longitude length] == 0) { 550 | return; 551 | } 552 | 553 | NSMutableString *placemarkString = [NSMutableString stringWithFormat:@" %@%@%@,%@", imageName, timestamp, longitude, latitude]; 554 | 555 | if(addThumbnails) { 556 | 557 | [self incrementExportProgress]; 558 | 559 | NSString *thumbPath = [[thumbsDir stringByAppendingPathComponent:[[cssImageInfo path] lastPathComponent]] lowercaseString]; 560 | 561 | float w1, h1, w2, h2; 562 | 563 | if ([[cssImageInfo image] size].height > [[cssImageInfo image] size].width) { 564 | w1 = 106.0; 565 | h1 = 160.0; 566 | w2 = 360.0; 567 | h2 = 510.0; 568 | } else { 569 | w1 = 160.0; 570 | h1 = 106.0; 571 | w2 = 510.0; 572 | h2 = 360.0; 573 | } 574 | 575 | NSSize size = NSZeroSize; 576 | BOOL success = useRemoteBaseURL ? [NSImage scaleAndSaveJPEGThumbnailFromFile:[cssImageInfo path] toPath:thumbPath boundingBox:NSMakeSize(w1, h1) rotation:0 size:&size] : 577 | [NSImage scaleAndSaveJPEGThumbnailFromFile:[cssImageInfo path] toPath:thumbPath boundingBox:NSMakeSize(w2, h2) rotation:0 size:&size]; 578 | 579 | if(success == NO) { 580 | NSLog(@"Could not scale and save as jpeg into %@", thumbPath); 581 | } 582 | 583 | NSString *imageName = [[[cssImageInfo path] lastPathComponent] lowercaseString]; 584 | 585 | [placemarkString appendFormat:@"<img src=\"%@%@\" height=\"%.0f\" width=\"%.0f\" /> ", baseURL, imageName, (float)size.height, (float)size.width]; 586 | } 587 | 588 | [placemarkString appendString:@"\n"]; 589 | 590 | [[NSOperationQueue mainQueue] addOperationWithBlock:^{ 591 | 592 | [placemarkStrings addObject:placemarkString]; 593 | }]; 594 | }]; 595 | 596 | [exportOperationBlock setCompletionBlock:^{ 597 | [[NSOperationQueue mainQueue] addOperationWithBlock:^{ 598 | 599 | NSString *placemarkString = [placemarkStrings componentsJoinedByString:@""]; 600 | 601 | NSString *kml = [NSString stringWithFormat:XMLContainer, placemarkString]; 602 | 603 | NSError *anError = nil; 604 | [kml writeToFile:kmlFilePath atomically:YES encoding:NSUTF8StringEncoding error:&anError]; 605 | 606 | if(anError) [[NSAlert alertWithError:anError] runModal]; 607 | 608 | [self exportFinished]; 609 | }]; 610 | }]; 611 | } 612 | 613 | [exportQueue addOperation:exportOperationBlock]; 614 | } 615 | 616 | #pragma mark thumbnails export 617 | 618 | - (NSURL *)chooseThumbsExportDirectoryURL { 619 | 620 | NSSavePanel *sPanel = [NSSavePanel savePanel]; 621 | 622 | [sPanel setAccessoryView:thumbnailsExportAccessoryView]; 623 | [sPanel setCanCreateDirectories:YES]; 624 | 625 | NSString *desktopPath = [NSSearchPathForDirectoriesInDomains(NSDesktopDirectory, NSUserDomainMask, YES) objectAtIndex:0]; 626 | NSURL *desktopURL = [NSURL fileURLWithPath:desktopPath]; 627 | 628 | [sPanel setDirectoryURL:desktopURL]; 629 | [sPanel setNameFieldStringValue:@"ResizedImages"]; 630 | 631 | int runResult = [sPanel runModal]; 632 | 633 | return (runResult == NSOKButton) ? [sPanel URL] : nil; 634 | } 635 | 636 | - (IBAction)resizeJPEGs:(id)sender { 637 | if(isExporting) return; 638 | 639 | NSURL *exportDirURL = [self chooseThumbsExportDirectoryURL]; 640 | if(!exportDirURL) return; 641 | 642 | if([exportDirURL isFileURL] == NO) return; 643 | 644 | NSString *exportDir = [exportDirURL path]; 645 | 646 | NSError *error = nil; 647 | BOOL success = [[NSFileManager defaultManager] createDirectoryAtPath:exportDir withIntermediateDirectories:YES attributes:nil error:&error]; 648 | if(!success) { 649 | NSLog(@"Error: can't create dir at path %@, error: %@", exportDir, error); 650 | // if(error) { 651 | // [mainWindow presentError:error 652 | // modalForWindow:mainWindow 653 | // delegate:self 654 | // didPresentSelector:nil 655 | // contextInfo:nil]; 656 | // } 657 | } 658 | 659 | [self setValue:[NSNumber numberWithBool:YES] forKey:@"isExporting"]; 660 | 661 | NSArray *theImages = [[imagesController selectedObjects] copy]; 662 | 663 | [self prepareProgressIndicator:[theImages count]]; 664 | 665 | int tag = [[NSUserDefaults standardUserDefaults] integerForKey:kThumbsExportSizeTag]; 666 | 667 | int w = 0; 668 | int h = 0; 669 | 670 | if(tag == 0) { 671 | w = 300; h = 255; 672 | } else if (tag == 1) { 673 | w = 640; h = 480; 674 | } else if (tag == 2) { 675 | w = 800; h = 600; 676 | } else if (tag == 3) { 677 | w = [[[NSUserDefaults standardUserDefaults] stringForKey:kThumbsExportSizeWidth] intValue]; 678 | h = [[[NSUserDefaults standardUserDefaults] stringForKey:kThumbsExportSizeHeight] intValue]; 679 | } 680 | 681 | NSOperationQueue *resizeQueue = [[NSOperationQueue alloc] init]; 682 | 683 | NSBlockOperation *resizeBlockOperation = [[NSBlockOperation alloc] init]; 684 | 685 | for(CSSImageInfo *imageInfo in theImages) { 686 | [[NSOperationQueue mainQueue] addOperationWithBlock:^{ 687 | [self incrementExportProgress]; 688 | }]; 689 | 690 | if([imageInfo isJpeg] == NO) continue; 691 | 692 | [resizeBlockOperation addExecutionBlock:^{ 693 | NSString *destPath = [[exportDir stringByAppendingPathComponent:[[imageInfo path] lastPathComponent]] lowercaseString]; 694 | BOOL success = [[imageInfo image] scaleAndSaveAsJPEGWithMaxWidth:w maxHeight:h quality:0.9 destination:destPath]; 695 | if(!success) NSLog(@"Could not scale and save as jpeg into %@", destPath); 696 | }]; 697 | } 698 | 699 | [resizeBlockOperation setCompletionBlock:^{ 700 | [[NSOperationQueue mainQueue] addOperationWithBlock:^{ 701 | [self exportFinished]; 702 | }]; 703 | }]; 704 | 705 | [resizeQueue addOperation:resizeBlockOperation]; 706 | } 707 | 708 | @end 709 | -------------------------------------------------------------------------------- /CocoaSlideShow.xcodeproj/project.pbxproj: -------------------------------------------------------------------------------- 1 | // !$*UTF8*$! 2 | { 3 | archiveVersion = 1; 4 | classes = { 5 | }; 6 | objectVersion = 42; 7 | objects = { 8 | 9 | /* Begin PBXBuildFile section */ 10 | 030461610C75158100D70803 /* NSFileManager+CSS.m in Sources */ = {isa = PBXBuildFile; fileRef = 030461600C75158100D70803 /* NSFileManager+CSS.m */; }; 11 | 030463F10C75347700D70803 /* Credits.html in Resources */ = {isa = PBXBuildFile; fileRef = 030463F00C75347700D70803 /* Credits.html */; }; 12 | 033804240C86084300439E5A /* ImagesController.m in Sources */ = {isa = PBXBuildFile; fileRef = 033804230C86084300439E5A /* ImagesController.m */; }; 13 | 033F91E31012ACF8004AEBA0 /* NSImage+CSS.m in Sources */ = {isa = PBXBuildFile; fileRef = 033F91E21012ACF8004AEBA0 /* NSImage+CSS.m */; }; 14 | 03458E5A0C81CA5300385D93 /* NSString+CSS.m in Sources */ = {isa = PBXBuildFile; fileRef = 03458E590C81CA5300385D93 /* NSString+CSS.m */; }; 15 | 034CA91D0DEB72CD00460991 /* Flagged.png in Resources */ = {isa = PBXBuildFile; fileRef = 034CA91B0DEB72CD00460991 /* Flagged.png */; }; 16 | 034CA91E0DEB72CD00460991 /* FlaggedHeader.png in Resources */ = {isa = PBXBuildFile; fileRef = 034CA91C0DEB72CD00460991 /* FlaggedHeader.png */; }; 17 | 034FC8780EBFB09C00BE42CA /* gmap.png in Resources */ = {isa = PBXBuildFile; fileRef = 034FC8770EBFB09C00BE42CA /* gmap.png */; }; 18 | 03677B9E0E3A45C600524B59 /* right.png in Resources */ = {isa = PBXBuildFile; fileRef = 03677B950E3A45C500524B59 /* right.png */; }; 19 | 03677B9F0E3A45C600524B59 /* slideshow.png in Resources */ = {isa = PBXBuildFile; fileRef = 03677B960E3A45C500524B59 /* slideshow.png */; }; 20 | 03677BA00E3A45C600524B59 /* trash.png in Resources */ = {isa = PBXBuildFile; fileRef = 03677B970E3A45C500524B59 /* trash.png */; }; 21 | 03677BA10E3A45C600524B59 /* remove.png in Resources */ = {isa = PBXBuildFile; fileRef = 03677B980E3A45C500524B59 /* remove.png */; }; 22 | 03677BA20E3A45C600524B59 /* fullscreen.png in Resources */ = {isa = PBXBuildFile; fileRef = 03677B990E3A45C500524B59 /* fullscreen.png */; }; 23 | 03677BA30E3A45C600524B59 /* left.png in Resources */ = {isa = PBXBuildFile; fileRef = 03677B9A0E3A45C500524B59 /* left.png */; }; 24 | 03677BA40E3A45C600524B59 /* flag.png in Resources */ = {isa = PBXBuildFile; fileRef = 03677B9B0E3A45C500524B59 /* flag.png */; }; 25 | 03677BA50E3A45C600524B59 /* folder.png in Resources */ = {isa = PBXBuildFile; fileRef = 03677B9C0E3A45C500524B59 /* folder.png */; }; 26 | 03677BA60E3A45C600524B59 /* add.png in Resources */ = {isa = PBXBuildFile; fileRef = 03677B9D0E3A45C600524B59 /* add.png */; }; 27 | 0367A7FA0C56CA6600BD57E8 /* IOKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 0367A7F90C56CA6600BD57E8 /* IOKit.framework */; }; 28 | 036D5C2F0C7269D0004A8236 /* Carbon.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 036D5C2E0C7269D0004A8236 /* Carbon.framework */; }; 29 | 037D95D40DCDD8BB00E8DEB7 /* MainMenu.xib in Resources */ = {isa = PBXBuildFile; fileRef = 037D95D20DCDD8BB00E8DEB7 /* MainMenu.xib */; }; 30 | 037D96190DCDDDCF00E8DEB7 /* AppDelegate+Toolbar.m in Sources */ = {isa = PBXBuildFile; fileRef = 037D96180DCDDDCF00E8DEB7 /* AppDelegate+Toolbar.m */; }; 31 | 037F66C21008E7FD0071E2A9 /* UserDefaults.plist in Resources */ = {isa = PBXBuildFile; fileRef = 037F66C11008E7FD0071E2A9 /* UserDefaults.plist */; }; 32 | 037F672D1008EDAE0071E2A9 /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = 037F672C1008EDAE0071E2A9 /* Localizable.strings */; }; 33 | 037F6B27100A34130071E2A9 /* css_dsa_pub.pem in Resources */ = {isa = PBXBuildFile; fileRef = 037F6B26100A34130071E2A9 /* css_dsa_pub.pem */; }; 34 | 039B5A590ECE281600D7C02C /* CSSMapController.m in Sources */ = {isa = PBXBuildFile; fileRef = 039B5A580ECE281600D7C02C /* CSSMapController.m */; }; 35 | 03A122E30EC224F60076DF63 /* CSSImageView.m in Sources */ = {isa = PBXBuildFile; fileRef = 03A122E20EC224F60076DF63 /* CSSImageView.m */; }; 36 | 03A126B10EC2496C0076DF63 /* WebKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 03A126B00EC2496C0076DF63 /* WebKit.framework */; }; 37 | 03A3F4410C77D97E009AD69D /* CSSWindow.m in Sources */ = {isa = PBXBuildFile; fileRef = 03A3F4400C77D97E009AD69D /* CSSWindow.m */; }; 38 | 03A3F55C0C786878009AD69D /* CocoaSlideShow.icns in Resources */ = {isa = PBXBuildFile; fileRef = 03A3F55B0C786878009AD69D /* CocoaSlideShow.icns */; }; 39 | 03B1BB110C5173B40032C03F /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 03B1BB100C5173B40032C03F /* AppDelegate.m */; }; 40 | 03C710BE100BA1CE0050FA48 /* CSSBorderlessWindow.m in Sources */ = {isa = PBXBuildFile; fileRef = 03C710BD100BA1CE0050FA48 /* CSSBorderlessWindow.m */; }; 41 | 03D7C6DA235C5E330086E718 /* Sparkle.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 03D7C6D8235C5D500086E718 /* Sparkle.framework */; }; 42 | 03D7C6DB235C5E340086E718 /* Sparkle.framework in Copy Frameworks */ = {isa = PBXBuildFile; fileRef = 03D7C6D8235C5D500086E718 /* Sparkle.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; 43 | 03DA06480C805F0B009D508F /* CSSImageInfo.m in Sources */ = {isa = PBXBuildFile; fileRef = 03DA06470C805F0B009D508F /* CSSImageInfo.m */; }; 44 | 03EF78441B85DD6700DAD4AA /* MapKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 03EF78431B85DD6700DAD4AA /* MapKit.framework */; }; 45 | 5F4535E6135C5BD400CC3980 /* Quartz.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 5F4535E5135C5BD400CC3980 /* Quartz.framework */; }; 46 | 8D11072B0486CEB800E47090 /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 089C165CFE840E0CC02AAC07 /* InfoPlist.strings */; }; 47 | 8D11072D0486CEB800E47090 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 29B97316FDCFA39411CA2CEA /* main.m */; settings = {ATTRIBUTES = (); }; }; 48 | 8D11072F0486CEB800E47090 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */; }; 49 | /* End PBXBuildFile section */ 50 | 51 | /* Begin PBXCopyFilesBuildPhase section */ 52 | 037F6A2B100A2BB60071E2A9 /* Copy Frameworks */ = { 53 | isa = PBXCopyFilesBuildPhase; 54 | buildActionMask = 2147483647; 55 | dstPath = ""; 56 | dstSubfolderSpec = 10; 57 | files = ( 58 | 03D7C6DB235C5E340086E718 /* Sparkle.framework in Copy Frameworks */, 59 | ); 60 | name = "Copy Frameworks"; 61 | runOnlyForDeploymentPostprocessing = 0; 62 | }; 63 | /* End PBXCopyFilesBuildPhase section */ 64 | 65 | /* Begin PBXFileReference section */ 66 | 0304615F0C75158100D70803 /* NSFileManager+CSS.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSFileManager+CSS.h"; sourceTree = ""; }; 67 | 030461600C75158100D70803 /* NSFileManager+CSS.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSFileManager+CSS.m"; sourceTree = ""; }; 68 | 030463F00C75347700D70803 /* Credits.html */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = text.html; path = Credits.html; sourceTree = ""; }; 69 | 033804220C86084300439E5A /* ImagesController.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = ImagesController.h; sourceTree = ""; }; 70 | 033804230C86084300439E5A /* ImagesController.m */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.objc; path = ImagesController.m; sourceTree = ""; }; 71 | 033F91E11012ACF8004AEBA0 /* NSImage+CSS.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSImage+CSS.h"; sourceTree = ""; }; 72 | 033F91E21012ACF8004AEBA0 /* NSImage+CSS.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSImage+CSS.m"; sourceTree = ""; }; 73 | 03458E580C81CA5300385D93 /* NSString+CSS.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSString+CSS.h"; sourceTree = ""; }; 74 | 03458E590C81CA5300385D93 /* NSString+CSS.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSString+CSS.m"; sourceTree = ""; }; 75 | 034CA91B0DEB72CD00460991 /* Flagged.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = Flagged.png; sourceTree = ""; }; 76 | 034CA91C0DEB72CD00460991 /* FlaggedHeader.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = FlaggedHeader.png; sourceTree = ""; }; 77 | 034F0B2C138EE5D000A98D10 /* Epeg.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; path = Epeg.framework; sourceTree = ""; }; 78 | 034FC8770EBFB09C00BE42CA /* gmap.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = gmap.png; sourceTree = ""; }; 79 | 03677B950E3A45C500524B59 /* right.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = right.png; sourceTree = ""; }; 80 | 03677B960E3A45C500524B59 /* slideshow.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = slideshow.png; sourceTree = ""; }; 81 | 03677B970E3A45C500524B59 /* trash.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = trash.png; sourceTree = ""; }; 82 | 03677B980E3A45C500524B59 /* remove.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = remove.png; sourceTree = ""; }; 83 | 03677B990E3A45C500524B59 /* fullscreen.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = fullscreen.png; sourceTree = ""; }; 84 | 03677B9A0E3A45C500524B59 /* left.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = left.png; sourceTree = ""; }; 85 | 03677B9B0E3A45C500524B59 /* flag.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = flag.png; sourceTree = ""; }; 86 | 03677B9C0E3A45C500524B59 /* folder.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = folder.png; sourceTree = ""; }; 87 | 03677B9D0E3A45C600524B59 /* add.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = add.png; sourceTree = ""; }; 88 | 0367A7F90C56CA6600BD57E8 /* IOKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = IOKit.framework; path = /System/Library/Frameworks/IOKit.framework; sourceTree = ""; }; 89 | 036D5C2E0C7269D0004A8236 /* Carbon.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Carbon.framework; path = /System/Library/Frameworks/Carbon.framework; sourceTree = ""; }; 90 | 037D95D30DCDD8BB00E8DEB7 /* English */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = English; path = English.lproj/MainMenu.xib; sourceTree = ""; }; 91 | 037D96170DCDDDCF00E8DEB7 /* AppDelegate+Toolbar.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "AppDelegate+Toolbar.h"; sourceTree = ""; }; 92 | 037D96180DCDDDCF00E8DEB7 /* AppDelegate+Toolbar.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "AppDelegate+Toolbar.m"; sourceTree = ""; }; 93 | 037F66C11008E7FD0071E2A9 /* UserDefaults.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = UserDefaults.plist; sourceTree = ""; }; 94 | 037F672A1008EDA90071E2A9 /* English */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.strings; name = English; path = English.lproj/Localizable.strings; sourceTree = ""; }; 95 | 037F67341008EDB60071E2A9 /* French */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = French; path = French.lproj/Localizable.strings; sourceTree = ""; }; 96 | 037F67A11008F41E0071E2A9 /* French */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = French; path = French.lproj/MainMenu.xib; sourceTree = ""; }; 97 | 037F6B26100A34130071E2A9 /* css_dsa_pub.pem */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = css_dsa_pub.pem; sourceTree = ""; }; 98 | 039B5A570ECE281600D7C02C /* CSSMapController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CSSMapController.h; sourceTree = ""; }; 99 | 039B5A580ECE281600D7C02C /* CSSMapController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CSSMapController.m; sourceTree = ""; }; 100 | 03A122E10EC224F60076DF63 /* CSSImageView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CSSImageView.h; sourceTree = ""; }; 101 | 03A122E20EC224F60076DF63 /* CSSImageView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CSSImageView.m; sourceTree = ""; }; 102 | 03A126B00EC2496C0076DF63 /* WebKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = WebKit.framework; path = /System/Library/Frameworks/WebKit.framework; sourceTree = ""; }; 103 | 03A3F43F0C77D97E009AD69D /* CSSWindow.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = CSSWindow.h; sourceTree = ""; }; 104 | 03A3F4400C77D97E009AD69D /* CSSWindow.m */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.objc; path = CSSWindow.m; sourceTree = ""; }; 105 | 03A3F55B0C786878009AD69D /* CocoaSlideShow.icns */ = {isa = PBXFileReference; lastKnownFileType = image.icns; path = CocoaSlideShow.icns; sourceTree = ""; }; 106 | 03B1BB0F0C5173B40032C03F /* AppDelegate.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = AppDelegate.h; sourceTree = ""; }; 107 | 03B1BB100C5173B40032C03F /* AppDelegate.m */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.objc; path = AppDelegate.m; sourceTree = ""; }; 108 | 03C710BC100BA1CE0050FA48 /* CSSBorderlessWindow.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CSSBorderlessWindow.h; sourceTree = ""; }; 109 | 03C710BD100BA1CE0050FA48 /* CSSBorderlessWindow.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CSSBorderlessWindow.m; sourceTree = ""; }; 110 | 03D7C6D8235C5D500086E718 /* Sparkle.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; path = Sparkle.framework; sourceTree = ""; }; 111 | 03DA06460C805F0B009D508F /* CSSImageInfo.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CSSImageInfo.h; sourceTree = ""; }; 112 | 03DA06470C805F0B009D508F /* CSSImageInfo.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CSSImageInfo.m; sourceTree = ""; }; 113 | 03EF78431B85DD6700DAD4AA /* MapKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = MapKit.framework; path = Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.10.sdk/System/Library/Frameworks/MapKit.framework; sourceTree = SYSTEM_DEVELOPER_DIR; }; 114 | 089C165DFE840E0CC02AAC07 /* English */ = {isa = PBXFileReference; fileEncoding = 10; lastKnownFileType = text.plist.strings; name = English; path = English.lproj/InfoPlist.strings; sourceTree = ""; }; 115 | 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Cocoa.framework; path = /System/Library/Frameworks/Cocoa.framework; sourceTree = ""; }; 116 | 13E42FB307B3F0F600E4EEF1 /* CoreData.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreData.framework; path = /System/Library/Frameworks/CoreData.framework; sourceTree = ""; }; 117 | 29B97316FDCFA39411CA2CEA /* main.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; }; 118 | 29B97324FDCFA39411CA2CEA /* AppKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AppKit.framework; path = /System/Library/Frameworks/AppKit.framework; sourceTree = ""; }; 119 | 29B97325FDCFA39411CA2CEA /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = /System/Library/Frameworks/Foundation.framework; sourceTree = ""; }; 120 | 32CA4F630368D1EE00C91783 /* CocoaSlideShow_Prefix.pch */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CocoaSlideShow_Prefix.pch; sourceTree = ""; }; 121 | 5F4535E5135C5BD400CC3980 /* Quartz.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Quartz.framework; path = System/Library/Frameworks/Quartz.framework; sourceTree = SDKROOT; }; 122 | 8D1107310486CEB800E47090 /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist; path = Info.plist; sourceTree = ""; }; 123 | 8D1107320486CEB800E47090 /* CocoaSlideShow.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = CocoaSlideShow.app; sourceTree = BUILT_PRODUCTS_DIR; }; 124 | /* End PBXFileReference section */ 125 | 126 | /* Begin PBXFrameworksBuildPhase section */ 127 | 8D11072E0486CEB800E47090 /* Frameworks */ = { 128 | isa = PBXFrameworksBuildPhase; 129 | buildActionMask = 2147483647; 130 | files = ( 131 | 03EF78441B85DD6700DAD4AA /* MapKit.framework in Frameworks */, 132 | 8D11072F0486CEB800E47090 /* Cocoa.framework in Frameworks */, 133 | 0367A7FA0C56CA6600BD57E8 /* IOKit.framework in Frameworks */, 134 | 03D7C6DA235C5E330086E718 /* Sparkle.framework in Frameworks */, 135 | 036D5C2F0C7269D0004A8236 /* Carbon.framework in Frameworks */, 136 | 03A126B10EC2496C0076DF63 /* WebKit.framework in Frameworks */, 137 | 5F4535E6135C5BD400CC3980 /* Quartz.framework in Frameworks */, 138 | ); 139 | runOnlyForDeploymentPostprocessing = 0; 140 | }; 141 | /* End PBXFrameworksBuildPhase section */ 142 | 143 | /* Begin PBXGroup section */ 144 | 080E96DDFE201D6D7F000001 /* Classes */ = { 145 | isa = PBXGroup; 146 | children = ( 147 | 03A122E10EC224F60076DF63 /* CSSImageView.h */, 148 | 03A122E20EC224F60076DF63 /* CSSImageView.m */, 149 | 03A3F43F0C77D97E009AD69D /* CSSWindow.h */, 150 | 03A3F4400C77D97E009AD69D /* CSSWindow.m */, 151 | 03DA06460C805F0B009D508F /* CSSImageInfo.h */, 152 | 03DA06470C805F0B009D508F /* CSSImageInfo.m */, 153 | 033804220C86084300439E5A /* ImagesController.h */, 154 | 033804230C86084300439E5A /* ImagesController.m */, 155 | 03B1BB0F0C5173B40032C03F /* AppDelegate.h */, 156 | 03B1BB100C5173B40032C03F /* AppDelegate.m */, 157 | 037D96170DCDDDCF00E8DEB7 /* AppDelegate+Toolbar.h */, 158 | 037D96180DCDDDCF00E8DEB7 /* AppDelegate+Toolbar.m */, 159 | 039B5A570ECE281600D7C02C /* CSSMapController.h */, 160 | 039B5A580ECE281600D7C02C /* CSSMapController.m */, 161 | 0304615F0C75158100D70803 /* NSFileManager+CSS.h */, 162 | 030461600C75158100D70803 /* NSFileManager+CSS.m */, 163 | 03458E580C81CA5300385D93 /* NSString+CSS.h */, 164 | 03458E590C81CA5300385D93 /* NSString+CSS.m */, 165 | 033F91E11012ACF8004AEBA0 /* NSImage+CSS.h */, 166 | 033F91E21012ACF8004AEBA0 /* NSImage+CSS.m */, 167 | 03C710BC100BA1CE0050FA48 /* CSSBorderlessWindow.h */, 168 | 03C710BD100BA1CE0050FA48 /* CSSBorderlessWindow.m */, 169 | ); 170 | name = Classes; 171 | sourceTree = ""; 172 | }; 173 | 1058C7A0FEA54F0111CA2CBB /* Linked Frameworks */ = { 174 | isa = PBXGroup; 175 | children = ( 176 | 03D7C6D8235C5D500086E718 /* Sparkle.framework */, 177 | 034F0B2C138EE5D000A98D10 /* Epeg.framework */, 178 | 03A126B00EC2496C0076DF63 /* WebKit.framework */, 179 | 036D5C2E0C7269D0004A8236 /* Carbon.framework */, 180 | 0367A7F90C56CA6600BD57E8 /* IOKit.framework */, 181 | 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */, 182 | 5F4535E5135C5BD400CC3980 /* Quartz.framework */, 183 | ); 184 | name = "Linked Frameworks"; 185 | sourceTree = ""; 186 | }; 187 | 1058C7A2FEA54F0111CA2CBB /* Other Frameworks */ = { 188 | isa = PBXGroup; 189 | children = ( 190 | 29B97324FDCFA39411CA2CEA /* AppKit.framework */, 191 | 13E42FB307B3F0F600E4EEF1 /* CoreData.framework */, 192 | 29B97325FDCFA39411CA2CEA /* Foundation.framework */, 193 | ); 194 | name = "Other Frameworks"; 195 | sourceTree = ""; 196 | }; 197 | 19C28FACFE9D520D11CA2CBB /* Products */ = { 198 | isa = PBXGroup; 199 | children = ( 200 | 8D1107320486CEB800E47090 /* CocoaSlideShow.app */, 201 | ); 202 | name = Products; 203 | sourceTree = ""; 204 | }; 205 | 29B97314FDCFA39411CA2CEA /* CocoaSlideShow */ = { 206 | isa = PBXGroup; 207 | children = ( 208 | 080E96DDFE201D6D7F000001 /* Classes */, 209 | 29B97315FDCFA39411CA2CEA /* Other Sources */, 210 | 29B97317FDCFA39411CA2CEA /* Resources */, 211 | 29B97323FDCFA39411CA2CEA /* Frameworks */, 212 | 19C28FACFE9D520D11CA2CBB /* Products */, 213 | ); 214 | name = CocoaSlideShow; 215 | sourceTree = ""; 216 | }; 217 | 29B97315FDCFA39411CA2CEA /* Other Sources */ = { 218 | isa = PBXGroup; 219 | children = ( 220 | 32CA4F630368D1EE00C91783 /* CocoaSlideShow_Prefix.pch */, 221 | 29B97316FDCFA39411CA2CEA /* main.m */, 222 | ); 223 | name = "Other Sources"; 224 | sourceTree = ""; 225 | }; 226 | 29B97317FDCFA39411CA2CEA /* Resources */ = { 227 | isa = PBXGroup; 228 | children = ( 229 | 037F6B26100A34130071E2A9 /* css_dsa_pub.pem */, 230 | 034FC8770EBFB09C00BE42CA /* gmap.png */, 231 | 03677B950E3A45C500524B59 /* right.png */, 232 | 03677B960E3A45C500524B59 /* slideshow.png */, 233 | 03677B970E3A45C500524B59 /* trash.png */, 234 | 03677B980E3A45C500524B59 /* remove.png */, 235 | 03677B990E3A45C500524B59 /* fullscreen.png */, 236 | 03677B9A0E3A45C500524B59 /* left.png */, 237 | 03677B9B0E3A45C500524B59 /* flag.png */, 238 | 03677B9C0E3A45C500524B59 /* folder.png */, 239 | 03677B9D0E3A45C600524B59 /* add.png */, 240 | 034CA91B0DEB72CD00460991 /* Flagged.png */, 241 | 034CA91C0DEB72CD00460991 /* FlaggedHeader.png */, 242 | 03A3F55B0C786878009AD69D /* CocoaSlideShow.icns */, 243 | 030463F00C75347700D70803 /* Credits.html */, 244 | 8D1107310486CEB800E47090 /* Info.plist */, 245 | 037D95D20DCDD8BB00E8DEB7 /* MainMenu.xib */, 246 | 089C165CFE840E0CC02AAC07 /* InfoPlist.strings */, 247 | 037F66C11008E7FD0071E2A9 /* UserDefaults.plist */, 248 | 037F672C1008EDAE0071E2A9 /* Localizable.strings */, 249 | ); 250 | name = Resources; 251 | sourceTree = ""; 252 | }; 253 | 29B97323FDCFA39411CA2CEA /* Frameworks */ = { 254 | isa = PBXGroup; 255 | children = ( 256 | 03EF78431B85DD6700DAD4AA /* MapKit.framework */, 257 | 1058C7A0FEA54F0111CA2CBB /* Linked Frameworks */, 258 | 1058C7A2FEA54F0111CA2CBB /* Other Frameworks */, 259 | ); 260 | name = Frameworks; 261 | sourceTree = ""; 262 | }; 263 | /* End PBXGroup section */ 264 | 265 | /* Begin PBXNativeTarget section */ 266 | 8D1107260486CEB800E47090 /* CocoaSlideShow */ = { 267 | isa = PBXNativeTarget; 268 | buildConfigurationList = C01FCF4A08A954540054247B /* Build configuration list for PBXNativeTarget "CocoaSlideShow" */; 269 | buildPhases = ( 270 | 8D11072C0486CEB800E47090 /* Sources */, 271 | 8D11072E0486CEB800E47090 /* Frameworks */, 272 | 8D1107290486CEB800E47090 /* Resources */, 273 | 037F6A2B100A2BB60071E2A9 /* Copy Frameworks */, 274 | ); 275 | buildRules = ( 276 | ); 277 | dependencies = ( 278 | ); 279 | name = CocoaSlideShow; 280 | productInstallPath = "$(HOME)/Applications"; 281 | productName = CocoaSlideShow; 282 | productReference = 8D1107320486CEB800E47090 /* CocoaSlideShow.app */; 283 | productType = "com.apple.product-type.application"; 284 | }; 285 | /* End PBXNativeTarget section */ 286 | 287 | /* Begin PBXProject section */ 288 | 29B97313FDCFA39411CA2CEA /* Project object */ = { 289 | isa = PBXProject; 290 | attributes = { 291 | }; 292 | buildConfigurationList = C01FCF4E08A954540054247B /* Build configuration list for PBXProject "CocoaSlideShow" */; 293 | compatibilityVersion = "Xcode 2.4"; 294 | developmentRegion = English; 295 | hasScannedForEncodings = 1; 296 | knownRegions = ( 297 | English, 298 | Japanese, 299 | French, 300 | German, 301 | ); 302 | mainGroup = 29B97314FDCFA39411CA2CEA /* CocoaSlideShow */; 303 | projectDirPath = ""; 304 | projectRoot = ""; 305 | targets = ( 306 | 8D1107260486CEB800E47090 /* CocoaSlideShow */, 307 | ); 308 | }; 309 | /* End PBXProject section */ 310 | 311 | /* Begin PBXResourcesBuildPhase section */ 312 | 8D1107290486CEB800E47090 /* Resources */ = { 313 | isa = PBXResourcesBuildPhase; 314 | buildActionMask = 2147483647; 315 | files = ( 316 | 8D11072B0486CEB800E47090 /* InfoPlist.strings in Resources */, 317 | 030463F10C75347700D70803 /* Credits.html in Resources */, 318 | 03A3F55C0C786878009AD69D /* CocoaSlideShow.icns in Resources */, 319 | 037D95D40DCDD8BB00E8DEB7 /* MainMenu.xib in Resources */, 320 | 034CA91D0DEB72CD00460991 /* Flagged.png in Resources */, 321 | 034CA91E0DEB72CD00460991 /* FlaggedHeader.png in Resources */, 322 | 03677B9E0E3A45C600524B59 /* right.png in Resources */, 323 | 03677B9F0E3A45C600524B59 /* slideshow.png in Resources */, 324 | 03677BA00E3A45C600524B59 /* trash.png in Resources */, 325 | 03677BA10E3A45C600524B59 /* remove.png in Resources */, 326 | 03677BA20E3A45C600524B59 /* fullscreen.png in Resources */, 327 | 03677BA30E3A45C600524B59 /* left.png in Resources */, 328 | 03677BA40E3A45C600524B59 /* flag.png in Resources */, 329 | 03677BA50E3A45C600524B59 /* folder.png in Resources */, 330 | 03677BA60E3A45C600524B59 /* add.png in Resources */, 331 | 034FC8780EBFB09C00BE42CA /* gmap.png in Resources */, 332 | 037F66C21008E7FD0071E2A9 /* UserDefaults.plist in Resources */, 333 | 037F672D1008EDAE0071E2A9 /* Localizable.strings in Resources */, 334 | 037F6B27100A34130071E2A9 /* css_dsa_pub.pem in Resources */, 335 | ); 336 | runOnlyForDeploymentPostprocessing = 0; 337 | }; 338 | /* End PBXResourcesBuildPhase section */ 339 | 340 | /* Begin PBXSourcesBuildPhase section */ 341 | 8D11072C0486CEB800E47090 /* Sources */ = { 342 | isa = PBXSourcesBuildPhase; 343 | buildActionMask = 2147483647; 344 | files = ( 345 | 8D11072D0486CEB800E47090 /* main.m in Sources */, 346 | 03B1BB110C5173B40032C03F /* AppDelegate.m in Sources */, 347 | 030461610C75158100D70803 /* NSFileManager+CSS.m in Sources */, 348 | 03A3F4410C77D97E009AD69D /* CSSWindow.m in Sources */, 349 | 03DA06480C805F0B009D508F /* CSSImageInfo.m in Sources */, 350 | 03458E5A0C81CA5300385D93 /* NSString+CSS.m in Sources */, 351 | 033804240C86084300439E5A /* ImagesController.m in Sources */, 352 | 037D96190DCDDDCF00E8DEB7 /* AppDelegate+Toolbar.m in Sources */, 353 | 03A122E30EC224F60076DF63 /* CSSImageView.m in Sources */, 354 | 039B5A590ECE281600D7C02C /* CSSMapController.m in Sources */, 355 | 03C710BE100BA1CE0050FA48 /* CSSBorderlessWindow.m in Sources */, 356 | 033F91E31012ACF8004AEBA0 /* NSImage+CSS.m in Sources */, 357 | ); 358 | runOnlyForDeploymentPostprocessing = 0; 359 | }; 360 | /* End PBXSourcesBuildPhase section */ 361 | 362 | /* Begin PBXVariantGroup section */ 363 | 037D95D20DCDD8BB00E8DEB7 /* MainMenu.xib */ = { 364 | isa = PBXVariantGroup; 365 | children = ( 366 | 037D95D30DCDD8BB00E8DEB7 /* English */, 367 | 037F67A11008F41E0071E2A9 /* French */, 368 | ); 369 | name = MainMenu.xib; 370 | sourceTree = ""; 371 | }; 372 | 037F672C1008EDAE0071E2A9 /* Localizable.strings */ = { 373 | isa = PBXVariantGroup; 374 | children = ( 375 | 037F672A1008EDA90071E2A9 /* English */, 376 | 037F67341008EDB60071E2A9 /* French */, 377 | ); 378 | name = Localizable.strings; 379 | sourceTree = ""; 380 | }; 381 | 089C165CFE840E0CC02AAC07 /* InfoPlist.strings */ = { 382 | isa = PBXVariantGroup; 383 | children = ( 384 | 089C165DFE840E0CC02AAC07 /* English */, 385 | ); 386 | name = InfoPlist.strings; 387 | sourceTree = ""; 388 | }; 389 | /* End PBXVariantGroup section */ 390 | 391 | /* Begin XCBuildConfiguration section */ 392 | C01FCF4B08A954540054247B /* Debug */ = { 393 | isa = XCBuildConfiguration; 394 | buildSettings = { 395 | ARCHS = "$(ARCHS_STANDARD)"; 396 | CLANG_ENABLE_OBJC_ARC = YES; 397 | CURRENT_PROJECT_VERSION = 0.8; 398 | FRAMEWORK_SEARCH_PATHS = ( 399 | "$(inherited)", 400 | "$(FRAMEWORK_SEARCH_PATHS_QUOTED_FOR_TARGET_1)", 401 | "$(FRAMEWORK_SEARCH_PATHS_QUOTED_FOR_TARGET_2)", 402 | "$(FRAMEWORK_SEARCH_PATHS_QUOTED_FOR_TARGET_3)", 403 | "$(FRAMEWORK_SEARCH_PATHS_QUOTED_FOR_TARGET_4)", 404 | "$(PROJECT_DIR)", 405 | ); 406 | FRAMEWORK_SEARCH_PATHS_QUOTED_FOR_TARGET_1 = "\"$(SDKROOT)$(SYSTEM_LIBRARY_DIR)/PrivateFrameworks\""; 407 | FRAMEWORK_SEARCH_PATHS_QUOTED_FOR_TARGET_2 = "\"$(SRCROOT)\""; 408 | GCC_DYNAMIC_NO_PIC = NO; 409 | GCC_ENABLE_FIX_AND_CONTINUE = YES; 410 | GCC_MODEL_TUNING = G5; 411 | GCC_OPTIMIZATION_LEVEL = 0; 412 | INFOPLIST_FILE = Info.plist; 413 | INSTALL_PATH = "$(HOME)/Applications"; 414 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks"; 415 | MACOSX_DEPLOYMENT_TARGET = 10.9; 416 | PRODUCT_BUNDLE_IDENTIFIER = ch.seriot.CocoaSlideShow; 417 | PRODUCT_NAME = CocoaSlideShow; 418 | SDKROOT = macosx; 419 | USE_HEADERMAP = NO; 420 | WRAPPER_EXTENSION = app; 421 | ZERO_LINK = YES; 422 | }; 423 | name = Debug; 424 | }; 425 | C01FCF4C08A954540054247B /* Release */ = { 426 | isa = XCBuildConfiguration; 427 | buildSettings = { 428 | ARCHS = "$(ARCHS_STANDARD)"; 429 | CLANG_ENABLE_OBJC_ARC = YES; 430 | CURRENT_PROJECT_VERSION = 0.8; 431 | FRAMEWORK_SEARCH_PATHS = ( 432 | "$(inherited)", 433 | "$(FRAMEWORK_SEARCH_PATHS_QUOTED_FOR_TARGET_1)", 434 | "$(FRAMEWORK_SEARCH_PATHS_QUOTED_FOR_TARGET_2)", 435 | "$(FRAMEWORK_SEARCH_PATHS_QUOTED_FOR_TARGET_3)", 436 | "$(FRAMEWORK_SEARCH_PATHS_QUOTED_FOR_TARGET_4)", 437 | "$(PROJECT_DIR)", 438 | ); 439 | FRAMEWORK_SEARCH_PATHS_QUOTED_FOR_TARGET_1 = "\"$(SDKROOT)$(SYSTEM_LIBRARY_DIR)/PrivateFrameworks\""; 440 | FRAMEWORK_SEARCH_PATHS_QUOTED_FOR_TARGET_2 = "\"$(SRCROOT)\""; 441 | GCC_GENERATE_DEBUGGING_SYMBOLS = NO; 442 | GCC_MODEL_TUNING = G5; 443 | INFOPLIST_FILE = Info.plist; 444 | INSTALL_PATH = "$(HOME)/Applications"; 445 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks"; 446 | MACOSX_DEPLOYMENT_TARGET = 10.9; 447 | PRODUCT_BUNDLE_IDENTIFIER = ch.seriot.CocoaSlideShow; 448 | PRODUCT_NAME = CocoaSlideShow; 449 | SDKROOT = macosx; 450 | USE_HEADERMAP = NO; 451 | WRAPPER_EXTENSION = app; 452 | }; 453 | name = Release; 454 | }; 455 | C01FCF4F08A954540054247B /* Debug */ = { 456 | isa = XCBuildConfiguration; 457 | buildSettings = { 458 | ARCHS = "$(ARCHS_STANDARD_32_64_BIT)"; 459 | GCC_ENABLE_OBJC_EXCEPTIONS = YES; 460 | GCC_VERSION = ""; 461 | GCC_WARN_ABOUT_RETURN_TYPE = YES; 462 | GCC_WARN_UNUSED_PARAMETER = NO; 463 | GCC_WARN_UNUSED_VALUE = NO; 464 | GCC_WARN_UNUSED_VARIABLE = YES; 465 | MACOSX_DEPLOYMENT_TARGET = 10.7; 466 | ONLY_ACTIVE_ARCH = YES; 467 | PREBINDING = NO; 468 | SDKROOT = macosx; 469 | WARNING_CFLAGS = "-Wunreachable-code"; 470 | }; 471 | name = Debug; 472 | }; 473 | C01FCF5008A954540054247B /* Release */ = { 474 | isa = XCBuildConfiguration; 475 | buildSettings = { 476 | ARCHS = "$(ARCHS_STANDARD_32_64_BIT)"; 477 | GCC_ENABLE_OBJC_EXCEPTIONS = YES; 478 | GCC_VERSION = ""; 479 | GCC_WARN_ABOUT_RETURN_TYPE = YES; 480 | GCC_WARN_UNUSED_VARIABLE = YES; 481 | MACOSX_DEPLOYMENT_TARGET = 10.7; 482 | PREBINDING = NO; 483 | SDKROOT = macosx; 484 | }; 485 | name = Release; 486 | }; 487 | /* End XCBuildConfiguration section */ 488 | 489 | /* Begin XCConfigurationList section */ 490 | C01FCF4A08A954540054247B /* Build configuration list for PBXNativeTarget "CocoaSlideShow" */ = { 491 | isa = XCConfigurationList; 492 | buildConfigurations = ( 493 | C01FCF4C08A954540054247B /* Release */, 494 | C01FCF4B08A954540054247B /* Debug */, 495 | ); 496 | defaultConfigurationIsVisible = 0; 497 | defaultConfigurationName = Debug; 498 | }; 499 | C01FCF4E08A954540054247B /* Build configuration list for PBXProject "CocoaSlideShow" */ = { 500 | isa = XCConfigurationList; 501 | buildConfigurations = ( 502 | C01FCF5008A954540054247B /* Release */, 503 | C01FCF4F08A954540054247B /* Debug */, 504 | ); 505 | defaultConfigurationIsVisible = 0; 506 | defaultConfigurationName = Debug; 507 | }; 508 | /* End XCConfigurationList section */ 509 | }; 510 | rootObject = 29B97313FDCFA39411CA2CEA /* Project object */; 511 | } 512 | -------------------------------------------------------------------------------- /CocoaSlideShow.xcodeproj/.svn/text-base/project.pbxproj.svn-base: -------------------------------------------------------------------------------- 1 | // !$*UTF8*$! 2 | { 3 | archiveVersion = 1; 4 | classes = { 5 | }; 6 | objectVersion = 42; 7 | objects = { 8 | 9 | /* Begin PBXBuildFile section */ 10 | 030461610C75158100D70803 /* NSFileManager+CSS.m in Sources */ = {isa = PBXBuildFile; fileRef = 030461600C75158100D70803 /* NSFileManager+CSS.m */; }; 11 | 030463F10C75347700D70803 /* Credits.html in Resources */ = {isa = PBXBuildFile; fileRef = 030463F00C75347700D70803 /* Credits.html */; }; 12 | 032F081B0C542D820037F590 /* AppleRemote.m in Sources */ = {isa = PBXBuildFile; fileRef = 032F081A0C542D820037F590 /* AppleRemote.m */; }; 13 | 033804240C86084300439E5A /* ImagesController.m in Sources */ = {isa = PBXBuildFile; fileRef = 033804230C86084300439E5A /* ImagesController.m */; }; 14 | 033F91E31012ACF8004AEBA0 /* NSImage+CSS.m in Sources */ = {isa = PBXBuildFile; fileRef = 033F91E21012ACF8004AEBA0 /* NSImage+CSS.m */; }; 15 | 03458E5A0C81CA5300385D93 /* NSString+CSS.m in Sources */ = {isa = PBXBuildFile; fileRef = 03458E590C81CA5300385D93 /* NSString+CSS.m */; }; 16 | 034CA91D0DEB72CD00460991 /* Flagged.png in Resources */ = {isa = PBXBuildFile; fileRef = 034CA91B0DEB72CD00460991 /* Flagged.png */; }; 17 | 034CA91E0DEB72CD00460991 /* FlaggedHeader.png in Resources */ = {isa = PBXBuildFile; fileRef = 034CA91C0DEB72CD00460991 /* FlaggedHeader.png */; }; 18 | 034F0B2D138EE5D000A98D10 /* Epeg.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 034F0B2C138EE5D000A98D10 /* Epeg.framework */; }; 19 | 034FC8780EBFB09C00BE42CA /* gmap.png in Resources */ = {isa = PBXBuildFile; fileRef = 034FC8770EBFB09C00BE42CA /* gmap.png */; }; 20 | 03677B9E0E3A45C600524B59 /* right.png in Resources */ = {isa = PBXBuildFile; fileRef = 03677B950E3A45C500524B59 /* right.png */; }; 21 | 03677B9F0E3A45C600524B59 /* slideshow.png in Resources */ = {isa = PBXBuildFile; fileRef = 03677B960E3A45C500524B59 /* slideshow.png */; }; 22 | 03677BA00E3A45C600524B59 /* trash.png in Resources */ = {isa = PBXBuildFile; fileRef = 03677B970E3A45C500524B59 /* trash.png */; }; 23 | 03677BA10E3A45C600524B59 /* remove.png in Resources */ = {isa = PBXBuildFile; fileRef = 03677B980E3A45C500524B59 /* remove.png */; }; 24 | 03677BA20E3A45C600524B59 /* fullscreen.png in Resources */ = {isa = PBXBuildFile; fileRef = 03677B990E3A45C500524B59 /* fullscreen.png */; }; 25 | 03677BA30E3A45C600524B59 /* left.png in Resources */ = {isa = PBXBuildFile; fileRef = 03677B9A0E3A45C500524B59 /* left.png */; }; 26 | 03677BA40E3A45C600524B59 /* flag.png in Resources */ = {isa = PBXBuildFile; fileRef = 03677B9B0E3A45C500524B59 /* flag.png */; }; 27 | 03677BA50E3A45C600524B59 /* folder.png in Resources */ = {isa = PBXBuildFile; fileRef = 03677B9C0E3A45C500524B59 /* folder.png */; }; 28 | 03677BA60E3A45C600524B59 /* add.png in Resources */ = {isa = PBXBuildFile; fileRef = 03677B9D0E3A45C600524B59 /* add.png */; }; 29 | 0367A7FA0C56CA6600BD57E8 /* IOKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 0367A7F90C56CA6600BD57E8 /* IOKit.framework */; }; 30 | 036D55130C712BFC004A8236 /* HIDRemoteControlDevice.m in Sources */ = {isa = PBXBuildFile; fileRef = 036D55120C712BFC004A8236 /* HIDRemoteControlDevice.m */; }; 31 | 036D55170C712C1B004A8236 /* RemoteControl.m in Sources */ = {isa = PBXBuildFile; fileRef = 036D55160C712C1B004A8236 /* RemoteControl.m */; }; 32 | 036D5C2F0C7269D0004A8236 /* Carbon.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 036D5C2E0C7269D0004A8236 /* Carbon.framework */; }; 33 | 037D95D40DCDD8BB00E8DEB7 /* MainMenu.xib in Resources */ = {isa = PBXBuildFile; fileRef = 037D95D20DCDD8BB00E8DEB7 /* MainMenu.xib */; }; 34 | 037D96190DCDDDCF00E8DEB7 /* AppDelegate+Toolbar.m in Sources */ = {isa = PBXBuildFile; fileRef = 037D96180DCDDDCF00E8DEB7 /* AppDelegate+Toolbar.m */; }; 35 | 037F66C21008E7FD0071E2A9 /* UserDefaults.plist in Resources */ = {isa = PBXBuildFile; fileRef = 037F66C11008E7FD0071E2A9 /* UserDefaults.plist */; }; 36 | 037F672D1008EDAE0071E2A9 /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = 037F672C1008EDAE0071E2A9 /* Localizable.strings */; }; 37 | 037F69C1100A29BC0071E2A9 /* Sparkle.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 037F69C0100A29BC0071E2A9 /* Sparkle.framework */; }; 38 | 037F6A21100A2BA00071E2A9 /* Sparkle.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 037F69C0100A29BC0071E2A9 /* Sparkle.framework */; }; 39 | 037F6A5B100A2C8B0071E2A9 /* Sparkle.framework in Copy Frameworks */ = {isa = PBXBuildFile; fileRef = 037F69C0100A29BC0071E2A9 /* Sparkle.framework */; }; 40 | 037F6B27100A34130071E2A9 /* css_dsa_pub.pem in Resources */ = {isa = PBXBuildFile; fileRef = 037F6B26100A34130071E2A9 /* css_dsa_pub.pem */; }; 41 | 039B5A590ECE281600D7C02C /* CSSMapController.m in Sources */ = {isa = PBXBuildFile; fileRef = 039B5A580ECE281600D7C02C /* CSSMapController.m */; }; 42 | 03A122E30EC224F60076DF63 /* CSSImageView.m in Sources */ = {isa = PBXBuildFile; fileRef = 03A122E20EC224F60076DF63 /* CSSImageView.m */; }; 43 | 03A126B10EC2496C0076DF63 /* WebKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 03A126B00EC2496C0076DF63 /* WebKit.framework */; }; 44 | 03A127EB0EC252140076DF63 /* gmap.html in Resources */ = {isa = PBXBuildFile; fileRef = 03A127EA0EC252140076DF63 /* gmap.html */; }; 45 | 03A3F4410C77D97E009AD69D /* CSSWindow.m in Sources */ = {isa = PBXBuildFile; fileRef = 03A3F4400C77D97E009AD69D /* CSSWindow.m */; }; 46 | 03A3F55C0C786878009AD69D /* CocoaSlideShow.icns in Resources */ = {isa = PBXBuildFile; fileRef = 03A3F55B0C786878009AD69D /* CocoaSlideShow.icns */; }; 47 | 03B1BB110C5173B40032C03F /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 03B1BB100C5173B40032C03F /* AppDelegate.m */; }; 48 | 03C710BE100BA1CE0050FA48 /* CSSBorderlessWindow.m in Sources */ = {isa = PBXBuildFile; fileRef = 03C710BD100BA1CE0050FA48 /* CSSBorderlessWindow.m */; }; 49 | 03DA06480C805F0B009D508F /* CSSImageInfo.m in Sources */ = {isa = PBXBuildFile; fileRef = 03DA06470C805F0B009D508F /* CSSImageInfo.m */; }; 50 | 5F4535E6135C5BD400CC3980 /* Quartz.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 5F4535E5135C5BD400CC3980 /* Quartz.framework */; }; 51 | 5F4FBF0D140690DE0070656D /* Epeg.framework in Copy Frameworks */ = {isa = PBXBuildFile; fileRef = 034F0B2C138EE5D000A98D10 /* Epeg.framework */; }; 52 | 8D11072B0486CEB800E47090 /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 089C165CFE840E0CC02AAC07 /* InfoPlist.strings */; }; 53 | 8D11072D0486CEB800E47090 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 29B97316FDCFA39411CA2CEA /* main.m */; settings = {ATTRIBUTES = (); }; }; 54 | 8D11072F0486CEB800E47090 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */; }; 55 | /* End PBXBuildFile section */ 56 | 57 | /* Begin PBXCopyFilesBuildPhase section */ 58 | 037F6A2B100A2BB60071E2A9 /* Copy Frameworks */ = { 59 | isa = PBXCopyFilesBuildPhase; 60 | buildActionMask = 2147483647; 61 | dstPath = ""; 62 | dstSubfolderSpec = 10; 63 | files = ( 64 | 5F4FBF0D140690DE0070656D /* Epeg.framework in Copy Frameworks */, 65 | 037F6A5B100A2C8B0071E2A9 /* Sparkle.framework in Copy Frameworks */, 66 | ); 67 | name = "Copy Frameworks"; 68 | runOnlyForDeploymentPostprocessing = 0; 69 | }; 70 | /* End PBXCopyFilesBuildPhase section */ 71 | 72 | /* Begin PBXFileReference section */ 73 | 0304615F0C75158100D70803 /* NSFileManager+CSS.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSFileManager+CSS.h"; sourceTree = ""; }; 74 | 030461600C75158100D70803 /* NSFileManager+CSS.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSFileManager+CSS.m"; sourceTree = ""; }; 75 | 030463F00C75347700D70803 /* Credits.html */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = text.html; path = Credits.html; sourceTree = ""; }; 76 | 032F08190C542D820037F590 /* AppleRemote.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = AppleRemote.h; sourceTree = ""; }; 77 | 032F081A0C542D820037F590 /* AppleRemote.m */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.objc; path = AppleRemote.m; sourceTree = ""; }; 78 | 033804220C86084300439E5A /* ImagesController.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = ImagesController.h; sourceTree = ""; }; 79 | 033804230C86084300439E5A /* ImagesController.m */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.objc; path = ImagesController.m; sourceTree = ""; }; 80 | 033F91E11012ACF8004AEBA0 /* NSImage+CSS.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSImage+CSS.h"; sourceTree = ""; }; 81 | 033F91E21012ACF8004AEBA0 /* NSImage+CSS.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSImage+CSS.m"; sourceTree = ""; }; 82 | 03458E580C81CA5300385D93 /* NSString+CSS.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSString+CSS.h"; sourceTree = ""; }; 83 | 03458E590C81CA5300385D93 /* NSString+CSS.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSString+CSS.m"; sourceTree = ""; }; 84 | 034CA91B0DEB72CD00460991 /* Flagged.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = Flagged.png; sourceTree = ""; }; 85 | 034CA91C0DEB72CD00460991 /* FlaggedHeader.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = FlaggedHeader.png; sourceTree = ""; }; 86 | 034F0B2C138EE5D000A98D10 /* Epeg.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; path = Epeg.framework; sourceTree = ""; }; 87 | 034FC8770EBFB09C00BE42CA /* gmap.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = gmap.png; sourceTree = ""; }; 88 | 03677B950E3A45C500524B59 /* right.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = right.png; sourceTree = ""; }; 89 | 03677B960E3A45C500524B59 /* slideshow.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = slideshow.png; sourceTree = ""; }; 90 | 03677B970E3A45C500524B59 /* trash.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = trash.png; sourceTree = ""; }; 91 | 03677B980E3A45C500524B59 /* remove.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = remove.png; sourceTree = ""; }; 92 | 03677B990E3A45C500524B59 /* fullscreen.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = fullscreen.png; sourceTree = ""; }; 93 | 03677B9A0E3A45C500524B59 /* left.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = left.png; sourceTree = ""; }; 94 | 03677B9B0E3A45C500524B59 /* flag.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = flag.png; sourceTree = ""; }; 95 | 03677B9C0E3A45C500524B59 /* folder.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = folder.png; sourceTree = ""; }; 96 | 03677B9D0E3A45C600524B59 /* add.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = add.png; sourceTree = ""; }; 97 | 0367A7F90C56CA6600BD57E8 /* IOKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = IOKit.framework; path = /System/Library/Frameworks/IOKit.framework; sourceTree = ""; }; 98 | 036D55110C712BFC004A8236 /* HIDRemoteControlDevice.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = HIDRemoteControlDevice.h; sourceTree = ""; }; 99 | 036D55120C712BFC004A8236 /* HIDRemoteControlDevice.m */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.objc; path = HIDRemoteControlDevice.m; sourceTree = ""; }; 100 | 036D55150C712C1B004A8236 /* RemoteControl.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = RemoteControl.h; sourceTree = ""; }; 101 | 036D55160C712C1B004A8236 /* RemoteControl.m */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.objc; path = RemoteControl.m; sourceTree = ""; }; 102 | 036D5C2E0C7269D0004A8236 /* Carbon.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Carbon.framework; path = /System/Library/Frameworks/Carbon.framework; sourceTree = ""; }; 103 | 037D95D30DCDD8BB00E8DEB7 /* English */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = English; path = English.lproj/MainMenu.xib; sourceTree = ""; }; 104 | 037D96170DCDDDCF00E8DEB7 /* AppDelegate+Toolbar.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "AppDelegate+Toolbar.h"; sourceTree = ""; }; 105 | 037D96180DCDDDCF00E8DEB7 /* AppDelegate+Toolbar.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "AppDelegate+Toolbar.m"; sourceTree = ""; }; 106 | 037F66C11008E7FD0071E2A9 /* UserDefaults.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = UserDefaults.plist; sourceTree = ""; }; 107 | 037F672A1008EDA90071E2A9 /* English */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.strings; name = English; path = English.lproj/Localizable.strings; sourceTree = ""; }; 108 | 037F67341008EDB60071E2A9 /* French */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = French; path = French.lproj/Localizable.strings; sourceTree = ""; }; 109 | 037F67A11008F41E0071E2A9 /* French */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = French; path = French.lproj/MainMenu.xib; sourceTree = ""; }; 110 | 037F69C0100A29BC0071E2A9 /* Sparkle.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; path = Sparkle.framework; sourceTree = ""; }; 111 | 037F6B26100A34130071E2A9 /* css_dsa_pub.pem */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = css_dsa_pub.pem; sourceTree = ""; }; 112 | 039B5A570ECE281600D7C02C /* CSSMapController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CSSMapController.h; sourceTree = ""; }; 113 | 039B5A580ECE281600D7C02C /* CSSMapController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CSSMapController.m; sourceTree = ""; }; 114 | 03A122E10EC224F60076DF63 /* CSSImageView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CSSImageView.h; sourceTree = ""; }; 115 | 03A122E20EC224F60076DF63 /* CSSImageView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CSSImageView.m; sourceTree = ""; }; 116 | 03A126B00EC2496C0076DF63 /* WebKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = WebKit.framework; path = /System/Library/Frameworks/WebKit.framework; sourceTree = ""; }; 117 | 03A127EA0EC252140076DF63 /* gmap.html */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.html; path = gmap.html; sourceTree = ""; }; 118 | 03A3F43F0C77D97E009AD69D /* CSSWindow.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = CSSWindow.h; sourceTree = ""; }; 119 | 03A3F4400C77D97E009AD69D /* CSSWindow.m */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.objc; path = CSSWindow.m; sourceTree = ""; }; 120 | 03A3F55B0C786878009AD69D /* CocoaSlideShow.icns */ = {isa = PBXFileReference; lastKnownFileType = image.icns; path = CocoaSlideShow.icns; sourceTree = ""; }; 121 | 03B1BB0F0C5173B40032C03F /* AppDelegate.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = AppDelegate.h; sourceTree = ""; }; 122 | 03B1BB100C5173B40032C03F /* AppDelegate.m */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.objc; path = AppDelegate.m; sourceTree = ""; }; 123 | 03C710BC100BA1CE0050FA48 /* CSSBorderlessWindow.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CSSBorderlessWindow.h; sourceTree = ""; }; 124 | 03C710BD100BA1CE0050FA48 /* CSSBorderlessWindow.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CSSBorderlessWindow.m; sourceTree = ""; }; 125 | 03DA06460C805F0B009D508F /* CSSImageInfo.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CSSImageInfo.h; sourceTree = ""; }; 126 | 03DA06470C805F0B009D508F /* CSSImageInfo.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CSSImageInfo.m; sourceTree = ""; }; 127 | 089C165DFE840E0CC02AAC07 /* English */ = {isa = PBXFileReference; fileEncoding = 10; lastKnownFileType = text.plist.strings; name = English; path = English.lproj/InfoPlist.strings; sourceTree = ""; }; 128 | 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Cocoa.framework; path = /System/Library/Frameworks/Cocoa.framework; sourceTree = ""; }; 129 | 13E42FB307B3F0F600E4EEF1 /* CoreData.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreData.framework; path = /System/Library/Frameworks/CoreData.framework; sourceTree = ""; }; 130 | 29B97316FDCFA39411CA2CEA /* main.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; }; 131 | 29B97324FDCFA39411CA2CEA /* AppKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AppKit.framework; path = /System/Library/Frameworks/AppKit.framework; sourceTree = ""; }; 132 | 29B97325FDCFA39411CA2CEA /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = /System/Library/Frameworks/Foundation.framework; sourceTree = ""; }; 133 | 32CA4F630368D1EE00C91783 /* CocoaSlideShow_Prefix.pch */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CocoaSlideShow_Prefix.pch; sourceTree = ""; }; 134 | 5F4535E5135C5BD400CC3980 /* Quartz.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Quartz.framework; path = System/Library/Frameworks/Quartz.framework; sourceTree = SDKROOT; }; 135 | 8D1107310486CEB800E47090 /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist; path = Info.plist; sourceTree = ""; }; 136 | 8D1107320486CEB800E47090 /* CocoaSlideShow.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = CocoaSlideShow.app; sourceTree = BUILT_PRODUCTS_DIR; }; 137 | /* End PBXFileReference section */ 138 | 139 | /* Begin PBXFrameworksBuildPhase section */ 140 | 8D11072E0486CEB800E47090 /* Frameworks */ = { 141 | isa = PBXFrameworksBuildPhase; 142 | buildActionMask = 2147483647; 143 | files = ( 144 | 8D11072F0486CEB800E47090 /* Cocoa.framework in Frameworks */, 145 | 0367A7FA0C56CA6600BD57E8 /* IOKit.framework in Frameworks */, 146 | 036D5C2F0C7269D0004A8236 /* Carbon.framework in Frameworks */, 147 | 03A126B10EC2496C0076DF63 /* WebKit.framework in Frameworks */, 148 | 037F69C1100A29BC0071E2A9 /* Sparkle.framework in Frameworks */, 149 | 037F6A21100A2BA00071E2A9 /* Sparkle.framework in Frameworks */, 150 | 5F4535E6135C5BD400CC3980 /* Quartz.framework in Frameworks */, 151 | 034F0B2D138EE5D000A98D10 /* Epeg.framework in Frameworks */, 152 | ); 153 | runOnlyForDeploymentPostprocessing = 0; 154 | }; 155 | /* End PBXFrameworksBuildPhase section */ 156 | 157 | /* Begin PBXGroup section */ 158 | 031AD9AA0DBF854D00799D5C /* Remote Control */ = { 159 | isa = PBXGroup; 160 | children = ( 161 | 036D55110C712BFC004A8236 /* HIDRemoteControlDevice.h */, 162 | 036D55120C712BFC004A8236 /* HIDRemoteControlDevice.m */, 163 | 032F08190C542D820037F590 /* AppleRemote.h */, 164 | 032F081A0C542D820037F590 /* AppleRemote.m */, 165 | 036D55150C712C1B004A8236 /* RemoteControl.h */, 166 | 036D55160C712C1B004A8236 /* RemoteControl.m */, 167 | ); 168 | name = "Remote Control"; 169 | sourceTree = ""; 170 | }; 171 | 080E96DDFE201D6D7F000001 /* Classes */ = { 172 | isa = PBXGroup; 173 | children = ( 174 | 031AD9AA0DBF854D00799D5C /* Remote Control */, 175 | 03A122E10EC224F60076DF63 /* CSSImageView.h */, 176 | 03A122E20EC224F60076DF63 /* CSSImageView.m */, 177 | 03A3F43F0C77D97E009AD69D /* CSSWindow.h */, 178 | 03A3F4400C77D97E009AD69D /* CSSWindow.m */, 179 | 03DA06460C805F0B009D508F /* CSSImageInfo.h */, 180 | 03DA06470C805F0B009D508F /* CSSImageInfo.m */, 181 | 033804220C86084300439E5A /* ImagesController.h */, 182 | 033804230C86084300439E5A /* ImagesController.m */, 183 | 03B1BB0F0C5173B40032C03F /* AppDelegate.h */, 184 | 03B1BB100C5173B40032C03F /* AppDelegate.m */, 185 | 037D96170DCDDDCF00E8DEB7 /* AppDelegate+Toolbar.h */, 186 | 037D96180DCDDDCF00E8DEB7 /* AppDelegate+Toolbar.m */, 187 | 039B5A570ECE281600D7C02C /* CSSMapController.h */, 188 | 039B5A580ECE281600D7C02C /* CSSMapController.m */, 189 | 0304615F0C75158100D70803 /* NSFileManager+CSS.h */, 190 | 030461600C75158100D70803 /* NSFileManager+CSS.m */, 191 | 03458E580C81CA5300385D93 /* NSString+CSS.h */, 192 | 03458E590C81CA5300385D93 /* NSString+CSS.m */, 193 | 033F91E11012ACF8004AEBA0 /* NSImage+CSS.h */, 194 | 033F91E21012ACF8004AEBA0 /* NSImage+CSS.m */, 195 | 03C710BC100BA1CE0050FA48 /* CSSBorderlessWindow.h */, 196 | 03C710BD100BA1CE0050FA48 /* CSSBorderlessWindow.m */, 197 | ); 198 | name = Classes; 199 | sourceTree = ""; 200 | }; 201 | 1058C7A0FEA54F0111CA2CBB /* Linked Frameworks */ = { 202 | isa = PBXGroup; 203 | children = ( 204 | 034F0B2C138EE5D000A98D10 /* Epeg.framework */, 205 | 037F69C0100A29BC0071E2A9 /* Sparkle.framework */, 206 | 03A126B00EC2496C0076DF63 /* WebKit.framework */, 207 | 036D5C2E0C7269D0004A8236 /* Carbon.framework */, 208 | 0367A7F90C56CA6600BD57E8 /* IOKit.framework */, 209 | 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */, 210 | 5F4535E5135C5BD400CC3980 /* Quartz.framework */, 211 | ); 212 | name = "Linked Frameworks"; 213 | sourceTree = ""; 214 | }; 215 | 1058C7A2FEA54F0111CA2CBB /* Other Frameworks */ = { 216 | isa = PBXGroup; 217 | children = ( 218 | 29B97324FDCFA39411CA2CEA /* AppKit.framework */, 219 | 13E42FB307B3F0F600E4EEF1 /* CoreData.framework */, 220 | 29B97325FDCFA39411CA2CEA /* Foundation.framework */, 221 | ); 222 | name = "Other Frameworks"; 223 | sourceTree = ""; 224 | }; 225 | 19C28FACFE9D520D11CA2CBB /* Products */ = { 226 | isa = PBXGroup; 227 | children = ( 228 | 8D1107320486CEB800E47090 /* CocoaSlideShow.app */, 229 | ); 230 | name = Products; 231 | sourceTree = ""; 232 | }; 233 | 29B97314FDCFA39411CA2CEA /* CocoaSlideShow */ = { 234 | isa = PBXGroup; 235 | children = ( 236 | 080E96DDFE201D6D7F000001 /* Classes */, 237 | 29B97315FDCFA39411CA2CEA /* Other Sources */, 238 | 29B97317FDCFA39411CA2CEA /* Resources */, 239 | 29B97323FDCFA39411CA2CEA /* Frameworks */, 240 | 19C28FACFE9D520D11CA2CBB /* Products */, 241 | ); 242 | name = CocoaSlideShow; 243 | sourceTree = ""; 244 | }; 245 | 29B97315FDCFA39411CA2CEA /* Other Sources */ = { 246 | isa = PBXGroup; 247 | children = ( 248 | 32CA4F630368D1EE00C91783 /* CocoaSlideShow_Prefix.pch */, 249 | 29B97316FDCFA39411CA2CEA /* main.m */, 250 | ); 251 | name = "Other Sources"; 252 | sourceTree = ""; 253 | }; 254 | 29B97317FDCFA39411CA2CEA /* Resources */ = { 255 | isa = PBXGroup; 256 | children = ( 257 | 037F6B26100A34130071E2A9 /* css_dsa_pub.pem */, 258 | 034FC8770EBFB09C00BE42CA /* gmap.png */, 259 | 03677B950E3A45C500524B59 /* right.png */, 260 | 03677B960E3A45C500524B59 /* slideshow.png */, 261 | 03677B970E3A45C500524B59 /* trash.png */, 262 | 03677B980E3A45C500524B59 /* remove.png */, 263 | 03677B990E3A45C500524B59 /* fullscreen.png */, 264 | 03677B9A0E3A45C500524B59 /* left.png */, 265 | 03677B9B0E3A45C500524B59 /* flag.png */, 266 | 03677B9C0E3A45C500524B59 /* folder.png */, 267 | 03677B9D0E3A45C600524B59 /* add.png */, 268 | 034CA91B0DEB72CD00460991 /* Flagged.png */, 269 | 034CA91C0DEB72CD00460991 /* FlaggedHeader.png */, 270 | 03A3F55B0C786878009AD69D /* CocoaSlideShow.icns */, 271 | 030463F00C75347700D70803 /* Credits.html */, 272 | 8D1107310486CEB800E47090 /* Info.plist */, 273 | 037D95D20DCDD8BB00E8DEB7 /* MainMenu.xib */, 274 | 089C165CFE840E0CC02AAC07 /* InfoPlist.strings */, 275 | 03A127EA0EC252140076DF63 /* gmap.html */, 276 | 037F66C11008E7FD0071E2A9 /* UserDefaults.plist */, 277 | 037F672C1008EDAE0071E2A9 /* Localizable.strings */, 278 | ); 279 | name = Resources; 280 | sourceTree = ""; 281 | }; 282 | 29B97323FDCFA39411CA2CEA /* Frameworks */ = { 283 | isa = PBXGroup; 284 | children = ( 285 | 1058C7A0FEA54F0111CA2CBB /* Linked Frameworks */, 286 | 1058C7A2FEA54F0111CA2CBB /* Other Frameworks */, 287 | ); 288 | name = Frameworks; 289 | sourceTree = ""; 290 | }; 291 | /* End PBXGroup section */ 292 | 293 | /* Begin PBXNativeTarget section */ 294 | 8D1107260486CEB800E47090 /* CocoaSlideShow */ = { 295 | isa = PBXNativeTarget; 296 | buildConfigurationList = C01FCF4A08A954540054247B /* Build configuration list for PBXNativeTarget "CocoaSlideShow" */; 297 | buildPhases = ( 298 | 8D11072C0486CEB800E47090 /* Sources */, 299 | 8D11072E0486CEB800E47090 /* Frameworks */, 300 | 8D1107290486CEB800E47090 /* Resources */, 301 | 037F6A2B100A2BB60071E2A9 /* Copy Frameworks */, 302 | ); 303 | buildRules = ( 304 | ); 305 | dependencies = ( 306 | ); 307 | name = CocoaSlideShow; 308 | productInstallPath = "$(HOME)/Applications"; 309 | productName = CocoaSlideShow; 310 | productReference = 8D1107320486CEB800E47090 /* CocoaSlideShow.app */; 311 | productType = "com.apple.product-type.application"; 312 | }; 313 | /* End PBXNativeTarget section */ 314 | 315 | /* Begin PBXProject section */ 316 | 29B97313FDCFA39411CA2CEA /* Project object */ = { 317 | isa = PBXProject; 318 | buildConfigurationList = C01FCF4E08A954540054247B /* Build configuration list for PBXProject "CocoaSlideShow" */; 319 | compatibilityVersion = "Xcode 2.4"; 320 | developmentRegion = English; 321 | hasScannedForEncodings = 1; 322 | knownRegions = ( 323 | English, 324 | Japanese, 325 | French, 326 | German, 327 | ); 328 | mainGroup = 29B97314FDCFA39411CA2CEA /* CocoaSlideShow */; 329 | projectDirPath = ""; 330 | projectRoot = ""; 331 | targets = ( 332 | 8D1107260486CEB800E47090 /* CocoaSlideShow */, 333 | ); 334 | }; 335 | /* End PBXProject section */ 336 | 337 | /* Begin PBXResourcesBuildPhase section */ 338 | 8D1107290486CEB800E47090 /* Resources */ = { 339 | isa = PBXResourcesBuildPhase; 340 | buildActionMask = 2147483647; 341 | files = ( 342 | 8D11072B0486CEB800E47090 /* InfoPlist.strings in Resources */, 343 | 030463F10C75347700D70803 /* Credits.html in Resources */, 344 | 03A3F55C0C786878009AD69D /* CocoaSlideShow.icns in Resources */, 345 | 037D95D40DCDD8BB00E8DEB7 /* MainMenu.xib in Resources */, 346 | 034CA91D0DEB72CD00460991 /* Flagged.png in Resources */, 347 | 034CA91E0DEB72CD00460991 /* FlaggedHeader.png in Resources */, 348 | 03677B9E0E3A45C600524B59 /* right.png in Resources */, 349 | 03677B9F0E3A45C600524B59 /* slideshow.png in Resources */, 350 | 03677BA00E3A45C600524B59 /* trash.png in Resources */, 351 | 03677BA10E3A45C600524B59 /* remove.png in Resources */, 352 | 03677BA20E3A45C600524B59 /* fullscreen.png in Resources */, 353 | 03677BA30E3A45C600524B59 /* left.png in Resources */, 354 | 03677BA40E3A45C600524B59 /* flag.png in Resources */, 355 | 03677BA50E3A45C600524B59 /* folder.png in Resources */, 356 | 03677BA60E3A45C600524B59 /* add.png in Resources */, 357 | 034FC8780EBFB09C00BE42CA /* gmap.png in Resources */, 358 | 03A127EB0EC252140076DF63 /* gmap.html in Resources */, 359 | 037F66C21008E7FD0071E2A9 /* UserDefaults.plist in Resources */, 360 | 037F672D1008EDAE0071E2A9 /* Localizable.strings in Resources */, 361 | 037F6B27100A34130071E2A9 /* css_dsa_pub.pem in Resources */, 362 | ); 363 | runOnlyForDeploymentPostprocessing = 0; 364 | }; 365 | /* End PBXResourcesBuildPhase section */ 366 | 367 | /* Begin PBXSourcesBuildPhase section */ 368 | 8D11072C0486CEB800E47090 /* Sources */ = { 369 | isa = PBXSourcesBuildPhase; 370 | buildActionMask = 2147483647; 371 | files = ( 372 | 8D11072D0486CEB800E47090 /* main.m in Sources */, 373 | 03B1BB110C5173B40032C03F /* AppDelegate.m in Sources */, 374 | 032F081B0C542D820037F590 /* AppleRemote.m in Sources */, 375 | 036D55130C712BFC004A8236 /* HIDRemoteControlDevice.m in Sources */, 376 | 036D55170C712C1B004A8236 /* RemoteControl.m in Sources */, 377 | 030461610C75158100D70803 /* NSFileManager+CSS.m in Sources */, 378 | 03A3F4410C77D97E009AD69D /* CSSWindow.m in Sources */, 379 | 03DA06480C805F0B009D508F /* CSSImageInfo.m in Sources */, 380 | 03458E5A0C81CA5300385D93 /* NSString+CSS.m in Sources */, 381 | 033804240C86084300439E5A /* ImagesController.m in Sources */, 382 | 037D96190DCDDDCF00E8DEB7 /* AppDelegate+Toolbar.m in Sources */, 383 | 03A122E30EC224F60076DF63 /* CSSImageView.m in Sources */, 384 | 039B5A590ECE281600D7C02C /* CSSMapController.m in Sources */, 385 | 03C710BE100BA1CE0050FA48 /* CSSBorderlessWindow.m in Sources */, 386 | 033F91E31012ACF8004AEBA0 /* NSImage+CSS.m in Sources */, 387 | ); 388 | runOnlyForDeploymentPostprocessing = 0; 389 | }; 390 | /* End PBXSourcesBuildPhase section */ 391 | 392 | /* Begin PBXVariantGroup section */ 393 | 037D95D20DCDD8BB00E8DEB7 /* MainMenu.xib */ = { 394 | isa = PBXVariantGroup; 395 | children = ( 396 | 037D95D30DCDD8BB00E8DEB7 /* English */, 397 | 037F67A11008F41E0071E2A9 /* French */, 398 | ); 399 | name = MainMenu.xib; 400 | sourceTree = ""; 401 | }; 402 | 037F672C1008EDAE0071E2A9 /* Localizable.strings */ = { 403 | isa = PBXVariantGroup; 404 | children = ( 405 | 037F672A1008EDA90071E2A9 /* English */, 406 | 037F67341008EDB60071E2A9 /* French */, 407 | ); 408 | name = Localizable.strings; 409 | sourceTree = ""; 410 | }; 411 | 089C165CFE840E0CC02AAC07 /* InfoPlist.strings */ = { 412 | isa = PBXVariantGroup; 413 | children = ( 414 | 089C165DFE840E0CC02AAC07 /* English */, 415 | ); 416 | name = InfoPlist.strings; 417 | sourceTree = ""; 418 | }; 419 | /* End PBXVariantGroup section */ 420 | 421 | /* Begin XCBuildConfiguration section */ 422 | C01FCF4B08A954540054247B /* Debug */ = { 423 | isa = XCBuildConfiguration; 424 | buildSettings = { 425 | ARCHS = "$(ARCHS_STANDARD_32_BIT_PRE_XCODE_3_1)"; 426 | ARCHS_STANDARD_32_BIT_PRE_XCODE_3_1 = "ppc i386"; 427 | FRAMEWORK_SEARCH_PATHS = ( 428 | "$(inherited)", 429 | "$(FRAMEWORK_SEARCH_PATHS_QUOTED_FOR_TARGET_1)", 430 | "$(FRAMEWORK_SEARCH_PATHS_QUOTED_FOR_TARGET_2)", 431 | "$(FRAMEWORK_SEARCH_PATHS_QUOTED_FOR_TARGET_3)", 432 | "$(FRAMEWORK_SEARCH_PATHS_QUOTED_FOR_TARGET_4)", 433 | ); 434 | FRAMEWORK_SEARCH_PATHS_QUOTED_FOR_TARGET_1 = "\"$(SDKROOT)$(SYSTEM_LIBRARY_DIR)/PrivateFrameworks\""; 435 | FRAMEWORK_SEARCH_PATHS_QUOTED_FOR_TARGET_2 = "\"$(SRCROOT)\""; 436 | FRAMEWORK_SEARCH_PATHS_QUOTED_FOR_TARGET_3 = "\"$(SRCROOT)\""; 437 | FRAMEWORK_SEARCH_PATHS_QUOTED_FOR_TARGET_4 = "\"$(SRCROOT)\""; 438 | GCC_DYNAMIC_NO_PIC = NO; 439 | GCC_ENABLE_FIX_AND_CONTINUE = YES; 440 | GCC_MODEL_TUNING = G5; 441 | GCC_OPTIMIZATION_LEVEL = 0; 442 | INFOPLIST_FILE = Info.plist; 443 | INSTALL_PATH = "$(HOME)/Applications"; 444 | MACOSX_DEPLOYMENT_TARGET = 10.7; 445 | PRODUCT_NAME = CocoaSlideShow; 446 | SDKROOT = macosx10.7; 447 | WRAPPER_EXTENSION = app; 448 | ZERO_LINK = YES; 449 | }; 450 | name = Debug; 451 | }; 452 | C01FCF4C08A954540054247B /* Release */ = { 453 | isa = XCBuildConfiguration; 454 | buildSettings = { 455 | ARCHS = "$(ARCHS_STANDARD_32_BIT_PRE_XCODE_3_1)"; 456 | ARCHS_STANDARD_32_BIT_PRE_XCODE_3_1 = "ppc i386"; 457 | FRAMEWORK_SEARCH_PATHS = ( 458 | "$(inherited)", 459 | "$(FRAMEWORK_SEARCH_PATHS_QUOTED_FOR_TARGET_1)", 460 | "$(FRAMEWORK_SEARCH_PATHS_QUOTED_FOR_TARGET_2)", 461 | "$(FRAMEWORK_SEARCH_PATHS_QUOTED_FOR_TARGET_3)", 462 | "$(FRAMEWORK_SEARCH_PATHS_QUOTED_FOR_TARGET_4)", 463 | ); 464 | FRAMEWORK_SEARCH_PATHS_QUOTED_FOR_TARGET_1 = "\"$(SDKROOT)$(SYSTEM_LIBRARY_DIR)/PrivateFrameworks\""; 465 | FRAMEWORK_SEARCH_PATHS_QUOTED_FOR_TARGET_2 = "\"$(SRCROOT)\""; 466 | FRAMEWORK_SEARCH_PATHS_QUOTED_FOR_TARGET_3 = "\"$(SRCROOT)\""; 467 | FRAMEWORK_SEARCH_PATHS_QUOTED_FOR_TARGET_4 = "\"$(SRCROOT)\""; 468 | GCC_GENERATE_DEBUGGING_SYMBOLS = NO; 469 | GCC_MODEL_TUNING = G5; 470 | INFOPLIST_FILE = Info.plist; 471 | INSTALL_PATH = "$(HOME)/Applications"; 472 | MACOSX_DEPLOYMENT_TARGET = 10.7; 473 | PRODUCT_NAME = CocoaSlideShow; 474 | SDKROOT = macosx10.7; 475 | WRAPPER_EXTENSION = app; 476 | }; 477 | name = Release; 478 | }; 479 | C01FCF4F08A954540054247B /* Debug */ = { 480 | isa = XCBuildConfiguration; 481 | buildSettings = { 482 | ARCHS = "$(ONLY_ACTIVE_ARCH_PRE_XCODE_3_1)"; 483 | GCC_ENABLE_OBJC_EXCEPTIONS = YES; 484 | GCC_VERSION = ""; 485 | GCC_WARN_ABOUT_RETURN_TYPE = YES; 486 | GCC_WARN_UNUSED_PARAMETER = NO; 487 | GCC_WARN_UNUSED_VALUE = NO; 488 | GCC_WARN_UNUSED_VARIABLE = YES; 489 | MACOSX_DEPLOYMENT_TARGET = 10.7; 490 | ONLY_ACTIVE_ARCH_PRE_XCODE_3_1 = "$(NATIVE_ARCH_ACTUAL)"; 491 | PREBINDING = NO; 492 | SDKROOT = macosx10.7; 493 | WARNING_CFLAGS = "-Wunreachable-code"; 494 | }; 495 | name = Debug; 496 | }; 497 | C01FCF5008A954540054247B /* Release */ = { 498 | isa = XCBuildConfiguration; 499 | buildSettings = { 500 | ARCHS = "$(ARCHS_STANDARD_32_64_BIT_PRE_XCODE_3_1)"; 501 | ARCHS_STANDARD_32_64_BIT_PRE_XCODE_3_1 = "x86_64 i386 ppc"; 502 | GCC_ENABLE_OBJC_EXCEPTIONS = YES; 503 | GCC_VERSION = ""; 504 | GCC_WARN_ABOUT_RETURN_TYPE = YES; 505 | GCC_WARN_UNUSED_VARIABLE = YES; 506 | MACOSX_DEPLOYMENT_TARGET = 10.7; 507 | PREBINDING = NO; 508 | SDKROOT = macosx10.7; 509 | }; 510 | name = Release; 511 | }; 512 | /* End XCBuildConfiguration section */ 513 | 514 | /* Begin XCConfigurationList section */ 515 | C01FCF4A08A954540054247B /* Build configuration list for PBXNativeTarget "CocoaSlideShow" */ = { 516 | isa = XCConfigurationList; 517 | buildConfigurations = ( 518 | C01FCF4C08A954540054247B /* Release */, 519 | C01FCF4B08A954540054247B /* Debug */, 520 | ); 521 | defaultConfigurationIsVisible = 0; 522 | defaultConfigurationName = Debug; 523 | }; 524 | C01FCF4E08A954540054247B /* Build configuration list for PBXProject "CocoaSlideShow" */ = { 525 | isa = XCConfigurationList; 526 | buildConfigurations = ( 527 | C01FCF5008A954540054247B /* Release */, 528 | C01FCF4F08A954540054247B /* Debug */, 529 | ); 530 | defaultConfigurationIsVisible = 0; 531 | defaultConfigurationName = Debug; 532 | }; 533 | /* End XCConfigurationList section */ 534 | }; 535 | rootObject = 29B97313FDCFA39411CA2CEA /* Project object */; 536 | } 537 | --------------------------------------------------------------------------------