/*
* Jalview - A Sequence Alignment Editor and Viewer ($$Version-Rel$$)
* Copyright (C) $$Year-Rel$$ The Jalview Authors
*
* This file is part of Jalview.
*
* Jalview is free software: you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation, either version 3
* of the License, or (at your option) any later version.
*
* Jalview is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty
* of MERCHANTABILITY or FITNESS FOR A PARTICULAR
* PURPOSE. See the GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with Jalview. If not, see .
* The Jalview Authors are detailed in the 'AUTHORS' file.
*/
package jalview.workers;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.util.Collections;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import jalview.api.AlignViewportI;
import jalview.api.FeaturesDisplayedI;
import jalview.datamodel.SequenceFeature;
import jalview.gui.FeatureRenderer;
public class VisibleFeaturesAnnotationTracks implements FeatureSetCounterI
{
AlignViewportI ourViewport = null;
jalview.api.FeatureRenderer ourFr = null;
PropertyChangeListener ourListener = new PropertyChangeListener()
{
@Override
public void propertyChange(PropertyChangeEvent evt)
{
if (ourViewport != null) // could check source is
// ourFr.getChangeSupport...
{
updateFeatureAnnotationTracks();
}
}
};
public VisibleFeaturesAnnotationTracks(AlignViewportI viewport,
FeatureRenderer fr)
{
ourViewport = viewport;
ourFr = fr;
registerListener();
}
void registerListener()
{
ourFr.addPropertyChangeListener(ourListener);
}
public void tidyUp()
{
if (ourFr != null)
{
ourFr.removePropertyChangeListener(ourListener);
}
if (ourViewport != null && ourViewport.getCalcManager() != null)
{
if (ourWorker != null)
{
ourWorker.abortAndDestroy();
ourViewport.getCalcManager()
.removeRegisteredWorkersOfClass(ourWorker.getClass());
}
ourWorker = null;
ourViewport = null;
}
}
public void updateFeatureAnnotationTracks()
{
// if tracks are turned off, this returns null.
FeaturesDisplayedI featuresDisp = ourViewport
.isShowSequenceFeatureCounts()
? ourViewport.getFeaturesDisplayed()
: null;
Set visibleFeatures = new HashSet();
if (featuresDisp != null)
{
visibleFeatures.addAll(featuresDisp.getVisibleFeatures());
}
if (dispFeatures.equals(visibleFeatures))
{
// all the same features displayed
return;
}
// otherwise set up tracks accordingly
/*
* and register the counter
*/
if (ourWorker != null)
{
Set toRemove = new HashSet(),
toAdd = new HashSet();
toRemove.addAll(dispFeatures);
toRemove.removeAll(visibleFeatures);
dispFeatures = visibleFeatures;
ourWorker.removeOldAnnotations(toRemove.toArray(new String[0]));
}
else
{
dispFeatures = visibleFeatures;
ourWorker = new ColumnCounterSetWorker(ourViewport,
ourFr.getAlignPanel(), this);
}
ourViewport.getCalcManager().registerWorker(ourWorker);
ourViewport.getCalcManager().startWorker(ourWorker);
}
ColumnCounterSetWorker ourWorker = null;
Set dispFeatures = Collections.EMPTY_SET;
@Override
public int[] count(String residue, List features)
{
final Set ourDispFeatures = dispFeatures;
int[] obs = new int[ourDispFeatures.size()];
SequenceFeature[] sfs = features.toArray(new SequenceFeature[0]);
for (SequenceFeature sf : sfs)
{
/*
* Here we inspect the type of the sequence feature.
* You can also test sf.description, sf.score, sf.featureGroup,
* sf.strand, sf.phase, sf.begin, sf.end
* or sf.getValue(attributeName) for GFF 'column 9' properties
*/
int pos = 0;
for (String type : ourDispFeatures)
{
if (type.equals(sf.type))
{
obs[pos]++;
}
pos++;
}
}
return obs;
}
@Override
public String[] getNames()
{
return dispFeatures.toArray(new String[0]);
}
@Override
public String[] getDescriptions()
{
return dispFeatures.toArray(new String[0]);
}
@Override
public int[] getMaxColour()
{
return new int[] { 0, 0, 255 };
}
@Override
public int[] getMinColour()
{
return new int[] { 0, 255, 255 };
}
}