2828import java .util .ArrayList ;
2929import java .util .Arrays ;
3030import java .util .HashMap ;
31+ import java .util .IdentityHashMap ;
3132import java .util .List ;
3233import java .util .Locale ;
3334import java .util .Map ;
@@ -607,6 +608,11 @@ private List<FileFilter> getFiltersForDialog() {
607608 return filters2 ;
608609 }
609610
611+ private void updateFileFilter ( List <FileFilter > filters , int index ) {
612+ if ( index >= 0 && index < filters .size () )
613+ setFileFilter ( filters .get ( index ) );
614+ }
615+
610616 public ApproveCallback getApproveCallback () {
611617 return approveCallback ;
612618 }
@@ -890,6 +896,7 @@ String[] showSystemDialog( Window owner, SystemFileChooser fc ) {
890896 // filter
891897 int fileTypeIndex = 0 ;
892898 ArrayList <String > fileTypes = new ArrayList <>();
899+ ArrayList <FileFilter > fileTypeFilters = new ArrayList <>();
893900 if ( !fc .isDirectorySelectionEnabled () ) {
894901 List <FileFilter > filters = fc .getFiltersForDialog ();
895902 if ( !filters .isEmpty () ) {
@@ -898,9 +905,11 @@ String[] showSystemDialog( Window owner, SystemFileChooser fc ) {
898905 if ( filter instanceof FileNameExtensionFilter ) {
899906 fileTypes .add ( filter .getDescription () );
900907 fileTypes .add ( "*." + String .join ( ";*." , ((FileNameExtensionFilter )filter ).getExtensions () ) );
908+ fileTypeFilters .add ( filter );
901909 } else if ( filter instanceof AcceptAllFileFilter ) {
902910 fileTypes .add ( filter .getDescription () );
903911 fileTypes .add ( "*.*" );
912+ fileTypeFilters .add ( filter );
904913 }
905914 }
906915 }
@@ -916,19 +925,24 @@ String[] showSystemDialog( Window owner, SystemFileChooser fc ) {
916925
917926 // callback
918927 FlatNativeWindowsLibrary .FileChooserCallback callback = (fc .getApproveCallback () != null )
919- ? (files , hwndFileDialog ) -> {
928+ ? (files , fileTypeIndex2 , hwndFileDialog ) -> {
929+ fc .updateFileFilter ( fileTypeFilters , fileTypeIndex2 );
920930 return invokeApproveCallback ( fc , files , new WindowsApproveContext ( hwndFileDialog ) );
921931 } : null ;
922932
923933 // show system file dialog
924- return FlatNativeWindowsLibrary .showFileChooser ( owner , open ,
934+ int [] retFileTypeIndex = { -1 };
935+ String [] result = FlatNativeWindowsLibrary .showFileChooser ( owner , open ,
925936 fc .getDialogTitle (), approveButtonText ,
926937 fc .getPlatformProperty ( WINDOWS_FILE_NAME_LABEL ),
927938 fileName , folder , saveAsItem ,
928939 fc .getPlatformProperty ( WINDOWS_DEFAULT_FOLDER ),
929940 fc .getPlatformProperty ( WINDOWS_DEFAULT_EXTENSION ),
930941 optionsSet , optionsClear , callback ,
931- fileTypeIndex , fileTypes .toArray ( new String [fileTypes .size ()] ) );
942+ fileTypeIndex , fileTypes .toArray ( new String [fileTypes .size ()] ), retFileTypeIndex );
943+ if ( result != null )
944+ fc .updateFileFilter ( fileTypeFilters , retFileTypeIndex [0 ] );
945+ return result ;
932946 }
933947
934948 //---- class WindowsApproveContext ----
@@ -1013,6 +1027,7 @@ String[] showSystemDialog( Window owner, SystemFileChooser fc ) {
10131027 // filter
10141028 int fileTypeIndex = 0 ;
10151029 ArrayList <String > fileTypes = new ArrayList <>();
1030+ ArrayList <FileFilter > fileTypeFilters = new ArrayList <>();
10161031 if ( !fc .isDirectorySelectionEnabled () ) {
10171032 List <FileFilter > filters = fc .getFiltersForDialog ();
10181033 if ( !filters .isEmpty () ) {
@@ -1023,29 +1038,36 @@ String[] showSystemDialog( Window owner, SystemFileChooser fc ) {
10231038 for ( String ext : ((FileNameExtensionFilter )filter ).getExtensions () )
10241039 fileTypes .add ( ext );
10251040 fileTypes .add ( null );
1041+ fileTypeFilters .add ( filter );
10261042 } else if ( filter instanceof AcceptAllFileFilter ) {
10271043 fileTypes .add ( filter .getDescription () );
10281044 fileTypes .add ( "*" );
10291045 fileTypes .add ( null );
1046+ fileTypeFilters .add ( filter );
10301047 }
10311048 }
10321049 }
10331050 }
10341051
10351052 // callback
10361053 FlatNativeMacLibrary .FileChooserCallback callback = (fc .getApproveCallback () != null )
1037- ? (files , hwndFileDialog ) -> {
1054+ ? (files , fileTypeIndex2 , hwndFileDialog ) -> {
1055+ fc .updateFileFilter ( fileTypeFilters , fileTypeIndex2 );
10381056 return invokeApproveCallback ( fc , files , new MacApproveContext ( hwndFileDialog ) );
10391057 } : null ;
10401058
10411059 // show system file dialog
1042- return FlatNativeMacLibrary .showFileChooser ( owner , dark , open ,
1060+ int [] retFileTypeIndex = { -1 };
1061+ String [] result = FlatNativeMacLibrary .showFileChooser ( owner , dark , open ,
10431062 fc .getDialogTitle (), fc .getApproveButtonText (),
10441063 fc .getPlatformProperty ( MAC_MESSAGE ),
10451064 fc .getPlatformProperty ( MAC_FILTER_FIELD_LABEL ),
10461065 fc .getPlatformProperty ( MAC_NAME_FIELD_LABEL ),
10471066 nameFieldStringValue , directoryURL , optionsSet , optionsClear , callback ,
1048- fileTypeIndex , fileTypes .toArray ( new String [fileTypes .size ()] ) );
1067+ fileTypeIndex , fileTypes .toArray ( new String [fileTypes .size ()] ), retFileTypeIndex );
1068+ if ( result != null )
1069+ fc .updateFileFilter ( fileTypeFilters , retFileTypeIndex [0 ] );
1070+ return result ;
10491071 }
10501072
10511073 //---- class MacApproveContext ----
@@ -1141,6 +1163,7 @@ String[] showSystemDialog( Window owner, SystemFileChooser fc ) {
11411163 // filter
11421164 int fileTypeIndex = 0 ;
11431165 ArrayList <String > fileTypes = new ArrayList <>();
1166+ ArrayList <FileFilter > fileTypeFilters = new ArrayList <>();
11441167 if ( !fc .isDirectorySelectionEnabled () ) {
11451168 List <FileFilter > filters = fc .getFiltersForDialog ();
11461169 if ( !filters .isEmpty () ) {
@@ -1151,26 +1174,33 @@ String[] showSystemDialog( Window owner, SystemFileChooser fc ) {
11511174 for ( String ext : ((FileNameExtensionFilter )filter ).getExtensions () )
11521175 fileTypes .add ( caseInsensitiveGlobPattern ( ext ) );
11531176 fileTypes .add ( null );
1177+ fileTypeFilters .add ( filter );
11541178 } else if ( filter instanceof AcceptAllFileFilter ) {
11551179 fileTypes .add ( filter .getDescription () );
11561180 fileTypes .add ( "*" );
11571181 fileTypes .add ( null );
1182+ fileTypeFilters .add ( filter );
11581183 }
11591184 }
11601185 }
11611186 }
11621187
11631188 // callback
11641189 FlatNativeLinuxLibrary .FileChooserCallback callback = (fc .getApproveCallback () != null )
1165- ? (files , hwndFileDialog ) -> {
1190+ ? (files , fileTypeIndex2 , hwndFileDialog ) -> {
1191+ fc .updateFileFilter ( fileTypeFilters , fileTypeIndex2 );
11661192 return invokeApproveCallback ( fc , files , new LinuxApproveContext ( hwndFileDialog ) );
11671193 } : null ;
11681194
11691195 // show system file dialog
1170- return FlatNativeLinuxLibrary .showFileChooser ( owner , dark , open ,
1196+ int [] retFileTypeIndex = { -1 };
1197+ String [] result = FlatNativeLinuxLibrary .showFileChooser ( owner , dark , open ,
11711198 fc .getDialogTitle (), approveButtonText , currentName , currentFolder ,
11721199 optionsSet , optionsClear , callback ,
1173- fileTypeIndex , fileTypes .toArray ( new String [fileTypes .size ()] ) );
1200+ fileTypeIndex , fileTypes .toArray ( new String [fileTypes .size ()] ), retFileTypeIndex );
1201+ if ( result != null )
1202+ fc .updateFileFilter ( fileTypeFilters , retFileTypeIndex [0 ] );
1203+ return result ;
11741204 }
11751205
11761206 private String caseInsensitiveGlobPattern ( String ext ) {
@@ -1253,6 +1283,8 @@ private static class SwingFileChooserProvider
12531283 {
12541284 @ Override
12551285 public File [] showDialog ( Window owner , SystemFileChooser fc ) {
1286+ IdentityHashMap <javax .swing .filechooser .FileFilter , FileFilter > filterMap = new IdentityHashMap <>();
1287+
12561288 JFileChooser chooser = new JFileChooser () {
12571289 @ Override
12581290 public void approveSelection () {
@@ -1273,6 +1305,7 @@ public void approveSelection() {
12731305 // callback
12741306 ApproveCallback approveCallback = fc .getApproveCallback ();
12751307 if ( approveCallback != null ) {
1308+ updateFileFilter ( fc , this , filterMap );
12761309 int result = approveCallback .approve ( files , new SwingApproveContext ( this ) );
12771310 if ( result == CANCEL_OPTION )
12781311 return ;
@@ -1313,6 +1346,7 @@ public void approveSelection() {
13131346 chooser .addChoosableFileFilter ( jfilter );
13141347 if ( filter == currentFilter )
13151348 chooser .setFileFilter ( jfilter );
1349+ filterMap .put ( jfilter , filter );
13161350 }
13171351 }
13181352 }
@@ -1340,6 +1374,7 @@ public void approveSelection() {
13401374
13411375 // show dialog
13421376 int result = chooser .showDialog ( owner , null );
1377+ updateFileFilter ( fc , chooser , filterMap );
13431378
13441379 // save window size
13451380 Dimension windowSize = chooser .getSize ();
@@ -1367,6 +1402,14 @@ private javax.swing.filechooser.FileFilter convertFilter( FileFilter filter, JFi
13671402 return null ;
13681403 }
13691404
1405+ private void updateFileFilter ( SystemFileChooser fc , JFileChooser chooser ,
1406+ IdentityHashMap <javax .swing .filechooser .FileFilter , FileFilter > filterMap )
1407+ {
1408+ FileFilter fileFilter = filterMap .get ( chooser .getFileFilter () );
1409+ if ( fileFilter != null )
1410+ fc .setFileFilter ( fileFilter );
1411+ }
1412+
13701413 private static boolean checkMustExist ( JFileChooser chooser , File [] files ) {
13711414 for ( File file : files ) {
13721415 if ( !file .exists () ) {
0 commit comments