package au.edu.anu.dcclient.bagfilesexplorer; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; import java.io.File; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Map.Entry; import java.util.concurrent.ExecutionException; import javax.swing.JFileChooser; import javax.swing.JMenuItem; import javax.swing.JPopupMenu; import javax.swing.JSeparator; import javax.swing.tree.DefaultMutableTreeNode; import javax.swing.tree.TreePath; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import au.edu.anu.datacommons.storage.info.FileSummary; import au.edu.anu.dcclient.gui.MainWindow; import au.edu.anu.dcclient.tasks.DeleteFilesTask; import au.edu.anu.dcclient.tasks.DownloadFilesTask; import au.edu.anu.dcclient.tasks.LocalFilesMoverTask; public class BagFileMenu extends JPopupMenu { private static final Logger LOGGER = LoggerFactory.getLogger(BagFileMenu.class); private static final long serialVersionUID = 1L; private final BagFilesTree parent; private String pid; private final JMenuItem mntmDelete = new JMenuItem("Delete"); private final JMenuItem mntmSaveAs = new JMenuItem("Save As..."); private final JSeparator separator = new JSeparator(); public BagFileMenu(BagFilesTree parent) { this.parent = parent; this.pid = parent.getBagSummary().getPid(); initGui(); } private void initGui() { add(mntmSaveAs); add(separator); add(mntmDelete); TreePath[] paths = parent.getSelectionPaths(); mntmSaveAs.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { saveSelectedItems(); } }); mntmDelete.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { deleteSelectedItems(); } }); checkRootSelected(paths); } private void checkRootSelected(TreePath[] paths) { for (int i = 0; i < paths.length; i++) { if (parent.getModel().getRoot() == paths[i].getLastPathComponent()) { mntmDelete.setEnabled(false); break; } } } private void saveSelectedItems() { List<String> filepaths = getSelectedFilepaths(); DownloadFilesTask dlTask = new DownloadFilesTask(pid, filepaths); dlTask.addPropertyChangeListener(new PropertyRethrowerListener()); dlTask.execute(); File saveDir = getDirToSave(); if (saveDir != null) { try { Map<String, File> downloadResult = dlTask.get(); Map<File, File> moveList = new HashMap<File, File>(downloadResult.size()); for (Entry<String, File> entry : downloadResult.entrySet()) { moveList.put(entry.getValue(), new File(saveDir, entry.getKey().substring(entry.getKey().lastIndexOf('/') + 1))); } LocalFilesMoverTask moverTask = new LocalFilesMoverTask(moveList); moverTask.addPropertyChangeListener(new PropertyRethrowerListener()); moverTask.execute(); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (ExecutionException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } private File getDirToSave() { File dir = null; JFileChooser fc = new JFileChooser(); fc.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY); int retVal = fc.showSaveDialog(MainWindow.getInstance()); if (retVal == JFileChooser.APPROVE_OPTION) { dir = fc.getSelectedFile(); } return dir; } private void deleteSelectedItems() { List<String> filepaths = getSelectedFilepaths(); DeleteFilesTask delTask = new DeleteFilesTask(pid, filepaths); delTask.addPropertyChangeListener(new PropertyRethrowerListener()); delTask.execute(); } private List<String> getSelectedFilepaths() { TreePath[] paths = parent.getSelectionPaths(); List<String> filepaths = new ArrayList<String>(); DefaultMutableTreeNode node; for (int i = 0; i < paths.length; i++) { node = (DefaultMutableTreeNode) (paths[i].getLastPathComponent()); Entry<String, FileSummary> entry = (Entry<String, FileSummary>) node.getUserObject(); filepaths.add(entry.getKey()); } return filepaths; } private class PropertyRethrowerListener implements PropertyChangeListener { @Override public void propertyChange(PropertyChangeEvent evt) { BagFileMenu.this.firePropertyChange(evt.getPropertyName(), evt.getOldValue(), evt.getNewValue()); } } }