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.

Reply via email to