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