Merge branch 'develop' into releases/Release_2_11_Branch
[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
99   // TODO: allow GUI to query workers associated with annotation to add items to
100   // annotation label panel popup menu
101
102   @Override
103   public boolean isDeletable()
104   {
105     return false;
106   }
107
108   /**
109    * Calculate min and max values of annotations and set as graphMin, graphMax
110    * on the AlignmentAnnotation. This is needed because otherwise, well, bad
111    * things happen.
112    * 
113    * @param ann
114    * @param anns
115    */
116   protected void setGraphMinMax(AlignmentAnnotation ann, Annotation[] anns)
117   {
118     // TODO feels like this belongs inside AlignmentAnnotation!
119     float max = Float.MIN_VALUE;
120     float min = Float.MAX_VALUE;
121     boolean set = false;
122     for (Annotation a : anns)
123     {
124       if (a != null)
125       {
126         set = true;
127         float val = a.value;
128         max = Math.max(max, val);
129         min = Math.min(min, val);
130       }
131     }
132     if (set)
133     {
134       ann.graphMin = min;
135       ann.graphMax = max;
136     }
137   }
138
139 }