4 package jalview.ws.jws2;
6 import java.awt.event.ActionEvent;
7 import java.awt.event.ActionListener;
10 import javax.swing.JCheckBoxMenuItem;
11 import javax.swing.JMenu;
12 import javax.swing.JMenuItem;
13 import javax.swing.JOptionPane;
14 import javax.swing.event.AncestorEvent;
15 import javax.swing.event.AncestorListener;
16 import javax.swing.event.MenuEvent;
17 import javax.swing.event.MenuListener;
19 import compbio.metadata.Argument;
21 import jalview.api.AlignCalcWorkerI;
22 import jalview.bin.Cache;
23 import jalview.datamodel.AlignmentView;
24 import jalview.gui.AlignFrame;
25 import jalview.gui.Desktop;
26 import jalview.gui.JalviewDialog;
27 import jalview.gui.JvSwingUtils;
28 import jalview.ws.jws2.dm.AAConsSettings;
29 import jalview.ws.jws2.jabaws2.Jws2Instance;
30 import jalview.ws.params.WsParamSetI;
36 public class SequenceAnnotationWSClient extends Jws2Client
39 public static final String AAConsCalcId = "jabaws2.AACons";
42 * initialise a client so its attachWSMenuEntry method can be called.
44 public SequenceAnnotationWSClient()
46 // TODO Auto-generated constructor stub
49 public SequenceAnnotationWSClient(final Jws2Instance sh,
50 AlignFrame alignFrame, WsParamSetI preset, boolean editParams)
52 super(alignFrame, preset, null);
53 initSequenceAnnotationWSClient(sh, alignFrame, preset, editParams);
56 public void initSequenceAnnotationWSClient(final Jws2Instance sh,
57 AlignFrame alignFrame, WsParamSetI preset, boolean editParams)
59 if (alignFrame.getViewport().getAlignment().isNucleotide())
61 JOptionPane.showMessageDialog(Desktop.desktop, sh.serviceType
62 + " can only be used\nfor amino acid alignments.",
63 "Wrong type of sequences!", JOptionPane.WARNING_MESSAGE);
67 if (sh.action.toLowerCase().contains("conservation"))
69 // Build an AACons style client - take alignment, return annotation for
72 List<AlignCalcWorkerI> clnts = alignFrame.getViewport()
74 .getRegisteredWorkersOfClass(AAConsClient.class);
75 if (clnts == null || clnts.size() == 0)
77 if (!processParams(sh, editParams))
86 worker = new AAConsClient(sh, alignFrame,
87 this.preset, paramset));
88 alignFrame.getViewport().getCalcManager().startWorker(worker);
93 AAConsClient worker = (AAConsClient) clnts.get(0);
96 paramset = worker.getArguments();
97 preset = worker.getPreset();
100 if (!processParams(sh, editParams, true))
104 // reinstate worker if it was blacklisted (might have happened due to
105 // invalid parameters)
106 alignFrame.getViewport().getCalcManager().workerMayRun(worker);
107 worker.updateParameters(this.preset, paramset);
111 if (sh.action.toLowerCase().contains("disorder"))
113 // build IUPred style client. take sequences, returns annotation per
115 if (!processParams(sh, editParams))
124 new AADisorderClient(sh, alignFrame, preset, paramset));
129 public SequenceAnnotationWSClient(AAConsSettings fave,
130 AlignFrame alignFrame, boolean b)
132 super(alignFrame, fave.getPreset(), fave.getJobArgset());
133 initSequenceAnnotationWSClient(fave.getService(), alignFrame,
134 fave.getPreset(), b);
140 * @see jalview.ws.jws2.Jws2Client#attachWSMenuEntry(javax.swing.JMenu,
141 * jalview.ws.jws2.jabaws2.Jws2Instance, jalview.gui.AlignFrame)
143 public void attachWSMenuEntry(JMenu wsmenu, final Jws2Instance service,
144 final AlignFrame alignFrame)
146 if (service.serviceType.equals(compbio.ws.client.Services.AAConWS
149 registerAAConsWSInstance(wsmenu, service, alignFrame);
152 boolean hasparams = service.hasParameters();
153 // Assume name ends in WS
154 String calcName = service.serviceType.substring(0,
155 service.serviceType.length() - 2);
157 JMenuItem aacons = new JMenuItem(calcName + " Defaults");
158 aacons.addActionListener(new ActionListener()
162 public void actionPerformed(ActionEvent e)
164 new SequenceAnnotationWSClient(service, alignFrame, null, false);
170 // only add these menu options if the service has user-modifiable
172 aacons = new JMenuItem("Edit settings and run ...");
173 aacons.setToolTipText("View and change parameters before running calculation");
175 aacons.addActionListener(new ActionListener()
177 public void actionPerformed(ActionEvent e)
179 new SequenceAnnotationWSClient(service, alignFrame, null, true);
183 List<WsParamSetI> presets = service.getParamStore().getPresets();
184 if (presets != null && presets.size() > 0)
186 JMenu presetlist = new JMenu("Run " + calcName + "with preset");
188 for (final WsParamSetI preset : presets)
190 final JMenuItem methodR = new JMenuItem(preset.getName());
191 methodR.setToolTipText("<html><p>"
192 + JvSwingUtils.wrapTooltip("<strong>"
193 + (preset.isModifiable() ? "User Preset"
194 : "Service Preset") + "</strong><br/>"
195 + preset.getDescription() + "</p>") + "</html>");
196 methodR.addActionListener(new ActionListener()
198 public void actionPerformed(ActionEvent e)
200 new SequenceAnnotationWSClient(service, alignFrame, preset,
205 presetlist.add(methodR);
207 wsmenu.add(presetlist);
213 private final String AAconsToggle = "AACons Calculations",
214 AAconsToggleTooltip = "When checked, AACons calculations are updated automatically.",
215 AAeditSettings = "Change AACons Settings...",
216 AAeditSettingsTooltip = "Modify settings for AACons calculations.";
218 // private final enableAAConsCalculation(final AlignFrame alignFrame, )
219 private void registerAAConsWSInstance(final JMenu wsmenu,
220 final Jws2Instance service, final AlignFrame alignFrame)
222 // register this in the AACons settings set
223 JCheckBoxMenuItem _aaConsEnabled = null;
224 for (int i = 0; i < wsmenu.getItemCount(); i++)
226 JMenuItem item = wsmenu.getItem(i);
227 if (item instanceof JCheckBoxMenuItem
228 && item.getText().equals(AAconsToggle))
230 _aaConsEnabled = (JCheckBoxMenuItem) item;
233 // is there an aaCons worker already present - if so, set it to use the
234 // given service handle
236 List<AlignCalcWorkerI> aaconsClient = alignFrame.getViewport()
238 .getRegisteredWorkersOfClass(AAConsClient.class);
239 if (aaconsClient != null && aaconsClient.size() > 0)
241 AAConsClient worker = (AAConsClient) aaconsClient.get(0);
242 if (!worker.service.hosturl.equals(service.hosturl))
244 // javax.swing.SwingUtilities.invokeLater(new Runnable()
249 removeCurrentAAConsWorkerFor(alignFrame);
250 buildCurrentAAConsWorkerFor(alignFrame, service);
257 // is there a service already registered ? there shouldn't be if we are
258 // being called correctly
259 if (_aaConsEnabled == null)
261 final JCheckBoxMenuItem aaConsEnabled = new JCheckBoxMenuItem(
263 wsmenu.addMenuListener(new MenuListener()
267 public void menuSelected(MenuEvent arg0)
269 wsmenu.setEnabled(!alignFrame.getViewport().getAlignment()
271 List<AlignCalcWorkerI> aaconsClient = alignFrame.getViewport()
273 .getRegisteredWorkersOfClass(AAConsClient.class);
274 if (aaconsClient != null && aaconsClient.size() > 0)
276 aaConsEnabled.setSelected(true);
280 aaConsEnabled.setSelected(false);
285 public void menuDeselected(MenuEvent arg0)
287 // TODO Auto-generated method stub
292 public void menuCanceled(MenuEvent arg0)
294 // TODO Auto-generated method stub
298 aaConsEnabled.setToolTipText("<html><p>"
299 + JvSwingUtils.wrapTooltip(AAconsToggleTooltip + "</p>")
301 aaConsEnabled.addActionListener(new ActionListener()
304 public void actionPerformed(ActionEvent arg0)
306 // aaConsEnabled.setSelected(!aaConsEnabled.isSelected());
307 List<AlignCalcWorkerI> aaconsClient = alignFrame.getViewport()
309 .getRegisteredWorkersOfClass(AAConsClient.class);
310 if (aaconsClient != null && aaconsClient.size() > 0)
312 removeCurrentAAConsWorkerFor(alignFrame);
316 buildCurrentAAConsWorkerFor(alignFrame);
322 wsmenu.add(aaConsEnabled);
323 JMenuItem modifyParams = new JMenuItem(AAeditSettings);
324 modifyParams.setToolTipText("<html><p>"
325 + JvSwingUtils.wrapTooltip(AAeditSettingsTooltip + "</p>")
327 modifyParams.addActionListener(new ActionListener()
331 public void actionPerformed(ActionEvent arg0)
333 showAAConsAnnotationSettingsFor(alignFrame);
336 wsmenu.add(modifyParams);
341 private static void showAAConsAnnotationSettingsFor(AlignFrame alignFrame)
344 * preferred settings Whether AACons is automatically recalculated Which
345 * AACons server to use What parameters to use
347 // could actually do a class search for this too
348 AAConsSettings fave = (AAConsSettings) alignFrame.getViewport()
349 .getCalcIdSettingsFor(AAConsCalcId);
352 fave = createDefaultAAConsSettings();
354 new SequenceAnnotationWSClient(fave, alignFrame, true);
358 private static void buildCurrentAAConsWorkerFor(AlignFrame alignFrame)
360 buildCurrentAAConsWorkerFor(alignFrame, null);
363 private static void buildCurrentAAConsWorkerFor(AlignFrame alignFrame,
364 Jws2Instance service)
367 * preferred settings Whether AACons is automatically recalculated Which
368 * AACons server to use What parameters to use
370 AAConsSettings fave = (AAConsSettings) alignFrame.getViewport()
371 .getCalcIdSettingsFor(AAConsCalcId);
374 fave = createDefaultAAConsSettings(service);
379 && !fave.getService().hosturl.equals(service.hosturl))
381 Cache.log.debug("Changing AACons service to " + service.hosturl
382 + " from " + fave.getService().hosturl);
383 fave.setService(service);
386 new SequenceAnnotationWSClient(fave, alignFrame, false);
389 private static AAConsSettings createDefaultAAConsSettings()
391 return createDefaultAAConsSettings(null);
394 private static AAConsSettings createDefaultAAConsSettings(
395 Jws2Instance service)
399 if (!service.serviceType.toString().equals(
400 compbio.ws.client.Services.AAConWS.toString()))
403 .warn("Ignoring invalid preferred service for AACons calculations (service type was "
404 + service.serviceType + ")");
409 // check service is actually in the list of currently avaialable
411 if (!Jws2Discoverer.getDiscoverer().getServices().contains(service))
420 // get the default service for AACons
421 service = Jws2Discoverer.getDiscoverer().getPreferredServiceFor(null,
422 compbio.ws.client.Services.AAConWS.toString());
424 * for (Jws2Instance sv : Jws2Discoverer.getDiscoverer().getServices()) {
425 * if (sv.serviceType.toString().equals(
426 * compbio.ws.client.Services.AAConWS.toString())) { service = sv; break;
432 // TODO raise dialog box explaining error, and/or open the JABA
434 throw new Error("No AACons service found.");
436 return new AAConsSettings(true, service, null, null);
439 private static void removeCurrentAAConsWorkerFor(AlignFrame alignFrame)
441 alignFrame.getViewport().getCalcManager()
442 .removeRegisteredWorkersOfClass(AAConsClient.class);
443 // AAConsClient.removeAAConsAnnotation(alignFrame.alignPanel);