System File Chooser: macOS:

- use `optionsSet` and `optionsClear` (as on Windows)
- delete local reference after getting Java array item
- added "or null" to javadoc
This commit is contained in:
Karl Tauber
2024-12-31 18:36:29 +01:00
parent 49a0a83eca
commit 63272a03cf
5 changed files with 109 additions and 110 deletions

View File

@@ -75,18 +75,16 @@ public class FlatNativeMacLibrary
// NSOpenPanel
FC_canChooseFiles = 1 << 0, // default
FC_canChooseDirectories = 1 << 1,
FC_resolvesAliases_NO = 1 << 2, // default
FC_resolvesAliases = 1 << 2, // default
FC_allowsMultipleSelection = 1 << 3,
// NSSavePanel
FC_showsTagField_YES = 1 << 8, // default for Save
FC_showsTagField_NO = 1 << 9, // default for Open
FC_canCreateDirectories_YES = 1 << 10, // default for Save
FC_canCreateDirectories_NO = 1 << 11, // default for Open
FC_canSelectHiddenExtension = 1 << 12,
FC_showsHiddenFiles = 1 << 14,
FC_extensionHidden = 1 << 16,
FC_allowsOtherFileTypes = 1 << 18,
FC_treatsFilePackagesAsDirectories = 1 << 20;
FC_showsTagField = 1 << 8, // default for Save
FC_canCreateDirectories = 1 << 9, // default for Save
FC_canSelectHiddenExtension = 1 << 10,
FC_showsHiddenFiles = 1 << 11,
FC_extensionHidden = 1 << 12,
FC_allowsOtherFileTypes = 1 << 13,
FC_treatsFilePackagesAsDirectories = 1 << 14;
/**
* Shows the macOS system file dialogs
@@ -98,13 +96,14 @@ public class FlatNativeMacLibrary
* to avoid blocking the AWT event dispatching thread.
*
* @param open if {@code true}, shows the open dialog; if {@code false}, shows the save dialog
* @param title text displayed at top of save dialog (not used in open dialog)
* @param prompt text displayed in default button
* @param message text displayed at top of open/save dialogs
* @param nameFieldLabel text displayed in front of the filename text field in save dialog (not used in open dialog)
* @param nameFieldStringValue user-editable filename currently shown in the name field in save dialog (not used in open dialog)
* @param directoryURL current directory shown in the dialog
* @param options see {@code FC_*} constants
* @param title text displayed at top of save dialog (not used in open dialog); or {@code null}
* @param prompt text displayed in default button; or {@code null}
* @param message text displayed at top of open/save dialogs; or {@code null}
* @param nameFieldLabel text displayed in front of the filename text field in save dialog (not used in open dialog); or {@code null}
* @param nameFieldStringValue user-editable filename currently shown in the name field in save dialog (not used in open dialog); or {@code null}
* @param directoryURL current directory shown in the dialog; or {@code null}
* @param optionsSet options to set; see {@code FC_*} constants
* @param optionsClear options to clear; see {@code FC_*} constants
* @param allowedFileTypes allowed filename extensions (e.g. "txt")
* @return file path(s) that the user selected, or {@code null} if canceled
*
@@ -112,6 +111,6 @@ public class FlatNativeMacLibrary
*/
public native static String[] showFileChooser( boolean open,
String title, String prompt, String message, String nameFieldLabel,
String nameFieldStringValue, String directoryURL, int options,
String... allowedFileTypes );
String nameFieldStringValue, String directoryURL,
int optionsSet, int optionsClear, String... allowedFileTypes );
}

View File

