use hasScore method to test presence of score in annotation.
[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 (aa[i].hasScore())
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             anot[ae[aa].getPosition()] = new jalview.datamodel.Annotation(
1342
1343                     ae[aa].getDisplayCharacter(),
1344                     ae[aa].getDescription(),
1345                     (ae[aa].getSecondaryStructure()==null || ae[aa].getSecondaryStructure().length() == 0) ? ' ' :
1346                       ae[aa].getSecondaryStructure().charAt(0),
1347                       ae[aa].getValue()
1348
1349                             );
1350
1351
1352               anot[ae[aa].getPosition()].colour = new java.awt.Color(ae[aa].
1353                   getColour());
1354           }
1355         }
1356         jalview.datamodel.AlignmentAnnotation jaa = null;
1357
1358         if (an[i].getGraph())
1359         {
1360           jaa = new jalview.datamodel.AlignmentAnnotation(an[i].getLabel(),
1361               an[i].getDescription(), anot, 0, 0,
1362               an[i].getGraphType());
1363
1364           jaa.graphGroup = an[i].getGraphGroup();
1365
1366           if (an[i].getThresholdLine() != null)
1367           {
1368             jaa.setThreshold(new jalview.datamodel.GraphLine(
1369                 an[i].getThresholdLine().getValue(),
1370                 an[i].getThresholdLine().getLabel(),
1371                 new java.awt.Color(an[i].getThresholdLine().getColour()))
1372                 );
1373
1374           }
1375
1376         }
1377         else
1378         {
1379           jaa = new jalview.datamodel.AlignmentAnnotation(an[i].getLabel(),
1380               an[i].getDescription(), anot);
1381         }
1382
1383         if (an[i].getId() != null)
1384         {
1385           annotationIds.put(an[i].getId(), jaa);
1386           jaa.annotationId = an[i].getId();
1387         }
1388
1389         if (an[i].getSequenceRef() != null)
1390         {
1391           jaa.createSequenceMapping(
1392               al.findName(an[i].getSequenceRef()), 1, true
1393               );
1394           al.findName(an[i].getSequenceRef()).addAlignmentAnnotation(jaa);
1395         }
1396         if (an[i].hasScore())
1397         {
1398           jaa.setScore(an[i].getScore());
1399         }
1400         al.addAnnotation(jaa);
1401       }
1402     }
1403
1404     /////////////////////////
1405     //LOAD GROUPS
1406     if (jms.getJGroupCount() > 0)
1407     {
1408       JGroup[] groups = jms.getJGroup();
1409
1410       for (int i = 0; i < groups.length; i++)
1411       {
1412         ColourSchemeI cs = null;
1413
1414         if (groups[i].getColour() != null)
1415         {
1416           if (groups[i].getColour().startsWith("ucs"))
1417           {
1418             cs = GetUserColourScheme(jms, groups[i].getColour());
1419           }
1420           else
1421           {
1422             cs = ColourSchemeProperty.getColour(al,
1423                                                 groups[i].getColour());
1424           }
1425
1426           if (cs != null)
1427           {
1428             cs.setThreshold(groups[i].getPidThreshold(), true);
1429           }
1430         }
1431
1432         Vector seqs = new Vector();
1433
1434         for (int s = 0; s < groups[i].getSeqCount(); s++)
1435         {
1436           String seqId = groups[i].getSeq(s) + "";
1437           jalview.datamodel.SequenceI ts = (jalview.datamodel.SequenceI)
1438               seqRefIds.get(seqId);
1439
1440           if (ts != null)
1441           {
1442             seqs.addElement(ts);
1443           }
1444         }
1445
1446         if (seqs.size() < 1)
1447         {
1448           continue;
1449         }
1450
1451         jalview.datamodel.SequenceGroup sg = new jalview.datamodel.
1452             SequenceGroup(seqs,
1453                           groups[i].getName(), cs, groups[i].getDisplayBoxes(),
1454                           groups[i].getDisplayText(), groups[i].getColourText(),
1455                           groups[i].getStart(), groups[i].getEnd());
1456
1457         sg.setOutlineColour(new java.awt.Color(
1458             groups[i].getOutlineColour()));
1459
1460         sg.textColour = new java.awt.Color(groups[i].getTextCol1());
1461         sg.textColour2 = new java.awt.Color(groups[i].getTextCol2());
1462         sg.thresholdTextColour = groups[i].getTextColThreshold();
1463
1464         if (groups[i].getConsThreshold() != 0)
1465         {
1466           jalview.analysis.Conservation c = new jalview.analysis.Conservation(
1467               "All",
1468               ResidueProperties.propHash, 3, sg.getSequences(null), 0,
1469               sg.getWidth() - 1);
1470           c.calculate();
1471           c.verdict(false, 25);
1472           sg.cs.setConservation(c);
1473         }
1474
1475         al.addGroup(sg);
1476       }
1477     }
1478
1479     /////////////////////////////////
1480     // LOAD VIEWPORT
1481
1482     AlignFrame af = new AlignFrame(al,
1483                                    view.getWidth(),
1484                                    view.getHeight());
1485
1486     af.setFileName(file, "Jalview");
1487
1488     for (int i = 0; i < JSEQ.length; i++)
1489     {
1490       af.viewport.setSequenceColour(
1491           af.viewport.alignment.getSequenceAt(i),
1492           new java.awt.Color(
1493               JSEQ[i].getColour()));
1494     }
1495
1496     //If we just load in the same jar file again, the sequenceSetId
1497     //will be the same, and we end up with multiple references
1498     //to the same sequenceSet. We must modify this id on load
1499     //so that each load of the file gives a unique id
1500     String uniqueSeqSetId = view.getSequenceSetId() + uniqueSetSuffix;
1501
1502     af.viewport.gatherViewsHere = view.getGatheredViews();
1503
1504     if (view.getSequenceSetId() != null)
1505     {
1506       jalview.gui.AlignViewport av =
1507           (jalview.gui.AlignViewport)
1508           viewportsAdded.get(uniqueSeqSetId);
1509
1510       af.viewport.sequenceSetID = uniqueSeqSetId;
1511       if (av != null)
1512       {
1513
1514         af.viewport.historyList = av.historyList;
1515         af.viewport.redoList = av.redoList;
1516       }
1517       else
1518       {
1519         viewportsAdded.put(uniqueSeqSetId, af.viewport);
1520       }
1521
1522       PaintRefresher.Register(af.alignPanel, uniqueSeqSetId);
1523     }
1524     if (hiddenSeqs != null)
1525     {
1526       for (int s = 0; s < JSEQ.length; s++)
1527       {
1528         jalview.datamodel.SequenceGroup hidden =
1529             new jalview.datamodel.SequenceGroup();
1530
1531         for (int r = 0; r < JSEQ[s].getHiddenSequencesCount(); r++)
1532         {
1533           hidden.addSequence(
1534               al.getSequenceAt(JSEQ[s].getHiddenSequences(r))
1535               , false
1536               );
1537         }
1538         af.viewport.hideRepSequences(al.getSequenceAt(s), hidden);
1539       }
1540
1541       jalview.datamodel.SequenceI[] hseqs = new
1542           jalview.datamodel.SequenceI[hiddenSeqs.size()];
1543
1544       for (int s = 0; s < hiddenSeqs.size(); s++)
1545       {
1546         hseqs[s] = (jalview.datamodel.SequenceI) hiddenSeqs.elementAt(s);
1547       }
1548
1549       af.viewport.hideSequence(hseqs);
1550
1551     }
1552
1553     if ( (hideConsensus || hideQuality || hideConservation)
1554         && al.getAlignmentAnnotation() != null)
1555     {
1556       int hSize = al.getAlignmentAnnotation().length;
1557       for (int h = 0; h < hSize; h++)
1558       {
1559         if (
1560             (hideConsensus &&
1561              al.getAlignmentAnnotation()[h].label.equals("Consensus"))
1562             ||
1563             (hideQuality &&
1564              al.getAlignmentAnnotation()[h].label.equals("Quality"))
1565             ||
1566             (hideConservation &&
1567              al.getAlignmentAnnotation()[h].label.equals("Conservation")))
1568         {
1569           al.deleteAnnotation(al.getAlignmentAnnotation()[h]);
1570           hSize--;
1571           h--;
1572         }
1573       }
1574       af.alignPanel.adjustAnnotationHeight();
1575     }
1576
1577     if (view.getViewName() != null)
1578     {
1579       af.viewport.viewName = view.getViewName();
1580       af.setInitialTabVisible();
1581     }
1582     af.setBounds(view.getXpos(), view.getYpos(), view.getWidth(),
1583                  view.getHeight());
1584
1585     af.viewport.setShowAnnotation(view.getShowAnnotation());
1586     af.viewport.setAbovePIDThreshold(view.getPidSelected());
1587
1588     af.viewport.setColourText(view.getShowColourText());
1589
1590     af.viewport.setConservationSelected(view.getConservationSelected());
1591     af.viewport.setShowJVSuffix(view.getShowFullId());
1592     af.viewport.rightAlignIds = view.getRightAlignIds();
1593     af.viewport.setFont(new java.awt.Font(view.getFontName(),
1594                                           view.getFontStyle(), view.getFontSize()));
1595     af.alignPanel.fontChanged();
1596     af.viewport.setRenderGaps(view.getRenderGaps());
1597     af.viewport.setWrapAlignment(view.getWrapAlignment());
1598     af.alignPanel.setWrapAlignment(view.getWrapAlignment());
1599     af.viewport.setShowAnnotation(view.getShowAnnotation());
1600     af.alignPanel.setAnnotationVisible(view.getShowAnnotation());
1601
1602     af.viewport.setShowBoxes(view.getShowBoxes());
1603
1604     af.viewport.setShowText(view.getShowText());
1605
1606     af.viewport.textColour = new java.awt.Color(view.getTextCol1());
1607     af.viewport.textColour2 = new java.awt.Color(view.getTextCol2());
1608     af.viewport.thresholdTextColour = view.getTextColThreshold();
1609
1610     af.viewport.setStartRes(view.getStartRes());
1611     af.viewport.setStartSeq(view.getStartSeq());
1612
1613     ColourSchemeI cs = null;
1614
1615     if (view.getBgColour() != null)
1616     {
1617       if (view.getBgColour().startsWith("ucs"))
1618       {
1619         cs = GetUserColourScheme(jms, view.getBgColour());
1620       }
1621       else if (view.getBgColour().startsWith("Annotation"))
1622       {
1623         //int find annotation
1624         for (int i = 0;
1625              i < af.viewport.alignment.getAlignmentAnnotation().length; i++)
1626         {
1627           if (af.viewport.alignment.getAlignmentAnnotation()[i].label.
1628               equals(view.getAnnotationColours().getAnnotation()))
1629           {
1630             if (af.viewport.alignment.getAlignmentAnnotation()[i].
1631                 getThreshold() == null)
1632             {
1633               af.viewport.alignment.getAlignmentAnnotation()[i].
1634                   setThreshold(
1635                       new jalview.datamodel.GraphLine(
1636                           view.getAnnotationColours().getThreshold(),
1637                           "Threshold", java.awt.Color.black)
1638
1639                   );
1640             }
1641
1642             if (view.getAnnotationColours().getColourScheme().equals(
1643                 "None"))
1644             {
1645               cs = new AnnotationColourGradient(
1646                   af.viewport.alignment.getAlignmentAnnotation()[i],
1647                   new java.awt.Color(view.getAnnotationColours().
1648                                      getMinColour()),
1649                   new java.awt.Color(view.getAnnotationColours().
1650                                      getMaxColour()),
1651                   view.getAnnotationColours().getAboveThreshold());
1652             }
1653             else if (view.getAnnotationColours().getColourScheme().
1654                      startsWith("ucs"))
1655             {
1656               cs = new AnnotationColourGradient(
1657                   af.viewport.alignment.getAlignmentAnnotation()[i],
1658                   GetUserColourScheme(jms, view.getAnnotationColours().
1659                                       getColourScheme()),
1660                   view.getAnnotationColours().getAboveThreshold()
1661                   );
1662             }
1663             else
1664             {
1665               cs = new AnnotationColourGradient(
1666                   af.viewport.alignment.getAlignmentAnnotation()[i],
1667                   ColourSchemeProperty.getColour(al,
1668                                                  view.getAnnotationColours().
1669                                                  getColourScheme()),
1670                   view.getAnnotationColours().getAboveThreshold()
1671                   );
1672             }
1673
1674             // Also use these settings for all the groups
1675             if (al.getGroups() != null)
1676             {
1677               for (int g = 0; g < al.getGroups().size(); g++)
1678               {
1679                 jalview.datamodel.SequenceGroup sg
1680                     = (jalview.datamodel.SequenceGroup) al.getGroups().
1681                     elementAt(g);
1682
1683                 if (sg.cs == null)
1684                 {
1685                   continue;
1686                 }
1687
1688                 /*    if (view.getAnnotationColours().getColourScheme().equals("None"))
1689                     {
1690                       sg.cs = new AnnotationColourGradient(
1691                           af.viewport.alignment.getAlignmentAnnotation()[i],
1692                           new java.awt.Color(view.getAnnotationColours().
1693                                              getMinColour()),
1694                           new java.awt.Color(view.getAnnotationColours().
1695                                              getMaxColour()),
1696                           view.getAnnotationColours().getAboveThreshold());
1697                     }
1698                     else*/
1699                 {
1700                   sg.cs = new AnnotationColourGradient(
1701                       af.viewport.alignment.getAlignmentAnnotation()[i],
1702                       sg.cs,
1703                       view.getAnnotationColours().getAboveThreshold()
1704                       );
1705                 }
1706
1707               }
1708             }
1709
1710             break;
1711           }
1712
1713         }
1714       }
1715       else
1716       {
1717         cs = ColourSchemeProperty.getColour(al, view.getBgColour());
1718       }
1719
1720       if (cs != null)
1721       {
1722         cs.setThreshold(view.getPidThreshold(), true);
1723         cs.setConsensus(af.viewport.hconsensus);
1724       }
1725     }
1726
1727     af.viewport.setGlobalColourScheme(cs);
1728     af.viewport.setColourAppliesToAllGroups(false);
1729
1730     if (view.getConservationSelected() && cs != null)
1731     {
1732       cs.setConservationInc(view.getConsThreshold());
1733     }
1734
1735     af.changeColour(cs);
1736
1737     af.viewport.setColourAppliesToAllGroups(true);
1738
1739     if (view.getShowSequenceFeatures())
1740     {
1741       af.viewport.showSequenceFeatures = true;
1742     }
1743
1744     if (jms.getFeatureSettings() != null)
1745     {
1746       af.viewport.featuresDisplayed = new Hashtable();
1747       String[] renderOrder = new String[jms.getFeatureSettings().
1748           getSettingCount()];
1749       for (int fs = 0; fs < jms.getFeatureSettings().getSettingCount(); fs++)
1750       {
1751         Setting setting = jms.getFeatureSettings().getSetting(fs);
1752
1753         af.alignPanel.seqPanel.seqCanvas.getFeatureRenderer().setColour(setting.
1754             getType(),
1755             new java.awt.Color(setting.getColour()));
1756         renderOrder[fs] = setting.getType();
1757         if (setting.hasOrder())
1758           af.alignPanel.seqPanel.seqCanvas.getFeatureRenderer().setOrder(setting.getType(), setting.getOrder());
1759         else
1760           af.alignPanel.seqPanel.seqCanvas.getFeatureRenderer().setOrder(setting.getType(), fs/jms.getFeatureSettings().getSettingCount());
1761         if (setting.getDisplay())
1762         {
1763           af.viewport.featuresDisplayed.put(
1764               setting.getType(), new Integer(setting.getColour()));
1765         }
1766       }
1767       af.alignPanel.seqPanel.seqCanvas.getFeatureRenderer().renderOrder =
1768           renderOrder;
1769       Hashtable fgtable;
1770       af.alignPanel.seqPanel.seqCanvas.getFeatureRenderer().featureGroups = fgtable=new Hashtable();
1771       for (int gs=0;gs<jms.getFeatureSettings().getGroupCount(); gs++)
1772       {
1773         Group grp = jms.getFeatureSettings().getGroup(gs);
1774         fgtable.put(grp.getName(), new Boolean(grp.getDisplay()));
1775       }
1776     }
1777
1778     if (view.getHiddenColumnsCount() > 0)
1779     {
1780       for (int c = 0; c < view.getHiddenColumnsCount(); c++)
1781       {
1782         af.viewport.hideColumns(
1783             view.getHiddenColumns(c).getStart(),
1784             view.getHiddenColumns(c).getEnd() //+1
1785             );
1786       }
1787     }
1788
1789     af.setMenusFromViewport(af.viewport);
1790
1791     Desktop.addInternalFrame(af, view.getTitle(),
1792                              view.getWidth(), view.getHeight());
1793
1794     //LOAD TREES
1795     ///////////////////////////////////////
1796     if (loadTreesAndStructures && jms.getTreeCount() > 0)
1797     {
1798       try
1799       {
1800         for (int t = 0; t < jms.getTreeCount(); t++)
1801         {
1802
1803           Tree tree = jms.getTree(t);
1804
1805           TreePanel tp = af.ShowNewickTree(new jalview.io.NewickFile(
1806               tree.getNewick()), tree.getTitle(),
1807                                            tree.getWidth(), tree.getHeight(),
1808                                            tree.getXpos(), tree.getYpos());
1809
1810           tp.fitToWindow.setState(tree.getFitToWindow());
1811           tp.fitToWindow_actionPerformed(null);
1812
1813           if (tree.getFontName() != null)
1814           {
1815             tp.setTreeFont(new java.awt.Font(tree.getFontName(),
1816                                              tree.getFontStyle(),
1817                                              tree.getFontSize()));
1818           }
1819           else
1820           {
1821             tp.setTreeFont(new java.awt.Font(view.getFontName(),
1822                                              view.getFontStyle(),
1823                                              tree.getFontSize()));
1824           }
1825
1826           tp.showPlaceholders(tree.getMarkUnlinked());
1827           tp.showBootstrap(tree.getShowBootstrap());
1828           tp.showDistances(tree.getShowDistances());
1829
1830           tp.treeCanvas.threshold = tree.getThreshold();
1831
1832           if (tree.getCurrentTree())
1833           {
1834             af.viewport.setCurrentTree(tp.getTree());
1835           }
1836         }
1837
1838       }
1839       catch (Exception ex)
1840       {
1841         ex.printStackTrace();
1842       }
1843     }
1844
1845     ////LOAD STRUCTURES
1846     if(loadTreesAndStructures)
1847     {
1848       for (int i = 0; i < JSEQ.length; i++)
1849       {
1850         if (JSEQ[i].getPdbidsCount() > 0)
1851         {
1852           Pdbids[] ids = JSEQ[i].getPdbids();
1853           for (int p = 0; p < ids.length; p++)
1854           {
1855             for (int s = 0; s < ids[p].getStructureStateCount(); s++)
1856             {
1857               jalview.datamodel.PDBEntry jpdb = new jalview.datamodel.PDBEntry();
1858
1859               jpdb.setFile(loadPDBFile(ids[p].getFile(), ids[p].getId()));
1860               jpdb.setId(ids[p].getId());
1861
1862               int x = ids[p].getStructureState(s).getXpos();
1863               int y = ids[p].getStructureState(s).getYpos();
1864               int width = ids[p].getStructureState(s).getWidth();
1865               int height = ids[p].getStructureState(s).getHeight();
1866
1867               java.awt.Component comp = Desktop.desktop.getComponentAt(x, y);
1868
1869               String pdbFile = loadPDBFile(file, ids[p].getId());
1870
1871               jalview.datamodel.SequenceI[] seq = new jalview.datamodel.SequenceI[]
1872                   {
1873                   al.getSequenceAt(i)};
1874
1875               if (comp == null ||
1876                   (comp.getWidth() != width && comp.getHeight() != height))
1877               {
1878                 String state = ids[p].getStructureState(s).getContent();
1879
1880                 StringBuffer newFileLoc = new StringBuffer(state.substring(0,
1881                     state.indexOf("\"", state.indexOf("load")) + 1));
1882
1883                 newFileLoc.append(jpdb.getFile());
1884                 newFileLoc.append(state.substring(
1885                     state.indexOf("\"", state.indexOf("load \"") + 6)));
1886
1887                 new AppJMol(pdbFile,
1888                             ids[p].getId(),
1889                             seq,
1890                             af.alignPanel,
1891                             newFileLoc.toString(),
1892                             new java.awt.Rectangle(x, y, width, height));
1893
1894               }
1895               else if(comp!=null)
1896               {
1897                 StructureSelectionManager.getStructureSelectionManager()
1898                     .setMapping(seq, pdbFile,
1899                                 jalview.io.AppletFormatAdapter.FILE);
1900
1901                 ( (AppJMol) comp).addSequence(seq);
1902               }
1903             }
1904           }
1905         }
1906       }
1907     }
1908
1909     return af;
1910   }
1911
1912   public jalview.gui.AlignmentPanel copyAlignPanel(AlignmentPanel ap,
1913       boolean keepSeqRefs)
1914   {
1915     jalview.schemabinding.version2.JalviewModel jm
1916         = SaveState(ap, null, null, null);
1917
1918     if (!keepSeqRefs)
1919     {
1920       seqRefIds.clear();
1921       jm.getJalviewModelSequence().getViewport(0).setSequenceSetId(null);
1922     }
1923     else
1924     {
1925       uniqueSetSuffix = "";
1926     }
1927
1928     viewportsAdded = new Hashtable();
1929
1930     AlignFrame af = LoadFromObject(jm, null, false);
1931     af.alignPanels.clear();
1932     af.closeMenuItem_actionPerformed(true);
1933
1934     /*  if(ap.av.alignment.getAlignmentAnnotation()!=null)
1935       {
1936         for(int i=0; i<ap.av.alignment.getAlignmentAnnotation().length; i++)
1937         {
1938           if(!ap.av.alignment.getAlignmentAnnotation()[i].autoCalculated)
1939           {
1940             af.alignPanel.av.alignment.getAlignmentAnnotation()[i] =
1941                 ap.av.alignment.getAlignmentAnnotation()[i];
1942           }
1943         }
1944       }   */
1945
1946     return af.alignPanel;
1947   }
1948 }