- /**
- * Creates a new AlignmentAnnotation object.
- *
- * @param label DOCUMENT ME!
- * @param description DOCUMENT ME!
- * @param annotations DOCUMENT ME!
- * @param min DOCUMENT ME!
- * @param max DOCUMENT ME!
- * @param winLength DOCUMENT ME!
- */
- public AlignmentAnnotation(String label, String description,
- Annotation[] annotations, float min, float max, int graphType)
+ if (nonSSLabel)
+ {
+ hasIcons = false;
+ for (int j = 0; j < annotations.length; j++)
+ {
+ if (annotations[j] != null
+ && annotations[j].secondaryStructure != ' ')
+ {
+ annotations[j].displayCharacter = String
+ .valueOf(annotations[j].secondaryStructure);
+ annotations[j].secondaryStructure = ' ';
+ }
+
+ }
+ }
+ else
+ {
+ if (isrna)
+ {
+ _updateRnaSecStr(new AnnotCharSequence());
+ }
+ }
+ }
+
+ /**
+ * flyweight access to positions in the alignment annotation row for RNA
+ * processing
+ *
+ * @author jimp
+ *
+ */
+ private class AnnotCharSequence implements CharSequence
+ {
+ int offset = 0;
+
+ int max = 0;
+
+ public AnnotCharSequence()
+ {
+ this(0, annotations.length);
+ }
+
+ AnnotCharSequence(int start, int end)
+ {
+ offset = start;
+ max = end;
+ }
+
+ @Override
+ public CharSequence subSequence(int start, int end)
+ {
+ return new AnnotCharSequence(offset + start, offset + end);
+ }
+
+ @Override
+ public int length()
+ {
+ return max - offset;
+ }
+
+ @Override
+ public char charAt(int index)
+ {
+ return ((index + offset < 0) || (index + offset) >= max
+ || annotations[index + offset] == null
+ || (annotations[index + offset].secondaryStructure <= ' ')
+ ? ' '
+ : annotations[index + offset].displayCharacter == null
+ || annotations[index
+ + offset].displayCharacter
+ .length() == 0
+ ? annotations[index
+ + offset].secondaryStructure
+ : annotations[index
+ + offset].displayCharacter
+ .charAt(0));
+ }
+
+ @Override
+ public String toString()
+ {
+ char[] string = new char[max - offset];
+ int mx = annotations.length;
+
+ for (int i = offset; i < mx; i++)
+ {
+ string[i] = (annotations[i] == null
+ || (annotations[i].secondaryStructure <= 32))
+ ? ' '
+ : (annotations[i].displayCharacter == null
+ || annotations[i].displayCharacter
+ .length() == 0
+ ? annotations[i].secondaryStructure
+ : annotations[i].displayCharacter
+ .charAt(0));
+ }
+ return new String(string);
+ }
+ };
+
+ private long _lastrnaannot = -1;
+
+ public String getRNAStruc()
+ {
+ if (isrna)
+ {
+ String rnastruc = new AnnotCharSequence().toString();
+ if (_lastrnaannot != rnastruc.hashCode())
+ {
+ // ensure rna structure contacts are up to date
+ _lastrnaannot = rnastruc.hashCode();
+ _updateRnaSecStr(rnastruc);
+ }
+ return rnastruc;
+ }
+ return null;
+ }
+
+ /**
+ * Creates a new AlignmentAnnotation object.
+ *
+ * @param label
+ * DOCUMENT ME!
+ * @param description
+ * DOCUMENT ME!
+ * @param annotations
+ * DOCUMENT ME!
+ * @param min
+ * DOCUMENT ME!
+ * @param max
+ * DOCUMENT ME!
+ * @param winLength
+ * DOCUMENT ME!
+ */
+ public AlignmentAnnotation(String label, String description,
+ Annotation[] annotations, float min, float max, int graphType)
+ {
+ setAnnotationId();
+ // graphs are not editable
+ editable = graphType == 0;
+
+ this.label = label;
+ this.description = description;
+ this.annotations = annotations;
+ graph = graphType;
+ graphMin = min;
+ graphMax = max;
+ validateRangeAndDisplay();
+ }
+
+ /**
+ * checks graphMin and graphMax, secondary structure symbols, sets graphType
+ * appropriately, sets null labels to the empty string if appropriate.
+ */
+ public void validateRangeAndDisplay()
+ {
+
+ if (annotations == null)