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 java.util.concurrent.Callable;
import javax.swing.JCheckBoxMenuItem;
import javax.swing.JMenuItem;
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.GroupSet;
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.schemes.AnnotationColourGradient;
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
consclipbrd.addActionListener(this);
pop.add(consclipbrd);
}
- }
+
+ addColourOrFilterByOptions(ap,aa[selectedRow],pop);
+
+ if (aa[selectedRow].graph == AlignmentAnnotation.CONTACT_MAP)
+ {
+ addContactMatrixOptions(ap,aa[selectedRow],pop);
+ // Set/adjust threshold for grouping ?
+ // colour alignment by this [type]
+ // select/hide columns by this row
+
+ }
+ }
+
pop.show(this, evt.getX(), evt.getY());
}
+ static void addColourOrFilterByOptions(final AlignmentPanel ap,
+ final AlignmentAnnotation alignmentAnnotation, final JPopupMenu pop)
+ {
+ JMenuItem item;
+ item = new JMenuItem(MessageManager.getString("label.colour_by_annotation"));
+ item.addActionListener(new ActionListener()
+ {
+
+ @Override
+ public void actionPerformed(ActionEvent e)
+ {
+ AnnotationColourChooser.displayFor(ap.av, ap,alignmentAnnotation,false);
+ };
+ });
+ pop.add(item);
+ if (alignmentAnnotation.sequenceRef!=null)
+ {
+ item = new JMenuItem(MessageManager.getString("label.colour_by_annotation")+" ("+MessageManager.getString("label.per_seq")+")");
+ item.addActionListener(new ActionListener()
+ {
+ @Override
+ public void actionPerformed(ActionEvent e)
+ {
+ AnnotationColourChooser.displayFor(ap.av, ap,alignmentAnnotation,true);
+ };
+ });
+ pop.add(item);
+ }
+ item = new JMenuItem(MessageManager.getString("action.select_by_annotation"));
+ item.addActionListener(new ActionListener()
+ {
+
+ @Override
+ public void actionPerformed(ActionEvent e)
+ {
+ AnnotationColumnChooser.displayFor(ap.av,ap,alignmentAnnotation);
+ };
+ });
+ pop.add(item);
+ }
+ static void addContactMatrixOptions(final AlignmentPanel ap,
+ final AlignmentAnnotation alignmentAnnotation, final JPopupMenu pop)
+ {
+
+ final ContactMatrixI cm = ap.av.getContactMatrix(alignmentAnnotation);
+ JMenuItem item;
+ if (cm != null)
+ {
+ pop.addSeparator();
+
+ if (cm.hasGroups())
+ {
+ JCheckBoxMenuItem chitem = new JCheckBoxMenuItem("Show Groups on Matrix");
+ boolean showGroups = alignmentAnnotation.isShowGroupsForContactMatrix();
+ final AlignmentAnnotation sel_row=alignmentAnnotation;
+ chitem.setState(showGroups);
+ chitem.addActionListener(new ActionListener()
+ {
+
+ @Override
+ public void actionPerformed(ActionEvent e)
+ {
+ sel_row.setShowGroupsForContactMatrix(chitem.getState());
+ ap.getAnnotationPanel()
+ .paint(ap.getAnnotationPanel().getGraphics());
+ }
+ });
+ pop.add(chitem);
+ }
+ if (cm.hasTree())
+ {
+ item = new JMenuItem("Show Tree for Matrix");
+ item.addActionListener(new ActionListener()
+ {
+
+ @Override
+ public void actionPerformed(ActionEvent e)
+ {
+
+ ap.alignFrame.showContactMapTree(alignmentAnnotation, cm);
+
+ }
+ });
+ pop.add(item);
+ }
+ else
+ {
+ item = new JMenuItem("Calculate Tree for Matrix");
+ item.addActionListener(new ActionListener()
+ {
+ // TODO - refactor to analysis background thread
+ @Override
+ public void actionPerformed(ActionEvent e)
+ {
+ new Thread(new Runnable()
+ {
+ @Override
+ public void run()
+ {
+ AlignmentAnnotation alan = alignmentAnnotation;
+ cm.setGroupSet(GroupSet.makeGroups(cm, 5f, true));
+ ap.alignFrame.showContactMapTree(alan, cm);
+ }
+ }).start();
+ }
+ });
+ pop.add(item);
+ }
+ }
+ }
+
/**
* A helper method that adds menu options for calculation and visualisation of
* group and/or alignment consensus annotation to a popup menu. This is
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)))