1 package jalview.ws2.gui;
3 import java.util.ArrayList;
4 import java.util.Collections;
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;
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;
19 public class AnnotationMenuBuilder implements MenuEntryProviderI
21 final AnnotationOperation operation;
23 public AnnotationMenuBuilder(AnnotationOperation operation)
25 this.operation = operation;
29 public void buildMenu(JMenu parent, AlignFrame frame)
31 if (operation.isInteractive())
32 buildInteractiveMenu(parent, frame);
34 buildClassicMenu(parent, frame);
37 protected void buildClassicMenu(JMenu parent, AlignFrame frame)
39 final var calcName = operation.getName();
40 final var calcManager = frame.getViewport().getCalcManager();
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);
50 if (operation.hasParameters())
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(),
59 .thenAcceptAsync((arguments) -> {
60 if (arguments != null)
62 var worker = createWorker(arguments, frame);
63 calcManager.startWorker(worker);
71 protected void buildInteractiveMenu(JMenu parent, AlignFrame frame)
73 final var calcName = operation.getName();
74 final var calcManager = frame.getViewport().getCalcManager();
75 final var arguments = new ArrayList<ArgumentI>();
76 final JCheckBoxMenuItem runItem;
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);
88 JMenuItem _editItem = null;
89 if (operation.hasParameters())
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(),
97 .thenAcceptAsync((args) -> {
98 if (arguments != null)
101 arguments.addAll(args);
102 calcManager.removeWorkersForName(calcName);
103 var worker = createWorker(arguments, frame);
104 calcManager.registerWorker(worker);
108 parent.add(_editItem);
110 final var editItem = _editItem;
112 parent.addMenuListener(new MenuListener()
115 public void menuSelected(MenuEvent e)
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);
128 public void menuDeselected(MenuEvent e)
133 public void menuCanceled(MenuEvent e)
139 private AnnotationWorker createWorker(List<ArgumentI> arguments, AlignFrame frame)
141 /* What is the purpose of AlignViewport and AlignmentViewPanel? */
142 return new AnnotationWorker(operation, arguments, frame, frame);