From 85b15d4a71f0bb3240e544a5d6bd320ee5e91856 Mon Sep 17 00:00:00 2001 From: jprocter Date: Tue, 24 Feb 2009 17:56:51 +0000 Subject: [PATCH] better tooltip display and placement, cope with linkOnly features (hack) and safer method for send/receive selections --- src/jalview/gui/SeqPanel.java | 185 ++++++++++++++++++++++++----------------- 1 file changed, 110 insertions(+), 75 deletions(-) diff --git a/src/jalview/gui/SeqPanel.java b/src/jalview/gui/SeqPanel.java index 8f63c52..336532c 100755 --- a/src/jalview/gui/SeqPanel.java +++ b/src/jalview/gui/SeqPanel.java @@ -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!! */ @@ -693,28 +695,48 @@ public class SeqPanel extends JPanel implements MouseListener, 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(); + } + } + + } + /* (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 = (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 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 static void appendFeatures(StringBuffer tooltipText2, + String linkImageURL, int rpos, SequenceFeature[] features) { String tmpString; if (features != null) @@ -744,77 +766,82 @@ 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) - { - tooltipText2.append(" " + features[i].end); - } - - if (features[i].getDescription() != null - && !features[i].description.equals(features[i] - .getType())) + // TODO: remove this hack to display link only features + boolean linkOnly = features[i].getValue("linkonly") != null; + if (!linkOnly) { - tmpString = features[i].getDescription(); - int startTag = tmpString.toUpperCase().indexOf(""); - if (startTag > -1) - { - tmpString = tmpString.substring(startTag + 6); - } - int endTag = tmpString.toUpperCase().indexOf(""); - if (endTag > -1) + tooltipText2.append(features[i].getType() + " "); + if (rpos != 0) { - tmpString = tmpString.substring(0, endTag); + // we are marking a positional feature + tooltipText2.append(features[i].begin); } - endTag = tmpString.toUpperCase().indexOf(""); - if (endTag > -1) + if (features[i].begin != features[i].end) { - tmpString = tmpString.substring(0, endTag); + tooltipText2.append(" " + features[i].end); } - if (startTag > -1) + if (features[i].getDescription() != null + && !features[i].description.equals(features[i] + .getType())) { - tooltipText2.append("; " + tmpString); - } - else - { - 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) + // TODO: check min/max range for this feature type to decide if + // score should be shown + if (features[i].getScore() != Float.NaN) { - tooltipText2.append("; (" + features[i].getValue("status") - + ")"); + tooltipText2.append(" Score=" + features[i].getScore()); + } + if (features[i].getValue("status") != null) + { + String status = features[i].getValue("status").toString(); + if (status.length() > 0) + { + tooltipText2.append("; (" + features[i].getValue("status") + + ")"); + } } } - if (features[i].links != null) { tooltipText2.append(" "); @@ -1541,7 +1568,7 @@ public class SeqPanel extends JPanel implements MouseListener, sg.setEndRes(res); sg.addSequence(sequence, false); av.setSelectionGroup(sg); - + stretchGroup = sg; if (av.getConservationSelected()) @@ -1819,42 +1846,50 @@ 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 = (seqsel != null) ? seqsel.intersect( + av.alignment, (av.hasHiddenRows) ? av.hiddenRepSequences + : null) : 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(); } } -- 1.7.10.2