diff options
-rw-r--r-- | src/macosx/classes/sun/lwawt/macosx/CFileDialog.java | 13 | ||||
-rw-r--r-- | src/macosx/native/sun/awt/CFileDialog.h | 5 | ||||
-rw-r--r-- | src/macosx/native/sun/awt/CFileDialog.m | 65 |
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) |