/* * $Id$ * * Copyright 2006 Sun Microsystems, Inc., 4150 Network Circle, * Santa Clara, California 95054, U.S.A. All rights reserved. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library 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 * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA * */ package org.jdesktop.swingx.renderer; import java.awt.BorderLayout; import java.awt.Color; import java.awt.Component; import java.awt.event.ActionEvent; import java.io.IOException; import java.util.logging.Logger; import javax.swing.Action; import javax.swing.Icon; import javax.swing.JComponent; import javax.swing.JScrollPane; import javax.swing.JTree; import javax.swing.SwingUtilities; import javax.swing.UIManager; import javax.swing.tree.DefaultTreeCellRenderer; import javax.swing.tree.TreePath; import org.jdesktop.swingx.InteractiveTestCase; import org.jdesktop.swingx.JXFrame; import org.jdesktop.swingx.JXPanel; import org.jdesktop.swingx.JXTree; import org.jdesktop.swingx.action.AbstractActionExt; import org.jdesktop.swingx.painter.ImagePainter; import org.jdesktop.swingx.test.ComponentTreeTableModel; import org.jdesktop.swingx.test.XTestUtils; /** * Known/open issues with tree renderer. * * @author Jeanette Winzenburg */ public class TreeRendererIssues extends InteractiveTestCase { @SuppressWarnings("unused") private static final Logger LOG = Logger.getLogger(TreeRendererIssues.class .getName()); private JTree tree; private DefaultTreeCellRenderer coreTreeRenderer; private DefaultTreeRenderer xTreeRenderer; // flag used in setup to explicitly choose LF private boolean defaultToSystemLF; @Override protected void setUp() throws Exception { // setSystemLF(true); // LOG.info("LF: " + UIManager.getLookAndFeel()); // LOG.info("Theme: " + ((MetalLookAndFeel) UIManager.getLookAndFeel()).getCurrentTheme()); // UIManager.put("Tree.drawsFocusBorderAroundIcon", Boolean.TRUE); // make sure we have the same default for each test defaultToSystemLF = false; setSystemLF(defaultToSystemLF); tree = new JTree(); coreTreeRenderer = new DefaultTreeCellRenderer(); xTreeRenderer = new DefaultTreeRenderer(); } public static void main(String[] args) { TreeRendererIssues test = new TreeRendererIssues(); try { test.runInteractiveTests(); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } public void interactiveTransparentRenderer() throws IOException { final JXTree tree = new JXTree(new ComponentTreeTableModel(new JXFrame())); tree.setEditable(true); StringValue sv = new StringValue() { public String getString(Object value) { if (value instanceof Component) { return ((Component) value).getName(); } return " - no component - "; }}; DefaultTreeRenderer renderer = new DefaultTreeRenderer(sv); tree.setCellRenderer(renderer); tree.setForeground(Color.WHITE); JXPanel panel = new JXPanel(new BorderLayout()); ImagePainter imagePainter = new ImagePainter(XTestUtils.loadDefaultImage()); imagePainter.setFillHorizontal(true); imagePainter.setFillVertical(true); panel.setBackgroundPainter(imagePainter); panel.add(new JScrollPane(tree)); JXFrame frame = wrapInFrame(panel, "renderer"); WrappingProvider provider = (WrappingProvider) renderer.getComponentProvider(); provider.getWrappee().getRendererComponent(null).setOpaque(false); tree.setOpaque(false); ((JComponent) tree.getParent()).setOpaque(false); ((JComponent) tree.getParent().getParent()).setOpaque(false); Action edit = new AbstractActionExt("edit") { public void actionPerformed(ActionEvent e) { if (tree.isSelectionEmpty()) return; TreePath path = tree.getSelectionPath(); Component comp = (Component) path.getLastPathComponent(); String oldName = comp.getName(); if (oldName == null) { oldName = "none"; } String changed = oldName.length() > 60 ? oldName.substring(0, 20) : oldName + "+++++++++++++++++++++++++++++++++++++++++++++"; tree.getModel().valueForPathChanged(path, changed); } }; addAction(frame, edit); show(frame); } /** * Sanity: icons updated on LF change. */ public void testTreeIconsUpdateUI() { JXTree tree = new JXTree(); DefaultTreeRenderer renderer = new DefaultTreeRenderer(); tree.setCellRenderer(renderer); WrappingIconPanel before = (WrappingIconPanel) renderer.getTreeCellRendererComponent(tree, "", false, false, true, -1, false); Icon leaf = before.getIcon(); assertNotNull("sanity", leaf); assertEquals("sanity", UIManager.getIcon("Tree.leafIcon"), leaf); String lf = UIManager.getLookAndFeel().getName(); setSystemLF(!defaultToSystemLF); if (lf.equals(UIManager.getLookAndFeel().getName())) { LOG.info("cannot run test - equal LF" + lf); return; } SwingUtilities.updateComponentTreeUI(tree); WrappingIconPanel after = (WrappingIconPanel) renderer.getTreeCellRendererComponent(tree, "", false, false, true, -1, false); Icon leafAfter = after.getIcon(); assertNotNull("sanity", leafAfter); assertFalse("sanity", leaf.equals(leafAfter)); assertEquals("icon must be updated", UIManager.getIcon("Tree.leafIcon"), leafAfter); } /** * base interaction with list: renderer uses list's unselected colors * * currently, this test fails because the assumptions are wrong! Core * renderer behaves slightly unexpected. * * */ public void testTreeRendererExtColors() { // prepare standard Component coreComponent = coreTreeRenderer.getTreeCellRendererComponent(tree, null, false, false, false, 0, false); // sanity: known standard behaviour assertNull(coreComponent.getBackground()); // assertNull(coreComponent.getForeground()); assertNull(tree.getForeground()); Color uiForeground = UIManager.getColor("Tree.textForeground"); assertEquals(uiForeground, coreComponent.getForeground()); // prepare extended Component xComponent = xTreeRenderer.getTreeCellRendererComponent(tree, null, false, false, false, 0, false); // assert behaviour same as standard // assertEquals(coreComponent.getBackground(), xComponent.getBackground()); assertEquals(coreComponent.getForeground(), xComponent.getForeground()); } /** * base interaction with list: renderer uses list's unselected custom * colors. * * currently, this test fails because the assumptions are wrong! Core * renderer behaves slightly unexpected. * */ public void testTreeRendererExtTreeColors() { Color background = Color.MAGENTA; Color foreground = Color.YELLOW; tree.setBackground(background); tree.setForeground(foreground); coreTreeRenderer.setBackgroundNonSelectionColor(background); coreTreeRenderer.setTextNonSelectionColor(foreground); // prepare standard Component coreComponent = coreTreeRenderer .getTreeCellRendererComponent(tree, null, false, false, false, 0, false); // sanity: known standard behaviour // background is manually painted assertEquals(background, coreComponent.getBackground()); assertEquals(tree.getForeground(), coreComponent.getForeground()); // prepare extended Component xComponent = xTreeRenderer.getTreeCellRendererComponent(tree, null, false, false, false, 0, false); // assert behaviour same as standard assertEquals(background, xComponent.getBackground()); assertEquals(foreground, xComponent.getForeground()); } }