package com.illumina.basespace.igv.ui.tree; import java.awt.BorderLayout; import java.awt.event.MouseEvent; import java.awt.event.MouseListener; import javax.swing.JComponent; import javax.swing.JLabel; import javax.swing.JPopupMenu; import javax.swing.JScrollPane; import javax.swing.JTree; import javax.swing.event.TreeExpansionEvent; import javax.swing.event.TreeExpansionListener; import javax.swing.event.TreeSelectionEvent; import javax.swing.event.TreeSelectionListener; import javax.swing.tree.DefaultMutableTreeNode; import javax.swing.tree.DefaultTreeModel; import javax.swing.tree.TreePath; import com.illumina.basespace.igv.ui.BaseSpaceHelper; /** * * @author bking * */ public class BrowserPanel extends javax.swing.JPanel implements TreeSelectionListener,TreeExpansionListener,MouseListener { private JScrollPane scrollPane; protected JTree tree; private JLabel lblInstruction; public BrowserPanel() { setLayout(new BorderLayout(0, 0)); scrollPane = new JScrollPane(); add(scrollPane, BorderLayout.CENTER); tree = new JTree() { @Override public String getToolTipText(MouseEvent event) { if (getRowForLocation(event.getX(), event.getY()) == -1) return null; TreePath curPath = getPathForLocation(event.getX(), event.getY()); if (curPath.getLastPathComponent() instanceof FileNode) { FileNode fileNode = (FileNode)curPath.getLastPathComponent(); return fileNode.getBean().getName(); } return null; } }; scrollPane.setViewportView(tree); tree.addTreeSelectionListener(this); tree.addTreeExpansionListener(this); tree.addMouseListener(this); tree.setShowsRootHandles(true); tree.setRootVisible(false); tree.setToolTipText(""); tree.setCellRenderer(new TreeNodeRenderingDelegator()); lblInstruction = new JLabel(); String text = "<html>To load a BaseSpace file into the IGV Track Viewer please double-click the file" + " or right-click the file and select 'View Track Data'</html>"; lblInstruction.setText(text); add(lblInstruction, BorderLayout.NORTH); initTree(); } public JTree getTree() { return tree; } public void addUserNode(UserNode node) { DefaultTreeModel model = (DefaultTreeModel)tree.getModel(); DefaultMutableTreeNode root = ( DefaultMutableTreeNode)model.getRoot(); root.add(node); BaseSpaceHelper.addStubNode(tree, node); model.nodeStructureChanged(root); //int index = root.getIndex(node); //model.nodesWereInserted(root, new int[]{index}); //model.nodesChanged(root, new int[]{count-1}); //model.nodesWereInserted(root, new int[]{count-1}); // tree.updateUI(); // tree.invalidate(); //tree.revalidate(); //tree.invalidate(); // tree.updateUI(); } protected void initTree() { DefaultMutableTreeNode root = new DefaultMutableTreeNode(""); // BaseSpaceHelper.addStubNode(tree, root); DefaultTreeModel model = new DefaultTreeModel(root); tree.setModel(model); tree.collapseRow(0); } public DefaultMutableTreeNode getRootNode() { DefaultTreeModel model = (DefaultTreeModel)tree.getModel(); return (DefaultMutableTreeNode)model.getRoot(); } @Override public void valueChanged(TreeSelectionEvent e) { if (e.getNewLeadSelectionPath() == null || e.getNewLeadSelectionPath().getLastPathComponent() == null)return; Object lastComponent = e.getNewLeadSelectionPath().getLastPathComponent(); if (BaseSpaceTreeNode.class.isAssignableFrom(lastComponent.getClass())) { BaseSpaceTreeNode<?> selectedNode = (BaseSpaceTreeNode<?>) e.getNewLeadSelectionPath().getLastPathComponent(); if (selectedNode == null)return; selectedNode.selected(); } } @Override public void mouseClicked(MouseEvent e) { if (e.getClickCount() == 2) { TreePath path = tree.getPathForLocation(e.getX(), e.getY()); if (path == null)return; tree.setSelectionPath(path); BaseSpaceTreeNode<?> node = (BaseSpaceTreeNode<?>)path.getLastPathComponent(); node.doubleClicked(); } } @Override public void mousePressed(MouseEvent e) { } @Override public void mouseReleased(MouseEvent e) { TreePath path = tree.getPathForLocation(e.getX(), e.getY()); if (path == null || path.getLastPathComponent() == null || !BaseSpaceTreeNode.class.isAssignableFrom(BaseSpaceTreeNode.class)) { return; } tree.setSelectionPath(path); BaseSpaceTreeNode<?> node = (BaseSpaceTreeNode<?>)path.getLastPathComponent(); if (node == null)return; if (e.isPopupTrigger()) { JPopupMenu popupMenu = node.getPopupMenu(); if (popupMenu == null)return; popupMenu.show( (JComponent)e.getSource(), e.getX(), e.getY() ); } } @Override public void mouseEntered(MouseEvent e) { } @Override public void mouseExited(MouseEvent e) { } @Override public void treeExpanded(TreeExpansionEvent e) { try { if (e.getPath() == null) return; if (!BaseSpaceTreeNode.class.isAssignableFrom( e.getPath().getLastPathComponent().getClass())) { return; } BaseSpaceTreeNode<?> selectedNode = (BaseSpaceTreeNode<?>) e.getPath().getLastPathComponent(); selectedNode.loadChildrenAsynch(tree); } catch(Throwable t) { t.printStackTrace(); } } @Override public void treeCollapsed(TreeExpansionEvent event) { } }