Author: jm
Date: 2012-08-03 11:27:28 -0700 (Fri, 03 Aug 2012)
New Revision: 30083
Modified:
core3/impl/trunk/table-browser-impl/src/main/java/org/cytoscape/browser/internal/BrowserTable.java
Log:
Fixes #1279: Now we can copy table data and paste directly into Excel. Also
includes support for list attributes as multi-line cells.
Modified:
core3/impl/trunk/table-browser-impl/src/main/java/org/cytoscape/browser/internal/BrowserTable.java
===================================================================
---
core3/impl/trunk/table-browser-impl/src/main/java/org/cytoscape/browser/internal/BrowserTable.java
2012-08-03 15:59:44 UTC (rev 30082)
+++
core3/impl/trunk/table-browser-impl/src/main/java/org/cytoscape/browser/internal/BrowserTable.java
2012-08-03 18:27:28 UTC (rev 30083)
@@ -11,6 +11,7 @@
import java.awt.Window;
import java.awt.datatransfer.Clipboard;
import java.awt.datatransfer.StringSelection;
+import java.awt.datatransfer.Transferable;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
@@ -21,6 +22,7 @@
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.util.ArrayList;
+import java.util.Collection;
import java.util.EventObject;
import java.util.HashMap;
import java.util.HashSet;
@@ -40,6 +42,7 @@
import javax.swing.KeyStroke;
import javax.swing.ListSelectionModel;
import javax.swing.SwingUtilities;
+import javax.swing.TransferHandler;
import javax.swing.border.Border;
import javax.swing.border.TitledBorder;
import javax.swing.table.JTableHeader;
@@ -108,6 +111,7 @@
getPopupMenu();
getHeaderPopupMenu();
setKeyStroke();
+ setTransferHandler(new BrowserTableTransferHandler());
}
public void setUpdateComparators(final boolean updateColumnComparators)
{
@@ -624,4 +628,55 @@
super.paint(graphics);
}
}
+
+ private static class BrowserTableTransferHandler extends
TransferHandler {
+ @Override
+ protected Transferable createTransferable(JComponent source) {
+ // Encode cell data in Excel format so we can
copy/paste list
+ // attributes as multi-line cells.
+ StringBuilder builder = new StringBuilder();
+ BrowserTable table = (BrowserTable) source;
+ for (int rowIndex : table.getSelectedRows()) {
+ boolean firstColumn = true;
+ for (int columnIndex :
table.getSelectedColumns()) {
+ if (!firstColumn) {
+ builder.append("\t");
+ } else {
+ firstColumn = false;
+ }
+ Object object =
table.getValueAt(rowIndex, columnIndex);
+ if (object instanceof
ValidatedObjectAndEditString) {
+ ValidatedObjectAndEditString
raw = (ValidatedObjectAndEditString) object;
+ Object validatedObject =
raw.getValidatedObject();
+ if (validatedObject instanceof
Collection) {
+ builder.append("\"");
+ boolean firstRow = true;
+ for (Object member :
(Collection<?>) validatedObject) {
+ if (!firstRow) {
+
builder.append("\r");
+ } else {
+
firstRow = false;
+ }
+
builder.append(member.toString().replaceAll("\"", "\"\""));
+ }
+ builder.append("\"");
+ } else {
+
builder.append(validatedObject.toString());
+ }
+ } else {
+ if (object != null) {
+
builder.append(object.toString());
+ }
+ }
+ }
+ builder.append("\n");
+ }
+ return new StringSelection(builder.toString());
+ }
+
+ @Override
+ public int getSourceActions(JComponent c) {
+ return TransferHandler.COPY;
+ }
+ }
}
--
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.