off by one bug in hiden column unmarshalling
[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.setRGB(jalview.util.Format.getHexString(colours[i]));
723                 jbucs.addColour(col);
724             }
725
726             id = "ucs" + userColours.indexOf(ucs);
727             uc.setId(id);
728             uc.setUserColourScheme(jbucs);
729             jms.addUserColours(uc);
730         }
731
732         return id;
733     }
734
735    jalview.schemes.UserColourScheme GetUserColourScheme(
736         JalviewModelSequence jms, String id)
737     {
738         UserColours[] uc = jms.getUserColours();
739         UserColours colours = null;
740
741         for (int i = 0; i < uc.length; i++)
742         {
743             if (uc[i].getId().equals(id))
744             {
745                 colours = uc[i];
746
747                 break;
748             }
749         }
750
751         int csize = colours.getUserColourScheme().getColourCount();
752         java.awt.Color[] newColours = new java.awt.Color[csize];
753
754         for (int i = 0; i < csize; i++)
755         {
756             newColours[i] = new java.awt.Color(Integer.parseInt(
757                         colours.getUserColourScheme().getColour(i).getRGB(), 16));
758         }
759
760         return new jalview.schemes.UserColourScheme(newColours);
761     }
762
763     /**
764      * DOCUMENT ME!
765      *
766      * @param file DOCUMENT ME!
767      */
768     public AlignFrame LoadJalviewAlign(final String file)
769     {
770         jalview.gui.AlignFrame af = null;
771         try
772         {
773             //UNMARSHALLER SEEMS TO CLOSE JARINPUTSTREAM, MOST ANNOYING
774             URL url = null;
775
776             if (file.startsWith("http://"))
777             {
778                 url = new URL(file);
779             }
780
781             JarInputStream jin = null;
782             JarEntry jarentry = null;
783             int entryCount = 1;
784
785             do
786             {
787                 if (url != null)
788                 {
789                     jin = new JarInputStream(url.openStream());
790                 }
791                 else
792                 {
793                     jin = new JarInputStream(new FileInputStream(file));
794                 }
795
796                 for (int i = 0; i < entryCount; i++)
797                 {
798                     jarentry = jin.getNextJarEntry();
799                 }
800
801                 if (jarentry != null && jarentry.getName().endsWith(".xml"))
802                 {
803                     InputStreamReader in = new InputStreamReader(jin, "UTF-8");
804                     JalviewModel object = new JalviewModel();
805
806                     Unmarshaller unmar = new Unmarshaller(object);
807                     unmar.setValidation(false);
808                     object = (JalviewModel) unmar.unmarshal( in );
809
810                     af = LoadFromObject(object, file);
811                     entryCount++;
812                 }
813                 else if (jarentry != null)
814                 {
815                   //Some other file here.
816                   entryCount++;
817                 }
818             }
819             while (jarentry != null);
820         }
821         catch(java.net.UnknownHostException ex)
822         {
823           ex.printStackTrace();
824           System.err.println("Couldn't locate Jalview XML file : " +
825               ex + "\n");
826
827           javax.swing.SwingUtilities.invokeLater(new Runnable()
828           {
829             public void run()
830             {
831               JOptionPane.showInternalMessageDialog(Desktop.desktop,
832                   "Couldn't locate " + file,
833                   "URL not found",
834                   JOptionPane.WARNING_MESSAGE);
835             }
836           });
837         }
838         catch (Exception ex)
839         {
840
841           //Is Version 1 Jar file?
842           af =  new Jalview2XML_V1().LoadJalviewAlign(file);
843
844           if(af!=null)
845           {
846             System.out.println("Successfully loaded archive file");
847             return af;
848           }
849           ex.printStackTrace();
850             System.err.println("Exception whilst loading jalview XML file : " +
851                 ex + "\n");
852             javax.swing.SwingUtilities.invokeLater(new Runnable()
853             {
854               public void run()
855               {
856
857                 JOptionPane.showInternalMessageDialog(Desktop.desktop,
858                     "Error loading  " + file,
859                     "Error loading Jalview file",
860                     JOptionPane.WARNING_MESSAGE);
861               }});
862         }
863
864         return af;
865     }
866
867     String loadPDBFile(String file, String pdbId)
868     {
869       System.out.println("load file "+file);
870       try
871       {
872         JarInputStream jin = null;
873
874         if (file.startsWith("http://"))
875         {
876           jin = new JarInputStream(new URL(file).openStream());
877         }
878         else
879         {
880           jin = new JarInputStream(new FileInputStream(file));
881         }
882
883         JarEntry entry = null;
884         do
885         {
886           entry = jin.getNextJarEntry();
887         }
888         while (!entry.getName().equals(pdbId));
889
890         BufferedReader in = new BufferedReader(new InputStreamReader(jin));
891         File outFile = File.createTempFile("jalview_pdb", ".txt");
892         outFile.deleteOnExit();
893         PrintWriter out = new PrintWriter(new FileOutputStream(outFile));
894         String data;
895
896         while ( (data = in.readLine()) != null)
897         {
898           out.println(data);
899         }
900         out.close();
901         return outFile.getAbsolutePath();
902
903       }
904       catch (Exception ex)
905       {
906         ex.printStackTrace();
907       }
908
909       return null;
910     }
911
912
913     AlignFrame LoadFromObject(JalviewModel object, String file)
914     {
915         Vector seqids = new Vector();
916         SequenceSet vamsasSet = object.getVamsasModel().getSequenceSet(0);
917         Sequence[] vamsasSeq = vamsasSet.getSequence();
918
919         JalviewModelSequence jms = object.getJalviewModelSequence();
920
921         //////////////////////////////////
922         //LOAD SEQUENCES
923         Vector hiddenSeqs = null;
924         jalview.datamodel.Sequence[] jseqs = new jalview.datamodel.Sequence[vamsasSeq.length];
925         JSeq[] JSEQ = object.getJalviewModelSequence().getJSeq();
926         for (int i = 0; i < vamsasSeq.length; i++)
927         {
928             jseqs[i] = new jalview.datamodel.Sequence(vamsasSeq[i].getName(),
929                     vamsasSeq[i].getSequence());
930             jseqs[i].setDescription( vamsasSeq[i].getDescription() );
931
932             if(JSEQ[i].getHidden())
933             {
934               if(hiddenSeqs == null)
935                 hiddenSeqs = new Vector();
936               hiddenSeqs.addElement(jseqs[i]);
937             }
938             jseqs[i].setStart(JSEQ[i].getStart());
939             jseqs[i].setEnd(JSEQ[i].getEnd());
940             jseqs[i].setColor(new java.awt.Color(JSEQ[i].getColour()));
941             seqids.add(jseqs[i]);
942         }
943
944         ///SequenceFeatures are added to the DatasetSequence,
945         // so we must create the dataset before loading features
946         /////////////////////////////////
947         jalview.datamodel.Alignment al = new jalview.datamodel.Alignment(jseqs);
948         al.setDataset(null);
949         /////////////////////////////////
950
951
952         Hashtable pdbloaded = new Hashtable();
953         for (int i = 0; i < vamsasSeq.length; i++)
954         {
955           if (JSEQ[i].getFeaturesCount() > 0)
956           {
957             Features[] features = JSEQ[i].getFeatures();
958             for (int f = 0; f < features.length; f++)
959             {
960               jalview.datamodel.SequenceFeature sf
961                   = new jalview.datamodel.SequenceFeature(features[f].getType(),
962                   features[f].getDescription(), features[f].getStatus(),
963                   features[f].getBegin(), features[f].getEnd(),
964                   features[f].getFeatureGroup());
965
966               sf.setScore(features[f].getScore());
967               for(int od=0; od<features[f].getOtherDataCount(); od++)
968               {
969                 OtherData keyValue = features[f].getOtherData(od);
970                 if(keyValue.getKey().startsWith("LINK"))
971                   sf.addLink(keyValue.getValue());
972                 else
973                   sf.setValue(keyValue.getKey(), keyValue.getValue());
974
975               }
976
977               al.getSequenceAt(i).getDatasetSequence().addSequenceFeature(sf);
978             }
979           }
980           if (JSEQ[i].getPdbidsCount() > 0)
981           {
982             Pdbids[] ids = JSEQ[i].getPdbids();
983             for (int p = 0; p < ids.length; p++)
984             {
985               jalview.datamodel.PDBEntry entry = new jalview.datamodel.PDBEntry();
986               entry.setId(ids[p].getId());
987               entry.setType(ids[p].getType());
988               if (ids[p].getFile() != null)
989               {
990                 if (!pdbloaded.containsKey(ids[p].getFile()))
991                 {
992                   String tmppdb = loadPDBFile(file, ids[p].getId());
993                   entry.setFile(tmppdb);
994                   pdbloaded.put(ids[p].getId(), tmppdb);
995                 }
996                 else
997                   entry.setFile(pdbloaded.get(ids[p].getId()).toString());
998               }
999
1000               al.getSequenceAt(i).getDatasetSequence().addPDBId(entry);
1001             }
1002           }
1003           if(vamsasSeq[i].getDBRefCount()>0)
1004           {
1005             for(int d=0; d<vamsasSeq[i].getDBRefCount(); d++)
1006             {
1007               jalview.datamodel.DBRefEntry entry =
1008                   new jalview.datamodel.DBRefEntry(
1009                       vamsasSeq[i].getDBRef(d).getSource(),
1010                       vamsasSeq[i].getDBRef(d).getVersion(),
1011                       vamsasSeq[i].getDBRef(d).getAccessionId()
1012                       );
1013               al.getSequenceAt(i).getDatasetSequence().addDBRef(entry);
1014             }
1015
1016           }
1017         }
1018
1019
1020
1021          /////////////////////////////////
1022         //////////////////////////////////
1023         //LOAD ANNOTATIONS
1024         boolean hideQuality = true,
1025             hideConservation = true,
1026             hideConsensus = true;
1027
1028         if (vamsasSet.getAnnotation() != null)
1029         {
1030             Annotation[] an = vamsasSet.getAnnotation();
1031
1032             for (int i = 0; i < an.length; i++)
1033             {
1034                if (an[i].getLabel().equals("Quality"))
1035                 {
1036                  hideQuality = false;
1037                  continue;
1038                 }
1039                else if(an[i].getLabel().equals("Conservation"))
1040                {
1041                  hideConservation = false;
1042                  continue;
1043                }
1044                else if(an[i].getLabel().equals("Consensus"))
1045                {
1046                  hideConsensus = false;
1047                  continue;
1048                }
1049
1050                 AnnotationElement[] ae = an[i].getAnnotationElement();
1051                 jalview.datamodel.Annotation[] anot = new jalview.datamodel.Annotation[al.getWidth()];
1052
1053                 for (int aa = 0; aa < ae.length; aa++)
1054                 {
1055                     anot[ae[aa].getPosition()] = new jalview.datamodel.Annotation(ae[aa].getDisplayCharacter(),
1056                             ae[aa].getDescription(),
1057                             ae[aa].getSecondaryStructure().length()==0?' ':ae[aa].getSecondaryStructure().charAt(0),
1058                             ae[aa].getValue());
1059                     anot[ae[aa].getPosition()].colour = new java.awt.Color( ae[aa].getColour() );
1060                 }
1061
1062                 jalview.datamodel.AlignmentAnnotation jaa = null;
1063
1064                 if (an[i].getGraph())
1065                 {
1066                   jaa = new jalview.datamodel.AlignmentAnnotation(an[i].getLabel(),
1067                       an[i].getDescription(), anot, 0, 0,
1068                       an[i].getGraphType());
1069
1070                   jaa.graphGroup = an[i].getGraphGroup();
1071
1072                   if (an[i].getThresholdLine() != null)
1073                   {
1074                     jaa.setThreshold(new jalview.datamodel.GraphLine(
1075                                   an[i].getThresholdLine().getValue(),
1076                                   an[i].getThresholdLine().getLabel(),
1077                                 new java.awt.Color(an[i].getThresholdLine().getColour()))
1078                              );
1079
1080                   }
1081
1082                 }
1083                 else
1084                 {
1085                     jaa = new jalview.datamodel.AlignmentAnnotation(an[i].getLabel(),
1086                             an[i].getDescription(), anot);
1087                 }
1088
1089                 if(an[i].getSequenceRef()!=null)
1090                 {
1091                   jaa.createSequenceMapping(
1092                       al.findName(an[i].getSequenceRef()), 1
1093                       );
1094                   al.findName(an[i].getSequenceRef()).addAlignmentAnnotation(jaa);
1095                 }
1096
1097                 al.addAnnotation(jaa);
1098             }
1099         }
1100
1101
1102         //  af.changeColour() );
1103         /////////////////////////
1104         //LOAD GROUPS
1105         if (jms.getJGroupCount() > 0)
1106         {
1107             JGroup[] groups = jms.getJGroup();
1108
1109             for (int i = 0; i < groups.length; i++)
1110             {
1111                 ColourSchemeI cs = null;
1112
1113                 if (groups[i].getColour() != null)
1114                 {
1115                     if (groups[i].getColour().startsWith("ucs"))
1116                     {
1117                         cs = GetUserColourScheme(jms, groups[i].getColour());
1118                     }
1119                     else
1120                     {
1121                         cs = ColourSchemeProperty.getColour(al,
1122                                 groups[i].getColour());
1123                     }
1124
1125                     if(cs!=null)
1126                       cs.setThreshold(groups[i].getPidThreshold(), true);
1127                 }
1128
1129                 Vector seqs = new Vector();
1130                 int[] ids = groups[i].getSeq();
1131
1132                 for (int s = 0; s < ids.length; s++)
1133                 {
1134                     seqs.addElement((jalview.datamodel.SequenceI) seqids.elementAt(
1135                             ids[s]));
1136                 }
1137
1138                 jalview.datamodel.SequenceGroup sg = new jalview.datamodel.SequenceGroup(seqs,
1139                         groups[i].getName(), cs, groups[i].getDisplayBoxes(),
1140                         groups[i].getDisplayText(), groups[i].getColourText(),
1141                         groups[i].getStart(), groups[i].getEnd());
1142
1143                 sg.setOutlineColour(new java.awt.Color(
1144                         groups[i].getOutlineColour()));
1145
1146                 if (groups[i].getConsThreshold() != 0)
1147                 {
1148                     jalview.analysis.Conservation c = new jalview.analysis.Conservation("All",
1149                             ResidueProperties.propHash, 3, sg.getSequences(false), 0,
1150                             sg.getWidth() - 1);
1151                     c.calculate();
1152                     c.verdict(false, 25);
1153                     sg.cs.setConservation(c);
1154                 }
1155
1156                 al.addGroup(sg);
1157             }
1158         }
1159
1160
1161         /////////////////////////////////
1162         // LOAD VIEWPORT
1163         Viewport[] views = jms.getViewport();
1164         Viewport view = views[0]; // DEAL WITH MULTIPLE VIEWPORTS LATER
1165
1166
1167         AlignFrame af = new AlignFrame(al);
1168
1169         if(hiddenSeqs!=null)
1170         {
1171           for(int s=0; s<JSEQ.length; s++)
1172           {
1173             for(int r=0; r<JSEQ[s].getHiddenSequencesCount(); r++)
1174             {
1175               al.getSequenceAt(s).addHiddenSequence(
1176                   al.getSequenceAt( JSEQ[s].getHiddenSequences(r)  )
1177                   );
1178             }
1179           }
1180
1181           for(int s=0; s<hiddenSeqs.size(); s++)
1182           {
1183               af.viewport.hideSequence(
1184                 (jalview.datamodel.SequenceI)hiddenSeqs.elementAt(s));
1185           }
1186         }
1187
1188
1189         if(hideConsensus || hideQuality || hideConservation)
1190         {
1191           int hSize = al.getAlignmentAnnotation().length;
1192           for (int h = 0; h < hSize; h++)
1193           {
1194             if (
1195                 (hideConsensus &&
1196                  al.getAlignmentAnnotation()[h].label.equals("Consensus"))
1197                 ||
1198                 (hideQuality &&
1199                  al.getAlignmentAnnotation()[h].label.equals("Quality"))
1200                 ||
1201                 (hideConservation &&
1202                  al.getAlignmentAnnotation()[h].label.equals("Conservation")))
1203             {
1204               al.deleteAnnotation(al.getAlignmentAnnotation()[h]);
1205               hSize--;
1206               h--;
1207             }
1208           }
1209           af.alignPanel.adjustAnnotationHeight();
1210         }
1211
1212         af.setBounds(view.getXpos(), view.getYpos(), view.getWidth(),
1213             view.getHeight());
1214         af.viewport.setStartRes(view.getStartRes());
1215         af.viewport.setStartSeq(view.getStartSeq());
1216         af.viewport.setShowAnnotation(view.getShowAnnotation());
1217         af.viewport.showConservation = view.getShowConservation();
1218         af.viewport.showQuality = view.getShowQuality();
1219         af.viewport.showIdentity = view.getShowIdentity();
1220         af.viewport.setAbovePIDThreshold(view.getPidSelected());
1221         af.abovePIDThreshold.setSelected(view.getPidSelected());
1222         af.viewport.setColourText(view.getShowColourText());
1223         af.colourTextMenuItem.setSelected(view.getShowColourText());
1224         af.viewport.setConservationSelected(view.getConservationSelected());
1225         af.conservationMenuItem.setSelected(view.getConservationSelected());
1226
1227         af.viewport.setShowJVSuffix(view.getShowFullId());
1228         af.seqLimits.setSelected(view.getShowFullId());
1229
1230         af.viewport.setFont(new java.awt.Font(view.getFontName(),
1231                 view.getFontStyle(), view.getFontSize()));
1232         af.alignPanel.fontChanged();
1233
1234         af.viewport.setRenderGaps(view.getRenderGaps());
1235         af.renderGapsMenuItem.setSelected(view.getRenderGaps());
1236
1237         af.viewport.setWrapAlignment(view.getWrapAlignment());
1238         af.wrapMenuItem.setSelected(view.getWrapAlignment());
1239
1240         af.alignPanel.setWrapAlignment(view.getWrapAlignment());
1241
1242         af.annotationPanelMenuItem.setState(view.getShowAnnotation());
1243         af.viewport.setShowAnnotation(view.getShowAnnotation());
1244         af.alignPanel.setAnnotationVisible(view.getShowAnnotation());
1245
1246         af.viewport.setShowBoxes(view.getShowBoxes());
1247         af.viewBoxesMenuItem.setSelected(view.getShowBoxes());
1248         af.viewport.setShowText(view.getShowText());
1249         af.viewTextMenuItem.setSelected(view.getShowText());
1250
1251         ColourSchemeI cs = null;
1252
1253         if (view.getBgColour() != null)
1254         {
1255             if (view.getBgColour().startsWith("ucs"))
1256             {
1257                 cs = GetUserColourScheme(jms, view.getBgColour());
1258             }
1259             else if(view.getBgColour().startsWith("Annotation"))
1260             {
1261               //int find annotation
1262               for (int i = 0; i < af.viewport.alignment.getAlignmentAnnotation().length; i++)
1263               {
1264                 if (af.viewport.alignment.getAlignmentAnnotation()[i].label.
1265                     equals(view.getAnnotationColours().getAnnotation()))
1266                 {
1267                   if (af.viewport.alignment.getAlignmentAnnotation()[i].
1268                       getThreshold() == null)
1269                   {
1270                     af.viewport.alignment.getAlignmentAnnotation()[i].
1271                         setThreshold(
1272                             new jalview.datamodel.GraphLine(
1273                                 view.getAnnotationColours().getThreshold(),
1274                                 "Threshold", java.awt.Color.black)
1275
1276                         );
1277                   }
1278
1279
1280                   if (view.getAnnotationColours().getColourScheme().equals(
1281                       "None"))
1282                   {
1283                     cs = new AnnotationColourGradient(
1284                         af.viewport.alignment.getAlignmentAnnotation()[i],
1285                         new java.awt.Color(view.getAnnotationColours().
1286                                            getMinColour()),
1287                         new java.awt.Color(view.getAnnotationColours().
1288                                            getMaxColour()),
1289                         view.getAnnotationColours().getAboveThreshold());
1290                   }
1291                   else if (view.getAnnotationColours().getColourScheme().
1292                            startsWith("ucs"))
1293                   {
1294                      cs = new AnnotationColourGradient(
1295                          af.viewport.alignment.getAlignmentAnnotation()[i],
1296                          GetUserColourScheme(jms, view.getAnnotationColours().
1297                                                         getColourScheme()),
1298                          view.getAnnotationColours().getAboveThreshold()
1299                          );
1300                    }
1301                    else
1302                    {
1303                      cs = new AnnotationColourGradient(
1304                          af.viewport.alignment.getAlignmentAnnotation()[i],
1305                          ColourSchemeProperty.getColour(al,
1306                          view.getAnnotationColours().getColourScheme()),
1307                          view.getAnnotationColours().getAboveThreshold()
1308                          );
1309                    }
1310
1311                   // Also use these settings for all the groups
1312                   if (al.getGroups() != null)
1313                     for (int g = 0; g < al.getGroups().size(); g++)
1314                     {
1315                       jalview.datamodel.SequenceGroup sg
1316                           = (jalview.datamodel.SequenceGroup)al.getGroups().elementAt(g);
1317
1318                       if(sg.cs == null)
1319                         continue;
1320
1321
1322                   /*    if (view.getAnnotationColours().getColourScheme().equals("None"))
1323                       {
1324                         sg.cs = new AnnotationColourGradient(
1325                             af.viewport.alignment.getAlignmentAnnotation()[i],
1326                             new java.awt.Color(view.getAnnotationColours().
1327                                                getMinColour()),
1328                             new java.awt.Color(view.getAnnotationColours().
1329                                                getMaxColour()),
1330                             view.getAnnotationColours().getAboveThreshold());
1331                       }
1332                       else*/
1333                       {
1334                         sg.cs = new AnnotationColourGradient(
1335                             af.viewport.alignment.getAlignmentAnnotation()[i],
1336                             sg.cs,
1337                             view.getAnnotationColours().getAboveThreshold()
1338                             );
1339                       }
1340
1341                     }
1342
1343
1344                   break;
1345                 }
1346
1347               }
1348             }
1349             else
1350             {
1351                 cs = ColourSchemeProperty.getColour(al, view.getBgColour());
1352             }
1353
1354             if(cs!=null)
1355             {
1356               cs.setThreshold(view.getPidThreshold(), true);
1357               cs.setConsensus(af.viewport.vconsensus);
1358             }
1359         }
1360
1361         af.setColourSelected(view.getBgColour());
1362         af.viewport.setGlobalColourScheme(cs);
1363         af.viewport.setColourAppliesToAllGroups(false);
1364         af.changeColour(cs);
1365         if (view.getConservationSelected() && cs!=null)
1366         {
1367           cs.setConservationInc(view.getConsThreshold());
1368         }
1369
1370         af.viewport.setColourAppliesToAllGroups(true);
1371
1372         if (view.getShowSequenceFeatures())
1373         {
1374            af.viewport.showSequenceFeatures = true;
1375            af.showSeqFeatures.setSelected(true);
1376         }
1377
1378         if(jms.getFeatureSettings()!=null)
1379         {
1380           af.viewport.featuresDisplayed = new Hashtable();
1381           String [] renderOrder = new String[jms.getFeatureSettings().getSettingCount()];
1382          for(int fs=0; fs<jms.getFeatureSettings().getSettingCount(); fs++)
1383          {
1384            Setting setting = jms.getFeatureSettings().getSetting(fs);
1385
1386            af.alignPanel.seqPanel.seqCanvas.getFeatureRenderer().setColour(setting.getType(),
1387                new java.awt.Color(setting.getColour()));
1388
1389            renderOrder[fs] = setting.getType();
1390
1391            if(setting.getDisplay())
1392              af.viewport.featuresDisplayed.put(
1393                  setting.getType(), new Integer(setting.getColour()));
1394          }
1395          af.alignPanel.seqPanel.seqCanvas.getFeatureRenderer().renderOrder = renderOrder;
1396         }
1397
1398         if (view.getHiddenColumnsCount() > 0)
1399         {
1400           for (int c = 0; c < view.getHiddenColumnsCount(); c++)
1401           {
1402               af.viewport.hideColumns(
1403                 view.getHiddenColumns(c).getStart(),
1404                 view.getHiddenColumns(c).getEnd() //+1
1405                 );
1406           }
1407         }
1408
1409
1410         Desktop.addInternalFrame(af, view.getTitle(),
1411              view.getWidth(), view.getHeight());
1412
1413         //LOAD TREES
1414         ///////////////////////////////////////
1415         if (jms.getTreeCount() > 0)
1416         {
1417             try
1418             {
1419                 for (int t = 0; t < jms.getTreeCount(); t++)
1420                 {
1421
1422                     Tree tree = jms.getTree(t);
1423
1424                     TreePanel tp = af.ShowNewickTree(new jalview.io.NewickFile(
1425                                 tree.getNewick()), tree.getTitle(),
1426                                 tree.getWidth(), tree.getHeight(),
1427                                 tree.getXpos(), tree.getYpos());
1428
1429                     tp.fitToWindow.setState(tree.getFitToWindow());
1430                     tp.fitToWindow_actionPerformed(null);
1431
1432                     if(tree.getFontName()!=null)
1433                       tp.setTreeFont(new java.awt.Font(tree.getFontName(),
1434                                           tree.getFontStyle(),
1435                                           tree.getFontSize()));
1436                     else
1437                       tp.setTreeFont(new java.awt.Font(view.getFontName(),
1438                                             view.getFontStyle(),
1439                                             tree.getFontSize()));
1440
1441                     tp.showPlaceholders(tree.getMarkUnlinked());
1442                     tp.showBootstrap(tree.getShowBootstrap());
1443                     tp.showDistances(tree.getShowDistances());
1444
1445                     tp.treeCanvas.threshold = tree.getThreshold();
1446
1447                     if (tree.getCurrentTree())
1448                       af.viewport.setCurrentTree(tp.getTree());
1449                 }
1450
1451             }
1452             catch (Exception ex)
1453             {
1454                 ex.printStackTrace();
1455             }
1456
1457         }
1458
1459         return af;
1460     }
1461 }
1462