BWToolkit / BWSelectableToolbarIntegration.m

//
//  BWSelectableToolbarIntegration.m
//  BWToolkit
//
//  Created by Brandon Walkin (www.brandonwalkin.com)
//  All code is provided under the New BSD license.
//

#import <InterfaceBuilderKit/InterfaceBuilderKit.h>
#import "BWSelectableToolbar.h"
#import "BWSelectableToolbarInspector.h"
#import "BWSelectableToolbarHelper.h"

@interface NSToolbar (BWSTIntPrivate)
- (void)ibDocument:(id)fp8 willStartSimulatorWithContext:(id)fp12;
@end

@interface BWSelectableToolbar (BWSTIntPrivate)
- (id)parentOfObject:(id)anObj;
- (void)setDocumentToolbar:(BWSelectableToolbar *)obj;
@end

@interface IBDocument (BWSTIntPrivate)
+ (id)currentIBFrameworkVersion;
@end

@implementation BWSelectableToolbar ( BWSelectableToolbarIntegration )

- (void)ibPopulateKeyPaths:(NSMutableDictionary *)keyPaths {
    [super ibPopulateKeyPaths:keyPaths];
    [[keyPaths objectForKey:IBAttributeKeyPaths] addObjectsFromArray:[NSArray arrayWithObjects:@"isPreferencesToolbar",nil]];
}

- (void)ibPopulateAttributeInspectorClasses:(NSMutableArray *)classes {
    [super ibPopulateAttributeInspectorClasses:classes];
    [classes addObject:[BWSelectableToolbarInspector class]];
}

// Display a modal warning just before the simulator is launched - this incompatibility will hopefully be fixed in a future version of this plugin
- (void)ibDocument:(id)fp8 willStartSimulatorWithContext:(id)fp12
{	
	[super ibDocument:fp8 willStartSimulatorWithContext:fp12];
	
	// Simulating seems to work fine in IB 3.1.1 (672) so we won't show the alert if the user is running that version
	if ([[IBDocument currentIBFrameworkVersion] intValue] <= 672)
	{
		NSAlert *alert = [NSAlert alertWithMessageText:@"Toolbar not compatible with simulator" defaultButton:@"OK" alternateButton:nil otherButton:nil informativeTextWithFormat:@"The selectable toolbar is not yet compatible with the IB simulator. Quit the simulator and revert to the last saved document. Sorry for the inconvenience."];
		[alert runModal];
	}
}

- (void)ibDidAddToDesignableDocument:(IBDocument *)document
{
	[super ibDidAddToDesignableDocument:document];
	
	[self setDocumentToolbar:self];
	
	helper = [[BWSelectableToolbarHelper alloc] init];
	[document addObject:helper toParent:[self parentOfObject:self]];
}

- (void)addObject:(id)object toParent:(id)parent
{
	IBDocument *document = [IBDocument documentForObject:parent];
	
	[document addObject:object toParent:parent];
}

- (void)moveObject:(id)object toParent:(id)parent
{
	IBDocument *document = [IBDocument documentForObject:object];
	
	[document moveObject:object toParent:parent];
}

- (void)removeObject:(id)object
{
	IBDocument *document = [IBDocument documentForObject:object];
	
	[document removeObject:object];
}

- (NSArray *)objectsforDocumentObject:(id)anObj
{
	IBDocument *document = [IBDocument documentForObject:anObj];
	
	return [[document objects] retain];
}

- (id)parentOfObject:(id)anObj
{
	IBDocument *document = [IBDocument documentForObject:anObj];
	
	return [[document parentOfObject:anObj] retain];
}

- (NSArray *)childrenOfObject:(id)object
{
	IBDocument *document = [IBDocument documentForObject:object];
	
	return [document childrenOfObject:object];
}

@end
Tip: Filter by directory path e.g. /media app.js to search for public/media/app.js.
Tip: Use camelCasing e.g. ProjME to search for ProjectModifiedEvent.java.
Tip: Filter by extension type e.g. /repo .js to search for all .js files in the /repo directory.
Tip: Separate your search with spaces e.g. /ssh pom.xml to search for src/ssh/pom.xml.
Tip: Use ↑ and ↓ arrow keys to navigate and return to view the file.
Tip: You can also navigate files with Ctrl+j (next) and Ctrl+k (previous) and view the file with Ctrl+o.
Tip: You can also navigate files with Alt+j (next) and Alt+k (previous) and view the file with Alt+o.