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