Author: ruschein
Date: 2010-12-20 16:16:04 -0800 (Mon, 20 Dec 2010)
New Revision: 23252

Added:
   
core3/table-browser-impl/trunk/src/main/java/org/cytoscape/browser/internal/BrowserTableCellRenderer.java
   
core3/table-browser-impl/trunk/src/main/java/org/cytoscape/browser/internal/MultiLineTableCellEditor.java
Removed:
   
core3/table-browser-impl/trunk/src/main/java/org/cytoscape/browser/internal/MyTableCellRenderer.java
Modified:
   
core3/table-browser-impl/trunk/src/main/java/org/cytoscape/browser/internal/BrowserTable.java
   
core3/table-browser-impl/trunk/src/main/java/org/cytoscape/browser/internal/BrowserTableModel.java
Log:
Work in progress.

Modified: 
core3/table-browser-impl/trunk/src/main/java/org/cytoscape/browser/internal/BrowserTable.java
===================================================================
--- 
core3/table-browser-impl/trunk/src/main/java/org/cytoscape/browser/internal/BrowserTable.java
       2010-12-20 23:14:16 UTC (rev 23251)
+++ 
core3/table-browser-impl/trunk/src/main/java/org/cytoscape/browser/internal/BrowserTable.java
       2010-12-21 00:16:04 UTC (rev 23252)
@@ -8,14 +8,21 @@
 
 
 public class BrowserTable extends JTable {
-       private static final TableCellRenderer cellRenderer = new 
MyTableCellRenderer();
+       private static final TableCellRenderer cellRenderer = new 
BrowserTableCellRenderer();
 
        public BrowserTable() {
-               super();
+               setCellSelectionEnabled(true);
+               setDefaultEditor(Object.class, new MultiLineTableCellEditor());
        }
 
+       @Override
        public TableCellRenderer getCellRenderer(int row, int column) {
                return cellRenderer;
        }
+
+       @Override
+       public boolean isCellEditable(final int row, final int column) {
+               return column != 0;
+       }
 }
 

Copied: 
core3/table-browser-impl/trunk/src/main/java/org/cytoscape/browser/internal/BrowserTableCellRenderer.java
 (from rev 21185, 
coreplugins/trunk/browser/src/main/java/browser/ui/BrowserTableCellRenderer.java)
===================================================================
--- 
core3/table-browser-impl/trunk/src/main/java/org/cytoscape/browser/internal/BrowserTableCellRenderer.java
                           (rev 0)
+++ 
core3/table-browser-impl/trunk/src/main/java/org/cytoscape/browser/internal/BrowserTableCellRenderer.java
   2010-12-21 00:16:04 UTC (rev 23252)
