JAL-1517 fix copyright for 2.8.2
[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", new String[]{file}),
143                     MessageManager.getString("label.url_not_found"),
144                     JOptionPane.WARNING_MESSAGE);
145           }
146         });
147       }
148       ;
149     } catch (Exception ex)
150     {
151       System.err.println("Exception whilst loading jalview XML file : ");
152       ex.printStackTrace();
153       if (raiseGUI)
154       {
155         javax.swing.SwingUtilities.invokeLater(new Runnable()
156         {
157           public void run()
158           {
159
160             JOptionPane.showInternalMessageDialog(Desktop.desktop,
161                     "Error loading  " + file, "Error loading Jalview file",
162                     JOptionPane.WARNING_MESSAGE);
163           }
164         });
165       }
166     }
167
168     return af;
169   }
170
171   AlignFrame LoadFromObject(JalviewModel object, String file)
172   {
173     Vector seqids = new Vector();
174     SequenceSet vamsasSet = object.getVamsasModel().getSequenceSet(0);
175     Sequence[] vamsasSeq = vamsasSet.getSequence();
176
177     JalviewModelSequence jms = object.getJalviewModelSequence();
178
179     // ////////////////////////////////
180     // LOAD SEQUENCES
181     jalview.datamodel.Sequence[] jseqs = new jalview.datamodel.Sequence[vamsasSeq.length];
182     JSeq[] JSEQ = object.getJalviewModelSequence().getJSeq();
183     for (int i = 0; i < vamsasSeq.length; i++)
184     {
185       jseqs[i] = new jalview.datamodel.Sequence(vamsasSeq[i].getName(),
186               vamsasSeq[i].getSequence());
187       jseqs[i].setStart(JSEQ[i].getStart());
188       jseqs[i].setEnd(JSEQ[i].getEnd());
189       seqids.add(jseqs[i]);
190     }
191
192     // /SequenceFeatures are added to the DatasetSequence,
193     // so we must create the dataset before loading features
194     // ///////////////////////////////
195     jalview.datamodel.Alignment al = new jalview.datamodel.Alignment(jseqs);
196     al.setDataset(null);
197     // ///////////////////////////////
198
199     for (int i = 0; i < vamsasSeq.length; i++)
200     {
201       if (JSEQ[i].getFeaturesCount() > 0)
202       {
203         Features[] features = JSEQ[i].getFeatures();
204         for (int f = 0; f < features.length; f++)
205         {
206           jalview.datamodel.SequenceFeature sf = new jalview.datamodel.SequenceFeature(
207                   features[f].getType(), features[f].getDescription(),
208                   features[f].getStatus(), features[f].getBegin(),
209                   features[f].getEnd(), null);
210
211           al.getSequenceAt(i).getDatasetSequence().addSequenceFeature(sf);
212         }
213       }
214       if (JSEQ[i].getPdbidsCount() > 0)
215       {
216         Pdbids[] ids = JSEQ[i].getPdbids();
217         for (int p = 0; p < ids.length; p++)
218         {
219           jalview.datamodel.PDBEntry entry = new jalview.datamodel.PDBEntry();
220           entry.setId(ids[p].getId());
221           entry.setType(ids[p].getType());
222           al.getSequenceAt(i).getDatasetSequence().addPDBId(entry);
223         }
224
225       }
226     }
227
228     // ///////////////////////////////
229     // ////////////////////////////////
230     // LOAD ANNOTATIONS
231     if (vamsasSet.getAnnotation() != null)
232     {
233       Annotation[] an = vamsasSet.getAnnotation();
234
235       for (int i = 0; i < an.length; i++)
236       {
237         AnnotationElement[] ae = an[i].getAnnotationElement();
238         jalview.datamodel.Annotation[] anot = new jalview.datamodel.Annotation[al
239                 .getWidth()];
240
241         for (int aa = 0; aa < ae.length; aa++)
242         {
243           anot[ae[aa].getPosition()] = new jalview.datamodel.Annotation(
244                   ae[aa].getDisplayCharacter(), ae[aa].getDescription(),
245                   ae[aa].getSecondaryStructure().charAt(0),
246                   ae[aa].getValue());
247         }
248
249         jalview.datamodel.AlignmentAnnotation jaa = null;
250
251         if (an[i].getGraph())
252         {
253           jaa = new jalview.datamodel.AlignmentAnnotation(an[i].getLabel(),
254                   an[i].getDescription(), anot, 0, 0,
255                   jalview.datamodel.AlignmentAnnotation.BAR_GRAPH);
256         }
257         else
258         {
259           jaa = new jalview.datamodel.AlignmentAnnotation(an[i].getLabel(),
260                   an[i].getDescription(), anot);
261         }
262
263         al.addAnnotation(jaa);
264       }
265     }
266
267     // ///////////////////////////////
268     // LOAD VIEWPORT
269     Viewport[] views = jms.getViewport();
270     Viewport view = views[0]; // DEAL WITH MULTIPLE VIEWPORTS LATER
271
272     AlignFrame af = new AlignFrame(al, view.getWidth(), view.getHeight());
273
274     af.setFileName(file, "Jalview");
275
276     for (int i = 0; i < JSEQ.length; i++)
277     {
278       af.viewport.setSequenceColour(af.viewport.getAlignment()
279               .getSequenceAt(i), new java.awt.Color(JSEQ[i].getColour()));
280     }
281
282     // af.changeColour() );
283     // ///////////////////////
284     // LOAD GROUPS
285     if (jms.getJGroupCount() > 0)
286     {
287       JGroup[] groups = jms.getJGroup();
288
289       for (int i = 0; i < groups.length; i++)
290       {
291         ColourSchemeI cs = null;
292
293         if (groups[i].getColour() != null)
294         {
295           if (groups[i].getColour().startsWith("ucs"))
296           {
297             cs = GetUserColourScheme(jms, groups[i].getColour());
298           }
299           else
300           {
301             cs = ColourSchemeProperty.getColour(al, groups[i].getColour());
302           }
303
304           if (cs != null)
305           {
306             cs.setThreshold(groups[i].getPidThreshold(), true);
307           }
308
309         }
310
311         Vector seqs = new Vector();
312         int[] ids = groups[i].getSeq();
313
314         for (int s = 0; s < ids.length; s++)
315         {
316           seqs.addElement((jalview.datamodel.SequenceI) seqids
317                   .elementAt(ids[s]));
318         }
319
320         jalview.datamodel.SequenceGroup sg = new jalview.datamodel.SequenceGroup(
321                 seqs, groups[i].getName(), cs, groups[i].getDisplayBoxes(),
322                 groups[i].getDisplayText(), groups[i].getColourText(),
323                 groups[i].getStart(), groups[i].getEnd());
324
325         sg.setOutlineColour(new java.awt.Color(groups[i].getOutlineColour()));
326
327         if (groups[i].getConsThreshold() != 0)
328         {
329           jalview.analysis.Conservation c = new jalview.analysis.Conservation(
330                   "All", ResidueProperties.propHash, 3,
331                   sg.getSequences(null), 0, sg.getWidth() - 1);
332           c.calculate();
333           c.verdict(false, 25);
334           sg.cs.setConservation(c);
335         }
336
337         al.addGroup(sg);
338       }
339     }
340
341     af.setBounds(view.getXpos(), view.getYpos(), view.getWidth(),
342             view.getHeight());
343     af.viewport.setStartRes(view.getStartRes());
344     af.viewport.setStartSeq(view.getStartSeq());
345     af.viewport.setShowAnnotation(view.getShowAnnotation());
346     af.viewport.setAbovePIDThreshold(view.getPidSelected());
347     af.viewport.setColourText(view.getShowColourText());
348     af.viewport.setConservationSelected(view.getConservationSelected());
349     af.viewport.setShowJVSuffix(view.getShowFullId());
350     af.viewport.setFont(new java.awt.Font(view.getFontName(), view
351             .getFontStyle(), view.getFontSize()));
352     af.alignPanel.fontChanged();
353
354     af.viewport.setRenderGaps(view.getRenderGaps());
355     af.viewport.setWrapAlignment(view.getWrapAlignment());
356     af.alignPanel.setWrapAlignment(view.getWrapAlignment());
357     af.viewport.setShowAnnotation(view.getShowAnnotation());
358     af.alignPanel.setAnnotationVisible(view.getShowAnnotation());
359     af.viewport.setShowBoxes(view.getShowBoxes());
360     af.viewport.setShowText(view.getShowText());
361
362     ColourSchemeI cs = null;
363
364     if (view.getBgColour() != null)
365     {
366       if (view.getBgColour().startsWith("ucs"))
367       {
368         cs = GetUserColourScheme(jms, view.getBgColour());
369       }
370       else
371       {
372         cs = ColourSchemeProperty.getColour(al, view.getBgColour());
373       }
374
375       if (cs != null)
376       {
377         cs.setThreshold(view.getPidThreshold(), true);
378         cs.setConsensus(af.viewport.getSequenceConsensusHash());
379       }
380     }
381
382     af.viewport.setGlobalColourScheme(cs);
383     af.viewport.setColourAppliesToAllGroups(false);
384     af.changeColour(cs);
385     if (view.getConservationSelected() && cs != null)
386     {
387       cs.setConservationInc(view.getConsThreshold());
388     }
389
390     af.viewport.setColourAppliesToAllGroups(true);
391     af.viewport.showSequenceFeatures = view.getShowSequenceFeatures();
392
393     if (jms.getFeatureSettings() != null)
394     {
395       af.viewport.featuresDisplayed = new Hashtable();
396       String[] renderOrder = new String[jms.getFeatureSettings()
397               .getSettingCount()];
398       for (int fs = 0; fs < jms.getFeatureSettings().getSettingCount(); fs++)
399       {
400         Setting setting = jms.getFeatureSettings().getSetting(fs);
401
402         af.alignPanel.seqPanel.seqCanvas.getFeatureRenderer().setColour(
403                 setting.getType(), new java.awt.Color(setting.getColour()));
404
405         renderOrder[fs] = setting.getType();
406
407         if (setting.getDisplay())
408         {
409           af.viewport.featuresDisplayed.put(setting.getType(), new Integer(
410                   setting.getColour()));
411         }
412       }
413       af.alignPanel.seqPanel.seqCanvas.getFeatureRenderer().renderOrder = renderOrder;
414     }
415
416     af.setMenusFromViewport(af.viewport);
417
418     Desktop.addInternalFrame(af, view.getTitle(), view.getWidth(),
419             view.getHeight());
420
421     // LOAD TREES
422     // /////////////////////////////////////
423     if (jms.getTreeCount() > 0)
424     {
425       try
426       {
427         for (int t = 0; t < jms.getTreeCount(); t++)
428         {
429
430           Tree tree = jms.getTree(t);
431
432           TreePanel tp = af.ShowNewickTree(
433                   new jalview.io.NewickFile(tree.getNewick()),
434                   tree.getTitle(), tree.getWidth(), tree.getHeight(),
435                   tree.getXpos(), tree.getYpos());
436
437           tp.fitToWindow.setState(tree.getFitToWindow());
438           tp.fitToWindow_actionPerformed(null);
439
440           if (tree.getFontName() != null)
441           {
442             tp.setTreeFont(new java.awt.Font(tree.getFontName(), tree
443                     .getFontStyle(), tree.getFontSize()));
444           }
445           else
446           {
447             tp.setTreeFont(new java.awt.Font(view.getFontName(), view
448                     .getFontStyle(), tree.getFontSize()));
449           }
450
451           tp.showPlaceholders(tree.getMarkUnlinked());
452           tp.showBootstrap(tree.getShowBootstrap());
453           tp.showDistances(tree.getShowDistances());
454
455           tp.treeCanvas.threshold = tree.getThreshold();
456
457           if (tree.getCurrentTree())
458           {
459             af.viewport.setCurrentTree(tp.getTree());
460           }
461         }
462
463       } catch (Exception ex)
464       {
465         ex.printStackTrace();
466       }
467
468     }
469
470     return af;
471   }
472 }