X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;f=src%2Fjalview%2Fgui%2FSeqPanel.java;h=7791541f43e5dd7cd00c5ab54a5075f0f8beb4e6;hb=9ec67638125a7af9db8960e5de52ea980b8ed582;hp=8f63c525ede7dfb292755feff8ffb360bd658c9a;hpb=12b42b6a5712870227d73b2285c338f9f5438b3a;p=jalview.git diff --git a/src/jalview/gui/SeqPanel.java b/src/jalview/gui/SeqPanel.java index 8f63c52..7791541 100755 --- a/src/jalview/gui/SeqPanel.java +++ b/src/jalview/gui/SeqPanel.java @@ -1,6 +1,6 @@ /* - * Jalview - A Sequence Alignment Editor and Viewer (Version 2.4) - * Copyright (C) 2008 AM Waterhouse, J Procter, G Barton, M Clamp, S Searle + * Jalview - A Sequence Alignment Editor and Viewer (Development Version 2.4.1) + * Copyright (C) 2009 AM Waterhouse, J Procter, G Barton, M Clamp, S Searle * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License @@ -22,6 +22,7 @@ import java.util.*; import java.awt.*; import java.awt.event.*; + import javax.swing.*; import jalview.commands.*; @@ -36,7 +37,8 @@ import jalview.structure.*; * @version $Revision$ */ public class SeqPanel extends JPanel implements MouseListener, - MouseMotionListener, MouseWheelListener, SequenceListener, SelectionListener + MouseMotionListener, MouseWheelListener, SequenceListener, + SelectionListener { /** DOCUMENT ME!! */ @@ -98,9 +100,9 @@ public class SeqPanel extends JPanel implements MouseListener, * Creates a new SeqPanel object. * * @param avp - * DOCUMENT ME! + * DOCUMENT ME! * @param p - * DOCUMENT ME! + * DOCUMENT ME! */ public SeqPanel(AlignViewport av, AlignmentPanel ap) { @@ -522,7 +524,7 @@ public class SeqPanel extends JPanel implements MouseListener, * DOCUMENT ME! * * @param evt - * DOCUMENT ME! + * DOCUMENT ME! */ public void mouseReleased(MouseEvent evt) { @@ -542,7 +544,7 @@ public class SeqPanel extends JPanel implements MouseListener, * DOCUMENT ME! * * @param evt - * DOCUMENT ME! + * DOCUMENT ME! */ public void mousePressed(MouseEvent evt) { @@ -624,7 +626,7 @@ public class SeqPanel extends JPanel implements MouseListener, * DOCUMENT ME! * * @param evt - * DOCUMENT ME! + * DOCUMENT ME! */ public void mouseMoved(MouseEvent evt) { @@ -688,33 +690,66 @@ public class SeqPanel extends JPanel implements MouseListener, int rpos; SequenceFeature[] features = findFeaturesAtRes(sequence .getDatasetSequence(), rpos = sequence.findPosition(res)); - appendFeatures(tooltipText, linkImageURL.toString(), rpos, features); + appendFeatures(tooltipText, linkImageURL.toString(), rpos, features,this.ap.seqPanel.seqCanvas.fr.minmax); } if (tooltipText.length() == 6) // { setToolTipText(null); + lastTooltip = null; } else { tooltipText.append(""); if (lastTooltip == null || !lastTooltip.equals(tooltipText.toString())) + { setToolTipText(tooltipText.toString()); + lastTooltip = tooltipText.toString(); + } - lastTooltip = tooltipText.toString(); } } + private Point lastp=null; + /* + * (non-Javadoc) + * + * @see javax.swing.JComponent#getToolTipLocation(java.awt.event.MouseEvent) + */ + public Point getToolTipLocation(MouseEvent event) + { + int x = event.getX(), w = getWidth(); + int wdth = (w - x < 200) ? -(w / 2) : 5; // switch sides when tooltip is too + // close to edge + Point p = lastp; + if (!event.isShiftDown() || p==null) { + p = (tooltipText != null && tooltipText.length() > 6) ? new Point( + event.getX() + wdth, event.getY() - 20) + : null; + } + /* + * TODO: try to modify position region is not obcured by tooltip + */ + return lastp=p; + } + /** - * appends the features at rpos to the given stringbuffer ready for display in a tooltip + * appends the features at rpos to the given stringbuffer ready for display in + * a tooltip + * * @param tooltipText2 * @param linkImageURL * @param rpos * @param features - * TODO refactor to Jalview 'utilities' somehow. + * TODO refactor to Jalview 'utilities' somehow. */ - public static void appendFeatures(StringBuffer tooltipText2, String linkImageURL, - int rpos, SequenceFeature[] features) + public void appendFeatures(StringBuffer tooltipText2, + String linkImageURL, int rpos, SequenceFeature[] features) + { + appendFeatures(tooltipText2,linkImageURL,rpos,features,null); + } + public void appendFeatures(StringBuffer tooltipText2, String string, + int rpos, SequenceFeature[] features, Hashtable minmax) { String tmpString; if (features != null) @@ -744,77 +779,83 @@ public class SeqPanel extends JPanel implements MouseListener, { tooltipText2.append("
"); } - - tooltipText2.append(features[i].getType() + " "); - if (rpos!=0) - { - // we are marking a positional feature - tooltipText2.append(features[i].begin); - } - if (features[i].begin != features[i].end) + // TODO: remove this hack to display link only features + boolean linkOnly = features[i].getValue("linkonly") != null; + if (!linkOnly) { - tooltipText2.append(" " + features[i].end); - } - - if (features[i].getDescription() != null - && !features[i].description.equals(features[i] - .getType())) - { - tmpString = features[i].getDescription(); - int startTag = tmpString.toUpperCase().indexOf(""); - if (startTag > -1) + tooltipText2.append(features[i].getType() + " "); + if (rpos != 0) { - tmpString = tmpString.substring(startTag + 6); + // we are marking a positional feature + tooltipText2.append(features[i].begin); } - int endTag = tmpString.toUpperCase().indexOf(""); - if (endTag > -1) + if (features[i].begin != features[i].end) { - tmpString = tmpString.substring(0, endTag); - } - endTag = tmpString.toUpperCase().indexOf(""); - if (endTag > -1) - { - tmpString = tmpString.substring(0, endTag); + tooltipText2.append(" " + features[i].end); } - if (startTag > -1) - { - tooltipText2.append("; " + tmpString); - } - else + if (features[i].getDescription() != null + && !features[i].description.equals(features[i] + .getType())) { - if (tmpString.indexOf("<") > -1 - || tmpString.indexOf(">") > -1) + tmpString = features[i].getDescription(); + int startTag = tmpString.toUpperCase().indexOf(""); + if (startTag > -1) { - // The description does not specify html is to - // be used, so we must remove < > symbols - tmpString = tmpString.replaceAll("<", "<"); - tmpString = tmpString.replaceAll(">", ">"); - - tooltipText2.append("; "); - tooltipText2.append(tmpString); + tmpString = tmpString.substring(startTag + 6); + } + int endTag = tmpString.toUpperCase().indexOf(""); + if (endTag > -1) + { + tmpString = tmpString.substring(0, endTag); + } + endTag = tmpString.toUpperCase().indexOf(""); + if (endTag > -1) + { + tmpString = tmpString.substring(0, endTag); + } + if (startTag > -1) + { + tooltipText2.append("; " + tmpString); } else { - tooltipText2.append("; " + tmpString); + if (tmpString.indexOf("<") > -1 + || tmpString.indexOf(">") > -1) + { + // The description does not specify html is to + // be used, so we must remove < > symbols + tmpString = tmpString.replaceAll("<", "<"); + tmpString = tmpString.replaceAll(">", ">"); + + tooltipText2.append("; "); + tooltipText2.append(tmpString); + + } + else + { + tooltipText2.append("; " + tmpString); + } } } - } - if (features[i].getScore()!=Float.NaN) - { - tooltipText2.append(" Score="+features[i].getScore()); - } - if (features[i].getValue("status") != null) - { - String status = features[i].getValue("status").toString(); - if (status.length() > 0) + // check score should be shown + if (features[i].getScore() != Float.NaN) { + float[][] rng=(minmax==null) ? null : ((float[][])minmax.get(features[i].getType())); + if (rng!=null && rng[0]!=null && rng[0][0]!=rng[0][1]) { + tooltipText2.append(" Score=" + features[i].getScore()); + } + } + if (features[i].getValue("status") != null) { - tooltipText2.append("; (" + features[i].getValue("status") - + ")"); + String status = features[i].getValue("status").toString(); + if (status.length() > 0) + { + tooltipText2.append("; (" + features[i].getValue("status") + + ")"); + } } } - if (features[i].links != null) { tooltipText2.append(" "); @@ -831,11 +872,11 @@ public class SeqPanel extends JPanel implements MouseListener, * Set status message in alignment panel * * @param sequence - * aligned sequence object + * aligned sequence object * @param res - * alignment column + * alignment column * @param seq - * index of sequence in alignment + * index of sequence in alignment * @return position of res in sequence */ int setStatusMessage(SequenceI sequence, int res, int seq) @@ -879,7 +920,7 @@ public class SeqPanel extends JPanel implements MouseListener, * DOCUMENT ME! * * @param evt - * DOCUMENT ME! + * DOCUMENT ME! */ public void mouseDragged(MouseEvent evt) { @@ -1347,7 +1388,7 @@ public class SeqPanel extends JPanel implements MouseListener, * DOCUMENT ME! * * @param e - * DOCUMENT ME! + * DOCUMENT ME! */ public void mouseEntered(MouseEvent e) { @@ -1367,7 +1408,7 @@ public class SeqPanel extends JPanel implements MouseListener, * DOCUMENT ME! * * @param e - * DOCUMENT ME! + * DOCUMENT ME! */ public void mouseExited(MouseEvent e) { @@ -1431,7 +1472,7 @@ public class SeqPanel extends JPanel implements MouseListener, * DOCUMENT ME! * * @param evt - * DOCUMENT ME! + * DOCUMENT ME! */ public void doMousePressedDefineMode(MouseEvent evt) { @@ -1541,7 +1582,7 @@ public class SeqPanel extends JPanel implements MouseListener, sg.setEndRes(res); sg.addSequence(sequence, false); av.setSelectionGroup(sg); - + stretchGroup = sg; if (av.getConservationSelected()) @@ -1576,7 +1617,7 @@ public class SeqPanel extends JPanel implements MouseListener, * DOCUMENT ME! * * @param evt - * DOCUMENT ME! + * DOCUMENT ME! */ public void doMouseReleasedDefineMode(MouseEvent evt) { @@ -1626,7 +1667,7 @@ public class SeqPanel extends JPanel implements MouseListener, * DOCUMENT ME! * * @param evt - * DOCUMENT ME! + * DOCUMENT ME! */ public void doMouseDraggedDefineMode(MouseEvent evt) { @@ -1819,42 +1860,58 @@ public class SeqPanel extends JPanel implements MouseListener, } } } + /** * modify current selection according to a received message. */ public void selection(SequenceGroup seqsel, ColumnSelection colsel, SelectionSource source) { - // TODO: fix this hack - source of messages is align viewport, but SeqPanel handles selection messages... - if (av==source) + // TODO: fix this hack - source of messages is align viewport, but SeqPanel + // handles selection messages... + if (av == source) { return; } - // do we want to thread this ? (contention with seqsel and colsel locks, I suspect) - boolean repaint=false; + // do we want to thread this ? (contention with seqsel and colsel locks, I + // suspect) + boolean repaint = false; if (av.followSelection) { - if (av.selectionGroup==null || !av.isSelectionGroupChanged()) + if (av.selectionGroup == null || !av.isSelectionGroupChanged()) { - SequenceGroup sgroup = (seqsel!=null) ? seqsel.intersect(av.alignment, (av.hasHiddenRows) ? av.hiddenRepSequences : null) - : null; - if (sgroup!=null && sgroup.getSize()>0) + SequenceGroup sgroup = null; + if (seqsel != null) + { + if (av.alignment==null) + { + jalview.bin.Cache.log.warn("alignviewport av SeqSetId="+av.getSequenceSetId()+" ViewId="+av.getViewId()+" 's alignment is NULL! returning immediatly."); + return; + } + sgroup = seqsel.intersect(av.alignment, + (av.hasHiddenRows) ? av.hiddenRepSequences : null); + } + if (sgroup != null && sgroup.getSize() > 0) { av.setSelectionGroup(sgroup); - } else { + } + else + { av.setSelectionGroup(null); } repaint = av.isSelectionGroupChanged(); } - if (av.colSel==null || !av.isColSelChanged()) + if (av.colSel == null || !av.isColSelChanged()) { // Check to see if the current selection is from a previous message - if (colsel==null || colsel.size()==0) + if (colsel == null || colsel.size() == 0) { av.colSel.clear(); - } else { + } + else + { av.colSel = new ColumnSelection(colsel); - } + } repaint |= av.isColSelChanged(); } }