import jalview.commands.EditCommand.Action;
import jalview.datamodel.AlignmentI;
import jalview.datamodel.ColumnSelection;
+import jalview.datamodel.SearchResultMatchI;
import jalview.datamodel.SearchResults;
-import jalview.datamodel.SearchResults.Match;
+import jalview.datamodel.SearchResultsI;
import jalview.datamodel.Sequence;
import jalview.datamodel.SequenceFeature;
import jalview.datamodel.SequenceGroup;
* @param results
* @return true if results were matched, false if not
*/
- private boolean setStatusMessage(SearchResults results)
+ private boolean setStatusMessage(SearchResultsI results)
{
AlignmentI al = this.av.getAlignment();
int sequenceIndex = al.findIndex(results);
return false;
}
SequenceI ds = al.getSequenceAt(sequenceIndex).getDatasetSequence();
- for (Match m : results.getResults())
+ for (SearchResultMatchI m : results.getResults())
{
SequenceI seq = m.getSequence();
if (seq.getDatasetSequence() != null)
* Convert position in sequence (base 1) to sequence character array
* index (base 0)
*/
- int start = m.getStart() - 1;
+ int start = m.getStart() - m.getSequence().getStart();
setStatusMessage(seq, start, sequenceIndex);
return true;
}
return false;
}
+ @Override
public void mousePressed(MouseEvent evt)
{
lastMousePress = evt.getPoint();
return;
}
+ @Override
public void mouseClicked(MouseEvent evt)
{
SequenceI sequence = av.getAlignment().getSequenceAt(findSeq(evt));
if (features != null && features.length > 0)
{
- SearchResults highlight = new SearchResults();
+ SearchResultsI highlight = new SearchResults();
highlight.addResult(sequence, features[0].getBegin(),
features[0].getEnd());
seqCanvas.highlightSearchResults(highlight);
}
if (features != null && features.length > 0)
{
- seqCanvas.getFeatureRenderer().amendFeatures(new SequenceI[]
- { sequence }, features, false, ap);
+ seqCanvas.getFeatureRenderer().amendFeatures(
+ new SequenceI[] { sequence }, features, false, ap);
seqCanvas.highlightSearchResults(null);
}
}
}
+ @Override
public void mouseReleased(MouseEvent evt)
{
mouseDragging = false;
}
int cHeight = av.getAlignment().getHeight() * av.getCharHeight()
- + hgap
- + seqCanvas.getAnnotationHeight();
+ + hgap + seqCanvas.getAnnotationHeight();
int y = evt.getY();
y -= hgap;
}
int cHeight = av.getAlignment().getHeight() * av.getCharHeight()
- + hgap
- + seqCanvas.getAnnotationHeight();
+ + hgap + seqCanvas.getAnnotationHeight();
y -= hgap;
String lastMessage;
+ @Override
public void mouseOverSequence(SequenceI sequence, int index, int pos)
{
String tmp = sequence.hashCode() + index + "";
lastMessage = tmp;
}
- public void highlightSequence(SearchResults results)
+ @Override
+ public void highlightSequence(SearchResultsI results)
{
if (av.isFollowHighlight())
{
return this.ap == null ? null : this.ap.av;
}
+ @Override
public void updateColours(SequenceI seq, int index)
{
System.out.println("update the seqPanel colours");
// repaint();
}
+ @Override
public void mouseMoved(MouseEvent evt)
{
int res = findRes(evt);
}
else
{
- obj = "X".equalsIgnoreCase(ch) ? "X"
- : ResidueProperties.aa2Triplet.get(ch);
+ obj = "X".equalsIgnoreCase(ch) ? "X" : ResidueProperties.aa2Triplet
+ .get(ch);
if (obj != null)
{
text.append(" Residue: ").append(obj);
for (int i = 0; i < features.length; i++)
{
if (av.getFeaturesDisplayed() == null
- || !av.getFeaturesDisplayed().isVisible(features[i].getType()))
+ || !av.getFeaturesDisplayed().isVisible(
+ features[i].getType()))
{
continue;
}
if (features[i].featureGroup != null
- && !seqCanvas.fr.checkGroupVisibility(features[i].featureGroup,false))
+ && !seqCanvas.fr.checkGroupVisibility(
+ features[i].featureGroup, false))
{
continue;
}
Tooltip tooltip;
+ /**
+ * set when the current UI interaction has resulted in a change that requires
+ * overview shading to be recalculated. this could be changed to something
+ * more expressive that indicates what actually has changed, so selective
+ * redraws can be applied
+ */
+ private boolean needOverviewUpdate; // TODO: refactor to avcontroller
+
+ @Override
public void mouseDragged(MouseEvent evt)
{
if (mouseWheelPressed)
if (editCommand == null)
{
editCommand = new EditCommand(MessageManager.formatMessage(
- "label.edit_params", new String[]
- { label }));
+ "label.edit_params", new String[] { label }));
}
}
{
for (int j = lastres; j < startres; j++)
{
- insertChar(j, new SequenceI[]
- { seq }, fixedRight);
+ insertChar(j, new SequenceI[] { seq }, fixedRight);
}
}
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
endEditing();
break;
}
- deleteChar(startres, new SequenceI[]
- { seq }, fixedRight);
+ deleteChar(startres, new SequenceI[] { seq }, fixedRight);
}
}
else
if (max > 0)
{
- editCommand.appendEdit(Action.DELETE_GAP, new SequenceI[]
- { seq }, startres, max, av.getAlignment(), true);
+ editCommand.appendEdit(Action.DELETE_GAP,
+ new SequenceI[] { seq }, startres, max,
+ av.getAlignment(), true);
}
}
}
if (stretchGroup == null)
{
- stretchGroup = av.getAlignment().findGroup(sequence);
- if (stretchGroup != null && res > stretchGroup.getStartRes()
- && res < stretchGroup.getEndRes())
- {
- av.setSelectionGroup(stretchGroup);
- }
- else
- {
- stretchGroup = null;
- }
+ stretchGroup = av.getAlignment().findGroup(sequence, res);
+ av.setSelectionGroup(stretchGroup);
}
- else if (!stretchGroup.getSequences(null).contains(sequence)
+ if (stretchGroup == null
+ || !stretchGroup.getSequences(null).contains(sequence)
|| stretchGroup.getStartRes() > res
|| stretchGroup.getEndRes() < res)
{
if (av.getConservationSelected())
{
- SliderPanel.setConservationSlider(ap, av.getGlobalColourScheme(),
+ SliderPanel.setConservationSlider(ap, av.getViewportColourScheme(),
"Background");
}
if (av.getAbovePIDThreshold())
{
- SliderPanel.setPIDSliderSource(ap, av.getGlobalColourScheme(),
+ SliderPanel.setPIDSliderSource(ap, av.getViewportColourScheme(),
"Background");
}
{
return;
}
-
- stretchGroup.recalcConservation(); // always do this - annotation has own
- // state
+ // always do this - annotation has own state
+ // 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();
if (stretchGroup.cs != null)
{
stretchGroup.cs.alignmentChanged(stretchGroup,
SliderPanel.setConservationSlider(ap, stretchGroup.cs,
stretchGroup.getName());
}
- else
+ if (stretchGroup.cs.getThreshold() > 0)
{
SliderPanel.setPIDSliderSource(ap, stretchGroup.cs,
stretchGroup.getName());
}
}
+ PaintRefresher.Refresh(ap, av.getSequenceSetId());
+ ap.paintAlignment(needOverviewUpdate);
+ needOverviewUpdate = false;
changeEndRes = false;
changeStartRes = false;
stretchGroup = null;
- PaintRefresher.Refresh(ap, av.getSequenceSetId());
- ap.paintAlignment(true);
av.sendSelection();
}
if (res > (stretchGroup.getStartRes() - 1))
{
stretchGroup.setEndRes(res);
+ needOverviewUpdate |= av.isSelectionDefinedGroup();
}
}
else if (changeStartRes)
if (res < (stretchGroup.getEndRes() + 1))
{
stretchGroup.setStartRes(res);
+ needOverviewUpdate |= av.isSelectionDefinedGroup();
}
}
if (stretchGroup.getSequences(null).contains(nextSeq))
{
stretchGroup.deleteSequence(seq, false);
+ needOverviewUpdate |= av.isSelectionDefinedGroup();
}
else
{
}
stretchGroup.addSequence(nextSeq, false);
+ needOverviewUpdate |= av.isSelectionDefinedGroup();
}
}
seqCanvas.repaint();
}
+ @Override
public void mouseEntered(MouseEvent e)
{
if (oldSeq < 0)
}
}
+ @Override
public void mouseExited(MouseEvent e)
{
if (av.getWrapAlignment())
running = false;
}
+ @Override
public void run()
{
running = true;
/**
* modify current selection according to a received message.
*/
+ @Override
public void selection(SequenceGroup seqsel, ColumnSelection colsel,
SelectionSource source)
{
// do we want to thread this ? (contention with seqsel and colsel locks, I
// suspect)
- // rules are: colsel is copied if there is a real intersection between
- // sequence selection
- boolean repaint = false, copycolsel = true;
+ /*
+ * only copy colsel if there is a real intersection between
+ * sequence selection and this panel's alignment
+ */
+ boolean repaint = false;
+ boolean copycolsel = false;
if (av.getSelectionGroup() == null || !av.isSelectionGroupChanged(true))
{
SequenceGroup sgroup = null;
}
sgroup = seqsel.intersect(av.getAlignment(),
(av.hasHiddenRows()) ? av.getHiddenRepSequences() : null);
- if ((sgroup == null || sgroup.getSize() == 0)
- && (colsel == null || colsel.size() == 0))
+ if ((sgroup != null && sgroup.getSize() > 0))
{
- // don't copy columns if the region didn't intersect.
- copycolsel = false;
+ copycolsel = true;
}
}
if (sgroup != null && sgroup.getSize() > 0)
{
// the current selection is unset or from a previous message
// so import the new colsel.
- if (colsel == null || colsel.size() == 0)
+ if (colsel == null || colsel.isEmpty())
{
if (av.getColumnSelection() != null)
{
protected boolean selectionFromTranslation(SequenceGroup seqsel,
ColumnSelection colsel, SelectionSource source)
{
- if (!(source instanceof AlignViewportI)) {
+ if (!(source instanceof AlignViewportI))
+ {
return false;
}
final AlignViewportI sourceAv = (AlignViewportI) source;
- if (sourceAv.getCodingComplement() != av && av.getCodingComplement() != sourceAv)
+ if (sourceAv.getCodingComplement() != av
+ && av.getCodingComplement() != sourceAv)
{
return false;
}
-
+
/*
* Map sequence selection
*/
SequenceGroup sg = MappingUtils.mapSequenceGroup(seqsel, sourceAv, av);
av.setSelectionGroup(sg);
av.isSelectionGroupChanged(true);
-
+
/*
* Map column selection
*/
ColumnSelection cs = MappingUtils.mapColumnSelection(colsel, sourceAv,
av);
av.setColumnSelection(cs);
- av.isColSelChanged(true);
-
+
ap.scalePanelHolder.repaint();
ap.repaint();
-
+
return true;
}