applied 2009 GPL license
[jalview.git] / src / jalview / gui / DasSourceBrowser.java
1 /*\r
2  * Jalview - A Sequence Alignment Editor and Viewer (Version 2.4.0.b2)\r
3  * Copyright (C) 2009 AM Waterhouse, J Procter, G Barton, M Clamp, S Searle\r
4  * \r
5  * This program is free software; you can redistribute it and/or\r
6  * modify it under the terms of the GNU General Public License\r
7  * as published by the Free Software Foundation; either version 2\r
8  * of the License, or (at your option) any later version.\r
9  * \r
10  * This program is distributed in the hope that it will be useful,\r
11  * but WITHOUT ANY WARRANTY; without even the implied warranty of\r
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r
13  * GNU General Public License for more details.\r
14  * \r
15  * You should have received a copy of the GNU General Public License\r
16  * along with this program; if not, write to the Free Software\r
17  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA\r
18  */\r
19 package jalview.gui;\r
20 \r
21 import java.util.*;\r
22 \r
23 import java.awt.*;\r
24 import java.awt.event.*;\r
25 import javax.swing.*;\r
26 import javax.swing.event.*;\r
27 import javax.swing.table.*;\r
28 \r
29 import org.biojava.dasobert.dasregistry.*;\r
30 import jalview.jbgui.*;\r
31 import jalview.util.*;\r
32 \r
33 public class DasSourceBrowser extends GDasSourceBrowser implements\r
34         Runnable, ListSelectionListener\r
35 {\r
36   static DasSource[] dasSources = null;\r
37 \r
38   Hashtable localSources = null;\r
39 \r
40   Vector selectedSources;\r
41 \r
42   public static String DEFAULT_REGISTRY = "http://www.dasregistry.org/das1/sources/";\r
43 \r
44   /**\r
45    * true if thread is running and we are talking to DAS registry service\r
46    */\r
47   public boolean loadingDasSources = false;\r
48 \r
49   protected static String getDasRegistryURL()\r
50   {\r
51     String registry = jalview.bin.Cache.getDefault("DAS_REGISTRY_URL",\r
52             DEFAULT_REGISTRY);\r
53 \r
54     if (registry.indexOf("/registry/das1/sources/") > -1)\r
55     {\r
56       jalview.bin.Cache.setProperty("DAS_REGISTRY_URL", DEFAULT_REGISTRY);\r
57       registry = DEFAULT_REGISTRY;\r
58     }\r
59     return registry;\r
60   }\r
61 \r
62   public DasSourceBrowser()\r
63   {\r
64     String registry = getDasRegistryURL();\r
65 \r
66     registryURL.setText(registry);\r
67 \r
68     setSelectedFromProperties();\r
69 \r
70     displayFullDetails(null);\r
71     table.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);\r
72 \r
73     filter1.addListSelectionListener(this);\r
74     filter2.addListSelectionListener(this);\r
75     filter3.addListSelectionListener(this);\r
76 \r
77     // Ask to be notified of selection changes.\r
78     ListSelectionModel rowSM = table.getSelectionModel();\r
79     rowSM.addListSelectionListener(new ListSelectionListener()\r
80     {\r
81       public void valueChanged(ListSelectionEvent e)\r
82       {\r
83         ListSelectionModel lsm = (ListSelectionModel) e.getSource();\r
84         if (!lsm.isSelectionEmpty())\r
85         {\r
86           int selectedRow = lsm.getMinSelectionIndex();\r
87           displayFullDetails(table.getValueAt(selectedRow, 0).toString());\r
88         }\r
89       }\r
90     });\r
91 \r
92     table.addMouseListener(new MouseAdapter()\r
93     {\r
94       public void mouseClicked(MouseEvent evt)\r
95       {\r
96         if (evt.getClickCount() == 2\r
97                 || SwingUtilities.isRightMouseButton(evt))\r
98         {\r
99           editRemoveLocalSource(evt);\r
100         }\r
101       }\r
102     });\r
103 \r
104     if (dasSources != null)\r
105     {\r
106       init();\r
107     }\r
108   }\r
109 \r
110   public void paintComponent(java.awt.Graphics g)\r
111   {\r
112     if (dasSources == null && !loadingDasSources)\r
113     {\r
114       Thread worker = new Thread(this);\r
115       worker.start();\r
116     }\r
117   }\r
118 \r
119   void init()\r
120   {\r
121     int dSize = dasSources.length;\r
122     Object[][] data = new Object[dSize][2];\r
123     for (int i = 0; i < dSize; i++)\r
124     {\r
125       data[i][0] = dasSources[i].getNickname();\r
126       data[i][1] = new Boolean(selectedSources.contains(dasSources[i]\r
127               .getNickname()));\r
128     }\r
129 \r
130     refreshTableData(data);\r
131     setCapabilities(dasSources);\r
132 \r
133     javax.swing.SwingUtilities.invokeLater(new Runnable()\r
134     {\r
135       public void run()\r
136       {\r
137         TableSorter sorter = (TableSorter) table.getModel();\r
138         sorter.setSortingStatus(1, TableSorter.DESCENDING);\r
139         sorter.setSortingStatus(1, TableSorter.NOT_SORTED);\r
140       }\r
141     });\r
142 \r
143     progressBar.setIndeterminate(false);\r
144     progressBar.setVisible(false);\r
145     addLocal.setVisible(true);\r
146     refresh.setVisible(true);\r
147   }\r
148 \r
149   public void refreshTableData(Object[][] data)\r
150   {\r
151     TableSorter sorter = new TableSorter(new DASTableModel(data));\r
152     sorter.setTableHeader(table.getTableHeader());\r
153     table.setModel(sorter);\r
154   }\r
155 \r
156   void displayFullDetails(String nickName)\r
157   {\r
158 \r
159     StringBuffer text = new StringBuffer(\r
160             "<HTML><font size=\"2\" face=\"Verdana, Arial, Helvetica, sans-serif\">");\r
161 \r
162     if (nickName == null)\r
163     {\r
164       fullDetails.setText(text + "Select a DAS service from the table"\r
165               + " to read a full description here.</font></html>");\r
166       return;\r
167     }\r
168 \r
169     int dSize = dasSources.length;\r
170     for (int i = 0; i < dSize; i++)\r
171     {\r
172       if (!dasSources[i].getNickname().equals(nickName))\r
173       {\r
174         continue;\r
175       }\r
176 \r
177       DasSource ds = dasSources[i];\r
178 \r
179       text.append("<font color=\"#0000FF\">Id:</font> "\r
180               + dasSources[i].getId() + "<br>");\r
181       text.append("<font color=\"#0000FF\">Nickname:</font> "\r
182               + dasSources[i].getNickname() + "<br>");\r
183       text.append("<font color=\"#0000FF\">URL:</font> "\r
184               + dasSources[i].getUrl() + "<br>");\r
185 \r
186       text\r
187               .append("<font color=\"#0000FF\">Admin Email:</font> <a href=\"mailto:"\r
188                       + dasSources[i].getAdminemail()\r
189                       + "\">"\r
190                       + dasSources[i].getAdminemail() + "</a>" + "<br>");\r
191 \r
192       text.append("<font color=\"#0000FF\">Registered at:</font> "\r
193               + dasSources[i].getRegisterDate() + "<br>");\r
194 \r
195       text.append("<font color=\"#0000FF\">Last successful test:</font> "\r
196               + dasSources[i].getLeaseDate() + "<br>");\r
197 \r
198       text.append("<font color=\"#0000FF\">Labels:</font> ");\r
199       for (int s = 0; s < dasSources[i].getLabels().length; s++)\r
200       {\r
201         text.append(dasSources[i].getLabels()[s]);\r
202         if (s < dasSources[i].getLabels().length - 1)\r
203         {\r
204           text.append(",");\r
205         }\r
206         text.append(" ");\r
207       }\r
208       text.append("<br>");\r
209 \r
210       text.append("<font color=\"#0000FF\">Capabilities:</font> ");\r
211       String[] scap = dasSources[i].getCapabilities();\r
212       for (int j = 0; j < scap.length; j++)\r
213       {\r
214         text.append(scap[j]);\r
215         if (j < scap.length - 1)\r
216         {\r
217           text.append(", ");\r
218         }\r
219       }\r
220       text.append("<br>");\r
221 \r
222       text.append("<font color=\"#0000FF\">Coordinates:</font> ");\r
223       DasCoordinateSystem[] dcs = ds.getCoordinateSystem();\r
224       for (int j = 0; j < dcs.length; j++)\r
225       {\r
226         text.append("(" + dcs[j].getUniqueId() + ") "\r
227                 + dcs[j].getCategory() + ", " + dcs[j].getName());\r
228         if (dcs[j].getNCBITaxId() != 0)\r
229         {\r
230           text.append(", " + dcs[j].getNCBITaxId());\r
231         }\r
232         if (dcs[j].getOrganismName().length() > 0)\r
233         {\r
234           text.append(", " + dcs[j].getOrganismName());\r
235         }\r
236 \r
237         text.append("<br>");\r
238       }\r
239 \r
240       text.append("<font color=\"#0000FF\">Description:</font> "\r
241               + dasSources[i].getDescription() + "<br>");\r
242 \r
243       if (dasSources[i].getHelperurl() != null\r
244               && dasSources[i].getHelperurl().length() > 0)\r
245       {\r
246         text.append("<font color=\"#0000FF\"><a href=\""\r
247                 + dasSources[i].getHelperurl()\r
248                 + "\">Go to site</a></font<br>");\r
249       }\r
250 \r
251       text.append("</font></html>");\r
252 \r
253       break;\r
254     }\r
255 \r
256     fullDetails.setText(text.toString());\r
257     javax.swing.SwingUtilities.invokeLater(new Runnable()\r
258     {\r
259       public void run()\r
260       {\r
261         fullDetailsScrollpane.getVerticalScrollBar().setValue(0);\r
262       }\r
263     });\r
264   }\r
265 \r
266   public void run()\r
267   {\r
268     loadingDasSources = true;\r
269 \r
270     addLocal.setVisible(false);\r
271     refresh.setVisible(false);\r
272     progressBar.setVisible(true);\r
273     progressBar.setIndeterminate(true);\r
274     // Refresh the source list.\r
275     dasSources = null;\r
276     getDASSource();\r
277 \r
278     init();\r
279 \r
280     loadingDasSources = false;\r
281 \r
282   }\r
283 \r
284   public Vector getSelectedSources()\r
285   {\r
286     Vector selected = new Vector();\r
287     for (int r = 0; r < selectedSources.size(); r++)\r
288     {\r
289       for (int i = 0; i < dasSources.length; i++)\r
290       {\r
291         if (dasSources[i].getNickname()\r
292                 .equals(selectedSources.elementAt(r)))\r
293         {\r
294           selected.addElement(dasSources[i]);\r
295           break;\r
296         }\r
297       }\r
298     }\r
299 \r
300     return selected;\r
301   }\r
302 \r
303   /**\r
304    * retrieve das sources from registry and add local source list\r
305    * \r
306    * @return\r
307    */\r
308   public DasSource[] getDASSource()\r
309   {\r
310     if (dasSources == null)\r
311     {\r
312       dasSources = jalview.ws.DasSequenceFeatureFetcher.getDASSources();\r
313       appendLocalSources();\r
314     }\r
315 \r
316     return dasSources;\r
317   }\r
318 \r
319   public void refresh_actionPerformed(ActionEvent e)\r
320   {\r
321     saveProperties(jalview.bin.Cache.applicationProperties);\r
322 \r
323     Thread worker = new Thread(this);\r
324     worker.start();\r
325   }\r
326 \r
327   private void setCapabilities(DasSource[] sources)\r
328   {\r
329     Vector authority = new Vector();\r
330     Vector type = new Vector();\r
331     Vector label = new Vector();\r
332 \r
333     authority.addElement("Any");\r
334     type.addElement("Any");\r
335     label.addElement("Any");\r
336 \r
337     for (int i = 0; i < sources.length; i++)\r
338     {\r
339       DasSource ds = sources[i];\r
340 \r
341       DasCoordinateSystem[] dcs = ds.getCoordinateSystem();\r
342 \r
343       for (int j = 0; j < dcs.length; j++)\r
344       {\r
345         if (!type.contains(dcs[j].getCategory()))\r
346         {\r
347           type.addElement(dcs[j].getCategory());\r
348         }\r
349 \r
350         if (!authority.contains(dcs[j].getName()))\r
351         {\r
352           authority.addElement(dcs[j].getName());\r
353         }\r
354       }\r
355 \r
356       String[] slabels = ds.getLabels();\r
357       for (int s = 0; s < slabels.length; s++)\r
358       {\r
359         if (!label.contains(slabels[s]))\r
360         {\r
361           label.addElement(slabels[s]);\r
362         }\r
363       }\r
364 \r
365     }\r
366 \r
367     filter1.setListData(authority);\r
368     filter2.setListData(type);\r
369     filter3.setListData(label);\r
370 \r
371     javax.swing.SwingUtilities.invokeLater(new Runnable()\r
372     {\r
373       public void run()\r
374       {\r
375         filter1.setSelectedIndex(0);\r
376         filter2.setSelectedIndex(0);\r
377         filter3.setSelectedIndex(0);\r
378       }\r
379     });\r
380   }\r
381 \r
382   public void amendLocal(boolean newSource)\r
383   {\r
384     String url = "http://localhost:8080/", nickname = "";\r
385 \r
386     if (!newSource)\r
387     {\r
388       int selectedRow = table.getSelectionModel().getMinSelectionIndex();\r
389       nickname = table.getValueAt(selectedRow, 0).toString();\r
390       url = ((DasSource) localSources.get(nickname)).getUrl();\r
391     }\r
392 \r
393     JTextField nametf = new JTextField(nickname, 40);\r
394     JTextField urltf = new JTextField(url, 40);\r
395 \r
396     JPanel panel = new JPanel(new BorderLayout());\r
397     JPanel pane12 = new JPanel(new BorderLayout());\r
398     pane12.add(new JLabel("Nickname: "), BorderLayout.CENTER);\r
399     pane12.add(nametf, BorderLayout.EAST);\r
400     panel.add(pane12, BorderLayout.NORTH);\r
401     pane12 = new JPanel(new BorderLayout());\r
402     pane12.add(new JLabel("URL: "), BorderLayout.CENTER);\r
403     pane12.add(urltf, BorderLayout.EAST);\r
404     panel.add(pane12, BorderLayout.SOUTH);\r
405 \r
406     int reply = JOptionPane.showInternalConfirmDialog(Desktop.desktop,\r
407             panel, "Enter Nickname & URL of Local DAS Source",\r
408             JOptionPane.OK_CANCEL_OPTION);\r
409 \r
410     if (reply != JOptionPane.OK_OPTION)\r
411     {\r
412       return;\r
413     }\r
414 \r
415     if (!urltf.getText().endsWith("/"))\r
416     {\r
417       urltf.setText(urltf.getText() + "/");\r
418     }\r
419 \r
420     Das1Source local = new Das1Source();\r
421 \r
422     local.setUrl(urltf.getText());\r
423     local.setNickname(nametf.getText());\r
424 \r
425     if (localSources == null)\r
426     {\r
427       localSources = new Hashtable();\r
428     }\r
429 \r
430     localSources.put(local.getNickname(), local);\r
431 \r
432     if (!newSource && !nickname.equals(nametf.getText()))\r
433     {\r
434       localSources.remove(nickname);\r
435     }\r
436 \r
437     int size = dasSources.length;\r
438     int adjust = newSource ? 1 : 0;\r
439 \r
440     Object[][] data = new Object[size + adjust][2];\r
441     for (int i = 0; i < size; i++)\r
442     {\r
443       if (!newSource && dasSources[i].getNickname().equals(nickname))\r
444       {\r
445         ((DasSource) dasSources[i]).setNickname(local.getNickname());\r
446         ((DasSource) dasSources[i]).setUrl(local.getUrl());\r
447         data[i][0] = local.getNickname();\r
448         data[i][1] = new Boolean(true);\r
449       }\r
450       else\r
451       {\r
452         data[i][0] = dasSources[i].getNickname();\r
453         data[i][1] = new Boolean(selectedSources.contains(dasSources[i]\r
454                 .getNickname()));\r
455       }\r
456     }\r
457 \r
458     if (newSource)\r
459     {\r
460       data[size][0] = local.getNickname();\r
461       data[size][1] = new Boolean(true);\r
462       selectedSources.add(local.getNickname());\r
463     }\r
464 \r
465     DasSource[] tmp = new DasSource[size + adjust];\r
466 \r
467     System.arraycopy(dasSources, 0, tmp, 0, size);\r
468 \r
469     if (newSource)\r
470     {\r
471       tmp[size] = local;\r
472     }\r
473 \r
474     dasSources = tmp;\r
475 \r
476     refreshTableData(data);\r
477 \r
478     SwingUtilities.invokeLater(new Runnable()\r
479     {\r
480       public void run()\r
481       {\r
482         scrollPane.getVerticalScrollBar().setValue(\r
483                 scrollPane.getVerticalScrollBar().getMaximum());\r
484       }\r
485     });\r
486 \r
487     displayFullDetails(local.getNickname());\r
488   }\r
489 \r
490   public void editRemoveLocalSource(MouseEvent evt)\r
491   {\r
492     int selectedRow = table.getSelectionModel().getMinSelectionIndex();\r
493     if (selectedRow == -1)\r
494     {\r
495       return;\r
496     }\r
497 \r
498     String nickname = table.getValueAt(selectedRow, 0).toString();\r
499 \r
500     if (!localSources.containsKey(nickname))\r
501     {\r
502       JOptionPane.showInternalMessageDialog(Desktop.desktop,\r
503               "You can only edit or remove local DAS Sources!",\r
504               "Public DAS source - not editable",\r
505               JOptionPane.WARNING_MESSAGE);\r
506       return;\r
507     }\r
508 \r
509     Object[] options =\r
510     { "Edit", "Remove", "Cancel" };\r
511     int choice = JOptionPane.showInternalOptionDialog(Desktop.desktop,\r
512             "Do you want to edit or remove " + nickname + "?",\r
513             "Edit / Remove Local DAS Source",\r
514             JOptionPane.YES_NO_CANCEL_OPTION, JOptionPane.QUESTION_MESSAGE,\r
515             null, options, options[2]);\r
516 \r
517     switch (choice)\r
518     {\r
519     case 0:\r
520       amendLocal(false);\r
521       break;\r
522     case 1:\r
523       localSources.remove(nickname);\r
524       selectedSources.remove(nickname);\r
525       Object[][] data = new Object[dasSources.length - 1][2];\r
526       DasSource[] tmp = new DasSource[dasSources.length - 1];\r
527       int index = 0;\r
528       for (int i = 0; i < dasSources.length; i++)\r
529       {\r
530         if (dasSources[i].getNickname().equals(nickname))\r
531         {\r
532           continue;\r
533         }\r
534         else\r
535         {\r
536           tmp[index] = dasSources[i];\r
537           data[index][0] = dasSources[i].getNickname();\r
538           data[index][1] = new Boolean(selectedSources\r
539                   .contains(dasSources[i].getNickname()));\r
540           index++;\r
541         }\r
542       }\r
543       dasSources = tmp;\r
544       refreshTableData(data);\r
545       SwingUtilities.invokeLater(new Runnable()\r
546       {\r
547         public void run()\r
548         {\r
549           scrollPane.getVerticalScrollBar().setValue(\r
550                   scrollPane.getVerticalScrollBar().getMaximum());\r
551         }\r
552       });\r
553 \r
554       break;\r
555     }\r
556   }\r
557 \r
558   void appendLocalSources()\r
559   {\r
560     if (localSources == null)\r
561     {\r
562       return;\r
563     }\r
564 \r
565     int size = dasSources != null ? dasSources.length : 0;\r
566     int lsize = localSources.size();\r
567 \r
568     Object[][] data = new Object[size + lsize][2];\r
569     for (int i = 0; i < size; i++)\r
570     {\r
571       data[i][0] = dasSources[i].getNickname();\r
572       data[i][1] = new Boolean(selectedSources.contains(dasSources[i]\r
573               .getNickname()));\r
574     }\r
575 \r
576     DasSource[] tmp = new DasSource[size + lsize];\r
577     if (dasSources != null)\r
578     {\r
579       System.arraycopy(dasSources, 0, tmp, 0, size);\r
580     }\r
581 \r
582     Enumeration en = localSources.keys();\r
583     int index = size;\r
584     while (en.hasMoreElements())\r
585     {\r
586       String key = en.nextElement().toString();\r
587       data[index][0] = key;\r
588       data[index][1] = new Boolean(false);\r
589       tmp[index] = new Das1Source();\r
590       tmp[index].setNickname(key);\r
591       tmp[index].setUrl(((DasSource) localSources.get(key)).getUrl());\r
592 \r
593       index++;\r
594     }\r
595 \r
596     dasSources = tmp;\r
597 \r
598     refreshTableData(data);\r
599   }\r
600 \r
601   public void valueChanged(ListSelectionEvent evt)\r
602   {\r
603     // Called when the MainTable selection changes\r
604     if (evt.getValueIsAdjusting())\r
605     {\r
606       return;\r
607     }\r
608 \r
609     displayFullDetails(null);\r
610 \r
611     // Filter the displayed data sources\r
612     int dSize = dasSources.length;\r
613 \r
614     ArrayList names = new ArrayList();\r
615     ArrayList selected = new ArrayList();\r
616     DasSource ds;\r
617 \r
618     // The features filter is not visible, but we must still\r
619     // filter the das source list here.\r
620     // July 2006 - only 6 sources fo not serve features\r
621     Object[] dummyFeatureList = new Object[]\r
622     { "features" };\r
623 \r
624     for (int i = 0; i < dSize; i++)\r
625     {\r
626       ds = dasSources[i];\r
627       DasCoordinateSystem[] dcs = ds.getCoordinateSystem();\r
628 \r
629       if (dcs.length == 0 && ds.getCapabilities().length == 0\r
630               && filter1.getSelectedIndex() == 0\r
631               && filter2.getSelectedIndex() == 0\r
632               && filter3.getSelectedIndex() == 0)\r
633       {\r
634         // THIS IS A FIX FOR LOCAL SOURCES WHICH DO NOT\r
635         // HAVE COORDINATE SYSTEMS, INFO WHICH AT PRESENT\r
636         // IS ADDED FROM THE REGISTRY\r
637         names.add(ds.getNickname());\r
638         selected\r
639                 .add(new Boolean(selectedSources.contains(ds.getNickname())));\r
640         continue;\r
641       }\r
642 \r
643       if (!selectedInList(dummyFeatureList, ds.getCapabilities())\r
644               || !selectedInList(filter3.getSelectedValues(), ds\r
645                       .getLabels()))\r
646       {\r
647         continue;\r
648       }\r
649 \r
650       for (int j = 0; j < dcs.length; j++)\r
651       {\r
652         if (selectedInList(filter1.getSelectedValues(), new String[]\r
653         { dcs[j].getName() })\r
654                 && selectedInList(filter2.getSelectedValues(), new String[]\r
655                 { dcs[j].getCategory() }))\r
656         {\r
657           names.add(ds.getNickname());\r
658           selected.add(new Boolean(selectedSources.contains(ds\r
659                   .getNickname())));\r
660           break;\r
661         }\r
662       }\r
663     }\r
664 \r
665     dSize = names.size();\r
666     Object[][] data = new Object[dSize][2];\r
667     for (int d = 0; d < dSize; d++)\r
668     {\r
669       data[d][0] = names.get(d);\r
670       data[d][1] = selected.get(d);\r
671     }\r
672 \r
673     refreshTableData(data);\r
674   }\r
675 \r
676   boolean selectedInList(Object[] selection, String[] items)\r
677   {\r
678     for (int i = 0; i < selection.length; i++)\r
679     {\r
680       if (selection[i].equals("Any"))\r
681       {\r
682         return true;\r
683       }\r
684 \r
685       for (int j = 0; j < items.length; j++)\r
686       {\r
687         if (selection[i].equals(items[j]))\r
688         {\r
689           return true;\r
690         }\r
691       }\r
692     }\r
693 \r
694     return false;\r
695   }\r
696 \r
697   void setSelectedFromProperties()\r
698   {\r
699     String active = jalview.bin.Cache.getDefault("DAS_ACTIVE_SOURCE",\r
700             "uniprot");\r
701     StringTokenizer st = new StringTokenizer(active, "\t");\r
702     selectedSources = new Vector();\r
703     while (st.hasMoreTokens())\r
704     {\r
705       selectedSources.addElement(st.nextToken());\r
706     }\r
707 \r
708     String local = jalview.bin.Cache.getProperty("DAS_LOCAL_SOURCE");\r
709     if (local != null)\r
710     {\r
711       if (localSources == null)\r
712       {\r
713         localSources = new Hashtable();\r
714       }\r
715 \r
716       st = new StringTokenizer(local, "\t");\r
717       while (st.hasMoreTokens())\r
718       {\r
719         String token = st.nextToken();\r
720         int bar = token.indexOf("|");\r
721         Das1Source source = new Das1Source();\r
722 \r
723         source.setUrl(token.substring(bar + 1));\r
724         source.setNickname(token.substring(0, bar));\r
725 \r
726         localSources.put(source.getNickname(), source);\r
727       }\r
728     }\r
729   }\r
730 \r
731   public void reset_actionPerformed(ActionEvent e)\r
732   {\r
733     registryURL.setText(DEFAULT_REGISTRY);\r
734   }\r
735 \r
736   public void saveProperties(Properties properties)\r
737   {\r
738     if (registryURL.getText() == null || registryURL.getText().length() < 1)\r
739     {\r
740       properties.remove("DAS_REGISTRY_URL");\r
741     }\r
742     else\r
743     {\r
744       properties.setProperty("DAS_REGISTRY_URL", registryURL.getText());\r
745     }\r
746 \r
747     StringBuffer sb = new StringBuffer();\r
748     for (int r = 0; r < table.getModel().getRowCount(); r++)\r
749     {\r
750       if (((Boolean) table.getValueAt(r, 1)).booleanValue())\r
751       {\r
752         sb.append(table.getValueAt(r, 0) + "\t");\r
753       }\r
754     }\r
755 \r
756     properties.setProperty("DAS_ACTIVE_SOURCE", sb.toString());\r
757 \r
758     if (localSources != null)\r
759     {\r
760       sb = new StringBuffer();\r
761       Enumeration en = localSources.keys();\r
762       while (en.hasMoreElements())\r
763       {\r
764         String token = en.nextElement().toString();\r
765         sb.append(token + "|"\r
766                 + ((DasSource) localSources.get(token)).getUrl() + "\t");\r
767       }\r
768 \r
769       properties.setProperty("DAS_LOCAL_SOURCE", sb.toString());\r
770     }\r
771 \r
772   }\r
773 \r
774   class DASTableModel extends AbstractTableModel\r
775   {\r
776 \r
777     public DASTableModel(Object[][] data)\r
778     {\r
779       this.data = data;\r
780     }\r
781 \r
782     private String[] columnNames = new String[]\r
783     { "Nickname", "Use Source" };\r
784 \r
785     private Object[][] data;\r
786 \r
787     public int getColumnCount()\r
788     {\r
789       return columnNames.length;\r
790     }\r
791 \r
792     public int getRowCount()\r
793     {\r
794       return data.length;\r
795     }\r
796 \r
797     public String getColumnName(int col)\r
798     {\r
799       return columnNames[col];\r
800     }\r
801 \r
802     public Object getValueAt(int row, int col)\r
803     {\r
804       return data[row][col];\r
805     }\r
806 \r
807     /*\r
808      * JTable uses this method to determine the default renderer/ editor for\r
809      * each cell. If we didn't implement this method, then the last column would\r
810      * contain text ("true"/"false"), rather than a check box.\r
811      */\r
812     public Class getColumnClass(int c)\r
813     {\r
814       return getValueAt(0, c).getClass();\r
815     }\r
816 \r
817     /*\r
818      * Don't need to implement this method unless your table's editable.\r
819      */\r
820     public boolean isCellEditable(int row, int col)\r
821     {\r
822       // Note that the data/cell address is constant,\r
823       // no matter where the cell appears onscreen.\r
824       return col == 1;\r
825 \r
826     }\r
827 \r
828     /*\r
829      * Don't need to implement this method unless your table's data can change.\r
830      */\r
831     public void setValueAt(Object value, int row, int col)\r
832     {\r
833       data[row][col] = value;\r
834       fireTableCellUpdated(row, col);\r
835 \r
836       String name = getValueAt(row, 0).toString();\r
837       boolean selected = ((Boolean) value).booleanValue();\r
838 \r
839       if (selectedSources.contains(name) && !selected)\r
840       {\r
841         selectedSources.remove(name);\r
842       }\r
843 \r
844       if (!selectedSources.contains(name) && selected)\r
845       {\r
846         selectedSources.add(name);\r
847       }\r
848     }\r
849   }\r
850 }\r