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  */
  35 JNIEXPORT void JNICALL
  36 Java_sun_lwawt_macosx_CWrapper_00024NSWindow_makeKeyAndOrderFront
  37 (JNIEnv *env, jclass cls, jlong windowPtr)
  38 {
  39 JNF_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 
  47 JNF_COCOA_EXIT(env);
  48 }
  49 
  50 /*
  51  * Class:     sun_lwawt_macosx_CWrapper$NSWindow
  52  * Method:    makeKeyWindow
  53  * Signature: (J)V
  54  */
  55 JNIEXPORT void JNICALL
  56 Java_sun_lwawt_macosx_CWrapper_00024NSWindow_makeKeyWindow
  57 (JNIEnv *env, jclass cls, jlong windowPtr)
  58 {
  59 JNF_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 
  67 JNF_COCOA_EXIT(env);
  68 }
  69 
  70 /*
  71  * Class:     sun_lwawt_macosx_CWrapper$NSWindow
  72  * Method:    makeMainWindow
  73  * Signature: (J)V
  74  */
  75 JNIEXPORT void JNICALL
  76 Java_sun_lwawt_macosx_CWrapper_00024NSWindow_makeMainWindow
  77 (JNIEnv *env, jclass cls, jlong windowPtr)
  78 {
  79 JNF_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 
  87 JNF_COCOA_EXIT(env);
  88 }
  89 
  90 /*
  91  * Class:     sun_lwawt_macosx_CWrapper$NSWindow
  92  * Method:    canBecomeMainWindow
  93  * Signature: (J)V
  94  */
  95 JNIEXPORT jboolean JNICALL
  96 Java_sun_lwawt_macosx_CWrapper_00024NSWindow_canBecomeMainWindow
  97 (JNIEnv *env, jclass cls, jlong windowPtr)
  98 {
  99     __block jboolean canBecomeMainWindow = JNI_FALSE;
 100 
 101 JNF_COCOA_ENTER(env);
 102 
 103     NSWindow *window = (NSWindow *)jlong_to_ptr(windowPtr);
 104     [ThreadUtilities performOnMainThreadWaiting:YES block:^(){
 105         canBecomeMainWindow = [window canBecomeMainWindow];
 106     }];
 107 
 108 JNF_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  */
 118 JNIEXPORT jboolean JNICALL
 119 Java_sun_lwawt_macosx_CWrapper_00024NSWindow_isKeyWindow
 120 (JNIEnv *env, jclass cls, jlong windowPtr)
 121 {
 122     __block jboolean isKeyWindow = JNI_FALSE;
 123 
 124 JNF_COCOA_ENTER(env);
 125 
 126     NSWindow *window = (NSWindow *)jlong_to_ptr(windowPtr);
 127     [ThreadUtilities performOnMainThreadWaiting:YES block:^(){
 128         isKeyWindow = [window isKeyWindow];
 129     }];
 130 
 131 JNF_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  */
 141 JNIEXPORT void JNICALL
 142 Java_sun_lwawt_macosx_CWrapper_00024NSWindow_orderFront
 143 (JNIEnv *env, jclass cls, jlong windowPtr)
 144 {
 145 JNF_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 
 153 JNF_COCOA_EXIT(env);
 154 }
 155 
 156 /*
 157  * Class:     sun_lwawt_macosx_CWrapper$NSWindow
 158  * Method:    orderOut
 159  * Signature: (J)V
 160  */
 161 JNIEXPORT void JNICALL
 162 Java_sun_lwawt_macosx_CWrapper_00024NSWindow_orderOut
 163 (JNIEnv *env, jclass cls, jlong windowPtr)
 164 {
 165 JNF_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 
 173 JNF_COCOA_EXIT(env);
 174 }
 175 
 176 /*
 177  * Class:     sun_lwawt_macosx_CWrapper$NSWindow
 178  * Method:    close
 179  * Signature: (J)V
 180  */
 181 JNIEXPORT void JNICALL
 182 Java_sun_lwawt_macosx_CWrapper_00024NSWindow_close
 183         (JNIEnv *env, jclass cls, jlong windowPtr)
 184 {
 185 JNF_COCOA_ENTER(env);
 186     NSWindow *window = (NSWindow *)jlong_to_ptr(windowPtr);
 187     [ThreadUtilities performOnMainThreadWaiting:NO block:^(){
 188         [window close];
 189     }];
 190 JNF_COCOA_EXIT(env);
 191 }
 192 
 193 /*
 194  * Class:     sun_lwawt_macosx_CWrapper$NSWindow
 195  * Method:    orderFrontRegardless
 196  * Signature: (J)V
 197  */
 198 JNIEXPORT void JNICALL
 199 Java_sun_lwawt_macosx_CWrapper_00024NSWindow_orderFrontRegardless
 200 (JNIEnv *env, jclass cls, jlong windowPtr)
 201 {
 202 JNF_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 
 210 JNF_COCOA_EXIT(env);
 211 }
 212 
 213 /*
 214  * Class:     sun_lwawt_macosx_CWrapper$NSWindow
 215  * Method:    orderWindow
 216  * Signature: (JIJ)V
 217  */
 218 JNIEXPORT void JNICALL
 219 Java_sun_lwawt_macosx_CWrapper_00024NSWindow_orderWindow
 220 (JNIEnv *env, jclass cls, jlong windowPtr, jint order, jlong relativeToPtr)
 221 {
 222 JNF_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 
 230 JNF_COCOA_EXIT(env);
 231 }
 232 
 233 // Used for CWrapper.NSWindow.setLevel() (and level() which isn't implemented yet)
 234 static NSInteger LEVELS[sun_lwawt_macosx_CWrapper_NSWindow_MAX_WINDOW_LEVELS];
 235 static 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  */
 251 JNIEXPORT void JNICALL
 252 Java_sun_lwawt_macosx_CWrapper_00024NSWindow_setLevel
 253 (JNIEnv *env, jclass cls, jlong windowPtr, jint level)
 254 {
 255 JNF_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 
 268 JNF_COCOA_EXIT(env);
 269 }
 270 
 271 /*
 272  * Class:     sun_lwawt_macosx_CWrapper$NSWindow
 273  * Method:    addChildWindow
 274  * Signature: (JJI)V
 275  */
 276 JNIEXPORT void JNICALL
 277 Java_sun_lwawt_macosx_CWrapper_00024NSWindow_addChildWindow
 278 (JNIEnv *env, jclass cls, jlong parentPtr, jlong childPtr, jint order)
 279 {
 280 JNF_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 
 288 JNF_COCOA_EXIT(env);
 289 }
 290 
 291 /*
 292  * Class:     sun_lwawt_macosx_CWrapper$NSWindow
 293  * Method:    removeChildWindow
 294  * Signature: (JJ)V
 295  */
 296 JNIEXPORT void JNICALL
 297 Java_sun_lwawt_macosx_CWrapper_00024NSWindow_removeChildWindow
 298 (JNIEnv *env, jclass cls, jlong parentPtr, jlong childPtr)
 299 {
 300 JNF_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 
 309 JNF_COCOA_EXIT(env);
 310 }
 311 
 312 /*
 313  * Class:     sun_lwawt_macosx_CWrapper$NSWindow
 314  * Method:    setAlphaValue
 315  * Signature: (JF)V
 316  */
 317 JNIEXPORT void JNICALL
 318 Java_sun_lwawt_macosx_CWrapper_00024NSWindow_setAlphaValue
 319 (JNIEnv *env, jclass cls, jlong windowPtr, jfloat alpha)
 320 {
 321 JNF_COCOA_ENTER(env);
 322 
 323     NSWindow *window = (NSWindow *)jlong_to_ptr(windowPtr);
 324     [ThreadUtilities performOnMainThreadWaiting:NO block:^(){
 325         [window setAlphaValue:(CGFloat)alpha];
 326     }];
 327 
 328 JNF_COCOA_EXIT(env);
 329 }
 330 
 331 /*
 332  * Class:     sun_lwawt_macosx_CWrapper$NSWindow
 333  * Method:    setOpaque
 334  * Signature: (Z)V
 335  */
 336 JNIEXPORT void JNICALL
 337 Java_sun_lwawt_macosx_CWrapper_00024NSWindow_setOpaque
 338 (JNIEnv *env, jclass cls, jlong windowPtr, jboolean opaque)
 339 {
 340 JNF_COCOA_ENTER(env);
 341 
 342     NSWindow *window = (NSWindow *)jlong_to_ptr(windowPtr);
 343     [ThreadUtilities performOnMainThreadWaiting:NO block:^(){
 344         [window setOpaque:(BOOL)opaque];
 345     }];
 346 
 347 JNF_COCOA_EXIT(env);
 348 }
 349 
 350 /*
 351  * Class:     sun_lwawt_macosx_CWrapper$NSWindow
 352  * Method:    setBackgroundColor
 353  * Signature: (J)V
 354  */
 355 JNIEXPORT void JNICALL
 356 Java_sun_lwawt_macosx_CWrapper_00024NSWindow_setBackgroundColor
 357 (JNIEnv *env, jclass cls, jlong windowPtr, jint rgb)
 358 {
 359 JNF_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 
 372 JNF_COCOA_EXIT(env);
 373 }
 374 
 375 /*
 376  * Class:     sun_lwawt_macosx_CWrapper$NSWindow
 377  * Method:    miniaturize
 378  * Signature: (J)V
 379  */
 380 JNIEXPORT void JNICALL
 381 Java_sun_lwawt_macosx_CWrapper_00024NSWindow_miniaturize
 382 (JNIEnv *env, jclass cls, jlong windowPtr)
 383 {
 384 JNF_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 
 392 JNF_COCOA_EXIT(env);
 393 }
 394 
 395 /*
 396  * Class:     sun_lwawt_macosx_CWrapper$NSWindow
 397  * Method:    deminiaturize
 398  * Signature: (J)V
 399  */
 400 JNIEXPORT void JNICALL
 401 Java_sun_lwawt_macosx_CWrapper_00024NSWindow_deminiaturize
 402 (JNIEnv *env, jclass cls, jlong windowPtr)
 403 {
 404 JNF_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 
 412 JNF_COCOA_EXIT(env);
 413 }
 414 
 415 /*
 416  * Class:     sun_lwawt_macosx_CWrapper$NSWindow
 417  * Method:    isZoomed
 418  * Signature: (J)Z
 419  */
 420 JNIEXPORT jboolean JNICALL
 421 Java_sun_lwawt_macosx_CWrapper_00024NSWindow_isZoomed
 422 (JNIEnv *env, jclass cls, jlong windowPtr)
 423 {
 424     __block jboolean isZoomed = JNI_FALSE;
 425 
 426 JNF_COCOA_ENTER(env);
 427 
 428     NSWindow *window = (NSWindow *)jlong_to_ptr(windowPtr);
 429     [ThreadUtilities performOnMainThreadWaiting:YES block:^(){
 430         isZoomed = [window isZoomed];
 431     }];
 432 
 433 JNF_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  */
 443 JNIEXPORT void JNICALL
 444 Java_sun_lwawt_macosx_CWrapper_00024NSWindow_zoom
 445 (JNIEnv *env, jclass cls, jlong windowPtr)
 446 {
 447 JNF_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 
 455 JNF_COCOA_EXIT(env);
 456 }
 457 
 458 /*
 459  * Class:     sun_lwawt_macosx_CWrapper$NSWindow
 460  * Method:    makeFirstResponder
 461  * Signature: (JJ)V
 462  */
 463 JNIEXPORT void JNICALL
 464 Java_sun_lwawt_macosx_CWrapper_00024NSWindow_makeFirstResponder
 465 (JNIEnv *env, jclass cls, jlong windowPtr, jlong responderPtr)
 466 {
 467 JNF_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 
 476 JNF_COCOA_EXIT(env);
 477 }
 478 
 479 /*
 480  * Class:     sun_lwawt_macosx_CWrapper$NSView
 481  * Method:    addSubview
 482  * Signature: (JJ)V
 483  */
 484 JNIEXPORT void JNICALL
 485 Java_sun_lwawt_macosx_CWrapper_00024NSView_addSubview
 486 (JNIEnv *env, jclass cls, jlong viewPtr, jlong subviewPtr)
 487 {
 488 JNF_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 
 496 JNF_COCOA_EXIT(env);
 497 }
 498 
 499 /*
 500  * Class:     sun_lwawt_macosx_CWrapper$NSView
 501  * Method:    removeFromSuperview
 502  * Signature: (J)V
 503  */
 504 JNIEXPORT void JNICALL
 505 Java_sun_lwawt_macosx_CWrapper_00024NSView_removeFromSuperview
 506 (JNIEnv *env, jclass cls, jlong viewPtr)
 507 {
 508 JNF_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 
 516 JNF_COCOA_EXIT(env);
 517 }
 518 
 519 /*
 520  * Class:     sun_lwawt_macosx_CWrapper$NSView
 521  * Method:    setFrame
 522  * Signature: (JIIII)V
 523  */
 524 JNIEXPORT void JNICALL
 525 Java_sun_lwawt_macosx_CWrapper_00024NSView_setFrame
 526 (JNIEnv *env, jclass cls, jlong viewPtr, jint x, jint y, jint w, jint h)
 527 {
 528 JNF_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 
 535 JNF_COCOA_EXIT(env);
 536 }
 537 
 538 /*
 539  * Class:     sun_lwawt_macosx_CWrapper$NSView
 540  * Method:    window
 541  * Signature: (J)J
 542  */
 543 JNIEXPORT jlong JNICALL
 544 Java_sun_lwawt_macosx_CWrapper_00024NSView_window
 545 (JNIEnv *env, jclass cls, jlong viewPtr)
 546 {
 547     __block jlong windowPtr = 0L;
 548 
 549 JNF_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 
 556 JNF_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  */
 566 JNIEXPORT void JNICALL
 567 Java_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  */
 585 JNIEXPORT void JNICALL
 586 Java_sun_lwawt_macosx_CWrapper_00024NSView_setToolTip
 587 (JNIEnv *env, jclass cls, jlong viewPtr, jstring msg)
 588 {
 589 
 590 JNF_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 
 598 JNF_COCOA_EXIT(env);
 599 }