JAL-4232 Disable menu items for RNA services for proteins.
[jalview.git] / src / jalview / ws2 / gui / WebServicesMenuManager.java
index f081915..f9b8c02 100644 (file)
@@ -21,6 +21,8 @@ import javax.swing.JMenuItem;
 import javax.swing.ToolTipManager;
 import javax.swing.border.EmptyBorder;
 
+import jalview.bin.Console;
+import jalview.datamodel.AlignmentI;
 import jalview.gui.AlignFrame;
 import jalview.gui.Desktop;
 import jalview.gui.JvSwingUtils;
@@ -37,7 +39,9 @@ import jalview.ws2.actions.alignment.AlignmentResult;
 import jalview.ws2.actions.annotation.AlignCalcWorkerAdapter;
 import jalview.ws2.actions.annotation.AnnotationAction;
 import jalview.ws2.actions.api.ActionI;
+import jalview.ws2.actions.api.TaskEventListener;
 import jalview.ws2.actions.api.TaskI;
+import jalview.ws2.actions.hmmer.PhmmerAction;
 import jalview.ws2.api.Credentials;
 import jalview.ws2.api.WebService;
 import jalview.ws2.client.api.WebServiceProviderI;
@@ -171,6 +175,7 @@ public class WebServicesMenuManager
 
   private void addEntriesForAction(ActionI<?> action, JMenu menu, boolean isTopLevel)
   {
+    var enabled = isActionEnabled(action);
     var service = action.getWebService();
     String itemName;
     if (isTopLevel)
@@ -192,6 +197,7 @@ public class WebServicesMenuManager
       if (datastore.hasParameters() || datastore.hasPresets())
         text += " with defaults";
       JMenuItem item = new JMenuItem(text);
+      item.setEnabled(enabled);
       item.addActionListener(e -> {
         runAction(action, frame.getCurrentView(), Collections.emptyList(),
             Credentials.empty());
@@ -201,6 +207,7 @@ public class WebServicesMenuManager
     if (datastore.hasParameters())
     {
       JMenuItem item = new JMenuItem("Edit settings and run...");
+      item.setEnabled(enabled);
       item.addActionListener(e -> {
         openEditParamsDialog(datastore, null, null).thenAccept(args -> {
           if (args != null)
@@ -214,6 +221,7 @@ public class WebServicesMenuManager
     {
       final var presetsMenu = new JMenu(MessageManager.formatMessage(
           "label.run_with_preset_params", service.getName()));
+      presetsMenu.setEnabled(enabled);
       final int dismissDelay = ToolTipManager.sharedInstance()
           .getDismissDelay();
       final int QUICK_TOOLTIP = 1500;
@@ -338,6 +346,7 @@ public class WebServicesMenuManager
           for (ActionI<?> action : actions)
           {
             var item = new JMenuItem(action.getFullName());
+            item.setEnabled(isActionEnabled(action));
             item.addActionListener(e -> setAlternative(action));
             atMenu.add(item);
           }
@@ -424,6 +433,12 @@ public class WebServicesMenuManager
     }
   }
 
+  private boolean isActionEnabled(ActionI<?> action)
+  {
+    var isNa = frame.getViewport().getAlignment().isNucleotide();
+    return ((isNa && action.doAllowNucleotide()) ||
+        (!isNa && action.doAllowProtein()));
+  }
 
   private void runAction(ActionI<?> action, AlignmentViewport viewport,
       List<ArgumentI> args, Credentials credentials)
@@ -445,26 +460,43 @@ public class WebServicesMenuManager
     if (action instanceof AnnotationAction)
     {
       var calcManager = viewport.getCalcManager();
-      var oldWorkers = calcManager.getWorkersOfClass(AlignCalcWorkerAdapter.class);
-      for (var worker : oldWorkers)
-      {
-        calcManager.cancelWorker(worker);
-        calcManager.removeWorker(worker);
-      }
 
       var _action = (AnnotationAction) action;
       var worker = new AlignCalcWorkerAdapter(viewport, frame.alignPanel,
           _action, args, credentials);
       var handler = new AnnotationServiceGuiHandler(_action, frame);
-      worker.addTaskEventListener(handler);
+      worker.setWorkerListener(handler);
+      for (var w : calcManager.getWorkers())
+      {
+        if (worker.getCalcName() != null && worker.getCalcName().equals(w.getCalcName()))
+        {
+          calcManager.cancelWorker(w);
+          calcManager.removeWorker(w);
+        }
+      }
       if (action.getWebService().isInteractive())
         calcManager.registerWorker(worker);
       else
         calcManager.startWorker(worker);
       return;
     }
-    throw new IllegalArgumentException(
-        String.format("Illegal action type %s", action.getClass().getName()));
+    if (action instanceof PhmmerAction)
+    {
+      var _action = (PhmmerAction) action;
+      var handler = new SearchServiceGuiHandler(_action, frame);
+      TaskI<AlignmentI> task = _action.createTask(viewport, args, credentials);
+      var executor = PollingTaskExecutor.fromPool(viewport.getServiceExecutor());
+      task.addTaskEventListener(handler);
+      _action.perform(viewport, args, credentials, handler);
+      return;
+    }
+    Console.warn(String.format(
+            "No known handler for action type %s. All output will be discarded.",
+            action.getClass().getName()));
+    var task = action.createTask(viewport, args, credentials);
+    task.addTaskEventListener(TaskEventListener.nullListener());
+    PollingTaskExecutor.fromPool(viewport.getServiceExecutor())
+      .submit(task);
   }
 
   private static CompletionStage<List<ArgumentI>> openEditParamsDialog(