aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDenis Fokin <Denis.Fokin@jetbrains.com>2016-08-01 16:47:30 +0300
committerDenis Fokin <Denis.Fokin@jetbrains.com>2016-08-01 16:47:30 +0300
commit2843de1556c161521d9663344290e8cc71e7d70b (patch)
treeca089f5c448bf36fc509f57e8326959068124ad9
parentaf900c498925821d0ad3aecc5d1e462e4fd7ef8e (diff)
downloadjdk8u_jdk-2843de1556c161521d9663344290e8cc71e7d70b.tar.gz
IDEA-146669 Enable Mac native file dialogsjb8u112-b274
-rw-r--r--src/macosx/classes/sun/lwawt/macosx/CFileDialog.java13
-rw-r--r--src/macosx/native/sun/awt/CFileDialog.h5
-rw-r--r--src/macosx/native/sun/awt/CFileDialog.m65
3 files changed, 66 insertions, 17 deletions
diff --git a/src/macosx/classes/sun/lwawt/macosx/CFileDialog.java b/src/macosx/classes/sun/lwawt/macosx/CFileDialog.java
index cc31b532f7..4f82c75551 100644
--- a/src/macosx/classes/sun/lwawt/macosx/CFileDialog.java
+++ b/src/macosx/classes/sun/lwawt/macosx/CFileDialog.java
@@ -37,6 +37,7 @@ import java.io.*;
import sun.awt.CausedFocusEvent.Cause;
import sun.awt.AWTAccessor;
import sun.java2d.pipe.Region;
+import sun.lwawt.LWWindowPeer;
import sun.security.action.GetBooleanAction;
class CFileDialog implements FileDialogPeer {
@@ -57,7 +58,13 @@ class CFileDialog implements FileDialogPeer {
title = " ";
}
- String[] userFileNames = nativeRunFileDialog(title,
+ Window owner = target.getOwner();
+
+ long ownerPtr = owner == null ? 0L :((CPlatformWindow) (((LWWindowPeer)owner.getPeer())).getPlatformWindow()).getNSWindowPtr();
+
+ String[] userFileNames = nativeRunFileDialog(
+ ownerPtr,
+ title,
dialogMode,
target.isMultipleMode(),
navigateApps,
@@ -70,7 +77,7 @@ class CFileDialog implements FileDialogPeer {
String file = null;
File[] files = null;
- if (userFileNames != null) {
+ if (userFileNames != null && userFileNames.length > 0) {
// the dialog wasn't cancelled
int filesNumber = userFileNames.length;
files = new File[filesNumber];
@@ -145,7 +152,7 @@ class CFileDialog implements FileDialogPeer {
return ret;
}
- private native String[] nativeRunFileDialog(String title, int mode,
+ private native String[] nativeRunFileDialog(long ownerPtr, String title, int mode,
boolean multipleMode, boolean shouldNavigateApps,
boolean canChooseDirectories, boolean hasFilenameFilter,
String directory, String file);
diff --git a/src/macosx/native/sun/awt/CFileDialog.h b/src/macosx/native/sun/awt/CFileDialog.h
index ba435113ee..1843c41e82 100644
--- a/src/macosx/native/sun/awt/CFileDialog.h
+++ b/src/macosx/native/sun/awt/CFileDialog.h
@@ -27,6 +27,8 @@
#import <JavaNativeFoundation/JavaNativeFoundation.h>
@interface CFileDialog : NSObject <NSOpenSavePanelDelegate> {
+ NSWindow* fOwner;
+
// Should we query back to Java for a file filter?
jboolean fHasFileFilter;
@@ -60,7 +62,8 @@
}
// Allocator
-- (id) initWithFilter:(jboolean)inHasFilter
+- (id) initWithOwner:(NSWindow*) owner
+ filter:(jboolean)inHasFilter
fileDialog:(jobject)inDialog
title:(NSString *)inTitle
directory:(NSString *)inPath
diff --git a/src/macosx/native/sun/awt/CFileDialog.m b/src/macosx/native/sun/awt/CFileDialog.m
index 7dc820266c..107e740ce9 100644
--- a/src/macosx/native/sun/awt/CFileDialog.m
+++ b/src/macosx/native/sun/awt/CFileDialog.m
@@ -35,7 +35,8 @@
@implementation CFileDialog
-- (id)initWithFilter:(jboolean)inHasFilter
+- (id)initWithOwner:(NSWindow*)owner
+ filter:(jboolean)inHasFilter
fileDialog:(jobject)inDialog
title:(NSString *)inTitle
directory:(NSString *)inPath
@@ -47,6 +48,8 @@ canChooseDirectories:(BOOL)inChooseDirectories
withEnv:(JNIEnv*)env;
{
if (self == [super init]) {
+ fOwner = owner;
+ [fOwner retain];
fHasFileFilter = inHasFilter;
fFileDialog = JNFNewGlobalRef(env, inDialog);
fDirectory = inPath;
@@ -86,6 +89,9 @@ canChooseDirectories:(BOOL)inChooseDirectories
[fURLs release];
fURLs = nil;
+ [fOwner release];
+ fOwner = nil;
+
[super dealloc];
}
//- (void)finalize { [super finalize]; }
@@ -124,18 +130,50 @@ canChooseDirectories:(BOOL)inChooseDirectories
}
[thePanel setDelegate:self];
- fPanelResult = [thePanel runModalForDirectory:fDirectory file:fFile];
- [thePanel setDelegate:nil];
- if ([self userClickedOK]) {
- if (fMode == java_awt_FileDialog_LOAD) {
- NSOpenPanel *openPanel = (NSOpenPanel *)thePanel;
- fURLs = [openPanel URLs];
- } else {
- fURLs = [NSArray arrayWithObject:[thePanel URL]];
+ if (fOwner != nil) {
+ if (fDirectory != nil) {
+ [thePanel setDirectoryURL:[NSURL fileURLWithPath:[fDirectory stringByExpandingTildeInPath]]];
+ }
+
+ if (fFile != nil) {
+ [thePanel setNameFieldStringValue:fFile];
+ }
+
+ [thePanel beginSheetModalForWindow:fOwner completionHandler:^(NSInteger result) {
+
+ if (result == NSFileHandlingPanelOKButton) {
+ NSOpenPanel *openPanel = (NSOpenPanel *)thePanel;
+ fURLs = (fMode == java_awt_FileDialog_LOAD)
+ ? [openPanel URLs]
+ : [NSArray arrayWithObject:[openPanel URL]];
+ fPanelResult = NSFileHandlingPanelOKButton;
+ } else {
+ fURLs = [NSArray array];
+ }
+ [fURLs retain];
+ [NSApp stopModal];
+ }
+ ];
+
+ [NSApp runModalForWindow:thePanel];
+ }
+ else
+ {
+ fPanelResult = [thePanel runModalForDirectory:fDirectory file:fFile];
+
+ if ([self userClickedOK]) {
+ if (fMode == java_awt_FileDialog_LOAD) {
+ NSOpenPanel *openPanel = (NSOpenPanel *)thePanel;
+ fURLs = [openPanel URLs];
+ } else {
+ fURLs = [NSArray arrayWithObject:[thePanel URL]];
+ }
+ [fURLs retain];
}
- [fURLs retain];
}
+
+ [thePanel setDelegate:nil];
}
[self disposer];
@@ -175,7 +213,7 @@ canChooseDirectories:(BOOL)inChooseDirectories
}
- (BOOL) userClickedOK {
- return fPanelResult == NSOKButton;
+ return fPanelResult == NSFileHandlingPanelOKButton;
}
- (NSArray *)URLs {
@@ -191,7 +229,7 @@ canChooseDirectories:(BOOL)inChooseDirectories
*/
JNIEXPORT jobjectArray JNICALL
Java_sun_lwawt_macosx_CFileDialog_nativeRunFileDialog
-(JNIEnv *env, jobject peer, jstring title, jint mode, jboolean multipleMode,
+(JNIEnv *env, jobject peer, jlong ownerPtr, jstring title, jint mode, jboolean multipleMode,
jboolean navigateApps, jboolean chooseDirectories, jboolean hasFilter,
jstring directory, jstring file)
{
@@ -203,7 +241,8 @@ JNF_COCOA_ENTER(env);
dialogTitle = @" ";
}
- CFileDialog *dialogDelegate = [[CFileDialog alloc] initWithFilter:hasFilter
+ CFileDialog *dialogDelegate = [[CFileDialog alloc] initWithOwner:(NSWindow *)jlong_to_ptr(ownerPtr)
+ filter:hasFilter
fileDialog:peer
title:dialogTitle
directory:JNFJavaToNSString(env, directory)