2894dec28fb99693039866feb6d8ecb8f3a0d225
[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   String loadPDBFile(String file, String pdbId)
1011   {
1012     System.out.println(file + " " + pdbId);
1013     try
1014     {
1015       JarInputStream jin = null;
1016
1017       if (file.startsWith("http://"))
1018       {
1019         jin = new JarInputStream(new URL(file).openStream());
1020       }
1021       else
1022       {
1023         jin = new JarInputStream(new FileInputStream(file));
1024       }
1025
1026       JarEntry entry = null;
1027       do
1028       {
1029         entry = jin.getNextJarEntry();
1030       }
1031       while (!entry.getName().equals(pdbId));
1032
1033       BufferedReader in = new BufferedReader(new InputStreamReader(jin));
1034       File outFile = File.createTempFile("jalview_pdb", ".txt");
1035       outFile.deleteOnExit();
1036       PrintWriter out = new PrintWriter(new FileOutputStream(outFile));
1037       String data;
1038
1039       while ( (data = in.readLine()) != null)
1040       {
1041         out.println(data);
1042       }
1043       out.close();
1044       return outFile.getAbsolutePath();
1045
1046     }
1047     catch (Exception ex)
1048     {
1049       ex.printStackTrace();
1050     }
1051
1052     return null;
1053   }
1054
1055   AlignFrame LoadFromObject(JalviewModel object,
1056                             String file,
1057                             boolean loadTrees)
1058   {
1059     SequenceSet vamsasSet = object.getVamsasModel().getSequenceSet(0);
1060     Sequence[] vamsasSeq = vamsasSet.getSequence();
1061
1062     JalviewModelSequence jms = object.getJalviewModelSequence();
1063
1064     Viewport view = jms.getViewport(0);
1065
1066     //////////////////////////////////
1067     //LOAD SEQUENCES
1068
1069     Vector hiddenSeqs = null;
1070     jalview.datamodel.Sequence jseq;
1071
1072     ArrayList tmpseqs = new ArrayList();
1073
1074     boolean multipleView = false;
1075
1076     JSeq[] JSEQ = object.getJalviewModelSequence().getJSeq();
1077     for (int i = 0; i < JSEQ.length; i++)
1078     {
1079       String seqId = JSEQ[i].getId() + "";
1080
1081       if (seqRefIds.get(seqId) != null)
1082       {
1083         tmpseqs.add( (jalview.datamodel.Sequence) seqRefIds.get(seqId));
1084         multipleView = true;
1085       }
1086       else
1087       {
1088         jseq = new jalview.datamodel.Sequence(vamsasSeq[i].getName(),
1089                                               vamsasSeq[i].getSequence());
1090         jseq.setDescription(vamsasSeq[i].getDescription());
1091         jseq.setStart(JSEQ[i].getStart());
1092         jseq.setEnd(JSEQ[i].getEnd());
1093         seqRefIds.put(vamsasSeq[i].getId(), jseq);
1094         tmpseqs.add(jseq);
1095       }
1096
1097       if (JSEQ[i].getHidden())
1098       {
1099         if (hiddenSeqs == null)
1100         {
1101           hiddenSeqs = new Vector();
1102         }
1103
1104         hiddenSeqs.addElement(
1105             (jalview.datamodel.Sequence) seqRefIds.get(seqId));
1106       }
1107
1108     }
1109
1110     ///SequenceFeatures are added to the DatasetSequence,
1111     // so we must create the dataset before loading features
1112     /////////////////////////////////
1113
1114
1115     jalview.datamodel.Sequence[] orderedSeqs = new jalview.datamodel.Sequence[
1116         tmpseqs.size()];
1117
1118     tmpseqs.toArray(orderedSeqs);
1119
1120     jalview.datamodel.Alignment al =
1121         new jalview.datamodel.Alignment(orderedSeqs);
1122
1123     al.setDataset(null);
1124     /////////////////////////////////
1125
1126
1127     Hashtable pdbloaded = new Hashtable();
1128     if (!multipleView)
1129     {
1130       for (int i = 0; i < vamsasSeq.length; i++)
1131       {
1132         if (JSEQ[i].getFeaturesCount() > 0)
1133         {
1134           Features[] features = JSEQ[i].getFeatures();
1135           for (int f = 0; f < features.length; f++)
1136           {
1137             jalview.datamodel.SequenceFeature sf
1138                 = new jalview.datamodel.SequenceFeature(features[f].getType(),
1139                 features[f].getDescription(), features[f].getStatus(),
1140                 features[f].getBegin(), features[f].getEnd(),
1141                 features[f].getFeatureGroup());
1142
1143             sf.setScore(features[f].getScore());
1144             for (int od = 0; od < features[f].getOtherDataCount(); od++)
1145             {
1146               OtherData keyValue = features[f].getOtherData(od);
1147               if (keyValue.getKey().startsWith("LINK"))
1148               {
1149                 sf.addLink(keyValue.getValue());
1150               }
1151               else
1152               {
1153                 sf.setValue(keyValue.getKey(), keyValue.getValue());
1154               }
1155
1156             }
1157
1158             al.getSequenceAt(i).getDatasetSequence().addSequenceFeature(sf);
1159           }
1160         }
1161         if (JSEQ[i].getPdbidsCount() > 0)
1162         {
1163           Pdbids[] ids = JSEQ[i].getPdbids();
1164           for (int p = 0; p < ids.length; p++)
1165           {
1166             jalview.datamodel.PDBEntry entry = new jalview.datamodel.
1167                 PDBEntry();
1168             entry.setId(ids[p].getId());
1169             entry.setType(ids[p].getType());
1170             if (ids[p].getFile() != null)
1171             {
1172               if (!pdbloaded.containsKey(ids[p].getFile()))
1173               {
1174                 String tmppdb = loadPDBFile(file, ids[p].getId());
1175                 entry.setFile(tmppdb);
1176                 pdbloaded.put(ids[p].getId(), tmppdb);
1177               }
1178               else
1179               {
1180                 entry.setFile(pdbloaded.get(ids[p].getId()).toString());
1181               }
1182             }
1183
1184             al.getSequenceAt(i).getDatasetSequence().addPDBId(entry);
1185           }
1186         }
1187         if (vamsasSeq[i].getDBRefCount() > 0)
1188         {
1189           for (int d = 0; d < vamsasSeq[i].getDBRefCount(); d++)
1190           {
1191             jalview.datamodel.DBRefEntry entry =
1192                 new jalview.datamodel.DBRefEntry(
1193                     vamsasSeq[i].getDBRef(d).getSource(),
1194                     vamsasSeq[i].getDBRef(d).getVersion(),
1195                     vamsasSeq[i].getDBRef(d).getAccessionId()
1196                 );
1197             al.getSequenceAt(i).getDatasetSequence().addDBRef(entry);
1198           }
1199
1200         }
1201       }
1202     }
1203
1204     /////////////////////////////////
1205     //////////////////////////////////
1206     //LOAD ANNOTATIONS
1207     boolean hideQuality = true,
1208         hideConservation = true,
1209         hideConsensus = true;
1210
1211     if (vamsasSet.getAnnotationCount() > 0)
1212     {
1213       Annotation[] an = vamsasSet.getAnnotation();
1214
1215       for (int i = 0; i < an.length; i++)
1216       {
1217         if (an[i].getLabel().equals("Quality"))
1218         {
1219           hideQuality = false;
1220           continue;
1221         }
1222         else if (an[i].getLabel().equals("Conservation"))
1223         {
1224           hideConservation = false;
1225           continue;
1226         }
1227         else if (an[i].getLabel().equals("Consensus"))
1228         {
1229           hideConsensus = false;
1230           continue;
1231         }
1232
1233         if (an[i].getId() != null
1234             && annotationIds.containsKey(an[i].getId()))
1235         {
1236           al.addAnnotation(
1237               (jalview.datamodel.AlignmentAnnotation) annotationIds.get(an[i].
1238               getId())
1239               );
1240
1241           continue;
1242         }
1243
1244         AnnotationElement[] ae = an[i].getAnnotationElement();
1245         jalview.datamodel.Annotation[] anot = new jalview.datamodel.Annotation[
1246             al.getWidth()];
1247
1248         for (int aa = 0; aa < ae.length && aa < anot.length; aa++)
1249         {
1250           anot[ae[aa].getPosition()] = new jalview.datamodel.Annotation(ae[aa].
1251               getDisplayCharacter(),
1252               ae[aa].getDescription(),
1253               ae[aa].getSecondaryStructure().length() == 0 ? ' ' :
1254               ae[aa].getSecondaryStructure().charAt(0),
1255                    ae[aa].getValue());
1256           anot[ae[aa].getPosition()].colour = new java.awt.Color(ae[aa].
1257               getColour());
1258         }
1259
1260         jalview.datamodel.AlignmentAnnotation jaa = null;
1261
1262         if (an[i].getGraph())
1263         {
1264           jaa = new jalview.datamodel.AlignmentAnnotation(an[i].getLabel(),
1265               an[i].getDescription(), anot, 0, 0,
1266               an[i].getGraphType());
1267
1268           jaa.graphGroup = an[i].getGraphGroup();
1269
1270           if (an[i].getThresholdLine() != null)
1271           {
1272             jaa.setThreshold(new jalview.datamodel.GraphLine(
1273                 an[i].getThresholdLine().getValue(),
1274                 an[i].getThresholdLine().getLabel(),
1275                 new java.awt.Color(an[i].getThresholdLine().getColour()))
1276                 );
1277
1278           }
1279
1280         }
1281         else
1282         {
1283           jaa = new jalview.datamodel.AlignmentAnnotation(an[i].getLabel(),
1284               an[i].getDescription(), anot);
1285         }
1286
1287         if (an[i].getId() != null)
1288         {
1289           annotationIds.put(an[i].getId(), jaa);
1290           jaa.annotationId = an[i].getId();
1291         }
1292
1293         if (an[i].getSequenceRef() != null)
1294         {
1295           jaa.createSequenceMapping(
1296               al.findName(an[i].getSequenceRef()), 1, true
1297               );
1298           al.findName(an[i].getSequenceRef()).addAlignmentAnnotation(jaa);
1299         }
1300
1301         al.addAnnotation(jaa);
1302       }
1303     }
1304
1305     /////////////////////////
1306     //LOAD GROUPS
1307     if (jms.getJGroupCount() > 0)
1308     {
1309       JGroup[] groups = jms.getJGroup();
1310
1311       for (int i = 0; i < groups.length; i++)
1312       {
1313         ColourSchemeI cs = null;
1314
1315         if (groups[i].getColour() != null)
1316         {
1317           if (groups[i].getColour().startsWith("ucs"))
1318           {
1319             cs = GetUserColourScheme(jms, groups[i].getColour());
1320           }
1321           else
1322           {
1323             cs = ColourSchemeProperty.getColour(al,
1324                                                 groups[i].getColour());
1325           }
1326
1327           if (cs != null)
1328           {
1329             cs.setThreshold(groups[i].getPidThreshold(), true);
1330           }
1331         }
1332
1333         Vector seqs = new Vector();
1334
1335         for (int s = 0; s < groups[i].getSeqCount(); s++)
1336         {
1337           String seqId = groups[i].getSeq(s) + "";
1338           jalview.datamodel.SequenceI ts = (jalview.datamodel.SequenceI)
1339               seqRefIds.get(seqId);
1340
1341           if (ts != null)
1342           {
1343             seqs.addElement(ts);
1344           }
1345         }
1346
1347         if (seqs.size() < 1)
1348         {
1349           continue;
1350         }
1351
1352         jalview.datamodel.SequenceGroup sg = new jalview.datamodel.
1353             SequenceGroup(seqs,
1354                           groups[i].getName(), cs, groups[i].getDisplayBoxes(),
1355                           groups[i].getDisplayText(), groups[i].getColourText(),
1356                           groups[i].getStart(), groups[i].getEnd());
1357
1358         sg.setOutlineColour(new java.awt.Color(
1359             groups[i].getOutlineColour()));
1360
1361         sg.textColour = new java.awt.Color(groups[i].getTextCol1());
1362         sg.textColour2 = new java.awt.Color(groups[i].getTextCol2());
1363         sg.thresholdTextColour = groups[i].getTextColThreshold();
1364
1365         if (groups[i].getConsThreshold() != 0)
1366         {
1367           jalview.analysis.Conservation c = new jalview.analysis.Conservation(
1368               "All",
1369               ResidueProperties.propHash, 3, sg.getSequences(null), 0,
1370               sg.getWidth() - 1);
1371           c.calculate();
1372           c.verdict(false, 25);
1373           sg.cs.setConservation(c);
1374         }
1375
1376         al.addGroup(sg);
1377       }
1378     }
1379
1380     /////////////////////////////////
1381     // LOAD VIEWPORT
1382
1383     AlignFrame af = new AlignFrame(al,
1384                                    view.getWidth(),
1385                                    view.getHeight());
1386
1387     af.setFileName(file, "Jalview");
1388
1389     for (int i = 0; i < JSEQ.length; i++)
1390     {
1391       af.viewport.setSequenceColour(
1392           af.viewport.alignment.getSequenceAt(i),
1393           new java.awt.Color(
1394               JSEQ[i].getColour()));
1395     }
1396
1397     //If we just load in the same jar file again, the sequenceSetId
1398     //will be the same, and we end up with multiple references
1399     //to the same sequenceSet. We must modify this id on load
1400     //so that each load of the file gives a unique id
1401     String uniqueSeqSetId = view.getSequenceSetId() + uniqueSetSuffix;
1402
1403     af.viewport.gatherViewsHere = view.getGatheredViews();
1404
1405     if (view.getSequenceSetId() != null)
1406     {
1407       jalview.gui.AlignViewport av =
1408           (jalview.gui.AlignViewport)
1409           viewportsAdded.get(uniqueSeqSetId);
1410
1411       af.viewport.sequenceSetID = uniqueSeqSetId;
1412       if (av != null)
1413       {
1414
1415         af.viewport.historyList = av.historyList;
1416         af.viewport.redoList = av.redoList;
1417       }
1418       else
1419       {
1420         viewportsAdded.put(uniqueSeqSetId, af.viewport);
1421       }
1422
1423       PaintRefresher.Register(af.alignPanel, uniqueSeqSetId);
1424     }
1425     if (hiddenSeqs != null)
1426     {
1427       for (int s = 0; s < JSEQ.length; s++)
1428       {
1429         jalview.datamodel.SequenceGroup hidden =
1430             new jalview.datamodel.SequenceGroup();
1431
1432         for (int r = 0; r < JSEQ[s].getHiddenSequencesCount(); r++)
1433         {
1434           hidden.addSequence(
1435               al.getSequenceAt(JSEQ[s].getHiddenSequences(r))
1436               , false
1437               );
1438         }
1439         af.viewport.hideRepSequences(al.getSequenceAt(s), hidden);
1440       }
1441
1442       jalview.datamodel.SequenceI[] hseqs = new
1443           jalview.datamodel.SequenceI[hiddenSeqs.size()];
1444
1445       for (int s = 0; s < hiddenSeqs.size(); s++)
1446       {
1447         hseqs[s] = (jalview.datamodel.SequenceI) hiddenSeqs.elementAt(s);
1448       }
1449
1450       af.viewport.hideSequence(hseqs);
1451
1452     }
1453
1454     if ( (hideConsensus || hideQuality || hideConservation)
1455         && al.getAlignmentAnnotation() != null)
1456     {
1457       int hSize = al.getAlignmentAnnotation().length;
1458       for (int h = 0; h < hSize; h++)
1459       {
1460         if (
1461             (hideConsensus &&
1462              al.getAlignmentAnnotation()[h].label.equals("Consensus"))
1463             ||
1464             (hideQuality &&
1465              al.getAlignmentAnnotation()[h].label.equals("Quality"))
1466             ||
1467             (hideConservation &&
1468              al.getAlignmentAnnotation()[h].label.equals("Conservation")))
1469         {
1470           al.deleteAnnotation(al.getAlignmentAnnotation()[h]);
1471           hSize--;
1472           h--;
1473         }
1474       }
1475       af.alignPanel.adjustAnnotationHeight();
1476     }
1477
1478     if (view.getViewName() != null)
1479     {
1480       af.viewport.viewName = view.getViewName();
1481       af.setInitialTabVisible();
1482     }
1483     af.setBounds(view.getXpos(), view.getYpos(), view.getWidth(),
1484                  view.getHeight());
1485
1486     af.viewport.setShowAnnotation(view.getShowAnnotation());
1487     af.viewport.setAbovePIDThreshold(view.getPidSelected());
1488
1489     af.viewport.setColourText(view.getShowColourText());
1490
1491     af.viewport.setConservationSelected(view.getConservationSelected());
1492     af.viewport.setShowJVSuffix(view.getShowFullId());
1493     af.viewport.rightAlignIds = view.getRightAlignIds();
1494     af.viewport.setFont(new java.awt.Font(view.getFontName(),
1495                                           view.getFontStyle(), view.getFontSize()));
1496     af.alignPanel.fontChanged();
1497     af.viewport.setRenderGaps(view.getRenderGaps());
1498     af.viewport.setWrapAlignment(view.getWrapAlignment());
1499     af.alignPanel.setWrapAlignment(view.getWrapAlignment());
1500     af.viewport.setShowAnnotation(view.getShowAnnotation());
1501     af.alignPanel.setAnnotationVisible(view.getShowAnnotation());
1502
1503     af.viewport.setShowBoxes(view.getShowBoxes());
1504
1505     af.viewport.setShowText(view.getShowText());
1506
1507     af.viewport.textColour = new java.awt.Color(view.getTextCol1());
1508     af.viewport.textColour2 = new java.awt.Color(view.getTextCol2());
1509     af.viewport.thresholdTextColour = view.getTextColThreshold();
1510
1511     af.viewport.setStartRes(view.getStartRes());
1512     af.viewport.setStartSeq(view.getStartSeq());
1513
1514     ColourSchemeI cs = null;
1515
1516     if (view.getBgColour() != null)
1517     {
1518       if (view.getBgColour().startsWith("ucs"))
1519       {
1520         cs = GetUserColourScheme(jms, view.getBgColour());
1521       }
1522       else if (view.getBgColour().startsWith("Annotation"))
1523       {
1524         //int find annotation
1525         for (int i = 0;
1526              i < af.viewport.alignment.getAlignmentAnnotation().length; i++)
1527         {
1528           if (af.viewport.alignment.getAlignmentAnnotation()[i].label.
1529               equals(view.getAnnotationColours().getAnnotation()))
1530           {
1531             if (af.viewport.alignment.getAlignmentAnnotation()[i].
1532                 getThreshold() == null)
1533             {
1534               af.viewport.alignment.getAlignmentAnnotation()[i].
1535                   setThreshold(
1536                       new jalview.datamodel.GraphLine(
1537                           view.getAnnotationColours().getThreshold(),
1538                           "Threshold", java.awt.Color.black)
1539
1540                   );
1541             }
1542
1543             if (view.getAnnotationColours().getColourScheme().equals(
1544                 "None"))
1545             {
1546               cs = new AnnotationColourGradient(
1547                   af.viewport.alignment.getAlignmentAnnotation()[i],
1548                   new java.awt.Color(view.getAnnotationColours().
1549                                      getMinColour()),
1550                   new java.awt.Color(view.getAnnotationColours().
1551                                      getMaxColour()),
1552                   view.getAnnotationColours().getAboveThreshold());
1553             }
1554             else if (view.getAnnotationColours().getColourScheme().
1555                      startsWith("ucs"))
1556             {
1557               cs = new AnnotationColourGradient(
1558                   af.viewport.alignment.getAlignmentAnnotation()[i],
1559                   GetUserColourScheme(jms, view.getAnnotationColours().
1560                                       getColourScheme()),
1561                   view.getAnnotationColours().getAboveThreshold()
1562                   );
1563             }
1564             else
1565             {
1566               cs = new AnnotationColourGradient(
1567                   af.viewport.alignment.getAlignmentAnnotation()[i],
1568                   ColourSchemeProperty.getColour(al,
1569                                                  view.getAnnotationColours().
1570                                                  getColourScheme()),
1571                   view.getAnnotationColours().getAboveThreshold()
1572                   );
1573             }
1574
1575             // Also use these settings for all the groups
1576             if (al.getGroups() != null)
1577             {
1578               for (int g = 0; g < al.getGroups().size(); g++)
1579               {
1580                 jalview.datamodel.SequenceGroup sg
1581                     = (jalview.datamodel.SequenceGroup) al.getGroups().
1582                     elementAt(g);
1583
1584                 if (sg.cs == null)
1585                 {
1586                   continue;
1587                 }
1588
1589                 /*    if (view.getAnnotationColours().getColourScheme().equals("None"))
1590                     {
1591                       sg.cs = new AnnotationColourGradient(
1592                           af.viewport.alignment.getAlignmentAnnotation()[i],
1593                           new java.awt.Color(view.getAnnotationColours().
1594                                              getMinColour()),
1595                           new java.awt.Color(view.getAnnotationColours().
1596                                              getMaxColour()),
1597                           view.getAnnotationColours().getAboveThreshold());
1598                     }
1599                     else*/
1600                 {
1601                   sg.cs = new AnnotationColourGradient(
1602                       af.viewport.alignment.getAlignmentAnnotation()[i],
1603                       sg.cs,
1604                       view.getAnnotationColours().getAboveThreshold()
1605                       );
1606                 }
1607
1608               }
1609             }
1610
1611             break;
1612           }
1613
1614         }
1615       }
1616       else
1617       {
1618         cs = ColourSchemeProperty.getColour(al, view.getBgColour());
1619       }
1620
1621       if (cs != null)
1622       {
1623         cs.setThreshold(view.getPidThreshold(), true);
1624         cs.setConsensus(af.viewport.hconsensus);
1625       }
1626     }
1627
1628     af.viewport.setGlobalColourScheme(cs);
1629     af.viewport.setColourAppliesToAllGroups(false);
1630
1631     if (view.getConservationSelected() && cs != null)
1632     {
1633       cs.setConservationInc(view.getConsThreshold());
1634     }
1635
1636     af.changeColour(cs);
1637
1638     af.viewport.setColourAppliesToAllGroups(true);
1639
1640     if (view.getShowSequenceFeatures())
1641     {
1642       af.viewport.showSequenceFeatures = true;
1643     }
1644
1645     if (jms.getFeatureSettings() != null)
1646     {
1647       af.viewport.featuresDisplayed = new Hashtable();
1648       String[] renderOrder = new String[jms.getFeatureSettings().
1649           getSettingCount()];
1650       for (int fs = 0; fs < jms.getFeatureSettings().getSettingCount(); fs++)
1651       {
1652         Setting setting = jms.getFeatureSettings().getSetting(fs);
1653
1654         af.alignPanel.seqPanel.seqCanvas.getFeatureRenderer().setColour(setting.
1655             getType(),
1656             new java.awt.Color(setting.getColour()));
1657
1658         renderOrder[fs] = setting.getType();
1659
1660         if (setting.getDisplay())
1661         {
1662           af.viewport.featuresDisplayed.put(
1663               setting.getType(), new Integer(setting.getColour()));
1664         }
1665       }
1666       af.alignPanel.seqPanel.seqCanvas.getFeatureRenderer().renderOrder =
1667           renderOrder;
1668     }
1669
1670     if (view.getHiddenColumnsCount() > 0)
1671     {
1672       for (int c = 0; c < view.getHiddenColumnsCount(); c++)
1673       {
1674         af.viewport.hideColumns(
1675             view.getHiddenColumns(c).getStart(),
1676             view.getHiddenColumns(c).getEnd() //+1
1677             );
1678       }
1679     }
1680
1681     af.setMenusFromViewport(af.viewport);
1682
1683     Desktop.addInternalFrame(af, view.getTitle(),
1684                              view.getWidth(), view.getHeight());
1685
1686     //LOAD TREES
1687     ///////////////////////////////////////
1688     if (loadTrees && jms.getTreeCount() > 0)
1689     {
1690       try
1691       {
1692         for (int t = 0; t < jms.getTreeCount(); t++)
1693         {
1694
1695           Tree tree = jms.getTree(t);
1696
1697           TreePanel tp = af.ShowNewickTree(new jalview.io.NewickFile(
1698               tree.getNewick()), tree.getTitle(),
1699                                            tree.getWidth(), tree.getHeight(),
1700                                            tree.getXpos(), tree.getYpos());
1701
1702           tp.fitToWindow.setState(tree.getFitToWindow());
1703           tp.fitToWindow_actionPerformed(null);
1704
1705           if (tree.getFontName() != null)
1706           {
1707             tp.setTreeFont(new java.awt.Font(tree.getFontName(),
1708                                              tree.getFontStyle(),
1709                                              tree.getFontSize()));
1710           }
1711           else
1712           {
1713             tp.setTreeFont(new java.awt.Font(view.getFontName(),
1714                                              view.getFontStyle(),
1715                                              tree.getFontSize()));
1716           }
1717
1718           tp.showPlaceholders(tree.getMarkUnlinked());
1719           tp.showBootstrap(tree.getShowBootstrap());
1720           tp.showDistances(tree.getShowDistances());
1721
1722           tp.treeCanvas.threshold = tree.getThreshold();
1723
1724           if (tree.getCurrentTree())
1725           {
1726             af.viewport.setCurrentTree(tp.getTree());
1727           }
1728         }
1729
1730       }
1731       catch (Exception ex)
1732       {
1733         ex.printStackTrace();
1734       }
1735
1736     }
1737
1738     return af;
1739   }
1740
1741   public jalview.gui.AlignmentPanel copyAlignPanel(AlignmentPanel ap,
1742       boolean keepSeqRefs)
1743   {
1744     jalview.schemabinding.version2.JalviewModel jm
1745         = SaveState(ap, null, null, null);
1746
1747     if (!keepSeqRefs)
1748     {
1749       seqRefIds.clear();
1750       jm.getJalviewModelSequence().getViewport(0).setSequenceSetId(null);
1751     }
1752     else
1753     {
1754       uniqueSetSuffix = "";
1755     }
1756
1757     viewportsAdded = new Hashtable();
1758
1759     AlignFrame af = LoadFromObject(jm, null, false);
1760     af.alignPanels.clear();
1761     af.closeMenuItem_actionPerformed(true);
1762
1763     /*  if(ap.av.alignment.getAlignmentAnnotation()!=null)
1764       {
1765         for(int i=0; i<ap.av.alignment.getAlignmentAnnotation().length; i++)
1766         {
1767           if(!ap.av.alignment.getAlignmentAnnotation()[i].autoCalculated)
1768           {
1769             af.alignPanel.av.alignment.getAlignmentAnnotation()[i] =
1770                 ap.av.alignment.getAlignmentAnnotation()[i];
1771           }
1772         }
1773       }   */
1774
1775     return af.alignPanel;
1776   }
1777 }