197 [self.nsWindow setMaxSize:currentFrame.size];
198 }
199 }
200
201 // creates a new NSWindow style mask based on the _STYLE_PROP_BITMASK bits
202 + (NSUInteger) styleMaskForStyleBits:(jint)styleBits {
203 NSUInteger type = 0;
204 if (IS(styleBits, DECORATED)) {
205 type |= NSTitledWindowMask;
206 if (IS(styleBits, CLOSEABLE)) type |= NSClosableWindowMask;
207 if (IS(styleBits, MINIMIZABLE)) type |= NSMiniaturizableWindowMask;
208 if (IS(styleBits, RESIZABLE)) type |= NSResizableWindowMask;
209 } else {
210 type |= NSBorderlessWindowMask;
211 }
212
213 if (IS(styleBits, TEXTURED)) type |= NSTexturedBackgroundWindowMask;
214 if (IS(styleBits, UNIFIED)) type |= NSUnifiedTitleAndToolbarWindowMask;
215 if (IS(styleBits, UTILITY)) type |= NSUtilityWindowMask;
216 if (IS(styleBits, HUD)) type |= NSHUDWindowMask;
217 if (IS(styleBits, SHEET)) type |= NSDocModalWindowMask;
218 if (IS(styleBits, NONACTIVATING)) type |= NSNonactivatingPanelMask;
219
220 return type;
221 }
222
223 // updates _METHOD_PROP_BITMASK based properties on the window
224 - (void) setPropertiesForStyleBits:(jint)bits mask:(jint)mask {
225 if (IS(mask, RESIZABLE)) {
226 BOOL resizable = IS(bits, RESIZABLE);
227 [self updateMinMaxSize:resizable];
228 [self.nsWindow setShowsResizeIndicator:resizable];
229 // Zoom button should be disabled, if the window is not resizable,
230 // otherwise button should be restored to initial state.
231 BOOL zoom = resizable && IS(bits, ZOOMABLE);
232 [[self.nsWindow standardWindowButton:NSWindowZoomButton] setEnabled:zoom];
233 }
234
235 if (IS(mask, HAS_SHADOW)) {
236 [self.nsWindow setHasShadow:IS(bits, HAS_SHADOW)];
237 }
256 [self.nsWindow setDocumentEdited:IS(bits, DOCUMENT_MODIFIED)];
257 }
258
259 if (IS(mask, FULLSCREENABLE) && [self.nsWindow respondsToSelector:@selector(toggleFullScreen:)]) {
260 if (IS(bits, FULLSCREENABLE)) {
261 [self.nsWindow setCollectionBehavior:(1 << 7) /*NSWindowCollectionBehaviorFullScreenPrimary*/];
262 } else {
263 [self.nsWindow setCollectionBehavior:NSWindowCollectionBehaviorDefault];
264 }
265 }
266 }
267
268 - (id) initWithPlatformWindow:(JNFWeakJObjectWrapper *)platformWindow
269 ownerWindow:owner
270 styleBits:(jint)bits
271 frameRect:(NSRect)rect
272 contentView:(NSView *)view
273 {
274 AWT_ASSERT_APPKIT_THREAD;
275
276 NSUInteger styleMask = [AWTWindow styleMaskForStyleBits:bits];
277 NSRect contentRect = rect; //[NSWindow contentRectForFrameRect:rect styleMask:styleMask];
278 if (contentRect.size.width <= 0.0) {
279 contentRect.size.width = 1.0;
280 }
281 if (contentRect.size.height <= 0.0) {
282 contentRect.size.height = 1.0;
283 }
284
285 self = [super init];
286
287 if (self == nil) return nil; // no hope
288
289 if (IS(bits, UTILITY) ||
290 IS(bits, NONACTIVATING) ||
291 IS(bits, HUD) ||
292 IS(bits, HIDES_ON_DEACTIVATE))
293 {
294 self.nsWindow = [[AWTWindow_Panel alloc] initWithDelegate:self
295 frameRect:contentRect
296 styleMask:styleMask
297 contentView:view];
298 }
299 else
300 {
301 // These windows will appear in the window list in the dock icon menu
302 self.nsWindow = [[AWTWindow_Normal alloc] initWithDelegate:self
303 frameRect:contentRect
304 styleMask:styleMask
305 contentView:view];
306 }
307
308 if (self.nsWindow == nil) return nil; // no hope either
309 [self.nsWindow release]; // the property retains the object already
310
311 self.isEnabled = YES;
312 self.isMinimizing = NO;
313 self.javaPlatformWindow = platformWindow;
314 self.styleBits = bits;
315 self.ownerWindow = owner;
316 [self setPropertiesForStyleBits:styleBits mask:MASK(_METHOD_PROP_BITMASK)];
317
318 if (IS(self.styleBits, IS_POPUP)) {
319 [self.nsWindow setCollectionBehavior:(1 << 8) /*NSWindowCollectionBehaviorFullScreenAuxiliary*/];
320 }
321
322 return self;
323 }
324
325 + (BOOL) isAWTWindow:(NSWindow *)window {
326 return [window isKindOfClass: [AWTWindow_Panel class]] || [window isKindOfClass: [AWTWindow_Normal class]];
327 }
328
329 // Retrieves the list of possible window layers (levels)
330 + (NSArray*) getWindowLayers {
331 static NSArray *windowLayers;
332 static dispatch_once_t token;
333
334 // Initialize the list of possible window layers
335 dispatch_once(&token, ^{
336 // The layers are ordered from front to back, (i.e. the toppest one is the first)
337 windowLayers = [NSArray arrayWithObjects:
338 [NSNumber numberWithInt:CGWindowLevelForKey(kCGPopUpMenuWindowLevelKey)],
339 [NSNumber numberWithInt:CGWindowLevelForKey(kCGFloatingWindowLevelKey)],
340 [NSNumber numberWithInt:CGWindowLevelForKey(kCGNormalWindowLevelKey)],
341 nil
|
197 [self.nsWindow setMaxSize:currentFrame.size];
198 }
199 }
200
201 // creates a new NSWindow style mask based on the _STYLE_PROP_BITMASK bits
202 + (NSUInteger) styleMaskForStyleBits:(jint)styleBits {
203 NSUInteger type = 0;
204 if (IS(styleBits, DECORATED)) {
205 type |= NSTitledWindowMask;
206 if (IS(styleBits, CLOSEABLE)) type |= NSClosableWindowMask;
207 if (IS(styleBits, MINIMIZABLE)) type |= NSMiniaturizableWindowMask;
208 if (IS(styleBits, RESIZABLE)) type |= NSResizableWindowMask;
209 } else {
210 type |= NSBorderlessWindowMask;
211 }
212
213 if (IS(styleBits, TEXTURED)) type |= NSTexturedBackgroundWindowMask;
214 if (IS(styleBits, UNIFIED)) type |= NSUnifiedTitleAndToolbarWindowMask;
215 if (IS(styleBits, UTILITY)) type |= NSUtilityWindowMask;
216 if (IS(styleBits, HUD)) type |= NSHUDWindowMask;
217 if (IS(styleBits, SHEET)) type |= NSWindowStyleMaskDocModalWindow;
218 if (IS(styleBits, NONACTIVATING)) type |= NSNonactivatingPanelMask;
219
220 return type;
221 }
222
223 // updates _METHOD_PROP_BITMASK based properties on the window
224 - (void) setPropertiesForStyleBits:(jint)bits mask:(jint)mask {
225 if (IS(mask, RESIZABLE)) {
226 BOOL resizable = IS(bits, RESIZABLE);
227 [self updateMinMaxSize:resizable];
228 [self.nsWindow setShowsResizeIndicator:resizable];
229 // Zoom button should be disabled, if the window is not resizable,
230 // otherwise button should be restored to initial state.
231 BOOL zoom = resizable && IS(bits, ZOOMABLE);
232 [[self.nsWindow standardWindowButton:NSWindowZoomButton] setEnabled:zoom];
233 }
234
235 if (IS(mask, HAS_SHADOW)) {
236 [self.nsWindow setHasShadow:IS(bits, HAS_SHADOW)];
237 }
256 [self.nsWindow setDocumentEdited:IS(bits, DOCUMENT_MODIFIED)];
257 }
258
259 if (IS(mask, FULLSCREENABLE) && [self.nsWindow respondsToSelector:@selector(toggleFullScreen:)]) {
260 if (IS(bits, FULLSCREENABLE)) {
261 [self.nsWindow setCollectionBehavior:(1 << 7) /*NSWindowCollectionBehaviorFullScreenPrimary*/];
262 } else {
263 [self.nsWindow setCollectionBehavior:NSWindowCollectionBehaviorDefault];
264 }
265 }
266 }
267
268 - (id) initWithPlatformWindow:(JNFWeakJObjectWrapper *)platformWindow
269 ownerWindow:owner
270 styleBits:(jint)bits
271 frameRect:(NSRect)rect
272 contentView:(NSView *)view
273 {
274 AWT_ASSERT_APPKIT_THREAD;
275
276 NSUInteger newBits = bits;
277 if (IS(bits, SHEET) && owner == nil) {
278 newBits = bits & ~NSWindowStyleMaskDocModalWindow;
279 }
280 NSUInteger styleMask = [AWTWindow styleMaskForStyleBits:newBits];
281
282 NSRect contentRect = rect; //[NSWindow contentRectForFrameRect:rect styleMask:styleMask];
283 if (contentRect.size.width <= 0.0) {
284 contentRect.size.width = 1.0;
285 }
286 if (contentRect.size.height <= 0.0) {
287 contentRect.size.height = 1.0;
288 }
289
290 self = [super init];
291
292 if (self == nil) return nil; // no hope
293
294 if (IS(bits, UTILITY) ||
295 IS(bits, NONACTIVATING) ||
296 IS(bits, HUD) ||
297 IS(bits, HIDES_ON_DEACTIVATE) ||
298 IS(bits, SHEET))
299 {
300 self.nsWindow = [[AWTWindow_Panel alloc] initWithDelegate:self
301 frameRect:contentRect
302 styleMask:styleMask
303 contentView:view];
304 }
305 else
306 {
307 // These windows will appear in the window list in the dock icon menu
308 self.nsWindow = [[AWTWindow_Normal alloc] initWithDelegate:self
309 frameRect:contentRect
310 styleMask:styleMask
311 contentView:view];
312 }
313
314 if (self.nsWindow == nil) return nil; // no hope either
315 [self.nsWindow release]; // the property retains the object already
316
317 self.isEnabled = YES;
318 self.isMinimizing = NO;
319 self.javaPlatformWindow = platformWindow;
320 self.styleBits = bits;
321 self.ownerWindow = owner;
322 [self setPropertiesForStyleBits:styleBits mask:MASK(_METHOD_PROP_BITMASK)];
323
324 if (IS(self.styleBits, IS_POPUP)) {
325 [self.nsWindow setCollectionBehavior:(1 << 8) /*NSWindowCollectionBehaviorFullScreenAuxiliary*/];
326 }
327
328 if (IS(bits, SHEET) && owner != nil) {
329 [self.nsWindow setStyleMask: NSWindowStyleMaskDocModalWindow];
330 }
331
332 return self;
333 }
334
335 + (BOOL) isAWTWindow:(NSWindow *)window {
336 return [window isKindOfClass: [AWTWindow_Panel class]] || [window isKindOfClass: [AWTWindow_Normal class]];
337 }
338
339 // Retrieves the list of possible window layers (levels)
340 + (NSArray*) getWindowLayers {
341 static NSArray *windowLayers;
342 static dispatch_once_t token;
343
344 // Initialize the list of possible window layers
345 dispatch_once(&token, ^{
346 // The layers are ordered from front to back, (i.e. the toppest one is the first)
347 windowLayers = [NSArray arrayWithObjects:
348 [NSNumber numberWithInt:CGWindowLevelForKey(kCGPopUpMenuWindowLevelKey)],
349 [NSNumber numberWithInt:CGWindowLevelForKey(kCGFloatingWindowLevelKey)],
350 [NSNumber numberWithInt:CGWindowLevelForKey(kCGNormalWindowLevelKey)],
351 nil
|