< prev index next >

modules/javafx.graphics/src/main/native-glass/mac/GlassDialogs.m

Print this page




 124     self = [super init];
 125 
 126     self->panel = p;
 127     self->owner = o;
 128 
 129     return self;
 130 }
 131 
 132 - (void)exitModalWithEnv:(JNIEnv*)env result:(NSInteger)result
 133 {
 134     self->button = result;
 135     (*env)->CallVoidMethod(env, self->eventLoop, javaIDs.EventLoop.leave, NULL);
 136     GLASS_CHECK_EXCEPTION(env);
 137 }
 138 
 139 - (void)runModally
 140 {
 141     GET_MAIN_JENV;
 142     DialogDispatcher *dd = self;
 143 




 144     jobject jobj = (*env)->NewObject(env,
 145             [GlassHelper ClassForName:"com.sun.glass.ui.EventLoop" withEnv:env],
 146             javaIDs.EventLoop.init);
 147     if ((*env)->ExceptionCheck(env)) return;
 148 
 149     dd->eventLoop = (*env)->NewGlobalRef(env, jobj);
 150 
 151     if (owner) {
 152         [panel beginSheetModalForWindow: owner completionHandler:^(NSInteger result)
 153         {
 154             [dd exitModalWithEnv:env result:result];
 155         }
 156         ];
 157     } else {
 158         [panel beginWithCompletionHandler:^(NSInteger result)
 159         {
 160             [dd exitModalWithEnv:env result:result];
 161         }
 162         ];
 163     }
 164 
 165     (*env)->CallObjectMethod(env, dd->eventLoop, javaIDs.EventLoop.enter);


 233         }
 234         else
 235         {
 236             [self->panel setAllowedFileTypes:extensions];
 237         }
 238         [self->panel validateVisibleColumns];
 239     }
 240 }
 241 
 242 @end
 243 
 244 static jobject convertNSURLtoFile(JNIEnv *env, NSURL *url)
 245 {
 246     LOG("   url: %s", [[url path] UTF8String]);
 247     jstring path = (*env)->NewStringUTF(env, [[url path] UTF8String]);
 248 
 249     jobject ret = NULL;
 250 
 251     // Make sure the class is initialized before using the methodIDs
 252     const jclass MacCommonDialogsCls = [GlassHelper ClassForName:"com.sun.glass.ui.mac.MacCommonDialogs" withEnv:env];

 253 
 254     // Performance doesn't matter here, so call the method every time
 255     jboolean result = (*env)->CallStaticBooleanMethod(env, MacCommonDialogsCls,
 256                 javaIDs.MacCommonDialogs.isFileNSURLEnabled);
 257     GLASS_CHECK_EXCEPTION(env);
 258     if (result)
 259     {
 260         [url retain]; //NOTE: an app must call MacFileURL.dispoes() to release it
 261 
 262         const jclass MacFileNSURLCls = [GlassHelper ClassForName:"com.sun.glass.ui.mac.MacFileNSURL" withEnv:env];

 263         ret = (*env)->NewObject(env,
 264                 MacFileNSURLCls,
 265                 javaIDs.MacFileNSURL.init, path, ptr_to_jlong(url));
 266         GLASS_CHECK_EXCEPTION(env);
 267         (*env)->DeleteLocalRef(env, MacFileNSURLCls);
 268     }
 269     else
 270     {
 271         jclass jcls = (*env)->FindClass(env, "java/io/File");
 272         GLASS_CHECK_EXCEPTION(env);
 273         ret = (*env)->NewObject(env,
 274                 jcls,
 275                 javaIDs.File.init, path);
 276         GLASS_CHECK_EXCEPTION(env);
 277     }
 278 
 279     (*env)->DeleteLocalRef(env, MacCommonDialogsCls);
 280     return ret;
 281 }
 282 


 417     GLASS_CHECK_EXCEPTION(env);
 418 
 419     return jMacFileNSURL;
 420 }
 421 
 422 
 423 /* *********** MacCommonDialogs *********** */
 424 
 425 /*
 426  * Class:     com_sun_glass_ui_mac_MacCommonDialogs
 427  * Method:    _initIDs
 428  * Signature: ()V
 429  */
 430 JNIEXPORT void JNICALL Java_com_sun_glass_ui_mac_MacCommonDialogs__1initIDs
 431 (JNIEnv *env, jclass cls)
 432 {
 433     javaIDs.MacCommonDialogs.isFileNSURLEnabled = (*env)->GetStaticMethodID(env, cls, "isFileNSURLEnabled", "()Z");
 434     if ((*env)->ExceptionCheck(env)) return;
 435 
 436     cls = [GlassHelper ClassForName:"com.sun.glass.ui.EventLoop" withEnv:env];



 437     javaIDs.EventLoop.init  = (*env)->GetMethodID(env, cls, "<init>", "()V");
 438     if ((*env)->ExceptionCheck(env)) return;
 439     javaIDs.EventLoop.enter = (*env)->GetMethodID(env, cls, "enter", "()Ljava/lang/Object;");
 440     if ((*env)->ExceptionCheck(env)) return;
 441     javaIDs.EventLoop.leave = (*env)->GetMethodID(env, cls, "leave", "(Ljava/lang/Object;)V");
 442     if ((*env)->ExceptionCheck(env)) return;
 443 
 444     initJavaIDsList(env);
 445     initJavaIDsArrayList(env);
 446     initJavaIDsFile(env);
 447 
 448     cls = [GlassHelper ClassForName:"com.sun.glass.ui.CommonDialogs$ExtensionFilter" withEnv:env];



 449     javaIDs.ExtensionFilter.getDescription = (*env)->GetMethodID(env, cls, "getDescription", "()Ljava/lang/String;");
 450     if ((*env)->ExceptionCheck(env)) return;
 451     javaIDs.ExtensionFilter.extensionsToArray  = (*env)->GetMethodID(env, cls, "extensionsToArray", "()[Ljava/lang/String;");
 452     if ((*env)->ExceptionCheck(env)) return;
 453 
 454     cls = [GlassHelper ClassForName:"com.sun.glass.ui.CommonDialogs$FileChooserResult" withEnv:env];



 455     javaIDs.FileChooserResult.init = (*env)->GetMethodID(env, cls, "<init>", "(Ljava/util/List;Lcom/sun/glass/ui/CommonDialogs$ExtensionFilter;)V");
 456 }
 457 
 458 /*
 459  * Class:     com_sun_glass_ui_mac_MacCommonDialogs
 460  * Method:    _showFileOpenChooser
 461  * Signature: (JLjava/lang/String;Ljava/lang/String;Z[Lcom/sun/glass/ui/CommonDialogs$ExtensionFilter;I)Lcom.sun.glass.ui.CommonDialogs$FileChooserResult;
 462  */
 463 JNIEXPORT jobject JNICALL Java_com_sun_glass_ui_mac_MacCommonDialogs__1showFileOpenChooser
 464 (JNIEnv *env, jclass cls, jlong owner, jstring jFolder, jstring jTitle, jboolean jMultipleMode, jobjectArray jExtensionFilters, jint defaultIndex)
 465 {
 466     LOG("Java_com_sun_glass_ui_mac_MacCommonDialogs__1showFileOpenChooser");
 467 
 468     jobject result = NULL;
 469 
 470     GLASS_ASSERT_MAIN_JAVA_THREAD(env);
 471     GLASS_POOL_ENTER;
 472     {
 473         NSOpenPanel *panel = [GlassApplication isSandboxed] ? [NSOpenPanel openPanel] : [GlassOpenPanel openPanel];
 474         [panel setAllowsMultipleSelection:(jMultipleMode==JNI_TRUE)];


 505             if (([dispatcher getButton] == NSFileHandlingPanelOKButton) && ([urls count] > 0))
 506             {
 507                 for (NSUInteger i=0; i<[urls count]; i++)
 508                 {
 509                     NSURL *url = [urls objectAtIndex:i];
 510                     (*env)->CallBooleanMethod(env, chosenFiles, javaIDs.List.add, convertNSURLtoFile(env, url));
 511                     GLASS_CHECK_EXCEPTION(env);
 512                 }
 513             }
 514 
 515             if (jExtensionFilters != NULL && (*env)->GetArrayLength(env, jExtensionFilters) > 0)
 516             {
 517                 chosenFilter = (*env)->GetObjectArrayElement(env, jExtensionFilters,
 518                                                              [(NSPopUpButton*)[panel accessoryView] indexOfSelectedItem]);
 519                 GLASS_CHECK_EXCEPTION(env);
 520             }
 521         }
 522         [dispatcher release];
 523 
 524         cls = [GlassHelper ClassForName:"com.sun.glass.ui.CommonDialogs$FileChooserResult" withEnv:env];

 525         result = (*env)->NewObject(env, cls, javaIDs.FileChooserResult.init, chosenFiles, chosenFilter);
 526     }
 527     GLASS_POOL_EXIT;
 528     GLASS_CHECK_EXCEPTION(env);
 529 
 530     return result;
 531 }
 532 
 533 /*
 534  * Class:     com_sun_glass_ui_mac_MacCommonDialogs
 535  * Method:    _showFileSaveChooser
 536  * Signature: (JLjava/lang/String;Ljava/lang/String;Ljava/lang/String;[Lcom/sun/glass/ui/CommonDialogs$ExtensionFilter;I)Lcom.sun.glass.ui.CommonDialogs$FileChooserResult;
 537  */
 538 JNIEXPORT jobject JNICALL Java_com_sun_glass_ui_mac_MacCommonDialogs__1showFileSaveChooser
 539 (JNIEnv *env, jclass cls, jlong owner, jstring jFolder, jstring jFilename, jstring jTitle, jobjectArray jExtensionFilters, jint defaultIndex)
 540 {
 541     LOG("Java_com_sun_glass_ui_mac_MacCommonDialogs__1showFileSaveChooser");
 542 
 543     jobject result = NULL;
 544 


 576             jclass jcls = (*env)->FindClass(env, "java/util/ArrayList");
 577             GLASS_CHECK_EXCEPTION(env);
 578             chosenFile = (*env)->NewObject(env, jcls, javaIDs.ArrayList.init);
 579             GLASS_CHECK_EXCEPTION(env);
 580             if (([dispatcher getButton] == NSFileHandlingPanelOKButton) && (url != nil))
 581             {
 582                 (*env)->CallBooleanMethod(env, chosenFile, javaIDs.List.add, convertNSURLtoFile(env, url));
 583                 GLASS_CHECK_EXCEPTION(env);
 584             }
 585 
 586             if (jExtensionFilters != NULL && (*env)->GetArrayLength(env, jExtensionFilters) > 0)
 587             {
 588                 chosenFilter = (*env)->GetObjectArrayElement(env, jExtensionFilters,
 589                                                              [(NSPopUpButton*)[panel accessoryView] indexOfSelectedItem]);
 590                 GLASS_CHECK_EXCEPTION(env);
 591             }
 592         }
 593         [dispatcher release];
 594 
 595         cls = [GlassHelper ClassForName:"com.sun.glass.ui.CommonDialogs$FileChooserResult" withEnv:env];

 596         result = (*env)->NewObject(env, cls, javaIDs.FileChooserResult.init, chosenFile, chosenFilter);
 597     }
 598     GLASS_POOL_EXIT;
 599     GLASS_CHECK_EXCEPTION(env);
 600 
 601     return result;
 602 }
 603 
 604 /*
 605  * Class:     com_sun_glass_ui_mac_MacCommonDialogs
 606  * Method:    _showFolderChooser
 607  * Signature: (JLjava/lang/String;Ljava/lang/String;)Ljava/io/File;
 608  */
 609 JNIEXPORT jobject JNICALL Java_com_sun_glass_ui_mac_MacCommonDialogs__1showFolderChooser
 610 (JNIEnv *env, jclass cls, jlong owner, jstring jFolder, jstring jTitle)
 611 {
 612     LOG("Java_com_sun_glass_ui_mac_MacCommonDialogs__1showFolderChooser");
 613 
 614     jobject chosen = NULL;
 615 




 124     self = [super init];
 125 
 126     self->panel = p;
 127     self->owner = o;
 128 
 129     return self;
 130 }
 131 
 132 - (void)exitModalWithEnv:(JNIEnv*)env result:(NSInteger)result
 133 {
 134     self->button = result;
 135     (*env)->CallVoidMethod(env, self->eventLoop, javaIDs.EventLoop.leave, NULL);
 136     GLASS_CHECK_EXCEPTION(env);
 137 }
 138 
 139 - (void)runModally
 140 {
 141     GET_MAIN_JENV;
 142     DialogDispatcher *dd = self;
 143 
 144     jclass eventLoopCls = [GlassHelper ClassForName:"com.sun.glass.ui.EventLoop" withEnv:env];
 145     if (!eventLoopCls) {
 146         return;
 147     }
 148     jobject jobj = (*env)->NewObject(env,
 149             eventLoopCls,
 150             javaIDs.EventLoop.init);
 151     if ((*env)->ExceptionCheck(env)) return;
 152 
 153     dd->eventLoop = (*env)->NewGlobalRef(env, jobj);
 154 
 155     if (owner) {
 156         [panel beginSheetModalForWindow: owner completionHandler:^(NSInteger result)
 157         {
 158             [dd exitModalWithEnv:env result:result];
 159         }
 160         ];
 161     } else {
 162         [panel beginWithCompletionHandler:^(NSInteger result)
 163         {
 164             [dd exitModalWithEnv:env result:result];
 165         }
 166         ];
 167     }
 168 
 169     (*env)->CallObjectMethod(env, dd->eventLoop, javaIDs.EventLoop.enter);


 237         }
 238         else
 239         {
 240             [self->panel setAllowedFileTypes:extensions];
 241         }
 242         [self->panel validateVisibleColumns];
 243     }
 244 }
 245 
 246 @end
 247 
 248 static jobject convertNSURLtoFile(JNIEnv *env, NSURL *url)
 249 {
 250     LOG("   url: %s", [[url path] UTF8String]);
 251     jstring path = (*env)->NewStringUTF(env, [[url path] UTF8String]);
 252 
 253     jobject ret = NULL;
 254 
 255     // Make sure the class is initialized before using the methodIDs
 256     const jclass MacCommonDialogsCls = [GlassHelper ClassForName:"com.sun.glass.ui.mac.MacCommonDialogs" withEnv:env];
 257     if (!MacCommonDialogsCls) return NULL;
 258 
 259     // Performance doesn't matter here, so call the method every time
 260     jboolean result = (*env)->CallStaticBooleanMethod(env, MacCommonDialogsCls,
 261                 javaIDs.MacCommonDialogs.isFileNSURLEnabled);
 262     GLASS_CHECK_EXCEPTION(env);
 263     if (result)
 264     {
 265         [url retain]; //NOTE: an app must call MacFileURL.dispoes() to release it
 266 
 267         const jclass MacFileNSURLCls = [GlassHelper ClassForName:"com.sun.glass.ui.mac.MacFileNSURL" withEnv:env];
 268         if (!MacFileNSURLCls) return NULL;
 269         ret = (*env)->NewObject(env,
 270                 MacFileNSURLCls,
 271                 javaIDs.MacFileNSURL.init, path, ptr_to_jlong(url));
 272         GLASS_CHECK_EXCEPTION(env);
 273         (*env)->DeleteLocalRef(env, MacFileNSURLCls);
 274     }
 275     else
 276     {
 277         jclass jcls = (*env)->FindClass(env, "java/io/File");
 278         GLASS_CHECK_EXCEPTION(env);
 279         ret = (*env)->NewObject(env,
 280                 jcls,
 281                 javaIDs.File.init, path);
 282         GLASS_CHECK_EXCEPTION(env);
 283     }
 284 
 285     (*env)->DeleteLocalRef(env, MacCommonDialogsCls);
 286     return ret;
 287 }
 288 


 423     GLASS_CHECK_EXCEPTION(env);
 424 
 425     return jMacFileNSURL;
 426 }
 427 
 428 
 429 /* *********** MacCommonDialogs *********** */
 430 
 431 /*
 432  * Class:     com_sun_glass_ui_mac_MacCommonDialogs
 433  * Method:    _initIDs
 434  * Signature: ()V
 435  */
 436 JNIEXPORT void JNICALL Java_com_sun_glass_ui_mac_MacCommonDialogs__1initIDs
 437 (JNIEnv *env, jclass cls)
 438 {
 439     javaIDs.MacCommonDialogs.isFileNSURLEnabled = (*env)->GetStaticMethodID(env, cls, "isFileNSURLEnabled", "()Z");
 440     if ((*env)->ExceptionCheck(env)) return;
 441 
 442     cls = [GlassHelper ClassForName:"com.sun.glass.ui.EventLoop" withEnv:env];
 443     if (!cls) {
 444         return;
 445     }
 446     javaIDs.EventLoop.init  = (*env)->GetMethodID(env, cls, "<init>", "()V");
 447     if ((*env)->ExceptionCheck(env)) return;
 448     javaIDs.EventLoop.enter = (*env)->GetMethodID(env, cls, "enter", "()Ljava/lang/Object;");
 449     if ((*env)->ExceptionCheck(env)) return;
 450     javaIDs.EventLoop.leave = (*env)->GetMethodID(env, cls, "leave", "(Ljava/lang/Object;)V");
 451     if ((*env)->ExceptionCheck(env)) return;
 452 
 453     initJavaIDsList(env);
 454     initJavaIDsArrayList(env);
 455     initJavaIDsFile(env);
 456 
 457     cls = [GlassHelper ClassForName:"com.sun.glass.ui.CommonDialogs$ExtensionFilter" withEnv:env];
 458     if (!cls) {
 459         return;
 460     }
 461     javaIDs.ExtensionFilter.getDescription = (*env)->GetMethodID(env, cls, "getDescription", "()Ljava/lang/String;");
 462     if ((*env)->ExceptionCheck(env)) return;
 463     javaIDs.ExtensionFilter.extensionsToArray  = (*env)->GetMethodID(env, cls, "extensionsToArray", "()[Ljava/lang/String;");
 464     if ((*env)->ExceptionCheck(env)) return;
 465 
 466     cls = [GlassHelper ClassForName:"com.sun.glass.ui.CommonDialogs$FileChooserResult" withEnv:env];
 467     if (!cls) {
 468         return;
 469     }
 470     javaIDs.FileChooserResult.init = (*env)->GetMethodID(env, cls, "<init>", "(Ljava/util/List;Lcom/sun/glass/ui/CommonDialogs$ExtensionFilter;)V");
 471 }
 472 
 473 /*
 474  * Class:     com_sun_glass_ui_mac_MacCommonDialogs
 475  * Method:    _showFileOpenChooser
 476  * Signature: (JLjava/lang/String;Ljava/lang/String;Z[Lcom/sun/glass/ui/CommonDialogs$ExtensionFilter;I)Lcom.sun.glass.ui.CommonDialogs$FileChooserResult;
 477  */
 478 JNIEXPORT jobject JNICALL Java_com_sun_glass_ui_mac_MacCommonDialogs__1showFileOpenChooser
 479 (JNIEnv *env, jclass cls, jlong owner, jstring jFolder, jstring jTitle, jboolean jMultipleMode, jobjectArray jExtensionFilters, jint defaultIndex)
 480 {
 481     LOG("Java_com_sun_glass_ui_mac_MacCommonDialogs__1showFileOpenChooser");
 482 
 483     jobject result = NULL;
 484 
 485     GLASS_ASSERT_MAIN_JAVA_THREAD(env);
 486     GLASS_POOL_ENTER;
 487     {
 488         NSOpenPanel *panel = [GlassApplication isSandboxed] ? [NSOpenPanel openPanel] : [GlassOpenPanel openPanel];
 489         [panel setAllowsMultipleSelection:(jMultipleMode==JNI_TRUE)];


 520             if (([dispatcher getButton] == NSFileHandlingPanelOKButton) && ([urls count] > 0))
 521             {
 522                 for (NSUInteger i=0; i<[urls count]; i++)
 523                 {
 524                     NSURL *url = [urls objectAtIndex:i];
 525                     (*env)->CallBooleanMethod(env, chosenFiles, javaIDs.List.add, convertNSURLtoFile(env, url));
 526                     GLASS_CHECK_EXCEPTION(env);
 527                 }
 528             }
 529 
 530             if (jExtensionFilters != NULL && (*env)->GetArrayLength(env, jExtensionFilters) > 0)
 531             {
 532                 chosenFilter = (*env)->GetObjectArrayElement(env, jExtensionFilters,
 533                                                              [(NSPopUpButton*)[panel accessoryView] indexOfSelectedItem]);
 534                 GLASS_CHECK_EXCEPTION(env);
 535             }
 536         }
 537         [dispatcher release];
 538 
 539         cls = [GlassHelper ClassForName:"com.sun.glass.ui.CommonDialogs$FileChooserResult" withEnv:env];
 540         if (!cls) return NULL;
 541         result = (*env)->NewObject(env, cls, javaIDs.FileChooserResult.init, chosenFiles, chosenFilter);
 542     }
 543     GLASS_POOL_EXIT;
 544     GLASS_CHECK_EXCEPTION(env);
 545 
 546     return result;
 547 }
 548 
 549 /*
 550  * Class:     com_sun_glass_ui_mac_MacCommonDialogs
 551  * Method:    _showFileSaveChooser
 552  * Signature: (JLjava/lang/String;Ljava/lang/String;Ljava/lang/String;[Lcom/sun/glass/ui/CommonDialogs$ExtensionFilter;I)Lcom.sun.glass.ui.CommonDialogs$FileChooserResult;
 553  */
 554 JNIEXPORT jobject JNICALL Java_com_sun_glass_ui_mac_MacCommonDialogs__1showFileSaveChooser
 555 (JNIEnv *env, jclass cls, jlong owner, jstring jFolder, jstring jFilename, jstring jTitle, jobjectArray jExtensionFilters, jint defaultIndex)
 556 {
 557     LOG("Java_com_sun_glass_ui_mac_MacCommonDialogs__1showFileSaveChooser");
 558 
 559     jobject result = NULL;
 560 


 592             jclass jcls = (*env)->FindClass(env, "java/util/ArrayList");
 593             GLASS_CHECK_EXCEPTION(env);
 594             chosenFile = (*env)->NewObject(env, jcls, javaIDs.ArrayList.init);
 595             GLASS_CHECK_EXCEPTION(env);
 596             if (([dispatcher getButton] == NSFileHandlingPanelOKButton) && (url != nil))
 597             {
 598                 (*env)->CallBooleanMethod(env, chosenFile, javaIDs.List.add, convertNSURLtoFile(env, url));
 599                 GLASS_CHECK_EXCEPTION(env);
 600             }
 601 
 602             if (jExtensionFilters != NULL && (*env)->GetArrayLength(env, jExtensionFilters) > 0)
 603             {
 604                 chosenFilter = (*env)->GetObjectArrayElement(env, jExtensionFilters,
 605                                                              [(NSPopUpButton*)[panel accessoryView] indexOfSelectedItem]);
 606                 GLASS_CHECK_EXCEPTION(env);
 607             }
 608         }
 609         [dispatcher release];
 610 
 611         cls = [GlassHelper ClassForName:"com.sun.glass.ui.CommonDialogs$FileChooserResult" withEnv:env];
 612         if (!cls) return NULL;
 613         result = (*env)->NewObject(env, cls, javaIDs.FileChooserResult.init, chosenFile, chosenFilter);
 614     }
 615     GLASS_POOL_EXIT;
 616     GLASS_CHECK_EXCEPTION(env);
 617 
 618     return result;
 619 }
 620 
 621 /*
 622  * Class:     com_sun_glass_ui_mac_MacCommonDialogs
 623  * Method:    _showFolderChooser
 624  * Signature: (JLjava/lang/String;Ljava/lang/String;)Ljava/io/File;
 625  */
 626 JNIEXPORT jobject JNICALL Java_com_sun_glass_ui_mac_MacCommonDialogs__1showFolderChooser
 627 (JNIEnv *env, jclass cls, jlong owner, jstring jFolder, jstring jTitle)
 628 {
 629     LOG("Java_com_sun_glass_ui_mac_MacCommonDialogs__1showFolderChooser");
 630 
 631     jobject chosen = NULL;
 632 


< prev index next >