Author: mes
Date: 2009-11-25 17:50:13 -0800 (Wed, 25 Nov 2009)
New Revision: 18593

Added:
   coreplugins/trunk/browser/src/browser/ui/MultiLineTableCellEditor.java
Modified:
   coreplugins/trunk/browser/src/browser/ui/CyAttributeBrowserTable.java
Log:
added newline support for browser editing

Modified: coreplugins/trunk/browser/src/browser/ui/CyAttributeBrowserTable.java
===================================================================
--- coreplugins/trunk/browser/src/browser/ui/CyAttributeBrowserTable.java       
2009-11-26 02:28:10 UTC (rev 18592)
+++ coreplugins/trunk/browser/src/browser/ui/CyAttributeBrowserTable.java       
2009-11-26 01:50:13 UTC (rev 18593)
@@ -102,8 +102,20 @@
 import cytoscape.visual.GlobalAppearanceCalculator;
 import cytoscape.visual.VisualMappingManager;
 
+import java.awt.*;
+import java.awt.event.*;
+import java.beans.*;
+import java.util.EventObject;
+import javax.swing.*;
+import javax.swing.JTable;
+import javax.swing.event.DocumentEvent;
+import javax.swing.event.DocumentListener;
+import javax.swing.table.*;
+import javax.swing.table.TableCellEditor;
+import javax.swing.table.TableColumn;
 
 
+
 /**
  * Based on JSortTable and completely rewrote by kono
  *
@@ -231,6 +243,7 @@
 
                this.setDefaultRenderer(Object.class, new 
BrowserTableCellRenderer(false, objectType));
                this.getColumnModel().addColumnModelListener(this);
+               this.setDefaultEditor(Object.class, new 
MultiLineTableCellEditor() );
        }
 
        private void setKeyStroke() {
@@ -1194,6 +1207,180 @@
        public void mouseMoved(MouseEvent e) {
                
        }
+
+
+       /**
+        *  DOCUMENT ME!
+        *
+        * @param row DOCUMENT ME!
+        * @param column DOCUMENT ME!
+        * @param e DOCUMENT ME!
+        *
+        * @return  DOCUMENT ME!
+        */
+       public boolean editCellAt(int row, int column, EventObject e) {
+               if ((cellEditor != null) && !cellEditor.stopCellEditing()) {
+                       return false;
+               }
+
+               if ((row < 0) || (row >= getRowCount()) || (column < 0) || 
(column >= getColumnCount())) {
+                       return false;
+               }
+
+               if (!isCellEditable(row, column))
+                       return false;
+
+               if (editorRemover == null) {
+                       KeyboardFocusManager fm = 
KeyboardFocusManager.getCurrentKeyboardFocusManager();
+                       editorRemover = new CellEditorRemover(fm);
+                       fm.addPropertyChangeListener("permanentFocusOwner", 
editorRemover);
+               }
+
+               TableCellEditor editor = getCellEditor(row, column);
+
+               if ((editor != null) && editor.isCellEditable(e)) {
+
+                       // Do this first so that the bounds of the JTextArea 
editor
+                       // will be correct.
+                       setEditingRow(row);
+                       setEditingColumn(column);
+                       setCellEditor(editor);
+                       editor.addCellEditorListener(this);
+
+                       editorComp = prepareEditor(editor, row, column);
+
+                       if (editorComp == null) {
+                               removeEditor();
+                               return false;
+                       }
+
+                       Rectangle cellRect = getCellRect(row, column, false);
+
+                       if (editor instanceof MultiLineTableCellEditor) {
+                               Dimension prefSize = 
editorComp.getPreferredSize();
+                               ((JComponent) 
editorComp).putClientProperty(MultiLineTableCellEditor.UPDATE_BOUNDS,
+                                                                           
Boolean.TRUE);
+                               editorComp.setBounds(cellRect.x, cellRect.y,
+                                                    Math.max(cellRect.width, 
prefSize.width),
+                                                    Math.max(cellRect.height, 
prefSize.height));
+                               ((JComponent) 
editorComp).putClientProperty(MultiLineTableCellEditor.UPDATE_BOUNDS,
+                                                                           
Boolean.FALSE);
+                       } else
+                               editorComp.setBounds(cellRect);
+
+                       add(editorComp);
+                       editorComp.validate();
+
+                       return true;
+               }
+
+               return false;
+       }
+
+       protected void paintComponent(Graphics g) {
+               super.paintComponent(g);
+
+               if (isEditing()) {
+                       Component component = getEditorComponent();
+                       component.repaint();
+               }
+       }
+
+       /**
+        *  DOCUMENT ME!
+        */
+       public void removeNotify() {
+               KeyboardFocusManager.getCurrentKeyboardFocusManager()
+                                   
.removePropertyChangeListener("permanentFocusOwner", editorRemover);
+               editorRemover = null;
+               super.removeNotify();
+       }
+
+       /**
+        *  DOCUMENT ME!
+        */
+       public void removeEditor() {
+               KeyboardFocusManager.getCurrentKeyboardFocusManager()
+                                   
.removePropertyChangeListener("permanentFocusOwner", editorRemover);
+               editorRemover = null;
+
+               TableCellEditor editor = getCellEditor();
+
+               if (editor != null) {
+                       editor.removeCellEditorListener(this);
+
+                       Rectangle cellRect = getCellRect(editingRow, 
editingColumn, false);
+
+                       if (editorComp != null) {
+                               cellRect = 
cellRect.union(editorComp.getBounds());
+                               remove(editorComp);
+                       }
+
+                       setCellEditor(null);
+                       setEditingColumn(-1);
+                       setEditingRow(-1);
+                       editorComp = null;
+                       repaint(cellRect);
+               }
+       }
+
+       /**
+        *  DOCUMENT ME!
+        *
+        * @return  DOCUMENT ME!
+        */
+       public boolean getScrollableTracksViewportHeight() {
+               if (getParent() instanceof JViewport)
+                       return getParent().getHeight() > 
getPreferredSize().height;
+               else
+                       return false;
+       }
+
+       private PropertyChangeListener editorRemover = null;
+
+       private class CellEditorRemover implements PropertyChangeListener {
+               KeyboardFocusManager focusManager;
+
+               public CellEditorRemover(KeyboardFocusManager fm) {
+                       this.focusManager = fm;
+               }
+
+               public void propertyChange(PropertyChangeEvent ev) {
+                       if (!isEditing() || 
(getClientProperty("terminateEditOnFocusLost") != Boolean.TRUE)) {
+                               return;
+                       }
+
+                       Component c = focusManager.getPermanentFocusOwner();
+
+                       while (c != null) {
+                               if (c == CyAttributeBrowserTable.this) {
+                                       // focus remains inside the table
+                                       return;
+                               } else if (c instanceof Window) {
+                                       if (c == 
SwingUtilities.getRoot(CyAttributeBrowserTable.this)) {
+                                               if 
(!getCellEditor().stopCellEditing()) {
+                                                       
getCellEditor().cancelCellEditing();
+                                               }
+                                       }
+
+                                       break;
+                               }
+
+                               c = c.getParent();
+                       }
+               }
+       }
+
+//     public void tableChanged(TableModelEvent tme) {
+//             if ( tme.getType() == TableModelEvent.INSERT ||
+//                  tme.getType() == TableModelEvent.DELETE )
+//             for (String colName : orderedColumn ) {
+//                     System.out.println("setting cell editor for col: " + 
colName);
+//                     TableColumn col = attributeTable.getColumn(colName);
+//                     col.setCellEditor(new MultiLineTableCellEditor());
+//             }
+//     }
+
 }
 
 
