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.UIManager;
33 import javax.swing.table.AbstractTableModel;
34 import javax.swing.table.DefaultTableCellRenderer;
36 @SuppressWarnings("serial")
37 public class SlivkaPreferences extends JPanel
40 setLayout(new BoxLayout(this, BoxLayout.PAGE_AXIS));
41 setPreferredSize(new Dimension(500, 450));
44 WSDiscovererI discoverer;
46 private final ArrayList<String> urls = new ArrayList<>();
48 private final ArrayList<Integer> statuses = new ArrayList<>();
50 private final AbstractTableModel urlTableModel = new AbstractTableModel()
52 final String[] columnNames = { "Service URL", "Status" };
55 public String getColumnName(int col)
57 return columnNames[col];
61 public Object getValueAt(int rowIndex, int columnIndex)
66 return urls.get(rowIndex);
68 return statuses.get(rowIndex);
70 throw new NoSuchElementException();
75 public int getRowCount()
81 public int getColumnCount()
87 private class WSStatusCellRenderer extends DefaultTableCellRenderer
90 public Component getTableCellRendererComponent(JTable table,
91 Object value, boolean isSelected, boolean hasFocus, int row,
94 setHorizontalAlignment(CENTER);
95 super.getTableCellRendererComponent(table, "\u25CF", isSelected,
96 hasFocus, row, column);
97 switch ((Integer) value)
99 case WSDiscovererI.STATUS_NO_SERVICES:
100 setForeground(Color.ORANGE);
102 case WSDiscovererI.STATUS_OK:
103 setForeground(Color.GREEN);
105 case WSDiscovererI.STATUS_INVALID:
106 setForeground(Color.RED);
108 case WSDiscovererI.STATUS_UNKNOWN:
110 setForeground(Color.LIGHT_GRAY);
116 private JTable urlListTable = new JTable(urlTableModel);
118 urlListTable.getColumnModel().getColumn(1).setMaxWidth(60);
119 urlListTable.getColumnModel().getColumn(1)
120 .setCellRenderer(new WSStatusCellRenderer());
123 // URL control panel buttons
124 JButton newWsUrl = new JButton(
125 MessageManager.getString("label.new_service_url"));
127 JButton editWsUrl = new JButton(
128 MessageManager.getString("label.edit_service_url"));
130 JButton deleteWsUrl = new JButton(
131 MessageManager.getString("label.delete_service_url"));
133 JButton moveUrlUp = new JButton(
134 MessageManager.getString("action.move_up"));
136 JButton moveUrlDown = new JButton(
137 MessageManager.getString("action.move_down"));
139 private String showEditUrlDialog(String oldUrl)
141 String input = (String) JOptionPane
142 .showInternalInputDialog(
144 MessageManager.getString("label.url:"),
145 UIManager.getString("OptionPane.inputDialogTitle", MessageManager.getLocale()),
146 JOptionPane.QUESTION_MESSAGE,
157 } catch (MalformedURLException ex)
159 JOptionPane.showMessageDialog(this,
160 MessageManager.getString("label.invalid_url"), "Warning",
161 JOptionPane.WARNING_MESSAGE);
167 // Button Action Listeners
168 private ActionListener newUrlAction = (ActionEvent e) -> {
169 final String input = showEditUrlDialog("");
173 statuses.add(discoverer.getServerStatusFor(input));
174 urlTableModel.fireTableRowsInserted(urls.size(), urls.size());
175 discoverer.setServiceUrls(urls);
179 private ActionListener editUrlAction = (ActionEvent e) -> {
180 final int i = urlListTable.getSelectedRow();
183 final String input = showEditUrlDialog(urls.get(i));
187 statuses.set(i, discoverer.getServerStatusFor(input));
188 urlTableModel.fireTableRowsUpdated(i, i);
189 discoverer.setServiceUrls(urls);
194 private ActionListener deleteUrlAction = (ActionEvent e) -> {
195 final int i = urlListTable.getSelectedRow();
200 urlTableModel.fireTableRowsDeleted(i, i);
201 discoverer.setServiceUrls(urls);
205 private ActionListener moveUrlUpAction = (ActionEvent e) -> {
206 int i = urlListTable.getSelectedRow();
209 moveTableRow(i, i - 1);
210 discoverer.setServiceUrls(urls);
214 private ActionListener moveUrlDownAction = (ActionEvent e) -> {
215 int i = urlListTable.getSelectedRow();
216 if (i >= 0 && i < urls.size() - 1)
218 moveTableRow(i, i + 1);
219 discoverer.setServiceUrls(urls);
223 private MouseListener tableClickListener = new MouseAdapter()
225 final ActionEvent actionEvent = new ActionEvent(urlListTable,
226 ActionEvent.ACTION_PERFORMED, "edit");
229 public void mouseClicked(MouseEvent e)
231 if (e.getClickCount() > 1)
233 editUrlAction.actionPerformed(actionEvent);
238 // Setting up URL list Pane
240 Font font = new Font("Verdana", Font.PLAIN, 10);
241 JPanel urlPaneContainer = new JPanel(new BorderLayout(5, 5));
242 urlPaneContainer.setBorder(BorderFactory.createCompoundBorder(
243 BorderFactory.createTitledBorder(BorderFactory.createEtchedBorder(),
244 "Slivka Web Services"),
245 BorderFactory.createEmptyBorder(10, 5, 5, 5)));
247 newWsUrl.setFont(font);
248 editWsUrl.setFont(font);
249 deleteWsUrl.setFont(font);
250 moveUrlUp.setFont(font);
251 moveUrlDown.setFont(font);
252 JPanel editContainer = new JPanel();
253 editContainer.add(newWsUrl);
254 editContainer.add(editWsUrl);
255 editContainer.add(deleteWsUrl);
256 urlPaneContainer.add(editContainer, BorderLayout.PAGE_END);
258 JPanel moveContainer = new JPanel();
260 .setLayout(new BoxLayout(moveContainer, BoxLayout.PAGE_AXIS));
261 moveContainer.add(moveUrlUp);
262 moveContainer.add(Box.createRigidArea(new Dimension(0, 5)));
263 moveContainer.add(moveUrlDown);
264 urlPaneContainer.add(moveContainer, BorderLayout.LINE_START);
266 urlPaneContainer.add(new JScrollPane(urlListTable),
267 BorderLayout.CENTER);
268 this.add(urlPaneContainer);
270 // Connecting action listeners
271 urlListTable.addMouseListener(tableClickListener);
272 newWsUrl.addActionListener(newUrlAction);
273 editWsUrl.addActionListener(editUrlAction);
274 deleteWsUrl.addActionListener(deleteUrlAction);
275 moveUrlUp.addActionListener(moveUrlUpAction);
276 moveUrlDown.addActionListener(moveUrlDownAction);
279 private void moveTableRow(int fromIndex, int toIndex)
281 String url = urls.get(fromIndex);
282 int status = statuses.get(fromIndex);
283 urls.set(fromIndex, urls.get(toIndex));
284 statuses.set(fromIndex, statuses.get(toIndex));
285 urls.set(toIndex, url);
286 statuses.set(toIndex, status);
287 if (urlListTable.getSelectedRow() == fromIndex)
289 urlListTable.setRowSelectionInterval(toIndex, toIndex);
291 int firstRow = Math.min(toIndex, fromIndex);
292 int lastRow = Math.max(fromIndex, toIndex);
293 urlTableModel.fireTableRowsUpdated(firstRow, lastRow);
296 // Discoverer reloading buttons
297 JButton refreshServices = new JButton(
298 MessageManager.getString("action.refresh_services"));
300 JButton resetServices = new JButton(
301 MessageManager.getString("action.reset_services"));
303 JProgressBar progressBar = new JProgressBar();
305 // Discoverer buttons action listeners
306 private ActionListener refreshServicesAction = (ActionEvent e) -> {
308 progressBar.setVisible(true);
309 Cache.log.info("Requesting service reload");
310 Desktop.instance.startServiceDiscovery(discoverer, true);
311 Cache.log.info("Reloading done");
312 progressBar.setVisible(false);
316 private ActionListener resetServicesAction = (ActionEvent e) -> {
317 discoverer.setServiceUrls(null);
320 urls.addAll(discoverer.getServiceUrls());
321 for (String url : urls)
323 statuses.add(discoverer.getServerStatusFor(url));
325 urlTableModel.fireTableDataChanged();
329 Font font = new Font("Verdana", Font.PLAIN, 11);
330 refreshServices.setFont(font);
331 resetServices.setFont(font);
332 JPanel container = new JPanel();
333 container.add(refreshServices);
334 container.add(resetServices);
337 // Connecting action listeners
338 refreshServices.addActionListener(refreshServicesAction);
339 resetServices.addActionListener(resetServicesAction);
343 progressBar.setVisible(false);
344 progressBar.setIndeterminate(true);
350 // Initial URLs loading
351 discoverer = SlivkaWSDiscoverer.getInstance();
352 urls.addAll(discoverer.getServiceUrls());
353 for (String url : urls)
355 statuses.add(discoverer.getServerStatusFor(url));