@@ -17,28 +17,24 @@ extern "C" {
#define com_formdev_flatlaf_ui_FlatNativeMacLibrary_FC_canChooseFiles 1L
#undef com_formdev_flatlaf_ui_FlatNativeMacLibrary_FC_canChooseDirectories
#define com_formdev_flatlaf_ui_FlatNativeMacLibrary_FC_canChooseDirectories 2L
#undef com_formdev_flatlaf_ui_FlatNativeMacLibrary_FC_resolvesAliases_NO
#define com_formdev_flatlaf_ui_FlatNativeMacLibrary_FC_resolvesAliases_NO 4L
#undef com_formdev_flatlaf_ui_FlatNativeMacLibrary_FC_resolvesAliases
#define com_formdev_flatlaf_ui_FlatNativeMacLibrary_FC_resolvesAliases 4L
#undef com_formdev_flatlaf_ui_FlatNativeMacLibrary_FC_allowsMultipleSelection
#define com_formdev_flatlaf_ui_FlatNativeMacLibrary_FC_allowsMultipleSelection 8L
#undef com_formdev_flatlaf_ui_FlatNativeMacLibrary_FC_showsTagField_YES
#define com_formdev_flatlaf_ui_FlatNativeMacLibrary_FC_showsTagField_YES 256L
#undef com_formdev_flatlaf_ui_FlatNativeMacLibrary_FC_showsTagField_NO
#define com_formdev_flatlaf_ui_FlatNativeMacLibrary_FC_showsTagField_NO 512L
#undef com_formdev_flatlaf_ui_FlatNativeMacLibrary_FC_canCreateDirectories_YES
#define com_formdev_flatlaf_ui_FlatNativeMacLibrary_FC_canCreateDirectories_YES 1024L
#undef com_formdev_flatlaf_ui_FlatNativeMacLibrary_FC_canCreateDirectories_NO
#define com_formdev_flatlaf_ui_FlatNativeMacLibrary_FC_canCreateDirectories_NO 2048L
#undef com_formdev_flatlaf_ui_FlatNativeMacLibrary_FC_showsTagField
#define com_formdev_flatlaf_ui_FlatNativeMacLibrary_FC_showsTagField 256L
#undef com_formdev_flatlaf_ui_FlatNativeMacLibrary_FC_canCreateDirectories
#define com_formdev_flatlaf_ui_FlatNativeMacLibrary_FC_canCreateDirectories 512L
#undef com_formdev_flatlaf_ui_FlatNativeMacLibrary_FC_canSelectHiddenExtension
#define com_formdev_flatlaf_ui_FlatNativeMacLibrary_FC_canSelectHiddenExtension 4096L
#define com_formdev_flatlaf_ui_FlatNativeMacLibrary_FC_canSelectHiddenExtension 1024L
#undef com_formdev_flatlaf_ui_FlatNativeMacLibrary_FC_showsHiddenFiles
#define com_formdev_flatlaf_ui_FlatNativeMacLibrary_FC_showsHiddenFiles 16384L
#define com_formdev_flatlaf_ui_FlatNativeMacLibrary_FC_showsHiddenFiles 2048L
#undef com_formdev_flatlaf_ui_FlatNativeMacLibrary_FC_extensionHidden
#define com_formdev_flatlaf_ui_FlatNativeMacLibrary_FC_extensionHidden 65536L
#define com_formdev_flatlaf_ui_FlatNativeMacLibrary_FC_extensionHidden 4096L
#undef com_formdev_flatlaf_ui_FlatNativeMacLibrary_FC_allowsOtherFileTypes
#define com_formdev_flatlaf_ui_FlatNativeMacLibrary_FC_allowsOtherFileTypes 262144L
#define com_formdev_flatlaf_ui_FlatNativeMacLibrary_FC_allowsOtherFileTypes 8192L
#undef com_formdev_flatlaf_ui_FlatNativeMacLibrary_FC_treatsFilePackagesAsDirectories
#define com_formdev_flatlaf_ui_FlatNativeMacLibrary_FC_treatsFilePackagesAsDirectories 1048576L
#define com_formdev_flatlaf_ui_FlatNativeMacLibrary_FC_treatsFilePackagesAsDirectories 16384L
/*
* Class: com_formdev_flatlaf_ui_FlatNativeMacLibrary
* Method: setWindowRoundedBorder
@@ -82,10 +78,10 @@ JNIEXPORT jboolean JNICALL Java_com_formdev_flatlaf_ui_FlatNativeMacLibrary_togg
/*
* Class: com_formdev_flatlaf_ui_FlatNativeMacLibrary
* Method: showFileChooser
* Signature: (ZLjava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;I[Ljava/lang/String;)[Ljava/lang/String;
* Signature: (ZLjava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;II[Ljava/lang/String;)[Ljava/lang/String;
*/
JNIEXPORT jobjectArray JNICALL Java_com_formdev_flatlaf_ui_FlatNativeMacLibrary_showFileChooser
(JNIEnv *, jclass, jboolean, jstring, jstring, jstring, jstring, jstring, jstring, jint, jobjectArray);
(JNIEnv *, jclass, jboolean, jstring, jstring, jstring, jstring, jstring, jstring, jint, jint, jobjectArray);
#ifdef __cplusplus
}

