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.