+ Added FileChooserBuilder.setSelectionApprover(), + FileChooserBuilder.addFileFilter() and the interface + FileChooserBuilder.SelectionApprover. +
++ Added FileChooserBuilder.setSelectionApprover() which enables + JFileChoosers created by a FileChooserBuilder to intercept + JFileChooser.approveSelection() (for example, to ask the user + if it is ok to overwrite a file); added + FileChooserBuilder.addFileFilter() which operates similarly + to JFileChooser.addChoosableFileFilter(), so JFileChoosers + created by a FileChooserBuilder can be given user-selectable + file filters. +
+JFileChooser.addChoosableFileFilter(filter)
.
+ * Adds another file filter that can be displayed in the file filters combo
+ * box in the file chooser.
+ *
+ * @param filter The file filter to add
+ * @return this
+ * @since 7.26.0
+ */
+ public FileChooserBuilder addFileFilter (FileFilter filter) {
+ filters.add (filter);
+ return this;
+ }
+
+ /**
+ * Set a selection approver which can display an "Overwrite file?"
+ * or similar dialog if necessary, when the user presses the accept button
+ * in the file chooser dialog.
+ *
+ * @param approver A SelectionApprover which will determine if the selection
+ * is valid
+ * @return this
+ * @since 7.26.0
+ */
+ public FileChooserBuilder setSelectionApprover (SelectionApprover approver) {
+ this.approver = approver;
+ return this;
+ }
+
+ /**
+ * Object which can approve the selection (enabling the OK button or
+ * equivalent) in a JFileChooser. Equivalent to overriding
+ * JFileChooser.approveSelection()
+ * @since 7.26.0
+ */
+ public interface SelectionApprover {
+ /**
+ * Approve the selection, enabling the dialog to be closed. Called by
+ * the JFileChooser's approveSelection()
method. Use this
+ * interface if you want to, for example, show a dialog asking
+ * "Overwrite File X?" or similar.
+ *
+ * @param selection The selected file(s) at the time the user presses
+ * the Open, Save or OK button
+ * @return true if the selection is accepted, false if it is not and
+ * the dialog should not be closed
+ */
+ public boolean approve (File[] selection);
}
private static final class SavedDirFileChooser extends JFileChooser {
private final String dirKey;
- SavedDirFileChooser(String dirKey, File failoverDir, boolean force) {
+ private final SelectionApprover approver;
+ SavedDirFileChooser(String dirKey, File failoverDir, boolean force, SelectionApprover approver) {
this.dirKey = dirKey;
+ this.approver = approver;
if (force && failoverDir != null && failoverDir.exists() && failoverDir.isDirectory()) {
setCurrentDirectory(failoverDir);
} else {
@@ -387,6 +449,18 @@
}
@Override
+ public void approveSelection() {
+ if (approver != null) {
+ boolean approved = approver.approve(getSelectedFiles());
+ if (approved) {
+ super.approveSelection();
+ }
+ } else {
+ super.approveSelection();
+ }
+ }
+
+ @Override
public int showOpenDialog(Component parent) throws HeadlessException {
int result = super.showOpenDialog(parent);
if (result == APPROVE_OPTION) {
--- a/openide.filesystems/test/unit/src/org/openide/filesystems/FileChooserBuilderTest.java
+++ a/openide.filesystems/test/unit/src/org/openide/filesystems/FileChooserBuilderTest.java
@@ -44,6 +44,9 @@
import java.awt.EventQueue;
import java.io.File;
import java.io.IOException;
+import java.util.Arrays;
+import java.util.HashSet;
+import java.util.Set;
import javax.swing.AbstractButton;
import javax.swing.JButton;
import javax.swing.JFileChooser;
@@ -178,6 +181,66 @@
assertNotNull(instance.createFileChooser());
}
+ public void testSetSelectionApprover() throws Exception {
+ FileChooserBuilder instance = new FileChooserBuilder("i");
+ File tmp = new File(System.getProperty("java.io.tmpdir"));
+ assertTrue ("Environment is insane", tmp.exists() && tmp.isDirectory());
+ File sel = new File("tmp" + System.currentTimeMillis());
+ if (!sel.exists()) {
+ assertTrue (sel.createNewFile());
+ }
+ instance.setDefaultWorkingDirectory(tmp);
+ SA sa = new SA();
+ instance.setSelectionApprover(sa);
+ JFileChooser ch = instance.createFileChooser();
+ ch.approveSelection();
+ sa.assertApproveInvoked();
+ }
+
+ public void testAddFileFilter() {
+ FileChooserBuilder instance = new FileChooserBuilder("j");
+ FF one = new FF ("a");
+ FF two = new FF ("b");
+ instance.addFileFilter(one);
+ instance.addFileFilter(two);
+ JFileChooser ch = instance.createFileChooser();
+ Set