f1464b62e426cb2e6ecd6cd7944596af125bdbcc
[jalview.git] / src / jalview / bin / JalviewLite.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.bin;\r
20 \r
21 import jalview.appletgui.AlignFrame;\r
22 \r
23 import jalview.datamodel.*;\r
24 \r
25 import jalview.io.*;\r
26 \r
27 import java.applet.*;\r
28 \r
29 import java.awt.*;\r
30 import java.awt.event.*;\r
31 \r
32 \r
33 /**\r
34  * Jalview Applet. Runs in Java 1.18 runtime\r
35  *\r
36  * @author $author$\r
37  * @version $Revision$\r
38  */\r
39 public class JalviewLite extends Applet\r
40 {\r
41     static int lastFrameX = 200;\r
42     static int lastFrameY = 200;\r
43     boolean fileFound = true;\r
44     String file = "No file";\r
45     Button launcher = new Button("Start Jalview");\r
46 \r
47     //The currentAlignFrame is static, it will change\r
48     //if and when the user selects a new window\r
49     static AlignFrame currentAlignFrame;\r
50 \r
51     //This is the first frame to be displayed, and does not change\r
52     AlignFrame initialAlignFrame;\r
53 \r
54     boolean embedded = false;\r
55 \r
56 \r
57     /**\r
58      * init method for Jalview Applet\r
59      */\r
60     public void init()\r
61     {\r
62         int r = 255;\r
63         int g = 255;\r
64         int b = 255;\r
65         String param = getParameter("RGB");\r
66 \r
67         if (param != null)\r
68         {\r
69             try\r
70             {\r
71                 r = Integer.parseInt(param.substring(0, 2), 16);\r
72                 g = Integer.parseInt(param.substring(2, 4), 16);\r
73                 b = Integer.parseInt(param.substring(4, 6), 16);\r
74             }\r
75             catch (Exception ex)\r
76             {\r
77                 r = 255;\r
78                 g = 255;\r
79                 b = 255;\r
80             }\r
81         }\r
82 \r
83         param = getParameter("label");\r
84         if(param != null)\r
85           launcher.setLabel(param);\r
86 \r
87         this.setBackground(new Color(r, g, b));\r
88 \r
89         file = getParameter("file");\r
90 \r
91         if(file==null)\r
92         {\r
93           //Maybe the sequences are added as parameters\r
94           StringBuffer data = new StringBuffer("PASTE");\r
95           int i=1;\r
96           while( (file=getParameter("sequence"+i))!=null)\r
97           {\r
98             data.append(file.toString()+"\n");\r
99             i++;\r
100           }\r
101           if(data.length()>5)\r
102             file = data.toString();\r
103         }\r
104 \r
105         final JalviewLite applet = this;\r
106         if(getParameter("embedded")!=null\r
107            && getParameter("embedded").equalsIgnoreCase("true"))\r
108         {\r
109           embedded = true;\r
110           LoadingThread loader = new LoadingThread(file, applet);\r
111           loader.start();\r
112         }\r
113         else if (file != null)\r
114         {\r
115             add(launcher);\r
116 \r
117             launcher.addActionListener(new java.awt.event.ActionListener()\r
118                 {\r
119                     public void actionPerformed(ActionEvent e)\r
120                     {\r
121                         LoadingThread loader = new LoadingThread(file,\r
122                             applet);\r
123                         loader.start();\r
124                       }\r
125                 });\r
126         }\r
127         else\r
128         {\r
129             file = "NO FILE";\r
130             fileFound = false;\r
131         }\r
132     }\r
133 \r
134 \r
135     public static void main(String [] args)\r
136     {\r
137       if(args.length!=1)\r
138       {\r
139         System.out.println("\nUsage: java -jar jalviewApplet.jar fileName\n");\r
140         System.exit(1);\r
141       }\r
142 \r
143       String format = new jalview.io.IdentifyFile().Identify(args[0],AppletFormatAdapter.FILE);\r
144 \r
145       SequenceI[] sequences = null;\r
146      try{\r
147        sequences = new AppletFormatAdapter().readFile(args[0], AppletFormatAdapter.FILE, format);\r
148      }catch(java.io.IOException ex)\r
149      {\r
150        ex.printStackTrace();\r
151      }\r
152       if ( (sequences != null) && (sequences.length > 0))\r
153       {\r
154         AlignFrame af = new AlignFrame(new Alignment(sequences), null, args[0], false);\r
155         af.statusBar.setText("Successfully loaded file " + args[0]);\r
156       }\r
157     }\r
158 \r
159 \r
160     /**\r
161      * Initialises and displays a new java.awt.Frame\r
162      *\r
163      * @param frame java.awt.Frame to be displayed\r
164      * @param title title of new frame\r
165      * @param width width if new frame\r
166      * @param height height of new frame\r
167      */\r
168     public static void addFrame(final Frame frame, String title, int width,\r
169         int height)\r
170     {\r
171         frame.setLocation(lastFrameX, lastFrameY);\r
172         lastFrameX += 40;\r
173         lastFrameY += 40;\r
174         frame.setSize(width, height);\r
175         frame.setTitle(title);\r
176         frame.addWindowListener(new WindowAdapter()\r
177             {\r
178                 public void windowClosing(WindowEvent e)\r
179                 {\r
180                     if(currentAlignFrame == frame)\r
181                     {\r
182                       currentAlignFrame = null;\r
183                     }\r
184                     lastFrameX -=40;\r
185                     lastFrameY -=40;\r
186                     frame.setMenuBar(null);\r
187                     frame.dispose();\r
188                 }\r
189                 public void windowActivated(WindowEvent e)\r
190                 {\r
191                   if(frame instanceof AlignFrame)\r
192                     currentAlignFrame = (AlignFrame)frame;\r
193                 }\r
194 \r
195             });\r
196         frame.setVisible(true);\r
197     }\r
198 \r
199     public String getSelectedSequences()\r
200     {\r
201       StringBuffer result = new StringBuffer("");\r
202 \r
203       if(initialAlignFrame.viewport.getSelectionGroup()!=null)\r
204       {\r
205         SequenceI[] seqs = initialAlignFrame.viewport.getSelectionGroup().\r
206             getSequencesInOrder(\r
207                 initialAlignFrame.viewport.getAlignment());\r
208 \r
209         for (int i = 0; i < seqs.length; i++)\r
210           result.append(seqs[i].getName() + "¬");\r
211       }\r
212 \r
213       return result.toString();\r
214     }\r
215 \r
216     public String getAlignment(String format)\r
217     {\r
218       return getAlignment(format, "true");\r
219     }\r
220 \r
221     public String getAlignment(String format, String suffix)\r
222     {\r
223       try\r
224       {\r
225         boolean seqlimits = suffix.equalsIgnoreCase("true");\r
226 \r
227         String reply = new AppletFormatAdapter().formatSequences(format,\r
228             currentAlignFrame.viewport.getAlignment().getSequences(), seqlimits);\r
229         return reply;\r
230       }\r
231       catch (Exception ex)\r
232       {\r
233         ex.printStackTrace();\r
234         return "Error retrieving alignment in " + format + " format. ";\r
235       }\r
236     }\r
237 \r
238     /**\r
239      * This paints the background surrounding the "Launch Jalview button"\r
240      * <br>\r
241      * <br>If file given in parameter not found, displays error message\r
242      *\r
243      * @param g graphics context\r
244      */\r
245     public void paint(Graphics g)\r
246     {\r
247         if (!fileFound)\r
248         {\r
249             g.setColor(new Color(200, 200, 200));\r
250             g.setColor(Color.cyan);\r
251             g.fillRect(0, 0, getSize().width, getSize().height);\r
252             g.setColor(Color.red);\r
253             g.drawString("Jalview can't open file", 5, 15);\r
254             g.drawString("\"" + file + "\"", 5, 30);\r
255         }\r
256         else if(embedded)\r
257         {\r
258           g.setColor(Color.black);\r
259           g.setFont(new Font("Arial", Font.BOLD, 24));\r
260           g.drawString("Jalview Applet", 50, this.size().height/2 -30);\r
261           g.drawString("Loading Data...", 50, this.size().height/2);\r
262         }\r
263 \r
264 \r
265     }\r
266 \r
267     class LoadingThread extends Thread\r
268     {\r
269         String file;\r
270         String protocol;\r
271         String format;\r
272         JalviewLite applet;\r
273 \r
274         public LoadingThread(String _file,\r
275                              JalviewLite _applet)\r
276         {\r
277             file = _file;\r
278             if(file.startsWith("PASTE"))\r
279             {\r
280               protocol = AppletFormatAdapter.PASTE;\r
281             }\r
282             else if(inArchive(file))\r
283               protocol = AppletFormatAdapter.CLASSLOADER;\r
284             else\r
285             {\r
286               file = addProtocol(file);\r
287               protocol = AppletFormatAdapter.URL;\r
288             }\r
289             format = new jalview.io.IdentifyFile().Identify(file, protocol);\r
290             applet = _applet;\r
291         }\r
292 \r
293         public void run()\r
294         {\r
295             SequenceI[] sequences = null;\r
296             try{\r
297               sequences = new AppletFormatAdapter().readFile(file, protocol,\r
298                   format);\r
299             }catch(java.io.IOException ex)\r
300             {\r
301               ex.printStackTrace();\r
302             }\r
303             if ((sequences != null) && (sequences.length > 0))\r
304             {\r
305               currentAlignFrame = new AlignFrame(new Alignment(sequences),\r
306                                                  applet,\r
307                                                  file,\r
308                                                  embedded);\r
309 \r
310 \r
311               initialAlignFrame = currentAlignFrame;\r
312 \r
313               currentAlignFrame.statusBar.setText("Successfully loaded file " + file);\r
314 \r
315 \r
316                 String treeFile = applet.getParameter("tree");\r
317                 if(treeFile==null)\r
318                   applet.getParameter("treeFile");\r
319                 if (treeFile != null)\r
320                 {\r
321                   try\r
322                   {\r
323                     if(inArchive(treeFile))\r
324                       protocol = AppletFormatAdapter.CLASSLOADER;\r
325                     else\r
326                     {\r
327                       protocol = AppletFormatAdapter.URL;\r
328                       treeFile = addProtocol(treeFile);\r
329                     }\r
330 \r
331                     jalview.io.NewickFile fin = new jalview.io.NewickFile(treeFile, protocol);\r
332 \r
333                     fin.parse();\r
334 \r
335                     if (fin.getTree() != null)\r
336                     {\r
337                       currentAlignFrame.loadTree(fin, treeFile);\r
338                     }\r
339                   }\r
340                   catch (Exception ex)\r
341                   {\r
342                     ex.printStackTrace();\r
343                   }\r
344               }\r
345 \r
346               String param = getParameter("features");\r
347               if (param != null)\r
348               {\r
349                 if( !inArchive(param) )\r
350                   param = addProtocol( param );\r
351 \r
352                 currentAlignFrame.parseFeaturesFile(param, protocol);\r
353               }\r
354 \r
355               param = getParameter("showFeatureSettings");\r
356               if(param !=null && param.equalsIgnoreCase("true"))\r
357               {\r
358                 currentAlignFrame.viewport.showSequenceFeatures(true);\r
359                 currentAlignFrame.featureSettings_actionPerformed();\r
360               }\r
361 \r
362              param = getParameter("annotations");\r
363              if (param != null)\r
364              {\r
365                if( !inArchive(param) )\r
366                   param = addProtocol( param );\r
367 \r
368                new AnnotationFile().readAnnotationFile(\r
369                    currentAlignFrame.viewport.getAlignment(),\r
370                    param);\r
371 \r
372                currentAlignFrame.alignPanel.fontChanged();\r
373                currentAlignFrame.alignPanel.setScrollValues(0,0);\r
374 \r
375              }\r
376 \r
377              param = getParameter("jnetfile");\r
378              if (param != null)\r
379              {\r
380                try\r
381                {\r
382                  if (inArchive(param))\r
383                    protocol = AppletFormatAdapter.CLASSLOADER;\r
384                  else\r
385                  {\r
386                    protocol = AppletFormatAdapter.URL;\r
387                    param = addProtocol(param);\r
388                  }\r
389 \r
390                  jalview.io.JPredFile predictions = new jalview.io.JPredFile(\r
391                      param, protocol);\r
392                  new JnetAnnotationMaker().add_annotation(predictions,\r
393                      currentAlignFrame.viewport.getAlignment(),\r
394                      0,false); // do not add sequence profile from concise output\r
395                  currentAlignFrame.alignPanel.fontChanged();\r
396                  currentAlignFrame.alignPanel.setScrollValues(0, 0);\r
397                } catch (Exception ex) {\r
398                  ex.printStackTrace();\r
399                }\r
400              }\r
401 \r
402 \r
403                 String pdbfile = applet.getParameter("PDBFILE");\r
404                 if(pdbfile!=null)\r
405                 {\r
406                   if( inArchive(pdbfile) )\r
407                     protocol = AppletFormatAdapter.CLASSLOADER;\r
408                   else\r
409                   {\r
410                     protocol = AppletFormatAdapter.URL;\r
411                     pdbfile = addProtocol(pdbfile);\r
412                   }\r
413 \r
414                   String sequence = applet.getParameter("PDBSEQ");\r
415 \r
416                   if(sequence!=null)\r
417                   {\r
418                     new MCview.AppletPDBViewer(pdbfile, protocol,\r
419                                                (Sequence)currentAlignFrame.getAlignViewport().getAlignment().findName(sequence),\r
420                                                currentAlignFrame.getSeqcanvas());\r
421                   }\r
422 \r
423                 }\r
424             }\r
425             else\r
426             {\r
427                 fileFound = false;\r
428                 remove(launcher);\r
429                 repaint();\r
430             }\r
431         }\r
432 \r
433         /**\r
434          * Discovers whether the given file is in the Applet Archive\r
435          * @param file String\r
436          * @return boolean\r
437          */\r
438         boolean inArchive(String file)\r
439         {\r
440           //This might throw a security exception in certain browsers\r
441           //Netscape Communicator for instance.\r
442           try{\r
443             return (getClass().getResourceAsStream("/" + file) != null);\r
444           }catch(Exception ex)\r
445           {\r
446             System.out.println("Exception checking resources: "+file+" "+ex);\r
447             return false;\r
448           }\r
449         }\r
450 \r
451         String addProtocol(String file)\r
452         {\r
453           if (file.indexOf("://") == -1)\r
454              file = getCodeBase() + file;\r
455 \r
456           return file;\r
457         }\r
458 \r
459     }\r
460 }\r