*/
package jalview.gui;
-import java.util.Locale;
-
-import jalview.analysis.AlignSeq;
-import jalview.analysis.AlignmentUtils;
-import jalview.datamodel.Alignment;
-import jalview.datamodel.AlignmentAnnotation;
-import jalview.datamodel.Annotation;
-import jalview.datamodel.HiddenColumns;
-import jalview.datamodel.Sequence;
-import jalview.datamodel.SequenceGroup;
-import jalview.datamodel.SequenceI;
-import jalview.io.FileFormat;
-import jalview.io.FormatAdapter;
-import jalview.util.Comparison;
-import jalview.util.MessageManager;
-import jalview.util.Platform;
-
import java.awt.Color;
import java.awt.Cursor;
import java.awt.Dimension;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;
import java.awt.geom.AffineTransform;
+import java.io.IOException;
import java.util.Arrays;
import java.util.Collections;
import java.util.Iterator;
+import java.util.Locale;
import javax.swing.JCheckBoxMenuItem;
import javax.swing.JMenuItem;
import javax.swing.SwingUtilities;
import javax.swing.ToolTipManager;
+import jalview.analysis.AlignSeq;
+import jalview.analysis.AlignmentUtils;
+import jalview.bin.Console;
+import jalview.datamodel.Alignment;
+import jalview.datamodel.AlignmentAnnotation;
+import jalview.datamodel.Annotation;
+import jalview.datamodel.ContactMatrixI;
+import jalview.datamodel.HiddenColumns;
+import jalview.datamodel.Sequence;
+import jalview.datamodel.SequenceGroup;
+import jalview.datamodel.SequenceI;
+import jalview.io.DataSourceType;
+import jalview.io.FileFormat;
+import jalview.io.FormatAdapter;
+import jalview.io.NewickFile;
+import jalview.util.Comparison;
+import jalview.util.MessageManager;
+import jalview.util.Platform;
+import jalview.ws.datamodel.alphafold.PAEContactMatrix;
+
/**
* The panel that holds the labels for alignment annotations, providing
* tooltips, context menus, drag to reorder rows, and drag to adjust panel
*/
public AnnotationLabels(AlignmentPanel ap)
{
-
+
this.ap = ap;
av = ap.av;
ToolTipManager.sharedInstance().registerComponent(this);
EditNameDialog dialog = new EditNameDialog(annotation.label,
annotation.description, name, description);
- dialog.showDialog(ap.alignFrame, title,
- new Runnable()
- {
- @Override
- public void run()
- {
- annotation.label = dialog.getName();
- String text = dialog.getDescription();
- if (text != null && text.length() == 0)
- {
- text = null;
- }
- annotation.description = text;
- if (addNew)
- {
- ap.av.getAlignment().addAnnotation(annotation);
- ap.av.getAlignment().setAnnotationIndex(annotation, 0);
- }
- ap.refresh(true);
- }
- });
+ dialog.showDialog(ap.alignFrame, title, () -> {
+ annotation.label = dialog.getName();
+ String text = dialog.getDescription();
+ if (text != null && text.length() == 0)
+ {
+ text = null;
+ }
+ annotation.description = text;
+ if (addNew)
+ {
+ ap.av.getAlignment().addAnnotation(annotation);
+ ap.av.getAlignment().setAnnotationIndex(annotation, 0);
+ }
+ ap.refresh(true);
+ return null;
+ });
}
@Override
consclipbrd.addActionListener(this);
pop.add(consclipbrd);
}
+ if (aa[selectedRow].graph == AlignmentAnnotation.CONTACT_MAP
+ && PAEContactMatrix.PAEMATRIX
+ .equals(aa[selectedRow].getCalcId()))
+ {
+ final PAEContactMatrix cm = (PAEContactMatrix) av
+ .getContactMatrix(aa[selectedRow]);
+ if (cm!=null && cm.getNewick()!=null && cm.getNewick().length()>0)
+ {
+ item = new JMenuItem("Show Tree for Matrix");
+ item.addActionListener(new ActionListener()
+ {
+
+ @Override
+ public void actionPerformed(ActionEvent e)
+ {
+
+ ap.alignFrame.showContactMapTree(aa[selectedRow],cm);
+
+ }
+ });
+ pop.addSeparator();
+ pop.add(item);
+ }
+
+ }
}
pop.show(this, evt.getX(), evt.getY());
}
* @param pop
*/
static void addConsensusMenuOptions(AlignmentPanel ap,
- AlignmentAnnotation ann,
- JPopupMenu pop)
+ AlignmentAnnotation ann, JPopupMenu pop)
{
pop.addSeparator();
g.translate(0, getScrollOffset());
g.setColor(Color.black);
-
+ SequenceI lastSeqRef = null;
+ String lastLabel = null;
AlignmentAnnotation[] aa = av.getAlignment().getAlignmentAnnotation();
int fontHeight = g.getFont().getSize();
int y = 0;
{
hasHiddenRows = false;
int olY = 0;
+ int nexAA = 0;
for (int i = 0; i < aa.length; i++)
{
visible = true;
continue;
}
olY = y;
+ // look ahead to next annotation
+ for (nexAA=i+1; nexAA<aa.length && !aa[nexAA].visible; nexAA++)
+ ;
y += aa[i].height;
if (clip)
{
{
offset += fm.getDescent();
}
-
- x = width - fm.stringWidth(aa[i].label) - 3;
+ String label = aa[i].label;
+ boolean vertBar = false;
+ if ((lastLabel != null && lastLabel.equals(label)))
+ {
+ label = aa[i].description;
+ }
+ else
+ {
+ if (nexAA < aa.length && label.equals(aa[nexAA].label)) // &&
+ // aa[nexY].sequenceRef==aa[i].sequenceRef)
+ {
+ lastLabel = label;
+ // next label is the same as this label
+ label = aa[i].description;
+ }
+ else
+ {
+ lastLabel = label;
+ }
+ }
+ if (aa[i].sequenceRef != null)
+ {
+ if (aa[i].sequenceRef != lastSeqRef)
+ {
+ label = aa[i].sequenceRef.getName() + " " + label;
+ // TODO record relationship between sequence and this annotation and
+ // display it here
+ }
+ else
+ {
+ vertBar = true;
+ }
+ }
+ x = width - fm.stringWidth(label) - 3;
if (aa[i].graphGroup > -1)
{
}
else
{
- g.drawString(aa[i].label, x, y + offset);
+ if (vertBar)
+ {
+ g.drawLine(width-3, y + offset-fontHeight, width-3, (int)(y - 1.5*aa[i].height-offset-fontHeight));
+ // g.drawLine(20, y + offset, x - 20, y + offset);
+
+ }
+ g.drawString(label, x, y + offset);
}
+ lastSeqRef = aa[i].sequenceRef;
}
}
if (!resizePanel && dragEvent != null && aa != null)
{
g.setColor(Color.lightGray);
- g.drawString(aa[selectedRow].label, dragEvent.getX(),
- dragEvent.getY() - getScrollOffset());
+ g.drawString(
+ (aa[selectedRow].sequenceRef == null ? ""
+ : aa[selectedRow].sequenceRef.getName())
+ + aa[selectedRow].label,
+ dragEvent.getX(), dragEvent.getY() - getScrollOffset());
}
if (!av.getWrapAlignment() && ((aa == null) || (aa.length < 1)))