new class
[jalview.git] / src / jalview / gui / Jalview2XML.java
1 package jalview.gui;\r
2 \r
3 import java.io.*;\r
4 import java.util.*;\r
5 import java.util.jar.*;\r
6 \r
7 import jalview.binding.*;\r
8 import jalview.schemes.*;\r
9 import javax.swing.JInternalFrame;\r
10 \r
11 \r
12 public class Jalview2XML\r
13 {\r
14 \r
15   public static void SaveState(File statefile)\r
16   {\r
17       long creation = System.currentTimeMillis();\r
18       JInternalFrame[] frames = Desktop.desktop.getAllFrames();\r
19       try{\r
20         JalviewState state = new JalviewState();\r
21 \r
22         Vector shortNames = new Vector();\r
23         for (int i = 0; i < frames.length; i++)\r
24         {\r
25           if (frames[i] instanceof AlignFrame)\r
26           {\r
27             AlignFrame af = (AlignFrame) frames[i];\r
28 \r
29             String shortName = af.getTitle();\r
30 \r
31             shortName = shortName.replace('/', '_');\r
32             shortName = shortName.replace('\\', '_');\r
33             String jarFile = statefile.getParent()+File.separatorChar+shortName+".jar";\r
34 \r
35             int count=1;\r
36             while( shortNames.contains(shortName) )\r
37             {\r
38               if(shortName.endsWith("_"+(count-1)))\r
39                 shortName = shortName.substring(0, shortName.lastIndexOf("_"));\r
40 \r
41               shortName = shortName.concat("_"+count);\r
42               count++;\r
43             }\r
44             shortNames.addElement(shortName);\r
45 \r
46             if(!shortName.endsWith(".xml"))\r
47               shortName = shortName+".xml";\r
48 \r
49             jarFile = statefile.getParent()+File.separatorChar+shortName+".jar";\r
50 \r
51             SaveState( af, creation, shortName, jarFile);\r
52             state.addFile(jarFile);\r
53           }\r
54         }\r
55 \r
56         PrintWriter out = new PrintWriter(new FileWriter(statefile));\r
57         state.marshal(out);\r
58         out.close();\r
59       }\r
60       catch(Exception ex){ex.printStackTrace();}\r
61   }\r
62 \r
63 \r
64   public static void SaveState( AlignFrame af, long timeStamp, String fileName, String jarFile)\r
65   {\r
66 \r
67     Vector seqids = new Vector();\r
68 \r
69     AlignViewport av = af.viewport;\r
70 \r
71     JalviewModel object = new JalviewModel();\r
72     object.setVamsasModel( new VamsasModel() );\r
73 \r
74     object.setCreationDate( new java.util.Date(timeStamp) );\r
75 \r
76     jalview.datamodel.AlignmentI jal = af.viewport.alignment;\r
77 \r
78     SequenceSet vamsasSet = new SequenceSet();\r
79     Sequence vamsasSeq;\r
80     JalviewModelSequence jms = new JalviewModelSequence();\r
81 \r
82     vamsasSet.setGapChar(jal.getGapCharacter()+"");\r
83 \r
84     JSeq jseq;\r
85 \r
86 \r
87     //SAVE SEQUENCES\r
88     int id = 0;\r
89     for(int i=0; i<jal.getHeight(); i++)\r
90     {\r
91       seqids.add(jal.getSequenceAt(i));\r
92 \r
93       vamsasSeq = new Sequence( );\r
94       vamsasSeq.setId(id+"");\r
95       vamsasSeq.setName(jal.getSequenceAt(i).getName());\r
96       vamsasSeq.setSequence(jal.getSequenceAt(i).getSequence());\r
97 \r
98       jseq = new JSeq();\r
99       jseq.setStart(jal.getSequenceAt(i).getStart());\r
100       jseq.setEnd(jal.getSequenceAt(i).getEnd());\r
101 \r
102       jseq.setColour(jal.getSequenceAt(i).getColor().getRGB());\r
103 \r
104       jseq.setId( id );\r
105 \r
106       jms.addJSeq(jseq);\r
107       vamsasSet.addSequence(vamsasSeq);\r
108       id++;\r
109     }\r
110 \r
111     //SAVE TREES\r
112     if(af.viewport.currentTree!=null)\r
113     {\r
114       object.getVamsasModel().addTree(af.viewport.currentTree.toString());\r
115     }\r
116 \r
117     //SAVE ANNOTATIONS\r
118     if(jal.getAlignmentAnnotation()!=null)\r
119     {\r
120 \r
121       jalview.datamodel.AlignmentAnnotation [] aa = jal.getAlignmentAnnotation();\r
122       for(int i=0; i<aa.length; i++)\r
123       {\r
124         if(aa[i].label.equals("Quality")\r
125         || aa[i].label.equals("Conservation")\r
126         || aa[i].label.equals("Consensus"))\r
127        {    continue;}\r
128 \r
129         Annotation an = new Annotation();\r
130         an.setDescription(aa[i].description);\r
131         an.setGraph(aa[i].isGraph);\r
132         an.setLabel(aa[i].label);\r
133 \r
134         AnnotationElement ae;\r
135 \r
136         for(int a=0; a<aa[i].annotations.length; a++)\r
137         {\r
138           if(aa[i]==null || aa[i].annotations[a]==null)\r
139             continue;\r
140 \r
141           ae = new AnnotationElement();\r
142           ae.setDescription(aa[i].annotations[a].description);\r
143           ae.setDisplayCharacter(aa[i].annotations[a].displayCharacter);\r
144           ae.setValue(aa[i].annotations[a].value);\r
145           ae.setPosition(a);\r
146           ae.setSecondaryStructure(aa[i].annotations[a].secondaryStructure+"");\r
147           an.addAnnotationElement(ae);\r
148         }\r
149 \r
150         vamsasSet.addAnnotation(an);\r
151       }\r
152 \r
153     }\r
154 \r
155     //SAVE GROUPS\r
156     if(jal.getGroups()!=null)\r
157     {\r
158       JGroup [] groups = new JGroup[jal.getGroups().size()];\r
159       for(int i=0; i<groups.length; i++)\r
160       {\r
161         groups[i] = new JGroup();\r
162         jalview.datamodel.SequenceGroup sg\r
163             = (jalview.datamodel.SequenceGroup)jal.getGroups().elementAt(i);\r
164         groups[i].setStart( sg.getStartRes() );\r
165         groups[i].setEnd( sg.getEndRes() );\r
166         groups[i].setName( sg.getName());\r
167 \r
168         if(sg.cs instanceof ConservationColourScheme)\r
169           groups[i].setConsThreshold( ((ConservationColourScheme)sg.cs).inc);\r
170 \r
171         if (sg.cs instanceof ResidueColourScheme)\r
172           groups[i].setPidThreshold( ( (ResidueColourScheme) sg.cs).getThreshold());\r
173        else if (sg.cs instanceof ScoreColourScheme)\r
174          groups[i].setPidThreshold( ( (ScoreColourScheme) sg.cs).getThreshold());\r
175 \r
176 \r
177         groups[i].setColour( ColourSchemeProperty.getColourName(sg.cs) );\r
178         groups[i].setOutlineColour(sg.getOutlineColour().getRGB());\r
179         groups[i].setDisplayBoxes(sg.getDisplayBoxes());\r
180         groups[i].setDisplayText(sg.getDisplayText());\r
181         groups[i].setColourText(sg.getColourText());\r
182 \r
183         for(int s=0; s<sg.getSize(); s++)\r
184         {\r
185           jalview.datamodel.Sequence seq = (jalview.datamodel.Sequence)sg.getSequenceAt(s);\r
186           int index = seqids.indexOf(seq);\r
187           groups[i].addSeq(index);\r
188         }\r
189 \r
190       }\r
191 \r
192       jms.setJGroup(groups);\r
193 \r
194     }\r
195 \r
196     ///////////SAVE VIEWPORT\r
197     Viewport view = new Viewport();\r
198    view.setTitle(af.getTitle());\r
199    view.setXpos(af.getX());\r
200    view.setYpos(af.getY());\r
201    view.setWidth(af.getWidth());\r
202    view.setHeight(af.getHeight());\r
203    view.setStartRes(av.startRes);\r
204    view.setStartSeq(av.startSeq);\r
205    view.setBgColour( ColourSchemeProperty.getColourName\r
206                      ( av.getGlobalColourScheme()));\r
207 \r
208    ColourSchemeI cs = av.getGlobalColourScheme();\r
209    if(cs instanceof ConservationColourScheme)\r
210      view.setConsThreshold( ((ConservationColourScheme)cs).inc);\r
211 \r
212    if (cs instanceof ResidueColourScheme)\r
213      view.setPidThreshold( ( (ResidueColourScheme) cs).getThreshold());\r
214   else if (cs instanceof ScoreColourScheme)\r
215      view.setPidThreshold( ( (ScoreColourScheme) cs).getThreshold());\r
216 \r
217 \r
218    view.setConservationSelected(av.getConservationSelected());\r
219    view.setPidSelected(av.getAbovePIDThreshold());\r
220    view.setFontName(av.font.getFontName());\r
221    view.setFontSize(av.font.getSize());\r
222    view.setFontStyle(av.font.getStyle());\r
223    view.setRenderGaps(av.renderGaps);\r
224    view.setShowAnnotation(av.getShowAnnotation());\r
225    view.setShowBoxes(av.getShowBoxes());\r
226    view.setShowColourText(av.getColourText());\r
227    view.setShowConservation(av.showConservation);\r
228    view.setShowFullId(av.getShowFullId());\r
229    view.setShowIdentity(av.showIdentity);\r
230    view.setShowQuality(av.showQuality);\r
231    view.setShowSequenceFeatures(av.showSequenceFeatures);\r
232    view.setShowText(av.getShowText());\r
233    view.setWrapAlignment(av.getWrapAlignment());\r
234 \r
235    jms.addViewport( view );\r
236 \r
237     object.setJalviewModelSequence(jms);\r
238     object.getVamsasModel().addSequenceSet(vamsasSet);\r
239 \r
240 \r
241     try\r
242     {\r
243     // NAME OF FILE\r
244      FileOutputStream fos = new FileOutputStream(jarFile);\r
245 \r
246      //PUT IT IN THIS JARFILE\r
247      JarOutputStream jout = new JarOutputStream(fos);\r
248 \r
249      //NOTE UTF-8 MUST BE USED FOR WRITING UNICODE CHARS\r
250      ////////////////////////////////////////////////////\r
251      PrintWriter out = new PrintWriter(new OutputStreamWriter(jout, "UTF-8"));\r
252 \r
253      if(!fileName.endsWith(".xml"))\r
254               fileName = fileName+".xml";\r
255 \r
256      JarEntry entry = new JarEntry(fileName);\r
257      jout.putNextEntry(entry);\r
258 \r
259       object.marshal(out);\r
260       out.close();\r
261       fos.close();\r
262       jout.close();\r
263     }\r
264     catch (Exception ex)\r
265     {\r
266       ex.printStackTrace();\r
267     }\r
268   }\r
269 \r
270   public static void LoadState(String file)\r
271   {\r
272     try{\r
273        JalviewState state = new JalviewState();\r
274        BufferedReader in = new BufferedReader(new FileReader(file));\r
275        state = (JalviewState)state.unmarshal(in);\r
276        Enumeration en = state.enumerateFile();\r
277        while( en.hasMoreElements() )\r
278        {\r
279          LoadJalviewAlign( en.nextElement().toString());\r
280        }\r
281     }\r
282     catch(Exception ex)\r
283     {   ex.printStackTrace(); return; }\r
284   }\r
285 \r
286   public static void LoadJalviewAlign(String file)\r
287   {\r
288     JalviewModel object = new JalviewModel();\r
289     Vector seqids = new Vector();\r
290     try{\r
291       FileInputStream fis = new FileInputStream(file);\r
292       JarInputStream jin = new JarInputStream(fis);\r
293       jin.getNextJarEntry();\r
294       InputStreamReader in = new InputStreamReader(jin, "UTF-8");\r
295       object = (JalviewModel) object.unmarshal(in);\r
296     }\r
297     catch(Exception ex)\r
298     {   System.out.println(ex); return; }\r
299 \r
300 \r
301      SequenceSet vamsasSet = object.getVamsasModel().getSequenceSet(0);\r
302      Sequence [] vamsasSeq = vamsasSet.getSequence();\r
303 \r
304      JalviewModelSequence jms = object.getJalviewModelSequence();\r
305      //////////////////////////////////\r
306      //LOAD SEQUENCES\r
307      jalview.datamodel.Sequence [] jseqs = new jalview.datamodel.Sequence[vamsasSeq.length];\r
308      JSeq [] JSEQ = object.getJalviewModelSequence().getJSeq();\r
309      for(int i=0; i<vamsasSeq.length; i++)\r
310      {\r
311        jseqs[i] = new jalview.datamodel.Sequence(vamsasSeq[i].getName(),\r
312                                                  vamsasSeq[i].getSequence());\r
313 \r
314        jseqs[i].setStart( JSEQ[i].getStart());\r
315        jseqs[i].setEnd( JSEQ[i].getEnd());\r
316        jseqs[i].setColor( new java.awt.Color(JSEQ[i].getColour()) );\r
317        seqids.add(jseqs[i]);\r
318      }\r
319 \r
320      /////////////////////////////////\r
321      jalview.datamodel.Alignment al = new jalview.datamodel.Alignment(jseqs);\r
322      /////////////////////////////////\r
323 \r
324      //////////////////////////////////\r
325      //LOAD ANNOTATIONS\r
326      if(vamsasSet.getAnnotation()!=null)\r
327      {\r
328        Annotation[] an = vamsasSet.getAnnotation();\r
329        for (int i = 0; i < an.length; i++)\r
330        {\r
331          AnnotationElement[] ae = an[i].getAnnotationElement();\r
332          jalview.datamodel.Annotation anot[]\r
333              = new jalview.datamodel.Annotation[al.getWidth()];\r
334          for (int aa = 0; aa < ae.length; aa++)\r
335          {\r
336            anot[ae[aa].getPosition()]\r
337                = new jalview.datamodel.Annotation(\r
338                    ae[aa].getDisplayCharacter(),\r
339                    ae[aa].getDescription(),\r
340                    ae[aa].getSecondaryStructure().charAt(0),\r
341                    ae[aa].getValue()\r
342                );\r
343          }\r
344 \r
345 \r
346           jalview.datamodel.AlignmentAnnotation jaa = null;\r
347           if(an[i].getGraph())\r
348             jaa = new jalview.datamodel.AlignmentAnnotation(an[i].getLabel(),\r
349                                         an[i].getDescription(), anot,\r
350                                         0,0,1);\r
351           else\r
352             jaa = new jalview.datamodel.AlignmentAnnotation(an[i].getLabel(),\r
353                                         an[i].getDescription(), anot);\r
354           al.addAnnotation(jaa);\r
355        }\r
356      }\r
357 \r
358       /////////////////////////////////\r
359       // LOAD VIEWPORT\r
360       Viewport[] views = jms.getViewport();\r
361       Viewport view = views[0]; // DEAL WITH MULTIPLE VIEWPORTS LATER\r
362 \r
363       AlignFrame af = new AlignFrame(al);\r
364     //  af.changeColour() );\r
365 \r
366     /////////////////////////\r
367     //LOAD GROUPS\r
368     if (jms.getJGroupCount()>0)\r
369     {\r
370       JGroup[] groups = jms.getJGroup();\r
371       for (int i = 0; i < groups.length; i++)\r
372       {\r
373        ColourSchemeI cs = ColourSchemeProperty.getColour(al, groups[i].getColour() );\r
374        if (cs instanceof ResidueColourScheme)\r
375          ( (ResidueColourScheme) cs).setThreshold(groups[i].getPidThreshold());\r
376        else if (cs instanceof ScoreColourScheme)\r
377       ( (ScoreColourScheme) cs).setThreshold(groups[i].getPidThreshold());\r
378 \r
379         jalview.datamodel.SequenceGroup sg = new jalview.datamodel.SequenceGroup\r
380                 (groups[i].getName(),\r
381                  cs,\r
382                  groups[i].getDisplayBoxes(),\r
383                  groups[i].getDisplayText(),\r
384                  groups[i].getColourText(),\r
385                  groups[i].getStart(),\r
386                  groups[i].getEnd()) ;\r
387         sg.setOutlineColour( new java.awt.Color(groups[i].getOutlineColour()));\r
388         int [] ids = groups[i].getSeq();\r
389         for(int s=0; s<ids.length; s++)\r
390             sg.addSequence( (jalview.datamodel.SequenceI)seqids.elementAt( ids[s] ));\r
391 \r
392         if(groups[i].getConsThreshold()!=0)\r
393         {\r
394           jalview.analysis.Conservation c = new jalview.analysis.Conservation("All",\r
395               ResidueProperties.propHash, 3,\r
396               sg.sequences, 0,\r
397               sg.getWidth() - 1);\r
398           c.calculate();\r
399           c.verdict(false, 25);\r
400           cs = new ConservationColourScheme(c, cs);\r
401           sg.cs = cs;\r
402         }\r
403 \r
404 \r
405         al.addGroup(sg);\r
406       }\r
407     }\r
408 \r
409 \r
410     Desktop.addInternalFrame(af, view.getTitle(), AlignFrame.NEW_WINDOW_WIDTH, AlignFrame.NEW_WINDOW_HEIGHT);\r
411     af.setBounds(view.getXpos(), view.getYpos(), view.getWidth(), view.getHeight());\r
412     af.viewport.setStartRes( view.getStartRes() );\r
413     af.viewport.setStartSeq( view.getStartSeq() );\r
414     af.viewport.setAbovePIDThreshold( view.getPidSelected() );\r
415     af.viewport.setColourText( view.getShowColourText() );\r
416     af.viewport.setConservationSelected( view.getConservationSelected());\r
417     af.viewport.setShowFullId( view.getShowFullId());\r
418     af.viewport.setFont( new java.awt.Font( view.getFontName(),\r
419                                             view.getFontStyle(),\r
420                                             view.getFontSize()));\r
421     af.alignPanel.fontChanged();\r
422     af.viewport.setRenderGaps( view.getRenderGaps() );\r
423 \r
424     af.viewport.setWrapAlignment( view.getWrapAlignment() );\r
425     if(view.getWrapAlignment())\r
426     {\r
427       af.alignPanel.setWrapAlignment(view.getWrapAlignment());\r
428     }\r
429     else\r
430     {\r
431       af.viewport.setShowAnnotation(view.getShowAnnotation());\r
432       af.alignPanel.setAnnotationVisible(view.getShowAnnotation());\r
433     }\r
434 \r
435     af.viewport.setShowBoxes( view.getShowBoxes() );\r
436     af.viewport.setShowText( view.getShowText() );\r
437 \r
438     af.viewport.setGlobalColourScheme( ColourSchemeProperty.getColour(al, view.getBgColour()));\r
439     af.viewport.setColourAppliesToAllGroups(false);\r
440     af.changeColour( af.viewport.getGlobalColourScheme() );\r
441     af.viewport.setColourAppliesToAllGroups(true);\r
442 \r
443     ColourSchemeI cs = af.viewport.getGlobalColourScheme();\r
444     if(cs instanceof ConservationColourScheme)\r
445       ( (ConservationColourScheme) cs).inc = view.getConsThreshold();\r
446 \r
447     if (cs instanceof ResidueColourScheme)\r
448       ( (ResidueColourScheme) cs).setThreshold(view.getPidThreshold());\r
449     else if (cs instanceof ScoreColourScheme)\r
450       ( (ScoreColourScheme) cs).setThreshold(view.getPidThreshold());\r
451 \r
452     //LOAD TREES - THIS RELEASE ONLY ALLOWS 1 TREE\r
453     if(object.getVamsasModel().getTreeCount()>0)\r
454     {\r
455       try{\r
456         af.ShowNewickTree(new jalview.io.NewickFile(\r
457             (String)object.getVamsasModel().getTree(0)), "Tree");\r
458       }catch(Exception ex){ex.printStackTrace();}\r
459 \r
460     }\r
461 \r
462   }\r
463 }\r
464 \r
465 \r
466 \r