/*
* $Id$
*
* Copyright 2004 Sun Microsystems, Inc., 4150 Network Circle,
* Santa Clara, California 95054, U.S.A. All rights reserved.
*/
package org.jdesktop.swingx.renderer;
import java.awt.Point;
import java.net.URL;
import java.util.logging.Logger;
import javax.swing.SwingUtilities;
import javax.swing.UIManager;
import javax.swing.table.TableCellRenderer;
import org.jdesktop.swingx.InteractiveTestCase;
import org.jdesktop.swingx.JXFrame;
import org.jdesktop.swingx.JXHyperlink;
import org.jdesktop.swingx.JXTable;
import org.jdesktop.swingx.hyperlink.EditorPaneLinkVisitor;
import org.jdesktop.swingx.hyperlink.LinkModel;
import org.jdesktop.swingx.hyperlink.LinkModelAction;
import org.jdesktop.swingx.rollover.RolloverProducer;
import org.jdesktop.test.AncientSwingTeam;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.JUnit4;
/**
* Test around hyperlink rendering.
*
* PENDING JW: how does this relate to JXHyperlinkTest? Merge?
* Move to renderer package?
*
* @author Jeanette Winzenburg
*/
@RunWith(JUnit4.class)
public class HyperlinkProviderTest extends InteractiveTestCase {
private static final Logger LOG = Logger.getLogger(HyperlinkProviderTest.class
.getName());
private LinkModel link;
// flag used in setup to explicitly choose LF
private boolean defaultToSystemLF;
/**
* renderers must cope with type mismatch.
*
*/
@Test
public void testMixedValueTypes() {
LinkModelAction<?> action = new LinkModelAction<LinkModel>(new EditorPaneLinkVisitor());
TableCellRenderer linkRenderer = new DefaultTableRenderer(
new HyperlinkProvider(action, LinkModel.class));
linkRenderer.getTableCellRendererComponent(null, "stringonly", false, false, -1, -1);
}
/**
* sanity: can cope with subclasses.
* a side-effect: renderers should cope with null table.
*/
@Test
public void testSubclassedValueTypes() {
LinkModelAction<?> action = new LinkModelAction<LinkModel>(new EditorPaneLinkVisitor());
TableCellRenderer renderer = new DefaultTableRenderer(
new HyperlinkProvider(action, LinkModel.class));
LinkModel link = new LinkModel() {
};
renderer.getTableCellRendererComponent(null, link, false, false, -1, -1);
}
/**
* Issue #183-swingx. test if the selection background is updated on
* changing LF.
*
*/
@Test
public void testSelectionBackground() {
JXTable table = new JXTable(2, 2);
TableCellRenderer linkRenderer = new DefaultTableRenderer(new HyperlinkProvider());
table.getColumnModel().getColumn(0).setCellRenderer(linkRenderer);
JXHyperlink hyperlink = (JXHyperlink) linkRenderer
.getTableCellRendererComponent(table, link, true, false, 1, 0);
// JW: asking any background without knowing transparency state is
// useless!
assertTrue("renderer comp must be opaque", hyperlink.isOpaque());
assertEquals("background must be table selection background", table
.getSelectionBackground(), hyperlink.getBackground());
hyperlink = (JXHyperlink) linkRenderer.getTableCellRendererComponent(
table, link, false, false, 1, 0);
assertEquals("background must be table background", table
.getBackground(), hyperlink.getBackground());
}
/**
* Issue #183-swingx. test if the selection background is updated on
* changing LF.
*
*/
@Test
public void testRendererComponentPropertiesAfterLFChange() {
JXTable table = new JXTable(2, 2);
TableCellRenderer linkRenderer = new DefaultTableRenderer(new HyperlinkProvider());
table.getColumnModel().getColumn(0).setCellRenderer(linkRenderer);
// sanity: same as set
assertSame(linkRenderer, table.getCellRenderer(1, 0));
JXHyperlink hyperlink = (JXHyperlink) table.prepareRenderer(
linkRenderer, 1, 0);
// KEEP to remember
// - JW: asking for the background really doesn't make sense -
// will not show if comp isn't opaque!
// assertEquals("background must be table selection background",
// selectionBackground, hyperlink.getBackground());
// need to check the properties which are set differently in
// LinkRenderer
assertTrue("renderer comp must be opaque", hyperlink.isOpaque());
assertTrue("renderer must paint border", hyperlink.isBorderPainted());
String lf = UIManager.getLookAndFeel().getName();
// switch LF
setSystemLF(!defaultToSystemLF);
if (lf.equals(UIManager.getLookAndFeel().getName())) {
LOG.info("cannot run rendererComponentPropertiesAfterLFChange - equal LF" + lf);
return;
}
SwingUtilities.updateComponentTreeUI(table);
// sanity: same as set
assertSame(linkRenderer, table.getCellRenderer(1, 0));
hyperlink = (JXHyperlink) table.prepareRenderer(linkRenderer, 1, 0);
// assert that the changed properties survived the LF switch
assertTrue("renderer comp must be opaque", hyperlink.isOpaque());
assertTrue("renderer must paint border", hyperlink.isBorderPainted());
}
@Test
public void testRolloverRecognition() {
JXTable table = new JXTable(2, 2);
TableCellRenderer linkRenderer = new DefaultTableRenderer(new HyperlinkProvider());
table.getColumnModel().getColumn(0).setCellRenderer(linkRenderer);
JXHyperlink hyperlink = (JXHyperlink) linkRenderer
.getTableCellRendererComponent(table, link, false, false, 1, 0);
assertFalse("renderer must not be rollover", hyperlink.getModel()
.isRollover());
table.putClientProperty(RolloverProducer.ROLLOVER_KEY, new Point(0, 1));
hyperlink = (JXHyperlink) linkRenderer.getTableCellRendererComponent(
table, link, false, false, 1, 0);
assertTrue("renderer must be rollover", hyperlink.getModel()
.isRollover());
}
/**
* Issue #183-swingx. visual check if the selection background is updated on
* changing LF.
*/
public void interactiveTableSelectionBackgroundOnLF() {
final JXTable table = new JXTable(new AncientSwingTeam());
TableCellRenderer linkRenderer = new DefaultTableRenderer(new HyperlinkProvider());
table.getColumnModel().getColumn(0).setCellRenderer(linkRenderer);
table.setRowSelectionInterval(1, 1);
final JXFrame frame = wrapWithScrollingInFrame(table, "test background must change with LAF");
frame.setVisible(true);
}
public static void main(String[] args) throws Exception {
// setSystemLF(true);
HyperlinkProviderTest test = new HyperlinkProviderTest();
try {
test.runInteractiveTests();
// test.runInteractiveTests("interactive.*Table.*");
} catch (Exception e) {
System.err.println("exception when executing interactive tests:");
e.printStackTrace();
}
}
@Override
protected void setUp() throws Exception {
super.setUp();
URL url = getClass().getResource("resources/test.html");
link = new LinkModel("a resource", null, url);
// make sure we have the same default for each test
defaultToSystemLF = false;
setSystemLF(defaultToSystemLF);
}
}