JAL-3878 Make openEditsParamsDialog an interface static method.
[jalview.git] / src / jalview / ws2 / gui / AlignmentMenuBuilder.java
1 package jalview.ws2.gui;
2
3 import static java.lang.String.format;
4
5 import java.awt.event.MouseAdapter;
6 import java.awt.event.MouseEvent;
7 import java.util.Collections;
8 import java.util.List;
9 import java.util.Objects;
10
11 import javax.swing.JMenu;
12 import javax.swing.JMenuItem;
13 import javax.swing.ToolTipManager;
14
15 import jalview.datamodel.AlignmentView;
16 import jalview.gui.AlignFrame;
17 import jalview.gui.AlignViewport;
18 import jalview.gui.JvSwingUtils;
19 import jalview.gui.WebserviceInfo;
20 import jalview.util.MessageManager;
21 import jalview.ws.params.ArgumentI;
22 import jalview.ws2.PollingTaskExecutor;
23 import jalview.ws2.operations.AlignmentOperation;
24 import jalview.ws2.operations.AlignmentWorker;
25
26 public class AlignmentMenuBuilder implements MenuEntryProviderI
27 {
28   AlignmentOperation operation;
29
30   public AlignmentMenuBuilder(AlignmentOperation operation)
31   {
32     this.operation = operation;
33   }
34
35   public void buildMenu(JMenu parent, AlignFrame frame)
36   {
37     if (operation.canSubmitGaps())
38     {
39       var alignSubmenu = new JMenu(operation.getName());
40       buildMenu(alignSubmenu, frame, false);
41       parent.add(alignSubmenu);
42       var realignSubmenu = new JMenu(MessageManager.formatMessage(
43           "label.realign_with_params", operation.getName()));
44       realignSubmenu.setToolTipText(MessageManager
45           .getString("label.align_sequences_to_existing_alignment"));
46       buildMenu(realignSubmenu, frame, true);
47       parent.add(realignSubmenu);
48     }
49     else
50     {
51       buildMenu(parent, frame, false);
52     }
53   }
54
55   protected void buildMenu(JMenu parent, AlignFrame frame,
56       boolean submitGaps)
57   {
58     final String action = submitGaps ? "Align" : "Realign";
59     final var calcName = operation.getName();
60
61     {
62       var item = new JMenuItem(MessageManager.formatMessage(
63           "label.calcname_with_default_settings", calcName));
64       item.setToolTipText(MessageManager
65           .formatMessage("label.action_with_default_settings", action));
66       item.addActionListener((event) -> {
67         final AlignmentView msa = frame.gatherSequencesForAlignment();
68         if (msa != null)
69         {
70           startWorker(frame, msa, Collections.emptyList(), submitGaps);
71         }
72       });
73       parent.add(item);
74     }
75
76     if (operation.hasParameters())
77     {
78       var item = new JMenuItem(
79           MessageManager.getString("label.edit_settings_and_run"));
80       item.setToolTipText(MessageManager.getString(
81           "label.view_and_change_parameters_before_alignment"));
82       item.addActionListener((event) -> {
83         AlignmentView msa = frame.gatherSequencesForAlignment();
84         if (msa != null)
85         {
86           MenuEntryProviderI.openEditParamsDialog(operation.getParamStore(),
87               null, null)
88               .thenAcceptAsync((arguments) -> {
89                 if (arguments != null)
90                 {
91                   startWorker(frame, msa, arguments, submitGaps);
92                 }
93               });
94         }
95       });
96       parent.add(item);
97     }
98
99     var presets = operation.getParamStore().getPresets();
100     if (presets != null && presets.size() > 0)
101     {
102       final var presetList = new JMenu(MessageManager
103           .formatMessage("label.run_with_preset_params", calcName));
104       final var showToolTipFor = ToolTipManager.sharedInstance()
105           .getDismissDelay();
106       for (final var preset : presets)
107       {
108         var item = new JMenuItem(preset.getName());
109         final int QUICK_TOOLTIP = 1500;
110         item.addMouseListener(new MouseAdapter()
111         {
112           @Override
113           public void mouseEntered(MouseEvent e)
114           {
115             ToolTipManager.sharedInstance().setDismissDelay(QUICK_TOOLTIP);
116           }
117
118           @Override
119           public void mouseExited(MouseEvent e)
120           {
121             ToolTipManager.sharedInstance().setDismissDelay(showToolTipFor);
122           }
123         });
124         String tooltip = JvSwingUtils.wrapTooltip(true,
125             format("<strong>%s</strong><br/>%s",
126                 MessageManager.getString(
127                     preset.isModifiable() ? "label.user_preset"
128                         : "label.service_preset"),
129                 preset.getDescription()));
130         item.setToolTipText(tooltip);
131         item.addActionListener((event) -> {
132           AlignmentView msa = frame.gatherSequencesForAlignment();
133           startWorker(frame, msa, preset.getArguments(), submitGaps);
134         });
135         presetList.add(item);
136       }
137       parent.add(presetList);
138     }
139   }
140
141   private void startWorker(AlignFrame frame, AlignmentView msa,
142       List<ArgumentI> arguments, boolean submitGaps)
143   {
144     AlignViewport viewport = frame.getViewport();
145     PollingTaskExecutor executor = frame.getViewport().getWSExecutor();
146     if (msa != null)
147     {
148
149       String panelInfo = String.format("%s using service hosted at %s%n%s",
150           operation.getName(), operation.getHostName(),
151           Objects.requireNonNullElse(operation.getDescription(), ""));
152       var wsInfo = new WebserviceInfo(operation.getName(), panelInfo, false);
153
154       final String alnTitle = frame.getTitle();
155       AlignmentWorker worker = new AlignmentWorker(operation, msa,
156           arguments, submitGaps, true, viewport);
157       String outputHeader = String.format("%s of %s%nJob details%n",
158           submitGaps ? "Re-alignment" : "Alignment", alnTitle);
159
160       var awl = new AlignmentProgressUpdater(worker, wsInfo, frame,
161           outputHeader);
162       worker.setResultConsumer(awl);
163       worker.addListener(awl);
164
165       executor.submit(worker);
166     }
167
168   }
169
170 }