From f39441e10110da65239a6e8012538af713c985c2 Mon Sep 17 00:00:00 2001 From: Antoine Mercadal Date: Tue, 25 Jan 2011 17:53:50 +0100 Subject: [PATCH 1/7] avoid error in FF --- AppKit/CPSound.j | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/AppKit/CPSound.j b/AppKit/CPSound.j index 90378deb0..8fbf8980e 100644 --- a/AppKit/CPSound.j +++ b/AppKit/CPSound.j @@ -63,11 +63,11 @@ CPSoundPlayBackStatePause = 2; _audioTag.addEventListener("canplay", function() { [self _soundDidload]; - }); + }, true); _audioTag.addEventListener("ended", function() { [self _soundDidEnd]; - }); + }, true); } return self; From 3a6f2c4d5bb2d5fb04f892f2849cc75933f89e83 Mon Sep 17 00:00:00 2001 From: Antoine Mercadal Date: Wed, 26 Jan 2011 11:06:10 +0100 Subject: [PATCH 2/7] make CPSound handling error + More Cocoa compliant --- AppKit/CPSound.j | 47 ++++++++++++++++++++++++++++++++++++++--------- 1 file changed, 38 insertions(+), 9 deletions(-) diff --git a/AppKit/CPSound.j b/AppKit/CPSound.j index 8fbf8980e..bba03b2f7 100644 --- a/AppKit/CPSound.j +++ b/AppKit/CPSound.j @@ -25,6 +25,7 @@ CPSoundLoadStateEmpty = 0; CPSoundLoadStateLoading = 1; CPSoundLoadStateCanBePlayed = 2; +CPSoundLoadStateError = 3; CPSoundPlayBackStatePlay = 0; CPSoundPlayBackStateStop = 1; @@ -68,6 +69,10 @@ CPSoundPlayBackStatePause = 2; { [self _soundDidEnd]; }, true); + _audioTag.addEventListener("error", function() + { + [self _soundError]; + }, true); } return self; @@ -137,31 +142,45 @@ CPSoundPlayBackStatePause = 2; [self stop]; } +/*! @ignore +*/ +- (void)_soundError +{ + _loadStatus = CPSoundLoadStateError; + CPLog.error("Cannot load sound. Maybe the format of your sound is not compatible with your browser."); +} + #pragma mark - #pragma mark Media controls /*! Play the sound. + + @return YES when the receiver is playing its audio data, NO otherwise. */ -- (void)play +- (BOOL)play { if ((_loadStatus !== CPSoundLoadStateCanBePlayed) || (_playBackStatus === CPSoundPlayBackStatePlay)) - return; + return NO; _audioTag.play(); _playBackStatus = CPSoundPlayBackStatePlay; + + return YES; } /*! Stop the sound. + + @return YES when the receiver is playing its audio data, NO otherwise. */ -- (void)stop +- (BOOL)stop { if ((_loadStatus !== CPSoundLoadStateCanBePlayed) || (_playBackStatus === CPSoundPlayBackStateStop)) - return; + return NO; _audioTag.pause(); _audioTag.currentTime = 0.0; @@ -169,32 +188,42 @@ CPSoundPlayBackStatePause = 2; if (_delegate && [_delegate respondsToSelector:@selector(sound:didFinishPlaying:)]) [_delegate sound:self didFinishPlaying:YES]; + + return YES; } /*! Pause the sound. + + @return YES when the receiver is playing its audio data, NO otherwise. */ -- (void)pause +- (BOOL)pause { if ((_loadStatus !== CPSoundLoadStateCanBePlayed) || (_playBackStatus === CPSoundPlayBackStatePause)) - return; + return NO; _audioTag.pause(); _playBackStatus = CPSoundPlayBackStatePause; + + return YES; } /*! Resume playback of a paused sound. + + @return YES when the receiver is playing its audio data, NO otherwise. */ -- (void)resume +- (BOOL)resume { if ((_loadStatus !== CPSoundLoadStateCanBePlayed) || (_playBackStatus !== CPSoundPlayBackStatePause)) - return; + return NO; _audioTag.play(); _playBackStatus = CPSoundPlayBackStatePlay; + + return YES; } /*! @@ -265,4 +294,4 @@ CPSoundPlayBackStatePause = 2; return (_playBackStatus === CPSoundPlayBackStatePlay); } -@end +@end \ No newline at end of file From c4dce3848461323bfad1e0170015f1754d4495f8 Mon Sep 17 00:00:00 2001 From: Aparajita Fishman Date: Tue, 8 Mar 2011 03:11:08 -0500 Subject: [PATCH 3/7] Added support for pattern fills in CGContext, fixed bug in COORD macro in CGContextVML.j, test app --- AppKit/CoreGraphics/CGContextCanvas.j | 20 ++- AppKit/CoreGraphics/CGContextVML.j | 29 +++- Tests/Manual/PatternFillTest/AppController.j | 141 ++++++++++++++++++ Tests/Manual/PatternFillTest/Info.plist | 12 ++ Tests/Manual/PatternFillTest/Jakefile | 93 ++++++++++++ .../Manual/PatternFillTest/Resources/bad.png | Bin 0 -> 26065 bytes .../Manual/PatternFillTest/Resources/help.png | Bin 0 -> 1365 bytes .../PatternFillTest/Resources/pattern.gif | Bin 0 -> 323 bytes .../PatternFillTest/Resources/spinner.gif | Bin 0 -> 1849 bytes Tests/Manual/PatternFillTest/index-debug.html | 103 +++++++++++++ Tests/Manual/PatternFillTest/index.html | 77 ++++++++++ Tests/Manual/PatternFillTest/main.j | 18 +++ 12 files changed, 486 insertions(+), 7 deletions(-) create mode 100644 Tests/Manual/PatternFillTest/AppController.j create mode 100644 Tests/Manual/PatternFillTest/Info.plist create mode 100644 Tests/Manual/PatternFillTest/Jakefile create mode 100644 Tests/Manual/PatternFillTest/Resources/bad.png create mode 100644 Tests/Manual/PatternFillTest/Resources/help.png create mode 100755 Tests/Manual/PatternFillTest/Resources/pattern.gif create mode 100644 Tests/Manual/PatternFillTest/Resources/spinner.gif create mode 100644 Tests/Manual/PatternFillTest/index-debug.html create mode 100644 Tests/Manual/PatternFillTest/index.html create mode 100644 Tests/Manual/PatternFillTest/main.j diff --git a/AppKit/CoreGraphics/CGContextCanvas.j b/AppKit/CoreGraphics/CGContextCanvas.j index b13ac4c13..5a12aae01 100644 --- a/AppKit/CoreGraphics/CGContextCanvas.j +++ b/AppKit/CoreGraphics/CGContextCanvas.j @@ -240,7 +240,25 @@ function CGContextSetAlpha(aContext, anAlpha) function CGContextSetFillColor(aContext, aColor) { - aContext.fillStyle = [aColor cssString]; + if ([aColor patternImage]) + { + var patternImg = [aColor patternImage], + size = [patternImg size], + img; + + if (size) + img = new Image(size.width, size.height); + else + img = new Image(); + + img.src = [patternImg filename]; + + var pattern = aContext.createPattern(img, "repeat"); + + aContext.fillStyle = pattern; + } + else + aContext.fillStyle = [aColor cssString]; } function CGContextSetStrokeColor(aContext, aColor) diff --git a/AppKit/CoreGraphics/CGContextVML.j b/AppKit/CoreGraphics/CGContextVML.j index 0b45115fe..e3b09caf9 100644 --- a/AppKit/CoreGraphics/CGContextVML.j +++ b/AppKit/CoreGraphics/CGContextVML.j @@ -38,6 +38,15 @@ function CGBitmapGraphicsContextCreate() return _CGBitmapGraphicsContextCreate(); } +function CGContextSetFillColor(aContext, aColor) +{ + if ([aColor patternImage]) + // Prefix a marker character to the string so we know it's a pattern image filename + aContext.gState.fillStyle = "!" + [[aColor patternImage] filename]; + else + aContext.gState.fillStyle = [aColor cssString]; +} + // FIXME: aRect is ignored. function CGContextClearRect(aContext, aRect) { @@ -54,7 +63,7 @@ var W = 10.0, Z = 10.0, Z_2 = Z / 2.0; -#define COORD(aCoordinate) (ROUND(Z * (aCoordinate) - Z_2)) +#define COORD(aCoordinate) (aCoordinate === 0.0 ? 0 : ROUND(Z * (aCoordinate) - Z_2)) function CGContextDrawImage(aContext, aRect, anImage) { @@ -121,15 +130,18 @@ function CGContextDrawPath(aContext, aMode) fill = (aMode == kCGPathFill || aMode == kCGPathFillStroke) ? 1 : 0, stroke = (aMode == kCGPathStroke || aMode == kCGPathFillStroke) ? 1 : 0, opacity = gState.alpha, - vml = [ ""); + { + if (gState.fillStyle.charAt(0) === "!") + vml.push(""); + else // should be a CSS color spec + vml.push(""); + } if (stroke) vml.push( " + + +@implementation AppController : CPObject +{ + CPView contentView; + CPTextField label1; + CPTextField label2; + MyView myView; + CPImageView view2; + CPImage patternImage1; + BOOL patternImage1Loaded; + CPImage patternImage2; + BOOL patternImage2Loaded; +} + +- (void)applicationDidFinishLaunching:(CPNotification)aNotification +{ + var x = 20, + theWindow = [[CPWindow alloc] initWithContentRect:CGRectMakeZero() styleMask:CPBorderlessBridgeWindowMask]; + + contentView = [theWindow contentView]; + label1 = [CPTextField labelWithTitle:@"Dynamically drawn"]; + label2 = [CPTextField labelWithTitle:@"Screen capture from IE before COORD fix, notice the fuzziness in the pattern"]; + patternImage1 = [[CPImage alloc] initWithContentsOfFile:[[CPBundle mainBundle] pathForResource:@"help.png"] size:CGSizeMake(21, 22)]; + view2 = [[CPImageView alloc] initWithFrame:CGRectMake(x, 210, 200, 200)]; + img2 = [[CPImage alloc] initWithContentsOfFile:[[CPBundle mainBundle] pathForResource:@"bad.png"] size:CGSizeMake(200, 200)]; + patternImage2 = [[CPImage alloc] initWithContentsOfFile:[[CPBundle mainBundle] pathForResource:@"pattern.gif"] size:CGSizeMake(56, 32)]; + + var fillColor1 = [CPColor colorWithPatternImage:patternImage1], + fillColor2 = [CPColor colorWithPatternImage:patternImage2]; + + [view2 setImage:img2]; + + myView = [[MyView alloc] initWithFrame:CGRectMake(0, 0, 200, 200) fillColor1:fillColor1 fillColor2:fillColor2]; + + [label1 setFrameOrigin:CGPointMake(x, 20)]; + [myView setFrameOrigin:CGPointMake(x, CGRectGetMaxY([label1 frame]) + 5)]; + + [label2 setFrameOrigin:CGPointMake(x, CGRectGetMaxY([myView frame]) + 20)]; + [view2 setFrameOrigin:CGPointMake(x, CGRectGetMaxY([label2 frame]) + 5)]; + + // Pattern images MUST be loaded before they are used, so we have to use a load delegate + // for each image and draw only when we have them all. + if ([patternImage1 loadStatus] === CPImageLoadStatusCompleted) + patternImage1Loaded = YES; + else + { + patternImage1Loaded = NO; + [patternImage1 setDelegate:self]; + } + + if ([patternImage2 loadStatus] === CPImageLoadStatusCompleted) + patternImage2Loaded = YES; + else + { + patternImage2Loaded = NO; + [patternImage2 setDelegate:self]; + } + + if (patternImage1Loaded && patternImage2Loaded) + [self addSubviews]; + + [theWindow orderFront:self]; + + // Uncomment the following line to turn on the standard menu bar. + //[CPMenu setMenuBarVisible:YES]; +} + +- (void)imageDidLoad:(CPImage)anImage +{ + if (anImage == patternImage1) + patternImage1Loaded = YES; + else if (anImage == patternImage2) + patternImage2Loaded = YES; + + if (patternImage1Loaded && patternImage2Loaded) + [self addSubviews]; +} + +- (void)addSubviews +{ + [contentView addSubview:label1]; + [contentView addSubview:label2]; + [contentView addSubview:myView]; + [contentView addSubview:view2]; +} + +@end + +@implementation MyView : CPView +{ + CPColor fillColor1; + CPColor fillColor2; +} + +- (id)initWithFrame:(CGRect)aFrame fillColor1:(CPColor)aColor1 fillColor2:(CPColor)aColor2 +{ + self = [super initWithFrame:aFrame]; + + if (self) + { + fillColor1 = aColor1; + fillColor2 = aColor2; + } + + return self; +} + +- (void)drawRect:(CGRect)dirtyRect +{ + var context = [[CPGraphicsContext currentContext] graphicsPort]; + + CGContextSetFillColor(context, fillColor1); + CGContextFillRect(context, [self bounds]); + + CGContextSetFillColor(context, [CPColor yellowColor]); + CGContextFillEllipseInRect(context, CGRectInset([self bounds], 40, 40)); + + CGContextSetStrokeColor(context, [CPColor blueColor]); + CGContextStrokeRect(context, CGRectInset([self bounds], 0.5, 0.5)); + + CGContextSetStrokeColor(context, [CPColor redColor]); + CGContextStrokeEllipseInRect(context, CGRectInset([self bounds], 20.5, 20.5)); + + CGContextSetStrokeColor(context, [CPColor greenColor]); + CGContextStrokeRect(context, CGRectInset([self bounds], 30.5, 30.5)); + + CGContextSetFillColor(context, fillColor2); + CGContextFillEllipseInRect(context, CGRectInset([self bounds], 50, 50)); +} + +@end diff --git a/Tests/Manual/PatternFillTest/Info.plist b/Tests/Manual/PatternFillTest/Info.plist new file mode 100644 index 000000000..3eb7a23af --- /dev/null +++ b/Tests/Manual/PatternFillTest/Info.plist @@ -0,0 +1,12 @@ + + + + + CPApplicationDelegateClass + AppController + CPBundleName + test + CPPrincipalClass + CPApplication + + diff --git a/Tests/Manual/PatternFillTest/Jakefile b/Tests/Manual/PatternFillTest/Jakefile new file mode 100644 index 000000000..34daaa6db --- /dev/null +++ b/Tests/Manual/PatternFillTest/Jakefile @@ -0,0 +1,93 @@ +/* + * Jakefile + * test + * + * Created by aparajita on March 7, 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 ("test", function(task) +{ + task.setBuildIntermediatesPath(FILE.join("Build", "test.build", configuration)); + task.setBuildPath(FILE.join("Build", configuration)); + + task.setProductName("test"); + task.setIdentifier("com.aparajitaworld.test"); + task.setVersion("1.0"); + task.setAuthor("Victory-Heart Productions"); + task.setEmail("feedback @nospam@ yourcompany.com"); + task.setSummary("test"); + 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", ["test"], 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", "test", "index.html")]); +}); + +task ("run-release", ["release"], function() +{ + OS.system(["open", FILE.join("Build", "Release", "test", "index.html")]); +}); + +task ("deploy", ["release"], function() +{ + FILE.mkdirs(FILE.join("Build", "Deployment", "test")); + OS.system(["press", "-f", FILE.join("Build", "Release", "test"), FILE.join("Build", "Deployment", "test")]); + printResults("Deployment") +}); + +task ("desktop", ["release"], function() +{ + FILE.mkdirs(FILE.join("Build", "Desktop", "test")); + require("cappuccino/nativehost").buildNativeHost(FILE.join("Build", "Release", "test"), FILE.join("Build", "Desktop", "test", "test.app")); + printResults("Desktop") +}); + +task ("run-desktop", ["desktop"], function() +{ + OS.system([FILE.join("Build", "Desktop", "test", "test.app", "Contents", "MacOS", "NativeHost"), "-i"]); +}); + +function printResults(configuration) +{ + print("----------------------------"); + print(configuration+" app built at path: "+FILE.join("Build", configuration, "test")); + print("----------------------------"); +} diff --git a/Tests/Manual/PatternFillTest/Resources/bad.png b/Tests/Manual/PatternFillTest/Resources/bad.png new file mode 100644 index 0000000000000000000000000000000000000000..3f4d1a2441803a8407d65fcb8f689a42dc8017d1 GIT binary patch literal 26065 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
xxP^f+Qe`im{u9 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 literal 0 HcmV?d00001 diff --git a/Tests/Manual/PatternFillTest/Resources/help.png b/Tests/Manual/PatternFillTest/Resources/help.png new file mode 100644 index 0000000000000000000000000000000000000000..f7811563d536997eef606de1703813962941ffac GIT binary patch literal 1365 zcmV-b1*-aqP)3|?8mXwS?0eBEiEl>K@g7B*Sd~1 zI9&zRmHQ24rIuV#6optUE=A_=MT&U27VoXkhuL-Fc`eNjl*p}xLmI1 z_wVz*edMXrO_Ps8bs)>qxGC+aM`j!{uiLm-}@;4CvB6HWCQ56PM%lUQQlR!zG3NB0C) zzd5tCw6w@>NA9h8vAMCyS;6x}kOck!-AH3J~79^<*HrF>)w!iX1Yp1ukOfPV#9Ye10P|q*l!OgKj=zQr69P%E9 z;n6`D4h=$hVhm1nysXistr!KrQBw41>0x#y9r>M4r_+vF+rf&${K7m&4HZ3c9Iz|{ zohM$0vuEB%e1(?5W~qiZ-aQG|Z}j3Dt9fTK_^5zbBIX^ixGS!PFF9BQwO83{%UK-< z(k80{Qs^AZf>A66#0H*2CaCXfBCaw!|x=bIZW9f6h1 z@;c$MsZ=Vm5S>}3a7jOu4s^s6XF<^H>+io*wLDN=1wxMISm3AuGy=3nVLXV=E)yOt z&rMB-7HaC6tUP|C1`@P-S6h>qrXz~#OwMQpzm`@@RQ*OwB}r@FKmH6Y5FW9<8yNOQ zlF4|A!l4C5(U=ktF={{62G5;rgV9?ffL#iDbk5=|uv#)X+@DyErvf*95yB&ku>VGP zZ~uVrj@o@lRVFQY?Eo?M_xqvux*y`nm?{ymB3XzzInLmjYa_lp{$Mv1aG1hRppAWd z`NELZUM0F4-F7Ay)c%%<2_D$IuV9^O4k$?!iK1Nt>U?`@Xy($-7wGyMBfRZfD)w+G zA}80PMU@u2!ECmO6apnoEq+1MQ0+EWOA2)uu^bBz&3yjNhrz4E{-1Cu2wJ771Eq(h z>Dj5ZyZ0s)lOdNkms^Vp^7VqiYY9`aSZyXp@pwFSCD1+b(HG|feS?0wORu5Dce?ra zpw*+*96x%zwf&iPOQW-~)Ml}niVKSKqbt$1SuC5-cxb_Q#TV)B?(W0AlW5~aYS+IL z90s&v0!Ay{GI}pSOQJ>57Pf41>wWcq|D*mj3b!2OqfwtxQZY@ifwr~M3N|00000NkvXXu0mjfpoxJB literal 0 HcmV?d00001 diff --git a/Tests/Manual/PatternFillTest/Resources/pattern.gif b/Tests/Manual/PatternFillTest/Resources/pattern.gif new file mode 100755 index 0000000000000000000000000000000000000000..60f6609044a03c626500fe81f74d64a2cf9922ee GIT binary patch literal 323 zcmV-J0lfZ4Nk%w1VK@LF0FeLyX^?48c29z-f&c&jA^8LV00000EC2ui05||300092 zRE~)P?VygBG|(EK!_iLNL{~LV88|9wpoyioCM|r?92=@{X(&#@vzdIZRFJ4MzI-{! zZh816Ye(6`d9y{YQxX&b0%U<7Q0G}YX?h)CScEmCZ((Vt-qd>b!rp8K#x=t;)I&&N zhtu*FD0b-eIAn##MfNBW$CLQRxaD|cQn>V2>6tS)2Wcp&*s10ks+7jG)~4c`85`61 zFt$(z_$xch3!x`G6r3yf zCcciFD|ClvOKBNLqh5?lN(v}u(^?th)Xq~ROnokFqEu>GkVx>%xY}^Zf<$%{v>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/PatternFillTest/index-debug.html b/Tests/Manual/PatternFillTest/index-debug.html new file mode 100644 index 000000000..b5f2c8720 --- /dev/null +++ b/Tests/Manual/PatternFillTest/index-debug.html @@ -0,0 +1,103 @@ + + + + + + + + + + + + + + + test + + + + + + + + + + + + + + +

