diff --git a/uk/ac/sanger/artemis/components/database/DatabaseJPanel.java b/uk/ac/sanger/artemis/components/database/DatabaseJPanel.java index e3d731c12e140a9723380872acb004a42483c303..852677712df8da4ff4a69ec89e824971ec7acf55 100644 --- a/uk/ac/sanger/artemis/components/database/DatabaseJPanel.java +++ b/uk/ac/sanger/artemis/components/database/DatabaseJPanel.java @@ -20,7 +20,7 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * - * $Header: //tmp/pathsoft/artemis/uk/ac/sanger/artemis/components/database/DatabaseJPanel.java,v 1.22 2009-03-27 09:03:55 tjc Exp $ + * $Header: //tmp/pathsoft/artemis/uk/ac/sanger/artemis/components/database/DatabaseJPanel.java,v 1.23 2009-04-17 11:02:36 tjc Exp $ */ package uk.ac.sanger.artemis.components.database; @@ -28,16 +28,24 @@ package uk.ac.sanger.artemis.components.database; import uk.ac.sanger.artemis.components.*; import uk.ac.sanger.artemis.Entry; +import uk.ac.sanger.artemis.FeatureVector; +import uk.ac.sanger.artemis.Options; +import uk.ac.sanger.artemis.Selection; import uk.ac.sanger.artemis.sequence.*; import uk.ac.sanger.artemis.util.InputStreamProgressEvent; import uk.ac.sanger.artemis.util.InputStreamProgressListener; import uk.ac.sanger.artemis.util.OutOfRangeException; import uk.ac.sanger.artemis.util.DatabaseDocument; +import uk.ac.sanger.artemis.util.StringVector; import uk.ac.sanger.artemis.io.DatabaseDocumentEntry; import uk.ac.sanger.artemis.io.Range; +import javax.swing.Box; +import javax.swing.JButton; import javax.swing.JComponent; import javax.swing.JFrame; +import javax.swing.JOptionPane; +import javax.swing.JTextField; import javax.swing.JTree; import javax.swing.JScrollPane; import javax.swing.JPanel; @@ -49,8 +57,13 @@ import javax.swing.tree.TreePath; import org.gmod.schema.organism.Organism; import org.gmod.schema.organism.OrganismProp; import org.gmod.schema.sequence.Feature; +import org.gmod.schema.sequence.FeatureLoc; import java.awt.BorderLayout; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.awt.event.KeyAdapter; +import java.awt.event.KeyEvent; import java.awt.event.MouseListener; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; @@ -114,11 +127,38 @@ public class DatabaseJPanel extends JPanel status_line.setBorder(compound); add(status_line, BorderLayout.SOUTH); - JLabel title_line = new JLabel("Database List"); + Box xBox = Box.createHorizontalBox(); + JLabel title_line = new JLabel("DATABASE"); title_line.setMinimumSize(new Dimension(100, font_height)); - title_line.setPreferredSize(new Dimension(100, font_height)); + title_line.setPreferredSize(new Dimension(250, font_height)); title_line.setBorder(compound); - add(title_line, BorderLayout.NORTH); + xBox.add(title_line); + + final JTextField openGeneText = new JTextField(6); + openGeneText.addKeyListener(new KeyAdapter() + { + public void keyPressed(KeyEvent e) + { + if (e.getKeyCode() == KeyEvent.VK_ENTER) + getEntryEditFromDatabase(entry_source, splash_main, + openGeneText.getText().trim()); + } + }); + JButton openBtn = new JButton("Open:"); + openBtn.setToolTipText("Open Artemis for a chromosome or at a given gene"); + openBtn.addActionListener(new ActionListener() + { + public void actionPerformed(ActionEvent e) + { + getEntryEditFromDatabase(entry_source, splash_main, + openGeneText.getText().trim()); + } + }); + xBox.add(Box.createHorizontalGlue()); + xBox.add(openBtn); + xBox.add(openGeneText); + + add(xBox, BorderLayout.NORTH); } /** @@ -173,7 +213,7 @@ public class DatabaseJPanel extends JPanel } catch(NullPointerException npe) { - npe.printStackTrace(); + npe.printStackTrace(); } } @@ -190,6 +230,35 @@ public class DatabaseJPanel extends JPanel final Splash splash_main, final InputStreamProgressListener stream_progress_listener, final String entryName) + { + return show(entry_source, + (splash_main == null ? null : splash_main.getCanvas()), + (splash_main == null ? null : splash_main.getStatusLabel()), + splash_main, stream_progress_listener, + entryName, false, false); + } + + + /** + * Open an Artemis EntryEdit window + * @param entry_source + * @param srcComponent + * @param status_line + * @param splash_main + * @param stream_progress_listener + * @param entryName e.g. Pfalciparum:Pf3D7_09 or + * Pfalciparum:Pf3D7_09:20050..40000 + * @param isNotSrcFeature true is the entry name may not be a source feature + * @return + */ + public static EntryEdit show(final DatabaseEntrySource entry_source, + final JComponent srcComponent, + final JLabel status_line, + final Splash splash_main, + final InputStreamProgressListener stream_progress_listener, + final String entryName, + final boolean isNotSrcFeature, + final boolean splitGFFEntry) { final String entry[] = entryName.split(":"); String url = (String)entry_source.getLocation(); @@ -221,9 +290,17 @@ public class DatabaseJPanel extends JPanel Feature f = doc.getFeatureByUniquename(entry[1]); + if(isNotSrcFeature && f.getFeatureLocsForFeatureId() != null + && f.getFeatureLocsForFeatureId().size() > 0) + { + Iterator it = f.getFeatureLocsForFeatureId().iterator(); + f = ((FeatureLoc) it.next()).getFeatureBySrcFeatureId(); + } + return openEntry(Integer.toString(f.getFeatureId()), entry_source, - splash_main.getCanvas(), splash_main.getStatusLabel(), stream_progress_listener, - false, splash_main, entry[1], userName, range); + srcComponent, status_line, + stream_progress_listener, + splitGFFEntry, splash_main, f.getUniqueName(), userName, range); } /** @@ -297,7 +374,52 @@ public class DatabaseJPanel extends JPanel } /** - * + * Open an Artemis entry given a feature name. If the name is + * a feature on the sequence (i.e. not the source feature) the + * display will open at that region. + * @param entry_source + * @param splash_main + * @param featureName + */ + private void getEntryEditFromDatabase(final DatabaseEntrySource entry_source, + final Splash splash_main, + final String featureName) + { + SwingWorker entryWorker = new SwingWorker() + { + public Object construct() + { + Cursor cbusy = new Cursor(Cursor.WAIT_CURSOR); + Cursor cdone = new Cursor(Cursor.DEFAULT_CURSOR); + try + { + DatabaseJPanel.this.setCursor(cbusy); + EntryEdit ee = show(entry_source, + DatabaseJPanel.this, status_line, splash_main, + stream_progress_listener, ":" + featureName, + true, splitGFFEntry); + goTo(ee, featureName); + } + catch (NullPointerException npe) + { + //npe.printStackTrace(); + JOptionPane.showMessageDialog(DatabaseJPanel.this, + featureName + " not found!", + "Failed to Open", JOptionPane.WARNING_MESSAGE); + logger4j.debug(featureName + " not found!"); + } + finally + { + DatabaseJPanel.this.setCursor(cdone); + } + return null; + } + }; + entryWorker.start(); + } + + /** + * Open an Artemis entry * @param srcfeatureId * @param entry_source * @param srcComponent @@ -419,7 +541,6 @@ public class DatabaseJPanel extends JPanel return null; } } - return null; } @@ -449,4 +570,30 @@ public class DatabaseJPanel extends JPanel { this.splitGFFEntry = splitGFFEntry; } + + /** + * Go to a named feature + * @param ee + * @param geneName + */ + private static void goTo(final EntryEdit ee, final String geneName) + { + Selection selection = ee.getSelection(); + selection.clear(); + + final StringVector qualifiers_to_search = new StringVector(); + qualifiers_to_search.add(Options.getOptions().getAllGeneNames()); + + FeatureVector features = ee.getEntryGroup().getAllFeatures(); + for (int i = 0; i < features.size(); i++) + { + uk.ac.sanger.artemis.Feature thisFeature = features.elementAt(i); + if (thisFeature.containsText(geneName, true, false, qualifiers_to_search)) + { + selection.set(thisFeature); + break; + } + } + ee.getGotoEventSource().gotoBase(selection.getLowestBaseOfSelection()); + } }