1 /* 2 * Copyright (C) 2005 Apple Computer, Inc. All rights reserved. 3 * 4 * Redistribution and use in source and binary forms, with or without 5 * modification, are permitted provided that the following conditions 6 * are met: 7 * 8 * 1. Redistributions of source code must retain the above copyright 9 * notice, this list of conditions and the following disclaimer. 10 * 2. Redistributions in binary form must reproduce the above copyright 11 * notice, this list of conditions and the following disclaimer in the 12 * documentation and/or other materials provided with the distribution. 13 * 3. Neither the name of Apple Computer, Inc. ("Apple") nor the names of 14 * its contributors may be used to endorse or promote products derived 15 * from this software without specific prior written permission. 16 * 17 * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY 18 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 19 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 20 * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY 21 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 22 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 23 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND 24 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 25 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 26 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 27 */ 28 29 #ifndef __LP64__ 30 31 #import "CarbonWindowFrame.h" 32 #import "CarbonWindowAdapter.h" 33 #import "CarbonWindowContentView.h" 34 #import <Foundation/NSGeometry.h> 35 #import <Foundation/NSString.h> 36 #import <HIToolbox/MacWindows.h> 37 38 #import "WebTypesInternal.h" 39 40 @interface NSView(Secret) 41 - (void)_setWindow:(NSWindow *)window; 42 @end 43 44 @class NSButton; 45 /* 46 47 @interface NSThemeFrame(NSHijackedClassMethods) 48 49 + (float)_titlebarHeight:(unsigned int)style; 50 51 @end 52 */ 53 54 @implementation CarbonWindowFrame 55 56 57 - (NSRect)titlebarRect 58 { 59 NSRect titlebarRect; 60 NSRect boundsRect; 61 62 boundsRect = [self bounds]; 63 64 CarbonWindowAdapter *carbonWindow; 65 carbonWindow = (CarbonWindowAdapter *)[self window]; 66 WindowRef windowRef = [carbonWindow windowRef]; 67 Rect globalBounds; 68 GetWindowBounds (windowRef, kWindowTitleBarRgn, &globalBounds); 69 70 titlebarRect.origin.x = boundsRect.origin.x; 71 titlebarRect.size.width = boundsRect.size.width; 72 titlebarRect.size.height = globalBounds.bottom - globalBounds.top; 73 titlebarRect.origin.y = NSMaxY(boundsRect) - titlebarRect.size.height; 74 75 return titlebarRect; 76 } 77 78 // Given a content rectangle and style mask, return a corresponding frame rectangle. 79 + (NSRect)frameRectForContentRect:(NSRect)contentRect styleMask:(NSUInteger)style { 80 81 // We don't bother figuring out a good value, because content rects weren't so meaningful for NSCarbonWindows in the past, but this might not be a good assumption anymore. M.P. Warning - 12/5/00 82 return contentRect; 83 84 } 85 86 + (NSRect)contentRectForFrameRect:(NSRect)frameRect styleMask:(NSUInteger)style { 87 88 // We don't bother figuring out a good value, because content rects weren't so meaningful for NSCarbonWindows in the past, but this might not be a good assumption anymore. KW - copied from +frameRectForContentRect:styleMask 89 return frameRect; 90 91 } 92 93 + (NSSize)minFrameSizeForMinContentSize:(NSSize)cSize styleMask:(NSUInteger)style { 94 // See comments above. We don't make any assumptions about the relationship between content rects and frame rects 95 return cSize; 96 } 97 98 - (NSRect)frameRectForContentRect:(NSRect)cRect styleMask:(NSUInteger)style { 99 return [[self class] frameRectForContentRect: cRect styleMask:style]; 100 } 101 - (NSRect)contentRectForFrameRect:(NSRect)fRect styleMask:(NSUInteger)style { 102 return [[self class] contentRectForFrameRect: fRect styleMask:style]; 103 } 104 - (NSSize)minFrameSizeForMinContentSize:(NSSize)cSize styleMask:(NSUInteger)style { 105 return [[self class] minFrameSizeForMinContentSize:cSize styleMask: style]; 106 } 107 108 // Initialize. 109 - (id)initWithFrame:(NSRect)inFrameRect styleMask:(unsigned int)inStyleMask owner:(NSWindow *)inOwningWindow { 110 111 // Parameter check. 112 if (![inOwningWindow isKindOfClass:[CarbonWindowAdapter class]]) NSLog(@"CarbonWindowFrames can only be owned by CarbonWindowAdapters."); 113 114 // Do the standard Cocoa thing. 115 self = [super initWithFrame:inFrameRect]; 116 if (!self) return nil; 117 118 // Record what we'll need later. 119 _styleMask = inStyleMask; 120 121 // Do what NSFrameView's method of the same name does. 122 [self _setWindow:inOwningWindow]; 123 [self setNextResponder:inOwningWindow]; 124 125 // Done. 126 return self; 127 128 } 129 130 131 // Deallocate. 132 - (void)dealloc { 133 134 // Simple. 135 [super dealloc]; 136 137 } 138 139 140 // Sink a method invocation. 141 - (void)_setFrameNeedsDisplay:(BOOL)needsDisplay { 142 143 } 144 145 146 // Sink a method invocation. 147 - (void)_setSheet:(BOOL)sheetFlag { 148 149 } 150 151 152 // Sink a method invocation. 153 - (void)_updateButtonState { 154 155 } 156 157 #if 0 158 // Sink a method invocation. 159 - (void)_windowChangedKeyState { 160 } 161 #endif 162 163 // Toolbar methods that NSWindow expects to be there. 164 - (BOOL)_canHaveToolbar { return NO; } 165 - (BOOL)_toolbarIsInTransition { return NO; } 166 - (BOOL)_toolbarIsShown { return NO; } 167 - (BOOL)_toolbarIsHidden { return NO; } 168 - (void)_showToolbarWithAnimation:(BOOL)animate {} 169 - (void)_hideToolbarWithAnimation:(BOOL)animate {} 170 - (float)_distanceFromToolbarBaseToTitlebar { return 0; } 171 172 173 // Refuse to admit there's a close button on the window. 174 - (NSButton *)closeButton { 175 176 // Simple. 177 return nil; 178 } 179 180 181 // Return what's asked for. 182 - (unsigned int)styleMask { 183 184 // Simple. 185 return _styleMask; 186 187 } 188 189 190 // Return what's asked for. 191 - (NSRect)dragRectForFrameRect:(NSRect)frameRect { 192 193 // Do what NSThemeFrame would do. 194 // If we just return NSZeroRect here, _NXMakeWindowVisible() gets all befuddled in the sheet-showing case, a window-moving loop is entered, and the sheet gets moved right off of the screen. M.P. Warning - 3/23/01 195 NSRect dragRect; 196 dragRect.size.height = 27;//[NSThemeFrame _titlebarHeight:[self styleMask]]; 197 dragRect.origin.y = NSMaxY(frameRect) - dragRect.size.height; 198 dragRect.size.width = frameRect.size.width; 199 dragRect.origin.x = frameRect.origin.x; 200 return dragRect; 201 202 } 203 204 205 // Return what's asked for. 206 - (BOOL)isOpaque { 207 208 // Return a value that will make -[NSWindow displayIfNeeded] on our Carbon window actually work. 209 return YES; 210 211 } 212 213 214 // Refuse to admit there's a minimize button on the window. 215 - (NSButton *)minimizeButton { 216 217 // Simple. 218 return nil; 219 220 } 221 222 223 // Do the right thing for a Carbon window. 224 - (void)setTitle:(NSString *)title { 225 226 CarbonWindowAdapter *carbonWindow; 227 OSStatus osStatus; 228 WindowRef windowRef; 229 230 // Set the Carbon window's title. 231 carbonWindow = (CarbonWindowAdapter *)[self window]; 232 windowRef = [carbonWindow windowRef]; 233 osStatus = SetWindowTitleWithCFString(windowRef, (CFStringRef)title); 234 if (osStatus!=noErr) NSLog(@"A Carbon window's title couldn't be set."); 235 236 } 237 238 239 // Return what's asked for. 240 - (NSString *)title { 241 242 CFStringRef windowTitle; 243 CarbonWindowAdapter *carbonWindow; 244 NSString *windowTitleAsNSString; 245 OSStatus osStatus; 246 WindowRef windowRef; 247 248 // Return the Carbon window's title. 249 carbonWindow = (CarbonWindowAdapter *)[self window]; 250 windowRef = [carbonWindow windowRef]; 251 osStatus = CopyWindowTitleAsCFString(windowRef, &windowTitle); 252 if (osStatus==noErr) { 253 windowTitleAsNSString = (NSString *)windowTitle; 254 } else { 255 NSLog(@"A Carbon window's title couldn't be gotten."); 256 windowTitleAsNSString = @""; 257 } 258 return [windowTitleAsNSString autorelease]; 259 260 } 261 262 263 // Return what's asked for. 264 - (float)_sheetHeightAdjustment { 265 266 // Do what NSThemeFrame would do. 267 return 22;//[NSThemeFrame _titlebarHeight:([self styleMask] & ~NSDocModalWindowMask)]; 268 269 } 270 271 // Return what's asked for. 272 - (float)_maxTitlebarTitleRect { 273 274 // Do what NSThemeFrame would do. 275 return 22;//[NSThemeFrame _titlebarHeight:([self styleMask] & ~NSDocModalWindowMask)]; 276 277 } 278 279 - (void)_clearDragMargins { 280 } 281 282 - (void)_resetDragMargins { 283 } 284 285 286 @end // implementation NSCarbonWindowFrame 287 288 #endif 289