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;
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.util.MessageManager;
21 import jalview.ws.params.ArgumentI;
22 import jalview.ws2.PollingTaskExecutor;
23 import jalview.ws2.operations.AlignmentOperation;
24 import jalview.ws2.operations.AlignmentWorker;
26 public class AlignmentMenuBuilder implements MenuEntryProviderI
28 AlignmentOperation operation;
30 public AlignmentMenuBuilder(AlignmentOperation operation)
32 this.operation = operation;
35 public void buildMenu(JMenu parent, AlignFrame frame)
37 if (operation.canSubmitGaps())
39 var alignSubmenu = new JMenu(operation.getName());
40 buildMenu(alignSubmenu, frame, false);
41 parent.add(alignSubmenu);
42 var realignSubmenu = new JMenu(MessageManager.formatMessage(
43 "label.realign_with_params", operation.getName()));
44 realignSubmenu.setToolTipText(MessageManager
45 .getString("label.align_sequences_to_existing_alignment"));
46 buildMenu(realignSubmenu, frame, true);
47 parent.add(realignSubmenu);
51 buildMenu(parent, frame, false);
55 protected void buildMenu(JMenu parent, AlignFrame frame,
58 final String action = submitGaps ? "Align" : "Realign";
59 final var calcName = operation.getName();
62 var item = new JMenuItem(MessageManager.formatMessage(
63 "label.calcname_with_default_settings", calcName));
64 item.setToolTipText(MessageManager
65 .formatMessage("label.action_with_default_settings", action));
66 item.addActionListener((event) -> {
67 final AlignmentView msa = frame.gatherSequencesForAlignment();
70 startWorker(frame, msa, Collections.emptyList(), submitGaps);
76 if (operation.hasParameters())
78 var item = new JMenuItem(
79 MessageManager.getString("label.edit_settings_and_run"));
80 item.setToolTipText(MessageManager.getString(
81 "label.view_and_change_parameters_before_alignment"));
82 item.addActionListener((event) -> {
83 AlignmentView msa = frame.gatherSequencesForAlignment();
86 MenuEntryProviderI.openEditParamsDialog(operation.getParamStore(),
88 .thenAcceptAsync((arguments) -> {
89 if (arguments != null)
91 startWorker(frame, msa, arguments, submitGaps);
99 var presets = operation.getParamStore().getPresets();
100 if (presets != null && presets.size() > 0)
102 final var presetList = new JMenu(MessageManager
103 .formatMessage("label.run_with_preset_params", calcName));
104 final var showToolTipFor = ToolTipManager.sharedInstance()
106 for (final var preset : presets)
108 var item = new JMenuItem(preset.getName());
109 final int QUICK_TOOLTIP = 1500;
110 item.addMouseListener(new MouseAdapter()
113 public void mouseEntered(MouseEvent e)
115 ToolTipManager.sharedInstance().setDismissDelay(QUICK_TOOLTIP);
119 public void mouseExited(MouseEvent e)
121 ToolTipManager.sharedInstance().setDismissDelay(showToolTipFor);
124 String tooltip = JvSwingUtils.wrapTooltip(true,
125 format("<strong>%s</strong><br/>%s",
126 MessageManager.getString(
127 preset.isModifiable() ? "label.user_preset"
128 : "label.service_preset"),
129 preset.getDescription()));
130 item.setToolTipText(tooltip);
131 item.addActionListener((event) -> {
132 AlignmentView msa = frame.gatherSequencesForAlignment();
133 startWorker(frame, msa, preset.getArguments(), submitGaps);
135 presetList.add(item);
137 parent.add(presetList);
141 private void startWorker(AlignFrame frame, AlignmentView msa,
142 List<ArgumentI> arguments, boolean submitGaps)
144 AlignViewport viewport = frame.getViewport();
145 PollingTaskExecutor executor = frame.getViewport().getWSExecutor();
149 String panelInfo = String.format("%s using service hosted at %s%n%s",
150 operation.getName(), operation.getHostName(),
151 Objects.requireNonNullElse(operation.getDescription(), ""));
152 var wsInfo = new WebserviceInfo(operation.getName(), panelInfo, false);
154 final String alnTitle = frame.getTitle();
155 AlignmentWorker worker = new AlignmentWorker(operation, msa,
156 arguments, submitGaps, true, viewport);
157 String outputHeader = String.format("%s of %s%nJob details%n",
158 submitGaps ? "Re-alignment" : "Alignment", alnTitle);
160 var awl = new AlignmentProgressUpdater(worker, wsInfo, frame,
162 worker.setResultConsumer(awl);
163 worker.addListener(awl);
165 executor.submit(worker);