1 package jalview.ws2.gui;
3 import static java.lang.String.format;
5 import java.awt.event.MouseAdapter;
6 import java.awt.event.MouseEvent;
7 import java.util.Collections;
9 import java.util.Objects;
10 import java.util.concurrent.CompletionStage;
11 import javax.swing.JMenu;
12 import javax.swing.JMenuItem;
13 import javax.swing.ToolTipManager;
15 import jalview.datamodel.AlignmentView;
16 import jalview.gui.AlignFrame;
17 import jalview.gui.AlignViewport;
18 import jalview.gui.JvSwingUtils;
19 import jalview.gui.WebserviceInfo;
20 import jalview.gui.WsJobParameters;
21 import jalview.util.MessageManager;
22 import jalview.ws.params.ArgumentI;
23 import jalview.ws.params.ParamDatastoreI;
24 import jalview.ws.params.WsParamSetI;
25 import jalview.ws2.PollingTaskExecutor;
26 import jalview.ws2.operations.AlignmentOperation;
27 import jalview.ws2.operations.AlignmentWorker;
29 public class AlignmentMenuBuilder implements MenuEntryProviderI
31 AlignmentOperation operation;
33 public AlignmentMenuBuilder(AlignmentOperation operation)
35 this.operation = operation;
38 public void buildMenu(JMenu parent, AlignFrame frame)
40 if (operation.canSubmitGaps())
42 var alignSubmenu = new JMenu(operation.getName());
43 buildMenu(alignSubmenu, frame, false);
44 parent.add(alignSubmenu);
45 var realignSubmenu = new JMenu(MessageManager.formatMessage(
46 "label.realign_with_params", operation.getName()));
47 realignSubmenu.setToolTipText(MessageManager
48 .getString("label.align_sequences_to_existing_alignment"));
49 buildMenu(realignSubmenu, frame, true);
50 parent.add(realignSubmenu);
54 buildMenu(parent, frame, false);
58 protected void buildMenu(JMenu parent, AlignFrame frame,
61 final String action = submitGaps ? "Align" : "Realign";
62 final var calcName = operation.getName();
65 var item = new JMenuItem(MessageManager.formatMessage(
66 "label.calcname_with_default_settings", calcName));
67 item.setToolTipText(MessageManager
68 .formatMessage("label.action_with_default_settings", action));
69 item.addActionListener((event) -> {
70 final AlignmentView msa = frame.gatherSequencesForAlignment();
73 startWorker(frame, msa, Collections.emptyList(), submitGaps);
79 if (operation.hasParameters())
81 var item = new JMenuItem(
82 MessageManager.getString("label.edit_settings_and_run"));
83 item.setToolTipText(MessageManager.getString(
84 "label.view_and_change_parameters_before_alignment"));
85 item.addActionListener((event) -> {
86 AlignmentView msa = frame.gatherSequencesForAlignment();
89 openEditParamsDialog(operation.getParamStore(), null, null)
90 .thenAcceptAsync((arguments) -> {
91 if (arguments != null)
93 startWorker(frame, msa, arguments, submitGaps);
101 var presets = operation.getParamStore().getPresets();
102 if (presets != null && presets.size() > 0)
104 final var presetList = new JMenu(MessageManager
105 .formatMessage("label.run_with_preset_params", calcName));
106 final var showToolTipFor = ToolTipManager.sharedInstance()
108 for (final var preset : presets)
110 var item = new JMenuItem(preset.getName());
111 final int QUICK_TOOLTIP = 1500;
112 item.addMouseListener(new MouseAdapter()
115 public void mouseEntered(MouseEvent e)
117 ToolTipManager.sharedInstance().setDismissDelay(QUICK_TOOLTIP);
121 public void mouseExited(MouseEvent e)
123 ToolTipManager.sharedInstance().setDismissDelay(showToolTipFor);
126 String tooltip = JvSwingUtils.wrapTooltip(true,
127 format("<strong>%s</strong><br/>%s",
128 MessageManager.getString(
129 preset.isModifiable() ? "label.user_preset"
130 : "label.service_preset"),
131 preset.getDescription()));
132 item.setToolTipText(tooltip);
133 item.addActionListener((event) -> {
134 AlignmentView msa = frame.gatherSequencesForAlignment();
135 startWorker(frame, msa, preset.getArguments(), submitGaps);
137 presetList.add(item);
139 parent.add(presetList);
143 private CompletionStage<List<ArgumentI>> openEditParamsDialog(
144 ParamDatastoreI paramStore, WsParamSetI preset,
145 List<ArgumentI> arguments)
147 WsJobParameters jobParams;
148 if (preset == null && arguments != null && arguments.size() > 0)
149 jobParams = new WsJobParameters(paramStore, preset, arguments);
151 jobParams = new WsJobParameters(paramStore, preset, null);
154 jobParams.setName(MessageManager.getString(
155 "label.adjusting_parameters_for_calculation"));
157 var stage = jobParams.showRunDialog();
158 return stage.thenApply((startJob) -> {
161 if (jobParams.getPreset() == null)
163 return jobParams.getJobParams();
167 return jobParams.getPreset().getArguments();
177 private void startWorker(AlignFrame frame, AlignmentView msa,
178 List<ArgumentI> arguments, boolean submitGaps)
180 AlignViewport viewport = frame.getViewport();
181 PollingTaskExecutor executor = frame.getViewport().getWSExecutor();
185 String panelInfo = String.format("%s using service hosted at %s%n%s",
186 operation.getName(), operation.getHostName(),
187 Objects.requireNonNullElse(operation.getDescription(), ""));
188 var wsInfo = new WebserviceInfo(operation.getName(), panelInfo, false);
190 final String alnTitle = frame.getTitle();
191 AlignmentWorker worker = new AlignmentWorker(operation, msa,
192 arguments, submitGaps, true, viewport);
193 String outputHeader = String.format("%s of %s%nJob details%n",
194 submitGaps ? "Re-alignment" : "Alignment", alnTitle);
196 var awl = new AlignmentProgressUpdater(worker, wsInfo, frame,
198 worker.setResultConsumer(awl);
199 worker.addListener(awl);
201 executor.submit(worker);