JAL-3878 Make openEditsParamsDialog an interface static method.
[jalview.git] / src / jalview / ws2 / gui / AnnotationMenuBuilder.java
1 package jalview.ws2.gui;
2
3 import java.util.ArrayList;
4 import java.util.Collections;
5 import java.util.List;
6
7 import javax.swing.JCheckBoxMenuItem;
8 import javax.swing.JMenu;
9 import javax.swing.JMenuItem;
10 import javax.swing.event.MenuEvent;
11 import javax.swing.event.MenuListener;
12
13 import jalview.gui.AlignFrame;
14 import jalview.util.MessageManager;
15 import jalview.ws.params.ArgumentI;
16 import jalview.ws2.operations.AnnotationOperation;
17 import jalview.ws2.operations.AnnotationWorker;
18
19 public class AnnotationMenuBuilder implements MenuEntryProviderI
20 {
21   final AnnotationOperation operation;
22
23   public AnnotationMenuBuilder(AnnotationOperation operation)
24   {
25     this.operation = operation;
26   }
27
28   @Override
29   public void buildMenu(JMenu parent, AlignFrame frame)
30   {
31     if (operation.isInteractive())
32       buildInteractiveMenu(parent, frame);
33     else
34       buildClassicMenu(parent, frame);
35   }
36
37   protected void buildClassicMenu(JMenu parent, AlignFrame frame)
38   {
39     final var calcName = operation.getName();
40     final var calcManager = frame.getViewport().getCalcManager();
41     {
42       var item = new JMenuItem(MessageManager.formatMessage(
43           "label.calcname_with_default_settings", calcName));
44       item.addActionListener((event) -> {
45         var worker = createWorker(Collections.emptyList(), frame);
46         calcManager.startWorker(worker);
47       });
48       parent.add(item);
49     }
50     if (operation.hasParameters())
51     {
52       var item = new JMenuItem(
53           MessageManager.getString("label.edit_settings_and_run"));
54       item.setToolTipText(MessageManager.getString(
55           "label.view_and_change_parameters_before_running_calculation"));
56       item.addActionListener((event) -> {
57         MenuEntryProviderI.openEditParamsDialog(operation.getParamStore(),
58             null, null)
59             .thenAcceptAsync((arguments) -> {
60               if (arguments != null)
61               {
62                 var worker = createWorker(arguments, frame);
63                 calcManager.startWorker(worker);
64               }
65             });
66       });
67       parent.add(item);
68     }
69   }
70
71   protected void buildInteractiveMenu(JMenu parent, AlignFrame frame)
72   {
73     final var calcName = operation.getName();
74     final var calcManager = frame.getViewport().getCalcManager();
75     final var arguments = new ArrayList<ArgumentI>();
76     final JCheckBoxMenuItem runItem;
77     {
78       // TODO use MessageManager and set tool tip text
79       runItem = new JCheckBoxMenuItem(
80           String.format("%s calculations", calcName));
81       runItem.addActionListener((event) -> {
82         calcManager.removeWorkersForName(calcName);
83         var worker = createWorker(arguments, frame);
84         calcManager.registerWorker(worker);
85       });
86       parent.add(runItem);
87     }
88     JMenuItem _editItem = null;
89     if (operation.hasParameters())
90     {
91       // TODO use MessageManager and set tool tip text
92       _editItem = new JMenuItem(
93           String.format("Edit %s settings", calcName));
94       _editItem.addActionListener((event) -> {
95         MenuEntryProviderI.openEditParamsDialog(operation.getParamStore(),
96             null, null)
97             .thenAcceptAsync((args) -> {
98               if (arguments != null)
99               {
100                 arguments.clear();
101                 arguments.addAll(args);
102                 calcManager.removeWorkersForName(calcName);
103                 var worker = createWorker(arguments, frame);
104                 calcManager.registerWorker(worker);
105               }
106             });
107       });
108       parent.add(_editItem);
109     }
110     final var editItem = _editItem;
111
112     parent.addMenuListener(new MenuListener()
113     {
114       @Override
115       public void menuSelected(MenuEvent e)
116       {
117         var isNuc = frame.getViewport().getAlignment().isNucleotide();
118         var menuEnabled = (isNuc && operation.isNucleotideOperation()) ||
119             (!isNuc && operation.isProteinOperation());
120         runItem.setEnabled(menuEnabled);
121         if (editItem != null)
122           editItem.setEnabled(menuEnabled);
123         boolean currentlyRunning = calcManager.getWorkersForName(calcName).size() > 0;
124         runItem.setSelected(currentlyRunning);
125       }
126
127       @Override
128       public void menuDeselected(MenuEvent e)
129       {
130       }
131
132       @Override
133       public void menuCanceled(MenuEvent e)
134       {
135       }
136     });
137   }
138
139   private AnnotationWorker createWorker(List<ArgumentI> arguments, AlignFrame frame)
140   {
141     /* What is the purpose of AlignViewport and AlignmentViewPanel? */
142     return new AnnotationWorker(operation, arguments, frame, frame);
143   }
144
145 }