- public FeatureRenderer(AlignViewport av)
- {
- this.av = av;
- }
-
- public void transferSettings(FeatureRenderer fr)
- {
- renderOrder = fr.renderOrder;
- featureGroups = fr.featureGroups;
- featureColours = fr.featureColours;
- transparency = fr.transparency;
- }
-
- BufferedImage offscreenImage;
- boolean offscreenRender = false;
- public Color findFeatureColour(Color initialCol, SequenceI seq, int res)
- {
- return new Color(findFeatureColour(initialCol.getRGB(),
- seq, res));
- }
-
- /**
- * This is used by the Molecule Viewer and Overview to
- * get the accurate colourof the rendered sequence
- */
- public int findFeatureColour(int initialCol, SequenceI seq, int column)
- {
- if (!av.showSequenceFeatures)
- {
- return initialCol;
- }
-
- if (seq != lastSeq)
- {
- lastSeq = seq;
- sequenceFeatures = lastSeq.getDatasetSequence().getSequenceFeatures();
- if (sequenceFeatures == null)
- {
- return initialCol;
- }
-
- sfSize = sequenceFeatures.length;
- }
-
- if (jalview.util.Comparison.isGap(lastSeq.getCharAt(column)))
- {
- return Color.white.getRGB();
- }
-
- //Only bother making an offscreen image if transparency is applied
- if (transparency != 1.0f && offscreenImage == null)
- {
- offscreenImage = new BufferedImage(1, 1, BufferedImage.TYPE_INT_ARGB);
- }
-
- currentColour = null;
-
- offscreenRender = true;
-
- if (offscreenImage != null)
- {
- offscreenImage.setRGB(0, 0, initialCol);
- drawSequence(offscreenImage.getGraphics(),
- lastSeq,
- column, column, 0);
-
- return offscreenImage.getRGB(0, 0);
- }
- else
- {
- drawSequence(null,
- lastSeq,
- lastSeq.findPosition(column),
- -1, -1);
-
- if (currentColour == null)
- {
- return initialCol;
- }
- else
- {
- return ( (Integer) currentColour).intValue();
- }
- }
-
- }
-
- /**
- * DOCUMENT ME!
- *
- * @param g DOCUMENT ME!
- * @param seq DOCUMENT ME!
- * @param sg DOCUMENT ME!
- * @param start DOCUMENT ME!
- * @param end DOCUMENT ME!
- * @param x1 DOCUMENT ME!
- * @param y1 DOCUMENT ME!
- * @param width DOCUMENT ME!
- * @param height DOCUMENT ME!
- */
- // String type;
- // SequenceFeature sf;
- SequenceI lastSeq;
- SequenceFeature[] sequenceFeatures;
- int sfSize, sfindex, spos, epos;
-
- public void drawSequence(Graphics g, SequenceI seq,
- int start, int end, int y1)
- {
- if (seq.getDatasetSequence().getSequenceFeatures() == null
- || seq.getDatasetSequence().getSequenceFeatures().length == 0)
- {
- return;
- }
-
- if (g != null)
- {
- fm = g.getFontMetrics();
- }
-
- if (av.featuresDisplayed == null
- || renderOrder == null
- || newFeatureAdded)
- {
- findAllFeatures();
- if (av.featuresDisplayed.size() < 1)
- {
- return;
- }
-
- sequenceFeatures = seq.getDatasetSequence().getSequenceFeatures();
- sfSize = sequenceFeatures.length;
- }
-
- if (lastSeq == null || seq != lastSeq)
- {
- lastSeq = seq;
- sequenceFeatures = seq.getDatasetSequence().getSequenceFeatures();
- sfSize = sequenceFeatures.length;
- }
-
- if (transparency != 1 && g != null)
- {
- Graphics2D g2 = (Graphics2D) g;
- g2.setComposite(
- AlphaComposite.getInstance(
- AlphaComposite.SRC_OVER, transparency));
- }
-
- if (!offscreenRender)
- {
- spos = lastSeq.findPosition(start);
- epos = lastSeq.findPosition(end);
- }
-
- String type;
- for (int renderIndex = 0; renderIndex < renderOrder.length; renderIndex++)
- {
- type = renderOrder[renderIndex];
-
- if (type == null || !av.featuresDisplayed.containsKey(type))
- {
- continue;
- }
-
- // loop through all features in sequence to find
- // current feature to render
- for (sfindex = 0; sfindex < sfSize; sfindex++)
- {
- if (sequenceFeatures.length <= sfindex)
- {
- continue;
- }
- if (!sequenceFeatures[sfindex].type.equals(type))
- {
- continue;
- }
-
- if (featureGroups != null
- && sequenceFeatures[sfindex].featureGroup != null
- &&
- featureGroups.containsKey(sequenceFeatures[sfindex].featureGroup)
- &&
- ! ( (Boolean) featureGroups.get(sequenceFeatures[sfindex].
- featureGroup)).
- booleanValue())
- {
- continue;
- }
-
- if (!offscreenRender && (sequenceFeatures[sfindex].getBegin() > epos
- || sequenceFeatures[sfindex].getEnd() < spos))
- {
- continue;
- }
-
- if (offscreenRender && offscreenImage == null)
- {
- if (sequenceFeatures[sfindex].begin <= start &&
- sequenceFeatures[sfindex].end >= start)
- {
- currentColour = av.featuresDisplayed.get(sequenceFeatures[sfindex].
- type);
- }
- }
- else if (sequenceFeatures[sfindex].type.equals("disulfide bond"))
- {
-
- renderFeature(g, seq,
- seq.findIndex(sequenceFeatures[sfindex].begin) - 1,
- seq.findIndex(sequenceFeatures[sfindex].begin) - 1,
- new Color( ( (Integer) av.featuresDisplayed.get(
- sequenceFeatures[sfindex].type)).intValue()),
- start, end, y1);
- renderFeature(g, seq,
- seq.findIndex(sequenceFeatures[sfindex].end) - 1,
- seq.findIndex(sequenceFeatures[sfindex].end) - 1,
- new Color( ( (Integer) av.featuresDisplayed.get(
- sequenceFeatures[sfindex].type)).intValue()),
- start, end, y1);
-
- }
- else
- {
- renderFeature(g, seq,
- seq.findIndex(sequenceFeatures[sfindex].begin) - 1,
- seq.findIndex(sequenceFeatures[sfindex].end) - 1,
- getColour(sequenceFeatures[sfindex].type),
- start, end, y1);
- }
-
- }
-
- }
-
- if (transparency != 1.0f && g != null)
- {
- Graphics2D g2 = (Graphics2D) g;
- g2.setComposite(
- AlphaComposite.getInstance(
- AlphaComposite.SRC_OVER, 1.0f));
- }
- }
-
- char s;
- int i;
- void renderFeature(Graphics g, SequenceI seq,
- int fstart, int fend, Color featureColour, int start,
- int end, int y1)
- {
-
- if ( ( (fstart <= end) && (fend >= start)))
- {
- if (fstart < start)
- { // fix for if the feature we have starts before the sequence start,
- fstart = start; // but the feature end is still valid!!
- }
-
- if (fend >= end)
- {
- fend = end;
- }
- int pady = (y1 + av.charHeight) - av.charHeight / 5;
- for (i = fstart; i <= fend; i++)
- {
- s = seq.getCharAt(i);
-
- if (jalview.util.Comparison.isGap(s))
- {
- continue;
- }
-
- g.setColor(featureColour);
-
- g.fillRect( (i - start) * av.charWidth, y1, av.charWidth, av.charHeight);
-
- if (offscreenRender || !av.validCharWidth)
- {
- continue;
- }
-
- g.setColor(Color.white);
- charOffset = (av.charWidth - fm.charWidth(s)) / 2;
- g.drawString(String.valueOf(s),
- charOffset + (av.charWidth * (i - start)),
- pady);
-
- }
- }
- }
-
- boolean newFeatureAdded = false;
-
- public void featuresAdded()
- {
- lastSeq=null;
- findAllFeatures();
- }
-
- boolean findingFeatures = false;
- synchronized void findAllFeatures()
- {
- newFeatureAdded = false;
-
- if (findingFeatures)
- {
- newFeatureAdded = true;
- return;
- }
-
- findingFeatures = true;
- jalview.schemes.UserColourScheme ucs = new
- jalview.schemes.UserColourScheme();
-
- if (av.featuresDisplayed == null)
- {
- av.featuresDisplayed = new Hashtable();
- }
-
- av.featuresDisplayed.clear();
-
- Vector allfeatures = new Vector();
- for (int i = 0; i < av.alignment.getHeight(); i++)
- {
- SequenceFeature[] features
- = av.alignment.getSequenceAt(i).getDatasetSequence().
- getSequenceFeatures();
-
- if (features == null)
- {
- continue;
- }
-
- int index = 0;
- while (index < features.length)
- {
- if (!av.featuresDisplayed.containsKey(features[index].getType()))
- {
- if (! (features[index].begin == 0 && features[index].end == 0))
- {
- // If beginning and end are 0, the feature is for the whole sequence
- // and we don't want to render the feature in the normal way
-
- if (getColour(features[index].getType()) == null)
- {
- featureColours.put(features[index].getType(),
- ucs.createColourFromName(features[index].
- getType()));
- }
-
- av.featuresDisplayed.put(features[index].getType(),
- new Integer(getColour(features[index].
- getType()).getRGB()));
- allfeatures.addElement(features[index].getType());
- }
- }
- index++;
- }
- }
-
- renderOrder = new String[allfeatures.size()];
- Enumeration en = allfeatures.elements();
- int i = allfeatures.size() - 1;
- while (en.hasMoreElements())
- {
- renderOrder[i] = en.nextElement().toString();
- i--;
- }
-
- findingFeatures = false;
- }
-
- public Color getColour(String featureType)