3 import jalview.bin.Cache;
4 import jalview.util.MessageManager;
5 import jalview.ws.WSDiscovererI;
6 import jalview.ws.slivkaws.SlivkaWSDiscoverer;
8 import java.awt.BorderLayout;
10 import java.awt.Component;
11 import java.awt.Dimension;
13 import java.awt.event.ActionEvent;
14 import java.awt.event.ActionListener;
15 import java.awt.event.MouseAdapter;
16 import java.awt.event.MouseEvent;
17 import java.awt.event.MouseListener;
18 import java.net.MalformedURLException;
20 import java.util.ArrayList;
21 import java.util.NoSuchElementException;
23 import javax.swing.BorderFactory;
24 import javax.swing.Box;
25 import javax.swing.BoxLayout;
26 import javax.swing.JButton;
27 import javax.swing.JOptionPane;
28 import javax.swing.JPanel;
29 import javax.swing.JProgressBar;
30 import javax.swing.JScrollPane;
31 import javax.swing.JTable;
32 import javax.swing.SwingUtilities;
33 import javax.swing.UIManager;
34 import javax.swing.table.AbstractTableModel;
35 import javax.swing.table.DefaultTableCellRenderer;
37 @SuppressWarnings("serial")
38 public class SlivkaPreferences extends JPanel
41 setLayout(new BoxLayout(this, BoxLayout.PAGE_AXIS));
42 setPreferredSize(new Dimension(500, 450));
45 WSDiscovererI discoverer;
47 private final ArrayList<String> urls = new ArrayList<>();
49 private final ArrayList<Integer> statuses = new ArrayList<>();
51 private final AbstractTableModel urlTableModel = new AbstractTableModel()
53 final String[] columnNames = { "Service URL", "Status" };
56 public String getColumnName(int col)
58 return columnNames[col];
62 public Object getValueAt(int rowIndex, int columnIndex)
67 return urls.get(rowIndex);
69 return statuses.get(rowIndex);
71 throw new NoSuchElementException();
76 public int getRowCount()
82 public int getColumnCount()
88 private class WSStatusCellRenderer extends DefaultTableCellRenderer
91 public Component getTableCellRendererComponent(JTable table,
92 Object value, boolean isSelected, boolean hasFocus, int row,
95 setHorizontalAlignment(CENTER);
96 super.getTableCellRendererComponent(table, "\u25CF", isSelected,
97 hasFocus, row, column);
98 switch ((Integer) value)
100 case WSDiscovererI.STATUS_NO_SERVICES:
101 setForeground(Color.ORANGE);
103 case WSDiscovererI.STATUS_OK:
104 setForeground(Color.GREEN);
106 case WSDiscovererI.STATUS_INVALID:
107 setForeground(Color.RED);
109 case WSDiscovererI.STATUS_UNKNOWN:
111 setForeground(Color.LIGHT_GRAY);
117 private JTable urlListTable = new JTable(urlTableModel);
119 urlListTable.getColumnModel().getColumn(1).setMaxWidth(60);
120 urlListTable.getColumnModel().getColumn(1)
121 .setCellRenderer(new WSStatusCellRenderer());
124 // URL control panel buttons
125 JButton newWsUrl = new JButton(
126 MessageManager.getString("label.new_service_url"));
128 JButton editWsUrl = new JButton(
129 MessageManager.getString("label.edit_service_url"));
131 JButton deleteWsUrl = new JButton(
132 MessageManager.getString("label.delete_service_url"));
134 JButton moveUrlUp = new JButton(
135 MessageManager.getString("action.move_up"));
137 JButton moveUrlDown = new JButton(
138 MessageManager.getString("action.move_down"));
140 private String showEditUrlDialog(String oldUrl)
142 String input = (String) JvOptionPane
143 .showInternalInputDialog(
145 MessageManager.getString("label.url:"),
146 UIManager.getString("OptionPane.inputDialogTitle", MessageManager.getLocale()),
147 JOptionPane.QUESTION_MESSAGE,
158 } catch (MalformedURLException ex)
160 JvOptionPane.showInternalMessageDialog(this,
161 MessageManager.getString("label.invalid_url"),
162 UIManager.getString("OptionPane.messageDialogTitle",
163 MessageManager.getLocale()),
164 JOptionPane.WARNING_MESSAGE);
170 // Button Action Listeners
171 private ActionListener newUrlAction = (ActionEvent e) -> {
172 final String input = showEditUrlDialog("");
176 statuses.add(discoverer.getServerStatusFor(input));
177 urlTableModel.fireTableRowsInserted(urls.size(), urls.size());
178 discoverer.setServiceUrls(urls);
182 private ActionListener editUrlAction = (ActionEvent e) -> {
183 final int i = urlListTable.getSelectedRow();
186 final String input = showEditUrlDialog(urls.get(i));
190 statuses.set(i, discoverer.getServerStatusFor(input));
191 urlTableModel.fireTableRowsUpdated(i, i);
192 discoverer.setServiceUrls(urls);
197 private ActionListener deleteUrlAction = (ActionEvent e) -> {
198 final int i = urlListTable.getSelectedRow();
203 urlTableModel.fireTableRowsDeleted(i, i);
204 discoverer.setServiceUrls(urls);
208 private ActionListener moveUrlUpAction = (ActionEvent e) -> {
209 final int i = urlListTable.getSelectedRow();
212 moveTableRow(i, i - 1);
213 discoverer.setServiceUrls(urls);
217 private ActionListener moveUrlDownAction = (ActionEvent e) -> {
218 final int i = urlListTable.getSelectedRow();
219 if (i >= 0 && i < urls.size() - 1)
221 moveTableRow(i, i + 1);
222 discoverer.setServiceUrls(urls);
226 private MouseListener tableClickListener = new MouseAdapter()
228 final ActionEvent actionEvent = new ActionEvent(urlListTable,
229 ActionEvent.ACTION_PERFORMED, "edit");
232 public void mouseClicked(MouseEvent e)
234 if (e.getClickCount() > 1)
236 editUrlAction.actionPerformed(actionEvent);
241 // Setting up URL list Pane
243 Font font = new Font("Verdana", Font.PLAIN, 10);
244 JPanel urlPaneContainer = new JPanel(new BorderLayout(5, 5));
245 urlPaneContainer.setBorder(BorderFactory.createCompoundBorder(
246 BorderFactory.createTitledBorder(BorderFactory.createEtchedBorder(),
247 "Slivka Web Services"),
248 BorderFactory.createEmptyBorder(10, 5, 5, 5)));
250 newWsUrl.setFont(font);
251 editWsUrl.setFont(font);
252 deleteWsUrl.setFont(font);
253 moveUrlUp.setFont(font);
254 moveUrlDown.setFont(font);
255 JPanel editContainer = new JPanel();
256 editContainer.add(newWsUrl);
257 editContainer.add(editWsUrl);
258 editContainer.add(deleteWsUrl);
259 urlPaneContainer.add(editContainer, BorderLayout.PAGE_END);
261 JPanel moveContainer = new JPanel();
263 .setLayout(new BoxLayout(moveContainer, BoxLayout.PAGE_AXIS));
264 moveContainer.add(moveUrlUp);
265 moveContainer.add(Box.createRigidArea(new Dimension(0, 5)));
266 moveContainer.add(moveUrlDown);
267 urlPaneContainer.add(moveContainer, BorderLayout.LINE_START);
269 urlPaneContainer.add(new JScrollPane(urlListTable),
270 BorderLayout.CENTER);
271 this.add(urlPaneContainer);
273 // Connecting action listeners
274 urlListTable.addMouseListener(tableClickListener);
275 newWsUrl.addActionListener(newUrlAction);
276 editWsUrl.addActionListener(editUrlAction);
277 deleteWsUrl.addActionListener(deleteUrlAction);
278 moveUrlUp.addActionListener(moveUrlUpAction);
279 moveUrlDown.addActionListener(moveUrlDownAction);
282 private void moveTableRow(int fromIndex, int toIndex)
284 String url = urls.get(fromIndex);
285 int status = statuses.get(fromIndex);
286 urls.set(fromIndex, urls.get(toIndex));
287 statuses.set(fromIndex, statuses.get(toIndex));
288 urls.set(toIndex, url);
289 statuses.set(toIndex, status);
290 if (urlListTable.getSelectedRow() == fromIndex)
292 urlListTable.setRowSelectionInterval(toIndex, toIndex);
294 int firstRow = Math.min(toIndex, fromIndex);
295 int lastRow = Math.max(fromIndex, toIndex);
296 urlTableModel.fireTableRowsUpdated(firstRow, lastRow);
299 // Discoverer reloading buttons
300 JButton refreshServices = new JButton(
301 MessageManager.getString("action.refresh_services"));
303 JButton resetServices = new JButton(
304 MessageManager.getString("action.reset_services"));
306 JProgressBar progressBar = new JProgressBar();
308 // Discoverer buttons action listeners
309 private ActionListener refreshServicesAction = (ActionEvent e) -> {
310 progressBar.setVisible(true);
311 Cache.log.info("Requesting service reload");
312 discoverer.startDiscoverer().handle((_discoverer, exception) -> {
313 if (exception == null)
315 Cache.log.info("Reloading done");
319 Cache.log.error("Reloading failed", exception);
321 SwingUtilities.invokeLater(() -> progressBar.setVisible(false));
326 private ActionListener resetServicesAction = (ActionEvent e) -> {
327 discoverer.setServiceUrls(null);
330 urls.addAll(discoverer.getServiceUrls());
331 for (String url : urls)
333 statuses.add(discoverer.getServerStatusFor(url));
335 urlTableModel.fireTableDataChanged();
339 Font font = new Font("Verdana", Font.PLAIN, 11);
340 refreshServices.setFont(font);
341 resetServices.setFont(font);
342 JPanel container = new JPanel();
343 container.add(refreshServices);
344 container.add(resetServices);
347 // Connecting action listeners
348 refreshServices.addActionListener(refreshServicesAction);
349 resetServices.addActionListener(resetServicesAction);
353 progressBar.setVisible(false);
354 progressBar.setIndeterminate(true);
360 // Initial URLs loading
361 discoverer = SlivkaWSDiscoverer.getInstance();
362 urls.addAll(discoverer.getServiceUrls());
363 for (String url : urls)
365 statuses.add(discoverer.getServerStatusFor(url));