From 3364e6c63b789b612b0a9e50dc85c26f6b4f2377 Mon Sep 17 00:00:00 2001 From: Alexandre Wilhelm Date: Mon, 9 Jun 2014 14:34:08 -0700 Subject: [PATCH 1/3] Fixed: unsigned delegate methods of CPTokenField erased by CPTextField Previously, the unsigned delegate methods _implementedDelegateMethods was erased by the CPTextField, so some delegate methods didn't work any more. This PR just renames the unsigned delegate methods to _implementedTokenFieldDelegateMethods. --- AppKit/CPTokenField.j | 32 ++++++++++++++++---------------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/AppKit/CPTokenField.j b/AppKit/CPTokenField.j index 9e9ba617e..cc4b96765 100644 --- a/AppKit/CPTokenField.j +++ b/AppKit/CPTokenField.j @@ -105,7 +105,7 @@ CPTokenFieldDeleteButtonType = 1; int _buttonType @accessors(property=buttonType); id _tokenFieldDelegate; - unsigned _implementedDelegateMethods; + unsigned _implementedTokenFieldDelegateMethods; } + (CPCharacterSet)defaultTokenizingCharacterSet @@ -177,25 +177,25 @@ CPTokenFieldDeleteButtonType = 1; return; _tokenFieldDelegate = aDelegate; - _implementedDelegateMethods = 0; + _implementedTokenFieldDelegateMethods = 0; if ([_tokenFieldDelegate respondsToSelector:@selector(tokenField:hasMenuForRepresentedObject:)]) - _implementedDelegateMethods |= CPTokenFieldDelegate_tokenField_hasMenuForRepresentedObject_; + _implementedTokenFieldDelegateMethods |= CPTokenFieldDelegate_tokenField_hasMenuForRepresentedObject_; if ([_tokenFieldDelegate respondsToSelector:@selector(tokenField:completionsForSubstring:indexOfToken:indexOfSelectedItem:)]) - _implementedDelegateMethods |= CPTokenFieldDelegate_tokenField_completionsForSubstring_indexOfToken_indexOfSelectedItem_; + _implementedTokenFieldDelegateMethods |= CPTokenFieldDelegate_tokenField_completionsForSubstring_indexOfToken_indexOfSelectedItem_; if ([_tokenFieldDelegate respondsToSelector:@selector(tokenField:shouldAddObjects:atIndex:)]) - _implementedDelegateMethods |= CPTokenFieldDelegate_tokenField_shouldAddObjects_atIndex_; + _implementedTokenFieldDelegateMethods |= CPTokenFieldDelegate_tokenField_shouldAddObjects_atIndex_; if ([_tokenFieldDelegate respondsToSelector:@selector(tokenField:menuForRepresentedObject:)]) - _implementedDelegateMethods |= CPTokenFieldDelegate_tokenField_menuForRepresentedObject_; + _implementedTokenFieldDelegateMethods |= CPTokenFieldDelegate_tokenField_menuForRepresentedObject_; if ([_tokenFieldDelegate respondsToSelector:@selector(tokenField:displayStringForRepresentedObject:)]) - _implementedDelegateMethods |= CPTokenFieldDelegate_tokenField_displayStringForRepresentedObject_; + _implementedTokenFieldDelegateMethods |= CPTokenFieldDelegate_tokenField_displayStringForRepresentedObject_; if ([_tokenFieldDelegate respondsToSelector:@selector(tokenField:representedObjectForEditingString:)]) - _implementedDelegateMethods |= CPTokenFieldDelegate_tokenField_representedObjectForEditingString_; + _implementedTokenFieldDelegateMethods |= CPTokenFieldDelegate_tokenField_representedObjectForEditingString_; [super setDelegate:_tokenFieldDelegate]; } @@ -1248,7 +1248,7 @@ CPTokenFieldDeleteButtonType = 1; */ - (CPArray)_completionsForSubstring:(CPString)substring indexOfToken:(int)tokenIndex indexOfSelectedItem:(int)selectedIndex { - if (!(_implementedDelegateMethods & CPTokenFieldDelegate_tokenField_completionsForSubstring_indexOfToken_indexOfSelectedItem_)) + if (!(_implementedTokenFieldDelegateMethods & CPTokenFieldDelegate_tokenField_completionsForSubstring_indexOfToken_indexOfSelectedItem_)) return []; return [_tokenFieldDelegate tokenField:self completionsForSubstring:substring indexOfToken:tokenIndex indexOfSelectedItem:selectedIndex]; @@ -1274,7 +1274,7 @@ CPTokenFieldDeleteButtonType = 1; */ - (CPString)_displayStringForRepresentedObject:(id)representedObject { - if (_implementedDelegateMethods & CPTokenFieldDelegate_tokenField_displayStringForRepresentedObject_) + if (_implementedTokenFieldDelegateMethods & CPTokenFieldDelegate_tokenField_displayStringForRepresentedObject_) { var stringForRepresentedObject = [_tokenFieldDelegate tokenField:self displayStringForRepresentedObject:representedObject]; @@ -1296,7 +1296,7 @@ CPTokenFieldDeleteButtonType = 1; */ - (CPArray)_shouldAddObjects:(CPArray)tokens atIndex:(int)index { - if (_implementedDelegateMethods & CPTokenFieldDelegate_tokenField_shouldAddObjects_atIndex_) + if (_implementedTokenFieldDelegateMethods & CPTokenFieldDelegate_tokenField_shouldAddObjects_atIndex_) { var approvedObjects = [_tokenFieldDelegate tokenField:self shouldAddObjects:tokens atIndex:index]; @@ -1318,7 +1318,7 @@ CPTokenFieldDeleteButtonType = 1; */ - (id)_representedObjectForEditingString:(CPString)aString { - if (_implementedDelegateMethods & CPTokenFieldDelegate_tokenField_representedObjectForEditingString_) + if (_implementedTokenFieldDelegateMethods & CPTokenFieldDelegate_tokenField_representedObjectForEditingString_) { var token = [_tokenFieldDelegate tokenField:self representedObjectForEditingString:aString]; @@ -1333,8 +1333,8 @@ CPTokenFieldDeleteButtonType = 1; - (BOOL)_hasMenuForRepresentedObject:(id)aRepresentedObject { - if ((_implementedDelegateMethods & CPTokenFieldDelegate_tokenField_hasMenuForRepresentedObject_) && - (_implementedDelegateMethods & CPTokenFieldDelegate_tokenField_menuForRepresentedObject_)) + if ((_implementedTokenFieldDelegateMethods & CPTokenFieldDelegate_tokenField_hasMenuForRepresentedObject_) && + (_implementedTokenFieldDelegateMethods & CPTokenFieldDelegate_tokenField_menuForRepresentedObject_)) return [_tokenFieldDelegate tokenField:self hasMenuForRepresentedObject:aRepresentedObject]; return NO; @@ -1342,8 +1342,8 @@ CPTokenFieldDeleteButtonType = 1; - (CPMenu)_menuForRepresentedObject:(id)aRepresentedObject { - if ((_implementedDelegateMethods & CPTokenFieldDelegate_tokenField_hasMenuForRepresentedObject_) && - (_implementedDelegateMethods & CPTokenFieldDelegate_tokenField_menuForRepresentedObject_)) + if ((_implementedTokenFieldDelegateMethods & CPTokenFieldDelegate_tokenField_hasMenuForRepresentedObject_) && + (_implementedTokenFieldDelegateMethods & CPTokenFieldDelegate_tokenField_menuForRepresentedObject_)) { var hasMenu = [_tokenFieldDelegate tokenField:self hasMenuForRepresentedObject:aRepresentedObject]; From 4568dfabb969a6f014cdf656b2b6ffcacbad3c4f Mon Sep 17 00:00:00 2001 From: Alexandre Wilhelm Date: Thu, 12 Jun 2014 10:58:11 -0700 Subject: [PATCH 2/3] Added: added unit test for CPTokenField --- Tests/AppKit/CPTokenFieldTest.j | 130 ++++++++++++++++++++++++++++++++ 1 file changed, 130 insertions(+) diff --git a/Tests/AppKit/CPTokenFieldTest.j b/Tests/AppKit/CPTokenFieldTest.j index 174820192..c76c99880 100644 --- a/Tests/AppKit/CPTokenFieldTest.j +++ b/Tests/AppKit/CPTokenFieldTest.j @@ -4,8 +4,33 @@ @implementation CPTokenFieldTest : OJTestCase { + CPWindow _theWindow; + CPTokenField _tokenField; + TestDelegateTokenField _delegate; + } +- (void)setUp +{ + _theWindow = [[CPWindow alloc] initWithContentRect:CGRectMake(0.0, 0.0, 1024.0, 768.0) + styleMask:CPWindowNotSizable]; + + _tokenField = [CPTokenField new]; + _delegate = [TestDelegateTokenField new]; + + [_tokenField setDelegate:_delegate]; + + [[_theWindow contentView] addSubview:_tokenField]; +} + +- (void)tearDown +{ + +} + +#pragma mark - +#pragma mark Test creation + - (void)testArchiving { var tokenField = [CPTokenField new]; @@ -28,4 +53,109 @@ [[aWindow contentView] addSubview:tokenField]; } + +#pragma mark - +#pragma mark Test objectValue and stringValue + +/*! + This is totally different than cocoa +*/ +- (void)testSetObjectValueWithString +{ + [_tokenField setObjectValue:@"Alexandre"]; + [self assert:[_tokenField stringValue] equals:""]; +} + +- (void)testObjectValueWithArrayOfStrings +{ + [_tokenField setObjectValue:[@"Alexandre", @"Antoine"]]; + [self assert:[_tokenField objectValue] equals:[@"Alexandre",@"Antoine"]]; +} + +- (void)testStringValueWithArrayOfStrings +{ + [_tokenField setObjectValue:[@"Alexandre", @"Antoine"]]; + [self assert:[_tokenField stringValue] equals:@"Alexandre,Antoine"]; +} + + +#pragma mark - +#pragma mark Delegate methods + +- (void)testDelegateDisplayStringForRepresentedObject +{ + [_tokenField setObjectValue:[@"Alexandre", @"Antoine"]]; + [self assert:[_delegate representedObjects] equals:[@"Alexandre", @"Antoine"]]; +} + +// - (void)testDelegateHasMenuForRepresentedObject +// { +// [_tokenField setObjectValue:[@"Alexandre", @"Antoine"]]; +// +// [_tokenField performKeyEquivalent:[CPEvent keyEventWithType:CPKeyDown location:CGPointMakeZero() modifierFlags:0 +// timestamp:0 windowNumber:[_theWindow windowNumber] context:nil +// characters:"c" charactersIgnoringModifiers:"c" isARepeat:NO keyCode:99]]; +// +// [self assert:[_delegate numberOfCallOfDelegateHasMenuForRepresentedObject] equals:1]; +// } + +@end + +@implementation TestDelegateTokenField : CPObject +{ + int _numberOfCallOfDelegateHasMenuForRepresentedObject @accessors(property=numberOfCallOfDelegateHasMenuForRepresentedObject); + CPArray _representedObjects @accessors(property=representedObjects); +} + +- (id)init +{ + if (self = [super init]) + { + _representedObjects = []; + _numberOfCallOfDelegateHasMenuForRepresentedObject = 0; + } + + return self; +} + +// - (BOOL)tokenField:(CPTokenField)tokenField hasMenuForRepresentedObject:(id)representedObject +// { +// CPLog.error(@"hasMenuForRepresentedObject") +// +// return YES; +// } +// +// - (CPMenu)tokenField:(CPTokenField)tokenField menuForRepresentedObject:(id)representedObject +// { +// CPLog.error(@"menuForRepresentedObject") +// +// var menu = [CPMenu new]; +// [menu addItem:[[CPMenuItem alloc] initWithTitle:[CPString stringWithFormat:@"Menu item %s", representedObject] action:nil keyEquivalent:nil]]; +// +// return menu; +// } + + +// - (CPArray)tokenField:(CPTokenField)tokenField completionsForSubstring:(CPString)substring indexOfToken:(CPInteger)tokenIndex indexOfSelectedItem:(CPInteger)selectedIndex +// { +// CPLog.error(@"completionsForSubstring") +// } +// +// - (CPArray)tokenField:(CPTokenField)tokenField shouldAddObjects:(CPArray)tokens atIndex:(CPUInteger)index +// { +// CPLog.error(@"shouldAddObjects") +// } + + +- (CPString)tokenField:(CPTokenField)tokenField displayStringForRepresentedObject:(id)representedObject +{ + [_representedObjects addObject:representedObject]; + return representedObject; +} + +// - (id)tokenField:(CPTokenField)tokenField representedObjectForEditingString:(CPString)editingString +// { +// CPLog.error(@"representedObjectForEditingString") +// } + @end From 33043dd8af7dd934f22b5980f42f89b8c54d2317 Mon Sep 17 00:00:00 2001 From: Alexandre Wilhelm Date: Sun, 13 Jul 2014 21:25:35 -0700 Subject: [PATCH 3/3] Fixed: removed unsued code in CPTokenFieldTest --- Tests/AppKit/CPTokenFieldTest.j | 47 --------------------------------- 1 file changed, 47 deletions(-) diff --git a/Tests/AppKit/CPTokenFieldTest.j b/Tests/AppKit/CPTokenFieldTest.j index c76c99880..e4d7485f7 100644 --- a/Tests/AppKit/CPTokenFieldTest.j +++ b/Tests/AppKit/CPTokenFieldTest.j @@ -88,22 +88,10 @@ [self assert:[_delegate representedObjects] equals:[@"Alexandre", @"Antoine"]]; } -// - (void)testDelegateHasMenuForRepresentedObject -// { -// [_tokenField setObjectValue:[@"Alexandre", @"Antoine"]]; -// -// [_tokenField performKeyEquivalent:[CPEvent keyEventWithType:CPKeyDown location:CGPointMakeZero() modifierFlags:0 -// timestamp:0 windowNumber:[_theWindow windowNumber] context:nil -// characters:"c" charactersIgnoringModifiers:"c" isARepeat:NO keyCode:99]]; -// -// [self assert:[_delegate numberOfCallOfDelegateHasMenuForRepresentedObject] equals:1]; -// } - @end @implementation TestDelegateTokenField : CPObject { - int _numberOfCallOfDelegateHasMenuForRepresentedObject @accessors(property=numberOfCallOfDelegateHasMenuForRepresentedObject); CPArray _representedObjects @accessors(property=representedObjects); } @@ -112,50 +100,15 @@ if (self = [super init]) { _representedObjects = []; - _numberOfCallOfDelegateHasMenuForRepresentedObject = 0; } return self; } -// - (BOOL)tokenField:(CPTokenField)tokenField hasMenuForRepresentedObject:(id)representedObject -// { -// CPLog.error(@"hasMenuForRepresentedObject") -// -// return YES; -// } -// -// - (CPMenu)tokenField:(CPTokenField)tokenField menuForRepresentedObject:(id)representedObject -// { -// CPLog.error(@"menuForRepresentedObject") -// -// var menu = [CPMenu new]; -// [menu addItem:[[CPMenuItem alloc] initWithTitle:[CPString stringWithFormat:@"Menu item %s", representedObject] action:nil keyEquivalent:nil]]; -// -// return menu; -// } - - -// - (CPArray)tokenField:(CPTokenField)tokenField completionsForSubstring:(CPString)substring indexOfToken:(CPInteger)tokenIndex indexOfSelectedItem:(CPInteger)selectedIndex -// { -// CPLog.error(@"completionsForSubstring") -// } -// -// - (CPArray)tokenField:(CPTokenField)tokenField shouldAddObjects:(CPArray)tokens atIndex:(CPUInteger)index -// { -// CPLog.error(@"shouldAddObjects") -// } - - - (CPString)tokenField:(CPTokenField)tokenField displayStringForRepresentedObject:(id)representedObject { [_representedObjects addObject:representedObject]; return representedObject; } -// - (id)tokenField:(CPTokenField)tokenField representedObjectForEditingString:(CPString)editingString -// { -// CPLog.error(@"representedObjectForEditingString") -// } - @end