apple.awt.fileDialogForDirectories property not working.

Victor Dyakov victor.dyakov at oracle.com
Wed May 30 00:51:30 PDT 2012


I've created the sub-CR targeted to 7u8

Thanks,
Victor

On 29.05.2012 21:22, Mike Swingler wrote:
> Looks good to me...it's basically what was stripped out of our original contribution.
>
> Regards,
> Mike Swingler
> Apple Inc.
>
> On May 29, 2012, at 10:03 AM, Marco Dinacci wrote:
>
>> Hi Anthony,
>>
>>> This is a known issue: 7161437. Although it is closed as a duplicate of a
>>> more general AWT RFE 6927978 that proposes to add public API for
>>> DirectoryDialogs to AWT.
>> I understand that 7161437 is closed but since it's more than two years
>> that the RFE has been submitted and all I need really is just the fix
>> for the 7161437, here's a patch that actually fixes it. I don't know
>> if it's the best way to do it but this is certainly good enough for my
>> application. After the diff there's a test case. I hope it can be
>> useful.
>>
>> diff -r 6432464ffec2 src/macosx/classes/sun/lwawt/macosx/CFileDialog.java
>> --- a/src/macosx/classes/sun/lwawt/macosx/CFileDialog.java	Sat May 26
>> 08:01:40 2012 -0700
>> +++ b/src/macosx/classes/sun/lwawt/macosx/CFileDialog.java	Tue May 29
>> 17:56:51 2012 +0100
>> @@ -49,20 +49,28 @@ class CFileDialog implements FileDialogP
>>
>>                  navigateApps = true;
>>
>>                  String title = target.getTitle();
>>                  if (title == null) {
>>                      title = " ";
>>                  }
>>
>> +                String chooseDirectoriesValue =
>> System.getProperty("apple.awt.fileDialogForDirectories");
>> +                boolean chooseDirectories = false;
>> +                if(chooseDirectoriesValue != null&&
>> +                        chooseDirectoriesValue.equalsIgnoreCase("true")) {
>> +                    chooseDirectories = true;
>> +                }
>> +
>>                  String[] userFileNames = nativeRunFileDialog(title,
>>                          dialogMode,
>>                          target.isMultipleMode(),
>>                          navigateApps,
>> +                        chooseDirectories,
>>                          target.getFilenameFilter() != null,
>>                          target.getDirectory(),
>>                          target.getFile());
>>
>>                  String directory = null;
>>                  String file = null;
>>                  File[] files = null;
>>
>> @@ -137,18 +145,18 @@ class CFileDialog implements FileDialogP
>>              File directoryObj = new File(fileObj.getParent());
>>              String nameOnly = fileObj.getName();
>>              ret = ff.accept(directoryObj, nameOnly);
>>          }
>>          return ret;
>>      }
>>
>>      private native String[] nativeRunFileDialog(String title, int mode,
>> -            boolean multipleMode, boolean shouldNavigateApps, boolean
>> hasFilenameFilter,
>> -            String directory, String file);
>> +            boolean multipleMode, boolean shouldNavigateApps, boolean
>> canChooseDirectories,
>> +            boolean hasFilenameFilter, String directory, String file);
>>
>>      @Override
>>      public void setDirectory(String dir) {
>>      }
>>
>>      @Override
>>      public void setFile(String file) {
>>      }
>> diff -r 6432464ffec2 src/macosx/native/sun/awt/CFileDialog.h
>> --- a/src/macosx/native/sun/awt/CFileDialog.h	Sat May 26 08:01:40 2012 -0700
>> +++ b/src/macosx/native/sun/awt/CFileDialog.h	Tue May 29 17:56:51 2012 +0100
>> @@ -47,16 +47,19 @@
>>      jint fMode;
>>
>>      // Indicates whether the user can select multiple files
>>      BOOL fMultipleMode;
>>
>>      // Should we navigate into apps?
>>      BOOL fNavigateApps;
>>
>> +    // Can the dialog choose directories ?
>> +    BOOL fChooseDirectories;
>> +
>>      // Contains the absolute paths of the selected files as URLs
>>      NSArray *fURLs;
>> }
>>
>> // Allocator
>> - (id) initWithFilter:(jboolean)inHasFilter
>>             fileDialog:(jobject)inDialog
>>                  title:(NSString *)inTitle
>> diff -r 6432464ffec2 src/macosx/native/sun/awt/CFileDialog.m
>> --- a/src/macosx/native/sun/awt/CFileDialog.m	Sat May 26 08:01:40 2012 -0700
>> +++ b/src/macosx/native/sun/awt/CFileDialog.m	Tue May 29 17:56:51 2012 +0100
>> @@ -38,30 +38,32 @@
>> - (id)initWithFilter:(jboolean)inHasFilter
>>            fileDialog:(jobject)inDialog
>>                 title:(NSString *)inTitle
>>             directory:(NSString *)inPath
>>                  file:(NSString *)inFile
>>                  mode:(jint)inMode
>>          multipleMode:(BOOL)inMultipleMode
>>        shouldNavigate:(BOOL)inNavigateApps
>> +canChooseDirectories:(BOOL)inChooseDirectories
>>               withEnv:(JNIEnv*)env;
>> {
>>      if (self == [super init]) {
>>          fHasFileFilter = inHasFilter;
>>          fFileDialog = JNFNewGlobalRef(env, inDialog);
>>          fDirectory = inPath;
>>          [fDirectory retain];
>>          fFile = inFile;
>>          [fFile retain];
>>          fTitle = inTitle;
>>          [fTitle retain];
>>          fMode = inMode;
>>          fMultipleMode = inMultipleMode;
>>          fNavigateApps = inNavigateApps;
>> +        fChooseDirectories = inChooseDirectories;
>>          fPanelResult = NSCancelButton;
>>      }
>>
>>      return self;
>> }
>>
>> -(void) disposer {
>>      if (fFileDialog != NULL) {
>> @@ -104,17 +106,17 @@
>>          if (fNavigateApps) {
>>              [thePanel setTreatsFilePackagesAsDirectories:YES];
>>          }
>>
>>          if (fMode == java_awt_FileDialog_LOAD) {
>>              NSOpenPanel *openPanel = (NSOpenPanel *)thePanel;
>>              [openPanel setAllowsMultipleSelection:fMultipleMode];
>>              [openPanel setCanChooseFiles:YES];
>> -            [openPanel setCanChooseDirectories:NO];
>> +            [openPanel setCanChooseDirectories:fChooseDirectories];
>>              [openPanel setCanCreateDirectories:YES];
>>          }
>>
>>          [thePanel setDelegate:self];
>>          fPanelResult = [thePanel runModalForDirectory:fDirectory file:fFile];
>>          [thePanel setDelegate:nil];
>>
>>          if ([self userClickedOK]) {
>> @@ -177,17 +179,17 @@
>>   * Class:     sun_lwawt_macosx_CFileDialog
>>   * Method:    nativeRunFileDialog
>>   * Signature: (Ljava/lang/String;ILjava/io/FilenameFilter;
>>   *             Ljava/lang/String;Ljava/lang/String;)[Ljava/lang/String;
>>   */
>> JNIEXPORT jobjectArray JNICALL
>> Java_sun_lwawt_macosx_CFileDialog_nativeRunFileDialog
>> (JNIEnv *env, jobject peer, jstring title, jint mode, jboolean multipleMode,
>> - jboolean navigateApps, jboolean hasFilter, jstring directory, jstring file)
>> + jboolean navigateApps, jboolean chooseDirectories, jboolean
>> hasFilter, jstring directory, jstring file)
>> {
>>      jobjectArray returnValue = NULL;
>>
>> JNF_COCOA_ENTER(env);
>>      NSString *dialogTitle = JNFJavaToNSString(env, title);
>>      if ([dialogTitle length] == 0) {
>>          dialogTitle = @" ";
>>      }
>> @@ -195,16 +197,17 @@ JNF_COCOA_ENTER(env);
>>      CFileDialog *dialogDelegate = [[CFileDialog alloc] initWithFilter:hasFilter
>>                                                             fileDialog:peer
>>
>> title:dialogTitle
>>
>> directory:JNFJavaToNSString(env, directory)
>>
>> file:JNFJavaToNSString(env, file)
>>                                                                   mode:mode
>>
>> multipleMode:multipleMode
>>
>> shouldNavigate:navigateApps
>> +
>> canChooseDirectories:chooseDirectories
>>                                                                withEnv:env];
>>
>>      [JNFRunLoop performOnMainThread:@selector(safeSaveOrLoad)
>>                                   on:dialogDelegate
>>                           withObject:nil
>>                        waitUntilDone:YES];
>>
>>      if ([dialogDelegate userClickedOK]) {
>>
>>
>>
>> Test case:
>>
>> import java.awt.FileDialog;
>> import java.io.File;
>> import javax.swing.JFrame;
>>
>> public class FileDialogTest extends JFrame {
>>
>>     public String selectFolder() {
>>         FileDialog fd = new FileDialog(this, "Select Folder Test",
>> FileDialog.LOAD);
>>         fd.setDirectory(System.getProperty("user.home"));
>>         fd.setLocation(50,50);
>>         fd.setVisible(true);
>>
>>         return fd.getFile();
>>     }
>>
>>     public static void main(String[] args) {
>>         System.setProperty("apple.awt.fileDialogForDirectories", "true");
>>
>>         FileDialogTest fdt = new FileDialogTest();
>>         String selectedFolder = fdt.selectFolder();
>>
>>         System.out.println("The selected file was: " + selectedFolder);
>>
>>         System.setProperty("apple.awt.fileDialogForDirectories", "false");
>>         System.exit(0);
>>     }
>>
>> }
>>
>>
>> Best,
>> Marco



More information about the macosx-port-dev mailing list