/*
* $Id$
*
* Copyright 2004 Sun Microsystems, Inc., 4150 Network Circle,
* Santa Clara, California 95054, U.S.A. All rights reserved.
*/
package org.jdesktop.swingx.action;
import java.awt.BorderLayout;
import java.awt.Component;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.FocusEvent;
import java.awt.event.FocusListener;
import java.util.ArrayList;
import java.util.List;
import javax.swing.AbstractAction;
import javax.swing.Action;
import javax.swing.ActionMap;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTabbedPane;
import javax.swing.JToolBar;
import javax.swing.JTree;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
import javax.swing.table.AbstractTableModel;
import javax.swing.table.TableModel;
import junit.framework.TestCase;
import org.jdesktop.swingx.JXEditorPane;
import org.jdesktop.swingx.JXTable;
import org.jdesktop.swingx.JXTree;
import org.jdesktop.swingx.JXTreeTable;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.JUnit4;
/**
* A unit test for targetable actions.
*/
@RunWith(JUnit4.class)
public class TargetableActionTest extends TestCase {
@Test
public void testDummy() {
}
public static void main(String[] args) {
showActionMaps();
showUI();
}
/**
* These are cover methods for the same methods in ActionFactory.
*/
public static TargetableAction createTargetableAction(String id, String name) {
return createTargetableAction(id, name, null);
}
public static TargetableAction createTargetableAction(String id, String name,
String mnemonic) {
return createTargetableAction(id, name, mnemonic, false);
}
public static TargetableAction createTargetableAction(String id, String name,
String mnemonic, boolean toggle) {
return ActionFactory.createTargetableAction(id, name, mnemonic, toggle, null);
}
public static TargetableAction createTargetableAction(String id, String name,
String mnemonic, boolean toggle,
String group) {
return ActionFactory.createTargetableAction(id, name, mnemonic, toggle, group);
}
public static void showUI() {
ActionManager manager = new ActionManager();
ActionManager.setInstance(manager);
// The action id must map to the action-ids in the component.
manager.addAction(createTargetableAction("cut-to-clipboard", "Cut", "C"));
manager.addAction(createTargetableAction("copy-to-clipboard", "Copy", "P"));
manager.addAction(createTargetableAction("paste-from-clipboard", "Paste", "T"));
manager.addAction(createTargetableAction("print", "Print", "P"));
manager.addAction(createTargetableAction("find", "Find", "F"));
manager.addAction(createTargetableAction("collapse-all", "Collapse", "l"));
manager.addAction(createTargetableAction("expand-all", "Expand", "x"));
// More toggle actions for a group
manager.addAction(createTargetableAction("left-justify", "Left", "L", true,
"position-group"));
manager.addAction(createTargetableAction("center-justify", "Center", "C", true,
"position-group"));
manager.addAction(createTargetableAction("right-justify", "Right", "R", true,
"position-group"));
List<String> list = new ArrayList<String>();
list.add("cut-to-clipboard");
list.add("copy-to-clipboard");
list.add("paste-from-clipboard");
list.add(null);
list.add("left-justify");
list.add("center-justify");
list.add("right-justify");
list.add(null);
list.add("print");
list.add("find");
list.add("collapse-all");
list.add("expand-all");
// Use the factory to build components from lists.
ActionContainerFactory factory = new ActionContainerFactory(manager);
JToolBar toolbar = factory.createToolBar(list);
JPanel panel = new JPanel(new GridLayout(2,2, 5, 5));
JXEditorPane editor = new JXEditorPane("text/html", "This is an example of some text");
panel.add(editor);
panel.add(new JXEditorPane());
panel.add(createTabbedPane());
panel.add(createTree());
JFrame frame = new JFrame();
frame.getContentPane().add(toolbar, BorderLayout.NORTH);
frame.getContentPane().add(panel);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.pack();
frame.setVisible(true);
}
public static JComponent createTabbedPane() {
JTabbedPane pane = new JTabbedPane();
pane.add(createTable());
pane.add(createTable());
pane.add(createTable());
pane.add(createTable());
// XXX - this is a way to support setting a target manager.
// There are some bugs with this approach. Namely, there is no
// reliable way for the TargetManager to be reset when th
pane.addFocusListener(new FocusListener() {
public void focusGained(FocusEvent evt) {
// System.out.println("FocusGained: " + evt);
JTabbedPane pane = (JTabbedPane)evt.getSource();
Component comp = pane.getSelectedComponent();
if (comp instanceof Targetable) {
TargetManager.getInstance().setTarget((Targetable)comp);
}
}
public void focusLost(FocusEvent evt) {
//System.out.println("FocusLost: " + evt);
if (!evt.isTemporary()) {
TargetManager.getInstance().setTarget(null);
}
}
});
pane.addChangeListener(new ChangeListener() {
public void stateChanged(ChangeEvent evt) {
JTabbedPane pane = (JTabbedPane)evt.getSource();
Component comp = pane.getSelectedComponent();
if (comp instanceof Targetable) {
TargetManager.getInstance().setTarget((Targetable)comp);
}
}
});
return pane;
}
public static int tableNum = 0;
public static JComponent createTable() {
TableModel dataModel = new AbstractTableModel() {
public int getColumnCount() { return 4; }
public int getRowCount() { return 4;}
public Object getValueAt(int row, int col) { return new Integer(row*col); }
@Override
public boolean isCellEditable(int row, int col) { return true; }
};
JXTable table = new JXTable(dataModel);
table.setName("Table: " + tableNum++);
return table;
}
public static JComponent createTree() {
JTree jtree = new JTree();
JXTree tree = new JXTree(jtree.getModel());
tree.setEditable(true);
// Stuff the action map.
ActionMap map = tree.getActionMap();
Action action = new MyAction("print", "Print on JTree");
map.put(action.getValue(Action.NAME), action);
action = new MyAction("find", "Find on JTree");
map.put(action.getValue(Action.NAME), action);
return tree;
}
/**
* Simple action which displays a string when invoked.
*/
public static class MyAction extends AbstractAction {
private String description;
public MyAction(String name, String desc) {
super(name);
this.description = desc;
}
public void actionPerformed(ActionEvent evt) {
System.out.println(getValue(Action.NAME) + " has been invoked: " + description);
}
}
public static void showActionMaps() {
System.out.println("\nActionMap keys for JXTable\n===================");
showActionMap(new JXTable());
System.out.println("\nActionMap keys for JXEditorPane\n==================");
showActionMap(new JXEditorPane());
System.out.println("\nActionMap keys for an HTML JXEditorPane\n==================");
showActionMap(new JXEditorPane("text/html", ""));
System.out.println("\nActionMap keys for JXTree\n====================");
showActionMap(new JXTree());
System.out.println("\nActionMap keys for JXTreeTable\n====================");
showActionMap(new JXTreeTable());
}
public static void showActionMap(JComponent comp) {
ActionMap map = comp.getActionMap();
Object[] keys = map.allKeys();
if (keys != null) {
for (int i = 0; i < keys.length; i++) {
System.out.println(keys[i]);
}
}
}
}