JAL-4386 move provider label into a new attribute on BinaryNodes so it can be recover...
authorJim Procter <jprocter@dundee.ac.uk>
Fri, 28 Jun 2024 16:03:09 +0000 (17:03 +0100)
committerJim Procter <jprocter@dundee.ac.uk>
Fri, 28 Jun 2024 16:03:09 +0000 (17:03 +0100)
src/jalview/analysis/TreeBuilder.java
src/jalview/analysis/scoremodels/SecondaryStructureDistanceModel.java
src/jalview/datamodel/BinaryNode.java
src/jalview/gui/TreeCanvas.java

index 560a0a4..e713525 100644 (file)
@@ -186,12 +186,14 @@ public abstract class TreeBuilder extends TreeEngine
       SequenceNode sn = new SequenceNode();
 
       sn.setElement(sequences[i]);
+      
       if (labels.size()==noseqs)
       {
-        sn.setName(labels.get(i));
-      } else {
-        sn.setName(sequences[i].getName());
+        sn.setLabel(labels.get(i));
       }
+      
+      sn.setName(sequences[i].getName());
+      
       node.addElement(sn);
       BitSet bs = new BitSet();
       bs.set(i);
index 97200bf..dc35efb 100644 (file)
@@ -128,7 +128,7 @@ public class SecondaryStructureDistanceModel extends DistanceScoreModel
         // not defined
         newSequences.add(alSeq);
         if (alSeq!=null) {
-          labels.add(alSeq.getName()+"|"+" No Secondary Structure");
+          labels.add("No Secondary Structure");
         }
         SeqCigar newSeqCigar = scig; //new SeqCigar(scig);
         newCigs.add(newSeqCigar);
@@ -138,7 +138,7 @@ public class SecondaryStructureDistanceModel extends DistanceScoreModel
         {
           if (alSeq != null)
           {
-            labels.add(alSeq.getName() + "|" + AlignmentUtils
+            labels.add(AlignmentUtils
                     .extractSSSourceFromAnnotationDescription(ssec.get(i)));
           }
           //newSequences.add(seq);
index 624c2b9..2b5894a 100755 (executable)
@@ -34,6 +34,8 @@ public class BinaryNode<T>
 
   String name;
 
+  String label=null;
+
   BinaryNode<T> left;
 
   BinaryNode<T> right;
@@ -364,6 +366,23 @@ public class BinaryNode<T>
 
     return oldstate;
   }
+  /**
+   * check if there's a label to show
+   * @return true if non-empty/null string
+   */
+  public boolean hasLabel()
+  {
+    return label!=null && !label.isEmpty();
+  }
+  public String getLabel()
+  {
+    return label;
+  }
+
+  public void setLabel(String label)
+  {
+    this.label = label;
+  }
 
   /**
    * ascends the tree but doesn't stop until a non-dummy node is discovered.
@@ -380,4 +399,17 @@ public class BinaryNode<T>
 
     return c;
   }
+
+  public String getDisplayName()
+  {
+    if (name!=null && !name.isBlank())
+    {
+     
+      if (hasLabel()) {
+        return getName()+"|"+label;
+      }
+      return name;
+    }
+    return hasLabel() ? label:"";
+  }
 }
index 9180d52..993d563 100755 (executable)
@@ -116,7 +116,10 @@ public class TreeCanvas extends JPanel implements MouseListener, Runnable,
 
   int labelLength = -1;
 
-  Map<Object, Rectangle> nameHash = new Hashtable<>();
+  /**
+   * TODO - these rectangle-hash lookups should be optimised for big trees...
+   */
+  Map<BinaryNode, Rectangle> nameHash = new Hashtable<>();
 
   Map<BinaryNode, Rectangle> nodeHash = new Hashtable<>();
 
@@ -240,11 +243,11 @@ public class TreeCanvas extends JPanel implements MouseListener, Runnable,
         has_placeholders = true;
       }
 
-      if (longestName.length() < ((Sequence) lf.element()).getName()
+      if (longestName.length() < lf.getDisplayName()
               .length())
       {
         longestName = TreeCanvas.PLACEHOLDER
-                + ((Sequence) lf.element()).getName();
+                + lf.getDisplayName();
       }
       if (tp.isColumnWise() && cm != null)
       {
@@ -345,8 +348,8 @@ public class TreeCanvas extends JPanel implements MouseListener, Runnable,
 
       String name = (markPlaceholders && ((node instanceof SequenceNode
               && ((SequenceNode) node).isPlaceholder())))
-                      ? (PLACEHOLDER + node.getName())
-                      : node.getName();
+                      ? (PLACEHOLDER + node.getDisplayName())
+                      : node.getDisplayName();
 
       int charWidth = fm.stringWidth(name) + 3;
       int charHeight = font.getSize();
@@ -354,7 +357,7 @@ public class TreeCanvas extends JPanel implements MouseListener, Runnable,
       Rectangle rect = new Rectangle(xend + 10, ypos - charHeight / 2,
               charWidth, charHeight);
 
-      nameHash.put(node.element(), rect);
+      nameHash.put(node, rect);
 
       // Colour selected leaves differently
       boolean isSelected = false;
@@ -437,6 +440,10 @@ public class TreeCanvas extends JPanel implements MouseListener, Runnable,
 
         nodeLabel = nodeLabel + String.valueOf(node.bootstrap);
       }
+      if (node.hasLabel())
+      {
+        nodeLabel = node.getLabel()+" "+nodeLabel;
+      }
 
       if (!nodeLabel.equals(""))
       {
@@ -457,14 +464,14 @@ public class TreeCanvas extends JPanel implements MouseListener, Runnable,
    */
   public Object findElement(int x, int y)
   {
-    for (Entry<Object, Rectangle> entry : nameHash.entrySet())
+    for (Entry<BinaryNode, Rectangle> entry : nameHash.entrySet())
     {
       Rectangle rect = entry.getValue();
 
       if ((x >= rect.x) && (x <= (rect.x + rect.width)) && (y >= rect.y)
               && (y <= (rect.y + rect.height)))
       {
-        return entry.getKey();
+        return entry.getKey().element();
       }
     }