X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;f=src%2Fjalview%2Fgui%2FTreeCanvas.java;h=eb4253fc901b3c328081990d7058a7cb7928fc39;hb=7f5ab7d1f58d870622968e0e6a430f33403b8e4f;hp=f21c5e75a916068a7538fd66fdeecf67a80c75a7;hpb=69bab27e77ceaca6d12e0de49f8fc62e01678f53;p=jalview.git diff --git a/src/jalview/gui/TreeCanvas.java b/src/jalview/gui/TreeCanvas.java index f21c5e7..eb4253f 100755 --- a/src/jalview/gui/TreeCanvas.java +++ b/src/jalview/gui/TreeCanvas.java @@ -29,7 +29,6 @@ import jalview.datamodel.SequenceI; import jalview.datamodel.SequenceNode; import jalview.schemes.ColourSchemeI; import jalview.schemes.ColourSchemeProperty; -import jalview.schemes.ResidueProperties; import jalview.schemes.UserColourScheme; import jalview.structure.SelectionSource; import jalview.util.Format; @@ -59,6 +58,7 @@ import java.util.Vector; import javax.swing.JColorChooser; import javax.swing.JPanel; import javax.swing.JScrollPane; +import javax.swing.SwingUtilities; import javax.swing.ToolTipManager; /** @@ -174,13 +174,13 @@ public class TreeCanvas extends JPanel implements MouseListener, Runnable, tree.findHeight(tree.getTopNode()); // Now have to calculate longest name based on the leaves - Vector leaves = tree.findLeaves(tree.getTopNode(), new Vector()); + Vector leaves = tree.findLeaves(tree.getTopNode()); boolean has_placeholders = false; longestName = ""; for (int i = 0; i < leaves.size(); i++) { - SequenceNode lf = (SequenceNode) leaves.elementAt(i); + SequenceNode lf = leaves.elementAt(i); if (lf.isPlaceholder()) { @@ -207,7 +207,7 @@ public class TreeCanvas extends JPanel implements MouseListener, Runnable, * DOCUMENT ME! * @param chunk * DOCUMENT ME! - * @param scale + * @param wscale * DOCUMENT ME! * @param width * DOCUMENT ME! @@ -217,7 +217,7 @@ public class TreeCanvas extends JPanel implements MouseListener, Runnable, * DOCUMENT ME! */ public void drawNode(Graphics g, SequenceNode node, float chunk, - float scale, int width, int offx, int offy) + double wscale, int width, int offx, int offy) { if (node == null) { @@ -227,11 +227,11 @@ public class TreeCanvas extends JPanel implements MouseListener, Runnable, if ((node.left() == null) && (node.right() == null)) { // Drawing leaf node - float height = node.height; - float dist = node.dist; + double height = node.height; + double dist = node.dist; - int xstart = (int) ((height - dist) * scale) + offx; - int xend = (int) (height * scale) + offx; + int xstart = (int) ((height - dist) * wscale) + offx; + int xend = (int) (height * wscale) + offx; int ypos = (int) (node.ycount * chunk) + offy; @@ -306,16 +306,16 @@ public class TreeCanvas extends JPanel implements MouseListener, Runnable, } else { - drawNode(g, (SequenceNode) node.left(), chunk, scale, width, offx, + drawNode(g, (SequenceNode) node.left(), chunk, wscale, width, offx, offy); - drawNode(g, (SequenceNode) node.right(), chunk, scale, width, offx, + drawNode(g, (SequenceNode) node.right(), chunk, wscale, width, offx, offy); - float height = node.height; - float dist = node.dist; + double height = node.height; + double dist = node.dist; - int xstart = (int) ((height - dist) * scale) + offx; - int xend = (int) (height * scale) + offx; + int xstart = (int) ((height - dist) * wscale) + offx; + int xend = (int) (height * wscale) + offx; int ypos = (int) (node.ycount * chunk) + offy; g.setColor(node.color.darker()); @@ -339,8 +339,8 @@ public class TreeCanvas extends JPanel implements MouseListener, Runnable, Rectangle pos = new Rectangle(xend - 2, ypos - 2, 5, 5); nodeHash.put(node, pos); - g.drawLine((int) (height * scale) + offx, ystart, - (int) (height * scale) + offx, yend); + g.drawLine((int) (height * wscale) + offx, ystart, + (int) (height * wscale) + offx, yend); String nodeLabel = ""; @@ -422,7 +422,7 @@ public class TreeCanvas extends JPanel implements MouseListener, Runnable, SequenceNode top = tree.getTopNode(); - float wscale = (float) ((width * .8) - (offx * 2)) + double wscale = ((width * .8) - (offx * 2)) / tree.getMaxHeight(); if (top.count == 0) @@ -445,7 +445,7 @@ public class TreeCanvas extends JPanel implements MouseListener, Runnable, * DOCUMENT ME! * @param chunk * DOCUMENT ME! - * @param scale + * @param wscale * DOCUMENT ME! * @param width * DOCUMENT ME! @@ -455,7 +455,7 @@ public class TreeCanvas extends JPanel implements MouseListener, Runnable, * DOCUMENT ME! */ public void pickNode(Rectangle pickBox, SequenceNode node, float chunk, - float scale, int width, int offx, int offy) + double wscale, int width, int offx, int offy) { if (node == null) { @@ -464,11 +464,11 @@ public class TreeCanvas extends JPanel implements MouseListener, Runnable, if ((node.left() == null) && (node.right() == null)) { - float height = node.height; - float dist = node.dist; + double height = node.height; + double dist = node.dist; - int xstart = (int) ((height - dist) * scale) + offx; - int xend = (int) (height * scale) + offx; + int xstart = (int) ((height - dist) * wscale) + offx; + int xend = (int) (height * wscale) + offx; int ypos = (int) (node.ycount * chunk) + offy; @@ -488,9 +488,9 @@ public class TreeCanvas extends JPanel implements MouseListener, Runnable, } else { - pickNode(pickBox, (SequenceNode) node.left(), chunk, scale, width, + pickNode(pickBox, (SequenceNode) node.left(), chunk, wscale, width, offx, offy); - pickNode(pickBox, (SequenceNode) node.right(), chunk, scale, width, + pickNode(pickBox, (SequenceNode) node.right(), chunk, wscale, width, offx, offy); } } @@ -715,7 +715,8 @@ public class TreeCanvas extends JPanel implements MouseListener, Runnable, labelLength = fm.stringWidth(longestName) + 20; // 20 allows for scrollbar - float wscale = (width - labelLength - (offx * 2)) / tree.getMaxHeight(); + double wscale = (width - labelLength - (offx * 2)) + / tree.getMaxHeight(); SequenceNode top = tree.getTopNode(); @@ -747,21 +748,27 @@ public class TreeCanvas extends JPanel implements MouseListener, Runnable, } /** - * DOCUMENT ME! + * Empty method to satisfy the MouseListener interface * * @param e - * DOCUMENT ME! */ @Override public void mouseReleased(MouseEvent e) { + /* + * isPopupTrigger is set on mouseReleased on Windows + */ + if (e.isPopupTrigger()) + { + chooseSubtreeColour(); + e.consume(); // prevent mouseClicked happening + } } /** - * DOCUMENT ME! + * Empty method to satisfy the MouseListener interface * * @param e - * DOCUMENT ME! */ @Override public void mouseEntered(MouseEvent e) @@ -769,10 +776,9 @@ public class TreeCanvas extends JPanel implements MouseListener, Runnable, } /** - * DOCUMENT ME! + * Empty method to satisfy the MouseListener interface * * @param e - * DOCUMENT ME! */ @Override public void mouseExited(MouseEvent e) @@ -780,47 +786,56 @@ public class TreeCanvas extends JPanel implements MouseListener, Runnable, } /** - * DOCUMENT ME! + * Handles a mouse click on a tree node (clicks elsewhere are handled in + * mousePressed). Click selects the sub-tree, double-click swaps leaf nodes + * order, right-click opens a dialogue to choose colour for the sub-tree. * * @param e - * DOCUMENT ME! */ @Override public void mouseClicked(MouseEvent evt) { - if (highlightNode != null) + if (highlightNode == null) { - if (evt.isPopupTrigger()) - { - Color col = JColorChooser.showDialog(this, - MessageManager.getString("label.select_subtree_colour"), - highlightNode.color); - if (col != null) - { - setColor(highlightNode, col); - } - } - else if (evt.getClickCount() > 1) + return; + } + + if (evt.getClickCount() > 1) + { + tree.swapNodes(highlightNode); + tree.reCount(tree.getTopNode()); + tree.findHeight(tree.getTopNode()); + } + else + { + Vector leaves = tree.findLeaves(highlightNode); + + for (int i = 0; i < leaves.size(); i++) { - tree.swapNodes(highlightNode); - tree.reCount(tree.getTopNode()); - tree.findHeight(tree.getTopNode()); + SequenceI seq = (SequenceI) leaves.elementAt(i).element(); + treeSelectionChanged(seq); } - else - { - Vector leaves = new Vector(); - tree.findLeaves(highlightNode, leaves); + av.sendSelection(); + } - for (int i = 0; i < leaves.size(); i++) - { - SequenceI seq = (SequenceI) ((SequenceNode) leaves.elementAt(i)) - .element(); - treeSelectionChanged(seq); - } - av.sendSelection(); - } + PaintRefresher.Refresh(tp, av.getSequenceSetId()); + repaint(); + } - PaintRefresher.Refresh(tp, av.getSequenceSetId()); + /** + * Offer the user the option to choose a colour for the highlighted node and + * its children; this colour is also applied to the corresponding sequence ids + * in the alignment + */ + void chooseSubtreeColour() + { + Color col = JColorChooser.showDialog(this, + MessageManager.getString("label.select_subtree_colour"), + highlightNode.color); + if (col != null) + { + setColor(highlightNode, col); + PaintRefresher.Refresh(tp, ap.av.getSequenceSetId()); repaint(); } } @@ -857,16 +872,42 @@ public class TreeCanvas extends JPanel implements MouseListener, Runnable, } /** - * DOCUMENT ME! + * Handles a mouse press on a sequence name or the tree background canvas + * (click on a node is handled in mouseClicked). The action is to create + * groups by partitioning the tree at the mouse position. Colours for the + * groups (and sequence names) are generated randomly. * * @param e - * DOCUMENT ME! */ @Override public void mousePressed(MouseEvent e) { av.setCurrentTree(tree); + /* + * isPopupTrigger is set for mousePressed (Mac) + * or mouseReleased (Windows) + */ + if (e.isPopupTrigger()) + { + if (highlightNode != null) + { + chooseSubtreeColour(); + } + return; + } + + /* + * defer right-click handling on Windows to + * mouseClicked; note isRightMouseButton + * also matches Cmd-click on Mac which should do + * nothing here + */ + if (SwingUtilities.isRightMouseButton(e)) + { + return; + } + int x = e.getX(); int y = e.getY(); @@ -925,17 +966,16 @@ public class TreeCanvas extends JPanel implements MouseListener, Runnable, { Color col = new Color((int) (Math.random() * 255), (int) (Math.random() * 255), (int) (Math.random() * 255)); - setColor((SequenceNode) tree.getGroups().elementAt(i), col.brighter()); + setColor(tree.getGroups().elementAt(i), col.brighter()); - Vector l = tree.findLeaves( - (SequenceNode) tree.getGroups().elementAt(i), new Vector()); + Vector l = tree.findLeaves(tree.getGroups() + .elementAt(i)); - Vector sequences = new Vector(); + Vector sequences = new Vector(); for (int j = 0; j < l.size(); j++) { - SequenceI s1 = (SequenceI) ((SequenceNode) l.elementAt(j)) - .element(); + SequenceI s1 = (SequenceI) l.elementAt(j).element(); if (!sequences.contains(s1)) { @@ -958,17 +998,21 @@ public class TreeCanvas extends JPanel implements MouseListener, Runnable, } else { - cs = ColourSchemeProperty.getColour(sg, ColourSchemeProperty - .getColourName(av.getGlobalColourScheme())); + cs = ColourSchemeProperty.getColourScheme(sg, + ColourSchemeProperty.getColourName(av + .getGlobalColourScheme())); } // cs is null if shading is an annotationColourGradient - if (cs != null) - { - cs.setThreshold(av.getGlobalColourScheme().getThreshold(), - av.isIgnoreGapsConsensus()); - } + // if (cs != null) + // { + // cs.setThreshold(av.getViewportColourScheme().getThreshold(), + // av.isIgnoreGapsConsensus()); + // } } - sg.cs = cs; + sg.setColourScheme(cs); + sg.getGroupColourScheme().setThreshold( + av.getResidueShading().getThreshold(), + av.isIgnoreGapsConsensus()); // sg.recalcConservation(); sg.setName("JTreeGroup:" + sg.hashCode()); sg.setIdColour(col); @@ -976,12 +1020,11 @@ public class TreeCanvas extends JPanel implements MouseListener, Runnable, for (int a = 0; a < aps.length; a++) { if (aps[a].av.getGlobalColourScheme() != null - && aps[a].av.getGlobalColourScheme().conservationApplied()) + && aps[a].av.getResidueShading() + .conservationApplied()) { - Conservation c = new Conservation("Group", - ResidueProperties.propHash, 3, sg.getSequences(null), + Conservation c = new Conservation("Group", sg.getSequences(null), sg.getStartRes(), sg.getEndRes()); - c.calculate(); c.verdict(false, aps[a].av.getConsPercGaps()); sg.cs.setConservation(c); @@ -993,17 +1036,14 @@ public class TreeCanvas extends JPanel implements MouseListener, Runnable, .getCodingComplement(); if (codingComplement != null) { - if (codingComplement != null) + SequenceGroup mappedGroup = MappingUtils.mapSequenceGroup(sg, av, + codingComplement); + if (mappedGroup.getSequences().size() > 0) { - SequenceGroup mappedGroup = MappingUtils.mapSequenceGroup(sg, - av, codingComplement); - if (mappedGroup.getSequences().size() > 0) + codingComplement.getAlignment().addGroup(mappedGroup); + for (SequenceI seq : mappedGroup.getSequences()) { - codingComplement.getAlignment().addGroup(mappedGroup); - for (SequenceI seq : mappedGroup.getSequences()) - { - codingComplement.setSequenceColour(seq, col.brighter()); - } + codingComplement.setSequenceColour(seq, col.brighter()); } } } @@ -1022,11 +1062,8 @@ public class TreeCanvas extends JPanel implements MouseListener, Runnable, { ((AlignViewport) codingComplement).getAlignPanel() .updateAnnotation(); - } - } - } /**