Clover icon

Coverage Report

  1. Project Clover database Thu Aug 13 2020 12:04:21 BST
  2. Package jalview.gui

File JDatabaseTree.java

 

Coverage histogram

../../img/srcFileCovDistChart0.png
56% of files have more coverage

Code metrics

78
191
26
2
556
470
71
0.37
7.35
13
2.73

Classes

Class Line # Actions
JDatabaseTree 59 173 62
0.00%
JDatabaseTree.DbTreeRenderer 252 18 9
0.00%
 

Contributing tests

No tests hitting this source file were found.

Source view

1    /*
2    * Jalview - A Sequence Alignment Editor and Viewer ($$Version-Rel$$)
3    * Copyright (C) $$Year-Rel$$ The Jalview Authors
4    *
5    * This file is part of Jalview.
6    *
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
10    * of the License, or (at your option) any later version.
11    *
12    * Jalview is distributed in the hope that it will be useful, but
13    * WITHOUT ANY WARRANTY; without even the implied warranty
14    * of MERCHANTABILITY or FITNESS FOR A PARTICULAR
15    * PURPOSE. See the GNU General Public License for more details.
16    *
17    * You should have received a copy of the GNU General Public License
18    * along with Jalview. If not, see <http://www.gnu.org/licenses/>.
19    * The Jalview Authors are detailed in the 'AUTHORS' file.
20    */
21    package jalview.gui;
22   
23    import jalview.util.MessageManager;
24    import jalview.ws.seqfetcher.DbSourceProxy;
25   
26    import java.awt.BorderLayout;
27    import java.awt.Component;
28    import java.awt.Dimension;
29    import java.awt.FlowLayout;
30    import java.awt.GridLayout;
31    import java.awt.event.ActionEvent;
32    import java.awt.event.ActionListener;
33    import java.awt.event.KeyEvent;
34    import java.awt.event.KeyListener;
35    import java.awt.event.MouseAdapter;
36    import java.awt.event.MouseEvent;
37    import java.util.ArrayList;
38    import java.util.HashSet;
39    import java.util.Hashtable;
40    import java.util.List;
41    import java.util.Vector;
42   
43    import javax.swing.JButton;
44    import javax.swing.JLabel;
45    import javax.swing.JPanel;
46    import javax.swing.JScrollPane;
47    import javax.swing.JTree;
48    import javax.swing.ToolTipManager;
49    import javax.swing.event.TreeSelectionEvent;
50    import javax.swing.event.TreeSelectionListener;
51    import javax.swing.tree.DefaultMutableTreeNode;
52    import javax.swing.tree.DefaultTreeCellRenderer;
53    import javax.swing.tree.DefaultTreeModel;
54    import javax.swing.tree.TreeCellRenderer;
55    import javax.swing.tree.TreeNode;
56    import javax.swing.tree.TreePath;
57    import javax.swing.tree.TreeSelectionModel;
58   
 