@@ -1317,9 +1504,7 @@
 
                if (type == NODES) {
                        if (netview != Cytoscape.getNullNetworkView()) {
-                               NodeView nodeView = 
netview.getNodeView(Cytoscape.getCyNode((String) table
-                                                                               
                                                                                
                                                                                
                                                                                
                                                                                
                                                                                
                                                                                
                                                                                
                                                                                
                                                                                
                                                                                
                                                                                
                                                         
                                                                                
                                                                                
                                                                                
                                                                        
.getValueAt(row,
-                                                                               
                                                                                
                                                                                
                                                                                
                                                                                
                                                                                
                                                                                
                                                                                
                                                                                
                                                                                
                                                                                
                                                                                
                                                         
                                                                                
                                                                                
                                                                                
                                                                                
    column)));
+                               NodeView nodeView = 
netview.getNodeView(Cytoscape.getCyNode((String) table.getValueAt(row, 
column)));
 
                                if (nodeView != null) {
                                        Color nodeColor = (Color) 
nodeView.getUnselectedPaint();
@@ -1329,8 +1514,7 @@
                } else if (type == EDGES) {
                        if (netview != Cytoscape.getNullNetworkView()) {
                                final String edgeName = (String) 
table.getValueAt(row, column);
-                               final EdgeView edgeView = 
netview.getEdgeView(((CyAttributeBrowserTable) table)
-                                                                               
                                                                                
                                                                                
                                                                                
                                                                                
                                                                                
                                                                                
                                                                                
                                                                                
                                                                                
                                                                                
                                                                                
                                                         
                                                                                
                                                                                
                                                                                
                                                                                
    .getEdge(edgeName));
+                               final EdgeView edgeView = 
netview.getEdgeView(((CyAttributeBrowserTable) table).getEdge(edgeName));
 
                                if (edgeView != null) {
                                        Color edgeColor = (Color) 
edgeView.getUnselectedPaint();
@@ -1370,3 +1554,5 @@
                return html.toString();
        }
 }
+
+

Added: coreplugins/trunk/browser/src/browser/ui/MultiLineTableCellEditor.java
===================================================================
--- coreplugins/trunk/browser/src/browser/ui/MultiLineTableCellEditor.java      
                        (rev 0)
+++ coreplugins/trunk/browser/src/browser/ui/MultiLineTableCellEditor.java      
2009-11-26 01:50:13 UTC (rev 18593)
@@ -0,0 +1,247 @@
+
+package browser.ui;
+
+import static browser.DataObjectType.EDGES;
+import static browser.DataObjectType.NETWORK;
+import static browser.DataObjectType.NODES;
+import giny.model.Edge;
+import giny.model.GraphObject;
+import giny.model.Node;
+import giny.view.EdgeView;
+import giny.view.NodeView;
+
+import java.awt.Color;
+import java.awt.Component;
+import java.awt.Cursor;
+import java.awt.Font;
+import java.awt.Toolkit;
+import java.awt.datatransfer.Clipboard;
+import java.awt.datatransfer.StringSelection;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+import java.awt.event.KeyEvent;
+import java.awt.event.MouseAdapter;
+import java.awt.event.MouseEvent;
+import java.awt.event.MouseListener;
+import java.awt.event.MouseMotionListener;
+import java.beans.PropertyChangeEvent;
+import java.beans.PropertyChangeListener;
+import java.io.BufferedWriter;
+import java.io.File;
+import java.io.FileWriter;
+import java.io.IOException;
+import java.net.MalformedURLException;
+import java.net.URL;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Properties;
+import java.util.Map.Entry;
+
+import javax.swing.BorderFactory;
+import javax.swing.JCheckBoxMenuItem;
+import javax.swing.JComponent;
+import javax.swing.JLabel;
+import javax.swing.JMenu;
+import javax.swing.JMenuItem;
+import javax.swing.JOptionPane;
+import javax.swing.JPopupMenu;
+import javax.swing.JTable;
+import javax.swing.KeyStroke;
+import javax.swing.ListSelectionModel;
+import javax.swing.SwingUtilities;
+import javax.swing.border.Border;
+import javax.swing.event.ChangeEvent;
+import javax.swing.table.JTableHeader;
+import javax.swing.table.TableCellRenderer;
+
+import browser.AttributeBrowser;
+import browser.AttributeBrowserPlugin;
+import browser.DataObjectType;
+import browser.DataTableModel;
+import browser.SortTableModel;
+import browser.util.HyperLinkOut;
+import cytoscape.CyNetwork;
+import cytoscape.Cytoscape;
+import cytoscape.CytoscapeInit;
+import cytoscape.data.CyAttributes;
+import cytoscape.data.SelectEvent;
+import cytoscape.data.SelectEventListener;
+import cytoscape.data.Semantics;
+import cytoscape.dialogs.NetworkMetaDataDialog;
+import cytoscape.logger.CyLogger;
+import cytoscape.util.CyFileFilter;
+import cytoscape.util.FileUtil;
+import cytoscape.util.OpenBrowser;
+import cytoscape.util.swing.ColumnResizer;
+import cytoscape.view.CyNetworkView;
+import cytoscape.view.CytoscapeDesktop;
+import cytoscape.visual.GlobalAppearanceCalculator;
+import cytoscape.visual.VisualMappingManager;
+
+import java.awt.*;
+import java.awt.event.*;
+import java.beans.*;
+import java.util.EventObject;
+import javax.swing.*;
+import javax.swing.JTable;
+import javax.swing.event.DocumentEvent;
+import javax.swing.event.DocumentListener;
+import javax.swing.table.*;
+import javax.swing.table.TableCellEditor;
+import javax.swing.table.TableColumn;
+
+
+/**
+ *
+ */
+public class MultiLineTableCellEditor extends AbstractCellEditor implements 
TableCellEditor,
+                                                                            
ActionListener {
+       ResizableTextArea textArea;
+
+       /**
+        * Creates a new MultiLineTableCellEditor object.
+        */
+       public MultiLineTableCellEditor() {
+               textArea = new ResizableTextArea();
+               textArea.setBorder(BorderFactory.createLineBorder(Color.GRAY));
+               textArea.setLineWrap(true);
+               textArea.setWrapStyleWord(true);
+       }
+
+       /**
+        *  DOCUMENT ME!
+        *
+        * @return  DOCUMENT ME!
+        */
+       public Object getCellEditorValue() {
+               return textArea.getText();
+       }
+
+       protected int clickCountToStart = 2;
+
+       /**
+        *  DOCUMENT ME!
+        *
+        * @return  DOCUMENT ME!
+        */
+       public int getClickCountToStart() {
+               return clickCountToStart;
+       }
+
+       /**
+        *  DOCUMENT ME!
+        *
+        * @param clickCountToStart DOCUMENT ME!
+        */
+       public void setClickCountToStart(int clickCountToStart) {
+               this.clickCountToStart = clickCountToStart;
+       }
+
+       /**
+        *  DOCUMENT ME!
+        *
+        * @param e DOCUMENT ME!
+        *
+        * @return  DOCUMENT ME!
+        */
+       public boolean isCellEditable(EventObject e) {
+               return !(e instanceof MouseEvent)
+                      || (((MouseEvent) e).getClickCount() >= 
clickCountToStart);
+       }
+
+       /**
+        *  DOCUMENT ME!
+        *
+        * @param ae DOCUMENT ME!
+        */
+       public void actionPerformed(ActionEvent ae) {
+               stopCellEditing();
+       }
+
+       /**
+        *  DOCUMENT ME!
+        *
+        * @param table DOCUMENT ME!
+        * @param value DOCUMENT ME!
+        * @param isSelected DOCUMENT ME!
+        * @param row DOCUMENT ME!
+        * @param column DOCUMENT ME!
+        *
+        * @return  DOCUMENT ME!
+        */
+       public Component getTableCellEditorComponent(JTable table, Object 
value, boolean isSelected,
+                                                    int row, int column) {
+               String text = (value != null) ? value.toString() : "";
+               textArea.setTable(table);
+               textArea.setText(text);
+
+               return textArea;
+       }
+
+       /**
+        * 
+        */
+       public static final String UPDATE_BOUNDS = "UpdateBounds";
+
+       class ResizableTextArea extends JTextArea {
+               JTable table;
+
+               public void setTable(JTable t) {
+                       table = t;
+               }
+
+               public void setText(String text) {
+                       super.setText(text);
+                       updateBounds();
+               }
+
+               public void setBounds(int x, int y, int width, int height) {
+                       if 
(Boolean.TRUE.equals(getClientProperty(UPDATE_BOUNDS)))
+                               super.setBounds(x, y, width, height);
+               }
+
+               public void addNotify() {
+                       super.addNotify();
+                       getDocument().addDocumentListener(listener);
+               }
+
+               public void removeNotify() {
+                       getDocument().removeDocumentListener(listener);
+                       super.removeNotify();
+               }
+
+               DocumentListener listener = new DocumentListener() {
+                       public void insertUpdate(DocumentEvent e) {
+                               updateBounds();
+                       }
+
+                       public void removeUpdate(DocumentEvent e) {
+                               updateBounds();
+                       }
+
+                       public void changedUpdate(DocumentEvent e) {
+                               updateBounds();
+                       }
+               };
+
+               private void updateBounds() {
+                       if ( table == null ) {
+                               System.out.println("table is null");
+                               return;
+                       }
+                               
+                       if (table.isEditing()) {
+                               Rectangle cellRect = 
table.getCellRect(table.getEditingRow(),
+                                                                      
table.getEditingColumn(), false);
+                               Dimension prefSize = getPreferredSize();
+                               putClientProperty(UPDATE_BOUNDS, Boolean.TRUE);
+                               setBounds(getX(), getY(), 
Math.max(cellRect.width, prefSize.width),
+                                         Math.max(cellRect.height + 
prefSize.height, prefSize.height));
+                               putClientProperty(UPDATE_BOUNDS, Boolean.FALSE);
+                               validate();
+                       } 
+               }
+       }
+}

--

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