From 18d77ca9f7b7572aa7c08603733eae3cf802635e Mon Sep 17 00:00:00 2001 From: Alexander Ljungberg Date: Sat, 2 Feb 2013 01:28:31 +0000 Subject: [PATCH 1/6] CPTokenField menu per token support. This change implements support for the CPTokenField delegate method `tokenField:menuForRepresentedObject:` (and the associated `tokenField:hasMenuForRepresentedObject:`). --- AppKit/CPTokenField.j | 19 +++++++++ Tests/Manual/CPTokenFieldTest/AppController.j | 42 ++++++++++++++++++- 2 files changed, 60 insertions(+), 1 deletion(-) diff --git a/AppKit/CPTokenField.j b/AppKit/CPTokenField.j index 092cbc87a..26b73859d 100755 --- a/AppKit/CPTokenField.j +++ b/AppKit/CPTokenField.j @@ -1241,6 +1241,20 @@ var CPScrollDestinationNone = 0, return aString; } +- (CPMenu)_menuForRepresentedObject:(id)aRepresentedObject +{ + var delegate = [self delegate]; + if ([delegate respondsToSelector:@selector(tokenField:hasMenuForRepresentedObject:)] && + [delegate respondsToSelector:@selector(tokenField:menuForRepresentedObject:)]) + { + var hasMenu = [delegate tokenField:self hasMenuForRepresentedObject:aRepresentedObject]; + if (hasMenu) + return [delegate tokenField:self menuForRepresentedObject:aRepresentedObject]; + } + + return nil; +} + // We put the string on the pasteboard before calling this delegate method. // By default, we write the NSStringPboardType as well as an array of NSStrings. // - (BOOL)tokenField:(NSTokenField *)tokenField writeRepresentedObjects:(NSArray *)objects toPasteboard:(NSPasteboard *)pboard; @@ -1398,6 +1412,11 @@ var CPScrollDestinationNone = 0, [_tokenField _deleteToken:self]; } +- (CPMenu)menu +{ + return [_tokenField _menuForRepresentedObject:_representedObject]; +} + @end /* diff --git a/Tests/Manual/CPTokenFieldTest/AppController.j b/Tests/Manual/CPTokenFieldTest/AppController.j index a50e8d46d..8d6e18bac 100644 --- a/Tests/Manual/CPTokenFieldTest/AppController.j +++ b/Tests/Manual/CPTokenFieldTest/AppController.j @@ -88,10 +88,17 @@ var STATES = ['Alabama', 'Alaska', 'Arizona', 'Arkansas', 'California', 'Colorad [tokenFieldD setDelegate:self]; var tokenFieldDEditable = [CPCheckBox checkBoxWithTitle:"Editable"]; - [tokenFieldDEditable setFrame:CGRectMake(525, CGRectGetMinY([tokenFieldD frame]), 200, 30)]; + [tokenFieldDEditable sizeToFit]; + [tokenFieldDEditable setFrameOrigin:CGPointMake(525, 5 + CGRectGetMinY([tokenFieldD frame]))]; [tokenFieldDEditable bind:CPValueBinding toObject:tokenFieldD withKeyPath:@"editable" options:nil]; [contentView addSubview:tokenFieldDEditable]; + var tokenFieldDMenus = [CPCheckBox checkBoxWithTitle:"Menus"]; + [tokenFieldDMenus sizeToFit]; + [tokenFieldDMenus setFrameOrigin:CGPointMake(CGRectGetMaxX([tokenFieldDEditable frame]), 5 + CGRectGetMinY([tokenFieldD frame]))]; + [tokenFieldDMenus bind:CPValueBinding toObject:self withKeyPath:@"tokenFieldDHasMenus" options:nil]; + [contentView addSubview:tokenFieldDMenus]; + allPersons = [ [Person personWithFirstName:@"Luc" lastName:@"Vauvillier"], [Person personWithFirstName:@"John" lastName:@"Doe"], @@ -113,6 +120,27 @@ var STATES = ['Alabama', 'Alaska', 'Arizona', 'Arkansas', 'California', 'Colorad } +- (void)setTokenFieldDHasMenus:(BOOL)shouldHaveMenus +{ + if (shouldHaveMenus) + { + [[tokenFieldD objectValue] enumerateObjectsUsingBlock:function(aPerson) + { + var menu = [CPMenu new]; + for (var i = 0; i < 3; i++) + [menu addItem:[[CPMenuItem alloc] initWithTitle:[CPString stringWithFormat:@"%@ Item %i", aPerson, i] action:nil keyEquivalent:nil]]; + aPerson.menu = menu; + }]; + } + else + [[tokenFieldD objectValue] makeObjectsPerformSelector:@selector(setMenu:) withObject:nil]; +} + +- (BOOL)tokenFieldDHasMenus +{ + return !![[[tokenFieldD objectValue] firstObject] menu]; +} + - (void)getObjectValues:(id)sender { alert([tokenFieldD objectValue]); @@ -177,6 +205,16 @@ var STATES = ['Alabama', 'Alaska', 'Arizona', 'Arkansas', 'California', 'Colorad return tokens; } +- (BOOL)tokenField:(CPTokenField)aTokenField hasMenuForRepresentedObject:(id)aRepresentedObject +{ + return !!aRepresentedObject.menu; +} + +- (CPMenu)tokenField:(CPTokenField)aTokenField menuForRepresentedObject:(id)aRepresentedObject +{ + return aRepresentedObject.menu; +} + @end // A sample of a custom Object @@ -185,6 +223,8 @@ var STATES = ['Alabama', 'Alaska', 'Arizona', 'Arkansas', 'California', 'Colorad { CPString _firstName; CPString _lastName; + + CPMenu menu @accessors; } + (id)personWithFirstName:(CPString)aFirstName lastName:(CPString)aLastName From 49c52a00be7bd4e94421ebcdec293cdfcc3a0285 Mon Sep 17 00:00:00 2001 From: Alexander Ljungberg Date: Sun, 3 Feb 2013 18:40:06 +0000 Subject: [PATCH 2/6] Fixed: disappearing token delete button. The token delete button becomes visible on mouse over of the token in the standard theme. It could be made to disappear even that the mouse was still over the token by mousing over the button itself and then out. This fix delegates all hover management to the token alone. --- AppKit/CPTokenField.j | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/AppKit/CPTokenField.j b/AppKit/CPTokenField.j index 26b73859d..8a15c2ceb 100755 --- a/AppKit/CPTokenField.j +++ b/AppKit/CPTokenField.j @@ -1440,6 +1440,16 @@ var CPScrollDestinationNone = 0, return "tokenfield-token-close-button"; } +- (void)mouseEntered:(CPEvent)anEvent +{ + // Don't toggle hover state from within the button - we use the hover state of the token field as a whole. +} + +- (void)mouseExited:(CPEvent)anEvent +{ + // Don't toggle hover state from within the button - we use the hover state of the token field as a whole. +} + @end From 0f6461602e0d00286683066b7f344ecc51200bd6 Mon Sep 17 00:00:00 2001 From: Alexander Ljungberg Date: Sun, 3 Feb 2013 22:39:54 +0000 Subject: [PATCH 3/6] Fixed: crash in token field autocomplete. Without this fix, the autocomplete field would try to select the CPNotFound index from time to time which has always been wrong but is now specifically an error in Cappuccino. The fix is to select nothing instead. --- AppKit/_CPAutocompleteMenu.j | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/AppKit/_CPAutocompleteMenu.j b/AppKit/_CPAutocompleteMenu.j index a58071ea0..ed7349181 100644 --- a/AppKit/_CPAutocompleteMenu.j +++ b/AppKit/_CPAutocompleteMenu.j @@ -115,8 +115,13 @@ var _CPAutocompleteMenuMaximumHeight = 307; - (void)setIndexOfSelectedItem:(int)anIndex { - [tableView selectRowIndexes:[CPIndexSet indexSetWithIndex:anIndex] byExtendingSelection:NO]; - [tableView scrollRowToVisible:anIndex]; + if (anIndex == CPNotFound) + [tableView selectRowIndexes:[CPIndexSet indexSet] byExtendingSelection:NO]; + else + { + [tableView selectRowIndexes:[CPIndexSet indexSetWithIndex:anIndex] byExtendingSelection:NO]; + [tableView scrollRowToVisible:anIndex]; + } } - (int)indexOfSelectedItem From 0229e1938e4f6c4442623641918943377ea90540 Mon Sep 17 00:00:00 2001 From: Alexander Ljungberg Date: Mon, 4 Feb 2013 01:26:16 +0000 Subject: [PATCH 4/6] Token field disclosure arrow for menu. Disclosure arrow behaves like in Cocoa: it shows on hover and if clicked displays the token specific menu. This change also removes the delete button by default. The delete button can be enabled with `[tokenField setButtonType: CPTokenFieldDeleteButtonType]`. --- AppKit/CPTokenField.j | 196 ++++++++++++++++-- .../token-disclosure-highlighted.png | Bin 0 -> 2806 bytes .../Aristo/Resources/token-disclosure.png | Bin 0 -> 2794 bytes AppKit/Themes/Aristo/ThemeDescriptors.j | 26 +++ .../token-disclosure-highlighted.png | Bin 0 -> 2806 bytes .../Aristo2/Resources/token-disclosure.png | Bin 0 -> 2794 bytes AppKit/Themes/Aristo2/ThemeDescriptors.j | 26 +++ Tests/Manual/CPTokenFieldTest/AppController.j | 18 +- 8 files changed, 243 insertions(+), 23 deletions(-) create mode 100644 AppKit/Themes/Aristo/Resources/token-disclosure-highlighted.png create mode 100644 AppKit/Themes/Aristo/Resources/token-disclosure.png create mode 100644 AppKit/Themes/Aristo2/Resources/token-disclosure-highlighted.png create mode 100644 AppKit/Themes/Aristo2/Resources/token-disclosure.png diff --git a/AppKit/CPTokenField.j b/AppKit/CPTokenField.j index 8a15c2ceb..ca31f3779 100755 --- a/AppKit/CPTokenField.j +++ b/AppKit/CPTokenField.j @@ -27,13 +27,14 @@ @import @import +@import "_CPAutocompleteMenu.j" @import "CPButton.j" +@import "CPPopUpButton.j" @import "CPScrollView.j" @import "CPTableView.j" @import "CPText.j" @import "CPTextField.j" @import "CPWindow_Constants.j" -@import "_CPAutocompleteMenu.j" @global CPApp @@ -59,6 +60,9 @@ var CPScrollDestinationNone = 0, CPScrollDestinationLeft = 1, CPScrollDestinationRight = 2; +CPTokenFieldDisclosureButtonType = 0; +CPTokenFieldDeleteButtonType = 1; + @implementation CPTokenField : CPTextField { CPScrollView _tokenScrollView; @@ -76,6 +80,8 @@ var CPScrollDestinationNone = 0, CPEvent _mouseDownEvent; BOOL _shouldNotifyTarget; + + int _buttonType @accessors(property=buttonType); } + (CPCharacterSet)defaultTokenizingCharacterSet @@ -1089,6 +1095,8 @@ var CPScrollDestinationNone = 0, tokenFrame = fitAndFrame(tokenViewSize.width, tokenViewSize.height); [tokenView setFrame:tokenFrame]; + + [tokenView setButtonType:_buttonType]; } if (isEditing && !_selectedRange.length && _CPMaxRange(_selectedRange) >= [tokens count]) @@ -1241,6 +1249,16 @@ var CPScrollDestinationNone = 0, return aString; } +- (BOOL)_hasMenuForRepresentedObject:(id)aRepresentedObject +{ + var delegate = [self delegate]; + if ([delegate respondsToSelector:@selector(tokenField:hasMenuForRepresentedObject:)] && + [delegate respondsToSelector:@selector(tokenField:menuForRepresentedObject:)]) + return [delegate tokenField:self hasMenuForRepresentedObject:aRepresentedObject]; + + return NO; +} + - (CPMenu)_menuForRepresentedObject:(id)aRepresentedObject { var delegate = [self delegate]; @@ -1249,7 +1267,7 @@ var CPScrollDestinationNone = 0, { var hasMenu = [delegate tokenField:self hasMenuForRepresentedObject:aRepresentedObject]; if (hasMenu) - return [delegate tokenField:self menuForRepresentedObject:aRepresentedObject]; + return [delegate tokenField:self menuForRepresentedObject:aRepresentedObject] || nil; } return nil; @@ -1279,13 +1297,28 @@ var CPScrollDestinationNone = 0, [_autocompleteMenu _hideCompletions]; } + +- (void)setButtonType:(int)aButtonType +{ + if (_buttonType === aButtonType) + return; + + _buttonType = aButtonType; + [self setNeedsLayout]; +} + @end +var _CPTokenFieldDisclosureButtonType = 0, + _CPTokenFieldDeleteButtonType = 1; + @implementation _CPTokenFieldToken : CPTextField { - _CPTokenFieldTokenCloseButton _deleteButton; - CPTokenField _tokenField; - id _representedObject; + _CPTokenFieldTokenCloseButton _deleteButton; + _CPTokenFieldTokenDisclosureButton _disclosureButton; + CPTokenField _tokenField; + id _representedObject; + int _buttonType; } + (CPString)defaultThemeClass @@ -1302,12 +1335,10 @@ var CPScrollDestinationNone = 0, { if (self = [super initWithFrame:frame]) { - _deleteButton = [[_CPTokenFieldTokenCloseButton alloc] initWithFrame:CGRectMakeZero()]; - [self addSubview:_deleteButton]; - [self setEditable:NO]; [self setHighlighted:NO]; [self setBezeled:YES]; + [self setButtonType:CPTokenFieldDisclosureButtonType]; } return self; @@ -1343,9 +1374,12 @@ var CPScrollDestinationNone = 0, { var r = [super setThemeState:aState]; - // Share hover state with the delete button. - if (r && aState === CPThemeStateHovered) + // Share hover state with the disclosure and delete buttons. + if (r && aState & CPThemeStateHovered) + { + [_disclosureButton setThemeState:aState]; [_deleteButton setThemeState:aState]; + } return r; } @@ -1354,9 +1388,12 @@ var CPScrollDestinationNone = 0, { var r = [super unsetThemeState:aState]; - // Share hover state with the delete button. - if (r && aState === CPThemeStateHovered) + // Share hover state with the disclosure and delete button. + if (r && aState & CPThemeStateHovered) + { + [_disclosureButton unsetThemeState:aState]; [_deleteButton unsetThemeState:aState]; + } return r; } @@ -1374,6 +1411,47 @@ var CPScrollDestinationNone = 0, return size; } +- (void)setButtonType:(int)aButtonType +{ + if (_buttonType === aButtonType) + return; + + _buttonType = aButtonType; + + if (_buttonType === CPTokenFieldDisclosureButtonType) + { + if (_deleteButton) + { + [_deleteButton removeFromSuperview]; + _deleteButton = nil; + } + + if (!_disclosureButton) + { + _disclosureButton = [[_CPTokenFieldTokenDisclosureButton alloc] initWithFrame:CGRectMakeZero()]; + [self addSubview:_disclosureButton]; + } + } + else + { + if (_disclosureButton) + { + [_disclosureButton removeFromSuperview]; + _disclosureButton = nil; + } + + if (!_deleteButton) + { + _deleteButton = [[_CPTokenFieldTokenCloseButton alloc] initWithFrame:CGRectMakeZero()]; + [self addSubview:_deleteButton]; + [_deleteButton setTarget:self]; + [_deleteButton setAction:@selector(_delete:)]; + } + } + + [self setNeedsLayout]; +} + - (void)layoutSubviews { [super layoutSubviews]; @@ -1384,15 +1462,36 @@ var CPScrollDestinationNone = 0, if (bezelView) { - [_deleteButton setTarget:self]; - [_deleteButton setAction:@selector(_delete:)]; - [_deleteButton setEnabled:[self isEditable]]; + switch (_buttonType) + { + case CPTokenFieldDisclosureButtonType: + if (!_disclosureButton) + return; + var shouldBeEnabled = [self hasMenu]; + [_disclosureButton setHidden:!shouldBeEnabled]; - var frame = [bezelView frame], - buttonOffset = [_deleteButton currentValueForThemeAttribute:@"offset"], - buttonSize = [_deleteButton currentValueForThemeAttribute:@"min-size"]; + if (shouldBeEnabled) + [_disclosureButton setMenu:[self menu]]; - [_deleteButton setFrame:_CGRectMake(CGRectGetMaxX(frame) - buttonOffset.x, CGRectGetMinY(frame) + buttonOffset.y, buttonSize.width, buttonSize.height)]; + var frame = [bezelView frame], + buttonOffset = [_disclosureButton currentValueForThemeAttribute:@"offset"], + buttonSize = [_disclosureButton currentValueForThemeAttribute:@"min-size"]; + + [_disclosureButton setFrame:_CGRectMake(CGRectGetMaxX(frame) - buttonOffset.x, CGRectGetMinY(frame) + buttonOffset.y, buttonSize.width, buttonSize.height)]; + break; + case CPTokenFieldDeleteButtonType: + if (!_deleteButton) + return; + + [_deleteButton setEnabled:[self isEditable] && [self isEnabled]]; + + var frame = [bezelView frame], + buttonOffset = [_deleteButton currentValueForThemeAttribute:@"offset"], + buttonSize = [_deleteButton currentValueForThemeAttribute:@"min-size"]; + + [_deleteButton setFrame:_CGRectMake(CGRectGetMaxX(frame) - buttonOffset.x, CGRectGetMinY(frame) + buttonOffset.y, buttonSize.width, buttonSize.height)]; + break; + } } } @@ -1412,6 +1511,11 @@ var CPScrollDestinationNone = 0, [_tokenField _deleteToken:self]; } +- (BOOL)hasMenu +{ + return [_tokenField _hasMenuForRepresentedObject:_representedObject]; +} + - (CPMenu)menu { return [_tokenField _menuForRepresentedObject:_representedObject]; @@ -1419,9 +1523,6 @@ var CPScrollDestinationNone = 0, @end -/* - Theming hook. -*/ @implementation _CPTokenFieldTokenCloseButton : CPButton { } @@ -1452,6 +1553,57 @@ var CPScrollDestinationNone = 0, @end +@implementation _CPTokenFieldTokenDisclosureButton : CPPopUpButton +{ +} + ++ (id)themeAttributes +{ + var attributes = [CPButton themeAttributes]; + + [attributes setObject:_CGPointMake(15, 5) forKey:@"offset"]; + + return attributes; +} + ++ (CPString)defaultThemeClass +{ + return "tokenfield-token-disclosure-button"; +} + +- (id)initWithFrame:(CGRect)aFrame +{ + if (self = [self initWithFrame:aFrame pullsDown:YES]) + { + [self setBordered:YES]; + [super setTitle:@""]; + } + + return self; +} + +- (void)setTitle:(CPString)aTitle +{ + // skip +} + +- (void)synchronizeTitleAndSelectedItem +{ + // skip +} + +- (void)mouseEntered:(CPEvent)anEvent +{ + // Don't toggle hover state from within the button - we use the hover state of the token field as a whole. +} + +- (void)mouseExited:(CPEvent)anEvent +{ + // Don't toggle hover state from within the button - we use the hover state of the token field as a whole. +} + +@end + var CPTokenFieldTokenizingCharacterSetKey = "CPTokenFieldTokenizingCharacterSetKey", CPTokenFieldCompletionDelayKey = "CPTokenFieldCompletionDelay"; diff --git a/AppKit/Themes/Aristo/Resources/token-disclosure-highlighted.png b/AppKit/Themes/Aristo/Resources/token-disclosure-highlighted.png new file mode 100644 index 0000000000000000000000000000000000000000..1c05a511d82977e811db8c23d61ed732f55ce39d GIT binary patch literal 2806 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 IM6N<$f@Y##;Q#;t literal 0 HcmV?d00001 diff --git a/AppKit/Themes/Aristo/Resources/token-disclosure.png b/AppKit/Themes/Aristo/Resources/token-disclosure.png new file mode 100644 index 0000000000000000000000000000000000000000..09ef8ef92e3f8728393fbf62ed85b24cc1a89961 GIT binary patch literal 2794 zcmV4Tx07wm;mUmPX*B8g%%xo{TU6vwc>AklFq%OTkl_mFQv@x1^BM1TV}0C2duqR=S6Xn?LjUp6xrb&~O43j*Nv zEr418u3H3zGns$s|L;SQD-ufpfWpxLJ03rmi*g~#S@{x?OrJ!Vo{}kJ7$ajbnjp%m zGEV!%=70KpVow?KvV}a4moSaFCQKV= zXBIPnpP$8-NG!rR+)R#`$7JVZi#Wn10DSspSrkx`)s~4C+0n+?(b2-z5-tDd^^cpM zz5W?wz5V3zGUCskL5!X++LzcbT23thtSPiMTfS&1I{|204}j|3FPi>70OSh+Xzlyz zdl<5LNtZ}OE>>3g`T3RtKG#xK(9i3CI(+v0d-&=+OWAp!Ysd8Ar*foO5~i%E+?=c& zshF87;&Ay)i~kOm zCIB-Z!^JGdti+UJsxgN!t(Y#%b<8kk67vyD#cE*9urAm@Y#cTXn~yERR$}Y1E!Yd# zo7hq8Ya9;8z!~A3Z~?e@Tn26#t`xT$*Ni)h>&K1Yrto;Y8r}@=h7ZGY@Dh9xekcA2 z{tSKqKZ<`tAQQ9+wgf*y0zpVvOQ<9qCY&Y=5XJ~ILHOG0j2XwBQ%7jM`P2tv~{#P+6CGu9Y;5!2hua>CG_v;z4S?CC1rc%807-x z8s$^ULkxsr$OvR)G0GUn7`GVjR5Vq*RQM{JRGL%DRgX~5SKp(4L49HleU9rK?wsN|$L8GCfHh1tA~lw29MI^|n9|hJ z^w$(=?$kW5IibbS^3=-Es?a*EHLgw5cGnhYS7@Kne#%s4dNH$@Rm?8tq>hG8fR0pW zzfP~tjINRHeBHIW&AJctNO~;2RJ{tlPQ6KeZT(RF<@$~KcMXUJEQ54|9R}S7(}qTd zv4$HA+YFx=sTu_uEj4O1x^GN1_Ap*-Tx)#81ZToB$u!w*a?KPrbudjgtugI0gUuYx z1ZKO<`pvQC&gMe%TJu2*iiMX&o<*a@uqDGX#B!}=o8@yWeX9hktybMuAFUm%v#jf^ z@7XBX1lg>$>9G0T*3_13TVs2}j%w#;x5}>F?uEUXJ>Pzh{cQ)DL#V?BhfaqNj!uqZ z$0o;dCw-@6r(I5iEIKQkRm!^LjCJ;QUgdn!`K^nii^S!a%Wtk0u9>cfU7yS~n#-SC zH+RHM*Nx-0-)+d9>7MMq&wa>4$AjZh>+#4_&y(j_?>XjW;+5fb#Ot}YwYS*2#e16V z!d}5X>x20C`xN{1`YQR(_pSDQ=%?$K=GW*q>F?mb%>QfvHXt})YrtTjW*|4PA#gIt zDQHDdS1=_wD!4lMQHW`XIHV&K4h;(37J7f4!93x-wlEMD7`83!LAX));_x3Ma1r4V zH4%>^Z6cRPc1O{olA;bry^i*dE{nc5-*~=serJq)Okzw!%yg_zYWi`#ol25V;v^kU#wN!mA5MPH z3FFjqrcwe^cBM>m+1wr6XFN|{1#g`1#xLiOrMjh-r#?w@OWT$Wgg6&&5F%x&L(6hXP*!%2{VOVIa)adIsGCtQITk9vCHD^izmgw;`&@D zcVTY3gpU49^+=7S>!rha?s+wNZ}MaEj~6Hw2n%|am@e70WNfM5(r=exmT{MLF4tMU zX8G_6uNC`OLMu~NcCOM}Rk&(&wg2ivYe;J{*Zj2BdTsgISLt?eJQu}$~QLORDCnMIdyYynPb_W zEx0YhEw{FMY&}%2SiZD;WLxOA)(U1tamB0cN!u@1+E?z~LE0hRF;o>&)xJ}I=a!xC ztJAA*)_B)6@6y<{Y1i~_-tK`to_m`1YVIxB`);3L-|hYW`&(-bYby`n4&)tpTo+T< z{VnU;hI;k-lKKw^g$IWYMIP#EaB65ctZ}%k5pI+=jvq-pa_u{x@7kLzn)Wv{noEv? zqtc^Kzfb=D*0JDYoyS?nn|?6(VOI;SrMMMpUD7()mfkkh9^c-7BIrbChiga6kCs0k zJgIZC=9KcOveTr~g{NoFEIl)IR&;jaT-v#j&ZN$J=i|=b=!)p-y%2oi(nY_E=exbS z&s=i5bn>#xz3Ke>~2=f&N;yEFGz-^boBexUH6@}b7V+Mi8+ZXR+R zIyLMw-18{v(Y+Dw$g^K^e|bMz_?Y^*a!h-y;fd{&ljDBl*PbqTI{HlXY-Xb9SH)j< zJvV;-!*8Cy^-RW1j=m7TnEk!i=;1k|Ak#7r4Tx07wm;mUmPX*B8g%%xo{TU6vwc>AklFq%OTkl_mFQv@x1^BM1TV}0C2duqR=S6Xn?LjUp6xrb&~O43j*Nv zEr418u3H3zGns$s|L;SQD-ufpfWpxLJ03rmi*g~#S@{x?OrJ!Vo{}kJ7$ajbnjp%m zGEV!%=70KpVow?KvV}a4moSaFCQKV= zXBIPnpP$8-NG!rR+)R#`$7JVZi#Wn10DSspSrkx`)s~4C+0n+?(b2-z5-tDd^^cpM zz5W?wz5V3zGUCskL5!X++LzcbT23thtSPiMTfS&1I{|204}j|3FPi>70OSh+Xzlyz zdl<5LNtZ}OE>>3g`T3RtKG#xK(9i3CI(+v0d-&=+OWAp!Ysd8Ar*foO5~i%E+?=c& zshF87;&Ay)i~kOm zCIB-Z!^JGdti+UJsxgN!t(Y#%b<8kk67vyD#cE*9urAm@Y#cTXn~yERR$}Y1E!Yd# zo7hq8Ya9;8z!~A3Z~?e@Tn26#t`xT$*Ni)h>&K1Yrto;Y8r}@=h7ZGY@Dh9xekcA2 z{tSKqKZ<`tAQQ9+wgf*y0zpVvOQ<9qCY&Y=5XJ~ILHOG0j2XwBQ%7jM`P2tv~{#P+6CGu9Y;5!2hua>CG_v;z4S?CC1rc%807-x z8s$^ULkxsr$OvR)G0GUn7`GVjR5Vq*RQM{JRGL%DRgX~5SKp(4L49HleU9rK?wsN|$L8GCfHh1tA~lw29MI^|n9|hJ z^w$(=?$kW5IibbS^3=-Es?a*EHLgw5cGnhYS7@Kne#%s4dNH$@Rm?8tq>hG8fR0pW zzfP~tjINRHeBHIW&AJctNO~;2RJ{tlPQ6KeZT(RF<@$~KcMXUJEQ54|9R}S7(}qTd zv4$HA+YFx=sTu_uEj4O1x^GN1_Ap*-Tx)#81ZToB$u!w*a?KPrbudjgtugI0gUuYx z1ZKO<`pvQC&gMe%TJu2*iiMX&o<*a@uqDGX#B!}=o8@yWeX9hktybMuAFUm%v#jf^ z@7XBX1lg>$>9G0T*3_13TVs2}j%w#;x5}>F?uEUXJ>Pzh{cQ)DL#V?BhfaqNj!uqZ z$0o;dCw-@6r(I5iEIKQkRm!^LjCJ;QUgdn!`K^nii^S!a%Wtk0u9>cfU7yS~n#-SC zH+RHM*Nx-0-)+d9>7MMq&wa>4$AjZh>+#4_&y(j_?>XjW;+5fb#Ot}YwYS*2#e16V z!d}5X>x20C`xN{1`YQR(_pSDQ=%?$K=GW*q>F?mb%>QfvHXt})YrtTjW*|4PA#gIt zDQHDdS1=_wD!4lMQHW`XIHV&K4h;(37J7f4!93x-wlEMD7`83!LAX));_x3Ma1r4V zH4%>^Z6cRPc1O{olA;bry^i*dE{nc5-*~=serJq)Okzw!%yg_zYWi`#ol25V;v^kU#wN!mA5MPH z3FFjqrcwe^cBM>m+1wr6XFN|{1#g`1#xLiOrMjh-r#?w@OWT$Wgg6&&5F%x&L(6hXP*!%2{VOVIa)adIsGCtQITk9vCHD^izmgw;`&@D zcVTY3gpU49^+=7S>!rha?s+wNZ}MaEj~6Hw2n%|am@e70WNfM5(r=exmT{MLF4tMU zX8G_6uNC`OLMu~NcCOM}Rk&(&wg2ivYe;J{*Zj2BdTsgISLt?eJQu}$~QLORDCnMIdyYynPb_W zEx0YhEw{FMY&}%2SiZD;WLxOA)(U1tamB0cN!u@1+E?z~LE0hRF;o>&)xJ}I=a!xC ztJAA*)_B)6@6y<{Y1i~_-tK`to_m`1YVIxB`);3L-|hYW`&(-bYby`n4&)tpTo+T< z{VnU;hI;k-lKKw^g$IWYMIP#EaB65ctZ}%k5pI+=jvq-pa_u{x@7kLzn)Wv{noEv? zqtc^Kzfb=D*0JDYoyS?nn|?6(VOI;SrMMMpUD7()mfkkh9^c-7BIrbChiga6kCs0k zJgIZC=9KcOveTr~g{NoFEIl)IR&;jaT-v#j&ZN$J=i|=b=!)p-y%2oi(nY_E=exbS z&s=i5bn>#xz3Ke>~2=f&N;yEFGz-^boBexUH6@}b7V+Mi8+ZXR+R zIyLMw-18{v(Y+Dw$g^K^e|bMz_?Y^*a!h-y;fd{&ljDBl*PbqTI{HlXY-Xb9SH)j< zJvV;-!*8Cy^-RW1j=m7TnEk!?S9gJEm>5_Btcrnw38+I8h?!uL0J%#}qr6W(2LJ#707*qo IM6N<$f@Y##;Q#;t literal 0 HcmV?d00001 diff --git a/AppKit/Themes/Aristo2/Resources/token-disclosure.png b/AppKit/Themes/Aristo2/Resources/token-disclosure.png new file mode 100644 index 0000000000000000000000000000000000000000..09ef8ef92e3f8728393fbf62ed85b24cc1a89961 GIT binary patch literal 2794 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 Date: Mon, 4 Feb 2013 11:53:18 +0000 Subject: [PATCH 5/6] Improve token field disclosure arrow implementation. - Tighten up hover state code. - CPCoding support. - Make sure to initialise button type to `CPTokenFieldDisclosureButtonType` rather than null. - Don't try to lay out disclosure/delete button in the token token. --- AppKit/CPTokenField.j | 31 ++++++++++++++----------------- 1 file changed, 14 insertions(+), 17 deletions(-) diff --git a/AppKit/CPTokenField.j b/AppKit/CPTokenField.j index ca31f3779..f5894a010 100755 --- a/AppKit/CPTokenField.j +++ b/AppKit/CPTokenField.j @@ -110,6 +110,7 @@ CPTokenFieldDeleteButtonType = 1; { _completionDelay = [[self class] defaultCompletionDelay]; _tokenizingCharacterSet = [[self class] defaultTokenizingCharacterSet]; + _buttonType = CPTokenFieldDisclosureButtonType; [self setBezeled:YES]; [self _init]; @@ -567,7 +568,7 @@ CPTokenFieldDeleteButtonType = 1; if (newToken === nil) { - newToken = [[_CPTokenFieldToken alloc] init]; + newToken = [_CPTokenFieldToken new]; [newToken setTokenField:self]; [newToken setRepresentedObject:tokenObject]; [newToken setStringValue:tokenValue]; @@ -1309,9 +1310,6 @@ CPTokenFieldDeleteButtonType = 1; @end -var _CPTokenFieldDisclosureButtonType = 0, - _CPTokenFieldDeleteButtonType = 1; - @implementation _CPTokenFieldToken : CPTextField { _CPTokenFieldTokenCloseButton _deleteButton; @@ -1362,6 +1360,7 @@ var _CPTokenFieldDisclosureButtonType = 0, - (void)setRepresentedObject:(id)representedObject { _representedObject = representedObject; + [self setNeedsLayout]; } - (void)setEditable:(BOOL)shouldBeEditable @@ -1375,10 +1374,10 @@ var _CPTokenFieldDisclosureButtonType = 0, var r = [super setThemeState:aState]; // Share hover state with the disclosure and delete buttons. - if (r && aState & CPThemeStateHovered) + if (aState & CPThemeStateHovered) { - [_disclosureButton setThemeState:aState]; - [_deleteButton setThemeState:aState]; + [_disclosureButton setThemeState:CPThemeStateHovered]; + [_deleteButton setThemeState:CPThemeStateHovered]; } return r; @@ -1389,10 +1388,10 @@ var _CPTokenFieldDisclosureButtonType = 0, var r = [super unsetThemeState:aState]; // Share hover state with the disclosure and delete button. - if (r && aState & CPThemeStateHovered) + if (aState & CPThemeStateHovered) { - [_disclosureButton unsetThemeState:aState]; - [_deleteButton unsetThemeState:aState]; + [_disclosureButton unsetThemeState:CPThemeStateHovered]; + [_deleteButton unsetThemeState:CPThemeStateHovered]; } return r; @@ -1460,13 +1459,11 @@ var _CPTokenFieldDisclosureButtonType = 0, positioned:CPWindowBelow relativeToEphemeralSubviewNamed:@"content-view"]; - if (bezelView) + if (bezelView && _tokenField) { switch (_buttonType) { case CPTokenFieldDisclosureButtonType: - if (!_disclosureButton) - return; var shouldBeEnabled = [self hasMenu]; [_disclosureButton setHidden:!shouldBeEnabled]; @@ -1480,9 +1477,6 @@ var _CPTokenFieldDisclosureButtonType = 0, [_disclosureButton setFrame:_CGRectMake(CGRectGetMaxX(frame) - buttonOffset.x, CGRectGetMinY(frame) + buttonOffset.y, buttonSize.width, buttonSize.height)]; break; case CPTokenFieldDeleteButtonType: - if (!_deleteButton) - return; - [_deleteButton setEnabled:[self isEditable] && [self isEnabled]]; var frame = [bezelView frame], @@ -1606,7 +1600,8 @@ var _CPTokenFieldDisclosureButtonType = 0, var CPTokenFieldTokenizingCharacterSetKey = "CPTokenFieldTokenizingCharacterSetKey", - CPTokenFieldCompletionDelayKey = "CPTokenFieldCompletionDelay"; + CPTokenFieldCompletionDelayKey = "CPTokenFieldCompletionDelay", + CPTokenFieldButtonTypeKey = "CPTokenFieldButtonTypeKey"; @implementation CPTokenField (CPCoding) @@ -1618,6 +1613,7 @@ var CPTokenFieldTokenizingCharacterSetKey = "CPTokenFieldTokenizingCharacterSe { _tokenizingCharacterSet = [aCoder decodeObjectForKey:CPTokenFieldTokenizingCharacterSetKey] || [[self class] defaultTokenizingCharacterSet]; _completionDelay = [aCoder decodeDoubleForKey:CPTokenFieldCompletionDelayKey] || [[self class] defaultCompletionDelay]; + _buttonType = [aCoder decodeIntForKey:CPTokenFieldButtonTypeKey] || CPTokenFieldDisclosureButtonType; [self _init]; @@ -1634,6 +1630,7 @@ var CPTokenFieldTokenizingCharacterSetKey = "CPTokenFieldTokenizingCharacterSe [aCoder encodeInt:_tokenizingCharacterSet forKey:CPTokenFieldTokenizingCharacterSetKey]; [aCoder encodeDouble:_completionDelay forKey:CPTokenFieldCompletionDelayKey]; + [aCoder encodeInt:_buttonType forKey:CPTokenFieldButtonTypeKey]; } @end From c42184951f31fa1c6a5a7e091b55a52d155d730e Mon Sep 17 00:00:00 2001 From: Alexander Ljungberg Date: Mon, 4 Feb 2013 11:57:30 +0000 Subject: [PATCH 6/6] Make Aristo 2 tokens balanced for hiding button. In Aristo 2, the token field tokens would always show the close button, and make a big space for it. This change makes it so that when the delete button, and the new disclosure button, are hidden, which is most of the time, the token doesn't look like it has a big empty hole on the right side. --- AppKit/Themes/Aristo2/ThemeDescriptors.j | 15 ++++++++------- Tests/Manual/CPTokenFieldTest/Info.plist | 2 ++ 2 files changed, 10 insertions(+), 7 deletions(-) diff --git a/AppKit/Themes/Aristo2/ThemeDescriptors.j b/AppKit/Themes/Aristo2/ThemeDescriptors.j index 5614e5b79..0d70dfbd8 100644 --- a/AppKit/Themes/Aristo2/ThemeDescriptors.j +++ b/AppKit/Themes/Aristo2/ThemeDescriptors.j @@ -709,7 +709,7 @@ var themedButtonValues = nil, [@"text-color", textDisabledColor, CPThemeStateDisabled], [@"bezel-inset", CGInsetMake(0.0, 0.0, 0.0, 0.0), CPThemeStateBezeled], - [@"content-inset", CGInsetMake(1.0, 24.0, 2.0, 16.0), CPThemeStateBezeled], + [@"content-inset", CGInsetMake(1.0, 20.0, 2.0, 20.0), CPThemeStateBezeled], // Minimum height == maximum height since tokens are fixed height. [@"min-size", CGSizeMake(0.0, 19.0)], @@ -741,7 +741,7 @@ var themedButtonValues = nil, [@"min-size", CGSizeMake(7.0, 6.0)], [@"max-size", CGSizeMake(7.0, 6.0)], - [@"offset", CGPointMake(17, 7)] + [@"offset", CGPointMake(16, 7)] ]; [self registerThemeValues:themeValues forView:button]; @@ -758,16 +758,17 @@ var themedButtonValues = nil, themeValues = [ - [@"bezel-color", bezelColor, CPThemeStateBordered], - [@"bezel-color", bezelHighlightedColor, CPThemeStateBordered | CPThemeStateHighlighted], + [@"bezel-color", bezelColor, CPThemeStateBordered | CPThemeStateHovered], + [@"bezel-color", [bezelColor colorWithAlphaComponent:0], CPThemeStateBordered | CPThemeStateDisabled], + [@"bezel-color", bezelHighlightedColor, CPThemeStateBordered | CPThemeStateHighlighted], [@"min-size", CGSizeMake(8.0, 8.0)], [@"max-size", CGSizeMake(8.0, 8.0)], - [@"bezel-inset", CGInsetMake(0.0, 0.0, 0.0, 0.0), CPThemeStateBordered], - [@"bezel-inset", CGInsetMake(0.0, 0.0, 0.0, 0.0), CPThemeStateBordered | CPThemeStateHighlighted], + [@"bezel-inset", CGInsetMake(0.0, 0.0, 0.0, 0.0), CPThemeStateBordered], + [@"bezel-inset", CGInsetMake(0.0, 0.0, 0.0, 0.0), CPThemeStateBordered | CPThemeStateHighlighted], - [@"offset", CGPointMake(17, 6), CPThemeStateBordered] + [@"offset", CGPointMake(16, 6), CPThemeStateBordered] ]; [self registerThemeValues:themeValues forView:button]; diff --git a/Tests/Manual/CPTokenFieldTest/Info.plist b/Tests/Manual/CPTokenFieldTest/Info.plist index 19d666d21..90f6c7eff 100644 --- a/Tests/Manual/CPTokenFieldTest/Info.plist +++ b/Tests/Manual/CPTokenFieldTest/Info.plist @@ -4,6 +4,8 @@ CPApplicationDelegateClass AppController + CPDefaultTheme + Aristo2 CPBundleName CPTokenFieldTest CPPrincipalClass