diff --git a/Tests/Manual/Bindings/AppController.j b/Tests/Manual/Bindings/AppController.j new file mode 100644 index 000000000..847e5b9ba --- /dev/null +++ b/Tests/Manual/Bindings/AppController.j @@ -0,0 +1,111 @@ +/* + * AppController.j + * BindingContentArrayTest + * + * Created by aparajita on August 17, 2011. + * Copyright 2011, Victory-Heart Productions All rights reserved. + */ + +@implementation Companies : CPObject +{ + CPMutableArray items @accessors; +} + +- (id)init +{ + self = [super init]; + + if (self) + { + items = [CPMutableArray array]; + [items addObject:[CPDictionary dictionaryWithObjectsAndKeys:@"Spacely Sprockets", @"name", [CPArray arrayWithObjects:@"Tom", @"Dick", @"Harry"], @"employees"]]; + [items addObject:[CPDictionary dictionaryWithObjectsAndKeys:@"Cogswell Cogs", @"name", [CPArray arrayWithObjects:@"Jane", @"Mary", @"Vic"], @"employees"]]; + } + + return self; +} + +@end + +@implementation AppController : CPObject +{ + CPString employee @accessors; + Companies companies @accessors; + CPArrayController companiesController; + CPArrayController employeesController; +} + +- (void)applicationDidFinishLaunching:(CPNotification)aNotification +{ + var theWindow = [[CPWindow alloc] initWithContentRect:CGRectMakeZero() styleMask:CPBorderlessBridgeWindowMask], + contentView = [theWindow contentView], + companiesScrollView = [[CPScrollView alloc] initWithFrame:CGRectMake(30, 30, 200, 100)], + companiesTable = [[CPTableView alloc] initWithFrame:CGRectMake(0, 0, 100, 100)], + employeesScrollView = [[CPScrollView alloc] initWithFrame:CGRectMake(250, 30, 200, 100)], + employeesTable = [[CPTableView alloc] initWithFrame:CGRectMake(0, 0, 200, 100)], + text = [[CPTextField alloc] initWithFrame:CGRectMake(250, 140, 200, 29)]; + + companies = [Companies new]; + + var column = [[CPTableColumn alloc] initWithIdentifier:@"name"]; + + [column setResizingMask:CPTableColumnAutoresizingMask]; + [companiesTable addTableColumn:column]; + [companiesTable setAllowsMultipleSelection:YES]; + [companiesTable setColumnAutoresizingStyle:CPTableViewLastColumnOnlyAutoresizingStyle]; + [companiesScrollView setHasHorizontalScroller:NO]; + [companiesScrollView setHasVerticalScroller:NO]; + [companiesScrollView setDocumentView:companiesTable]; + [companiesScrollView setBorderType:CPBezelBorder]; + [companiesTable setHeaderView:nil]; + [companiesTable setAllowsEmptySelection:NO]; + + [contentView addSubview:companiesScrollView]; + + column = [[CPTableColumn alloc] initWithIdentifier:@"name"]; + + [column setResizingMask:CPTableColumnAutoresizingMask]; + [employeesTable addTableColumn:column]; + [employeesTable setAllowsMultipleSelection:YES]; + [employeesTable setColumnAutoresizingStyle:CPTableViewLastColumnOnlyAutoresizingStyle]; + [employeesScrollView setHasHorizontalScroller:NO]; + [employeesScrollView setHasVerticalScroller:NO]; + [employeesScrollView setDocumentView:employeesTable]; + [employeesScrollView setBorderType:CPBezelBorder]; + [employeesTable setHeaderView:nil]; + [employeesTable setAllowsEmptySelection:YES]; + + [contentView addSubview:employeesScrollView]; + [contentView addSubview:text]; + + companiesController = [CPArrayController new]; + [companiesController bind:@"contentArray" toObject:companies withKeyPath:@"items" options:nil]; + + employeesController = [CPArrayController new]; + [employeesController bind:@"contentArray" toObject:companiesController withKeyPath:@"selection.employees" options:nil]; + + //var employeeController = [CPObjectController new]; + + //[employeeController bind:@"contentObject" toObject:self withKeyPath:@"employee" options:nil]; + + [[companiesTable tableColumnWithIdentifier:@"name"] bind:@"value" toObject:companiesController withKeyPath:@"arrangedObjects.name" options:nil]; + [[employeesTable tableColumnWithIdentifier:@"name"] bind:@"value" toObject:employeesController withKeyPath:@"arrangedObjects" options:nil]; + [text bind:@"value" toObject:employeesController withKeyPath:@"selection.self" options:nil]; + + [companiesController addObserver:self forKeyPath:@"selection" options:0 context:@"companies.selection"]; + [companiesController addObserver:self forKeyPath:@"selectionIndexes" options:0 context:@"companies.selectionIndexes"]; + [companiesController addObserver:self forKeyPath:@"arrangedObjects" options:0 context:@"companies.arrangedObjects"]; + [employeesController addObserver:self forKeyPath:@"selectionIndexes" options:0 context:@"employees.selectionIndexes"]; + [employeesController addObserver:self forKeyPath:@"selection" options:0 context:@"employees.selection"]; + [employeesController addObserver:self forKeyPath:@"arrangedObjects" options:0 context:@"employees.arrangedObjects"]; + + [theWindow setInitialFirstResponder:companiesTable]; + [theWindow orderFront:self]; +} + +- (void)observeValueForKeyPath:(CPString)keyPath ofObject:(id)object change:(CPDictionary)change context:(id)context +{ + console.log("\nkeyPath: %s\ncontext: %s\nnew: %s\nold: %s", keyPath, context, [[change valueForKey:CPKeyValueChangeNewKey] description], [[change valueForKey:CPKeyValueChangeOldKey] description]); +} + +@end diff --git a/Tests/Manual/Bindings/Info.plist b/Tests/Manual/Bindings/Info.plist new file mode 100644 index 000000000..49f8e3347 --- /dev/null +++ b/Tests/Manual/Bindings/Info.plist @@ -0,0 +1,12 @@ + + + + + CPApplicationDelegateClass + AppController + CPBundleName + BindingContentArrayTest + CPPrincipalClass + CPApplication + + diff --git a/Tests/Manual/Bindings/Jakefile b/Tests/Manual/Bindings/Jakefile new file mode 100644 index 000000000..a5d4665b0 --- /dev/null +++ b/Tests/Manual/Bindings/Jakefile @@ -0,0 +1,93 @@ +/* + * Jakefile + * BindingContentArrayTest + * + * Created by aparajita on August 17, 2011. + * Copyright 2011, Victory-Heart Productions 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 ("BindingContentArrayTest", function(task) +{ + task.setBuildIntermediatesPath(FILE.join("Build", "BindingContentArrayTest.build", configuration)); + task.setBuildPath(FILE.join("Build", configuration)); + + task.setProductName("BindingContentArrayTest"); + task.setIdentifier("com.aparajita.BindingContentArrayTest"); + task.setVersion("1.0"); + task.setAuthor("Victory-Heart Productions"); + task.setEmail("feedback @nospam@ yourcompany.com"); + task.setSummary("BindingContentArrayTest"); + 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", ["BindingContentArrayTest"], 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", "BindingContentArrayTest", "index.html")]); +}); + +task ("run-release", ["release"], function() +{ + OS.system(["open", FILE.join("Build", "Release", "BindingContentArrayTest", "index.html")]); +}); + +task ("deploy", ["release"], function() +{ + FILE.mkdirs(FILE.join("Build", "Deployment", "BindingContentArrayTest")); + OS.system(["press", "-f", FILE.join("Build", "Release", "BindingContentArrayTest"), FILE.join("Build", "Deployment", "BindingContentArrayTest")]); + printResults("Deployment") +}); + +task ("desktop", ["release"], function() +{ + FILE.mkdirs(FILE.join("Build", "Desktop", "BindingContentArrayTest")); + require("cappuccino/nativehost").buildNativeHost(FILE.join("Build", "Release", "BindingContentArrayTest"), FILE.join("Build", "Desktop", "BindingContentArrayTest", "BindingContentArrayTest.app")); + printResults("Desktop") +}); + +task ("run-desktop", ["desktop"], function() +{ + OS.system([FILE.join("Build", "Desktop", "BindingContentArrayTest", "BindingContentArrayTest.app", "Contents", "MacOS", "NativeHost"), "-i"]); +}); + +function printResults(configuration) +{ + print("----------------------------"); + print(configuration+" app built at path: "+FILE.join("Build", configuration, "BindingContentArrayTest")); + print("----------------------------"); +} diff --git a/Tests/Manual/Bindings/README.md b/Tests/Manual/Bindings/README.md new file mode 100644 index 000000000..0c9922fd9 --- /dev/null +++ b/Tests/Manual/Bindings/README.md @@ -0,0 +1,14 @@ +Run this application with the current master, and note the following bugs: + +- When you click on any item, there are two selection change notifications instead of one. + +- If you compare the order of the notifications with Cocoa, they are slightly different. + +- The right hand table is configured to allow an empty selection. If you click in the +empty area below the names, there is an empty selection notification, but then the +the current selection changes to the first item and generates another notification. + +- If you select multiple items on the left, there is an error. This is a bug that will +have to be fixed in a later commit. + +If you apply the changes in these commits, the first three bugs are fixed. diff --git a/Tests/Manual/Bindings/Resources/spinner.gif b/Tests/Manual/Bindings/Resources/spinner.gif new file mode 100644 index 000000000..06dbc2bc2 Binary files /dev/null and b/Tests/Manual/Bindings/Resources/spinner.gif differ diff --git a/Tests/Manual/Bindings/index-debug.html b/Tests/Manual/Bindings/index-debug.html new file mode 100644 index 000000000..9463d3392 --- /dev/null +++ b/Tests/Manual/Bindings/index-debug.html @@ -0,0 +1,103 @@ + + + + + + + + + + + + + + + Bindings + + + + + + + + + + + + + + +
+
+ + + +
+
+ + + diff --git a/Tests/Manual/Bindings/index.html b/Tests/Manual/Bindings/index.html new file mode 100644 index 000000000..3616a73b2 --- /dev/null +++ b/Tests/Manual/Bindings/index.html @@ -0,0 +1,78 @@ + + + + + + + + + + + + + + + Bindings + + + + + + + + + + + + +
+
+ + + +
+
+ + + + diff --git a/Tests/Manual/Bindings/main.j b/Tests/Manual/Bindings/main.j new file mode 100644 index 000000000..a3894cf42 --- /dev/null +++ b/Tests/Manual/Bindings/main.j @@ -0,0 +1,18 @@ +/* + * AppController.j + * BindingContentArrayTest + * + * Created by aparajita on August 17, 2011. + * Copyright 2011, Victory-Heart Productions All rights reserved. + */ + +@import +@import + +@import "AppController.j" + + +function main(args, namedArgs) +{ + CPApplicationMain(args, namedArgs); +}