View File

@@ -25,8 +25,9 @@
* @author Karl Tauber
*/
#define isOptionSet( option ) ((options & com_formdev_flatlaf_ui_FlatNativeMacLibrary_ ## option) != 0)
#define isYesOrNoOptionSet( option ) isOptionSet( option ## _YES ) || isOptionSet( option ## _NO )
#define isOptionSet( option ) ((optionsSet & com_formdev_flatlaf_ui_FlatNativeMacLibrary_ ## option) != 0)
#define isOptionClear( option ) ((optionsClear & com_formdev_flatlaf_ui_FlatNativeMacLibrary_ ## option) != 0)
#define isOptionSetOrClear( option ) isOptionSet( option ) || isOptionClear( option )
// declare internal methods
NSWindow* getNSWindow( JNIEnv* env, jclass cls, jobject window );
@@ -38,7 +39,7 @@ JNIEXPORT jobjectArray JNICALL Java_com_formdev_flatlaf_ui_FlatNativeMacLibrary_
( JNIEnv* env, jclass cls, jboolean open,
jstring title, jstring prompt, jstring message, jstring nameFieldLabel,
jstring nameFieldStringValue, jstring directoryURL,
jint options, jobjectArray allowedFileTypes )
jint optionsSet, jint optionsClear, jobjectArray allowedFileTypes )
{
JNI_COCOA_ENTER()
@@ -56,8 +57,8 @@ JNIEXPORT jobjectArray JNICALL Java_com_formdev_flatlaf_ui_FlatNativeMacLibrary_
NSMutableArray* nsArray = [NSMutableArray arrayWithCapacity:len];
for( int i = 0; i < len; i++ ) {
jstring str = (jstring) env->GetObjectArrayElement( allowedFileTypes, i );
NSString* nsStr = JavaToNSString( env, str );
nsArray[i] = nsStr;
nsArray[i] = JavaToNSString( env, str );
env->DeleteLocalRef( str );
}
nsAllowedFileTypes = nsArray;
}
@@ -93,26 +94,27 @@ JNIEXPORT jobjectArray JNICALL Java_com_formdev_flatlaf_ui_FlatNativeMacLibrary_
canChooseFiles = true;
openDialog.canChooseFiles = canChooseFiles;
openDialog.canChooseDirectories = canChooseDirectories;
if( isOptionSet( FC_resolvesAliases_NO ) )
openDialog.resolvesAliases = NO;
if( isOptionSet( FC_allowsMultipleSelection ) )
openDialog.allowsMultipleSelection = YES;
if( isOptionSetOrClear( FC_resolvesAliases ) )
openDialog.resolvesAliases = isOptionSet( FC_resolvesAliases );
if( isOptionSetOrClear( FC_allowsMultipleSelection ) )
openDialog.allowsMultipleSelection = isOptionSet( FC_allowsMultipleSelection );
}
if( isYesOrNoOptionSet( FC_showsTagField ) )
dialog.showsTagField = isOptionSet( FC_showsTagField_YES );
if( isYesOrNoOptionSet( FC_canCreateDirectories ) )
dialog.canCreateDirectories = isOptionSet( FC_canCreateDirectories_YES );
if( isOptionSet( FC_canSelectHiddenExtension ) )
dialog.canSelectHiddenExtension = YES;
if( isOptionSet( FC_showsHiddenFiles) )
dialog.showsHiddenFiles = YES;
if( isOptionSet( FC_extensionHidden ) )
dialog.extensionHidden = YES;
if( isOptionSet( FC_allowsOtherFileTypes ) )
dialog.allowsOtherFileTypes = YES;
if( isOptionSet( FC_treatsFilePackagesAsDirectories ) )
dialog.treatsFilePackagesAsDirectories = YES;
if( isOptionSetOrClear( FC_showsTagField ) )
dialog.showsTagField = isOptionSet( FC_showsTagField );
if( isOptionSetOrClear( FC_canCreateDirectories ) )
dialog.canCreateDirectories = isOptionSet( FC_canCreateDirectories );
if( isOptionSetOrClear( FC_canSelectHiddenExtension ) )
dialog.canSelectHiddenExtension = isOptionSet( FC_canSelectHiddenExtension );
if( isOptionSetOrClear( FC_showsHiddenFiles) )
dialog.showsHiddenFiles = isOptionSet( FC_showsHiddenFiles);
if( isOptionSetOrClear( FC_extensionHidden ) )
dialog.extensionHidden = isOptionSet( FC_extensionHidden );
if( isOptionSetOrClear( FC_allowsOtherFileTypes ) )
dialog.allowsOtherFileTypes = isOptionSet( FC_allowsOtherFileTypes );
if( isOptionSetOrClear( FC_treatsFilePackagesAsDirectories ) )
dialog.treatsFilePackagesAsDirectories = isOptionSet( FC_treatsFilePackagesAsDirectories );
// use deprecated allowedFileTypes instead of newer allowedContentTypes (since macOS 11+)
// to support older macOS versions 10.14+ and because of some problems with allowedContentTypes:

