Home | History | Annotate | Download | only in Carbon
      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