@@ -0,0 +1,78 @@
+package org.cytoscape.browser.internal;
+
+
+import java.awt.Color;
+import java.awt.Component;
+import java.awt.Font;
+import java.util.List;
+import java.util.Map;
+
+import javax.swing.BorderFactory;
+import javax.swing.JLabel;
+import javax.swing.JTable;
+import javax.swing.border.Border;
+import javax.swing.table.TableCellRenderer;
+
+
+/** Cell renderer for attribute browser table. */
+class BrowserTableCellRenderer extends JLabel implements TableCellRenderer {
+       private static final String HTML_BEG = "<html><body topmargin=\"5\" 
leftmargin=\"0\" marginheight=\"5\" marginwidth=\"5\" "
+                                              + "bgcolor=\"#ffffff\" 
text=\"#595959\" link=\"#0000ff\" vlink=\"#800080\" alink=\"#ff0000\">";
+       private static final String HTML_STYLE = "<div style=\"width: 200px; 
background-color: #ffffff; padding: 3px;\"> ";
+
+       // Define fonts & colors for the cells
+       private final static Font labelFont = new Font("Sans-serif", Font.BOLD, 
12);
+       private Font normalFont = new Font("Sans-serif", Font.PLAIN, 12);
+       private final Color metadataBackground = new Color(255, 210, 255);
+       private static final Color NON_EDITABLE_COLOR = new Color(235, 235, 
235, 100);
+       private static final Color SELECTED_CELL_COLOR = new Color(0, 100, 255, 
40);
+       private static final Color SELECTED_LABEL_COLOR = 
Color.black.brighter();
+
+       public BrowserTableCellRenderer() {
+               setOpaque(true);
+               setBorder(BorderFactory.createEmptyBorder(0, 5, 0, 5));
+       }
+
+       public Component getTableCellRendererComponent(final JTable table, 
final Object value, final boolean isSelected,
+                                                      final boolean hasFocus, 
final int row, final int column)
+       {
+               setHorizontalAlignment(JLabel.LEFT);
+
+               final ValidatedObjectAndEditString objectAndEditString = 
(ValidatedObjectAndEditString)value;
+
+               // First, set values
+               if (objectAndEditString == null
+                   || (objectAndEditString.getValidatedObject() == null && 
objectAndEditString.getErrorText() == null))
+                       setText("");
+               else {
+                       final String displayText = 
(objectAndEditString.getErrorText() != null)
+                               ? objectAndEditString.getErrorText()
+                               : 
objectAndEditString.getValidatedObject().toString();
+                       setText(displayText);
+               }
+
+               // If selected, return
+               if (isSelected) {
+                       setFont(labelFont);
+                       setForeground(SELECTED_LABEL_COLOR);
+                       setBackground(SELECTED_CELL_COLOR);
+
+                       return this;
+               }
+
+               // set default colorings
+               setForeground(table.getForeground());
+               setFont(normalFont);
+               setBackground(table.getBackground());
+
+               // If ID, return default.
+               if (column == 0) {
+                       setFont(labelFont);
+                       setBackground(NON_EDITABLE_COLOR);
+               }
+               
+               return this;
+       }
+}
+
+

Modified: 
core3/table-browser-impl/trunk/src/main/java/org/cytoscape/browser/internal/BrowserTableModel.java
===================================================================
--- 
core3/table-browser-impl/trunk/src/main/java/org/cytoscape/browser/internal/BrowserTableModel.java
  2010-12-20 23:14:16 UTC (rev 23251)
+++ 
core3/table-browser-impl/trunk/src/main/java/org/cytoscape/browser/internal/BrowserTableModel.java
  2010-12-21 00:16:04 UTC (rev 23252)
@@ -84,20 +84,12 @@
                                ++count;
                        }
 
-                       // Column 0 is always the primary key:
-                       if (column == 0)
-                               return cyRow.get(table.getPrimaryKey(), 
table.getPrimaryKeyType());
-
                        return getValidatedObjectAndEditString(cyRow, 
columnName);
                } else {
                        final List primaryKeyValues =
                                table.getColumnValues(table.getPrimaryKey(),
                                                      
table.getPrimaryKeyType());
 
-                       // Column 0 is always the primary key:
-                       if (column == 0)
-                               return primaryKeyValues.get(row);
-
                        return 
getValidatedObjectAndEditString(table.getRow(primaryKeyValues.get(row)),
                                                               columnName);
                }
@@ -214,8 +206,9 @@
                if (tableHasBooleanSelected && 
columnName.equals(CyNetwork.SELECTED))
                        fireTableStructureChanged();
                else {
-                       final int changedColumn = 
mapColumnNameToColumnIndex(columnName);
-                       fireTableChanged(new TableModelEvent(this, 0, 
table.getRowCount(), changedColumn));
+                       final int rowIndex = mapRowToRowIndex(row);
+                       if (rowIndex != -1)
+                               fireTableChanged(new TableModelEvent(this, 
rowIndex));
                }
        }
 

Copied: 
core3/table-browser-impl/trunk/src/main/java/org/cytoscape/browser/internal/MultiLineTableCellEditor.java
 (from rev 21185, 
coreplugins/trunk/browser/src/main/java/browser/ui/MultiLineTableCellEditor.java)
===================================================================
--- 
core3/table-browser-impl/trunk/src/main/java/org/cytoscape/browser/internal/MultiLineTableCellEditor.java
                           (rev 0)
+++ 
core3/table-browser-impl/trunk/src/main/java/org/cytoscape/browser/internal/MultiLineTableCellEditor.java
   2010-12-21 00:16:04 UTC (rev 23252)
