update author list in license for (JAL-826)
[jalview.git] / src / jalview / gui / Jalview2XML_V1.java
1 /*\r
2  * Jalview - A Sequence Alignment Editor and Viewer (Version 2.7)\r
3  * Copyright (C) 2011 J Procter, AM Waterhouse, J Engelhardt, LM Lui, G Barton, M Clamp, S Searle\r
4  * \r
5  * This file is part of Jalview.\r
6  * \r
7  * Jalview is free software: you can redistribute it and/or\r
8  * modify it under the terms of the GNU General Public License \r
9  * as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.\r
10  * \r
11  * Jalview is distributed in the hope that it will be useful, but \r
12  * WITHOUT ANY WARRANTY; without even the implied warranty \r
13  * of MERCHANTABILITY or FITNESS FOR A PARTICULAR \r
14  * PURPOSE.  See the GNU General Public License for more details.\r
15  * \r
16  * You should have received a copy of the GNU General Public License along with Jalview.  If not, see <http://www.gnu.org/licenses/>.\r
17  */\r
18 package jalview.gui;\r
19 \r
20 import java.io.*;\r
21 import java.net.*;\r
22 import java.util.*;\r
23 import java.util.jar.*;\r
24 \r
25 import javax.swing.*;\r
26 \r
27 import org.exolab.castor.xml.*;\r
28 import jalview.binding.*;\r
29 import jalview.schemes.*;\r
30 import jalview.util.jarInputStreamProvider;\r
31 \r
32 /**\r
33  * DOCUMENT ME!\r
34  * \r
35  * @author $author$\r
36  * @version $Revision$\r
37  */\r
38 public class Jalview2XML_V1\r
39 {\r
40   boolean raiseGUI = true;\r
41 \r
42   public Jalview2XML_V1()\r
43   {\r
44 \r
45   };\r
46 \r
47   public Jalview2XML_V1(boolean raiseGUI)\r
48   {\r
49     this.raiseGUI = raiseGUI;\r
50   };\r
51 \r
52   jalview.schemes.UserColourScheme GetUserColourScheme(\r
53           JalviewModelSequence jms, String id)\r
54   {\r
55     UserColours[] uc = jms.getUserColours();\r
56     UserColours colours = null;\r
57 \r
58     for (int i = 0; i < uc.length; i++)\r
59     {\r
60       if (uc[i].getId().equals(id))\r
61       {\r
62         colours = uc[i];\r
63 \r
64         break;\r
65       }\r
66     }\r
67 \r
68     int csize = colours.getUserColourScheme().getColourCount();\r
69     java.awt.Color[] newColours = new java.awt.Color[csize];\r
70 \r
71     for (int i = 0; i < csize; i++)\r
72     {\r
73       newColours[i] = new java.awt.Color(Integer.parseInt(colours\r
74               .getUserColourScheme().getColour(i).getRGB(), 16));\r
75     }\r
76 \r
77     return new jalview.schemes.UserColourScheme(newColours);\r
78   }\r
79 \r
80   /**\r
81    * DOCUMENT ME!\r
82    * \r
83    * @param file\r
84    *          DOCUMENT ME!\r
85    */\r
86   public AlignFrame LoadJalviewAlign(final jarInputStreamProvider jprovider)\r
87   {\r
88     final String file = jprovider.getFilename();\r
89     jalview.gui.AlignFrame af = null;\r
90 \r
91     try\r
92     {\r
93       JarInputStream jin = null;\r
94       JarEntry jarentry = null;\r
95       int entryCount = 1;\r
96 \r
97       do\r
98       {\r
99         jin = jprovider.getJarInputStream();\r
100 \r
101         for (int i = 0; i < entryCount; i++)\r
102         {\r
103           jarentry = jin.getNextJarEntry();\r
104         }\r
105 \r
106         class NoDescIDResolver implements IDResolver\r
107         {\r
108           public Object resolve(String idref)\r
109           {\r
110             System.out.println(idref + " used");\r
111             return null;\r
112           }\r
113         }\r
114 \r
115         if (jarentry != null)\r
116         {\r
117           InputStreamReader in = new InputStreamReader(jin, "UTF-8");\r
118           JalviewModel object = new JalviewModel();\r
119 \r
120           object = (JalviewModel) object.unmarshal(in);\r
121 \r
122           af = LoadFromObject(object, file);\r
123           entryCount++;\r
124         }\r
125       } while (jarentry != null);\r
126     } catch (final java.net.UnknownHostException ex)\r
127     {\r
128       ex.printStackTrace();\r
129       if (raiseGUI)\r
130       {\r
131         javax.swing.SwingUtilities.invokeLater(new Runnable()\r
132         {\r
133           public void run()\r
134           {\r
135 \r
136             System.err.println("Couldn't locate Jalview XML file : " + ex\r
137                     + "\n");\r
138             JOptionPane.showInternalMessageDialog(Desktop.desktop,\r
139                     "Couldn't locate " + file, "URL not found",\r
140                     JOptionPane.WARNING_MESSAGE);\r
141           }\r
142         });\r
143       }\r
144       ;\r
145     } catch (Exception ex)\r
146     {\r
147       System.err.println("Exception whilst loading jalview XML file : ");\r
148       ex.printStackTrace();\r
149       if (raiseGUI)\r
150       {\r
151         javax.swing.SwingUtilities.invokeLater(new Runnable()\r
152         {\r
153           public void run()\r
154           {\r
155 \r
156             JOptionPane.showInternalMessageDialog(Desktop.desktop,\r
157                     "Error loading  " + file, "Error loading Jalview file",\r
158                     JOptionPane.WARNING_MESSAGE);\r
159           }\r
160         });\r
161       }\r
162     }\r
163 \r
164     return af;\r
165   }\r
166 \r
167   AlignFrame LoadFromObject(JalviewModel object, String file)\r
168   {\r
169     Vector seqids = new Vector();\r
170     SequenceSet vamsasSet = object.getVamsasModel().getSequenceSet(0);\r
171     Sequence[] vamsasSeq = vamsasSet.getSequence();\r
172 \r
173     JalviewModelSequence jms = object.getJalviewModelSequence();\r
174 \r
175     // ////////////////////////////////\r
176     // LOAD SEQUENCES\r
177     jalview.datamodel.Sequence[] jseqs = new jalview.datamodel.Sequence[vamsasSeq.length];\r
178     JSeq[] JSEQ = object.getJalviewModelSequence().getJSeq();\r
179     for (int i = 0; i < vamsasSeq.length; i++)\r
180     {\r
181       jseqs[i] = new jalview.datamodel.Sequence(vamsasSeq[i].getName(),\r
182               vamsasSeq[i].getSequence());\r
183       jseqs[i].setStart(JSEQ[i].getStart());\r
184       jseqs[i].setEnd(JSEQ[i].getEnd());\r
185       seqids.add(jseqs[i]);\r
186     }\r
187 \r
188     // /SequenceFeatures are added to the DatasetSequence,\r
189     // so we must create the dataset before loading features\r
190     // ///////////////////////////////\r
191     jalview.datamodel.Alignment al = new jalview.datamodel.Alignment(jseqs);\r
192     al.setDataset(null);\r
193     // ///////////////////////////////\r
194 \r
195     for (int i = 0; i < vamsasSeq.length; i++)\r
196     {\r
197       if (JSEQ[i].getFeaturesCount() > 0)\r
198       {\r
199         Features[] features = JSEQ[i].getFeatures();\r
200         for (int f = 0; f < features.length; f++)\r
201         {\r
202           jalview.datamodel.SequenceFeature sf = new jalview.datamodel.SequenceFeature(\r
203                   features[f].getType(), features[f].getDescription(),\r
204                   features[f].getStatus(), features[f].getBegin(),\r
205                   features[f].getEnd(), null);\r
206 \r
207           al.getSequenceAt(i).getDatasetSequence().addSequenceFeature(sf);\r
208         }\r
209       }\r
210       if (JSEQ[i].getPdbidsCount() > 0)\r
211       {\r
212         Pdbids[] ids = JSEQ[i].getPdbids();\r
213         for (int p = 0; p < ids.length; p++)\r
214         {\r
215           jalview.datamodel.PDBEntry entry = new jalview.datamodel.PDBEntry();\r
216           entry.setId(ids[p].getId());\r
217           entry.setType(ids[p].getType());\r
218           al.getSequenceAt(i).getDatasetSequence().addPDBId(entry);\r
219         }\r
220 \r
221       }\r
222     }\r
223 \r
224     // ///////////////////////////////\r
225     // ////////////////////////////////\r
226     // LOAD ANNOTATIONS\r
227     if (vamsasSet.getAnnotation() != null)\r
228     {\r
229       Annotation[] an = vamsasSet.getAnnotation();\r
230 \r
231       for (int i = 0; i < an.length; i++)\r
232       {\r
233         AnnotationElement[] ae = an[i].getAnnotationElement();\r
234         jalview.datamodel.Annotation[] anot = new jalview.datamodel.Annotation[al\r
235                 .getWidth()];\r
236 \r
237         for (int aa = 0; aa < ae.length; aa++)\r
238         {\r
239           anot[ae[aa].getPosition()] = new jalview.datamodel.Annotation(\r
240                   ae[aa].getDisplayCharacter(), ae[aa].getDescription(),\r
241                   ae[aa].getSecondaryStructure().charAt(0),\r
242                   ae[aa].getValue());\r
243         }\r
244 \r
245         jalview.datamodel.AlignmentAnnotation jaa = null;\r
246 \r
247         if (an[i].getGraph())\r
248         {\r
249           jaa = new jalview.datamodel.AlignmentAnnotation(an[i].getLabel(),\r
250                   an[i].getDescription(), anot, 0, 0,\r
251                   jalview.datamodel.AlignmentAnnotation.BAR_GRAPH);\r
252         }\r
253         else\r
254         {\r
255           jaa = new jalview.datamodel.AlignmentAnnotation(an[i].getLabel(),\r
256                   an[i].getDescription(), anot);\r
257         }\r
258 \r
259         al.addAnnotation(jaa);\r
260       }\r
261     }\r
262 \r
263     // ///////////////////////////////\r
264     // LOAD VIEWPORT\r
265     Viewport[] views = jms.getViewport();\r
266     Viewport view = views[0]; // DEAL WITH MULTIPLE VIEWPORTS LATER\r
267 \r
268     AlignFrame af = new AlignFrame(al, view.getWidth(), view.getHeight());\r
269 \r
270     af.setFileName(file, "Jalview");\r
271 \r
272     for (int i = 0; i < JSEQ.length; i++)\r
273     {\r
274       af.viewport.setSequenceColour(af.viewport.alignment.getSequenceAt(i),\r
275               new java.awt.Color(JSEQ[i].getColour()));\r
276     }\r
277 \r
278     // af.changeColour() );\r
279     // ///////////////////////\r
280     // LOAD GROUPS\r
281     if (jms.getJGroupCount() > 0)\r
282     {\r
283       JGroup[] groups = jms.getJGroup();\r
284 \r
285       for (int i = 0; i < groups.length; i++)\r
286       {\r
287         ColourSchemeI cs = null;\r
288 \r
289         if (groups[i].getColour() != null)\r
290         {\r
291           if (groups[i].getColour().startsWith("ucs"))\r
292           {\r
293             cs = GetUserColourScheme(jms, groups[i].getColour());\r
294           }\r
295           else\r
296           {\r
297             cs = ColourSchemeProperty.getColour(al, groups[i].getColour());\r
298           }\r
299 \r
300           if (cs != null)\r
301           {\r
302             cs.setThreshold(groups[i].getPidThreshold(), true);\r
303           }\r
304 \r
305         }\r
306 \r
307         Vector seqs = new Vector();\r
308         int[] ids = groups[i].getSeq();\r
309 \r
310         for (int s = 0; s < ids.length; s++)\r
311         {\r
312           seqs.addElement((jalview.datamodel.SequenceI) seqids\r
313                   .elementAt(ids[s]));\r
314         }\r
315 \r
316         jalview.datamodel.SequenceGroup sg = new jalview.datamodel.SequenceGroup(\r
317                 seqs, groups[i].getName(), cs, groups[i].getDisplayBoxes(),\r
318                 groups[i].getDisplayText(), groups[i].getColourText(),\r
319                 groups[i].getStart(), groups[i].getEnd());\r
320 \r
321         sg.setOutlineColour(new java.awt.Color(groups[i].getOutlineColour()));\r
322 \r
323         if (groups[i].getConsThreshold() != 0)\r
324         {\r
325           jalview.analysis.Conservation c = new jalview.analysis.Conservation(\r
326                   "All", ResidueProperties.propHash, 3,\r
327                   sg.getSequences(null), 0, sg.getWidth() - 1);\r
328           c.calculate();\r
329           c.verdict(false, 25);\r
330           sg.cs.setConservation(c);\r
331         }\r
332 \r
333         al.addGroup(sg);\r
334       }\r
335     }\r
336 \r
337     af.setBounds(view.getXpos(), view.getYpos(), view.getWidth(),\r
338             view.getHeight());\r
339     af.viewport.setStartRes(view.getStartRes());\r
340     af.viewport.setStartSeq(view.getStartSeq());\r
341     af.viewport.setShowAnnotation(view.getShowAnnotation());\r
342     af.viewport.setAbovePIDThreshold(view.getPidSelected());\r
343     af.viewport.setColourText(view.getShowColourText());\r
344     af.viewport.setConservationSelected(view.getConservationSelected());\r
345     af.viewport.setShowJVSuffix(view.getShowFullId());\r
346     af.viewport.setFont(new java.awt.Font(view.getFontName(), view\r
347             .getFontStyle(), view.getFontSize()));\r
348     af.alignPanel.fontChanged();\r
349 \r
350     af.viewport.setRenderGaps(view.getRenderGaps());\r
351     af.viewport.setWrapAlignment(view.getWrapAlignment());\r
352     af.alignPanel.setWrapAlignment(view.getWrapAlignment());\r
353     af.viewport.setShowAnnotation(view.getShowAnnotation());\r
354     af.alignPanel.setAnnotationVisible(view.getShowAnnotation());\r
355     af.viewport.setShowBoxes(view.getShowBoxes());\r
356     af.viewport.setShowText(view.getShowText());\r
357 \r
358     ColourSchemeI cs = null;\r
359 \r
360     if (view.getBgColour() != null)\r
361     {\r
362       if (view.getBgColour().startsWith("ucs"))\r
363       {\r
364         cs = GetUserColourScheme(jms, view.getBgColour());\r
365       }\r
366       else\r
367       {\r
368         cs = ColourSchemeProperty.getColour(al, view.getBgColour());\r
369       }\r
370 \r
371       if (cs != null)\r
372       {\r
373         cs.setThreshold(view.getPidThreshold(), true);\r
374         cs.setConsensus(af.viewport.hconsensus);\r
375       }\r
376     }\r
377 \r
378     af.viewport.setGlobalColourScheme(cs);\r
379     af.viewport.setColourAppliesToAllGroups(false);\r
380     af.changeColour(cs);\r
381     if (view.getConservationSelected() && cs != null)\r
382     {\r
383       cs.setConservationInc(view.getConsThreshold());\r
384     }\r
385 \r
386     af.viewport.setColourAppliesToAllGroups(true);\r
387     af.viewport.showSequenceFeatures = view.getShowSequenceFeatures();\r
388 \r
389     if (jms.getFeatureSettings() != null)\r
390     {\r
391       af.viewport.featuresDisplayed = new Hashtable();\r
392       String[] renderOrder = new String[jms.getFeatureSettings()\r
393               .getSettingCount()];\r
394       for (int fs = 0; fs < jms.getFeatureSettings().getSettingCount(); fs++)\r
395       {\r
396         Setting setting = jms.getFeatureSettings().getSetting(fs);\r
397 \r
398         af.alignPanel.seqPanel.seqCanvas.getFeatureRenderer().setColour(\r
399                 setting.getType(), new java.awt.Color(setting.getColour()));\r
400 \r
401         renderOrder[fs] = setting.getType();\r
402 \r
403         if (setting.getDisplay())\r
404         {\r
405           af.viewport.featuresDisplayed.put(setting.getType(), new Integer(\r
406                   setting.getColour()));\r
407         }\r
408       }\r
409       af.alignPanel.seqPanel.seqCanvas.getFeatureRenderer().renderOrder = renderOrder;\r
410     }\r
411 \r
412     af.setMenusFromViewport(af.viewport);\r
413 \r
414     Desktop.addInternalFrame(af, view.getTitle(), view.getWidth(),\r
415             view.getHeight());\r
416 \r
417     // LOAD TREES\r
418     // /////////////////////////////////////\r
419     if (jms.getTreeCount() > 0)\r
420     {\r
421       try\r
422       {\r
423         for (int t = 0; t < jms.getTreeCount(); t++)\r
424         {\r
425 \r
426           Tree tree = jms.getTree(t);\r
427 \r
428           TreePanel tp = af.ShowNewickTree(\r
429                   new jalview.io.NewickFile(tree.getNewick()),\r
430                   tree.getTitle(), tree.getWidth(), tree.getHeight(),\r
431                   tree.getXpos(), tree.getYpos());\r
432 \r
433           tp.fitToWindow.setState(tree.getFitToWindow());\r
434           tp.fitToWindow_actionPerformed(null);\r
435 \r
436           if (tree.getFontName() != null)\r
437           {\r
438             tp.setTreeFont(new java.awt.Font(tree.getFontName(), tree\r
439                     .getFontStyle(), tree.getFontSize()));\r
440           }\r
441           else\r
442           {\r
443             tp.setTreeFont(new java.awt.Font(view.getFontName(), view\r
444                     .getFontStyle(), tree.getFontSize()));\r
445           }\r
446 \r
447           tp.showPlaceholders(tree.getMarkUnlinked());\r
448           tp.showBootstrap(tree.getShowBootstrap());\r
449           tp.showDistances(tree.getShowDistances());\r
450 \r
451           tp.treeCanvas.threshold = tree.getThreshold();\r
452 \r
453           if (tree.getCurrentTree())\r
454           {\r
455             af.viewport.setCurrentTree(tp.getTree());\r
456           }\r
457         }\r
458 \r
459       } catch (Exception ex)\r
460       {\r
461         ex.printStackTrace();\r
462       }\r
463 \r
464     }\r
465 \r
466     return af;\r
467   }\r
468 }\r