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