d6061a4354131c1df24ed115ab790e7d8e647a5f
[jalview.git] / src / jalview / gui / Jalview2XML.java
1 /*
2  * Jalview - A Sequence Alignment Editor and Viewer
3  * Copyright (C) 2006 AM Waterhouse, J Procter, G Barton, M Clamp, S Searle
4  *
5  * This program is free software; you can redistribute it and/or
6  * modify it under the terms of the GNU General Public License
7  * as published by the Free Software Foundation; either version 2
8  * of the License, or (at your option) any later version.
9  *
10  * This program is distributed in the hope that it will be useful,
11  * but WITHOUT ANY WARRANTY; without even the implied warranty of
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13  * GNU General Public License for more details.
14  *
15  * You should have received a copy of the GNU General Public License
16  * along with this program; if not, write to the Free Software
17  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
18  */
19 package jalview.gui;
20
21
22 import jalview.schemes.*;
23
24 import jalview.gui.*;
25
26 import java.io.*;
27
28 import java.net.*;
29
30 import java.util.*;
31
32 import java.util.jar.*;
33
34 import javax.swing.*;
35
36 import org.exolab.castor.xml.*;
37
38 import jalview.schemabinding.version2.*;
39
40
41
42
43 /**
44  * DOCUMENT ME!
45  *
46  * @author $author$
47  * @version $Revision$
48  */
49 public class Jalview2XML
50 {
51     // SAVES SEVERAL ALIGNEMENT WINDOWS TO SAME JARFILE
52     public void SaveState(File statefile)
53     {
54         long creation = System.currentTimeMillis();
55         JInternalFrame[] frames = Desktop.desktop.getAllFrames();
56
57         if (frames == null)
58         {
59             return;
60         }
61
62         try
63         {
64             FileOutputStream fos = new FileOutputStream(statefile);
65             JarOutputStream jout = new JarOutputStream(fos);
66
67             //NOTE UTF-8 MUST BE USED FOR WRITING UNICODE CHARS
68             ////////////////////////////////////////////////////
69             PrintWriter out = new PrintWriter(new OutputStreamWriter(jout,
70                         "UTF-8"));
71
72             Vector shortNames = new Vector();
73
74             //REVERSE ORDER
75             for (int i = frames.length - 1; i > -1; i--)
76             {
77                 if (frames[i] instanceof AlignFrame)
78                 {
79                     AlignFrame af = (AlignFrame) frames[i];
80
81                     String shortName = af.getTitle();
82
83                     if (shortName.indexOf(File.separatorChar) > -1)
84                     {
85                         shortName = shortName.substring(shortName.lastIndexOf(
86                                     File.separatorChar) + 1);
87                     }
88
89                     int count = 1;
90
91                     while (shortNames.contains(shortName))
92                     {
93                         if (shortName.endsWith("_" + (count - 1)))
94                         {
95                             shortName = shortName.substring(0,
96                                     shortName.lastIndexOf("_"));
97                         }
98
99                         shortName = shortName.concat("_" + count);
100                         count++;
101                     }
102
103                     shortNames.addElement(shortName);
104
105                     if (!shortName.endsWith(".xml"))
106                     {
107                         shortName = shortName + ".xml";
108                     }
109
110                     SaveState(af, creation, shortName, jout, out);
111                 }
112             }
113
114             out.close();
115             jout.close();
116         }
117         catch (Exception ex)
118         {
119             ex.printStackTrace();
120         }
121     }
122
123     // USE THIS METHOD TO SAVE A SINGLE ALIGNMENT WINDOW
124     public void SaveAlignment(AlignFrame af, String jarFile,
125         String fileName)
126     {
127         try
128         {
129             FileOutputStream fos = new FileOutputStream(jarFile);
130             JarOutputStream jout = new JarOutputStream(fos);
131
132             //NOTE UTF-8 MUST BE USED FOR WRITING UNICODE CHARS
133             ////////////////////////////////////////////////////
134             PrintWriter out = new PrintWriter(new OutputStreamWriter(jout,
135                         "UTF-8"));
136
137             SaveState(af, System.currentTimeMillis(), fileName, jout, out);
138             out.close();
139             jout.close();
140         }
141         catch (Exception ex)
142         {
143           ex.printStackTrace();
144         }
145     }
146
147     /**
148      * DOCUMENT ME!
149      *
150      * @param af DOCUMENT ME!
151      * @param timeStamp DOCUMENT ME!
152      * @param fileName DOCUMENT ME!
153      * @param jout DOCUMENT ME!
154      * @param out DOCUMENT ME!
155      */
156     public void SaveState(AlignFrame af, long timeStamp,
157         String fileName, JarOutputStream jout, PrintWriter out)
158     {
159         Vector seqids = new Vector();
160         Vector userColours = new Vector();
161
162         AlignViewport av = af.viewport;
163
164         JalviewModel object = new JalviewModel();
165         object.setVamsasModel(new jalview.schemabinding.version2.VamsasModel());
166
167         object.setCreationDate(new java.util.Date(timeStamp));
168         object.setVersion(jalview.bin.Cache.getProperty("VERSION"));
169
170         jalview.datamodel.AlignmentI jal = af.viewport.alignment;
171         jalview.datamodel.AlignmentI jalhidden = null;
172
173         if(av.hasHiddenRows)
174         {
175           jalhidden = jal;
176           jal = jal.getHiddenSequences().getFullAlignment();
177         }
178
179
180         SequenceSet vamsasSet = new SequenceSet();
181         Sequence vamsasSeq;
182         JalviewModelSequence jms = new JalviewModelSequence();
183
184         vamsasSet.setGapChar(jal.getGapCharacter() + "");
185
186         JSeq jseq;
187         Vector pdbfiles = null;
188
189         //SAVE SEQUENCES
190         int id = 0;
191         for (int i = 0; i < jal.getHeight(); i++)
192         {
193             seqids.add(jal.getSequenceAt(i));
194             vamsasSeq = new Sequence();
195             vamsasSeq.setId(id + "");
196             vamsasSeq.setName(jal.getSequenceAt(i).getName());
197             vamsasSeq.setSequence(jal.getSequenceAt(i).getSequence());
198             vamsasSeq.setDescription(jal.getSequenceAt(i).getDescription());
199
200             if(jal.getSequenceAt(i).getDatasetSequence().getDBRef()!=null)
201             {
202               jalview.datamodel.DBRefEntry [] dbrefs =
203                   jal.getSequenceAt(i).getDatasetSequence().getDBRef();
204
205               for(int d=0; d<dbrefs.length; d++)
206               {
207                 DBRef dbref = new DBRef();
208                 dbref.setSource( dbrefs[d].getSource() );
209                 dbref.setVersion( dbrefs[d].getVersion());
210                 dbref.setAccessionId(dbrefs[d].getAccessionId());
211                 vamsasSeq.addDBRef(dbref);
212               }
213             }
214
215             jseq = new JSeq();
216             jseq.setStart(jal.getSequenceAt(i).getStart());
217             jseq.setEnd(jal.getSequenceAt(i).getEnd());
218             jseq.setColour(jal.getSequenceAt(i).getColor().getRGB());
219
220             jseq.setId(id);
221
222             if (av.hasHiddenRows)
223             {
224               jseq.setHidden(jalhidden.getHiddenSequences().isHidden(
225                   jal.getSequenceAt(i)));
226
227               if(jal.getSequenceAt(i).getHiddenSequences()!=null)
228               {
229                 jalview.datamodel.SequenceI [] reps =
230                     jal.getSequenceAt(i).getHiddenSequences().getSequencesInOrder(jal);
231
232                 for(int h=0; h<reps.length; h++)
233                 {
234                   jseq.addHiddenSequences(
235                       jal.findIndex(reps[h])
236                       );
237                 }
238               }
239             }
240
241
242             if(jal.getSequenceAt(i).getDatasetSequence().getSequenceFeatures()!=null)
243             {
244               jalview.datamodel.SequenceFeature[] sf
245                   = jal.getSequenceAt(i).getDatasetSequence().getSequenceFeatures();
246               int index = 0;
247               while(index < sf.length)
248               {
249                 Features features = new Features();
250
251                 features.setBegin(sf[index].getBegin());
252                 features.setEnd(sf[index].getEnd());
253                 features.setDescription(sf[index].getDescription());
254                 features.setType(sf[index].getType());
255                 features.setFeatureGroup(sf[index].getFeatureGroup());
256                 features.setScore(sf[index].getScore());
257                 if(sf[index].links!=null)
258                 {
259                   for(int l=0; l<sf[index].links.size(); l++)
260                   {
261                     OtherData keyValue = new OtherData();
262                     keyValue.setKey("LINK_"+l);
263                     keyValue.setValue(sf[index].links.elementAt(l).toString());
264                     features.addOtherData(keyValue);
265                   }
266                 }
267                 if(sf[index].otherDetails!=null)
268                 {
269                   String key;
270                   Enumeration keys = sf[index].otherDetails.keys();
271                   while(keys.hasMoreElements())
272                   {
273                     key = keys.nextElement().toString();
274                     OtherData keyValue = new OtherData();
275                     keyValue.setKey( key );
276                     keyValue.setValue(
277                         sf[index].otherDetails.get(key).toString());
278                     features.addOtherData(keyValue);
279                   }
280                 }
281
282                 jseq.addFeatures(features);
283                 index ++;
284               }
285             }
286
287             if(jal.getSequenceAt(i).getDatasetSequence().getPDBId()!=null)
288             {
289               Enumeration en = jal.getSequenceAt(i).getDatasetSequence().getPDBId().elements();
290               while(en.hasMoreElements())
291               {
292                 Pdbids pdb = new Pdbids();
293                 jalview.datamodel.PDBEntry entry
294                    = (jalview.datamodel.PDBEntry)en.nextElement();
295
296                 pdb.setId(entry.getId());
297                 pdb.setType(entry.getType());
298
299                 if(entry.getFile()!=null)
300                 {
301                   if(pdbfiles==null)
302                     pdbfiles = new Vector();
303
304
305                   if(!pdbfiles.contains(entry.getId()))
306                   {
307                     pdbfiles.addElement(entry.getId());
308                     try
309                     {
310                       File file = new File(entry.getFile());
311                       if(file.exists())
312                       {
313                         byte[] data = new byte[ (int) file.length()];
314                         jout.putNextEntry(new JarEntry(entry.getId()));
315                         DataInputStream dis = new DataInputStream(new
316                             FileInputStream(file));
317                         dis.readFully(data);
318
319                         DataOutputStream dout = new DataOutputStream(jout);
320                         dout.write(data, 0, data.length);
321                         jout.closeEntry();
322                       }
323                     }
324                     catch (Exception ex)
325                     {
326                       ex.printStackTrace();
327                     }
328                   }
329                 }
330
331
332                 if(entry.getProperty()!=null)
333                 {
334                   PdbentryItem item = new PdbentryItem();
335                   Hashtable properties = entry.getProperty();
336                   Enumeration en2 = properties.keys();
337                   while(en2.hasMoreElements())
338                   {
339                     Property prop = new Property();
340                     String key = en2.nextElement().toString();
341                     prop.setName(key);
342                     prop.setValue( properties.get(key).toString() );
343                     item.addProperty(prop);
344                   }
345                   pdb.addPdbentryItem(item);
346                 }
347
348                 jseq.addPdbids(pdb);
349               }
350             }
351
352             jms.addJSeq(jseq);
353             vamsasSet.addSequence(vamsasSeq);
354             id++;
355         }
356
357         //SAVE TREES
358         ///////////////////////////////////
359         if (af.viewport.currentTree != null)
360         {
361           // FIND ANY ASSOCIATED TREES
362           // NOT IMPLEMENTED FOR HEADLESS STATE AT PRESENT
363           if (Desktop.desktop != null)
364           {
365             JInternalFrame[] frames = Desktop.desktop.getAllFrames();
366
367             for (int t = 0; t < frames.length; t++)
368             {
369               if (frames[t] instanceof TreePanel)
370               {
371                 TreePanel tp = (TreePanel) frames[t];
372
373                 if (tp.treeCanvas.av.alignment == jal)
374                 {
375                   Tree tree = new Tree();
376                   tree.setTitle(tp.getTitle());
377                   tree.setCurrentTree( (af.viewport.currentTree == tp.getTree()));
378                   tree.setNewick(tp.getTree().toString());
379                   tree.setThreshold(tp.treeCanvas.threshold);
380
381                   tree.setFitToWindow(tp.fitToWindow.getState());
382                   tree.setFontName(tp.getTreeFont().getName());
383                   tree.setFontSize(tp.getTreeFont().getSize());
384                   tree.setFontStyle(tp.getTreeFont().getStyle());
385                   tree.setMarkUnlinked(tp.placeholdersMenu.getState());
386
387                   tree.setShowBootstrap(tp.bootstrapMenu.getState());
388                   tree.setShowDistances(tp.distanceMenu.getState());
389
390                   tree.setHeight(tp.getHeight());
391                   tree.setWidth(tp.getWidth());
392                   tree.setXpos(tp.getX());
393                   tree.setYpos(tp.getY());
394
395                   jms.addTree(tree);
396                 }
397               }
398             }
399           }
400         }
401
402         //SAVE ANNOTATIONS
403         if (jal.getAlignmentAnnotation() != null)
404         {
405             jalview.datamodel.AlignmentAnnotation[] aa = jal.getAlignmentAnnotation();
406
407             for (int i = 0; i < aa.length; i++)
408             {
409                 Annotation an = new Annotation();
410
411                 if (aa[i].label.equals("Quality") ||
412                         aa[i].label.equals("Conservation") ||
413                         aa[i].label.equals("Consensus"))
414                 {
415                     an.setLabel(aa[i].label);
416                     an.setGraph(true);
417                     vamsasSet.addAnnotation(an);
418                     continue;
419                 }
420
421
422                 an.setDescription(aa[i].description);
423
424                 if(aa[i].sequenceRef!=null)
425                  {
426                    an.setSequenceRef(aa[i].sequenceRef.getName());
427                  }
428
429                 if(aa[i].graph>0)
430                 {
431                   an.setGraph(true);
432                   an.setGraphType(aa[i].graph);
433                   an.setGraphGroup(aa[i].graphGroup);
434                   if(aa[i].getThreshold()!=null)
435                   {
436                     ThresholdLine line = new ThresholdLine();
437                     line.setLabel(aa[i].getThreshold().label);
438                     line.setValue(aa[i].getThreshold().value);
439                     line.setColour(aa[i].getThreshold().colour.getRGB());
440                     an.setThresholdLine(line);
441                   }
442                 }
443                 else
444                   an.setGraph(false);
445
446                 an.setLabel(aa[i].label);
447
448                 AnnotationElement ae;
449
450                 for (int a = 0; a < aa[i].annotations.length; a++)
451                 {
452                     if ((aa[i] == null) || (aa[i].annotations[a] == null))
453                     {
454                         continue;
455                     }
456
457                     ae = new AnnotationElement();
458                     ae.setDescription(aa[i].annotations[a].description);
459                     ae.setDisplayCharacter(aa[i].annotations[a].displayCharacter);
460                     ae.setValue(aa[i].annotations[a].value);
461                     ae.setPosition(a);
462                     ae.setSecondaryStructure(aa[i].annotations[a].secondaryStructure +
463                         "");
464
465                     if(aa[i].annotations[a].colour!=java.awt.Color.black)
466                       ae.setColour(aa[i].annotations[a].colour.getRGB());
467
468                     an.addAnnotationElement(ae);
469                 }
470
471                 vamsasSet.addAnnotation(an);
472             }
473         }
474
475         //SAVE GROUPS
476         if (jal.getGroups() != null)
477         {
478             JGroup[] groups = new JGroup[jal.getGroups().size()];
479
480             for (int i = 0; i < groups.length; i++)
481             {
482                 groups[i] = new JGroup();
483
484                 jalview.datamodel.SequenceGroup sg = (jalview.datamodel.SequenceGroup) jal.getGroups()
485                                                                                           .elementAt(i);
486                 groups[i].setStart(sg.getStartRes());
487                 groups[i].setEnd(sg.getEndRes());
488                 groups[i].setName(sg.getName());
489                 if(sg.cs!=null)
490                 {
491                   if (sg.cs.conservationApplied())
492                   {
493                     groups[i].setConsThreshold(sg.cs.getConservationInc());
494
495                     if (sg.cs instanceof jalview.schemes.UserColourScheme)
496                     {
497                       groups[i].setColour(SetUserColourScheme(sg.cs,
498                           userColours,
499                           jms));
500                     }
501                     else
502                     {
503                       groups[i].setColour(ColourSchemeProperty.getColourName(sg.
504                           cs));
505                     }
506                   }
507                   else if(sg.cs instanceof jalview.schemes.AnnotationColourGradient)
508                   {
509                     groups[i].setColour(
510                         ColourSchemeProperty.getColourName(
511                       ( (jalview.schemes.AnnotationColourGradient) sg.cs).getBaseColour()));
512                   }
513                   else if (sg.cs instanceof jalview.schemes.UserColourScheme)
514                   {
515                     groups[i].setColour(SetUserColourScheme(sg.cs, userColours,
516                         jms));
517                   }
518                   else
519                   {
520                     groups[i].setColour(ColourSchemeProperty.getColourName(
521                         sg.cs));
522                   }
523
524                   groups[i].setPidThreshold(sg.cs.getThreshold());
525                 }
526
527                 groups[i].setOutlineColour(sg.getOutlineColour().getRGB());
528                 groups[i].setDisplayBoxes(sg.getDisplayBoxes());
529                 groups[i].setDisplayText(sg.getDisplayText());
530                 groups[i].setColourText(sg.getColourText());
531
532                 for (int s = 0; s < sg.getSize(false); s++)
533                 {
534                     jalview.datamodel.Sequence seq = (jalview.datamodel.Sequence) sg.getSequenceAt(s);
535                     int index = seqids.indexOf(seq);
536                     groups[i].addSeq(index);
537                 }
538             }
539
540             jms.setJGroup(groups);
541         }
542
543
544         ///////////SAVE VIEWPORT
545         Viewport view = new Viewport();
546         view.setTitle(af.getTitle());
547         view.setXpos(af.getX());
548         view.setYpos(af.getY());
549         view.setWidth(af.getWidth());
550         view.setHeight(af.getHeight());
551         view.setStartRes(av.startRes);
552         view.setStartSeq(av.startSeq);
553
554         if (av.getGlobalColourScheme() instanceof jalview.schemes.UserColourScheme)
555         {
556             view.setBgColour(SetUserColourScheme(av.getGlobalColourScheme(),
557                     userColours, jms));
558         }
559         else if(av.getGlobalColourScheme() instanceof jalview.schemes.AnnotationColourGradient)
560         {
561            jalview.schemes.AnnotationColourGradient acg
562               = (jalview.schemes.AnnotationColourGradient)av.getGlobalColourScheme();
563
564             AnnotationColours ac = new AnnotationColours();
565             ac.setAboveThreshold(acg.getAboveThreshold());
566             ac.setThreshold(acg.getAnnotationThreshold());
567             ac.setAnnotation(acg.getAnnotation());
568             if(acg.getBaseColour() instanceof jalview.schemes.UserColourScheme)
569               ac.setColourScheme(SetUserColourScheme(acg.getBaseColour(),
570                     userColours, jms));
571             else
572               ac.setColourScheme(ColourSchemeProperty.getColourName(acg.getBaseColour()));
573
574             ac.setMaxColour(acg.getMaxColour().getRGB());
575             ac.setMinColour(acg.getMinColour().getRGB());
576             view.setAnnotationColours(ac);
577             view.setBgColour("AnnotationColourGradient");
578         }
579         else
580         {
581             view.setBgColour(ColourSchemeProperty.getColourName(
582                     av.getGlobalColourScheme()));
583         }
584
585         ColourSchemeI cs = av.getGlobalColourScheme();
586
587         if(cs!=null)
588         {
589           if (cs.conservationApplied())
590           {
591             view.setConsThreshold(cs.getConservationInc());
592             if (cs instanceof jalview.schemes.UserColourScheme)
593               view.setBgColour(SetUserColourScheme(cs, userColours, jms));
594           }
595
596           if (cs instanceof ResidueColourScheme)
597           {
598             view.setPidThreshold(cs.getThreshold());
599           }
600         }
601
602         view.setConservationSelected(av.getConservationSelected());
603         view.setPidSelected(av.getAbovePIDThreshold());
604         view.setFontName(av.font.getName());
605         view.setFontSize(av.font.getSize());
606         view.setFontStyle(av.font.getStyle());
607         view.setRenderGaps(av.renderGaps);
608         view.setShowAnnotation(av.getShowAnnotation());
609         view.setShowBoxes(av.getShowBoxes());
610         view.setShowColourText(av.getColourText());
611         view.setShowConservation(av.showConservation);
612         view.setShowFullId(av.getShowJVSuffix());
613         view.setShowIdentity(av.showIdentity);
614         view.setShowQuality(av.showQuality);
615         view.setShowSequenceFeatures(av.showSequenceFeatures);
616         view.setShowText(av.getShowText());
617         view.setWrapAlignment(av.getWrapAlignment());
618
619         if(av.featuresDisplayed!=null)
620         {
621           jalview.schemabinding.version2.FeatureSettings fs
622               = new jalview.schemabinding.version2.FeatureSettings();
623
624           String [] renderOrder =
625               af.alignPanel.seqPanel.seqCanvas.getFeatureRenderer().renderOrder;
626
627           Vector settingsAdded = new Vector();
628           for(int ro=0; ro<renderOrder.length; ro++)
629           {
630             Setting setting = new Setting();
631             setting.setType(renderOrder[ro]);
632             setting.setColour(
633                 af.alignPanel.seqPanel.seqCanvas.getFeatureRenderer().getColour(renderOrder[ro]).getRGB()
634                 );
635
636             setting.setDisplay(
637                 av.featuresDisplayed.containsKey(renderOrder[ro])
638                 );
639
640             fs.addSetting(setting);
641             settingsAdded.addElement(renderOrder[ro]);
642           }
643
644           //Make sure we save none displayed feature settings
645           Enumeration en =
646               af.alignPanel.seqPanel.seqCanvas.getFeatureRenderer().featureColours.keys();
647           while(en.hasMoreElements())
648           {
649             String key = en.nextElement().toString();
650             if(settingsAdded.contains(key))
651               continue;
652
653             Setting setting = new Setting();
654             setting.setType(key);
655             setting.setColour(
656                 af.alignPanel.seqPanel.seqCanvas.getFeatureRenderer().getColour(key).getRGB()
657                 );
658
659             setting.setDisplay(false);
660
661             fs.addSetting(setting);
662             settingsAdded.addElement(key);
663           }
664
665           jms.setFeatureSettings(fs);
666
667         }
668
669         if(av.hasHiddenColumns)
670         {
671           for(int c=0; c<av.getColumnSelection().getHiddenColumns().size(); c++)
672           {
673             int [] region = (int[]) av.getColumnSelection().getHiddenColumns().elementAt(c);
674             HiddenColumns hc = new HiddenColumns();
675             hc.setStart(region[0]);
676             hc.setEnd(region[1]);
677             view.addHiddenColumns(hc);
678           }
679         }
680
681         jms.addViewport(view);
682
683
684         object.setJalviewModelSequence(jms);
685         object.getVamsasModel().addSequenceSet(vamsasSet);
686
687         try
688         {
689             if (!fileName.endsWith(".xml"))
690             {
691                 fileName = fileName + ".xml";
692             }
693
694             JarEntry entry = new JarEntry(fileName);
695             jout.putNextEntry(entry);
696
697             object.marshal(out);
698         }
699         catch (Exception ex)
700         {
701             ex.printStackTrace();
702         }
703     }
704
705     String SetUserColourScheme(jalview.schemes.ColourSchemeI cs,
706         Vector userColours, JalviewModelSequence jms)
707     {
708         String id = null;
709         jalview.schemes.UserColourScheme ucs = (jalview.schemes.UserColourScheme) cs;
710
711         if (!userColours.contains(ucs))
712         {
713             userColours.add(ucs);
714
715             java.awt.Color[] colours = ucs.getColours();
716             jalview.schemabinding.version2.UserColours uc = new jalview.schemabinding.version2.UserColours();
717             jalview.schemabinding.version2.UserColourScheme jbucs = new jalview.schemabinding.version2.UserColourScheme();
718
719             for (int i = 0; i < colours.length; i++)
720             {
721                 jalview.schemabinding.version2.Colour col = new jalview.schemabinding.version2.Colour();
722                 col.setName(ResidueProperties.aa[i]);
723                 col.setRGB(jalview.util.Format.getHexString(colours[i]));
724                 jbucs.addColour(col);
725             }
726             if(ucs.getLowerCaseColours()!=null)
727             {
728               colours = ucs.getLowerCaseColours();
729               for (int i = 0; i < colours.length; i++)
730              {
731                  jalview.schemabinding.version2.Colour col = new jalview.schemabinding.version2.Colour();
732                  col.setName(ResidueProperties.aa[i].toLowerCase());
733                  col.setRGB(jalview.util.Format.getHexString(colours[i]));
734                  jbucs.addColour(col);
735              }
736             }
737
738             id = "ucs" + userColours.indexOf(ucs);
739             uc.setId(id);
740             uc.setUserColourScheme(jbucs);
741             jms.addUserColours(uc);
742         }
743
744         return id;
745     }
746
747    jalview.schemes.UserColourScheme GetUserColourScheme(
748         JalviewModelSequence jms, String id)
749     {
750         UserColours[] uc = jms.getUserColours();
751         UserColours colours = null;
752
753         for (int i = 0; i < uc.length; i++)
754         {
755             if (uc[i].getId().equals(id))
756             {
757                 colours = uc[i];
758
759                 break;
760             }
761         }
762
763         java.awt.Color[] newColours = new java.awt.Color[24];
764
765         for (int i = 0; i < 24; i++)
766         {
767             newColours[i] = new java.awt.Color(Integer.parseInt(
768                         colours.getUserColourScheme().getColour(i).getRGB(), 16));
769         }
770
771         jalview.schemes.UserColourScheme ucs =
772             new jalview.schemes.UserColourScheme(newColours);
773
774         if (colours.getUserColourScheme().getColourCount() > 24)
775         {
776           newColours = new java.awt.Color[23];
777           for (int i = 0; i < 23; i++)
778           {
779             newColours[i] = new java.awt.Color(Integer.parseInt(
780                 colours.getUserColourScheme().getColour(i+24).getRGB(), 16));
781           }
782           ucs.setLowerCaseColours(newColours);
783         }
784
785         return ucs;
786     }
787
788     /**
789      * DOCUMENT ME!
790      *
791      * @param file DOCUMENT ME!
792      */
793     public AlignFrame LoadJalviewAlign(final String file)
794     {
795         jalview.gui.AlignFrame af = null;
796         try
797         {
798             //UNMARSHALLER SEEMS TO CLOSE JARINPUTSTREAM, MOST ANNOYING
799             URL url = null;
800
801             if (file.startsWith("http://"))
802             {
803                 url = new URL(file);
804             }
805
806             JarInputStream jin = null;
807             JarEntry jarentry = null;
808             int entryCount = 1;
809
810             do
811             {
812                 if (url != null)
813                 {
814                     jin = new JarInputStream(url.openStream());
815                 }
816                 else
817                 {
818                     jin = new JarInputStream(new FileInputStream(file));
819                 }
820
821                 for (int i = 0; i < entryCount; i++)
822                 {
823                     jarentry = jin.getNextJarEntry();
824                 }
825
826                 if (jarentry != null && jarentry.getName().endsWith(".xml"))
827                 {
828                     InputStreamReader in = new InputStreamReader(jin, "UTF-8");
829                     JalviewModel object = new JalviewModel();
830
831                     Unmarshaller unmar = new Unmarshaller(object);
832                     unmar.setValidation(false);
833                     object = (JalviewModel) unmar.unmarshal( in );
834
835                     af = LoadFromObject(object, file);
836                     entryCount++;
837                 }
838                 else if (jarentry != null)
839                 {
840                   //Some other file here.
841                   entryCount++;
842                 }
843             }
844             while (jarentry != null);
845         }
846         catch(java.net.UnknownHostException ex)
847         {
848           ex.printStackTrace();
849           System.err.println("Couldn't locate Jalview XML file : " +
850               ex + "\n");
851
852           javax.swing.SwingUtilities.invokeLater(new Runnable()
853           {
854             public void run()
855             {
856               JOptionPane.showInternalMessageDialog(Desktop.desktop,
857                   "Couldn't locate " + file,
858                   "URL not found",
859                   JOptionPane.WARNING_MESSAGE);
860             }
861           });
862         }
863         catch (Exception ex)
864         {
865
866           //Is Version 1 Jar file?
867           af =  new Jalview2XML_V1().LoadJalviewAlign(file);
868
869           if(af!=null)
870           {
871             System.out.println("Successfully loaded archive file");
872             return af;
873           }
874           ex.printStackTrace();
875             System.err.println("Exception whilst loading jalview XML file : " +
876                 ex + "\n");
877             javax.swing.SwingUtilities.invokeLater(new Runnable()
878             {
879               public void run()
880               {
881
882                 JOptionPane.showInternalMessageDialog(Desktop.desktop,
883                     "Error loading  " + file,
884                     "Error loading Jalview file",
885                     JOptionPane.WARNING_MESSAGE);
886               }});
887         }
888
889         return af;
890     }
891
892     String loadPDBFile(String file, String pdbId)
893     {
894       System.out.println("load file "+file);
895       try
896       {
897         JarInputStream jin = null;
898
899         if (file.startsWith("http://"))
900         {
901           jin = new JarInputStream(new URL(file).openStream());
902         }
903         else
904         {
905           jin = new JarInputStream(new FileInputStream(file));
906         }
907
908         JarEntry entry = null;
909         do
910         {
911           entry = jin.getNextJarEntry();
912         }
913         while (!entry.getName().equals(pdbId));
914
915         BufferedReader in = new BufferedReader(new InputStreamReader(jin));
916         File outFile = File.createTempFile("jalview_pdb", ".txt");
917         outFile.deleteOnExit();
918         PrintWriter out = new PrintWriter(new FileOutputStream(outFile));
919         String data;
920
921         while ( (data = in.readLine()) != null)
922         {
923           out.println(data);
924         }
925         out.close();
926         return outFile.getAbsolutePath();
927
928       }
929       catch (Exception ex)
930       {
931         ex.printStackTrace();
932       }
933
934       return null;
935     }
936
937
938     AlignFrame LoadFromObject(JalviewModel object, String file)
939     {
940         Vector seqids = new Vector();
941         SequenceSet vamsasSet = object.getVamsasModel().getSequenceSet(0);
942         Sequence[] vamsasSeq = vamsasSet.getSequence();
943
944         JalviewModelSequence jms = object.getJalviewModelSequence();
945
946         //////////////////////////////////
947         //LOAD SEQUENCES
948         Vector hiddenSeqs = null;
949         jalview.datamodel.Sequence[] jseqs = new jalview.datamodel.Sequence[vamsasSeq.length];
950         JSeq[] JSEQ = object.getJalviewModelSequence().getJSeq();
951         for (int i = 0; i < vamsasSeq.length; i++)
952         {
953             jseqs[i] = new jalview.datamodel.Sequence(vamsasSeq[i].getName(),
954                     vamsasSeq[i].getSequence());
955             jseqs[i].setDescription( vamsasSeq[i].getDescription() );
956
957             if(JSEQ[i].getHidden())
958             {
959               if(hiddenSeqs == null)
960                 hiddenSeqs = new Vector();
961               hiddenSeqs.addElement(jseqs[i]);
962             }
963             jseqs[i].setStart(JSEQ[i].getStart());
964             jseqs[i].setEnd(JSEQ[i].getEnd());
965             jseqs[i].setColor(new java.awt.Color(JSEQ[i].getColour()));
966             seqids.add(jseqs[i]);
967         }
968
969         ///SequenceFeatures are added to the DatasetSequence,
970         // so we must create the dataset before loading features
971         /////////////////////////////////
972         jalview.datamodel.Alignment al = new jalview.datamodel.Alignment(jseqs);
973         al.setDataset(null);
974         /////////////////////////////////
975
976
977         Hashtable pdbloaded = new Hashtable();
978         for (int i = 0; i < vamsasSeq.length; i++)
979         {
980           if (JSEQ[i].getFeaturesCount() > 0)
981           {
982             Features[] features = JSEQ[i].getFeatures();
983             for (int f = 0; f < features.length; f++)
984             {
985               jalview.datamodel.SequenceFeature sf
986                   = new jalview.datamodel.SequenceFeature(features[f].getType(),
987                   features[f].getDescription(), features[f].getStatus(),
988                   features[f].getBegin(), features[f].getEnd(),
989                   features[f].getFeatureGroup());
990
991               sf.setScore(features[f].getScore());
992               for(int od=0; od<features[f].getOtherDataCount(); od++)
993               {
994                 OtherData keyValue = features[f].getOtherData(od);
995                 if(keyValue.getKey().startsWith("LINK"))
996                   sf.addLink(keyValue.getValue());
997                 else
998                   sf.setValue(keyValue.getKey(), keyValue.getValue());
999
1000               }
1001
1002               al.getSequenceAt(i).getDatasetSequence().addSequenceFeature(sf);
1003             }
1004           }
1005           if (JSEQ[i].getPdbidsCount() > 0)
1006           {
1007             Pdbids[] ids = JSEQ[i].getPdbids();
1008             for (int p = 0; p < ids.length; p++)
1009             {
1010               jalview.datamodel.PDBEntry entry = new jalview.datamodel.PDBEntry();
1011               entry.setId(ids[p].getId());
1012               entry.setType(ids[p].getType());
1013               if (ids[p].getFile() != null)
1014               {
1015                 if (!pdbloaded.containsKey(ids[p].getFile()))
1016                 {
1017                   String tmppdb = loadPDBFile(file, ids[p].getId());
1018                   entry.setFile(tmppdb);
1019                   pdbloaded.put(ids[p].getId(), tmppdb);
1020                 }
1021                 else
1022                   entry.setFile(pdbloaded.get(ids[p].getId()).toString());
1023               }
1024
1025               al.getSequenceAt(i).getDatasetSequence().addPDBId(entry);
1026             }
1027           }
1028           if(vamsasSeq[i].getDBRefCount()>0)
1029           {
1030             for(int d=0; d<vamsasSeq[i].getDBRefCount(); d++)
1031             {
1032               jalview.datamodel.DBRefEntry entry =
1033                   new jalview.datamodel.DBRefEntry(
1034                       vamsasSeq[i].getDBRef(d).getSource(),
1035                       vamsasSeq[i].getDBRef(d).getVersion(),
1036                       vamsasSeq[i].getDBRef(d).getAccessionId()
1037                       );
1038               al.getSequenceAt(i).getDatasetSequence().addDBRef(entry);
1039             }
1040
1041           }
1042         }
1043
1044
1045
1046          /////////////////////////////////
1047         //////////////////////////////////
1048         //LOAD ANNOTATIONS
1049         boolean hideQuality = true,
1050             hideConservation = true,
1051             hideConsensus = true;
1052
1053         if (vamsasSet.getAnnotation() != null)
1054         {
1055             Annotation[] an = vamsasSet.getAnnotation();
1056
1057             for (int i = 0; i < an.length; i++)
1058             {
1059                if (an[i].getLabel().equals("Quality"))
1060                 {
1061                  hideQuality = false;
1062                  continue;
1063                 }
1064                else if(an[i].getLabel().equals("Conservation"))
1065                {
1066                  hideConservation = false;
1067                  continue;
1068                }
1069                else if(an[i].getLabel().equals("Consensus"))
1070                {
1071                  hideConsensus = false;
1072                  continue;
1073                }
1074
1075                 AnnotationElement[] ae = an[i].getAnnotationElement();
1076                 jalview.datamodel.Annotation[] anot = new jalview.datamodel.Annotation[al.getWidth()];
1077
1078                 for (int aa = 0; aa < ae.length; aa++)
1079                 {
1080                     anot[ae[aa].getPosition()] = new jalview.datamodel.Annotation(ae[aa].getDisplayCharacter(),
1081                             ae[aa].getDescription(),
1082                             ae[aa].getSecondaryStructure().length()==0?' ':ae[aa].getSecondaryStructure().charAt(0),
1083                             ae[aa].getValue());
1084                     anot[ae[aa].getPosition()].colour = new java.awt.Color( ae[aa].getColour() );
1085                 }
1086
1087                 jalview.datamodel.AlignmentAnnotation jaa = null;
1088
1089                 if (an[i].getGraph())
1090                 {
1091                   jaa = new jalview.datamodel.AlignmentAnnotation(an[i].getLabel(),
1092                       an[i].getDescription(), anot, 0, 0,
1093                       an[i].getGraphType());
1094
1095                   jaa.graphGroup = an[i].getGraphGroup();
1096
1097                   if (an[i].getThresholdLine() != null)
1098                   {
1099                     jaa.setThreshold(new jalview.datamodel.GraphLine(
1100                                   an[i].getThresholdLine().getValue(),
1101                                   an[i].getThresholdLine().getLabel(),
1102                                 new java.awt.Color(an[i].getThresholdLine().getColour()))
1103                              );
1104
1105                   }
1106
1107                 }
1108                 else
1109                 {
1110                     jaa = new jalview.datamodel.AlignmentAnnotation(an[i].getLabel(),
1111                             an[i].getDescription(), anot);
1112                 }
1113
1114                 if(an[i].getSequenceRef()!=null)
1115                 {
1116                   jaa.createSequenceMapping(
1117                       al.findName(an[i].getSequenceRef()), 1, true
1118                       );
1119                   al.findName(an[i].getSequenceRef()).addAlignmentAnnotation(jaa);
1120                 }
1121
1122                 al.addAnnotation(jaa);
1123             }
1124         }
1125
1126
1127         //  af.changeColour() );
1128         /////////////////////////
1129         //LOAD GROUPS
1130         if (jms.getJGroupCount() > 0)
1131         {
1132             JGroup[] groups = jms.getJGroup();
1133
1134             for (int i = 0; i < groups.length; i++)
1135             {
1136                 ColourSchemeI cs = null;
1137
1138                 if (groups[i].getColour() != null)
1139                 {
1140                     if (groups[i].getColour().startsWith("ucs"))
1141                     {
1142                         cs = GetUserColourScheme(jms, groups[i].getColour());
1143                     }
1144                     else
1145                     {
1146                         cs = ColourSchemeProperty.getColour(al,
1147                                 groups[i].getColour());
1148                     }
1149
1150                     if(cs!=null)
1151                       cs.setThreshold(groups[i].getPidThreshold(), true);
1152                 }
1153
1154                 Vector seqs = new Vector();
1155                 int[] ids = groups[i].getSeq();
1156
1157                 for (int s = 0; s < ids.length; s++)
1158                 {
1159                     seqs.addElement((jalview.datamodel.SequenceI) seqids.elementAt(
1160                             ids[s]));
1161                 }
1162
1163                 jalview.datamodel.SequenceGroup sg = new jalview.datamodel.SequenceGroup(seqs,
1164                         groups[i].getName(), cs, groups[i].getDisplayBoxes(),
1165                         groups[i].getDisplayText(), groups[i].getColourText(),
1166                         groups[i].getStart(), groups[i].getEnd());
1167
1168                 sg.setOutlineColour(new java.awt.Color(
1169                         groups[i].getOutlineColour()));
1170
1171                 if (groups[i].getConsThreshold() != 0)
1172                 {
1173                     jalview.analysis.Conservation c = new jalview.analysis.Conservation("All",
1174                             ResidueProperties.propHash, 3, sg.getSequences(false), 0,
1175                             sg.getWidth() - 1);
1176                     c.calculate();
1177                     c.verdict(false, 25);
1178                     sg.cs.setConservation(c);
1179                 }
1180
1181                 al.addGroup(sg);
1182             }
1183         }
1184
1185
1186         /////////////////////////////////
1187         // LOAD VIEWPORT
1188         Viewport[] views = jms.getViewport();
1189         Viewport view = views[0]; // DEAL WITH MULTIPLE VIEWPORTS LATER
1190
1191
1192         AlignFrame af = new AlignFrame(al);
1193
1194         if(hiddenSeqs!=null)
1195         {
1196           for(int s=0; s<JSEQ.length; s++)
1197           {
1198             for(int r=0; r<JSEQ[s].getHiddenSequencesCount(); r++)
1199             {
1200               al.getSequenceAt(s).addHiddenSequence(
1201                   al.getSequenceAt( JSEQ[s].getHiddenSequences(r)  )
1202                   );
1203             }
1204           }
1205
1206           jalview.datamodel.SequenceI [] hseqs = new
1207               jalview.datamodel.SequenceI[hiddenSeqs.size()];
1208
1209           for(int s=0; s<hiddenSeqs.size(); s++)
1210             hseqs[s] = (jalview.datamodel.SequenceI)hiddenSeqs.elementAt(s);
1211
1212           af.viewport.hideSequence( hseqs );
1213
1214         }
1215
1216
1217         if(hideConsensus || hideQuality || hideConservation)
1218         {
1219           int hSize = al.getAlignmentAnnotation().length;
1220           for (int h = 0; h < hSize; h++)
1221           {
1222             if (
1223                 (hideConsensus &&
1224                  al.getAlignmentAnnotation()[h].label.equals("Consensus"))
1225                 ||
1226                 (hideQuality &&
1227                  al.getAlignmentAnnotation()[h].label.equals("Quality"))
1228                 ||
1229                 (hideConservation &&
1230                  al.getAlignmentAnnotation()[h].label.equals("Conservation")))
1231             {
1232               al.deleteAnnotation(al.getAlignmentAnnotation()[h]);
1233               hSize--;
1234               h--;
1235             }
1236           }
1237           af.alignPanel.adjustAnnotationHeight();
1238         }
1239
1240         af.setBounds(view.getXpos(), view.getYpos(), view.getWidth(),
1241             view.getHeight());
1242         af.viewport.setStartRes(view.getStartRes());
1243         af.viewport.setStartSeq(view.getStartSeq());
1244         af.viewport.setShowAnnotation(view.getShowAnnotation());
1245         af.viewport.showConservation = view.getShowConservation();
1246         af.viewport.showQuality = view.getShowQuality();
1247         af.viewport.showIdentity = view.getShowIdentity();
1248         af.viewport.setAbovePIDThreshold(view.getPidSelected());
1249         af.abovePIDThreshold.setSelected(view.getPidSelected());
1250         af.viewport.setColourText(view.getShowColourText());
1251         af.colourTextMenuItem.setSelected(view.getShowColourText());
1252         af.viewport.setConservationSelected(view.getConservationSelected());
1253         af.conservationMenuItem.setSelected(view.getConservationSelected());
1254
1255         af.viewport.setShowJVSuffix(view.getShowFullId());
1256         af.seqLimits.setSelected(view.getShowFullId());
1257
1258         af.viewport.setFont(new java.awt.Font(view.getFontName(),
1259                 view.getFontStyle(), view.getFontSize()));
1260         af.alignPanel.fontChanged();
1261
1262         af.viewport.setRenderGaps(view.getRenderGaps());
1263         af.renderGapsMenuItem.setSelected(view.getRenderGaps());
1264
1265         af.viewport.setWrapAlignment(view.getWrapAlignment());
1266         af.wrapMenuItem.setSelected(view.getWrapAlignment());
1267
1268         af.alignPanel.setWrapAlignment(view.getWrapAlignment());
1269
1270         af.annotationPanelMenuItem.setState(view.getShowAnnotation());
1271         af.viewport.setShowAnnotation(view.getShowAnnotation());
1272         af.alignPanel.setAnnotationVisible(view.getShowAnnotation());
1273
1274         af.viewport.setShowBoxes(view.getShowBoxes());
1275         af.viewBoxesMenuItem.setSelected(view.getShowBoxes());
1276         af.viewport.setShowText(view.getShowText());
1277         af.viewTextMenuItem.setSelected(view.getShowText());
1278
1279         ColourSchemeI cs = null;
1280
1281         if (view.getBgColour() != null)
1282         {
1283             if (view.getBgColour().startsWith("ucs"))
1284             {
1285                 cs = GetUserColourScheme(jms, view.getBgColour());
1286             }
1287             else if(view.getBgColour().startsWith("Annotation"))
1288             {
1289               //int find annotation
1290               for (int i = 0; i < af.viewport.alignment.getAlignmentAnnotation().length; i++)
1291               {
1292                 if (af.viewport.alignment.getAlignmentAnnotation()[i].label.
1293                     equals(view.getAnnotationColours().getAnnotation()))
1294                 {
1295                   if (af.viewport.alignment.getAlignmentAnnotation()[i].
1296                       getThreshold() == null)
1297                   {
1298                     af.viewport.alignment.getAlignmentAnnotation()[i].
1299                         setThreshold(
1300                             new jalview.datamodel.GraphLine(
1301                                 view.getAnnotationColours().getThreshold(),
1302                                 "Threshold", java.awt.Color.black)
1303
1304                         );
1305                   }
1306
1307
1308                   if (view.getAnnotationColours().getColourScheme().equals(
1309                       "None"))
1310                   {
1311                     cs = new AnnotationColourGradient(
1312                         af.viewport.alignment.getAlignmentAnnotation()[i],
1313                         new java.awt.Color(view.getAnnotationColours().
1314                                            getMinColour()),
1315                         new java.awt.Color(view.getAnnotationColours().
1316                                            getMaxColour()),
1317                         view.getAnnotationColours().getAboveThreshold());
1318                   }
1319                   else if (view.getAnnotationColours().getColourScheme().
1320                            startsWith("ucs"))
1321                   {
1322                      cs = new AnnotationColourGradient(
1323                          af.viewport.alignment.getAlignmentAnnotation()[i],
1324                          GetUserColourScheme(jms, view.getAnnotationColours().
1325                                                         getColourScheme()),
1326                          view.getAnnotationColours().getAboveThreshold()
1327                          );
1328                    }
1329                    else
1330                    {
1331                      cs = new AnnotationColourGradient(
1332                          af.viewport.alignment.getAlignmentAnnotation()[i],
1333                          ColourSchemeProperty.getColour(al,
1334                          view.getAnnotationColours().getColourScheme()),
1335                          view.getAnnotationColours().getAboveThreshold()
1336                          );
1337                    }
1338
1339                   // Also use these settings for all the groups
1340                   if (al.getGroups() != null)
1341                     for (int g = 0; g < al.getGroups().size(); g++)
1342                     {
1343                       jalview.datamodel.SequenceGroup sg
1344                           = (jalview.datamodel.SequenceGroup)al.getGroups().elementAt(g);
1345
1346                       if(sg.cs == null)
1347                         continue;
1348
1349
1350                   /*    if (view.getAnnotationColours().getColourScheme().equals("None"))
1351                       {
1352                         sg.cs = new AnnotationColourGradient(
1353                             af.viewport.alignment.getAlignmentAnnotation()[i],
1354                             new java.awt.Color(view.getAnnotationColours().
1355                                                getMinColour()),
1356                             new java.awt.Color(view.getAnnotationColours().
1357                                                getMaxColour()),
1358                             view.getAnnotationColours().getAboveThreshold());
1359                       }
1360                       else*/
1361                       {
1362                         sg.cs = new AnnotationColourGradient(
1363                             af.viewport.alignment.getAlignmentAnnotation()[i],
1364                             sg.cs,
1365                             view.getAnnotationColours().getAboveThreshold()
1366                             );
1367                       }
1368
1369                     }
1370
1371
1372                   break;
1373                 }
1374
1375               }
1376             }
1377             else
1378             {
1379                 cs = ColourSchemeProperty.getColour(al, view.getBgColour());
1380             }
1381
1382             if(cs!=null)
1383             {
1384               cs.setThreshold(view.getPidThreshold(), true);
1385               cs.setConsensus(af.viewport.vconsensus);
1386             }
1387         }
1388
1389         af.setColourSelected(view.getBgColour());
1390         af.viewport.setGlobalColourScheme(cs);
1391         af.viewport.setColourAppliesToAllGroups(false);
1392         af.changeColour(cs);
1393         if (view.getConservationSelected() && cs!=null)
1394         {
1395           cs.setConservationInc(view.getConsThreshold());
1396         }
1397
1398         af.viewport.setColourAppliesToAllGroups(true);
1399
1400         if (view.getShowSequenceFeatures())
1401         {
1402            af.viewport.showSequenceFeatures = true;
1403            af.showSeqFeatures.setSelected(true);
1404         }
1405
1406         if(jms.getFeatureSettings()!=null)
1407         {
1408           af.viewport.featuresDisplayed = new Hashtable();
1409           String [] renderOrder = new String[jms.getFeatureSettings().getSettingCount()];
1410          for(int fs=0; fs<jms.getFeatureSettings().getSettingCount(); fs++)
1411          {
1412            Setting setting = jms.getFeatureSettings().getSetting(fs);
1413
1414            af.alignPanel.seqPanel.seqCanvas.getFeatureRenderer().setColour(setting.getType(),
1415                new java.awt.Color(setting.getColour()));
1416
1417            renderOrder[fs] = setting.getType();
1418
1419            if(setting.getDisplay())
1420              af.viewport.featuresDisplayed.put(
1421                  setting.getType(), new Integer(setting.getColour()));
1422          }
1423          af.alignPanel.seqPanel.seqCanvas.getFeatureRenderer().renderOrder = renderOrder;
1424         }
1425
1426         if (view.getHiddenColumnsCount() > 0)
1427         {
1428           for (int c = 0; c < view.getHiddenColumnsCount(); c++)
1429           {
1430               af.viewport.hideColumns(
1431                 view.getHiddenColumns(c).getStart(),
1432                 view.getHiddenColumns(c).getEnd() //+1
1433                 );
1434           }
1435         }
1436
1437
1438         Desktop.addInternalFrame(af, view.getTitle(),
1439              view.getWidth(), view.getHeight());
1440
1441         //LOAD TREES
1442         ///////////////////////////////////////
1443         if (jms.getTreeCount() > 0)
1444         {
1445             try
1446             {
1447                 for (int t = 0; t < jms.getTreeCount(); t++)
1448                 {
1449
1450                     Tree tree = jms.getTree(t);
1451
1452                     TreePanel tp = af.ShowNewickTree(new jalview.io.NewickFile(
1453                                 tree.getNewick()), tree.getTitle(),
1454                                 tree.getWidth(), tree.getHeight(),
1455                                 tree.getXpos(), tree.getYpos());
1456
1457                     tp.fitToWindow.setState(tree.getFitToWindow());
1458                     tp.fitToWindow_actionPerformed(null);
1459
1460                     if(tree.getFontName()!=null)
1461                       tp.setTreeFont(new java.awt.Font(tree.getFontName(),
1462                                           tree.getFontStyle(),
1463                                           tree.getFontSize()));
1464                     else
1465                       tp.setTreeFont(new java.awt.Font(view.getFontName(),
1466                                             view.getFontStyle(),
1467                                             tree.getFontSize()));
1468
1469                     tp.showPlaceholders(tree.getMarkUnlinked());
1470                     tp.showBootstrap(tree.getShowBootstrap());
1471                     tp.showDistances(tree.getShowDistances());
1472
1473                     tp.treeCanvas.threshold = tree.getThreshold();
1474
1475                     if (tree.getCurrentTree())
1476                       af.viewport.setCurrentTree(tp.getTree());
1477                 }
1478
1479             }
1480             catch (Exception ex)
1481             {
1482                 ex.printStackTrace();
1483             }
1484
1485         }
1486
1487         return af;
1488     }
1489 }
1490