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
|