/* * _CPHUDWindowView.j * AppKit * * Created by Francisco Tolmasky. * Copyright 2008, 280 North, Inc. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ @import "CPTextField.j" @import "_CPTitleableWindowView.j" // var _CPHUDWindowViewBackgroundColor = nil, // _CPHUDWindowViewThemeValues = nil, // // CPHUDCloseButtonImage = nil; var HUD_TITLEBAR_HEIGHT = 26.0; @implementation _CPHUDWindowView : _CPTitleableWindowView { CPView _toolbarView; CPButton _closeButton; } + (CPString)defaultThemeClass { return @"hud-window-view"; } // + (void)initialize // { // if (self !== [_CPHUDWindowView class]) // return; // // var bundle = [CPBundle bundleForClass:self]; // // _CPHUDWindowViewBackgroundColor = [CPColor colorWithPatternImage:[[CPNinePartImage alloc] initWithImageSlices: // [ // [[CPImage alloc] initWithContentsOfFile:[bundle pathForResource:@"CPWindow/HUD/CPWindowHUDBackground0.png"] size:CPSizeMake(7.0, 37.0)], // [[CPImage alloc] initWithContentsOfFile:[bundle pathForResource:@"CPWindow/HUD/CPWindowHUDBackground1.png"] size:CPSizeMake(1.0, 37.0)], // [[CPImage alloc] initWithContentsOfFile:[bundle pathForResource:@"CPWindow/HUD/CPWindowHUDBackground2.png"] size:CPSizeMake(7.0, 37.0)], // // [[CPImage alloc] initWithContentsOfFile:[bundle pathForResource:@"CPWindow/HUD/CPWindowHUDBackground3.png"] size:CPSizeMake(7.0, 1.0)], // [[CPImage alloc] initWithContentsOfFile:[bundle pathForResource:@"CPWindow/HUD/CPWindowHUDBackground4.png"] size:CPSizeMake(2.0, 2.0)], // [[CPImage alloc] initWithContentsOfFile:[bundle pathForResource:@"CPWindow/HUD/CPWindowHUDBackground5.png"] size:CPSizeMake(7.0, 1.0)], // // [[CPImage alloc] initWithContentsOfFile:[bundle pathForResource:@"CPWindow/HUD/CPWindowHUDBackground6.png"] size:CPSizeMake(7.0, 3.0)], // [[CPImage alloc] initWithContentsOfFile:[bundle pathForResource:@"CPWindow/HUD/CPWindowHUDBackground7.png"] size:CPSizeMake(1.0, 3.0)], // [[CPImage alloc] initWithContentsOfFile:[bundle pathForResource:@"CPWindow/HUD/CPWindowHUDBackground8.png"] size:CPSizeMake(7.0, 3.0)] // ]]]; // // _CPHUDWindowViewCloseImage = [[CPImage alloc] initWithContentsOfFile:[bundle pathForResource:@"HUDTheme/WindowClose.png"] size:CPSizeMake(18.0, 18.0)]; // _CPHUDWindowViewCloseActiveImage = [[CPImage alloc] initWithContentsOfFile:[bundle pathForResource:@"HUDTheme/WindowCloseActive.png"] size:CPSizeMake(18.0, 18.0)]; // // _CPHUDWindowViewThemeValues = [ // [@"title-font", [CPFont systemFontOfSize:[CPFont systemFontSize] - 1]], // [@"title-text-color", [CPColor colorWithWhite:255.0 / 255.0 alpha:0.75]], // [@"title-text-color", [CPColor colorWithWhite:255.0 / 255.0 alpha:1], CPThemeStateKeyWindow], // [@"title-text-shadow-color", [CPColor blackColor]], // [@"title-text-shadow-offset", CGSizeMake(0.0, 1.0)], // [@"title-alignment", CPCenterTextAlignment], // // FIXME: Make this to CPLineBreakByTruncatingMiddle once it's implemented. // [@"title-line-break-mode", CPLineBreakByTruncatingTail], // [@"title-vertical-alignment", CPCenterVerticalTextAlignment] // ]; // } + (int)titleBarHeight { return HUD_TITLEBAR_HEIGHT; } - (CGRect)contentRectForFrameRect:(CGRect)aFrameRect { var contentRect = [[self class] contentRectForFrameRect:aFrameRect]; if ([[[self window] toolbar] isVisible]) { var toolbarHeight = CGRectGetHeight([[self toolbarView] frame]); contentRect.origin.y += toolbarHeight; contentRect.size.height -= toolbarHeight; } return contentRect; } - (CGRect)frameRectForContentRect:(CGRect)aContentRect { var frameRect = [[self class] frameRectForContentRect:aContentRect]; if ([[[self window] toolbar] isVisible]) { var toolbarHeight = CGRectGetHeight([[self toolbarView] frame]); frameRect.origin.y -= toolbarHeight; frameRect.size.height += toolbarHeight; } return frameRect; } - (id)initWithFrame:(CPRect)aFrame styleMask:(unsigned)aStyleMask { self = [super initWithFrame:aFrame styleMask:aStyleMask]; if (self) { // Until windows become properly themable, just set these values here in the subclass. //[self registerThemeValues:_CPHUDWindowViewThemeValues]; var bounds = [self bounds]; // [self setBackgroundColor:[self valueForThemeAttribute:@"bezel-color"]]; if (_styleMask & CPClosableWindowMask) { _closeButton = [[CPButton alloc] initWithFrame:CGRectMakeZero()]; [_closeButton setBordered:NO]; // [_closeButton setImage:[self valueForThemeAttribute:@"close-image"]]; // [_closeButton setAlternateImage:[self valueForThemeAttribute:@"close-active-image"]]; [self addSubview:_closeButton]; } [self setResizeIndicatorOffset:CGSizeMake(5.0, 5.0)]; [self tile]; } return self; } - (void)viewDidMoveToWindow { [_closeButton setTarget:[self window]]; [_closeButton setAction:@selector(performClose:)]; } - (_CPToolbarView)toolbarView { return _toolbarView; } - (CPColor)toolbarLabelColor { return [CPColor whiteColor]; } - (CPColor)toolbarLabelShadowColor { return [CPColor blackColor]; } - (CGSize)toolbarOffset { return _CGSizeMake(0.0, [[self class] titleBarHeight]); } - (void)tile { [super tile]; var theWindow = [self window], bounds = [self bounds], width = _CGRectGetWidth(bounds); [_titleField setFrame:_CGRectMake(20.0, 0, width - 40.0, [self toolbarOffset].height)]; var maxY = [self toolbarMaxY]; if ([_titleField isHidden]) maxY -= ([self toolbarOffset]).height; var contentRect = _CGRectMake(0.0, maxY, width, _CGRectGetHeight(bounds) - maxY); [[theWindow contentView] setFrame:contentRect]; } - (void)_enableSheet:(BOOL)enable { [super _enableSheet:enable]; [_closeButton setHidden:enable]; [_titleField setHidden:enable]; // resize the window var theWindow = [self window], frame = [theWindow frame], dy = ([self toolbarOffset]).height; if (enable) dy = -dy; var newHeight = _CGRectGetMaxY(frame) + dy, newWidth = _CGRectGetMaxX(frame); frame.size.height += dy; [self setFrameSize:_CGSizeMake(newWidth, newHeight)]; [self tile]; [theWindow setFrame:frame display:NO animate:NO]; [theWindow setMovableByWindowBackground:!enable]; } - (void)layoutSubviews { [super layoutSubviews]; if (_styleMask & CPClosableWindowMask) { [_closeButton setFrameOrigin:[self valueForThemeAttribute:@"close-image-origin"]]; [_closeButton setFrameSize:[self valueForThemeAttribute:@"close-image-size"]] [_closeButton setImage:[self valueForThemeAttribute:@"close-image"]]; [_closeButton setAlternateImage:[self valueForThemeAttribute:@"close-active-image"]]; } } @end