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