mirror of
https://github.com/cappuccino/cappuccino.git
synced 2026-10-06 09:02:50 +00:00
Merge xcodecapp-cocoa
This commit is contained in:
1 parent
64f9309994
commit
45a5eed62f
38 files changed
+8229
No files matched your search
@@ -0,0 +1,2 @@
|
||||
xcodecapp-cocoa.xcodeproj/project.xcworkspace/xcuserdata/Tonio.xcuserdatad
|
||||
*xcodecapp-cocoa.xcodeproj/project.xcworkspace/xcuserdata/**
|
||||
@@ -0,0 +1,78 @@
|
||||
/*
|
||||
* xcodecapp-cocoa.sh
|
||||
*
|
||||
* Copyright (C) 2010 Antoine Mercadal <antoine.mercadal@inframonde.eu>
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Affero General Public License as
|
||||
* published by the Free Software Foundation, either version 3 of the
|
||||
* License, or (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Affero General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Affero General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#import <Cocoa/Cocoa.h>
|
||||
#import <Growl/Growl.h>
|
||||
|
||||
@interface AppController : NSObject
|
||||
{
|
||||
IBOutlet NSTextField *labelStatus;
|
||||
IBOutlet NSTextField *labelPath;
|
||||
IBOutlet NSTextField *labelCurrentPath;
|
||||
IBOutlet NSButton *buttonOpenXCode;
|
||||
IBOutlet NSButton *buttonStart;
|
||||
IBOutlet NSButton *buttonStop;
|
||||
IBOutlet NSProgressIndicator *spinner;
|
||||
IBOutlet NSWindow *mainWindow;
|
||||
IBOutlet NSMenu *statusMenu;
|
||||
IBOutlet NSMenuItem *menuItemStart;
|
||||
IBOutlet NSMenuItem *menuItemStop;
|
||||
IBOutlet NSMenuItem *menuItemOpenXCode;
|
||||
|
||||
NSFileManager *fm;
|
||||
NSMutableArray *modifiedSources;
|
||||
NSMutableArray *modifiedXIBs;
|
||||
NSMutableDictionary *pathModificationDates;
|
||||
NSDate *appStartedTimestamp;
|
||||
NSNumber *lastEventId;
|
||||
NSURL *currentProjectURL;
|
||||
NSString *currentProjectName;
|
||||
FSEventStreamRef stream;
|
||||
NSString *XCodeSupportProjectName;
|
||||
NSString *XCodeTemplatePBXPath;
|
||||
NSURL *XCodeSupportFolder;
|
||||
NSURL *XCodeSupportProject;
|
||||
NSURL *XCodeSupportProjectSources;
|
||||
NSString *XCodeSupportPBXPath;
|
||||
NSString *parserPath;
|
||||
NSMutableArray *ignoredFilePaths;
|
||||
NSImage *_iconInactive;
|
||||
NSImage *_iconActive;
|
||||
NSStatusItem *_statusItem;
|
||||
NSString *_profilePath;
|
||||
}
|
||||
|
||||
- (void)registerDefaults;
|
||||
- (void)initializeEventStreamWithPath:(NSString*)aPath;
|
||||
- (void)handleFileModification:(NSString*)path ignoreDate:(BOOL)shouldIgnoreDate;
|
||||
- (void)updateLastEventId:(uint64_t)eventId;
|
||||
- (BOOL)isObjJFile:(NSString*)path;
|
||||
- (BOOL)isXIBFile:(NSString *)path;
|
||||
- (NSURL*)shadowURLForSourceURL:(NSURL*)aSourceURL;
|
||||
- (BOOL)prepareXCodeSupportProject;
|
||||
- (BOOL)isPathMatchingIgnoredPaths:(NSString*)aPath;
|
||||
|
||||
- (BOOL)applicationShouldHandleReopen:(NSApplication *)theApplication hasVisibleWindows:(BOOL)flag;
|
||||
|
||||
- (IBAction)chooseFolder:(id)aSender;
|
||||
- (IBAction)stopListener:(id)aSender;
|
||||
- (IBAction)openXCode:(id)aSender;
|
||||
- (BOOL)validateMenuItem:(NSMenuItem*)menuItem;
|
||||
|
||||
@end
|
||||
|
||||
@@ -0,0 +1,472 @@
|
||||
/*
|
||||
* xcodecapp-cocoa.sh
|
||||
*
|
||||
* Copyright (C) 2010 Antoine Mercadal <antoine.mercadal@inframonde.eu>
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Affero General Public License as
|
||||
* published by the Free Software Foundation, either version 3 of the
|
||||
* License, or (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Affero General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Affero General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
|
||||
#import "AppController.h"
|
||||
|
||||
void fsevents_callback(ConstFSEventStreamRef streamRef, void *userData, size_t numEvents,
|
||||
void *eventPaths, const FSEventStreamEventFlags eventFlags[], const FSEventStreamEventId eventIds[])
|
||||
{
|
||||
AppController *ac = (AppController *)userData;
|
||||
size_t i;
|
||||
for(i = 0; i < numEvents; i++)
|
||||
{
|
||||
[ac handleFileModification:[(NSArray *)eventPaths objectAtIndex:i] ignoreDate:NO];
|
||||
[ac updateLastEventId:eventIds[i]];
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
@implementation AppController
|
||||
|
||||
#pragma mark -
|
||||
#pragma mark Initialization
|
||||
|
||||
- (id)init
|
||||
{
|
||||
self = [super init];
|
||||
|
||||
if (self)
|
||||
{
|
||||
[GrowlApplicationBridge setGrowlDelegate:@""];
|
||||
|
||||
fm = [NSFileManager defaultManager];
|
||||
modifiedSources = [NSMutableArray new];
|
||||
modifiedXIBs = [NSMutableArray new];
|
||||
ignoredFilePaths = [NSMutableArray new];
|
||||
parserPath = [[NSBundle mainBundle] pathForResource:@"parser" ofType:@"j"];
|
||||
|
||||
if([fm fileExistsAtPath:[@"~/.bash_profile" stringByExpandingTildeInPath]])
|
||||
_profilePath = @"~/.bash_profile";
|
||||
else if([fm fileExistsAtPath:[@"~/.profile" stringByExpandingTildeInPath]])
|
||||
_profilePath = @"~/.profile";
|
||||
|
||||
}
|
||||
|
||||
return self;
|
||||
}
|
||||
|
||||
- (void)awakeFromNib
|
||||
{
|
||||
[self registerDefaults];
|
||||
[labelCurrentPath setHidden:YES];
|
||||
[buttonOpenXCode setEnabled:NO];
|
||||
[buttonStop setEnabled:NO];
|
||||
[buttonStart setEnabled:YES];
|
||||
[spinner setHidden:YES];
|
||||
appStartedTimestamp = [NSDate date];
|
||||
pathModificationDates = [[[NSUserDefaults standardUserDefaults] dictionaryForKey:@"pathModificationDates"] mutableCopy];
|
||||
lastEventId = [[NSUserDefaults standardUserDefaults] objectForKey:@"lastEventId"];
|
||||
|
||||
NSBundle *bundle = [NSBundle mainBundle];
|
||||
|
||||
_iconInactive = [[NSImage alloc] initWithContentsOfFile:[bundle pathForResource:@"xcodecapp-cocoa-icon-inactive" ofType:@"png"]];
|
||||
_iconActive = [[NSImage alloc] initWithContentsOfFile:[bundle pathForResource:@"xcodecapp-cocoa-icon-active" ofType:@"png"]];
|
||||
[_iconActive setSize:NSMakeSize(14.0, 16.0)];
|
||||
[_iconInactive setSize:NSMakeSize(14.0, 16.0)];
|
||||
|
||||
_statusItem = [[NSStatusBar systemStatusBar] statusItemWithLength:NSVariableStatusItemLength];
|
||||
[_statusItem setMenu:statusMenu];
|
||||
[_statusItem setImage:_iconInactive];
|
||||
[_statusItem setHighlightMode:YES];
|
||||
[statusMenu setDelegate:self];
|
||||
|
||||
}
|
||||
|
||||
- (void)initializeEventStreamWithPath:(NSString*)aPath
|
||||
{
|
||||
NSArray *pathsToWatch = [NSArray arrayWithObject:aPath];
|
||||
void *appPointer = (void *)self;
|
||||
FSEventStreamContext context = {0, appPointer, NULL, NULL, NULL};
|
||||
NSTimeInterval latency = 3.0;
|
||||
|
||||
stream = FSEventStreamCreate(NULL, &fsevents_callback, &context, (CFArrayRef) pathsToWatch,
|
||||
[lastEventId unsignedLongLongValue], (CFAbsoluteTime) latency,kFSEventStreamCreateFlagUseCFTypes);
|
||||
|
||||
FSEventStreamScheduleWithRunLoop(stream, CFRunLoopGetCurrent(), kCFRunLoopDefaultMode);
|
||||
FSEventStreamStart(stream);
|
||||
}
|
||||
|
||||
- (void)stopEventStream
|
||||
{
|
||||
if (stream)
|
||||
{
|
||||
FSEventStreamStop(stream);
|
||||
FSEventStreamInvalidate(stream);
|
||||
stream = nil;
|
||||
}
|
||||
}
|
||||
|
||||
- (void)registerDefaults
|
||||
{
|
||||
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
|
||||
NSDictionary *appDefaults = [NSDictionary
|
||||
dictionaryWithObjects:[NSArray arrayWithObjects:[NSNumber numberWithUnsignedLongLong:kFSEventStreamEventIdSinceNow], [NSMutableDictionary new], nil]
|
||||
forKeys:[NSArray arrayWithObjects:@"lastEventId", @"pathModificationDates", nil]];
|
||||
[defaults registerDefaults:appDefaults];
|
||||
}
|
||||
|
||||
|
||||
#pragma mark -
|
||||
#pragma mark Notification handlers
|
||||
|
||||
- (NSApplicationTerminateReply)applicationShouldTerminate: (NSApplication *)app
|
||||
{
|
||||
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
|
||||
|
||||
[defaults setObject:lastEventId forKey:@"lastEventId"];
|
||||
[defaults setObject:pathModificationDates forKey:@"pathModificationDates"];
|
||||
[defaults synchronize];
|
||||
|
||||
[self stopEventStream];
|
||||
|
||||
return NSTerminateNow;
|
||||
}
|
||||
|
||||
|
||||
#pragma mark -
|
||||
#pragma mark Utilities
|
||||
|
||||
- (void)updateLastModificationDateForPath: (NSString *)path
|
||||
{
|
||||
[pathModificationDates setObject:[NSDate date] forKey:path];
|
||||
}
|
||||
|
||||
- (NSDate*)lastModificationDateForPath: (NSString *)path
|
||||
{
|
||||
if(nil != [pathModificationDates valueForKey:path])
|
||||
return [pathModificationDates valueForKey:path];
|
||||
else
|
||||
return appStartedTimestamp;
|
||||
}
|
||||
|
||||
- (void)updateLastEventId:(uint64_t)eventId
|
||||
{
|
||||
lastEventId = [NSNumber numberWithUnsignedLongLong:eventId];
|
||||
}
|
||||
|
||||
- (void)handleFileModification:(NSString*)path ignoreDate:(BOOL)shouldIgnoreDate
|
||||
{
|
||||
if ([self isPathMatchingIgnoredPaths:path])
|
||||
return;
|
||||
|
||||
NSArray *contents = [fm contentsOfDirectoryAtPath:path error:NULL];
|
||||
|
||||
for(NSString *node in contents)
|
||||
{
|
||||
NSString *fullPath = [NSString stringWithFormat:@"%@/%@", path, node];
|
||||
NSDictionary *fileAttributes = [fm attributesOfItemAtPath:fullPath error:NULL];
|
||||
NSDate *fileModDate = [fileAttributes objectForKey:NSFileModificationDate];
|
||||
|
||||
if(shouldIgnoreDate || [fileModDate compare:[self lastModificationDateForPath:path]] == NSOrderedDescending)
|
||||
{
|
||||
if ([self isObjJFile:fullPath])
|
||||
[modifiedSources addObject:fullPath];
|
||||
if ([self isXIBFile:fullPath])
|
||||
{
|
||||
[_statusItem setTitle:@"..."];
|
||||
NSLog(@"nib2cib %@", fullPath);
|
||||
int ret = system([[NSString stringWithFormat:@"source %@; nib2cib %@;", _profilePath, fullPath] UTF8String]);
|
||||
[_statusItem setTitle:@""];
|
||||
if (ret == 0)
|
||||
{
|
||||
if (!shouldIgnoreDate)
|
||||
[GrowlApplicationBridge notifyWithTitle:[fullPath lastPathComponent]
|
||||
description:@"The XIB file has been converted"
|
||||
notificationName:@"DefaultNotifications"
|
||||
iconData:nil
|
||||
priority:0
|
||||
isSticky:NO
|
||||
clickContext:nil];
|
||||
|
||||
}
|
||||
else
|
||||
NSLog(@"Error in conversion: return code is %d", ret);
|
||||
}
|
||||
if ([self isObjJFile:fullPath])
|
||||
{
|
||||
NSString *shadowPath = [[self shadowURLForSourceURL:[NSURL URLWithString:fullPath]] path];
|
||||
NSString *command = [NSString stringWithFormat:@"source %@; objj %@ %@ %@;", _profilePath, parserPath, fullPath, shadowPath];
|
||||
|
||||
NSLog(@"%@", command);
|
||||
|
||||
[_statusItem setTitle:@"..."];
|
||||
int ret = system([command UTF8String]);
|
||||
[_statusItem setTitle:@""];
|
||||
|
||||
if (ret == 0)
|
||||
{
|
||||
if (!shouldIgnoreDate)
|
||||
[GrowlApplicationBridge notifyWithTitle:[fullPath lastPathComponent]
|
||||
description:@"The Objective-J file has been converted"
|
||||
notificationName:@"DefaultNotifications"
|
||||
iconData:nil
|
||||
priority:0
|
||||
isSticky:NO
|
||||
clickContext:nil];
|
||||
|
||||
}
|
||||
else
|
||||
NSLog(@"Error in conversion: return code is %d", ret);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
[self updateLastModificationDateForPath:path];
|
||||
}
|
||||
|
||||
- (BOOL)isObjJFile:(NSString *)path
|
||||
{
|
||||
return [[[path pathExtension] uppercaseString] isEqual:@"J"];
|
||||
}
|
||||
|
||||
- (BOOL)isXIBFile:(NSString *)path
|
||||
{
|
||||
return [[[path pathExtension] uppercaseString] isEqual:@"XIB"];
|
||||
}
|
||||
|
||||
- (BOOL)prepareXCodeSupportProject
|
||||
{
|
||||
XCodeSupportProjectName = [NSString stringWithFormat:@"%@.xcodeproj/", currentProjectName];
|
||||
XCodeTemplatePBXPath = [[NSBundle mainBundle] pathForResource:@"project" ofType:@"pbxproj"];
|
||||
XCodeSupportFolder = [NSURL URLWithString:@".xCodeSupport/" relativeToURL:currentProjectURL];
|
||||
XCodeSupportProject = [NSURL URLWithString:XCodeSupportProjectName relativeToURL:XCodeSupportFolder];
|
||||
XCodeSupportProjectSources = [NSURL URLWithString:@"Sources/" relativeToURL:XCodeSupportFolder];
|
||||
XCodeSupportPBXPath = [NSString stringWithFormat:@"%@/project.pbxproj", [XCodeSupportProject path]];
|
||||
|
||||
//[fm removeItemAtURL:XCodeSupportFolder error:nil];
|
||||
|
||||
// create the template project if it doesn't exist
|
||||
if (![fm fileExistsAtPath:[XCodeSupportFolder path]])
|
||||
{
|
||||
NSLog(@"XCode support folder created at: %@", [XCodeSupportProject path]);
|
||||
[fm createDirectoryAtPath:[XCodeSupportProject path] withIntermediateDirectories:YES attributes:nil error:nil];
|
||||
|
||||
NSLog(@"Copying project.pbxproj from %@ to %@", XCodeTemplatePBXPath, [XCodeSupportProject path]);
|
||||
[fm copyItemAtPath:XCodeTemplatePBXPath toPath:XCodeSupportPBXPath error:nil];
|
||||
|
||||
NSLog(@"Reading the content of the project.pbxproj");
|
||||
NSMutableString *PBXContent = [NSMutableString stringWithContentsOfFile:XCodeSupportPBXPath encoding:NSUTF8StringEncoding error:nil];
|
||||
[PBXContent replaceOccurrencesOfString:@"${CappuccinoProjectName}"
|
||||
withString:currentProjectName
|
||||
options:NSCaseInsensitiveSearch
|
||||
range:NSMakeRange(0, [PBXContent length])];
|
||||
[PBXContent replaceOccurrencesOfString:@"${CappuccinoProjectRelativePath}"
|
||||
withString:[currentProjectURL path]
|
||||
options:NSCaseInsensitiveSearch
|
||||
range:NSMakeRange(0, [PBXContent length])];
|
||||
|
||||
[PBXContent writeToFile:XCodeSupportPBXPath atomically:YES encoding:NSUTF8StringEncoding error:nil];
|
||||
NSLog(@"PBX file adapted to the project");
|
||||
|
||||
NSLog(@"Creating source folder");
|
||||
[fm createDirectoryAtPath:[XCodeSupportProjectSources path] withIntermediateDirectories:YES attributes:nil error:nil];
|
||||
|
||||
|
||||
[NSThread detachNewThreadSelector:@selector(populateXCodeProject:)toTarget:self withObject:nil];
|
||||
return NO;
|
||||
}
|
||||
return YES;
|
||||
}
|
||||
|
||||
- (void)populateXCodeProject:(id)argement
|
||||
{
|
||||
[GrowlApplicationBridge notifyWithTitle:[[currentProjectURL path] lastPathComponent]
|
||||
description:@"Loading of your project is running..."
|
||||
notificationName:@"DefaultNotifications"
|
||||
iconData:nil
|
||||
priority:0
|
||||
isSticky:NO
|
||||
clickContext:nil];
|
||||
|
||||
[self handleFileModification:[NSString stringWithFormat:@"%@", [currentProjectURL path]] ignoreDate:YES];
|
||||
NSArray *subdirs = [fm subpathsAtPath:[currentProjectURL path]];
|
||||
for (NSString *p in subdirs)
|
||||
[self handleFileModification:[NSString stringWithFormat:@"%@/%@", [currentProjectURL path], p] ignoreDate:YES];
|
||||
|
||||
[labelStatus setStringValue:@"XCodeCapp is running"];
|
||||
[buttonOpenXCode setEnabled:YES];
|
||||
[buttonStop setEnabled:YES];
|
||||
[buttonStart setEnabled:NO];
|
||||
[spinner setHidden:YES];
|
||||
|
||||
[GrowlApplicationBridge notifyWithTitle:[[currentProjectURL path] lastPathComponent]
|
||||
description:@"Your project has been loaded successfully!"
|
||||
notificationName:@"DefaultNotifications"
|
||||
iconData:nil
|
||||
priority:0
|
||||
isSticky:NO
|
||||
clickContext:nil];
|
||||
|
||||
}
|
||||
|
||||
- (NSURL*)shadowURLForSourceURL:(NSURL*)aSourceURL
|
||||
{
|
||||
NSMutableString *flattenedPath = [NSMutableString stringWithString:[aSourceURL path]];
|
||||
|
||||
[flattenedPath replaceOccurrencesOfString:@"/"
|
||||
withString:@"_"
|
||||
options:NSCaseInsensitiveSearch
|
||||
range:NSMakeRange(0, [[aSourceURL path] length])];
|
||||
|
||||
NSString *basename = [NSString stringWithFormat:@"%@.h", [flattenedPath stringByDeletingPathExtension]];
|
||||
|
||||
return [NSURL URLWithString:basename relativeToURL:XCodeSupportProjectSources];
|
||||
}
|
||||
|
||||
- (void)computeIgnoredPaths
|
||||
{
|
||||
NSString *ignorePath = [NSString stringWithFormat:@"%@/.xcodecapp-ignore", [currentProjectURL path]];
|
||||
|
||||
if (![fm fileExistsAtPath:ignorePath])
|
||||
return;
|
||||
|
||||
NSString *ignoreFileContent = [NSString stringWithContentsOfFile:ignorePath encoding:NSUTF8StringEncoding error:nil];
|
||||
ignoredFilePaths = [NSMutableArray arrayWithArray:[ignoreFileContent componentsSeparatedByString:@"\n"]];
|
||||
|
||||
NSLog(@"ignored file paths are: %@", ignoredFilePaths);
|
||||
}
|
||||
|
||||
- (BOOL)isPathMatchingIgnoredPaths:(NSString*)aPath
|
||||
{
|
||||
BOOL isMatching = NO;
|
||||
|
||||
for (NSString *ignoredPath in ignoredFilePaths)
|
||||
{
|
||||
if ([ignoredPath isEqual:@""])
|
||||
continue;
|
||||
|
||||
NSMutableString *regexp = [NSMutableString stringWithFormat:@"%@/%@", [currentProjectURL path], ignoredPath];
|
||||
[regexp replaceOccurrencesOfString:@"/"
|
||||
withString:@"\\/"
|
||||
options:NSCaseInsensitiveSearch
|
||||
range:NSMakeRange(0, [regexp length])];
|
||||
|
||||
[regexp replaceOccurrencesOfString:@"."
|
||||
withString:@"\\."
|
||||
options:NSCaseInsensitiveSearch
|
||||
range:NSMakeRange(0, [regexp length])];
|
||||
|
||||
[regexp replaceOccurrencesOfString:@"*"
|
||||
withString:@".*"
|
||||
options:NSCaseInsensitiveSearch
|
||||
range:NSMakeRange(0, [regexp length])];
|
||||
|
||||
NSPredicate *regextest = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", regexp];
|
||||
if ([regextest evaluateWithObject:aPath])
|
||||
{
|
||||
isMatching = YES;
|
||||
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
return isMatching;
|
||||
}
|
||||
|
||||
|
||||
#pragma mark -
|
||||
#pragma mark Actions
|
||||
|
||||
- (IBAction)chooseFolder:(id)aSender
|
||||
{
|
||||
NSOpenPanel *openPanel = [NSOpenPanel openPanel];
|
||||
|
||||
[openPanel setCanChooseDirectories:YES];
|
||||
[openPanel setCanCreateDirectories:YES];
|
||||
[openPanel setPrompt:@"Choose Cappuccino project"];
|
||||
[openPanel setCanChooseFiles:NO];
|
||||
|
||||
if ([openPanel runModal] != NSFileHandlingPanelOKButton)
|
||||
return;
|
||||
|
||||
[spinner setHidden:NO];
|
||||
[spinner startAnimation:nil];
|
||||
|
||||
currentProjectURL = [[openPanel URLs] objectAtIndex:0];
|
||||
currentProjectName = [[[openPanel URLs] objectAtIndex:0] lastPathComponent];
|
||||
|
||||
[self computeIgnoredPaths];
|
||||
[self initializeEventStreamWithPath:[currentProjectURL path]];
|
||||
|
||||
BOOL isProjectReady = [self prepareXCodeSupportProject];
|
||||
|
||||
[labelPath setStringValue:[currentProjectURL path]];
|
||||
[labelCurrentPath setHidden:NO];
|
||||
[buttonStart setEnabled:NO];
|
||||
|
||||
if (isProjectReady)
|
||||
{
|
||||
[spinner setHidden:YES];
|
||||
[buttonStop setEnabled:YES];
|
||||
[buttonOpenXCode setEnabled:YES];
|
||||
[labelStatus setStringValue:@"XCodeCapp is running"];
|
||||
}
|
||||
|
||||
else
|
||||
[labelStatus setStringValue:@"XCodeCapp is loading project..."];
|
||||
|
||||
[_statusItem setImage:_iconActive];
|
||||
}
|
||||
|
||||
- (IBAction)stopListener:(id)aSender
|
||||
{
|
||||
currentProjectURL = nil;
|
||||
currentProjectName = nil;
|
||||
[ignoredFilePaths removeAllObjects];
|
||||
[labelPath setStringValue:@""];
|
||||
[labelCurrentPath setHidden:YES];
|
||||
[buttonOpenXCode setEnabled:NO];
|
||||
[buttonStop setEnabled:NO];
|
||||
[buttonStart setEnabled:YES];
|
||||
[labelStatus setStringValue:@"XCodeCapp is not running"];
|
||||
[self stopEventStream];
|
||||
[_statusItem setImage:_iconInactive];
|
||||
}
|
||||
|
||||
- (IBAction)openXCode:(id)aSender
|
||||
{
|
||||
if (!currentProjectURL)
|
||||
return;
|
||||
|
||||
system([[NSString stringWithFormat:@"open %@", [XCodeSupportProject path ]] UTF8String]);
|
||||
}
|
||||
|
||||
|
||||
#pragma mark -
|
||||
#pragma mark Delegates
|
||||
|
||||
- (BOOL)applicationShouldHandleReopen:(NSApplication *)theApplication hasVisibleWindows:(BOOL)flag
|
||||
{
|
||||
[mainWindow makeKeyAndOrderFront:nil];
|
||||
|
||||
return YES;
|
||||
}
|
||||
|
||||
- (BOOL)validateMenuItem:(NSMenuItem*)aMenuItem
|
||||
{
|
||||
if (aMenuItem == menuItemStart)
|
||||
return !currentProjectURL;
|
||||
if ((aMenuItem == menuItemStop) || (aMenuItem == menuItemOpenXCode))
|
||||
return !!currentProjectURL;
|
||||
|
||||
return YES;
|
||||
}
|
||||
|
||||
@end
|
||||
Binary file not shown.
File diff suppressed because it is too large.
Load diff
Binary file not shown.
@@ -0,0 +1,12 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
||||
<plist version="1.0">
|
||||
<dict>
|
||||
<key>TicketVersion</key>
|
||||
<integer>1</integer>
|
||||
<key>AllNotifications</key>
|
||||
<array>
|
||||
<string>DefaultNotifications</string>
|
||||
</array>
|
||||
</dict>
|
||||
</plist>
|
||||
@@ -0,0 +1 @@
|
||||
Versions/Current/Growl
|
||||
@@ -0,0 +1 @@
|
||||
Versions/Current/Headers
|
||||
@@ -0,0 +1 @@
|
||||
Versions/Current/Resources
|
||||
BIN
Binary file not shown.
@@ -0,0 +1,6 @@
|
||||
#include "GrowlDefines.h"
|
||||
|
||||
#ifdef __OBJC__
|
||||
# include "GrowlApplicationBridge.h"
|
||||
#endif
|
||||
#include "GrowlApplicationBridge-Carbon.h"
|
||||
+780
@@ -0,0 +1,780 @@
|
||||
//
|
||||
// GrowlApplicationBridge-Carbon.h
|
||||
// Growl
|
||||
//
|
||||
// Created by Mac-arena the Bored Zo on Wed Jun 18 2004.
|
||||
// Based on GrowlApplicationBridge.h by Evan Schoenberg.
|
||||
// This source code is in the public domain. You may freely link it into any
|
||||
// program.
|
||||
//
|
||||
|
||||
#ifndef _GROWLAPPLICATIONBRIDGE_CARBON_H_
|
||||
#define _GROWLAPPLICATIONBRIDGE_CARBON_H_
|
||||
|
||||
#include <sys/cdefs.h>
|
||||
#include <Carbon/Carbon.h>
|
||||
|
||||
#ifndef GROWL_EXPORT
|
||||
#define GROWL_EXPORT __attribute__((visibility("default"))) DEPRECATED_ATTRIBUTE
|
||||
#endif
|
||||
|
||||
/*! @header GrowlApplicationBridge-Carbon.h
|
||||
* @abstract Declares an API that Carbon applications can use to interact with Growl.
|
||||
* @discussion GrowlApplicationBridge uses a delegate to provide information //XXX
|
||||
* to Growl (such as your application's name and what notifications it may
|
||||
* post) and to provide information to your application (such as that Growl
|
||||
* is listening for notifications or that a notification has been clicked).
|
||||
*
|
||||
* You can set the Growldelegate with Growl_SetDelegate and find out the
|
||||
* current delegate with Growl_GetDelegate. See struct Growl_Delegate for more
|
||||
* information about the delegate.
|
||||
*/
|
||||
|
||||
__BEGIN_DECLS
|
||||
|
||||
/*! @struct Growl_Delegate
|
||||
* @abstract Delegate to supply GrowlApplicationBridge with information and respond to events.
|
||||
* @discussion The Growl delegate provides your interface to
|
||||
* GrowlApplicationBridge. When GrowlApplicationBridge needs information about
|
||||
* your application, it looks for it in the delegate; when Growl or the user
|
||||
* does something that you might be interested in, GrowlApplicationBridge
|
||||
* looks for a callback in the delegate and calls it if present
|
||||
* (meaning, if it is not <code>NULL</code>).
|
||||
* XXX on all of that
|
||||
* @field size The size of the delegate structure.
|
||||
* @field applicationName The name of your application.
|
||||
* @field registrationDictionary A dictionary describing your application and the notifications it can send out.
|
||||
* @field applicationIconData Your application's icon.
|
||||
* @field growlInstallationWindowTitle The title of the installation window.
|
||||
* @field growlInstallationInformation Text to display in the installation window.
|
||||
* @field growlUpdateWindowTitle The title of the update window.
|
||||
* @field growlUpdateInformation Text to display in the update window.
|
||||
* @field referenceCount A count of owners of the delegate.
|
||||
* @field retain Called when GrowlApplicationBridge receives this delegate.
|
||||
* @field release Called when GrowlApplicationBridge no longer needs this delegate.
|
||||
* @field growlIsReady Called when GrowlHelperApp is listening for notifications.
|
||||
* @field growlNotificationWasClicked Called when a Growl notification is clicked.
|
||||
* @field growlNotificationTimedOut Called when a Growl notification timed out.
|
||||
*/
|
||||
struct Growl_Delegate {
|
||||
/* @discussion This should be sizeof(struct Growl_Delegate).
|
||||
*/
|
||||
size_t size;
|
||||
|
||||
/*All of these attributes are optional.
|
||||
*Optional attributes can be NULL; required attributes that
|
||||
* are NULL cause setting the Growl delegate to fail.
|
||||
*XXX - move optional/required status into the discussion for each field
|
||||
*/
|
||||
|
||||
/* This name is used both internally and in the Growl preferences.
|
||||
*
|
||||
* This should remain stable between different versions and incarnations of
|
||||
* your application.
|
||||
* For example, "SurfWriter" is a good app name, whereas "SurfWriter 2.0" and
|
||||
* "SurfWriter Lite" are not.
|
||||
*
|
||||
* This can be <code>NULL</code> if it is provided elsewhere, namely in an
|
||||
* auto-discoverable plist file in your app bundle
|
||||
* (XXX refer to more information on that) or in registrationDictionary.
|
||||
*/
|
||||
CFStringRef applicationName;
|
||||
|
||||
/*
|
||||
* Must contain at least these keys:
|
||||
* GROWL_NOTIFICATIONS_ALL (CFArray):
|
||||
* Contains the names of all notifications your application may post.
|
||||
*
|
||||
* Can also contain these keys:
|
||||
* GROWL_NOTIFICATIONS_DEFAULT (CFArray):
|
||||
* Names of notifications that should be enabled by default.
|
||||
* If omitted, GROWL_NOTIFICATIONS_ALL will be used.
|
||||
* GROWL_APP_NAME (CFString):
|
||||
* Same as the applicationName member of this structure.
|
||||
* If both are present, the applicationName member shall prevail.
|
||||
* If this key is present, you may omit applicationName (set it to <code>NULL</code>).
|
||||
* GROWL_APP_ICON (CFData):
|
||||
* Same as the iconData member of this structure.
|
||||
* If both are present, the iconData member shall prevail.
|
||||
* If this key is present, you may omit iconData (set it to <code>NULL</code>).
|
||||
*
|
||||
* If you change the contents of this dictionary after setting the delegate,
|
||||
* be sure to call Growl_Reregister.
|
||||
*
|
||||
* This can be <code>NULL</code> if you have an auto-discoverable plist file in your app
|
||||
* bundle. (XXX refer to more information on that)
|
||||
*/
|
||||
CFDictionaryRef registrationDictionary;
|
||||
|
||||
/* The data can be in any format supported by NSImage. As of
|
||||
* Mac OS X 10.3, this includes the .icns, TIFF, JPEG, GIF, PNG, PDF, and
|
||||
* PICT formats.
|
||||
*
|
||||
* If this is not supplied, Growl will look up your application's icon by
|
||||
* its application name.
|
||||
*/
|
||||
CFDataRef applicationIconData;
|
||||
|
||||
/* Installer display attributes
|
||||
*
|
||||
* These four attributes are used by the Growl installer, if this framework
|
||||
* supports it.
|
||||
* For any of these being <code>NULL</code>, a localised default will be
|
||||
* supplied.
|
||||
*/
|
||||
|
||||
/* If this is <code>NULL</code>, Growl will use a default,
|
||||
* localized title.
|
||||
*
|
||||
* Only used if you're using Growl-WithInstaller.framework. Otherwise,
|
||||
* this member is ignored.
|
||||
*/
|
||||
CFStringRef growlInstallationWindowTitle;
|
||||
/* This information may be as long or short as desired (the
|
||||
* window will be sized to fit it). If Growl is not installed, it will
|
||||
* be displayed to the user as an explanation of what Growl is and what
|
||||
* it can do in your application.
|
||||
* It should probably note that no download is required to install.
|
||||
*
|
||||
* If this is <code>NULL</code>, Growl will use a default, localized
|
||||
* explanation.
|
||||
*
|
||||
* Only used if you're using Growl-WithInstaller.framework. Otherwise,
|
||||
* this member is ignored.
|
||||
*/
|
||||
CFStringRef growlInstallationInformation;
|
||||
/* If this is <code>NULL</code>, Growl will use a default,
|
||||
* localized title.
|
||||
*
|
||||
* Only used if you're using Growl-WithInstaller.framework. Otherwise,
|
||||
* this member is ignored.
|
||||
*/
|
||||
CFStringRef growlUpdateWindowTitle;
|
||||
/* This information may be as long or short as desired (the
|
||||
* window will be sized to fit it). If an older version of Growl is
|
||||
* installed, it will be displayed to the user as an explanation that an
|
||||
* updated version of Growl is included in your application and
|
||||
* no download is required.
|
||||
*
|
||||
* If this is <code>NULL</code>, Growl will use a default, localized
|
||||
* explanation.
|
||||
*
|
||||
* Only used if you're using Growl-WithInstaller.framework. Otherwise,
|
||||
* this member is ignored.
|
||||
*/
|
||||
CFStringRef growlUpdateInformation;
|
||||
|
||||
/* This member is provided for use by your retain and release
|
||||
* callbacks (see below).
|
||||
*
|
||||
* GrowlApplicationBridge never directly uses this member. Instead, it
|
||||
* calls your retain callback (if non-<code>NULL</code>) and your release
|
||||
* callback (if non-<code>NULL</code>).
|
||||
*/
|
||||
unsigned referenceCount;
|
||||
|
||||
//Functions. Currently all of these are optional (any of them can be NULL).
|
||||
|
||||
/* When you call Growl_SetDelegate(newDelegate), it will call
|
||||
* oldDelegate->release(oldDelegate), and then it will call
|
||||
* newDelegate->retain(newDelegate), and the return value from retain
|
||||
* is what will be set as the delegate.
|
||||
* (This means that this member works like CFRetain and -[NSObject retain].)
|
||||
* This member is optional (it can be <code>NULL</code>).
|
||||
* For a delegate allocated with malloc, this member would be
|
||||
* <code>NULL</code>.
|
||||
* @result A delegate to which GrowlApplicationBridge holds a reference.
|
||||
*/
|
||||
void *(*retain)(void *);
|
||||
/* When you call Growl_SetDelegate(newDelegate), it will call
|
||||
* oldDelegate->release(oldDelegate), and then it will call
|
||||
* newDelegate->retain(newDelegate), and the return value from retain
|
||||
* is what will be set as the delegate.
|
||||
* (This means that this member works like CFRelease and
|
||||
* -[NSObject release].)
|
||||
* This member is optional (it can be NULL).
|
||||
* For a delegate allocated with malloc, this member might be
|
||||
* <code>free</code>(3).
|
||||
*/
|
||||
void (*release)(void *);
|
||||
|
||||
/* Informs the delegate that Growl (specifically, the GrowlHelperApp) was
|
||||
* launched successfully (or was already running). The application can
|
||||
* take actions with the knowledge that Growl is installed and functional.
|
||||
*/
|
||||
void (*growlIsReady)(void);
|
||||
|
||||
/* Informs the delegate that a Growl notification was clicked. It is only
|
||||
* sent for notifications sent with a non-<code>NULL</code> clickContext,
|
||||
* so if you want to receive a message when a notification is clicked,
|
||||
* clickContext must not be <code>NULL</code> when calling
|
||||
* Growl_PostNotification or
|
||||
* Growl_NotifyWithTitleDescriptionNameIconPriorityStickyClickContext.
|
||||
*/
|
||||
void (*growlNotificationWasClicked)(CFPropertyListRef clickContext);
|
||||
|
||||
/* Informs the delegate that a Growl notification timed out. It is only
|
||||
* sent for notifications sent with a non-<code>NULL</code> clickContext,
|
||||
* so if you want to receive a message when a notification is clicked,
|
||||
* clickContext must not be <code>NULL</code> when calling
|
||||
* Growl_PostNotification or
|
||||
* Growl_NotifyWithTitleDescriptionNameIconPriorityStickyClickContext.
|
||||
*/
|
||||
void (*growlNotificationTimedOut)(CFPropertyListRef clickContext);
|
||||
};
|
||||
|
||||
/*! @struct Growl_Notification
|
||||
* @abstract Structure describing a Growl notification.
|
||||
* @discussion XXX
|
||||
* @field size The size of the notification structure.
|
||||
* @field name Identifies the notification.
|
||||
* @field title Short synopsis of the notification.
|
||||
* @field description Additional text.
|
||||
* @field iconData An icon for the notification.
|
||||
* @field priority An indicator of the notification's importance.
|
||||
* @field reserved Bits reserved for future usage.
|
||||
* @field isSticky Requests that a notification stay on-screen until dismissed explicitly.
|
||||
* @field clickContext An identifier to be passed to your click callback when a notification is clicked.
|
||||
* @field clickCallback A callback to call when the notification is clicked.
|
||||
*/
|
||||
struct Growl_Notification {
|
||||
/* This should be sizeof(struct Growl_Notification).
|
||||
*/
|
||||
size_t size;
|
||||
|
||||
/* The notification name distinguishes one type of
|
||||
* notification from another. The name should be human-readable, as it
|
||||
* will be displayed in the Growl preference pane.
|
||||
*
|
||||
* The name is used in the GROWL_NOTIFICATIONS_ALL and
|
||||
* GROWL_NOTIFICATIONS_DEFAULT arrays in the registration dictionary, and
|
||||
* in this member of the Growl_Notification structure.
|
||||
*/
|
||||
CFStringRef name;
|
||||
|
||||
/* A notification's title describes the notification briefly.
|
||||
* It should be easy to read quickly by the user.
|
||||
*/
|
||||
CFStringRef title;
|
||||
|
||||
/* The description supplements the title with more
|
||||
* information. It is usually longer and sometimes involves a list of
|
||||
* subjects. For example, for a 'Download complete' notification, the
|
||||
* description might have one filename per line. GrowlMail in Growl 0.6
|
||||
* uses a description of '%d new mail(s)' (formatted with the number of
|
||||
* messages).
|
||||
*/
|
||||
CFStringRef description;
|
||||
|
||||
/* The notification icon usually indicates either what
|
||||
* happened (it may have the same icon as e.g. a toolbar item that
|
||||
* started the process that led to the notification), or what it happened
|
||||
* to (e.g. a document icon).
|
||||
*
|
||||
* The icon data is optional, so it can be <code>NULL</code>. In that
|
||||
* case, the application icon is used alone. Not all displays support
|
||||
* icons.
|
||||
*
|
||||
* The data can be in any format supported by NSImage. As of Mac OS X
|
||||
* 10.3, this includes the .icns, TIFF, JPEG, GIF, PNG, PDF, and PICT form
|
||||
* ats.
|
||||
*/
|
||||
CFDataRef iconData;
|
||||
|
||||
/* Priority is new in Growl 0.6, and is represented as a
|
||||
* signed integer from -2 to +2. 0 is Normal priority, -2 is Very Low
|
||||
* priority, and +2 is Very High priority.
|
||||
*
|
||||
* Not all displays support priority. If you do not wish to assign a
|
||||
* priority to your notification, assign 0.
|
||||
*/
|
||||
signed int priority;
|
||||
|
||||
/* These bits are not used in Growl 0.6. Set them to 0.
|
||||
*/
|
||||
unsigned reserved: 31;
|
||||
|
||||
/* When the sticky bit is clear, in most displays,
|
||||
* notifications disappear after a certain amount of time. Sticky
|
||||
* notifications, however, remain on-screen until the user dismisses them
|
||||
* explicitly, usually by clicking them.
|
||||
*
|
||||
* Sticky notifications were introduced in Growl 0.6. Most notifications
|
||||
* should not be sticky. Not all displays support sticky notifications,
|
||||
* and the user may choose in Growl's preference pane to force the
|
||||
* notification to be sticky or non-sticky, in which case the sticky bit
|
||||
* in the notification will be ignored.
|
||||
*/
|
||||
unsigned isSticky: 1;
|
||||
|
||||
/* If this is not <code>NULL</code>, and your click callback
|
||||
* is not <code>NULL</code> either, this will be passed to the callback
|
||||
* when your notification is clicked by the user.
|
||||
*
|
||||
* Click feedback was introduced in Growl 0.6, and it is optional. Not
|
||||
* all displays support click feedback.
|
||||
*/
|
||||
CFPropertyListRef clickContext;
|
||||
|
||||
/* If this is not <code>NULL</code>, it will be called instead
|
||||
* of the Growl delegate's click callback when clickContext is
|
||||
* non-<code>NULL</code> and the notification is clicked on by the user.
|
||||
*
|
||||
* Click feedback was introduced in Growl 0.6, and it is optional. Not
|
||||
* all displays support click feedback.
|
||||
*
|
||||
* The per-notification click callback is not yet supported as of Growl
|
||||
* 0.7.
|
||||
*/
|
||||
void (*clickCallback)(CFPropertyListRef clickContext);
|
||||
|
||||
CFStringRef identifier;
|
||||
};
|
||||
|
||||
#pragma mark -
|
||||
#pragma mark Easy initialisers
|
||||
|
||||
/*! @defined InitGrowlDelegate
|
||||
* @abstract Callable macro. Initializes a Growl delegate structure to defaults.
|
||||
* @discussion Call with a pointer to a struct Growl_Delegate. All of the
|
||||
* members of the structure will be set to 0 or <code>NULL</code>, except for
|
||||
* size (which will be set to <code>sizeof(struct Growl_Delegate)</code>) and
|
||||
* referenceCount (which will be set to 1).
|
||||
*/
|
||||
#define InitGrowlDelegate(delegate) \
|
||||
do { \
|
||||
if (delegate) { \
|
||||
(delegate)->size = sizeof(struct Growl_Delegate); \
|
||||
(delegate)->applicationName = NULL; \
|
||||
(delegate)->registrationDictionary = NULL; \
|
||||
(delegate)->applicationIconData = NULL; \
|
||||
(delegate)->growlInstallationWindowTitle = NULL; \
|
||||
(delegate)->growlInstallationInformation = NULL; \
|
||||
(delegate)->growlUpdateWindowTitle = NULL; \
|
||||
(delegate)->growlUpdateInformation = NULL; \
|
||||
(delegate)->referenceCount = 1U; \
|
||||
(delegate)->retain = NULL; \
|
||||
(delegate)->release = NULL; \
|
||||
(delegate)->growlIsReady = NULL; \
|
||||
(delegate)->growlNotificationWasClicked = NULL; \
|
||||
(delegate)->growlNotificationTimedOut = NULL; \
|
||||
} \
|
||||
} while(0)
|
||||
|
||||
/*! @defined InitGrowlNotification
|
||||
* @abstract Callable macro. Initializes a Growl notification structure to defaults.
|
||||
* @discussion Call with a pointer to a struct Growl_Notification. All of
|
||||
* the members of the structure will be set to 0 or <code>NULL</code>, except
|
||||
* for size (which will be set to
|
||||
* <code>sizeof(struct Growl_Notification)</code>).
|
||||
*/
|
||||
#define InitGrowlNotification(notification) \
|
||||
do { \
|
||||
if (notification) { \
|
||||
(notification)->size = sizeof(struct Growl_Notification); \
|
||||
(notification)->name = NULL; \
|
||||
(notification)->title = NULL; \
|
||||
(notification)->description = NULL; \
|
||||
(notification)->iconData = NULL; \
|
||||
(notification)->priority = 0; \
|
||||
(notification)->reserved = 0U; \
|
||||
(notification)->isSticky = false; \
|
||||
(notification)->clickContext = NULL; \
|
||||
(notification)->clickCallback = NULL; \
|
||||
(notification)->identifier = NULL; \
|
||||
} \
|
||||
} while(0)
|
||||
|
||||
#pragma mark -
|
||||
#pragma mark Public API
|
||||
|
||||
// @functiongroup Managing the Growl delegate
|
||||
|
||||
/*! @function Growl_SetDelegate
|
||||
* @abstract Replaces the current Growl delegate with a new one, or removes
|
||||
* the Growl delegate.
|
||||
* @param newDelegate
|
||||
* @result Returns false and does nothing else if a pointer that was passed in
|
||||
* is unsatisfactory (because it is non-<code>NULL</code>, but at least one
|
||||
* required member of it is <code>NULL</code>). Otherwise, sets or unsets the
|
||||
* delegate and returns true.
|
||||
* @discussion When <code>newDelegate</code> is non-<code>NULL</code>, sets
|
||||
* the delegate to <code>newDelegate</code>. When it is <code>NULL</code>,
|
||||
* the current delegate will be unset, and no delegate will be in place.
|
||||
*
|
||||
* It is legal for <code>newDelegate</code> to be the current delegate;
|
||||
* nothing will happen, and Growl_SetDelegate will return true. It is also
|
||||
* legal for it to be <code>NULL</code>, as described above; again, it will
|
||||
* return true.
|
||||
*
|
||||
* If there was a delegate in place before the call, Growl_SetDelegate will
|
||||
* call the old delegate's release member if it was non-<code>NULL</code>. If
|
||||
* <code>newDelegate</code> is non-<code>NULL</code>, Growl_SetDelegate will
|
||||
* call <code>newDelegate->retain</code>, and set the delegate to its return
|
||||
* value.
|
||||
*
|
||||
* If you are using Growl-WithInstaller.framework, and an older version of
|
||||
* Growl is installed on the user's system, the user will automatically be
|
||||
* prompted to update.
|
||||
*
|
||||
* GrowlApplicationBridge currently does not copy this structure, nor does it
|
||||
* retain any of the CF objects in the structure (it regards the structure as
|
||||
* a container that retains the objects when they are added and releases them
|
||||
* when they are removed or the structure is destroyed). Also,
|
||||
* GrowlApplicationBridge currently does not modify any member of the
|
||||
* structure, except possibly the referenceCount by calling the retain and
|
||||
* release members.
|
||||
*/
|
||||
GROWL_EXPORT Boolean Growl_SetDelegate(struct Growl_Delegate *newDelegate);
|
||||
|
||||
/*! @function Growl_GetDelegate
|
||||
* @abstract Returns the current Growl delegate, if any.
|
||||
* @result The current Growl delegate.
|
||||
* @discussion Returns the last pointer passed into Growl_SetDelegate, or
|
||||
* <code>NULL</code> if no such call has been made.
|
||||
*
|
||||
* This function follows standard Core Foundation reference-counting rules.
|
||||
* Because it is a Get function, not a Copy function, it will not retain the
|
||||
* delegate on your behalf. You are responsible for retaining and releasing
|
||||
* the delegate as needed.
|
||||
*/
|
||||
GROWL_EXPORT struct Growl_Delegate *Growl_GetDelegate(void);
|
||||
|
||||
#pragma mark -
|
||||
|
||||
// @functiongroup Posting Growl notifications
|
||||
|
||||
/*! @function Growl_PostNotification
|
||||
* @abstract Posts a Growl notification.
|
||||
* @param notification The notification to post.
|
||||
* @discussion This is the preferred means for sending a Growl notification.
|
||||
* The notification name and at least one of the title and description are
|
||||
* required (all three are preferred). All other parameters may be
|
||||
* <code>NULL</code> (or 0 or false as appropriate) to accept default values.
|
||||
*
|
||||
* If using the Growl-WithInstaller framework, if Growl is not installed the
|
||||
* user will be prompted to install Growl.
|
||||
* If the user cancels, this function will have no effect until the next
|
||||
* application session, at which time when it is called the user will be
|
||||
* prompted again. The user is also given the option to not be prompted again.
|
||||
* If the user does choose to install Growl, the requested notification will
|
||||
* be displayed once Growl is installed and running.
|
||||
*/
|
||||
GROWL_EXPORT void Growl_PostNotification(const struct Growl_Notification *notification);
|
||||
|
||||
/*! @function Growl_PostNotificationWithDictionary
|
||||
* @abstract Notifies using a userInfo dictionary suitable for passing to
|
||||
* CFDistributedNotificationCenter.
|
||||
* @param userInfo The dictionary to notify with.
|
||||
* @discussion Before Growl 0.6, your application would have posted
|
||||
* notifications using CFDistributedNotificationCenter by creating a userInfo
|
||||
* dictionary with the notification data. This had the advantage of allowing
|
||||
* you to add other data to the dictionary for programs besides Growl that
|
||||
* might be listening.
|
||||
*
|
||||
* This function allows you to use such dictionaries without being restricted
|
||||
* to using CFDistributedNotificationCenter. The keys for this dictionary
|
||||
* can be found in GrowlDefines.h.
|
||||
*/
|
||||
GROWL_EXPORT void Growl_PostNotificationWithDictionary(CFDictionaryRef userInfo);
|
||||
|
||||
/*! @function Growl_NotifyWithTitleDescriptionNameIconPriorityStickyClickContext
|
||||
* @abstract Posts a Growl notification using parameter values.
|
||||
* @param title The title of the notification.
|
||||
* @param description The description of the notification.
|
||||
* @param notificationName The name of the notification as listed in the
|
||||
* registration dictionary.
|
||||
* @param iconData Data representing a notification icon. Can be <code>NULL</code>.
|
||||
* @param priority The priority of the notification (-2 to +2, with -2
|
||||
* being Very Low and +2 being Very High).
|
||||
* @param isSticky If true, requests that this notification wait for a
|
||||
* response from the user.
|
||||
* @param clickContext An object to pass to the clickCallback, if any. Can
|
||||
* be <code>NULL</code>, in which case the clickCallback is not called.
|
||||
* @discussion Creates a temporary Growl_Notification, fills it out with the
|
||||
* supplied information, and calls Growl_PostNotification on it.
|
||||
* See struct Growl_Notification and Growl_PostNotification for more
|
||||
* information.
|
||||
*
|
||||
* The icon data can be in any format supported by NSImage. As of Mac OS X
|
||||
* 10.3, this includes the .icns, TIFF, JPEG, GIF, PNG, PDF, and PICT formats.
|
||||
*/
|
||||
GROWL_EXPORT void Growl_NotifyWithTitleDescriptionNameIconPriorityStickyClickContext(
|
||||
/*inhale*/
|
||||
CFStringRef title,
|
||||
CFStringRef description,
|
||||
CFStringRef notificationName,
|
||||
CFDataRef iconData,
|
||||
signed int priority,
|
||||
Boolean isSticky,
|
||||
CFPropertyListRef clickContext);
|
||||
|
||||
#pragma mark -
|
||||
|
||||
// @functiongroup Registering
|
||||
|
||||
/*! @function Growl_RegisterWithDictionary
|
||||
* @abstract Register your application with Growl without setting a delegate.
|
||||
* @discussion When you call this function with a dictionary,
|
||||
* GrowlApplicationBridge registers your application using that dictionary.
|
||||
* If you pass <code>NULL</code>, GrowlApplicationBridge will ask the delegate
|
||||
* (if there is one) for a dictionary, and if that doesn't work, it will look
|
||||
* in your application's bundle for an auto-discoverable plist.
|
||||
* (XXX refer to more information on that)
|
||||
*
|
||||
* If you pass a dictionary to this function, it must include the
|
||||
* <code>GROWL_APP_NAME</code> key, unless a delegate is set.
|
||||
*
|
||||
* This function is mainly an alternative to the delegate system introduced
|
||||
* with Growl 0.6. Without a delegate, you cannot receive callbacks such as
|
||||
* <code>growlIsReady</code> (since they are sent to the delegate). You can,
|
||||
* however, set a delegate after registering without one.
|
||||
*
|
||||
* This function was introduced in Growl.framework 0.7.
|
||||
* @result <code>false</code> if registration failed (e.g. if Growl isn't installed).
|
||||
*/
|
||||
GROWL_EXPORT Boolean Growl_RegisterWithDictionary(CFDictionaryRef regDict);
|
||||
|
||||
/*! @function Growl_Reregister
|
||||
* @abstract Updates your registration with Growl.
|
||||
* @discussion If your application changes the contents of the
|
||||
* GROWL_NOTIFICATIONS_ALL key in the registrationDictionary member of the
|
||||
* Growl delegate, or if it changes the value of that member, or if it
|
||||
* changes the contents of its auto-discoverable plist, call this function
|
||||
* to have Growl update its registration information for your application.
|
||||
*
|
||||
* Otherwise, this function does not normally need to be called. If you're
|
||||
* using a delegate, your application will be registered when you set the
|
||||
* delegate if both the delegate and its registrationDictionary member are
|
||||
* non-<code>NULL</code>.
|
||||
*
|
||||
* This function is now implemented using
|
||||
* <code>Growl_RegisterWithDictionary</code>.
|
||||
*/
|
||||
GROWL_EXPORT void Growl_Reregister(void);
|
||||
|
||||
#pragma mark -
|
||||
|
||||
/*! @function Growl_SetWillRegisterWhenGrowlIsReady
|
||||
* @abstract Tells GrowlApplicationBridge to register with Growl when Growl
|
||||
* launches (or not).
|
||||
* @discussion When Growl has started listening for notifications, it posts a
|
||||
* <code>GROWL_IS_READY</code> notification on the Distributed Notification
|
||||
* Center. GrowlApplicationBridge listens for this notification, using it to
|
||||
* perform various tasks (such as calling your delegate's
|
||||
* <code>growlIsReady</code> callback, if it has one). If this function is
|
||||
* called with <code>true</code>, one of those tasks will be to reregister
|
||||
* with Growl (in the manner of <code>Growl_Reregister</code>).
|
||||
*
|
||||
* This attribute is automatically set back to <code>false</code>
|
||||
* (the default) after every <code>GROWL_IS_READY</code> notification.
|
||||
* @param flag <code>true</code> if you want GrowlApplicationBridge to register with
|
||||
* Growl when next it is ready; <code>false</code> if not.
|
||||
*/
|
||||
GROWL_EXPORT void Growl_SetWillRegisterWhenGrowlIsReady(Boolean flag);
|
||||
/*! @function Growl_WillRegisterWhenGrowlIsReady
|
||||
* @abstract Reports whether GrowlApplicationBridge will register with Growl
|
||||
* when Growl next launches.
|
||||
* @result <code>true</code> if GrowlApplicationBridge will register with
|
||||
* Growl when next it posts GROWL_IS_READY; <code>false</code> if not.
|
||||
*/
|
||||
GROWL_EXPORT Boolean Growl_WillRegisterWhenGrowlIsReady(void);
|
||||
|
||||
#pragma mark -
|
||||
|
||||
// @functiongroup Obtaining registration dictionaries
|
||||
|
||||
/*! @function Growl_CopyRegistrationDictionaryFromDelegate
|
||||
* @abstract Asks the delegate for a registration dictionary.
|
||||
* @discussion If no delegate is set, or if the delegate's
|
||||
* <code>registrationDictionary</code> member is <code>NULL</code>, this
|
||||
* function returns <code>NULL</code>.
|
||||
*
|
||||
* This function does not attempt to clean up the dictionary in any way - for
|
||||
* example, if it is missing the <code>GROWL_APP_NAME</code> key, the result
|
||||
* will be missing it too. Use
|
||||
* <code>Growl_CreateRegistrationDictionaryByFillingInDictionary</code> or
|
||||
* <code>Growl_CreateRegistrationDictionaryByFillingInDictionaryRestrictedToKeys</code>
|
||||
* to try to fill in missing keys.
|
||||
*
|
||||
* This function was introduced in Growl.framework 0.7.
|
||||
* @result A registration dictionary.
|
||||
*/
|
||||
GROWL_EXPORT CFDictionaryRef Growl_CopyRegistrationDictionaryFromDelegate(void);
|
||||
|
||||
/*! @function Growl_CopyRegistrationDictionaryFromBundle
|
||||
* @abstract Looks in a bundle for a registration dictionary.
|
||||
* @discussion This function looks in a bundle for an auto-discoverable
|
||||
* registration dictionary file using <code>CFBundleCopyResourceURL</code>.
|
||||
* If it finds one, it loads the file using <code>CFPropertyList</code> and
|
||||
* returns the result.
|
||||
*
|
||||
* If you pass <code>NULL</code> as the bundle, the main bundle is examined.
|
||||
*
|
||||
* This function does not attempt to clean up the dictionary in any way - for
|
||||
* example, if it is missing the <code>GROWL_APP_NAME</code> key, the result
|
||||
* will be missing it too. Use
|
||||
* <code>Growl_CreateRegistrationDictionaryByFillingInDictionary:</code> or
|
||||
* <code>Growl_CreateRegistrationDictionaryByFillingInDictionaryRestrictedToKeys</code>
|
||||
* to try to fill in missing keys.
|
||||
*
|
||||
* This function was introduced in Growl.framework 0.7.
|
||||
* @result A registration dictionary.
|
||||
*/
|
||||
GROWL_EXPORT CFDictionaryRef Growl_CopyRegistrationDictionaryFromBundle(CFBundleRef bundle);
|
||||
|
||||
/*! @function Growl_CreateBestRegistrationDictionary
|
||||
* @abstract Obtains a registration dictionary, filled out to the best of
|
||||
* GrowlApplicationBridge's knowledge.
|
||||
* @discussion This function creates a registration dictionary as best
|
||||
* GrowlApplicationBridge knows how.
|
||||
*
|
||||
* First, GrowlApplicationBridge examines the Growl delegate (if there is
|
||||
* one) and gets the registration dictionary from that. If no such dictionary
|
||||
* was obtained, GrowlApplicationBridge looks in your application's main
|
||||
* bundle for an auto-discoverable registration dictionary file. If that
|
||||
* doesn't exist either, this function returns <code>NULL</code>.
|
||||
*
|
||||
* Second, GrowlApplicationBridge calls
|
||||
* <code>Growl_CreateRegistrationDictionaryByFillingInDictionary</code> with
|
||||
* whatever dictionary was obtained. The result of that function is the
|
||||
* result of this function.
|
||||
*
|
||||
* GrowlApplicationBridge uses this function when you call
|
||||
* <code>Growl_SetDelegate</code>, or when you call
|
||||
* <code>Growl_RegisterWithDictionary</code> with <code>NULL</code>.
|
||||
*
|
||||
* This function was introduced in Growl.framework 0.7.
|
||||
* @result A registration dictionary.
|
||||
*/
|
||||
GROWL_EXPORT CFDictionaryRef Growl_CreateBestRegistrationDictionary(void);
|
||||
|
||||
#pragma mark -
|
||||
|
||||
// @functiongroup Filling in registration dictionaries
|
||||
|
||||
/*! @function Growl_CreateRegistrationDictionaryByFillingInDictionary
|
||||
* @abstract Tries to fill in missing keys in a registration dictionary.
|
||||
* @param regDict The dictionary to fill in.
|
||||
* @result The dictionary with the keys filled in.
|
||||
* @discussion This function examines the passed-in dictionary for missing keys,
|
||||
* and tries to work out correct values for them. As of 0.7, it uses:
|
||||
*
|
||||
* Key Value
|
||||
* --- -----
|
||||
* <code>GROWL_APP_NAME</code> <code>CFBundleExecutableName</code>
|
||||
* <code>GROWL_APP_ICON</code> The icon of the application.
|
||||
* <code>GROWL_APP_LOCATION</code> The location of the application.
|
||||
* <code>GROWL_NOTIFICATIONS_DEFAULT</code> <code>GROWL_NOTIFICATIONS_ALL</code>
|
||||
*
|
||||
* Keys are only filled in if missing; if a key is present in the dictionary,
|
||||
* its value will not be changed.
|
||||
*
|
||||
* This function was introduced in Growl.framework 0.7.
|
||||
*/
|
||||
GROWL_EXPORT CFDictionaryRef Growl_CreateRegistrationDictionaryByFillingInDictionary(CFDictionaryRef regDict);
|
||||
/*! @function Growl_CreateRegistrationDictionaryByFillingInDictionaryRestrictedToKeys
|
||||
* @abstract Tries to fill in missing keys in a registration dictionary.
|
||||
* @param regDict The dictionary to fill in.
|
||||
* @param keys The keys to fill in. If <code>NULL</code>, any missing keys are filled in.
|
||||
* @result The dictionary with the keys filled in.
|
||||
* @discussion This function examines the passed-in dictionary for missing keys,
|
||||
* and tries to work out correct values for them. As of 0.7, it uses:
|
||||
*
|
||||
* Key Value
|
||||
* --- -----
|
||||
* <code>GROWL_APP_NAME</code> <code>CFBundleExecutableName</code>
|
||||
* <code>GROWL_APP_ICON</code> The icon of the application.
|
||||
* <code>GROWL_APP_LOCATION</code> The location of the application.
|
||||
* <code>GROWL_NOTIFICATIONS_DEFAULT</code> <code>GROWL_NOTIFICATIONS_ALL</code>
|
||||
*
|
||||
* Only those keys that are listed in <code>keys</code> will be filled in.
|
||||
* Other missing keys are ignored. Also, keys are only filled in if missing;
|
||||
* if a key is present in the dictionary, its value will not be changed.
|
||||
*
|
||||
* This function was introduced in Growl.framework 0.7.
|
||||
*/
|
||||
GROWL_EXPORT CFDictionaryRef Growl_CreateRegistrationDictionaryByFillingInDictionaryRestrictedToKeys(CFDictionaryRef regDict, CFSetRef keys);
|
||||
|
||||
/*! @brief Tries to fill in missing keys in a notification dictionary.
|
||||
* @param notifDict The dictionary to fill in.
|
||||
* @return The dictionary with the keys filled in. This will be a separate instance from \a notifDict.
|
||||
* @discussion This function examines the \a notifDict for missing keys, and
|
||||
* tries to get them from the last known registration dictionary. As of 1.1,
|
||||
* the keys that it will look for are:
|
||||
*
|
||||
* \li <code>GROWL_APP_NAME</code>
|
||||
* \li <code>GROWL_APP_ICON</code>
|
||||
*
|
||||
* @since Growl.framework 1.1
|
||||
*/
|
||||
GROWL_EXPORT CFDictionaryRef Growl_CreateNotificationDictionaryByFillingInDictionary(CFDictionaryRef notifDict);
|
||||
|
||||
#pragma mark -
|
||||
|
||||
// @functiongroup Querying Growl's status
|
||||
|
||||
/*! @function Growl_IsInstalled
|
||||
* @abstract Determines whether the Growl prefpane and its helper app are
|
||||
* installed.
|
||||
* @result Returns true if Growl is installed, false otherwise.
|
||||
*/
|
||||
GROWL_EXPORT Boolean Growl_IsInstalled(void);
|
||||
|
||||
/*! @function Growl_IsRunning
|
||||
* @abstract Cycles through the process list to find whether GrowlHelperApp
|
||||
* is running.
|
||||
* @result Returns true if Growl is running, false otherwise.
|
||||
*/
|
||||
GROWL_EXPORT Boolean Growl_IsRunning(void);
|
||||
|
||||
#pragma mark -
|
||||
|
||||
// @functiongroup Launching Growl
|
||||
|
||||
/*! @typedef GrowlLaunchCallback
|
||||
* @abstract Callback to notify you that Growl is running.
|
||||
* @param context The context pointer passed to Growl_LaunchIfInstalled.
|
||||
* @discussion Growl_LaunchIfInstalled calls this callback function if Growl
|
||||
* was already running or if it launched Growl successfully.
|
||||
*/
|
||||
typedef void (*GrowlLaunchCallback)(void *context);
|
||||
|
||||
/*! @function Growl_LaunchIfInstalled
|
||||
* @abstract Launches GrowlHelperApp if it is not already running.
|
||||
* @param callback A callback function which will be called if Growl was successfully
|
||||
* launched or was already running. Can be <code>NULL</code>.
|
||||
* @param context The context pointer to pass to the callback. Can be <code>NULL</code>.
|
||||
* @result Returns true if Growl was successfully launched or was already
|
||||
* running; returns false and does not call the callback otherwise.
|
||||
* @discussion Returns true and calls the callback (if the callback is not
|
||||
* <code>NULL</code>) if the Growl helper app began launching or was already
|
||||
* running. Returns false and performs no other action if Growl could not be
|
||||
* launched (e.g. because the Growl preference pane is not properly installed).
|
||||
*
|
||||
* If <code>Growl_CreateBestRegistrationDictionary</code> returns
|
||||
* non-<code>NULL</code>, this function will register with Growl atomically.
|
||||
*
|
||||
* The callback should take a single argument; this is to allow applications
|
||||
* to have context-relevant information passed back. It is perfectly
|
||||
* acceptable for context to be <code>NULL</code>. The callback itself can be
|
||||
* <code>NULL</code> if you don't want one.
|
||||
*/
|
||||
GROWL_EXPORT Boolean Growl_LaunchIfInstalled(GrowlLaunchCallback callback, void *context);
|
||||
|
||||
#pragma mark -
|
||||
#pragma mark Constants
|
||||
|
||||
/*! @defined GROWL_PREFPANE_BUNDLE_IDENTIFIER
|
||||
* @abstract The CFBundleIdentifier of the Growl preference pane bundle.
|
||||
* @discussion GrowlApplicationBridge uses this to determine whether Growl is
|
||||
* currently installed, by searching for the Growl preference pane. Your
|
||||
* application probably does not need to use this macro itself.
|
||||
*/
|
||||
#ifndef GROWL_PREFPANE_BUNDLE_IDENTIFIER
|
||||
#define GROWL_PREFPANE_BUNDLE_IDENTIFIER CFSTR("com.growl.prefpanel")
|
||||
#endif
|
||||
|
||||
__END_DECLS
|
||||
|
||||
#endif /* _GROWLAPPLICATIONBRIDGE_CARBON_H_ */
|
||||
@@ -0,0 +1,575 @@
|
||||
//
|
||||
// GrowlApplicationBridge.h
|
||||
// Growl
|
||||
//
|
||||
// Created by Evan Schoenberg on Wed Jun 16 2004.
|
||||
// Copyright 2004-2006 The Growl Project. All rights reserved.
|
||||
//
|
||||
|
||||
/*!
|
||||
* @header GrowlApplicationBridge.h
|
||||
* @abstract Defines the GrowlApplicationBridge class.
|
||||
* @discussion This header defines the GrowlApplicationBridge class as well as
|
||||
* the GROWL_PREFPANE_BUNDLE_IDENTIFIER constant.
|
||||
*/
|
||||
|
||||
#ifndef __GrowlApplicationBridge_h__
|
||||
#define __GrowlApplicationBridge_h__
|
||||
|
||||
#import <Foundation/Foundation.h>
|
||||
#import <AppKit/AppKit.h>
|
||||
#import "GrowlDefines.h"
|
||||
|
||||
//Forward declarations
|
||||
@protocol GrowlApplicationBridgeDelegate;
|
||||
|
||||
//Internal notification when the user chooses not to install (to avoid continuing to cache notifications awaiting installation)
|
||||
#define GROWL_USER_CHOSE_NOT_TO_INSTALL_NOTIFICATION @"User chose not to install"
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
#pragma mark -
|
||||
|
||||
/*!
|
||||
* @class GrowlApplicationBridge
|
||||
* @abstract A class used to interface with Growl.
|
||||
* @discussion This class provides a means to interface with Growl.
|
||||
*
|
||||
* Currently it provides a way to detect if Growl is installed and launch the
|
||||
* GrowlHelperApp if it's not already running.
|
||||
*/
|
||||
@interface GrowlApplicationBridge : NSObject {
|
||||
|
||||
}
|
||||
|
||||
/*!
|
||||
* @method isGrowlInstalled
|
||||
* @abstract Detects whether Growl is installed.
|
||||
* @discussion Determines if the Growl prefpane and its helper app are installed.
|
||||
* @result Returns YES if Growl is installed, NO otherwise.
|
||||
*/
|
||||
+ (BOOL) isGrowlInstalled;
|
||||
|
||||
/*!
|
||||
* @method isGrowlRunning
|
||||
* @abstract Detects whether GrowlHelperApp is currently running.
|
||||
* @discussion Cycles through the process list to find whether GrowlHelperApp is running and returns its findings.
|
||||
* @result Returns YES if GrowlHelperApp is running, NO otherwise.
|
||||
*/
|
||||
+ (BOOL) isGrowlRunning;
|
||||
|
||||
#pragma mark -
|
||||
|
||||
/*!
|
||||
* @method setGrowlDelegate:
|
||||
* @abstract Set the object which will be responsible for providing and receiving Growl information.
|
||||
* @discussion This must be called before using GrowlApplicationBridge.
|
||||
*
|
||||
* The methods in the GrowlApplicationBridgeDelegate protocol are required
|
||||
* and return the basic information needed to register with Growl.
|
||||
*
|
||||
* The methods in the GrowlApplicationBridgeDelegate_InformalProtocol
|
||||
* informal protocol are individually optional. They provide a greater
|
||||
* degree of interaction between the application and growl such as informing
|
||||
* the application when one of its Growl notifications is clicked by the user.
|
||||
*
|
||||
* The methods in the GrowlApplicationBridgeDelegate_Installation_InformalProtocol
|
||||
* informal protocol are individually optional and are only applicable when
|
||||
* using the Growl-WithInstaller.framework which allows for automated Growl
|
||||
* installation.
|
||||
*
|
||||
* When this method is called, data will be collected from inDelegate, Growl
|
||||
* will be launched if it is not already running, and the application will be
|
||||
* registered with Growl.
|
||||
*
|
||||
* If using the Growl-WithInstaller framework, if Growl is already installed
|
||||
* but this copy of the framework has an updated version of Growl, the user
|
||||
* will be prompted to update automatically.
|
||||
*
|
||||
* @param inDelegate The delegate for the GrowlApplicationBridge. It must conform to the GrowlApplicationBridgeDelegate protocol.
|
||||
*/
|
||||
+ (void) setGrowlDelegate:(NSObject<GrowlApplicationBridgeDelegate> *)inDelegate;
|
||||
|
||||
/*!
|
||||
* @method growlDelegate
|
||||
* @abstract Return the object responsible for providing and receiving Growl information.
|
||||
* @discussion See setGrowlDelegate: for details.
|
||||
* @result The Growl delegate.
|
||||
*/
|
||||
+ (NSObject<GrowlApplicationBridgeDelegate> *) growlDelegate;
|
||||
|
||||
#pragma mark -
|
||||
|
||||
/*!
|
||||
* @method notifyWithTitle:description:notificationName:iconData:priority:isSticky:clickContext:
|
||||
* @abstract Send a Growl notification.
|
||||
* @discussion This is the preferred means for sending a Growl notification.
|
||||
* The notification name and at least one of the title and description are
|
||||
* required (all three are preferred). All other parameters may be
|
||||
* <code>nil</code> (or 0 or NO as appropriate) to accept default values.
|
||||
*
|
||||
* If using the Growl-WithInstaller framework, if Growl is not installed the
|
||||
* user will be prompted to install Growl. If the user cancels, this method
|
||||
* will have no effect until the next application session, at which time when
|
||||
* it is called the user will be prompted again. The user is also given the
|
||||
* option to not be prompted again. If the user does choose to install Growl,
|
||||
* the requested notification will be displayed once Growl is installed and
|
||||
* running.
|
||||
*
|
||||
* @param title The title of the notification displayed to the user.
|
||||
* @param description The full description of the notification displayed to the user.
|
||||
* @param notifName The internal name of the notification. Should be human-readable, as it will be displayed in the Growl preference pane.
|
||||
* @param iconData <code>NSData</code> object to show with the notification as its icon. If <code>nil</code>, the application's icon will be used instead.
|
||||
* @param priority The priority of the notification. The default value is 0; positive values are higher priority and negative values are lower priority. Not all Growl displays support priority.
|
||||
* @param isSticky If YES, the notification will remain on screen until clicked. Not all Growl displays support sticky notifications.
|
||||
* @param clickContext A context passed back to the Growl delegate if it implements -(void)growlNotificationWasClicked: and the notification is clicked. Not all display plugins support clicking. The clickContext must be plist-encodable (completely of <code>NSString</code>, <code>NSArray</code>, <code>NSNumber</code>, <code>NSDictionary</code>, and <code>NSData</code> types).
|
||||
*/
|
||||
+ (void) notifyWithTitle:(NSString *)title
|
||||
description:(NSString *)description
|
||||
notificationName:(NSString *)notifName
|
||||
iconData:(NSData *)iconData
|
||||
priority:(signed int)priority
|
||||
isSticky:(BOOL)isSticky
|
||||
clickContext:(id)clickContext;
|
||||
|
||||
/*!
|
||||
* @method notifyWithTitle:description:notificationName:iconData:priority:isSticky:clickContext:identifier:
|
||||
* @abstract Send a Growl notification.
|
||||
* @discussion This is the preferred means for sending a Growl notification.
|
||||
* The notification name and at least one of the title and description are
|
||||
* required (all three are preferred). All other parameters may be
|
||||
* <code>nil</code> (or 0 or NO as appropriate) to accept default values.
|
||||
*
|
||||
* If using the Growl-WithInstaller framework, if Growl is not installed the
|
||||
* user will be prompted to install Growl. If the user cancels, this method
|
||||
* will have no effect until the next application session, at which time when
|
||||
* it is called the user will be prompted again. The user is also given the
|
||||
* option to not be prompted again. If the user does choose to install Growl,
|
||||
* the requested notification will be displayed once Growl is installed and
|
||||
* running.
|
||||
*
|
||||
* @param title The title of the notification displayed to the user.
|
||||
* @param description The full description of the notification displayed to the user.
|
||||
* @param notifName The internal name of the notification. Should be human-readable, as it will be displayed in the Growl preference pane.
|
||||
* @param iconData <code>NSData</code> object to show with the notification as its icon. If <code>nil</code>, the application's icon will be used instead.
|
||||
* @param priority The priority of the notification. The default value is 0; positive values are higher priority and negative values are lower priority. Not all Growl displays support priority.
|
||||
* @param isSticky If YES, the notification will remain on screen until clicked. Not all Growl displays support sticky notifications.
|
||||
* @param clickContext A context passed back to the Growl delegate if it implements -(void)growlNotificationWasClicked: and the notification is clicked. Not all display plugins support clicking. The clickContext must be plist-encodable (completely of <code>NSString</code>, <code>NSArray</code>, <code>NSNumber</code>, <code>NSDictionary</code>, and <code>NSData</code> types).
|
||||
* @param identifier An identifier for this notification. Notifications with equal identifiers are coalesced.
|
||||
*/
|
||||
+ (void) notifyWithTitle:(NSString *)title
|
||||
description:(NSString *)description
|
||||
notificationName:(NSString *)notifName
|
||||
iconData:(NSData *)iconData
|
||||
priority:(signed int)priority
|
||||
isSticky:(BOOL)isSticky
|
||||
clickContext:(id)clickContext
|
||||
identifier:(NSString *)identifier;
|
||||
|
||||
/*! @method notifyWithDictionary:
|
||||
* @abstract Notifies using a userInfo dictionary suitable for passing to
|
||||
* <code>NSDistributedNotificationCenter</code>.
|
||||
* @param userInfo The dictionary to notify with.
|
||||
* @discussion Before Growl 0.6, your application would have posted
|
||||
* notifications using <code>NSDistributedNotificationCenter</code> by
|
||||
* creating a userInfo dictionary with the notification data. This had the
|
||||
* advantage of allowing you to add other data to the dictionary for programs
|
||||
* besides Growl that might be listening.
|
||||
*
|
||||
* This method allows you to use such dictionaries without being restricted
|
||||
* to using <code>NSDistributedNotificationCenter</code>. The keys for this dictionary
|
||||
* can be found in GrowlDefines.h.
|
||||
*/
|
||||
+ (void) notifyWithDictionary:(NSDictionary *)userInfo;
|
||||
|
||||
#pragma mark -
|
||||
|
||||
/*! @method registerWithDictionary:
|
||||
* @abstract Register your application with Growl without setting a delegate.
|
||||
* @discussion When you call this method with a dictionary,
|
||||
* GrowlApplicationBridge registers your application using that dictionary.
|
||||
* If you pass <code>nil</code>, GrowlApplicationBridge will ask the delegate
|
||||
* (if there is one) for a dictionary, and if that doesn't work, it will look
|
||||
* in your application's bundle for an auto-discoverable plist.
|
||||
* (XXX refer to more information on that)
|
||||
*
|
||||
* If you pass a dictionary to this method, it must include the
|
||||
* <code>GROWL_APP_NAME</code> key, unless a delegate is set.
|
||||
*
|
||||
* This method is mainly an alternative to the delegate system introduced
|
||||
* with Growl 0.6. Without a delegate, you cannot receive callbacks such as
|
||||
* <code>-growlIsReady</code> (since they are sent to the delegate). You can,
|
||||
* however, set a delegate after registering without one.
|
||||
*
|
||||
* This method was introduced in Growl.framework 0.7.
|
||||
*/
|
||||
+ (BOOL) registerWithDictionary:(NSDictionary *)regDict;
|
||||
|
||||
/*! @method reregisterGrowlNotifications
|
||||
* @abstract Reregister the notifications for this application.
|
||||
* @discussion This method does not normally need to be called. If your
|
||||
* application changes what notifications it is registering with Growl, call
|
||||
* this method to have the Growl delegate's
|
||||
* <code>-registrationDictionaryForGrowl</code> method called again and the
|
||||
* Growl registration information updated.
|
||||
*
|
||||
* This method is now implemented using <code>-registerWithDictionary:</code>.
|
||||
*/
|
||||
+ (void) reregisterGrowlNotifications;
|
||||
|
||||
#pragma mark -
|
||||
|
||||
/*! @method setWillRegisterWhenGrowlIsReady:
|
||||
* @abstract Tells GrowlApplicationBridge to register with Growl when Growl
|
||||
* launches (or not).
|
||||
* @discussion When Growl has started listening for notifications, it posts a
|
||||
* <code>GROWL_IS_READY</code> notification on the Distributed Notification
|
||||
* Center. GrowlApplicationBridge listens for this notification, using it to
|
||||
* perform various tasks (such as calling your delegate's
|
||||
* <code>-growlIsReady</code> method, if it has one). If this method is
|
||||
* called with <code>YES</code>, one of those tasks will be to reregister
|
||||
* with Growl (in the manner of <code>-reregisterGrowlNotifications</code>).
|
||||
*
|
||||
* This attribute is automatically set back to <code>NO</code> (the default)
|
||||
* after every <code>GROWL_IS_READY</code> notification.
|
||||
* @param flag <code>YES</code> if you want GrowlApplicationBridge to register with
|
||||
* Growl when next it is ready; <code>NO</code> if not.
|
||||
*/
|
||||
+ (void) setWillRegisterWhenGrowlIsReady:(BOOL)flag;
|
||||
/*! @method willRegisterWhenGrowlIsReady
|
||||
* @abstract Reports whether GrowlApplicationBridge will register with Growl
|
||||
* when Growl next launches.
|
||||
* @result <code>YES</code> if GrowlApplicationBridge will register with Growl
|
||||
* when next it posts GROWL_IS_READY; <code>NO</code> if not.
|
||||
*/
|
||||
+ (BOOL) willRegisterWhenGrowlIsReady;
|
||||
|
||||
#pragma mark -
|
||||
|
||||
/*! @method registrationDictionaryFromDelegate
|
||||
* @abstract Asks the delegate for a registration dictionary.
|
||||
* @discussion If no delegate is set, or if the delegate's
|
||||
* <code>-registrationDictionaryForGrowl</code> method returns
|
||||
* <code>nil</code>, this method returns <code>nil</code>.
|
||||
*
|
||||
* This method does not attempt to clean up the dictionary in any way - for
|
||||
* example, if it is missing the <code>GROWL_APP_NAME</code> key, the result
|
||||
* will be missing it too. Use <code>+[GrowlApplicationBridge
|
||||
* registrationDictionaryByFillingInDictionary:]</code> or
|
||||
* <code>+[GrowlApplicationBridge
|
||||
* registrationDictionaryByFillingInDictionary:restrictToKeys:]</code> to try
|
||||
* to fill in missing keys.
|
||||
*
|
||||
* This method was introduced in Growl.framework 0.7.
|
||||
* @result A registration dictionary.
|
||||
*/
|
||||
+ (NSDictionary *) registrationDictionaryFromDelegate;
|
||||
|
||||
/*! @method registrationDictionaryFromBundle:
|
||||
* @abstract Looks in a bundle for a registration dictionary.
|
||||
* @discussion This method looks in a bundle for an auto-discoverable
|
||||
* registration dictionary file using <code>-[NSBundle
|
||||
* pathForResource:ofType:]</code>. If it finds one, it loads the file using
|
||||
* <code>+[NSDictionary dictionaryWithContentsOfFile:]</code> and returns the
|
||||
* result.
|
||||
*
|
||||
* If you pass <code>nil</code> as the bundle, the main bundle is examined.
|
||||
*
|
||||
* This method does not attempt to clean up the dictionary in any way - for
|
||||
* example, if it is missing the <code>GROWL_APP_NAME</code> key, the result
|
||||
* will be missing it too. Use <code>+[GrowlApplicationBridge
|
||||
* registrationDictionaryByFillingInDictionary:]</code> or
|
||||
* <code>+[GrowlApplicationBridge
|
||||
* registrationDictionaryByFillingInDictionary:restrictToKeys:]</code> to try
|
||||
* to fill in missing keys.
|
||||
*
|
||||
* This method was introduced in Growl.framework 0.7.
|
||||
* @result A registration dictionary.
|
||||
*/
|
||||
+ (NSDictionary *) registrationDictionaryFromBundle:(NSBundle *)bundle;
|
||||
|
||||
/*! @method bestRegistrationDictionary
|
||||
* @abstract Obtains a registration dictionary, filled out to the best of
|
||||
* GrowlApplicationBridge's knowledge.
|
||||
* @discussion This method creates a registration dictionary as best
|
||||
* GrowlApplicationBridge knows how.
|
||||
*
|
||||
* First, GrowlApplicationBridge contacts the Growl delegate (if there is
|
||||
* one) and gets the registration dictionary from that. If no such dictionary
|
||||
* was obtained, GrowlApplicationBridge looks in your application's main
|
||||
* bundle for an auto-discoverable registration dictionary file. If that
|
||||
* doesn't exist either, this method returns <code>nil</code>.
|
||||
*
|
||||
* Second, GrowlApplicationBridge calls
|
||||
* <code>+registrationDictionaryByFillingInDictionary:</code> with whatever
|
||||
* dictionary was obtained. The result of that method is the result of this
|
||||
* method.
|
||||
*
|
||||
* GrowlApplicationBridge uses this method when you call
|
||||
* <code>+setGrowlDelegate:</code>, or when you call
|
||||
* <code>+registerWithDictionary:</code> with <code>nil</code>.
|
||||
*
|
||||
* This method was introduced in Growl.framework 0.7.
|
||||
* @result A registration dictionary.
|
||||
*/
|
||||
+ (NSDictionary *) bestRegistrationDictionary;
|
||||
|
||||
#pragma mark -
|
||||
|
||||
/*! @method registrationDictionaryByFillingInDictionary:
|
||||
* @abstract Tries to fill in missing keys in a registration dictionary.
|
||||
* @discussion This method examines the passed-in dictionary for missing keys,
|
||||
* and tries to work out correct values for them. As of 0.7, it uses:
|
||||
*
|
||||
* Key Value
|
||||
* --- -----
|
||||
* <code>GROWL_APP_NAME</code> <code>CFBundleExecutableName</code>
|
||||
* <code>GROWL_APP_ICON</code> The icon of the application.
|
||||
* <code>GROWL_APP_LOCATION</code> The location of the application.
|
||||
* <code>GROWL_NOTIFICATIONS_DEFAULT</code> <code>GROWL_NOTIFICATIONS_ALL</code>
|
||||
*
|
||||
* Keys are only filled in if missing; if a key is present in the dictionary,
|
||||
* its value will not be changed.
|
||||
*
|
||||
* This method was introduced in Growl.framework 0.7.
|
||||
* @param regDict The dictionary to fill in.
|
||||
* @result The dictionary with the keys filled in. This is an autoreleased
|
||||
* copy of <code>regDict</code>.
|
||||
*/
|
||||
+ (NSDictionary *) registrationDictionaryByFillingInDictionary:(NSDictionary *)regDict;
|
||||
/*! @method registrationDictionaryByFillingInDictionary:restrictToKeys:
|
||||
* @abstract Tries to fill in missing keys in a registration dictionary.
|
||||
* @discussion This method examines the passed-in dictionary for missing keys,
|
||||
* and tries to work out correct values for them. As of 0.7, it uses:
|
||||
*
|
||||
* Key Value
|
||||
* --- -----
|
||||
* <code>GROWL_APP_NAME</code> <code>CFBundleExecutableName</code>
|
||||
* <code>GROWL_APP_ICON</code> The icon of the application.
|
||||
* <code>GROWL_APP_LOCATION</code> The location of the application.
|
||||
* <code>GROWL_NOTIFICATIONS_DEFAULT</code> <code>GROWL_NOTIFICATIONS_ALL</code>
|
||||
*
|
||||
* Only those keys that are listed in <code>keys</code> will be filled in.
|
||||
* Other missing keys are ignored. Also, keys are only filled in if missing;
|
||||
* if a key is present in the dictionary, its value will not be changed.
|
||||
*
|
||||
* This method was introduced in Growl.framework 0.7.
|
||||
* @param regDict The dictionary to fill in.
|
||||
* @param keys The keys to fill in. If <code>nil</code>, any missing keys are filled in.
|
||||
* @result The dictionary with the keys filled in. This is an autoreleased
|
||||
* copy of <code>regDict</code>.
|
||||
*/
|
||||
+ (NSDictionary *) registrationDictionaryByFillingInDictionary:(NSDictionary *)regDict restrictToKeys:(NSSet *)keys;
|
||||
|
||||
/*! @brief Tries to fill in missing keys in a notification dictionary.
|
||||
* @param notifDict The dictionary to fill in.
|
||||
* @return The dictionary with the keys filled in. This will be a separate instance from \a notifDict.
|
||||
* @discussion This function examines the \a notifDict for missing keys, and
|
||||
* tries to get them from the last known registration dictionary. As of 1.1,
|
||||
* the keys that it will look for are:
|
||||
*
|
||||
* \li <code>GROWL_APP_NAME</code>
|
||||
* \li <code>GROWL_APP_ICON</code>
|
||||
*
|
||||
* @since Growl.framework 1.1
|
||||
*/
|
||||
+ (NSDictionary *) notificationDictionaryByFillingInDictionary:(NSDictionary *)regDict;
|
||||
|
||||
+ (NSDictionary *) frameworkInfoDictionary;
|
||||
@end
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
#pragma mark -
|
||||
|
||||
/*!
|
||||
* @protocol GrowlApplicationBridgeDelegate
|
||||
* @abstract Required protocol for the Growl delegate.
|
||||
* @discussion The methods in this protocol are required and are called
|
||||
* automatically as needed by GrowlApplicationBridge. See
|
||||
* <code>+[GrowlApplicationBridge setGrowlDelegate:]</code>.
|
||||
* See also <code>GrowlApplicationBridgeDelegate_InformalProtocol</code>.
|
||||
*/
|
||||
|
||||
@protocol GrowlApplicationBridgeDelegate
|
||||
|
||||
// -registrationDictionaryForGrowl has moved to the informal protocol as of 0.7.
|
||||
|
||||
@end
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
#pragma mark -
|
||||
|
||||
/*!
|
||||
* @category NSObject(GrowlApplicationBridgeDelegate_InformalProtocol)
|
||||
* @abstract Methods which may be optionally implemented by the GrowlDelegate.
|
||||
* @discussion The methods in this informal protocol will only be called if implemented by the delegate.
|
||||
*/
|
||||
@interface NSObject (GrowlApplicationBridgeDelegate_InformalProtocol)
|
||||
|
||||
/*!
|
||||
* @method registrationDictionaryForGrowl
|
||||
* @abstract Return the dictionary used to register this application with Growl.
|
||||
* @discussion The returned dictionary gives Growl the complete list of
|
||||
* notifications this application will ever send, and it also specifies which
|
||||
* notifications should be enabled by default. Each is specified by an array
|
||||
* of <code>NSString</code> objects.
|
||||
*
|
||||
* For most applications, these two arrays can be the same (if all sent
|
||||
* notifications should be displayed by default).
|
||||
*
|
||||
* The <code>NSString</code> objects of these arrays will correspond to the
|
||||
* <code>notificationName:</code> parameter passed in
|
||||
* <code>+[GrowlApplicationBridge
|
||||
* notifyWithTitle:description:notificationName:iconData:priority:isSticky:clickContext:]</code> calls.
|
||||
*
|
||||
* The dictionary should have the required key object pairs:
|
||||
* key: GROWL_NOTIFICATIONS_ALL object: <code>NSArray</code> of <code>NSString</code> objects
|
||||
* key: GROWL_NOTIFICATIONS_DEFAULT object: <code>NSArray</code> of <code>NSString</code> objects
|
||||
*
|
||||
* The dictionary may have the following key object pairs:
|
||||
* key: GROWL_NOTIFICATIONS_HUMAN_READABLE_NAMES object: <code>NSDictionary</code> of key: notification name object: human-readable notification name
|
||||
*
|
||||
* You do not need to implement this method if you have an auto-discoverable
|
||||
* plist file in your app bundle. (XXX refer to more information on that)
|
||||
*
|
||||
* @result The <code>NSDictionary</code> to use for registration.
|
||||
*/
|
||||
- (NSDictionary *) registrationDictionaryForGrowl;
|
||||
|
||||
/*!
|
||||
* @method applicationNameForGrowl
|
||||
* @abstract Return the name of this application which will be used for Growl bookkeeping.
|
||||
* @discussion This name is used both internally and in the Growl preferences.
|
||||
*
|
||||
* This should remain stable between different versions and incarnations of
|
||||
* your application.
|
||||
* For example, "SurfWriter" is a good app name, whereas "SurfWriter 2.0" and
|
||||
* "SurfWriter Lite" are not.
|
||||
*
|
||||
* You do not need to implement this method if you are providing the
|
||||
* application name elsewhere, meaning in an auto-discoverable plist file in
|
||||
* your app bundle (XXX refer to more information on that) or in the result
|
||||
* of -registrationDictionaryForGrowl.
|
||||
*
|
||||
* @result The name of the application using Growl.
|
||||
*/
|
||||
- (NSString *) applicationNameForGrowl;
|
||||
|
||||
/*!
|
||||
* @method applicationIconForGrowl
|
||||
* @abstract Return the <code>NSImage</code> to treat as the application icon.
|
||||
* @discussion The delegate may optionally return an <code>NSImage</code>
|
||||
* object to use as the application icon. If this method is not implemented,
|
||||
* {{{-applicationIconDataForGrowl}}} is tried. If that method is not
|
||||
* implemented, the application's own icon is used. Neither method is
|
||||
* generally needed.
|
||||
* @result The <code>NSImage</code> to treat as the application icon.
|
||||
*/
|
||||
- (NSImage *) applicationIconForGrowl;
|
||||
|
||||
/*!
|
||||
* @method applicationIconDataForGrowl
|
||||
* @abstract Return the <code>NSData</code> to treat as the application icon.
|
||||
* @discussion The delegate may optionally return an <code>NSData</code>
|
||||
* object to use as the application icon; if this is not implemented, the
|
||||
* application's own icon is used. This is not generally needed.
|
||||
* @result The <code>NSData</code> to treat as the application icon.
|
||||
* @deprecated In version 1.1, in favor of {{{-applicationIconForGrowl}}}.
|
||||
*/
|
||||
- (NSData *) applicationIconDataForGrowl;
|
||||
|
||||
/*!
|
||||
* @method growlIsReady
|
||||
* @abstract Informs the delegate that Growl has launched.
|
||||
* @discussion Informs the delegate that Growl (specifically, the
|
||||
* GrowlHelperApp) was launched successfully. The application can take actions
|
||||
* with the knowledge that Growl is installed and functional.
|
||||
*/
|
||||
- (void) growlIsReady;
|
||||
|
||||
/*!
|
||||
* @method growlNotificationWasClicked:
|
||||
* @abstract Informs the delegate that a Growl notification was clicked.
|
||||
* @discussion Informs the delegate that a Growl notification was clicked. It
|
||||
* is only sent for notifications sent with a non-<code>nil</code>
|
||||
* clickContext, so if you want to receive a message when a notification is
|
||||
* clicked, clickContext must not be <code>nil</code> when calling
|
||||
* <code>+[GrowlApplicationBridge notifyWithTitle: description:notificationName:iconData:priority:isSticky:clickContext:]</code>.
|
||||
* @param clickContext The clickContext passed when displaying the notification originally via +[GrowlApplicationBridge notifyWithTitle:description:notificationName:iconData:priority:isSticky:clickContext:].
|
||||
*/
|
||||
- (void) growlNotificationWasClicked:(id)clickContext;
|
||||
|
||||
/*!
|
||||
* @method growlNotificationTimedOut:
|
||||
* @abstract Informs the delegate that a Growl notification timed out.
|
||||
* @discussion Informs the delegate that a Growl notification timed out. It
|
||||
* is only sent for notifications sent with a non-<code>nil</code>
|
||||
* clickContext, so if you want to receive a message when a notification is
|
||||
* clicked, clickContext must not be <code>nil</code> when calling
|
||||
* <code>+[GrowlApplicationBridge notifyWithTitle: description:notificationName:iconData:priority:isSticky:clickContext:]</code>.
|
||||
* @param clickContext The clickContext passed when displaying the notification originally via +[GrowlApplicationBridge notifyWithTitle:description:notificationName:iconData:priority:isSticky:clickContext:].
|
||||
*/
|
||||
- (void) growlNotificationTimedOut:(id)clickContext;
|
||||
|
||||
@end
|
||||
|
||||
#pragma mark -
|
||||
/*!
|
||||
* @category NSObject(GrowlApplicationBridgeDelegate_Installation_InformalProtocol)
|
||||
* @abstract Methods which may be optionally implemented by the Growl delegate when used with Growl-WithInstaller.framework.
|
||||
* @discussion The methods in this informal protocol will only be called if
|
||||
* implemented by the delegate. They allow greater control of the information
|
||||
* presented to the user when installing or upgrading Growl from within your
|
||||
* application when using Growl-WithInstaller.framework.
|
||||
*/
|
||||
@interface NSObject (GrowlApplicationBridgeDelegate_Installation_InformalProtocol)
|
||||
|
||||
/*!
|
||||
* @method growlInstallationWindowTitle
|
||||
* @abstract Return the title of the installation window.
|
||||
* @discussion If not implemented, Growl will use a default, localized title.
|
||||
* @result An NSString object to use as the title.
|
||||
*/
|
||||
- (NSString *)growlInstallationWindowTitle;
|
||||
|
||||
/*!
|
||||
* @method growlUpdateWindowTitle
|
||||
* @abstract Return the title of the upgrade window.
|
||||
* @discussion If not implemented, Growl will use a default, localized title.
|
||||
* @result An NSString object to use as the title.
|
||||
*/
|
||||
- (NSString *)growlUpdateWindowTitle;
|
||||
|
||||
/*!
|
||||
* @method growlInstallationInformation
|
||||
* @abstract Return the information to display when installing.
|
||||
* @discussion This information may be as long or short as desired (the window
|
||||
* will be sized to fit it). It will be displayed to the user as an
|
||||
* explanation of what Growl is and what it can do in your application. It
|
||||
* should probably note that no download is required to install.
|
||||
*
|
||||
* If this is not implemented, Growl will use a default, localized explanation.
|
||||
* @result An NSAttributedString object to display.
|
||||
*/
|
||||
- (NSAttributedString *)growlInstallationInformation;
|
||||
|
||||
/*!
|
||||
* @method growlUpdateInformation
|
||||
* @abstract Return the information to display when upgrading.
|
||||
* @discussion This information may be as long or short as desired (the window
|
||||
* will be sized to fit it). It will be displayed to the user as an
|
||||
* explanation that an updated version of Growl is included in your
|
||||
* application and no download is required.
|
||||
*
|
||||
* If this is not implemented, Growl will use a default, localized explanation.
|
||||
* @result An NSAttributedString object to display.
|
||||
*/
|
||||
- (NSAttributedString *)growlUpdateInformation;
|
||||
|
||||
@end
|
||||
|
||||
//private
|
||||
@interface GrowlApplicationBridge (GrowlInstallationPrompt_private)
|
||||
+ (void) _userChoseNotToInstallGrowl;
|
||||
@end
|
||||
|
||||
#endif /* __GrowlApplicationBridge_h__ */
|
||||
@@ -0,0 +1,348 @@
|
||||
//
|
||||
// GrowlDefines.h
|
||||
//
|
||||
|
||||
#ifndef _GROWLDEFINES_H
|
||||
#define _GROWLDEFINES_H
|
||||
|
||||
#ifdef __OBJC__
|
||||
#define XSTR(x) (@x)
|
||||
#define STRING_TYPE NSString *
|
||||
#else
|
||||
#define XSTR CFSTR
|
||||
#define STRING_TYPE CFStringRef
|
||||
#endif
|
||||
|
||||
/*! @header GrowlDefines.h
|
||||
* @abstract Defines all the notification keys.
|
||||
* @discussion Defines all the keys used for registration with Growl and for
|
||||
* Growl notifications.
|
||||
*
|
||||
* Most applications should use the functions or methods of Growl.framework
|
||||
* instead of posting notifications such as those described here.
|
||||
* @updated 2004-01-25
|
||||
*/
|
||||
|
||||
// UserInfo Keys for Registration
|
||||
#pragma mark UserInfo Keys for Registration
|
||||
|
||||
/*! @group Registration userInfo keys */
|
||||
/* @abstract Keys for the userInfo dictionary of a GROWL_APP_REGISTRATION distributed notification.
|
||||
* @discussion The values of these keys describe the application and the
|
||||
* notifications it may post.
|
||||
*
|
||||
* Your application must register with Growl before it can post Growl
|
||||
* notifications (and have them not be ignored). However, as of Growl 0.6,
|
||||
* posting GROWL_APP_REGISTRATION notifications directly is no longer the
|
||||
* preferred way to register your application. Your application should instead
|
||||
* use Growl.framework's delegate system.
|
||||
* See +[GrowlApplicationBridge setGrowlDelegate:] or Growl_SetDelegate for
|
||||
* more information.
|
||||
*/
|
||||
|
||||
/*! @defined GROWL_APP_NAME
|
||||
* @abstract The name of your application.
|
||||
* @discussion The name of your application. This should remain stable between
|
||||
* different versions and incarnations of your application.
|
||||
* For example, "SurfWriter" is a good app name, whereas "SurfWriter 2.0" and
|
||||
* "SurfWriter Lite" are not.
|
||||
*/
|
||||
#define GROWL_APP_NAME XSTR("ApplicationName")
|
||||
/*! @defined GROWL_APP_ID
|
||||
* @abstract The bundle identifier of your application.
|
||||
* @discussion The bundle identifier of your application. This key should
|
||||
* be unique for your application while there may be several applications
|
||||
* with the same GROWL_APP_NAME.
|
||||
* This key is optional.
|
||||
*/
|
||||
#define GROWL_APP_ID XSTR("ApplicationId")
|
||||
/*! @defined GROWL_APP_ICON
|
||||
* @abstract The image data for your application's icon.
|
||||
* @discussion Image data representing your application's icon. This may be
|
||||
* superimposed on a notification icon as a badge, used as the notification
|
||||
* icon when a notification-specific icon is not supplied, or ignored
|
||||
* altogether, depending on the display. Must be in a format supported by
|
||||
* NSImage, such as TIFF, PNG, GIF, JPEG, BMP, PICT, or PDF.
|
||||
*
|
||||
* Optional. Not supported by all display plugins.
|
||||
*/
|
||||
#define GROWL_APP_ICON XSTR("ApplicationIcon")
|
||||
/*! @defined GROWL_NOTIFICATIONS_DEFAULT
|
||||
* @abstract The array of notifications to turn on by default.
|
||||
* @discussion These are the names of the notifications that should be enabled
|
||||
* by default when your application registers for the first time. If your
|
||||
* application reregisters, Growl will look here for any new notification
|
||||
* names found in GROWL_NOTIFICATIONS_ALL, but ignore any others.
|
||||
*/
|
||||
#define GROWL_NOTIFICATIONS_DEFAULT XSTR("DefaultNotifications")
|
||||
/*! @defined GROWL_NOTIFICATIONS_ALL
|
||||
* @abstract The array of all notifications your application can send.
|
||||
* @discussion These are the names of all of the notifications that your
|
||||
* application may post. See GROWL_NOTIFICATION_NAME for a discussion of good
|
||||
* notification names.
|
||||
*/
|
||||
#define GROWL_NOTIFICATIONS_ALL XSTR("AllNotifications")
|
||||
/*! @defined GROWL_NOTIFICATIONS_HUMAN_READABLE_DESCRIPTIONS
|
||||
* @abstract A dictionary of human-readable names for your notifications.
|
||||
* @discussion By default, the Growl UI will display notifications by the names given in GROWL_NOTIFICATIONS_ALL
|
||||
* which correspond to the GROWL_NOTIFICATION_NAME. This dictionary specifies the human-readable name to display.
|
||||
* The keys of the dictionary are GROWL_NOTIFICATION_NAME strings; the objects are the human-readable versions.
|
||||
* For any GROWL_NOTIFICATION_NAME not specific in this dictionary, the GROWL_NOTIFICATION_NAME will be displayed.
|
||||
*
|
||||
* This key is optional.
|
||||
*/
|
||||
#define GROWL_NOTIFICATIONS_HUMAN_READABLE_NAMES XSTR("HumanReadableNames")
|
||||
/*! @defined GROWL_NOTIFICATIONS_DESCRIPTIONS
|
||||
* @abstract A dictionary of descriptions of _when_ each notification occurs
|
||||
* @discussion This is an NSDictionary whose keys are GROWL_NOTIFICATION_NAME strings and whose objects are
|
||||
* descriptions of _when_ each notification occurs, such as "You received a new mail message" or
|
||||
* "A file finished downloading".
|
||||
*
|
||||
* This key is optional.
|
||||
*/
|
||||
#define GROWL_NOTIFICATIONS_DESCRIPTIONS XSTR("NotificationDescriptions")
|
||||
|
||||
/*! @defined GROWL_TICKET_VERSION
|
||||
* @abstract The version of your registration ticket.
|
||||
* @discussion Include this key in a ticket plist file that you put in your
|
||||
* application bundle for auto-discovery. The current ticket version is 1.
|
||||
*/
|
||||
#define GROWL_TICKET_VERSION XSTR("TicketVersion")
|
||||
// UserInfo Keys for Notifications
|
||||
#pragma mark UserInfo Keys for Notifications
|
||||
|
||||
/*! @group Notification userInfo keys */
|
||||
/* @abstract Keys for the userInfo dictionary of a GROWL_NOTIFICATION distributed notification.
|
||||
* @discussion The values of these keys describe the content of a Growl
|
||||
* notification.
|
||||
*
|
||||
* Not all of these keys are supported by all displays. Only the name, title,
|
||||
* and description of a notification are universal. Most of the built-in
|
||||
* displays do support all of these keys, and most other visual displays
|
||||
* probably will also. But, as of 0.6, the Log, MailMe, and Speech displays
|
||||
* support only textual data.
|
||||
*/
|
||||
|
||||
/*! @defined GROWL_NOTIFICATION_NAME
|
||||
* @abstract The name of the notification.
|
||||
* @discussion The name of the notification. Note that if you do not define
|
||||
* GROWL_NOTIFICATIONS_HUMAN_READABLE_NAMES when registering your ticket originally this name
|
||||
* will the one displayed within the Growl preference pane and should be human-readable.
|
||||
*/
|
||||
#define GROWL_NOTIFICATION_NAME XSTR("NotificationName")
|
||||
/*! @defined GROWL_NOTIFICATION_TITLE
|
||||
* @abstract The title to display in the notification.
|
||||
* @discussion The title of the notification. Should be very brief.
|
||||
* The title usually says what happened, e.g. "Download complete".
|
||||
*/
|
||||
#define GROWL_NOTIFICATION_TITLE XSTR("NotificationTitle")
|
||||
/*! @defined GROWL_NOTIFICATION_DESCRIPTION
|
||||
* @abstract The description to display in the notification.
|
||||
* @discussion The description should be longer and more verbose than the title.
|
||||
* The description usually tells the subject of the action,
|
||||
* e.g. "Growl-0.6.dmg downloaded in 5.02 minutes".
|
||||
*/
|
||||
#define GROWL_NOTIFICATION_DESCRIPTION XSTR("NotificationDescription")
|
||||
/*! @defined GROWL_NOTIFICATION_ICON
|
||||
* @discussion Image data for the notification icon. Must be in a format
|
||||
* supported by NSImage, such as TIFF, PNG, GIF, JPEG, BMP, PICT, or PDF.
|
||||
*
|
||||
* Optional. Not supported by all display plugins.
|
||||
*/
|
||||
#define GROWL_NOTIFICATION_ICON XSTR("NotificationIcon")
|
||||
/*! @defined GROWL_NOTIFICATION_APP_ICON
|
||||
* @discussion Image data for the application icon, in case GROWL_APP_ICON does
|
||||
* not apply for some reason. Must be in a format supported by NSImage, such
|
||||
* as TIFF, PNG, GIF, JPEG, BMP, PICT, or PDF.
|
||||
*
|
||||
* Optional. Not supported by all display plugins.
|
||||
*/
|
||||
#define GROWL_NOTIFICATION_APP_ICON XSTR("NotificationAppIcon")
|
||||
/*! @defined GROWL_NOTIFICATION_PRIORITY
|
||||
* @discussion The priority of the notification as an integer number from
|
||||
* -2 to +2 (+2 being highest).
|
||||
*
|
||||
* Optional. Not supported by all display plugins.
|
||||
*/
|
||||
#define GROWL_NOTIFICATION_PRIORITY XSTR("NotificationPriority")
|
||||
/*! @defined GROWL_NOTIFICATION_STICKY
|
||||
* @discussion A Boolean number controlling whether the notification is sticky.
|
||||
*
|
||||
* Optional. Not supported by all display plugins.
|
||||
*/
|
||||
#define GROWL_NOTIFICATION_STICKY XSTR("NotificationSticky")
|
||||
/*! @defined GROWL_NOTIFICATION_CLICK_CONTEXT
|
||||
* @abstract Identifies which notification was clicked.
|
||||
* @discussion An identifier for the notification for clicking purposes.
|
||||
*
|
||||
* This will be passed back to the application when the notification is
|
||||
* clicked. It must be plist-encodable (a data, dictionary, array, number, or
|
||||
* string object), and it should be unique for each notification you post.
|
||||
* A good click context would be a UUID string returned by NSProcessInfo or
|
||||
* CFUUID.
|
||||
*
|
||||
* Optional. Not supported by all display plugins.
|
||||
*/
|
||||
#define GROWL_NOTIFICATION_CLICK_CONTEXT XSTR("NotificationClickContext")
|
||||
|
||||
/*! @defined GROWL_DISPLAY_PLUGIN
|
||||
* @discussion The name of a display plugin which should be used for this notification.
|
||||
* Optional. If this key is not set or the specified display plugin does not
|
||||
* exist, the display plugin stored in the application ticket is used. This key
|
||||
* allows applications to use different default display plugins for their
|
||||
* notifications. The user can still override those settings in the preference
|
||||
* pane.
|
||||
*/
|
||||
#define GROWL_DISPLAY_PLUGIN XSTR("NotificationDisplayPlugin")
|
||||
|
||||
/*! @defined GROWL_NOTIFICATION_IDENTIFIER
|
||||
* @abstract An identifier for the notification for coalescing purposes.
|
||||
* Notifications with the same identifier fall into the same class; only
|
||||
* the last notification of a class is displayed on the screen. If a
|
||||
* notification of the same class is currently being displayed, it is
|
||||
* replaced by this notification.
|
||||
*
|
||||
* Optional. Not supported by all display plugins.
|
||||
*/
|
||||
#define GROWL_NOTIFICATION_IDENTIFIER XSTR("GrowlNotificationIdentifier")
|
||||
|
||||
/*! @defined GROWL_APP_PID
|
||||
* @abstract The process identifier of the process which sends this
|
||||
* notification. If this field is set, the application will only receive
|
||||
* clicked and timed out notifications which originate from this process.
|
||||
*
|
||||
* Optional.
|
||||
*/
|
||||
#define GROWL_APP_PID XSTR("ApplicationPID")
|
||||
|
||||
/*! @defined GROWL_NOTIFICATION_PROGRESS
|
||||
* @abstract If this key is set, it should contain a double value wrapped
|
||||
* in a NSNumber which describes some sort of progress (from 0.0 to 100.0).
|
||||
* If this is key is not set, no progress bar is shown.
|
||||
*
|
||||
* Optional. Not supported by all display plugins.
|
||||
*/
|
||||
#define GROWL_NOTIFICATION_PROGRESS XSTR("NotificationProgress")
|
||||
|
||||
// Notifications
|
||||
#pragma mark Notifications
|
||||
|
||||
/*! @group Notification names */
|
||||
/* @abstract Names of distributed notifications used by Growl.
|
||||
* @discussion These are notifications used by applications (directly or
|
||||
* indirectly) to interact with Growl, and by Growl for interaction between
|
||||
* its components.
|
||||
*
|
||||
* Most of these should no longer be used in Growl 0.6 and later, in favor of
|
||||
* Growl.framework's GrowlApplicationBridge APIs.
|
||||
*/
|
||||
|
||||
/*! @defined GROWL_APP_REGISTRATION
|
||||
* @abstract The distributed notification for registering your application.
|
||||
* @discussion This is the name of the distributed notification that can be
|
||||
* used to register applications with Growl.
|
||||
*
|
||||
* The userInfo dictionary for this notification can contain these keys:
|
||||
* <ul>
|
||||
* <li>GROWL_APP_NAME</li>
|
||||
* <li>GROWL_APP_ICON</li>
|
||||
* <li>GROWL_NOTIFICATIONS_ALL</li>
|
||||
* <li>GROWL_NOTIFICATIONS_DEFAULT</li>
|
||||
* </ul>
|
||||
*
|
||||
* No longer recommended as of Growl 0.6. An alternate method of registering
|
||||
* is to use Growl.framework's delegate system.
|
||||
* See +[GrowlApplicationBridge setGrowlDelegate:] or Growl_SetDelegate for
|
||||
* more information.
|
||||
*/
|
||||
#define GROWL_APP_REGISTRATION XSTR("GrowlApplicationRegistrationNotification")
|
||||
/*! @defined GROWL_APP_REGISTRATION_CONF
|
||||
* @abstract The distributed notification for confirming registration.
|
||||
* @discussion The name of the distributed notification sent to confirm the
|
||||
* registration. Used by the Growl preference pane. Your application probably
|
||||
* does not need to use this notification.
|
||||
*/
|
||||
#define GROWL_APP_REGISTRATION_CONF XSTR("GrowlApplicationRegistrationConfirmationNotification")
|
||||
/*! @defined GROWL_NOTIFICATION
|
||||
* @abstract The distributed notification for Growl notifications.
|
||||
* @discussion This is what it all comes down to. This is the name of the
|
||||
* distributed notification that your application posts to actually send a
|
||||
* Growl notification.
|
||||
*
|
||||
* The userInfo dictionary for this notification can contain these keys:
|
||||
* <ul>
|
||||
* <li>GROWL_NOTIFICATION_NAME (required)</li>
|
||||
* <li>GROWL_NOTIFICATION_TITLE (required)</li>
|
||||
* <li>GROWL_NOTIFICATION_DESCRIPTION (required)</li>
|
||||
* <li>GROWL_NOTIFICATION_ICON</li>
|
||||
* <li>GROWL_NOTIFICATION_APP_ICON</li>
|
||||
* <li>GROWL_NOTIFICATION_PRIORITY</li>
|
||||
* <li>GROWL_NOTIFICATION_STICKY</li>
|
||||
* <li>GROWL_NOTIFICATION_CLICK_CONTEXT</li>
|
||||
* <li>GROWL_APP_NAME (required)</li>
|
||||
* </ul>
|
||||
*
|
||||
* No longer recommended as of Growl 0.6. Three alternate methods of posting
|
||||
* notifications are +[GrowlApplicationBridge notifyWithTitle:description:notificationName:iconData:priority:isSticky:clickContext:],
|
||||
* Growl_NotifyWithTitleDescriptionNameIconPriorityStickyClickContext, and
|
||||
* Growl_PostNotification.
|
||||
*/
|
||||
#define GROWL_NOTIFICATION XSTR("GrowlNotification")
|
||||
/*! @defined GROWL_SHUTDOWN
|
||||
* @abstract The distributed notification name that tells Growl to shutdown.
|
||||
* @discussion The Growl preference pane posts this notification when the
|
||||
* "Stop Growl" button is clicked.
|
||||
*/
|
||||
#define GROWL_SHUTDOWN XSTR("GrowlShutdown")
|
||||
/*! @defined GROWL_PING
|
||||
* @abstract A distributed notification to check whether Growl is running.
|
||||
* @discussion This is used by the Growl preference pane. If it receives a
|
||||
* GROWL_PONG, the preference pane takes this to mean that Growl is running.
|
||||
*/
|
||||
#define GROWL_PING XSTR("Honey, Mind Taking Out The Trash")
|
||||
/*! @defined GROWL_PONG
|
||||
* @abstract The distributed notification sent in reply to GROWL_PING.
|
||||
* @discussion GrowlHelperApp posts this in reply to GROWL_PING.
|
||||
*/
|
||||
#define GROWL_PONG XSTR("What Do You Want From Me, Woman")
|
||||
/*! @defined GROWL_IS_READY
|
||||
* @abstract The distributed notification sent when Growl starts up.
|
||||
* @discussion GrowlHelperApp posts this when it has begin listening on all of
|
||||
* its sources for new notifications. GrowlApplicationBridge (in
|
||||
* Growl.framework), upon receiving this notification, reregisters using the
|
||||
* registration dictionary supplied by its delegate.
|
||||
*/
|
||||
#define GROWL_IS_READY XSTR("Lend Me Some Sugar; I Am Your Neighbor!")
|
||||
/*! @defined GROWL_NOTIFICATION_CLICKED
|
||||
* @abstract The distributed notification sent when a supported notification is clicked.
|
||||
* @discussion When a Growl notification with a click context is clicked on by
|
||||
* the user, Growl posts this distributed notification.
|
||||
* The GrowlApplicationBridge responds to this notification by calling a
|
||||
* callback in its delegate.
|
||||
*/
|
||||
#define GROWL_NOTIFICATION_CLICKED XSTR("GrowlClicked!")
|
||||
#define GROWL_NOTIFICATION_TIMED_OUT XSTR("GrowlTimedOut!")
|
||||
|
||||
/*! @group Other symbols */
|
||||
/* Symbols which don't fit into any of the other categories. */
|
||||
|
||||
/*! @defined GROWL_KEY_CLICKED_CONTEXT
|
||||
* @abstract Used internally as the key for the clickedContext passed over DNC.
|
||||
* @discussion This key is used in GROWL_NOTIFICATION_CLICKED, and contains the
|
||||
* click context that was supplied in the original notification.
|
||||
*/
|
||||
#define GROWL_KEY_CLICKED_CONTEXT XSTR("ClickedContext")
|
||||
/*! @defined GROWL_REG_DICT_EXTENSION
|
||||
* @abstract The filename extension for registration dictionaries.
|
||||
* @discussion The GrowlApplicationBridge in Growl.framework registers with
|
||||
* Growl by creating a file with the extension of .(GROWL_REG_DICT_EXTENSION)
|
||||
* and opening it in the GrowlHelperApp. This happens whether or not Growl is
|
||||
* running; if it was stopped, it quits immediately without listening for
|
||||
* notifications.
|
||||
*/
|
||||
#define GROWL_REG_DICT_EXTENSION XSTR("growlRegDict")
|
||||
|
||||
|
||||
#define GROWL_POSITION_PREFERENCE_KEY @"GrowlSelectedPosition"
|
||||
|
||||
#endif //ndef _GROWLDEFINES_H
|
||||
@@ -0,0 +1,24 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
||||
<plist version="1.0">
|
||||
<dict>
|
||||
<key>CFBundleDevelopmentRegion</key>
|
||||
<string>English</string>
|
||||
<key>CFBundleExecutable</key>
|
||||
<string>Growl</string>
|
||||
<key>CFBundleIdentifier</key>
|
||||
<string>com.growl.growlframework</string>
|
||||
<key>CFBundleInfoDictionaryVersion</key>
|
||||
<string>6.0</string>
|
||||
<key>CFBundlePackageType</key>
|
||||
<string>FMWK</string>
|
||||
<key>CFBundleShortVersionString</key>
|
||||
<string>1.2.1</string>
|
||||
<key>CFBundleSignature</key>
|
||||
<string>GRRR</string>
|
||||
<key>CFBundleVersion</key>
|
||||
<string>1.2.1</string>
|
||||
<key>NSPrincipalClass</key>
|
||||
<string>GrowlApplicationBridge</string>
|
||||
</dict>
|
||||
</plist>
|
||||
@@ -0,0 +1 @@
|
||||
A
|
||||
@@ -0,0 +1,30 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
||||
<plist version="1.0">
|
||||
<dict>
|
||||
<key>CFBundleDevelopmentRegion</key>
|
||||
<string>English</string>
|
||||
<key>CFBundleExecutable</key>
|
||||
<string>${EXECUTABLE_NAME}</string>
|
||||
<key>CFBundleIconFile</key>
|
||||
<string>xcodecapp-cocoa.icns</string>
|
||||
<key>CFBundleIdentifier</key>
|
||||
<string>org.cappuccino.xcodecapp-cocoa</string>
|
||||
<key>CFBundleInfoDictionaryVersion</key>
|
||||
<string>6.0</string>
|
||||
<key>CFBundleName</key>
|
||||
<string>${PRODUCT_NAME}</string>
|
||||
<key>CFBundlePackageType</key>
|
||||
<string>APPL</string>
|
||||
<key>CFBundleSignature</key>
|
||||
<string>????</string>
|
||||
<key>CFBundleVersion</key>
|
||||
<string>1.0</string>
|
||||
<key>NSMainNibFile</key>
|
||||
<string>MainMenu</string>
|
||||
<key>NSPrincipalClass</key>
|
||||
<string>NSApplication</string>
|
||||
<key>LSUIElement</key>
|
||||
<true/>
|
||||
</dict>
|
||||
</plist>
|
||||
@@ -0,0 +1,19 @@
|
||||
# xCodeCapp-Cocoa
|
||||
|
||||
xcodecapp-cocoa is a port from the original xcodecapp application. It works basically the same than this
|
||||
tools shipped with Cappuccino framework but have serveral advantages:
|
||||
|
||||
* It uses the FSEventStream system to be notified when a file changes. So no useless looping
|
||||
* It consumes about no CPU when idle
|
||||
* It allows you to choose graphically the project you want to use
|
||||
* It will keep track of your already generated project helper
|
||||
* It supports .xcodecapp-ignore
|
||||
* It uses Growl to notify you when a conversion is done.
|
||||
|
||||
# License
|
||||
|
||||
All the code is distributed under AGPL v3.0 license. The parse.j comes from Cappuccino parser and uses the Cappuccino license.
|
||||
|
||||
# Author
|
||||
|
||||
Antoine Meradal <primalmotion@archipelproject.org>
|
||||
@@ -0,0 +1,26 @@
|
||||
/*
|
||||
* xcodecapp-cocoa.sh
|
||||
*
|
||||
* Copyright (C) 2010 Antoine Mercadal <antoine.mercadal@inframonde.eu>
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Affero General Public License as
|
||||
* published by the Free Software Foundation, either version 3 of the
|
||||
* License, or (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Affero General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Affero General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
|
||||
#import <Cocoa/Cocoa.h>
|
||||
#include <CoreServices/CoreServices.h>
|
||||
|
||||
int main(int argc, char *argv[])
|
||||
{
|
||||
return NSApplicationMain(argc, (const char **) argv);
|
||||
}
|
||||
@@ -0,0 +1,464 @@
|
||||
|
||||
@import <Foundation/Foundation.j>
|
||||
|
||||
var FILE = require("file");
|
||||
|
||||
function main(args)
|
||||
{
|
||||
var fileURL = new CFURL(args[1]),
|
||||
outputURL = new CFURL(args[2]),
|
||||
source = FILE.read(fileURL, { charset: "UTF-8" }),
|
||||
flags = ObjectiveJ.Preprocessor.Flags.IncludeDebugSymbols |
|
||||
ObjectiveJ.Preprocessor.Flags.IncludeTypeSignatures,
|
||||
superClasses = { };
|
||||
|
||||
source = ObjectiveJ.preprocess(source, fileURL, flags).code();
|
||||
|
||||
source = source.replace(/objj_allocateClassPair\([a-zA-Z_$](\w|$)*/g, function(aString)
|
||||
{
|
||||
var superClassName = aString.substr("objj_allocateClassPair(".length);
|
||||
|
||||
return "objj_allocateClassPair(\"" + superClassName + "\", CPObject";
|
||||
});
|
||||
|
||||
var allocateClassPair = objj_allocateClassPair;
|
||||
|
||||
objj_allocateClassPair = function(superClassName)
|
||||
{
|
||||
superClasses[arguments[2]] = superClassName;
|
||||
return allocateClassPair(arguments[1], arguments[2]);
|
||||
}
|
||||
|
||||
var classes = [],
|
||||
registerClassPair = objj_registerClassPair;
|
||||
|
||||
objj_registerClassPair = function(aClass)
|
||||
{
|
||||
aClass.actual_super_class;
|
||||
registerClassPair(aClass);
|
||||
classes.push(aClass);
|
||||
}
|
||||
|
||||
objj_executeFile = function()
|
||||
{
|
||||
}
|
||||
|
||||
eval(source);
|
||||
|
||||
var ObjectiveCSource = "";
|
||||
|
||||
classes.forEach(function(aClass)
|
||||
{
|
||||
var outlets = [];
|
||||
|
||||
class_copyIvarList(aClass).forEach(function(anIvar)
|
||||
{
|
||||
var types = ivar_getTypeEncoding(anIvar).split(" ");
|
||||
|
||||
if (types.indexOf("IBOutlet") !== CPNotFound || types.indexOf("@outlet") !== CPNotFound)
|
||||
{
|
||||
types.forEach(function(aType, anIndex)
|
||||
{
|
||||
if (aType === "@outlet")
|
||||
types[anIndex] = "IBOutlet";
|
||||
|
||||
else if (aType !== "IBOutlet")
|
||||
types[anIndex] = NSCompatibleClassName(aType, YES);
|
||||
});
|
||||
|
||||
outlets.push(" " + types.join(" ") + " " + ivar_getName(anIvar) + ";");
|
||||
}
|
||||
});
|
||||
|
||||
var actions = [];
|
||||
|
||||
class_copyMethodList(aClass).forEach(function(aMethod)
|
||||
{
|
||||
var types = aMethod.types,
|
||||
type = types[0];
|
||||
|
||||
if (type === "IBAction" || type === "@action")
|
||||
actions.push("- (IBAction)" + method_getName(aMethod) + "(" + NSCompatibleClassName(types[1] || "id", YES)+ ")aSender;");
|
||||
});
|
||||
|
||||
var className = class_getName(aClass),
|
||||
superClassName = superClasses[className];
|
||||
|
||||
ObjectiveCSource +=
|
||||
"\n@interface " + class_getName(aClass) +
|
||||
(superClassName === "Nil" ? "" : (" : " + NSCompatibleClassName(superClassName))) +
|
||||
"\n{\n" +
|
||||
outlets.join("\n") +
|
||||
"\n}\n" +
|
||||
actions.join("\n") +
|
||||
"\n@end";
|
||||
});
|
||||
|
||||
if (ObjectiveCSource.length)
|
||||
FILE.write(outputURL, ObjectiveCSource, { charset:"UTF-8" });
|
||||
}
|
||||
|
||||
function NSCompatibleClassName(aClassName, asPointer)
|
||||
{
|
||||
if (aClassName === "var" || aClassName === "id")
|
||||
return "id";
|
||||
|
||||
var suffix = aClassName.substr(0, 2),
|
||||
asterisk = asPointer ? "*" : "";
|
||||
|
||||
if (suffix !== "CP")
|
||||
return aClassName + asterisk;
|
||||
|
||||
var NSClassName = "NS" + aClassName.substr(2);
|
||||
|
||||
if (NSClasses[NSClassName])
|
||||
return NSClassName + asterisk;
|
||||
|
||||
return aClassName + asterisk;
|
||||
}
|
||||
|
||||
var NSClasses = {
|
||||
"NSAffineTransform" : YES,
|
||||
"NSAppleEventDescriptor" : YES,
|
||||
"NSAppleEventManager" : YES,
|
||||
"NSAppleScript" : YES,
|
||||
"NSArchiver" : YES,
|
||||
"NSArray" : YES,
|
||||
"NSAssertionHandler" : YES,
|
||||
"NSAttributedString" : YES,
|
||||
"NSAutoreleasePool" : YES,
|
||||
"NSBlockOperation" : YES,
|
||||
"NSBundle" : YES,
|
||||
"NSCache" : YES,
|
||||
"NSCachedURLResponse" : YES,
|
||||
"NSCalendar" : YES,
|
||||
"NSCharacterSet" : YES,
|
||||
"NSClassDescription" : YES,
|
||||
"NSCloneCommand" : YES,
|
||||
"NSCloseCommand" : YES,
|
||||
"NSCoder" : YES,
|
||||
"NSComparisonPredicate" : YES,
|
||||
"NSCompoundPredicate" : YES,
|
||||
"NSCondition" : YES,
|
||||
"NSConditionLock" : YES,
|
||||
"NSConnection" : YES,
|
||||
"NSCountCommand" : YES,
|
||||
"NSCountedSet" : YES,
|
||||
"NSCreateCommand" : YES,
|
||||
"NSData" : YES,
|
||||
"NSDate" : YES,
|
||||
"NSDateComponents" : YES,
|
||||
"NSDateFormatter" : YES,
|
||||
"NSDecimalNumber" : YES,
|
||||
"NSDecimalNumberHandler" : YES,
|
||||
"NSDeleteCommand" : YES,
|
||||
"NSDeserializer" : YES,
|
||||
"NSDictionary" : YES,
|
||||
"NSDirectoryEnumerator" : YES,
|
||||
"NSDistantObject" : YES,
|
||||
"NSDistantObjectRequest" : YES,
|
||||
"NSDistributedLock" : YES,
|
||||
"NSDistributedNotificationCenter" : YES,
|
||||
"NSEnumerator" : YES,
|
||||
"NSError" : YES,
|
||||
"NSException" : YES,
|
||||
"NSExistsCommand" : YES,
|
||||
"NSExpression" : YES,
|
||||
"NSFileHandle" : YES,
|
||||
"NSFileManager" : YES,
|
||||
"NSFileWrapper" : YES,
|
||||
"NSFormatter" : YES,
|
||||
"NSGarbageCollector" : YES,
|
||||
"NSGetCommand" : YES,
|
||||
"NSHashTable" : YES,
|
||||
"NSHost" : YES,
|
||||
"NSHTTPCookie" : YES,
|
||||
"NSHTTPCookieStorage" : YES,
|
||||
"NSHTTPURLResponse" : YES,
|
||||
"NSIndexPath" : YES,
|
||||
"NSIndexSet" : YES,
|
||||
"NSIndexSpecifier" : YES,
|
||||
"NSInputStream" : YES,
|
||||
"NSInvocation" : YES,
|
||||
"NSInvocationOperation" : YES,
|
||||
"NSKeyedArchiver" : YES,
|
||||
"NSKeyedUnarchiver" : YES,
|
||||
"NSLocale" : YES,
|
||||
"NSLock" : YES,
|
||||
"NSLogicalTest" : YES,
|
||||
"NSMachBootstrapServer" : YES,
|
||||
"NSMachPort" : YES,
|
||||
"NSMapTable" : YES,
|
||||
"NSMessagePort" : YES,
|
||||
"NSMessagePortNameServer" : YES,
|
||||
"NSMetadataItem" : YES,
|
||||
"NSMetadataQuery" : YES,
|
||||
"NSMetadataQueryAttributeValueTuple" : YES,
|
||||
"NSMetadataQueryResultGroup" : YES,
|
||||
"NSMethodSignature" : YES,
|
||||
"NSMiddleSpecifier" : YES,
|
||||
"NSMoveCommand" : YES,
|
||||
"NSMutableArray" : YES,
|
||||
"NSMutableAttributedString" : YES,
|
||||
"NSMutableCharacterSet" : YES,
|
||||
"NSMutableData" : YES,
|
||||
"NSMutableDictionary" : YES,
|
||||
"NSMutableIndexSet" : YES,
|
||||
"NSMutableSet" : YES,
|
||||
"NSMutableString" : YES,
|
||||
"NSMutableURLRequest" : YES,
|
||||
"NSNameSpecifier" : YES,
|
||||
"NSNetService" : YES,
|
||||
"NSNetServiceBrowser" : YES,
|
||||
"NSNotification" : YES,
|
||||
"NSNotificationCenter" : YES,
|
||||
"NSNotificationQueue" : YES,
|
||||
"NSNull" : YES,
|
||||
"NSNumber" : YES,
|
||||
"NSNumberFormatter" : YES,
|
||||
"NSObject" : YES,
|
||||
"NSOperation" : YES,
|
||||
"NSOperationQueue" : YES,
|
||||
"NSOrthography" : YES,
|
||||
"NSOutputStream" : YES,
|
||||
"NSPipe" : YES,
|
||||
"NSPointerArray" : YES,
|
||||
"NSPointerFunctions" : YES,
|
||||
"NSPort" : YES,
|
||||
"NSPortCoder" : YES,
|
||||
"NSPortMessage" : YES,
|
||||
"NSPortNameServer" : YES,
|
||||
"NSPositionalSpecifier" : YES,
|
||||
"NSPredicate" : YES,
|
||||
"NSProcessInfo" : YES,
|
||||
"NSPropertyListSerialization" : YES,
|
||||
"NSPropertySpecifier" : YES,
|
||||
"NSProtocolChecker" : YES,
|
||||
"NSProxy" : YES,
|
||||
"NSPurgeableData" : YES,
|
||||
"NSQuitCommand" : YES,
|
||||
"NSRandomSpecifier" : YES,
|
||||
"NSRangeSpecifier" : YES,
|
||||
"NSRecursiveLock" : YES,
|
||||
"NSRelativeSpecifier" : YES,
|
||||
"NSRunLoop" : YES,
|
||||
"NSScanner" : YES,
|
||||
"NSScriptClassDescription" : YES,
|
||||
"NSScriptCoercionHandler" : YES,
|
||||
"NSScriptCommand" : YES,
|
||||
"NSScriptCommandDescription" : YES,
|
||||
"NSScriptExecutionContext" : YES,
|
||||
"NSScriptObjectSpecifier" : YES,
|
||||
"NSScriptSuiteRegistry" : YES,
|
||||
"NSScriptWhoseTest" : YES,
|
||||
"NSSerializer" : YES,
|
||||
"NSSet" : YES,
|
||||
"NSSetCommand" : YES,
|
||||
"NSSocketPort" : YES,
|
||||
"NSSocketPortNameServer" : YES,
|
||||
"NSSortDescriptor" : YES,
|
||||
"NSSpecifierTest" : YES,
|
||||
"NSSpellServer" : YES,
|
||||
"NSStream" : YES,
|
||||
"NSString" : YES,
|
||||
"NSTask" : YES,
|
||||
"NSTextCheckingResult" : YES,
|
||||
"NSThread" : YES,
|
||||
"NSTimer" : YES,
|
||||
"NSTimeZone" : YES,
|
||||
"NSUnarchiver" : YES,
|
||||
"NSUndoManager" : YES,
|
||||
"NSUniqueIDSpecifier" : YES,
|
||||
"NSURL" : YES,
|
||||
"NSURLAuthenticationChallenge" : YES,
|
||||
"NSURLCache" : YES,
|
||||
"NSURLConnection" : YES,
|
||||
"NSURLCredential" : YES,
|
||||
"NSURLCredentialStorage" : YES,
|
||||
"NSURLDownload" : YES,
|
||||
"NSURLHandle" : YES,
|
||||
"NSURLProtectionSpace" : YES,
|
||||
"NSURLProtocol" : YES,
|
||||
"NSURLRequest" : YES,
|
||||
"NSURLResponse" : YES,
|
||||
"NSUserDefaults" : YES,
|
||||
"NSValue" : YES,
|
||||
"NSValueTransformer" : YES,
|
||||
"NSWhoseSpecifier" : YES,
|
||||
"NSXMLDocument" : YES,
|
||||
"NSXMLDTD" : YES,
|
||||
"NSXMLDTDNode" : YES,
|
||||
"NSXMLElement" : YES,
|
||||
"NSXMLNode" : YES,
|
||||
"NSXMLParser" : YES,
|
||||
"NSActionCell" : YES,
|
||||
"NSAffineTransform Additions" : YES,
|
||||
"NSAlert" : YES,
|
||||
"NSAnimation" : YES,
|
||||
"NSAnimationContext" : YES,
|
||||
"NSAppleScript Additions" : YES,
|
||||
"NSApplication" : YES,
|
||||
"NSArrayController" : YES,
|
||||
"NSATSTypesetter" : YES,
|
||||
"NSAttributedString Application Kit Additions" : YES,
|
||||
"NSBezierPath" : YES,
|
||||
"NSBitmapImageRep" : YES,
|
||||
"NSBox" : YES,
|
||||
"NSBrowser" : YES,
|
||||
"NSBrowserCell" : YES,
|
||||
"NSBundle Additions" : YES,
|
||||
"NSButton" : YES,
|
||||
"NSButtonCell" : YES,
|
||||
"NSCachedImageRep" : YES,
|
||||
"NSCell" : YES,
|
||||
"NSCIImageRep" : YES,
|
||||
"NSClipView" : YES,
|
||||
"NSCoder Application Kit Additions" : YES,
|
||||
"NSCollectionView" : YES,
|
||||
"NSCollectionViewItem" : YES,
|
||||
"NSColor" : YES,
|
||||
"NSColorList" : YES,
|
||||
"NSColorPanel" : YES,
|
||||
"NSColorPicker" : YES,
|
||||
"NSColorSpace" : YES,
|
||||
"NSColorWell" : YES,
|
||||
"NSComboBox" : YES,
|
||||
"NSComboBoxCell" : YES,
|
||||
"NSControl" : YES,
|
||||
"NSController" : YES,
|
||||
"NSCursor" : YES,
|
||||
"NSCustomImageRep" : YES,
|
||||
"NSDatePicker" : YES,
|
||||
"NSDatePickerCell" : YES,
|
||||
"NSDictionaryController" : YES,
|
||||
"NSDockTile" : YES,
|
||||
"NSDocument" : YES,
|
||||
"NSDocumentController" : YES,
|
||||
"NSDrawer" : YES,
|
||||
"NSEPSImageRep" : YES,
|
||||
"NSEvent" : YES,
|
||||
"NSFileWrapper" : YES,
|
||||
"NSFont" : YES,
|
||||
"NSFontDescriptor" : YES,
|
||||
"NSFontManager" : YES,
|
||||
"NSFontPanel" : YES,
|
||||
"NSForm" : YES,
|
||||
"NSFormCell" : YES,
|
||||
"NSGlyphGenerator" : YES,
|
||||
"NSGlyphInfo" : YES,
|
||||
"NSGradient" : YES,
|
||||
"NSGraphicsContext" : YES,
|
||||
"NSHelpManager" : YES,
|
||||
"NSImage" : YES,
|
||||
"NSImageCell" : YES,
|
||||
"NSImageRep" : YES,
|
||||
"NSImageView" : YES,
|
||||
"NSLayoutManager" : YES,
|
||||
"NSLevelIndicator" : YES,
|
||||
"NSLevelIndicatorCell" : YES,
|
||||
"NSMatrix" : YES,
|
||||
"NSMenu" : YES,
|
||||
"NSMenuItem" : YES,
|
||||
"NSMenuItemCell" : YES,
|
||||
"NSMenuView" : YES,
|
||||
"NSMutableAttributedString Additions" : YES,
|
||||
"NSMutableParagraphStyle" : YES,
|
||||
"NSNib" : YES,
|
||||
"NSNibConnector" : YES,
|
||||
"NSNibControlConnector" : YES,
|
||||
"NSNibOutletConnector" : YES,
|
||||
"NSObjectController" : YES,
|
||||
"NSOpenGLContext" : YES,
|
||||
"NSOpenGLLayer" : YES,
|
||||
"NSOpenGLPixelBuffer" : YES,
|
||||
"NSOpenGLPixelFormat" : YES,
|
||||
"NSOpenGLView" : YES,
|
||||
"NSOpenPanel" : YES,
|
||||
"NSOutlineView" : YES,
|
||||
"NSPageLayout" : YES,
|
||||
"NSPanel" : YES,
|
||||
"NSParagraphStyle" : YES,
|
||||
"NSPasteboard" : YES,
|
||||
"NSPasteboardItem" : YES,
|
||||
"NSPathCell" : YES,
|
||||
"NSPathComponentCell" : YES,
|
||||
"NSPathControl" : YES,
|
||||
"NSPDFImageRep" : YES,
|
||||
"NSPersistentDocument" : YES,
|
||||
"NSPICTImageRep" : YES,
|
||||
"NSPopUpButton" : YES,
|
||||
"NSPopUpButtonCell" : YES,
|
||||
"NSPredicateEditor" : YES,
|
||||
"NSPredicateEditorRowTemplate" : YES,
|
||||
"NSPrinter" : YES,
|
||||
"NSPrintInfo" : YES,
|
||||
"NSPrintOperation" : YES,
|
||||
"NSPrintPanel" : YES,
|
||||
"NSProgressIndicator" : YES,
|
||||
"NSResponder" : YES,
|
||||
"NSRuleEditor" : YES,
|
||||
"NSRulerMarker" : YES,
|
||||
"NSRulerView" : YES,
|
||||
"NSRunningApplication" : YES,
|
||||
"NSSavePanel" : YES,
|
||||
"NSScreen" : YES,
|
||||
"NSScroller" : YES,
|
||||
"NSScrollView" : YES,
|
||||
"NSSearchField" : YES,
|
||||
"NSSearchFieldCell" : YES,
|
||||
"NSSecureTextField" : YES,
|
||||
"NSSecureTextFieldCell" : YES,
|
||||
"NSSegmentedCell" : YES,
|
||||
"NSSegmentedControl" : YES,
|
||||
"NSShadow" : YES,
|
||||
"NSSlider" : YES,
|
||||
"NSSliderCell" : YES,
|
||||
"NSSound" : YES,
|
||||
"NSSpeechRecognizer" : YES,
|
||||
"NSSpeechSynthesizer" : YES,
|
||||
"NSSpellChecker" : YES,
|
||||
"NSSplitView" : YES,
|
||||
"NSStatusBar" : YES,
|
||||
"NSStatusItem" : YES,
|
||||
"NSStepper" : YES,
|
||||
"NSStepperCell" : YES,
|
||||
"NSString Application Kit Additions" : YES,
|
||||
"NSTableColumn" : YES,
|
||||
"NSTableHeaderCell" : YES,
|
||||
"NSTableHeaderView" : YES,
|
||||
"NSTableView" : YES,
|
||||
"NSTabView" : YES,
|
||||
"NSTabViewItem" : YES,
|
||||
"NSText" : YES,
|
||||
"NSTextAttachment" : YES,
|
||||
"NSTextAttachmentCell" : YES,
|
||||
"NSTextBlock" : YES,
|
||||
"NSTextContainer" : YES,
|
||||
"NSTextField" : YES,
|
||||
"NSTextFieldCell" : YES,
|
||||
"NSTextInputContext" : YES,
|
||||
"NSTextList" : YES,
|
||||
"NSTextStorage" : YES,
|
||||
"NSTextTab" : YES,
|
||||
"NSTextTable" : YES,
|
||||
"NSTextTableBlock" : YES,
|
||||
"NSTextView" : YES,
|
||||
"NSTokenField" : YES,
|
||||
"NSTokenFieldCell" : YES,
|
||||
"NSToolbar" : YES,
|
||||
"NSToolbarItem" : YES,
|
||||
"NSToolbarItemGroup" : YES,
|
||||
"NSTouch" : YES,
|
||||
"NSTrackingArea" : YES,
|
||||
"NSTreeController" : YES,
|
||||
"NSTreeNode" : YES,
|
||||
"NSTypesetter" : YES,
|
||||
"NSURL Additions" : YES,
|
||||
"NSUserDefaultsController" : YES,
|
||||
"NSView" : YES,
|
||||
"NSViewAnimation" : YES,
|
||||
"NSViewController" : YES,
|
||||
"NSWindow" : YES,
|
||||
"NSWindowController" : YES,
|
||||
"NSWorkspace" : YES
|
||||
};
|
||||
@@ -0,0 +1,354 @@
|
||||
// !$*UTF8*$!
|
||||
{
|
||||
archiveVersion = 1;
|
||||
classes = {
|
||||
};
|
||||
objectVersion = 46;
|
||||
objects = {
|
||||
|
||||
/* Begin PBXBuildFile section */
|
||||
9EEC4498135749D200615446 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 9EEC4497135749D200615446 /* Cocoa.framework */; };
|
||||
9EEC44B5135749D300615446 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 9EEC4497135749D200615446 /* Cocoa.framework */; };
|
||||
9EEC44CC13574A0B00615446 /* ${CappuccinoProjectName} in Resources */ = {isa = PBXBuildFile; fileRef = 9EEC44CB13574A0B00615446 /* ${CappuccinoProjectName} */; };
|
||||
/* End PBXBuildFile section */
|
||||
|
||||
/* Begin PBXContainerItemProxy section */
|
||||
9EEC44B6135749D300615446 /* PBXContainerItemProxy */ = {
|
||||
isa = PBXContainerItemProxy;
|
||||
containerPortal = 9EEC448A135749D200615446 /* Project object */;
|
||||
proxyType = 1;
|
||||
remoteGlobalIDString = 9EEC4492135749D200615446;
|
||||
remoteInfo = Another;
|
||||
};
|
||||
/* End PBXContainerItemProxy section */
|
||||
|
||||
/* Begin PBXFileReference section */
|
||||
9EEC4493135749D200615446 /* Another.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Another.app; sourceTree = BUILT_PRODUCTS_DIR; };
|
||||
9EEC4497135749D200615446 /* Cocoa.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Cocoa.framework; path = System/Library/Frameworks/Cocoa.framework; sourceTree = SDKROOT; };
|
||||
9EEC449A135749D300615446 /* AppKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AppKit.framework; path = System/Library/Frameworks/AppKit.framework; sourceTree = SDKROOT; };
|
||||
9EEC449B135749D300615446 /* CoreData.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreData.framework; path = System/Library/Frameworks/CoreData.framework; sourceTree = SDKROOT; };
|
||||
9EEC449C135749D300615446 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; };
|
||||
9EEC44B4135749D300615446 /* AnotherTests.octest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = AnotherTests.octest; sourceTree = BUILT_PRODUCTS_DIR; };
|
||||
9EEC44CB13574A0B00615446 /* ${CappuccinoProjectName} */ = {isa = PBXFileReference; lastKnownFileType = folder; name = ${CappuccinoProjectName}; path = ${CappuccinoProjectRelativePath}; sourceTree = "<group>"; };
|
||||
/* End PBXFileReference section */
|
||||
|
||||
/* Begin PBXFrameworksBuildPhase section */
|
||||
9EEC4490135749D200615446 /* Frameworks */ = {
|
||||
isa = PBXFrameworksBuildPhase;
|
||||
buildActionMask = 2147483647;
|
||||
files = (
|
||||
9EEC4498135749D200615446 /* Cocoa.framework in Frameworks */,
|
||||
);
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
};
|
||||
9EEC44B0135749D300615446 /* Frameworks */ = {
|
||||
isa = PBXFrameworksBuildPhase;
|
||||
buildActionMask = 2147483647;
|
||||
files = (
|
||||
9EEC44B5135749D300615446 /* Cocoa.framework in Frameworks */,
|
||||
);
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
};
|
||||
/* End PBXFrameworksBuildPhase section */
|
||||
|
||||
/* Begin PBXGroup section */
|
||||
9EEC4488135749D200615446 = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
9EEC44CB13574A0B00615446 /* ${CappuccinoProjectName} */,
|
||||
9EEC4496135749D200615446 /* Frameworks */,
|
||||
9EEC4494135749D200615446 /* Products */,
|
||||
);
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
9EEC4494135749D200615446 /* Products */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
9EEC4493135749D200615446 /* Another.app */,
|
||||
9EEC44B4135749D300615446 /* AnotherTests.octest */,
|
||||
);
|
||||
name = Products;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
9EEC4496135749D200615446 /* Frameworks */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
9EEC4497135749D200615446 /* Cocoa.framework */,
|
||||
9EEC4499135749D300615446 /* Other Frameworks */,
|
||||
);
|
||||
name = Frameworks;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
9EEC4499135749D300615446 /* Other Frameworks */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
9EEC449A135749D300615446 /* AppKit.framework */,
|
||||
9EEC449B135749D300615446 /* CoreData.framework */,
|
||||
9EEC449C135749D300615446 /* Foundation.framework */,
|
||||
);
|
||||
name = "Other Frameworks";
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
/* End PBXGroup section */
|
||||
|
||||
/* Begin PBXNativeTarget section */
|
||||
9EEC4492135749D200615446 /* Another */ = {
|
||||
isa = PBXNativeTarget;
|
||||
buildConfigurationList = 9EEC44C5135749D300615446 /* Build configuration list for PBXNativeTarget "Another" */;
|
||||
buildPhases = (
|
||||
9EEC448F135749D200615446 /* Sources */,
|
||||
9EEC4490135749D200615446 /* Frameworks */,
|
||||
9EEC4491135749D200615446 /* Resources */,
|
||||
);
|
||||
buildRules = (
|
||||
);
|
||||
dependencies = (
|
||||
);
|
||||
name = Another;
|
||||
productName = Another;
|
||||
productReference = 9EEC4493135749D200615446 /* Another.app */;
|
||||
productType = "com.apple.product-type.application";
|
||||
};
|
||||
9EEC44B3135749D300615446 /* AnotherTests */ = {
|
||||
isa = PBXNativeTarget;
|
||||
buildConfigurationList = 9EEC44C8135749D300615446 /* Build configuration list for PBXNativeTarget "AnotherTests" */;
|
||||
buildPhases = (
|
||||
9EEC44AF135749D300615446 /* Sources */,
|
||||
9EEC44B0135749D300615446 /* Frameworks */,
|
||||
9EEC44B1135749D300615446 /* Resources */,
|
||||
9EEC44B2135749D300615446 /* ShellScript */,
|
||||
);
|
||||
buildRules = (
|
||||
);
|
||||
dependencies = (
|
||||
9EEC44B7135749D300615446 /* PBXTargetDependency */,
|
||||
);
|
||||
name = AnotherTests;
|
||||
productName = AnotherTests;
|
||||
productReference = 9EEC44B4135749D300615446 /* AnotherTests.octest */;
|
||||
productType = "com.apple.product-type.bundle";
|
||||
};
|
||||
/* End PBXNativeTarget section */
|
||||
|
||||
/* Begin PBXProject section */
|
||||
9EEC448A135749D200615446 /* Project object */ = {
|
||||
isa = PBXProject;
|
||||
attributes = {
|
||||
ORGANIZATIONNAME = "280 North, Inc.";
|
||||
};
|
||||
buildConfigurationList = 9EEC448D135749D200615446 /* Build configuration list for PBXProject "Another" */;
|
||||
compatibilityVersion = "Xcode 3.2";
|
||||
developmentRegion = English;
|
||||
hasScannedForEncodings = 0;
|
||||
knownRegions = (
|
||||
en,
|
||||
);
|
||||
mainGroup = 9EEC4488135749D200615446;
|
||||
productRefGroup = 9EEC4494135749D200615446 /* Products */;
|
||||
projectDirPath = "";
|
||||
projectRoot = "";
|
||||
targets = (
|
||||
9EEC4492135749D200615446 /* Another */,
|
||||
9EEC44B3135749D300615446 /* AnotherTests */,
|
||||
);
|
||||
};
|
||||
/* End PBXProject section */
|
||||
|
||||
/* Begin PBXResourcesBuildPhase section */
|
||||
9EEC4491135749D200615446 /* Resources */ = {
|
||||
isa = PBXResourcesBuildPhase;
|
||||
buildActionMask = 2147483647;
|
||||
files = (
|
||||
9EEC44CC13574A0B00615446 /* ${CappuccinoProjectName} in Resources */,
|
||||
);
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
};
|
||||
9EEC44B1135749D300615446 /* Resources */ = {
|
||||
isa = PBXResourcesBuildPhase;
|
||||
buildActionMask = 2147483647;
|
||||
files = (
|
||||
);
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
};
|
||||
/* End PBXResourcesBuildPhase section */
|
||||
|
||||
/* Begin PBXShellScriptBuildPhase section */
|
||||
9EEC44B2135749D300615446 /* ShellScript */ = {
|
||||
isa = PBXShellScriptBuildPhase;
|
||||
buildActionMask = 2147483647;
|
||||
files = (
|
||||
);
|
||||
inputPaths = (
|
||||
);
|
||||
outputPaths = (
|
||||
);
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
shellPath = /bin/sh;
|
||||
shellScript = "# Run the unit tests in this test bundle.\n\"${SYSTEM_DEVELOPER_DIR}/Tools/RunUnitTests\"\n";
|
||||
};
|
||||
/* End PBXShellScriptBuildPhase section */
|
||||
|
||||
/* Begin PBXSourcesBuildPhase section */
|
||||
9EEC448F135749D200615446 /* Sources */ = {
|
||||
isa = PBXSourcesBuildPhase;
|
||||
buildActionMask = 2147483647;
|
||||
files = (
|
||||
);
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
};
|
||||
9EEC44AF135749D300615446 /* Sources */ = {
|
||||
isa = PBXSourcesBuildPhase;
|
||||
buildActionMask = 2147483647;
|
||||
files = (
|
||||
);
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
};
|
||||
/* End PBXSourcesBuildPhase section */
|
||||
|
||||
/* Begin PBXTargetDependency section */
|
||||
9EEC44B7135749D300615446 /* PBXTargetDependency */ = {
|
||||
isa = PBXTargetDependency;
|
||||
target = 9EEC4492135749D200615446 /* Another */;
|
||||
targetProxy = 9EEC44B6135749D300615446 /* PBXContainerItemProxy */;
|
||||
};
|
||||
/* End PBXTargetDependency section */
|
||||
|
||||
/* Begin XCBuildConfiguration section */
|
||||
9EEC44C3135749D300615446 /* Debug */ = {
|
||||
isa = XCBuildConfiguration;
|
||||
buildSettings = {
|
||||
ARCHS = "$(ARCHS_STANDARD_32_64_BIT)";
|
||||
GCC_C_LANGUAGE_STANDARD = gnu99;
|
||||
GCC_OPTIMIZATION_LEVEL = 0;
|
||||
GCC_PREPROCESSOR_DEFINITIONS = DEBUG;
|
||||
GCC_SYMBOLS_PRIVATE_EXTERN = NO;
|
||||
GCC_VERSION = com.apple.compilers.llvm.clang.1_0;
|
||||
GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
|
||||
GCC_WARN_ABOUT_RETURN_TYPE = YES;
|
||||
GCC_WARN_UNUSED_VARIABLE = YES;
|
||||
MACOSX_DEPLOYMENT_TARGET = 10.6;
|
||||
ONLY_ACTIVE_ARCH = YES;
|
||||
SDKROOT = macosx;
|
||||
};
|
||||
name = Debug;
|
||||
};
|
||||
9EEC44C4135749D300615446 /* Release */ = {
|
||||
isa = XCBuildConfiguration;
|
||||
buildSettings = {
|
||||
ARCHS = "$(ARCHS_STANDARD_32_64_BIT)";
|
||||
GCC_C_LANGUAGE_STANDARD = gnu99;
|
||||
GCC_VERSION = com.apple.compilers.llvm.clang.1_0;
|
||||
GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
|
||||
GCC_WARN_ABOUT_RETURN_TYPE = YES;
|
||||
GCC_WARN_UNUSED_VARIABLE = YES;
|
||||
MACOSX_DEPLOYMENT_TARGET = 10.6;
|
||||
SDKROOT = macosx;
|
||||
};
|
||||
name = Release;
|
||||
};
|
||||
9EEC44C6135749D300615446 /* Debug */ = {
|
||||
isa = XCBuildConfiguration;
|
||||
buildSettings = {
|
||||
ALWAYS_SEARCH_USER_PATHS = NO;
|
||||
COPY_PHASE_STRIP = NO;
|
||||
GCC_DYNAMIC_NO_PIC = NO;
|
||||
GCC_ENABLE_OBJC_EXCEPTIONS = YES;
|
||||
GCC_PRECOMPILE_PREFIX_HEADER = YES;
|
||||
GCC_PREFIX_HEADER = "Another/Another-Prefix.pch";
|
||||
INFOPLIST_FILE = "Another/Another-Info.plist";
|
||||
PRODUCT_NAME = "$(TARGET_NAME)";
|
||||
WRAPPER_EXTENSION = app;
|
||||
};
|
||||
name = Debug;
|
||||
};
|
||||
9EEC44C7135749D300615446 /* Release */ = {
|
||||
isa = XCBuildConfiguration;
|
||||
buildSettings = {
|
||||
ALWAYS_SEARCH_USER_PATHS = NO;
|
||||
COPY_PHASE_STRIP = YES;
|
||||
DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
|
||||
GCC_ENABLE_OBJC_EXCEPTIONS = YES;
|
||||
GCC_PRECOMPILE_PREFIX_HEADER = YES;
|
||||
GCC_PREFIX_HEADER = "Another/Another-Prefix.pch";
|
||||
INFOPLIST_FILE = "Another/Another-Info.plist";
|
||||
PRODUCT_NAME = "$(TARGET_NAME)";
|
||||
WRAPPER_EXTENSION = app;
|
||||
};
|
||||
name = Release;
|
||||
};
|
||||
9EEC44C9135749D300615446 /* Debug */ = {
|
||||
isa = XCBuildConfiguration;
|
||||
buildSettings = {
|
||||
ALWAYS_SEARCH_USER_PATHS = NO;
|
||||
BUNDLE_LOADER = "$(BUILT_PRODUCTS_DIR)/Another.app/Contents/MacOS/Another";
|
||||
COPY_PHASE_STRIP = NO;
|
||||
FRAMEWORK_SEARCH_PATHS = "$(DEVELOPER_LIBRARY_DIR)/Frameworks";
|
||||
GCC_DYNAMIC_NO_PIC = NO;
|
||||
GCC_ENABLE_OBJC_EXCEPTIONS = YES;
|
||||
GCC_PRECOMPILE_PREFIX_HEADER = YES;
|
||||
GCC_PREFIX_HEADER = "AnotherTests/AnotherTests-Prefix.pch";
|
||||
INFOPLIST_FILE = "AnotherTests/AnotherTests-Info.plist";
|
||||
OTHER_LDFLAGS = (
|
||||
"-framework",
|
||||
SenTestingKit,
|
||||
);
|
||||
PRODUCT_NAME = "$(TARGET_NAME)";
|
||||
TEST_HOST = "$(BUNDLE_LOADER)";
|
||||
WRAPPER_EXTENSION = octest;
|
||||
};
|
||||
name = Debug;
|
||||
};
|
||||
9EEC44CA135749D300615446 /* Release */ = {
|
||||
isa = XCBuildConfiguration;
|
||||
buildSettings = {
|
||||
ALWAYS_SEARCH_USER_PATHS = NO;
|
||||
BUNDLE_LOADER = "$(BUILT_PRODUCTS_DIR)/Another.app/Contents/MacOS/Another";
|
||||
COPY_PHASE_STRIP = YES;
|
||||
DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
|
||||
FRAMEWORK_SEARCH_PATHS = "$(DEVELOPER_LIBRARY_DIR)/Frameworks";
|
||||
GCC_ENABLE_OBJC_EXCEPTIONS = YES;
|
||||
GCC_PRECOMPILE_PREFIX_HEADER = YES;
|
||||
GCC_PREFIX_HEADER = "AnotherTests/AnotherTests-Prefix.pch";
|
||||
INFOPLIST_FILE = "AnotherTests/AnotherTests-Info.plist";
|
||||
OTHER_LDFLAGS = (
|
||||
"-framework",
|
||||
SenTestingKit,
|
||||
);
|
||||
PRODUCT_NAME = "$(TARGET_NAME)";
|
||||
TEST_HOST = "$(BUNDLE_LOADER)";
|
||||
WRAPPER_EXTENSION = octest;
|
||||
};
|
||||
name = Release;
|
||||
};
|
||||
/* End XCBuildConfiguration section */
|
||||
|
||||
/* Begin XCConfigurationList section */
|
||||
9EEC448D135749D200615446 /* Build configuration list for PBXProject "Another" */ = {
|
||||
isa = XCConfigurationList;
|
||||
buildConfigurations = (
|
||||
9EEC44C3135749D300615446 /* Debug */,
|
||||
9EEC44C4135749D300615446 /* Release */,
|
||||
);
|
||||
defaultConfigurationIsVisible = 0;
|
||||
defaultConfigurationName = Release;
|
||||
};
|
||||
9EEC44C5135749D300615446 /* Build configuration list for PBXNativeTarget "Another" */ = {
|
||||
isa = XCConfigurationList;
|
||||
buildConfigurations = (
|
||||
9EEC44C6135749D300615446 /* Debug */,
|
||||
9EEC44C7135749D300615446 /* Release */,
|
||||
);
|
||||
defaultConfigurationIsVisible = 0;
|
||||
};
|
||||
9EEC44C8135749D300615446 /* Build configuration list for PBXNativeTarget "AnotherTests" */ = {
|
||||
isa = XCConfigurationList;
|
||||
buildConfigurations = (
|
||||
9EEC44C9135749D300615446 /* Debug */,
|
||||
9EEC44CA135749D300615446 /* Release */,
|
||||
);
|
||||
defaultConfigurationIsVisible = 0;
|
||||
};
|
||||
/* End XCConfigurationList section */
|
||||
};
|
||||
rootObject = 9EEC448A135749D200615446 /* Project object */;
|
||||
}
|
||||
Binary file not shown.
|
After Width: | Height: | Size: 21 KiB |
Binary file not shown.
Binary file not shown.
|
After Width: | Height: | Size: 20 KiB |
Binary file not shown.
@@ -0,0 +1,7 @@
|
||||
//
|
||||
// Prefix header for all source files of the 'xcodecapp-cocoa' target in the 'xcodecapp-cocoa' project
|
||||
//
|
||||
|
||||
#ifdef __OBJC__
|
||||
#import <Cocoa/Cocoa.h>
|
||||
#endif
|
||||
Binary file not shown.
|
After Width: | Height: | Size: 283 KiB |
Binary file not shown.
File diff suppressed because it is too large.
Load diff
@@ -0,0 +1,152 @@
|
||||
// !$*UTF8*$!
|
||||
{
|
||||
29B97313FDCFA39411CA2CEA /* Project object */ = {
|
||||
activeArchitecture = i386;
|
||||
activeBuildConfigurationName = Debug;
|
||||
activeExecutable = 8E01A8CD0DE519E70008BB35 /* xcodecapp-cocoa */;
|
||||
activeTarget = 8D1107260486CEB800E47090 /* xcodecapp-cocoa */;
|
||||
addToTargets = (
|
||||
8D1107260486CEB800E47090 /* xcodecapp-cocoa */,
|
||||
);
|
||||
breakpoints = (
|
||||
8EF107B90DFCF23200C52EB1 /* AppController.m:30 */,
|
||||
8EF107CA0DFCF4A100C52EB1 /* AppController.m:62 */,
|
||||
);
|
||||
codeSenseManager = 8E01A8DC0DE51A060008BB35 /* Code sense */;
|
||||
executables = (
|
||||
8E01A8CD0DE519E70008BB35 /* xcodecapp-cocoa */,
|
||||
);
|
||||
perUserDictionary = {
|
||||
PBXConfiguration.PBXFileTableDataSource3.PBXFileTableDataSource = {
|
||||
PBXFileTableDataSourceColumnSortingDirectionKey = "-1";
|
||||
PBXFileTableDataSourceColumnSortingKey = PBXFileDataSource_Filename_ColumnID;
|
||||
PBXFileTableDataSourceColumnWidthsKey = (
|
||||
20,
|
||||
71,
|
||||
20,
|
||||
48,
|
||||
43,
|
||||
43,
|
||||
20,
|
||||
);
|
||||
PBXFileTableDataSourceColumnsKey = (
|
||||
PBXFileDataSource_FiletypeID,
|
||||
PBXFileDataSource_Filename_ColumnID,
|
||||
PBXFileDataSource_Built_ColumnID,
|
||||
PBXFileDataSource_ObjectSize_ColumnID,
|
||||
PBXFileDataSource_Errors_ColumnID,
|
||||
PBXFileDataSource_Warnings_ColumnID,
|
||||
PBXFileDataSource_Target_ColumnID,
|
||||
);
|
||||
};
|
||||
PBXPerProjectTemplateStateSaveDate = 244845075;
|
||||
PBXWorkspaceStateSaveDate = 244845075;
|
||||
};
|
||||
sourceControlManager = 8E01A8DB0DE51A060008BB35 /* Source Control */;
|
||||
userBuildSettings = {
|
||||
};
|
||||
};
|
||||
29B97316FDCFA39411CA2CEA /* main.m */ = {
|
||||
uiCtxt = {
|
||||
sepNavIntBoundsRect = "{{0, 0}, {1176, 392}}";
|
||||
sepNavSelRange = "{818, 0}";
|
||||
sepNavVisRange = "{297, 521}";
|
||||
};
|
||||
};
|
||||
8D1107260486CEB800E47090 /* xcodecapp-cocoa */ = {
|
||||
activeExec = 0;
|
||||
executables = (
|
||||
8E01A8CD0DE519E70008BB35 /* xcodecapp-cocoa */,
|
||||
);
|
||||
};
|
||||
8E01A8CD0DE519E70008BB35 /* xcodecapp-cocoa */ = {
|
||||
isa = PBXExecutable;
|
||||
activeArgIndices = (
|
||||
);
|
||||
argumentStrings = (
|
||||
);
|
||||
autoAttachOnCrash = 1;
|
||||
breakpointsEnabled = 0;
|
||||
configStateDict = {
|
||||
};
|
||||
customDataFormattersEnabled = 1;
|
||||
debuggerPlugin = GDBDebugging;
|
||||
disassemblyDisplayState = 0;
|
||||
dylibVariantSuffix = "";
|
||||
enableDebugStr = 1;
|
||||
environmentEntries = (
|
||||
);
|
||||
executableSystemSymbolLevel = 0;
|
||||
executableUserSymbolLevel = 0;
|
||||
libgmallocEnabled = 0;
|
||||
name = xcodecapp-cocoa;
|
||||
savedGlobals = {
|
||||
};
|
||||
sourceDirectories = (
|
||||
);
|
||||
variableFormatDictionary = {
|
||||
"*eventIds-long long unsigned int-mycallback" = 3;
|
||||
};
|
||||
};
|
||||
8E01A8DB0DE51A060008BB35 /* Source Control */ = {
|
||||
isa = PBXSourceControlManager;
|
||||
fallbackIsa = XCSourceControlManager;
|
||||
isSCMEnabled = 0;
|
||||
scmConfiguration = {
|
||||
};
|
||||
};
|
||||
8E01A8DC0DE51A060008BB35 /* Code sense */ = {
|
||||
isa = PBXCodeSenseManager;
|
||||
indexTemplatePath = "";
|
||||
};
|
||||
8E01A91D0DE9EED20008BB35 /* AppController.h */ = {
|
||||
uiCtxt = {
|
||||
sepNavIntBoundsRect = "{{0, 0}, {692, 280}}";
|
||||
sepNavSelRange = "{234, 37}";
|
||||
sepNavVisRange = "{146, 185}";
|
||||
sepNavWindowFrame = "{{112, 264}, {1441, 774}}";
|
||||
};
|
||||
};
|
||||
8E01A91E0DE9EED20008BB35 /* AppController.m */ = {
|
||||
uiCtxt = {
|
||||
sepNavIntBoundsRect = "{{0, 0}, {692, 2324}}";
|
||||
sepNavSelRange = "{4949, 0}";
|
||||
sepNavVisRange = "{3760, 551}";
|
||||
sepNavWindowFrame = "{{15, -1}, {1441, 774}}";
|
||||
};
|
||||
};
|
||||
8EF107B90DFCF23200C52EB1 /* AppController.m:30 */ = {
|
||||
isa = PBXFileBreakpoint;
|
||||
actions = (
|
||||
);
|
||||
breakpointStyle = 0;
|
||||
continueAfterActions = 0;
|
||||
countType = 0;
|
||||
delayBeforeContinue = 0;
|
||||
fileReference = 8E01A91E0DE9EED20008BB35 /* AppController.m */;
|
||||
functionName = "-awakeFromNib";
|
||||
hitCount = 1;
|
||||
ignoreCount = 0;
|
||||
lineNumber = 30;
|
||||
location = xcodecapp-cocoa;
|
||||
modificationTime = 234708321.122562;
|
||||
state = 2;
|
||||
};
|
||||
8EF107CA0DFCF4A100C52EB1 /* AppController.m:62 */ = {
|
||||
isa = PBXFileBreakpoint;
|
||||
actions = (
|
||||
);
|
||||
breakpointStyle = 0;
|
||||
continueAfterActions = 0;
|
||||
countType = 0;
|
||||
delayBeforeContinue = 0;
|
||||
fileReference = 8E01A91E0DE9EED20008BB35 /* AppController.m */;
|
||||
functionName = "mycallback()";
|
||||
hitCount = 0;
|
||||
ignoreCount = 0;
|
||||
lineNumber = 62;
|
||||
location = xcodecapp-cocoa;
|
||||
modificationTime = 234708306.739971;
|
||||
state = 2;
|
||||
};
|
||||
}
|
||||
@@ -0,0 +1,355 @@
|
||||
// !$*UTF8*$!
|
||||
{
|
||||
archiveVersion = 1;
|
||||
classes = {
|
||||
};
|
||||
objectVersion = 45;
|
||||
objects = {
|
||||
|
||||
/* Begin PBXBuildFile section */
|
||||
024A03DD13696C1900DCBE4D /* xcodecapp-cocoa.icns in Resources */ = {isa = PBXBuildFile; fileRef = 024A03DC13696C1900DCBE4D /* xcodecapp-cocoa.icns */; };
|
||||
024A03DF13696D9500DCBE4D /* xcodecapp-cocoa.png in Resources */ = {isa = PBXBuildFile; fileRef = 024A03DE13696D9500DCBE4D /* xcodecapp-cocoa.png */; };
|
||||
024A040B13698E7800DCBE4D /* project.pbxproj in Resources */ = {isa = PBXBuildFile; fileRef = 024A040A13698E7700DCBE4D /* project.pbxproj */; };
|
||||
024A041213699D6800DCBE4D /* parser.j in Sources */ = {isa = PBXBuildFile; fileRef = 024A041113699D6800DCBE4D /* parser.j */; };
|
||||
024A041413699DD400DCBE4D /* parser.j in Resources */ = {isa = PBXBuildFile; fileRef = 024A041113699D6800DCBE4D /* parser.j */; };
|
||||
026F3B6213866B0B00EE5B83 /* xcodecapp-cocoa-icon-inactive.png in Resources */ = {isa = PBXBuildFile; fileRef = 026F3B6113866B0B00EE5B83 /* xcodecapp-cocoa-icon-inactive.png */; };
|
||||
026F3B6513866E7D00EE5B83 /* xcodecapp-cocoa-icon-active.png in Resources */ = {isa = PBXBuildFile; fileRef = 026F3B6413866E7D00EE5B83 /* xcodecapp-cocoa-icon-active.png */; };
|
||||
027D999B13696A7000D3DB13 /* MainMenu.nib in Resources */ = {isa = PBXBuildFile; fileRef = 29B97318FDCFA39411CA2CEA /* MainMenu.nib */; };
|
||||
027D999C13696A7000D3DB13 /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 089C165CFE840E0CC02AAC07 /* InfoPlist.strings */; };
|
||||
027D999E13696A7000D3DB13 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 29B97316FDCFA39411CA2CEA /* main.m */; settings = {ATTRIBUTES = (); }; };
|
||||
027D999F13696A7000D3DB13 /* AppController.m in Sources */ = {isa = PBXBuildFile; fileRef = 8E01A91E0DE9EED20008BB35 /* AppController.m */; };
|
||||
027D99A113696A7000D3DB13 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */; };
|
||||
027D99A213696A7000D3DB13 /* CoreServices.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8E01A8DD0DE51A7C0008BB35 /* CoreServices.framework */; };
|
||||
02998CEB1369BF7D006C73DB /* Growl Registration Ticket.growlRegDict in Resources */ = {isa = PBXBuildFile; fileRef = 02998CEA1369BF7D006C73DB /* Growl Registration Ticket.growlRegDict */; };
|
||||
02998CF71369C339006C73DB /* Growl.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 02998CF61369C339006C73DB /* Growl.framework */; };
|
||||
02998CF91369C38A006C73DB /* Growl.framework in CopyFiles */ = {isa = PBXBuildFile; fileRef = 02998CF61369C339006C73DB /* Growl.framework */; };
|
||||
/* End PBXBuildFile section */
|
||||
|
||||
/* Begin PBXCopyFilesBuildPhase section */
|
||||
02998CF81369C383006C73DB /* CopyFiles */ = {
|
||||
isa = PBXCopyFilesBuildPhase;
|
||||
buildActionMask = 2147483647;
|
||||
dstPath = "";
|
||||
dstSubfolderSpec = 10;
|
||||
files = (
|
||||
02998CF91369C38A006C73DB /* Growl.framework in CopyFiles */,
|
||||
);
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
};
|
||||
/* End PBXCopyFilesBuildPhase section */
|
||||
|
||||
/* Begin PBXFileReference section */
|
||||
024A03DC13696C1900DCBE4D /* xcodecapp-cocoa.icns */ = {isa = PBXFileReference; lastKnownFileType = image.icns; path = "xcodecapp-cocoa.icns"; sourceTree = "<group>"; };
|
||||
024A03DE13696D9500DCBE4D /* xcodecapp-cocoa.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "xcodecapp-cocoa.png"; sourceTree = "<group>"; };
|
||||
024A040A13698E7700DCBE4D /* project.pbxproj */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.pbxproject; path = project.pbxproj; sourceTree = "<group>"; };
|
||||
024A041113699D6800DCBE4D /* parser.j */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.objj; path = parser.j; sourceTree = "<group>"; };
|
||||
026F3B6113866B0B00EE5B83 /* xcodecapp-cocoa-icon-inactive.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "xcodecapp-cocoa-icon-inactive.png"; sourceTree = "<group>"; };
|
||||
026F3B6413866E7D00EE5B83 /* xcodecapp-cocoa-icon-active.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "xcodecapp-cocoa-icon-active.png"; sourceTree = "<group>"; };
|
||||
027D9989136969DD00D3DB13 /* xcodecapp-cocoa.pch */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "xcodecapp-cocoa.pch"; sourceTree = "<group>"; };
|
||||
027D99A613696A7000D3DB13 /* xcodecapp-cocoa.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "xcodecapp-cocoa.app"; sourceTree = BUILT_PRODUCTS_DIR; };
|
||||
02998CEA1369BF7D006C73DB /* Growl Registration Ticket.growlRegDict */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = "Growl Registration Ticket.growlRegDict"; sourceTree = "<group>"; };
|
||||
02998CF61369C339006C73DB /* Growl.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; path = Growl.framework; sourceTree = "<group>"; };
|
||||
089C165DFE840E0CC02AAC07 /* English */ = {isa = PBXFileReference; fileEncoding = 10; lastKnownFileType = text.plist.strings; name = English; path = English.lproj/InfoPlist.strings; sourceTree = "<group>"; };
|
||||
1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Cocoa.framework; path = /System/Library/Frameworks/Cocoa.framework; sourceTree = "<absolute>"; };
|
||||
13E42FB307B3F0F600E4EEF1 /* CoreData.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreData.framework; path = /System/Library/Frameworks/CoreData.framework; sourceTree = "<absolute>"; };
|
||||
29B97316FDCFA39411CA2CEA /* main.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = "<group>"; };
|
||||
29B97319FDCFA39411CA2CEA /* English */ = {isa = PBXFileReference; lastKnownFileType = wrapper.nib; name = English; path = English.lproj/MainMenu.nib; sourceTree = "<group>"; };
|
||||
29B97324FDCFA39411CA2CEA /* AppKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AppKit.framework; path = /System/Library/Frameworks/AppKit.framework; sourceTree = "<absolute>"; };
|
||||
29B97325FDCFA39411CA2CEA /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = /System/Library/Frameworks/Foundation.framework; sourceTree = "<absolute>"; };
|
||||
8D1107310486CEB800E47090 /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
|
||||
8E01A8DD0DE51A7C0008BB35 /* CoreServices.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreServices.framework; path = /System/Library/Frameworks/CoreServices.framework; sourceTree = "<absolute>"; };
|
||||
8E01A91D0DE9EED20008BB35 /* AppController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AppController.h; sourceTree = "<group>"; };
|
||||
8E01A91E0DE9EED20008BB35 /* AppController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = AppController.m; sourceTree = "<group>"; };
|
||||
/* End PBXFileReference section */
|
||||
|
||||
/* Begin PBXFrameworksBuildPhase section */
|
||||
027D99A013696A7000D3DB13 /* Frameworks */ = {
|
||||
isa = PBXFrameworksBuildPhase;
|
||||
buildActionMask = 2147483647;
|
||||
files = (
|
||||
027D99A113696A7000D3DB13 /* Cocoa.framework in Frameworks */,
|
||||
027D99A213696A7000D3DB13 /* CoreServices.framework in Frameworks */,
|
||||
02998CF71369C339006C73DB /* Growl.framework in Frameworks */,
|
||||
);
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
};
|
||||
/* End PBXFrameworksBuildPhase section */
|
||||
|
||||
/* Begin PBXGroup section */
|
||||
080E96DDFE201D6D7F000001 /* Classes */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
8E01A91D0DE9EED20008BB35 /* AppController.h */,
|
||||
8E01A91E0DE9EED20008BB35 /* AppController.m */,
|
||||
);
|
||||
name = Classes;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
1058C7A0FEA54F0111CA2CBB /* Linked Frameworks */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
8E01A8DD0DE51A7C0008BB35 /* CoreServices.framework */,
|
||||
1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */,
|
||||
);
|
||||
name = "Linked Frameworks";
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
1058C7A2FEA54F0111CA2CBB /* Other Frameworks */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
29B97324FDCFA39411CA2CEA /* AppKit.framework */,
|
||||
13E42FB307B3F0F600E4EEF1 /* CoreData.framework */,
|
||||
29B97325FDCFA39411CA2CEA /* Foundation.framework */,
|
||||
);
|
||||
name = "Other Frameworks";
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
19C28FACFE9D520D11CA2CBB /* Products */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
027D99A613696A7000D3DB13 /* xcodecapp-cocoa.app */,
|
||||
);
|
||||
name = Products;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
29B97314FDCFA39411CA2CEA /* xcodecapp-cocoa */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
080E96DDFE201D6D7F000001 /* Classes */,
|
||||
29B97315FDCFA39411CA2CEA /* Other Sources */,
|
||||
29B97317FDCFA39411CA2CEA /* Resources */,
|
||||
29B97323FDCFA39411CA2CEA /* Frameworks */,
|
||||
19C28FACFE9D520D11CA2CBB /* Products */,
|
||||
);
|
||||
name = "xcodecapp-cocoa";
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
29B97315FDCFA39411CA2CEA /* Other Sources */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
027D9989136969DD00D3DB13 /* xcodecapp-cocoa.pch */,
|
||||
29B97316FDCFA39411CA2CEA /* main.m */,
|
||||
);
|
||||
name = "Other Sources";
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
29B97317FDCFA39411CA2CEA /* Resources */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
026F3B6413866E7D00EE5B83 /* xcodecapp-cocoa-icon-active.png */,
|
||||
026F3B6113866B0B00EE5B83 /* xcodecapp-cocoa-icon-inactive.png */,
|
||||
024A041113699D6800DCBE4D /* parser.j */,
|
||||
024A03DE13696D9500DCBE4D /* xcodecapp-cocoa.png */,
|
||||
024A040A13698E7700DCBE4D /* project.pbxproj */,
|
||||
024A03DC13696C1900DCBE4D /* xcodecapp-cocoa.icns */,
|
||||
8D1107310486CEB800E47090 /* Info.plist */,
|
||||
089C165CFE840E0CC02AAC07 /* InfoPlist.strings */,
|
||||
29B97318FDCFA39411CA2CEA /* MainMenu.nib */,
|
||||
02998CEA1369BF7D006C73DB /* Growl Registration Ticket.growlRegDict */,
|
||||
);
|
||||
name = Resources;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
29B97323FDCFA39411CA2CEA /* Frameworks */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
02998CF61369C339006C73DB /* Growl.framework */,
|
||||
1058C7A0FEA54F0111CA2CBB /* Linked Frameworks */,
|
||||
1058C7A2FEA54F0111CA2CBB /* Other Frameworks */,
|
||||
);
|
||||
name = Frameworks;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
/* End PBXGroup section */
|
||||
|
||||
/* Begin PBXNativeTarget section */
|
||||
027D999913696A7000D3DB13 /* xcodecapp-cocoa */ = {
|
||||
isa = PBXNativeTarget;
|
||||
buildConfigurationList = 027D99A313696A7000D3DB13 /* Build configuration list for PBXNativeTarget "xcodecapp-cocoa" */;
|
||||
buildPhases = (
|
||||
027D999A13696A7000D3DB13 /* Resources */,
|
||||
027D999D13696A7000D3DB13 /* Sources */,
|
||||
02998CF81369C383006C73DB /* CopyFiles */,
|
||||
027D99A013696A7000D3DB13 /* Frameworks */,
|
||||
);
|
||||
buildRules = (
|
||||
);
|
||||
dependencies = (
|
||||
);
|
||||
name = "xcodecapp-cocoa";
|
||||
productInstallPath = "$(HOME)/Applications";
|
||||
productName = "xcodecapp-cocoa";
|
||||
productReference = 027D99A613696A7000D3DB13 /* xcodecapp-cocoa.app */;
|
||||
productType = "com.apple.product-type.application";
|
||||
};
|
||||
/* End PBXNativeTarget section */
|
||||
|
||||
/* Begin PBXProject section */
|
||||
29B97313FDCFA39411CA2CEA /* Project object */ = {
|
||||
isa = PBXProject;
|
||||
buildConfigurationList = C01FCF4E08A954540054247B /* Build configuration list for PBXProject "xcodecapp-cocoa" */;
|
||||
compatibilityVersion = "Xcode 3.1";
|
||||
developmentRegion = English;
|
||||
hasScannedForEncodings = 1;
|
||||
knownRegions = (
|
||||
en,
|
||||
);
|
||||
mainGroup = 29B97314FDCFA39411CA2CEA /* xcodecapp-cocoa */;
|
||||
projectDirPath = "";
|
||||
projectRoot = "";
|
||||
targets = (
|
||||
027D999913696A7000D3DB13 /* xcodecapp-cocoa */,
|
||||
);
|
||||
};
|
||||
/* End PBXProject section */
|
||||
|
||||
/* Begin PBXResourcesBuildPhase section */
|
||||
027D999A13696A7000D3DB13 /* Resources */ = {
|
||||
isa = PBXResourcesBuildPhase;
|
||||
buildActionMask = 2147483647;
|
||||
files = (
|
||||
027D999B13696A7000D3DB13 /* MainMenu.nib in Resources */,
|
||||
027D999C13696A7000D3DB13 /* InfoPlist.strings in Resources */,
|
||||
024A03DD13696C1900DCBE4D /* xcodecapp-cocoa.icns in Resources */,
|
||||
024A041413699DD400DCBE4D /* parser.j in Resources */,
|
||||
024A03DF13696D9500DCBE4D /* xcodecapp-cocoa.png in Resources */,
|
||||
024A040B13698E7800DCBE4D /* project.pbxproj in Resources */,
|
||||
02998CEB1369BF7D006C73DB /* Growl Registration Ticket.growlRegDict in Resources */,
|
||||
026F3B6213866B0B00EE5B83 /* xcodecapp-cocoa-icon-inactive.png in Resources */,
|
||||
026F3B6513866E7D00EE5B83 /* xcodecapp-cocoa-icon-active.png in Resources */,
|
||||
);
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
};
|
||||
/* End PBXResourcesBuildPhase section */
|
||||
|
||||
/* Begin PBXSourcesBuildPhase section */
|
||||
027D999D13696A7000D3DB13 /* Sources */ = {
|
||||
isa = PBXSourcesBuildPhase;
|
||||
buildActionMask = 2147483647;
|
||||
files = (
|
||||
027D999E13696A7000D3DB13 /* main.m in Sources */,
|
||||
027D999F13696A7000D3DB13 /* AppController.m in Sources */,
|
||||
024A041213699D6800DCBE4D /* parser.j in Sources */,
|
||||
);
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
};
|
||||
/* End PBXSourcesBuildPhase section */
|
||||
|
||||
/* Begin PBXVariantGroup section */
|
||||
089C165CFE840E0CC02AAC07 /* InfoPlist.strings */ = {
|
||||
isa = PBXVariantGroup;
|
||||
children = (
|
||||
089C165DFE840E0CC02AAC07 /* English */,
|
||||
);
|
||||
name = InfoPlist.strings;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
29B97318FDCFA39411CA2CEA /* MainMenu.nib */ = {
|
||||
isa = PBXVariantGroup;
|
||||
children = (
|
||||
29B97319FDCFA39411CA2CEA /* English */,
|
||||
);
|
||||
name = MainMenu.nib;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
/* End PBXVariantGroup section */
|
||||
|
||||
/* Begin XCBuildConfiguration section */
|
||||
027D99A413696A7000D3DB13 /* Debug */ = {
|
||||
isa = XCBuildConfiguration;
|
||||
buildSettings = {
|
||||
ALWAYS_SEARCH_USER_PATHS = NO;
|
||||
COPY_PHASE_STRIP = NO;
|
||||
FRAMEWORK_SEARCH_PATHS = (
|
||||
"$(inherited)",
|
||||
"\"$(SRCROOT)\"",
|
||||
"\"/Volumes/Growl 1.2.1 SDK/Frameworks\"",
|
||||
);
|
||||
GCC_DYNAMIC_NO_PIC = NO;
|
||||
GCC_ENABLE_FIX_AND_CONTINUE = YES;
|
||||
GCC_ENABLE_OBJC_GC = required;
|
||||
GCC_MODEL_TUNING = G5;
|
||||
GCC_OPTIMIZATION_LEVEL = 0;
|
||||
GCC_PRECOMPILE_PREFIX_HEADER = YES;
|
||||
GCC_PREFIX_HEADER = "xcodecapp-cocoa.pch";
|
||||
INFOPLIST_FILE = Info.plist;
|
||||
INSTALL_PATH = /Applications;
|
||||
PRODUCT_NAME = "xcodecapp-cocoa";
|
||||
};
|
||||
name = Debug;
|
||||
};
|
||||
027D99A513696A7000D3DB13 /* Release */ = {
|
||||
isa = XCBuildConfiguration;
|
||||
buildSettings = {
|
||||
ALWAYS_SEARCH_USER_PATHS = NO;
|
||||
DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
|
||||
FRAMEWORK_SEARCH_PATHS = (
|
||||
"$(inherited)",
|
||||
"\"$(SRCROOT)\"",
|
||||
"\"/Volumes/Growl 1.2.1 SDK/Frameworks\"",
|
||||
);
|
||||
GCC_ENABLE_OBJC_GC = required;
|
||||
GCC_MODEL_TUNING = G5;
|
||||
GCC_PRECOMPILE_PREFIX_HEADER = YES;
|
||||
GCC_PREFIX_HEADER = "xcodecapp-cocoa.pch";
|
||||
INFOPLIST_FILE = Info.plist;
|
||||
INSTALL_PATH = /Applications;
|
||||
PRODUCT_NAME = "xcodecapp-cocoa";
|
||||
};
|
||||
name = Release;
|
||||
};
|
||||
C01FCF4F08A954540054247B /* Debug */ = {
|
||||
isa = XCBuildConfiguration;
|
||||
buildSettings = {
|
||||
ALWAYS_SEARCH_USER_PATHS = NO;
|
||||
ARCHS = "$(ARCHS_STANDARD_32_64_BIT)";
|
||||
FRAMEWORK_SEARCH_PATHS = "";
|
||||
GCC_ENABLE_OBJC_GC = supported;
|
||||
GCC_OPTIMIZATION_LEVEL = 0;
|
||||
GCC_WARN_ABOUT_RETURN_TYPE = YES;
|
||||
GCC_WARN_UNUSED_VARIABLE = YES;
|
||||
ONLY_ACTIVE_ARCH = YES;
|
||||
PREBINDING = NO;
|
||||
SDKROOT = macosx10.6;
|
||||
};
|
||||
name = Debug;
|
||||
};
|
||||
C01FCF5008A954540054247B /* Release */ = {
|
||||
isa = XCBuildConfiguration;
|
||||
buildSettings = {
|
||||
ALWAYS_SEARCH_USER_PATHS = NO;
|
||||
ARCHS = "$(ARCHS_STANDARD_32_64_BIT)";
|
||||
FRAMEWORK_SEARCH_PATHS = "";
|
||||
GCC_ENABLE_OBJC_GC = supported;
|
||||
GCC_WARN_ABOUT_RETURN_TYPE = YES;
|
||||
GCC_WARN_UNUSED_VARIABLE = YES;
|
||||
PREBINDING = NO;
|
||||
SDKROOT = macosx10.6;
|
||||
};
|
||||
name = Release;
|
||||
};
|
||||
/* End XCBuildConfiguration section */
|
||||
|
||||
/* Begin XCConfigurationList section */
|
||||
027D99A313696A7000D3DB13 /* Build configuration list for PBXNativeTarget "xcodecapp-cocoa" */ = {
|
||||
isa = XCConfigurationList;
|
||||
buildConfigurations = (
|
||||
027D99A413696A7000D3DB13 /* Debug */,
|
||||
027D99A513696A7000D3DB13 /* Release */,
|
||||
);
|
||||
defaultConfigurationIsVisible = 0;
|
||||
defaultConfigurationName = Release;
|
||||
};
|
||||
C01FCF4E08A954540054247B /* Build configuration list for PBXProject "xcodecapp-cocoa" */ = {
|
||||
isa = XCConfigurationList;
|
||||
buildConfigurations = (
|
||||
C01FCF4F08A954540054247B /* Debug */,
|
||||
C01FCF5008A954540054247B /* Release */,
|
||||
);
|
||||
defaultConfigurationIsVisible = 0;
|
||||
defaultConfigurationName = Release;
|
||||
};
|
||||
/* End XCConfigurationList section */
|
||||
};
|
||||
rootObject = 29B97313FDCFA39411CA2CEA /* Project object */;
|
||||
}
|
||||
Generated
+7
@@ -0,0 +1,7 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<Workspace
|
||||
version = "1.0">
|
||||
<FileRef
|
||||
location = "self:xcodecapp-cocoa.xcodeproj">
|
||||
</FileRef>
|
||||
</Workspace>
|
||||
+10
@@ -0,0 +1,10 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
||||
<plist version="1.0">
|
||||
<dict>
|
||||
<key>IDEWorkspaceUserSettings_HasAskedToTakeAutomaticSnapshotBeforeSignificantChanges</key>
|
||||
<true/>
|
||||
<key>IDEWorkspaceUserSettings_SnapshotAutomaticallyBeforeSignificantChanges</key>
|
||||
<true/>
|
||||
</dict>
|
||||
</plist>
|
||||
+5
@@ -0,0 +1,5 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<Bucket
|
||||
type = "1"
|
||||
version = "1.0">
|
||||
</Bucket>
|
||||
+76
@@ -0,0 +1,76 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<Scheme
|
||||
version = "1.3">
|
||||
<BuildAction
|
||||
parallelizeBuildables = "YES"
|
||||
buildImplicitDependencies = "YES">
|
||||
<BuildActionEntries>
|
||||
<BuildActionEntry
|
||||
buildForTesting = "YES"
|
||||
buildForRunning = "YES"
|
||||
buildForProfiling = "YES"
|
||||
buildForArchiving = "YES"
|
||||
buildForAnalyzing = "YES">
|
||||
<BuildableReference
|
||||
BuildableIdentifier = "primary"
|
||||
BlueprintIdentifier = "027D999913696A7000D3DB13"
|
||||
BuildableName = "xcodecapp-cocoa.app"
|
||||
BlueprintName = "xcodecapp-cocoa"
|
||||
ReferencedContainer = "container:xcodecapp-cocoa.xcodeproj">
|
||||
</BuildableReference>
|
||||
</BuildActionEntry>
|
||||
</BuildActionEntries>
|
||||
</BuildAction>
|
||||
<TestAction
|
||||
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.GDB"
|
||||
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.GDB"
|
||||
shouldUseLaunchSchemeArgsEnv = "YES"
|
||||
buildConfiguration = "Debug">
|
||||
<Testables>
|
||||
</Testables>
|
||||
</TestAction>
|
||||
<LaunchAction
|
||||
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.GDB"
|
||||
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.GDB"
|
||||
displayScaleIsEnabled = "NO"
|
||||
displayScale = "1.00"
|
||||
launchStyle = "0"
|
||||
useCustomWorkingDirectory = "NO"
|
||||
buildConfiguration = "Release">
|
||||
<BuildableProductRunnable>
|
||||
<BuildableReference
|
||||
BuildableIdentifier = "primary"
|
||||
BlueprintIdentifier = "027D999913696A7000D3DB13"
|
||||
BuildableName = "xcodecapp-cocoa.app"
|
||||
BlueprintName = "xcodecapp-cocoa"
|
||||
ReferencedContainer = "container:xcodecapp-cocoa.xcodeproj">
|
||||
</BuildableReference>
|
||||
</BuildableProductRunnable>
|
||||
<AdditionalOptions>
|
||||
</AdditionalOptions>
|
||||
</LaunchAction>
|
||||
<ProfileAction
|
||||
displayScaleIsEnabled = "NO"
|
||||
displayScale = "1.00"
|
||||
shouldUseLaunchSchemeArgsEnv = "YES"
|
||||
savedToolIdentifier = ""
|
||||
useCustomWorkingDirectory = "NO"
|
||||
buildConfiguration = "Release">
|
||||
<BuildableProductRunnable>
|
||||
<BuildableReference
|
||||
BuildableIdentifier = "primary"
|
||||
BlueprintIdentifier = "027D999913696A7000D3DB13"
|
||||
BuildableName = "xcodecapp-cocoa.app"
|
||||
BlueprintName = "xcodecapp-cocoa"
|
||||
ReferencedContainer = "container:xcodecapp-cocoa.xcodeproj">
|
||||
</BuildableReference>
|
||||
</BuildableProductRunnable>
|
||||
</ProfileAction>
|
||||
<AnalyzeAction
|
||||
buildConfiguration = "Debug">
|
||||
</AnalyzeAction>
|
||||
<ArchiveAction
|
||||
buildConfiguration = "Release"
|
||||
revealArchiveInOrganizer = "YES">
|
||||
</ArchiveAction>
|
||||
</Scheme>
|
||||
+76
@@ -0,0 +1,76 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<Scheme
|
||||
version = "1.3">
|
||||
<BuildAction
|
||||
parallelizeBuildables = "YES"
|
||||
buildImplicitDependencies = "YES">
|
||||
<BuildActionEntries>
|
||||
<BuildActionEntry
|
||||
buildForTesting = "YES"
|
||||
buildForRunning = "YES"
|
||||
buildForProfiling = "YES"
|
||||
buildForArchiving = "YES"
|
||||
buildForAnalyzing = "YES">
|
||||
<BuildableReference
|
||||
BuildableIdentifier = "primary"
|
||||
BlueprintIdentifier = "027D999913696A7000D3DB13"
|
||||
BuildableName = "xcodecapp-cocoa.app"
|
||||
BlueprintName = "xcodecapp-cocoa"
|
||||
ReferencedContainer = "container:xcodecapp-cocoa.xcodeproj">
|
||||
</BuildableReference>
|
||||
</BuildActionEntry>
|
||||
</BuildActionEntries>
|
||||
</BuildAction>
|
||||
<TestAction
|
||||
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.GDB"
|
||||
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.GDB"
|
||||
shouldUseLaunchSchemeArgsEnv = "YES"
|
||||
buildConfiguration = "Debug">
|
||||
<Testables>
|
||||
</Testables>
|
||||
</TestAction>
|
||||
<LaunchAction
|
||||
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.GDB"
|
||||
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.GDB"
|
||||
displayScaleIsEnabled = "NO"
|
||||
displayScale = "1.00"
|
||||
launchStyle = "0"
|
||||
useCustomWorkingDirectory = "NO"
|
||||
buildConfiguration = "Debug">
|
||||
<BuildableProductRunnable>
|
||||
<BuildableReference
|
||||
BuildableIdentifier = "primary"
|
||||
BlueprintIdentifier = "027D999913696A7000D3DB13"
|
||||
BuildableName = "xcodecapp-cocoa.app"
|
||||
BlueprintName = "xcodecapp-cocoa"
|
||||
ReferencedContainer = "container:xcodecapp-cocoa.xcodeproj">
|
||||
</BuildableReference>
|
||||
</BuildableProductRunnable>
|
||||
<AdditionalOptions>
|
||||
</AdditionalOptions>
|
||||
</LaunchAction>
|
||||
<ProfileAction
|
||||
displayScaleIsEnabled = "NO"
|
||||
displayScale = "1.00"
|
||||
shouldUseLaunchSchemeArgsEnv = "YES"
|
||||
savedToolIdentifier = ""
|
||||
useCustomWorkingDirectory = "NO"
|
||||
buildConfiguration = "Release">
|
||||
<BuildableProductRunnable>
|
||||
<BuildableReference
|
||||
BuildableIdentifier = "primary"
|
||||
BlueprintIdentifier = "027D999913696A7000D3DB13"
|
||||
BuildableName = "xcodecapp-cocoa.app"
|
||||
BlueprintName = "xcodecapp-cocoa"
|
||||
ReferencedContainer = "container:xcodecapp-cocoa.xcodeproj">
|
||||
</BuildableReference>
|
||||
</BuildableProductRunnable>
|
||||
</ProfileAction>
|
||||
<AnalyzeAction
|
||||
buildConfiguration = "Debug">
|
||||
</AnalyzeAction>
|
||||
<ArchiveAction
|
||||
buildConfiguration = "Release"
|
||||
revealArchiveInOrganizer = "YES">
|
||||
</ArchiveAction>
|
||||
</Scheme>
|
||||
+37
@@ -0,0 +1,37 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
||||
<plist version="1.0">
|
||||
<dict>
|
||||
<key>SchemeUserState</key>
|
||||
<dict>
|
||||
<key>xcodecapp-cocoa RELEASE.xcscheme</key>
|
||||
<dict>
|
||||
<key>orderHint</key>
|
||||
<integer>1</integer>
|
||||
</dict>
|
||||
<key>xcodecapp-cocoa.xcscheme</key>
|
||||
<dict>
|
||||
<key>orderHint</key>
|
||||
<integer>0</integer>
|
||||
</dict>
|
||||
</dict>
|
||||
<key>SuppressBuildableAutocreation</key>
|
||||
<dict>
|
||||
<key>027D998A13696A0700D3DB13</key>
|
||||
<dict>
|
||||
<key>primary</key>
|
||||
<true/>
|
||||
</dict>
|
||||
<key>027D999913696A7000D3DB13</key>
|
||||
<dict>
|
||||
<key>primary</key>
|
||||
<true/>
|
||||
</dict>
|
||||
<key>8D1107260486CEB800E47090</key>
|
||||
<dict>
|
||||
<key>primary</key>
|
||||
<true/>
|
||||
</dict>
|
||||
</dict>
|
||||
</dict>
|
||||
</plist>
|
||||
Reference in new issue
Block a user