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