/* * $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.Color; import java.awt.Dimension; import java.awt.Point; import java.awt.event.ActionEvent; import java.awt.event.MouseListener; import java.lang.reflect.InvocationTargetException; import java.text.DateFormat; import java.util.logging.Logger; import javax.swing.AbstractButton; import javax.swing.Icon; import javax.swing.ImageIcon; import javax.swing.JComponent; import javax.swing.JLabel; import javax.swing.JList; import javax.swing.JTable; import javax.swing.JTree; import javax.swing.ListCellRenderer; import javax.swing.LookAndFeel; import javax.swing.SwingUtilities; import javax.swing.ToolTipManager; import javax.swing.UIManager; import javax.swing.table.TableCellRenderer; import javax.swing.tree.DefaultMutableTreeNode; import javax.swing.tree.TreeCellRenderer; import org.jdesktop.swingx.InteractiveTestCase; import org.jdesktop.swingx.JXHyperlink; import org.jdesktop.swingx.JXPanel; import org.jdesktop.swingx.JXTable; import org.jdesktop.swingx.JXTreeTable; import org.jdesktop.swingx.hyperlink.AbstractHyperlinkAction; import org.jdesktop.swingx.icon.EmptyIcon; import org.jdesktop.swingx.painter.ShapePainter; import org.jdesktop.swingx.table.TableColumnExt; import org.jdesktop.swingx.test.ComponentTreeTableModel; import org.jdesktop.swingx.test.XTestUtils; import org.jdesktop.test.PropertyChangeReport; import org.jdesktop.test.TestUtils; import org.junit.Test; import org.junit.runner.RunWith; import org.junit.runners.JUnit4; /** * Tests swingx rendering infrastructure: ComponentProvider, CellContext, * .. * * * @author Jeanette Winzenburg */ @RunWith(JUnit4.class) public class RenderingTest extends InteractiveTestCase { @SuppressWarnings("unused") private static final Logger LOG = Logger.getLogger(RenderingTest.class .getName()); /** * Issue #1339-swingx: set name of rendering component for Synth-based LAFs. * * @throws Exception */ @Test public void testRenderingComponentNames() throws Exception { ComponentProvider<?> provider = new LabelProvider(); assertEquals("default name expected null", null, provider .getRendererComponent(null).getName()); // use the same provider for all types of renderers DefaultTableRenderer rendererTable = new DefaultTableRenderer(provider); DefaultListRenderer rendererList = new DefaultListRenderer(provider); DefaultTreeRenderer rendererTree = new DefaultTreeRenderer(provider); LookAndFeel old = UIManager.getLookAndFeel(); try { InteractiveTestCase.setLookAndFeel("Nimbus"); // table JTable table = new JTable(4, 3); TableCellRenderer tableT = table.getDefaultRenderer(Object.class); String nameT = tableT.getTableCellRendererComponent(table, null, false, false, 0, 0).getName(); assertEquals("sanity: checking default name", "Table.cellRenderer", nameT); assertEquals(nameT, rendererTable .getTableCellRendererComponent(null, null, false, false, 0, 0).getName()); // list JList list = new JList(); ListCellRenderer listR = list.getCellRenderer(); String nameL = listR.getListCellRendererComponent(list, null, 0, false, false).getName(); assertEquals("sanity: checking default name", "List.cellRenderer", nameL); assertEquals(nameL, rendererList. getListCellRendererComponent(list, null, 0, false, false).getName()); // tree JTree tree = new JTree(); TreeCellRenderer treeR = tree.getCellRenderer(); String nameTree = treeR.getTreeCellRendererComponent(tree, null, false, false, false, 1, false).getName(); assertEquals("sanity: checking default name", "Tree.cellRenderer", nameTree); assertEquals(nameTree, rendererTree. getTreeCellRendererComponent(tree, null, false, false, false, 0, false).getName()); } finally { UIManager.setLookAndFeel(old); } } /** * Issue #766-swingx: flickering cursor on drop over. * * test hack configuration (arrrggg ...) */ @Test public void testWrappingIconPanelDropHackDefault() { JXPanel sanity = new JXPanel(); assertEquals("visible by default", true, sanity.isVisible()); WrappingIconPanel panel = new WrappingIconPanel(); assertEquals("invisible by default", false, panel.isVisible()); panel.setDropHackEnabled(false); assertEquals("disabled hack", true, panel.isVisible()); } /** * Issue #766-swingx: flickering cursor on drop over. * * test hack configuration (arrrggg ...) */ @Test public void testWrappingIconPanelDropHackConstructor() { JXPanel sanity = new JXPanel(); assertEquals("visible by default", true, sanity.isVisible()); WrappingIconPanel panel = new WrappingIconPanel(false); assertEquals("invisible by default", true, panel.isVisible()); panel.setDropHackEnabled(true); assertEquals("disabled hack", false, panel.isVisible()); } /** * Issue #863-swingx: SwingX renderering components must be PainterAware. * Here: test Hyperlink */ @Test public void testHyperlinkPainterAware() { HyperlinkProvider provider = new HyperlinkProvider(); assertTrue("hyperlink as rendering comp must be PainterAware", provider.getRendererComponent(null) instanceof PainterAware); } /** * Issue #863-swingx: SwingX renderering components must be PainterAware. * Here: test WrappingIconPanel */ @Test public void testWrappingIconPanelPainterAware() { DefaultTreeRenderer renderer = new DefaultTreeRenderer(); JComponent rendererComponent = renderer.getComponentProvider().getRendererComponent(null); assertTrue("wrappingIconPanel as rendering comp must be PainterAware", rendererComponent instanceof PainterAware); } /** * Issue #840-swingx: hyperlink foreground unreadable for dark selection colors. * * Test that selected foreground is same as table. * */ @Test public void testHyperlinkProviderForeground() { JXTable table = new JXTable(20, 2); HyperlinkProvider provider = new HyperlinkProvider(); JXHyperlink hyperlink = provider.getRendererComponent(null); Color unclicked = hyperlink.getUnclickedColor(); table.setDefaultRenderer(Object.class, new DefaultTableRenderer(provider)); table.prepareRenderer(table.getCellRenderer(0, 0), 0, 0); assertEquals("hyperlink foreground set to unclicked", unclicked, hyperlink.getForeground()); table.setRowSelectionInterval(0, 0); // JW: had been failing before because I forgot to re-prepare :-) table.prepareRenderer(table.getCellRenderer(0, 0), 0, 0); assertEquals("hyperlink foreground set to table's selection foreground", table.getSelectionForeground(), hyperlink.getForeground()); } /** * Issue #842-swingx: HyperlinkProvider getString doesn't serve its contract. * */ @Test public void testHyperlinkStringValue() { AbstractHyperlinkAction<?> linkAction = new AbstractHyperlinkAction<Object>() { public void actionPerformed(ActionEvent e) { // nothing } @Override protected void installTarget() { setName("pref" + String.valueOf(target)); } }; HyperlinkProvider provider = new HyperlinkProvider(linkAction, Object.class); Object target = null; assertEquals("pref" + String.valueOf(target), provider.getString(target)); } /** * Issue ?? swingx: support to configure the auto-unwrap of tree/table/xx/nodes. * * Initial default is true. */ @Test public void testWrappingProviderUnwrapContructor() { LabelProvider delegate = new LabelProvider(); WrappingProvider provider = new WrappingProvider(delegate, false); assertWrappingProviderState(provider, null, null, delegate, false); } /** * Issue ?? swingx: support to configure the auto-unwrap of tree/table/xx/nodes. * * Initial default is true. */ @Test public void testWrappingProviderUserObjectUnwrapInitial() { WrappingProvider provider = new WrappingProvider(); assertEquals(true, provider.getUnwrapUserObject()); } /** * Issue ?? swingx: support to configure the auto-unwrap of tree/table/xx/nodes. * setter sets */ @Test public void testWrappingProviderUserObjectUnwrapSet() { WrappingProvider provider = new WrappingProvider(); boolean unwrap = !provider.getUnwrapUserObject(); provider.setUnwrapUserObject(unwrap); assertEquals(unwrap, provider.getUnwrapUserObject()); } /** * Issue ?? swingx: support to configure the auto-unwrap of tree/table/xx/nodes. * Respect unwrap flag in getString. */ @Test public void testWrappingProviderUserObjectUnwrapRespectString() { StringValue sv = new StringValue() { public String getString(Object value) { if (value instanceof Point) { return "x of Point: " + ((Point) value).x; } return StringValues.TO_STRING.getString(value); } }; CellContext context = new TableCellContext(); Point p = new Point(10, 20); context.replaceValue(new DefaultMutableTreeNode(p)); WrappingProvider provider = new WrappingProvider(sv); provider.setUnwrapUserObject(false); assertEquals("must not unwrap the user object", sv.getString(context.getValue()), provider.getString(context.getValue())); } /** * Issue ?? swingx: support to configure the auto-unwrap of tree/table/xx/nodes. * Respect unwrap flag in configuring a renderer. */ @Test public void testWrappingProviderUserObjectUnwrapRespectRenderer() { StringValue sv = new StringValue() { public String getString(Object value) { if (value instanceof Point) { return "x of Point: " + ((Point) value).x; } return StringValues.TO_STRING.getString(value); } }; CellContext context = new TableCellContext(); Point p = new Point(10, 20); context.replaceValue(new DefaultMutableTreeNode(p)); WrappingProvider provider = new WrappingProvider(sv); provider.setUnwrapUserObject(false); LabelProvider wrappee = (LabelProvider) provider.getWrappee(); // configure provider.getRendererComponent(context); assertEquals("must not unwrap the user object", sv.getString(context.getValue()), wrappee.rendererComponent.getText()); } /** * Issue #790-swingx: rendering comps must not be registered with the tooltip manager. * * Here: TreeTableCellRenderer (the tree used for rendering the hierarchical * column) * */ @Test public void testToolTipManagerTreeTableTreeRenderer() { JXTreeTable treeTable = new JXTreeTable(new ComponentTreeTableModel(new JXPanel())); // core row conversion is lenient than ol' swingx // PENDING JW: raise an issue about JXTreeTable not being sortable // (remove the default auto-createRowSorter) treeTable.setRootVisible(true); JComponent label = (JComponent) treeTable.prepareRenderer(treeTable.getCellRenderer(0, 0), 0, 0); String tip = "some tip"; PropertyChangeReport report = new PropertyChangeReport(); label.addPropertyChangeListener(report); label.setToolTipText(tip); TestUtils.assertPropertyChangeEvent(report, JComponent.TOOL_TIP_TEXT_KEY, null, tip); assertToolTipManagerNotRegistered(label); } /** * Issue #790-swingx: rendering comps must not be registered with the * tooltip manager. * * Here: Hyperlink in provider */ @Test public void testToolTipManagerHyperlinkProvider() { AbstractHyperlinkAction<?> linkAction = new AbstractHyperlinkAction<Object>() { public void actionPerformed(ActionEvent e) { // do nothing } @Override protected void installTarget() { super.installTarget(); setShortDescription(getName()); } }; HyperlinkProvider provider = new HyperlinkProvider(linkAction, Object.class); CellContext context = new TableCellContext(); context.replaceValue("dummy"); JXHyperlink label = provider.getRendererComponent(context); assertEquals("sanity - tooltip is set to value", "dummy", label .getToolTipText()); assertToolTipManagerNotRegistered(label); } /** * Issue #790-swingx: rendering comps must not be registered with the tooltip manager. * * Here: JRendererCheckBox- */ @Test public void testToolTipManagerRendererCheckBox() { JRendererCheckBox label = new JRendererCheckBox(); assertNull("sanity - no tooltip", label.getToolTipText()); String tip = "some tip"; PropertyChangeReport report = new PropertyChangeReport(); label.addPropertyChangeListener(report); label.setToolTipText(tip); // JRendererCheckBox is optimized to not fire any property changes assertEquals(0, report.getEventCount()); // nevertheless, we want the tip set ;-) assertEquals(tip, label.getToolTipText()); assertToolTipManagerNotRegistered(label); } /** * Issue #790-swingx: rendering comps must not be registered with the tooltip manager. * * Here: JRendererLabel. * */ @Test public void testToolTipManagerRendererLabel() { JRendererLabel label = new JRendererLabel(); assertNull("sanity - no tooltip", label.getToolTipText()); String tip = "some tip"; PropertyChangeReport report = new PropertyChangeReport(); label.addPropertyChangeListener(report); label.setToolTipText(tip); // JRendererLabel is optimized to not fire any property changes assertEquals(0, report.getEventCount()); // nevertheless, we want the tip set ;-) assertEquals(tip, label.getToolTipText()); assertToolTipManagerNotRegistered(label); } /** * Issue #790-swingx: rendering comps must not be registered with the tooltip manager. * * Sanity: cross-check the "normal" effect of setToolTipText which is that the * ToolTipManager registers itself as mouseListener with the component. * */ @Test public void testToolTipManagerJLabel() { JLabel label = new JLabel(); assertNull("sanity - no tooltip", label.getToolTipText()); String tip = "some tip"; PropertyChangeReport report = new PropertyChangeReport(); label.addPropertyChangeListener(report); label.setToolTipText(tip); TestUtils.assertPropertyChangeEvent(report, JComponent.TOOL_TIP_TEXT_KEY, null, tip); assertToolTipManagerRegistered(label); } /** * Asserts that the component is not registered with the ToolTipManager. * There's no direct api to check, so we loop through the mouseListeners and * assert that none of them is a ToolTipManager. <p> * * This is inherently unsafe, as we rely on the implementation detail that * the manager registers itself as listener (instead of delegating). That's why * we cross-check a "normal" component's behaviour - if that fails one day, the * implementation detail changed. * * @param label the component to assert. */ private void assertToolTipManagerNotRegistered(JComponent label) { MouseListener[] listeners = label.getMouseListeners(); for (MouseListener l : listeners) { assertEquals("registered with tooltipManager", false, l instanceof ToolTipManager); } } /** * Asserts that the component is registered with the ToolTipManager. * There's no direct api to check, so we loop through the mouseListeners and * assert that none of them is a ToolTipManager. <p> * * This is inherently unsafe, as we rely on the implementation detail that * the manager registers itself as listener (instead of delegating). That's why * we cross-check a "normal" component's behaviour - if that fails one day, the * implementation detail changed. * * @param label the component to assert. */ private void assertToolTipManagerRegistered(JComponent label) { MouseListener[] listeners = label.getMouseListeners(); int managerCount = 0; for (MouseListener l : listeners) { if (l instanceof ToolTipManager) { managerCount++; } } assertEquals("registered with tooltipManager", 1, managerCount); } /** * Issue #768-swingx: cleanup access to string representation of provider. * */ @Test public void testLabelProviderGetString() { StringValue sv = new StringValue() { public String getString(Object value) { return "funnyconstant ... haha"; } }; CellContext context = new TableCellContext(); ComponentProvider<JLabel> provider = new LabelProvider(sv); JLabel label = provider.getRendererComponent(context); assertEquals(sv.getString(context.getValue()), label.getText()); assertEquals(sv.getString(context.getValue()), provider.getString(context.getValue())); } /** * Issue #768-swingx: cleanup access to string representation of provider. * */ @Test public void testButtonProviderGetString() { StringValue sv = new StringValue() { public String getString(Object value) { return "funnyconstant ... haha"; } }; CellContext context = new TableCellContext(); ComponentProvider<AbstractButton> provider = new CheckBoxProvider(sv); AbstractButton label = provider.getRendererComponent(context); assertEquals(sv.getString(context.getValue()), label.getText()); assertEquals(sv.getString(context.getValue()), provider.getString(context.getValue())); } /** * Issue #768-swingx: cleanup access to string representation of provider. * */ @Test public void testWrappingProviderGetString() { StringValue sv = new StringValue() { public String getString(Object value) { return "funnyconstant ... haha"; } }; CellContext context = new TableCellContext(); ComponentProvider<WrappingIconPanel> provider = new WrappingProvider(sv); assertEquals(sv.getString(context.getValue()), provider.getString(context.getValue())); } /** * Issue #768-swingx: cleanup access to string representation of provider. * * WrappingProvider must do the same "unwrapping" magic in getString as in * getRendereringComponent. */ @Test public void testWrappingProviderGetStringFromNode() { StringValue sv = new StringValue() { public String getString(Object value) { if (value instanceof Point) { return "x of Point: " + ((Point) value).x; } return StringValues.TO_STRING.getString(value); } }; CellContext context = new TableCellContext(); Point p = new Point(10, 20); context.value = new DefaultMutableTreeNode(p); WrappingProvider provider = new WrappingProvider(sv); assertEquals(sv.getString(p), provider.getString(context.getValue())); } /** * Issue #768-swingx: cleanup access to string representation of provider. * */ @Test public void testWrappingProviderGetStringNotNullValue() { StringValue sv = new StringValue() { public String getString(Object value) { return String.valueOf(value) + "added ... "; } }; CellContext context = new TableCellContext(); context.value = "dummy"; ComponentProvider<WrappingIconPanel> provider = new WrappingProvider(sv); assertEquals(sv.getString(context.getValue()), provider.getString(context.getValue())); } /** * Issue #769-swingx: support null icons. * * enhance WrappingProvider to allow real null values. * */ @Test public void testWrappingProviderNullIcon() { CellContext context = new TreeCellContext(); WrappingProvider provider = new WrappingProvider(IconValues.NONE); WrappingIconPanel comp = provider.getRendererComponent(context); assertEquals(null, comp.getIcon()); } /** * Added pref/min/max size to list of properties which * must be reset by the DefaultVisuals. */ @Test public void testResetPreferredSize() { DefaultVisuals<JComponent> visuals = new DefaultVisuals<JComponent>(); JComponent label = new JLabel("somevalue"); visuals.configureVisuals(label, new TableCellContext()); Dimension prefSize = label.getPreferredSize(); Dimension newPrefSize = new Dimension(prefSize.width + 100, prefSize.height + 100); label.setPreferredSize(newPrefSize); visuals.configureVisuals(label, new TableCellContext()); assertEquals("default visual config must reset prefSize", prefSize, label.getPreferredSize()); } /** * Test provider respect converter. * * Here: must show the * description instead of setting the icon. * * PENDING JW: revisit .. Icon.EMPTY vs. Icon.NONE: what exactly is the expected * behaviour? */ @Test public void testLabelProviderRespectStringValueNoIcon() { ImageIcon icon = (ImageIcon) XTestUtils.loadDefaultIcon(); icon.setDescription("description"); LabelProvider provider = new LabelProvider( new MappedValue(StringValues.TO_STRING, IconValues.NONE)); TableCellContext context = new TableCellContext(); context.value = icon; JLabel label = provider.getRendererComponent(context); Icon i = label.getIcon(); assertTrue("icon must be empty", i instanceof EmptyIcon); assertEquals("icon must have no width", 0, i.getIconWidth()); assertEquals("icon must have no height", 0, i.getIconHeight()); assertEquals("label text must be default to-string", StringValues.TO_STRING.getString(icon), label.getText()); } /** * Test provider respect converter. * * Here: must show the icon and empty text. * */ @Test public void testLabelProviderRespectIconValueNoString() { ImageIcon icon = (ImageIcon) XTestUtils.loadDefaultIcon(); icon.setDescription("description"); LabelProvider provider = new LabelProvider( new MappedValue(StringValues.EMPTY, IconValues.ICON)); TableCellContext context = new TableCellContext(); context.value = icon; JLabel label = provider.getRendererComponent(context); assertEquals(icon, label.getIcon()); assertEquals("label text must be empty", StringValues.EMPTY.getString(icon), label.getText()); } /** * Test provider respect converter. * * Here: must show both description and icon. * */ @Test public void testLabelProviderRespectStringIconValueBoth() { ImageIcon icon = (ImageIcon) XTestUtils.loadDefaultIcon(); icon.setDescription("description"); LabelProvider provider = new LabelProvider( new MappedValue(StringValues.TO_STRING, IconValues.ICON)); TableCellContext context = new TableCellContext(); context.value = icon; JLabel label = provider.getRendererComponent(context); assertEquals(icon, label.getIcon()); assertEquals(StringValues.TO_STRING.getString(icon), label.getText()); } /** * WrappingProvider: test custom icon */ @Test public void testWrappingProviderIcon() { final Icon icon = XTestUtils.loadDefaultIcon(); IconValue iv = new IconValue() { public Icon getIcon(Object value) { return icon; }}; WrappingProvider provider = new WrappingProvider(iv); CellContext context = new TreeCellContext(); WrappingIconPanel iconPanel = provider.getRendererComponent(context); assertEquals(icon, iconPanel.getIcon()); // NOTE: do not test type of wrapper's stringValue - it's a mappedValue if icon present! assertEquals("", provider.getStringValue().getString(icon)); } /** * WrappingProvider: test custom icon */ @Test public void testWrappingProviderIconAndContent() { final Icon icon = XTestUtils.loadDefaultIcon(); IconValue iv = new IconValue() { public Icon getIcon(Object value) { return icon; }}; WrappingProvider provider = new WrappingProvider(iv, StringValues.DATE_TO_STRING); CellContext context = new TreeCellContext(); WrappingIconPanel iconPanel = provider.getRendererComponent(context); assertEquals(icon, iconPanel.getIcon()); // NOTE: do not test type of wrapper's stringValue - it's a mappedValue if icon present! assertEquals("", provider.getStringValue().getString(icon)); } /** * WrappingProvider: * test wrappee and its state after instantiation. */ @Test public void testWrappingProviderWrappeeConstructors() { IconValue iv = IconValues.FILE_ICON; LabelProvider delegate = new LabelProvider(StringValues.DATE_TO_STRING); assertWrappingProviderState(new WrappingProvider(delegate), null, null, delegate, true); assertWrappingProviderState(new WrappingProvider(delegate, false), null, null, delegate, false); assertWrappingProviderState(new WrappingProvider(iv, delegate, false), iv, null, delegate, false); assertWrappingProviderState(new WrappingProvider(iv, (ComponentProvider<?>) null, false), iv, null, null, false); assertWrappingProviderState(new WrappingProvider(null, (ComponentProvider<?>) null, false), null, null, null, false); } /** * WrappingProvider: * test wrappee and its state after instantiation. */ @Test public void testWrappingProviderWrappeeStringValueConstructors() { IconValue iv = IconValues.FILE_ICON; StringValue sv = StringValues.DATE_TO_STRING; assertWrappingProviderState(new WrappingProvider(iv), iv, null, null, true); assertWrappingProviderState(new WrappingProvider(iv, sv), iv, sv, null, true); assertWrappingProviderState(new WrappingProvider(sv), null, sv, null, true); assertWrappingProviderState(new WrappingProvider(null, sv), null, sv, null, true); assertWrappingProviderState(new WrappingProvider(iv, null), iv, null, null, true); assertWrappingProviderState(new WrappingProvider(null, null), null, null, null, true); // assertWrappingProviderState(new WrappingProvider(false, iv), // iv, null, null, false); } /** * WrappingProvider: * test provider's state after instantiation with empty constructor. */ @Test public void testWrappingProviderEmptyConstructor() { assertWrappingProviderState(new WrappingProvider(), null, null, null, true); // assertWrappingProviderState(new WrappingProvider(false), // null, null, null, false); } private void assertWrappingProviderState(WrappingProvider provider, IconValue iv, StringValue sv, ComponentProvider<?> delegate, boolean unwrap) { if (iv == null) { assertEquals("default StringValue must be empty", StringValues.EMPTY, provider.getStringValue()); } else { assertTrue("provider's StringValue must be a MappedValue containing the IconValue, but" + "was " + provider.getStringValue().getClass(), provider.getStringValue() instanceof MappedValue); // can't access MappedValue's delegates - usually don't need to // assertEquals(iv, ((MappedValue) provider.getStringValue()).iconDelegate); } if (delegate == null) { assertTrue("default wrappee must be LabelProvider but was " + provider.getWrappee().getClass(), provider.getWrappee() instanceof LabelProvider); } else { assertEquals("wrappee must be set", delegate, provider.getWrappee()); } if (sv != null) { assertEquals("wrappee's StringValue must be configured to given", sv, provider.getWrappee().getStringValue()); } assertEquals(unwrap, provider.getUnwrapUserObject()); } /** * Test text and boolean taken from MappedValue */ @Test public void testButtonProviderCustomValue() { // some object to map String identifier = "dummyID"; final TableColumnExt column = new TableColumnExt(); column.setTitle(identifier); BooleanValue bv = new BooleanValue(){ public boolean getBoolean(Object value) { return column.isVisible(); } }; StringValue sv = new StringValue() { public String getString(Object value) { return column.getTitle(); } }; CheckBoxProvider provider = new CheckBoxProvider(new MappedValue(sv, null, bv)); TableCellContext context = new TableCellContext(); context.value = column; AbstractButton button = provider.getRendererComponent(context); assertEquals(column.isVisible(), button.isSelected()); assertEquals(column.getTitle(), button.getText()); } /** * safety net for addition of BooleanValue. Defaults to * selected from boolean value, text empty. * * here: constructor with null stringValue and align * */ @Test public void testButtonProviderDefaultsTwoConstructor() { CheckBoxProvider provider = new CheckBoxProvider(null, JLabel.RIGHT); TableCellContext context = new TableCellContext(); AbstractButton button = provider.getRendererComponent(context); // empty context assertFalse(button.isSelected()); assertEquals("", button.getText()); // boolean true context.value = true; provider.getRendererComponent(context); assertEquals(context.value, button.isSelected()); assertEquals("", button.getText()); // non-boolean context.value = "dummy"; provider.getRendererComponent(context); assertFalse(button.isSelected()); assertEquals("", button.getText()); } /** * safety net for addition of BooleanValue. Defaults to * selected from boolean value, text empty. * * here: constructor with null stringValue * */ @Test public void testButtonProviderDefaultsOneConstructor() { CheckBoxProvider provider = new CheckBoxProvider(null); TableCellContext context = new TableCellContext(); AbstractButton button = provider.getRendererComponent(context); // empty context assertFalse(button.isSelected()); assertEquals("", button.getText()); // boolean true context.value = true; provider.getRendererComponent(context); assertEquals(context.value, button.isSelected()); assertEquals("", button.getText()); // non-boolean context.value = "dummy"; provider.getRendererComponent(context); assertFalse(button.isSelected()); assertEquals("", button.getText()); } /** * safety net for addition of BooleanValue. Defaults to * selected from boolean value, text empty. * * here: parameterless constructor * */ @Test public void testButtonProviderDefaultsEmptyConstructor() { CheckBoxProvider provider = new CheckBoxProvider(); TableCellContext context = new TableCellContext(); AbstractButton button = provider.getRendererComponent(context); // empty context assertFalse(button.isSelected()); assertEquals("", button.getText()); // boolean true context.value = true; provider.getRendererComponent(context); assertEquals(context.value, button.isSelected()); assertEquals("", button.getText()); // non-boolean context.value = "dummy"; provider.getRendererComponent(context); assertFalse(button.isSelected()); assertEquals("", button.getText()); } /** * test ButtonProvider default constructor and properties. * */ @Test public void testButtonProviderConstructor() { ComponentProvider<?> provider = new CheckBoxProvider(); assertEquals(JLabel.CENTER, provider.getHorizontalAlignment()); assertEquals(StringValues.EMPTY, provider.getStringValue()); } /** * Test provider property reset: borderPainted. * */ @Test public void testButtonProviderBorderPainted() { CheckBoxProvider provider = new CheckBoxProvider(); TableCellContext context = new TableCellContext(); AbstractButton button = provider.getRendererComponent(context); assertEquals(provider.isBorderPainted(), button.isBorderPainted()); button.setBorderPainted(!provider.isBorderPainted()); provider.getRendererComponent(context); assertEquals(provider.isBorderPainted(), button.isBorderPainted()); } /** * Test provider property reset: horizontal. * */ @Test public void testButtonProviderHorizontalAlignment() { CheckBoxProvider provider = new CheckBoxProvider(); CellContext context = new TableCellContext(); AbstractButton button = provider.getRendererComponent(context); assertEquals(provider.getHorizontalAlignment(), button.getHorizontalAlignment()); button.setHorizontalAlignment(JLabel.TRAILING); provider.getRendererComponent(context); assertEquals(provider.getHorizontalAlignment(), button.getHorizontalAlignment()); } /** * use convenience constructor where appropriate: * test clients code (default renderers in JXTable). * * */ @Test public void testConstructorClients() { JXTable table = new JXTable(); // Number DefaultTableRenderer numberRenderer = (DefaultTableRenderer) table.getDefaultRenderer(Number.class); JLabel label = (JLabel) numberRenderer.getTableCellRendererComponent(table, null, false, false, 0, 0); assertEquals(JLabel.RIGHT, label.getHorizontalAlignment()); assertEquals(StringValues.NUMBER_TO_STRING, numberRenderer.componentController.getStringValue()); // icon DefaultTableRenderer iconRenderer = (DefaultTableRenderer) table.getDefaultRenderer(Icon.class); JLabel iconLabel = (JLabel) iconRenderer.getTableCellRendererComponent(table, null, false, false, 0, 0); assertEquals(JLabel.CENTER, iconLabel.getHorizontalAlignment()); // JW: wrong assumption after starting to fix #590-swingx // LabelProvider should respect formatter // assertEquals(StringValue.TO_STRING, iconRenderer.componentController.getToStringConverter()); } /** * Test constructors: convenience constructor. */ @Test public void testConstructorConvenience() { FormatStringValue sv = new FormatStringValue(DateFormat.getTimeInstance()); int align = JLabel.RIGHT; LabelProvider provider = new LabelProvider(sv, align); assertEquals(align, provider.getHorizontalAlignment()); assertEquals(sv, provider.getStringValue()); } /** * Test constructors: parameterless. */ @Test public void testConstructorDefault() { LabelProvider provider = new LabelProvider(); assertEquals(JLabel.LEADING, provider.getHorizontalAlignment()); assertEquals(StringValues.TO_STRING, provider.getStringValue()); } /** * Test constructors: convenience constructor. */ @Test public void testConstructorAlignment() { int align = JLabel.RIGHT; LabelProvider provider = new LabelProvider(align); assertEquals(align, provider.getHorizontalAlignment()); assertEquals(StringValues.TO_STRING, provider.getStringValue()); } /** * Test constructors: convenience constructor. */ @Test public void testConstructorStringValue() { FormatStringValue sv = new FormatStringValue(DateFormat.getTimeInstance()); LabelProvider provider = new LabelProvider(sv); assertEquals(JLabel.LEADING, provider.getHorizontalAlignment()); assertEquals(sv, provider.getStringValue()); } /** * test that default visual config clears the tooltip. * */ @Test public void testResetTooltip() { DefaultVisuals<JComponent> visuals = new DefaultVisuals<JComponent>(); JComponent label = new JLabel("somevalue"); label.setToolTipText("tooltip"); visuals.configureVisuals(label, new TableCellContext()); assertNull("default visual config must clear tooltiptext", label.getToolTipText()); } /** * Test if all collaborators can cope with null component on CellContext. * */ @Test public void testEmptyContext() { // test LabelProvider // same for list and table assertEmptyContext(new LabelProvider()); assertEmptyContext(new CheckBoxProvider()); assertEmptyContext(new HyperlinkProvider()); } private void assertEmptyContext(ComponentProvider<?> provider) { DefaultListRenderer renderer = new DefaultListRenderer(provider); renderer.getListCellRendererComponent(null, null, -1, false, false); // treeRenderer - use the same provider, can't do in real life, // the providers component is added to the wrapping provider's component. DefaultTreeRenderer treeRenderer = new DefaultTreeRenderer(provider); treeRenderer.getTreeCellRendererComponent(null, null, false, false, false, -1, false); // had an NPE in TreeCellContext focus border treeRenderer.getTreeCellRendererComponent(null, null, false, false, false, -1, true); // random test - the input parameters don't map to a legal state treeRenderer.getTreeCellRendererComponent(null, new Object(), false, true, false, 2, true); } /** * Test doc'ed constructor behaviour of default tree renderer. * */ @Test public void testDefaultTreeRendererConstructors() { DefaultTreeRenderer renderer = new DefaultTreeRenderer(); assertTrue(renderer.componentController instanceof WrappingProvider); renderer = new DefaultTreeRenderer(StringValues.DATE_TO_STRING); assertTrue(renderer.componentController instanceof WrappingProvider); // wrong assumption - we are wrapping... // assertSame(FormatStringValue.DATE_TO_STRING, renderer.componentController.formatter); assertSame(StringValues.DATE_TO_STRING, ((WrappingProvider) renderer.componentController).wrappee.formatter); ComponentProvider<?> controller = new CheckBoxProvider(); renderer = new DefaultTreeRenderer(controller); assertSame(controller, renderer.componentController); } /** * Test doc'ed constructor behaviour of default list renderer. * */ @Test public void testDefaultListRendererConstructors() { DefaultListRenderer renderer = new DefaultListRenderer(); assertTrue(renderer.componentController instanceof LabelProvider); renderer = new DefaultListRenderer(StringValues.DATE_TO_STRING); assertTrue(renderer.componentController instanceof LabelProvider); assertSame(StringValues.DATE_TO_STRING, renderer.componentController.formatter); ComponentProvider<?> controller = new CheckBoxProvider(); renderer = new DefaultListRenderer(controller); assertSame(controller, renderer.componentController); } /** * Issue 970-swingx: add convenience constructors with IconValues * Test doc'ed constructor behaviour of default list renderer. * */ @Test public void testDefaultListRendererConstructorWithIconValue() { DefaultListRenderer renderer = new DefaultListRenderer(StringValues.TO_STRING, IconValues.ICON); assertTrue(renderer.componentController instanceof LabelProvider); LabelProvider provider = (LabelProvider) renderer.componentController; ImageIcon icon = (ImageIcon) XTestUtils.loadDefaultIcon(); icon.setDescription("description"); TableCellContext context = new TableCellContext(); context.value = icon; JLabel label = provider.getRendererComponent(context); assertEquals(icon, label.getIcon()); assertEquals(StringValues.TO_STRING.getString(icon), label.getText()); } /** * Issue #970-swingx: add convenience constructors with IconValues * Test doc'ed constructor behaviour of default list renderer. * */ @Test public void testDefaultListRendererConstructorWithIconValueAndAlign() { DefaultListRenderer renderer = new DefaultListRenderer(StringValues.TO_STRING, IconValues.ICON, JLabel.TRAILING); assertTrue(renderer.componentController instanceof LabelProvider); LabelProvider provider = (LabelProvider) renderer.componentController; ImageIcon icon = (ImageIcon) XTestUtils.loadDefaultIcon(); icon.setDescription("description"); TableCellContext context = new TableCellContext(); context.value = icon; JLabel label = provider.getRendererComponent(context); assertEquals(icon, label.getIcon()); assertEquals(StringValues.TO_STRING.getString(icon), label.getText()); assertEquals(JLabel.TRAILING, label.getHorizontalAlignment()); } /** * Test doc'ed constructor behaviour of default table renderer. * */ @Test public void testDefaultTableRendererConstructors() { DefaultTableRenderer renderer = new DefaultTableRenderer(); assertTrue(renderer.componentController instanceof LabelProvider); renderer = new DefaultTableRenderer(StringValues.DATE_TO_STRING); assertTrue(renderer.componentController instanceof LabelProvider); assertSame(StringValues.DATE_TO_STRING, renderer.componentController.formatter); ComponentProvider<?> controller = new CheckBoxProvider(); renderer = new DefaultTableRenderer(controller); assertSame(controller, renderer.componentController); } /** * Issue #970-swingx: text constructors with IconValues * Test doc'ed constructor behaviour of default table renderer. * */ @Test public void testDefaultTableRendererConstructorWithIconValue() { DefaultTableRenderer renderer = new DefaultTableRenderer(StringValues.TO_STRING, IconValues.ICON); assertTrue(renderer.componentController instanceof LabelProvider); LabelProvider provider = (LabelProvider) renderer.componentController; ImageIcon icon = (ImageIcon) XTestUtils.loadDefaultIcon(); icon.setDescription("description"); TableCellContext context = new TableCellContext(); context.value = icon; JLabel label = provider.getRendererComponent(context); assertEquals(icon, label.getIcon()); assertEquals(StringValues.TO_STRING.getString(icon), label.getText()); } /** * Issue #970-swingx: text constructors with IconValues * Test doc'ed constructor behaviour of default table renderer. * */ @Test public void testDefaultTableRendererConstructorWithIconValueAndAlign() { DefaultTableRenderer renderer = new DefaultTableRenderer(StringValues.TO_STRING, IconValues.ICON, JLabel.TRAILING); assertTrue(renderer.componentController instanceof LabelProvider); LabelProvider provider = (LabelProvider) renderer.componentController; ImageIcon icon = (ImageIcon) XTestUtils.loadDefaultIcon(); icon.setDescription("description"); TableCellContext context = new TableCellContext(); context.value = icon; JLabel label = provider.getRendererComponent(context); assertEquals(icon, label.getIcon()); assertEquals(StringValues.TO_STRING.getString(icon), label.getText()); assertEquals(JLabel.TRAILING, label.getHorizontalAlignment()); } /** * public methods of <code>ComponentProvider</code> must cope * with null context. Here: test getRenderingComponent in WrappingProvider. * */ @Test public void testGetWrappingComponentNullContext() { WrappingProvider provider = new WrappingProvider(); assertEquals(provider.rendererComponent, provider.getRendererComponent(null)); } /** * public methods of <code>ComponentProvider</code> must cope * with null context. Here: test getRenderingComponent in LabelProvider. */ @Test public void testGetComponentNullContext() { ComponentProvider<?> controller = new LabelProvider(); assertEquals(controller.rendererComponent, controller.getRendererComponent(null)); } /** * test doc'ed behaviour on defaultVisuals configure: * NPE on null context. * */ @Test public void testConfigureVisualsNullContext() { DefaultVisuals<JLabel> controller = new DefaultVisuals<JLabel>(); try { controller.configureVisuals(new JLabel(), null); fail("renderer controller must throw NPE on null context"); } catch (NullPointerException e) { // this is what we expect } catch (Exception e) { fail("renderer controller must throw NPE on null context - instead: " + e); } } /** * test doc'ed behaviour on defaultVisuals configure: * NPE on null component. * */ @Test public void testConfigureVisualsNullComponent() { DefaultVisuals<JLabel> controller = new DefaultVisuals<JLabel>(); try { controller.configureVisuals(null, new TableCellContext()); fail("renderer controller must throw NPE on null component"); } catch (NullPointerException e) { // this is what we expect } catch (Exception e) { fail("renderer controller must throw NPE on null component - instead: " + e); } } /** * RendererLabel NPE with null Graphics. * Fail-fast NPE in label.paintComponentWithPainter. * */ @Test public void testLabelNPEPaintComponentOpaqueWithPainter() { JRendererLabel label = new JRendererLabel(); label.setOpaque(true); label.setPainter(new ShapePainter()); try { label.paintComponent(null); fail("invoke paintComponent with null graphics must throw NPE"); } catch (NullPointerException e) { // basically the right thing - but how to test the fail-fast? } catch (Exception e) { fail("unexpected exception invoke paintcomponent with null" + e); } } /** * RendererLabel NPE with null Graphics. * Fail-fast NPE in paintPainter. * */ @Test public void testLabelNPEPaintComponentWithPainter() { JRendererLabel label = new JRendererLabel(); label.setOpaque(false); label.setPainter(new ShapePainter()); try { label.paintComponent(null); fail("invoke paintComponent with null graphics must throw NPE"); } catch (NullPointerException e) { // basically the right thing - but how to test the fail-fast? } catch (Exception e) { fail("unexpected exception invoke paintcomponent with null" + e); } } /** * RendererLabel NPE with null Graphics. * NPE in label.paintComponentWithPainter finally block. * */ @Test public void testButtonNPEPaintComponentOpaqueWithPainter() { JRendererCheckBox checkBox = new JRendererCheckBox(); checkBox.setOpaque(true); checkBox.setPainter(new ShapePainter()); try { checkBox.paintComponent(null); fail("invoke paintComponent with null graphics must throw NPE"); } catch (NullPointerException e) { // basically the right thing - but how to test the fail-fast? } catch (Exception e) { fail("unexpected exception invoke paintcomponent with null" + e); } } /** * RendererCheckBox NPE with null Graphics. NPE in * label.paintComponentWithPainter finally block. * */ @Test public void testButtonNPEPaintComponentWithPainter() { JRendererCheckBox checkBox = new JRendererCheckBox(); checkBox.setOpaque(false); checkBox.setPainter(new ShapePainter()); try { checkBox.paintComponent(null); fail("invoke paintComponent with null graphics must throw NPE"); } catch (NullPointerException e) { // basically the right thing - but how to test the fail-fast? } catch (Exception e) { fail("unexpected exception invoke paintcomponent with null" + e); } } }