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