package org.jmeld.ui.dnd; import org.jmeld.JMeld; import org.jmeld.ui.util.ColorUtil; import org.jmeld.ui.util.Colors; import org.jmeld.util.StringUtil; import javax.swing.*; import java.awt.*; import java.awt.datatransfer.DataFlavor; import java.awt.datatransfer.Transferable; import java.awt.dnd.DropTarget; import java.awt.dnd.DropTargetDragEvent; import java.awt.dnd.DropTargetDropEvent; import java.awt.dnd.DropTargetEvent; import java.awt.event.*; import java.io.File; import java.net.URL; public class DragAndDropPanel extends JPanel { private JComponent leftDragAndDropArea; private JComponent rightDragAndDropArea; private String leftFileName = ""; private String rightFileName = ""; public DragAndDropPanel() { setOpaque(true); setBackground(Color.white); setBorder(BorderFactory.createCompoundBorder(BorderFactory .createLineBorder(Color.LIGHT_GRAY), BorderFactory.createEmptyBorder(3, 3, 3, 3))); setLayout(new BoxLayout(this, BoxLayout.X_AXIS)); leftDragAndDropArea = createDragAndDropArea(); rightDragAndDropArea = createDragAndDropArea(); add(leftDragAndDropArea); add(Box.createRigidArea(new Dimension(3, 0))); add(rightDragAndDropArea); addHierarchyListener(getHierarchyListener()); addMouseListener(getMouseListener()); } private HierarchyListener getHierarchyListener() { return new HierarchyListener() { public void hierarchyChanged(HierarchyEvent e) { JRootPane rootPane; if ((e.getChangeFlags() & e.PARENT_CHANGED) != 0) { rootPane = getRootPane(); if (rootPane == null) { return; } rootPane.setDropTarget(getDragAndDropTarget()); } } }; } private DropTarget getDragAndDropTarget() { return new DropTarget() { Component orgGlassPane; JPanel glassPane; public void dragEnter(DropTargetDragEvent dtde) { super.dragEnter(dtde); if (orgGlassPane == null) { glassPane = new JPanel(new GridLayout(0, 2, 40, 40)); glassPane.setBorder(BorderFactory.createEmptyBorder(60, 10, 40, 10)); glassPane.setOpaque(false); glassPane.add(createDropPane(leftFileName)); glassPane.add(createDropPane(rightFileName)); orgGlassPane = getRootPane().getGlassPane(); getRootPane().setGlassPane(glassPane); glassPane.setVisible(true); getRootPane().repaint(); } } private JPanel createDropPane(String text) { JPanel p; JLabel label; label = new JLabel(text); label.setOpaque(false); label.setHorizontalAlignment(JLabel.LEFT); label.setVerticalAlignment(JLabel.TOP); label.setFont(label.getFont().deriveFont(16.0f)); p = new JPanel(new BorderLayout()); p.add(label, BorderLayout.CENTER); p.setBackground(new Color(238, 227, 187, 200)); p.setBorder(BorderFactory.createCompoundBorder(BorderFactory .createLineBorder(Color.GRAY), BorderFactory.createEmptyBorder(10, 10, 10, 10))); return p; } public void dragOver(DropTargetDragEvent dtde) { super.dragOver(dtde); } public void dragExit(DropTargetEvent dte) { super.dragExit(dte); resetGlassPane(); } private void resetGlassPane() { if (orgGlassPane != null) { getRootPane().setGlassPane(orgGlassPane); orgGlassPane.setVisible(false); orgGlassPane = null; } } public void drop(DropTargetDropEvent dtde) { Rectangle b; Point p; boolean left; String fileName; b = getRootPane().getBounds(); p = dtde.getLocation(); fileName = getFileName(dtde); if (StringUtil.isEmpty(fileName)) { return; } left = p.x < (b.width - b.x) / 2; if (left) { leftDragAndDropArea.setBackground(Colors.DND_SELECTED_NEW); leftFileName = fileName; } else { rightDragAndDropArea.setBackground(Colors.DND_SELECTED_NEW); rightFileName = fileName; } resetGlassPane(); } private String getFileName(DropTargetDropEvent dtde) { Transferable t; Object data; DataFlavor[] dataFlavors; String fileName; t = dtde.getTransferable(); dataFlavors = t.getTransferDataFlavors(); if (dataFlavors == null) { return null; } dtde.acceptDrop(dtde.getSourceActions()); try { // Simplistic method that searches for a string which // starts with the prefix "file:" for (DataFlavor dataFlavor : dataFlavors) { data = t.getTransferData(dataFlavor); if (data.getClass() != String.class) { continue; } fileName = (String) data; if (fileName.startsWith("file:")) { return fileName; } } } catch (Exception e) { e.printStackTrace(); } return null; } }; } private JComponent createDragAndDropArea() { JPanel p; p = new JPanel(); p.setOpaque(true); p.setBorder(BorderFactory.createLineBorder(Color.LIGHT_GRAY)); p.setBackground(ColorUtil.brighter(Color.LIGHT_GRAY)); p.setPreferredSize(new Dimension(20, 0)); return p; } private MouseListener getMouseListener() { return new MouseAdapter() { public void mousePressed(MouseEvent me) { if (StringUtil.isEmpty(leftFileName) || StringUtil.isEmpty(rightFileName)) { return; } if (leftFileName.equals(rightFileName)) { return; } leftDragAndDropArea.setBackground(Colors.DND_SELECTED_USED); rightDragAndDropArea.setBackground(Colors.DND_SELECTED_USED); try { JMeld.getJMeldPanel().openComparison( new File(new URL(leftFileName).toURI()).getAbsolutePath(), new File(new URL(rightFileName).toURI()).getAbsolutePath()); } catch (Exception ex) { ex.printStackTrace(); } } }; } }