1 package jalview.ws2.operations;
3 import java.util.Collections;
5 import java.util.concurrent.CompletionStage;
7 import javax.swing.JMenu;
8 import javax.swing.JMenuItem;
10 import jalview.api.AlignmentViewPanel;
11 import jalview.datamodel.AlignmentAnnotation;
12 import jalview.gui.AlignFrame;
13 import jalview.gui.AlignViewport;
14 import jalview.gui.WsJobParameters;
15 import jalview.io.FeaturesFile;
16 import jalview.util.MessageManager;
17 import jalview.ws.params.ArgumentI;
18 import jalview.ws.params.WsParamSetI;
19 import jalview.ws2.MenuEntryProviderI;
20 import jalview.ws2.ResultSupplier;
21 import jalview.ws2.PollingTaskExecutor;
22 import jalview.ws2.WebServiceI;
29 public class AnnotationOperation implements Operation
31 final WebServiceI service;
33 final String typeName;
35 final ResultSupplier<List<AlignmentAnnotation>> annotationSupplier;
37 final ResultSupplier<FeaturesFile> featuresSupplier;
39 boolean alignmentAnalysis = false;
41 boolean interactive = false;
44 * Is it fine to get rid of AlignAnalysisUIText?
47 public AnnotationOperation(WebServiceI service,
48 ResultSupplier<List<AlignmentAnnotation>> annotSupplier,
49 ResultSupplier<FeaturesFile> featSupplier, String operationName)
51 this.service = service;
52 this.annotationSupplier = annotSupplier;
53 this.featuresSupplier = featSupplier;
54 this.typeName = operationName;
58 public String getName()
60 return service.getName();
64 public String getTypeName()
70 public String getHostName()
72 return service.getHostName();
76 public int getMinSequences()
82 public int getMaxSequences()
84 return Integer.MAX_VALUE;
88 public boolean canSubmitGaps()
94 public boolean isProteinOperation()
100 public boolean isNucleotideOperation()
106 public boolean isInteractive()
111 public void setInteractive(boolean value)
113 this.interactive = value;
117 public boolean isAlignmentAnalysis()
119 return alignmentAnalysis;
122 public void setAlignmentAnalysis(boolean value)
124 this.alignmentAnalysis = value;
128 public boolean getFilterNonStandardSymbols()
134 public boolean getNeedsAlignedSequences()
140 public MenuEntryProviderI getMenuBuilder()
142 return this::buildMenu;
145 protected void buildMenu(JMenu parent, AlignFrame frame)
147 final var calcName = service.getName();
148 PollingTaskExecutor wsExecutor = frame.getViewport().getWSExecutor();
149 final var calcManager = frame.getViewport().getCalcManager();
151 var item = new JMenuItem(MessageManager.formatMessage(
152 "label.calcname_with_default_settings", calcName));
153 item.addActionListener((event) -> {
154 /* What is the purpose of AlignViewport and AlignmentViewPanel? */
155 AlignViewport viewport = frame.getCurrentView();
156 AlignmentViewPanel alignPanel = frame.alignPanel;
157 var worker = new AnnotationServiceWorker(this, service,
158 Collections.emptyList(), viewport, alignPanel, frame, frame,
161 calcManager.registerWorker(worker);
163 calcManager.startWorker(worker);
167 if (service.hasParameters())
169 var item = new JMenuItem(
170 MessageManager.getString("label.edit_settings_and_run"));
171 item.setToolTipText(MessageManager.getString(
172 "label.view_and_change_parameters_before_running_calculation"));
173 item.addActionListener((event) -> {
174 openEditParamsDialog(service, null, null)
175 .thenAcceptAsync((arguments) -> {
176 if (arguments != null)
178 AlignViewport viewport = frame.getCurrentView();
179 AlignmentViewPanel alignPanel = frame.alignPanel;
180 var worker = new AnnotationServiceWorker(
181 AnnotationOperation.this, service, arguments, viewport,
182 alignPanel, frame, frame, calcManager);
184 calcManager.registerWorker(worker);
186 calcManager.startWorker(worker);
194 private CompletionStage<List<ArgumentI>> openEditParamsDialog(
195 WebServiceI service, WsParamSetI preset, List<ArgumentI> arguments)
197 WsJobParameters jobParams;
198 if (preset == null && arguments != null && arguments.size() > 0)
199 jobParams = new WsJobParameters(service.getParamStore(), preset,
202 jobParams = new WsJobParameters(service.getParamStore(), preset,
206 jobParams.setName(MessageManager.getString(
207 "label.adjusting_parameters_for_calculation"));
209 var stage = jobParams.showRunDialog();
210 return stage.thenApply((startJob) -> {
213 if (jobParams.getPreset() == null)
214 return jobParams.getJobParams();
216 return jobParams.getPreset().getArguments();