# HG changeset patch # User alexsch # Date 1390494991 -14400 # Node ID 91bce40d03471a69098b7727a6493890d96f79f4 # Parent 3e9b46280c168534894b7fcd27e32285f8fa64d0 8032063: javax.swing.plaf.metal.MetalFileChooserUI$FilterComboBoxModel extends non-standard API Reviewed-by: pchelko, serb diff -r 3e9b46280c16 -r 91bce40d0347 src/macosx/classes/com/apple/laf/AquaFileChooserUI.java --- a/src/macosx/classes/com/apple/laf/AquaFileChooserUI.java Fri Jan 17 15:53:14 2014 -0800 +++ b/src/macosx/classes/com/apple/laf/AquaFileChooserUI.java Thu Jan 23 20:36:31 2014 +0400 @@ -42,7 +42,6 @@ import javax.swing.plaf.*; import javax.swing.table.*; -import sun.swing.AbstractFilterComboBoxModel; import sun.swing.SwingUtilities2; public class AquaFileChooserUI extends FileChooserUI { @@ -1267,9 +1266,64 @@ /** * Data model for a type-face selection combo-box. */ - protected class FilterComboBoxModel extends AbstractFilterComboBoxModel { - protected JFileChooser getFileChooser() { - return AquaFileChooserUI.this.getFileChooser(); + protected class FilterComboBoxModel extends DefaultListModel implements ComboBoxModel, PropertyChangeListener { + int selectedIndex = -1; + + protected FilterComboBoxModel() { + super(); + final FileFilter filters[] = getFileChooser().getChoosableFileFilters(); + for (int i = 0; i < filters.length; i++) { + this.add(i, filters[i]); + } + } + + public void propertyChange(final PropertyChangeEvent e) { + final String prop = e.getPropertyName(); + if (prop == JFileChooser.CHOOSABLE_FILE_FILTER_CHANGED_PROPERTY) { + this.clear(); + final FileFilter filters[] = (FileFilter[])e.getNewValue(); + + for (int i = 0; i < filters.length; i++) { + this.add(i, filters[i]); + } + + fireContentsChanged(this, -1, -1); + } else if (prop == JFileChooser.FILE_FILTER_CHANGED_PROPERTY) { + final FileFilter currentFilter = (FileFilter)e.getNewValue(); + FileFilter filters[] = getFileChooser().getChoosableFileFilters(); + + boolean found = false; + if (currentFilter != null) { + for (final FileFilter element : filters) { + if (element == currentFilter) { + found = true; + } + } + if (found == false) { + getFileChooser().addChoosableFileFilter(currentFilter); + } + } + + filters = getFileChooser().getChoosableFileFilters(); + setSelectedItem(e.getNewValue()); + } + } + + public void setSelectedItem(final Object filter) { + if (filter != null) { + selectedIndex = this.indexOf(filter); + fireContentsChanged(this, -1, -1); + } + } + + public Object getSelectedItem() { + final Object returnValue = null; + + if (this.size() > 0) { + if ((selectedIndex != -1) && (selectedIndex < size())) { return this.get(selectedIndex); } + } + + return returnValue; } } diff -r 3e9b46280c16 -r 91bce40d0347 src/share/classes/com/sun/java/swing/plaf/gtk/GTKFileChooserUI.java --- a/src/share/classes/com/sun/java/swing/plaf/gtk/GTKFileChooserUI.java Fri Jan 17 15:53:14 2014 -0800 +++ b/src/share/classes/com/sun/java/swing/plaf/gtk/GTKFileChooserUI.java Thu Jan 23 20:36:31 2014 +0400 @@ -41,7 +41,6 @@ import javax.swing.table.*; import javax.accessibility.*; -import sun.swing.AbstractFilterComboBoxModel; import sun.swing.SwingUtilities2; import sun.swing.plaf.synth.*; @@ -1329,9 +1328,71 @@ /** * Data model for filter combo-box. */ - protected class FilterComboBoxModel extends AbstractFilterComboBoxModel { - protected JFileChooser getFileChooser() { - return GTKFileChooserUI.this.getFileChooser(); + protected class FilterComboBoxModel extends AbstractListModel + implements ComboBoxModel, PropertyChangeListener { + protected FileFilter[] filters; + + protected FilterComboBoxModel() { + super(); + filters = getFileChooser().getChoosableFileFilters(); + } + + public void propertyChange(PropertyChangeEvent e) { + String prop = e.getPropertyName(); + if (prop == JFileChooser.CHOOSABLE_FILE_FILTER_CHANGED_PROPERTY) { + filters = (FileFilter[]) e.getNewValue(); + fireContentsChanged(this, -1, -1); + } else if (prop == JFileChooser.FILE_FILTER_CHANGED_PROPERTY) { + fireContentsChanged(this, -1, -1); + } + } + + public void setSelectedItem(Object filter) { + if (filter != null) { + getFileChooser().setFileFilter((FileFilter) filter); + fireContentsChanged(this, -1, -1); + } + } + + public Object getSelectedItem() { + // Ensure that the current filter is in the list. + // NOTE: we shouldnt' have to do this, since JFileChooser adds + // the filter to the choosable filters list when the filter + // is set. Lets be paranoid just in case someone overrides + // setFileFilter in JFileChooser. + FileFilter currentFilter = getFileChooser().getFileFilter(); + boolean found = false; + if (currentFilter != null) { + for (FileFilter filter : filters) { + if (filter == currentFilter) { + found = true; + } + } + if (found == false) { + getFileChooser().addChoosableFileFilter(currentFilter); + } + } + return getFileChooser().getFileFilter(); + } + + public int getSize() { + if (filters != null) { + return filters.length; + } else { + return 0; + } + } + + public Object getElementAt(int index) { + if (index > getSize() - 1) { + // This shouldn't happen. Try to recover gracefully. + return getFileChooser().getFileFilter(); + } + if (filters != null) { + return filters[index]; + } else { + return null; + } } } } diff -r 3e9b46280c16 -r 91bce40d0347 src/share/classes/com/sun/java/swing/plaf/motif/MotifFileChooserUI.java --- a/src/share/classes/com/sun/java/swing/plaf/motif/MotifFileChooserUI.java Fri Jan 17 15:53:14 2014 -0800 +++ b/src/share/classes/com/sun/java/swing/plaf/motif/MotifFileChooserUI.java Thu Jan 23 20:36:31 2014 +0400 @@ -38,7 +38,6 @@ import java.io.IOException; import java.util.*; import sun.awt.shell.ShellFolder; -import sun.swing.AbstractFilterComboBoxModel; import sun.swing.SwingUtilities2; /** @@ -778,9 +777,70 @@ /** * Data model for a type-face selection combo-box. */ - protected class FilterComboBoxModel extends AbstractFilterComboBoxModel { - protected JFileChooser getFileChooser() { - return MotifFileChooserUI.this.getFileChooser(); + protected class FilterComboBoxModel extends AbstractListModel implements ComboBoxModel, + PropertyChangeListener { + protected FileFilter[] filters; + protected FilterComboBoxModel() { + super(); + filters = getFileChooser().getChoosableFileFilters(); + } + + public void propertyChange(PropertyChangeEvent e) { + String prop = e.getPropertyName(); + if(prop.equals(JFileChooser.CHOOSABLE_FILE_FILTER_CHANGED_PROPERTY)) { + filters = (FileFilter[]) e.getNewValue(); + fireContentsChanged(this, -1, -1); + } else if (prop.equals(JFileChooser.FILE_FILTER_CHANGED_PROPERTY)) { + fireContentsChanged(this, -1, -1); + } + } + + public void setSelectedItem(Object filter) { + if(filter != null) { + getFileChooser().setFileFilter((FileFilter) filter); + fireContentsChanged(this, -1, -1); + } + } + + public Object getSelectedItem() { + // Ensure that the current filter is in the list. + // NOTE: we shouldnt' have to do this, since JFileChooser adds + // the filter to the choosable filters list when the filter + // is set. Lets be paranoid just in case someone overrides + // setFileFilter in JFileChooser. + FileFilter currentFilter = getFileChooser().getFileFilter(); + boolean found = false; + if(currentFilter != null) { + for (FileFilter filter : filters) { + if (filter == currentFilter) { + found = true; + } + } + if (!found) { + getFileChooser().addChoosableFileFilter(currentFilter); + } + } + return getFileChooser().getFileFilter(); + } + + public int getSize() { + if(filters != null) { + return filters.length; + } else { + return 0; + } + } + + public FileFilter getElementAt(int index) { + if(index > getSize() - 1) { + // This shouldn't happen. Try to recover gracefully. + return getFileChooser().getFileFilter(); + } + if(filters != null) { + return filters[index]; + } else { + return null; + } } } diff -r 3e9b46280c16 -r 91bce40d0347 src/share/classes/com/sun/java/swing/plaf/windows/WindowsFileChooserUI.java --- a/src/share/classes/com/sun/java/swing/plaf/windows/WindowsFileChooserUI.java Fri Jan 17 15:53:14 2014 -0800 +++ b/src/share/classes/com/sun/java/swing/plaf/windows/WindowsFileChooserUI.java Thu Jan 23 20:36:31 2014 +0400 @@ -1193,9 +1193,70 @@ /** * Data model for a type-face selection combo-box. */ - protected class FilterComboBoxModel extends AbstractFilterComboBoxModel { - protected JFileChooser getFileChooser() { - return WindowsFileChooserUI.this.getFileChooser(); + protected class FilterComboBoxModel extends AbstractListModel implements ComboBoxModel, + PropertyChangeListener { + protected FileFilter[] filters; + protected FilterComboBoxModel() { + super(); + filters = getFileChooser().getChoosableFileFilters(); + } + + public void propertyChange(PropertyChangeEvent e) { + String prop = e.getPropertyName(); + if(prop == JFileChooser.CHOOSABLE_FILE_FILTER_CHANGED_PROPERTY) { + filters = (FileFilter[]) e.getNewValue(); + fireContentsChanged(this, -1, -1); + } else if (prop == JFileChooser.FILE_FILTER_CHANGED_PROPERTY) { + fireContentsChanged(this, -1, -1); + } + } + + public void setSelectedItem(Object filter) { + if(filter != null) { + getFileChooser().setFileFilter((FileFilter) filter); + fireContentsChanged(this, -1, -1); + } + } + + public Object getSelectedItem() { + // Ensure that the current filter is in the list. + // NOTE: we shouldnt' have to do this, since JFileChooser adds + // the filter to the choosable filters list when the filter + // is set. Lets be paranoid just in case someone overrides + // setFileFilter in JFileChooser. + FileFilter currentFilter = getFileChooser().getFileFilter(); + boolean found = false; + if(currentFilter != null) { + for (FileFilter filter : filters) { + if (filter == currentFilter) { + found = true; + } + } + if(found == false) { + getFileChooser().addChoosableFileFilter(currentFilter); + } + } + return getFileChooser().getFileFilter(); + } + + public int getSize() { + if(filters != null) { + return filters.length; + } else { + return 0; + } + } + + public FileFilter getElementAt(int index) { + if(index > getSize() - 1) { + // This shouldn't happen. Try to recover gracefully. + return getFileChooser().getFileFilter(); + } + if(filters != null) { + return filters[index]; + } else { + return null; + } } } diff -r 3e9b46280c16 -r 91bce40d0347 src/share/classes/javax/swing/plaf/metal/MetalFileChooserUI.java --- a/src/share/classes/javax/swing/plaf/metal/MetalFileChooserUI.java Fri Jan 17 15:53:14 2014 -0800 +++ b/src/share/classes/javax/swing/plaf/metal/MetalFileChooserUI.java Thu Jan 23 20:36:31 2014 +0400 @@ -1067,9 +1067,69 @@ /** * Data model for a type-face selection combo-box. */ - protected class FilterComboBoxModel extends AbstractFilterComboBoxModel { - protected JFileChooser getFileChooser() { - return MetalFileChooserUI.this.getFileChooser(); + protected class FilterComboBoxModel extends AbstractListModel implements ComboBoxModel, PropertyChangeListener { + protected FileFilter[] filters; + protected FilterComboBoxModel() { + super(); + filters = getFileChooser().getChoosableFileFilters(); + } + + public void propertyChange(PropertyChangeEvent e) { + String prop = e.getPropertyName(); + if(prop == JFileChooser.CHOOSABLE_FILE_FILTER_CHANGED_PROPERTY) { + filters = (FileFilter[]) e.getNewValue(); + fireContentsChanged(this, -1, -1); + } else if (prop == JFileChooser.FILE_FILTER_CHANGED_PROPERTY) { + fireContentsChanged(this, -1, -1); + } + } + + public void setSelectedItem(Object filter) { + if(filter != null) { + getFileChooser().setFileFilter((FileFilter) filter); + fireContentsChanged(this, -1, -1); + } + } + + public Object getSelectedItem() { + // Ensure that the current filter is in the list. + // NOTE: we shouldnt' have to do this, since JFileChooser adds + // the filter to the choosable filters list when the filter + // is set. Lets be paranoid just in case someone overrides + // setFileFilter in JFileChooser. + FileFilter currentFilter = getFileChooser().getFileFilter(); + boolean found = false; + if(currentFilter != null) { + for (FileFilter filter : filters) { + if (filter == currentFilter) { + found = true; + } + } + if(found == false) { + getFileChooser().addChoosableFileFilter(currentFilter); + } + } + return getFileChooser().getFileFilter(); + } + + public int getSize() { + if(filters != null) { + return filters.length; + } else { + return 0; + } + } + + public Object getElementAt(int index) { + if(index > getSize() - 1) { + // This shouldn't happen. Try to recover gracefully. + return getFileChooser().getFileFilter(); + } + if(filters != null) { + return filters[index]; + } else { + return null; + } } } diff -r 3e9b46280c16 -r 91bce40d0347 src/share/classes/sun/swing/AbstractFilterComboBoxModel.java --- a/src/share/classes/sun/swing/AbstractFilterComboBoxModel.java Fri Jan 17 15:53:14 2014 -0800 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,104 +0,0 @@ -/* - * 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. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * 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. - */ -package sun.swing; - -import javax.swing.AbstractListModel; -import javax.swing.ComboBoxModel; -import javax.swing.JFileChooser; -import javax.swing.filechooser.FileFilter; -import java.beans.PropertyChangeEvent; -import java.beans.PropertyChangeListener; - -/** - * Data model for a type-face selection combo-box. - */ -public abstract class AbstractFilterComboBoxModel - extends AbstractListModel - implements ComboBoxModel, PropertyChangeListener { - - protected FileFilter[] filters; - - protected AbstractFilterComboBoxModel() { - this.filters = getFileChooser().getChoosableFileFilters(); - } - - protected abstract JFileChooser getFileChooser(); - - @Override - public void propertyChange(PropertyChangeEvent event) { - String property = event.getPropertyName(); - if (property == JFileChooser.CHOOSABLE_FILE_FILTER_CHANGED_PROPERTY) { - this.filters = (FileFilter[]) event.getNewValue(); - fireContentsChanged(this, -1, -1); - } else if (property == JFileChooser.FILE_FILTER_CHANGED_PROPERTY) { - fireContentsChanged(this, -1, -1); - } - } - - @Override - public void setSelectedItem(Object filter) { - if (filter != null) { - getFileChooser().setFileFilter((FileFilter) filter); - fireContentsChanged(this, -1, -1); - } - } - - @Override - public Object getSelectedItem() { - // Ensure that the current filter is in the list. - // NOTE: we should not have to do this, since JFileChooser adds - // the filter to the choosable filters list when the filter - // is set. Lets be paranoid just in case someone overrides - // setFileFilter in JFileChooser. - FileFilter currentFilter = getFileChooser().getFileFilter(); - if (currentFilter != null) { - for (FileFilter filter : this.filters) { - if (filter == currentFilter) { - return currentFilter; - } - } - getFileChooser().addChoosableFileFilter(currentFilter); - } - return currentFilter; - } - - @Override - public int getSize() { - return (this.filters != null) - ? filters.length - : 0; - } - - @Override - public FileFilter getElementAt(int index) { - if (index >= getSize()) { - // This shouldn't happen. Try to recover gracefully. - return getFileChooser().getFileFilter(); - } - return (this.filters != null) - ? filters[index] - : null; - } -} diff -r 3e9b46280c16 -r 91bce40d0347 src/share/classes/sun/swing/plaf/synth/SynthFileChooserUIImpl.java --- a/src/share/classes/sun/swing/plaf/synth/SynthFileChooserUIImpl.java Fri Jan 17 15:53:14 2014 -0800 +++ b/src/share/classes/sun/swing/plaf/synth/SynthFileChooserUIImpl.java Thu Jan 23 20:36:31 2014 +0400 @@ -923,9 +923,70 @@ /** * Data model for a type-face selection combo-box. */ - protected class FilterComboBoxModel extends AbstractFilterComboBoxModel { - protected JFileChooser getFileChooser() { - return SynthFileChooserUIImpl.this.getFileChooser(); + protected class FilterComboBoxModel extends AbstractListModel implements ComboBoxModel, + PropertyChangeListener { + protected FileFilter[] filters; + protected FilterComboBoxModel() { + super(); + filters = getFileChooser().getChoosableFileFilters(); + } + + public void propertyChange(PropertyChangeEvent e) { + String prop = e.getPropertyName(); + if(prop == JFileChooser.CHOOSABLE_FILE_FILTER_CHANGED_PROPERTY) { + filters = (FileFilter[]) e.getNewValue(); + fireContentsChanged(this, -1, -1); + } else if (prop == JFileChooser.FILE_FILTER_CHANGED_PROPERTY) { + fireContentsChanged(this, -1, -1); + } + } + + public void setSelectedItem(Object filter) { + if(filter != null) { + getFileChooser().setFileFilter((FileFilter) filter); + fireContentsChanged(this, -1, -1); + } + } + + public Object getSelectedItem() { + // Ensure that the current filter is in the list. + // NOTE: we shouldnt' have to do this, since JFileChooser adds + // the filter to the choosable filters list when the filter + // is set. Lets be paranoid just in case someone overrides + // setFileFilter in JFileChooser. + FileFilter currentFilter = getFileChooser().getFileFilter(); + boolean found = false; + if(currentFilter != null) { + for (FileFilter filter : filters) { + if (filter == currentFilter) { + found = true; + } + } + if(found == false) { + getFileChooser().addChoosableFileFilter(currentFilter); + } + } + return getFileChooser().getFileFilter(); + } + + public int getSize() { + if(filters != null) { + return filters.length; + } else { + return 0; + } + } + + public FileFilter getElementAt(int index) { + if(index > getSize() - 1) { + // This shouldn't happen. Try to recover gracefully. + return getFileChooser().getFileFilter(); + } + if(filters != null) { + return filters[index]; + } else { + return null; + } } }