From dd0dec910430e049d7c855d752678ff3c2aad313 Mon Sep 17 00:00:00 2001 From: tama3 Date: Wed, 27 Jun 2007 08:58:40 +0000 Subject: [PATCH] remove CurrentDirectoryHolder class git-svn-id: svn+ssh://svn.sourceforge.jp/svnroot/stigmata/trunk@137 acee48c3-7b26-0410-bdac-b3d0e5314bbc --- .../stigmata/ui/swing/CurrentDirectoryHolder.java | 19 --- .../naist/se/stigmata/ui/swing/FileIOManager.java | 22 +++ .../naist/se/stigmata/ui/swing/StigmataFrame.java | 7 +- .../se/stigmata/ui/swing/TargetSelectionPane.java | 161 +++++++++++++++------ 4 files changed, 143 insertions(+), 66 deletions(-) delete mode 100644 src/main/java/jp/naist/se/stigmata/ui/swing/CurrentDirectoryHolder.java diff --git a/src/main/java/jp/naist/se/stigmata/ui/swing/CurrentDirectoryHolder.java b/src/main/java/jp/naist/se/stigmata/ui/swing/CurrentDirectoryHolder.java deleted file mode 100644 index 164f97d..0000000 --- a/src/main/java/jp/naist/se/stigmata/ui/swing/CurrentDirectoryHolder.java +++ /dev/null @@ -1,19 +0,0 @@ -package jp.naist.se.stigmata.ui.swing; - -/* - * $Id$ - */ - -import java.io.File; - -/** - * This interface has current directory. - * - * @author Haruaki Tamada - * @version $Revision$ $Date$ - */ -public interface CurrentDirectoryHolder { - public File getCurrentDirectory(); - - public void setCurrentDirectory(File file); -} diff --git a/src/main/java/jp/naist/se/stigmata/ui/swing/FileIOManager.java b/src/main/java/jp/naist/se/stigmata/ui/swing/FileIOManager.java index 6c6c2b8..c2b2f86 100644 --- a/src/main/java/jp/naist/se/stigmata/ui/swing/FileIOManager.java +++ b/src/main/java/jp/naist/se/stigmata/ui/swing/FileIOManager.java @@ -41,6 +41,28 @@ public class FileIOManager{ return findFile(open, new String[0], ""); } + public File[] openFiles(FileFilter[] filters, boolean multi, boolean directory){ + JFileChooser chooser = new JFileChooser(getCurrentDirectory()); + if(filters != null){ + for(int i = 0; i < filters.length; i++){ + chooser.addChoosableFileFilter(filters[0]); + } + } + chooser.setMultiSelectionEnabled(multi); + if(directory){ + chooser.setFileSelectionMode(JFileChooser.FILES_AND_DIRECTORIES); + } + else{ + chooser.setFileSelectionMode(JFileChooser.FILES_ONLY); + } + int returnValue = chooser.showOpenDialog(SwingUtilities.getRootPane(parent)); + if(returnValue == JFileChooser.APPROVE_OPTION){ + setCurrentDirectory(chooser.getCurrentDirectory()); + return chooser.getSelectedFiles(); + } + return new File[0]; + } + public File findFile(boolean open, String[] exts, String desc){ JFileChooser chooser = new JFileChooser(getCurrentDirectory()); if(exts != null){ diff --git a/src/main/java/jp/naist/se/stigmata/ui/swing/StigmataFrame.java b/src/main/java/jp/naist/se/stigmata/ui/swing/StigmataFrame.java index 2b37ac6..b882a92 100644 --- a/src/main/java/jp/naist/se/stigmata/ui/swing/StigmataFrame.java +++ b/src/main/java/jp/naist/se/stigmata/ui/swing/StigmataFrame.java @@ -33,6 +33,7 @@ import javax.swing.UIManager; import javax.swing.WindowConstants; import javax.swing.event.ChangeEvent; import javax.swing.event.ChangeListener; +import javax.swing.filechooser.FileFilter; import jp.naist.se.stigmata.BirthmarkContext; import jp.naist.se.stigmata.BirthmarkElementClassNotFoundException; @@ -56,7 +57,7 @@ import jp.naist.se.stigmata.ui.swing.tab.EditableTabbedPane; * @author Haruaki TAMADA * @version $Revision$ $Date$ */ -public class StigmataFrame extends JFrame implements CurrentDirectoryHolder{ +public class StigmataFrame extends JFrame{ private static final long serialVersionUID = 92345543665342134L; private JTabbedPane tabPane; @@ -115,6 +116,10 @@ public class StigmataFrame extends JFrame implements CurrentDirectoryHolder{ } } + public File[] openFiles(FileFilter[] filters, boolean multipleSelectable, boolean directorySelectable){ + return fileio.openFiles(filters, multipleSelectable, directorySelectable); + } + /** * Find file to open it. */ diff --git a/src/main/java/jp/naist/se/stigmata/ui/swing/TargetSelectionPane.java b/src/main/java/jp/naist/se/stigmata/ui/swing/TargetSelectionPane.java index 6cfb010..875d354 100644 --- a/src/main/java/jp/naist/se/stigmata/ui/swing/TargetSelectionPane.java +++ b/src/main/java/jp/naist/se/stigmata/ui/swing/TargetSelectionPane.java @@ -9,6 +9,12 @@ import java.awt.datatransfer.DataFlavor; import java.awt.datatransfer.Transferable; import java.awt.datatransfer.UnsupportedFlavorException; import java.awt.dnd.DnDConstants; +import java.awt.dnd.DragGestureEvent; +import java.awt.dnd.DragGestureListener; +import java.awt.dnd.DragSource; +import java.awt.dnd.DragSourceAdapter; +import java.awt.dnd.DragSourceDropEvent; +import java.awt.dnd.DragSourceListener; import java.awt.dnd.DropTarget; import java.awt.dnd.DropTargetDragEvent; import java.awt.dnd.DropTargetDropEvent; @@ -25,12 +31,10 @@ import javax.swing.Box; import javax.swing.DefaultListModel; import javax.swing.JButton; import javax.swing.JComponent; -import javax.swing.JFileChooser; import javax.swing.JList; import javax.swing.JOptionPane; import javax.swing.JPanel; import javax.swing.JScrollPane; -import javax.swing.SwingUtilities; import javax.swing.event.ListSelectionEvent; import javax.swing.event.ListSelectionListener; import javax.swing.filechooser.FileFilter; @@ -43,7 +47,7 @@ import javax.swing.filechooser.FileFilter; public class TargetSelectionPane extends JPanel{ private static final long serialVersionUID = 3209435745432235432L; - private CurrentDirectoryHolder currentDirectoryHolder; + private StigmataFrame stigmata; private FileFilter[] filters; @@ -65,13 +69,17 @@ public class TargetSelectionPane extends JPanel{ private JButton removeButton; - public TargetSelectionPane(CurrentDirectoryHolder cdh){ - this.currentDirectoryHolder = cdh; + public TargetSelectionPane(StigmataFrame stigmata){ + this.stigmata = stigmata; initComponents(); list.setModel(model); DropTarget dropTarget = new TargetSelectionDropTarget(); list.setDropTarget(dropTarget); + DragSource dragSource = DragSource.getDefaultDragSource(); + dragSource.createDefaultDragGestureRecognizer( + list, DnDConstants.ACTION_MOVE, new TargetDragGestureListener(list, model) + ); } public void addDataChangeListener(DataChangeListener listener){ @@ -254,25 +262,76 @@ public class TargetSelectionPane extends JPanel{ } private void addButtonActionPerformed(ActionEvent evt){ - JFileChooser chooser = new JFileChooser(currentDirectoryHolder.getCurrentDirectory()); - FileFilter[] filters = getFileFilters(); + File[] files = stigmata.openFiles(getFileFilters(), true, true); + for(File file : files){ + addValue(file.getPath()); + } + } + + private class TargetDragGestureListener implements DragGestureListener{ + private JList list; - for(FileFilter filter: filters){ - chooser.addChoosableFileFilter(filter); + public TargetDragGestureListener(JList list, DefaultListModel model){ + this.list = list; } - chooser.setMultiSelectionEnabled(isMultipleSelectable()); - if(isDirectorySelectable()){ - chooser.setFileSelectionMode(JFileChooser.FILES_AND_DIRECTORIES); + + public void dragGestureRecognized(DragGestureEvent dge){ + int[] indeces = list.getSelectedIndices(); + if(indeces.length > 0){ + String[] strings = new String[indeces.length]; + for(int i = 0; i < strings.length; i++){ + strings[i] = (String)model.getElementAt(indeces[i]); + } + Transferable transferable = new TargetTransferable(strings); + DragSourceListener listener = new DataRemoveWhenDragSuccessfulAdapter(model, indeces); + + dge.startDrag(DragSource.DefaultMoveDrop, transferable, listener); + } + } + }; + + private class DataRemoveWhenDragSuccessfulAdapter extends DragSourceAdapter{ + private DefaultListModel model; + private int[] indeces; + + public DataRemoveWhenDragSuccessfulAdapter(DefaultListModel model, int[] indeces){ + this.model = model; + this.indeces = indeces; } - int returnCode = chooser.showOpenDialog(SwingUtilities.getRootPane(this)); - if(returnCode == JFileChooser.APPROVE_OPTION){ - currentDirectoryHolder.setCurrentDirectory(chooser.getCurrentDirectory()); - File[] files = chooser.getSelectedFiles(); - for(File file : files){ - addValue(file.getPath()); + + @Override + public void dragDropEnd(DragSourceDropEvent dsde){ + for(int i = indeces.length - 1; i >= 0; i--){ + model.removeElementAt(indeces[i]); } + fireEvent(); + super.dragDropEnd(dsde); } - } + }; + + private class TargetTransferable implements Transferable{ + private String[] strings; + + public TargetTransferable(String[] strings){ + this.strings = strings; + } + + public Object getTransferData(DataFlavor flavor) throws UnsupportedFlavorException, IOException{ + List list = new ArrayList(); + for(int i = 0; i < strings.length; i++){ + list.add(new File(strings[i])); + } + return list; + } + + public DataFlavor[] getTransferDataFlavors(){ + return new DataFlavor[] { DataFlavor.javaFileListFlavor, }; + } + + public boolean isDataFlavorSupported(DataFlavor flavor){ + return flavor.equals(DataFlavor.javaFileListFlavor); + } + }; private class TargetSelectionDropTarget extends DropTarget{ private static final long serialVersionUID = 3204457621345L; @@ -295,34 +354,9 @@ public class TargetSelectionPane extends JPanel{ try{ if(trans.isDataFlavorSupported(DataFlavor.javaFileListFlavor)){ List list = (List)trans.getTransferData(DataFlavor.javaFileListFlavor); - filters = getFileFilters(); - List errorList = new ArrayList(); - for(int i = 0; i < list.size(); i++){ - File file = (File)list.get(i); - boolean neverAddedFlag = true; - for(FileFilter filter: filters){ - if(filter.accept(file)){ - addValue(file.getPath()); - neverAddedFlag = false; - } - } - if(neverAddedFlag){ - errorList.add(file.getName()); - } - } + List errorList = checkAndAddDroppedFile(list); if(errorList.size() > 0){ - StringBuilder builder = new StringBuilder(""); - builder.append(Messages.getString("unsupportedfiletype.dialog.message")); - builder.append("
    "); - for(int i = 0; i < errorList.size(); i++){ - builder.append("
  • ").append(errorList.get(i)).append("
  • "); - } - builder.append("
