protected void onCopyVertical(JTable table) {
        StringBuffer sbf = new StringBuffer();
        // Check to ensure we have selected only a contiguous block of cells
        int numcols = table.getSelectedColumnCount();
        int numrows = table.getSelectedRowCount();
        if (numcols == 0 || numrows == 0)
            return;
        int[] rowsselected = table.getSelectedRows();
        int[] colsselected = table.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 < numcols; ++i) {
        	for (int j = 0; j < numrows; ++j) {
                sbf.append(table.getValueAt(rowsselected[j], colsselected[i]));
                if (j < numrows - 1)
                	sbf.append("\t");
            }
            sbf.append(eol);
        }
        stsel  = new StringSelection(sbf.toString());
        system = Toolkit.getDefaultToolkit().getSystemClipboard();
        system.setContents(stsel, stsel);
    }