8ac5e8c516a546bd513ec2c9cd1783585c8bb4eb
[jalview.git] / src / jalview / gui / Jalview2XML.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 \r
22 import jalview.schemes.*;\r
23 \r
24 import jalview.gui.*;\r
25 \r
26 import java.io.*;\r
27 \r
28 import java.net.*;\r
29 \r
30 import java.util.*;\r
31 \r
32 import java.util.jar.*;\r
33 \r
34 import javax.swing.*;\r
35 \r
36 import org.exolab.castor.xml.*;\r
37 \r
38 import jalview.schemabinding.version2.*;\r
39 \r
40 \r
41 \r
42 \r
43 /**\r
44  * DOCUMENT ME!\r
45  *\r
46  * @author $author$\r
47  * @version $Revision$\r
48  */\r
49 public class Jalview2XML\r
50 {\r
51     // SAVES SEVERAL ALIGNEMENT WINDOWS TO SAME JARFILE\r
52     public void SaveState(File statefile)\r
53     {\r
54         long creation = System.currentTimeMillis();\r
55         JInternalFrame[] frames = Desktop.desktop.getAllFrames();\r
56 \r
57         if (frames == null)\r
58         {\r
59             return;\r
60         }\r
61 \r
62         try\r
63         {\r
64             FileOutputStream fos = new FileOutputStream(statefile);\r
65             JarOutputStream jout = new JarOutputStream(fos);\r
66 \r
67             //NOTE UTF-8 MUST BE USED FOR WRITING UNICODE CHARS\r
68             ////////////////////////////////////////////////////\r
69             PrintWriter out = new PrintWriter(new OutputStreamWriter(jout,\r
70                         "UTF-8"));\r
71 \r
72             Vector shortNames = new Vector();\r
73 \r
74             //REVERSE ORDER\r
75             for (int i = frames.length - 1; i > -1; i--)\r
76             {\r
77                 if (frames[i] instanceof AlignFrame)\r
78                 {\r
79                     AlignFrame af = (AlignFrame) frames[i];\r
80 \r
81                     String shortName = af.getTitle();\r
82 \r
83                     if (shortName.indexOf(File.separatorChar) > -1)\r
84                     {\r
85                         shortName = shortName.substring(shortName.lastIndexOf(\r
86                                     File.separatorChar) + 1);\r
87                     }\r
88 \r
89                     int count = 1;\r
90 \r
91                     while (shortNames.contains(shortName))\r
92                     {\r
93                         if (shortName.endsWith("_" + (count - 1)))\r
94                         {\r
95                             shortName = shortName.substring(0,\r
96                                     shortName.lastIndexOf("_"));\r
97                         }\r
98 \r
99                         shortName = shortName.concat("_" + count);\r
100                         count++;\r
101                     }\r
102 \r
103                     shortNames.addElement(shortName);\r
104 \r
105                     if (!shortName.endsWith(".xml"))\r
106                     {\r
107                         shortName = shortName + ".xml";\r
108                     }\r
109 \r
110                     SaveState(af, creation, shortName, jout, out);\r
111                 }\r
112             }\r
113 \r
114             out.close();\r
115             jout.close();\r
116         }\r
117         catch (Exception ex)\r
118         {\r
119             ex.printStackTrace();\r
120         }\r
121     }\r
122 \r
123     // USE THIS METHOD TO SAVE A SINGLE ALIGNMENT WINDOW\r
124     public void SaveAlignment(AlignFrame af, String jarFile,\r
125         String fileName)\r
126     {\r
127         try\r
128         {\r
129             FileOutputStream fos = new FileOutputStream(jarFile);\r
130             JarOutputStream jout = new JarOutputStream(fos);\r
131 \r
132             //NOTE UTF-8 MUST BE USED FOR WRITING UNICODE CHARS\r
133             ////////////////////////////////////////////////////\r
134             PrintWriter out = new PrintWriter(new OutputStreamWriter(jout,\r
135                         "UTF-8"));\r
136 \r
137             SaveState(af, System.currentTimeMillis(), fileName, jout, out);\r
138             out.close();\r
139             jout.close();\r
140         }\r
141         catch (Exception ex)\r
142         {\r
143           ex.printStackTrace();\r
144         }\r
145     }\r
146 \r
147     /**\r
148      * DOCUMENT ME!\r
149      *\r
150      * @param af DOCUMENT ME!\r
151      * @param timeStamp DOCUMENT ME!\r
152      * @param fileName DOCUMENT ME!\r
153      * @param jout DOCUMENT ME!\r
154      * @param out DOCUMENT ME!\r
155      */\r
156     public void SaveState(AlignFrame af, long timeStamp,\r
157         String fileName, JarOutputStream jout, PrintWriter out)\r
158     {\r
159         Vector seqids = new Vector();\r
160         Vector userColours = new Vector();\r
161 \r
162         AlignViewport av = af.viewport;\r
163 \r
164         JalviewModel object = new JalviewModel();\r
165         object.setVamsasModel(new jalview.schemabinding.version2.VamsasModel());\r
166 \r
167         object.setCreationDate(new java.util.Date(timeStamp));\r
168         object.setVersion(jalview.bin.Cache.getProperty("VERSION"));\r
169 \r
170         jalview.datamodel.AlignmentI jal = af.viewport.alignment;\r
171 \r
172         SequenceSet vamsasSet = new SequenceSet();\r
173         Sequence vamsasSeq;\r
174         JalviewModelSequence jms = new JalviewModelSequence();\r
175 \r
176         vamsasSet.setGapChar(jal.getGapCharacter() + "");\r
177 \r
178         JSeq jseq;\r
179 \r
180         //SAVE SEQUENCES\r
181         int id = 0;\r
182 \r
183         for (int i = 0; i < jal.getHeight(); i++)\r
184         {\r
185             seqids.add(jal.getSequenceAt(i));\r
186 \r
187             vamsasSeq = new Sequence();\r
188             vamsasSeq.setId(id + "");\r
189             vamsasSeq.setName(jal.getSequenceAt(i).getName());\r
190             vamsasSeq.setSequence(jal.getSequenceAt(i).getSequence());\r
191             vamsasSeq.setDescription(jal.getSequenceAt(i).getDescription());\r
192 \r
193             jseq = new JSeq();\r
194             jseq.setStart(jal.getSequenceAt(i).getStart());\r
195             jseq.setEnd(jal.getSequenceAt(i).getEnd());\r
196 \r
197             jseq.setColour(jal.getSequenceAt(i).getColor().getRGB());\r
198 \r
199             jseq.setId(id);\r
200 \r
201             if(jal.getSequenceAt(i).getDatasetSequence().getSequenceFeatures()!=null)\r
202             {\r
203               jalview.datamodel.SequenceFeature[] sf\r
204                   = jal.getSequenceAt(i).getDatasetSequence().getSequenceFeatures();\r
205               int index = 0;\r
206               while(index < sf.length)\r
207               {\r
208                 Features features = new Features();\r
209 \r
210                 features.setBegin(sf[index].getBegin());\r
211                 features.setEnd(sf[index].getEnd());\r
212                 features.setDescription(sf[index].getDescription());\r
213                 features.setStatus(sf[index].getStatus());\r
214                 features.setType(sf[index].getType());\r
215                 features.setFeatureGroup(sf[index].getFeatureGroup());\r
216                 jseq.addFeatures(features);\r
217                 index ++;\r
218               }\r
219             }\r
220 \r
221             if(jal.getSequenceAt(i).getDatasetSequence().getPDBId()!=null)\r
222             {\r
223               Enumeration en = jal.getSequenceAt(i).getDatasetSequence().getPDBId().elements();\r
224               while(en.hasMoreElements())\r
225               {\r
226                 Pdbids pdb = new Pdbids();\r
227                 jalview.datamodel.PDBEntry entry\r
228                    = (jalview.datamodel.PDBEntry)en.nextElement();\r
229 \r
230                 pdb.setId(entry.getId());\r
231                 pdb.setType(entry.getType());\r
232 \r
233                 if(entry.getProperty()!=null)\r
234                 {\r
235                   PdbentryItem item = new PdbentryItem();\r
236                   Hashtable properties = entry.getProperty();\r
237                   Enumeration en2 = properties.keys();\r
238                   while(en2.hasMoreElements())\r
239                   {\r
240                     Property prop = new Property();\r
241                     String key = en2.nextElement().toString();\r
242                     prop.setName(key);\r
243                     prop.setValue( properties.get(key).toString() );\r
244                     item.addProperty(prop);\r
245                   }\r
246                   pdb.addPdbentryItem(item);\r
247                 }\r
248 \r
249                 jseq.addPdbids(pdb);\r
250               }\r
251             }\r
252 \r
253             jms.addJSeq(jseq);\r
254             vamsasSet.addSequence(vamsasSeq);\r
255             id++;\r
256         }\r
257 \r
258         //SAVE TREES\r
259         ///////////////////////////////////\r
260         if (af.viewport.currentTree != null)\r
261         {\r
262           // FIND ANY ASSOCIATED TREES\r
263           // NOT IMPLEMENTED FOR HEADLESS STATE AT PRESENT\r
264           if (Desktop.desktop != null)\r
265           {\r
266             JInternalFrame[] frames = Desktop.desktop.getAllFrames();\r
267 \r
268             for (int t = 0; t < frames.length; t++)\r
269             {\r
270               if (frames[t] instanceof TreePanel)\r
271               {\r
272                 TreePanel tp = (TreePanel) frames[t];\r
273 \r
274                 if (tp.treeCanvas.av.alignment == jal)\r
275                 {\r
276                   Tree tree = new Tree();\r
277                   tree.setTitle(tp.getTitle());\r
278                   tree.setCurrentTree( (af.viewport.currentTree == tp.getTree()));\r
279                   tree.setNewick(tp.getTree().toString());\r
280                   tree.setThreshold(tp.treeCanvas.threshold);\r
281 \r
282                   tree.setFitToWindow(tp.fitToWindow.getState());\r
283                   tree.setFontName(tp.getTreeFont().getName());\r
284                   tree.setFontSize(tp.getTreeFont().getSize());\r
285                   tree.setFontStyle(tp.getTreeFont().getStyle());\r
286                   tree.setMarkUnlinked(tp.placeholdersMenu.getState());\r
287 \r
288                   tree.setShowBootstrap(tp.bootstrapMenu.getState());\r
289                   tree.setShowDistances(tp.distanceMenu.getState());\r
290 \r
291                   tree.setHeight(tp.getHeight());\r
292                   tree.setWidth(tp.getWidth());\r
293                   tree.setXpos(tp.getX());\r
294                   tree.setYpos(tp.getY());\r
295 \r
296                   jms.addTree(tree);\r
297                 }\r
298               }\r
299             }\r
300           }\r
301         }\r
302 \r
303         //SAVE ANNOTATIONS\r
304         if (jal.getAlignmentAnnotation() != null)\r
305         {\r
306             jalview.datamodel.AlignmentAnnotation[] aa = jal.getAlignmentAnnotation();\r
307 \r
308             for (int i = 0; i < aa.length; i++)\r
309             {\r
310                 Annotation an = new Annotation();\r
311 \r
312                 if (aa[i].label.equals("Quality") ||\r
313                         aa[i].label.equals("Conservation") ||\r
314                         aa[i].label.equals("Consensus"))\r
315                 {\r
316                     an.setLabel(aa[i].label);\r
317                     an.setGraph(true);\r
318                     vamsasSet.addAnnotation(an);\r
319                     continue;\r
320                 }\r
321 \r
322 \r
323                 an.setDescription(aa[i].description);\r
324 \r
325                 if(aa[i].sequenceRef!=null)\r
326                  {\r
327                    an.setSequenceRef(aa[i].sequenceRef.getName());\r
328                  }\r
329 \r
330                 if(aa[i].graph>0)\r
331                 {\r
332                   an.setGraph(true);\r
333                   an.setGraphType(aa[i].graph);\r
334                   an.setGraphGroup(aa[i].graphGroup);\r
335                   if(aa[i].getThreshold()!=null)\r
336                   {\r
337                     ThresholdLine line = new ThresholdLine();\r
338                     line.setLabel(aa[i].getThreshold().label);\r
339                     line.setValue(aa[i].getThreshold().value);\r
340                     line.setColour(aa[i].getThreshold().colour.getRGB());\r
341                     an.setThresholdLine(line);\r
342                   }\r
343                 }\r
344                 else\r
345                   an.setGraph(false);\r
346 \r
347                 an.setLabel(aa[i].label);\r
348 \r
349                 AnnotationElement ae;\r
350 \r
351                 for (int a = 0; a < aa[i].annotations.length; a++)\r
352                 {\r
353                     if ((aa[i] == null) || (aa[i].annotations[a] == null))\r
354                     {\r
355                         continue;\r
356                     }\r
357 \r
358                     ae = new AnnotationElement();\r
359                     ae.setDescription(aa[i].annotations[a].description);\r
360                     ae.setDisplayCharacter(aa[i].annotations[a].displayCharacter);\r
361                     ae.setValue(aa[i].annotations[a].value);\r
362                     ae.setPosition(a);\r
363                     ae.setSecondaryStructure(aa[i].annotations[a].secondaryStructure +\r
364                         "");\r
365 \r
366                     if(aa[i].annotations[a].colour!=java.awt.Color.black)\r
367                       ae.setColour(aa[i].annotations[a].colour.getRGB());\r
368 \r
369                     an.addAnnotationElement(ae);\r
370                 }\r
371 \r
372                 vamsasSet.addAnnotation(an);\r
373             }\r
374         }\r
375 \r
376         //SAVE GROUPS\r
377         if (jal.getGroups() != null)\r
378         {\r
379             JGroup[] groups = new JGroup[jal.getGroups().size()];\r
380 \r
381             for (int i = 0; i < groups.length; i++)\r
382             {\r
383                 groups[i] = new JGroup();\r
384 \r
385                 jalview.datamodel.SequenceGroup sg = (jalview.datamodel.SequenceGroup) jal.getGroups()\r
386                                                                                           .elementAt(i);\r
387                 groups[i].setStart(sg.getStartRes());\r
388                 groups[i].setEnd(sg.getEndRes());\r
389                 groups[i].setName(sg.getName());\r
390                 if(sg.cs!=null)\r
391                 {\r
392                   if (sg.cs.conservationApplied())\r
393                   {\r
394                     groups[i].setConsThreshold(sg.cs.getConservationInc());\r
395 \r
396                     if (sg.cs instanceof jalview.schemes.UserColourScheme)\r
397                     {\r
398                       groups[i].setColour(SetUserColourScheme(sg.cs,\r
399                           userColours,\r
400                           jms));\r
401                     }\r
402                     else\r
403                     {\r
404                       groups[i].setColour(ColourSchemeProperty.getColourName(sg.\r
405                           cs));\r
406                     }\r
407                   }\r
408                   else if(sg.cs instanceof jalview.schemes.AnnotationColourGradient)\r
409                   {\r
410                     groups[i].setColour(\r
411                         ColourSchemeProperty.getColourName(\r
412                       ( (jalview.schemes.AnnotationColourGradient) sg.cs).getBaseColour()));\r
413                   }\r
414                   else if (sg.cs instanceof jalview.schemes.UserColourScheme)\r
415                   {\r
416                     groups[i].setColour(SetUserColourScheme(sg.cs, userColours,\r
417                         jms));\r
418                   }\r
419                   else\r
420                   {\r
421                     groups[i].setColour(ColourSchemeProperty.getColourName(\r
422                         sg.cs));\r
423                   }\r
424 \r
425                   groups[i].setPidThreshold(sg.cs.getThreshold());\r
426                 }\r
427 \r
428                 groups[i].setOutlineColour(sg.getOutlineColour().getRGB());\r
429                 groups[i].setDisplayBoxes(sg.getDisplayBoxes());\r
430                 groups[i].setDisplayText(sg.getDisplayText());\r
431                 groups[i].setColourText(sg.getColourText());\r
432 \r
433                 for (int s = 0; s < sg.getSize(); s++)\r
434                 {\r
435                     jalview.datamodel.Sequence seq = (jalview.datamodel.Sequence) sg.getSequenceAt(s);\r
436                     int index = seqids.indexOf(seq);\r
437                     groups[i].addSeq(index);\r
438                 }\r
439             }\r
440 \r
441             jms.setJGroup(groups);\r
442         }\r
443 \r
444 \r
445         ///////////SAVE VIEWPORT\r
446         Viewport view = new Viewport();\r
447         view.setTitle(af.getTitle());\r
448         view.setXpos(af.getX());\r
449         view.setYpos(af.getY());\r
450         view.setWidth(af.getWidth());\r
451         view.setHeight(af.getHeight());\r
452         view.setStartRes(av.startRes);\r
453         view.setStartSeq(av.startSeq);\r
454 \r
455         if (av.getGlobalColourScheme() instanceof jalview.schemes.UserColourScheme)\r
456         {\r
457             view.setBgColour(SetUserColourScheme(av.getGlobalColourScheme(),\r
458                     userColours, jms));\r
459         }\r
460         else if(av.getGlobalColourScheme() instanceof jalview.schemes.AnnotationColourGradient)\r
461         {\r
462            jalview.schemes.AnnotationColourGradient acg\r
463               = (jalview.schemes.AnnotationColourGradient)av.getGlobalColourScheme();\r
464 \r
465             AnnotationColours ac = new AnnotationColours();\r
466             ac.setAboveThreshold(acg.getAboveThreshold());\r
467             ac.setThreshold(acg.getAnnotationThreshold());\r
468             ac.setAnnotation(acg.getAnnotation());\r
469             if(acg.getBaseColour() instanceof jalview.schemes.UserColourScheme)\r
470               ac.setColourScheme(SetUserColourScheme(acg.getBaseColour(),\r
471                     userColours, jms));\r
472             else\r
473               ac.setColourScheme(ColourSchemeProperty.getColourName(acg.getBaseColour()));\r
474 \r
475             ac.setMaxColour(acg.getMaxColour().getRGB());\r
476             ac.setMinColour(acg.getMinColour().getRGB());\r
477             view.setAnnotationColours(ac);\r
478             view.setBgColour("AnnotationColourGradient");\r
479         }\r
480         else\r
481         {\r
482             view.setBgColour(ColourSchemeProperty.getColourName(\r
483                     av.getGlobalColourScheme()));\r
484         }\r
485 \r
486         ColourSchemeI cs = av.getGlobalColourScheme();\r
487 \r
488         if(cs!=null)\r
489         {\r
490           if (cs.conservationApplied())\r
491           {\r
492             view.setConsThreshold(cs.getConservationInc());\r
493             if (cs instanceof jalview.schemes.UserColourScheme)\r
494               view.setBgColour(SetUserColourScheme(cs, userColours, jms));\r
495           }\r
496 \r
497           if (cs instanceof ResidueColourScheme)\r
498           {\r
499             view.setPidThreshold(cs.getThreshold());\r
500           }\r
501         }\r
502 \r
503         view.setConservationSelected(av.getConservationSelected());\r
504         view.setPidSelected(av.getAbovePIDThreshold());\r
505         view.setFontName(av.font.getName());\r
506         view.setFontSize(av.font.getSize());\r
507         view.setFontStyle(av.font.getStyle());\r
508         view.setRenderGaps(av.renderGaps);\r
509         view.setShowAnnotation(av.getShowAnnotation());\r
510         view.setShowBoxes(av.getShowBoxes());\r
511         view.setShowColourText(av.getColourText());\r
512         view.setShowConservation(av.showConservation);\r
513         view.setShowFullId(av.getShowJVSuffix());\r
514         view.setShowIdentity(av.showIdentity);\r
515         view.setShowQuality(av.showQuality);\r
516         view.setShowSequenceFeatures(av.showSequenceFeatures);\r
517         view.setShowText(av.getShowText());\r
518         view.setWrapAlignment(av.getWrapAlignment());\r
519 \r
520         if(av.featuresDisplayed!=null)\r
521         {\r
522           jalview.schemabinding.version2.FeatureSettings fs\r
523               = new jalview.schemabinding.version2.FeatureSettings();\r
524 \r
525           String [] renderOrder =\r
526               af.alignPanel.seqPanel.seqCanvas.getFeatureRenderer().renderOrder;\r
527           for(int ro=0; ro<renderOrder.length; ro++)\r
528           {\r
529             Setting setting = new Setting();\r
530             setting.setType(renderOrder[ro]);\r
531             setting.setColour(\r
532                 af.alignPanel.seqPanel.seqCanvas.getFeatureRenderer().getColour(renderOrder[ro]).getRGB()\r
533                 );\r
534 \r
535             setting.setDisplay(\r
536                 av.featuresDisplayed.containsKey(renderOrder[ro])\r
537                 );\r
538 \r
539             fs.addSetting(setting);\r
540 \r
541           }\r
542           jms.setFeatureSettings(fs);\r
543 \r
544         }\r
545 \r
546         jms.addViewport(view);\r
547 \r
548 \r
549         object.setJalviewModelSequence(jms);\r
550         object.getVamsasModel().addSequenceSet(vamsasSet);\r
551 \r
552         try\r
553         {\r
554             if (!fileName.endsWith(".xml"))\r
555             {\r
556                 fileName = fileName + ".xml";\r
557             }\r
558 \r
559             JarEntry entry = new JarEntry(fileName);\r
560             jout.putNextEntry(entry);\r
561 \r
562             object.marshal(out);\r
563         }\r
564         catch (Exception ex)\r
565         {\r
566             ex.printStackTrace();\r
567         }\r
568     }\r
569 \r
570     String SetUserColourScheme(jalview.schemes.ColourSchemeI cs,\r
571         Vector userColours, JalviewModelSequence jms)\r
572     {\r
573         String id = null;\r
574         jalview.schemes.UserColourScheme ucs = (jalview.schemes.UserColourScheme) cs;\r
575 \r
576         if (!userColours.contains(ucs))\r
577         {\r
578             userColours.add(ucs);\r
579 \r
580             java.awt.Color[] colours = ucs.getColours();\r
581             jalview.schemabinding.version2.UserColours uc = new jalview.schemabinding.version2.UserColours();\r
582             jalview.schemabinding.version2.UserColourScheme jbucs = new jalview.schemabinding.version2.UserColourScheme();\r
583 \r
584             for (int i = 0; i < colours.length; i++)\r
585             {\r
586                 jalview.schemabinding.version2.Colour col = new jalview.schemabinding.version2.Colour();\r
587                 col.setRGB(jalview.util.Format.getHexString(colours[i]));\r
588                 jbucs.addColour(col);\r
589             }\r
590 \r
591             id = "ucs" + userColours.indexOf(ucs);\r
592             uc.setId(id);\r
593             uc.setUserColourScheme(jbucs);\r
594             jms.addUserColours(uc);\r
595         }\r
596 \r
597         return id;\r
598     }\r
599 \r
600    jalview.schemes.UserColourScheme GetUserColourScheme(\r
601         JalviewModelSequence jms, String id)\r
602     {\r
603         UserColours[] uc = jms.getUserColours();\r
604         UserColours colours = null;\r
605 \r
606         for (int i = 0; i < uc.length; i++)\r
607         {\r
608             if (uc[i].getId().equals(id))\r
609             {\r
610                 colours = uc[i];\r
611 \r
612                 break;\r
613             }\r
614         }\r
615 \r
616         int csize = colours.getUserColourScheme().getColourCount();\r
617         java.awt.Color[] newColours = new java.awt.Color[csize];\r
618 \r
619         for (int i = 0; i < csize; i++)\r
620         {\r
621             newColours[i] = new java.awt.Color(Integer.parseInt(\r
622                         colours.getUserColourScheme().getColour(i).getRGB(), 16));\r
623         }\r
624 \r
625         return new jalview.schemes.UserColourScheme(newColours);\r
626     }\r
627 \r
628     /**\r
629      * DOCUMENT ME!\r
630      *\r
631      * @param file DOCUMENT ME!\r
632      */\r
633     public AlignFrame LoadJalviewAlign(String file)\r
634     {\r
635 \r
636         jalview.gui.AlignFrame af = null;\r
637 \r
638         try\r
639         {\r
640             //UNMARSHALLER SEEMS TO CLOSE JARINPUTSTREAM, MOST ANNOYING\r
641             URL url = null;\r
642 \r
643             if (file.startsWith("http://"))\r
644             {\r
645                 url = new URL(file);\r
646             }\r
647 \r
648             JarInputStream jin = null;\r
649             JarEntry jarentry = null;\r
650             int entryCount = 1;\r
651 \r
652             do\r
653             {\r
654                 if (url != null)\r
655                 {\r
656                     jin = new JarInputStream(url.openStream());\r
657                 }\r
658                 else\r
659                 {\r
660                     jin = new JarInputStream(new FileInputStream(file));\r
661                 }\r
662 \r
663                 for (int i = 0; i < entryCount; i++)\r
664                 {\r
665                     jarentry = jin.getNextJarEntry();\r
666 \r
667                   }\r
668 \r
669 \r
670                   class NoDescIDResolver implements IDResolver\r
671                   {\r
672                     public Object resolve(String idref)\r
673                     {\r
674                       System.out.println(idref+" used");\r
675                       return null;\r
676                     }\r
677                   }\r
678 \r
679 \r
680                 if (jarentry != null)\r
681                 {\r
682                     InputStreamReader in = new InputStreamReader(jin, "UTF-8");\r
683                     JalviewModel object = new JalviewModel();\r
684 \r
685                     Unmarshaller unmar = new Unmarshaller(object);\r
686                     unmar.setValidation(false);\r
687                     object = (JalviewModel) unmar.unmarshal( in );\r
688 \r
689                     af = LoadFromObject(object);\r
690                     entryCount++;\r
691                 }\r
692             }\r
693             while (jarentry != null);\r
694         }\r
695         catch(java.net.UnknownHostException ex)\r
696         {\r
697           ex.printStackTrace();\r
698           System.err.println("Couldn't locate Jalview XML file : " +\r
699               ex + "\n");\r
700            JOptionPane.showInternalMessageDialog(Desktop.desktop,\r
701                                     "Couldn't locate " + file,\r
702                                     "URL not found",\r
703                                     JOptionPane.WARNING_MESSAGE);\r
704 \r
705         }\r
706         catch (Exception ex)\r
707         {\r
708           //Is Version 1 Jar file?\r
709           af =  new Jalview2XML_V1().LoadJalviewAlign(file);\r
710 \r
711           if(af!=null)\r
712           {\r
713             System.out.println("Successfully loaded archive file");\r
714             return af;\r
715           }\r
716           ex.printStackTrace();\r
717             System.err.println("Exception whilst loading jalview XML file : " +\r
718                 ex + "\n");\r
719              JOptionPane.showInternalMessageDialog(Desktop.desktop,\r
720                                       "Error loading  " + file,\r
721                                       "Error loading Jalview file",\r
722                                       JOptionPane.WARNING_MESSAGE);\r
723 \r
724         }\r
725 \r
726         return af;\r
727     }\r
728 \r
729     AlignFrame LoadFromObject(JalviewModel object)\r
730     {\r
731         Vector seqids = new Vector();\r
732         SequenceSet vamsasSet = object.getVamsasModel().getSequenceSet(0);\r
733         Sequence[] vamsasSeq = vamsasSet.getSequence();\r
734 \r
735         JalviewModelSequence jms = object.getJalviewModelSequence();\r
736 \r
737         //////////////////////////////////\r
738         //LOAD SEQUENCES\r
739         jalview.datamodel.Sequence[] jseqs = new jalview.datamodel.Sequence[vamsasSeq.length];\r
740         JSeq[] JSEQ = object.getJalviewModelSequence().getJSeq();\r
741         for (int i = 0; i < vamsasSeq.length; i++)\r
742         {\r
743             jseqs[i] = new jalview.datamodel.Sequence(vamsasSeq[i].getName(),\r
744                     vamsasSeq[i].getSequence());\r
745             jseqs[i].setDescription( vamsasSeq[i].getDescription() );\r
746 \r
747             jseqs[i].setStart(JSEQ[i].getStart());\r
748             jseqs[i].setEnd(JSEQ[i].getEnd());\r
749             jseqs[i].setColor(new java.awt.Color(JSEQ[i].getColour()));\r
750             seqids.add(jseqs[i]);\r
751         }\r
752 \r
753         ///SequenceFeatures are added to the DatasetSequence,\r
754         // so we must create the dataset before loading features\r
755         /////////////////////////////////\r
756         jalview.datamodel.Alignment al = new jalview.datamodel.Alignment(jseqs);\r
757         al.setDataset(null);\r
758         /////////////////////////////////\r
759 \r
760         for (int i = 0; i < vamsasSeq.length; i++)\r
761         {\r
762           if (JSEQ[i].getFeaturesCount() > 0)\r
763           {\r
764             Features[] features = JSEQ[i].getFeatures();\r
765             for (int f = 0; f < features.length; f++)\r
766             {\r
767               jalview.datamodel.SequenceFeature sf\r
768                   = new jalview.datamodel.SequenceFeature(features[f].getType(),\r
769                   features[f].getDescription(), features[f].getStatus(),\r
770                   features[f].getBegin(), features[f].getEnd(),\r
771                   features[f].getFeatureGroup());\r
772 \r
773               al.getSequenceAt(i).getDatasetSequence().addSequenceFeature(sf);\r
774             }\r
775           }\r
776           if (JSEQ[i].getPdbidsCount() > 0)\r
777           {\r
778             Pdbids[] ids = JSEQ[i].getPdbids();\r
779             for (int p = 0; p < ids.length; p++)\r
780             {\r
781               jalview.datamodel.PDBEntry entry = new jalview.datamodel.PDBEntry();\r
782               entry.setId(ids[p].getId());\r
783               entry.setType(ids[p].getType());\r
784               al.getSequenceAt(i).getDatasetSequence().addPDBId(entry);\r
785             }\r
786 \r
787           }\r
788         }\r
789 \r
790 \r
791          /////////////////////////////////\r
792         //////////////////////////////////\r
793         //LOAD ANNOTATIONS\r
794         boolean hideQuality = true,\r
795             hideConservation = true,\r
796             hideConsensus = true;\r
797 \r
798         if (vamsasSet.getAnnotation() != null)\r
799         {\r
800             Annotation[] an = vamsasSet.getAnnotation();\r
801 \r
802             for (int i = 0; i < an.length; i++)\r
803             {\r
804                if (an[i].getLabel().equals("Quality"))\r
805                 {\r
806                  hideQuality = false;\r
807                  continue;\r
808                 }\r
809                else if(an[i].getLabel().equals("Conservation"))\r
810                {\r
811                  hideConservation = false;\r
812                  continue;\r
813                }\r
814                else if(an[i].getLabel().equals("Consensus"))\r
815                {\r
816                  hideConsensus = false;\r
817                  continue;\r
818                }\r
819 \r
820                 AnnotationElement[] ae = an[i].getAnnotationElement();\r
821                 jalview.datamodel.Annotation[] anot = new jalview.datamodel.Annotation[al.getWidth()];\r
822 \r
823                 for (int aa = 0; aa < ae.length; aa++)\r
824                 {\r
825                     anot[ae[aa].getPosition()] = new jalview.datamodel.Annotation(ae[aa].getDisplayCharacter(),\r
826                             ae[aa].getDescription(),\r
827                             ae[aa].getSecondaryStructure().length()==0?' ':ae[aa].getSecondaryStructure().charAt(0),\r
828                             ae[aa].getValue());\r
829                     anot[ae[aa].getPosition()].colour = new java.awt.Color( ae[aa].getColour() );\r
830                 }\r
831 \r
832                 jalview.datamodel.AlignmentAnnotation jaa = null;\r
833 \r
834                 if (an[i].getGraph())\r
835                 {\r
836                   jaa = new jalview.datamodel.AlignmentAnnotation(an[i].getLabel(),\r
837                       an[i].getDescription(), anot, 0, 0,\r
838                       an[i].getGraphType());\r
839 \r
840                   jaa.graphGroup = an[i].getGraphGroup();\r
841 \r
842                   if (an[i].getThresholdLine() != null)\r
843                   {\r
844                     jaa.setThreshold(new jalview.datamodel.GraphLine(\r
845                                   an[i].getThresholdLine().getValue(),\r
846                                   an[i].getThresholdLine().getLabel(),\r
847                                 new java.awt.Color(an[i].getThresholdLine().getColour()))\r
848                              );\r
849 \r
850                   }\r
851 \r
852                 }\r
853                 else\r
854                 {\r
855                     jaa = new jalview.datamodel.AlignmentAnnotation(an[i].getLabel(),\r
856                             an[i].getDescription(), anot);\r
857                 }\r
858 \r
859                 if(an[i].getSequenceRef()!=null)\r
860                 {\r
861                   jaa.createSequenceMapping(\r
862                       al.findName(an[i].getSequenceRef()), 1\r
863                       );\r
864                   al.findName(an[i].getSequenceRef()).addAlignmentAnnotation(jaa);\r
865                 }\r
866 \r
867                 al.addAnnotation(jaa);\r
868             }\r
869         }\r
870 \r
871 \r
872         //  af.changeColour() );\r
873         /////////////////////////\r
874         //LOAD GROUPS\r
875         if (jms.getJGroupCount() > 0)\r
876         {\r
877             JGroup[] groups = jms.getJGroup();\r
878 \r
879             for (int i = 0; i < groups.length; i++)\r
880             {\r
881                 ColourSchemeI cs = null;\r
882 \r
883                 if (groups[i].getColour() != null)\r
884                 {\r
885                     if (groups[i].getColour().startsWith("ucs"))\r
886                     {\r
887                         cs = GetUserColourScheme(jms, groups[i].getColour());\r
888                     }\r
889                     else\r
890                     {\r
891                         cs = ColourSchemeProperty.getColour(al,\r
892                                 groups[i].getColour());\r
893                     }\r
894 \r
895                     if(cs!=null)\r
896                       cs.setThreshold(groups[i].getPidThreshold(), true);\r
897                 }\r
898 \r
899                 Vector seqs = new Vector();\r
900                 int[] ids = groups[i].getSeq();\r
901 \r
902                 for (int s = 0; s < ids.length; s++)\r
903                 {\r
904                     seqs.addElement((jalview.datamodel.SequenceI) seqids.elementAt(\r
905                             ids[s]));\r
906                 }\r
907 \r
908                 jalview.datamodel.SequenceGroup sg = new jalview.datamodel.SequenceGroup(seqs,\r
909                         groups[i].getName(), cs, groups[i].getDisplayBoxes(),\r
910                         groups[i].getDisplayText(), groups[i].getColourText(),\r
911                         groups[i].getStart(), groups[i].getEnd());\r
912 \r
913                 sg.setOutlineColour(new java.awt.Color(\r
914                         groups[i].getOutlineColour()));\r
915 \r
916                 if (groups[i].getConsThreshold() != 0)\r
917                 {\r
918                     jalview.analysis.Conservation c = new jalview.analysis.Conservation("All",\r
919                             ResidueProperties.propHash, 3, sg.sequences, 0,\r
920                             sg.getWidth() - 1);\r
921                     c.calculate();\r
922                     c.verdict(false, 25);\r
923                     sg.cs.setConservation(c);\r
924                 }\r
925 \r
926                 al.addGroup(sg);\r
927             }\r
928         }\r
929 \r
930 \r
931         /////////////////////////////////\r
932         // LOAD VIEWPORT\r
933         Viewport[] views = jms.getViewport();\r
934         Viewport view = views[0]; // DEAL WITH MULTIPLE VIEWPORTS LATER\r
935 \r
936         AlignFrame af = new AlignFrame(al);\r
937         if(hideConsensus || hideQuality || hideConservation)\r
938         {\r
939           int hSize = al.getAlignmentAnnotation().length;\r
940           for (int h = 0; h < hSize; h++)\r
941           {\r
942             if (\r
943                 (hideConsensus &&\r
944                  al.getAlignmentAnnotation()[h].label.equals("Consensus"))\r
945                 ||\r
946                 (hideQuality &&\r
947                  al.getAlignmentAnnotation()[h].label.equals("Quality"))\r
948                 ||\r
949                 (hideConservation &&\r
950                  al.getAlignmentAnnotation()[h].label.equals("Conservation")))\r
951             {\r
952               al.deleteAnnotation(al.getAlignmentAnnotation()[h]);\r
953               hSize--;\r
954               h--;\r
955             }\r
956           }\r
957           af.alignPanel.adjustAnnotationHeight();\r
958         }\r
959 \r
960         af.setBounds(view.getXpos(), view.getYpos(), view.getWidth(),\r
961             view.getHeight());\r
962         af.viewport.setStartRes(view.getStartRes());\r
963         af.viewport.setStartSeq(view.getStartSeq());\r
964         af.viewport.setShowAnnotation(view.getShowAnnotation());\r
965         af.viewport.showConservation = view.getShowConservation();\r
966         af.viewport.showQuality = view.getShowQuality();\r
967         af.viewport.showIdentity = view.getShowIdentity();\r
968         af.viewport.setAbovePIDThreshold(view.getPidSelected());\r
969         af.abovePIDThreshold.setSelected(view.getPidSelected());\r
970         af.viewport.setColourText(view.getShowColourText());\r
971         af.colourTextMenuItem.setSelected(view.getShowColourText());\r
972         af.viewport.setConservationSelected(view.getConservationSelected());\r
973         af.conservationMenuItem.setSelected(view.getConservationSelected());\r
974 \r
975         af.viewport.setShowJVSuffix(view.getShowFullId());\r
976         af.seqLimits.setSelected(view.getShowFullId());\r
977 \r
978         af.viewport.setFont(new java.awt.Font(view.getFontName(),\r
979                 view.getFontStyle(), view.getFontSize()));\r
980         af.alignPanel.fontChanged();\r
981 \r
982         af.viewport.setRenderGaps(view.getRenderGaps());\r
983         af.renderGapsMenuItem.setSelected(view.getRenderGaps());\r
984 \r
985         af.viewport.setWrapAlignment(view.getWrapAlignment());\r
986         af.wrapMenuItem.setSelected(view.getWrapAlignment());\r
987 \r
988         if (view.getWrapAlignment())\r
989         {\r
990             af.alignPanel.setWrapAlignment(view.getWrapAlignment());\r
991         }\r
992         else\r
993         {\r
994             af.annotationPanelMenuItem.setState(view.getShowAnnotation());\r
995             af.viewport.setShowAnnotation(view.getShowAnnotation());\r
996             af.alignPanel.setAnnotationVisible(view.getShowAnnotation());\r
997         }\r
998 \r
999         af.viewport.setShowBoxes(view.getShowBoxes());\r
1000         af.viewBoxesMenuItem.setSelected(view.getShowBoxes());\r
1001         af.viewport.setShowText(view.getShowText());\r
1002         af.viewTextMenuItem.setSelected(view.getShowText());\r
1003 \r
1004         ColourSchemeI cs = null;\r
1005 \r
1006         if (view.getBgColour() != null)\r
1007         {\r
1008             if (view.getBgColour().startsWith("ucs"))\r
1009             {\r
1010                 cs = GetUserColourScheme(jms, view.getBgColour());\r
1011             }\r
1012             else if(view.getBgColour().startsWith("Annotation"))\r
1013             {\r
1014               //int find annotation\r
1015               for (int i = 0; i < af.viewport.alignment.getAlignmentAnnotation().length; i++)\r
1016               {\r
1017                 if (af.viewport.alignment.getAlignmentAnnotation()[i].label.\r
1018                     equals(view.getAnnotationColours().getAnnotation()))\r
1019                 {\r
1020                   if (af.viewport.alignment.getAlignmentAnnotation()[i].\r
1021                       getThreshold() == null)\r
1022                   {\r
1023                     af.viewport.alignment.getAlignmentAnnotation()[i].\r
1024                         setThreshold(\r
1025                             new jalview.datamodel.GraphLine(\r
1026                                 view.getAnnotationColours().getThreshold(),\r
1027                                 "Threshold", java.awt.Color.black)\r
1028 \r
1029                         );\r
1030                   }\r
1031 \r
1032 \r
1033                   if (view.getAnnotationColours().getColourScheme().equals(\r
1034                       "None"))\r
1035                   {\r
1036                     cs = new AnnotationColourGradient(\r
1037                         af.viewport.alignment.getAlignmentAnnotation()[i],\r
1038                         new java.awt.Color(view.getAnnotationColours().\r
1039                                            getMinColour()),\r
1040                         new java.awt.Color(view.getAnnotationColours().\r
1041                                            getMaxColour()),\r
1042                         view.getAnnotationColours().getAboveThreshold());\r
1043                   }\r
1044                   else if (view.getAnnotationColours().getColourScheme().\r
1045                            startsWith("ucs"))\r
1046                   {\r
1047                      cs = new AnnotationColourGradient(\r
1048                          af.viewport.alignment.getAlignmentAnnotation()[i],\r
1049                          GetUserColourScheme(jms, view.getAnnotationColours().\r
1050                                                         getColourScheme()),\r
1051                          view.getAnnotationColours().getAboveThreshold()\r
1052                          );\r
1053                    }\r
1054                    else\r
1055                    {\r
1056                      cs = new AnnotationColourGradient(\r
1057                          af.viewport.alignment.getAlignmentAnnotation()[i],\r
1058                          ColourSchemeProperty.getColour(al,\r
1059                          view.getAnnotationColours().getColourScheme()),\r
1060                          view.getAnnotationColours().getAboveThreshold()\r
1061                          );\r
1062                    }\r
1063 \r
1064                   // Also use these settings for all the groups\r
1065                   if (al.getGroups() != null)\r
1066                     for (int g = 0; g < al.getGroups().size(); g++)\r
1067                     {\r
1068                       jalview.datamodel.SequenceGroup sg\r
1069                           = (jalview.datamodel.SequenceGroup)al.getGroups().elementAt(g);\r
1070 \r
1071                       if(sg.cs == null)\r
1072                         continue;\r
1073 \r
1074 \r
1075                   /*    if (view.getAnnotationColours().getColourScheme().equals("None"))\r
1076                       {\r
1077                         sg.cs = new AnnotationColourGradient(\r
1078                             af.viewport.alignment.getAlignmentAnnotation()[i],\r
1079                             new java.awt.Color(view.getAnnotationColours().\r
1080                                                getMinColour()),\r
1081                             new java.awt.Color(view.getAnnotationColours().\r
1082                                                getMaxColour()),\r
1083                             view.getAnnotationColours().getAboveThreshold());\r
1084                       }\r
1085                       else*/\r
1086                       {\r
1087                         sg.cs = new AnnotationColourGradient(\r
1088                             af.viewport.alignment.getAlignmentAnnotation()[i],\r
1089                             sg.cs,\r
1090                             view.getAnnotationColours().getAboveThreshold()\r
1091                             );\r
1092                       }\r
1093 \r
1094                     }\r
1095 \r
1096 \r
1097                   break;\r
1098                 }\r
1099 \r
1100               }\r
1101             }\r
1102             else\r
1103             {\r
1104                 cs = ColourSchemeProperty.getColour(al, view.getBgColour());\r
1105             }\r
1106 \r
1107             if(cs!=null)\r
1108             {\r
1109               cs.setThreshold(view.getPidThreshold(), true);\r
1110               cs.setConsensus(af.viewport.vconsensus);\r
1111             }\r
1112         }\r
1113 \r
1114         af.setColourSelected(view.getBgColour());\r
1115         af.viewport.setGlobalColourScheme(cs);\r
1116         af.viewport.setColourAppliesToAllGroups(false);\r
1117         af.changeColour(cs);\r
1118         if (view.getConservationSelected() && cs!=null)\r
1119         {\r
1120           cs.setConservationInc(view.getConsThreshold());\r
1121         }\r
1122 \r
1123         af.viewport.setColourAppliesToAllGroups(true);\r
1124 \r
1125         if (view.getShowSequenceFeatures())\r
1126         {\r
1127            af.viewport.showSequenceFeatures = true;\r
1128            af.showSeqFeatures.setSelected(true);\r
1129         }\r
1130 \r
1131         if(jms.getFeatureSettings()!=null)\r
1132         {\r
1133           af.viewport.featuresDisplayed = new Hashtable();\r
1134           String [] renderOrder = new String[jms.getFeatureSettings().getSettingCount()];\r
1135          for(int fs=0; fs<jms.getFeatureSettings().getSettingCount(); fs++)\r
1136          {\r
1137            Setting setting = jms.getFeatureSettings().getSetting(fs);\r
1138 \r
1139            af.alignPanel.seqPanel.seqCanvas.getFeatureRenderer().setColour(setting.getType(),\r
1140                new java.awt.Color(setting.getColour()));\r
1141 \r
1142            renderOrder[fs] = setting.getType();\r
1143 \r
1144            if(setting.getDisplay())\r
1145              af.viewport.featuresDisplayed.put(\r
1146                  setting.getType(), new Integer(setting.getColour()));\r
1147          }\r
1148          af.alignPanel.seqPanel.seqCanvas.getFeatureRenderer().renderOrder = renderOrder;\r
1149         }\r
1150 \r
1151 \r
1152         Desktop.addInternalFrame(af, view.getTitle(),\r
1153              view.getWidth(), view.getHeight());\r
1154 \r
1155         //LOAD TREES\r
1156         ///////////////////////////////////////\r
1157         if (jms.getTreeCount() > 0)\r
1158         {\r
1159             try\r
1160             {\r
1161                 for (int t = 0; t < jms.getTreeCount(); t++)\r
1162                 {\r
1163 \r
1164                     Tree tree = jms.getTree(t);\r
1165 \r
1166                     TreePanel tp = af.ShowNewickTree(new jalview.io.NewickFile(\r
1167                                 tree.getNewick()), tree.getTitle(),\r
1168                                 tree.getWidth(), tree.getHeight(),\r
1169                                 tree.getXpos(), tree.getYpos());\r
1170 \r
1171                     tp.fitToWindow.setState(tree.getFitToWindow());\r
1172                     tp.fitToWindow_actionPerformed(null);\r
1173 \r
1174                     if(tree.getFontName()!=null)\r
1175                       tp.setTreeFont(new java.awt.Font(tree.getFontName(),\r
1176                                           tree.getFontStyle(),\r
1177                                           tree.getFontSize()));\r
1178                     else\r
1179                       tp.setTreeFont(new java.awt.Font(view.getFontName(),\r
1180                                             view.getFontStyle(),\r
1181                                             tree.getFontSize()));\r
1182 \r
1183                     tp.showPlaceholders(tree.getMarkUnlinked());\r
1184                     tp.showBootstrap(tree.getShowBootstrap());\r
1185                     tp.showDistances(tree.getShowDistances());\r
1186 \r
1187                     tp.treeCanvas.threshold = tree.getThreshold();\r
1188 \r
1189                     if (tree.getCurrentTree())\r
1190                       af.viewport.setCurrentTree(tp.getTree());\r
1191                 }\r
1192 \r
1193             }\r
1194             catch (Exception ex)\r
1195             {\r
1196                 ex.printStackTrace();\r
1197             }\r
1198 \r
1199         }\r
1200 \r
1201         return af;\r
1202     }\r
1203 }\r
1204 \r