modified constructor for jalview.gui.VamsasClient
[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 import org.vamsas.test.simpleclient.ArchiveClient;\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     public static jalview.ws.Discoverer discoverer;\r
48 \r
49     public static Object [] jalviewClipboard;\r
50 \r
51 \r
52     /**\r
53      * Creates a new Desktop object.\r
54      */\r
55     public Desktop()\r
56     {\r
57         Image image = null;\r
58 \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 dragEnter(DropTargetDragEvent evt)\r
241     {}\r
242 \r
243     public void dragExit(DropTargetEvent evt)\r
244     {}\r
245 \r
246     public void dragOver(DropTargetDragEvent evt)\r
247     {}\r
248 \r
249     public void dropActionChanged(DropTargetDragEvent evt)\r
250     {}\r
251 \r
252     /**\r
253      * DOCUMENT ME!\r
254      *\r
255      * @param evt DOCUMENT ME!\r
256      */\r
257     public void drop(DropTargetDropEvent evt)\r
258     {\r
259         Transferable t = evt.getTransferable();\r
260         java.util.List files = null;\r
261 \r
262         try\r
263         {\r
264           DataFlavor uriListFlavor = new DataFlavor("text/uri-list;class=java.lang.String");\r
265           if (t.isDataFlavorSupported(DataFlavor.javaFileListFlavor))\r
266           {\r
267             //Works on Windows and MacOSX\r
268             evt.acceptDrop(DnDConstants.ACTION_COPY_OR_MOVE);\r
269             files = (java.util.List) t.getTransferData(DataFlavor.javaFileListFlavor);\r
270           }\r
271           else if (t.isDataFlavorSupported(uriListFlavor))\r
272           {\r
273             // This is used by Unix drag system\r
274             evt.acceptDrop(DnDConstants.ACTION_COPY_OR_MOVE);\r
275             String data = (String) t.getTransferData(uriListFlavor);\r
276             files = new java.util.ArrayList(1);\r
277             for (java.util.StringTokenizer st = new java.util.StringTokenizer(\r
278                 data,\r
279                 "\r\n");\r
280                  st.hasMoreTokens(); )\r
281             {\r
282               String s = st.nextToken();\r
283               if (s.startsWith("#"))\r
284               {\r
285                 // the line is a comment (as per the RFC 2483)\r
286                 continue;\r
287               }\r
288 \r
289               java.net.URI uri = new java.net.URI(s);\r
290               java.io.File file = new java.io.File(uri);\r
291               files.add(file);\r
292             }\r
293           }\r
294         }\r
295         catch (Exception e)\r
296         {\r
297           e.printStackTrace();\r
298         }\r
299 \r
300         if (files != null)\r
301         {\r
302           try\r
303           {\r
304             for (int i = 0; i < files.size(); i++)\r
305             {\r
306               String file = files.get(i).toString();\r
307               String protocol = FormatAdapter.FILE;\r
308               String format = null;\r
309 \r
310               if (file.endsWith(".jar"))\r
311               {\r
312                 format = "Jalview";\r
313 \r
314               }\r
315               else\r
316               {\r
317                 format = new IdentifyFile().Identify(file,\r
318                                                           protocol);\r
319               }\r
320               LoadFile(file, protocol, format);\r
321             }\r
322           }\r
323           catch (Exception ex)\r
324           {\r
325             ex.printStackTrace();\r
326           }\r
327         }\r
328     }\r
329 \r
330     /**\r
331      * DOCUMENT ME!\r
332      *\r
333      * @param e DOCUMENT ME!\r
334      */\r
335     public void inputLocalFileMenuItem_actionPerformed(ActionEvent e)\r
336     {\r
337         JalviewFileChooser chooser = new JalviewFileChooser(jalview.bin.Cache.getProperty(\r
338                     "LAST_DIRECTORY"),\r
339                 new String[]\r
340                 {\r
341                     "fa, fasta, fastq", "aln", "pfam", "msf", "pir", "blc",\r
342                     "jar"\r
343                 },\r
344                 new String[]\r
345                 {\r
346                     "Fasta", "Clustal", "PFAM", "MSF", "PIR", "BLC", "Jalview"\r
347                 }, jalview.bin.Cache.getProperty("DEFAULT_FILE_FORMAT"));\r
348 \r
349         chooser.setFileView(new JalviewFileView());\r
350         chooser.setDialogTitle("Open local file");\r
351         chooser.setToolTipText("Open");\r
352 \r
353         int value = chooser.showOpenDialog(this);\r
354 \r
355         if (value == JalviewFileChooser.APPROVE_OPTION)\r
356         {\r
357             String choice = chooser.getSelectedFile().getPath();\r
358             jalview.bin.Cache.setProperty("LAST_DIRECTORY",\r
359                 chooser.getSelectedFile().getParent());\r
360 \r
361             String format = null;\r
362             if (chooser.getSelectedFormat().equals("Jalview"))\r
363             {\r
364               format = "Jalview";\r
365             }\r
366             else\r
367             {\r
368                 format = new IdentifyFile().Identify(choice, FormatAdapter.FILE);\r
369             }\r
370 \r
371             jalview.bin.Cache.setProperty("DEFAULT_FILE_FORMAT", format);\r
372             LoadFile(choice, FormatAdapter.FILE, format);\r
373         }\r
374     }\r
375 \r
376     /**\r
377      * DOCUMENT ME!\r
378      *\r
379      * @param file DOCUMENT ME!\r
380      * @param protocol DOCUMENT ME!\r
381      * @param format DOCUMENT ME!\r
382      */\r
383     public void LoadFile(String file, String protocol, String format)\r
384     {\r
385       FileLoader fileLoader = new FileLoader();\r
386       fileLoader.LoadFile(file, protocol, format);\r
387     }\r
388 \r
389     /**\r
390      * DOCUMENT ME!\r
391      *\r
392      * @param e DOCUMENT ME!\r
393      */\r
394     public void inputURLMenuItem_actionPerformed(ActionEvent e)\r
395     {\r
396       // This construct allows us to have a wider textfield\r
397       // for viewing\r
398       JLabel label = new JLabel("Enter URL of Input File");\r
399       JTextField textinput = new JTextField("http://www.", 40);\r
400       JPanel panel = new JPanel(new BorderLayout());\r
401       panel.add(label, BorderLayout.NORTH);\r
402       panel.add(textinput, BorderLayout.SOUTH);\r
403 \r
404 \r
405        int reply = JOptionPane.showInternalConfirmDialog(desktop,\r
406           panel, "Input Alignment From URL",\r
407           JOptionPane.OK_CANCEL_OPTION );\r
408 \r
409 \r
410         if (reply != JOptionPane.OK_OPTION )\r
411         {\r
412             return;\r
413         }\r
414 \r
415         String url = textinput.getText();\r
416 \r
417         if (url.toLowerCase().endsWith(".jar"))\r
418         {\r
419                jalview.bin.Cache.setProperty("DEFAULT_FILE_FORMAT", "Jalview");\r
420                Jalview2XML.LoadJalviewAlign(url);\r
421         }\r
422         else\r
423         {\r
424 \r
425           String format = new IdentifyFile().Identify(url, FormatAdapter.URL);\r
426 \r
427           if (format.equals("URL NOT FOUND"))\r
428           {\r
429             JOptionPane.showInternalMessageDialog(Desktop.desktop,\r
430                                                   "Couldn't locate " + url,\r
431                                                   "URL not found",\r
432                                                   JOptionPane.WARNING_MESSAGE);\r
433 \r
434             return;\r
435           }\r
436 \r
437           LoadFile(url, FormatAdapter.URL, format);\r
438         }\r
439     }\r
440 \r
441     /**\r
442      * DOCUMENT ME!\r
443      *\r
444      * @param e DOCUMENT ME!\r
445      */\r
446     public void inputTextboxMenuItem_actionPerformed(ActionEvent e)\r
447     {\r
448         CutAndPasteTransfer cap = new CutAndPasteTransfer();\r
449         cap.setForInput();\r
450         Desktop.addInternalFrame(cap, "Cut & Paste Alignment File", 600, 500);\r
451     }\r
452 \r
453     /*\r
454      * Exit the program\r
455      */\r
456     public void quit()\r
457     {\r
458         jalview.bin.Cache.setProperty("SCREEN_X", getBounds().x + "");\r
459         jalview.bin.Cache.setProperty("SCREEN_Y", getBounds().y + "");\r
460         jalview.bin.Cache.setProperty("SCREEN_WIDTH", getWidth() + "");\r
461         jalview.bin.Cache.setProperty("SCREEN_HEIGHT", getHeight() + "");\r
462         System.exit(0);\r
463     }\r
464 \r
465     /**\r
466      * DOCUMENT ME!\r
467      *\r
468      * @param e DOCUMENT ME!\r
469      */\r
470     public void aboutMenuItem_actionPerformed(ActionEvent e)\r
471     {\r
472       StringBuffer message = new StringBuffer("JalView version " +\r
473                                               jalview.bin.Cache.getProperty(\r
474           "VERSION") +\r
475                                               "; last updated: " +\r
476                                               jalview.bin.\r
477                                               Cache.getDefault("BUILD_DATE", "unknown"));\r
478 \r
479       if (!jalview.bin.Cache.getProperty("LATEST_VERSION").equals(\r
480           jalview.bin.Cache.getProperty("VERSION")))\r
481       {\r
482         message.append("\n\n!! Jalview version "\r
483                        + jalview.bin.Cache.getProperty("LATEST_VERSION")\r
484                        + " is available for download from http://www.jalview.org !!\n");\r
485 \r
486       }\r
487 \r
488       message.append( "\nAuthors:  Michele Clamp, James Cuff, Steve Searle, Andrew Waterhouse, Jim Procter & Geoff Barton." +\r
489             "\nCurrent development managed by Andrew Waterhouse; Barton Group, University of Dundee." +\r
490             "\nFor all issues relating to Jalview, email help@jalview.org" +\r
491             "\n\nIf  you use JalView, please cite:" +\r
492             "\n\"Clamp, M., Cuff, J., Searle, S. M. and Barton, G. J. (2004), The Jalview Java Alignment Editor\"" +\r
493             "\nBioinformatics,  2004 12;426-7.");\r
494 \r
495         JOptionPane.showInternalMessageDialog(Desktop.desktop,\r
496 \r
497            message.toString(), "About Jalview",\r
498             JOptionPane.INFORMATION_MESSAGE);\r
499     }\r
500 \r
501     /**\r
502      * DOCUMENT ME!\r
503      *\r
504      * @param e DOCUMENT ME!\r
505      */\r
506     public void documentationMenuItem_actionPerformed(ActionEvent e)\r
507     {\r
508         try\r
509         {\r
510             ClassLoader cl = jalview.gui.Desktop.class.getClassLoader();\r
511             java.net.URL url = javax.help.HelpSet.findHelpSet(cl, "help/help");\r
512             javax.help.HelpSet hs = new javax.help.HelpSet(cl, url);\r
513 \r
514             javax.help.HelpBroker hb = hs.createHelpBroker();\r
515             hb.setCurrentID("home");\r
516             hb.setDisplayed(true);\r
517         }\r
518         catch (Exception ex)\r
519         {\r
520             ex.printStackTrace();\r
521         }\r
522     }\r
523 \r
524     /**\r
525      * DOCUMENT ME!\r
526      *\r
527      * @param e DOCUMENT ME!\r
528      */\r
529     protected void preferences_actionPerformed(ActionEvent e)\r
530     {\r
531         new Preferences();\r
532     }\r
533 \r
534     /**\r
535      * DOCUMENT ME!\r
536      *\r
537      * @param e DOCUMENT ME!\r
538      */\r
539     public void saveState_actionPerformed(ActionEvent e)\r
540     {\r
541         JalviewFileChooser chooser = new JalviewFileChooser(jalview.bin.Cache.getProperty(\r
542                     "LAST_DIRECTORY"), new String[] { "jar" },\r
543                 new String[] { "Jalview Project" }, "Jalview Project");\r
544 \r
545         chooser.setFileView(new JalviewFileView());\r
546         chooser.setDialogTitle("Save State");\r
547 \r
548         int value = chooser.showSaveDialog(this);\r
549 \r
550         if (value == JalviewFileChooser.APPROVE_OPTION)\r
551         {\r
552             java.io.File choice = chooser.getSelectedFile();\r
553             jalview.bin.Cache.setProperty("LAST_DIRECTORY", choice.getParent());\r
554             Jalview2XML.SaveState(choice);\r
555         }\r
556     }\r
557 \r
558     /**\r
559      * DOCUMENT ME!\r
560      *\r
561      * @param e DOCUMENT ME!\r
562      */\r
563     public void loadState_actionPerformed(ActionEvent e)\r
564     {\r
565         JalviewFileChooser chooser = new JalviewFileChooser(jalview.bin.Cache.getProperty(\r
566                     "LAST_DIRECTORY"), new String[] { "jar" },\r
567                 new String[] { "Jalview Project" }, "Jalview Project");\r
568         chooser.setFileView(new JalviewFileView());\r
569         chooser.setDialogTitle("Restore state");\r
570 \r
571         int value = chooser.showOpenDialog(this);\r
572 \r
573         if (value == JalviewFileChooser.APPROVE_OPTION)\r
574         {\r
575             String choice = chooser.getSelectedFile().getAbsolutePath();\r
576             jalview.bin.Cache.setProperty("LAST_DIRECTORY",\r
577                 chooser.getSelectedFile().getParent());\r
578             Jalview2XML.LoadJalviewAlign(choice);\r
579         }\r
580     }\r
581     jalview.gui.VamsasClient v_client=null;\r
582     public void vamsasLoad_actionPerformed(ActionEvent e)\r
583     {\r
584       if (v_client==null) {\r
585         // Start a session.\r
586         JalviewFileChooser chooser = new JalviewFileChooser(jalview.bin.Cache.\r
587             getProperty("LAST_DIRECTORY"));\r
588 \r
589         chooser.setFileView(new JalviewFileView());\r
590         chooser.setDialogTitle("Load Vamsas file");\r
591         chooser.setToolTipText("Import");\r
592 \r
593         int value = chooser.showOpenDialog(this);\r
594 \r
595         if (value == JalviewFileChooser.APPROVE_OPTION)\r
596         {\r
597           v_client = new jalview.gui.VamsasClient(this,\r
598               chooser.getSelectedFile());\r
599           this.vamsasLoad.setText("Session Update");\r
600           this.vamsasStop.setVisible(true);\r
601           v_client.initial_update();\r
602         }\r
603       } else {\r
604         // store current data in session.\r
605           v_client.push_update();\r
606       }\r
607     }\r
608     public void vamsasStop_actionPerformed(ActionEvent e) {\r
609         if (v_client!=null) {\r
610                 v_client.end_session();\r
611                 v_client=null;\r
612                 this.vamsasStop.setVisible(false);\r
613                 this.vamsasLoad.setText("Start Vamsas Session...");\r
614         }\r
615     }\r
616     \r
617     public void inputSequence_actionPerformed(ActionEvent e)\r
618     {\r
619       SequenceFetcher sf = new SequenceFetcher(null);\r
620     }\r
621 \r
622 }\r
623 \r