/* * Copyright (c) Henrik Niehaus & Lazy Bones development team * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * 1. Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * 3. Neither the name of the project (Lazy Bones) nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ package lazybones.gui.settings.channelpanel.dnd; import java.awt.datatransfer.Transferable; import java.util.HashSet; import java.util.Set; import javax.swing.JComponent; import javax.swing.JList; import javax.swing.JTable; import javax.swing.table.DefaultTableModel; import org.hampelratte.svdrp.responses.highlevel.Channel; public class TableTransferHandler extends ChannelSetTransferHandler { private int[] rows = null; private int addCount = 0; // Number of items added. private JList<Channel> channelList; private Set<Channel> overwrittenChannels = new HashSet<Channel>(); public TableTransferHandler(JList<Channel> channelList) { this.channelList = channelList; } @Override protected ChannelSet<Channel> exportChannels(JComponent c) { addCount = 0; JTable table = (JTable) c; rows = table.getSelectedRows(); ChannelSet<Channel> channelSet = new ChannelSet<Channel>(); for (int i = 0; i < rows.length; i++) { channelSet.add((Channel) table.getValueAt(rows[i], 1)); } return channelSet; } @Override protected void importChannels(JComponent c, ChannelSet<Channel> set) { JTable target = (JTable) c; DefaultTableModel model = (DefaultTableModel) target.getModel(); int index = target.getSelectedRow(); // Prevent the user from dropping data back on itself. // For example, if the user is moving rows #4,#5,#6 and #7 and // attempts to insert the rows after row #5, this would // be problematic when removing the original rows. // So this is not allowed. if (rows != null && index >= rows[0] - 1 && index <= rows[rows.length - 1]) { rows = null; return; } int max = model.getRowCount(); if (index < 0) { index = max; } addCount = set.size(); overwrittenChannels.clear(); for (Channel chan : set) { Object o = model.getValueAt(index, 1); if (o != null) { overwrittenChannels.add((Channel) o); } model.setValueAt(chan, index, 1); index++; } // move overwritten to list if (overwrittenChannels.size() > 0) { ListTransferHandler lth = (ListTransferHandler) channelList.getTransferHandler(); lth.setOverwrittenChannels(overwrittenChannels); } } @Override protected void cleanup(JComponent c, Transferable data, boolean remove) { JTable source = (JTable) c; if (remove && rows != null) { DefaultTableModel model = (DefaultTableModel) source.getModel(); // If we are moving items around in the same table, we // move the overwritten channels to the arisen empty cells // else remove them if (addCount > 0) { int i = 0; for (Channel chan : overwrittenChannels) { model.setValueAt(chan, rows[i++], 1); } } else { for (int i = rows.length - 1; i >= 0; i--) { model.setValueAt(null, rows[i], 1); } } } rows = null; addCount = 0; } }