fixed getObject(VorbaId) lookup in vamsas-client
[jalview.git] / src / jalview / bin / JalviewLite.java
1 /*
2  * Jalview - A Sequence Alignment Editor and Viewer
3  * Copyright (C) 2007 AM Waterhouse, J Procter, G Barton, M Clamp, S Searle
4  *
5  * This program is free software; you can redistribute it and/or
6  * modify it under the terms of the GNU General Public License
7  * as published by the Free Software Foundation; either version 2
8  * of the License, or (at your option) any later version.
9  *
10  * This program is distributed in the hope that it will be useful,
11  * but WITHOUT ANY WARRANTY; without even the implied warranty of
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13  * GNU General Public License for more details.
14  *
15  * You should have received a copy of the GNU General Public License
16  * along with this program; if not, write to the Free Software
17  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
18  */
19 package jalview.bin;
20
21 import java.applet.*;
22
23 import java.awt.*;
24 import java.awt.event.*;
25 import java.util.*;
26
27 import jalview.appletgui.*;
28 import jalview.datamodel.*;
29 import jalview.io.*;
30
31 /**
32  * Jalview Applet. Runs in Java 1.18 runtime
33  *
34  * @author $author$
35  * @version $Revision$
36  */
37 public class JalviewLite
38     extends Applet
39 {
40
41
42
43   ///////////////////////////////////////////
44   //The following public methods maybe called
45   //externally, eg via javascript in HTML page
46
47   public String getSelectedSequences()
48   {
49     StringBuffer result = new StringBuffer("");
50
51     if (initialAlignFrame.viewport.getSelectionGroup() != null)
52     {
53       SequenceI[] seqs = initialAlignFrame.viewport.getSelectionGroup().
54           getSequencesInOrder(
55               initialAlignFrame.viewport.getAlignment());
56
57       for (int i = 0; i < seqs.length; i++)
58       {
59         result.append(seqs[i].getName() + "¬");
60       }
61     }
62
63     return result.toString();
64   }
65
66   public String getAlignment(String format)
67   {
68     return getAlignment(format, "true");
69   }
70
71   public String getAlignment(String format, String suffix)
72   {
73     try
74     {
75       boolean seqlimits = suffix.equalsIgnoreCase("true");
76
77       String reply = new AppletFormatAdapter().formatSequences(format,
78           currentAlignFrame.viewport.getAlignment(), seqlimits);
79       return reply;
80     }
81     catch (Exception ex)
82     {
83       ex.printStackTrace();
84       return "Error retrieving alignment in " + format + " format. ";
85     }
86   }
87
88   public void loadAnnotation(String annotation)
89   {
90     if (new AnnotationFile().readAnnotationFile(
91         currentAlignFrame.getAlignViewport().getAlignment(), annotation,
92         AppletFormatAdapter.PASTE))
93     {
94       currentAlignFrame.alignPanel.fontChanged();
95       currentAlignFrame.alignPanel.setScrollValues(0, 0);
96     }
97     else
98     {
99       currentAlignFrame.parseFeaturesFile(annotation, AppletFormatAdapter.PASTE);
100     }
101   }
102
103   public String getFeatures(String format)
104   {
105     return currentAlignFrame.outputFeatures(false, format);
106   }
107
108   public String getAnnotation()
109   {
110     return currentAlignFrame.outputAnnotations(false);
111   }
112
113   public void loadAlignment(String text, String title)
114   {
115     Alignment al = null;
116     String format = new IdentifyFile().Identify(text, AppletFormatAdapter.PASTE);
117     try
118     {
119       al = new AppletFormatAdapter().readFile(text,
120                                               AppletFormatAdapter.PASTE,
121                                               format);
122       if (al.getHeight() > 0)
123       {
124         new AlignFrame(al, this, title, false);
125       }
126     }
127     catch (java.io.IOException ex)
128     {
129       ex.printStackTrace();
130     }
131   }
132
133   ////////////////////////////////////////////////
134   ////////////////////////////////////////////////
135
136
137
138   static int lastFrameX = 200;
139   static int lastFrameY = 200;
140   boolean fileFound = true;
141   String file = "No file";
142   Button launcher = new Button("Start Jalview");
143
144   //The currentAlignFrame is static, it will change
145   //if and when the user selects a new window
146   public static AlignFrame currentAlignFrame;
147
148   //This is the first frame to be displayed, and does not change
149   AlignFrame initialAlignFrame;
150
151   boolean embedded = false;
152
153   public boolean jmolAvailable = false;
154
155   /**
156    * init method for Jalview Applet
157    */
158   public void init()
159   {
160     int r = 255;
161     int g = 255;
162     int b = 255;
163     String param = getParameter("RGB");
164
165     if (param != null)
166     {
167       try
168       {
169         r = Integer.parseInt(param.substring(0, 2), 16);
170         g = Integer.parseInt(param.substring(2, 4), 16);
171         b = Integer.parseInt(param.substring(4, 6), 16);
172       }
173       catch (Exception ex)
174       {
175         r = 255;
176         g = 255;
177         b = 255;
178       }
179     }
180
181     param = getParameter("label");
182     if (param != null)
183     {
184       launcher.setLabel(param);
185     }
186
187     this.setBackground(new Color(r, g, b));
188
189     file = getParameter("file");
190
191     if (file == null)
192     {
193       //Maybe the sequences are added as parameters
194       StringBuffer data = new StringBuffer("PASTE");
195       int i = 1;
196       while ( (file = getParameter("sequence" + i)) != null)
197       {
198         data.append(file.toString() + "\n");
199         i++;
200       }
201       if (data.length() > 5)
202       {
203         file = data.toString();
204       }
205     }
206
207     LoadJmolThread jmolAvailable = new LoadJmolThread();
208     jmolAvailable.start();
209
210     final JalviewLite applet = this;
211     if (getParameter("embedded") != null
212         && getParameter("embedded").equalsIgnoreCase("true"))
213     {
214       embedded = true;
215       LoadingThread loader = new LoadingThread(file, applet);
216       loader.start();
217     }
218     else if (file != null)
219     {
220       add(launcher);
221
222       launcher.addActionListener(new java.awt.event.ActionListener()
223       {
224         public void actionPerformed(ActionEvent e)
225         {
226           LoadingThread loader = new LoadingThread(file,
227               applet);
228           loader.start();
229         }
230       });
231     }
232     else
233     {
234       file = "NO FILE";
235       fileFound = false;
236     }
237   }
238
239
240   /**
241    * Initialises and displays a new java.awt.Frame
242    *
243    * @param frame java.awt.Frame to be displayed
244    * @param title title of new frame
245    * @param width width if new frame
246    * @param height height of new frame
247    */
248   public static void addFrame(final Frame frame, String title, int width,
249                               int height)
250   {
251     frame.setLocation(lastFrameX, lastFrameY);
252     lastFrameX += 40;
253     lastFrameY += 40;
254     frame.setSize(width, height);
255     frame.setTitle(title);
256     frame.addWindowListener(new WindowAdapter()
257     {
258       public void windowClosing(WindowEvent e)
259       {
260         if (frame instanceof AlignFrame)
261         {
262           ( (AlignFrame) frame).closeMenuItem_actionPerformed();
263         }
264         if (currentAlignFrame == frame)
265         {
266           currentAlignFrame = null;
267         }
268         lastFrameX -= 40;
269         lastFrameY -= 40;
270         frame.setMenuBar(null);
271         frame.dispose();
272       }
273
274       public void windowActivated(WindowEvent e)
275       {
276         if (frame instanceof AlignFrame)
277         {
278           currentAlignFrame = (AlignFrame) frame;
279         }
280       }
281
282     });
283     frame.setVisible(true);
284   }
285
286   /**
287    * This paints the background surrounding the "Launch Jalview button"
288    * <br>
289    * <br>If file given in parameter not found, displays error message
290    *
291    * @param g graphics context
292    */
293   public void paint(Graphics g)
294   {
295     if (!fileFound)
296     {
297       g.setColor(new Color(200, 200, 200));
298       g.setColor(Color.cyan);
299       g.fillRect(0, 0, getSize().width, getSize().height);
300       g.setColor(Color.red);
301       g.drawString("Jalview can't open file", 5, 15);
302       g.drawString("\"" + file + "\"", 5, 30);
303     }
304     else if (embedded)
305     {
306       g.setColor(Color.black);
307       g.setFont(new Font("Arial", Font.BOLD, 24));
308       g.drawString("Jalview Applet", 50, this.getSize().height / 2 - 30);
309       g.drawString("Loading Data...", 50, this.getSize().height / 2);
310     }
311   }
312
313
314   class LoadJmolThread extends Thread
315   {
316     public void run()
317     {
318       try
319       {
320         if (!System.getProperty("java.version").startsWith("1.1"))
321         {
322           Class.forName("org.jmol.adapter.smarter.SmarterJmolAdapter");
323           jmolAvailable = true;
324         }
325       }
326       catch (java.lang.ClassNotFoundException ex)
327       {
328         System.out.println("Jmol not available - Using MCview for structures");
329       }
330     }
331   }
332
333
334   class LoadingThread
335       extends Thread
336   {
337     String file;
338     String protocol;
339     String format;
340     JalviewLite applet;
341
342     public LoadingThread(String _file,
343                          JalviewLite _applet)
344     {
345       file = _file;
346       if (file.startsWith("PASTE"))
347       {
348         file = file.substring(5);
349         protocol = AppletFormatAdapter.PASTE;
350       }
351       else if (inArchive(file))
352       {
353         protocol = AppletFormatAdapter.CLASSLOADER;
354       }
355       else
356       {
357         file = addProtocol(file);
358         protocol = AppletFormatAdapter.URL;
359       }
360       format = new jalview.io.IdentifyFile().Identify(file, protocol);
361       applet = _applet;
362     }
363
364     public void run()
365     {
366       startLoading();
367     }
368
369     private void startLoading()
370     {
371       Alignment al = null;
372       try
373       {
374         al = new AppletFormatAdapter().readFile(file, protocol,
375                                                 format);
376       }
377       catch (java.io.IOException ex)
378       {
379         ex.printStackTrace();
380       }
381       if ( (al != null) && (al.getHeight() > 0))
382       {
383         currentAlignFrame = new AlignFrame(al,
384                                            applet,
385                                            file,
386                                            embedded);
387
388         if (protocol == jalview.io.AppletFormatAdapter.PASTE)
389         {
390           currentAlignFrame.setTitle("Sequences from " + getDocumentBase());
391         }
392
393         initialAlignFrame = currentAlignFrame;
394
395         currentAlignFrame.statusBar.setText("Successfully loaded file " + file);
396
397         String treeFile = applet.getParameter("tree");
398         if (treeFile == null)
399         {
400           treeFile = applet.getParameter("treeFile");
401         }
402
403         if (treeFile != null)
404         {
405           try
406           {
407             if (inArchive(treeFile))
408             {
409               protocol = AppletFormatAdapter.CLASSLOADER;
410             }
411             else
412             {
413               protocol = AppletFormatAdapter.URL;
414               treeFile = addProtocol(treeFile);
415             }
416
417             jalview.io.NewickFile fin = new jalview.io.NewickFile(treeFile,
418                 protocol);
419
420             fin.parse();
421
422             if (fin.getTree() != null)
423             {
424               currentAlignFrame.loadTree(fin, treeFile);
425             }
426           }
427           catch (Exception ex)
428           {
429             ex.printStackTrace();
430           }
431         }
432
433         String param = getParameter("features");
434         if (param != null)
435         {
436           if (!inArchive(param))
437           {
438             param = addProtocol(param);
439           }
440
441           currentAlignFrame.parseFeaturesFile(param, protocol);
442         }
443
444         param = getParameter("showFeatureSettings");
445         if (param != null && param.equalsIgnoreCase("true"))
446         {
447           currentAlignFrame.viewport.showSequenceFeatures(true);
448           new FeatureSettings(currentAlignFrame.alignPanel);
449         }
450
451         param = getParameter("annotations");
452         if (param != null)
453         {
454           if (!inArchive(param))
455           {
456             param = addProtocol(param);
457           }
458
459           new AnnotationFile().readAnnotationFile(
460               currentAlignFrame.viewport.getAlignment(),
461               param,
462               protocol);
463
464           currentAlignFrame.alignPanel.fontChanged();
465           currentAlignFrame.alignPanel.setScrollValues(0, 0);
466
467         }
468
469         param = getParameter("jnetfile");
470         if (param != null)
471         {
472           try
473           {
474             if (inArchive(param))
475             {
476               protocol = AppletFormatAdapter.CLASSLOADER;
477             }
478             else
479             {
480               protocol = AppletFormatAdapter.URL;
481               param = addProtocol(param);
482             }
483
484             jalview.io.JPredFile predictions = new jalview.io.JPredFile(
485                 param, protocol);
486             new JnetAnnotationMaker().add_annotation(predictions,
487                 currentAlignFrame.viewport.getAlignment(),
488                 0, false); // do not add sequence profile from concise output
489             currentAlignFrame.alignPanel.fontChanged();
490             currentAlignFrame.alignPanel.setScrollValues(0, 0);
491           }
492           catch (Exception ex)
493           {
494             ex.printStackTrace();
495           }
496         }
497
498         /*
499          <param name="PDBfile" value="1gaq.txt PDB|1GAQ|1GAQ|A PDB|1GAQ|1GAQ|B PDB|1GAQ|1GAQ|C">
500
501          <param name="PDBfile2" value="1gaq.txt A=SEQA B=SEQB C=SEQB">
502
503          <param name="PDBfile3" value="1q0o Q45135_9MICO">
504         */
505
506
507         int pdbFileCount = 0;
508         do{
509           if (pdbFileCount > 0)
510             param = getParameter("PDBFILE" + pdbFileCount);
511           else
512             param = getParameter("PDBFILE");
513
514           if (param != null)
515           {
516             PDBEntry pdb = new PDBEntry();
517
518             String seqstring;
519             SequenceI[] seqs = null;
520             String [] chains = null;
521
522             StringTokenizer st = new StringTokenizer(param, " ");
523
524             if (st.countTokens() < 2)
525             {
526               String sequence = applet.getParameter("PDBSEQ");
527               if (sequence != null)
528                 seqs = new SequenceI[]
529                     {
530                     (Sequence) currentAlignFrame.
531                     getAlignViewport().getAlignment().
532                     findName(sequence)};
533
534             }
535             else
536             {
537               param = st.nextToken();
538               Vector tmp = new Vector();
539               Vector tmp2 = new Vector();
540
541               while (st.hasMoreTokens())
542               {
543                 seqstring = st.nextToken();
544                 StringTokenizer st2 = new StringTokenizer(seqstring,"=");
545                 if(st2.countTokens()>1)
546                 {
547                   //This is the chain
548                   tmp2.addElement(st2.nextToken());
549                   seqstring = st2.nextToken();
550                 }
551                 tmp.addElement( (Sequence) currentAlignFrame.
552                                  getAlignViewport().getAlignment().
553                                  findName(seqstring));
554               }
555
556               seqs = new SequenceI[tmp.size()];
557               tmp.copyInto(seqs);
558               if(tmp2.size()==tmp.size())
559               {
560                 chains = new String[tmp2.size()];
561                 tmp2.copyInto(chains);
562               }
563             }
564
565             if (inArchive(param) && !jmolAvailable)
566             {
567               protocol = AppletFormatAdapter.CLASSLOADER;
568             }
569             else
570             {
571               protocol = AppletFormatAdapter.URL;
572               param = addProtocol(param);
573             }
574
575             pdb.setFile(param);
576
577             if(seqs!=null)
578             {
579               for (int i = 0; i < seqs.length; i++)
580               {
581                 ( (Sequence) seqs[i]).addPDBId(pdb);
582               }
583
584               if (jmolAvailable)
585               {
586                 new jalview.appletgui.AppletJmol(pdb,
587                                                  seqs,
588                                                  chains,
589                                                  currentAlignFrame.alignPanel,
590                                                  protocol);
591                 lastFrameX += 40;
592                 lastFrameY+=40;
593               }
594               else
595                     new MCview.AppletPDBViewer(pdb,
596                                            seqs,
597                                            chains,
598                                            currentAlignFrame.alignPanel,
599                                            protocol);
600             }
601           }
602
603           pdbFileCount++;
604         }
605         while(pdbFileCount < 10);
606
607       }
608       else
609       {
610         fileFound = false;
611         remove(launcher);
612         repaint();
613       }
614     }
615
616     /**
617      * Discovers whether the given file is in the Applet Archive
618      * @param file String
619      * @return boolean
620      */
621     boolean inArchive(String file)
622     {
623       //This might throw a security exception in certain browsers
624       //Netscape Communicator for instance.
625       try
626       {
627         return (getClass().getResourceAsStream("/" + file) != null);
628       }
629       catch (Exception ex)
630       {
631         System.out.println("Exception checking resources: " + file + " " + ex);
632         return false;
633       }
634     }
635
636     String addProtocol(String file)
637     {
638       if (file.indexOf("://") == -1)
639       {
640         file = getCodeBase() + file;
641       }
642
643       return file;
644     }
645   }
646 }