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