Hi Mark, > On Sat, 2007-01-06 at 16:44 +0100, Roman Kennke wrote: > > This fixes one weird NPE (see associated bug report) and I also cleaned > > up some inconsistencies that I came over and some warnings that Eclipse > > came over :-) > > > > 2007-01-06 Roman Kennke <[EMAIL PROTECTED]> > > > > PR 30337 > > * javax/swing/plaf/basic/BasicComboBoxUI.java > > (installUI): Install popup and list here. > > Don't configure the arrow button and editor here. > > (installComponents): Don't install popup and list here. (Moved > > to installUI). Configure arrow button here and check for null. > > (addEditor): Configure editor here. > > (configureArrowButton): Directly fetch listeners from popup. > > (paintCurrentValue): Removed unused local variables. > > (layoutContainer): Removed unused local variables. > > (PropertyChangeHandler.propertyChange): Don't invalidate minimumSize > > on each property change. Avoid calling getPropertyName() repeatedly. > > Clean up. Call addEditor() when editor changes. Configure and > > unconfigure editor when editable changes. Use 'model' instead > > of non-existing 'dataModel' property. > > * javax/swing/plaf/basic/BasicComboPopup.java > > (uninstallingUI): Remove property change listener and item listener > > here. Uninstall list listeners. Set model to null to prevent leakage. > > (configureList): Don't sync list selection there. > > (uninstallComboBoxListeners): Moved to uninstallingUI. > > (uninstallListeners): Moved to uninstallingUI. > > * javax/swing/plaf/metal/MetalComboBoxUI.java > > (createPopup): Call super. > > (getMinimumSize): Removed unused statement. > > Could you take a look at the following Mauve regressions caused by this > patch? > > FAIL: javax.swing.JComboBox.setEditor > FAIL: javax.swing.plaf.basic.BasicComboBoxUI.general > FAIL: javax.swing.plaf.basic.BasicComboBoxUI.getDefaultSize > FAIL: javax.swing.plaf.basic.BasicComboBoxUI.getMaximumSize > FAIL: javax.swing.plaf.basic.BasicComboBoxUI.getMinimumSize > FAIL: javax.swing.plaf.metal.MetalComboBoxUI.createArrowButton
Thanks for checking. I believe that some of these failures are caused by an earlier patch (Component.getFont() should _not_ return a default font as checked by another Mauve test). Anyway, I fixed all these regressions. I also added a Mauve test for the original bug report. We are passing them all now and the combo boxes still seem to work. 2007-01-07 Roman Kennke <[EMAIL PROTECTED]> PR 30337 * java/awt/Component.java (getFontImpl): Return null when the component has no font set and also has no parent yet. * javax/swing/plaf/basic/BasicComboBoxUI.java (PropertyChangeHandler.propertyChange): Only add editor when combo box is editable. Avoid fetching the property name repeatedly. Invalidate when renderer or prototypeDisplayValue change. (uninstallComponents): Unconfigure everything and then remove all components. * javax/swing/plaf/basic/BasicComboPopup.java (uninstallingUI): Don't nullify list model. * javax/swing/plaf/metal/MetalComboBoxUI.java (createArrowButton): Pass currentValuePane to the MetalComboBoxButton constructor rather than a new (unconnected) CellRendererPane. /Roman
Index: java/awt/Component.java =================================================================== RCS file: /cvsroot/classpath/classpath/java/awt/Component.java,v retrieving revision 1.154 diff -u -1 -5 -r1.154 Component.java --- java/awt/Component.java 5 Jan 2007 22:55:59 -0000 1.154 +++ java/awt/Component.java 7 Jan 2007 21:12:01 -0000 @@ -1186,31 +1186,36 @@ /** * Implementation of getFont(). This is pulled out of getFont() to prevent * client programs from overriding this. * * @return the font of this component */ private final Font getFontImpl() { Font f = font; if (f == null) { Component p = parent; if (p != null) f = p.getFontImpl(); else - f = new Font("Dialog", Font.PLAIN, 12); + { + // It is important to return null here and not some kind of default + // font, otherwise the Swing UI would not install its fonts because + // it keeps non-UIResource fonts. + f = null; + } } return f; } /** * Sets the font for this component to the specified font. This is a bound * property. * * @param f the new font for this component * * @see #getFont() */ public void setFont(Font f) { Font oldFont; Index: javax/swing/plaf/basic/BasicComboBoxUI.java =================================================================== RCS file: /cvsroot/classpath/classpath/javax/swing/plaf/basic/BasicComboBoxUI.java,v retrieving revision 1.41 diff -u -1 -5 -r1.41 BasicComboBoxUI.java --- javax/swing/plaf/basic/BasicComboBoxUI.java 6 Jan 2007 15:43:21 -0000 1.41 +++ javax/swing/plaf/basic/BasicComboBoxUI.java 7 Jan 2007 21:12:01 -0000 @@ -477,48 +477,44 @@ configureArrowButton(); if (comboBox.isEditable()) addEditor(); comboBox.add(currentValuePane); } /** * Uninstalls components from this [EMAIL PROTECTED] JComboBox}. * * @see #installComponents() */ protected void uninstallComponents() { - // uninstall arrow button - unconfigureArrowButton(); - comboBox.remove(arrowButton); - arrowButton = null; - - popup = null; - - if (comboBox.getRenderer() instanceof UIResource) - comboBox.setRenderer(null); + // Unconfigure arrow button. + if (arrowButton != null) + { + unconfigureArrowButton(); + } - // if the editor is not an instanceof UIResource, it was not set by the - // UI delegate, so don't clear it... - ComboBoxEditor currentEditor = comboBox.getEditor(); - if (currentEditor instanceof UIResource) + // Unconfigure editor. + if (editor != null) { - comboBox.setEditor(null); - editor = null; + unconfigureEditor(); } + + comboBox.removeAll(); + arrowButton = null; } /** * Adds the current editor to the combo box. */ public void addEditor() { removeEditor(); editor = comboBox.getEditor().getEditorComponent(); if (editor != null) { configureEditor(); comboBox.add(editor); } } @@ -1337,69 +1333,78 @@ */ public void propertyChange(PropertyChangeEvent e) { // Lets assume every change invalidates the minimumsize. String propName = e.getPropertyName(); if (propName.equals("enabled")) { boolean enabled = comboBox.isEnabled(); if (editor != null) editor.setEnabled(enabled); if (arrowButton != null) arrowButton.setEnabled(enabled); comboBox.repaint(); } - else if (propName.equals("editor")) + else if (propName.equals("editor") && comboBox.isEditable()) { addEditor(); comboBox.revalidate(); } else if (e.getPropertyName().equals("editable")) { if (comboBox.isEditable()) { addEditor(); } else { removeEditor(); } comboBox.revalidate(); } - else if (e.getPropertyName().equals("model")) + else if (propName.equals("model")) { // remove ListDataListener from old model and add it to new model ComboBoxModel oldModel = (ComboBoxModel) e.getOldValue(); if (oldModel != null && listDataListener != null) oldModel.removeListDataListener(listDataListener); ComboBoxModel newModel = (ComboBoxModel) e.getNewValue(); if (newModel != null && listDataListener != null) comboBox.getModel().addListDataListener(listDataListener); if (editor != null) { comboBox.configureEditor(comboBox.getEditor(), comboBox.getSelectedItem()); } isMinimumSizeDirty = true; comboBox.revalidate(); comboBox.repaint(); } - else if (e.getPropertyName().equals("font")) + else if (propName.equals("font")) { Font font = (Font) e.getNewValue(); if (editor != null) { editor.setFont(font); } listBox.setFont(font); isMinimumSizeDirty = true; comboBox.revalidate(); } - + else if (propName.equals("prototypeDisplayValue")) + { + isMinimumSizeDirty = true; + comboBox.revalidate(); + } + else if (propName.equals("renderer")) + { + isMinimumSizeDirty = true; + comboBox.revalidate(); + } // FIXME: Need to handle changes in other bound properties. } } } Index: javax/swing/plaf/basic/BasicComboPopup.java =================================================================== RCS file: /cvsroot/classpath/classpath/javax/swing/plaf/basic/BasicComboPopup.java,v retrieving revision 1.20 diff -u -1 -5 -r1.20 BasicComboPopup.java --- javax/swing/plaf/basic/BasicComboPopup.java 6 Jan 2007 15:43:21 -0000 1.20 +++ javax/swing/plaf/basic/BasicComboPopup.java 7 Jan 2007 21:12:01 -0000 @@ -270,31 +270,30 @@ * This method uninstalls the UI for the given JComponent. */ public void uninstallingUI() { if (propertyChangeListener != null) { comboBox.removePropertyChangeListener(propertyChangeListener); } if (itemListener != null) { comboBox.removeItemListener(itemListener); } uninstallComboBoxModelListeners(comboBox.getModel()); uninstallKeyboardActions(); uninstallListListeners(); - list.setModel(null); } /** * This method uninstalls listeners that were listening to changes occuring * in the comb box's data model * * @param model data model for the combo box from which to uninstall * listeners */ protected void uninstallComboBoxModelListeners(ComboBoxModel model) { model.removeListDataListener(listDataListener); } /** Index: javax/swing/plaf/metal/MetalComboBoxUI.java =================================================================== RCS file: /cvsroot/classpath/classpath/javax/swing/plaf/metal/MetalComboBoxUI.java,v retrieving revision 1.13 diff -u -1 -5 -r1.13 MetalComboBoxUI.java --- javax/swing/plaf/metal/MetalComboBoxUI.java 6 Jan 2007 15:43:21 -0000 1.13 +++ javax/swing/plaf/metal/MetalComboBoxUI.java 7 Jan 2007 21:12:01 -0000 @@ -36,31 +36,30 @@ exception statement from your version. */ package javax.swing.plaf.metal; import java.awt.Color; import java.awt.Container; import java.awt.Dimension; import java.awt.Graphics; import java.awt.Insets; import java.awt.LayoutManager; import java.awt.event.MouseEvent; import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; -import javax.swing.CellRendererPane; import javax.swing.ComboBoxEditor; import javax.swing.Icon; import javax.swing.JButton; import javax.swing.JComboBox; import javax.swing.JComponent; import javax.swing.plaf.ComponentUI; import javax.swing.plaf.basic.BasicComboBoxUI; import javax.swing.plaf.basic.BasicComboPopup; import javax.swing.plaf.basic.ComboPopup; /** * A UI delegate for the [EMAIL PROTECTED] JComboBox} component. */ public class MetalComboBoxUI extends BasicComboBoxUI @@ -216,31 +215,31 @@ * @return A popup. */ protected ComboPopup createPopup() { return super.createPopup(); } /** * Creates a new button for use in rendering the JComboBox. * * @return A button. */ protected JButton createArrowButton() { JButton button = new MetalComboBoxButton(comboBox, new MetalComboBoxIcon(), - new CellRendererPane(), listBox); + currentValuePane, listBox); button.setMargin(new Insets(0, 1, 1, 3)); return button; } /** * Creates a new property change listener. * * @return A new property change listener. */ public PropertyChangeListener createPropertyChangeListener() { return new MetalPropertyChangeListener(); } public void paint(Graphics g, JComponent c)