Merge branch 'develop' into features/JAL-2446NCList
[jalview.git] / src / jalview / datamodel / SequenceFeature.java
index 045bbbd..9c4087e 100755 (executable)
@@ -58,9 +58,9 @@ public class SequenceFeature implements FeatureLocationI
   private static final String ATTRIBUTES = "ATTRIBUTES";
 
   /*
-   * type, begin, end, featureGroup are final to ensure that
-   * the integrity of SequenceFeatures data store can't be
-   * broken by direct update of these fields
+   * type, begin, end, featureGroup, score and contactFeature are final 
+   * to ensure that the integrity of SequenceFeatures data store 
+   * can't be broken by direct update of these fields
    */
   public final String type;
 
@@ -72,6 +72,8 @@ public class SequenceFeature implements FeatureLocationI
 
   public final float score;
 
+  private final boolean contactFeature;
+
   public String description;
 
   /*
@@ -107,12 +109,7 @@ public class SequenceFeature implements FeatureLocationI
   public SequenceFeature(String theType, String theDesc, int theBegin,
           int theEnd, String group)
   {
-    this.type = theType;
-    this.description = theDesc;
-    this.begin = theBegin;
-    this.end = theEnd;
-    this.featureGroup = group;
-    this.score = NO_SCORE;
+    this(theType, theDesc, theBegin, theEnd, NO_SCORE, group);
   }
 
   /**
@@ -134,21 +131,28 @@ public class SequenceFeature implements FeatureLocationI
     this.end = theEnd;
     this.featureGroup = group;
     this.score = theScore;
+
+    /*
+     * for now, only "Disulfide/disulphide bond" is treated as a contact feature
+     */
+    this.contactFeature = "disulfide bond".equalsIgnoreCase(type)
+            || "disulphide bond".equalsIgnoreCase(type);
   }
 
   /**
    * A copy constructor that allows the value of final fields to be 'modified'
    * 
    * @param sf
+   * @param newType
    * @param newBegin
    * @param newEnd
    * @param newGroup
    * @param newScore
    */
-  public SequenceFeature(SequenceFeature sf, int newBegin, int newEnd,
-          String newGroup, float newScore)
+  public SequenceFeature(SequenceFeature sf, String newType, int newBegin,
+          int newEnd, String newGroup, float newScore)
   {
-    this(sf.getType(), sf.getDescription(), newBegin, newEnd, newScore,
+    this(newType, sf.getDescription(), newBegin, newEnd, newScore,
             newGroup);
 
     if (sf.otherDetails != null)
@@ -170,6 +174,21 @@ public class SequenceFeature implements FeatureLocationI
   }
 
   /**
+   * A copy constructor that allows the value of final fields to be 'modified'
+   * 
+   * @param sf
+   * @param newBegin
+   * @param newEnd
+   * @param newGroup
+   * @param newScore
+   */
+  public SequenceFeature(SequenceFeature sf, int newBegin, int newEnd,
+          String newGroup, float newScore)
+  {
+    this(sf, sf.getType(), newBegin, newEnd, newGroup, newScore);
+  }
+
+  /**
    * Two features are considered equal if they have the same type, group,
    * description, start, end, phase, strand, and (if present) 'Name', ID' and
    * 'Parent' attributes.
@@ -214,8 +233,8 @@ public class SequenceFeature implements FeatureLocationI
       return false;
     }
 
-    if (!(type + description + featureGroup + getPhase()).equals(sf.type
-            + sf.description + sf.featureGroup + sf.getPhase()))
+    if (!(type + description + featureGroup + getPhase()).equals(
+            sf.type + sf.description + sf.featureGroup + sf.getPhase()))
     {
       return false;
     }
@@ -504,13 +523,7 @@ public class SequenceFeature implements FeatureLocationI
   @Override
   public boolean isContactFeature()
   {
-    // TODO abstract one day to a FeatureType class
-    if ("disulfide bond".equalsIgnoreCase(type)
-            || "disulphide bond".equalsIgnoreCase(type))
-    {
-      return true;
-    }
-    return false;
+    return contactFeature;
   }
 
   /**