mirror of
https://github.com/JFormDesigner/FlatLaf.git
synced 2025-12-07 06:20:53 +03:00
System File Chooser: (PR #988)
- fixed missing filter in combobox if only `setFileFilter(myFilter)` is used, but not `addChoosableFileFilter(myFilter)` - fallback Swing file chooser did ignore `isAcceptAllFileFilterUsed()` - check for supported filter types in `setFileFilter()`
This commit is contained in:
@@ -24,7 +24,9 @@ import java.awt.Window;
|
|||||||
import java.io.File;
|
import java.io.File;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
|
import java.util.Collections;
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
|
import java.util.List;
|
||||||
import java.util.Locale;
|
import java.util.Locale;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.concurrent.atomic.AtomicReference;
|
import java.util.concurrent.atomic.AtomicReference;
|
||||||
@@ -367,12 +369,23 @@ public class SystemFileChooser
|
|||||||
setApproveButtonMnemonic( vk );
|
setApproveButtonMnemonic( vk );
|
||||||
}
|
}
|
||||||
|
|
||||||
/** @see JFileChooser#getFileSelectionMode() */
|
/**
|
||||||
|
* Returns file-selection mode.
|
||||||
|
* Possible values are {@link #FILES_ONLY} and {@link #DIRECTORIES_ONLY}.
|
||||||
|
* Default is {@link #FILES_ONLY}.
|
||||||
|
*
|
||||||
|
* @see JFileChooser#getFileSelectionMode()
|
||||||
|
*/
|
||||||
public int getFileSelectionMode() {
|
public int getFileSelectionMode() {
|
||||||
return fileSelectionMode;
|
return fileSelectionMode;
|
||||||
}
|
}
|
||||||
|
|
||||||
/** @see JFileChooser#setFileSelectionMode(int) */
|
/**
|
||||||
|
* Sets file-selection mode.
|
||||||
|
* Possible values are {@link #FILES_ONLY} and {@link #DIRECTORIES_ONLY}.
|
||||||
|
*
|
||||||
|
* @see JFileChooser#setFileSelectionMode(int)
|
||||||
|
*/
|
||||||
public void setFileSelectionMode( int fileSelectionMode ) {
|
public void setFileSelectionMode( int fileSelectionMode ) {
|
||||||
if( fileSelectionMode != FILES_ONLY && fileSelectionMode != DIRECTORIES_ONLY )
|
if( fileSelectionMode != FILES_ONLY && fileSelectionMode != DIRECTORIES_ONLY )
|
||||||
throw new IllegalArgumentException( "Invalid file selection mode " + fileSelectionMode );
|
throw new IllegalArgumentException( "Invalid file selection mode " + fileSelectionMode );
|
||||||
@@ -488,8 +501,7 @@ public class SystemFileChooser
|
|||||||
if( filter == null || filters.contains( filter ) )
|
if( filter == null || filters.contains( filter ) )
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if( !(filter instanceof FileNameExtensionFilter) && !(filter instanceof AcceptAllFileFilter) )
|
checkSupportedFileFilter( filter );
|
||||||
throw new IllegalArgumentException( "Filter class not supported: " + filter.getClass().getName() );
|
|
||||||
|
|
||||||
// either insert filter before "All Files" filter, or append to the end
|
// either insert filter before "All Files" filter, or append to the end
|
||||||
int size = filters.size();
|
int size = filters.size();
|
||||||
@@ -559,15 +571,35 @@ public class SystemFileChooser
|
|||||||
|
|
||||||
/** @see JFileChooser#setFileFilter(javax.swing.filechooser.FileFilter) */
|
/** @see JFileChooser#setFileFilter(javax.swing.filechooser.FileFilter) */
|
||||||
public void setFileFilter( FileFilter filter ) {
|
public void setFileFilter( FileFilter filter ) {
|
||||||
|
checkSupportedFileFilter( filter );
|
||||||
|
|
||||||
this.fileFilter = filter;
|
this.fileFilter = filter;
|
||||||
}
|
}
|
||||||
|
|
||||||
private int indexOfCurrentFilter() {
|
private void checkSupportedFileFilter( FileFilter filter ) throws IllegalArgumentException {
|
||||||
return filters.indexOf( fileFilter );
|
if( filter == null ||
|
||||||
|
filter instanceof FileNameExtensionFilter ||
|
||||||
|
filter instanceof AcceptAllFileFilter )
|
||||||
|
return;
|
||||||
|
|
||||||
|
throw new IllegalArgumentException( "Filter class not supported: " + filter.getClass().getName() );
|
||||||
}
|
}
|
||||||
|
|
||||||
private boolean hasOnlyAcceptAll() {
|
private List<FileFilter> getFiltersForDialog() {
|
||||||
return filters.size() == 1 && filters.get( 0 ) == getAcceptAllFileFilter();
|
// has only accept-all filter
|
||||||
|
if( filters.size() == 1 &&
|
||||||
|
filters.get( 0 ) == getAcceptAllFileFilter() &&
|
||||||
|
(fileFilter == getAcceptAllFileFilter() || fileFilter == null) )
|
||||||
|
return Collections.emptyList();
|
||||||
|
|
||||||
|
// check whether current filter is already in list
|
||||||
|
if( (fileFilter != null && filters.contains( fileFilter )) || fileFilter == null )
|
||||||
|
return filters;
|
||||||
|
|
||||||
|
// add current file filter to list
|
||||||
|
List<FileFilter> filters2 = new ArrayList<>( filters );
|
||||||
|
filters2.add( 0, fileFilter );
|
||||||
|
return filters2;
|
||||||
}
|
}
|
||||||
|
|
||||||
public ApproveCallback getApproveCallback() {
|
public ApproveCallback getApproveCallback() {
|
||||||
@@ -854,9 +886,10 @@ public class SystemFileChooser
|
|||||||
int fileTypeIndex = 0;
|
int fileTypeIndex = 0;
|
||||||
ArrayList<String> fileTypes = new ArrayList<>();
|
ArrayList<String> fileTypes = new ArrayList<>();
|
||||||
if( !fc.isDirectorySelectionEnabled() ) {
|
if( !fc.isDirectorySelectionEnabled() ) {
|
||||||
if( !fc.hasOnlyAcceptAll() ) {
|
List<FileFilter> filters = fc.getFiltersForDialog();
|
||||||
fileTypeIndex = fc.indexOfCurrentFilter();
|
if( !filters.isEmpty() ) {
|
||||||
for( FileFilter filter : fc.getChoosableFileFilters() ) {
|
fileTypeIndex = filters.indexOf( fc.getFileFilter() );
|
||||||
|
for( FileFilter filter : filters ) {
|
||||||
if( filter instanceof FileNameExtensionFilter ) {
|
if( filter instanceof FileNameExtensionFilter ) {
|
||||||
fileTypes.add( filter.getDescription() );
|
fileTypes.add( filter.getDescription() );
|
||||||
fileTypes.add( "*." + String.join( ";*.", ((FileNameExtensionFilter)filter).getExtensions() ) );
|
fileTypes.add( "*." + String.join( ";*.", ((FileNameExtensionFilter)filter).getExtensions() ) );
|
||||||
@@ -975,9 +1008,11 @@ public class SystemFileChooser
|
|||||||
// filter
|
// filter
|
||||||
int fileTypeIndex = 0;
|
int fileTypeIndex = 0;
|
||||||
ArrayList<String> fileTypes = new ArrayList<>();
|
ArrayList<String> fileTypes = new ArrayList<>();
|
||||||
if( !fc.isDirectorySelectionEnabled() && !fc.hasOnlyAcceptAll() ) {
|
if( !fc.isDirectorySelectionEnabled() ) {
|
||||||
fileTypeIndex = fc.indexOfCurrentFilter();
|
List<FileFilter> filters = fc.getFiltersForDialog();
|
||||||
for( FileFilter filter : fc.getChoosableFileFilters() ) {
|
if( !filters.isEmpty() ) {
|
||||||
|
fileTypeIndex = filters.indexOf( fc.getFileFilter() );
|
||||||
|
for( FileFilter filter : filters ) {
|
||||||
if( filter instanceof FileNameExtensionFilter ) {
|
if( filter instanceof FileNameExtensionFilter ) {
|
||||||
fileTypes.add( filter.getDescription() );
|
fileTypes.add( filter.getDescription() );
|
||||||
for( String ext : ((FileNameExtensionFilter)filter).getExtensions() )
|
for( String ext : ((FileNameExtensionFilter)filter).getExtensions() )
|
||||||
@@ -990,6 +1025,7 @@ public class SystemFileChooser
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// callback
|
// callback
|
||||||
FlatNativeMacLibrary.FileChooserCallback callback = (fc.getApproveCallback() != null)
|
FlatNativeMacLibrary.FileChooserCallback callback = (fc.getApproveCallback() != null)
|
||||||
@@ -1090,9 +1126,11 @@ public class SystemFileChooser
|
|||||||
// filter
|
// filter
|
||||||
int fileTypeIndex = 0;
|
int fileTypeIndex = 0;
|
||||||
ArrayList<String> fileTypes = new ArrayList<>();
|
ArrayList<String> fileTypes = new ArrayList<>();
|
||||||
if( !fc.isDirectorySelectionEnabled() && !fc.hasOnlyAcceptAll() ) {
|
if( !fc.isDirectorySelectionEnabled() ) {
|
||||||
fileTypeIndex = fc.indexOfCurrentFilter();
|
List<FileFilter> filters = fc.getFiltersForDialog();
|
||||||
for( FileFilter filter : fc.getChoosableFileFilters() ) {
|
if( !filters.isEmpty() ) {
|
||||||
|
fileTypeIndex = filters.indexOf( fc.getFileFilter() );
|
||||||
|
for( FileFilter filter : filters ) {
|
||||||
if( filter instanceof FileNameExtensionFilter ) {
|
if( filter instanceof FileNameExtensionFilter ) {
|
||||||
fileTypes.add( filter.getDescription() );
|
fileTypes.add( filter.getDescription() );
|
||||||
for( String ext : ((FileNameExtensionFilter)filter).getExtensions() )
|
for( String ext : ((FileNameExtensionFilter)filter).getExtensions() )
|
||||||
@@ -1105,6 +1143,7 @@ public class SystemFileChooser
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// callback
|
// callback
|
||||||
FlatNativeLinuxLibrary.FileChooserCallback callback = (fc.getApproveCallback() != null)
|
FlatNativeLinuxLibrary.FileChooserCallback callback = (fc.getApproveCallback() != null)
|
||||||
@@ -1202,6 +1241,7 @@ public class SystemFileChooser
|
|||||||
chooser.setFileSelectionMode( fc.getFileSelectionMode() );
|
chooser.setFileSelectionMode( fc.getFileSelectionMode() );
|
||||||
chooser.setMultiSelectionEnabled( fc.isMultiSelectionEnabled() );
|
chooser.setMultiSelectionEnabled( fc.isMultiSelectionEnabled() );
|
||||||
chooser.setFileHidingEnabled( fc.isFileHidingEnabled() );
|
chooser.setFileHidingEnabled( fc.isFileHidingEnabled() );
|
||||||
|
chooser.setAcceptAllFileFilterUsed( fc.isAcceptAllFileFilterUsed() );
|
||||||
|
|
||||||
// system file dialogs do not support multi-selection for Save File dialogs
|
// system file dialogs do not support multi-selection for Save File dialogs
|
||||||
if( chooser.isMultiSelectionEnabled() &&
|
if( chooser.isMultiSelectionEnabled() &&
|
||||||
@@ -1210,24 +1250,21 @@ public class SystemFileChooser
|
|||||||
chooser.setMultiSelectionEnabled( false );
|
chooser.setMultiSelectionEnabled( false );
|
||||||
|
|
||||||
// filter
|
// filter
|
||||||
if( !fc.isDirectorySelectionEnabled() && !fc.hasOnlyAcceptAll() ) {
|
if( !fc.isDirectorySelectionEnabled() ) {
|
||||||
|
List<FileFilter> filters = fc.getFiltersForDialog();
|
||||||
|
if( !filters.isEmpty() ) {
|
||||||
FileFilter currentFilter = fc.getFileFilter();
|
FileFilter currentFilter = fc.getFileFilter();
|
||||||
for( FileFilter filter : fc.getChoosableFileFilters() ) {
|
chooser.removeChoosableFileFilter( chooser.getAcceptAllFileFilter() );
|
||||||
|
for( FileFilter filter : filters ) {
|
||||||
javax.swing.filechooser.FileFilter jfilter = convertFilter( filter, chooser );
|
javax.swing.filechooser.FileFilter jfilter = convertFilter( filter, chooser );
|
||||||
if( jfilter == null )
|
if( jfilter == null )
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
chooser.addChoosableFileFilter( jfilter );
|
chooser.addChoosableFileFilter( jfilter );
|
||||||
if( filter == currentFilter ) {
|
if( filter == currentFilter )
|
||||||
chooser.setFileFilter( jfilter );
|
chooser.setFileFilter( jfilter );
|
||||||
currentFilter = null;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if( currentFilter != null ) {
|
|
||||||
javax.swing.filechooser.FileFilter jfilter = convertFilter( currentFilter, chooser );
|
|
||||||
if( jfilter != null )
|
|
||||||
chooser.setFileFilter( jfilter );
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// paths
|
// paths
|
||||||
|
|||||||
Reference in New Issue
Block a user