ac2a5f7c44119251b9c89c0ab1cb6a7a7cbf1fe6
[WebKit.git] / Source / WebKitLegacy / mac / Carbon / CarbonWindowFrame.m
1 /*
2  * Copyright (C) 2005 Apple 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 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 #pragma clang diagnostic push
254 #pragma clang diagnostic ignored "-Wcast-qual"
255         windowTitleAsNSString = (NSString *)windowTitle;
256 #pragma clang diagnostic pop
257     } else {
258         NSLog(@"A Carbon window's title couldn't be gotten.");
259         windowTitleAsNSString = @"";
260     }
261     return [windowTitleAsNSString autorelease];
262
263 }
264
265
266 // Return what's asked for.
267 - (float)_sheetHeightAdjustment {
268
269     // Do what NSThemeFrame would do.
270     return 22;//[NSThemeFrame _titlebarHeight:([self styleMask] & ~NSDocModalWindowMask)];
271     
272 }
273
274 // Return what's asked for.
275 - (float)_maxTitlebarTitleRect {
276
277     // Do what NSThemeFrame would do.
278     return 22;//[NSThemeFrame _titlebarHeight:([self styleMask] & ~NSDocModalWindowMask)];
279     
280 }
281
282 - (void)_clearDragMargins {
283 }
284
285 - (void)_resetDragMargins {
286 }
287
288 - (NSColor *)contentFill
289 {
290     return [NSColor clearColor];
291 }
292
293 @end // implementation NSCarbonWindowFrame
294
295 #endif