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.