JAL-3878 Initial preparation.
[jalview.git] / src / jalview / ws2 / MsaMenuEntryProvider.java
1 package jalview.ws2;
2
3 import java.util.List;
4 import java.awt.event.MouseAdapter;
5 import java.awt.event.MouseEvent;
6 import java.util.Collections;
7
8 import javax.swing.JMenu;
9 import javax.swing.JMenuItem;
10 import javax.swing.ToolTipManager;
11
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;
23
24
25 class MsaWSWorker implements WebServiceWorkerI
26 {
27   private long uid = MathUtils.getUID();
28   
29   JalviewWebServiceI<List<SequenceI>> service;
30
31   private final AlignmentView msa;
32
33   private final AlignmentI seqdataset;
34
35   private boolean submitGaps = false;
36
37   private boolean preserveOrder = false;
38
39   private List<ArgumentI> parameters = Collections.emptyList();
40
41   MsaWSWorker(JalviewWebServiceI<List<SequenceI>> service, AlignmentView msa,
42       boolean submitGaps, boolean preserveOrder, AlignmentI seqdataset)
43   {
44     this.service = service;
45     this.msa = msa;
46     this.seqdataset = seqdataset;
47     this.submitGaps = submitGaps;
48     this.preserveOrder = preserveOrder;
49   }
50   
51   @Override public long getUID() {
52     return uid;
53   };
54
55   void setParameters(List<ArgumentI> parameters)
56   {
57     this.parameters = parameters;
58   }
59   
60   @Override
61   public WSJobID startJob(WSJob job) {
62     return new WSJobID(service.getName(), service.getClass().toString(), "0");
63   }
64   
65   @Override
66   public List<WSJob> getJobs() {
67     return Collections.emptyList();
68   }
69   
70   @Override
71   public boolean pollJob(WSJob job) {
72     return false;
73   }
74
75 }
76
77 public class MsaMenuEntryProvider implements MenuEntryProviderI
78 {
79   WebServiceExecutor executor;
80
81   public MsaMenuEntryProvider(WebServiceExecutor executor)
82   {
83     this.executor = executor;
84   }
85
86   @Override
87   public void buildMenu(JMenu parent, JalviewWebServiceI service, AlignFrame frame)
88   {
89     if (service.canSubmitGaps())
90     {
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);
100     }
101     else
102     {
103       buildMenu(parent, service, frame, false);
104     }
105   }
106
107   private void buildMenu(JMenu parent, JalviewWebServiceI<List<SequenceI>> service,
108       AlignFrame frame, boolean submitGaps)
109   {
110     final String action = submitGaps ? "Align" : "Realign";
111     final var calcName = service.getName();
112
113     {
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();
121         if (msa != null)
122         {
123           executor.submit(new MsaWSWorker(service, msa, submitGaps, true, dataset));
124         }
125       });
126       parent.add(item);
127     }
128
129     if (service.hasParameters())
130     {
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();
137         if (msa != null)
138         {
139           var parameters = openEditParamsDialog(service, null, null);
140           if (parameters != null)
141           {
142             var thread = new MsaWSWorker(service, msa, submitGaps, true, dataset);
143             thread.setParameters(parameters);
144             executor.submit(thread);
145           }
146         }
147       });
148       parent.add(item);
149     }
150
151     var presets = service.getParamStore().getPresets();
152     if (presets != null && presets.size() > 0)
153     {
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)
158       {
159         var item = new JMenuItem(preset.getName());
160         final int QUICK_TOOLTIP = 1500;
161         item.addMouseListener(new MouseAdapter()
162         {
163           @Override public void mouseEntered(MouseEvent e)
164           {
165             ToolTipManager.sharedInstance().setDismissDelay(QUICK_TOOLTIP);
166           }
167           @Override public void mouseExited(MouseEvent e)
168           {
169             ToolTipManager.sharedInstance().setDismissDelay(showToolTipFor);
170           }
171         });
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();
181           if (msa != null)
182           {
183             var thread = new MsaWSWorker(service, msa, submitGaps, true, dataset);
184             thread.setParameters(preset.getArguments());
185             executor.submit(thread);
186           }
187         });
188         presetList.add(item);
189       }
190       parent.add(presetList);
191     }
192
193   }
194
195   private List<ArgumentI> openEditParamsDialog(JalviewWebServiceI service,
196       WsParamSetI preset, List<ArgumentI> arguments)
197   {
198     WsJobParameters jobParams;
199     if (preset == null && arguments != null && arguments.size() > 0)
200       jobParams = new WsJobParameters(service.getParamStore(), preset, arguments);
201     else
202       jobParams = new WsJobParameters(service.getParamStore(), preset, null);
203     if (!jobParams.showRunDialog())
204       // cancelled
205       return null;
206     if (jobParams.getPreset() == null)
207       return jobParams.getJobParams();
208     else
209       return jobParams.getPreset().getArguments();
210   }
211 }