@@ -0,0 +1,195 @@
+package org.cytoscape.browser.internal;
+
+
+import java.awt.Color;
+import java.awt.Component;
+import java.awt.Dimension;
+import java.awt.Rectangle;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+import java.awt.event.InputEvent;
+import java.awt.event.KeyEvent;
+import java.awt.event.KeyListener;
+import java.awt.event.MouseEvent;
+
+import javax.swing.AbstractCellEditor;
+import javax.swing.Action;
+import javax.swing.BorderFactory;
+import javax.swing.JComponent;
+import javax.swing.JTable;
+import javax.swing.JTextArea;
+import javax.swing.KeyStroke;
+import javax.swing.text.Keymap;
+import javax.swing.SwingUtilities;
+import javax.swing.text.BadLocationException;
+import javax.swing.text.SimpleAttributeSet;
+import javax.swing.text.Document;
+import javax.swing.text.Keymap;
+import javax.swing.text.TextAction;
+import javax.swing.text.JTextComponent;
+
+import javax.swing.event.DocumentEvent;
+import javax.swing.event.DocumentListener;
+import javax.swing.table.TableCellEditor;
+import javax.swing.table.TableColumn;
+
+import java.util.EventObject;
+
+
+public class MultiLineTableCellEditor extends AbstractCellEditor implements 
TableCellEditor,
+                                                                            
ActionListener
+{
+       private ResizableTextArea textArea;
+
+       public MultiLineTableCellEditor() {
+               textArea = new ResizableTextArea(this);
+               textArea.setBorder(BorderFactory.createLineBorder(Color.GRAY));
+               textArea.setLineWrap(true);
+               textArea.setWrapStyleWord(true);
+       }
+
+       public Object getCellEditorValue() {
+               return textArea.getText();
+       }
+
+       protected int clickCountToStart = 2;
+
+       public int getClickCountToStart() {
+               return clickCountToStart;
+       }
+
+       public void setClickCountToStart(int clickCountToStart) {
+               this.clickCountToStart = clickCountToStart;
+       }
+
+       public boolean isCellEditable(EventObject e) {
+               return !(e instanceof MouseEvent)
+                      || (((MouseEvent) e).getClickCount() >= 
clickCountToStart);
+       }
+
+       public void actionPerformed(ActionEvent ae) {
+               stopCellEditing();
+       }
+
+       public Component getTableCellEditorComponent(final JTable table, final 
Object value, final boolean isSelected,
+                                                    final int row, final int 
column)
+       {
+//System.err.println("********************* getTableCellEditorComponent(), 
column="+column+", value="+value);
+               final String text = (value != null) ? 
((ValidatedObjectAndEditString)value).getEditString() : "";
+               textArea.setTable(table);
+System.err.println("********************* text="+text);
+               textArea.setText(text);
+
+               return textArea;
+       }
+
+       public static final String UPDATE_BOUNDS = "UpdateBounds";
+
+       class ResizableTextArea extends JTextArea implements KeyListener {
+               private JTable table;
+               private MultiLineTableCellEditor parent;
+
+               ResizableTextArea(final MultiLineTableCellEditor parent) {
+                       this.parent = parent;
+                       addKeyListener(this);
+               }
+
+               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.err.println("table is null");
+                               return;
+                       }
+
+System.err.println("******************** in updateBounds(), 
table.isEditing()="+table.isEditing());
+                       if (table.isEditing()) {
+System.err.println("******************** in updateBounds(), 
table.getEditingRow()="+table.getEditingRow()+", 
table.getEditingColumn()="+table.getEditingColumn());
+                               Rectangle cellRect = 
table.getCellRect(table.getEditingRow(),
+                                                                      
table.getEditingColumn(), false);
+System.err.println("******************** in updateBounds(), 
table.getCellRect(table.getEditingRow(),table.getEditingColumn(), 
false)="+cellRect);
+                               Dimension prefSize = getPreferredSize();
+                               putClientProperty(UPDATE_BOUNDS, Boolean.TRUE);
+System.err.println("******************** in updateBounds(), getX()="+getX()+", 
getY()="+getY());
+                               setBounds(getX(), getY(), 
Math.min(cellRect.width, prefSize.width),
+                                         Math.max(cellRect.height + 
prefSize.height, prefSize.height));
+                               putClientProperty(UPDATE_BOUNDS, Boolean.FALSE);
+                               validate();
+                       }
+               }
+
+               //
+               // KeyListener Interface
+               //
+
+               public void keyTyped(KeyEvent e) {}
+
+               public void keyReleased(KeyEvent e) {}
+
+               public void keyPressed(final KeyEvent event) {
+                       if (event.getKeyCode() != KeyEvent.VK_ENTER)
+                               return;
+
+                       final int modifiers = event.getModifiers();
+
+                       // We want to move to the next cell if Enter and no 
modifiers have been pressed:
+                       if (modifiers == 0) {
+                               parent.stopCellEditing();
+                               this.transferFocus();
+                               return;
+                       }
+
+                       // We want to move to the previous cell if Shift+Enter 
have been pressed:
+                       if (modifiers == KeyEvent.VK_SHIFT) {
+                               parent.stopCellEditing();
+                               this.transferFocusBackward();
+                               return;
+                       }
+
+                       // We want to insert a newline if Enter+Alt or 
Enter+Alt+Meta have been pressed:
+                       final int OPTION_AND_COMMAND = 12; // On Mac to emulate 
Excel.
+                       if (modifiers == KeyEvent.VK_ALT || modifiers == 
OPTION_AND_COMMAND) {
+                               final int caretPosition = 
this.getCaretPosition();
+                               final StringBuilder text = new 
StringBuilder(this.getText());
+                               this.setText(text.insert(caretPosition, 
'\n').toString());
+                               this.setCaretPosition(caretPosition + 1);
+                       }
+               }
+       }
+}

Deleted: 
core3/table-browser-impl/trunk/src/main/java/org/cytoscape/browser/internal/MyTableCellRenderer.java
===================================================================
--- 
core3/table-browser-impl/trunk/src/main/java/org/cytoscape/browser/internal/MyTableCellRenderer.java
        2010-12-20 23:14:16 UTC (rev 23251)
+++ 
core3/table-browser-impl/trunk/src/main/java/org/cytoscape/browser/internal/MyTableCellRenderer.java
        2010-12-21 00:16:04 UTC (rev 23252)
@@ -1,63 +0,0 @@
-package org.cytoscape.browser.internal;
-
-
-import java.awt.Color;
-import java.awt.Component;
-import javax.swing.JLabel;
-import javax.swing.JTable;
-import javax.swing.table.TableCellRenderer;
-
-
-public class MyTableCellRenderer extends JLabel implements TableCellRenderer {
-       // This method is called each time a cell in a column
-       // using this renderer needs to be rendered.
-       @Override
-       public Component getTableCellRendererComponent(
-               final JTable table, final Object value, final boolean 
isSelected,
-               final boolean hasFocus, final int rowIndex, final int vColIndex)
-       {
-               if (isSelected) {
-                       // cell (and perhaps other cells) are selected
-                       setOpaque(true);
-                       setBackground(Color.GRAY);
-               }
-
-               if (hasFocus) {
-                       // this cell is the anchor and the table has the focus
-               }
-
-               // Configure the component with the specified value
-               final String text, tooltipText;
-               if (value == null)
-                       text = tooltipText = "";
-               else if (value instanceof ValidatedObjectAndEditString) {
-                       final ValidatedObjectAndEditString v = 
(ValidatedObjectAndEditString)value;
-                       final String errorText = v.getErrorText();
-                       if (errorText != null)
-                               text = errorText;
-                       else
-                               text = v.getValidatedObject().toString();
-                       tooltipText = v.getEditString();
-               } else
-                       text = tooltipText = value.toString();
-
-               setText(text);
-               setToolTipText(tooltipText);
-
-               // Since the renderer is a component, return itself
-               return this;
-       }
-
-       //
-       // The following methods override the defaults for performance reasons.
-       //
-
-       @Override
-       public void validate() { }
-
-       @Override
-       public void revalidate() { }
-
-       @Override
-       protected void firePropertyChange(String propertyName, Object oldValue, 
Object newValue) { }
-}

-- 
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