/*
* 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.api;
import jalview.datamodel.SequenceFeature;
import jalview.datamodel.SequenceI;
import jalview.datamodel.features.FeatureMatcherSetI;
import java.awt.Color;
import java.awt.Graphics;
import java.util.List;
import java.util.Map;
/**
* Abstract feature renderer interface
*
* @author JimP
*
*/
public interface FeatureRenderer
{
/**
* Computes the feature colour for a given sequence and column position,
* taking into account sequence feature locations, feature colour schemes,
* render ordering, feature and feature group visibility, and transparency.
*
* The graphics argument should be provided if transparency is applied
* (getTransparency() < 1). With feature transparency, visible features are
* written to the graphics context and the composite colour may be read off
* from it. In this case, the returned feature colour is not the composite
* colour but that of the last feature drawn.
*
* If no transparency applies, then the graphics argument may be null, and the
* returned colour is the one that would be drawn for the feature.
*
* Returns null if there is no visible feature at the position.
*
* This is provided to support rendering of feature colours other than on the
* sequence alignment, including by structure viewers and the overview window.
* Note this method takes no account of whether the sequence or column is
* hidden.
*
* @param sequence
* @param column
* aligned column position (1..)
* @param g
* @return
*/
Color findFeatureColour(SequenceI sequence, int column, Graphics g);
/**
* trigger the feature discovery process for a newly created feature renderer.
*/
void featuresAdded();
/**
*
* @param ft
* @return display style for a feature
*/
FeatureColourI getFeatureStyle(String ft);
/**
* update the feature style for a particular feature
*
* @param ft
* @param ggc
*/
void setColour(String ft, FeatureColourI ggc);
AlignViewportI getViewport();
/**
*
* @return container managing list of feature types and their visibility
*/
FeaturesDisplayedI getFeaturesDisplayed();
/**
* get display style for all features types - visible or invisible
*
* @return
*/
Map getFeatureColours();
/**
* query the alignment view to find all features
*
* @param newMadeVisible
* - when true, automatically make newly discovered types visible
*/
void findAllFeatures(boolean newMadeVisible);
/**
* get display style for all features types currently visible
*
* @return
*/
Map getDisplayedFeatureCols();
/**
* get all registered groups
*
* @return
*/
List getFeatureGroups();
/**
* get groups that are visible/invisible -- JalviewLite only?
*
* @param visible
* @return
*/
List getGroups(boolean visible);
/**
* Set visibility for a list of groups -- JalviewLite only?
*
* @param toset
* @param visible
*/
void setGroupVisibility(List toset, boolean visible);
/**
* Set visibility of the given feature group
*
* @param group
* @param visible
*/
void setGroupVisibility(String group, boolean visible);
/**
* Returns visible 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
* aligned column position (1..)
* @return
*/
List findFeaturesAtColumn(SequenceI sequence, int column);
/**
* Returns features at the specified residue position on the given sequence.
* Non-positional features are not included.
*
* @param sequence
* @param resNo
* residue position (start..)
* @return
*/
List findFeaturesAtResidue(SequenceI sequence, int resNo);
/**
* get current displayed types, in ordering of rendering (on top last)
*
* @return a (possibly empty) list of feature types
*/
List getDisplayedFeatureTypes();
/**
* Returns a (possibly empty) list of currently visible feature groups
*
* @return
*/
List getDisplayedFeatureGroups();
/**
* display all features of these types
*
* @param featureTypes
*/
void setAllVisible(List featureTypes);
/**
* display featureType
*
* @param featureType
*/
void setVisible(String featureType);
/**
* Sets the transparency value, between 0 (full transparency) and 1 (no
* transparency)
*
* @param value
*/
void setTransparency(float value);
/**
* Returns the transparency value, between 0 (full transparency) and 1 (no
* transparency)
*
* @return
*/
float getTransparency();
/**
* Answers the filters applied to the given feature type, or null if none is
* set
*
* @param featureType
* @return
*/
FeatureMatcherSetI getFeatureFilter(String featureType);
/**
* Answers the feature filters map
*
* @return
*/
public Map getFeatureFilters();
/**
* Sets the filters for the feature type, or removes them if a null or empty
* filter is passed
*
* @param featureType
* @param filter
*/
void setFeatureFilter(String featureType, FeatureMatcherSetI filter);
/**
* Replaces all feature filters with the given map
*
* @param filters
*/
void setFeatureFilters(Map filters);
/**
* Returns the colour for a particular feature instance. This includes
* calculation of 'colour by label', or of a graduated score colour, if
* applicable.
*
* Returns null if
*
* - feature group is not visible, or
* - feature values lie outside any colour threshold, or
* - feature is excluded by filter conditions
*
* This method does not check feature type visibility.
*
* @param feature
* @return
*/
Color getColour(SequenceFeature feature);
/**
* Answers true if feature would be shown, else false. A feature is shown if
*
* - its feature type is set to visible
* - its feature group is either null, or set to visible
* - it is not excluded by a colour threshold on score or other numeric
* attribute
* - it is not excluded by a filter condition
*
*
* @param feature
* @return
*/
boolean isVisible(SequenceFeature feature);
}