X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;f=src%2Fjalview%2Fgui%2FAnnotationLabels.java;h=6b82a37e6bf6008fef112d055a5ec314563eb8e0;hb=4b031bc957ad1c5512798c6206adac7ed0364331;hp=9976604510dc300563812202b05c64ae553cd668;hpb=57738a1f3c19b1c3a00bd3ac5108f8cd0af32f99;p=jalview.git diff --git a/src/jalview/gui/AnnotationLabels.java b/src/jalview/gui/AnnotationLabels.java index 9976604..6b82a37 100755 --- a/src/jalview/gui/AnnotationLabels.java +++ b/src/jalview/gui/AnnotationLabels.java @@ -20,23 +20,6 @@ */ 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; @@ -56,6 +39,7 @@ import java.awt.geom.AffineTransform; import java.util.Arrays; import java.util.Collections; import java.util.Iterator; +import java.util.Locale; import javax.swing.JCheckBoxMenuItem; import javax.swing.JMenuItem; @@ -64,6 +48,23 @@ import javax.swing.JPopupMenu; import javax.swing.SwingUtilities; import javax.swing.ToolTipManager; +import jalview.analysis.AlignSeq; +import jalview.analysis.AlignmentUtils; +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.FileFormat; +import jalview.io.FormatAdapter; +import jalview.util.Comparison; +import jalview.util.MessageManager; +import jalview.util.Platform; + /** * The panel that holds the labels for alignment annotations, providing * tooltips, context menus, drag to reorder rows, and drag to adjust panel @@ -293,25 +294,20 @@ public class AnnotationLabels extends JPanel EditNameDialog dialog = new EditNameDialog(annotation.label, annotation.description, name, description); - dialog.showDialog(ap.alignFrame, title, new Runnable() - { - @Override - public void run() + dialog.showDialog(ap.alignFrame, title, () -> { + annotation.label = dialog.getName(); + String text = dialog.getDescription(); + if (text != null && text.length() == 0) { - 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); + text = null; + } + annotation.description = text; + if (addNew) + { + ap.av.getAlignment().addAnnotation(annotation); + ap.av.getAlignment().setAnnotationIndex(annotation, 0); } + ap.refresh(true); }); } @@ -421,10 +417,137 @@ public class AnnotationLabels extends JPanel 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(MessageManager.getString("action.show_groups_on_matrix")); + chitem.setToolTipText(MessageManager.getString("action.show_groups_on_matrix_tooltip")); + 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(MessageManager.getString("action.show_tree_for_matrix")); + item.setToolTipText(MessageManager.getString("action.show_tree_for_matrix_tooltip")); + item.addActionListener(new ActionListener() + { + + @Override + public void actionPerformed(ActionEvent e) + { + + ap.alignFrame.showContactMapTree(alignmentAnnotation, cm); + + } + }); + pop.add(item); + } + else + { + item = new JMenuItem(MessageManager.getString("action.cluster_matrix")); + item.setToolTipText(MessageManager.getString("action.cluster_matrix_tooltip")); + item.addActionListener(new ActionListener() + { + @Override + public void actionPerformed(ActionEvent e) + { + new Thread(new Runnable() + { + @Override + public void run() + { + final long progBar; + ap.alignFrame.setProgressBar(MessageManager.formatMessage("action.clustering_matrix_for",cm.getAnnotDescr(),5f), progBar = System.currentTimeMillis()); + cm.setGroupSet(GroupSet.makeGroups(cm, 5f, true)); + ap.alignFrame.showContactMapTree(alignmentAnnotation, cm); + ap.alignFrame.setProgressBar(null, progBar); + } + }).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 @@ -1060,7 +1183,8 @@ public class AnnotationLabels extends JPanel 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; @@ -1085,6 +1209,7 @@ public class AnnotationLabels extends JPanel { hasHiddenRows = false; int olY = 0; + int nexAA = 0; for (int i = 0; i < aa.length; i++) { visible = true; @@ -1094,6 +1219,10 @@ public class AnnotationLabels extends JPanel 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) { @@ -1139,8 +1268,40 @@ public class AnnotationLabels extends JPanel { 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) { @@ -1208,16 +1369,27 @@ public class AnnotationLabels extends JPanel } 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)))