/* * Encog(tm) Workbench v3.4 * http://www.heatonresearch.com/encog/ * https://github.com/encog/encog-java-workbench * * Copyright 2008-2016 Heaton Research, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * * For more information on Heaton Research copyrights, licenses * and trademarks visit: * http://www.heatonresearch.com/copyright */ package org.encog.workbench.frames.document.tree; import java.awt.BorderLayout; import java.awt.datatransfer.DataFlavor; import java.awt.datatransfer.Transferable; import java.awt.dnd.DnDConstants; import java.awt.dnd.DropTarget; import java.awt.dnd.DropTargetDragEvent; import java.awt.dnd.DropTargetDropEvent; import java.awt.dnd.DropTargetEvent; import java.awt.dnd.DropTargetListener; import java.awt.event.KeyEvent; import java.awt.event.KeyListener; import java.awt.event.MouseEvent; import java.awt.event.MouseListener; import java.io.File; import java.util.ArrayList; import java.util.List; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JTree; import javax.swing.tree.TreePath; import org.encog.util.file.FileUtil; import org.encog.workbench.EncogWorkBench; import org.encog.workbench.frames.document.EncogDocumentFrame; import org.encog.workbench.util.MouseUtil; public class ProjectTree extends JPanel implements MouseListener, KeyListener, DropTargetListener { private JTree tree; private final EncogCollectionModel collectionModel; private EncogDocumentFrame doc; private DropTarget dt; public ProjectTree(EncogDocumentFrame doc) { this.doc = doc; // setup the contents list this.collectionModel = new EncogCollectionModel(); this.tree = new JTree(this.collectionModel); // this.tree.setRootVisible(false); this.tree.addMouseListener(this); this.tree.addKeyListener(this); this.tree.setCellRenderer(new ProjectTreeRenderer()); final JScrollPane scrollPane = new JScrollPane(this.tree); this.setLayout(new BorderLayout()); this.add(scrollPane, BorderLayout.CENTER); this.tree.updateUI(); dt = new DropTarget(this, this); } public List<ProjectItem> getSelectedValue() { List<ProjectItem> result = new ArrayList<ProjectItem>(); TreePath[] path = this.tree.getSelectionPaths(); if (path == null || path.length == 0) return null; for (int i = 0; i < path.length; i++) { Object obj = path[i].getLastPathComponent(); if (obj instanceof ProjectItem) result.add((ProjectItem) obj); } return result; } public void rightMouseClicked(final MouseEvent e, final Object item) { if( EncogWorkBench.getInstance().getMainWindow().getTabManager().notWithModalTabOpen() ) return; this.doc.getPopupMenus().rightMouseClicked(e, item); } public void mouseClicked(MouseEvent e) { if( EncogWorkBench.getInstance().getMainWindow().getTabManager().notWithModalTabOpen() ) return; TreePath path = this.tree.getSelectionPath(); // see if something should be selected because of right-click if (MouseUtil.isRightClick(e)) { TreePath[] currentPaths = this.tree.getSelectionPaths(); TreePath rightPath = this.tree.getClosestPathForLocation(e.getX(), e.getY()); boolean included = false; if (currentPaths != null) { for (TreePath t : currentPaths) { if (t.equals(rightPath)) included = true; } } if (!included) this.tree.setSelectionPath(path = rightPath); } if (path != null) { Object obj = path.getLastPathComponent(); if (obj instanceof ProjectFile) { if (MouseUtil.isRightClick(e)) { rightMouseClicked(e, obj); } else if (e.getClickCount() == 2) { ProjectFile pf = (ProjectFile) obj; this.doc.openFile(pf); } } else if (obj instanceof ProjectParent && e.getClickCount() == 2) { File p = this.collectionModel.getPath().getParentFile(); EncogWorkBench.getInstance().getMainWindow() .changeDirectory(p); } else if (obj instanceof ProjectDirectory && e.getClickCount() == 2) { File p = new File(this.collectionModel.getPath(), obj.toString()); EncogWorkBench.getInstance().getMainWindow() .changeDirectory(p); } else { if (MouseUtil.isRightClick(e)) { rightMouseClicked(e, obj); } } } } public void mousePressed(MouseEvent e) { // TODO Auto-generated method stub } public void mouseReleased(MouseEvent e) { // TODO Auto-generated method stub } public void mouseEntered(MouseEvent e) { // TODO Auto-generated method stub } public void mouseExited(MouseEvent e) { // TODO Auto-generated method stub } public void refresh() { this.collectionModel.invalidate(); } public void refresh(File path) { if( path!=null ) { this.collectionModel.invalidate(path); EncogWorkBench.getInstance().getMainWindow().redraw(); } } public File getPath() { return this.collectionModel.getPath(); } public String[] listEGFiles() { return this.collectionModel.listEGFiles(); } public ProjectFile findTreeFile(String filename) { return this.collectionModel.findTreeFile(filename); } public EncogCollectionModel getModel() { return this.collectionModel; } public void dragEnter(DropTargetDragEvent arg0) { // TODO Auto-generated method stub } public void dragExit(DropTargetEvent arg0) { // TODO Auto-generated method stub } public void dragOver(DropTargetDragEvent arg0) { // TODO Auto-generated method stub } public void drop(DropTargetDropEvent dtde) { if( EncogWorkBench.getInstance().getMainWindow().getTabManager().notWithModalTabOpen() ) return; try { if( EncogWorkBench.getInstance().getProjectDirectory()==null ) { EncogWorkBench.displayError("Error", "Open a project before using drag and drop."); return; } if( !EncogWorkBench.askQuestion("Drag and Drop", "Copy the file(s) to the project?") ) { return; } Transferable tr = dtde.getTransferable(); DataFlavor[] flavors = tr.getTransferDataFlavors(); for (int i = 0; i < flavors.length; i++) { if (flavors[i].isFlavorJavaFileListType()) { dtde.acceptDrop(DnDConstants.ACTION_COPY_OR_MOVE); java.util.List list = (java.util.List) tr .getTransferData(flavors[i]); for (int j = 0; j < list.size(); j++) { File sourceFile = new File(list.get(j).toString()); if( sourceFile.isDirectory() ) { EncogWorkBench.displayError("Drag and Drop", "Can't drop folder."); return; } String name = sourceFile.getName(); File targetFile = new File(EncogWorkBench.getInstance().getProjectDirectory(),name); FileUtil.copy(sourceFile, targetFile); } // If we made it this far, everything worked. dtde.dropComplete(true); EncogWorkBench.getInstance().refresh(); return; } } } catch (Exception e) { EncogWorkBench.displayError("Drag and Drop", e); } dtde.rejectDrop(); } public void dropActionChanged(DropTargetDragEvent arg0) { // TODO Auto-generated method stub } public void keyTyped(KeyEvent e) { if( EncogWorkBench.getInstance().getMainWindow().getTabManager().notWithModalTabOpen() ) return; if( e.getKeyChar()==KeyEvent.VK_DELETE) { EncogWorkBench.getInstance().getMainWindow().getOperations().performDelete(); } } public void keyPressed(KeyEvent e) { } public void keyReleased(KeyEvent e) { } public ProjectFile findTreeFile(File egaFile) { return this.collectionModel.findTreeFile(egaFile.getName()); } public ProjectFile findFirstEGA() { return this.collectionModel.findFirstEGA(); } }