src/macosx/native/sun/awt/AWTWindow.m
Print this page
@@ -38,45 +38,25 @@
#import "LWCToolkit.h"
#import "GeomUtilities.h"
#import "ThreadUtilities.h"
#import "OSVersion.h"
-
#define MASK(KEY) \
(sun_lwawt_macosx_CPlatformWindow_ ## KEY)
#define IS(BITS, KEY) \
((BITS & MASK(KEY)) != 0)
#define SET(BITS, KEY, VALUE) \
BITS = VALUE ? BITS | MASK(KEY) : BITS & ~MASK(KEY)
-
static JNF_CLASS_CACHE(jc_CPlatformWindow, "sun/lwawt/macosx/CPlatformWindow");
-@interface JavaResizeGrowBoxOverlayWindow : NSWindow { }
-
-@end
-
-@implementation JavaResizeGrowBoxOverlayWindow
-
-- (BOOL) accessibilityIsIgnored
-{
- return YES;
-}
-
-- (NSArray *)accessibilityChildrenAttribute
-{
- return nil;
-}
-@end
-
@implementation AWTWindow
@synthesize javaPlatformWindow;
@synthesize javaMenuBar;
-@synthesize growBoxWindow;
@synthesize javaMinSize;
@synthesize javaMaxSize;
@synthesize styleBits;
- (void) updateMinMaxSize:(BOOL)resizable {
@@ -152,28 +132,10 @@
}
}
}
-- (BOOL) shouldShowGrowBox {
- return isSnowLeopardOrLower() && IS(self.styleBits, RESIZABLE);
-}
-
-- (NSImage *) createGrowBoxImage {
- NSImage *image = [[NSImage alloc] initWithSize:NSMakeSize(12, 12)];
- JRSUIControlRef growBoxWidget = JRSUIControlCreate(FALSE);
- JRSUIControlSetWidget(growBoxWidget, kJRSUI_Widget_growBoxTextured);
- JRSUIControlSetWindowType(growBoxWidget, kJRSUI_WindowType_utility);
- JRSUIRendererRef renderer = JRSUIRendererCreate();
- [image lockFocus]; // sets current graphics context to that of the image
- JRSUIControlDraw(renderer, growBoxWidget, [[NSGraphicsContext currentContext] graphicsPort], CGRectMake(0, 1, 11, 11));
- [image unlockFocus];
- JRSUIRendererRelease(renderer);
- JRSUIControlRelease(growBoxWidget);
- return image;
-}
-
- (id) initWithPlatformWindow:(JNFWeakJObjectWrapper *)platformWindow
styleBits:(jint)bits
frameRect:(NSRect)rect
contentView:(NSView *)view
{
@@ -203,41 +165,18 @@
[self setContentView:view];
[self setInitialFirstResponder:view];
[self setReleasedWhenClosed:NO];
[self setPreservesContentDuringLiveResize:YES];
- if ([self shouldShowGrowBox]) {
- NSImage *growBoxImage = [self createGrowBoxImage];
- growBoxWindow = [[JavaResizeGrowBoxOverlayWindow alloc] initWithContentRect:NSMakeRect(0, 0, [growBoxImage size].width, [growBoxImage size].height) styleMask:NSBorderlessWindowMask backing:NSBackingStoreBuffered defer:NO];
- [self.growBoxWindow setIgnoresMouseEvents:YES];
- [self.growBoxWindow setOpaque:NO];
- [self.growBoxWindow setBackgroundColor:[NSColor clearColor]];
- [self.growBoxWindow setHasShadow:NO];
- [self.growBoxWindow setReleasedWhenClosed:NO];
-
- NSImageView *imageView = [[NSImageView alloc] initWithFrame:[self.growBoxWindow frame]];
- [imageView setEditable:NO];
- [imageView setAnimates:NO];
- [imageView setAllowsCutCopyPaste:NO];
- [self.growBoxWindow setContentView:imageView];
- [imageView setImage:growBoxImage];
- [growBoxImage release];
- [imageView release];
-
- [self addChildWindow:self.growBoxWindow ordered:NSWindowAbove];
- [self adjustGrowBoxWindow];
- } else growBoxWindow = nil;
-
return self;
}
- (void) dealloc {
AWT_ASSERT_APPKIT_THREAD;
JNIEnv *env = [ThreadUtilities getJNIEnv];
[self.javaPlatformWindow setJObject:nil withEnv:env];
- self.growBoxWindow = nil;
[super dealloc];
}
@@ -319,18 +258,10 @@
}
// NSWindowDelegate methods
-- (void) adjustGrowBoxWindow {
- if (self.growBoxWindow != nil) {
- NSRect parentRect = [self frame];
- parentRect.origin.x += (parentRect.size.width - [self.growBoxWindow frame].size.width);
- [self.growBoxWindow setFrameOrigin:parentRect.origin];
- }
-}
-
- (void) _deliverMoveResizeEvent {
AWT_ASSERT_APPKIT_THREAD;
// deliver the event if this is a user-initiated live resize or as a side-effect
// of a Java initiated resize, because AppKit can override the bounds and force
@@ -340,12 +271,10 @@
jobject platformWindow = [self.javaPlatformWindow jObjectWithEnv:env];
if (platformWindow == NULL) {
// TODO: create generic AWT assert
}
- [self adjustGrowBoxWindow];
-
NSRect frame = ConvertNSScreenRect(env, [self frame]);
static JNF_MEMBER_CACHE(jm_deliverMoveResizeEvent, jc_CPlatformWindow, "deliverMoveResizeEvent", "(IIII)V");
JNFCallVoidMethod(env, platformWindow, jm_deliverMoveResizeEvent,
(jint)frame.origin.x,
@@ -546,10 +475,35 @@
JNFCallVoidMethod(env, platformWindow, jm_deliverNCMouseDown);
}
}
[super sendEvent:event];
}
+
+- (void)constrainSize:(NSSize*)size {
+ float minWidth = 0.f, minHeight = 0.f;
+
+ if (IS(self.styleBits, DECORATED)) {
+ NSRect frame = [self frame];
+ NSRect contentRect = [NSWindow contentRectForFrameRect:frame styleMask:[self styleMask]];
+
+ float top = frame.size.height - contentRect.size.height;
+ float left = contentRect.origin.x - frame.origin.x;
+ float bottom = contentRect.origin.y - frame.origin.y;
+ float right = frame.size.width - (contentRect.size.width + left);
+
+ // Speculative estimation: 80 - enough for window decorations controls
+ minWidth += left + right + 80;
+ minHeight += top + bottom;
+ }
+
+ minWidth = MAX(1.f, minWidth);
+ minHeight = MAX(1.f, minHeight);
+
+ size->width = MAX(size->width, minWidth);
+ size->height = MAX(size->height, minHeight);
+}
+
@end // AWTWindow
/*
* Class: sun_lwawt_macosx_CPlatformWindow
@@ -701,10 +655,12 @@
AWTWindow *window = OBJC(windowPtr);
[JNFRunLoop performOnMainThreadWaiting:NO withBlock:^(){
AWT_ASSERT_APPKIT_THREAD;
NSRect rect = ConvertNSScreenRect(NULL, jrect);
+ [window constrainSize:&rect.size];
+
[window setFrame:rect display:YES];
// only start tracking events if pointer is above the toplevel
// TODO: should post an Entered event if YES.
NSPoint mLocation = [NSEvent mouseLocation];
@@ -732,17 +688,20 @@
if (minW < 1) minW = 1;
if (minH < 1) minH = 1;
if (maxW < 1) maxW = 1;
if (maxH < 1) maxH = 1;
- NSSize min = { minW, minH };
- NSSize max = { maxW, maxH };
-
AWTWindow *window = OBJC(windowPtr);
[JNFRunLoop performOnMainThreadWaiting:NO withBlock:^(){
AWT_ASSERT_APPKIT_THREAD;
+ NSSize min = { minW, minH };
+ NSSize max = { maxW, maxH };
+
+ [window constrainSize:&min];
+ [window constrainSize:&max];
+
window.javaMinSize = min;
window.javaMaxSize = max;
[window updateMinMaxSize:IS(window.styleBits, RESIZABLE)];
}];
@@ -828,11 +787,10 @@
AWTWindow *window = OBJC(windowPtr);
[JNFRunLoop performOnMainThreadWaiting:NO withBlock:^(){
AWT_ASSERT_APPKIT_THREAD;
[window setAlphaValue:alpha];
- [window.growBoxWindow setAlphaValue:alpha];
}];
JNF_COCOA_EXIT(env);
}