/* * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You 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 ro.nextreports.designer.querybuilder.table; import java.awt.Component; import java.awt.Point; import java.awt.datatransfer.DataFlavor; import java.awt.datatransfer.Transferable; import java.awt.dnd.DnDConstants; import java.awt.dnd.DropTargetDragEvent; import java.awt.dnd.DropTargetDropEvent; import java.awt.dnd.DropTargetEvent; import java.awt.dnd.DropTargetListener; import java.awt.event.InputEvent; import java.awt.event.MouseEvent; import java.io.Serializable; import java.util.List; import java.util.Vector; import javax.swing.JComponent; import javax.swing.JTable; import javax.swing.TransferHandler; import ro.nextreports.designer.Globals; import ro.nextreports.designer.querybuilder.DesignerTablePanel; import ro.nextreports.engine.querybuilder.MyRow; import ro.nextreports.engine.querybuilder.sql.Column; import ro.nextreports.engine.querybuilder.sql.SelectQuery; /** * @author Decebal Suiu */ public class DataObjectTransferHandler extends TransferHandler { private static DropHandler dropHandler = new DropHandler(); private DataFlavor dataFlavor; private Point dragPoint; private Point dropPoint; private Component dragComponent; private Component dropComponent; private SelectQuery selectQuery; public DataObjectTransferHandler(DataFlavor dataFlavor, SelectQuery selectQuery) { super(); this.dataFlavor = dataFlavor; this.selectQuery = selectQuery; } public Point getDropPoint() { return dropPoint; } public void setDropPoint(Point dropPoint) { this.dropPoint = dropPoint; } public Component getDragComponent() { return dragComponent; } public void setDragComponent(Component dragComponent) { this.dragComponent = dragComponent; } public Point getDragPoint() { return dragPoint; } public void setDragPoint(Point dragPoint) { this.dragPoint = dragPoint; } public Component getDropComponent() { return dropComponent; } public void setDropComponent(Component dropComponent) { this.dropComponent = dropComponent; } @Override public int getSourceActions(JComponent c) { return DnDConstants.ACTION_COPY_OR_MOVE; } @Override public boolean canImport(JComponent c, DataFlavor[] dataFlavors) { if (c.isEnabled() && (c instanceof JTable)) { for (DataFlavor dataFlavor : dataFlavors) { if (dataFlavor.equals(this.dataFlavor)) { return true; } } } return false; } @Override public void exportAsDrag(JComponent c, InputEvent event, int action) { setDragComponent(c); setDragPoint(((MouseEvent) event).getPoint()); super.exportAsDrag(c, event, action); } protected Transferable createTransferable(JComponent c) { Transferable transferable = null; if (c instanceof JTable) { JTable table = (JTable) c; int[] rows = table.getSelectedRows(); Vector<Object> selectedRows = new Vector<Object>(); for (int row : rows) { Object object = ((DesignerTablePanel.MyTableModel) table.getModel()).getObjectForRow(row); selectedRows.add(object); } transferable = new ListTransferable(selectedRows, dataFlavor); } return transferable; } @Override public boolean importData(JComponent c, Transferable transferable) { if (!canImport(c, transferable.getTransferDataFlavors())) { return false; } try { if (getDragComponent() != c) { List list = (List) transferable.getTransferData(dataFlavor); JTable table = (JTable) c; DesignerTablePanel.MyTableModel model = ((DesignerTablePanel.MyTableModel) table.getModel()); int insertRow; if (getDropPoint() != null) { insertRow = table.rowAtPoint(getDropPoint()); } else { insertRow = table.getSelectedRow(); } for (int i = 0; i < list.size(); i++) { model.insertRow(insertRow + i, (Vector) list.get(i)); } table.getSelectionModel().clearSelection(); table.getSelectionModel().setSelectionInterval(insertRow, insertRow + list.size() - 1); table.requestFocus(); } return true; } catch (Exception e) { e.printStackTrace(); return false; } } @Override protected void exportDone(JComponent source, Transferable transferable, int action) { if (action != DnDConstants.ACTION_MOVE) { return; } try { List list = (List) transferable.getTransferData(dataFlavor); JTable table = (JTable) source; DesignerTablePanel.MyTableModel model = ((DesignerTablePanel.MyTableModel) table.getModel()); if (source != getDropComponent()) { int index; for (int i = 0; i < list.size(); i++) { index = model.getRowForObject(list.get(i)); model.removeRow(index); } } else { int index; int insertRow = table.rowAtPoint(getDropPoint()); for (int i = 0; i < list.size(); i++) { MyRow objectFrom = (MyRow) list.get(i); index = model.getRowForObject(objectFrom); Column from = objectFrom.column; if (insertRow + i == -1) { continue; } MyRow objectTo = (MyRow) model.getObjectForRow(insertRow + i); Column to = objectTo.column; model.moveRow(index, index, insertRow + i); selectQuery.moveColumn(from, selectQuery.getColumnIndex(to)); Globals.getMainFrame().getQueryBuilderPanel().getDesignPanel().updateGroupByItems(index, insertRow+i); } } } catch (Exception e) { e.printStackTrace(); } } public static DropHandler getDropHandler() { return dropHandler; } static class DropHandler implements DropTargetListener, Serializable { private boolean canImport; private boolean actionSupported(int action) { return (action & DnDConstants.ACTION_COPY_OR_MOVE ) != DnDConstants.ACTION_NONE; } public void dragEnter(DropTargetDragEvent event) { DataFlavor[] dataFlavors = event.getCurrentDataFlavors(); JComponent c = (JComponent) event.getDropTargetContext().getComponent(); TransferHandler transferHandler = c.getTransferHandler(); if ((transferHandler != null) && transferHandler.canImport(c, dataFlavors)) { canImport = true; } else { canImport = false; } int dropAction = event.getDropAction(); if (canImport && actionSupported(dropAction)) { event.acceptDrag(dropAction); } else { event.rejectDrag(); } } public void dragOver(DropTargetDragEvent event) { int dropAction = event.getDropAction(); if (canImport && actionSupported(dropAction)) { JTable table = (JTable) event.getDropTargetContext().getComponent(); int row = table.rowAtPoint(event.getLocation()); table.getSelectionModel().setSelectionInterval(row, row); event.acceptDrag(dropAction); } else { event.rejectDrag(); } } public void dragExit(DropTargetEvent event) { } public void drop(DropTargetDropEvent event) { int dropAction = event.getDropAction(); JComponent c = (JComponent) event.getDropTargetContext().getComponent(); DataObjectTransferHandler transferHandler = (DataObjectTransferHandler) c.getTransferHandler(); if (canImport && (transferHandler != null) && actionSupported(dropAction)) { event.acceptDrop(dropAction); try { Transferable transferable = event.getTransferable(); transferHandler.setDropPoint(event.getLocation()); transferHandler.setDropComponent(c); event.dropComplete(transferHandler.importData(c, transferable)); } catch (RuntimeException e) { event.dropComplete(false); } } else { event.rejectDrop(); } } public void dropActionChanged(DropTargetDragEvent event) { int dropAction = event.getDropAction(); if (canImport && actionSupported(dropAction)) { event.acceptDrag(dropAction); } else { event.rejectDrag(); } } } }