4 import java.awt.event.MouseAdapter;
5 import java.awt.event.MouseEvent;
6 import java.util.Collections;
8 import javax.swing.JMenu;
9 import javax.swing.JMenuItem;
10 import javax.swing.ToolTipManager;
12 import jalview.datamodel.AlignmentI;
13 import jalview.datamodel.AlignmentView;
14 import jalview.datamodel.SequenceI;
15 import jalview.gui.AlignFrame;
16 import jalview.gui.JvSwingUtils;
17 import jalview.gui.WsJobParameters;
18 import jalview.util.MathUtils;
19 import jalview.util.MessageManager;
20 import jalview.ws.params.ArgumentI;
21 import jalview.ws.params.WsParamSetI;
22 import static java.lang.String.format;
25 class MsaWSWorker implements WebServiceWorkerI
27 private long uid = MathUtils.getUID();
29 JalviewWebServiceI<List<SequenceI>> service;
31 private final AlignmentView msa;
33 private final AlignmentI seqdataset;
35 private boolean submitGaps = false;
37 private boolean preserveOrder = false;
39 private List<ArgumentI> parameters = Collections.emptyList();
41 MsaWSWorker(JalviewWebServiceI<List<SequenceI>> service, AlignmentView msa,
42 boolean submitGaps, boolean preserveOrder, AlignmentI seqdataset)
44 this.service = service;
46 this.seqdataset = seqdataset;
47 this.submitGaps = submitGaps;
48 this.preserveOrder = preserveOrder;
51 @Override public long getUID() {
55 void setParameters(List<ArgumentI> parameters)
57 this.parameters = parameters;
61 public WSJobID startJob(WSJob job) {
62 return new WSJobID(service.getName(), service.getClass().toString(), "0");
66 public List<WSJob> getJobs() {
67 return Collections.emptyList();
71 public boolean pollJob(WSJob job) {
77 public class MsaMenuEntryProvider implements MenuEntryProviderI
79 WebServiceExecutor executor;
81 public MsaMenuEntryProvider(WebServiceExecutor executor)
83 this.executor = executor;
87 public void buildMenu(JMenu parent, JalviewWebServiceI service, AlignFrame frame)
89 if (service.canSubmitGaps())
91 var alignSubmenu = new JMenu(service.getName());
92 buildMenu(alignSubmenu, service, frame, false);
93 parent.add(alignSubmenu);
94 var realignSubmenu = new JMenu(MessageManager.formatMessage(
95 "label.realign_with_params", service.getName()));
96 realignSubmenu.setToolTipText(MessageManager
97 .getString("label.align_sequences_to_existing_alignment"));
98 buildMenu(realignSubmenu, service, frame, true);
99 parent.add(realignSubmenu);
103 buildMenu(parent, service, frame, false);
107 private void buildMenu(JMenu parent, JalviewWebServiceI<List<SequenceI>> service,
108 AlignFrame frame, boolean submitGaps)
110 final String action = submitGaps ? "Align" : "Realign";
111 final var calcName = service.getName();
114 var item = new JMenuItem(MessageManager.formatMessage(
115 "label.calcname_with_default_settings", calcName));
116 item.setToolTipText(MessageManager.formatMessage(
117 "label.action_with_default_settings", action));
118 item.addActionListener((event) -> {
119 AlignmentView msa = frame.gatherSequencesForAlignment();
120 AlignmentI dataset = frame.getViewport().getAlignment().getDataset();
123 executor.submit(new MsaWSWorker(service, msa, submitGaps, true, dataset));
129 if (service.hasParameters())
131 var item = new JMenuItem(MessageManager.getString("label.edit_settings_and_run"));
132 item.setToolTipText(MessageManager.getString(
133 "label.view_and_change_parameters_before_alignment"));
134 item.addActionListener((event) -> {
135 AlignmentView msa = frame.gatherSequencesForAlignment();
136 AlignmentI dataset = frame.getViewport().getAlignment().getDataset();
139 var parameters = openEditParamsDialog(service, null, null);
140 if (parameters != null)
142 var thread = new MsaWSWorker(service, msa, submitGaps, true, dataset);
143 thread.setParameters(parameters);
144 executor.submit(thread);
151 var presets = service.getParamStore().getPresets();
152 if (presets != null && presets.size() > 0)
154 final var presetList = new JMenu(MessageManager.formatMessage(
155 "label.run_with_preset_params", calcName));
156 final var showToolTipFor = ToolTipManager.sharedInstance().getDismissDelay();
157 for (final var preset : presets)
159 var item = new JMenuItem(preset.getName());
160 final int QUICK_TOOLTIP = 1500;
161 item.addMouseListener(new MouseAdapter()
163 @Override public void mouseEntered(MouseEvent e)
165 ToolTipManager.sharedInstance().setDismissDelay(QUICK_TOOLTIP);
167 @Override public void mouseExited(MouseEvent e)
169 ToolTipManager.sharedInstance().setDismissDelay(showToolTipFor);
172 String tooltip = JvSwingUtils.wrapTooltip(true, format(
173 "<strong>%s</strong><br/>%s",
174 MessageManager.getString(preset.isModifiable() ?
175 "label.user_preset" : "label.service_preset"),
176 preset.getDescription()));
177 item.setToolTipText(tooltip);
178 item.addActionListener((event) -> {
179 AlignmentView msa = frame.gatherSequencesForAlignment();
180 AlignmentI dataset = frame.getViewport().getAlignment().getDataset();
183 var thread = new MsaWSWorker(service, msa, submitGaps, true, dataset);
184 thread.setParameters(preset.getArguments());
185 executor.submit(thread);
188 presetList.add(item);
190 parent.add(presetList);
195 private List<ArgumentI> openEditParamsDialog(JalviewWebServiceI service,
196 WsParamSetI preset, List<ArgumentI> arguments)
198 WsJobParameters jobParams;
199 if (preset == null && arguments != null && arguments.size() > 0)
200 jobParams = new WsJobParameters(service.getParamStore(), preset, arguments);
202 jobParams = new WsJobParameters(service.getParamStore(), preset, null);
203 if (!jobParams.showRunDialog())
206 if (jobParams.getPreset() == null)
207 return jobParams.getJobParams();
209 return jobParams.getPreset().getArguments();