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