Merge branch 'develop' into task/JAL-2196pdbeProperties
[jalview.git] / src / jalview / workers / AlignCalcWorker.java
1 /*
2  * Jalview - A Sequence Alignment Editor and Viewer ($$Version-Rel$$)
3  * Copyright (C) $$Year-Rel$$ The Jalview Authors
4  * 
5  * This file is part of Jalview.
6  * 
7  * Jalview is free software: you can redistribute it and/or
8  * modify it under the terms of the GNU General Public License 
9  * as published by the Free Software Foundation, either version 3
10  * of the License, or (at your option) any later version.
11  *  
12  * Jalview is distributed in the hope that it will be useful, but 
13  * WITHOUT ANY WARRANTY; without even the implied warranty 
14  * of MERCHANTABILITY or FITNESS FOR A PARTICULAR 
15  * PURPOSE.  See the GNU General Public License for more details.
16  * 
17  * You should have received a copy of the GNU General Public License
18  * along with Jalview.  If not, see <http://www.gnu.org/licenses/>.
19  * The Jalview Authors are detailed in the 'AUTHORS' file.
20  */
21 package jalview.workers;
22
23 import jalview.api.AlignCalcManagerI;
24 import jalview.api.AlignCalcWorkerI;
25 import jalview.api.AlignViewportI;
26 import jalview.api.AlignmentViewPanel;
27 import jalview.datamodel.AlignmentAnnotation;
28 import jalview.datamodel.AlignmentI;
29 import jalview.datamodel.Annotation;
30
31 import java.util.List;
32
33 /**
34  * Base class for alignment calculation workers
35  * 
36  * @author jimp
37  * 
38  */
39 public abstract class AlignCalcWorker implements AlignCalcWorkerI
40 {
41   /**
42    * manager and data source for calculations
43    */
44   protected AlignViewportI alignViewport;
45
46   protected AlignCalcManagerI calcMan;
47
48   protected AlignmentViewPanel ap;
49
50   protected List<AlignmentAnnotation> ourAnnots;
51
52   public AlignCalcWorker(AlignViewportI alignViewport,
53           AlignmentViewPanel alignPanel)
54   {
55     this.alignViewport = alignViewport;
56     calcMan = alignViewport.getCalcManager();
57     ap = alignPanel;
58   }
59
60   protected void abortAndDestroy()
61   {
62     if (calcMan != null)
63     {
64       calcMan.workerComplete(this);
65     }
66     alignViewport = null;
67     calcMan = null;
68     ap = null;
69
70   }
71
72   @Override
73   public boolean involves(AlignmentAnnotation i)
74   {
75     return ourAnnots != null && ourAnnots.contains(i);
76   }
77
78   /**
79    * Permanently removes from the alignment all annotation rows managed by this
80    * worker
81    */
82   @Override
83   public void removeAnnotation()
84   {
85     if (ourAnnots != null && alignViewport != null)
86     {
87       AlignmentI alignment = alignViewport.getAlignment();
88       synchronized (ourAnnots)
89       {
90         for (AlignmentAnnotation aa : ourAnnots)
91         {
92           alignment.deleteAnnotation(aa, true);
93         }
94       }
95       ourAnnots.clear();
96     }
97   }
98   // TODO: allow GUI to query workers associated with annotation to add items to
99   // annotation label panel popup menu
100
101   @Override
102   public boolean isDeletable()
103   {
104     return false;
105   }
106
107   /**
108    * Calculate min and max values of annotations and set as graphMin, graphMax
109    * on the AlignmentAnnotation. This is needed because otherwise, well, bad
110    * things happen.
111    * 
112    * @param ann
113    * @param anns
114    */
115   protected void setGraphMinMax(AlignmentAnnotation ann, Annotation[] anns)
116   {
117     // TODO feels like this belongs inside AlignmentAnnotation!
118     float max = Float.MIN_VALUE;
119     float min = Float.MAX_VALUE;
120     boolean set = false;
121     for (Annotation a : anns) {
122       if (a != null) {
123         set = true;
124         float val = a.value;
125         max = Math.max(max, val);
126         min = Math.min(min, val);
127       }
128     }
129     if (set)
130     {
131       ann.graphMin = min;
132       ann.graphMax = max;
133     }
134   }
135
136 }