59    public class JDatabaseTree extends JalviewDialog implements KeyListener
60    {
61    boolean allowMultiSelections = false;
62   
63    public int action;
64   
 
65  0 toggle JButton getDatabaseSelectorButton()
66    {
67  0 final JButton viewdbs = new JButton(
68    MessageManager.getString("action.select_ddbb"));
69  0 viewdbs.addActionListener(new ActionListener()
70    {
71   
 
72  0 toggle @Override
73    public void actionPerformed(ActionEvent arg0)
74    {
75  0 showDialog();
76    }
77    });
78  0 return viewdbs;
79    }
80   
81    JScrollPane svp;
82   
83    JTree dbviews;
84   
85    private jalview.ws.SequenceFetcher sfetcher;
86   
87    private JLabel dbstatus, dbstatex;
88   
89    private JPanel mainPanel = new JPanel(new BorderLayout());
90   
 
91  0 toggle public JDatabaseTree(jalview.ws.SequenceFetcher sfetch)
92    {
93  0 mainPanel.add(this);
94  0 initDialogFrame(mainPanel, true, false, MessageManager
95    .getString("label.select_database_retrieval_source"), 650, 490);
96    /*
97    * Dynamically generated database list will need a translation function from
98    * internal source to externally distinct names. UNIPROT and UP_NAME are
99    * identical DB sources, and should be collapsed.
100    */
101  0 DefaultMutableTreeNode tn = null, root = new DefaultMutableTreeNode();
102  0 Hashtable<String, DefaultMutableTreeNode> source = new Hashtable<>();
103  0 sfetcher = sfetch;
104  0 String dbs[] = sfetch.getSupportedDb();
105  0 Hashtable<String, String> ht = new Hashtable<>();
106  0 for (int i = 0; i < dbs.length; i++)
107    {
108  0 tn = source.get(dbs[i]);
109  0 List<DbSourceProxy> srcs = sfetch.getSourceProxy(dbs[i]);
110  0 if (tn == null)
111    {
112  0 source.put(dbs[i], tn = new DefaultMutableTreeNode(dbs[i], true));
113    }
114  0 for (DbSourceProxy dbp : srcs)
115    {
116  0 if (ht.get(dbp.getDbName()) == null)
117    {
118  0 tn.add(new DefaultMutableTreeNode(dbp, false));
119  0 ht.put(dbp.getDbName(), dbp.getDbName());
120    }
121    else
122    {
123  0 System.err.println("dupe ig for : " + dbs[i] + " \t"
124    + dbp.getDbName() + " (" + dbp.getDbSource() + ")");
125  0 source.remove(tn);
126    }
127    }
128    }
129  0 for (int i = 0; i < dbs.length; i++)
130    {
131  0 tn = source.get(dbs[i]);
132  0 if (tn == null)
133    {
134  0 continue;
135    }
136  0 if (tn.getChildCount() == 1)
137    {
138  0 DefaultMutableTreeNode ttn = (DefaultMutableTreeNode) tn
139    .getChildAt(0);
140    // remove nodes with only one child
141  0 tn.setUserObject(ttn.getUserObject());
142  0 tn.removeAllChildren();
143  0 source.put(dbs[i], tn);
144  0 tn.setAllowsChildren(false);
145    }
146  0 root.add(tn);
147    }
148    // and sort the tree
149  0 sortTreeNodes(root);
150  0 dbviews = new JTree(new DefaultTreeModel(root, false));
151  0 dbviews.setCellRenderer(new DbTreeRenderer(this));
152   
153  0 dbviews.getSelectionModel()
154    .setSelectionMode(TreeSelectionModel.SINGLE_TREE_SELECTION);
155  0 svp = new JScrollPane(dbviews);
156  0 svp.setMinimumSize(new Dimension(100, 200));
157  0 svp.setPreferredSize(new Dimension(200, 400));
158  0 svp.setMaximumSize(new Dimension(300, 600));
159   
160  0 JPanel panel = new JPanel(new BorderLayout());
161  0 panel.setSize(new Dimension(350, 220));
162  0 panel.add(svp);
163  0 dbviews.addTreeSelectionListener(new TreeSelectionListener()
164    {
165   
 
166  0 toggle @Override
167    public void valueChanged(TreeSelectionEvent arg0)
168    {
169  0 _setSelectionState();
170    }
171    });
172  0 dbviews.addMouseListener(new MouseAdapter()
173    {
174   
 
175  0 toggle @Override
176    public void mousePressed(MouseEvent e)
177    {
178  0 if (e.getClickCount() == 2)
179    {
180  0 okPressed();
181  0 closeDialog();
182    }
183    }
184    });
185  0 JPanel jc = new JPanel(new BorderLayout()),
186    j = new JPanel(new FlowLayout());
187  0 jc.add(svp, BorderLayout.CENTER);
188   
189  0 java.awt.Font f;
190    // TODO: make the panel stay a fixed size for longest dbname+example set.
191  0 JPanel dbstat = new JPanel(new GridLayout(2, 1));
192  0 dbstatus = new JLabel(" "); // set the height correctly for layout
193  0 dbstatus.setFont(f = JvSwingUtils.getLabelFont(false, true));
194  0 dbstatus.setSize(new Dimension(290, 50));
195  0 dbstatex = new JLabel(" ");
196  0 dbstatex.setFont(f);
197  0 dbstatex.setSize(new Dimension(290, 50));
198  0 dbstat.add(dbstatus);
199  0 dbstat.add(dbstatex);
200  0 jc.add(dbstat, BorderLayout.SOUTH);
201  0 jc.validate();
202  0 add(jc, BorderLayout.CENTER);
203  0 ok.setEnabled(false);
204  0 j.add(ok);
205  0 j.add(cancel);
206  0 add(j, BorderLayout.SOUTH);
207  0 dbviews.addKeyListener(this);
208  0 validate();
209    }
210   
 
211  0 toggle private void sortTreeNodes(DefaultMutableTreeNode root)
212    {
213  0 if (root.getChildCount() == 0)
214    {
215  0 return;
216    }
217  0 int count = root.getChildCount();
218  0 String[] names = new String[count];
219  0 DefaultMutableTreeNode[] nodes = new DefaultMutableTreeNode[count];
220  0 for (int i = 0; i < count; i++)
221    {
222  0 TreeNode node = root.getChildAt(i);
223  0 if (node instanceof DefaultMutableTreeNode)
224    {
225  0 DefaultMutableTreeNode child = (DefaultMutableTreeNode) node;
226  0 nodes[i] = child;
227  0 if (child.getUserObject() instanceof DbSourceProxy)
228    {
229  0 names[i] = ((DbSourceProxy) child.getUserObject()).getDbName()
230    .toLowerCase();
231    }
232    else
233    {
234  0 names[i] = ((String) child.getUserObject()).toLowerCase();
235  0 sortTreeNodes(child);
236    }
237    }
238    else
239    {
240  0 throw new Error(MessageManager
241    .getString("error.implementation_error_cant_reorder_tree"));
242    }
243    }
244  0 jalview.util.QuickSort.sort(names, nodes);
245  0 root.removeAllChildren();
246  0 for (int i = count - 1; i >= 0; i--)
247    {
248  0 root.add(nodes[i]);
249    }
250    }
251   
 
252    private class DbTreeRenderer extends DefaultTreeCellRenderer
253    implements TreeCellRenderer
254    {
255    JDatabaseTree us;
256   
 
257  0 toggle public DbTreeRenderer(JDatabaseTree me)
258    {
259  0 us = me;
260  0 ToolTipManager.sharedInstance().registerComponent(dbviews);
261    }
262   
 
263  0 toggle private Component returnLabel(String txt)
264    {
265  0 JLabel jl = new JLabel(txt);
266  0 jl.setFont(JvSwingUtils.getLabelFont());
267  0 return jl;
268    }
269   
 
270  0 toggle @Override
271    public Component getTreeCellRendererComponent(JTree tree, Object value,
272    boolean selected, boolean expanded, boolean leaf, int row,
273    boolean hasFocus)
274    {
275  0 String val = "";
276  0 if (value != null && value instanceof DefaultMutableTreeNode)
277    {
278  0 DefaultMutableTreeNode vl = (DefaultMutableTreeNode) value;
279  0 value = vl.getUserObject();
280  0 if (value instanceof DbSourceProxy)
281    {
282  0 val = ((DbSourceProxy) value).getDbName();
283  0 if (((DbSourceProxy) value).getDescription() != null)
284    { // getName()
285  0 this.setToolTipText(((DbSourceProxy) value).getDescription());
286    }
287    }
288    else
289    {
290  0 if (value instanceof String)
291    {
292  0 val = (String) value;
293    }
294    }
295    }
296  0 if (value == null)
297    {
298  0 val = "";
299    }
300  0 return super.getTreeCellRendererComponent(tree, val, selected,
301    expanded, leaf, row, hasFocus);
302   
303    }
304    }
305   
306    List<DbSourceProxy> oldselection, selection = null;
307   
308    TreePath[] tsel = null, oldtsel = null;
309   
 
310  0 toggle @Override
311    protected void raiseClosed()
312    {
313  0 for (ActionListener al : lstners)
314    {
315  0 al.actionPerformed(null);
316    }
317    }
318   
 
319  0 toggle @Override
320    protected void okPressed()
321    {
322  0 _setSelectionState();
323    }
324   
 
325  0 toggle @Override
326    protected void cancelPressed()
327    {
328  0 selection = oldselection;
329  0 tsel = oldtsel;
330  0 _revertSelectionState();
331  0 closeDialog();
332    }
333   
 
334  0 toggle void showDialog()
335    {
336  0 oldselection = selection;
337  0 oldtsel = tsel;
338  0 validate();
339  0 waitForInput();
340    }
341   
 
342  0 toggle public boolean hasSelection()
343    {
344  0 return selection == null ? false : selection.size() == 0 ? false : true;
345    }
346   
 
347  0 toggle public List<DbSourceProxy> getSelectedSources()
348    {
349  0 return selection;
350    }
351   
352    /**
353    * disable or enable selection handler
354    */
355    boolean handleSelections = true;
356   
 
357  0 toggle private void _setSelectionState()
358    {
359  0 if (!handleSelections)
360    {
361  0 return;
362    }
363  0 ok.setEnabled(false);
364  0 if (dbviews.getSelectionCount() == 0)
365    {
366  0 selection = null;
367    }
368   
369  0 tsel = dbviews.getSelectionPaths();
370  0 boolean forcedFirstChild = false;
371  0 List<DbSourceProxy> srcs = new ArrayList<>();
372  0 if (tsel != null)
373    {
374  0 for (TreePath tp : tsel)
375    {
376  0 DefaultMutableTreeNode admt,
377    dmt = (DefaultMutableTreeNode) tp.getLastPathComponent();
378  0 if (dmt.getUserObject() != null)
379    {
380    /*
381    * enable OK button once a selection has been made
382    */
383  0 ok.setEnabled(true);
384  0 if (dmt.getUserObject() instanceof DbSourceProxy)
385    {
386  0 srcs.add((DbSourceProxy) dmt.getUserObject());
387    }
388    else
389    {
390  0 if (allowMultiSelections)
391    {
392  0 srcs.addAll(sfetcher
393    .getSourceProxy((String) dmt.getUserObject()));
394    }
395    else
396    {
397  0 srcs.add(sfetcher.getSourceProxy((String) dmt.getUserObject())
398    .get(0));
399  0 forcedFirstChild = true;
400    }
401    }
402    }
403    }
404    }
405  0 updateDbStatus(srcs, forcedFirstChild);
406  0 selection = srcs;
407    }
408   
 
409  0 toggle private void _revertSelectionState()
410    {
411  0 handleSelections = false;
412  0 if (selection == null || selection.size() == 0)
413    {
414  0 dbviews.clearSelection();
415    }
416    else
417    {
418  0 dbviews.setSelectionPaths(tsel);
419    }
420  0 handleSelections = true;
421    }
422   
 
423  0 toggle private void updateDbStatus(List<DbSourceProxy> srcs,
424    boolean forcedFirstChild)
425    {
426  0 int x = 0;
427  0 String nm = "", qr = "";
428  0 for (DbSourceProxy dbs : srcs)
429    {
430  0 String tq = dbs.getTestQuery();
431  0 nm = dbs.getDbName();
432  0 if (tq != null && tq.trim().length() > 0 && dbs.isValidReference(tq))
433    {
434  0 qr = tq;
435  0 x++;
436    }
437    }
438   
439  0 dbstatex.setText(" ");
440  0 if (allowMultiSelections)
441    {
442  0 dbstatus.setText(MessageManager.formatMessage(
443    "label.selected_database_to_fetch_from", new String[]
444    { Integer.valueOf(srcs.size()).toString(),
445  0 (srcs.size() == 1 ? "" : "s"),
446  0 (srcs.size() > 0
447    ? " with " + x + " test quer"
448  0 + (x == 1 ? "y" : "ies")
449    : ".") }));
450    }
451    else
452    {
453  0 if (nm.length() > 0)
454    {
455  0 dbstatus.setText(MessageManager
456    .formatMessage("label.database_param", new String[]
457    { nm }));
458  0 if (qr.length() > 0)
459    {
460  0 dbstatex.setText(MessageManager
461    .formatMessage("label.example_param", new String[]
462    { qr }));
463    }
464    }
465    else
466    {
467  0 dbstatus.setText(" ");
468    }
469    }
470  0 dbstatus.invalidate();
471  0 dbstatex.invalidate();
472    }
473   
 
474  0 toggle public String getSelectedItem()
475    {
476  0 if (hasSelection())
477    {
478  0 return getSelectedSources().get(0).getDbName();
479    }
480  0 return null;
481    }
482   
 
483  0 toggle public String getExampleQueries()
484    {
485  0 if (!hasSelection())
486    {
487  0 return null;
488    }
489  0 StringBuffer sb = new StringBuffer();
490  0 HashSet<String> hs = new HashSet<>();
491  0 for (DbSourceProxy dbs : getSelectedSources())
492    {
493  0 String tq = dbs.getTestQuery();
494  0 ;
495  0 if (hs.add(tq))
496    {
497  0 if (sb.length() > 0)
498    {
499  0 sb.append(";");
500    }
501  0 sb.append(tq);
502    }
503    }
504  0 return sb.toString();
505    }
506   
507    List<ActionListener> lstners = new Vector<>();
508   
 
509  0 toggle public void addActionListener(ActionListener actionListener)
510    {
511  0 lstners.add(actionListener);
512    }
513   
 
514  0 toggle public void removeActionListener(ActionListener actionListener)
515    {
516  0 lstners.remove(actionListener);
517    }
518   
519   
 
520  0 toggle @Override
521    public void keyPressed(KeyEvent arg0)
522    {
523  0 if (!arg0.isConsumed() && arg0.getKeyCode() == KeyEvent.VK_ENTER)
524    {
525  0 action = arg0.getKeyCode();
526  0 okPressed();
527  0 closeDialog();
528    }
529  0 if (!arg0.isConsumed() && arg0.getKeyChar() == KeyEvent.VK_ESCAPE)
530    {
531  0 action = arg0.getKeyCode();
532  0 cancelPressed();
533    }
534    }
535   
 
536  0 toggle @Override
537    public void keyReleased(KeyEvent arg0)
538    {
539    // TODO Auto-generated method stub
540   
541    }
542   
 
543  0 toggle @Override
544    public void keyTyped(KeyEvent arg0)
545    {
546    // TODO Auto-generated method stub
547   
548    }
549   
 
550  0 toggle @Override
551    public void setVisible(boolean arg0)
552    {
553  0 System.out.println("setVisible: " + arg0);
554  0 super.setVisible(arg0);
555    }
556    }