From e9607dc764ac79077fd90ae3f3a42c7be9dc338d Mon Sep 17 00:00:00 2001 From: Aparajita Fishman Date: Sat, 21 Aug 2010 11:31:31 -0400 Subject: [PATCH] Ensure CPControl -performClick unhighlights the button if the action throws. --- AppKit/CPControl.j | 14 ++- .../AppController.j | 110 ++++++++++++++++++ .../Info.plist | 12 ++ .../Resources/spinner.gif | Bin 0 -> 1849 bytes .../index-debug.html | 69 +++++++++++ .../index.html | 68 +++++++++++ .../CPControlPerformClickExceptionTest/main.j | 18 +++ 7 files changed, 289 insertions(+), 2 deletions(-) create mode 100644 Tests/Manual/CPControlPerformClickExceptionTest/AppController.j create mode 100644 Tests/Manual/CPControlPerformClickExceptionTest/Info.plist create mode 100644 Tests/Manual/CPControlPerformClickExceptionTest/Resources/spinner.gif create mode 100644 Tests/Manual/CPControlPerformClickExceptionTest/index-debug.html create mode 100644 Tests/Manual/CPControlPerformClickExceptionTest/index.html create mode 100755 Tests/Manual/CPControlPerformClickExceptionTest/main.j diff --git a/AppKit/CPControl.j b/AppKit/CPControl.j index db8a22cd9..6310a9b11 100644 --- a/AppKit/CPControl.j +++ b/AppKit/CPControl.j @@ -337,9 +337,19 @@ var CPControlBlackColor = [CPColor blackColor]; [self highlight:YES]; [self setState:[self nextState]]; - [self sendAction:[self action] to:[self target]]; - [CPTimer scheduledTimerWithTimeInterval:0.1 target:self selector:@selector(unhighlightButtonTimerDidFinish:) userInfo:nil repeats:NO]; + try + { + [self sendAction:[self action] to:[self target]]; + } + catch (e) + { + throw e; + } + finally + { + [CPTimer scheduledTimerWithTimeInterval:0.1 target:self selector:@selector(unhighlightButtonTimerDidFinish:) userInfo:nil repeats:NO]; + } } - (void)unhighlightButtonTimerDidFinish:(id)sender diff --git a/Tests/Manual/CPControlPerformClickExceptionTest/AppController.j b/Tests/Manual/CPControlPerformClickExceptionTest/AppController.j new file mode 100644 index 000000000..fc07ffc5b --- /dev/null +++ b/Tests/Manual/CPControlPerformClickExceptionTest/AppController.j @@ -0,0 +1,110 @@ +/* + * AppController.j + * CPControlPerformClickExceptionTest + * + * Created by Aparajita Fishman on August 21, 2010. + */ + +@import + +CPLogRegister(CPLogConsole); + +var UseFix = NO; + + +@implementation AppController : CPObject +{ + CPWindow theWindow; + + CPButton button; +} + +- (void)applicationDidFinishLaunching:(CPNotification)aNotification +{ + theWindow = [[CPWindow alloc] initWithContentRect:CGRectMake(70.0, 70.0, 400.0, 300.0) styleMask:CPTitledWindowMask]; + [theWindow setTitle:@"CPControlPerformClickExceptionTest"]; + + var contentView = [theWindow contentView], + label = [CPTextField labelWithTitle:@"Press the Return key to see the problem and fix"], + button = [MyButton buttonWithTitle:@"Button"], + checkbox = [CPCheckBox checkBoxWithTitle:@"Use Fix"]; + + [label setFrameOrigin:CGPointMake(50, 50)]; + [contentView addSubview:label]; + + [button setFrameOrigin:CGPointMake(50, 90)]; + [button setTarget:self]; + [button setAction:@selector(buttonWasPressed:)]; + [contentView addSubview:button]; + + [checkbox setFrameOrigin:CGPointMake(50, 130)]; + [checkbox setTarget:self]; + [checkbox setAction:@selector(useFix:)]; + [contentView addSubview:checkbox]; + + [theWindow setDefaultButton:button]; + [theWindow orderFront:nil]; +} + +- (void)buttonWasPressed:(id)sender +{ + try + { + [CPException raise:[[sender window] title] reason:[sender title]]; + } + finally + { + var alert = [[CPAlert alloc] init]; + + [alert setTitle:@"Test"]; + [alert setMessageText:UseFix ? @"Note the button has already been unhighlighted." : @"Note the button has not been unhighlighted. It will be when this alert is closed."]; + [alert addButtonWithTitle:@"OK"]; + [alert setDelegate:self]; + [alert runModal]; + } +} + +-(void)alertDidEnd:(CPAlert)theAlert returnCode:(int)returnCode +{ + [button highlight:NO]; +} + +- (void)useFix:(id)sender +{ + UseFix = [sender state] == CPOnState; +} + +@end + +@implementation MyButton : CPButton + ++ (id)buttonWithTitle:(CPString)aTitle +{ + var button = [[[self class] alloc] init]; + + [button setTheme:[CPTheme defaultTheme]]; + [button setTitle:aTitle]; + [button sizeToFit]; + + return button; +} + +- (void)performClick:(id)sender +{ + if (UseFix) + { + [super performClick:sender]; + return; + } + + if (![self isEnabled]) + return; + + [self highlight:YES]; + [self setState:[self nextState]]; + [self sendAction:[self action] to:[self target]]; + + [CPTimer scheduledTimerWithTimeInterval:0.1 target:self selector:@selector(unhighlightButtonTimerDidFinish:) userInfo:nil repeats:NO]; +} + +@end diff --git a/Tests/Manual/CPControlPerformClickExceptionTest/Info.plist b/Tests/Manual/CPControlPerformClickExceptionTest/Info.plist new file mode 100644 index 000000000..d698a875a --- /dev/null +++ b/Tests/Manual/CPControlPerformClickExceptionTest/Info.plist @@ -0,0 +1,12 @@ + + + + + CPApplicationDelegateClass + AppController + CPBundleName + CPControlPerformClickExceptionTest + CPPrincipalClass + CPApplication + + diff --git a/Tests/Manual/CPControlPerformClickExceptionTest/Resources/spinner.gif b/Tests/Manual/CPControlPerformClickExceptionTest/Resources/spinner.gif new file mode 100644 index 0000000000000000000000000000000000000000..06dbc2bc21dddcf0e09b566d5b211aee89570f52 GIT binary patch literal 1849 zcma*odr(tX9tZHtz31lM+(&Y`A`Ou`NeG&R#DrIfV%?hng21vs6v>ooRQQFbk7E_K!V( z{?5!fpZWgIZ%*d6t%i*j24bL}AZUJm9)h6R*;%L4IWse3G#VWaN1#$zSSXcBhlYlH zJ|D}n{r&w2f+Qp)SS*&n?*G4}{}!h?td_mjU6Kad-rW*QwWYCUk7d^e+sjpZAn6kT z5rM;`{~_}-wm+L@%+E;JphLm}C3WzQAQD0wBoY|rOTQX{(@pp-WAA8Iw0HKl|15j) zhGh(SFWu#5zUCw^T!}C~eC}~?{xG-r7ugQC>taC+|L^xr&a%{#cgUOZXIM&v?)k^2 z1i5%0!U00wq)r4vlAwXBA_m5J5WNeuBm-XJQ5pG4GD%vc|K){+TJ{AkHqN@SJKczX zU}QRd9n*_bf^h94)6Ctv{CUfz_;qs#RDuQ$DR%y1&5G-a6rhf*4Y zl+UOD1*GE{GQ7vv;c-tTIMkz0ovO>9j%b5hpa@a*CBJ#W!0@ndSwF|%hMkdFtXiU) z`BEp+yhkt8ZY>tg&uyH@%^%K4jDrbA;et&vnnzZ3z22@e6<27z2Vk13kb7OtISyxv z(XoO-LNQCZe3lfzc%*pNqU<9T+p~teThOEB+~e&U0mC|zS{Q)dJZ)!^1f7L(zg*L> z*vSW%?dR~@@0(}x6-V^A`~ImD;)NaBUnP8;RH=bS2@pk`wp>>8r&jGjmGPy%1BW}v zoPo}ca$~bze@efc3kapuEVW1!%teOZT3j2Tw5=hjiAf02d}7dL0oFC%@=RXp5Ow#% z@a>+AM|YWt$n&e`>sB-32gBcuTi>R>*|8@lp`y6thc7ydyqDsuUn~YzZf|{-R@-3y zL#wx{Ii}xxL_csiW*LBn0-A$>zp4WOmkf6=ilrjlW?-l9+bCd7|i?*b5NTmy<<6NZ0T8$SN@mwdC2f z6jqK=N@bS@!=YSj%>h0}*4p+%0HbTIrE$w7UMT6+AZZ&DAo*qZAAi(OtNbIfl#Dw^ zJWeiCp~zi#&t6x}m9)O^eR4HiLV3QA<<0>HZ8%$^lrSE94Wb}=+MM^!b>n#5&-JQR zkr-CEu9C;_F*7DqDisulV6Pmg$nFL0TPn%~*m^-`Z3^BgU(sNpnx%nW(!eV9A&FvI zHL3X3lw8Wji^6=8KbQDE-e%b?svdFxxdh$8r97@7$ojeI`6AL8Ob6QC$qh&>ZWVDX1F{0vJnT%%mE;GveKWR%C} zM&4d;Jf3s9|HAA)yVUPo`Aq;0do#)uHSXi5*QF*)x@MVVHr+cN)uMZ__F|&Ta#p8d z53TOKtce!PJUuie8UWol-S(`c2nH?UGqJP{!4RR4u$LCfn)q-hj0^f=h(VYy)T6eN zhRO!ja-aDBTcgeyP(8Ua4IdiOog^*CQa?R(cP#9AgL9`j>EX-6Yf1lzX(!~``M1XC zNmM<4<6d~wWZ$Xrk0K}UteTrq@LBBk#MsjkK;pbuVhe)NI7(7Pf(l?lxC7=1Z7Pzl zMbS;nV4NI5_N{1$P)&XC)huOGQ+h^zpYUZfb*1n6>!`#*b3y52LGmi+<4sY5jyD#- zw&$d}DTguLAfnRtjrM*JfqtHqUu6rQoU=g%1E9xk%;)TDm^2<8n-0IhTsQFaek)MY}>PK4;nBk=ow4pF>vzkO& gna%Org-kgQCf=+BeMi^RbuY;YE~rTjend;_cdi8t>i_@% literal 0 HcmV?d00001 diff --git a/Tests/Manual/CPControlPerformClickExceptionTest/index-debug.html b/Tests/Manual/CPControlPerformClickExceptionTest/index-debug.html new file mode 100644 index 000000000..dcc825c28 --- /dev/null +++ b/Tests/Manual/CPControlPerformClickExceptionTest/index-debug.html @@ -0,0 +1,69 @@ + + + + + + + + CPControlPerformClickExceptionTest + + + + + + + + + + + + +
+ + + +
+ + + diff --git a/Tests/Manual/CPControlPerformClickExceptionTest/index.html b/Tests/Manual/CPControlPerformClickExceptionTest/index.html new file mode 100644 index 000000000..bd9ab5680 --- /dev/null +++ b/Tests/Manual/CPControlPerformClickExceptionTest/index.html @@ -0,0 +1,68 @@ + + + + + + + + CPControlPerformClickExceptionTest + + + + + + + + + + + + +
+ + + +
+ + + diff --git a/Tests/Manual/CPControlPerformClickExceptionTest/main.j b/Tests/Manual/CPControlPerformClickExceptionTest/main.j new file mode 100755 index 000000000..af6279da3 --- /dev/null +++ b/Tests/Manual/CPControlPerformClickExceptionTest/main.j @@ -0,0 +1,18 @@ +/* + * AppController.j + * TableCibTest + * + * Created by Francisco Tolmasky on July 5, 2009. + * Copyright 2009, 280 North, Inc. All rights reserved. + */ + +@import +@import + +@import "AppController.j" + + +function main(args, namedArgs) +{ + CPApplicationMain(args, namedArgs); +}