1/*
2 * Copyright (c) 2011, 2014, Oracle and/or its affiliates. All rights reserved.
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4 *
5 * This code is free software; you can redistribute it and/or modify it
6 * under the terms of the GNU General Public License version 2 only, as
7 * published by the Free Software Foundation.  Oracle designates this
8 * particular file as subject to the "Classpath" exception as provided
9 * by Oracle in the LICENSE file that accompanied this code.
10 *
11 * This code is distributed in the hope that it will be useful, but WITHOUT
12 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
14 * version 2 for more details (a copy is included in the LICENSE file that
15 * accompanied this code).
16 *
17 * You should have received a copy of the GNU General Public License version
18 * 2 along with this work; if not, write to the Free Software Foundation,
19 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
20 *
21 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
22 * or visit www.oracle.com if you need additional information or have any
23 * questions.
24 */
25
26#import "JNIUtilities.h"
27
28#import "ThreadUtilities.h"
29#import "sun_lwawt_macosx_CWrapper_NSWindow.h"
30
31/*
32 * Class:     sun_lwawt_macosx_CWrapper$NSWindow
33 * Method:    makeKeyAndOrderFront
34 * Signature: (J)V
35 */
36JNIEXPORT void JNICALL
37Java_sun_lwawt_macosx_CWrapper_00024NSWindow_makeKeyAndOrderFront
38(JNIEnv *env, jclass cls, jlong windowPtr)
39{
40JNI_COCOA_ENTER(env);
41
42    NSWindow *window = (NSWindow *)jlong_to_ptr(windowPtr);
43    [ThreadUtilities performOnMainThread:@selector(makeKeyAndOrderFront:)
44                                      on:window
45                              withObject:nil
46                           waitUntilDone:NO];
47
48JNI_COCOA_EXIT(env);
49}
50
51/*
52 * Class:     sun_lwawt_macosx_CWrapper$NSWindow
53 * Method:    makeKeyWindow
54 * Signature: (J)V
55 */
56JNIEXPORT void JNICALL
57Java_sun_lwawt_macosx_CWrapper_00024NSWindow_makeKeyWindow
58(JNIEnv *env, jclass cls, jlong windowPtr)
59{
60JNI_COCOA_ENTER(env);
61
62    NSWindow *window = (NSWindow *)jlong_to_ptr(windowPtr);
63    [ThreadUtilities performOnMainThread:@selector(makeKeyWindow)
64                                      on:window
65                              withObject:nil
66                           waitUntilDone:NO];
67
68JNI_COCOA_EXIT(env);
69}
70
71/*
72 * Class:     sun_lwawt_macosx_CWrapper$NSWindow
73 * Method:    makeMainWindow
74 * Signature: (J)V
75 */
76JNIEXPORT void JNICALL
77Java_sun_lwawt_macosx_CWrapper_00024NSWindow_makeMainWindow
78(JNIEnv *env, jclass cls, jlong windowPtr)
79{
80JNI_COCOA_ENTER(env);
81
82    NSWindow *window = (NSWindow *)jlong_to_ptr(windowPtr);
83    [ThreadUtilities performOnMainThread:@selector(makeMainWindow)
84                                      on:window
85                              withObject:nil
86                           waitUntilDone:NO];
87
88JNI_COCOA_EXIT(env);
89}
90
91/*
92 * Class:     sun_lwawt_macosx_CWrapper$NSWindow
93 * Method:    canBecomeMainWindow
94 * Signature: (J)V
95 */
96JNIEXPORT jboolean JNICALL
97Java_sun_lwawt_macosx_CWrapper_00024NSWindow_canBecomeMainWindow
98(JNIEnv *env, jclass cls, jlong windowPtr)
99{
100    __block jboolean canBecomeMainWindow = JNI_FALSE;
101
102JNI_COCOA_ENTER(env);
103
104    NSWindow *window = (NSWindow *)jlong_to_ptr(windowPtr);
105    [ThreadUtilities performOnMainThreadWaiting:YES block:^(){
106        canBecomeMainWindow = [window canBecomeMainWindow];
107    }];
108
109JNI_COCOA_EXIT(env);
110
111    return canBecomeMainWindow;
112}
113
114/*
115 * Class:     sun_lwawt_macosx_CWrapper$NSWindow
116 * Method:    isKeyWindow
117 * Signature: (J)Z
118 */
119JNIEXPORT jboolean JNICALL
120Java_sun_lwawt_macosx_CWrapper_00024NSWindow_isKeyWindow
121(JNIEnv *env, jclass cls, jlong windowPtr)
122{
123    __block jboolean isKeyWindow = JNI_FALSE;
124
125JNI_COCOA_ENTER(env);
126
127    NSWindow *window = (NSWindow *)jlong_to_ptr(windowPtr);
128    [ThreadUtilities performOnMainThreadWaiting:YES block:^(){
129        isKeyWindow = [window isKeyWindow];
130    }];
131
132JNI_COCOA_EXIT(env);
133
134    return isKeyWindow;
135}
136
137/*
138 * Class:     sun_lwawt_macosx_CWrapper$NSWindow
139 * Method:    orderFront
140 * Signature: (J)V
141 */
142JNIEXPORT void JNICALL
143Java_sun_lwawt_macosx_CWrapper_00024NSWindow_orderFront
144(JNIEnv *env, jclass cls, jlong windowPtr)
145{
146JNI_COCOA_ENTER(env);
147
148    NSWindow *window = (NSWindow *)jlong_to_ptr(windowPtr);
149    [ThreadUtilities performOnMainThread:@selector(orderFront:)
150                                      on:window
151                              withObject:window
152                           waitUntilDone:NO];
153
154JNI_COCOA_EXIT(env);
155}
156
157/*
158 * Class:     sun_lwawt_macosx_CWrapper$NSWindow
159 * Method:    orderOut
160 * Signature: (J)V
161 */
162JNIEXPORT void JNICALL
163Java_sun_lwawt_macosx_CWrapper_00024NSWindow_orderOut
164(JNIEnv *env, jclass cls, jlong windowPtr)
165{
166JNI_COCOA_ENTER(env);
167
168    NSWindow *window = (NSWindow *)jlong_to_ptr(windowPtr);
169    [ThreadUtilities performOnMainThread:@selector(orderOut:)
170                                      on:window
171                              withObject:window
172                           waitUntilDone:NO];
173
174JNI_COCOA_EXIT(env);
175}
176
177/*
178 * Class:     sun_lwawt_macosx_CWrapper$NSWindow
179 * Method:    close
180 * Signature: (J)V
181 */
182JNIEXPORT void JNICALL
183Java_sun_lwawt_macosx_CWrapper_00024NSWindow_close
184        (JNIEnv *env, jclass cls, jlong windowPtr)
185{
186JNI_COCOA_ENTER(env);
187    NSWindow *window = (NSWindow *)jlong_to_ptr(windowPtr);
188    [ThreadUtilities performOnMainThreadWaiting:NO block:^(){
189        [window close];
190    }];
191JNI_COCOA_EXIT(env);
192}
193
194/*
195 * Class:     sun_lwawt_macosx_CWrapper$NSWindow
196 * Method:    orderFrontRegardless
197 * Signature: (J)V
198 */
199JNIEXPORT void JNICALL
200Java_sun_lwawt_macosx_CWrapper_00024NSWindow_orderFrontRegardless
201(JNIEnv *env, jclass cls, jlong windowPtr)
202{
203JNI_COCOA_ENTER(env);
204
205    NSWindow *window = (NSWindow *)jlong_to_ptr(windowPtr);
206    [ThreadUtilities performOnMainThread:@selector(orderFrontRegardless)
207                                      on:window
208                              withObject:nil
209                           waitUntilDone:NO];
210
211JNI_COCOA_EXIT(env);
212}
213
214/*
215 * Class:     sun_lwawt_macosx_CWrapper$NSWindow
216 * Method:    orderWindow
217 * Signature: (JIJ)V
218 */
219JNIEXPORT void JNICALL
220Java_sun_lwawt_macosx_CWrapper_00024NSWindow_orderWindow
221(JNIEnv *env, jclass cls, jlong windowPtr, jint order, jlong relativeToPtr)
222{
223JNI_COCOA_ENTER(env);
224
225    NSWindow *window = (NSWindow *)jlong_to_ptr(windowPtr);
226    NSWindow *relativeTo = (NSWindow *)jlong_to_ptr(relativeToPtr);
227    [ThreadUtilities performOnMainThreadWaiting:NO block:^(){
228        [window orderWindow:(NSWindowOrderingMode)order relativeTo:[relativeTo windowNumber]];
229    }];
230
231JNI_COCOA_EXIT(env);
232}
233
234// Used for CWrapper.NSWindow.setLevel() (and level() which isn't implemented yet)
235static NSInteger LEVELS[sun_lwawt_macosx_CWrapper_NSWindow_MAX_WINDOW_LEVELS];
236static void initLevels()
237{
238    static dispatch_once_t pred;
239
240    dispatch_once(&pred, ^{
241        LEVELS[sun_lwawt_macosx_CWrapper_NSWindow_NSNormalWindowLevel] = NSNormalWindowLevel;
242        LEVELS[sun_lwawt_macosx_CWrapper_NSWindow_NSFloatingWindowLevel] = NSFloatingWindowLevel;
243        LEVELS[sun_lwawt_macosx_CWrapper_NSWindow_NSPopUpMenuWindowLevel] = NSPopUpMenuWindowLevel;
244    });
245}
246
247/*
248 * Class:     sun_lwawt_macosx_CWrapper$NSWindow
249 * Method:    setLevel
250 * Signature: (JI)V
251 */
252JNIEXPORT void JNICALL
253Java_sun_lwawt_macosx_CWrapper_00024NSWindow_setLevel
254(JNIEnv *env, jclass cls, jlong windowPtr, jint level)
255{
256JNI_COCOA_ENTER(env);
257
258    if (level >= 0 && level < sun_lwawt_macosx_CWrapper_NSWindow_MAX_WINDOW_LEVELS) {
259        initLevels();
260
261        NSWindow *window = (NSWindow *)jlong_to_ptr(windowPtr);
262        [ThreadUtilities performOnMainThreadWaiting:NO block:^(){
263            [window setLevel: LEVELS[level]];
264        }];
265    } else {
266        JNU_ThrowIllegalArgumentException(env, "unknown level");
267    }
268
269JNI_COCOA_EXIT(env);
270}
271
272/*
273 * Class:     sun_lwawt_macosx_CWrapper$NSWindow
274 * Method:    addChildWindow
275 * Signature: (JJI)V
276 */
277JNIEXPORT void JNICALL
278Java_sun_lwawt_macosx_CWrapper_00024NSWindow_addChildWindow
279(JNIEnv *env, jclass cls, jlong parentPtr, jlong childPtr, jint order)
280{
281JNI_COCOA_ENTER(env);
282
283    NSWindow *parent = (NSWindow *)jlong_to_ptr(parentPtr);
284    NSWindow *child = (NSWindow *)jlong_to_ptr(childPtr);
285    [ThreadUtilities performOnMainThreadWaiting:NO block:^(){
286        [parent addChildWindow:child ordered:order];
287    }];
288
289JNI_COCOA_EXIT(env);
290}
291
292/*
293 * Class:     sun_lwawt_macosx_CWrapper$NSWindow
294 * Method:    removeChildWindow
295 * Signature: (JJ)V
296 */
297JNIEXPORT void JNICALL
298Java_sun_lwawt_macosx_CWrapper_00024NSWindow_removeChildWindow
299(JNIEnv *env, jclass cls, jlong parentPtr, jlong childPtr)
300{
301JNI_COCOA_ENTER(env);
302
303    NSWindow *parent = (NSWindow *)jlong_to_ptr(parentPtr);
304    NSWindow *child = (NSWindow *)jlong_to_ptr(childPtr);
305    [ThreadUtilities performOnMainThread:@selector(removeChildWindow:)
306                                      on:parent
307                              withObject:child
308                           waitUntilDone:NO];
309
310JNI_COCOA_EXIT(env);
311}
312
313/*
314 * Class:     sun_lwawt_macosx_CWrapper$NSWindow
315 * Method:    setAlphaValue
316 * Signature: (JF)V
317 */
318JNIEXPORT void JNICALL
319Java_sun_lwawt_macosx_CWrapper_00024NSWindow_setAlphaValue
320(JNIEnv *env, jclass cls, jlong windowPtr, jfloat alpha)
321{
322JNI_COCOA_ENTER(env);
323
324    NSWindow *window = (NSWindow *)jlong_to_ptr(windowPtr);
325    [ThreadUtilities performOnMainThreadWaiting:NO block:^(){
326        [window setAlphaValue:(CGFloat)alpha];
327    }];
328
329JNI_COCOA_EXIT(env);
330}
331
332/*
333 * Class:     sun_lwawt_macosx_CWrapper$NSWindow
334 * Method:    setOpaque
335 * Signature: (Z)V
336 */
337JNIEXPORT void JNICALL
338Java_sun_lwawt_macosx_CWrapper_00024NSWindow_setOpaque
339(JNIEnv *env, jclass cls, jlong windowPtr, jboolean opaque)
340{
341JNI_COCOA_ENTER(env);
342
343    NSWindow *window = (NSWindow *)jlong_to_ptr(windowPtr);
344    [ThreadUtilities performOnMainThreadWaiting:NO block:^(){
345        [window setOpaque:(BOOL)opaque];
346    }];
347
348JNI_COCOA_EXIT(env);
349}
350
351/*
352 * Class:     sun_lwawt_macosx_CWrapper$NSWindow
353 * Method:    setBackgroundColor
354 * Signature: (J)V
355 */
356JNIEXPORT void JNICALL
357Java_sun_lwawt_macosx_CWrapper_00024NSWindow_setBackgroundColor
358(JNIEnv *env, jclass cls, jlong windowPtr, jint rgb)
359{
360JNI_COCOA_ENTER(env);
361
362    NSWindow *window = (NSWindow *)jlong_to_ptr(windowPtr);
363    CGFloat alpha = (((rgb >> 24) & 0xff) / 255.0);
364    CGFloat red   = (((rgb >> 16) & 0xff) / 255.0);
365    CGFloat green = (((rgb >>  8) & 0xff) / 255.0);
366    CGFloat blue  = (((rgb >>  0) & 0xff) / 255.0);
367    NSColor *color = [NSColor colorWithCalibratedRed:red green:green blue:blue
368                                               alpha:alpha];
369    [ThreadUtilities performOnMainThreadWaiting:NO block:^(){
370        [window setBackgroundColor:color];
371    }];
372
373JNI_COCOA_EXIT(env);
374}
375
376/*
377 * Class:     sun_lwawt_macosx_CWrapper$NSWindow
378 * Method:    miniaturize
379 * Signature: (J)V
380 */
381JNIEXPORT void JNICALL
382Java_sun_lwawt_macosx_CWrapper_00024NSWindow_miniaturize
383(JNIEnv *env, jclass cls, jlong windowPtr)
384{
385JNI_COCOA_ENTER(env);
386
387    NSWindow *window = (NSWindow *)jlong_to_ptr(windowPtr);
388    [ThreadUtilities performOnMainThread:@selector(miniaturize:)
389                                      on:window
390                              withObject:nil
391                           waitUntilDone:NO];
392
393JNI_COCOA_EXIT(env);
394}
395
396/*
397 * Class:     sun_lwawt_macosx_CWrapper$NSWindow
398 * Method:    deminiaturize
399 * Signature: (J)V
400 */
401JNIEXPORT void JNICALL
402Java_sun_lwawt_macosx_CWrapper_00024NSWindow_deminiaturize
403(JNIEnv *env, jclass cls, jlong windowPtr)
404{
405JNI_COCOA_ENTER(env);
406
407    NSWindow *window = (NSWindow *)jlong_to_ptr(windowPtr);
408    [ThreadUtilities performOnMainThread:@selector(deminiaturize:)
409                                      on:window
410                              withObject:nil
411                           waitUntilDone:NO];
412
413JNI_COCOA_EXIT(env);
414}
415
416/*
417 * Class:     sun_lwawt_macosx_CWrapper$NSWindow
418 * Method:    isZoomed
419 * Signature: (J)Z
420 */
421JNIEXPORT jboolean JNICALL
422Java_sun_lwawt_macosx_CWrapper_00024NSWindow_isZoomed
423(JNIEnv *env, jclass cls, jlong windowPtr)
424{
425    __block jboolean isZoomed = JNI_FALSE;
426
427JNI_COCOA_ENTER(env);
428
429    NSWindow *window = (NSWindow *)jlong_to_ptr(windowPtr);
430    [ThreadUtilities performOnMainThreadWaiting:YES block:^(){
431        isZoomed = [window isZoomed];
432    }];
433
434JNI_COCOA_EXIT(env);
435
436    return isZoomed;
437}
438
439/*
440 * Class:     sun_lwawt_macosx_CWrapper$NSWindow
441 * Method:    zoom
442 * Signature: (J)V
443 */
444JNIEXPORT void JNICALL
445Java_sun_lwawt_macosx_CWrapper_00024NSWindow_zoom
446(JNIEnv *env, jclass cls, jlong windowPtr)
447{
448JNI_COCOA_ENTER(env);
449
450    NSWindow *window = (NSWindow *)jlong_to_ptr(windowPtr);
451    [ThreadUtilities performOnMainThread:@selector(zoom:)
452                                      on:window
453                              withObject:nil
454                           waitUntilDone:NO];
455
456JNI_COCOA_EXIT(env);
457}
458
459/*
460 * Class:     sun_lwawt_macosx_CWrapper$NSWindow
461 * Method:    makeFirstResponder
462 * Signature: (JJ)V
463 */
464JNIEXPORT void JNICALL
465Java_sun_lwawt_macosx_CWrapper_00024NSWindow_makeFirstResponder
466(JNIEnv *env, jclass cls, jlong windowPtr, jlong responderPtr)
467{
468JNI_COCOA_ENTER(env);
469
470    NSWindow *window = (NSWindow *)jlong_to_ptr(windowPtr);
471    NSResponder *responder = (NSResponder *)jlong_to_ptr(responderPtr);
472    [ThreadUtilities performOnMainThread:@selector(makeFirstResponder:)
473                                      on:window
474                              withObject:responder
475                           waitUntilDone:NO];
476
477JNI_COCOA_EXIT(env);
478}
479
480/*
481 * Class:     sun_lwawt_macosx_CWrapper$NSView
482 * Method:    addSubview
483 * Signature: (JJ)V
484 */
485JNIEXPORT void JNICALL
486Java_sun_lwawt_macosx_CWrapper_00024NSView_addSubview
487(JNIEnv *env, jclass cls, jlong viewPtr, jlong subviewPtr)
488{
489JNI_COCOA_ENTER(env);
490
491    NSView *view = (NSView *)jlong_to_ptr(viewPtr);
492    NSView *subview = (NSView *)jlong_to_ptr(subviewPtr);
493    [ThreadUtilities performOnMainThreadWaiting:YES block:^(){
494        [view addSubview:subview];
495    }];
496
497JNI_COCOA_EXIT(env);
498}
499
500/*
501 * Class:     sun_lwawt_macosx_CWrapper$NSView
502 * Method:    removeFromSuperview
503 * Signature: (J)V
504 */
505JNIEXPORT void JNICALL
506Java_sun_lwawt_macosx_CWrapper_00024NSView_removeFromSuperview
507(JNIEnv *env, jclass cls, jlong viewPtr)
508{
509JNI_COCOA_ENTER(env);
510
511    NSView *view = (NSView *)jlong_to_ptr(viewPtr);
512    [ThreadUtilities performOnMainThread:@selector(removeFromSuperview)
513                                      on:view
514                              withObject:nil
515                           waitUntilDone:NO];
516
517JNI_COCOA_EXIT(env);
518}
519
520/*
521 * Class:     sun_lwawt_macosx_CWrapper$NSView
522 * Method:    setFrame
523 * Signature: (JIIII)V
524 */
525JNIEXPORT void JNICALL
526Java_sun_lwawt_macosx_CWrapper_00024NSView_setFrame
527(JNIEnv *env, jclass cls, jlong viewPtr, jint x, jint y, jint w, jint h)
528{
529JNI_COCOA_ENTER(env);
530
531    NSView *view = (NSView *)jlong_to_ptr(viewPtr);
532    [ThreadUtilities performOnMainThreadWaiting:NO block:^(){
533        [view setFrame:NSMakeRect(x, y, w, h)];
534    }];
535
536JNI_COCOA_EXIT(env);
537}
538
539/*
540 * Class:     sun_lwawt_macosx_CWrapper$NSView
541 * Method:    window
542 * Signature: (J)J
543 */
544JNIEXPORT jlong JNICALL
545Java_sun_lwawt_macosx_CWrapper_00024NSView_window
546(JNIEnv *env, jclass cls, jlong viewPtr)
547{
548    __block jlong windowPtr = 0L;
549
550JNI_COCOA_ENTER(env);
551
552    NSView *view = (NSView *)jlong_to_ptr(viewPtr);
553    [ThreadUtilities performOnMainThreadWaiting:YES block:^(){
554        windowPtr = ptr_to_jlong([view window]);
555    }];
556
557JNI_COCOA_EXIT(env);
558
559    return windowPtr;
560}
561
562/*
563 * Class:     sun_lwawt_macosx_CWrapper$NSView
564 * Method:    setHidden
565 * Signature: (JZ)V
566 */
567JNIEXPORT void JNICALL
568Java_sun_lwawt_macosx_CWrapper_00024NSView_setHidden
569(JNIEnv *env, jclass cls, jlong viewPtr, jboolean toHide)
570{
571    JNI_COCOA_ENTER(env);
572
573    NSView *view = (NSView *)jlong_to_ptr(viewPtr);
574    [ThreadUtilities performOnMainThreadWaiting:NO block:^(){
575        [view setHidden:(BOOL)toHide];
576    }];
577
578    JNI_COCOA_EXIT(env);
579}
580
581/*
582 * Class:     sun_lwawt_macosx_CWrapper$NSView
583 * Method:    setToolTip
584 * Signature: (JLjava/lang/String;)V
585 */
586JNIEXPORT void JNICALL
587Java_sun_lwawt_macosx_CWrapper_00024NSView_setToolTip
588(JNIEnv *env, jclass cls, jlong viewPtr, jstring msg)
589{
590
591JNI_COCOA_ENTER(env);
592
593    NSView *view = (NSView *)jlong_to_ptr(viewPtr);
594    NSString* s = JavaStringToNSString(env, msg);
595    [ThreadUtilities performOnMainThreadWaiting:NO block:^(){
596        [view setToolTip: s];
597    }];
598
599JNI_COCOA_EXIT(env);
600}
601