JAL-3878 Add RNAalifold service discovery.
[jalview.git] / src / jalview / ws2 / operations / AnnotationOperation.java
index 55ed03b..f927b2b 100644 (file)
@@ -21,11 +21,13 @@ import jalview.io.FeaturesFile;
 import jalview.util.Format;
 import jalview.util.MessageManager;
 import jalview.ws.params.ArgumentI;
+import jalview.ws.params.ParamDatastoreI;
 import jalview.ws.params.WsParamSetI;
 import jalview.ws2.MenuEntryProviderI;
 import jalview.ws2.ResultSupplier;
 import jalview.ws2.PollingTaskExecutor;
 import jalview.ws2.WebServiceI;
+import jalview.ws2.gui.AnnotationMenuBuilder;
 
 /**
  *
@@ -46,6 +48,10 @@ public class AnnotationOperation implements Operation
 
   boolean interactive = false;
 
+  private boolean isProtOperation = true;
+
+  private boolean isNucOperation = true;
+
   /*
    * Is it fine to get rid of AlignAnalysisUIText?
    */
@@ -67,6 +73,12 @@ public class AnnotationOperation implements Operation
   }
 
   @Override
+  public String getDescription()
+  {
+    return service.getDescription();
+  }
+
+  @Override
   public String getTypeName()
   {
     return typeName;
@@ -79,6 +91,18 @@ public class AnnotationOperation implements Operation
   }
 
   @Override
+  public boolean hasParameters()
+  {
+    return service.hasParameters();
+  }
+
+  @Override
+  public ParamDatastoreI getParamStore()
+  {
+    return service.getParamStore();
+  }
+
+  @Override
   public int getMinSequences()
   {
     return 0;
@@ -99,13 +123,23 @@ public class AnnotationOperation implements Operation
   @Override
   public boolean isProteinOperation()
   {
-    return true;
+    return isProtOperation;
+  }
+
+  public void setProteinOperation(boolean value)
+  {
+    isProtOperation = value;
   }
 
   @Override
   public boolean isNucleotideOperation()
   {
-    return true;
+    return isNucOperation;
+  }
+
+  public void setNucleotideOperation(boolean value)
+  {
+    isNucOperation = value;
   }
 
   @Override
@@ -145,149 +179,7 @@ public class AnnotationOperation implements Operation
   @Override
   public MenuEntryProviderI getMenuBuilder()
   {
-    if (isInteractive())
-      return this::buildInteractiveMenu;
-    else
-      return this::buildClassicMenu;
-  }
-
-  protected void buildClassicMenu(JMenu parent, AlignFrame frame)
-  {
-    final var calcName = service.getName();
-    PollingTaskExecutor wsExecutor = frame.getViewport().getWSExecutor();
-    final var calcManager = frame.getViewport().getCalcManager();
-    {
-      var item = new JMenuItem(MessageManager.formatMessage(
-          "label.calcname_with_default_settings", calcName));
-      item.addActionListener((event) -> {
-        var worker = createWorker(Collections.emptyList(), frame, calcManager);
-        calcManager.startWorker(worker);
-      });
-      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_running_calculation"));
-      item.addActionListener((event) -> {
-        openEditParamsDialog(service, null, null)
-            .thenAcceptAsync((arguments) -> {
-              if (arguments != null)
-              {
-                var worker = createWorker(arguments, frame, calcManager);
-                calcManager.startWorker(worker);
-              }
-            });
-      });
-      parent.add(item);
-    }
-  }
-
-  protected void buildInteractiveMenu(JMenu parent, AlignFrame frame)
-  {
-    final var calcName = service.getName();
-    final var calcManager = frame.getViewport().getCalcManager();
-    final var arguments = new ArrayList<ArgumentI>();
-    final JCheckBoxMenuItem runItem;
-    {
-      // TODO use MessageManager and set tool tip text
-      runItem = new JCheckBoxMenuItem(
-          String.format("%s calculations", calcName));
-      runItem.addActionListener((event) -> {
-        calcManager.removeWorkersForName(calcName);
-        var worker = createWorker(arguments, frame, calcManager);
-        calcManager.registerWorker(worker);
-      });
-      parent.add(runItem);
-    }
-    JMenuItem _editItem = null;
-    if (service.hasParameters())
-    {
-      // TODO use MessageManager and set tool tip text
-      _editItem = new JMenuItem(
-          String.format("Edit %s settings", calcName));
-      _editItem.addActionListener((event) -> {
-        openEditParamsDialog(service, null, null)
-            .thenAcceptAsync((args) -> {
-              if (arguments != null)
-              {
-                arguments.clear();
-                arguments.addAll(args);
-                calcManager.removeWorkersForName(calcName);
-                var worker = createWorker(arguments, frame, calcManager);
-                calcManager.registerWorker(worker);
-              }
-            });
-      });
-      parent.add(_editItem);
-    }
-    final var editItem = _editItem;
-
-    parent.addMenuListener(new MenuListener()
-      {
-        @Override
-        public void menuSelected(MenuEvent e)
-        {
-          var isNuc = frame.getViewport().getAlignment().isNucleotide();
-          var menuEnabled = (isNuc && isNucleotideOperation()) ||
-              (!isNuc && isProteinOperation());
-          runItem.setEnabled(menuEnabled);
-          if (editItem != null)
-            editItem.setEnabled(menuEnabled);
-          boolean currentlyRunning = calcManager.getWorkersForName(calcName).size() > 0;
-          runItem.setSelected(currentlyRunning);
-        }
-
-        @Override
-        public void menuDeselected(MenuEvent e) {}
-
-        @Override
-        public void menuCanceled(MenuEvent e) {}
-      });
-  }
-
-  private AnnotationServiceWorker createWorker(
-      List<ArgumentI> arguments, AlignFrame frame, AlignCalcManagerI2 calcManager)
-  {
-    /* What is the purpose of AlignViewport and AlignmentViewPanel? */
-    AlignViewport viewport = frame.getCurrentView();
-    AlignmentViewPanel alignPanel = frame.alignPanel;
-    return new AnnotationServiceWorker(this, service,
-        arguments, viewport, alignPanel, frame, frame,
-        calcManager);
-  }
-
-  private CompletionStage<List<ArgumentI>> openEditParamsDialog(
-      WebServiceI service, WsParamSetI preset, List<ArgumentI> 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 (preset != null)
-    {
-      jobParams.setName(MessageManager.getString(
-          "label.adjusting_parameters_for_calculation"));
-    }
-    var stage = jobParams.showRunDialog();
-    return stage.thenApply((startJob) -> {
-      if (startJob)
-      {
-        if (jobParams.getPreset() == null)
-          return jobParams.getJobParams();
-        else
-          return jobParams.getPreset().getArguments();
-      }
-      else
-      {
-        return null;
-      }
-    });
+    return new AnnotationMenuBuilder(this);
   }
 
 }