diff --git a/AppKit/CPObjectController.j b/AppKit/CPObjectController.j index 64ee8f5a0..18cd07792 100644 --- a/AppKit/CPObjectController.j +++ b/AppKit/CPObjectController.j @@ -109,6 +109,7 @@ [self setObjectClass:[CPMutableDictionary class]]; _observedKeys = [[CPCountedSet alloc] init]; + _selection = [[CPControllerSelectionProxy alloc] initWithController:self]; } return self; diff --git a/Tests/Manual/ArrayControllerInitialSelectionTest/AppController.j b/Tests/Manual/ArrayControllerInitialSelectionTest/AppController.j new file mode 100644 index 000000000..30a44eb30 --- /dev/null +++ b/Tests/Manual/ArrayControllerInitialSelectionTest/AppController.j @@ -0,0 +1,130 @@ +/* + * AppController.j + * ArrayControllerSetContentTest + * + * Created by You on July 17, 2012. + * Copyright 2012, Your Company All rights reserved. + */ + +@import +@import +@import + +@implementation AppController : CPObject +{ + CPString log; + CPString selectedValue; +} + +- (void)applicationDidFinishLaunching:(CPNotification)aNotification +{ + var theWindow = [[CPWindow alloc] initWithContentRect:CGRectMakeZero() styleMask:CPBorderlessBridgeWindowMask], + contentView = [theWindow contentView], + contentWidth = [contentView frame].size.width; + + // instantiate a controller + var controller = [[CPArrayController alloc] init]; + var content = [CPMutableArray array], + message = [[Message alloc] initWithMessage:@"This is an initial content" withAppController:self]; + [content addObject:message]; + [controller setContent:content]; + + // listen to selectedIndex change + [controller addObserver:self forKeyPath:@"selectionIndex" options: nil context: nil]; + + // create a field, and establish a binding + var field = [CPTextField textFieldWithStringValue:@"" placeholder:@"bound value appears here..." width:contentWidth/2]; + [field setFrameOrigin:CGPointMake(20, 20)]; + [field bind:@"value" toObject:controller withKeyPath:@"selection.message" options:nil]; + [field setEditable:NO]; + [contentView addSubview:field]; + + var logField = [CPTextField textFieldWithStringValue:@"" placeholder:@"access to bound field is logged here..." width:contentWidth/2]; + [logField setFrameOrigin:CGPointMake(20, 50)]; + [logField bind:@"value" toObject:self withKeyPath:@"log" options:nil]; + [logField setEditable:NO]; + [contentView addSubview:logField]; + + var selectedField = [CPTextField textFieldWithStringValue:@"" placeholder:@"waiting for a selection" width:contentWidth/2]; + [selectedField setFrameOrigin:CGPointMake(20, 80)]; + [selectedField bind:@"value" toObject:self withKeyPath:@"selectedValue" options:nil]; + [selectedField setEditable:NO]; + [contentView addSubview:selectedField]; + + [theWindow orderFront:self]; + + // later, a content is retrieved from a server, and updated by setContent or contetnArray binding. + // Here, uses setContent + var newContent = [CPMutableArray array], + newMessage = [[Message alloc] initWithMessage:@"Successfully you see a new content" withAppController:self]; + [newContent addObject:newMessage]; + [controller setContent:newContent]; + + // Uncomment the following line to turn on the standard menu bar. + //[CPMenu setMenuBarVisible:YES]; +} + +- (CPArrayController)controller +{ + return controller; +} + +- (CPString)log +{ + return log; +} + +- (void)setLog:(CPString)aLog +{ + log = aLog; +} + +- (CPString)selectedValue +{ + return selectedValue; +} + +- (void)setSelectedValue:(CPString)aSelectedValue +{ + selectedValue = aSelectedValue; +} + +- (void)observeValueForKeyPath:(CPString)keyPath ofObject:(id)object change:(CPDictionary)change context:(id)context +{ + var newIndex = [change valueForKey:CPKeyValueChangeNewKey], + selectedObject = [[object content] objectAtIndex:newIndex]; + + return [self setSelectedValue:@"Current Value via selectionIndex: " + [selectedObject messageWithoutCheck]]; +} + +@end + +@implementation Message : CPObject +{ + CPString message; + AppController app; +} + +- (id)initWithMessage:(CPString)aMessage withAppController:(AppController)anApp +{ + self = [super init]; + if (self) + { + message = aMessage; + app = anApp; + } + return self; +} + +- (CPString)message +{ + [app setLog:@"the following message is about to be read: " + message]; + return message; +} + +- (CPString)messageWithoutCheck +{ + return message; +} + +@end diff --git a/Tests/Manual/ArrayControllerInitialSelectionTest/Info.plist b/Tests/Manual/ArrayControllerInitialSelectionTest/Info.plist new file mode 100644 index 000000000..3ce4a1551 --- /dev/null +++ b/Tests/Manual/ArrayControllerInitialSelectionTest/Info.plist @@ -0,0 +1,12 @@ + + + + + CPApplicationDelegateClass + AppController + CPBundleName + ArrayControllerInitialSelectionTest + CPPrincipalClass + CPApplication + + diff --git a/Tests/Manual/ArrayControllerInitialSelectionTest/Jakefile b/Tests/Manual/ArrayControllerInitialSelectionTest/Jakefile new file mode 100644 index 000000000..a0e64eac4 --- /dev/null +++ b/Tests/Manual/ArrayControllerInitialSelectionTest/Jakefile @@ -0,0 +1,93 @@ +/* + * Jakefile + * ArrayControllerInitialSelectionTest + * + * Created by You on July 21, 2012. + * Copyright 2012, Your Company All rights reserved. + */ + +var ENV = require("system").env, + FILE = require("file"), + JAKE = require("jake"), + task = JAKE.task, + FileList = JAKE.FileList, + app = require("cappuccino/jake").app, + configuration = ENV["CONFIG"] || ENV["CONFIGURATION"] || ENV["c"] || "Debug", + OS = require("os"); + +app ("ArrayControllerInitialSelectionTest", function(task) +{ + task.setBuildIntermediatesPath(FILE.join("Build", "ArrayControllerInitialSelectionTest.build", configuration)); + task.setBuildPath(FILE.join("Build", configuration)); + + task.setProductName("ArrayControllerInitialSelectionTest"); + task.setIdentifier("com.yourcompany.ArrayControllerInitialSelectionTest"); + task.setVersion("1.0"); + task.setAuthor("Your Company"); + task.setEmail("feedback @nospam@ yourcompany.com"); + task.setSummary("ArrayControllerInitialSelectionTest"); + task.setSources((new FileList("**/*.j")).exclude(FILE.join("Build", "**"))); + task.setResources(new FileList("Resources/**")); + task.setIndexFilePath("index.html"); + task.setInfoPlistPath("Info.plist"); + + if (configuration === "Debug") + task.setCompilerFlags("-DDEBUG -g"); + else + task.setCompilerFlags("-O"); +}); + +task ("default", ["ArrayControllerInitialSelectionTest"], function() +{ + printResults(configuration); +}); + +task ("build", ["default"]); + +task ("debug", function() +{ + ENV["CONFIGURATION"] = "Debug"; + JAKE.subjake(["."], "build", ENV); +}); + +task ("release", function() +{ + ENV["CONFIGURATION"] = "Release"; + JAKE.subjake(["."], "build", ENV); +}); + +task ("run", ["debug"], function() +{ + OS.system(["open", FILE.join("Build", "Debug", "ArrayControllerInitialSelectionTest", "index.html")]); +}); + +task ("run-release", ["release"], function() +{ + OS.system(["open", FILE.join("Build", "Release", "ArrayControllerInitialSelectionTest", "index.html")]); +}); + +task ("deploy", ["release"], function() +{ + FILE.mkdirs(FILE.join("Build", "Deployment", "ArrayControllerInitialSelectionTest")); + OS.system(["press", "-f", FILE.join("Build", "Release", "ArrayControllerInitialSelectionTest"), FILE.join("Build", "Deployment", "ArrayControllerInitialSelectionTest")]); + printResults("Deployment") +}); + +task ("desktop", ["release"], function() +{ + FILE.mkdirs(FILE.join("Build", "Desktop", "ArrayControllerInitialSelectionTest")); + require("cappuccino/nativehost").buildNativeHost(FILE.join("Build", "Release", "ArrayControllerInitialSelectionTest"), FILE.join("Build", "Desktop", "ArrayControllerInitialSelectionTest", "ArrayControllerInitialSelectionTest.app")); + printResults("Desktop") +}); + +task ("run-desktop", ["desktop"], function() +{ + OS.system([FILE.join("Build", "Desktop", "ArrayControllerInitialSelectionTest", "ArrayControllerInitialSelectionTest.app", "Contents", "MacOS", "NativeHost"), "-i"]); +}); + +function printResults(configuration) +{ + print("----------------------------"); + print(configuration+" app built at path: "+FILE.join("Build", configuration, "ArrayControllerInitialSelectionTest")); + print("----------------------------"); +} diff --git a/Tests/Manual/ArrayControllerInitialSelectionTest/Resources/spinner.gif b/Tests/Manual/ArrayControllerInitialSelectionTest/Resources/spinner.gif new file mode 100644 index 000000000..06dbc2bc2 Binary files /dev/null and b/Tests/Manual/ArrayControllerInitialSelectionTest/Resources/spinner.gif differ diff --git a/Tests/Manual/ArrayControllerInitialSelectionTest/index-debug.html b/Tests/Manual/ArrayControllerInitialSelectionTest/index-debug.html new file mode 100644 index 000000000..b1224f0f1 --- /dev/null +++ b/Tests/Manual/ArrayControllerInitialSelectionTest/index-debug.html @@ -0,0 +1,107 @@ + + + + + + + + + + + + + + + ArrayControllerInitialSelectionTest + + + + + + + + + + + + + + +
+
+ + + +
+
+ + + diff --git a/Tests/Manual/ArrayControllerInitialSelectionTest/index.html b/Tests/Manual/ArrayControllerInitialSelectionTest/index.html new file mode 100644 index 000000000..d5bfff88b --- /dev/null +++ b/Tests/Manual/ArrayControllerInitialSelectionTest/index.html @@ -0,0 +1,78 @@ + + + + + + + + + + + + + + + ArrayControllerInitialSelectionTest + + + + + + + + + + + + +
+
+ + + +
+
+ + + + diff --git a/Tests/Manual/ArrayControllerInitialSelectionTest/main.j b/Tests/Manual/ArrayControllerInitialSelectionTest/main.j new file mode 100644 index 000000000..402ea8b60 --- /dev/null +++ b/Tests/Manual/ArrayControllerInitialSelectionTest/main.j @@ -0,0 +1,18 @@ +/* + * AppController.j + * ArrayControllerInitialSelectionTest + * + * Created by You on July 21, 2012. + * Copyright 2012, Your Company All rights reserved. + */ + +@import +@import + +@import "AppController.j" + + +function main(args, namedArgs) +{ + CPApplicationMain(args, namedArgs); +}