View File

@@ -26,6 +26,7 @@ import java.awt.event.WindowFocusListener;
import java.awt.event.WindowListener;
import java.awt.event.WindowStateListener;
import java.util.Arrays;
import java.util.concurrent.atomic.AtomicInteger;
import javax.swing.*;
import com.formdev.flatlaf.extras.components.*;
import com.formdev.flatlaf.extras.components.FlatTriStateCheckBox.State;
@@ -52,6 +53,11 @@ public class FlatMacOSFileChooserTest
}
SwingUtilities.invokeLater( () -> {
if( !FlatNativeMacLibrary.isLoaded() ) {
JOptionPane.showMessageDialog( null, "FlatLaf native library not loaded" );
return;
}
FlatTestFrame frame = FlatTestFrame.create( args, "FlatMacOSFileChooserTest" );
addListeners( frame );
frame.showFrame( FlatMacOSFileChooserTest::new );
@@ -85,37 +91,25 @@ public class FlatMacOSFileChooserTest
String nameFieldLabel = n( nameFieldLabelField.getText() );
String nameFieldStringValue = n( nameFieldStringValueField.getText() );
String directoryURL = n( directoryURLField.getText() );
int options = 0;
AtomicInteger optionsSet = new AtomicInteger();
AtomicInteger optionsClear = new AtomicInteger();
// NSOpenPanel
if( canChooseFilesCheckBox.isSelected() )
options |= FC_canChooseFiles;
optionsSet.set( optionsSet.get() | FC_canChooseFiles );
if( canChooseDirectoriesCheckBox.isSelected() )
options |= FC_canChooseDirectories;
if( !resolvesAliasesCheckBox.isSelected() )
options |= FC_resolvesAliases_NO;
if( allowsMultipleSelectionCheckBox.isSelected() )
options |= FC_allowsMultipleSelection;
optionsSet.set( optionsSet.get() | FC_canChooseDirectories );
o( FC_resolvesAliases, resolvesAliasesCheckBox, optionsSet, optionsClear );
o( FC_allowsMultipleSelection, allowsMultipleSelectionCheckBox, optionsSet, optionsClear );
// NSSavePanel
if( showsTagFieldCheckBox.getState() == State.SELECTED )
options |= FC_showsTagField_YES;
else if( showsTagFieldCheckBox.getState() == State.UNSELECTED )
options |= FC_showsTagField_NO;
if( canCreateDirectoriesCheckBox.getState() == State.SELECTED )
options |= FC_canCreateDirectories_YES;
else if( canCreateDirectoriesCheckBox.getState() == State.UNSELECTED )
options |= FC_canCreateDirectories_NO;
if( canSelectHiddenExtensionCheckBox.isSelected() )
options |= FC_canSelectHiddenExtension;
if( showsHiddenFilesCheckBox.isSelected() )
options |= FC_showsHiddenFiles;
if( extensionHiddenCheckBox.isSelected() )
options |= FC_extensionHidden;
if( allowsOtherFileTypesCheckBox.isSelected() )
options |= FC_allowsOtherFileTypes;
if( treatsFilePackagesAsDirectoriesCheckBox.isSelected() )
options |= FC_treatsFilePackagesAsDirectories;
o( FC_showsTagField, showsTagFieldCheckBox, optionsSet, optionsClear );
o( FC_canCreateDirectories, canCreateDirectoriesCheckBox, optionsSet, optionsClear );
o( FC_canSelectHiddenExtension, canSelectHiddenExtensionCheckBox, optionsSet, optionsClear );
o( FC_showsHiddenFiles, showsHiddenFilesCheckBox, optionsSet, optionsClear );
o( FC_extensionHidden, extensionHiddenCheckBox, optionsSet, optionsClear );
o( FC_allowsOtherFileTypes, allowsOtherFileTypesCheckBox, optionsSet, optionsClear );
o( FC_treatsFilePackagesAsDirectories, treatsFilePackagesAsDirectoriesCheckBox, optionsSet, optionsClear );
String allowedFileTypesStr = n( allowedFileTypesField.getText() );
String[] allowedFileTypes = {};
@@ -124,17 +118,18 @@ public class FlatMacOSFileChooserTest
if( direct ) {
String[] files = FlatNativeMacLibrary.showFileChooser( open, title, prompt, message,
nameFieldLabel, nameFieldStringValue, directoryURL, options, allowedFileTypes );
nameFieldLabel, nameFieldStringValue, directoryURL,
optionsSet.get(), optionsClear.get(), allowedFileTypes );
filesField.setText( (files != null) ? Arrays.toString( files ).replace( ',', '\n' ) : "null" );
} else {
SecondaryLoop secondaryLoop = Toolkit.getDefaultToolkit().getSystemEventQueue().createSecondaryLoop();
int options2 = options;
String[] allowedFileTypes2 = allowedFileTypes;
new Thread( () -> {
String[] files = FlatNativeMacLibrary.showFileChooser( open, title, prompt, message,
nameFieldLabel, nameFieldStringValue, directoryURL, options2, allowedFileTypes2 );
nameFieldLabel, nameFieldStringValue, directoryURL,
optionsSet.get(), optionsClear.get(), allowedFileTypes2 );
System.out.println( " secondaryLoop.exit() returned " + secondaryLoop.exit() );
@@ -152,6 +147,13 @@ public class FlatMacOSFileChooserTest
return !s.isEmpty() ? s : null;
}
private static void o( int option, FlatTriStateCheckBox checkBox, AtomicInteger optionsSet, AtomicInteger optionsClear ) {
if( checkBox.getState() == State.SELECTED )
optionsSet.set( optionsSet.get() | option );
else if( checkBox.getState() == State.UNSELECTED )
optionsClear.set( optionsClear.get() | option );
}
private static void addListeners( Window w ) {
w.addWindowListener( new WindowListener() {
@Override
@@ -216,16 +218,16 @@ public class FlatMacOSFileChooserTest
options1Label = new JLabel();
canChooseFilesCheckBox = new JCheckBox();
canChooseDirectoriesCheckBox = new JCheckBox();
resolvesAliasesCheckBox = new JCheckBox();
allowsMultipleSelectionCheckBox = new JCheckBox();
resolvesAliasesCheckBox = new FlatTriStateCheckBox();
allowsMultipleSelectionCheckBox = new FlatTriStateCheckBox();
options2Label = new JLabel();
showsTagFieldCheckBox = new FlatTriStateCheckBox();
canCreateDirectoriesCheckBox = new FlatTriStateCheckBox();
canSelectHiddenExtensionCheckBox = new JCheckBox();
showsHiddenFilesCheckBox = new JCheckBox();
extensionHiddenCheckBox = new JCheckBox();
allowsOtherFileTypesCheckBox = new JCheckBox();
treatsFilePackagesAsDirectoriesCheckBox = new JCheckBox();
canSelectHiddenExtensionCheckBox = new FlatTriStateCheckBox();
showsHiddenFilesCheckBox = new FlatTriStateCheckBox();
extensionHiddenCheckBox = new FlatTriStateCheckBox();
allowsOtherFileTypesCheckBox = new FlatTriStateCheckBox();
treatsFilePackagesAsDirectoriesCheckBox = new FlatTriStateCheckBox();
promptLabel = new JLabel();
promptField = new JTextField();
messageLabel = new JLabel();
@@ -305,7 +307,7 @@ public class FlatMacOSFileChooserTest
//---- resolvesAliasesCheckBox ----
resolvesAliasesCheckBox.setText("resolvesAliases");
resolvesAliasesCheckBox.setSelected(true);
resolvesAliasesCheckBox.setState(FlatTriStateCheckBox.State.SELECTED);
panel1.add(resolvesAliasesCheckBox, "cell 0 3");
//---- allowsMultipleSelectionCheckBox ----
@@ -414,16 +416,16 @@ public class FlatMacOSFileChooserTest
private JLabel options1Label;
private JCheckBox canChooseFilesCheckBox;
private JCheckBox canChooseDirectoriesCheckBox;
private JCheckBox resolvesAliasesCheckBox;
private JCheckBox allowsMultipleSelectionCheckBox;
private FlatTriStateCheckBox resolvesAliasesCheckBox;
private FlatTriStateCheckBox allowsMultipleSelectionCheckBox;
private JLabel options2Label;
private FlatTriStateCheckBox showsTagFieldCheckBox;
private FlatTriStateCheckBox canCreateDirectoriesCheckBox;
private JCheckBox canSelectHiddenExtensionCheckBox;
private JCheckBox showsHiddenFilesCheckBox;
private JCheckBox extensionHiddenCheckBox;
private JCheckBox allowsOtherFileTypesCheckBox;
private JCheckBox treatsFilePackagesAsDirectoriesCheckBox;
private FlatTriStateCheckBox canSelectHiddenExtensionCheckBox;
private FlatTriStateCheckBox showsHiddenFilesCheckBox;
private FlatTriStateCheckBox extensionHiddenCheckBox;
private FlatTriStateCheckBox allowsOtherFileTypesCheckBox;
private FlatTriStateCheckBox treatsFilePackagesAsDirectoriesCheckBox;
private JLabel promptLabel;
private JTextField promptField;
private JLabel messageLabel;

View File

@@ -45,14 +45,14 @@ new FormModel {
}, new FormLayoutConstraints( class net.miginfocom.layout.CC ) {
"value": "cell 0 2"
} )
add( new FormComponent( "javax.swing.JCheckBox" ) {
add( new FormComponent( "com.formdev.flatlaf.extras.components.FlatTriStateCheckBox" ) {
name: "resolvesAliasesCheckBox"
"text": "resolvesAliases"
"selected": true
"state": enum com.formdev.flatlaf.extras.components.FlatTriStateCheckBox$State SELECTED
}, new FormLayoutConstraints( class net.miginfocom.layout.CC ) {
"value": "cell 0 3"
} )
add( new FormComponent( "javax.swing.JCheckBox" ) {
add( new FormComponent( "com.formdev.flatlaf.extras.components.FlatTriStateCheckBox" ) {
name: "allowsMultipleSelectionCheckBox"
"text": "allowsMultipleSelection"
}, new FormLayoutConstraints( class net.miginfocom.layout.CC ) {
@@ -76,31 +76,31 @@ new FormModel {
}, new FormLayoutConstraints( class net.miginfocom.layout.CC ) {
"value": "cell 0 7"
} )
add( new FormComponent( "javax.swing.JCheckBox" ) {
add( new FormComponent( "com.formdev.flatlaf.extras.components.FlatTriStateCheckBox" ) {
name: "canSelectHiddenExtensionCheckBox"
"text": "canSelectHiddenExtension"
}, new FormLayoutConstraints( class net.miginfocom.layout.CC ) {
"value": "cell 0 8"
} )
add( new FormComponent( "javax.swing.JCheckBox" ) {
add( new FormComponent( "com.formdev.flatlaf.extras.components.FlatTriStateCheckBox" ) {
name: "showsHiddenFilesCheckBox"
"text": "showsHiddenFiles"
}, new FormLayoutConstraints( class net.miginfocom.layout.CC ) {
"value": "cell 0 9"
} )
add( new FormComponent( "javax.swing.JCheckBox" ) {
add( new FormComponent( "com.formdev.flatlaf.extras.components.FlatTriStateCheckBox" ) {
name: "extensionHiddenCheckBox"
"text": "extensionHidden"
}, new FormLayoutConstraints( class net.miginfocom.layout.CC ) {
"value": "cell 0 10"
} )
add( new FormComponent( "javax.swing.JCheckBox" ) {
add( new FormComponent( "com.formdev.flatlaf.extras.components.FlatTriStateCheckBox" ) {
name: "allowsOtherFileTypesCheckBox"
"text": "allowsOtherFileTypes"
}, new FormLayoutConstraints( class net.miginfocom.layout.CC ) {
"value": "cell 0 11"
} )
add( new FormComponent( "javax.swing.JCheckBox" ) {
add( new FormComponent( "com.formdev.flatlaf.extras.components.FlatTriStateCheckBox" ) {
name: "treatsFilePackagesAsDirectoriesCheckBox"
"text": "treatsFilePackagesAsDirectories"
}, new FormLayoutConstraints( class net.miginfocom.layout.CC ) {