+
+ + + +
+
+ + + diff --git a/Tests/Manual/PatternFillTest/index.html b/Tests/Manual/PatternFillTest/index.html new file mode 100644 index 000000000..103eb5bc1 --- /dev/null +++ b/Tests/Manual/PatternFillTest/index.html @@ -0,0 +1,77 @@ + + + + + + + + + + + + + + + test + + + + + + + + + + + + +
+
+ + + +
+
+ + + diff --git a/Tests/Manual/PatternFillTest/main.j b/Tests/Manual/PatternFillTest/main.j new file mode 100644 index 000000000..3fcfef3ec --- /dev/null +++ b/Tests/Manual/PatternFillTest/main.j @@ -0,0 +1,18 @@ +/* + * AppController.j + * test + * + * Created by aparajita on March 7, 2011. + * Copyright 2011, Victory-Heart Productions All rights reserved. + */ + +@import +@import + +@import "AppController.j" + + +function main(args, namedArgs) +{ + CPApplicationMain(args, namedArgs); +} From f2541223466265a3d1d9811d09bf4e240e65e764 Mon Sep 17 00:00:00 2001 From: Aparajita Fishman Date: Thu, 10 Mar 2011 12:26:23 -0500 Subject: [PATCH 4/7] Added CPView -hasThemeAttribute and tests --- AppKit/CPView.j | 5 +++++ Tests/AppKit/CPButtonTest.j | 15 +++++++++++++++ Tests/AppKit/CPViewTest.j | 25 ++++++++++++++++++++----- 3 files changed, 40 insertions(+), 5 deletions(-) diff --git a/AppKit/CPView.j b/AppKit/CPView.j index afd79c850..74b800e34 100644 --- a/AppKit/CPView.j +++ b/AppKit/CPView.j @@ -2498,6 +2498,11 @@ setBoundsOrigin: return [_themeAttributes[aName] valueForState:_themeState]; } +- (BOOL)hasThemeAttribute:(CPString)aName +{ + return (_themeAttributes && _themeAttributes[aName] !== undefined); +} + - (CPView)createEphemeralSubviewNamed:(CPString)aViewName { return nil; diff --git a/Tests/AppKit/CPButtonTest.j b/Tests/AppKit/CPButtonTest.j index 8acf049df..3b2d1d4b2 100644 --- a/Tests/AppKit/CPButtonTest.j +++ b/Tests/AppKit/CPButtonTest.j @@ -132,4 +132,19 @@ [self assert:CPMixedState equals:[button state] message:@"Mixed state is allowed, state should be CPMixedState"]; } +- (void)testThemeAttributes +{ + var attributes = [CPButton themeAttributes]; + + if (attributes) + { + var keys = [attributes allKeys], + firstKey = [keys objectAtIndex:0]; + + [self assertTrue:[button hasThemeAttribute:[firstKey]] message:[button className] + " should have the theme attribute \"" + firstKey + "\""]; + } + + [self assertFalse:[button hasThemeAttribute:@"foobar"] message:[button className] + " should not have theme attribute \"" + firstKey + "\""]; +} + @end diff --git a/Tests/AppKit/CPViewTest.j b/Tests/AppKit/CPViewTest.j index 2f5c01566..01aa80af2 100644 --- a/Tests/AppKit/CPViewTest.j +++ b/Tests/AppKit/CPViewTest.j @@ -23,18 +23,18 @@ /* During the layout process for the view, _CPImageAndTextView.j throws a ReferenceError with the following: - + "hasDOMImageElement" is not defined - - The referenced variable is #if PLATFORM(DOM) excluded in all other - instances. While not isolated to the behaviour of a CPView alone, the + + The referenced variable is #if PLATFORM(DOM) excluded in all other + instances. While not isolated to the behaviour of a CPView alone, the following test ensures that pending actions in the _CPDisplayServer can be flushed without touching unimplemented portions of the test platform (e.g. the DOM). There are times where we want to confirm that some setting requiring relayout (e.g. string truncation based on available space), the following test should help ensure those types of tests are safe to carry out with ojunit. - + Demonstrates issue #562. */ - (void)testCanFlushPendingLayoutWork @@ -58,4 +58,19 @@ [self assertTrue:[view hasThemeState:CPThemeStateHighlighted] message:@"The view should be CPThemeStateHighlighted"]; } +- (void)testThemeAttributes +{ + var attributes = [CPView themeAttributes]; + + if (attributes) + { + var keys = [attributes allKeys], + firstKey = [keys objectAtIndex:0]; + + [self assertTrue:[view hasThemeAttribute:[firstKey]] message:[view className] + " should have the theme attribute \"" + firstKey + "\""]; + } + + [self assertFalse:[view hasThemeAttribute:@"foobar"] message:[view className] + " should not have theme attribute \"" + firstKey + "\""]; +} + @end From 9a2d079beed086bd899c571a8d6b8794b576f022 Mon Sep 17 00:00:00 2001 From: Aparajita Fishman Date: Tue, 8 Mar 2011 17:43:54 -0500 Subject: [PATCH 5/7] lint the template files, update setFullBridge (deprecated) to setFullPlatformWindow --- .../Resources/Templates/Application/index-debug.html | 10 +++++----- Tools/capp/Resources/Templates/Application/index.html | 4 ++-- .../Resources/Templates/NibApplication/AppController.j | 6 +++--- .../Templates/NibApplication/index-debug.html | 8 ++++---- .../capp/Resources/Templates/NibApplication/index.html | 4 ++-- 5 files changed, 16 insertions(+), 16 deletions(-) diff --git a/Tools/capp/Resources/Templates/Application/index-debug.html b/Tools/capp/Resources/Templates/Application/index-debug.html index 33b76c2a7..871c9f72d 100644 --- a/Tools/capp/Resources/Templates/Application/index-debug.html +++ b/Tools/capp/Resources/Templates/Application/index-debug.html @@ -26,9 +26,9 @@ OBJJ_MAIN_FILE = "main.j"; OBJJ_INCLUDE_PATHS = ["Frameworks/Debug", "Frameworks", "SomethingElse"]; - + - + - +