package jalview.ws2; import java.util.List; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.util.Collections; import javax.swing.JMenu; import javax.swing.JMenuItem; import javax.swing.ToolTipManager; import jalview.datamodel.AlignmentI; import jalview.datamodel.AlignmentView; import jalview.datamodel.SequenceI; import jalview.gui.AlignFrame; import jalview.gui.JvSwingUtils; import jalview.gui.WsJobParameters; import jalview.util.MathUtils; import jalview.util.MessageManager; import jalview.ws.params.ArgumentI; import jalview.ws.params.WsParamSetI; import static java.lang.String.format; class MsaWSWorker implements WebServiceWorkerI { private long uid = MathUtils.getUID(); JalviewWebServiceI> service; private final AlignmentView msa; private final AlignmentI seqdataset; private boolean submitGaps = false; private boolean preserveOrder = false; private List parameters = Collections.emptyList(); MsaWSWorker(JalviewWebServiceI> service, AlignmentView msa, boolean submitGaps, boolean preserveOrder, AlignmentI seqdataset) { this.service = service; this.msa = msa; this.seqdataset = seqdataset; this.submitGaps = submitGaps; this.preserveOrder = preserveOrder; } @Override public long getUID() { return uid; }; void setParameters(List parameters) { this.parameters = parameters; } @Override public WSJobID startJob(WSJob job) { return new WSJobID(service.getName(), service.getClass().toString(), "0"); } @Override public List getJobs() { return Collections.emptyList(); } @Override public boolean pollJob(WSJob job) { return false; } } public class MsaMenuEntryProvider implements MenuEntryProviderI { WebServiceExecutor executor; public MsaMenuEntryProvider(WebServiceExecutor executor) { this.executor = executor; } @Override public void buildMenu(JMenu parent, JalviewWebServiceI service, AlignFrame frame) { if (service.canSubmitGaps()) { var alignSubmenu = new JMenu(service.getName()); buildMenu(alignSubmenu, service, frame, false); parent.add(alignSubmenu); var realignSubmenu = new JMenu(MessageManager.formatMessage( "label.realign_with_params", service.getName())); realignSubmenu.setToolTipText(MessageManager .getString("label.align_sequences_to_existing_alignment")); buildMenu(realignSubmenu, service, frame, true); parent.add(realignSubmenu); } else { buildMenu(parent, service, frame, false); } } private void buildMenu(JMenu parent, JalviewWebServiceI> service, AlignFrame frame, boolean submitGaps) { final String action = submitGaps ? "Align" : "Realign"; final var calcName = service.getName(); { var item = new JMenuItem(MessageManager.formatMessage( "label.calcname_with_default_settings", calcName)); item.setToolTipText(MessageManager.formatMessage( "label.action_with_default_settings", action)); item.addActionListener((event) -> { AlignmentView msa = frame.gatherSequencesForAlignment(); AlignmentI dataset = frame.getViewport().getAlignment().getDataset(); if (msa != null) { executor.submit(new MsaWSWorker(service, msa, submitGaps, true, dataset)); } }); parent.add(item); } if (service.hasParameters()) { var item = new JMenuItem(MessageManager.getString("label.edit_settings_and_run")); item.setToolTipText(MessageManager.getString( "label.view_and_change_parameters_before_alignment")); item.addActionListener((event) -> { AlignmentView msa = frame.gatherSequencesForAlignment(); AlignmentI dataset = frame.getViewport().getAlignment().getDataset(); if (msa != null) { var parameters = openEditParamsDialog(service, null, null); if (parameters != null) { var thread = new MsaWSWorker(service, msa, submitGaps, true, dataset); thread.setParameters(parameters); executor.submit(thread); } } }); parent.add(item); } var presets = service.getParamStore().getPresets(); if (presets != null && presets.size() > 0) { final var presetList = new JMenu(MessageManager.formatMessage( "label.run_with_preset_params", calcName)); final var showToolTipFor = ToolTipManager.sharedInstance().getDismissDelay(); for (final var preset : presets) { var item = new JMenuItem(preset.getName()); final int QUICK_TOOLTIP = 1500; item.addMouseListener(new MouseAdapter() { @Override public void mouseEntered(MouseEvent e) { ToolTipManager.sharedInstance().setDismissDelay(QUICK_TOOLTIP); } @Override public void mouseExited(MouseEvent e) { ToolTipManager.sharedInstance().setDismissDelay(showToolTipFor); } }); String tooltip = JvSwingUtils.wrapTooltip(true, format( "%s
%s", MessageManager.getString(preset.isModifiable() ? "label.user_preset" : "label.service_preset"), preset.getDescription())); item.setToolTipText(tooltip); item.addActionListener((event) -> { AlignmentView msa = frame.gatherSequencesForAlignment(); AlignmentI dataset = frame.getViewport().getAlignment().getDataset(); if (msa != null) { var thread = new MsaWSWorker(service, msa, submitGaps, true, dataset); thread.setParameters(preset.getArguments()); executor.submit(thread); } }); presetList.add(item); } parent.add(presetList); } } private List openEditParamsDialog(JalviewWebServiceI service, WsParamSetI preset, List arguments) { WsJobParameters jobParams; if (preset == null && arguments != null && arguments.size() > 0) jobParams = new WsJobParameters(service.getParamStore(), preset, arguments); else jobParams = new WsJobParameters(service.getParamStore(), preset, null); if (!jobParams.showRunDialog()) // cancelled return null; if (jobParams.getPreset() == null) return jobParams.getJobParams(); else return jobParams.getPreset().getArguments(); } }