8013442: No file filter selected in file type combo box when using JFileChooser
authormalenkov
Wed, 19 Jun 2013 14:28:44 +0400
changeset 18134 af8df2260431
parent 18133 41b4b144eaff
child 18135 d9be76f1a19c
8013442: No file filter selected in file type combo box when using JFileChooser Reviewed-by: alexsch
jdk/src/share/classes/javax/swing/JFileChooser.java
jdk/test/javax/swing/JFileChooser/8013442/Test8013442.java
--- a/jdk/src/share/classes/javax/swing/JFileChooser.java	Mon Jun 17 18:30:49 2013 +0400
+++ b/jdk/src/share/classes/javax/swing/JFileChooser.java	Wed Jun 19 14:28:44 2013 +0400
@@ -1146,9 +1146,25 @@
      * @see #resetChoosableFileFilters
      */
     public boolean removeChoosableFileFilter(FileFilter f) {
-        if(filters.contains(f)) {
+        int index = filters.indexOf(f);
+        if (index >= 0) {
             if(getFileFilter() == f) {
-                setFileFilter(null);
+                if (isAcceptAllFileFilterUsed()) {
+                    // choose default filter if it is used
+                    setFileFilter(getAcceptAllFileFilter());
+                }
+                else if (index > 0) {
+                    // choose the first filter, because it is not removed
+                    setFileFilter(filters.get(0));
+                }
+                else if (filters.size() > 1) {
+                    // choose the second filter, because the first one is removed
+                    setFileFilter(filters.get(1));
+                }
+                else {
+                    // no more filters
+                    setFileFilter(null);
+                }
             }
             FileFilter[] oldValue = getChoosableFileFilters();
             filters.removeElement(f);
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/javax/swing/JFileChooser/8013442/Test8013442.java	Wed Jun 19 14:28:44 2013 +0400
@@ -0,0 +1,122 @@
+/*
+ * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/*
+ * @test
+ * @bug 8013442
+ * @summary Tests that at least one file filter is selected
+ * @author Sergey Malenkov
+ */
+
+import java.io.File;
+import java.util.concurrent.CountDownLatch;
+import javax.swing.JFileChooser;
+import javax.swing.JFrame;
+import javax.swing.SwingUtilities;
+import javax.swing.UIManager;
+import javax.swing.UIManager.LookAndFeelInfo;
+import javax.swing.filechooser.FileFilter;
+
+public class Test8013442 extends FileFilter implements Runnable, Thread.UncaughtExceptionHandler {
+    private static final CountDownLatch LATCH = new CountDownLatch(1);
+
+    public static void main(String[] args) throws InterruptedException {
+        SwingUtilities.invokeLater(new Test8013442());
+        LATCH.await(); // workaround for jtreg
+    }
+
+    private int index;
+    private LookAndFeelInfo[] infos;
+    private JFileChooser chooser;
+
+    @Override
+    public boolean accept(File file) {
+        return !file.isFile() || file.getName().toLowerCase().endsWith(".txt");
+    }
+
+    @Override
+    public String getDescription() {
+        return "Text files";
+    }
+
+    @Override
+    public void run() {
+        if (this.infos == null) {
+            this.infos = UIManager.getInstalledLookAndFeels();
+            Thread.currentThread().setUncaughtExceptionHandler(this);
+        }
+        if (this.infos.length == this.index) {
+            LATCH.countDown(); // release main thread
+        } else if (this.chooser == null) {
+            // change LaF before creation of Swing components
+            LookAndFeelInfo info = this.infos[this.index];
+            System.out.println(info.getName());
+            try {
+                UIManager.setLookAndFeel(info.getClassName());
+            }
+            catch (Exception exception) {
+                throw new Error("could not change look and feel", exception);
+            }
+            // create and show new file chooser
+            JFrame frame = new JFrame(getClass().getSimpleName());
+            frame.add(this.chooser = new JFileChooser());
+            frame.setSize(800, 600);
+            frame.setLocationRelativeTo(null);
+            frame.setVisible(true);
+            SwingUtilities.invokeLater(this);
+        }
+        else {
+            int count = this.chooser.getChoosableFileFilters().length;
+            System.out.println("count = " + count + "; " + this.chooser.isAcceptAllFileFilterUsed());
+            if (count == 0) {
+                if (null != this.chooser.getFileFilter()) {
+                    throw new Error("file filter is selected");
+                }
+                // close window and stop testing file chooser for current LaF
+                SwingUtilities.getWindowAncestor(this.chooser).dispose();
+                this.chooser = null;
+                this.index++;
+            } else {
+                if (null == this.chooser.getFileFilter()) {
+                    throw new Error("file filter is not selected");
+                }
+                if (count == 2) {
+                    // remove default file filter
+                    this.chooser.setAcceptAllFileFilterUsed(false);
+                } else if (this.chooser.isAcceptAllFileFilterUsed()) {
+                    // remove add file filter
+                    this.chooser.addChoosableFileFilter(this);
+                } else {
+                    // remove custom file filter
+                    this.chooser.removeChoosableFileFilter(this);
+                }
+            }
+            SwingUtilities.invokeLater(this);
+        }
+    }
+
+    public void uncaughtException(Thread thread, Throwable throwable) {
+        throwable.printStackTrace();
+        System.exit(1);
+    }
+}