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