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