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