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