System File Chooser: update current filter before invoking approve callback and after closing dialog (issue #1065)

This commit is contained in:
Karl Tauber
2026-01-05 16:54:57 +01:00
parent 7680c3a817
commit edda52048c
19 changed files with 207 additions and 72 deletions

View File

@@ -110,8 +110,8 @@ public class FlatSystemFileChooserLinuxTest
}
int fileTypeIndex = fileTypeIndexSlider.getValue();
FlatNativeLinuxLibrary.FileChooserCallback callback = (files, hwndFileDialog) -> {
System.out.println( " -- callback " + hwndFileDialog + " " + Arrays.toString( files ) );
FlatNativeLinuxLibrary.FileChooserCallback callback = (files, fileTypeIndex2, hwndFileDialog) -> {
System.out.println( " -- callback " + hwndFileDialog + " " + Arrays.toString( files ) + " " + fileTypeIndex2 );
if( showMessageDialogOnOKCheckBox.isSelected() ) {
System.out.println( FlatNativeLinuxLibrary.showMessageDialog( hwndFileDialog,
JOptionPane.INFORMATION_MESSAGE,
@@ -124,24 +124,28 @@ public class FlatSystemFileChooserLinuxTest
int dark = FlatLaf.isLafDark() ? 1 : 0;
if( direct ) {
int[] retFileTypeIndex = { -1 };
String[] files = FlatNativeLinuxLibrary.showFileChooser( owner, dark, open,
title, okButtonLabel, currentName, currentFolder,
optionsSet.get(), optionsClear.get(), callback, fileTypeIndex, fileTypes );
optionsSet.get(), optionsClear.get(), callback,
fileTypeIndex, fileTypes, retFileTypeIndex );
filesField.setText( (files != null) ? Arrays.toString( files ).replace( ',', '\n' ) : "null" );
outputResult( files, retFileTypeIndex[0] );
} else {
SecondaryLoop secondaryLoop = Toolkit.getDefaultToolkit().getSystemEventQueue().createSecondaryLoop();
String[] fileTypes2 = fileTypes;
new Thread( () -> {
int[] retFileTypeIndex = { -1 };
String[] files = FlatNativeLinuxLibrary.showFileChooser( owner, dark, open,
title, okButtonLabel, currentName, currentFolder,
optionsSet.get(), optionsClear.get(), callback, fileTypeIndex, fileTypes2 );
optionsSet.get(), optionsClear.get(), callback,
fileTypeIndex, fileTypes2, retFileTypeIndex );
System.out.println( " secondaryLoop.exit() returned " + secondaryLoop.exit() );
EventQueue.invokeLater( () -> {
filesField.setText( (files != null) ? Arrays.toString( files ).replace( ',', '\n' ) : "null" );
outputResult( files, retFileTypeIndex[0] );
} );
} ).start();
@@ -150,6 +154,11 @@ public class FlatSystemFileChooserLinuxTest
}
}
private void outputResult( String[] files, int retFileTypeIndex ) {
filesField.setText( (files != null) ? Arrays.toString( files ).replace( ',', '\n' ) : "null" );
filesField.append( "\n\nretFileTypeIndex " + retFileTypeIndex );
}
private static String n( String s ) {
return s != null && !s.isEmpty() ? s : null;
}

View File

@@ -145,8 +145,8 @@ public class FlatSystemFileChooserMacTest
}
int fileTypeIndex = fileTypeIndexSlider.getValue();
FlatNativeMacLibrary.FileChooserCallback callback = (files, hwndFileDialog) -> {
System.out.println( " -- callback " + hwndFileDialog + " " + Arrays.toString( files ) );
FlatNativeMacLibrary.FileChooserCallback callback = (files, fileTypeIndex2, hwndFileDialog) -> {
System.out.println( " -- callback " + hwndFileDialog + " " + Arrays.toString( files ) + " " + fileTypeIndex2 );
if( showMessageDialogOnOKCheckBox.isSelected() ) {
int result = FlatNativeMacLibrary.showMessageDialog( hwndFileDialog,
JOptionPane.INFORMATION_MESSAGE,
@@ -160,26 +160,30 @@ public class FlatSystemFileChooserMacTest
int dark = FlatLaf.isLafDark() ? 1 : 0;
if( direct ) {
int[] retFileTypeIndex = { -1 };
String[] files = FlatNativeMacLibrary.showFileChooser( owner, dark, open,
title, prompt, message, filterFieldLabel,
nameFieldLabel, nameFieldStringValue, directoryURL,
optionsSet.get(), optionsClear.get(), callback, fileTypeIndex, fileTypes );
optionsSet.get(), optionsClear.get(), callback,
fileTypeIndex, fileTypes, retFileTypeIndex );
filesField.setText( (files != null) ? Arrays.toString( files ).replace( ',', '\n' ) : "null" );
outputResult( files, retFileTypeIndex[0] );
} else {
SecondaryLoop secondaryLoop = Toolkit.getDefaultToolkit().getSystemEventQueue().createSecondaryLoop();
String[] fileTypes2 = fileTypes;
new Thread( () -> {
int[] retFileTypeIndex = { -1 };
String[] files = FlatNativeMacLibrary.showFileChooser( owner, dark, open,
title, prompt, message, filterFieldLabel,
nameFieldLabel, nameFieldStringValue, directoryURL,
optionsSet.get(), optionsClear.get(), callback, fileTypeIndex, fileTypes2 );
optionsSet.get(), optionsClear.get(), callback,
fileTypeIndex, fileTypes2, retFileTypeIndex );
System.out.println( " secondaryLoop.exit() returned " + secondaryLoop.exit() );
SwingUtilities.invokeLater( () -> {
filesField.setText( (files != null) ? Arrays.toString( files ).replace( ',', '\n' ) : "null" );
outputResult( files, retFileTypeIndex[0] );
} );
} ).start();
@@ -188,6 +192,11 @@ public class FlatSystemFileChooserMacTest
}
}
private void outputResult( String[] files, int retFileTypeIndex ) {
filesField.setText( (files != null) ? Arrays.toString( files ).replace( ',', '\n' ) : "null" );
filesField.append( "\n\nretFileTypeIndex " + retFileTypeIndex );
}
private static String n( String s ) {
return s != null && !s.isEmpty() ? s : null;
}

View File

@@ -310,7 +310,8 @@ public class FlatSystemFileChooserTest
"result", result,
"currentDirectory", fc.getCurrentDirectory(),
"selectedFile", fc.getSelectedFile(),
"selectedFiles", fc.getSelectedFiles() );
"selectedFiles", fc.getSelectedFiles(),
"fileFilter", fc.getFileFilter() );
}
private void outputSwingFileChooser( String type, JFileChooser fc, int result ) {
@@ -319,7 +320,8 @@ public class FlatSystemFileChooserTest
"result", result,
"currentDirectory", fc.getCurrentDirectory(),
"selectedFile", fc.getSelectedFile(),
"selectedFiles", fc.getSelectedFiles() );
"selectedFiles", fc.getSelectedFiles(),
"fileFilter", fc.getFileFilter() );
}
private void outputAWTFileChooser( FileDialog fc ) {

View File

@@ -131,8 +131,8 @@ public class FlatSystemFileChooserWindowsTest
fileTypes = fileTypesStr.trim().split( "[,]+" );
int fileTypeIndex = fileTypeIndexSlider.getValue();
FlatNativeWindowsLibrary.FileChooserCallback callback = (files, hwndFileDialog) -> {
System.out.println( " -- callback " + hwndFileDialog + " " + Arrays.toString( files ) );
FlatNativeWindowsLibrary.FileChooserCallback callback = (files, fileTypeIndex2, hwndFileDialog) -> {
System.out.println( " -- callback " + hwndFileDialog + " " + Arrays.toString( files ) + " " + fileTypeIndex2 );
if( showMessageDialogOnOKCheckBox.isSelected() ) {
System.out.println( FlatNativeWindowsLibrary.showMessageDialog( hwndFileDialog,
JOptionPane.INFORMATION_MESSAGE,
@@ -142,26 +142,30 @@ public class FlatSystemFileChooserWindowsTest
};
if( direct ) {
int[] retFileTypeIndex = { -1 };
String[] files = FlatNativeWindowsLibrary.showFileChooser( owner, open,
title, okButtonLabel, fileNameLabel, fileName,
folder, saveAsItem, defaultFolder, defaultExtension,
optionsSet.get(), optionsClear.get(), callback, fileTypeIndex, fileTypes );
optionsSet.get(), optionsClear.get(), callback,
fileTypeIndex, fileTypes, retFileTypeIndex );
filesField.setText( (files != null) ? Arrays.toString( files ).replace( ',', '\n' ) : "null" );
outputResult( files, retFileTypeIndex[0] );
} else {
SecondaryLoop secondaryLoop = Toolkit.getDefaultToolkit().getSystemEventQueue().createSecondaryLoop();
String[] fileTypes2 = fileTypes;
new Thread( () -> {
int[] retFileTypeIndex = { -1 };
String[] files = FlatNativeWindowsLibrary.showFileChooser( owner, open,
title, okButtonLabel, fileNameLabel, fileName,
folder, saveAsItem, defaultFolder, defaultExtension,
optionsSet.get(), optionsClear.get(), callback, fileTypeIndex, fileTypes2 );
optionsSet.get(), optionsClear.get(), callback,
fileTypeIndex, fileTypes2, retFileTypeIndex );
System.out.println( " secondaryLoop.exit() returned " + secondaryLoop.exit() );
EventQueue.invokeLater( () -> {
filesField.setText( (files != null) ? Arrays.toString( files ).replace( ',', '\n' ) : "null" );
outputResult( files, retFileTypeIndex[0] );
} );
} ).start();
@@ -170,6 +174,11 @@ public class FlatSystemFileChooserWindowsTest
}
}
private void outputResult( String[] files, int retFileTypeIndex ) {
filesField.setText( (files != null) ? Arrays.toString( files ).replace( ',', '\n' ) : "null" );
filesField.append( "\n\nretFileTypeIndex " + retFileTypeIndex );
}
private static String n( String s ) {
return s != null && !s.isEmpty() ? s : null;
}