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