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