From 2338ca2fa22bea4e8aa0220aa553e92530185c62 Mon Sep 17 00:00:00 2001 From: Ross Boucher Date: Fri, 9 Oct 2009 23:49:00 -0700 Subject: [PATCH] Add support for minimization. --- AppKit/CPWindow/CPWindow.j | 77 +++++++++++++++--- AppKit/CPWindow/_CPStandardWindowView.j | 53 +++++++++--- AppKit/Platform/CPPlatformWindow.j | 16 ++++ .../CPWindowStandardCloseButtonUnsaved.png | Bin 0 -> 720 bytes ...wStandardCloseButtonUnsavedHighlighted.png | Bin 0 -> 716 bytes .../CPWindowStandardMaximizeButton.png | Bin 0 -> 713 bytes ...indowStandardMaximizeButtonHighlighted.png | Bin 0 -> 722 bytes .../CPWindowStandardMinimizeButton.png | Bin 0 -> 661 bytes ...indowStandardMinimizeButtonHighlighted.png | Bin 0 -> 683 bytes 9 files changed, 123 insertions(+), 23 deletions(-) create mode 100644 AppKit/Resources/CPWindow/Standard/CPWindowStandardCloseButtonUnsaved.png create mode 100644 AppKit/Resources/CPWindow/Standard/CPWindowStandardCloseButtonUnsavedHighlighted.png create mode 100644 AppKit/Resources/CPWindow/Standard/CPWindowStandardMaximizeButton.png create mode 100644 AppKit/Resources/CPWindow/Standard/CPWindowStandardMaximizeButtonHighlighted.png create mode 100644 AppKit/Resources/CPWindow/Standard/CPWindowStandardMinimizeButton.png create mode 100644 AppKit/Resources/CPWindow/Standard/CPWindowStandardMinimizeButtonHighlighted.png diff --git a/AppKit/CPWindow/CPWindow.j b/AppKit/CPWindow/CPWindow.j index 0b0d1bee0..2c0c0693d 100644 --- a/AppKit/CPWindow/CPWindow.j +++ b/AppKit/CPWindow/CPWindow.j @@ -178,6 +178,9 @@ CPWindowDidResignMainNotification = @"CPWindowDidResignMainNotification"; CPWindowDidMoveNotification = @"CPWindowDidMoveNotification"; CPWindowWillBeginSheetNotification = @"CPWindowWillBeginSheetNotification"; CPWindowDidEndSheetNotification = @"CPWindowDidEndSheetNotification"; +CPWindowDidMiniaturizeNotification = @"CPWindowDidMiniaturizeNotification"; +CPWindowWillMiniaturizeNotification = @"CPWindowWillMiniaturizeNotification"; +CPWindowDidDeminiaturizeNotification = @"CPWindowDidDeminiaturizeNotification"; CPWindowShadowStyleStandard = 0; CPWindowShadowStyleMenu = 1; @@ -249,6 +252,7 @@ var CPWindowSaveImage = nil, CGRect _frame; int _level; BOOL _isVisible; + BOOL _isMiniaturized; BOOL _isAnimating; BOOL _hasShadow; BOOL _isMovableByWindowBackground; @@ -441,10 +445,10 @@ CPTexturedBackgroundWindowMask { if (aStyleMask & CPHUDBackgroundWindowMask) return _CPHUDWindowView; - + else if (aStyleMask === CPBorderlessWindowMask) return _CPBorderlessWindowView; - + else if (aStyleMask & CPDocModalWindowMask) return _CPDocModalWindowView; @@ -964,17 +968,17 @@ CPTexturedBackgroundWindowMask if (!_CPWindowShadowColor) { var bundle = [CPBundle bundleForClass:[CPWindow class]]; - + _CPWindowShadowColor = [CPColor colorWithPatternImage:[[CPNinePartImage alloc] initWithImageSlices: [ [[CPImage alloc] initWithContentsOfFile:[bundle pathForResource:@"CPWindow/CPWindowShadow0.png"] size:CGSizeMake(20.0, 19.0)], [[CPImage alloc] initWithContentsOfFile:[bundle pathForResource:@"CPWindow/CPWindowShadow1.png"] size:CGSizeMake(1.0, 19.0)], [[CPImage alloc] initWithContentsOfFile:[bundle pathForResource:@"CPWindow/CPWindowShadow2.png"] size:CGSizeMake(19.0, 19.0)], - + [[CPImage alloc] initWithContentsOfFile:[bundle pathForResource:@"CPWindow/CPWindowShadow3.png"] size:CGSizeMake(20.0, 1.0)], [[CPImage alloc] initWithContentsOfFile:[bundle pathForResource:@"CPWindow/CPWindowShadow4.png"] size:CGSizeMake(1.0, 1.0)], [[CPImage alloc] initWithContentsOfFile:[bundle pathForResource:@"CPWindow/CPWindowShadow5.png"] size:CGSizeMake(19.0, 1.0)], - + [[CPImage alloc] initWithContentsOfFile:[bundle pathForResource:@"CPWindow/CPWindowShadow6.png"] size:CGSizeMake(20.0, 18.0)], [[CPImage alloc] initWithContentsOfFile:[bundle pathForResource:@"CPWindow/CPWindowShadow7.png"] size:CGSizeMake(1.0, 18.0)], [[CPImage alloc] initWithContentsOfFile:[bundle pathForResource:@"CPWindow/CPWindowShadow8.png"] size:CGSizeMake(19.0, 18.0)] @@ -1249,33 +1253,33 @@ CPTexturedBackgroundWindowMask case CPLeftMouseUp: if (!_leftMouseDownView) return [[_windowView hitTest:point] mouseUp:anEvent]; - + [_leftMouseDownView mouseUp:anEvent] - + _leftMouseDownView = nil; - + return; case CPLeftMouseDown: _leftMouseDownView = [_windowView hitTest:point]; if (_leftMouseDownView != _firstResponder && [_leftMouseDownView acceptsFirstResponder]) [self makeFirstResponder:_leftMouseDownView]; - + var theWindow = [anEvent window]; - + if ([theWindow isKeyWindow] || [theWindow becomesKeyOnlyIfNeeded]) return [_leftMouseDownView mouseDown:anEvent]; else { // FIXME: delayed ordering? [self makeKeyAndOrderFront:self]; - + if ([_leftMouseDownView acceptsFirstMouse:anEvent]) return [_leftMouseDownView mouseDown:anEvent] } break; case CPLeftMouseDragged: if (!_leftMouseDownView) return [[_windowView hitTest:point] mouseDragged:anEvent]; - + return [_leftMouseDownView mouseDragged:anEvent]; case CPRightMouseUp: return [_rightMouseDownView mouseUp:anEvent]; @@ -1574,6 +1578,53 @@ CPTexturedBackgroundWindowMask } } +// Minimizing Windows + +/*! + Simulates the user minimizing the window, then minimizes the window. + @param aSender the object making this request +*/ +- (void)performMiniaturize:(id)aSender +{ + //FIXME show stuff + [self miniaturize:aSender]; +} + +/*! + Minimizes the window. Posts a \c CPWindowWillMiniaturizeNotification to the + notification center before minimizing the window. +*/ +- (void)miniaturize:(id)sender +{ + [[CPNotificationCenter defaultCenter] postNotificationName:CPWindowWillMiniaturizeNotification object:self]; + + [[self platformWindow] miniaturize:sender]; + + [[CPNotificationCenter defaultCenter] postNotificationName:CPWindowDidMiniaturizeNotification object:self]; + + _isMiniaturized = YES; +} + +/*! + Restores a mimized window to it's original size. +*/ +- (void)deminiaturize:(id)sender +{ + [[self platformWindow] deminiaturize:sender]; + + [[CPNotificationCenter defaultCenter] postNotificationName:CPWindowDidDeminiaturizeNotification object:self]; + + _isMiniaturized = NO; +} + +/*! + Returns YES if the window is minimized. +*/ +- (void)isMiniaturized +{ + return _isMiniaturized; +} + // Closing Windows /*! @@ -1806,7 +1857,7 @@ CPTexturedBackgroundWindowMask var sheetContent = [sheet contentView]; [self _setUpMasksForView:sheetContent]; - + _sheetContext["opened"] = NO; [sheet _setFrame:endFrame delegate:self duration:0.2 curve:CPAnimationEaseIn]; } diff --git a/AppKit/CPWindow/_CPStandardWindowView.j b/AppKit/CPWindow/_CPStandardWindowView.j index c88da796b..5b100a2cc 100644 --- a/AppKit/CPWindow/_CPStandardWindowView.j +++ b/AppKit/CPWindow/_CPStandardWindowView.j @@ -98,7 +98,9 @@ var _CPStandardWindowViewBodyBackgroundColor = nil, _CPStandardWindowViewDividerBackgroundColor = nil, _CPStandardWindowViewTitleBackgroundColor = nil, _CPStandardWindowViewCloseButtonImage = nil, - _CPStandardWindowViewCloseButtonHighlightedImage = nil; + _CPStandardWindowViewCloseButtonHighlightedImage = nil, + _CPStandardWindowViewMinimizeButtonImage = nil, + _CPStandardWindowViewMinimizeButtonHighlightedImage = nil; var STANDARD_GRADIENT_HEIGHT = 41.0; STANDARD_TITLEBAR_HEIGHT = 25.0; @@ -112,6 +114,7 @@ var STANDARD_GRADIENT_HEIGHT = 41.0; CPTextField _titleField; CPButton _closeButton; + CPButton _minimizeButton; } + (CPColor)bodyBackgroundColor @@ -230,7 +233,7 @@ var STANDARD_GRADIENT_HEIGHT = 41.0; [_bodyView setHitTests:NO]; [self addSubview:_bodyView]; - + [self setResizeIndicatorOffset:CGSizeMake(2.0, 2.0)]; _titleField = [[CPTextField alloc] initWithFrame:CGRectMakeZero()]; @@ -256,24 +259,44 @@ var STANDARD_GRADIENT_HEIGHT = 41.0; if (!_CPStandardWindowViewCloseButtonImage) { var bundle = [CPBundle bundleForClass:[CPWindow class]]; - + _CPStandardWindowViewCloseButtonImage = [[CPImage alloc] initWithContentsOfFile:[bundle pathForResource:@"CPWindow/Standard/CPWindowStandardCloseButton.png"] size:CGSizeMake(16.0, 16.0)]; _CPStandardWindowViewCloseButtonHighlightedImage = [[CPImage alloc] initWithContentsOfFile:[bundle pathForResource:@"CPWindow/Standard/CPWindowStandardCloseButtonHighlighted.png"] size:CGSizeMake(16.0, 16.0)]; } - + _closeButton = [[CPButton alloc] initWithFrame:CGRectMake(8.0, 7.0, 16.0, 16.0)]; - + [_closeButton setBordered:NO]; - + [_closeButton setImage:_CPStandardWindowViewCloseButtonImage]; [_closeButton setAlternateImage:_CPStandardWindowViewCloseButtonHighlightedImage]; - + [self addSubview:_closeButton]; } - + + if (_styleMask & CPMiniaturizableWindowMask && ![CPPlatform isBrowser]) + { + if (!_CPStandardWindowViewMinimizeButtonImage) + { + var bundle = [CPBundle bundleForClass:[CPWindow class]]; + + _CPStandardWindowViewMinimizeButtonImage = [[CPImage alloc] initWithContentsOfFile:[bundle pathForResource:@"CPWindow/Standard/CPWindowStandardMinimizeButton.png"] size:CGSizeMake(16.0, 16.0)]; + _CPStandardWindowViewMinimizeButtonHighlightedImage = [[CPImage alloc] initWithContentsOfFile:[bundle pathForResource:@"CPWindow/Standard/CPWindowStandardMinimizeButtonHighlighted.png"] size:CGSizeMake(16.0, 16.0)]; + } + + _minimizeButton = [[CPButton alloc] initWithFrame:CGRectMake(27.0, 7.0, 16.0, 16.0)]; + + [_minimizeButton setBordered:NO]; + + [_minimizeButton setImage:_CPStandardWindowViewMinimizeButtonImage]; + [_minimizeButton setAlternateImage:_CPStandardWindowViewMinimizeButtonHighlightedImage]; + + [self addSubview:_minimizeButton]; + } + [self tile]; } - + return self; } @@ -281,6 +304,9 @@ var STANDARD_GRADIENT_HEIGHT = 41.0; { [_closeButton setTarget:[self window]]; [_closeButton setAction:@selector(performClose:)]; + + [_minimizeButton setTarget:[self window]]; + [_minimizeButton setAction:@selector(performMiniaturize:)]; } - (CGSize)toolbarOffset @@ -303,7 +329,14 @@ var STANDARD_GRADIENT_HEIGHT = 41.0; [_bodyView setFrame:CGRectMake(0.0, dividerMaxY, width, CGRectGetHeight(bounds) - dividerMaxY)]; - [_titleField setFrame:CGRectMake(10.0, 3.0, width - 20.0, CGRectGetHeight([_titleField frame]))]; + var leftOffset = 8; + + if (_closeButton) + leftOffset += 19.0; + if (_minimizeButton) + leftOffset += 19.0; + + [_titleField setFrame:CGRectMake(leftOffset, 5.0, width - leftOffset*2.0, CGRectGetHeight([_titleField frame]))]; [[theWindow contentView] setFrameOrigin:CGPointMake(0.0, CGRectGetMaxY([_dividerView frame]))]; } diff --git a/AppKit/Platform/CPPlatformWindow.j b/AppKit/Platform/CPPlatformWindow.j index c0194a7f9..5ad005aad 100644 --- a/AppKit/Platform/CPPlatformWindow.j +++ b/AppKit/Platform/CPPlatformWindow.j @@ -149,6 +149,22 @@ var PrimaryPlatformWindow = NULL; #endif } +- (void)deminiaturize:(id)sender +{ +#if PLATFORM(DOM) + if (_DOMWindow && typeof _DOMWindow["cpDeminiaturize"] === "function") + _DOMWindow.cpDeminiaturize(); +#endif +} + +- (void)miniaturize:(id)sender +{ +#if PLATFORM(DOM) + if (_DOMWindow && typeof _DOMWindow["cpMiniaturize"] === "function") + _DOMWindow.cpMiniaturize(); +#endif +} + - (void)setLevel:(CPInteger)aLevel { _level = aLevel; diff --git a/AppKit/Resources/CPWindow/Standard/CPWindowStandardCloseButtonUnsaved.png b/AppKit/Resources/CPWindow/Standard/CPWindowStandardCloseButtonUnsaved.png new file mode 100644 index 0000000000000000000000000000000000000000..2cb0e49295e36af48f14368fef07f3e21ab00452 GIT binary patch literal 720 zcmV;>0x$iEP)}ssEteEZXTZ2n1cZaN(@l2}1i8QAm{FHo}ehD@Ug*x_3BL6-Q5*` zuRtIm_w+nC^B{bU0#*bx{p_?%oBvyS9*)D?u}VMN+uIjtpsYZ&TCIPG-EMcY&s>+w zb-_4$aN+fOKcAeO#JI^uQGneJhr`lQr_&L`;ZV5U?u`gJ;9gSTTPzlPjr-l>Tu=ax zWY=-Mvbx=FXGJN_>%%8?IS35|?xNB@?Qw9{Hl+Z+d2W3sklQ4OTscVi@B2#iAbBW{|sHEaS=}lhx ze7^7Tc>E3e@EoCcz@$_vEtO)iD2E3RL=F|eUfcq1@)4~Kobn=o_dpx?S}vF8C?HJw zj2|5xEi#!56Mq1o)?)Uxz)w0Pk)22GiX3u(2`~U33=h7fee4JT0000DFd#Y|?~)!Jq*}3Be|jfQ1l?=)xueHA>Xc z-1BfGWFH)cdH0@k?>+YknM{T$r&g;8^?Kbp91fpvHk&8g?bd^PtycR*uh+MHKHtl9 zI(?VTW{(O-{D&--N~OeXHhZ<(?d&R*imBCV9+PGHYOz>c^?JRhlgZ>6<-Q@2Jz}a8 zSyL{TbJOYc_2F=^Q$vFjaD=kBS0xTMhp3RNNxBD6#aMknqoFx*8&8d@HkH;fZn-A&bNvqY0n{2n+WtYqKE168b zb2uC~boHL_J)h6ZLN1r%Emx~m{-_A>B0z8vE>8{I621~X5=Mj{g+gHmqeYm4Ct55P y_mxToi3`H`B=+DW@EaY12>&LZOKCV^;tKXT5* zPqxXxVTL>RoVn-Dj8Z5Rgf{Z|yi%{%-MwD#<#M@vv|g{z7&jOUUrZ)bBNPgi&d<+p zipAnydKgcAipaw?UQ0<~IA zimX;E2?#Bd$>f7rEY@Xt)^4}^3O-F1i$&OMHVKNHo}Nl@t;LzcTyn^z7x!YZNSMuL zVYONXXC#Q(Y<6re?T|=os`{^Oad`5ZJNX^i7Zd8{A_KE$wzYcGx1X!{KnuP=$l*Mx!AnlL=1{7Z(?jST2_Z-hr^& z?XnNF;dDBsM+(e*K3^YK7@;z4FmXDa9#8goJmTc!MD~JUCFEdhPJy41NaXE!JPt!y z)vl1E-|x$rWQy`C`4%9uBZpkJ^ad6_Akc=d{GL1Bh;wQmG_6oXuwCqXNRfL*O3ZJ5+uRd<8xNUEl}*fwaocak$?N vPG#b6;M+mWb`bc(3Q1(=k$e2ke+3u-lco+t)xdJ<00000NkvXXu0mjfSKCiX literal 0 HcmV?d00001 diff --git a/AppKit/Resources/CPWindow/Standard/CPWindowStandardMaximizeButtonHighlighted.png b/AppKit/Resources/CPWindow/Standard/CPWindowStandardMaximizeButtonHighlighted.png new file mode 100644 index 0000000000000000000000000000000000000000..77f0a58adfc0d284d307de6e91796d48d43c0557 GIT binary patch literal 722 zcmV;@0xkWCP)NEoBhXeg(rr~b>!%jeVS^y%H*U6lJao9&C!>HN62 zxA!WYPTyv;*`>iz3;~cW#bPmWeSKY>&1R2GCX={77K??jTCJl%AaHzga`Fx$^R)oT z)^fT0Y&aZN&1SP8D4-~cBrlgsDWL1R#P06yaiLInjrdGKP&qq0Q=84^1vcy!i$xG5 z=ks|fP^;CX$b3GR!1_-rmD)czIOwuZ*ZKK*0Tt~S!r^cToR{s2a5yZ%HTM`}4s*#N z*McAacs!27C>i9;Bf!A*`T5`2H@qQ-TnhN$_%_LGJ(J0ZP$=||fu&MO&R17g^h+KG zM*Fe#fC5gmwt%{nzF+zOVZ>O7-jPcI;q`j8$z(U7*udgRr_*`aYPI%_H^B44X(_{`E*C@++B4e%RUBd4t?fz;}r1N-md^?Nurj`KSODhyf8`d*$N|&<8p|7x=;N zKwc?75}peibF|IG-@srcwy_eJutO5*JaX5c^Iri509O_gBI7VVwg3PC07*qoM6N<$ Ef}&MmB>(^b literal 0 HcmV?d00001 diff --git a/AppKit/Resources/CPWindow/Standard/CPWindowStandardMinimizeButton.png b/AppKit/Resources/CPWindow/Standard/CPWindowStandardMinimizeButton.png new file mode 100644 index 0000000000000000000000000000000000000000..9b462b25b3a2b67bd71ecd740155906871abdefa GIT binary patch literal 661 zcmV;G0&4w&t^F8hzrO{{z`_$`orQh$zrqk)0&1Umrx7%eIcez|&G))_1GMQGTQn_w6 zn+IE?-Vi%=U4J>5OfFZe)oX;FxZQ4*;BUs5BZu6RfublByL!FetNDEX9{-abk4JdD z-dkXdIdaIQhFaxtI4I-s_-r^FUO1gj4HX69a5#jj{%g>(EMc0a*lxEH`~7}XE|;Gc z3I&45j)2w$7W7wD64|YHkg<5$Xp-^ZE zVaRT8Fc^r%Vj<0VI1V@>5{bwW*kw2zUNT36Wg?OIKAX*Qc9KLcjum-$U5v9j+b542 zq*gTemCNNmV8%1P3nsab`wk6hfQ~F`sAbRBXzvpOV+YUK#PB%My{sO-jf zkj28}3%y$%BUssN)<~sNIyKZfIBT(3T+uBU3|=8=g8T@TG+dQ>T(X%=CV%Ji`SWNr z`VOIwz>jvjZ7Qu+OW;crwOUO+DuBCq20R85#|Ex|ufS)(0Dg8logE4Yr+x3;Zg*d; vR!Lj{-;QSfqro3`NFg^5?tvO={|Ybw^34!t{dyk)00000NkvXXu0mjf-|-xh literal 0 HcmV?d00001 diff --git a/AppKit/Resources/CPWindow/Standard/CPWindowStandardMinimizeButtonHighlighted.png b/AppKit/Resources/CPWindow/Standard/CPWindowStandardMinimizeButtonHighlighted.png new file mode 100644 index 0000000000000000000000000000000000000000..d4136ec3847c90db293e446e89d447e8124cd556 GIT binary patch literal 683 zcmV;c0#yBpP)R7`DlSgU)^D+VF0Sb1r7<} zf*p@X4$}P1=kt%#>9huhdpsV$AhL>TPN$Pmza02~_Zu8=p@9}N2&~uZl(39nR0qfr zcR&@n1FI`&phbcQH1P|oxL7Q*NF>6nXEvL$Ua!YFNJxVYQ20I)xX7AGLK(fIUs@l# zdk}*V9Js;kpyg}y`~CWMyY&fsolb}8y3UjFRZ-mSb~BI1!^C=hKA$e$flhXRXqxs2 zJ)?rx>*YhU9dlTZZ}0W^ofdAASN7w3k|f0+y;ZekC{wng6#i0 z;D8Gaw7dnvmt->8A?uF8U=XJj$zp|8A>Es)R7#7*VjXCpwJn!Rmd$2&XD2uDc-)}j zJ)}vio6UxM4uwKSG#dSr%jMpM!{OHy`at+utyT@GQmOF%+U+)fRD>8INr)0I&IWD> z-w2-w8sS&1Ry$y|3RZ>pU9Z=VtyT-f72*3i*}ZduEgV9K$rJYk4YdCR7yzN06IVRX Rc?bXi002ovPDHLkV1mlJHS7QY literal 0 HcmV?d00001