3 import jalview.bin.Cache;
4 import jalview.util.MessageManager;
5 import jalview.ws.WSDiscovererI;
6 import jalview.ws2.slivka.SlivkaWSDiscoverer;
7 import jalview.ws2.WebServiceDiscoverer;
9 import java.awt.BorderLayout;
10 import java.awt.Color;
11 import java.awt.Component;
12 import java.awt.Dimension;
14 import java.awt.event.ActionEvent;
15 import java.awt.event.ActionListener;
16 import java.awt.event.MouseAdapter;
17 import java.awt.event.MouseEvent;
18 import java.awt.event.MouseListener;
19 import java.net.MalformedURLException;
21 import java.util.ArrayList;
22 import java.util.NoSuchElementException;
24 import javax.swing.BorderFactory;
25 import javax.swing.Box;
26 import javax.swing.BoxLayout;
27 import javax.swing.JButton;
28 import javax.swing.JOptionPane;
29 import javax.swing.JPanel;
30 import javax.swing.JProgressBar;
31 import javax.swing.JScrollPane;
32 import javax.swing.JTable;
33 import javax.swing.SwingUtilities;
34 import javax.swing.UIManager;
35 import javax.swing.table.AbstractTableModel;
36 import javax.swing.table.DefaultTableCellRenderer;
38 @SuppressWarnings("serial")
39 public class SlivkaPreferences extends JPanel
42 setLayout(new BoxLayout(this, BoxLayout.PAGE_AXIS));
43 setPreferredSize(new Dimension(500, 450));
46 WebServiceDiscoverer discoverer;
48 private final ArrayList<String> urls = new ArrayList<>();
50 private final ArrayList<Integer> statuses = new ArrayList<>();
52 private final AbstractTableModel urlTableModel = new AbstractTableModel()
54 final String[] columnNames = { "Service URL", "Status" };
57 public String getColumnName(int col)
59 return columnNames[col];
63 public Object getValueAt(int rowIndex, int columnIndex)
68 return urls.get(rowIndex);
70 return statuses.get(rowIndex);
72 throw new NoSuchElementException();
77 public int getRowCount()
83 public int getColumnCount()
89 private class WSStatusCellRenderer extends DefaultTableCellRenderer
92 public Component getTableCellRendererComponent(JTable table,
93 Object value, boolean isSelected, boolean hasFocus, int row,
96 setHorizontalAlignment(CENTER);
97 super.getTableCellRendererComponent(table, "\u25CF", isSelected,
98 hasFocus, row, column);
99 switch ((Integer) value)
101 case WSDiscovererI.STATUS_NO_SERVICES:
102 setForeground(Color.ORANGE);
104 case WSDiscovererI.STATUS_OK:
105 setForeground(Color.GREEN);
107 case WSDiscovererI.STATUS_INVALID:
108 setForeground(Color.RED);
110 case WSDiscovererI.STATUS_UNKNOWN:
112 setForeground(Color.LIGHT_GRAY);
118 private JTable urlListTable = new JTable(urlTableModel);
120 urlListTable.getColumnModel().getColumn(1).setMaxWidth(60);
121 urlListTable.getColumnModel().getColumn(1)
122 .setCellRenderer(new WSStatusCellRenderer());
125 // URL control panel buttons
126 JButton newWsUrl = new JButton(
127 MessageManager.getString("label.new_service_url"));
129 JButton editWsUrl = new JButton(
130 MessageManager.getString("label.edit_service_url"));
132 JButton deleteWsUrl = new JButton(
133 MessageManager.getString("label.delete_service_url"));
135 JButton moveUrlUp = new JButton(
136 MessageManager.getString("action.move_up"));
138 JButton moveUrlDown = new JButton(
139 MessageManager.getString("action.move_down"));
141 private String showEditUrlDialog(String oldUrl)
143 String input = (String) JvOptionPane
144 .showInternalInputDialog(
146 MessageManager.getString("label.url:"),
147 UIManager.getString("OptionPane.inputDialogTitle", MessageManager.getLocale()),
148 JOptionPane.QUESTION_MESSAGE,
159 } catch (MalformedURLException ex)
161 JvOptionPane.showInternalMessageDialog(this,
162 MessageManager.getString("label.invalid_url"),
163 UIManager.getString("OptionPane.messageDialogTitle",
164 MessageManager.getLocale()),
165 JOptionPane.WARNING_MESSAGE);
171 // Button Action Listeners
172 private ActionListener newUrlAction = (ActionEvent e) -> {
173 final String input = showEditUrlDialog("");
177 statuses.add(discoverer.getStatusForUrl(input));
178 urlTableModel.fireTableRowsInserted(urls.size(), urls.size());
179 discoverer.setUrls(urls);
183 private ActionListener editUrlAction = (ActionEvent e) -> {
184 final int i = urlListTable.getSelectedRow();
187 final String input = showEditUrlDialog(urls.get(i));
191 statuses.set(i, discoverer.getStatusForUrl(input));
192 urlTableModel.fireTableRowsUpdated(i, i);
193 discoverer.setUrls(urls);
198 private ActionListener deleteUrlAction = (ActionEvent e) -> {
199 final int i = urlListTable.getSelectedRow();
204 urlTableModel.fireTableRowsDeleted(i, i);
205 discoverer.setUrls(urls);
209 private ActionListener moveUrlUpAction = (ActionEvent e) -> {
210 final int i = urlListTable.getSelectedRow();
213 moveTableRow(i, i - 1);
214 discoverer.setUrls(urls);
218 private ActionListener moveUrlDownAction = (ActionEvent e) -> {
219 final int i = urlListTable.getSelectedRow();
220 if (i >= 0 && i < urls.size() - 1)
222 moveTableRow(i, i + 1);
223 discoverer.setUrls(urls);
227 private MouseListener tableClickListener = new MouseAdapter()
229 final ActionEvent actionEvent = new ActionEvent(urlListTable,
230 ActionEvent.ACTION_PERFORMED, "edit");
233 public void mouseClicked(MouseEvent e)
235 if (e.getClickCount() > 1)
237 editUrlAction.actionPerformed(actionEvent);
242 // Setting up URL list Pane
244 Font font = new Font("Verdana", Font.PLAIN, 10);
245 JPanel urlPaneContainer = new JPanel(new BorderLayout(5, 5));
246 urlPaneContainer.setBorder(BorderFactory.createCompoundBorder(
247 BorderFactory.createTitledBorder(BorderFactory.createEtchedBorder(),
248 "Slivka Web Services"),
249 BorderFactory.createEmptyBorder(10, 5, 5, 5)));
251 newWsUrl.setFont(font);
252 editWsUrl.setFont(font);
253 deleteWsUrl.setFont(font);
254 moveUrlUp.setFont(font);
255 moveUrlDown.setFont(font);
256 JPanel editContainer = new JPanel();
257 editContainer.add(newWsUrl);
258 editContainer.add(editWsUrl);
259 editContainer.add(deleteWsUrl);
260 urlPaneContainer.add(editContainer, BorderLayout.PAGE_END);
262 JPanel moveContainer = new JPanel();
264 .setLayout(new BoxLayout(moveContainer, BoxLayout.PAGE_AXIS));
265 moveContainer.add(moveUrlUp);
266 moveContainer.add(Box.createRigidArea(new Dimension(0, 5)));
267 moveContainer.add(moveUrlDown);
268 urlPaneContainer.add(moveContainer, BorderLayout.LINE_START);
270 urlPaneContainer.add(new JScrollPane(urlListTable),
271 BorderLayout.CENTER);
272 this.add(urlPaneContainer);
274 // Connecting action listeners
275 urlListTable.addMouseListener(tableClickListener);
276 newWsUrl.addActionListener(newUrlAction);
277 editWsUrl.addActionListener(editUrlAction);
278 deleteWsUrl.addActionListener(deleteUrlAction);
279 moveUrlUp.addActionListener(moveUrlUpAction);
280 moveUrlDown.addActionListener(moveUrlDownAction);
283 private void moveTableRow(int fromIndex, int toIndex)
285 String url = urls.get(fromIndex);
286 int status = statuses.get(fromIndex);
287 urls.set(fromIndex, urls.get(toIndex));
288 statuses.set(fromIndex, statuses.get(toIndex));
289 urls.set(toIndex, url);
290 statuses.set(toIndex, status);
291 if (urlListTable.getSelectedRow() == fromIndex)
293 urlListTable.setRowSelectionInterval(toIndex, toIndex);
295 int firstRow = Math.min(toIndex, fromIndex);
296 int lastRow = Math.max(fromIndex, toIndex);
297 urlTableModel.fireTableRowsUpdated(firstRow, lastRow);
300 // Discoverer reloading buttons
301 JButton refreshServices = new JButton(
302 MessageManager.getString("action.refresh_services"));
304 JButton resetServices = new JButton(
305 MessageManager.getString("action.reset_services"));
307 JProgressBar progressBar = new JProgressBar();
309 // Discoverer buttons action listeners
310 private ActionListener refreshServicesAction = (ActionEvent e) -> {
311 progressBar.setVisible(true);
312 Cache.log.info("Requesting service reload");
313 discoverer.startDiscoverer().handle((_discoverer, exception) -> {
314 if (exception == null)
316 Cache.log.info("Reloading done");
320 Cache.log.error("Reloading failed", exception);
322 SwingUtilities.invokeLater(() -> progressBar.setVisible(false));
327 private ActionListener resetServicesAction = (ActionEvent e) -> {
328 discoverer.setUrls(null);
331 urls.addAll(discoverer.getUrls());
332 for (String url : urls)
334 statuses.add(discoverer.getStatusForUrl(url));
336 urlTableModel.fireTableDataChanged();
340 Font font = new Font("Verdana", Font.PLAIN, 11);
341 refreshServices.setFont(font);
342 resetServices.setFont(font);
343 JPanel container = new JPanel();
344 container.add(refreshServices);
345 container.add(resetServices);
348 // Connecting action listeners
349 refreshServices.addActionListener(refreshServicesAction);
350 resetServices.addActionListener(resetServicesAction);
354 progressBar.setVisible(false);
355 progressBar.setIndeterminate(true);
361 // Initial URLs loading
362 discoverer = SlivkaWSDiscoverer.getInstance();
363 urls.addAll(discoverer.getUrls());
364 for (String url : urls)
366 statuses.add(discoverer.getStatusForUrl(url));