/*
* $Id$
*
* Copyright 2004 Sun Microsystems, Inc., 4150 Network Circle,
* Santa Clara, California 95054, U.S.A. All rights reserved.
*/
package org.jdesktop.swingx;
import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.net.MalformedURLException;
import java.net.URI;
import java.net.URISyntaxException;
import java.net.URL;
import java.util.logging.Logger;
import javax.swing.AbstractAction;
import javax.swing.Action;
import javax.swing.BorderFactory;
import javax.swing.Box;
import javax.swing.DefaultListModel;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.ListModel;
import javax.swing.SortOrder;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableModel;
import org.jdesktop.swingx.decorator.HighlighterFactory;
import org.jdesktop.swingx.hyperlink.AbstractHyperlinkAction;
import org.jdesktop.swingx.hyperlink.EditorPaneLinkVisitor;
import org.jdesktop.swingx.hyperlink.HyperlinkAction;
import org.jdesktop.swingx.hyperlink.LinkModel;
import org.jdesktop.swingx.hyperlink.LinkModelAction;
import org.jdesktop.swingx.renderer.DefaultListRenderer;
import org.jdesktop.swingx.renderer.DefaultTableRenderer;
import org.jdesktop.swingx.renderer.DefaultTreeRenderer;
import org.jdesktop.swingx.renderer.HyperlinkProvider;
import org.jdesktop.swingx.treetable.FileSystemModel;
/**
* Test of JXHyperlink visuals. Raw usage and as hyperlinkRenderer.
* <p>
*
* @author Jeanette Winzenburg
*/
public class JXHyperlinkVisualCheck extends InteractiveTestCase {
private static final Logger LOG = Logger.getLogger(JXHyperlinkVisualCheck.class
.getName());
public JXHyperlinkVisualCheck() {
super("JXHyperlinkLabel Test");
}
public static void main(String[] args) throws Exception {
JXHyperlinkVisualCheck test = new JXHyperlinkVisualCheck();
try {
// test.runInteractiveTests();
// test.runInteractiveTests("interactive.*Table.*");
// test.runInteractiveTests("interactive.*List.*");
// test.runInteractiveTests("interactive.*Tree.*");
// test.runInteractiveTests("interactive.*Underline.*");
test.runInteractive("Block");
} catch (Exception e) {
System.err.println("exception when executing interactive tests:");
e.printStackTrace();
}
}
/**
* Issue #1530-swingx:
*
* Quick check if Desktop.browse is blocking (with a lame target site)
* - doesn't appear so.
*
* @throws MalformedURLException
* @throws URISyntaxException
*/
public void interactiveHyperlinkActionBlocking() throws MalformedURLException, URISyntaxException {
URI uri = new URL("http://www.java.net/forums/javadesktop/java-desktop-technologies/swinglabs").toURI();
JXHyperlink link = new JXHyperlink(HyperlinkAction.createHyperlinkAction(uri));
showInFrame(link, "blocking?");
}
/**
* Issue #6-swingx: convenience api for setting uri's
* @throws URISyntaxException
*/
public void interactiveHyperlinkURI() throws URISyntaxException {
JXHyperlink link = new JXHyperlink();
URI uri = new URI("mailto:java-net@java.sun.com");
link.setURI(uri);
showInFrame(link, "uri");
}
/**
* Issue #441-swingx: underline not showing for html text.
* While text wrapping as such is working with html text the
* underline is only under the last line.
*/
public void interactiveHtmlUnderlineWrapping() {
Action action = new AbstractAction("<html><b><i>Bold Italic Link and another loong way way out part of the text</i></b></html>") {
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
}
};
JXHyperlink hyperlink = new JXHyperlink(action );
// hyperlink.setMargin(new Insets(10, 10, 10, 10));
hyperlink.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10));
JFrame frame = wrapInFrame(hyperlink, "show html underline ");
frame.setSize(200, 200);
frame.setVisible(true);
}
/**
* Issue #441-swingx: underline not showing for html text.
*
*/
public void interactiveHtmlUnderlineButton() {
Action action = new AbstractAction("<html><b><i>Bold Italic Link</i></b></html>") {
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
}
};
JXHyperlink hyperlink = new JXHyperlink(action );
// hyperlink.setMargin(new Insets(10, 10, 10, 10));
hyperlink.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10));
JFrame frame = wrapInFrame(hyperlink, "show html underline ");
frame.setSize(200, 200);
frame.setVisible(true);
}
/**
* visually check how differently configured buttons behave on
* clicked.
*
*/
public void interactiveCompareClicked() {
JComponent box = Box.createVerticalBox();
JXHyperlink noActionHyperlink = new JXHyperlink();
noActionHyperlink.setText("have no action - auto-click");
box.add(noActionHyperlink);
AbstractHyperlinkAction<?> doNothingAction = createEmptyLinkAction("have do nothing action - follow action");
JXHyperlink doNothingActionHyperlink = new JXHyperlink(doNothingAction);
box.add(doNothingActionHyperlink);
AbstractHyperlinkAction<?> doNothingAction2 = createEmptyLinkAction("have do nothing action - overrule");
JXHyperlink overruleActionHyperlink = new JXHyperlink(doNothingAction2);
overruleActionHyperlink.setOverrulesActionOnClick(true);
box.add(overruleActionHyperlink);
JXFrame frame = wrapInFrame(box, "compare clicked control");
frame.setVisible(true);
}
public void interactiveUnderlineButton() {
Action action = new AbstractAction("LinkModel@somewhere") {
public void actionPerformed(ActionEvent e) {
LOG.info("gotcha!");
}
};
JXHyperlink hyperlink = new JXHyperlink(action );
// JButton hyperlink = new JButton("LinkModel somewhere");
// hyperlink.setMargin(new Insets(10, 10, 10, 10));
hyperlink.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10));
JXPanel panel = new JXPanel(new BorderLayout());
panel.add(hyperlink);
panel.add(new JLabel("south"), BorderLayout.SOUTH);
panel.add(new JLabel("north"), BorderLayout.NORTH);
JFrame frame = wrapInFrame(panel, "show underline - no link action");
frame.setSize(200, 200);
frame.setVisible(true);
}
public void interactiveLink() throws Exception {
JXEditorPane pane = new JXEditorPane();
pane.setEditable(false);
EditorPaneLinkVisitor visitor = new EditorPaneLinkVisitor(pane);
LinkModel localLink = new LinkModel("Click me! - local text", null, JXEditorPaneTest.class.getResource("resources/test.html"));
LinkModelAction<?> localAction = new LinkModelAction<LinkModel>(localLink, visitor);
JXHyperlink localHyperlink = new JXHyperlink(localAction);
LinkModel externalLink = new LinkModel("Click me! - external text", null, new URL("http://swingx.java.net"));
LinkModelAction<?> externalAction = new LinkModelAction<LinkModel>(externalLink, visitor);
JXHyperlink externalHyperlink = new JXHyperlink(externalAction);
JPanel panel = new JPanel(new BorderLayout());
panel.add(new JScrollPane(visitor.getOutputComponent()));
panel.add(externalHyperlink, BorderLayout.NORTH);
panel.add(localHyperlink, BorderLayout.SOUTH);
JFrame frame = wrapInFrame(panel, "simple hyperlink");
frame.setSize(200, 200);
frame.setVisible(true);
}
//---------------------- interactive test: JXTree
public void interactiveTreeLinkRendererSimpleText() {
AbstractHyperlinkAction<Object> simpleAction = new AbstractHyperlinkAction<Object>(null) {
public void actionPerformed(ActionEvent e) {
LOG.info("hit: " + getTarget());
}
};
JXTree tree = new JXTree(new FileSystemModel());
tree.setRolloverEnabled(true);
HyperlinkProvider provider = new HyperlinkProvider(simpleAction);
tree.setCellRenderer(new DefaultTreeRenderer(provider));
// tree.setCellRenderer(new LinkRenderer(simpleAction));
tree.setHighlighters(HighlighterFactory.createSimpleStriping());
JFrame frame = wrapWithScrollingInFrame(tree, "tree and simple links");
frame.setVisible(true);
}
//---------------------- interactive test: JXTable
/**
* Table url activation, disabled tooltips.
*/
public void interactiveTableHyperlinkNoTooltip() {
JXTable table = new JXTable(createModelWithLinks());
EditorPaneLinkVisitor visitor = new EditorPaneLinkVisitor();
LinkModelAction<?> action = new LinkModelAction<LinkModel>(visitor) {
@Override
protected void updateFromTarget() {
super.updateFromTarget();
putValue(Action.SHORT_DESCRIPTION, null);
}
};
// set the default renderer for LinkModel - which is basically
// a bean wrapped around an URL
table.setDefaultRenderer(LinkModel.class, new DefaultTableRenderer
(new HyperlinkProvider(action, LinkModel.class)));
JXFrame frame = wrapWithScrollingInFrame(table, visitor.getOutputComponent(), "table and simple links");
frame.setVisible(true);
}
/**
* Table with both simple "hyperlinks" targets and url activation.
*/
public void interactiveTableHyperlinkSimpleText() {
JXTable table = new JXTable(createModelWithLinks());
EditorPaneLinkVisitor visitor = new EditorPaneLinkVisitor();
LinkModelAction<?> action = new LinkModelAction<LinkModel>(visitor);
// set the default renderer for LinkModel - which is basically
// a bean wrapped around an URL
table.setDefaultRenderer(LinkModel.class, new DefaultTableRenderer
(new HyperlinkProvider(action, LinkModel.class)));
// JW: editor mis-use is not recommended but possible...
// the LinkRenderer in its role as editor is not yet deprecated but should
// soon. Without registering a specialized editor the column should
// not editable - otherwise the "normal" default editor would jump in
// LinkModelAction action2 = new LinkModelAction<LinkModel>(visitor);
// table.setDefaultEditor(LinkModel.class, new LinkRenderer(action2, LinkModel.class));
// simple activatable action on the target in the first column
AbstractHyperlinkAction<Object> simpleAction = new AbstractHyperlinkAction<Object>(null) {
public void actionPerformed(ActionEvent e) {
LOG.info("hit: " + getTarget());
}
};
// the action will be activated only if the column is not-editable
// here that's done in the model
// TODO JW: revisit
table.getColumn(0).setCellRenderer(new DefaultTableRenderer(
new HyperlinkProvider(simpleAction)));
JXFrame frame = wrapWithScrollingInFrame(table, visitor.getOutputComponent(), "table and simple links");
frame.setVisible(true);
}
/**
* Check visuals of hyperlink and highlighter.
* Issue #513-swingx: no rollover effect for disabled table.
* Hyperlink is disabled automatically by DefaultVisuals, no need
* to disable the xxRolloverController.
*
*/
public void interactiveTableHyperlinkLFStripingHighlighter() {
EditorPaneLinkVisitor visitor = new EditorPaneLinkVisitor();
final JXTable table = new JXTable(createModelWithLinks());
LinkModelAction<?> action = new LinkModelAction<LinkModel>(visitor);
table.setDefaultRenderer(LinkModel.class, new DefaultTableRenderer
(new HyperlinkProvider(action, LinkModel.class)));
table.setHighlighters(HighlighterFactory.createSimpleStriping());
Action enabled = new AbstractAction("toggle table enabled") {
public void actionPerformed(ActionEvent e) {
table.setEnabled(!table.isEnabled());
}
};
JXFrame frame = wrapWithScrollingInFrame(table, visitor.getOutputComponent(),
"show link renderer in table with LF striping highlighter");
addAction(frame, enabled);
frame.setVisible(true);
}
//----------------- interactive tests: JXList
/**
* Custom link target action in JXList.
*/
public void interactiveListHyperlikPlayer() {
AbstractHyperlinkAction<Player> linkAction = new AbstractHyperlinkAction<Player>() {
public void actionPerformed(ActionEvent e) {
LOG.info("hit: " + getTarget());
}
@Override
protected void installTarget() {
setName(getTarget() != null ? getTarget().name : "");
}
};
JXList list = new JXList(createPlayerModel(), true);
list.setRolloverEnabled(true);
// descending order - check if the action is performed for the
// correct value
list.setSortOrder(SortOrder.DESCENDING);
list.setCellRenderer(new DefaultListRenderer(
new HyperlinkProvider(linkAction, Player.class)));
JFrame frame = wrapWithScrollingInFrame(list, "show simple bean link renderer in list");
frame.setVisible(true);
}
private ListModel createPlayerModel() {
DefaultListModel model = new DefaultListModel();
model.addElement(new Player("Henry", 10));
model.addElement(new Player("Berta", 112));
model.addElement(new Player("Dave", 20));
return model;
}
public static class Player {
String name;
int score;
public Player(String name, int score) {
this.name = name;
this.score = score;
}
@Override
public String toString() {
return name + " has score: " + score;
}
}
/**
* Simple target action.
*
*/
public void interactiveListHyperlinkSimpleText() {
AbstractHyperlinkAction<Object> linkAction = new AbstractHyperlinkAction<Object>(null) {
public void actionPerformed(ActionEvent e) {
LOG.info("hit: " + getTarget());
}
};
JXList list = new JXList(createTextOnlyListModel(20));
list.setRolloverEnabled(true);
list.setCellRenderer(new DefaultListRenderer(
new HyperlinkProvider(linkAction)));
JFrame frame = wrapWithScrollingInFrame(list, "show simple link renderer in list");
frame.setVisible(true);
}
/**
* ListModel with LinkModel.
*
*/
public void interactiveListHyperlink() {
EditorPaneLinkVisitor visitor = new EditorPaneLinkVisitor();
JXList list = new JXList(createListModelWithLinks(20));
list.setRolloverEnabled(true);
LinkModelAction<?> action = new LinkModelAction<LinkModel>(visitor);
list.setCellRenderer(new DefaultListRenderer(
new HyperlinkProvider(action, LinkModel.class)));
JFrame frame = wrapWithScrollingInFrame(list, visitor.getOutputComponent(), "show link renderer in list");
frame.setVisible(true);
}
/**
* Visuals of Hyperlink/Highlighter interaction.
*
*/
public void interactiveListHyperlinkLFStripingHighlighter() {
EditorPaneLinkVisitor visitor = new EditorPaneLinkVisitor();
JXList list = new JXList(createListModelWithLinks(20));
LinkModelAction<?> action = new LinkModelAction<LinkModel>(visitor);
list.setCellRenderer(new DefaultListRenderer(
new HyperlinkProvider(action, LinkModel.class)));
list.setRolloverEnabled(true);
list.setHighlighters(HighlighterFactory.createSimpleStriping());
JFrame frame = wrapWithScrollingInFrame(list, visitor.getOutputComponent(),
"show link renderer in list with LFStriping highlighter");
frame.setVisible(true);
}
private ListModel createTextOnlyListModel(int count) {
DefaultListModel model = new DefaultListModel();
for (int i = 0; i < count; i++) {
model.addElement("text #" + i);
}
return model;
}
private ListModel createListModelWithLinks(int count) {
DefaultListModel model = new DefaultListModel();
for (int i = 0; i < count; i++) {
try {
LinkModel link = new LinkModel("a link text " + i, null, new URL("http://some.dummy.url" + i));
if (i == 1) {
URL url = JXEditorPaneTest.class.getResource("resources/test.html");
link = new LinkModel("a link text " + i, null, url);
}
model.addElement(link);
} catch (MalformedURLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
return model;
}
private TableModel createModelWithLinks() {
String[] columnNames = { "text - not-editable", "Link not-editable", "Bool editable", "Bool not-editable" };
DefaultTableModel model = new DefaultTableModel(columnNames, 0) {
@Override
public Class<?> getColumnClass(int column) {
return getValueAt(0, column).getClass();
}
@Override
public boolean isCellEditable(int row, int column) {
return !getColumnName(column).contains("not");
}
};
for (int i = 0; i < 4; i++) {
try {
LinkModel link = new LinkModel("a link text " + i, null, new URL("http://some.dummy.url" + i));
if (i == 1) {
URL url = JXEditorPaneTest.class.getResource("resources/test.html");
link = new LinkModel("a link text " + i, null, url);
}
model.addRow(new Object[] {"text only " + i, link, Boolean.TRUE, Boolean.TRUE });
} catch (MalformedURLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
return model;
}
protected AbstractHyperlinkAction<Object> createEmptyLinkAction() {
AbstractHyperlinkAction<Object> linkAction = new AbstractHyperlinkAction<Object>(null) {
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
}
};
return linkAction;
}
protected AbstractHyperlinkAction<?> createEmptyLinkAction(String name) {
AbstractHyperlinkAction<?> linkAction = createEmptyLinkAction();
linkAction.setName(name);
return linkAction;
}
/**
* make auto-run happy in the absence of real test methods.
*
*/
public void testDummy() {
}
}