Survey
* Your assessment is very important for improving the workof artificial intelligence, which forms the content of this project
* Your assessment is very important for improving the workof artificial intelligence, which forms the content of this project
[TDA-40] Enable Drag and Drop of Logfiles onto the TDA Window Created: 13/Nov/14 Updated: 12/Jul/16 Resolved: 12/Jul/16 Status: Project: Component/s: Affects Version/s: Fix Version/s: Resolved tda None None Type: Reporter: Resolution: Labels: Remaining Estimate: Time Spent: Original Estimate: Improvement ben.peter Fixed None Not Specified None Priority: Assignee: Votes: Major irockel 0 Not Specified Not Specified Description A pragmatic patch is attached. Comments Comment by ben.peter [ 13/Nov/14 ] oh, I can neither edit the description nor attach files, so here goes: Index: src/java/com/pironet/tda/TDA.java IDEA additional info: Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP <+>UTF-8 =================================================================== --- src/java/com/pironet/tda/TDA.java (revision 638) +++ src/java/com/pironet/tda/TDA.java (revision ) @@ -42,9 +42,9 @@ import java.awt.Color; import java.awt.Container; import java.awt.datatransfer.UnsupportedFlavorException; -import java.awt.dnd.DropTargetDropEvent; +import java.awt.dnd.*; import java.io.FileNotFoundException; -import java.util.Enumeration; +import java.util.*; import javax.swing.JEditorPane; import javax.swing.JFrame; import javax.swing.JPanel; @@ -71,8 +71,6 @@ import java.awt.Toolkit; import java.awt.datatransfer.DataFlavor; import java.awt.datatransfer.Transferable; -import java.awt.dnd.DropTarget; -import java.awt.dnd.DropTargetAdapter; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.KeyEvent; @@ -91,10 +89,6 @@ import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import java.text.NumberFormat; -import java.util.Date; -import java.util.HashMap; -import java.util.Map; -import java.util.Vector; import java.util.zip.GZIPInputStream; import java.util.zip.GZIPOutputStream; import javax.swing.BorderFactory; @@ -298,7 +292,6 @@ }); htmlView = new ViewScrollPane(htmlPane, runningAsVisualVMPlugin); ViewScrollPane emptyView = new ViewScrollPane(emptyPane, runningAsVisualVMPlugin); @@ -352,9 +345,65 @@ fc = new JFileChooser(); fc.setMultiSelectionEnabled(true); fc.setCurrentDirectory(PrefManager.get().getSelectedPath()); + } + + if (!runningAsJConsolePlugin && !runningAsVisualVMPlugin) { + new DropTarget(htmlPane, DnDConstants.ACTION_REFERENCE | DnDConstants.ACTION_LINK, getDropTargetListener()); + } + } + + private DropTargetListener getDropTargetListener() { + return new DropTargetListener() { + public void dragEnter(DropTargetDragEvent event) { + } + + public void dragOver(DropTargetDragEvent event) { + } + + public void dropActionChanged(DropTargetDragEvent event) { + } + + public void dragExit(DropTargetEvent event) { + } + + public void drop(DropTargetDropEvent event) { + try { + event.acceptDrop(DnDConstants.ACTION_REFERENCE); + Transferable transfer = event.getTransferable(); + File[] files = getAcceptedFiles(transfer); + if (null != files && files.length != 0) { + TDA.get(true).openFiles(files, false); + event.getDropTargetContext().dropComplete(true); + } + } catch (InvalidDnDOperationException ex) { + // ignore + } + } + }; + } + + private File[] getAcceptedFiles(Transferable transferable) { + try { + if (!transferable.isDataFlavorSupported(DataFlavor.javaFileListFlavor)) { + return null; + } + + List filelist = (List) transferable.getTransferData(DataFlavor.javaFileListFlavor); + List acceptedFiles = new ArrayList(); + File[] files = (File[]) filelist.toArray(new File[0]); + for (int i = 0; i < files.length; i++) { + if (!files[i].isDirectory()) { + acceptedFiles.add(files[i]); + } + } + return (File[]) acceptedFiles.toArray(new File[0]); + } catch (IOException ex) { + return null; + } catch (UnsupportedFlavorException ex) { + return null; } } Comment by ben.peter [ 14/Nov/14 ] the following patch also replaces JFileChooser with the AWT = native FileDialog to give better navigation to log files by enabling OS native features for file selection and directory navigation I won't open another issue for this at the moment, as both changes affect TDA.java (lazy mode ) Index: src/java/com/pironet/tda/TDA.java IDEA additional info: Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP <+>UTF-8 =================================================================== --- src/java/com/pironet/tda/TDA.java (revision 638) +++ src/java/com/pironet/tda/TDA.java (revision ) @@ -38,13 +38,12 @@ import com.pironet.tda.utils.ViewScrollPane; import com.pironet.tda.utils.jedit.JEditTextArea; import com.pironet.tda.utils.jedit.PopupMenu; -import java.awt.BorderLayout; -import java.awt.Color; -import java.awt.Container; + +import java.awt.*; import java.awt.datatransfer.UnsupportedFlavorException; -import java.awt.dnd.DropTargetDropEvent; +import java.awt.dnd.*; import java.io.FileNotFoundException; -import java.util.Enumeration; +import java.util.*; import javax.swing.JEditorPane; import javax.swing.JFrame; import javax.swing.JPanel; @@ -64,15 +63,8 @@ import javax.swing.event.TreeSelectionEvent; import javax.swing.event.TreeSelectionListener; import java.io.IOException; -import java.awt.Dimension; -import java.awt.FlowLayout; -import java.awt.Font; -import java.awt.Image; -import java.awt.Toolkit; import java.awt.datatransfer.DataFlavor; import java.awt.datatransfer.Transferable; -import java.awt.dnd.DropTarget; -import java.awt.dnd.DropTargetAdapter; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.KeyEvent; @@ -91,10 +83,7 @@ import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import java.text.NumberFormat; -import java.util.Date; -import java.util.HashMap; -import java.util.Map; -import java.util.Vector; +import java.util.List; import java.util.zip.GZIPInputStream; import java.util.zip.GZIPOutputStream; import javax.swing.BorderFactory; @@ -130,7 +119,7 @@ * @author irockel */ public class TDA extends JPanel implements ListSelectionListener, TreeSelectionListener, ActionListener, MenuListener { private static JFileChooser fc; + private static FileDialog fc; private static JFileChooser sessionFc; private static int DIVIDER_SIZE = 4; protected static JFrame frame; @@ -298,7 +287,6 @@ }); htmlView = new ViewScrollPane(htmlPane, runningAsVisualVMPlugin); ViewScrollPane emptyView = new ViewScrollPane(emptyPane, runningAsVisualVMPlugin); @@ -349,12 +337,72 @@ if(firstFile && runningAsVisualVMPlugin) { // init filechooser fc = new JFileChooser(); fc.setMultiSelectionEnabled(true); fc.setCurrentDirectory(PrefManager.get().getSelectedPath()); fc = new FileDialog(TDA.get(true).getFrame()); fc.setMultipleMode(true); try { + + + + fc.setDirectory(PrefManager.get().getSelectedPath().getCanonicalPath()); + } catch (IOException ioe) { + // ignore } } + } + } + + if (!runningAsJConsolePlugin && !runningAsVisualVMPlugin) { + new DropTarget(htmlPane, DnDConstants.ACTION_REFERENCE | DnDConstants.ACTION_LINK, getDropTargetListener()); + } + } + + private DropTargetListener getDropTargetListener() { + return new DropTargetListener() { + public void dragEnter(DropTargetDragEvent event) { + } + + public void dragOver(DropTargetDragEvent event) { + } + + public void dropActionChanged(DropTargetDragEvent event) { + } + + public void dragExit(DropTargetEvent event) { + } + + public void drop(DropTargetDropEvent event) { + try { + event.acceptDrop(DnDConstants.ACTION_REFERENCE); + Transferable transfer = event.getTransferable(); + File[] files = getAcceptedFiles(transfer); + if (null != files && files.length != 0) { + TDA.get(true).openFiles(files, false); + event.getDropTargetContext().dropComplete(true); + } + } catch (InvalidDnDOperationException ex) { + // ignore + } + } + }; + } + + private File[] getAcceptedFiles(Transferable transferable) { + try { + if (!transferable.isDataFlavorSupported(DataFlavor.javaFileListFlavor)) { + return null; + } + + List filelist = (List) transferable.getTransferData(DataFlavor.javaFileListFlavor); + List acceptedFiles = new ArrayList(); + File[] files = (File[]) filelist.toArray(new File[0]); + for (int i = 0; i < files.length; i++) { + if (!files[i].isDirectory()) { + acceptedFiles.add(files[i]); + } + } + return (File[]) acceptedFiles.toArray(new File[0]); + } catch (IOException ex) { + return null; + } catch (UnsupportedFlavorException ex) { + return null; + } + } + private void getLogfileFromClipboard() { Transferable t = Toolkit.getDefaultToolkit().getSystemClipboard().getContents(null); String text = null; @@ -1876,19 +1924,25 @@ */ public void saveLogFile() { if(fc == null) { fc = new JFileChooser(); fc.setMultiSelectionEnabled(true); fc.setCurrentDirectory(PrefManager.get().getSelectedPath()); + fc = new FileDialog(TDA.get(true).getFrame()); + fc.setMultipleMode(false); + try { + fc.setDirectory(PrefManager.get().getSelectedPath().getCanonicalPath()); + } catch (IOException ioe) { + // ignore } + + } } if(firstFile && (PrefManager.get().getPreferredSizeFileChooser().height > 0)) { fc.setPreferredSize(PrefManager.get().getPreferredSizeFileChooser()); } int returnVal = fc.showSaveDialog(this.getRootPane()); + fc.setMode(FileDialog.SAVE); fc.setPreferredSize(fc.getSize()); + fc.setVisible(true); PrefManager.get().setPreferredSizeFileChooser(fc.getSize()); + if (returnVal == JFileChooser.APPROVE_OPTION) { File file = fc.getSelectedFile(); + String selectedFile = fc.getFile(); + if (selectedFile != null) { + File file = new File(selectedFile); int selectValue = 0; if(file.exists()) { Object[] options = { "Overwrite", "Cancel" }; @@ -1924,12 +1978,13 @@ if(firstFile && (PrefManager.get().getPreferredSizeFileChooser().height > 0)) { fc.setPreferredSize(PrefManager.get().getPreferredSizeFileChooser()); } int returnVal = fc.showOpenDialog(this.getRootPane()); fc.setPreferredSize(fc.getSize()); + fc.setVisible(true); PrefManager.get().setPreferredSizeFileChooser(fc.getSize()); + if (returnVal == JFileChooser.APPROVE_OPTION) { File[] files = fc.getSelectedFiles(); + File[] files = fc.getFiles(); + + if (files.length > 0) { openFiles(files, false); } } @@ -2176,10 +2231,12 @@ * open and parse loggc file */ private void openLoggcFile() { int returnVal = fc.showOpenDialog(this.getRootPane()); + fc.setVisible(true); + if (returnVal == JFileChooser.APPROVE_OPTION) { File file = fc.getSelectedFile(); + File[] selectedFiles = fc.getFiles(); + + if (selectedFiles.length > 0) { + File file = selectedFiles[1]; loggcFile = file.getAbsolutePath(); if(loggcFile != null) { try { @@ -2268,7 +2325,7 @@ */ private void saveState() { PrefManager.get().setWindowState(frame.getExtendedState()); PrefManager.get().setSelectedPath(fc.getCurrentDirectory()); + PrefManager.get().setSelectedPath(new File(fc.getDirectory())); PrefManager.get().setPreferredSize(frame.getRootPane().getSize()); PrefManager.get().setWindowPos(frame.getX(), frame.getY()); if(isThreadDisplay()) { @@ -2307,7 +2364,7 @@ frame.getRootPane().setPreferredSize(PrefManager.get().getPreferredSize()); + frame.setJMenuBar(new MainMenu(TDA.get(true))); TDA.get(true).init(false, false); @@ -2320,10 +2377,14 @@ frame.setContentPane(TDA.get(true)); // init filechooser fc = new JFileChooser(); fc.setMultiSelectionEnabled(true); fc.setCurrentDirectory(PrefManager.get().getSelectedPath()); + fc = new FileDialog(TDA.get(true).getFrame()); + fc.setMultipleMode(true); + try { + fc.setDirectory(PrefManager.get().getSelectedPath().getCanonicalPath()); + } catch (IOException ioe) { + // ignore + } + /** * add window listener for persisting state of main frame */ @@ -2336,7 +2397,7 @@ System.exit(0); } }); + frame.setLocation(PrefManager.get().getWindowPos()); //Display the window. @@ -2347,7 +2408,7 @@ frame.setVisible(true); } - + /** * display search dialog for current category */ @@ -2377,7 +2438,7 @@ * main startup method for TDA */ public static void main(String[] args) { if(args.length > 0) { + if (args.length > 0) { dumpFile = args[0]; } //Schedule a job for the event-dispatching thread: Comment by irockel [ 12/Jul/16 ] Applied patch, merged to githup, see here: https://github.com/irockel/tda/issues/1 Generated at Sat May 06 19:26:13 UTC 2017 using JIRA 6.2.3#6260sha1:63ef1d6dac3f4f4d7db4c1effd405ba38ccdc558.