1 package jalview.ws2.gui;
3 import java.util.ArrayList;
4 import java.util.Collections;
6 import java.util.concurrent.CompletionStage;
8 import javax.swing.JCheckBoxMenuItem;
9 import javax.swing.JMenu;
10 import javax.swing.JMenuItem;
11 import javax.swing.event.MenuEvent;
12 import javax.swing.event.MenuListener;
14 import jalview.api.AlignCalcManagerI2;
15 import jalview.api.AlignmentViewPanel;
16 import jalview.gui.AlignFrame;
17 import jalview.gui.AlignViewport;
18 import jalview.gui.WsJobParameters;
19 import jalview.util.MessageManager;
20 import jalview.ws.params.ArgumentI;
21 import jalview.ws.params.ParamDatastoreI;
22 import jalview.ws.params.WsParamSetI;
23 import jalview.ws2.MenuEntryProviderI;
24 import jalview.ws2.PollingTaskExecutor;
25 import jalview.ws2.operations.AnnotationOperation;
26 import jalview.ws2.operations.AnnotationServiceWorker;
28 public class AnnotationMenuBuilder implements MenuEntryProviderI
30 final AnnotationOperation operation;
32 public AnnotationMenuBuilder(AnnotationOperation operation)
34 this.operation = operation;
38 public void buildMenu(JMenu parent, AlignFrame frame)
40 if (operation.isInteractive())
41 buildInteractiveMenu(parent, frame);
43 buildClassicMenu(parent, frame);
46 protected void buildClassicMenu(JMenu parent, AlignFrame frame)
48 final var calcName = operation.getName();
49 PollingTaskExecutor wsExecutor = frame.getViewport().getWSExecutor();
50 final var calcManager = frame.getViewport().getCalcManager();
52 var item = new JMenuItem(MessageManager.formatMessage(
53 "label.calcname_with_default_settings", calcName));
54 item.addActionListener((event) -> {
55 var worker = createWorker(Collections.emptyList(), frame, calcManager);
56 calcManager.startWorker(worker);
60 if (operation.hasParameters())
62 var item = new JMenuItem(
63 MessageManager.getString("label.edit_settings_and_run"));
64 item.setToolTipText(MessageManager.getString(
65 "label.view_and_change_parameters_before_running_calculation"));
66 item.addActionListener((event) -> {
67 openEditParamsDialog(operation.getParamStore(), null, null)
68 .thenAcceptAsync((arguments) -> {
69 if (arguments != null)
71 var worker = createWorker(arguments, frame, calcManager);
72 calcManager.startWorker(worker);
80 protected void buildInteractiveMenu(JMenu parent, AlignFrame frame)
82 final var calcName = operation.getName();
83 final var calcManager = frame.getViewport().getCalcManager();
84 final var arguments = new ArrayList<ArgumentI>();
85 final JCheckBoxMenuItem runItem;
87 // TODO use MessageManager and set tool tip text
88 runItem = new JCheckBoxMenuItem(
89 String.format("%s calculations", calcName));
90 runItem.addActionListener((event) -> {
91 calcManager.removeWorkersForName(calcName);
92 var worker = createWorker(arguments, frame, calcManager);
93 calcManager.registerWorker(worker);
97 JMenuItem _editItem = null;
98 if (operation.hasParameters())
100 // TODO use MessageManager and set tool tip text
101 _editItem = new JMenuItem(
102 String.format("Edit %s settings", calcName));
103 _editItem.addActionListener((event) -> {
104 openEditParamsDialog(operation.getParamStore(), null, null)
105 .thenAcceptAsync((args) -> {
106 if (arguments != null)
109 arguments.addAll(args);
110 calcManager.removeWorkersForName(calcName);
111 var worker = createWorker(arguments, frame, calcManager);
112 calcManager.registerWorker(worker);
116 parent.add(_editItem);
118 final var editItem = _editItem;
120 parent.addMenuListener(new MenuListener()
123 public void menuSelected(MenuEvent e)
125 var isNuc = frame.getViewport().getAlignment().isNucleotide();
126 var menuEnabled = (isNuc && operation.isNucleotideOperation()) ||
127 (!isNuc && operation.isProteinOperation());
128 runItem.setEnabled(menuEnabled);
129 if (editItem != null)
130 editItem.setEnabled(menuEnabled);
131 boolean currentlyRunning = calcManager.getWorkersForName(calcName).size() > 0;
132 runItem.setSelected(currentlyRunning);
136 public void menuDeselected(MenuEvent e) {}
139 public void menuCanceled(MenuEvent e) {}
144 private CompletionStage<List<ArgumentI>> openEditParamsDialog(
145 ParamDatastoreI paramStore, WsParamSetI preset,
146 List<ArgumentI> arguments)
148 WsJobParameters jobParams;
149 if (preset == null && arguments != null && arguments.size() > 0)
150 jobParams = new WsJobParameters(paramStore, preset, arguments);
152 jobParams = new WsJobParameters(paramStore, preset, null);
155 jobParams.setName(MessageManager.getString(
156 "label.adjusting_parameters_for_calculation"));
158 var stage = jobParams.showRunDialog();
159 return stage.thenApply((startJob) -> {
162 if (jobParams.getPreset() == null)
164 return jobParams.getJobParams();
168 return jobParams.getPreset().getArguments();
179 private AnnotationServiceWorker createWorker(
180 List<ArgumentI> arguments, AlignFrame frame, AlignCalcManagerI2 calcManager)
182 /* What is the purpose of AlignViewport and AlignmentViewPanel? */
183 AlignViewport viewport = frame.getCurrentView();
184 AlignmentViewPanel alignPanel = frame.alignPanel;
185 return new AnnotationServiceWorker(operation,
186 arguments, viewport, alignPanel, frame, frame,