# HG changeset patch # Parent bffc34544c7a5319e9877fefcd76b55bdfe8db80 # User Jesse Glick #212297: display combo boxes with custom renderers properly in GTK L&F. diff --git a/java.api.common/src/org/netbeans/modules/java/api/common/project/ui/customizer/MainClassChooser.java b/java.api.common/src/org/netbeans/modules/java/api/common/project/ui/customizer/MainClassChooser.java --- a/java.api.common/src/org/netbeans/modules/java/api/common/project/ui/customizer/MainClassChooser.java +++ b/java.api.common/src/org/netbeans/modules/java/api/common/project/ui/customizer/MainClassChooser.java @@ -58,9 +58,9 @@ import java.util.concurrent.Future; import java.util.concurrent.atomic.AtomicBoolean; import javax.lang.model.element.TypeElement; -import javax.swing.DefaultListCellRenderer; import javax.swing.JList; import javax.swing.JPanel; +import javax.swing.ListCellRenderer; import javax.swing.ListSelectionModel; import javax.swing.SwingUtilities; import javax.swing.event.ChangeEvent; @@ -113,7 +113,7 @@ Parameters.notNull("sourceRoots", sourcesRoots); //NOI18N dialogSubtitle = subtitle; initComponents(); - jMainClassList.setCellRenderer(new MainClassRenderer()); + jMainClassList.setCellRenderer(new MainClassRenderer(jMainClassList.getCellRenderer())); initClassesView(); initClassesModel(sourcesRoots, mainClass); scanningLabel.setVisible(false); @@ -127,7 +127,7 @@ assert mainClassesInFile != null; dialogSubtitle = subtitle; this.initComponents(); - jMainClassList.setCellRenderer(new MainClassRenderer()); + jMainClassList.setCellRenderer(new MainClassRenderer(jMainClassList.getCellRenderer())); initClassesView(); initClassesModel (mainClassesInFile); } @@ -389,7 +389,11 @@ return 0; } - private static final class MainClassRenderer extends DefaultListCellRenderer { + private static final class MainClassRenderer implements ListCellRenderer { + private final ListCellRenderer orig; + MainClassRenderer(ListCellRenderer orig) { + this.orig = orig; + } @Override public Component getListCellRendererComponent (JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) { String displayName; @@ -400,7 +404,7 @@ } else { displayName = value.toString (); } - return super.getListCellRendererComponent (list, displayName, index, isSelected, cellHasFocus); + return orig.getListCellRendererComponent (list, displayName, index, isSelected, cellHasFocus); } } diff --git a/java.api.common/src/org/netbeans/modules/java/api/common/project/ui/customizer/SourceRootsUi.java b/java.api.common/src/org/netbeans/modules/java/api/common/project/ui/customizer/SourceRootsUi.java --- a/java.api.common/src/org/netbeans/modules/java/api/common/project/ui/customizer/SourceRootsUi.java +++ b/java.api.common/src/org/netbeans/modules/java/api/common/project/ui/customizer/SourceRootsUi.java @@ -60,7 +60,6 @@ import java.text.MessageFormat; import javax.swing.CellEditor; import javax.swing.DefaultCellEditor; -import javax.swing.DefaultListCellRenderer; import javax.swing.JButton; import javax.swing.JComponent; import javax.swing.JFileChooser; @@ -71,6 +70,7 @@ import javax.swing.JScrollPane; import javax.swing.JTable; import javax.swing.JTextField; +import javax.swing.ListCellRenderer; import javax.swing.ListSelectionModel; import javax.swing.SwingUtilities; import javax.swing.event.ListSelectionEvent; @@ -579,7 +579,7 @@ ((GridBagLayout)this.getLayout()).setConstraints(label,c); this.add (label); JList roots = new JList (invalidRoots.toArray()); - roots.setCellRenderer (new InvalidRootRenderer(true)); + roots.setCellRenderer(new InvalidRootRenderer(roots.getCellRenderer(), true)); JScrollPane p = new JScrollPane (roots); c = new GridBagConstraints(); c.gridx = GridBagConstraints.RELATIVE; @@ -607,18 +607,20 @@ this.add (label2); } - private static class InvalidRootRenderer extends DefaultListCellRenderer { + private static class InvalidRootRenderer implements ListCellRenderer { private static final long serialVersionUID = 194496879246810209L; + private final ListCellRenderer orig; private boolean projectConflict; - public InvalidRootRenderer (boolean projectConflict) { + InvalidRootRenderer(ListCellRenderer orig, boolean projectConflict) { + this.orig = orig; this.projectConflict = projectConflict; } public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) { if (" ".equals(value)) { // NOI18N - return super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus); + return orig.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus); } File f = (File) value; String message = f.getAbsolutePath(); @@ -632,7 +634,7 @@ projectName}); } } - return super.getListCellRendererComponent(list, message, index, isSelected, cellHasFocus); + return orig.getListCellRendererComponent(list, message, index, isSelected, cellHasFocus); } } } diff --git a/java.api.common/src/org/netbeans/modules/java/api/common/project/ui/wizards/FolderList.java b/java.api.common/src/org/netbeans/modules/java/api/common/project/ui/wizards/FolderList.java --- a/java.api.common/src/org/netbeans/modules/java/api/common/project/ui/wizards/FolderList.java +++ b/java.api.common/src/org/netbeans/modules/java/api/common/project/ui/wizards/FolderList.java @@ -64,11 +64,11 @@ import java.util.concurrent.atomic.AtomicReference; import java.util.regex.Pattern; import javax.swing.DefaultListModel; -import javax.swing.DefaultListCellRenderer; import javax.swing.DropMode; import javax.swing.JComponent; import javax.swing.JFileChooser; import javax.swing.JList; +import javax.swing.ListCellRenderer; import javax.swing.TransferHandler; import javax.swing.event.ListSelectionListener; import javax.swing.event.ListSelectionEvent; @@ -115,7 +115,7 @@ this.jLabel1.setText(label); this.jLabel1.setDisplayedMnemonic(mnemonic); this.roots.getAccessibleContext().setAccessibleName(accessibleDesc); - this.roots.setCellRenderer(new Renderer()); + this.roots.setCellRenderer(new Renderer(roots.getCellRenderer())); this.roots.setModel (new DefaultListModel()); this.roots.addListSelectionListener(new ListSelectionListener() { public void valueChanged(ListSelectionEvent e) { @@ -459,14 +459,18 @@ return false; } - private static class Renderer extends DefaultListCellRenderer { + private static class Renderer implements ListCellRenderer { + private final ListCellRenderer orig; + Renderer(ListCellRenderer orig) { + this.orig = orig; + } public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) { if (" ".equals(value)) { // NOI18N - return super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus); + return orig.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus); } File f = (File) value; String message = f.getAbsolutePath(); - Component result = super.getListCellRendererComponent(list, message, index, isSelected, cellHasFocus); + Component result = orig.getListCellRendererComponent(list, message, index, isSelected, cellHasFocus); return result; } } diff --git a/java.api.common/src/org/netbeans/modules/java/api/common/ui/PlatformUiSupport.java b/java.api.common/src/org/netbeans/modules/java/api/common/ui/PlatformUiSupport.java --- a/java.api.common/src/org/netbeans/modules/java/api/common/ui/PlatformUiSupport.java +++ b/java.api.common/src/org/netbeans/modules/java/api/common/ui/PlatformUiSupport.java @@ -104,8 +104,15 @@ * created by the {@link PlatformUiSupport#createPlatformComboBoxModel(String)} method. * @return {@link ListCellRenderer}. */ + @Deprecated public static ListCellRenderer createPlatformListCellRenderer() { - return new PlatformListCellRenderer(); + return createPlatformListCellRenderer(new JComboBox().getRenderer()); + } + /** + * @since XXX + */ + public static ListCellRenderer createPlatformListCellRenderer(ListCellRenderer orig) { + return new PlatformListCellRenderer(orig); } /** @@ -340,8 +347,15 @@ * of illegal source levels is needed. * @return {@link ListCellRenderer} for source levels. */ + @Deprecated public static ListCellRenderer createSourceLevelListCellRenderer() { - return new SourceLevelListCellRenderer(); + return createSourceLevelListCellRenderer(new JComboBox().getRenderer()); + } + /** + * @since XXX + */ + public static ListCellRenderer createSourceLevelListCellRenderer(ListCellRenderer orig) { + return new SourceLevelListCellRenderer(orig); } /** @@ -582,9 +596,11 @@ private static final class PlatformListCellRenderer implements ListCellRenderer { private final ListCellRenderer delegate; + private final ListCellRenderer orig; - public PlatformListCellRenderer() { + public PlatformListCellRenderer(ListCellRenderer orig) { delegate = HtmlRenderer.createRenderer(); + this.orig = orig; } public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, @@ -599,11 +615,12 @@ name = "" //NOI18N + NbBundle.getMessage( PlatformUiSupport.class, "TXT_BrokenPlatformFmt", key.getDisplayName()); + return delegate.getListCellRendererComponent(list, name, index, isSelected, cellHasFocus); } else { name = key.getDisplayName(); } } - return delegate.getListCellRendererComponent(list, name, index, isSelected, cellHasFocus); + return orig.getListCellRendererComponent(list, name, index, isSelected, cellHasFocus); } } @@ -789,9 +806,11 @@ private static final class SourceLevelListCellRenderer implements ListCellRenderer { private ListCellRenderer delegate; + private final ListCellRenderer orig; - public SourceLevelListCellRenderer() { + public SourceLevelListCellRenderer(ListCellRenderer orig) { delegate = HtmlRenderer.createRenderer(); + this.orig = orig; } public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, @@ -806,11 +825,12 @@ message = "" //NOI18N + NbBundle.getMessage( PlatformUiSupport.class, "TXT_InvalidSourceLevel", key.getDisplayName()); + return delegate.getListCellRendererComponent(list, message, index, isSelected, cellHasFocus); } else { message = key.getDisplayName(); } } - return delegate.getListCellRendererComponent(list, message, index, isSelected, cellHasFocus); + return orig.getListCellRendererComponent(list, message, index, isSelected, cellHasFocus); } } diff --git a/java.j2seproject/src/org/netbeans/modules/java/j2seproject/ui/customizer/CustomizerLibraries.java b/java.j2seproject/src/org/netbeans/modules/java/j2seproject/ui/customizer/CustomizerLibraries.java --- a/java.j2seproject/src/org/netbeans/modules/java/j2seproject/ui/customizer/CustomizerLibraries.java +++ b/java.j2seproject/src/org/netbeans/modules/java/j2seproject/ui/customizer/CustomizerLibraries.java @@ -179,7 +179,7 @@ jCheckBoxBuildSubprojects.setModel( uiProperties.NO_DEPENDENCIES_MODEL ); librariesLocation.setDocument(uiProperties.SHARED_LIBRARIES_MODEL); jComboBoxTarget.setModel(uiProperties.PLATFORM_MODEL); - jComboBoxTarget.setRenderer(uiProperties.PLATFORM_LIST_RENDERER); + jComboBoxTarget.setRenderer(PlatformUiSupport.createPlatformListCellRenderer(jComboBoxTarget.getRenderer())); if (!UIManager.getLookAndFeel().getClass().getName().toUpperCase().contains("AQUA")) { //NOI18N //Not needed on Mac AQUA L&F also this causes an appearance problem on it jComboBoxTarget.putClientProperty ("JComboBox.isTableCellEditor", Boolean.TRUE); //NOI18N diff --git a/java.j2seproject/src/org/netbeans/modules/java/j2seproject/ui/customizer/CustomizerRun.java b/java.j2seproject/src/org/netbeans/modules/java/j2seproject/ui/customizer/CustomizerRun.java --- a/java.j2seproject/src/org/netbeans/modules/java/j2seproject/ui/customizer/CustomizerRun.java +++ b/java.j2seproject/src/org/netbeans/modules/java/j2seproject/ui/customizer/CustomizerRun.java @@ -67,7 +67,6 @@ import javax.swing.event.ChangeListener; import javax.swing.event.DocumentEvent; import javax.swing.event.DocumentListener; -import javax.swing.plaf.UIResource; import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; @@ -139,7 +138,7 @@ configChanged(uiProperties.activeConfig); - configCombo.setRenderer(new ConfigListCellRenderer()); + configCombo.setRenderer(new ConfigListCellRenderer(configCombo.getRenderer())); for (int i = 0; i < data.length; i++) { final JTextField field = data[i]; @@ -683,16 +682,14 @@ } - private final class ConfigListCellRenderer extends JLabel implements ListCellRenderer, UIResource { + private final class ConfigListCellRenderer implements ListCellRenderer { - public ConfigListCellRenderer () { - setOpaque(true); + private final ListCellRenderer orig; + ConfigListCellRenderer(ListCellRenderer orig) { + this.orig = orig; } public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) { - // #93658: GTK needs name to render cell renderer "natively" - setName("ComboBox.listRenderer"); // NOI18N - String config = (String) value; String label; if (config == null) { @@ -707,24 +704,7 @@ } else { label = NbBundle.getBundle("org.netbeans.modules.java.j2seproject.Bundle").getString("J2SEConfigurationProvider.default.label"); // NOI18N } - setText(label); - - if ( isSelected ) { - setBackground(list.getSelectionBackground()); - setForeground(list.getSelectionForeground()); - } - else { - setBackground(list.getBackground()); - setForeground(list.getForeground()); - } - - return this; - } - - // #93658: GTK needs name to render cell renderer "natively" - public String getName() { - String name = super.getName(); - return name == null ? "ComboBox.renderer" : name; // NOI18N + return orig.getListCellRendererComponent(list, label, index, isSelected, cellHasFocus); } } diff --git a/java.j2seproject/src/org/netbeans/modules/java/j2seproject/ui/customizer/CustomizerSources.java b/java.j2seproject/src/org/netbeans/modules/java/j2seproject/ui/customizer/CustomizerSources.java --- a/java.j2seproject/src/org/netbeans/modules/java/j2seproject/ui/customizer/CustomizerSources.java +++ b/java.j2seproject/src/org/netbeans/modules/java/j2seproject/ui/customizer/CustomizerSources.java @@ -58,6 +58,7 @@ import javax.swing.table.TableColumn; import javax.swing.table.TableModel; import org.netbeans.modules.java.api.common.project.ui.customizer.SourceRootsUi; +import org.netbeans.modules.java.api.common.ui.PlatformUiSupport; import org.netbeans.spi.java.project.support.ui.IncludeExcludeVisualizer; import org.netbeans.spi.project.ui.support.ProjectCustomizer; import org.openide.DialogDescriptor; @@ -122,7 +123,7 @@ emTSR.setRelatedEditMediator( emSR ); this.sourceLevel.setEditable(false); this.sourceLevel.setModel(uiProperties.JAVAC_SOURCE_MODEL); - this.sourceLevel.setRenderer(uiProperties.JAVAC_SOURCE_RENDERER); + this.sourceLevel.setRenderer(PlatformUiSupport.createSourceLevelListCellRenderer(sourceLevel.getRenderer())); uiProperties.JAVAC_SOURCE_MODEL.addListDataListener(new ListDataListener () { public void intervalAdded(ListDataEvent e) { enableSourceLevel (); @@ -143,7 +144,7 @@ } this.encoding.setModel(ProjectCustomizer.encodingModel(originalEncoding)); - this.encoding.setRenderer(ProjectCustomizer.encodingRenderer()); + this.encoding.setRenderer(ProjectCustomizer.encodingRenderer(this.encoding.getRenderer())); final String lafid = UIManager.getLookAndFeel().getID(); if (!"Aqua".equals(lafid)) { //NOI18N this.encoding.putClientProperty ("JComboBox.isTableCellEditor", Boolean.TRUE); //NOI18N diff --git a/java.j2seproject/src/org/netbeans/modules/java/j2seproject/ui/customizer/J2SEProjectProperties.java b/java.j2seproject/src/org/netbeans/modules/java/j2seproject/ui/customizer/J2SEProjectProperties.java --- a/java.j2seproject/src/org/netbeans/modules/java/j2seproject/ui/customizer/J2SEProjectProperties.java +++ b/java.j2seproject/src/org/netbeans/modules/java/j2seproject/ui/customizer/J2SEProjectProperties.java @@ -205,8 +205,6 @@ DefaultListModel ENDORSED_CLASSPATH_MODEL; ComboBoxModel PLATFORM_MODEL; ListCellRenderer CLASS_PATH_LIST_RENDERER; - ListCellRenderer PLATFORM_LIST_RENDERER; - ListCellRenderer JAVAC_SOURCE_RENDERER; Document SHARED_LIBRARIES_MODEL; // CustomizerCompile @@ -322,9 +320,7 @@ RUN_TEST_CLASSPATH_MODEL = ClassPathUiSupport.createListModel(cs.itemsIterator(projectProperties.get(ProjectProperties.RUN_TEST_CLASSPATH))); ENDORSED_CLASSPATH_MODEL = ClassPathUiSupport.createListModel(cs.itemsIterator(projectProperties.get(ProjectProperties.ENDORSED_CLASSPATH))); PLATFORM_MODEL = PlatformUiSupport.createPlatformComboBoxModel (evaluator.getProperty(JAVA_PLATFORM)); - PLATFORM_LIST_RENDERER = PlatformUiSupport.createPlatformListCellRenderer(); JAVAC_SOURCE_MODEL = PlatformUiSupport.createSourceLevelComboBoxModel (PLATFORM_MODEL, evaluator.getProperty(JAVAC_SOURCE), evaluator.getProperty(JAVAC_TARGET)); - JAVAC_SOURCE_RENDERER = PlatformUiSupport.createSourceLevelListCellRenderer (); SHARED_LIBRARIES_MODEL = new PlainDocument(); try { SHARED_LIBRARIES_MODEL.insertString(0, project.getAntProjectHelper().getLibrariesLocation(), null); diff --git a/maven/src/org/netbeans/modules/maven/customizer/SourcesPanel.java b/maven/src/org/netbeans/modules/maven/customizer/SourcesPanel.java --- a/maven/src/org/netbeans/modules/maven/customizer/SourcesPanel.java +++ b/maven/src/org/netbeans/modules/maven/customizer/SourcesPanel.java @@ -207,7 +207,7 @@ sourceEncoding = handle.getProject().getProperties().getProperty(Constants.ENCODING_PROP); comEncoding.setModel(ProjectCustomizer.encodingModel(oldEncoding)); - comEncoding.setRenderer(ProjectCustomizer.encodingRenderer()); + comEncoding.setRenderer(ProjectCustomizer.encodingRenderer(comEncoding.getRenderer())); comSourceLevel.addActionListener(new ActionListener() { @Override diff --git a/options.editor/src/org/netbeans/modules/options/indentation/FormattingPanel.java b/options.editor/src/org/netbeans/modules/options/indentation/FormattingPanel.java --- a/options.editor/src/org/netbeans/modules/options/indentation/FormattingPanel.java +++ b/options.editor/src/org/netbeans/modules/options/indentation/FormattingPanel.java @@ -53,14 +53,13 @@ import java.util.Comparator; import java.util.List; import javax.swing.DefaultComboBoxModel; -import javax.swing.DefaultListCellRenderer; import javax.swing.JComponent; import javax.swing.JLabel; import javax.swing.JList; import javax.swing.JPanel; +import javax.swing.ListCellRenderer; import javax.swing.SwingConstants; import javax.swing.SwingUtilities; -import javax.swing.UIManager; import javax.swing.border.EmptyBorder; import javax.swing.text.Document; import javax.swing.text.JTextComponent; @@ -86,7 +85,8 @@ // } // Languages combobox renderer - languageCombo.setRenderer(new DefaultListCellRenderer() { + languageCombo.setRenderer(new ListCellRenderer() { + final ListCellRenderer orig = languageCombo.getRenderer(); @Override public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) { if (value instanceof String) { @@ -94,18 +94,19 @@ ? EditorSettings.getDefault().getLanguageName((String)value) : org.openide.util.NbBundle.getMessage(FormattingPanel.class, "LBL_AllLanguages"); //NOI18N } - return super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus); + return orig.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus); } }); // Category combobox renderer - categoryCombo.setRenderer(new DefaultListCellRenderer() { + categoryCombo.setRenderer(new ListCellRenderer() { + final ListCellRenderer orig = categoryCombo.getRenderer(); @Override public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) { if (value instanceof PreferencesCustomizer) { value = ((PreferencesCustomizer) value).getDisplayName(); } - return super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus); + return orig.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus); } }); diff --git a/projectuiapi/src/org/netbeans/spi/project/ui/support/ProjectCustomizer.java b/projectuiapi/src/org/netbeans/spi/project/ui/support/ProjectCustomizer.java --- a/projectuiapi/src/org/netbeans/spi/project/ui/support/ProjectCustomizer.java +++ b/projectuiapi/src/org/netbeans/spi/project/ui/support/ProjectCustomizer.java @@ -67,7 +67,7 @@ import java.util.logging.Logger; import javax.swing.ComboBoxModel; import javax.swing.DefaultComboBoxModel; -import javax.swing.DefaultListCellRenderer; +import javax.swing.JComboBox; import javax.swing.JComponent; import javax.swing.JDialog; import javax.swing.JList; @@ -709,8 +709,15 @@ * @return A renderer * @since 1.42 */ + @Deprecated public static ListCellRenderer encodingRenderer() { - return new EncodingRenderer(); + return new EncodingRenderer(new JComboBox().getRenderer()); + } + /** + * @since XXX + */ + public static ListCellRenderer encodingRenderer(ListCellRenderer orig) { + return new EncodingRenderer(orig); } /** @@ -728,10 +735,10 @@ return new EncodingModel(initialCharset); } - private static final class EncodingRenderer extends DefaultListCellRenderer { - EncodingRenderer() { - //Needed for synth? - setName ("ComboBox.listRenderer"); //NOI18N + private static final class EncodingRenderer implements ListCellRenderer { + private final ListCellRenderer orig; + EncodingRenderer(ListCellRenderer orig) { + this.orig = orig; } @Override @@ -740,7 +747,7 @@ if (value instanceof Charset) { value = ((Charset) value).displayName(); } - return super.getListCellRendererComponent(list, value, index, + return orig.getListCellRendererComponent(list, value, index, isSelected, isLeadSelection); } }