import java.awt.Container;
import java.awt.Dimension;
import java.awt.FlowLayout;
+import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
+import java.awt.event.KeyEvent;
+import java.awt.event.KeyListener;
import java.util.ArrayList;
+import java.util.HashSet;
import java.util.Hashtable;
import java.util.List;
import java.util.Vector;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTree;
-import javax.swing.JViewport;
import javax.swing.event.TreeSelectionEvent;
import javax.swing.event.TreeSelectionListener;
import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.DefaultTreeCellRenderer;
import javax.swing.tree.DefaultTreeModel;
-import javax.swing.tree.MutableTreeNode;
import javax.swing.tree.TreeCellRenderer;
-import javax.swing.tree.TreeModel;
import javax.swing.tree.TreePath;
import javax.swing.tree.TreeSelectionModel;
-import com.sun.java.help.search.DBPartParameters;
-
-public class JDatabaseTree extends JalviewDialog
+public class JDatabaseTree extends JalviewDialog implements KeyListener
{
+ boolean allowMultiSelections = false;
+
JButton getDatabaseSelectorButton()
{
final JButton viewdbs = new JButton("--- Select Database ---");
private jalview.ws.SequenceFetcher sfetcher;
- private JLabel dbstatus;
+ private JLabel dbstatus, dbstatex;
public JDatabaseTree(jalview.ws.SequenceFetcher sfetch)
{
* identical DB sources, and should be collapsed.
*/
DefaultMutableTreeNode tn = null, root = new DefaultMutableTreeNode();
- Hashtable<DbSourceProxy, DefaultMutableTreeNode> tns = new Hashtable<DbSourceProxy, DefaultMutableTreeNode>();
Hashtable<String, DefaultMutableTreeNode> source = new Hashtable<String, DefaultMutableTreeNode>();
sfetcher = sfetch;
String dbs[] = sfetch.getSupportedDb();
- Hashtable ht = new Hashtable();
+ Hashtable<String,String> ht = new Hashtable<String,String>();
for (int i = 0; i < dbs.length; i++)
{
tn = source.get(dbs[i]);
else
{
System.err.println("dupe ig for : " + dbs[i] + " \t"
- + dbp.getDbName());
+ + dbp.getDbName() + " (" + dbp.getDbSource() + ")");
+ source.remove(tn);
}
}
}
}
if (tn.getChildCount() == 1)
{
+ DefaultMutableTreeNode ttn = (DefaultMutableTreeNode) tn
+ .getChildAt(0);
// remove nodes with only one child
- source.put(dbs[i], tn = (DefaultMutableTreeNode) tn.getChildAt(0));
+ tn.setUserObject(ttn.getUserObject());
+ tn.removeAllChildren();
+ source.put(dbs[i], tn);
+ tn.setAllowsChildren(false);
}
root.add(tn);
}
jc.add(svp, BorderLayout.CENTER);
java.awt.Font f;
- // TODO: make the panel resize and fit this in
+ // TODO: make the panel stay a fixed size for longest dbname+example set.
+ JPanel dbstat = new JPanel(new GridLayout(2, 1));
dbstatus = new JLabel(" "); // set the height correctly for layout
dbstatus.setFont(f = JvSwingUtils.getLabelFont(false, true));
dbstatus.setSize(new Dimension(290, 50));
- jc.add(dbstatus, BorderLayout.SOUTH);
+ dbstatex = new JLabel(" ");
+ dbstatex.setFont(f);
+ dbstatex.setSize(new Dimension(290, 50));
+ dbstat.add(dbstatus);
+ dbstat.add(dbstatex);
+ jc.add(dbstat, BorderLayout.SOUTH);
jc.validate();
// j.setPreferredSize(new Dimension(300,50));
add(jc, BorderLayout.CENTER);
j.add(ok);
j.add(cancel);
add(j, BorderLayout.SOUTH);
+ dbviews.addKeyListener(this);
validate();
}
}
}
- List<DbSourceProxy> selection = null;
+ List<DbSourceProxy> oldselection, selection = null;
+
+ TreePath[] tsel = null, oldtsel = null;
@Override
protected void raiseClosed()
@Override
protected void cancelPressed()
{
+ selection = oldselection;
+ tsel = oldtsel;
+ _revertSelectionState();
closeDialog();
}
private void showDialog(Container parent)
{
+ oldselection = selection;
+ oldtsel = tsel;
validate();
waitForInput();
}
return selection;
}
+ /**
+ * disable or enable selection handler
+ */
+ boolean handleSelections = true;
+
private void _setSelectionState()
{
+ if (!handleSelections)
+ {
+ return;
+ }
if (dbviews.getSelectionCount() == 0)
{
selection = null;
}
+ tsel = dbviews.getSelectionPaths();
+ boolean forcedFirstChild = false;
List<DbSourceProxy> srcs = new ArrayList<DbSourceProxy>();
- for (TreePath tp : dbviews.getSelectionPaths())
+ if (tsel != null)
{
- DefaultMutableTreeNode dmt = (DefaultMutableTreeNode) tp
- .getLastPathComponent();
- if (dmt.getUserObject() != null)
+ for (TreePath tp : tsel)
{
- if (dmt.getUserObject() instanceof DbSourceProxy)
- {
- srcs.add((DbSourceProxy) dmt.getUserObject());
- }
- else
+ DefaultMutableTreeNode admt, dmt = (DefaultMutableTreeNode) tp
+ .getLastPathComponent();
+ if (dmt.getUserObject() != null)
{
- srcs.addAll(sfetcher.getSourceProxy((String) dmt.getUserObject()));
+ if (dmt.getUserObject() instanceof DbSourceProxy)
+ {
+ srcs.add((DbSourceProxy) dmt.getUserObject());
+ }
+ else
+ {
+ if (allowMultiSelections)
+ {
+ srcs.addAll(sfetcher.getSourceProxy((String) dmt
+ .getUserObject()));
+ }
+ else
+ {
+ if ((admt = dmt.getFirstLeaf()) != null
+ && admt.getUserObject() != null)
+ {
+ // modify db selection to just first leaf.
+ if (admt.getUserObject() instanceof DbSourceProxy)
+ {
+ srcs.add((DbSourceProxy) admt.getUserObject());
+ }
+ else
+ {
+ srcs.add(sfetcher.getSourceProxy(
+ (String) admt.getUserObject()).get(0));
+ }
+ forcedFirstChild = true;
+ }
+ }
+ }
}
}
}
- updateDbStatus(srcs);
+ updateDbStatus(srcs, forcedFirstChild);
selection = srcs;
}
- private void updateDbStatus(List<DbSourceProxy> srcs)
+ private void _revertSelectionState()
+ {
+ handleSelections = false;
+ if (selection == null || selection.size() == 0)
+ {
+ dbviews.clearSelection();
+ }
+ else
+ {
+ dbviews.setSelectionPaths(tsel);
+ }
+ handleSelections = true;
+ }
+
+ private void updateDbStatus(List<DbSourceProxy> srcs,
+ boolean forcedFirstChild)
{
int x = 0;
+ String nm = "", qr = "";
for (DbSourceProxy dbs : srcs)
{
String tq = dbs.getTestQuery();
- if (tq != null && tq.trim().length()>0 && dbs.isValidReference(tq))
+ nm = dbs.getDbName();
+ if (tq != null && tq.trim().length() > 0 && dbs.isValidReference(tq))
{
+ qr = tq;
x++;
}
}
- dbstatus.setText("Selected "
- + srcs.size()
- + " database"
- + (srcs.size() == 1 ? "" : "s")
- + " to fetch from"
- + (srcs.size() > 0 ? " with " + x + " test quer"
- + (x == 1 ? "y" : "ies") : "."));
+ if (allowMultiSelections)
+ {
+ dbstatus.setText("Selected "
+ + srcs.size()
+ + " database"
+ + (srcs.size() == 1 ? "" : "s")
+ + " to fetch from"
+ + (srcs.size() > 0 ? " with " + x + " test quer"
+ + (x == 1 ? "y" : "ies") : "."));
+ dbstatex.setText(" ");
+ }
+ else
+ {
+ if (nm.length() > 0)
+ {
+ dbstatus.setText("Database: " + nm);
+ if (qr.length() > 0)
+ {
+ dbstatex.setText("Example: " + qr);
+ }
+ else
+ {
+ dbstatex.setText(" ");
+ }
+ }
+ else
+ {
+ dbstatus.setText(" ");
+ }
+ }
dbstatus.invalidate();
+ dbstatex.invalidate();
}
public String getSelectedItem()
return null;
}
StringBuffer sb = new StringBuffer();
+ HashSet<String> hs = new HashSet<String>();
for (DbSourceProxy dbs : getSelectedSources())
{
- if (sb.length() > 0)
+ String tq = dbs.getTestQuery();
+ ;
+ if (hs.add(tq))
{
- sb.append(";");
+ if (sb.length() > 0)
+ {
+ sb.append(";");
+ }
+ sb.append(tq);
}
- sb.append(dbs.getTestQuery());
}
return sb.toString();
}
} while (nultimes > 0 && foo.isVisible());
foo.setVisible(false);
}
+
+ @Override
+ public void keyPressed(KeyEvent arg0)
+ {
+ if (!arg0.isConsumed() && arg0.getKeyCode() == KeyEvent.VK_ENTER)
+ {
+ okPressed();
+ }
+ if (!arg0.isConsumed() && arg0.getKeyChar() == KeyEvent.VK_ESCAPE)
+ {
+ cancelPressed();
+ }
+ }
+
+ @Override
+ public void keyReleased(KeyEvent arg0)
+ {
+ // TODO Auto-generated method stub
+
+ }
+
+ @Override
+ public void keyTyped(KeyEvent arg0)
+ {
+ // TODO Auto-generated method stub
+
+ }
}