summaryrefslogtreecommitdiff
path: root/source/com/c2kernel/gui/tabs/outcome/form/MultiLinePasteAdapter.java
diff options
context:
space:
mode:
Diffstat (limited to 'source/com/c2kernel/gui/tabs/outcome/form/MultiLinePasteAdapter.java')
-rwxr-xr-xsource/com/c2kernel/gui/tabs/outcome/form/MultiLinePasteAdapter.java133
1 files changed, 133 insertions, 0 deletions
diff --git a/source/com/c2kernel/gui/tabs/outcome/form/MultiLinePasteAdapter.java b/source/com/c2kernel/gui/tabs/outcome/form/MultiLinePasteAdapter.java
new file mode 100755
index 0000000..d9f6b55
--- /dev/null
+++ b/source/com/c2kernel/gui/tabs/outcome/form/MultiLinePasteAdapter.java
@@ -0,0 +1,133 @@
+package com.c2kernel.gui.tabs.outcome.form;
+import java.awt.*;
+import java.awt.event.*;
+import javax.swing.*;
+
+import com.c2kernel.utils.Logger;
+
+import java.awt.datatransfer.*;
+import java.util.*;
+/**
+* ExcelAdapter enables Copy-Paste Clipboard functionality on JTables.
+* The clipboard data format used by the adapter is compatible with
+* the clipboard format used by Excel. This provides for clipboard
+* interoperability between enabled JTables and Excel.
+*/
+public class MultiLinePasteAdapter implements ActionListener {
+ private String rowstring, value;
+ private Clipboard system;
+ private StringSelection stsel;
+ private JTable jTable1;
+ private Dimension parent;
+ /**
+ * The Excel Adapter is constructed with a
+ * JTable on which it enables Copy-Paste and acts
+ * as a Clipboard listener.
+ */
+ public MultiLinePasteAdapter(JTable myJTable, Dimension parent) {
+ jTable1 = myJTable;
+ this.parent = parent;
+ KeyStroke copy =
+ KeyStroke.getKeyStroke(KeyEvent.VK_C, ActionEvent.CTRL_MASK, false);
+ // Identifying the copy KeyStroke user can modify this
+ // to copy on some other Key combination.
+ KeyStroke paste =
+ KeyStroke.getKeyStroke(KeyEvent.VK_V, ActionEvent.CTRL_MASK, false);
+ // Identifying the Paste KeyStroke user can modify this
+ //to copy on some other Key combination.
+ jTable1.registerKeyboardAction(
+ this,
+ "Copy",
+ copy,
+ JComponent.WHEN_FOCUSED);
+ jTable1.registerKeyboardAction(
+ this,
+ "Paste",
+ paste,
+ JComponent.WHEN_FOCUSED);
+ system = Toolkit.getDefaultToolkit().getSystemClipboard();
+ }
+ /**
+ * Public Accessor methods for the Table on which this adapter acts.
+ */
+ public JTable getJTable() {
+ return jTable1;
+ }
+ public void setJTable(JTable jTable1) {
+ this.jTable1 = jTable1;
+ }
+ /**
+ * This method is activated on the Keystrokes we are listening to
+ * in this implementation. Here it listens for Copy and Paste ActionCommands.
+ * Selections comprising non-adjacent cells result in invalid selection and
+ * then copy action cannot be performed.
+ * Paste is done by aligning the upper left corner of the selection with the
+ * 1st element in the current selection of the JTable.
+ */
+ public void actionPerformed(ActionEvent e) {
+ if (e.getActionCommand().compareTo("Copy") == 0) {
+ StringBuffer sbf = new StringBuffer();
+ // Check to ensure we have selected only a contiguous block of
+ // cells
+ int numcols = jTable1.getSelectedColumnCount();
+ int numrows = jTable1.getSelectedRowCount();
+ int[] rowsselected = jTable1.getSelectedRows();
+ int[] colsselected = jTable1.getSelectedColumns();
+ if (!((numrows - 1
+ == rowsselected[rowsselected.length - 1] - rowsselected[0]
+ && numrows == rowsselected.length)
+ && (numcols - 1
+ == colsselected[colsselected.length - 1] - colsselected[0]
+ && numcols == colsselected.length))) {
+ JOptionPane.showMessageDialog(
+ null,
+ "Invalid Copy Selection",
+ "Invalid Copy Selection",
+ JOptionPane.ERROR_MESSAGE);
+ return;
+ }
+ for (int i = 0; i < numrows; i++) {
+ for (int j = 0; j < numcols; j++) {
+ sbf.append(
+ jTable1.getValueAt(rowsselected[i], colsselected[j]));
+ if (j < numcols - 1)
+ sbf.append("\t");
+ }
+ sbf.append("\n");
+ }
+ stsel = new StringSelection(sbf.toString());
+ system = Toolkit.getDefaultToolkit().getSystemClipboard();
+ system.setContents(stsel, stsel);
+ }
+ if (e.getActionCommand().compareTo("Paste") == 0) {
+ Logger.msg(5, "Trying to Paste");
+ int startRow = (jTable1.getSelectedRows())[0];
+ int startCol = (jTable1.getSelectedColumns())[0];
+ try {
+ String trstring =
+ (String) (system.getContents(this).getTransferData(DataFlavor.stringFlavor));
+ Logger.msg(8, "String is:" + trstring);
+ StringTokenizer st1 = new StringTokenizer(trstring, "\n\r");
+ for (int i = 0; st1.hasMoreTokens(); i++) {
+ rowstring = st1.nextToken();
+ StringTokenizer st2 = new StringTokenizer(rowstring, "\t");
+ for (int j = 0; st2.hasMoreTokens(); j++) {
+ value = st2.nextToken();
+ if (startRow + i == jTable1.getRowCount())
+ parent.addRow(startRow+i);
+ if (startRow + i < jTable1.getRowCount()
+ && startCol + j < jTable1.getColumnCount())
+ jTable1.setValueAt(
+ value,
+ startRow + i,
+ startCol + j);
+ Logger.msg(5, "Putting "+value+" at row="+(startRow+i)+" column="+(startCol+j));
+ }
+ }
+ } catch (Exception ex) {
+ Logger.exceptionDialog(ex);
+ }
+
+ }
+ }
+}