/* * Copyright 2011 Uwe Krueger. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.mandelsoft.swing; import java.awt.datatransfer.Transferable; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import javax.swing.DropMode; import javax.swing.JComponent; import javax.swing.ListSelectionModel; import javax.swing.TransferHandler; import javax.swing.table.DefaultTableModel; import javax.swing.table.TableColumnModel; import javax.swing.table.TableModel; /** * * @author Uwe Krüger */ public class DnDJTable extends IJTable { static public boolean debug=false; private TableTransferHandler transfer; public DnDJTable() { super(new DefaultModel()); setup(); } public DnDJTable(DnDTableModel dm, TableColumnModel cm, ListSelectionModel sm) { super(dm, cm, sm); setup(); } public DnDJTable(DnDTableModel dm, TableColumnModel cm) { super(dm, cm); setup(); } public DnDJTable(DnDTableModel dm) { super(dm); setup(); } private void setup() { setTransferHandler(transfer=createTableTransferHandler()); setDropMode(); } @Override public DnDTableModel getModel() { return (DnDTableModel)super.getModel(); } @Override public void setModel(TableModel dataModel) { setModel((DnDTableModel)dataModel); } public void setModel(DnDTableModel dataModel) { super.setModel(dataModel); setDropMode(); } private void setDropMode() { DropMode mode=null; if (getModel()!=null) mode=getModel().getDropMode(); if (mode!=null) { setDragEnabled(true); setDropMode(mode); } else { setDragEnabled(false); } } protected TableTransferHandler createTableTransferHandler() { return new TableTransferHandler(); } ///////////////////////////////////////////////////////////////////////// // Default Model ///////////////////////////////////////////////////////////////////////// public static class DefaultModel extends DefaultTableModel implements DnDTableModel { public DropMode getDropMode() { return null; } public int getSourceActions() { return 0; } public Transferable createTransferable(DragLocation loc) { return null; } public void exportDone(Transferable data, int action) { throw new UnsupportedOperationException("Not supported yet."); } public boolean canImport(TransferSupport info) { return false; } public boolean importData(TransferSupport info) { throw new UnsupportedOperationException("Not supported yet."); } } ///////////////////////////////////////////////////////////////////////// // drag'n drop ///////////////////////////////////////////////////////////////////////// protected class TableTransferHandler extends TransferHandler { private Transferable trans=null; /** * We only support importing strings. */ @Override public boolean canImport(TransferHandler.TransferSupport info) { return ((DnDJTable)info.getComponent()).getModel(). canImport(new DnDTableModel.TransferSupport(info)); } /** * Bundle up the selected items in a single list for export. * Each line is separated by a newline. */ @Override protected Transferable createTransferable(JComponent c) { return trans=((DnDJTable)c).getModel(). createTransferable(new DnDTableModel.DragLocation((DnDJTable)c)); } /** * We support both copy and move actions. */ @Override public int getSourceActions(JComponent c) { return ((DnDJTable)c).getModel().getSourceActions(); } /** * Perform the actual import. This demo only supports drag and drop. */ @Override public boolean importData(TransferHandler.TransferSupport info) { if (!info.isDrop()) { return false; } if (((DnDJTable)info.getComponent()).getModel(). importData(new DnDTableModel.TransferSupport(info))) { return true; } else { //trans=null; return false; } } /** * Remove the items moved from the list. */ @Override protected void exportDone(JComponent c, Transferable data, int action) { if (trans!=null) ((DnDJTable)c).getModel().exportDone(trans, action); trans=null; } } /////////////////////////////////////////////////////////////////////// // Context Menu /////////////////////////////////////////////////////////////////////// private class Listener extends MouseAdapter { @Override public void mouseReleased(MouseEvent e) { handlePopup(e); } @Override public void mousePressed(MouseEvent e) { handlePopup(e); } public void handlePopup(MouseEvent e) { if (e.isPopupTrigger()&&ctxmenu!=null) { // find row of click and int row=rowAtPoint(e.getPoint()); // find column of click and int col=columnAtPoint(e.getPoint()); TableSelection sel=new TableSelection(DnDJTable.this,row,col); if (debug) System.out.println("CTX POPUP at "+sel); ctxmenu.handleContextMenu(DnDJTable.this, e, sel); } } } public interface ContextMenuHandler { void handleContextMenu(JComponent comp, MouseEvent evt, Selection sel); } private ContextMenuHandler ctxmenu; private Listener listener; synchronized public void setContextMenuHandler(ContextMenuHandler h) { if (h==null) { if (ctxmenu!=null) removeMouseListener(listener); } else { if (ctxmenu==null) { if (listener==null) listener=new Listener(); addMouseListener(listener); } } ctxmenu=h; } }