Author: kono
Date: 2010-02-03 16:45:35 -0800 (Wed, 03 Feb 2010)
New Revision: 19174
Modified:
cytoscape/trunk/src/cytoscape/util/swing/AbstractTreeTableModel.java
cytoscape/trunk/src/cytoscape/util/swing/JTreeTable.java
cytoscape/trunk/src/cytoscape/util/swing/TreeTableModelAdapter.java
cytoscape/trunk/src/cytoscape/view/NetworkPanel.java
Log:
First version of NetworkPanel with network preview icon function. Still need
to optimize icon update timing.
Modified: cytoscape/trunk/src/cytoscape/util/swing/AbstractTreeTableModel.java
===================================================================
--- cytoscape/trunk/src/cytoscape/util/swing/AbstractTreeTableModel.java
2010-02-04 00:08:08 UTC (rev 19173)
+++ cytoscape/trunk/src/cytoscape/util/swing/AbstractTreeTableModel.java
2010-02-04 00:45:35 UTC (rev 19174)
@@ -43,6 +43,7 @@
* @author Philip Milne
*/
public abstract class AbstractTreeTableModel implements TreeTableModel {
+
protected Object root;
protected EventListenerList listenerList = new EventListenerList();
Modified: cytoscape/trunk/src/cytoscape/util/swing/JTreeTable.java
===================================================================
--- cytoscape/trunk/src/cytoscape/util/swing/JTreeTable.java 2010-02-04
00:08:08 UTC (rev 19173)
+++ cytoscape/trunk/src/cytoscape/util/swing/JTreeTable.java 2010-02-04
00:45:35 UTC (rev 19174)
@@ -34,7 +34,6 @@
import java.awt.Point;
import java.awt.Rectangle;
import java.awt.event.MouseEvent;
-
import java.util.EventObject;
import javax.swing.JComponent;
@@ -65,6 +64,9 @@
* @author Scott Violet
*/
public class JTreeTable extends JTable {
+
+ private static final long serialVersionUID = -505249707913524363L;
+
/** A subclass of JTree. */
protected TreeTableCellRenderer tree;
Modified: cytoscape/trunk/src/cytoscape/util/swing/TreeTableModelAdapter.java
===================================================================
--- cytoscape/trunk/src/cytoscape/util/swing/TreeTableModelAdapter.java
2010-02-04 00:08:08 UTC (rev 19173)
+++ cytoscape/trunk/src/cytoscape/util/swing/TreeTableModelAdapter.java
2010-02-04 00:45:35 UTC (rev 19174)
@@ -52,8 +52,11 @@
* @author Scott Violet
*/
public class TreeTableModelAdapter extends AbstractTableModel {
- JTree tree;
- TreeTableModel treeTableModel;
+
+ private static final long serialVersionUID = 4492106324533343342L;
+
+ private JTree tree;
+ private TreeTableModel treeTableModel;
/**
* Creates a new TreeTableModelAdapter object.
Modified: cytoscape/trunk/src/cytoscape/view/NetworkPanel.java
===================================================================
--- cytoscape/trunk/src/cytoscape/view/NetworkPanel.java 2010-02-04
00:08:08 UTC (rev 19173)
+++ cytoscape/trunk/src/cytoscape/view/NetworkPanel.java 2010-02-04
00:45:35 UTC (rev 19174)
@@ -47,13 +47,19 @@
import java.beans.PropertyChangeListener;
import java.util.ArrayList;
import java.util.Enumeration;
+import java.util.HashMap;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
+import java.util.Map;
import java.util.Set;
import java.util.TreeSet;
+import javax.swing.BoxLayout;
+import javax.swing.Icon;
+import javax.swing.ImageIcon;
import javax.swing.InputMap;
+import javax.swing.JLabel;
import javax.swing.JMenu;
import javax.swing.JMenuItem;
import javax.swing.JOptionPane;
@@ -61,15 +67,22 @@
import javax.swing.JPopupMenu;
import javax.swing.JScrollPane;
import javax.swing.JSplitPane;
+import javax.swing.JTable;
+import javax.swing.JToggleButton;
import javax.swing.JTree;
import javax.swing.KeyStroke;
import javax.swing.ListSelectionModel;
+import javax.swing.SpringLayout;
import javax.swing.ToolTipManager;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
import javax.swing.event.SwingPropertyChangeSupport;
import javax.swing.event.TreeSelectionEvent;
import javax.swing.event.TreeSelectionListener;
+import javax.swing.table.DefaultTableColumnModel;
+import javax.swing.table.TableCellRenderer;
+import javax.swing.table.TableColumn;
+import javax.swing.table.TableColumnModel;
import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.DefaultTreeCellRenderer;
import javax.swing.tree.TreeNode;
@@ -88,6 +101,7 @@
import cytoscape.util.swing.JTreeTable;
import cytoscape.util.swing.TreeTableModel;
import cytoscape.view.cytopanels.BiModalJSplitPane;
+import ding.view.DGraphView;
/**
@@ -101,13 +115,25 @@
private static final int DEF_DEVIDER_LOCATION = 280;
private static final int PANEL_PREFFERED_WIDTH = 250;
+ private static final Dimension COMMAND_BUTTON_SIZE = new Dimension(16,
16);
+
+ private static final int NETWORK_ICON_SIZE = 64;
+ private static final int DEF_ROW_HEIGHT = 20;
+
// Make this panel as a source of events.
private final SwingPropertyChangeSupport pcs = new
SwingPropertyChangeSupport(this);
private final JTreeTable treeTable;
private final NetworkTreeNode root;
+
private JPanel navigatorPanel;
+ // New for Cytoscape 2.7: Command buttons will be placed here.
+ private JPanel commandPanel;
+ private JPanel networkTreePanel;
+
+ private JToggleButton showNetworkIconButton;
+
private JPopupMenu popup;
private PopupActionListener popupActionListener;
@@ -118,6 +144,7 @@
private JMenuItem applyVisualStyleMenu;
private BiModalJSplitPane split;
+
private final NetworkTreeTableModel treeTableModel;
private final CytoscapeDesktop cytoscapeDesktop;
@@ -132,6 +159,7 @@
root = new NetworkTreeNode("Network Root", "root");
treeTableModel = new NetworkTreeTableModel(root);
+
treeTable = new JTreeTable(treeTableModel);
treeTable.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION);
initialize();
@@ -155,9 +183,32 @@
Cytoscape.getVisualMappingManager().addChangeListener(this);
}
- protected void initialize() {
+ /**
+ * Initialize GUI components
+ */
+ private void initialize() {
setLayout(new BorderLayout());
setPreferredSize(new Dimension(PANEL_PREFFERED_WIDTH, 700));
+
+ // Setup command Panel
+ commandPanel = new JPanel(new SpringLayout());
+ commandPanel.setPreferredSize(new
Dimension(PANEL_PREFFERED_WIDTH, 20));
+ commandPanel.setMaximumSize(new Dimension(10000, 20));
+ commandPanel.setMinimumSize(new
Dimension(PANEL_PREFFERED_WIDTH, 20));
+
+ showNetworkIconButton = new JToggleButton("+");
+ showNetworkIconButton.addActionListener(new ActionListener() {
+ public void actionPerformed(ActionEvent e) {
+ System.out.println("Expand");
+ processIconColumn();
+ }
+ });
+ showNetworkIconButton.setPreferredSize(COMMAND_BUTTON_SIZE);
+
+ commandPanel.add(showNetworkIconButton);
+
+ networkTreePanel = new JPanel();
+ networkTreePanel.setLayout(new BoxLayout(networkTreePanel,
BoxLayout.Y_AXIS));
treeTable.getTree().addTreeSelectionListener(this);
treeTable.getTree().setRootVisible(false);
@@ -166,19 +217,19 @@
treeTable.getTree().setCellRenderer(new TreeCellRenderer());
- treeTable.getColumn("Network").setPreferredWidth(100);
- treeTable.getColumn("Nodes").setPreferredWidth(45);
- treeTable.getColumn("Edges").setPreferredWidth(45);
+ resetTable();
navigatorPanel = new JPanel();
navigatorPanel.setMinimumSize(new Dimension(180, 180));
navigatorPanel.setMaximumSize(new Dimension(180, 180));
navigatorPanel.setPreferredSize(new Dimension(180, 180));
- JScrollPane scroll = new JScrollPane(treeTable);
+ final JScrollPane scroll = new JScrollPane(treeTable);
+ networkTreePanel.add(commandPanel);
+ networkTreePanel.add(scroll);
split = new BiModalJSplitPane(cytoscapeDesktop,
JSplitPane.VERTICAL_SPLIT,
-
BiModalJSplitPane.MODE_SHOW_SPLIT, scroll, navigatorPanel);
+
BiModalJSplitPane.MODE_SHOW_SPLIT, networkTreePanel, navigatorPanel);
split.setResizeWeight(1);
split.setDividerLocation(DEF_DEVIDER_LOCATION);
add(split);
@@ -212,6 +263,61 @@
popup.add(applyVisualStyleMenu);
}
+
+ private void resetTable() {
+
treeTable.getColumn(ColumnModel.NETWORK.getDisplayName()).setPreferredWidth(170);
+
treeTable.getColumn(ColumnModel.NODES.getDisplayName()).setPreferredWidth(45);
+
treeTable.getColumn(ColumnModel.EDGES.getDisplayName()).setPreferredWidth(45);
+ treeTable.setRowHeight(DEF_ROW_HEIGHT);
+ }
+
+ private void processIconColumn() {
+ if (showNetworkIconButton.isSelected()) {
+ showIcons();
+ } else {
+ hideIcons();
+ }
+
+ }
+
+ private TableColumn iconColumn;
+
+ private void showIcons() {
+
+
+ treeTableModel.addColumn(ColumnModel.NETWORK_ICONS, 3);
+ if(iconColumn == null) {
+ iconColumn = new TableColumn(3);
+
iconColumn.setIdentifier(ColumnModel.NETWORK_ICONS.getDisplayName());
+
iconColumn.setHeaderValue(ColumnModel.NETWORK_ICONS.getDisplayName());
+ iconColumn.setCellRenderer(new IconTableCellRenderer());
+ }
+ treeTable.setRowHeight(NETWORK_ICON_SIZE + 2);
+
+
+ treeTable.addColumn(iconColumn);
+ updateIcons();
+ }
+
+ private void hideIcons() {
+ treeTableModel.removeColumn(3);
+ treeTable.getColumnModel().removeColumn(iconColumn);
+ resetTable();
+ }
+
+ private void updateIcons() {
+ final Set<CyNetwork> networkSet = Cytoscape.getNetworkSet();
+
+ for(CyNetwork net: networkSet) {
+ final CyNetworkView view =
Cytoscape.getNetworkView(net.getIdentifier());
+ if(view != null && view !=
Cytoscape.getNullNetworkView() && treeTableModel.getValueAt(
getNetworkNode(net.getIdentifier()), 3) == null) {
+ final Icon networkIcon = new
ImageIcon(((DGraphView)view).createImage(NETWORK_ICON_SIZE, NETWORK_ICON_SIZE,
1.0));
+
+ treeTableModel.setValueAt(networkIcon,
getNetworkNode(net.getIdentifier()), 3);
+ }
+ }
+ }
+
/**
* DOCUMENT ME!
@@ -450,19 +556,57 @@
}
}
+
+ private enum ColumnModel {
+ NETWORK("Network", TreeTableModel.class),
NETWORK_ICONS("Overview", Icon.class),
+ NODES("Nodes", String.class), EDGES("Edges", String.class);
+
+ private final String displayName;
+ private final Class<?> type;
+
+ private ColumnModel(final String displayName, final Class<?>
type) {
+ this.displayName = displayName;
+ this.type = type;
+ }
+
+ public Class<?> getType() {
+ return type;
+ }
+
+ public String getDisplayName() {
+ return displayName;
+ }
+ }
+
+
/**
* Inner class that extends the AbstractTreeTableModel
*/
- class NetworkTreeTableModel extends AbstractTreeTableModel {
- String[] columns = { "Network", "Nodes", "Edges" };
- Class[] columns_class = { TreeTableModel.class, String.class,
String.class };
+ private final class NetworkTreeTableModel extends
AbstractTreeTableModel {
+
+ private List<ColumnModel> columnNames;
+ private final Map<String, Icon> networkIcons;
public NetworkTreeTableModel(Object root) {
super(root);
+ columnNames = new ArrayList<ColumnModel>();
+ columnNames.add(ColumnModel.NETWORK);
+ columnNames.add(ColumnModel.EDGES);
+ columnNames.add(ColumnModel.NODES);
+
+ networkIcons = new HashMap<String, Icon>();
}
+
+ public void addColumn(final ColumnModel model, final int idx) {
+ columnNames.add(idx, model);
+ }
+
+ public void removeColumn(final int idx) {
+ columnNames.remove(idx);
+ }
public Object getChild(Object parent, int index) {
- Enumeration tree_node_enum = ((DefaultMutableTreeNode)
getRoot())
+ final Enumeration<?> tree_node_enum =
((DefaultMutableTreeNode) getRoot())
.breadthFirstEnumeration();
while (tree_node_enum.hasMoreElements()) {
@@ -477,7 +621,7 @@
}
public int getChildCount(Object parent) {
- Enumeration tree_node_enum = ((DefaultMutableTreeNode)
getRoot())
+ Enumeration<?> tree_node_enum =
((DefaultMutableTreeNode) getRoot())
.breadthFirstEnumeration();
while (tree_node_enum.hasMoreElements()) {
@@ -492,44 +636,45 @@
}
public int getColumnCount() {
- return columns.length;
+ return columnNames.size();
}
public String getColumnName(int column) {
- return columns[column];
+ return columnNames.get(column).getDisplayName();
}
- public Class getColumnClass(int column) {
- return columns_class[column];
+ public Class<?> getColumnClass(int column) {
+ return columnNames.get(column).getType();
}
public Object getValueAt(Object node, int column) {
- if (column == 0)
+ if (columnNames.get(column).equals(ColumnModel.NETWORK))
return ((DefaultMutableTreeNode)
node).getUserObject();
- else if (column == 1) {
+ else if
(columnNames.get(column).equals(ColumnModel.NODES)) {
CyNetwork cyNetwork =
Cytoscape.getNetwork(((NetworkTreeNode) node).getNetworkID());
return "" + cyNetwork.getNodeCount() + "(" +
cyNetwork.getSelectedNodes().size()
+ ")";
- } else if (column == 2) {
+ } else if
(columnNames.get(column).equals(ColumnModel.EDGES)) {
CyNetwork cyNetwork =
Cytoscape.getNetwork(((NetworkTreeNode) node).getNetworkID());
return "" + cyNetwork.getEdgeCount() + "(" +
cyNetwork.getSelectedEdges().size()
+ ")";
+ } else if
(columnNames.get(column).equals(ColumnModel.NETWORK_ICONS)) {
+
+ return networkIcons.get(((NetworkTreeNode)
node).getNetworkID());
}
return "";
}
- // Brad
- public void setValueAt(Object aValue, Object node, int column) {
- if (column == 0) {
+
+ public void setValueAt(Object aValue, Object node, int column)
{
+ if
(columnNames.get(column).equals(ColumnModel.NETWORK)) {
((DefaultMutableTreeNode)
node).setUserObject(aValue);
- } else
-
JOptionPane.showMessageDialog(Cytoscape.getDesktop(),
- "Error: assigning
value at in NetworkPanel");
-
- // This function is not used to set node and edge
values.
+ } else
if(columnNames.get(column).equals(ColumnModel.NETWORK_ICONS) && aValue
instanceof Icon) {
+ networkIcons.put(((NetworkTreeNode)
node).getNetworkID(), (Icon) aValue);
+ }
}
}
@@ -551,6 +696,9 @@
}
private class TreeCellRenderer extends DefaultTreeCellRenderer {
+
+ private static final long serialVersionUID =
-678559990857492912L;
+
public Component getTreeCellRendererComponent(JTree tree,
Object value, boolean sel,
boolean expanded,
boolean leaf, int row,
boolean hasFocus)
{
@@ -574,7 +722,26 @@
return Cytoscape.viewExists(node.getNetworkID());
}
}
+
+
+ private class IconTableCellRenderer implements TableCellRenderer {
+ public Component getTableCellRendererComponent(JTable table,
+ Object value, boolean isSelected, boolean
hasFocus, int row,
+ int column) {
+
+ final JLabel label;
+ if(value != null && value instanceof Icon) {
+ label = new JLabel();
+ label.setIcon((Icon) value);
+ } else
+ label = new JLabel("?");
+
+ return label;
+ }
+
+ }
+
/**
* This class listens to mouse events from the TreeTable, if the mouse
event
* is one that is canonically associated with a popup menu (ie, a right
@@ -703,9 +870,7 @@
if (DESTROY_VIEW.equals(label)) {
final List<CyNetwork> selected =
Cytoscape.getSelectedNetworks();
- System.out.println("======= Num selected = " +
selected.size());
for (final CyNetwork network: selected) {
- System.out.println("======= Deleting view: " +
network.getTitle());
final CyNetworkView targetView =
Cytoscape.getNetworkView(network.getIdentifier());
if (targetView !=
Cytoscape.getNullNetworkView()) {
Cytoscape.destroyNetworkView(targetView);
--
You received this message because you are subscribed to the Google Groups
"cytoscape-cvs" group.
To post to this group, send email to [email protected].
To unsubscribe from this group, send email to
[email protected].
For more options, visit this group at
http://groups.google.com/group/cytoscape-cvs?hl=en.