1 package jalview.ws2.operations;
3 import java.util.Collections;
5 import java.util.concurrent.CompletionStage;
7 import javax.swing.JCheckBoxMenuItem;
8 import javax.swing.JMenu;
9 import javax.swing.JMenuItem;
10 import javax.swing.event.MenuEvent;
11 import javax.swing.event.MenuListener;
13 import jalview.api.AlignCalcManagerI2;
14 import jalview.api.AlignmentViewPanel;
15 import jalview.datamodel.AlignmentAnnotation;
16 import jalview.gui.AlignFrame;
17 import jalview.gui.AlignViewport;
18 import jalview.gui.WsJobParameters;
19 import jalview.io.FeaturesFile;
20 import jalview.util.Format;
21 import jalview.util.MessageManager;
22 import jalview.ws.params.ArgumentI;
23 import jalview.ws.params.WsParamSetI;
24 import jalview.ws2.MenuEntryProviderI;
25 import jalview.ws2.ResultSupplier;
26 import jalview.ws2.PollingTaskExecutor;
27 import jalview.ws2.WebServiceI;
34 public class AnnotationOperation implements Operation
36 final WebServiceI service;
38 final String typeName;
40 final ResultSupplier<List<AlignmentAnnotation>> annotationSupplier;
42 final ResultSupplier<FeaturesFile> featuresSupplier;
44 boolean alignmentAnalysis = false;
46 boolean interactive = false;
49 * Is it fine to get rid of AlignAnalysisUIText?
52 public AnnotationOperation(WebServiceI service,
53 ResultSupplier<List<AlignmentAnnotation>> annotSupplier,
54 ResultSupplier<FeaturesFile> featSupplier, String operationName)
56 this.service = service;
57 this.annotationSupplier = annotSupplier;
58 this.featuresSupplier = featSupplier;
59 this.typeName = operationName;
63 public String getName()
65 return service.getName();
69 public String getTypeName()
75 public String getHostName()
77 return service.getHostName();
81 public int getMinSequences()
87 public int getMaxSequences()
89 return Integer.MAX_VALUE;
93 public boolean canSubmitGaps()
99 public boolean isProteinOperation()
105 public boolean isNucleotideOperation()
111 public boolean isInteractive()
116 public void setInteractive(boolean value)
118 this.interactive = value;
122 public boolean isAlignmentAnalysis()
124 return alignmentAnalysis;
127 public void setAlignmentAnalysis(boolean value)
129 this.alignmentAnalysis = value;
133 public boolean getFilterNonStandardSymbols()
139 public boolean getNeedsAlignedSequences()
145 public MenuEntryProviderI getMenuBuilder()
148 return this::buildInteractiveMenu;
150 return this::buildClassicMenu;
153 protected void buildClassicMenu(JMenu parent, AlignFrame frame)
155 final var calcName = service.getName();
156 PollingTaskExecutor wsExecutor = frame.getViewport().getWSExecutor();
157 final var calcManager = frame.getViewport().getCalcManager();
159 var item = new JMenuItem(MessageManager.formatMessage(
160 "label.calcname_with_default_settings", calcName));
161 item.addActionListener((event) -> {
162 var worker = createWorker(Collections.emptyList(), frame, calcManager);
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 var worker = createWorker(arguments, frame, calcManager);
179 calcManager.startWorker(worker);
187 protected void buildInteractiveMenu(JMenu parent, AlignFrame frame)
189 final var calcName = service.getName();
190 final var calcManager = frame.getViewport().getCalcManager();
191 final JCheckBoxMenuItem runItem;
193 // TODO use MessageManager and set tool tip text
194 runItem = new JCheckBoxMenuItem(
195 String.format("%s calculations", calcName));
196 runItem.addActionListener((event) -> {
197 calcManager.removeWorkersForName(calcName);
198 var worker = createWorker(Collections.emptyList(), frame, calcManager);
199 calcManager.registerWorker(worker);
203 JMenuItem _editItem = null;
204 if (service.hasParameters())
206 // TODO use MessageManager and set tool tip text
207 _editItem = new JMenuItem(
208 String.format("Edit %s settings", calcName));
209 _editItem.addActionListener((event) -> {
210 openEditParamsDialog(service, null, null)
211 .thenAcceptAsync((arguments) -> {
212 if (arguments != null)
214 calcManager.removeWorkersForName(calcName);
215 var worker = createWorker(arguments, frame, calcManager);
216 calcManager.registerWorker(worker);
220 parent.add(_editItem);
222 final var editItem = _editItem;
224 parent.addMenuListener(new MenuListener()
227 public void menuSelected(MenuEvent e)
229 var isNuc = frame.getViewport().getAlignment().isNucleotide();
230 var menuEnabled = (isNuc && isNucleotideOperation()) ||
231 (!isNuc && isProteinOperation());
232 runItem.setEnabled(menuEnabled);
233 if (editItem != null)
234 editItem.setEnabled(menuEnabled);
235 boolean currentlyRunning = calcManager.getWorkersForName(calcName).size() > 0;
236 runItem.setSelected(currentlyRunning);
240 public void menuDeselected(MenuEvent e) {}
243 public void menuCanceled(MenuEvent e) {}
247 private AnnotationServiceWorker createWorker(
248 List<ArgumentI> arguments, AlignFrame frame, AlignCalcManagerI2 calcManager)
250 /* What is the purpose of AlignViewport and AlignmentViewPanel? */
251 AlignViewport viewport = frame.getCurrentView();
252 AlignmentViewPanel alignPanel = frame.alignPanel;
253 return new AnnotationServiceWorker(this, service,
254 arguments, viewport, alignPanel, frame, frame,
258 private CompletionStage<List<ArgumentI>> openEditParamsDialog(
259 WebServiceI service, WsParamSetI preset, List<ArgumentI> arguments)
261 WsJobParameters jobParams;
262 if (preset == null && arguments != null && arguments.size() > 0)
263 jobParams = new WsJobParameters(service.getParamStore(), preset,
266 jobParams = new WsJobParameters(service.getParamStore(), preset,
270 jobParams.setName(MessageManager.getString(
271 "label.adjusting_parameters_for_calculation"));
273 var stage = jobParams.showRunDialog();
274 return stage.thenApply((startJob) -> {
277 if (jobParams.getPreset() == null)
278 return jobParams.getJobParams();
280 return jobParams.getPreset().getArguments();