package gov.lanl.application.TPTD.applet; import gov.lanl.application.treePruner.applet.TreePrunerColorSet; import java.awt.Graphics; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; import java.awt.event.WindowListener; import java.io.File; import java.io.FileNotFoundException; import java.io.IOException; import java.net.MalformedURLException; import java.net.URL; import java.util.ArrayList; import javax.swing.JFrame; import javax.swing.JOptionPane; import org.forester.archaeopteryx.MainFrame; import org.forester.archaeopteryx.TreePanel; import org.forester.archaeopteryx.Util; //import org.forester.archaeopteryx.Util; import org.forester.phylogeny.Phylogeny; import org.forester.phylogeny.PhylogenyNode; import org.forester.util.ForesterUtil; public class NewWindowSubtree { private final static int MAX_SUBTREES = 100; public SubTreePanel subTreePanel; TreePanel treePanel; private static CommunicationMessageWarningWindow warningWindow; static WindowAdapter doNothingWindowAdapter = new WindowAdapter(){ public void windowClosing( final WindowEvent e ) { JOptionPane.showMessageDialog( null, "You can only close the lowest level subtree.\n"); } }; public NewWindowSubtree(TreePanel tp) { this.treePanel = tp; } public void subTree(PhylogenyNode node, Phylogeny _phylogeny, SubTreePanel subTreePanel) { int temp_count = TreePanel.get_subtree_index(); boolean alreadyClickedOnPhylogeny = false; for (Phylogeny p : SubTreePanel._phylogenies) { if (p == _phylogeny) { alreadyClickedOnPhylogeny = true; break; } } if (!node.isExternal() && !node.isRoot() && (TreePanel.get_subtree_index() <= (MAX_SUBTREES - 1))) { if (!alreadyClickedOnPhylogeny) { warningWindow = new CommunicationMessageWarningWindow(); SubTreePanel._phylogenies.add(_phylogeny); SubTreePanel.subTreeHierarchy.add(1); SubTreePanel._phylogenies_subtree.add(_phylogeny.subTree(node)); SubTreePanel.subTreeRootNode.put(node.getNodeId(), null); SubTreePanel.mainFrames.add(subTreePanel.archaeA .create_new_Frame()); SubTreePanel.mainFrames.get(SubTreePanel.sub_frame_count) .repaintPanel(); TreePanel.set_subtree_index(TreePanel.get_subtree_index() + 1); Phylogeny[] phys = null; try { phys = Util.readPhylogeniesFromUrlForSubtree(new URL( AppletParams.urlOfTreeToLoad), AppletParams.phyloxml_validate_against_xsd); } catch (FileNotFoundException e) { destroyWarningWindow(); e.printStackTrace(); } catch (MalformedURLException e) { destroyWarningWindow(); e.printStackTrace(); } catch (IOException e) { destroyWarningWindow(); e.printStackTrace(); } Util.addPhylogeniesToTabsForSubtree(phys, AppletParams.tabName, AppletParams.urlOfTreeToLoad, SubTreePanel.mainFrames.get( SubTreePanel.sub_frame_count) .get_configuration(), SubTreePanel.mainFrames.get( SubTreePanel.sub_frame_count) .get_main_panel()); SubTreePanel.mainFrames.get(SubTreePanel.sub_frame_count) .get_main_panel().get_control_panel().show_whole_all(); SubTreePanel.mainFrames.get(SubTreePanel.sub_frame_count) .get_main_panel().adjust_JScroll_pane(); SubTreePanel.mainFrames.get(SubTreePanel.sub_frame_count) .get_main_panel().get_current_treePanel().repaint(); SubTreePanel.mainFrames.get(SubTreePanel.sub_frame_count) .repaint(); SubTreePanel.sub_frame_count++; handleBackToSubTreeButton(); handleCloseXButton(); destroyWarningWindow(); } else { JOptionPane .showMessageDialog( treePanel, "You already have one subtree of this tree open. You cannot open a second subtree."); } } else if (node.isRoot() && (TreePanel.get_subtree_index() >= 1)) { if (SubTreePanel._phylogenies_subtree.get(temp_count - 1).getRoot() .getNodeId() == node.getNodeId()) { int temp = SubTreePanel.sub_frame_count; MainFrame mf = SubTreePanel.mainFrames.get(--temp); mf.close_(); } else { JOptionPane .showMessageDialog(treePanel, "You can only close the lowest level subtree."); } } treePanel.getMainPanel().get_control_panel().show_whole(); treePanel.repaint(); } public void superTree() { if (TreePanel.get_subtree_index() >= 1) { int temp = SubTreePanel.sub_frame_count; MainFrame mf = SubTreePanel.mainFrames.get(--temp); mf.close_(); } else { // this should not happen as if only the root parent window is // present then the "back to supertree" option should be disabled } } public static void handleBackToSubTreeButton() { if (SubTreePanel.mainFrames.isEmpty() || SubTreePanel.mainFrames.size() < 1 || SubTreePanel.sub_frame_count == 0) { } else { SubTreePanel.mainAppletFrame.get_main_panel() .get_current_treePanel().updateSubSuperTreeButton(true); for (MainFrame o : SubTreePanel.mainFrames) { if (o != null) { o.get_main_panel().get_current_treePanel() .updateSubSuperTreeButton(true); } } SubTreePanel.mainFrames.get(SubTreePanel.mainFrames.size() - 1) .get_main_panel().get_current_treePanel() .updateSubSuperTreeButton(false); } } public static void handleCloseXButton(){ if (SubTreePanel.mainFrames.isEmpty() || SubTreePanel.mainFrames.size() < 1 || SubTreePanel.sub_frame_count == 0) { removeWindowListners(SubTreePanel.mainAppletFrame); SubTreePanel.mainAppletFrame.addWindowListener(SubTreePanel.mainAppletFrame.closeWindowAdapter); SubTreePanel.mainAppletFrame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); } else { removeWindowListners(SubTreePanel.mainAppletFrame); SubTreePanel.mainAppletFrame.addWindowListener(doNothingWindowAdapter); SubTreePanel.mainAppletFrame.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE); for (MainFrame o : SubTreePanel.mainFrames) { if (o != null) { removeWindowListners(o); o.addWindowListener(doNothingWindowAdapter); o.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE); } } removeWindowListners(SubTreePanel.mainFrames.get(SubTreePanel.mainFrames.size() - 1)); SubTreePanel.mainFrames.get(SubTreePanel.mainFrames.size() - 1) .addWindowListener(SubTreePanel.mainFrames.get(SubTreePanel.mainFrames.size() - 1).closeWindowAdapter); SubTreePanel.mainFrames.get(SubTreePanel.mainFrames.size() - 1).setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); } } private static void removeWindowListners(MainFrame mf){ WindowListener x[] = mf.getWindowListeners(); for(int i = 0; i < x.length; i++){ mf.removeWindowListener(x[i]); } } public static void destroyWarningWindow() { if (warningWindow != null) { warningWindow.close(); } } public void paintNodeTracker(Graphics g, double x, double y, PhylogenyNode node, boolean toPdf, boolean toGraphicsFile) { if (SubTreePanel.subTreeRootNode.containsKey(node.getNodeId()) && !toPdf && !toGraphicsFile) { ArrayList<Double> temp = new ArrayList<Double>(); temp.add(x); temp.add(y); SubTreePanel.subTreeRootNode.put(node.getNodeId(), temp); g.setColor(TreePrunerColorSet.getTrackSubtreeCircleColor()); drawOval( SubTreePanel.subTreeRootNode.get(node.getNodeId()).get(0) - 8, SubTreePanel.subTreeRootNode.get(node.getNodeId()).get(1) - 8, 16, 16, g); drawOval( SubTreePanel.subTreeRootNode.get(node.getNodeId()).get(0) - 9, SubTreePanel.subTreeRootNode.get(node.getNodeId()).get(1) - 8, 17, 17, g); drawOval( SubTreePanel.subTreeRootNode.get(node.getNodeId()).get(0) - 9, SubTreePanel.subTreeRootNode.get(node.getNodeId()).get(1) - 9, 18, 18, g); } } private static void drawOval(final double x, final double y, final double width, final double heigth, final Graphics g) { g.drawOval(ForesterUtil.roundToInt(x), ForesterUtil .roundToInt(y), ForesterUtil.roundToInt(width), ForesterUtil.roundToInt(heigth)); } }