2 * Jalview - A Sequence Alignment Editor and Viewer ($$Version-Rel$$)
3 * Copyright (C) $$Year-Rel$$ The Jalview Authors
5 * This file is part of Jalview.
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.
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.
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.
21 package jalview.workers;
23 import jalview.api.AlignViewportI;
24 import jalview.api.AlignmentViewPanel;
25 import jalview.datamodel.AlignmentAnnotation;
26 import jalview.datamodel.AlignmentI;
27 import jalview.renderer.seqfeatures.FeatureRenderer;
29 import java.util.ArrayList;
30 import java.util.List;
33 * A class to create and update one or more alignment annotations, given a
34 * 'calculator'. Intended to support a 'plug-in' annotation worker which
35 * implements the AnnotationProviderI interface.
37 class AnnotationWorker extends AlignCalcWorker
40 * the provider of the annotation calculations
42 AnnotationProviderI counter;
50 public AnnotationWorker(AlignViewportI viewport, AlignmentViewPanel panel,
51 AnnotationProviderI counter)
53 super(viewport, panel);
54 ourAnnots = new ArrayList<>();
55 this.counter = counter;
56 calcMan.registerWorker(this);
64 calcMan.notifyStart(this);
66 while (!calcMan.notifyWorking(this))
71 } catch (InterruptedException ex)
76 if (alignViewport.isClosed())
82 // removeAnnotation();
83 AlignmentI alignment = alignViewport.getAlignment();
84 if (alignment != null)
88 List<AlignmentAnnotation> anns = counter.calculateAnnotation(
89 alignment, new FeatureRenderer(alignViewport));
90 for (AlignmentAnnotation ann : anns)
92 AlignmentAnnotation theAnn = alignment.findOrCreateAnnotation(
93 ann.label, ann.description, false, null, null);
94 theAnn.showAllColLabels = true;
95 theAnn.graph = AlignmentAnnotation.BAR_GRAPH;
96 theAnn.scaleColLabel = true;
97 theAnn.annotations = ann.annotations;
98 setGraphMinMax(theAnn, theAnn.annotations);
99 theAnn.validateRangeAndDisplay();
100 if (!ourAnnots.contains(theAnn))
102 ourAnnots.add(theAnn);
104 // alignment.addAnnotation(ann);
106 } catch (IndexOutOfBoundsException x)
108 // probable race condition. just finish and return without any fuss.
112 } catch (OutOfMemoryError error)
114 ap.raiseOOMWarning("calculating annotations", error);
115 calcMan.disableWorker(this);
118 calcMan.workerComplete(this);
123 ap.adjustAnnotationHeight();
124 // TODO: only need to update colour and geometry if panel height changes
125 // and view is coloured by annotation, and the annotation is actually
127 ap.paintAlignment(true, true);
132 public void updateAnnotation()
138 * Answers true to indicate that if this worker's annotation is deleted from
139 * the display, the worker should also be removed. This prevents it running
140 * and recreating the annotation when the alignment changes.
143 public boolean isDeletable()