X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;ds=sidebyside;f=src%2Fjalview%2Fgui%2FAnnotationLabels.java;h=d07cae270ebb4f259e8a21a7427f889fb8e9695e;hb=90ae01c1c1504e0ae42817f78116f1d35b317c47;hp=a5448133ca9a0a24eb1b7c84c4e240d45f1755f2;hpb=be32c14cd8e48fe0a207cd7030cb9cd46f894678;p=jalview.git
diff --git a/src/jalview/gui/AnnotationLabels.java b/src/jalview/gui/AnnotationLabels.java
index a544813..d07cae2 100755
--- a/src/jalview/gui/AnnotationLabels.java
+++ b/src/jalview/gui/AnnotationLabels.java
@@ -20,6 +20,17 @@
*/
package jalview.gui;
+import jalview.analysis.AlignmentUtils;
+import jalview.datamodel.Alignment;
+import jalview.datamodel.AlignmentAnnotation;
+import jalview.datamodel.Annotation;
+import jalview.datamodel.Sequence;
+import jalview.datamodel.SequenceGroup;
+import jalview.datamodel.SequenceI;
+import jalview.io.FileFormat;
+import jalview.io.FormatAdapter;
+import jalview.util.MessageManager;
+
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Font;
@@ -50,32 +61,25 @@ import javax.swing.JPopupMenu;
import javax.swing.SwingUtilities;
import javax.swing.ToolTipManager;
-import jalview.analysis.AlignmentUtils;
-import jalview.datamodel.Alignment;
-import jalview.datamodel.AlignmentAnnotation;
-import jalview.datamodel.Annotation;
-import jalview.datamodel.Sequence;
-import jalview.datamodel.SequenceGroup;
-import jalview.datamodel.SequenceI;
-import jalview.io.FormatAdapter;
-import jalview.util.MessageManager;
-
/**
* DOCUMENT ME!
*
* @author $author$
* @version $Revision$
*/
-public class AnnotationLabels extends JPanel implements MouseListener,
- MouseMotionListener, ActionListener
+public class AnnotationLabels extends JPanel
+ implements MouseListener, MouseMotionListener, ActionListener
{
- private static final Pattern LEFT_ANGLE_BRACKET_PATTERN = Pattern.compile("<");
+ private static final Pattern LEFT_ANGLE_BRACKET_PATTERN = Pattern
+ .compile("<");
- String TOGGLE_LABELSCALE = MessageManager.getString("label.scale_label_to_column");
+ String TOGGLE_LABELSCALE = MessageManager
+ .getString("label.scale_label_to_column");
String ADDNEW = MessageManager.getString("label.add_new_row");
- String EDITNAME = MessageManager.getString("label.edit_label_description");
+ String EDITNAME = MessageManager
+ .getString("label.edit_label_description");
String HIDE = MessageManager.getString("label.hide_row");
@@ -85,7 +89,8 @@ public class AnnotationLabels extends JPanel implements MouseListener,
String OUTPUT_TEXT = MessageManager.getString("label.export_annotation");
- String COPYCONS_SEQ = MessageManager.getString("label.copy_consensus_sequence");
+ String COPYCONS_SEQ = MessageManager
+ .getString("label.copy_consensus_sequence");
boolean resizePanel = false;
@@ -208,11 +213,13 @@ public class AnnotationLabels extends JPanel implements MouseListener,
* @param evt
* DOCUMENT ME!
*/
+ @Override
public void actionPerformed(ActionEvent evt)
{
AlignmentAnnotation[] aa = ap.av.getAlignment()
.getAlignmentAnnotation();
+ boolean fullRepaint = false;
if (evt.getActionCommand().equals(ADDNEW))
{
AlignmentAnnotation newAnnotation = new AlignmentAnnotation(null,
@@ -225,11 +232,16 @@ public class AnnotationLabels extends JPanel implements MouseListener,
ap.av.getAlignment().addAnnotation(newAnnotation);
ap.av.getAlignment().setAnnotationIndex(newAnnotation, 0);
+ fullRepaint = true;
}
else if (evt.getActionCommand().equals(EDITNAME))
{
+ String name = aa[selectedRow].label;
editLabelDescription(aa[selectedRow]);
- repaint();
+ if (!name.equalsIgnoreCase(aa[selectedRow].label))
+ {
+ fullRepaint = true;
+ }
}
else if (evt.getActionCommand().equals(HIDE))
{
@@ -238,6 +250,8 @@ public class AnnotationLabels extends JPanel implements MouseListener,
else if (evt.getActionCommand().equals(DELETE))
{
ap.av.getAlignment().deleteAnnotation(aa[selectedRow]);
+ ap.av.getCalcManager().removeWorkerForAnnotation(aa[selectedRow]);
+ fullRepaint = true;
}
else if (evt.getActionCommand().equals(SHOWALL))
{
@@ -248,12 +262,13 @@ public class AnnotationLabels extends JPanel implements MouseListener,
aa[i].visible = true;
}
}
+ fullRepaint = true;
}
else if (evt.getActionCommand().equals(OUTPUT_TEXT))
{
new AnnotationExporter().exportAnnotations(ap,
new AlignmentAnnotation[]
- { aa[selectedRow] });
+ { aa[selectedRow] });
}
else if (evt.getActionCommand().equals(COPYCONS_SEQ))
{
@@ -277,18 +292,8 @@ public class AnnotationLabels extends JPanel implements MouseListener,
aa[selectedRow].scaleColLabel = !aa[selectedRow].scaleColLabel;
}
- refresh();
-
- }
+ ap.refresh(fullRepaint);
- /**
- * Redraw sensibly.
- */
- protected void refresh()
- {
- ap.validateAnnotationDimensions(false);
- ap.addNotify();
- ap.repaint();
}
/**
@@ -299,6 +304,7 @@ public class AnnotationLabels extends JPanel implements MouseListener,
*/
boolean editLabelDescription(AlignmentAnnotation annotation)
{
+ // TODO i18n
EditNameDialog dialog = new EditNameDialog(annotation.label,
annotation.description, " Annotation Name ",
"Annotation Description ", "Edit Annotation Name/Description",
@@ -321,406 +327,152 @@ public class AnnotationLabels extends JPanel implements MouseListener,
return true;
}
- /**
- * DOCUMENT ME!
- *
- * @param evt
- * DOCUMENT ME!
- */
+ @Override
public void mousePressed(MouseEvent evt)
{
getSelectedRow(evt.getY() - getScrollOffset());
oldY = evt.getY();
- }
-
- /**
- * DOCUMENT ME!
- *
- * @param evt
- * DOCUMENT ME!
- */
- public void mouseReleased(MouseEvent evt)
- {
- int start = selectedRow;
- getSelectedRow(evt.getY() - getScrollOffset());
- int end = selectedRow;
-
- if (start != end)
+ if (evt.isPopupTrigger())
{
- // Swap these annotations
- AlignmentAnnotation startAA = ap.av.getAlignment()
- .getAlignmentAnnotation()[start];
- if (end == -1)
- {
- end = ap.av.getAlignment().getAlignmentAnnotation().length - 1;
- }
- AlignmentAnnotation endAA = ap.av.getAlignment()
- .getAlignmentAnnotation()[end];
-
- ap.av.getAlignment().getAlignmentAnnotation()[end] = startAA;
- ap.av.getAlignment().getAlignmentAnnotation()[start] = endAA;
+ showPopupMenu(evt);
}
-
- resizePanel = false;
- dragEvent = null;
- repaint();
- ap.getAnnotationPanel().repaint();
}
/**
- * DOCUMENT ME!
+ * Build and show the Pop-up menu at the right-click mouse position
*
* @param evt
- * DOCUMENT ME!
*/
- public void mouseEntered(MouseEvent evt)
+ void showPopupMenu(MouseEvent evt)
{
- if (evt.getY() < 10)
- {
- resizePanel = true;
- repaint();
- }
- }
+ evt.consume();
+ final AlignmentAnnotation[] aa = ap.av.getAlignment()
+ .getAlignmentAnnotation();
- /**
- * DOCUMENT ME!
- *
- * @param evt
- * DOCUMENT ME!
- */
- public void mouseExited(MouseEvent evt)
- {
- if (dragEvent == null)
+ JPopupMenu pop = new JPopupMenu(
+ MessageManager.getString("label.annotations"));
+ JMenuItem item = new JMenuItem(ADDNEW);
+ item.addActionListener(this);
+ pop.add(item);
+ if (selectedRow < 0)
{
- resizePanel = false;
- repaint();
+ if (hasHiddenRows)
+ { // let the user make everything visible again
+ item = new JMenuItem(SHOWALL);
+ item.addActionListener(this);
+ pop.add(item);
+ }
+ pop.show(this, evt.getX(), evt.getY());
+ return;
}
- }
-
- /**
- * DOCUMENT ME!
- *
- * @param evt
- * DOCUMENT ME!
- */
- public void mouseDragged(MouseEvent evt)
- {
- dragEvent = evt;
-
- if (resizePanel)
+ item = new JMenuItem(EDITNAME);
+ item.addActionListener(this);
+ pop.add(item);
+ item = new JMenuItem(HIDE);
+ item.addActionListener(this);
+ pop.add(item);
+ // JAL-1264 hide all sequence-specific annotations of this type
+ if (selectedRow < aa.length)
{
- Dimension d = ap.annotationScroller.getPreferredSize();
- int dif = evt.getY() - oldY;
-
- dif /= ap.av.getCharHeight();
- dif *= ap.av.getCharHeight();
-
- if ((d.height - dif) > 20)
+ if (aa[selectedRow].sequenceRef != null)
{
- ap.annotationScroller.setPreferredSize(new Dimension(d.width,
- d.height - dif));
- d = ap.annotationSpaceFillerHolder.getPreferredSize();
- ap.annotationSpaceFillerHolder.setPreferredSize(new Dimension(
- d.width, d.height - dif));
- ap.paintAlignment(true);
+ final String label = aa[selectedRow].label;
+ JMenuItem hideType = new JMenuItem();
+ String text = MessageManager.getString("label.hide_all") + " "
+ + label;
+ hideType.setText(text);
+ hideType.addActionListener(new ActionListener()
+ {
+ @Override
+ public void actionPerformed(ActionEvent e)
+ {
+ AlignmentUtils.showOrHideSequenceAnnotations(
+ ap.av.getAlignment(), Collections.singleton(label),
+ null, false, false);
+ // for (AlignmentAnnotation ann : ap.av.getAlignment()
+ // .getAlignmentAnnotation())
+ // {
+ // if (ann.sequenceRef != null && ann.label != null
+ // && ann.label.equals(label))
+ // {
+ // ann.visible = false;
+ // }
+ // }
+ ap.refresh(true);
+ }
+ });
+ pop.add(hideType);
}
-
- ap.addNotify();
}
- else
+ item = new JMenuItem(DELETE);
+ item.addActionListener(this);
+ pop.add(item);
+ if (hasHiddenRows)
{
- repaint();
+ item = new JMenuItem(SHOWALL);
+ item.addActionListener(this);
+ pop.add(item);
}
- }
-
- /**
- * DOCUMENT ME!
- *
- * @param evt
- * DOCUMENT ME!
- */
- public void mouseMoved(MouseEvent evt)
- {
- resizePanel = evt.getY() < 10;
-
- getSelectedRow(evt.getY() - getScrollOffset());
-
- if (selectedRow > -1
- && ap.av.getAlignment().getAlignmentAnnotation().length > selectedRow)
+ item = new JMenuItem(OUTPUT_TEXT);
+ item.addActionListener(this);
+ pop.add(item);
+ // TODO: annotation object should be typed for autocalculated/derived
+ // property methods
+ if (selectedRow < aa.length)
{
- AlignmentAnnotation aa = ap.av.getAlignment()
- .getAlignmentAnnotation()[selectedRow];
-
- StringBuffer desc = new StringBuffer();
- if (aa.description != null
- && !aa.description.equals("New description"))
+ final String label = aa[selectedRow].label;
+ if (!aa[selectedRow].autoCalculated)
{
- // TODO: we could refactor and merge this code with the code in
- // jalview.gui.SeqPanel.mouseMoved(..) that formats sequence feature
- // tooltips
- desc.append(aa.getDescription(true).trim());
- // check to see if the description is an html fragment.
- if (desc.length() < 6
- || (desc.substring(0, 6).toLowerCase().indexOf("") < 0))
+ if (aa[selectedRow].graph == AlignmentAnnotation.NO_GRAPH)
{
- // clean the description ready for embedding in html
- desc = new StringBuffer(LEFT_ANGLE_BRACKET_PATTERN.matcher(desc)
- .replaceAll("<"));
- desc.insert(0, "");
+ // display formatting settings for this row.
+ pop.addSeparator();
+ // av and sequencegroup need to implement same interface for
+ item = new JCheckBoxMenuItem(TOGGLE_LABELSCALE,
+ aa[selectedRow].scaleColLabel);
+ item.addActionListener(this);
+ pop.add(item);
}
- else
+ }
+ else if (label.indexOf("Consensus") > -1)
+ {
+ pop.addSeparator();
+ // av and sequencegroup need to implement same interface for
+ final JCheckBoxMenuItem cbmi = new JCheckBoxMenuItem(
+ MessageManager.getString("label.ignore_gaps_consensus"),
+ (aa[selectedRow].groupRef != null)
+ ? aa[selectedRow].groupRef.getIgnoreGapsConsensus()
+ : ap.av.isIgnoreGapsConsensus());
+ final AlignmentAnnotation aaa = aa[selectedRow];
+ cbmi.addActionListener(new ActionListener()
{
- // remove terminating html if any
- int i = desc.substring(desc.length() - 7).toLowerCase()
- .lastIndexOf("");
- if (i > -1)
+ @Override
+ public void actionPerformed(ActionEvent e)
{
- desc.setLength(desc.length() - 7 + i);
+ if (aaa.groupRef != null)
+ {
+ // TODO: pass on reference to ap so the view can be updated.
+ aaa.groupRef.setIgnoreGapsConsensus(cbmi.getState());
+ ap.getAnnotationPanel()
+ .paint(ap.getAnnotationPanel().getGraphics());
+ }
+ else
+ {
+ ap.av.setIgnoreGapsConsensus(cbmi.getState(), ap);
+ }
+ ap.alignmentChanged();
}
- }
- if (aa.hasScore())
- {
- desc.append("
");
- }
- // if (aa.hasProperties())
- // {
- // desc.append("
");
- // for (String prop : aa.getProperties())
- // {
- // desc.append("" + prop + " | "
- // + aa.getProperty(prop) + " |
");
- // }
- // desc.append("
");
- // }
- }
- else
- {
- // begin the tooltip's html fragment
- desc.append("");
- if (aa.hasScore())
- {
- // TODO: limit precision of score to avoid noise from imprecise
- // doubles
- // (64.7 becomes 64.7+/some tiny value).
- desc.append(" Score: " + aa.score);
- }
- }
- if (desc.length() > 6)
- {
- desc.append("");
- this.setToolTipText(desc.toString());
- }
- else
- {
- this.setToolTipText(null);
- }
- }
- }
-
- /**
- * DOCUMENT ME!
- *
- * @param evt
- * DOCUMENT ME!
- */
- public void mouseClicked(MouseEvent evt)
- {
- final AlignmentAnnotation[] aa = ap.av.getAlignment()
- .getAlignmentAnnotation();
- if (SwingUtilities.isLeftMouseButton(evt))
- {
- if (selectedRow > -1 && selectedRow < aa.length)
- {
- if (aa[selectedRow].groupRef != null)
- {
- if (evt.getClickCount() >= 2)
- {
- // todo: make the ap scroll to the selection - not necessary, first
- // click highlights/scrolls, second selects
- ap.getSeqPanel().ap.getIdPanel().highlightSearchResults(null);
- ap.av.setSelectionGroup(// new SequenceGroup(
- aa[selectedRow].groupRef); // );
- ap.paintAlignment(false);
- PaintRefresher.Refresh(ap, ap.av.getSequenceSetId());
- ap.av.sendSelection();
- }
- else
- {
- ap.getSeqPanel().ap.getIdPanel()
- .highlightSearchResults(aa[selectedRow].groupRef
- .getSequences(null));
- }
- return;
- }
- else if (aa[selectedRow].sequenceRef != null)
- {
- if (evt.getClickCount() == 1)
- {
- ap.getSeqPanel().ap.getIdPanel().highlightSearchResults(Arrays
- .asList(new SequenceI[]
- { aa[selectedRow].sequenceRef }));
- }
- else if (evt.getClickCount() >= 2)
- {
- ap.getSeqPanel().ap.getIdPanel().highlightSearchResults(null);
- SequenceGroup sg = ap.av.getSelectionGroup();
- if (sg!=null)
- {
- // we make a copy rather than edit the current selection if no modifiers pressed
- // see Enhancement JAL-1557
- if (!(evt.isControlDown() || evt.isShiftDown()))
- {
- sg = new SequenceGroup(sg);
- sg.clear();
- sg.addSequence(aa[selectedRow].sequenceRef, false);
- } else {
- if (evt.isControlDown())
- {
- sg.addOrRemove(aa[selectedRow].sequenceRef, true);
- } else {
- // notionally, we should also add intermediate sequences from last added sequence ?
- sg.addSequence(aa[selectedRow].sequenceRef, true);
- }
- }
- } else {
- sg = new SequenceGroup();
- sg.setStartRes(0);
- sg.setEndRes(ap.av.getAlignment().getWidth()-1);
- sg.addSequence(aa[selectedRow].sequenceRef, false);
- }
- ap.av.setSelectionGroup(sg);
- ap.av.sendSelection();
- ap.paintAlignment(false);
- PaintRefresher.Refresh(ap, ap.av.getSequenceSetId());
- }
-
- }
- }
- }
- if (!SwingUtilities.isRightMouseButton(evt))
- {
- return;
- }
-
- JPopupMenu pop = new JPopupMenu(
- MessageManager.getString("label.annotations"));
- JMenuItem item = new JMenuItem(ADDNEW);
- item.addActionListener(this);
- pop.add(item);
- if (selectedRow < 0)
- {
- if (hasHiddenRows)
- { // let the user make everything visible again
- item = new JMenuItem(SHOWALL);
- item.addActionListener(this);
- pop.add(item);
- }
- pop.show(this, evt.getX(), evt.getY());
- return;
- }
- item = new JMenuItem(EDITNAME);
- item.addActionListener(this);
- pop.add(item);
- item = new JMenuItem(HIDE);
- item.addActionListener(this);
- pop.add(item);
- // JAL-1264 hide all sequence-specific annotations of this type
- if (selectedRow < aa.length)
- {
- if (aa[selectedRow].sequenceRef != null)
- {
- final String label = aa[selectedRow].label;
- JMenuItem hideType = new JMenuItem();
- String text = MessageManager.getString("label.hide_all") + " " + label;
- hideType.setText(text);
- hideType.addActionListener(new ActionListener()
- {
- @Override
- public void actionPerformed(ActionEvent e)
- {
- AlignmentUtils.showOrHideSequenceAnnotations(
- ap.av.getAlignment(), Collections.singleton(label),
- null, false, false);
- // for (AlignmentAnnotation ann : ap.av.getAlignment()
- // .getAlignmentAnnotation())
- // {
- // if (ann.sequenceRef != null && ann.label != null
- // && ann.label.equals(label))
- // {
- // ann.visible = false;
- // }
- // }
- refresh();
- }
- });
- pop.add(hideType);
- }
- }
- item = new JMenuItem(DELETE);
- item.addActionListener(this);
- pop.add(item);
- if (hasHiddenRows)
- {
- item = new JMenuItem(SHOWALL);
- item.addActionListener(this);
- pop.add(item);
- }
- item = new JMenuItem(OUTPUT_TEXT);
- item.addActionListener(this);
- pop.add(item);
- // TODO: annotation object should be typed for autocalculated/derived
- // property methods
- if (selectedRow < aa.length)
- {
- final String label = aa[selectedRow].label;
- if (!aa[selectedRow].autoCalculated)
- {
- if (aa[selectedRow].graph == AlignmentAnnotation.NO_GRAPH)
- {
- // display formatting settings for this row.
- pop.addSeparator();
- // av and sequencegroup need to implement same interface for
- item = new JCheckBoxMenuItem(TOGGLE_LABELSCALE,
- aa[selectedRow].scaleColLabel);
- item.addActionListener(this);
- pop.add(item);
- }
- }
- else if (label.indexOf("Consensus") > -1)
- {
- pop.addSeparator();
- // av and sequencegroup need to implement same interface for
- final JCheckBoxMenuItem cbmi = new JCheckBoxMenuItem(
- MessageManager.getString("label.ignore_gaps_consensus"),
- (aa[selectedRow].groupRef != null) ? aa[selectedRow].groupRef
- .getIgnoreGapsConsensus() : ap.av
- .isIgnoreGapsConsensus());
- final AlignmentAnnotation aaa = aa[selectedRow];
- cbmi.addActionListener(new ActionListener()
- {
- public void actionPerformed(ActionEvent e)
- {
- if (aaa.groupRef != null)
- {
- // TODO: pass on reference to ap so the view can be updated.
- aaa.groupRef.setIgnoreGapsConsensus(cbmi.getState());
- ap.getAnnotationPanel().paint(ap.getAnnotationPanel().getGraphics());
- }
- else
- {
- ap.av.setIgnoreGapsConsensus(cbmi.getState(), ap);
- }
- }
- });
- pop.add(cbmi);
- // av and sequencegroup need to implement same interface for
- if (aaa.groupRef != null)
+ });
+ pop.add(cbmi);
+ // av and sequencegroup need to implement same interface for
+ if (aaa.groupRef != null)
{
final JCheckBoxMenuItem chist = new JCheckBoxMenuItem(
- MessageManager.getString("label.show_group_histogram"),
+ MessageManager.getString("label.show_group_histogram"),
aa[selectedRow].groupRef.isShowConsensusHistogram());
chist.addActionListener(new ActionListener()
{
+ @Override
public void actionPerformed(ActionEvent e)
{
// TODO: pass on reference
@@ -736,10 +488,11 @@ public class AnnotationLabels extends JPanel implements MouseListener,
});
pop.add(chist);
final JCheckBoxMenuItem cprofl = new JCheckBoxMenuItem(
- MessageManager.getString("label.show_group_logo"),
+ MessageManager.getString("label.show_group_logo"),
aa[selectedRow].groupRef.isShowSequenceLogo());
cprofl.addActionListener(new ActionListener()
{
+ @Override
public void actionPerformed(ActionEvent e)
{
// TODO: pass on reference
@@ -755,10 +508,11 @@ public class AnnotationLabels extends JPanel implements MouseListener,
});
pop.add(cprofl);
final JCheckBoxMenuItem cproflnorm = new JCheckBoxMenuItem(
- MessageManager.getString("label.normalise_group_logo"),
+ MessageManager.getString("label.normalise_group_logo"),
aa[selectedRow].groupRef.isNormaliseSequenceLogo());
cproflnorm.addActionListener(new ActionListener()
{
+ @Override
public void actionPerformed(ActionEvent e)
{
@@ -780,9 +534,11 @@ public class AnnotationLabels extends JPanel implements MouseListener,
else
{
final JCheckBoxMenuItem chist = new JCheckBoxMenuItem(
- MessageManager.getString("label.show_histogram"), av.isShowConsensusHistogram());
+ MessageManager.getString("label.show_histogram"),
+ av.isShowConsensusHistogram());
chist.addActionListener(new ActionListener()
{
+ @Override
public void actionPerformed(ActionEvent e)
{
// TODO: pass on reference
@@ -799,9 +555,11 @@ public class AnnotationLabels extends JPanel implements MouseListener,
});
pop.add(chist);
final JCheckBoxMenuItem cprof = new JCheckBoxMenuItem(
- MessageManager.getString("label.show_logo"), av.isShowSequenceLogo());
+ MessageManager.getString("label.show_logo"),
+ av.isShowSequenceLogo());
cprof.addActionListener(new ActionListener()
{
+ @Override
public void actionPerformed(ActionEvent e)
{
// TODO: pass on reference
@@ -818,9 +576,11 @@ public class AnnotationLabels extends JPanel implements MouseListener,
});
pop.add(cprof);
final JCheckBoxMenuItem cprofnorm = new JCheckBoxMenuItem(
- MessageManager.getString("label.normalise_logo"), av.isNormaliseSequenceLogo());
+ MessageManager.getString("label.normalise_logo"),
+ av.isNormaliseSequenceLogo());
cprofnorm.addActionListener(new ActionListener()
{
+ @Override
public void actionPerformed(ActionEvent e)
{
// TODO: pass on reference
@@ -847,6 +607,323 @@ public class AnnotationLabels extends JPanel implements MouseListener,
}
/**
+ * DOCUMENT ME!
+ *
+ * @param evt
+ * DOCUMENT ME!
+ */
+ @Override
+ public void mouseReleased(MouseEvent evt)
+ {
+ if (evt.isPopupTrigger())
+ {
+ showPopupMenu(evt);
+ return;
+ }
+
+ int start = selectedRow;
+ getSelectedRow(evt.getY() - getScrollOffset());
+ int end = selectedRow;
+
+ if (start != end)
+ {
+ // Swap these annotations
+ AlignmentAnnotation startAA = ap.av.getAlignment()
+ .getAlignmentAnnotation()[start];
+ if (end == -1)
+ {
+ end = ap.av.getAlignment().getAlignmentAnnotation().length - 1;
+ }
+ AlignmentAnnotation endAA = ap.av.getAlignment()
+ .getAlignmentAnnotation()[end];
+
+ ap.av.getAlignment().getAlignmentAnnotation()[end] = startAA;
+ ap.av.getAlignment().getAlignmentAnnotation()[start] = endAA;
+ }
+
+ resizePanel = false;
+ dragEvent = null;
+ repaint();
+ ap.getAnnotationPanel().repaint();
+ }
+
+ /**
+ * DOCUMENT ME!
+ *
+ * @param evt
+ * DOCUMENT ME!
+ */
+ @Override
+ public void mouseEntered(MouseEvent evt)
+ {
+ if (evt.getY() < 10)
+ {
+ resizePanel = true;
+ repaint();
+ }
+ }
+
+ /**
+ * DOCUMENT ME!
+ *
+ * @param evt
+ * DOCUMENT ME!
+ */
+ @Override
+ public void mouseExited(MouseEvent evt)
+ {
+ if (dragEvent == null)
+ {
+ resizePanel = false;
+ repaint();
+ }
+ }
+
+ /**
+ * DOCUMENT ME!
+ *
+ * @param evt
+ * DOCUMENT ME!
+ */
+ @Override
+ public void mouseDragged(MouseEvent evt)
+ {
+ dragEvent = evt;
+
+ if (resizePanel)
+ {
+ Dimension d = ap.annotationScroller.getPreferredSize();
+ int dif = evt.getY() - oldY;
+
+ dif /= ap.av.getCharHeight();
+ dif *= ap.av.getCharHeight();
+
+ if ((d.height - dif) > 20)
+ {
+ ap.annotationScroller
+ .setPreferredSize(new Dimension(d.width, d.height - dif));
+ d = ap.annotationSpaceFillerHolder.getPreferredSize();
+ ap.annotationSpaceFillerHolder
+ .setPreferredSize(new Dimension(d.width, d.height - dif));
+ ap.paintAlignment(true);
+ }
+
+ ap.addNotify();
+ }
+ else
+ {
+ repaint();
+ }
+ }
+
+ /**
+ * DOCUMENT ME!
+ *
+ * @param evt
+ * DOCUMENT ME!
+ */
+ @Override
+ public void mouseMoved(MouseEvent evt)
+ {
+ resizePanel = evt.getY() < 10;
+
+ getSelectedRow(evt.getY() - getScrollOffset());
+
+ if (selectedRow > -1 && ap.av.getAlignment()
+ .getAlignmentAnnotation().length > selectedRow)
+ {
+ AlignmentAnnotation aa = ap.av.getAlignment()
+ .getAlignmentAnnotation()[selectedRow];
+
+ StringBuffer desc = new StringBuffer();
+ if (aa.description != null
+ && !aa.description.equals("New description"))
+ {
+ // TODO: we could refactor and merge this code with the code in
+ // jalview.gui.SeqPanel.mouseMoved(..) that formats sequence feature
+ // tooltips
+ desc.append(aa.getDescription(true).trim());
+ // check to see if the description is an html fragment.
+ if (desc.length() < 6 || (desc.substring(0, 6).toLowerCase()
+ .indexOf("") < 0))
+ {
+ // clean the description ready for embedding in html
+ desc = new StringBuffer(LEFT_ANGLE_BRACKET_PATTERN.matcher(desc)
+ .replaceAll("<"));
+ desc.insert(0, "");
+ }
+ else
+ {
+ // remove terminating html if any
+ int i = desc.substring(desc.length() - 7).toLowerCase()
+ .lastIndexOf("");
+ if (i > -1)
+ {
+ desc.setLength(desc.length() - 7 + i);
+ }
+ }
+ if (aa.hasScore())
+ {
+ desc.append("
");
+ }
+ // if (aa.hasProperties())
+ // {
+ // desc.append("");
+ // for (String prop : aa.getProperties())
+ // {
+ // desc.append("" + prop + " | "
+ // + aa.getProperty(prop) + " |
");
+ // }
+ // desc.append("
");
+ // }
+ }
+ else
+ {
+ // begin the tooltip's html fragment
+ desc.append("");
+ if (aa.hasScore())
+ {
+ // TODO: limit precision of score to avoid noise from imprecise
+ // doubles
+ // (64.7 becomes 64.7+/some tiny value).
+ desc.append(" Score: " + aa.score);
+ }
+ }
+ if (desc.length() > 6)
+ {
+ desc.append("");
+ this.setToolTipText(desc.toString());
+ }
+ else
+ {
+ this.setToolTipText(null);
+ }
+ }
+ }
+
+ @Override
+ public void mouseClicked(MouseEvent evt)
+ {
+ final AlignmentAnnotation[] aa = ap.av.getAlignment()
+ .getAlignmentAnnotation();
+ if (!evt.isPopupTrigger() && SwingUtilities.isLeftMouseButton(evt))
+ {
+ if (selectedRow > -1 && selectedRow < aa.length)
+ {
+ if (aa[selectedRow].groupRef != null)
+ {
+ if (evt.getClickCount() >= 2)
+ {
+ // todo: make the ap scroll to the selection - not necessary, first
+ // click highlights/scrolls, second selects
+ ap.getSeqPanel().ap.getIdPanel().highlightSearchResults(null);
+ // process modifiers
+ SequenceGroup sg = ap.av.getSelectionGroup();
+ if (sg == null || sg == aa[selectedRow].groupRef
+ || !(jalview.util.Platform.isControlDown(evt)
+ || evt.isShiftDown()))
+ {
+ if (jalview.util.Platform.isControlDown(evt)
+ || evt.isShiftDown())
+ {
+ // clone a new selection group from the associated group
+ ap.av.setSelectionGroup(
+ new SequenceGroup(aa[selectedRow].groupRef));
+ }
+ else
+ {
+ // set selection to the associated group so it can be edited
+ ap.av.setSelectionGroup(aa[selectedRow].groupRef);
+ }
+ }
+ else
+ {
+ // modify current selection with associated group
+ int remainToAdd = aa[selectedRow].groupRef.getSize();
+ for (SequenceI sgs : aa[selectedRow].groupRef.getSequences())
+ {
+ if (jalview.util.Platform.isControlDown(evt))
+ {
+ sg.addOrRemove(sgs, --remainToAdd == 0);
+ }
+ else
+ {
+ // notionally, we should also add intermediate sequences from
+ // last added sequence ?
+ sg.addSequence(sgs, --remainToAdd == 0);
+ }
+ }
+ }
+
+ ap.paintAlignment(false);
+ PaintRefresher.Refresh(ap, ap.av.getSequenceSetId());
+ ap.av.sendSelection();
+ }
+ else
+ {
+ ap.getSeqPanel().ap.getIdPanel().highlightSearchResults(
+ aa[selectedRow].groupRef.getSequences(null));
+ }
+ return;
+ }
+ else if (aa[selectedRow].sequenceRef != null)
+ {
+ if (evt.getClickCount() == 1)
+ {
+ ap.getSeqPanel().ap.getIdPanel()
+ .highlightSearchResults(Arrays.asList(new SequenceI[]
+ { aa[selectedRow].sequenceRef }));
+ }
+ else if (evt.getClickCount() >= 2)
+ {
+ ap.getSeqPanel().ap.getIdPanel().highlightSearchResults(null);
+ SequenceGroup sg = ap.av.getSelectionGroup();
+ if (sg != null)
+ {
+ // we make a copy rather than edit the current selection if no
+ // modifiers pressed
+ // see Enhancement JAL-1557
+ if (!(jalview.util.Platform.isControlDown(evt)
+ || evt.isShiftDown()))
+ {
+ sg = new SequenceGroup(sg);
+ sg.clear();
+ sg.addSequence(aa[selectedRow].sequenceRef, false);
+ }
+ else
+ {
+ if (jalview.util.Platform.isControlDown(evt))
+ {
+ sg.addOrRemove(aa[selectedRow].sequenceRef, true);
+ }
+ else
+ {
+ // notionally, we should also add intermediate sequences from
+ // last added sequence ?
+ sg.addSequence(aa[selectedRow].sequenceRef, true);
+ }
+ }
+ }
+ else
+ {
+ sg = new SequenceGroup();
+ sg.setStartRes(0);
+ sg.setEndRes(ap.av.getAlignment().getWidth() - 1);
+ sg.addSequence(aa[selectedRow].sequenceRef, false);
+ }
+ ap.av.setSelectionGroup(sg);
+ ap.paintAlignment(false);
+ PaintRefresher.Refresh(ap, ap.av.getSequenceSetId());
+ ap.av.sendSelection();
+ }
+
+ }
+ }
+ return;
+ }
+ }
+
+ /**
* do a single sequence copy to jalview and the system clipboard
*
* @param sq
@@ -854,11 +931,9 @@ public class AnnotationLabels extends JPanel implements MouseListener,
*/
protected void copy_annotseqtoclipboard(SequenceI sq)
{
- SequenceI[] seqs = new SequenceI[]
- { sq };
+ SequenceI[] seqs = new SequenceI[] { sq };
String[] omitHidden = null;
- SequenceI[] dseqs = new SequenceI[]
- { sq.getDatasetSequence() };
+ SequenceI[] dseqs = new SequenceI[] { sq.getDatasetSequence() };
if (dseqs[0] == null)
{
dseqs[0] = new Sequence(sq);
@@ -870,29 +945,35 @@ public class AnnotationLabels extends JPanel implements MouseListener,
Alignment ds = new Alignment(dseqs);
if (av.hasHiddenColumns())
{
- omitHidden = av.getColumnSelection().getVisibleSequenceStrings(0,
- sq.getLength(), seqs);
+ omitHidden = av.getAlignment().getHiddenColumns()
+ .getVisibleSequenceStrings(0, sq.getLength(), seqs);
}
- String output = new FormatAdapter().formatSequences("Fasta", seqs,
- omitHidden);
+ int[] alignmentStartEnd = new int[] { 0, ds.getWidth() - 1 };
+ if (av.hasHiddenColumns())
+ {
+ alignmentStartEnd = av.getAlignment().getHiddenColumns()
+ .getVisibleStartAndEndIndex(av.getAlignment().getWidth());
+ }
+
+ String output = new FormatAdapter().formatSequences(FileFormat.Fasta,
+ seqs, omitHidden, alignmentStartEnd);
Toolkit.getDefaultToolkit().getSystemClipboard()
.setContents(new StringSelection(output), Desktop.instance);
ArrayList hiddenColumns = null;
+
if (av.hasHiddenColumns())
{
- hiddenColumns = new ArrayList();
- for (int[] region : av.getColumnSelection().getHiddenColumns())
- {
- hiddenColumns.add(new int[]
- { region[0], region[1] });
- }
+ hiddenColumns = av.getAlignment().getHiddenColumns()
+ .getHiddenColumnsCopy();
}
- Desktop.jalviewClipboard = new Object[]
- { seqs, ds, // what is the dataset of a consensus sequence ? need to flag
+ Desktop.jalviewClipboard = new Object[] { seqs, ds, // what is the dataset
+ // of a consensus
+ // sequence ? need to
+ // flag
// sequence as special.
hiddenColumns };
}
@@ -903,6 +984,7 @@ public class AnnotationLabels extends JPanel implements MouseListener,
* @param g1
* DOCUMENT ME!
*/
+ @Override
public void paintComponent(Graphics g)
{
@@ -981,8 +1063,9 @@ public class AnnotationLabels extends JPanel implements MouseListener,
int ofontH = fontHeight;
int sOffset = 0;
int visHeight = 0;
- int[] visr = (ap != null && ap.getAnnotationPanel() != null) ? ap.getAnnotationPanel()
- .getVisibleVRange() : null;
+ int[] visr = (ap != null && ap.getAnnotationPanel() != null)
+ ? ap.getAnnotationPanel().getVisibleVRange()
+ : null;
if (clip && visr != null)
{
sOffset = visr[0];
@@ -1025,8 +1108,8 @@ public class AnnotationLabels extends JPanel implements MouseListener,
{
if (debugRedraw)
{
- System.out.println("Scroll offset: " + sOffset
- + " after vis: " + i);
+ System.out.println(
+ "Scroll offset: " + sOffset + " after vis: " + i);
}
after = true;
}
@@ -1064,7 +1147,8 @@ public class AnnotationLabels extends JPanel implements MouseListener,
}
if (groupSize * (fontHeight + 8) < aa[i].height)
{
- graphExtras = (aa[i].height - (groupSize * (fontHeight + 8))) / 2;
+ graphExtras = (aa[i].height - (groupSize * (fontHeight + 8)))
+ / 2;
}
else
{
@@ -1078,11 +1162,12 @@ public class AnnotationLabels extends JPanel implements MouseListener,
{
fontHeight = -8 + (int) h;
s = ((float) fontHeight) / (float) ofontH;
- Font f = baseFont.deriveFont(AffineTransform
- .getScaleInstance(s, s));
+ Font f = baseFont
+ .deriveFont(AffineTransform.getScaleInstance(s, s));
g.setFont(f);
fm = g.getFontMetrics();
- graphExtras = (aa[i].height - (groupSize * (fontHeight + 8))) / 2;
+ graphExtras = (aa[i].height - (groupSize * (fontHeight + 8)))
+ / 2;
}
}
if (visible)
@@ -1099,8 +1184,8 @@ public class AnnotationLabels extends JPanel implements MouseListener,
g.setColor(aa[gg]._linecolour);
g.drawLine(x, y - graphExtras + 3,
- x + fm.stringWidth(aa[gg].label), y - graphExtras
- + 3);
+ x + fm.stringWidth(aa[gg].label),
+ y - graphExtras + 3);
}
g.setColor(Color.black);