2 * Jalview - A Sequence Alignment Editor and Viewer (Version 2.8)
3 * Copyright (C) 2012 J Procter, AM Waterhouse, LM Lui, J Engelhardt, G Barton, M Clamp, S Searle
5 * This file is part of Jalview.
7 * Jalview is free software: you can redistribute it and/or
8 * modify it under the terms of the GNU General Public License
9 * as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
11 * Jalview is distributed in the hope that it will be useful, but
12 * WITHOUT ANY WARRANTY; without even the implied warranty
13 * of MERCHANTABILITY or FITNESS FOR A PARTICULAR
14 * PURPOSE. See the GNU General Public License for more details.
16 * You should have received a copy of the GNU General Public License along with Jalview. If not, see <http://www.gnu.org/licenses/>.
20 import jalview.bin.Cache;
21 import jalview.util.MessageManager;
22 import jalview.ws.seqfetcher.DbSourceProxy;
24 import java.awt.BorderLayout;
25 import java.awt.Component;
26 import java.awt.Container;
27 import java.awt.Dimension;
28 import java.awt.FlowLayout;
29 import java.awt.GridLayout;
30 import java.awt.event.ActionEvent;
31 import java.awt.event.ActionListener;
32 import java.awt.event.KeyEvent;
33 import java.awt.event.KeyListener;
34 import java.util.ArrayList;
35 import java.util.HashSet;
36 import java.util.Hashtable;
37 import java.util.List;
38 import java.util.Vector;
40 import javax.swing.JButton;
41 import javax.swing.JFrame;
42 import javax.swing.JLabel;
43 import javax.swing.JPanel;
44 import javax.swing.JScrollPane;
45 import javax.swing.JTree;
46 import javax.swing.event.TreeSelectionEvent;
47 import javax.swing.event.TreeSelectionListener;
48 import javax.swing.tree.DefaultMutableTreeNode;
49 import javax.swing.tree.DefaultTreeCellRenderer;
50 import javax.swing.tree.DefaultTreeModel;
51 import javax.swing.tree.TreeCellRenderer;
52 import javax.swing.tree.TreeNode;
53 import javax.swing.tree.TreePath;
54 import javax.swing.tree.TreeSelectionModel;
56 public class JDatabaseTree extends JalviewDialog implements KeyListener
58 boolean allowMultiSelections = false;
60 JButton getDatabaseSelectorButton()
62 final JButton viewdbs = new JButton(MessageManager.getString("action.select_ddbb"));
63 viewdbs.addActionListener(new ActionListener()
67 public void actionPerformed(ActionEvent arg0)
79 private jalview.ws.SequenceFetcher sfetcher;
81 private JLabel dbstatus, dbstatex;
83 public JDatabaseTree(jalview.ws.SequenceFetcher sfetch)
85 initDialogFrame(this, true, false, "Select Database Retrieval Source",
88 * Dynamically generated database list will need a translation function from
89 * internal source to externally distinct names. UNIPROT and UP_NAME are
90 * identical DB sources, and should be collapsed.
92 DefaultMutableTreeNode tn = null, root = new DefaultMutableTreeNode();
93 Hashtable<String, DefaultMutableTreeNode> source = new Hashtable<String, DefaultMutableTreeNode>();
95 String dbs[] = sfetch.getSupportedDb();
96 Hashtable<String, String> ht = new Hashtable<String, String>();
97 for (int i = 0; i < dbs.length; i++)
99 tn = source.get(dbs[i]);
100 List<DbSourceProxy> srcs = sfetch.getSourceProxy(dbs[i]);
103 source.put(dbs[i], tn = new DefaultMutableTreeNode(dbs[i], true));
105 for (DbSourceProxy dbp : srcs)
107 if (ht.get(dbp.getDbName()) == null)
109 tn.add(new DefaultMutableTreeNode(dbp, false));
110 ht.put(dbp.getDbName(), dbp.getDbName());
114 System.err.println("dupe ig for : " + dbs[i] + " \t"
115 + dbp.getDbName() + " (" + dbp.getDbSource() + ")");
120 for (int i = 0; i < dbs.length; i++)
122 tn = source.get(dbs[i]);
127 if (tn.getChildCount() == 1)
129 DefaultMutableTreeNode ttn = (DefaultMutableTreeNode) tn
131 // remove nodes with only one child
132 tn.setUserObject(ttn.getUserObject());
133 tn.removeAllChildren();
134 source.put(dbs[i], tn);
135 tn.setAllowsChildren(false);
141 svp = new JScrollPane();
142 // svp.setAutoscrolls(true);
143 dbviews = new JTree(new DefaultTreeModel(root, false));
144 dbviews.setCellRenderer(new DbTreeRenderer(this));
146 dbviews.getSelectionModel().setSelectionMode(
147 TreeSelectionModel.SINGLE_TREE_SELECTION);
148 svp.getViewport().setView(dbviews);
149 // svp.getViewport().setMinimumSize(new Dimension(300,200));
150 // svp.setSize(300,250);
151 // JPanel panel=new JPanel();
152 // panel.setSize(new Dimension(350,220));
154 dbviews.addTreeSelectionListener(new TreeSelectionListener()
158 public void valueChanged(TreeSelectionEvent arg0)
160 _setSelectionState();
163 JPanel jc = new JPanel(new BorderLayout()), j = new JPanel(
165 jc.add(svp, BorderLayout.CENTER);
168 // TODO: make the panel stay a fixed size for longest dbname+example set.
169 JPanel dbstat = new JPanel(new GridLayout(2, 1));
170 dbstatus = new JLabel(" "); // set the height correctly for layout
171 dbstatus.setFont(f = JvSwingUtils.getLabelFont(false, true));
172 dbstatus.setSize(new Dimension(290, 50));
173 dbstatex = new JLabel(" ");
175 dbstatex.setSize(new Dimension(290, 50));
176 dbstat.add(dbstatus);
177 dbstat.add(dbstatex);
178 jc.add(dbstat, BorderLayout.SOUTH);
180 // j.setPreferredSize(new Dimension(300,50));
181 add(jc, BorderLayout.CENTER);
184 add(j, BorderLayout.SOUTH);
185 dbviews.addKeyListener(this);
189 private void sortTreeNodes(DefaultMutableTreeNode root)
191 if (root.getChildCount() == 0)
195 int count = root.getChildCount();
196 String[] names = new String[count];
197 DefaultMutableTreeNode[] nodes = new DefaultMutableTreeNode[count];
198 for (int i = 0; i < count; i++)
200 TreeNode node = root.getChildAt(i);
201 if (node instanceof DefaultMutableTreeNode)
203 DefaultMutableTreeNode child = (DefaultMutableTreeNode) node;
205 if (child.getUserObject() instanceof DbSourceProxy)
207 names[i] = ((DbSourceProxy) child.getUserObject()).getDbName()
212 names[i] = ((String) child.getUserObject()).toLowerCase();
213 sortTreeNodes(child);
219 "Implementation Error: Can't reorder this tree. Not DefaultMutableTreeNode.");
222 jalview.util.QuickSort.sort(names, nodes);
223 root.removeAllChildren();
224 for (int i = count - 1; i >= 0; i--)
230 private class DbTreeRenderer extends DefaultTreeCellRenderer implements
235 public DbTreeRenderer(JDatabaseTree me)
240 private Component returnLabel(String txt)
242 JLabel jl = new JLabel(txt);
243 jl.setFont(JvSwingUtils.getLabelFont());
248 public Component getTreeCellRendererComponent(JTree tree, Object value,
249 boolean selected, boolean expanded, boolean leaf, int row,
253 if (value != null && value instanceof DefaultMutableTreeNode)
255 DefaultMutableTreeNode vl = (DefaultMutableTreeNode) value;
256 value = vl.getUserObject();
257 if (value instanceof DbSourceProxy)
259 val = (((DbSourceProxy) value).getDbName());
263 if (value instanceof String)
265 val = ((String) value);
273 return super.getTreeCellRendererComponent(tree, val, selected,
274 expanded, leaf, row, hasFocus);
279 List<DbSourceProxy> oldselection, selection = null;
281 TreePath[] tsel = null, oldtsel = null;
284 protected void raiseClosed()
286 for (ActionListener al : lstners)
288 al.actionPerformed(null);
293 protected void okPressed()
295 _setSelectionState();
300 protected void cancelPressed()
302 selection = oldselection;
304 _revertSelectionState();
308 private void showDialog(Container parent)
310 oldselection = selection;
316 public boolean hasSelection()
318 return selection == null ? false : selection.size() == 0 ? false : true;
321 public List<DbSourceProxy> getSelectedSources()
327 * disable or enable selection handler
329 boolean handleSelections = true;
331 private void _setSelectionState()
333 if (!handleSelections)
337 if (dbviews.getSelectionCount() == 0)
341 tsel = dbviews.getSelectionPaths();
342 boolean forcedFirstChild = false;
343 List<DbSourceProxy> srcs = new ArrayList<DbSourceProxy>();
346 for (TreePath tp : tsel)
348 DefaultMutableTreeNode admt, dmt = (DefaultMutableTreeNode) tp
349 .getLastPathComponent();
350 if (dmt.getUserObject() != null)
352 if (dmt.getUserObject() instanceof DbSourceProxy)
354 srcs.add((DbSourceProxy) dmt.getUserObject());
358 if (allowMultiSelections)
360 srcs.addAll(sfetcher.getSourceProxy((String) dmt
365 srcs.add(sfetcher.getSourceProxy((String) dmt
366 .getUserObject()).get(0));
367 forcedFirstChild = true;
373 updateDbStatus(srcs, forcedFirstChild);
377 private void _revertSelectionState()
379 handleSelections = false;
380 if (selection == null || selection.size() == 0)
382 dbviews.clearSelection();
386 dbviews.setSelectionPaths(tsel);
388 handleSelections = true;
391 private void updateDbStatus(List<DbSourceProxy> srcs,
392 boolean forcedFirstChild)
395 String nm = "", qr = "";
396 for (DbSourceProxy dbs : srcs)
398 String tq = dbs.getTestQuery();
399 nm = dbs.getDbName();
400 if (tq != null && tq.trim().length() > 0 && dbs.isValidReference(tq))
407 if (allowMultiSelections)
409 dbstatus.setText(MessageManager.formatMessage("label.selected_database_to_fetch_from", new String[]{Integer.valueOf(srcs.size()).toString(),(srcs.size() == 1 ? "" : "s"),(srcs.size() > 0 ? " with " + x + " test quer" + (x == 1 ? "y" : "ies") : ".")}));
410 dbstatex.setText(" ");
416 dbstatus.setText(MessageManager.formatMessage("label.database_param",new String[]{nm}));
419 dbstatex.setText(MessageManager.formatMessage("label.example_param", new String[]{qr}));
423 dbstatex.setText(" ");
428 dbstatus.setText(" ");
431 dbstatus.invalidate();
432 dbstatex.invalidate();
435 public String getSelectedItem()
439 return getSelectedSources().get(0).getDbName();
444 public String getExampleQueries()
450 StringBuffer sb = new StringBuffer();
451 HashSet<String> hs = new HashSet<String>();
452 for (DbSourceProxy dbs : getSelectedSources())
454 String tq = dbs.getTestQuery();
465 return sb.toString();
468 List<ActionListener> lstners = new Vector<ActionListener>();
470 public void addActionListener(ActionListener actionListener)
472 lstners.add(actionListener);
475 public void removeActionListener(ActionListener actionListener)
477 lstners.remove(actionListener);
480 public static void main(String args[])
482 Cache.getDasSourceRegistry();
483 JDatabaseTree jdt = new JDatabaseTree(new jalview.ws.SequenceFetcher());
484 JFrame foo = new JFrame();
485 foo.setLayout(new BorderLayout());
486 foo.add(jdt.getDatabaseSelectorButton(), BorderLayout.CENTER);
488 foo.setVisible(true);
490 final Thread us = Thread.currentThread();
491 jdt.addActionListener(new ActionListener()
495 public void actionPerformed(ActionEvent e)
505 } catch (InterruptedException x)
508 if (!jdt.hasSelection())
510 System.out.println("No Selection");
514 System.out.println("Selection: " + jdt.getSelectedItem());
516 for (DbSourceProxy pr : jdt.getSelectedSources())
518 System.out.println("Source " + s++ + ": " + pr.getDbName()
519 + " (" + pr.getDbSource() + ") Version "
520 + pr.getDbVersion() + ". Test:\t" + pr.getTestQuery());
522 System.out.println("Test queries: " + jdt.getExampleQueries());
525 } while (nultimes > 0 && foo.isVisible());
526 foo.setVisible(false);
530 public void keyPressed(KeyEvent arg0)
532 if (!arg0.isConsumed() && arg0.getKeyCode() == KeyEvent.VK_ENTER)
536 if (!arg0.isConsumed() && arg0.getKeyChar() == KeyEvent.VK_ESCAPE)
543 public void keyReleased(KeyEvent arg0)
545 // TODO Auto-generated method stub
550 public void keyTyped(KeyEvent arg0)
552 // TODO Auto-generated method stub