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.

Reply via email to