IdentifyFile should not be static
[jalview.git] / src / jalview / gui / Desktop.java
1 /*\r
2  * Jalview - A Sequence Alignment Editor and Viewer\r
3  * Copyright (C) 2005 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 jalview.io.*;\r
22 \r
23 import java.awt.*;\r
24 import java.awt.datatransfer.*;\r
25 import java.awt.dnd.*;\r
26 import java.awt.event.*;\r
27 \r
28 import javax.swing.*;\r
29 \r
30 \r
31 /**\r
32  * DOCUMENT ME!\r
33  *\r
34  * @author $author$\r
35  * @version $Revision$\r
36  */\r
37 public class Desktop extends jalview.jbgui.GDesktop\r
38     implements DropTargetListener\r
39 {\r
40     /** DOCUMENT ME!! */\r
41     public static JDesktopPane desktop;\r
42     static int openFrameCount = 0;\r
43     static final int xOffset = 30;\r
44     static final int yOffset = 30;\r
45     public static jalview.ws.Discoverer discoverer;\r
46 \r
47     public static Object [] jalviewClipboard;\r
48 \r
49 \r
50     /**\r
51      * Creates a new Desktop object.\r
52      */\r
53     public Desktop()\r
54     {\r
55         Image image = null;\r
56 \r
57 \r
58         try\r
59         {\r
60             java.net.URL url = getClass().getResource("/images/logo.gif");\r
61 \r
62             if (url != null)\r
63             {\r
64                 image = java.awt.Toolkit.getDefaultToolkit().createImage(url);\r
65 \r
66                 MediaTracker mt = new MediaTracker(this);\r
67                 mt.addImage(image, 0);\r
68                 mt.waitForID(0);\r
69                 setIconImage(image);\r
70             }\r
71         }\r
72         catch (Exception ex)\r
73         {\r
74         }\r
75 \r
76         setTitle("Jalview "+jalview.bin.Cache.getProperty("VERSION"));\r
77         setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);\r
78         desktop = new JDesktopPane();\r
79         desktop.setBackground(Color.white);\r
80         setContentPane(desktop);\r
81         desktop.setDragMode(JDesktopPane.OUTLINE_DRAG_MODE);\r
82 \r
83         // This line prevents Windows Look&Feel resizing all new windows to maximum\r
84         // if previous window was maximised\r
85         desktop.setDesktopManager(new DefaultDesktopManager());\r
86 \r
87         Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();\r
88         String x = jalview.bin.Cache.getProperty("SCREEN_X");\r
89         String y = jalview.bin.Cache.getProperty("SCREEN_Y");\r
90         String width = jalview.bin.Cache.getProperty("SCREEN_WIDTH");\r
91         String height = jalview.bin.Cache.getProperty("SCREEN_HEIGHT");\r
92 \r
93         if ((x != null) && (y != null) && (width != null) && (height != null))\r
94         {\r
95             setBounds(Integer.parseInt(x), Integer.parseInt(y),\r
96                 Integer.parseInt(width), Integer.parseInt(height));\r
97         }\r
98         else\r
99         {\r
100             setBounds((int) (screenSize.width - 900) / 2,\r
101                 (int) (screenSize.height - 650) / 2, 900, 650);\r
102         }\r
103 \r
104         this.addWindowListener(new WindowAdapter()\r
105             {\r
106                 public void windowClosing(WindowEvent evt)\r
107                 {\r
108                     quit();\r
109                 }\r
110             });\r
111 \r
112         this.setDropTarget(new java.awt.dnd.DropTarget(desktop, this));\r
113 \r
114         /////////Add a splashscreen on startup\r
115         /////////Add a splashscreen on startup\r
116         JInternalFrame frame = new JInternalFrame();\r
117 \r
118         SplashScreen splash = new SplashScreen(frame, image);\r
119         frame.setContentPane(splash);\r
120         frame.setLayer(JLayeredPane.PALETTE_LAYER);\r
121         frame.setLocation((int) ((getWidth() - 750) / 2),\r
122             (int) ((getHeight() - 160) / 2));\r
123 \r
124         addInternalFrame(frame, "", 750, 160, false);\r
125 \r
126         discoverer=new jalview.ws.Discoverer(); // Only gets started if gui is displayed.\r
127 \r
128     }\r
129 \r
130     /**\r
131      * DOCUMENT ME!\r
132      *\r
133      * @param frame DOCUMENT ME!\r
134      * @param title DOCUMENT ME!\r
135      * @param w DOCUMENT ME!\r
136      * @param h DOCUMENT ME!\r
137      */\r
138     public static synchronized void addInternalFrame(final JInternalFrame frame,\r
139         String title, int w, int h)\r
140     {\r
141         addInternalFrame(frame, title, w, h, true);\r
142     }\r
143 \r
144     /**\r
145      * DOCUMENT ME!\r
146      *\r
147      * @param frame DOCUMENT ME!\r
148      * @param title DOCUMENT ME!\r
149      * @param w DOCUMENT ME!\r
150      * @param h DOCUMENT ME!\r
151      * @param resizable DOCUMENT ME!\r
152      */\r
153     public static synchronized void addInternalFrame(final JInternalFrame frame,\r
154         String title, int w, int h, boolean resizable)\r
155     {\r
156 \r
157       frame.setTitle(title);\r
158       if(frame.getWidth()<1 || frame.getHeight()<1)\r
159       {\r
160         frame.setSize(w, h);\r
161       }\r
162       // THIS IS A PUBLIC STATIC METHOD, SO IT MAY BE CALLED EVEN IN\r
163       // A HEADLESS STATE WHEN NO DESKTOP EXISTS. MUST RETURN\r
164       // IF JALVIEW IS RUNNING HEADLESS\r
165       /////////////////////////////////////////////////\r
166       if (System.getProperty("java.awt.headless") != null\r
167           && System.getProperty("java.awt.headless").equals("true"))\r
168       {\r
169         return;\r
170       }\r
171 \r
172 \r
173         openFrameCount++;\r
174 \r
175         frame.setVisible(true);\r
176         frame.setClosable(true);\r
177         frame.setResizable(resizable);\r
178         frame.setMaximizable(resizable);\r
179         frame.setIconifiable(resizable);\r
180         frame.setFrameIcon(null);\r
181 \r
182         if (frame.getX()<1 && frame.getY()<1)\r
183        {\r
184          frame.setLocation(xOffset * openFrameCount, yOffset * ((openFrameCount-1)%10)+yOffset);\r
185        }\r
186 \r
187         final JMenuItem menuItem = new JMenuItem(title);\r
188         frame.addInternalFrameListener(new javax.swing.event.InternalFrameAdapter()\r
189             {\r
190               public void internalFrameActivated(javax.swing.event.\r
191                                                  InternalFrameEvent evt)\r
192               {\r
193                 JInternalFrame itf = desktop.getSelectedFrame();\r
194                 if (itf != null)\r
195                   itf.requestFocus();\r
196 \r
197               }\r
198 \r
199                 public void internalFrameClosed(\r
200                     javax.swing.event.InternalFrameEvent evt)\r
201                 {\r
202                     openFrameCount--;\r
203                     windowMenu.remove(menuItem);\r
204                     JInternalFrame itf = desktop.getSelectedFrame();\r
205                        if (itf != null)\r
206                         itf.requestFocus();\r
207                 }\r
208                 ;\r
209             });\r
210 \r
211         menuItem.addActionListener(new ActionListener()\r
212             {\r
213                 public void actionPerformed(ActionEvent e)\r
214                 {\r
215                     try\r
216                     {\r
217                         frame.setSelected(true);\r
218                         frame.setIcon(false);\r
219                     }\r
220                     catch (java.beans.PropertyVetoException ex)\r
221                     {\r
222 \r
223                     }\r
224                 }\r
225             });\r
226 \r
227         windowMenu.add(menuItem);\r
228 \r
229         desktop.add(frame);\r
230         frame.toFront();\r
231         try{\r
232           frame.setSelected(true);\r
233           frame.requestFocus();\r
234         }catch(java.beans.PropertyVetoException ve)\r
235         {}\r
236     }\r
237 \r
238     public void dragEnter(DropTargetDragEvent evt)\r
239     {}\r
240 \r
241     public void dragExit(DropTargetEvent evt)\r
242     {}\r
243 \r
244     public void dragOver(DropTargetDragEvent evt)\r
245     {}\r
246 \r
247     public void dropActionChanged(DropTargetDragEvent evt)\r
248     {}\r
249 \r
250     /**\r
251      * DOCUMENT ME!\r
252      *\r
253      * @param evt DOCUMENT ME!\r
254      */\r
255     public void drop(DropTargetDropEvent evt)\r
256     {\r
257         Transferable t = evt.getTransferable();\r
258         java.util.List files = null;\r
259 \r
260         try\r
261         {\r
262           DataFlavor uriListFlavor = new DataFlavor("text/uri-list;class=java.lang.String");\r
263           if (t.isDataFlavorSupported(DataFlavor.javaFileListFlavor))\r
264           {\r
265             //Works on Windows and MacOSX\r
266             evt.acceptDrop(DnDConstants.ACTION_COPY_OR_MOVE);\r
267             files = (java.util.List) t.getTransferData(DataFlavor.javaFileListFlavor);\r
268           }\r
269           else if (t.isDataFlavorSupported(uriListFlavor))\r
270           {\r
271             // This is used by Unix drag system\r
272             evt.acceptDrop(DnDConstants.ACTION_COPY_OR_MOVE);\r
273             String data = (String) t.getTransferData(uriListFlavor);\r
274             files = new java.util.ArrayList(1);\r
275             for (java.util.StringTokenizer st = new java.util.StringTokenizer(\r
276                 data,\r
277                 "\r\n");\r
278                  st.hasMoreTokens(); )\r
279             {\r
280               String s = st.nextToken();\r
281               if (s.startsWith("#"))\r
282               {\r
283                 // the line is a comment (as per the RFC 2483)\r
284                 continue;\r
285               }\r
286 \r
287               java.net.URI uri = new java.net.URI(s);\r
288               java.io.File file = new java.io.File(uri);\r
289               files.add(file);\r
290             }\r
291           }\r
292         }\r
293         catch (Exception e)\r
294         {\r
295           e.printStackTrace();\r
296         }\r
297 \r
298         if (files != null)\r
299         {\r
300           try\r
301           {\r
302             for (int i = 0; i < files.size(); i++)\r
303             {\r
304               String file = files.get(i).toString();\r
305               String protocol = FormatAdapter.FILE;\r
306               String format = null;\r
307 \r
308               if (file.endsWith(".jar"))\r
309               {\r
310                 format = "Jalview";\r
311 \r
312               }\r
313               else\r
314               {\r
315                 format = new IdentifyFile().Identify(file,\r
316                                                           protocol);\r
317               }\r
318               LoadFile(file, protocol, format);\r
319             }\r
320           }\r
321           catch (Exception ex)\r
322           {\r
323             ex.printStackTrace();\r
324           }\r
325         }\r
326     }\r
327 \r
328     /**\r
329      * DOCUMENT ME!\r
330      *\r
331      * @param e DOCUMENT ME!\r
332      */\r
333     public void inputLocalFileMenuItem_actionPerformed(ActionEvent e)\r
334     {\r
335         JalviewFileChooser chooser = new JalviewFileChooser(jalview.bin.Cache.getProperty(\r
336                     "LAST_DIRECTORY"),\r
337                 new String[]\r
338                 {\r
339                     "fa, fasta, fastq", "aln", "pfam", "msf", "pir", "blc",\r
340                     "jar"\r
341                 },\r
342                 new String[]\r
343                 {\r
344                     "Fasta", "Clustal", "PFAM", "MSF", "PIR", "BLC", "Jalview"\r
345                 }, jalview.bin.Cache.getProperty("DEFAULT_FILE_FORMAT"));\r
346 \r
347         chooser.setFileView(new JalviewFileView());\r
348         chooser.setDialogTitle("Open local file");\r
349         chooser.setToolTipText("Open");\r
350 \r
351         int value = chooser.showOpenDialog(this);\r
352 \r
353         if (value == JalviewFileChooser.APPROVE_OPTION)\r
354         {\r
355             String choice = chooser.getSelectedFile().getPath();\r
356             jalview.bin.Cache.setProperty("LAST_DIRECTORY",\r
357                 chooser.getSelectedFile().getParent());\r
358 \r
359             String format = null;\r
360             if (chooser.getSelectedFormat().equals("Jalview"))\r
361             {\r
362               format = "Jalview";\r
363             }\r
364             else\r
365             {\r
366                 format = new IdentifyFile().Identify(choice, FormatAdapter.FILE);\r
367             }\r
368 \r
369             jalview.bin.Cache.setProperty("DEFAULT_FILE_FORMAT", format);\r
370             LoadFile(choice, FormatAdapter.FILE, format);\r
371         }\r
372     }\r
373 \r
374     /**\r
375      * DOCUMENT ME!\r
376      *\r
377      * @param file DOCUMENT ME!\r
378      * @param protocol DOCUMENT ME!\r
379      * @param format DOCUMENT ME!\r
380      */\r
381     public void LoadFile(String file, String protocol, String format)\r
382     {\r
383       FileLoader fileLoader = new FileLoader();\r
384       fileLoader.LoadFile(file, protocol, format);\r
385     }\r
386 \r
387     /**\r
388      * DOCUMENT ME!\r
389      *\r
390      * @param e DOCUMENT ME!\r
391      */\r
392     public void inputURLMenuItem_actionPerformed(ActionEvent e)\r
393     {\r
394       // This construct allows us to have a wider textfield\r
395       // for viewing\r
396       JLabel label = new JLabel("Enter URL of Input File");\r
397       JTextField textinput = new JTextField("http://www.", 40);\r
398       JPanel panel = new JPanel(new BorderLayout());\r
399       panel.add(label, BorderLayout.NORTH);\r
400       panel.add(textinput, BorderLayout.SOUTH);\r
401 \r
402 \r
403        int reply = JOptionPane.showInternalConfirmDialog(desktop,\r
404           panel, "Input Alignment From URL",\r
405           JOptionPane.OK_CANCEL_OPTION );\r
406 \r
407 \r
408         if (reply != JOptionPane.OK_OPTION )\r
409         {\r
410             return;\r
411         }\r
412 \r
413         String url = textinput.getText();\r
414 \r
415         if (url.toLowerCase().endsWith(".jar"))\r
416         {\r
417                jalview.bin.Cache.setProperty("DEFAULT_FILE_FORMAT", "Jalview");\r
418                Jalview2XML.LoadJalviewAlign(url);\r
419         }\r
420         else\r
421         {\r
422 \r
423           String format = new IdentifyFile().Identify(url, FormatAdapter.URL);\r
424 \r
425           if (format.equals("URL NOT FOUND"))\r
426           {\r
427             JOptionPane.showInternalMessageDialog(Desktop.desktop,\r
428                                                   "Couldn't locate " + url,\r
429                                                   "URL not found",\r
430                                                   JOptionPane.WARNING_MESSAGE);\r
431 \r
432             return;\r
433           }\r
434 \r
435           LoadFile(url, FormatAdapter.URL, format);\r
436         }\r
437     }\r
438 \r
439     /**\r
440      * DOCUMENT ME!\r
441      *\r
442      * @param e DOCUMENT ME!\r
443      */\r
444     public void inputTextboxMenuItem_actionPerformed(ActionEvent e)\r
445     {\r
446         CutAndPasteTransfer cap = new CutAndPasteTransfer();\r
447         cap.setForInput();\r
448         Desktop.addInternalFrame(cap, "Cut & Paste Alignment File", 600, 500);\r
449     }\r
450 \r
451     /*\r
452      * Exit the program\r
453      */\r
454     public void quit()\r
455     {\r
456         jalview.bin.Cache.setProperty("SCREEN_X", getBounds().x + "");\r
457         jalview.bin.Cache.setProperty("SCREEN_Y", getBounds().y + "");\r
458         jalview.bin.Cache.setProperty("SCREEN_WIDTH", getWidth() + "");\r
459         jalview.bin.Cache.setProperty("SCREEN_HEIGHT", getHeight() + "");\r
460         System.exit(0);\r
461     }\r
462 \r
463     /**\r
464      * DOCUMENT ME!\r
465      *\r
466      * @param e DOCUMENT ME!\r
467      */\r
468     public void aboutMenuItem_actionPerformed(ActionEvent e)\r
469     {\r
470       StringBuffer message = new StringBuffer("JalView version " +\r
471                                               jalview.bin.Cache.getProperty(\r
472           "VERSION") +\r
473                                               "; last updated: " +\r
474                                               jalview.bin.\r
475                                               Cache.getDefault("BUILD_DATE", "unknown"));\r
476 \r
477       if (!jalview.bin.Cache.getProperty("LATEST_VERSION").equals(\r
478           jalview.bin.Cache.getProperty("VERSION")))\r
479       {\r
480         message.append("\n\n!! Jalview version "\r
481                        + jalview.bin.Cache.getProperty("LATEST_VERSION")\r
482                        + " is available for download from http://www.jalview.org !!\n");\r
483 \r
484       }\r
485 \r
486       message.append( "\nAuthors:  Michele Clamp, James Cuff, Steve Searle, Andrew Waterhouse, Jim Procter & Geoff Barton." +\r
487             "\nCurrent development managed by Andrew Waterhouse; Barton Group, University of Dundee." +\r
488             "\nFor all issues relating to Jalview, email help@jalview.org" +\r
489             "\n\nIf  you use JalView, please cite:" +\r
490             "\n\"Clamp, M., Cuff, J., Searle, S. M. and Barton, G. J. (2004), The Jalview Java Alignment Editor\"" +\r
491             "\nBioinformatics,  2004 12;426-7.");\r
492 \r
493         JOptionPane.showInternalMessageDialog(Desktop.desktop,\r
494 \r
495            message.toString(), "About Jalview",\r
496             JOptionPane.INFORMATION_MESSAGE);\r
497     }\r
498 \r
499     /**\r
500      * DOCUMENT ME!\r
501      *\r
502      * @param e DOCUMENT ME!\r
503      */\r
504     public void documentationMenuItem_actionPerformed(ActionEvent e)\r
505     {\r
506         try\r
507         {\r
508             ClassLoader cl = jalview.gui.Desktop.class.getClassLoader();\r
509             java.net.URL url = javax.help.HelpSet.findHelpSet(cl, "help/help");\r
510             javax.help.HelpSet hs = new javax.help.HelpSet(cl, url);\r
511 \r
512             javax.help.HelpBroker hb = hs.createHelpBroker();\r
513             hb.setCurrentID("home");\r
514             hb.setDisplayed(true);\r
515         }\r
516         catch (Exception ex)\r
517         {\r
518             ex.printStackTrace();\r
519         }\r
520     }\r
521 \r
522     /**\r
523      * DOCUMENT ME!\r
524      *\r
525      * @param e DOCUMENT ME!\r
526      */\r
527     protected void preferences_actionPerformed(ActionEvent e)\r
528     {\r
529         new Preferences();\r
530     }\r
531 \r
532     /**\r
533      * DOCUMENT ME!\r
534      *\r
535      * @param e DOCUMENT ME!\r
536      */\r
537     public void saveState_actionPerformed(ActionEvent e)\r
538     {\r
539         JalviewFileChooser chooser = new JalviewFileChooser(jalview.bin.Cache.getProperty(\r
540                     "LAST_DIRECTORY"), new String[] { "jar" },\r
541                 new String[] { "Jalview Project" }, "Jalview Project");\r
542 \r
543         chooser.setFileView(new JalviewFileView());\r
544         chooser.setDialogTitle("Save State");\r
545 \r
546         int value = chooser.showSaveDialog(this);\r
547 \r
548         if (value == JalviewFileChooser.APPROVE_OPTION)\r
549         {\r
550             java.io.File choice = chooser.getSelectedFile();\r
551             jalview.bin.Cache.setProperty("LAST_DIRECTORY", choice.getParent());\r
552             Jalview2XML.SaveState(choice);\r
553         }\r
554     }\r
555 \r
556     /**\r
557      * DOCUMENT ME!\r
558      *\r
559      * @param e DOCUMENT ME!\r
560      */\r
561     public void loadState_actionPerformed(ActionEvent e)\r
562     {\r
563         JalviewFileChooser chooser = new JalviewFileChooser(jalview.bin.Cache.getProperty(\r
564                     "LAST_DIRECTORY"), new String[] { "jar" },\r
565                 new String[] { "Jalview Project" }, "Jalview Project");\r
566         chooser.setFileView(new JalviewFileView());\r
567         chooser.setDialogTitle("Restore state");\r
568 \r
569         int value = chooser.showOpenDialog(this);\r
570 \r
571         if (value == JalviewFileChooser.APPROVE_OPTION)\r
572         {\r
573             String choice = chooser.getSelectedFile().getAbsolutePath();\r
574             jalview.bin.Cache.setProperty("LAST_DIRECTORY",\r
575                 chooser.getSelectedFile().getParent());\r
576             Jalview2XML.LoadJalviewAlign(choice);\r
577         }\r
578     }\r
579 \r
580   /*  public void vamsasLoad_actionPerformed(ActionEvent e)\r
581     {\r
582       JalviewFileChooser chooser = new JalviewFileChooser(jalview.bin.Cache.\r
583           getProperty("LAST_DIRECTORY"));\r
584 \r
585       chooser.setFileView(new JalviewFileView());\r
586       chooser.setDialogTitle("Load Vamsas file");\r
587       chooser.setToolTipText("Import");\r
588 \r
589       int value = chooser.showOpenDialog(this);\r
590 \r
591       if (value == JalviewFileChooser.APPROVE_OPTION)\r
592       {\r
593         jalview.io.VamsasDatastore vs = new jalview.io.VamsasDatastore(null);\r
594         vs.load(\r
595             chooser.getSelectedFile().getAbsolutePath()\r
596             );\r
597       }\r
598 \r
599     }*/\r
600 \r
601 \r
602     public void inputSequence_actionPerformed(ActionEvent e)\r
603     {\r
604       SequenceFetcher sf = new SequenceFetcher(null);\r
605     }\r
606 }\r
607 \r