import java.awt.datatransfer.Transferable;\r
import java.awt.datatransfer.UnsupportedFlavorException;\r
import java.awt.dnd.DnDConstants;\r
+import java.awt.dnd.DragGestureEvent;\r
+import java.awt.dnd.DragGestureListener;\r
+import java.awt.dnd.DragSource;\r
+import java.awt.dnd.DragSourceAdapter;\r
+import java.awt.dnd.DragSourceDropEvent;\r
+import java.awt.dnd.DragSourceListener;\r
import java.awt.dnd.DropTarget;\r
import java.awt.dnd.DropTargetDragEvent;\r
import java.awt.dnd.DropTargetDropEvent;\r
import javax.swing.DefaultListModel;\r
import javax.swing.JButton;\r
import javax.swing.JComponent;\r
-import javax.swing.JFileChooser;\r
import javax.swing.JList;\r
import javax.swing.JOptionPane;\r
import javax.swing.JPanel;\r
import javax.swing.JScrollPane;\r
-import javax.swing.SwingUtilities;\r
import javax.swing.event.ListSelectionEvent;\r
import javax.swing.event.ListSelectionListener;\r
import javax.swing.filechooser.FileFilter;\r
public class TargetSelectionPane extends JPanel{\r
private static final long serialVersionUID = 3209435745432235432L;\r
\r
- private CurrentDirectoryHolder currentDirectoryHolder;\r
+ private StigmataFrame stigmata;\r
\r
private FileFilter[] filters;\r
\r
\r
private JButton removeButton;\r
\r
- public TargetSelectionPane(CurrentDirectoryHolder cdh){\r
- this.currentDirectoryHolder = cdh;\r
+ public TargetSelectionPane(StigmataFrame stigmata){\r
+ this.stigmata = stigmata;\r
initComponents();\r
list.setModel(model);\r
\r
DropTarget dropTarget = new TargetSelectionDropTarget();\r
list.setDropTarget(dropTarget);\r
+ DragSource dragSource = DragSource.getDefaultDragSource();\r
+ dragSource.createDefaultDragGestureRecognizer(\r
+ list, DnDConstants.ACTION_MOVE, new TargetDragGestureListener(list, model)\r
+ );\r
}\r
\r
public void addDataChangeListener(DataChangeListener listener){\r
}\r
\r
private void addButtonActionPerformed(ActionEvent evt){\r
- JFileChooser chooser = new JFileChooser(currentDirectoryHolder.getCurrentDirectory());\r
- FileFilter[] filters = getFileFilters();\r
+ File[] files = stigmata.openFiles(getFileFilters(), true, true);\r
+ for(File file : files){\r
+ addValue(file.getPath());\r
+ }\r
+ }\r
+\r
+ private class TargetDragGestureListener implements DragGestureListener{\r
+ private JList list;\r
\r
- for(FileFilter filter: filters){\r
- chooser.addChoosableFileFilter(filter);\r
+ public TargetDragGestureListener(JList list, DefaultListModel model){\r
+ this.list = list;\r
}\r
- chooser.setMultiSelectionEnabled(isMultipleSelectable());\r
- if(isDirectorySelectable()){\r
- chooser.setFileSelectionMode(JFileChooser.FILES_AND_DIRECTORIES);\r
+\r
+ public void dragGestureRecognized(DragGestureEvent dge){\r
+ int[] indeces = list.getSelectedIndices();\r
+ if(indeces.length > 0){\r
+ String[] strings = new String[indeces.length];\r
+ for(int i = 0; i < strings.length; i++){\r
+ strings[i] = (String)model.getElementAt(indeces[i]);\r
+ }\r
+ Transferable transferable = new TargetTransferable(strings);\r
+ DragSourceListener listener = new DataRemoveWhenDragSuccessfulAdapter(model, indeces);\r
+ \r
+ dge.startDrag(DragSource.DefaultMoveDrop, transferable, listener);\r
+ }\r
+ }\r
+ };\r
+\r
+ private class DataRemoveWhenDragSuccessfulAdapter extends DragSourceAdapter{\r
+ private DefaultListModel model;\r
+ private int[] indeces;\r
+\r
+ public DataRemoveWhenDragSuccessfulAdapter(DefaultListModel model, int[] indeces){\r
+ this.model = model;\r
+ this.indeces = indeces;\r
}\r
- int returnCode = chooser.showOpenDialog(SwingUtilities.getRootPane(this));\r
- if(returnCode == JFileChooser.APPROVE_OPTION){\r
- currentDirectoryHolder.setCurrentDirectory(chooser.getCurrentDirectory());\r
- File[] files = chooser.getSelectedFiles();\r
- for(File file : files){\r
- addValue(file.getPath());\r
+\r
+ @Override\r
+ public void dragDropEnd(DragSourceDropEvent dsde){\r
+ for(int i = indeces.length - 1; i >= 0; i--){\r
+ model.removeElementAt(indeces[i]);\r
}\r
+ fireEvent();\r
+ super.dragDropEnd(dsde);\r
}\r
- }\r
+ };\r
+\r
+ private class TargetTransferable implements Transferable{\r
+ private String[] strings;\r
+\r
+ public TargetTransferable(String[] strings){\r
+ this.strings = strings;\r
+ }\r
+\r
+ public Object getTransferData(DataFlavor flavor) throws UnsupportedFlavorException, IOException{\r
+ List<File> list = new ArrayList<File>();\r
+ for(int i = 0; i < strings.length; i++){\r
+ list.add(new File(strings[i]));\r
+ }\r
+ return list;\r
+ }\r
+\r
+ public DataFlavor[] getTransferDataFlavors(){\r
+ return new DataFlavor[] { DataFlavor.javaFileListFlavor, };\r
+ }\r
+\r
+ public boolean isDataFlavorSupported(DataFlavor flavor){\r
+ return flavor.equals(DataFlavor.javaFileListFlavor);\r
+ }\r
+ };\r
\r
private class TargetSelectionDropTarget extends DropTarget{\r
private static final long serialVersionUID = 3204457621345L;\r
try{\r
if(trans.isDataFlavorSupported(DataFlavor.javaFileListFlavor)){\r
List list = (List)trans.getTransferData(DataFlavor.javaFileListFlavor);\r
- filters = getFileFilters();\r
- List<String> errorList = new ArrayList<String>();\r
- for(int i = 0; i < list.size(); i++){\r
- File file = (File)list.get(i);\r
- boolean neverAddedFlag = true;\r
- for(FileFilter filter: filters){\r
- if(filter.accept(file)){\r
- addValue(file.getPath());\r
- neverAddedFlag = false;\r
- }\r
- }\r
- if(neverAddedFlag){\r
- errorList.add(file.getName());\r
- }\r
- }\r
+ List<String> errorList = checkAndAddDroppedFile(list);\r
if(errorList.size() > 0){\r
- StringBuilder builder = new StringBuilder("<html><body>");\r
- builder.append(Messages.getString("unsupportedfiletype.dialog.message"));\r
- builder.append("<ul>");\r
- for(int i = 0; i < errorList.size(); i++){\r
- builder.append("<li>").append(errorList.get(i)).append("</li>");\r
- }\r
- builder.append("</ul></body></html>");\r
- JOptionPane.showMessageDialog(\r
- TargetSelectionPane.this, new String(builder),\r
- Messages.getString("unsupportedfiletype.dialog.title"),\r
- JOptionPane.ERROR_MESSAGE\r
- );\r
+ showError(errorList);\r
}\r
}\r
}\r
catch(IOException e){\r
}\r
}\r
+\r
+ private List<String> checkAndAddDroppedFile(List list){\r
+ List<String> errorList = new ArrayList<String>();\r
+\r
+ FileFilter[] filters = getFileFilters();\r
+ for(int i = 0; i < list.size(); i++){\r
+ File file = (File)list.get(i);\r
+ boolean neverAddedFlag = true;\r
+ for(FileFilter filter: filters){\r
+ if(filter.accept(file)){\r
+ addValue(file.getPath());\r
+ neverAddedFlag = false;\r
+ }\r
+ }\r
+ if(neverAddedFlag){\r
+ errorList.add(file.getName());\r
+ }\r
+ }\r
+ return errorList;\r
+ }\r
+\r
+ private void showError(List<String> errorList){\r
+ StringBuilder builder = new StringBuilder("<html><body>");\r
+ builder.append(Messages.getString("unsupportedfiletype.dialog.message"));\r
+ builder.append("<ul>");\r
+ for(int i = 0; i < errorList.size(); i++){\r
+ builder.append("<li>").append(errorList.get(i)).append("</li>");\r
+ }\r
+ builder.append("</ul></body></html>");\r
+ JOptionPane.showMessageDialog(\r
+ TargetSelectionPane.this, new String(builder),\r
+ Messages.getString("unsupportedfiletype.dialog.title"),\r
+ JOptionPane.ERROR_MESSAGE\r
+ );\r
+ }\r
}\r
}\r