diff --git a/AppKit/CPMenu/CPMenu.j b/AppKit/CPMenu/CPMenu.j index db5aa8e61..961f2a421 100644 --- a/AppKit/CPMenu/CPMenu.j +++ b/AppKit/CPMenu/CPMenu.j @@ -337,6 +337,25 @@ var _CPMenuBarVisible = NO, [self removeObjectFromItemsAtIndex:anIndex]; } +/*! + Removes all the menu items in the receiver. + This method is more efficient than removing menu items individually. + + Unlike the other remove methods, this method does not post CPMenuDidChangeItemNotification notifications. +*/ +- (void)removeAllItems +{ + var count = [_items count]; + + // Remove the connection to this menu in case + // someone else has a reference to the menu item. + while (count--) + [_items[count] setMenu:nil]; + + _items = [CPMutableArray array]; + _highlightedIndex = CPNotFound; +} + /*! Called when a menu item has visually changed. @param aMenuItem the item that changed @@ -970,14 +989,6 @@ var _CPMenuBarVisible = NO, } // -/* - @ignore -*/ -- (BOOL)_itemIsHighlighted:(CPMenuItem)aMenuItem -{ - return _items[_highlightedIndex] == aMenuItem; -} - /* @ignore */ diff --git a/AppKit/CPPopUpButton.j b/AppKit/CPPopUpButton.j index ca1a548cb..193b5bcd5 100644 --- a/AppKit/CPPopUpButton.j +++ b/AppKit/CPPopUpButton.j @@ -192,11 +192,7 @@ CPPopUpButtonStatePullsDown = CPThemeState("pulls-down"); */ - (void)removeAllItems { - var menu = [self menu], - count = [menu numberOfItems]; - - while (count--) - [menu removeItemAtIndex:0]; + [[self menu] removeAllItems]; } /*! diff --git a/Tests/Manual/CPMenuRemoveAllTest/AppController.j b/Tests/Manual/CPMenuRemoveAllTest/AppController.j new file mode 100644 index 000000000..a8104a1e4 --- /dev/null +++ b/Tests/Manual/CPMenuRemoveAllTest/AppController.j @@ -0,0 +1,73 @@ +/* + * AppController.j + * CPMenuRemoveAllTest + * + * Created by aparajita on May 11, 2011. + * Copyright 2011, Victory-Heart Productions All rights reserved. + */ + +@import + + +@implementation AppController : CPObject +{ + CPMenu menu; +} + +- (void)applicationDidFinishLaunching:(CPNotification)aNotification +{ + var theWindow = [[CPWindow alloc] initWithContentRect:CGRectMakeZero() styleMask:CPBorderlessBridgeWindowMask], + contentView = [theWindow contentView]; + + menu = [[CPPopUpButton alloc] initWithFrame:CGRectMakeZero()]; + + [self addStandardItems]; + [menu setPullsDown:YES]; + [menu sizeToFit]; + [menu setFrameSize:CGSizeMake(150, [menu frameSize].height)]; + [self setupAction]; + + [menu setAutoresizingMask:CPViewMinXMargin | CPViewMaxXMargin | CPViewMinYMargin | CPViewMaxYMargin]; + [menu setCenter:[contentView center]]; + + [contentView addSubview:menu]; + + [theWindow orderFront:self]; + + // Uncomment the following line to turn on the standard menu bar. + //[CPMenu setMenuBarVisible:YES]; +} + +- (void)addStandardItems +{ + [menu addItemsWithTitles:[@"One", @"Two", @"Alternate Items"]]; +} + +- (void)addAlternateItems +{ + [menu addItemsWithTitles:[@"Three", @"Four", @"Default Items"]]; +} + +- (void)setupAction +{ + var item = [menu itemAtIndex:2]; + + [item setTarget:self]; + [item setAction:@selector(itemWasSelected:)]; +} + +- (void)itemWasSelected:(id)sender +{ + var title = [menu itemTitleAtIndex:0]; + + [menu removeAllItems]; + + if (title === @"One") + [self addAlternateItems]; + else + [self addStandardItems]; + + [self setupAction]; +} + +@end diff --git a/Tests/Manual/CPMenuRemoveAllTest/Info.plist b/Tests/Manual/CPMenuRemoveAllTest/Info.plist new file mode 100644 index 000000000..c542bb1e4 --- /dev/null +++ b/Tests/Manual/CPMenuRemoveAllTest/Info.plist @@ -0,0 +1,12 @@ + + + + + CPApplicationDelegateClass + AppController + CPBundleName + CPMenuRemoveAllTest + CPPrincipalClass + CPApplication + + diff --git a/Tests/Manual/CPMenuRemoveAllTest/Jakefile b/Tests/Manual/CPMenuRemoveAllTest/Jakefile new file mode 100644 index 000000000..3fcf47fb2 --- /dev/null +++ b/Tests/Manual/CPMenuRemoveAllTest/Jakefile @@ -0,0 +1,93 @@ +/* + * Jakefile + * CPMenuRemoveAllTest + * + * Created by aparajita on May 11, 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 ("CPMenuRemoveAllTest", function(task) +{ + task.setBuildIntermediatesPath(FILE.join("Build", "CPMenuRemoveAllTest.build", configuration)); + task.setBuildPath(FILE.join("Build", configuration)); + + task.setProductName("CPMenuRemoveAllTest"); + task.setIdentifier("com.aparajita.CPMenuRemoveAllTest"); + task.setVersion("1.0"); + task.setAuthor("Victory-Heart Productions"); + task.setEmail("feedback @nospam@ yourcompany.com"); + task.setSummary("CPMenuRemoveAllTest"); + 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", ["CPMenuRemoveAllTest"], 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", "CPMenuRemoveAllTest", "index.html")]); +}); + +task ("run-release", ["release"], function() +{ + OS.system(["open", FILE.join("Build", "Release", "CPMenuRemoveAllTest", "index.html")]); +}); + +task ("deploy", ["release"], function() +{ + FILE.mkdirs(FILE.join("Build", "Deployment", "CPMenuRemoveAllTest")); + OS.system(["press", "-f", FILE.join("Build", "Release", "CPMenuRemoveAllTest"), FILE.join("Build", "Deployment", "CPMenuRemoveAllTest")]); + printResults("Deployment") +}); + +task ("desktop", ["release"], function() +{ + FILE.mkdirs(FILE.join("Build", "Desktop", "CPMenuRemoveAllTest")); + require("cappuccino/nativehost").buildNativeHost(FILE.join("Build", "Release", "CPMenuRemoveAllTest"), FILE.join("Build", "Desktop", "CPMenuRemoveAllTest", "CPMenuRemoveAllTest.app")); + printResults("Desktop") +}); + +task ("run-desktop", ["desktop"], function() +{ + OS.system([FILE.join("Build", "Desktop", "CPMenuRemoveAllTest", "CPMenuRemoveAllTest.app", "Contents", "MacOS", "NativeHost"), "-i"]); +}); + +function printResults(configuration) +{ + print("----------------------------"); + print(configuration+" app built at path: "+FILE.join("Build", configuration, "CPMenuRemoveAllTest")); + print("----------------------------"); +} diff --git a/Tests/Manual/CPMenuRemoveAllTest/Resources/spinner.gif b/Tests/Manual/CPMenuRemoveAllTest/Resources/spinner.gif new file mode 100644 index 000000000..06dbc2bc2 Binary files /dev/null and b/Tests/Manual/CPMenuRemoveAllTest/Resources/spinner.gif differ diff --git a/Tests/Manual/CPMenuRemoveAllTest/index-debug.html b/Tests/Manual/CPMenuRemoveAllTest/index-debug.html new file mode 100644 index 000000000..bb52b4dad --- /dev/null +++ b/Tests/Manual/CPMenuRemoveAllTest/index-debug.html @@ -0,0 +1,103 @@ + + + + + + + + + + + + + + + CPMenuRemoveAllTest + + + + + + + + + + + + + + +
+
+ + + +
+
+ + + diff --git a/Tests/Manual/CPMenuRemoveAllTest/index.html b/Tests/Manual/CPMenuRemoveAllTest/index.html new file mode 100644 index 000000000..a748831e5 --- /dev/null +++ b/Tests/Manual/CPMenuRemoveAllTest/index.html @@ -0,0 +1,78 @@ + + + + + + + + + + + + + + + CPMenuRemoveAllTest + + + + + + + + + + + + +
+
+ + + +
+
+ + + + diff --git a/Tests/Manual/CPMenuRemoveAllTest/main.j b/Tests/Manual/CPMenuRemoveAllTest/main.j new file mode 100644 index 000000000..b2f046c3c --- /dev/null +++ b/Tests/Manual/CPMenuRemoveAllTest/main.j @@ -0,0 +1,18 @@ +/* + * AppController.j + * CPMenuRemoveAllTest + * + * Created by aparajita on May 11, 2011. + * Copyright 2011, Victory-Heart Productions All rights reserved. + */ + +@import +@import + +@import "AppController.j" + + +function main(args, namedArgs) +{ + CPApplicationMain(args, namedArgs); +}