7ca4fd5d94905b70b3d1a3498c7989afc7c89842
[jalview.git] / src / jalview / gui / WsPreferences.java
1 package jalview.gui;
2
3 import java.awt.BorderLayout;
4 import java.awt.event.ActionEvent;
5 import java.net.URL;
6 import java.util.Vector;
7
8 import javax.swing.JCheckBox;
9 import javax.swing.JLabel;
10 import javax.swing.JOptionPane;
11 import javax.swing.JPanel;
12 import javax.swing.JTextField;
13
14 import jalview.bin.Cache;
15 import jalview.jbgui.GWsPreferences;
16
17 public class WsPreferences extends GWsPreferences
18 {
19
20   public WsPreferences()
21   {
22     super();
23     initFromPreferences();
24   }
25
26   Vector<String> wsUrls,oldUrls;
27   private boolean needWsMenuUpdate;
28   private boolean oldJws1,oldJws2,oldIndexByHost,oldIndexByType,oldEnfin;
29   private void initFromPreferences()
30   {
31
32     wsUrls = jalview.ws.jws2.Jws2Discoverer.getServiceUrls();
33     if (wsUrls!=null) {
34       oldUrls = new Vector<String>(wsUrls);
35     } else {
36       oldUrls=null;
37       wsUrls=new Vector<String>();
38     }
39     updateList();
40     enableEnfinServices.setSelected(oldEnfin=Cache.getDefault(
41             "SHOW_ENFIN_SERVICES", true));
42     enableJws1Services.setSelected(oldJws1=Cache.getDefault("SHOW_JWS1_SERVICES",
43             true));
44     enableJws2Services.setSelected(oldJws2=Cache.getDefault("SHOW_JWS2_SERVICES",
45             true));
46     indexByHost.setSelected(oldIndexByHost=Cache.getDefault("WSMENU_BYHOST", true));
47     indexByType.setSelected(oldIndexByType=Cache.getDefault("WSMENU_BYTYPE", true));
48   }
49   private void updateList() {
50     wsList.setListData(wsUrls);
51   }
52   private void updateServiceList() {
53     jalview.ws.jws2.Jws2Discoverer.setServiceUrls(wsUrls);
54   }
55   /* (non-Javadoc)
56    * @see jalview.jbgui.GWsPreferences#deleteWsUrl_actionPerformed(java.awt.event.ActionEvent)
57    */
58   @Override
59   protected void deleteWsUrl_actionPerformed(ActionEvent e)
60   {
61     int sel = wsList.getSelectedIndex();
62     if (sel>-1)
63     {
64       wsUrls.removeElementAt(sel);
65       updateList();
66     }
67   }
68
69   /* (non-Javadoc)
70    * @see jalview.jbgui.GWsPreferences#editWsUrl_actionPerformed(java.awt.event.ActionEvent)
71    */
72   @Override
73   protected void editWsUrl_actionPerformed(ActionEvent e)
74   {
75     int sel = wsList.getSelectedIndex();
76     if (sel>-1)
77     {
78       String url=editUrl(wsUrls.elementAt(sel),"Edit JWS2 URL");
79       if (url!=null)
80       {
81         int present = wsUrls.indexOf(url);
82         if (present==-1)
83         {
84           wsUrls.setElementAt(url,sel);
85           updateList();
86         } else {
87           if (present!=sel)
88           {
89             wsUrls.removeElementAt(sel);
90             updateList();
91           }
92         }
93       }
94     }
95   }
96   
97   void updateWsMenuConfig(boolean old) {
98     if (old) {
99       wsUrls = (oldUrls==null) ? null : new Vector(oldUrls);
100     }
101     Cache.setProperty("SHOW_ENFIN_SERVICES", Boolean.valueOf(old ? oldEnfin : enableEnfinServices.isSelected()).toString());
102     Cache.setProperty("SHOW_JWS1_SERVICES", Boolean.valueOf(old ? oldJws1 : enableJws1Services.isSelected()).toString());
103     Cache.setProperty("SHOW_JWS2_SERVICES", Boolean.valueOf(old ? oldJws2 : enableJws2Services.isSelected()).toString());
104     Cache.setProperty("WSMENU_BYHOST", Boolean.valueOf(old ? oldIndexByHost : indexByHost.isSelected()).toString());
105     Cache.setProperty("WSMENU_BYTYPE", Boolean.valueOf(old ? oldIndexByType : indexByType.isSelected()).toString());
106     updateServiceList();
107   }
108   
109   /* (non-Javadoc)
110    * @see jalview.jbgui.GWsPreferences#moveWsUrlDown_actionPerformed(java.awt.event.ActionEvent)
111    */
112   @Override
113   protected void moveWsUrlDown_actionPerformed(ActionEvent e)
114   {
115     int p=wsList.getSelectedIndex();
116     if (p>-1 && p<wsUrls.size()-1)
117     {
118       String t = wsUrls.get(p+1);
119       wsUrls.setElementAt(wsUrls.elementAt(p), p+1);
120       wsUrls.setElementAt(t, p);
121       updateList();
122       wsList.setSelectedIndex(p+1);
123     }
124   }
125
126   /* (non-Javadoc)
127    * @see jalview.jbgui.GWsPreferences#moveWsUrlUp_actionPerformed(java.awt.event.ActionEvent)
128    */
129   @Override
130   protected void moveWsUrlUp_actionPerformed(ActionEvent e)
131   {
132     int p=wsList.getSelectedIndex();
133     if (p>0)
134     {
135       String t = wsUrls.get(p-1);
136       wsUrls.setElementAt(wsUrls.elementAt(p), p-1);
137       wsUrls.setElementAt(t, p);
138       updateList();
139       wsList.setSelectedIndex(p-1);
140     }
141   }
142
143   private String editUrl(String initUrl, String title)
144   {
145     String url=initUrl;
146     URL foo=null;
147     if (url==null)
148     {
149       url = "";
150     }
151     JTextField urltf = new JTextField(url, 40);
152     JPanel panel = new JPanel(new BorderLayout());
153     JPanel pane12 = new JPanel(new BorderLayout());
154     pane12.add(new JLabel("URL: "), BorderLayout.CENTER);
155     pane12.add(urltf, BorderLayout.EAST);
156     panel.add(pane12, BorderLayout.NORTH);
157     boolean valid=false;
158     int resp=JOptionPane.CANCEL_OPTION;
159     while (!valid && (resp=JOptionPane.showInternalConfirmDialog(Desktop.desktop, panel, title, JOptionPane.OK_CANCEL_OPTION))==JOptionPane.OK_OPTION)
160     {
161       try {
162         // TODO: do a better job of checking that the url is a valid discovery URL for web services.
163         foo = new URL(urltf.getText().trim());
164         valid = true;
165       } catch (Exception e)
166       {
167         valid = false;
168         JOptionPane.showInternalMessageDialog(Desktop.desktop, "Invalid URL !");
169       }
170     }
171     if (valid && resp==JOptionPane.OK_OPTION)
172     {
173       int validate = JOptionPane.showInternalConfirmDialog(Desktop.desktop, null, "Validate JabaWS Server ?\n(Look in console output for results)", JOptionPane.YES_NO_OPTION);
174       if (validate == JOptionPane.OK_OPTION)
175       {
176         if (jalview.ws.jws2.Jws2Discoverer.testServiceUrl(foo)) 
177         {
178           return foo.toString();
179         }
180       }
181     }
182     return initUrl; 
183   }
184   /* (non-Javadoc)
185    * @see jalview.jbgui.GWsPreferences#newWsUrl_actionPerformed(java.awt.event.ActionEvent)
186    */
187   @Override
188   protected void newWsUrl_actionPerformed(ActionEvent e)
189   {
190     String url=editUrl(null,"Add new JWS2 URL");
191     if (url!=null)
192     {
193       if (!wsUrls.contains(url))
194       {
195         int selind = wsList.getSelectedIndex();
196         if (selind>-1)
197         {
198           wsUrls.insertElementAt(url, selind);
199         } else {
200           wsUrls.addElement(url);
201         }
202         updateList();
203       }
204     }
205   }
206
207   /* (non-Javadoc)
208    * @see jalview.jbgui.GWsPreferences#refreshWs_actionPerformed(java.awt.event.ActionEvent)
209    */
210   @Override
211   protected void refreshWs_actionPerformed(ActionEvent e)
212   {
213     new Thread(new Runnable() {
214
215       @Override
216       public void run()
217       {
218         updateWsMenuConfig(false);
219         refreshWsMenu(true);
220       }      
221     }).start();
222     
223   }
224
225   protected void refreshWsMenu(boolean showProgress)
226   {
227     if (showProgress)
228     {
229       new Thread(new Runnable() {
230
231         @Override
232         public void run()
233         {
234           progressBar.setVisible(true);
235           validate();
236           progressBar.setIndeterminate(true);
237           Desktop.instance.startServiceDiscovery(true); // wait around for all threads to complete
238           progressBar.setIndeterminate(false);
239           progressBar.setVisible(false);
240           validate();
241         }      
242       }).start();
243       
244     } else {
245       new Thread(new Runnable() {
246
247         @Override
248         public void run()
249         {
250           Desktop.instance.startServiceDiscovery(false);
251         }
252         
253       }).start();
254     }
255   }
256
257   /* (non-Javadoc)
258    * @see jalview.jbgui.GWsPreferences#resetWs_actionPerformed(java.awt.event.ActionEvent)
259    */
260   @Override
261   protected void resetWs_actionPerformed(ActionEvent e)
262   {
263     jalview.ws.jws2.Jws2Discoverer.setServiceUrls(null);
264     wsUrls = jalview.ws.jws2.Jws2Discoverer.getServiceUrls(); 
265     updateList();
266   }
267   protected void ok_ActionPerformed(ActionEvent e) {
268     updateWsMenuConfig(false);
269     // todo: work out if the ws list needs updating ?
270     updateServiceList();
271     refreshWsMenu(false);
272   }
273 }