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