git://source.jalview.org
/
jalview.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
3253-omnibus save
[jalview.git]
/
src
/
jalview
/
appletgui
/
SeqPanel.java
diff --git
a/src/jalview/appletgui/SeqPanel.java
b/src/jalview/appletgui/SeqPanel.java
index
44ce755
..
776e9ad
100644
(file)
--- a/
src/jalview/appletgui/SeqPanel.java
+++ b/
src/jalview/appletgui/SeqPanel.java
@@
-25,6
+25,7
@@
import jalview.commands.EditCommand;
import jalview.commands.EditCommand.Action;
import jalview.datamodel.AlignmentI;
import jalview.datamodel.ColumnSelection;
import jalview.commands.EditCommand.Action;
import jalview.datamodel.AlignmentI;
import jalview.datamodel.ColumnSelection;
+import jalview.datamodel.HiddenColumns;
import jalview.datamodel.SearchResultMatchI;
import jalview.datamodel.SearchResults;
import jalview.datamodel.SearchResultsI;
import jalview.datamodel.SearchResultMatchI;
import jalview.datamodel.SearchResults;
import jalview.datamodel.SearchResultsI;
@@
-38,10
+39,11
@@
import jalview.structure.SelectionSource;
import jalview.structure.SequenceListener;
import jalview.structure.StructureSelectionManager;
import jalview.structure.VamsasSource;
import jalview.structure.SequenceListener;
import jalview.structure.StructureSelectionManager;
import jalview.structure.VamsasSource;
+import jalview.util.Comparison;
import jalview.util.MappingUtils;
import jalview.util.MessageManager;
import jalview.util.MappingUtils;
import jalview.util.MessageManager;
+import jalview.util.Platform;
import jalview.viewmodel.AlignmentViewport;
import jalview.viewmodel.AlignmentViewport;
-import jalview.viewmodel.ViewportRanges;
import java.awt.BorderLayout;
import java.awt.Font;
import java.awt.BorderLayout;
import java.awt.Font;
@@
-52,6
+54,7
@@
import java.awt.event.InputEvent;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;
+import java.util.Collections;
import java.util.List;
import java.util.Vector;
import java.util.List;
import java.util.Vector;
@@
-129,8
+132,8
@@
public class SeqPanel extends Panel implements MouseMotionListener,
if (editCommand != null && editCommand.getSize() > 0)
{
ap.alignFrame.addHistoryItem(editCommand);
if (editCommand != null && editCommand.getSize() > 0)
{
ap.alignFrame.addHistoryItem(editCommand);
- av.firePropertyChange("alignment", null, av.getAlignment()
- .getSequences());
+ av.firePropertyChange("alignment", null,
+ av.getAlignment().getSequences());
}
startseq = -1;
}
startseq = -1;
@@
-145,13
+148,13
@@
public class SeqPanel extends Panel implements MouseMotionListener,
void setCursorRow()
{
seqCanvas.cursorY = getKeyboardNo1() - 1;
void setCursorRow()
{
seqCanvas.cursorY = getKeyboardNo1() - 1;
- scrollToVisible();
+ scrollToVisible(true);
}
void setCursorColumn()
{
seqCanvas.cursorX = getKeyboardNo1() - 1;
}
void setCursorColumn()
{
seqCanvas.cursorX = getKeyboardNo1() - 1;
- scrollToVisible();
+ scrollToVisible(true);
}
void setCursorRowAndColumn()
}
void setCursorRowAndColumn()
@@
-164,7
+167,7
@@
public class SeqPanel extends Panel implements MouseMotionListener,
{
seqCanvas.cursorX = getKeyboardNo1() - 1;
seqCanvas.cursorY = getKeyboardNo2() - 1;
{
seqCanvas.cursorX = getKeyboardNo1() - 1;
seqCanvas.cursorY = getKeyboardNo2() - 1;
- scrollToVisible();
+ scrollToVisible(true);
}
}
}
}
@@
-173,35
+176,42
@@
public class SeqPanel extends Panel implements MouseMotionListener,
SequenceI sequence = av.getAlignment().getSequenceAt(seqCanvas.cursorY);
seqCanvas.cursorX = sequence.findIndex(getKeyboardNo1()) - 1;
SequenceI sequence = av.getAlignment().getSequenceAt(seqCanvas.cursorY);
seqCanvas.cursorX = sequence.findIndex(getKeyboardNo1()) - 1;
- scrollToVisible();
+ scrollToVisible(true);
}
void moveCursor(int dx, int dy)
{
seqCanvas.cursorX += dx;
seqCanvas.cursorY += dy;
}
void moveCursor(int dx, int dy)
{
seqCanvas.cursorX += dx;
seqCanvas.cursorY += dy;
- if (av.hasHiddenColumns()
- && !av.getColumnSelection().isVisible(seqCanvas.cursorX))
+ if (av.hasHiddenColumns() && !av.getAlignment().getHiddenColumns()
+ .isVisible(seqCanvas.cursorX))
{
int original = seqCanvas.cursorX - dx;
int maxWidth = av.getAlignment().getWidth();
{
int original = seqCanvas.cursorX - dx;
int maxWidth = av.getAlignment().getWidth();
- while (!av.getColumnSelection().isVisible(seqCanvas.cursorX)
- && seqCanvas.cursorX < maxWidth && seqCanvas.cursorX > 0)
+ while (!av.getAlignment().getHiddenColumns()
+ .isVisible(seqCanvas.cursorX) && seqCanvas.cursorX < maxWidth
+ && seqCanvas.cursorX > 0)
{
seqCanvas.cursorX += dx;
}
{
seqCanvas.cursorX += dx;
}
- if (seqCanvas.cursorX >= maxWidth
- || !av.getColumnSelection().isVisible(seqCanvas.cursorX))
+ if (seqCanvas.cursorX >= maxWidth || !av.getAlignment()
+ .getHiddenColumns().isVisible(seqCanvas.cursorX))
{
seqCanvas.cursorX = original;
}
}
{
seqCanvas.cursorX = original;
}
}
- scrollToVisible();
+ scrollToVisible(false);
}
}
- void scrollToVisible()
+ /**
+ * Scroll to make the cursor visible in the viewport.
+ *
+ * @param jump
+ * just jump to the location rather than scrolling
+ */
+ void scrollToVisible(boolean jump)
{
if (seqCanvas.cursorX < 0)
{
{
if (seqCanvas.cursorX < 0)
{
@@
-222,43
+232,34
@@
public class SeqPanel extends Panel implements MouseMotionListener,
}
endEditing();
}
endEditing();
- if (av.getWrapAlignment())
+
+ boolean repaintNeeded = true;
+ if (jump)
{
{
- ap.scrollToWrappedVisible(seqCanvas.cursorX);
+ // only need to repaint if the viewport did not move, as otherwise it will
+ // get a repaint
+ repaintNeeded = !av.getRanges().setViewportLocation(seqCanvas.cursorX,
+ seqCanvas.cursorY);
}
else
{
}
else
{
- ViewportRanges ranges = av.getRanges();
- while (seqCanvas.cursorY < ranges.getStartSeq())
+ if (av.getWrapAlignment())
{
{
- ap.scrollUp(true);
+ av.getRanges().scrollToWrappedVisible(seqCanvas.cursorX);
}
}
- while (seqCanvas.cursorY + 1 > ranges.getEndSeq())
- {
- ap.scrollUp(false);
- }
- while (seqCanvas.cursorX < av.getColumnSelection()
- .adjustForHiddenColumns(ranges.getStartRes()))
- {
-
- if (!ap.scrollRight(false))
- {
- break;
- }
- }
- while (seqCanvas.cursorX > av.getColumnSelection()
- .adjustForHiddenColumns(ranges.getEndRes()))
+ else
{
{
- if (!ap.scrollRight(true))
- {
- break;
- }
+ av.getRanges().scrollToVisible(seqCanvas.cursorX,
+ seqCanvas.cursorY);
}
}
setStatusMessage(av.getAlignment().getSequenceAt(seqCanvas.cursorY),
seqCanvas.cursorX, seqCanvas.cursorY);
}
}
setStatusMessage(av.getAlignment().getSequenceAt(seqCanvas.cursorY),
seqCanvas.cursorX, seqCanvas.cursorY);
- seqCanvas.repaint();
+ if (repaintNeeded)
+ {
+ seqCanvas.repaint();
+ }
}
void setSelectionAreaAtCursor(boolean topLeft)
}
void setSelectionAreaAtCursor(boolean topLeft)
@@
-330,7
+331,7
@@
public class SeqPanel extends Panel implements MouseMotionListener,
sg.addSequence(sequence, false);
av.setSelectionGroup(sg);
}
sg.addSequence(sequence, false);
av.setSelectionGroup(sg);
}
- ap.paintAlignment(false);
+ ap.paintAlignment(false, false);
av.sendSelection();
}
av.sendSelection();
}
@@
-408,13
+409,12
@@
public class SeqPanel extends Panel implements MouseMotionListener,
*
* @param sequence
* aligned sequence object
*
* @param sequence
* aligned sequence object
- * @param res
+ * @param column
* alignment column
* @param seq
* index of sequence in alignment
* alignment column
* @param seq
* index of sequence in alignment
- * @return position of res in sequence
*/
*/
- void setStatusMessage(SequenceI sequence, int res, int seq)
+ void setStatusMessage(SequenceI sequence, int column, int seq)
{
// TODO remove duplication of identical gui method
StringBuilder text = new StringBuilder(32);
{
// TODO remove duplication of identical gui method
StringBuilder text = new StringBuilder(32);
@@
-425,7
+425,7
@@
public class SeqPanel extends Panel implements MouseMotionListener,
/*
* Try to translate the display character to residue name (null for gap).
*/
/*
* Try to translate the display character to residue name (null for gap).
*/
- final String displayChar = String.valueOf(sequence.getCharAt(res));
+ final String displayChar = String.valueOf(sequence.getCharAt(column));
if (av.getAlignment().isNucleotide())
{
residue = ResidueProperties.nucleotideName.get(displayChar);
if (av.getAlignment().isNucleotide())
{
residue = ResidueProperties.nucleotideName.get(displayChar);
@@
-436,9
+436,9
@@
public class SeqPanel extends Panel implements MouseMotionListener,
}
else
{
}
else
{
- residue = "X".equalsIgnoreCase(displayChar) ? "X" : ("*"
- .equals(displayChar) ? "STOP" : ResidueProperties.aa2Triplet
- .get(displayChar));
+ residue = "X".equalsIgnoreCase(displayChar) ? "X"
+ : ("*".equals(displayChar) ? "STOP"
+ : ResidueProperties.aa2Triplet.get(displayChar));
if (residue != null)
{
text.append(" Residue: ").append(residue);
if (residue != null)
{
text.append(" Residue: ").append(residue);
@@
-448,7
+448,7
@@
public class SeqPanel extends Panel implements MouseMotionListener,
int pos = -1;
if (residue != null)
{
int pos = -1;
if (residue != null)
{
- pos = sequence.findPosition(res);
+ pos = sequence.findPosition(column);
text.append(" (").append(Integer.toString(pos)).append(")");
}
text.append(" (").append(Integer.toString(pos)).append(")");
}
@@
-500,8
+500,7
@@
public class SeqPanel extends Panel implements MouseMotionListener,
// For now, ignore the mouseWheel font resizing on Macs
// As the Button2_mask always seems to be true
// For now, ignore the mouseWheel font resizing on Macs
// As the Button2_mask always seems to be true
- if ((evt.getModifiers() & InputEvent.BUTTON2_MASK) == InputEvent.BUTTON2_MASK
- && !av.MAC)
+ if (Platform.isWinMiddleButton(evt))
{
mouseWheelPressed = true;
return;
{
mouseWheelPressed = true;
return;
@@
-522,7
+521,7
@@
public class SeqPanel extends Panel implements MouseMotionListener,
}
int seq = findSeq(evt);
}
int seq = findSeq(evt);
- int res = findRes(evt);
+ int res = findColumn(evt);
if (seq < 0 || res < 0)
{
if (seq < 0 || res < 0)
{
@@
-558,22
+557,20
@@
public class SeqPanel extends Panel implements MouseMotionListener,
av.setSelectionGroup(null);
}
av.setSelectionGroup(null);
}
- List<SequenceFeature> features = findFeaturesAtRes(sequence,
- sequence.findPosition(findRes(evt)));
+ int column = findColumn(evt);
+ List<SequenceFeature> features = findFeaturesAtColumn(sequence,
+ column + 1);
if (!features.isEmpty())
{
SearchResultsI highlight = new SearchResults();
if (!features.isEmpty())
{
SearchResultsI highlight = new SearchResults();
- highlight.addResult(sequence, features.get(0).getBegin(), features
- .get(0).getEnd());
+ highlight.addResult(sequence, features.get(0).getBegin(),
+ features.get(0).getEnd());
seqCanvas.highlightSearchResults(highlight);
seqCanvas.highlightSearchResults(highlight);
- SequenceFeature[] featuresArray = features
- .toArray(new SequenceFeature[features.size()]);
seqCanvas.getFeatureRenderer().amendFeatures(
seqCanvas.getFeatureRenderer().amendFeatures(
- new SequenceI[] { sequence }, featuresArray, false, ap,
- null);
-
- seqCanvas.highlightSearchResults(null);
+ Collections.singletonList(sequence), features, false, ap);
+ av.setSearchResults(null); // clear highlighting
+ seqCanvas.repaint(); // draw new/amended features
}
}
}
}
}
}
@@
-581,13
+578,13
@@
public class SeqPanel extends Panel implements MouseMotionListener,
@Override
public void mouseReleased(MouseEvent evt)
{
@Override
public void mouseReleased(MouseEvent evt)
{
+ boolean didDrag = mouseDragging; // did we come here after a drag
mouseDragging = false;
mouseWheelPressed = false;
mouseDragging = false;
mouseWheelPressed = false;
- ap.paintAlignment(true);
if (!editingSeqs)
{
if (!editingSeqs)
{
- doMouseReleasedDefineMode(evt);
+ doMouseReleasedDefineMode(evt, didDrag);
return;
}
return;
}
@@
-599,11
+596,19
@@
public class SeqPanel extends Panel implements MouseMotionListener,
int wrappedBlock = -1;
int wrappedBlock = -1;
- int findRes(MouseEvent evt)
+ /**
+ * Returns the aligned sequence position (base 0) at the mouse position, or
+ * the closest visible one
+ *
+ * @param evt
+ * @return
+ */
+ int findColumn(MouseEvent evt)
{
int res = 0;
int x = evt.getX();
{
int res = 0;
int x = evt.getX();
+ int startRes = av.getRanges().getStartRes();
if (av.getWrapAlignment())
{
if (av.getWrapAlignment())
{
@@
-618,7
+623,7
@@
public class SeqPanel extends Panel implements MouseMotionListener,
int y = evt.getY();
y -= hgap;
int y = evt.getY();
y -= hgap;
- x -= seqCanvas.LABEL_WEST;
+ x = Math.max(0, x - seqCanvas.LABEL_WEST);
int cwidth = seqCanvas.getWrappedCanvasWidth(getSize().width);
if (cwidth < 1)
int cwidth = seqCanvas.getWrappedCanvasWidth(getSize().width);
if (cwidth < 1)
@@
-627,19
+632,21
@@
public class SeqPanel extends Panel implements MouseMotionListener,
}
wrappedBlock = y / cHeight;
}
wrappedBlock = y / cHeight;
- wrappedBlock += av.getRanges().getStartRes() / cwidth;
-
- res = wrappedBlock * cwidth + x / av.getCharWidth();
-
+ wrappedBlock += startRes / cwidth;
+ int startOffset = startRes % cwidth; // in case start is scrolled right
+ // from 0
+ res = wrappedBlock * cwidth + startOffset
+ + +Math.min(cwidth - 1, x / av.getCharWidth());
}
else
{
}
else
{
- res = (x / av.getCharWidth()) + av.getRanges().getStartRes();
+ res = (x / av.getCharWidth()) + startRes;
}
if (av.hasHiddenColumns())
{
}
if (av.hasHiddenColumns())
{
- res = av.getColumnSelection().adjustForHiddenColumns(res);
+ res = av.getAlignment().getHiddenColumns()
+ .visibleToAbsoluteColumn(res);
}
return res;
}
return res;
@@
-675,8
+682,8
@@
public class SeqPanel extends Panel implements MouseMotionListener,
y -= hgap;
y -= hgap;
- seq = Math.min((y % cHeight) / av.getCharHeight(), av.getAlignment()
- .getHeight() - 1);
+ seq = Math.min((y % cHeight) / av.getCharHeight(),
+ av.getAlignment().getHeight() - 1);
if (seq < 0)
{
seq = -1;
if (seq < 0)
{
seq = -1;
@@
-684,10
+691,9
@@
public class SeqPanel extends Panel implements MouseMotionListener,
}
else
{
}
else
{
- seq = Math.min((y / av.getCharHeight())
- + av.getRanges().getStartSeq(),
- av
- .getAlignment().getHeight() - 1);
+ seq = Math.min(
+ (y / av.getCharHeight()) + av.getRanges().getStartSeq(),
+ av.getAlignment().getHeight() - 1);
if (seq < 0)
{
seq = -1;
if (seq < 0)
{
seq = -1;
@@
-701,7
+707,7
@@
public class SeqPanel extends Panel implements MouseMotionListener,
{
int seq = findSeq(evt);
{
int seq = findSeq(evt);
- int res = findRes(evt);
+ int res = findColumn(evt);
if (seq < av.getAlignment().getHeight()
&& res < av.getAlignment().getSequenceAt(seq).getLength())
if (seq < av.getAlignment().getHeight()
&& res < av.getAlignment().getSequenceAt(seq).getLength())
@@
-737,18
+743,24
@@
public class SeqPanel extends Panel implements MouseMotionListener,
}
@Override
}
@Override
- public void highlightSequence(SearchResultsI results)
+ public String highlightSequence(SearchResultsI results)
{
if (av.isFollowHighlight())
{
{
if (av.isFollowHighlight())
{
+ // don't allow highlight of protein/cDNA to also scroll a complementary
+ // panel,as this sets up a feedback loop (scrolling panel 1 causes moused
+ // over residue to change abruptly, causing highlighted residue in panel 2
+ // to change, causing a scroll in panel 1 etc)
+ ap.setToScrollComplementPanel(false);
if (ap.scrollToPosition(results, true))
{
ap.alignFrame.repaint();
}
if (ap.scrollToPosition(results, true))
{
ap.alignFrame.repaint();
}
+ ap.setToScrollComplementPanel(true);
}
setStatusMessage(results);
seqCanvas.highlightSearchResults(results);
}
setStatusMessage(results);
seqCanvas.highlightSearchResults(results);
-
+ return null;
}
@Override
}
@Override
@@
-767,10
+779,10
@@
public class SeqPanel extends Panel implements MouseMotionListener,
@Override
public void mouseMoved(MouseEvent evt)
{
@Override
public void mouseMoved(MouseEvent evt)
{
- int res = findRes(evt);
+ final int column = findColumn(evt);
int seq = findSeq(evt);
int seq = findSeq(evt);
- if (seq >= av.getAlignment().getHeight() || seq < 0 || res < 0)
+ if (seq >= av.getAlignment().getHeight() || seq < 0 || column < 0)
{
if (tooltip != null)
{
{
if (tooltip != null)
{
@@
-780,7
+792,7
@@
public class SeqPanel extends Panel implements MouseMotionListener,
}
SequenceI sequence = av.getAlignment().getSequenceAt(seq);
}
SequenceI sequence = av.getAlignment().getSequenceAt(seq);
- if (res > sequence.getLength())
+ if (column > sequence.getLength())
{
if (tooltip != null)
{
{
if (tooltip != null)
{
@@
-789,38
+801,33
@@
public class SeqPanel extends Panel implements MouseMotionListener,
return;
}
return;
}
- int respos = sequence.findPosition(res);
- if (ssm != null)
+ final char ch = sequence.getCharAt(column);
+ boolean isGapped = Comparison.isGap(ch);
+ // find residue at column (or nearest if at a gap)
+ int respos = sequence.findPosition(column);
+
+ if (ssm != null && !isGapped)
{
{
- mouseOverSequence(sequence, res, respos);
+ mouseOverSequence(sequence, column, respos);
}
StringBuilder text = new StringBuilder();
text.append("Sequence ").append(Integer.toString(seq + 1))
.append(" ID: ").append(sequence.getName());
}
StringBuilder text = new StringBuilder();
text.append("Sequence ").append(Integer.toString(seq + 1))
.append(" ID: ").append(sequence.getName());
- String obj = null;
- final String ch = String.valueOf(sequence.getCharAt(res));
- if (av.getAlignment().isNucleotide())
+ if (!isGapped)
{
{
- obj = ResidueProperties.nucleotideName.get(ch);
- if (obj != null)
+ if (av.getAlignment().isNucleotide())
{
{
- text.append(" Nucleotide: ").append(obj);
+ String base = ResidueProperties.nucleotideName.get(ch);
+ text.append(" Nucleotide: ").append(base == null ? ch : base);
}
}
- }
- else
- {
- obj = "X".equalsIgnoreCase(ch) ? "X" : ResidueProperties.aa2Triplet
- .get(ch);
- if (obj != null)
+ else
{
{
- text.append(" Residue: ").append(obj);
+ String residue = (ch == 'x' || ch == 'X') ? "X"
+ : ResidueProperties.aa2Triplet.get(String.valueOf(ch));
+ text.append(" Residue: ").append(residue == null ? ch : residue);
}
}
- }
-
- if (obj != null)
- {
text.append(" (").append(Integer.toString(respos)).append(")");
}
text.append(" (").append(Integer.toString(respos)).append(")");
}
@@
-832,7
+839,8
@@
public class SeqPanel extends Panel implements MouseMotionListener,
{
for (int g = 0; g < groups.length; g++)
{
{
for (int g = 0; g < groups.length; g++)
{
- if (groups[g].getStartRes() <= res && groups[g].getEndRes() >= res)
+ if (groups[g].getStartRes() <= column
+ && groups[g].getEndRes() >= column)
{
if (!groups[g].getName().startsWith("JTreeGroup")
&& !groups[g].getName().startsWith("JGroup"))
{
if (!groups[g].getName().startsWith("JTreeGroup")
&& !groups[g].getName().startsWith("JGroup"))
@@
-848,33
+856,33
@@
public class SeqPanel extends Panel implements MouseMotionListener,
}
}
}
}
- // use aa to see if the mouse pointer is on a
- List<SequenceFeature> allFeatures = findFeaturesAtRes(sequence,
- sequence.findPosition(res));
-
- int index = 0;
- while (index < allFeatures.size())
+ /*
+ * add feature details to tooltip, including any that straddle
+ * a gapped position
+ */
+ if (av.isShowSequenceFeatures())
{
{
- SequenceFeature sf = allFeatures.get(index);
-
- tooltipText.append(sf.getType() + " " + sf.begin + ":" + sf.end);
-
- if (sf.getDescription() != null)
+ List<SequenceFeature> allFeatures = findFeaturesAtColumn(sequence,
+ column + 1);
+ for (SequenceFeature sf : allFeatures)
{
{
- tooltipText.append(" " + sf.getDescription());
- }
+ tooltipText.append(sf.getType() + " " + sf.begin + ":" + sf.end);
- if (sf.getValue("status") != null)
- {
- String status = sf.getValue("status").toString();
- if (status.length() > 0)
+ if (sf.getDescription() != null)
{
{
- tooltipText.append(" (" + sf.getValue("status") + ")");
+ tooltipText.append(" " + sf.getDescription());
}
}
- }
- tooltipText.append("\n");
- index++;
+ if (sf.getValue("status") != null)
+ {
+ String status = sf.getValue("status").toString();
+ if (status.length() > 0)
+ {
+ tooltipText.append(" (" + sf.getValue("status") + ")");
+ }
+ }
+ tooltipText.append("\n");
+ }
}
if (tooltip == null)
}
if (tooltip == null)
@@
-887,9
+895,19
@@
public class SeqPanel extends Panel implements MouseMotionListener,
}
}
}
}
- List<SequenceFeature> findFeaturesAtRes(SequenceI sequence, int res)
+ /**
+ * Returns features at the specified aligned column on the given sequence.
+ * Non-positional features are not included. If the column has a gap, then
+ * enclosing features are included (but not contact features).
+ *
+ * @param sequence
+ * @param column
+ * (1..)
+ * @return
+ */
+ List<SequenceFeature> findFeaturesAtColumn(SequenceI sequence, int column)
{
{
- return seqCanvas.getFeatureRenderer().findFeaturesAtRes(sequence, res);
+ return seqCanvas.getFeatureRenderer().findFeaturesAtColumn(sequence, column);
}
Tooltip tooltip;
}
Tooltip tooltip;
@@
-910,8
+928,8
@@
public class SeqPanel extends Panel implements MouseMotionListener,
int oldWidth = av.getCharWidth();
// Which is bigger, left-right or up-down?
int oldWidth = av.getCharWidth();
// Which is bigger, left-right or up-down?
- if (Math.abs(evt.getY() - lastMousePress.y) > Math.abs(evt.getX()
- - lastMousePress.x))
+ if (Math.abs(evt.getY() - lastMousePress.y) > Math
+ .abs(evt.getX() - lastMousePress.x))
{
int fontSize = av.font.getSize();
{
int fontSize = av.font.getSize();
@@
-929,7
+947,9
@@
public class SeqPanel extends Panel implements MouseMotionListener,
fontSize = 1;
}
fontSize = 1;
}
- av.setFont(new Font(av.font.getName(), av.font.getStyle(), fontSize));
+ av.setFont(
+ new Font(av.font.getName(), av.font.getStyle(), fontSize),
+ true);
av.setCharWidth(oldWidth);
}
else
av.setCharWidth(oldWidth);
}
else
@@
-956,7
+976,7
@@
public class SeqPanel extends Panel implements MouseMotionListener,
lastMousePress = evt.getPoint();
lastMousePress = evt.getPoint();
- ap.paintAlignment(false);
+ ap.paintAlignment(false, false);
ap.annotationPanel.image = null;
return;
}
ap.annotationPanel.image = null;
return;
}
@@
-967,7
+987,7
@@
public class SeqPanel extends Panel implements MouseMotionListener,
return;
}
return;
}
- int res = findRes(evt);
+ int res = findColumn(evt);
if (res < 0)
{
if (res < 0)
{
@@
-1018,8
+1038,8
@@
public class SeqPanel extends Panel implements MouseMotionListener,
StringBuffer message = new StringBuffer();
if (groupEditing)
{
StringBuffer message = new StringBuffer();
if (groupEditing)
{
- message.append(MessageManager.getString("action.edit_group")).append(
- ":");
+ message.append(MessageManager.getString("action.edit_group"))
+ .append(":");
if (editCommand == null)
{
editCommand = new EditCommand(
if (editCommand == null)
{
editCommand = new EditCommand(
@@
-1037,8
+1057,9
@@
public class SeqPanel extends Panel implements MouseMotionListener,
}
if (editCommand == null)
{
}
if (editCommand == null)
{
- editCommand = new EditCommand(MessageManager.formatMessage(
- "label.edit_params", new String[] { label }));
+ editCommand = new EditCommand(MessageManager
+ .formatMessage("label.edit_params", new String[]
+ { label }));
}
}
}
}
@@
-1055,9
+1076,8
@@
public class SeqPanel extends Panel implements MouseMotionListener,
ap.alignFrame.statusBar.setText(message.toString());
// Are we editing within a selection group?
ap.alignFrame.statusBar.setText(message.toString());
// Are we editing within a selection group?
- if (groupEditing
- || (sg != null && sg.getSequences(av.getHiddenRepSequences())
- .contains(seq)))
+ if (groupEditing || (sg != null
+ && sg.getSequences(av.getHiddenRepSequences()).contains(seq)))
{
fixedColumns = true;
{
fixedColumns = true;
@@
-1101,8
+1121,10
@@
public class SeqPanel extends Panel implements MouseMotionListener,
if (av.hasHiddenColumns())
{
fixedColumns = true;
if (av.hasHiddenColumns())
{
fixedColumns = true;
- int y1 = av.getColumnSelection().getHiddenBoundaryLeft(startres);
- int y2 = av.getColumnSelection().getHiddenBoundaryRight(startres);
+ int y1 = av.getAlignment().getHiddenColumns()
+ .getNextHiddenBoundary(true, startres);
+ int y2 = av.getAlignment().getHiddenColumns()
+ .getNextHiddenBoundary(false, startres);
if ((insertGap && startres > y1 && lastres < y1)
|| (!insertGap && startres < y2 && lastres > y2))
if ((insertGap && startres > y1 && lastres < y1)
|| (!insertGap && startres < y2 && lastres > y2))
@@
-1147,7
+1169,7
@@
public class SeqPanel extends Panel implements MouseMotionListener,
// Find the next gap before the end
// of the visible region boundary
boolean blank = false;
// Find the next gap before the end
// of the visible region boundary
boolean blank = false;
- for (fixedRight = fixedRight; fixedRight > lastres; fixedRight--)
+ for (; fixedRight > lastres; fixedRight--)
{
blank = true;
{
blank = true;
@@
-1155,8
+1177,8
@@
public class SeqPanel extends Panel implements MouseMotionListener,
{
for (int j = 0; j < startres - lastres; j++)
{
{
for (int j = 0; j < startres - lastres; j++)
{
- if (!jalview.util.Comparison.isGap(gs.getCharAt(fixedRight
- - j)))
+ if (!jalview.util.Comparison
+ .isGap(gs.getCharAt(fixedRight - j)))
{
blank = false;
break;
{
blank = false;
break;
@@
-1173,8
+1195,9
@@
public class SeqPanel extends Panel implements MouseMotionListener,
{
if (sg.getSize() == av.getAlignment().getHeight())
{
{
if (sg.getSize() == av.getAlignment().getHeight())
{
- if ((av.hasHiddenColumns() && startres < av
- .getColumnSelection().getHiddenBoundaryRight(startres)))
+ if ((av.hasHiddenColumns() && startres < av.getAlignment()
+ .getHiddenColumns()
+ .getNextHiddenBoundary(false, startres)))
{
endEditing();
return;
{
endEditing();
return;
@@
-1277,9
+1300,8
@@
public class SeqPanel extends Panel implements MouseMotionListener,
}
else
{
}
else
{
- editCommand.appendEdit(Action.INSERT_GAP,
- new SequenceI[] { seq }, lastres, startres - lastres,
- av.getAlignment(), true);
+ editCommand.appendEdit(Action.INSERT_GAP, new SequenceI[] { seq },
+ lastres, startres - lastres, av.getAlignment(), true);
}
}
else
}
}
else
@@
-1313,8
+1335,8
@@
public class SeqPanel extends Panel implements MouseMotionListener,
if (max > 0)
{
editCommand.appendEdit(Action.DELETE_GAP,
if (max > 0)
{
editCommand.appendEdit(Action.DELETE_GAP,
- new SequenceI[] { seq }, startres, max,
- av.getAlignment(), true);
+ new SequenceI[]
+ { seq }, startres, max, av.getAlignment(), true);
}
}
}
}
}
}
@@
-1374,11
+1396,11
@@
public class SeqPanel extends Panel implements MouseMotionListener,
{
if (scrollThread != null)
{
{
if (scrollThread != null)
{
- scrollThread.running = false;
+ scrollThread.threadRunning = false;
scrollThread = null;
}
scrollThread = null;
}
- int res = findRes(evt);
+ int column = findColumn(evt);
int seq = findSeq(evt);
oldSeq = seq;
startWrapBlock = wrappedBlock;
int seq = findSeq(evt);
oldSeq = seq;
startWrapBlock = wrappedBlock;
@@
-1390,16
+1412,16
@@
public class SeqPanel extends Panel implements MouseMotionListener,
SequenceI sequence = av.getAlignment().getSequenceAt(seq);
SequenceI sequence = av.getAlignment().getSequenceAt(seq);
- if (sequence == null || res > sequence.getLength())
+ if (sequence == null || column > sequence.getLength())
{
return;
}
stretchGroup = av.getSelectionGroup();
{
return;
}
stretchGroup = av.getSelectionGroup();
- if (stretchGroup == null || !stretchGroup.contains(sequence, res))
+ if (stretchGroup == null || !stretchGroup.contains(sequence, column))
{
{
- stretchGroup = av.getAlignment().findGroup(sequence, res);
+ stretchGroup = av.getAlignment().findGroup(sequence, column);
if (stretchGroup != null)
{
// only update the current selection if the popup menu has a group to
if (stretchGroup != null)
{
// only update the current selection if the popup menu has a group to
@@
-1409,20
+1431,20
@@
public class SeqPanel extends Panel implements MouseMotionListener,
}
// DETECT RIGHT MOUSE BUTTON IN AWT
}
// DETECT RIGHT MOUSE BUTTON IN AWT
- if ((evt.getModifiers() & InputEvent.BUTTON3_MASK) == InputEvent.BUTTON3_MASK)
+ if ((evt.getModifiersEx()
+ & InputEvent.BUTTON3_DOWN_MASK) == InputEvent.BUTTON3_DOWN_MASK)
{
{
- List<SequenceFeature> allFeatures = findFeaturesAtRes(sequence,
- sequence.findPosition(res));
+ List<SequenceFeature> allFeatures = findFeaturesAtColumn(sequence,
+ sequence.findPosition(column + 1));
Vector<String> links = null;
Vector<String> links = null;
- for (int i = 0; i < allFeatures.size(); i++)
+ for (SequenceFeature sf : allFeatures)
{
{
- SequenceFeature sf = allFeatures.get(i);
if (sf.links != null)
{
if (links == null)
{
if (sf.links != null)
{
if (links == null)
{
- links = new Vector<String>();
+ links = new Vector<>();
}
links.addAll(sf.links);
}
}
links.addAll(sf.links);
}
@@
-1435,7
+1457,7
@@
public class SeqPanel extends Panel implements MouseMotionListener,
if (av.cursorMode)
{
if (av.cursorMode)
{
- seqCanvas.cursorX = findRes(evt);
+ seqCanvas.cursorX = findColumn(evt);
seqCanvas.cursorY = findSeq(evt);
seqCanvas.repaint();
return;
seqCanvas.cursorY = findSeq(evt);
seqCanvas.repaint();
return;
@@
-1447,8
+1469,8
@@
public class SeqPanel extends Panel implements MouseMotionListener,
{
// define a new group here
SequenceGroup sg = new SequenceGroup();
{
// define a new group here
SequenceGroup sg = new SequenceGroup();
- sg.setStartRes(res);
- sg.setEndRes(res);
+ sg.setStartRes(column);
+ sg.setEndRes(column);
sg.addSequence(sequence, false);
av.setSelectionGroup(sg);
stretchGroup = sg;
sg.addSequence(sequence, false);
av.setSelectionGroup(sg);
stretchGroup = sg;
@@
-1467,7
+1489,7
@@
public class SeqPanel extends Panel implements MouseMotionListener,
}
}
}
}
- public void doMouseReleasedDefineMode(MouseEvent evt)
+ public void doMouseReleasedDefineMode(MouseEvent evt, boolean afterDrag)
{
if (stretchGroup == null)
{
{
if (stretchGroup == null)
{
@@
-1477,7
+1499,8
@@
public class SeqPanel extends Panel implements MouseMotionListener,
// but defer colourscheme update until hidden sequences are passed in
boolean vischange = stretchGroup.recalcConservation(true);
// here we rely on stretchGroup == av.getSelection()
// but defer colourscheme update until hidden sequences are passed in
boolean vischange = stretchGroup.recalcConservation(true);
// here we rely on stretchGroup == av.getSelection()
- needOverviewUpdate |= vischange && av.isSelectionDefinedGroup();
+ needOverviewUpdate |= vischange && av.isSelectionDefinedGroup()
+ && afterDrag;
if (stretchGroup.cs != null)
{
stretchGroup.cs.alignmentChanged(stretchGroup,
if (stretchGroup.cs != null)
{
stretchGroup.cs.alignmentChanged(stretchGroup,
@@
-1495,7
+1518,7
@@
public class SeqPanel extends Panel implements MouseMotionListener,
}
}
PaintRefresher.Refresh(ap, av.getSequenceSetId());
}
}
PaintRefresher.Refresh(ap, av.getSequenceSetId());
- ap.paintAlignment(needOverviewUpdate);
+ ap.paintAlignment(needOverviewUpdate, needOverviewUpdate);
needOverviewUpdate = false;
changeEndRes = false;
changeStartRes = false;
needOverviewUpdate = false;
changeEndRes = false;
changeStartRes = false;
@@
-1505,7
+1528,7
@@
public class SeqPanel extends Panel implements MouseMotionListener,
public void doMouseDraggedDefineMode(MouseEvent evt)
{
public void doMouseDraggedDefineMode(MouseEvent evt)
{
- int res = findRes(evt);
+ int res = findColumn(evt);
int y = findSeq(evt);
if (wrappedBlock != startWrapBlock)
int y = findSeq(evt);
if (wrappedBlock != startWrapBlock)
@@
-1620,7
+1643,7
@@
public class SeqPanel extends Panel implements MouseMotionListener,
mouseExited(evt);
}
mouseExited(evt);
}
- if (scrollThread != null)
+ if ((scrollThread != null) && (scrollThread.isRunning()))
{
scrollThread.setEvent(evt);
}
{
scrollThread.setEvent(evt);
}
@@
-1636,9
+1659,9
@@
public class SeqPanel extends Panel implements MouseMotionListener,
oldSeq = 0;
}
oldSeq = 0;
}
- if (scrollThread != null)
+ if ((scrollThread != null) && (scrollThread.isRunning()))
{
{
- scrollThread.running = false;
+ scrollThread.stopScrolling();
scrollThread = null;
}
}
scrollThread = null;
}
}
@@
-1661,9
+1684,9
@@
public class SeqPanel extends Panel implements MouseMotionListener,
{
if (evt == null)
{
{
if (evt == null)
{
- if (scrollThread != null)
+ if ((scrollThread != null) && (scrollThread.isRunning()))
{
{
- scrollThread.running = false;
+ scrollThread.stopScrolling();
scrollThread = null;
}
mouseDragging = false;
scrollThread = null;
}
mouseDragging = false;
@@
-1686,7
+1709,7
@@
public class SeqPanel extends Panel implements MouseMotionListener,
{
MouseEvent evt;
{
MouseEvent evt;
- boolean running = false;
+ private volatile boolean threadRunning = true;
public ScrollThread()
{
public ScrollThread()
{
@@
-1700,14
+1723,18
@@
public class SeqPanel extends Panel implements MouseMotionListener,
public void stopScrolling()
{
public void stopScrolling()
{
- running = false;
+ threadRunning = false;
+ }
+
+ public boolean isRunning()
+ {
+ return threadRunning;
}
@Override
public void run()
{
}
@Override
public void run()
{
- running = true;
- while (running)
+ while (threadRunning)
{
if (evt != null)
{
if (evt != null)
@@
-1716,24
+1743,23
@@
public class SeqPanel extends Panel implements MouseMotionListener,
if (mouseDragging && evt.getY() < 0
&& av.getRanges().getStartSeq() > 0)
{
if (mouseDragging && evt.getY() < 0
&& av.getRanges().getStartSeq() > 0)
{
- running = ap.scrollUp(true);
+ av.getRanges().scrollUp(true);
}
}
- if (mouseDragging && evt.getY() >= getSize().height
- && av.getAlignment().getHeight() > av.getRanges()
- .getEndSeq())
+ if (mouseDragging && evt.getY() >= getSize().height && av
+ .getAlignment().getHeight() > av.getRanges().getEndSeq())
{
{
- running = ap.scrollUp(false);
+ av.getRanges().scrollUp(false);
}
if (mouseDragging && evt.getX() < 0)
{
}
if (mouseDragging && evt.getX() < 0)
{
- running = ap.scrollRight(false);
+ av.getRanges().scrollRight(false);
}
else if (mouseDragging && evt.getX() >= getSize().width)
{
}
else if (mouseDragging && evt.getX() >= getSize().width)
{
- running = ap.scrollRight(true);
+ av.getRanges().scrollRight(true);
}
}
}
}
@@
-1752,15
+1778,16
@@
public class SeqPanel extends Panel implements MouseMotionListener,
*/
@Override
public void selection(SequenceGroup seqsel, ColumnSelection colsel,
*/
@Override
public void selection(SequenceGroup seqsel, ColumnSelection colsel,
- SelectionSource source)
+ HiddenColumns hidden, SelectionSource source)
{
// TODO: fix this hack - source of messages is align viewport, but SeqPanel
// handles selection messages...
// TODO: extend config options to allow user to control if selections may be
// shared between viewports.
{
// TODO: fix this hack - source of messages is align viewport, but SeqPanel
// handles selection messages...
// TODO: extend config options to allow user to control if selections may be
// shared between viewports.
- if (av != null
- && (av == source || !av.followSelection || (source instanceof AlignViewport && ((AlignmentViewport) source)
- .getSequenceSetId().equals(av.getSequenceSetId()))))
+ if (av != null && (av == source || !av.followSelection
+ || (source instanceof AlignViewport
+ && ((AlignmentViewport) source).getSequenceSetId()
+ .equals(av.getSequenceSetId()))))
{
return;
}
{
return;
}
@@
-1769,7
+1796,7
@@
public class SeqPanel extends Panel implements MouseMotionListener,
* Check for selection in a view of which this one is a dna/protein
* complement.
*/
* Check for selection in a view of which this one is a dna/protein
* complement.
*/
- if (selectionFromTranslation(seqsel, colsel, source))
+ if (selectionFromTranslation(seqsel, colsel, hidden, source))
{
return;
}
{
return;
}
@@
-1789,11
+1816,9
@@
public class SeqPanel extends Panel implements MouseMotionListener,
{
if (av.getAlignment() == null)
{
{
if (av.getAlignment() == null)
{
- System.out
- .println("Selection message: alignviewport av SeqSetId="
- + av.getSequenceSetId() + " ViewId="
- + av.getViewId()
- + " 's alignment is NULL! returning immediatly.");
+ System.out.println("Selection message: alignviewport av SeqSetId="
+ + av.getSequenceSetId() + " ViewId=" + av.getViewId()
+ + " 's alignment is NULL! returning immediatly.");
return;
}
sgroup = seqsel.intersect(av.getAlignment(),
return;
}
sgroup = seqsel.intersect(av.getAlignment(),
@@
-1813,9
+1838,8
@@
public class SeqPanel extends Panel implements MouseMotionListener,
}
repaint = av.isSelectionGroupChanged(true);
}
}
repaint = av.isSelectionGroupChanged(true);
}
- if (copycolsel
- && (av.getColumnSelection() == null || !av
- .isColSelChanged(true)))
+ if (copycolsel && (av.getColumnSelection() == null
+ || !av.isColSelChanged(true)))
{
// the current selection is unset or from a previous message
// so import the new colsel.
{
// the current selection is unset or from a previous message
// so import the new colsel.
@@
-1835,15
+1859,14
@@
public class SeqPanel extends Panel implements MouseMotionListener,
}
else
{
}
else
{
- av.getColumnSelection().setElementsFrom(colsel);
+ av.getColumnSelection().setElementsFrom(colsel,
+ av.getAlignment().getHiddenColumns());
}
}
repaint |= av.isColSelChanged(true);
}
}
}
repaint |= av.isColSelChanged(true);
}
- if (copycolsel
- && av.hasHiddenColumns()
- && (av.getColumnSelection() == null || av.getColumnSelection()
- .getHiddenColumns() == null))
+ if (copycolsel && av.hasHiddenColumns()
+ && (av.getColumnSelection() == null))
{
System.err.println("Bad things");
}
{
System.err.println("Bad things");
}
@@
-1877,8
+1900,8
@@
public class SeqPanel extends Panel implements MouseMotionListener,
{
row = row < 0 ? ap.av.getRanges().getStartSeq() : row;
{
row = row < 0 ? ap.av.getRanges().getStartSeq() : row;
- ap.scrollTo(ap.av.getRanges().getStartRes(), ap.av.getRanges()
- .getStartRes(), row, true, true);
+ ap.scrollTo(ap.av.getRanges().getStartRes(),
+ ap.av.getRanges().getStartRes(), row, true, true);
}
/**
}
/**
@@
-1890,7
+1913,8
@@
public class SeqPanel extends Panel implements MouseMotionListener,
{
column = column < 0 ? ap.av.getRanges().getStartRes() : column;
{
column = column < 0 ? ap.av.getRanges().getStartRes() : column;
- ap.scrollTo(column, column, ap.av.getRanges().getStartSeq(), true, true);
+ ap.scrollTo(column, column, ap.av.getRanges().getStartSeq(), true,
+ true);
}
/**
}
/**
@@
-1903,7
+1927,8
@@
public class SeqPanel extends Panel implements MouseMotionListener,
* @param source
*/
protected boolean selectionFromTranslation(SequenceGroup seqsel,
* @param source
*/
protected boolean selectionFromTranslation(SequenceGroup seqsel,
- ColumnSelection colsel, SelectionSource source)
+ ColumnSelection colsel, HiddenColumns hidden,
+ SelectionSource source)
{
if (!(source instanceof AlignViewportI))
{
{
if (!(source instanceof AlignViewportI))
{
@@
-1926,9
+1951,13
@@
public class SeqPanel extends Panel implements MouseMotionListener,
/*
* Map column selection
*/
/*
* Map column selection
*/
- ColumnSelection cs = MappingUtils.mapColumnSelection(colsel, sourceAv,
- av);
+ // ColumnSelection cs = MappingUtils.mapColumnSelection(colsel, sourceAv,
+ // av);
+ ColumnSelection cs = new ColumnSelection();
+ HiddenColumns hs = new HiddenColumns();
+ MappingUtils.mapColumnSelection(colsel, hidden, sourceAv, av, cs, hs);
av.setColumnSelection(cs);
av.setColumnSelection(cs);
+ av.getAlignment().setHiddenColumns(hs);
ap.scalePanelHolder.repaint();
ap.repaint();
ap.scalePanelHolder.repaint();
ap.repaint();