diff --git a/AppKit/CPView.j b/AppKit/CPView.j index bee9f420f..28c4cb48a 100644 --- a/AppKit/CPView.j +++ b/AppKit/CPView.j @@ -2509,7 +2509,7 @@ setBoundsOrigin: var frame = [self rectForEphemeralSubviewNamed:aViewName]; - if (frame && !_CGRectIsEmpty(frame)) + if (frame) { if (!_ephemeralSubviewsForNames[aViewName]) { diff --git a/Tests/Manual/layoutEphemeralSubviewTest/AppController.j b/Tests/Manual/layoutEphemeralSubviewTest/AppController.j new file mode 100644 index 000000000..14932a323 --- /dev/null +++ b/Tests/Manual/layoutEphemeralSubviewTest/AppController.j @@ -0,0 +1,160 @@ +/* + * AppController.j + * layoutEphemeralSubviewTest + * + * Created by Aparajita Fishman on October 8, 2010. + */ + +@import + + +@implementation AppController : CPObject +{ +} + +- (void)applicationDidFinishLaunching:(CPNotification)aNotification +{ + var theWindow = [[CPWindow alloc] initWithContentRect:CGRectMake(0, 0, 300, 250) styleMask:CPTitledWindowMask], + contentView = [theWindow contentView], + radio = [[OldRadio alloc] initWithFrame:CGRectMakeZero()]; + + [theWindow center]; + [theWindow setTitle:@"layoutEphemeralSubview Test"]; + + var label = [[CPTextField alloc] initWithFrame:CGRectMake(15, 15, 270, 80)]; + + [label setLineBreakMode:CPLineBreakByWordWrapping]; + [label setStringValue:@"These checkboxes and radio buttons were created with an empty frame, then sized to fit. " + + @"Notice that the ones with the old code truncate the image, whereas the ones made with " + + @"the new code size correctly."]; + [label setFrameOrigin:CGPointMake(15, 20)]; + [contentView addSubview:label]; + + label = [CPTextField labelWithTitle:@"Old code:"]; + [label setFrameOrigin:CGPointMake(15, 120)]; + [contentView addSubview:label]; + + var checkbox = [[OldCheckBox alloc] initWithFrame:CGRectMakeZero()]; + + [checkbox sizeToFit]; + [checkbox setFrameOrigin:CGPointMake(CGRectGetMaxX([label frame]) + 5, CGRectGetMinY([label frame]))]; + [contentView addSubview:checkbox]; + + label = [CPTextField labelWithTitle:@"New code:"], + [label setFrameOrigin:CGPointMake(15, CGRectGetMaxY([checkbox frame]) + 10)]; + [contentView addSubview:label]; + + checkbox = [[CPCheckBox alloc] initWithFrame:CGRectMakeZero()]; + [checkbox sizeToFit]; + [checkbox setFrameOrigin:CGPointMake(CGRectGetMaxX([label frame]) + 5, CGRectGetMinY([label frame]))]; + [contentView addSubview:checkbox]; + + label = [CPTextField labelWithTitle:@"Old code:"]; + [label setFrameOrigin:CGPointMake(15, CGRectGetMaxY([checkbox frame]) + 10)]; + [contentView addSubview:label]; + + var radio = [[OldRadio alloc] initWithFrame:CGRectMakeZero()]; + + [radio sizeToFit]; + [radio setFrameOrigin:CGPointMake(CGRectGetMaxX([label frame]) + 5, CGRectGetMinY([label frame]))]; + [contentView addSubview:radio]; + + label = [CPTextField labelWithTitle:@"New code:"], + [label setFrameOrigin:CGPointMake(15, CGRectGetMaxY([radio frame]) + 10)]; + [contentView addSubview:label]; + + radio = [[CPRadio alloc] initWithFrame:CGRectMakeZero()]; + [radio sizeToFit]; + [radio setFrameOrigin:CGPointMake(CGRectGetMaxX([label frame]) + 5, CGRectGetMinY([label frame]))]; + [contentView addSubview:radio]; + + [theWindow orderFront:self]; +} + +@end + + +@implementation OldCheckBox : CPCheckBox + +- (CPView)layoutEphemeralSubviewNamed:(CPString)aViewName + positioned:(CPWindowOrderingMode)anOrderingMode + relativeToEphemeralSubviewNamed:(CPString)relativeToViewName +{ + if (!_ephemeralSubviewsForNames) + { + _ephemeralSubviewsForNames = {}; + _ephemeralSubviews = [CPSet set]; + } + + var frame = [self rectForEphemeralSubviewNamed:aViewName]; + + if (frame && !CGRectIsEmpty(frame)) + { + if (!_ephemeralSubviewsForNames[aViewName]) + { + _ephemeralSubviewsForNames[aViewName] = [self createEphemeralSubviewNamed:aViewName]; + + [_ephemeralSubviews addObject:_ephemeralSubviewsForNames[aViewName]]; + + if (_ephemeralSubviewsForNames[aViewName]) + [self addSubview:_ephemeralSubviewsForNames[aViewName] positioned:anOrderingMode relativeTo:_ephemeralSubviewsForNames[relativeToViewName]]; + } + + if (_ephemeralSubviewsForNames[aViewName]) + [_ephemeralSubviewsForNames[aViewName] setFrame:frame]; + } + else if (_ephemeralSubviewsForNames[aViewName]) + { + [_ephemeralSubviewsForNames[aViewName] removeFromSuperview]; + + [_ephemeralSubviews removeObject:_ephemeralSubviewsForNames[aViewName]]; + delete _ephemeralSubviewsForNames[aViewName]; + } + + return _ephemeralSubviewsForNames[aViewName]; +} + +@end + + +@implementation OldRadio : CPRadio + +- (CPView)layoutEphemeralSubviewNamed:(CPString)aViewName + positioned:(CPWindowOrderingMode)anOrderingMode + relativeToEphemeralSubviewNamed:(CPString)relativeToViewName +{ + if (!_ephemeralSubviewsForNames) + { + _ephemeralSubviewsForNames = {}; + _ephemeralSubviews = [CPSet set]; + } + + var frame = [self rectForEphemeralSubviewNamed:aViewName]; + + if (frame && !CGRectIsEmpty(frame)) + { + if (!_ephemeralSubviewsForNames[aViewName]) + { + _ephemeralSubviewsForNames[aViewName] = [self createEphemeralSubviewNamed:aViewName]; + + [_ephemeralSubviews addObject:_ephemeralSubviewsForNames[aViewName]]; + + if (_ephemeralSubviewsForNames[aViewName]) + [self addSubview:_ephemeralSubviewsForNames[aViewName] positioned:anOrderingMode relativeTo:_ephemeralSubviewsForNames[relativeToViewName]]; + } + + if (_ephemeralSubviewsForNames[aViewName]) + [_ephemeralSubviewsForNames[aViewName] setFrame:frame]; + } + else if (_ephemeralSubviewsForNames[aViewName]) + { + [_ephemeralSubviewsForNames[aViewName] removeFromSuperview]; + + [_ephemeralSubviews removeObject:_ephemeralSubviewsForNames[aViewName]]; + delete _ephemeralSubviewsForNames[aViewName]; + } + + return _ephemeralSubviewsForNames[aViewName]; +} + +@end diff --git a/Tests/Manual/layoutEphemeralSubviewTest/Info.plist b/Tests/Manual/layoutEphemeralSubviewTest/Info.plist new file mode 100644 index 000000000..162e3e867 --- /dev/null +++ b/Tests/Manual/layoutEphemeralSubviewTest/Info.plist @@ -0,0 +1,12 @@ + + + + + CPApplicationDelegateClass + AppController + CPBundleName + layoutEphemeralSubviewTest + CPPrincipalClass + CPApplication + + diff --git a/Tests/Manual/layoutEphemeralSubviewTest/Jakefile b/Tests/Manual/layoutEphemeralSubviewTest/Jakefile new file mode 100644 index 000000000..ed17fe26b --- /dev/null +++ b/Tests/Manual/layoutEphemeralSubviewTest/Jakefile @@ -0,0 +1,92 @@ +/* + * Jakefile + * layoutEphemeralSubviewTest + * + * Created by Aparajita Fishman on October 8, 2010. + */ + +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 ("layoutEphemeralSubviewTest", function(task) +{ + task.setBuildIntermediatesPath(FILE.join("Build", "layoutEphemeralSubviewTest.build", configuration)); + task.setBuildPath(FILE.join("Build", configuration)); + + task.setProductName("layoutEphemeralSubviewTest"); + task.setIdentifier("com.yourcompany.layoutEphemeralSubviewTest"); + task.setVersion("1.0"); + task.setAuthor("WireLoad, LLC"); + task.setEmail("feedback @nospam@ yourcompany.com"); + task.setSummary("layoutEphemeralSubviewTest"); + 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", ["layoutEphemeralSubviewTest"], 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", "layoutEphemeralSubviewTest", "index.html")]); +}); + +task ("run-release", ["release"], function() +{ + OS.system(["open", FILE.join("Build", "Release", "layoutEphemeralSubviewTest", "index.html")]); +}); + +task ("deploy", ["release"], function() +{ + FILE.mkdirs(FILE.join("Build", "Deployment", "layoutEphemeralSubviewTest")); + OS.system(["press", "-f", FILE.join("Build", "Release", "layoutEphemeralSubviewTest"), FILE.join("Build", "Deployment", "layoutEphemeralSubviewTest")]); + printResults("Deployment") +}); + +task ("desktop", ["release"], function() +{ + FILE.mkdirs(FILE.join("Build", "Desktop", "layoutEphemeralSubviewTest")); + require("cappuccino/nativehost").buildNativeHost(FILE.join("Build", "Release", "layoutEphemeralSubviewTest"), FILE.join("Build", "Desktop", "layoutEphemeralSubviewTest", "layoutEphemeralSubviewTest.app")); + printResults("Desktop") +}); + +task ("run-desktop", ["desktop"], function() +{ + OS.system([FILE.join("Build", "Desktop", "layoutEphemeralSubviewTest", "layoutEphemeralSubviewTest.app", "Contents", "MacOS", "NativeHost"), "-i"]); +}); + +function printResults(configuration) +{ + print("----------------------------"); + print(configuration+" app built at path: "+FILE.join("Build", configuration, "layoutEphemeralSubviewTest")); + print("----------------------------"); +} diff --git a/Tests/Manual/layoutEphemeralSubviewTest/Resources/spinner.gif b/Tests/Manual/layoutEphemeralSubviewTest/Resources/spinner.gif new file mode 100644 index 000000000..06dbc2bc2 Binary files /dev/null and b/Tests/Manual/layoutEphemeralSubviewTest/Resources/spinner.gif differ diff --git a/Tests/Manual/layoutEphemeralSubviewTest/index-debug.html b/Tests/Manual/layoutEphemeralSubviewTest/index-debug.html new file mode 100644 index 000000000..e6325d134 --- /dev/null +++ b/Tests/Manual/layoutEphemeralSubviewTest/index-debug.html @@ -0,0 +1,103 @@ + + + + + + + + + + + + + + + + layoutEphemeralSubview Test + + + + + + + + + + + + + + +
+
+ + + +
+
+ + + diff --git a/Tests/Manual/layoutEphemeralSubviewTest/index.html b/Tests/Manual/layoutEphemeralSubviewTest/index.html new file mode 100644 index 000000000..981d62c6a --- /dev/null +++ b/Tests/Manual/layoutEphemeralSubviewTest/index.html @@ -0,0 +1,78 @@ + + + + + + + + + + + + + + + + layoutEphemeralSubview Test + + + + + + + + + + + + +
+
+ + + +
+
+ + + + diff --git a/Tests/Manual/layoutEphemeralSubviewTest/main.j b/Tests/Manual/layoutEphemeralSubviewTest/main.j new file mode 100644 index 000000000..ceb0a5ee0 --- /dev/null +++ b/Tests/Manual/layoutEphemeralSubviewTest/main.j @@ -0,0 +1,17 @@ +/* + * AppController.j + * layoutEphemeralSubviewTest + * + * Created by Aparajita Fishman on October 8, 2010. + */ + +@import +@import + +@import "AppController.j" + + +function main(args, namedArgs) +{ + CPApplicationMain(args, namedArgs); +}