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

@@ -24,7 +24,7 @@
// increase this version if changing API or functionality of native library
// also update version in Java class com.formdev.flatlaf.ui.FlatNativeLinuxLibrary
#define API_VERSION_LINUX 3003
#define API_VERSION_LINUX 3004
//---- JNI methods ------------------------------------------------------------

View File

@@ -58,6 +58,7 @@ static void initFilters( GtkFileChooser* chooser, JNIEnv* env, jint fileTypeInde
gtk_file_chooser_add_filter( chooser, filter );
if( fileTypeIndex == filterIndex )
gtk_file_chooser_set_filter( chooser, filter );
g_object_set_data( G_OBJECT( filter ), "flatlaf-filter-index", GINT_TO_POINTER( filterIndex + 1 ) );
filter = NULL;
filterIndex++;
}
@@ -130,32 +131,42 @@ struct ResponseData {
JNIEnv* env;
jobject callback;
GSList* fileList;
int filterIndex;
ResponseData( JNIEnv* _env, jobject _callback ) {
env = _env;
callback = _callback;
fileList = NULL;
filterIndex = -1;
}
};
static void handle_response( GtkWidget* dialog, gint responseId, gpointer data ) {
GtkFileChooser* chooser = GTK_FILE_CHOOSER( dialog );
ResponseData *response = static_cast<ResponseData*>( data );
// get selected filter (even if user cancels dialog)
GtkFileFilter* filter = gtk_file_chooser_get_filter( chooser );
response->filterIndex = (filter != NULL)
? GPOINTER_TO_INT( g_object_get_data( G_OBJECT( filter ), "flatlaf-filter-index" ) ) - 1
: -1;
// get filenames if user pressed OK
if( responseId == GTK_RESPONSE_ACCEPT ) {
ResponseData *response = static_cast<ResponseData*>( data );
if( response->callback != NULL ) {
GSList* fileList = gtk_file_chooser_get_filenames( GTK_FILE_CHOOSER( dialog ) );
GSList* fileList = gtk_file_chooser_get_filenames( chooser );
jobjectArray files = fileListToStringArray( response->env, fileList );
jint filterIndex = response->filterIndex;
GtkWindow* window = GTK_WINDOW( dialog );
// invoke callback: boolean approve( String[] files, long hwnd );
jclass cls = response->env->GetObjectClass( response->callback );
jmethodID approveID = response->env->GetMethodID( cls, "approve", "([Ljava/lang/String;J)Z" );
if( approveID != NULL && !response->env->CallBooleanMethod( response->callback, approveID, files, window ) )
jmethodID approveID = response->env->GetMethodID( cls, "approve", "([Ljava/lang/String;IJ)Z" );
if( approveID != NULL && !response->env->CallBooleanMethod( response->callback, approveID, files, filterIndex, window ) )
return; // keep dialog open
}
response->fileList = gtk_file_chooser_get_filenames( GTK_FILE_CHOOSER( dialog ) );
response->fileList = gtk_file_chooser_get_filenames( chooser );
}
// hide/destroy file dialog and quit loop
@@ -170,7 +181,8 @@ extern "C"
JNIEXPORT jobjectArray JNICALL Java_com_formdev_flatlaf_ui_FlatNativeLinuxLibrary_showFileChooser
( JNIEnv* env, jclass cls, jobject owner, jint dark, jboolean open,
jstring title, jstring okButtonLabel, jstring currentName, jstring currentFolder,
jint optionsSet, jint optionsClear, jobject callback, jint fileTypeIndex, jobjectArray fileTypes )
jint optionsSet, jint optionsClear, jobject callback,
jint fileTypeIndex, jobjectArray fileTypes, jintArray retFileTypeIndex )
{
// initialize GTK
if( !gtk_init_check( NULL, NULL ) )
@@ -282,7 +294,11 @@ JNIEXPORT jobjectArray JNICALL Java_com_formdev_flatlaf_ui_FlatNativeLinuxLibrar
// start event loop (will be quit in respone handler)
gtk_main();
// canceled?
// return selected filter
jint selectedFilterIndex = responseData.filterIndex;
env->SetIntArrayRegion( retFileTypeIndex, 0, 1, &selectedFilterIndex );
// return empty array if canceled
if( responseData.fileList == NULL )
return newJavaStringArray( env, 0 );

View File

@@ -64,10 +64,10 @@ JNIEXPORT jboolean JNICALL Java_com_formdev_flatlaf_ui_FlatNativeLinuxLibrary_is
/*
* Class: com_formdev_flatlaf_ui_FlatNativeLinuxLibrary
* Method: showFileChooser
* Signature: (Ljava/awt/Window;IZLjava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;IILcom/formdev/flatlaf/ui/FlatNativeLinuxLibrary/FileChooserCallback;I[Ljava/lang/String;)[Ljava/lang/String;
* Signature: (Ljava/awt/Window;IZLjava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;IILcom/formdev/flatlaf/ui/FlatNativeLinuxLibrary/FileChooserCallback;I[Ljava/lang/String;[I)[Ljava/lang/String;
*/
JNIEXPORT jobjectArray JNICALL Java_com_formdev_flatlaf_ui_FlatNativeLinuxLibrary_showFileChooser
(JNIEnv *, jclass, jobject, jint, jboolean, jstring, jstring, jstring, jstring, jint, jint, jobject, jint, jobjectArray);
(JNIEnv *, jclass, jobject, jint, jboolean, jstring, jstring, jstring, jstring, jint, jint, jobject, jint, jobjectArray, jintArray);
/*
* Class: com_formdev_flatlaf_ui_FlatNativeLinuxLibrary