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