"); - JOptionPane.showMessageDialog( - TargetSelectionPane.this, new String(builder), - Messages.getString("unsupportedfiletype.dialog.title"), - JOptionPane.ERROR_MESSAGE - ); + showError(errorList); } } } @@ -331,5 +365,40 @@ public class TargetSelectionPane extends JPanel{ catch(IOException e){ } } + + private List checkAndAddDroppedFile(List list){ + List errorList = new ArrayList(); + + FileFilter[] filters = getFileFilters(); + for(int i = 0; i < list.size(); i++){ + File file = (File)list.get(i); + boolean neverAddedFlag = true; + for(FileFilter filter: filters){ + if(filter.accept(file)){ + addValue(file.getPath()); + neverAddedFlag = false; + } + } + if(neverAddedFlag){ + errorList.add(file.getName()); + } + } + return errorList; + } + + private void showError(List errorList){ + StringBuilder builder = new StringBuilder(""); + builder.append(Messages.getString("unsupportedfiletype.dialog.message")); + builder.append("
    "); + for(int i = 0; i < errorList.size(); i++){ + builder.append("
  • ").append(errorList.get(i)).append("
  • "); + } + builder.append("
"); + JOptionPane.showMessageDialog( + TargetSelectionPane.this, new String(builder), + Messages.getString("unsupportedfiletype.dialog.title"), + JOptionPane.ERROR_MESSAGE + ); + } } } -- 2.11.0