Use id hash to add pdb mappings back to alignment
[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     String errorMessage = null;
990
991     try
992     {
993       //UNMARSHALLER SEEMS TO CLOSE JARINPUTSTREAM, MOST ANNOYING
994       URL url = null;
995
996       if (file.startsWith("http://"))
997       {
998         url = new URL(file);
999       }
1000
1001       JarInputStream jin = null;
1002       JarEntry jarentry = null;
1003       int entryCount = 1;
1004
1005       do
1006       {
1007         if (url != null)
1008         {
1009           jin = new JarInputStream(url.openStream());
1010         }
1011         else
1012         {
1013           jin = new JarInputStream(new FileInputStream(file));
1014         }
1015
1016         for (int i = 0; i < entryCount; i++)
1017         {
1018           jarentry = jin.getNextJarEntry();
1019         }
1020
1021         if (jarentry != null && jarentry.getName().endsWith(".xml"))
1022         {
1023           InputStreamReader in = new InputStreamReader(jin, "UTF-8");
1024           JalviewModel object = new JalviewModel();
1025
1026           Unmarshaller unmar = new Unmarshaller(object);
1027           unmar.setValidation(false);
1028           object = (JalviewModel) unmar.unmarshal(in);
1029
1030           af = LoadFromObject(object, file, true);
1031           if (af.viewport.gatherViewsHere)
1032           {
1033             gatherToThisFrame.put(af.viewport.getSequenceSetId(), af);
1034           }
1035           entryCount++;
1036         }
1037         else if (jarentry != null)
1038         {
1039           //Some other file here.
1040           entryCount++;
1041         }
1042       }
1043       while (jarentry != null);
1044     }
1045     catch(java.io.FileNotFoundException ex)
1046     {
1047       ex.printStackTrace();
1048       errorMessage = "Couldn't locate Jalview XML file : "+file;
1049       System.err.println("Exception whilst loading jalview XML file : " +
1050                          ex + "\n");
1051     }
1052     catch (java.net.UnknownHostException ex)
1053     {
1054       ex.printStackTrace();
1055       errorMessage = "Couldn't locate Jalview XML file : " +file;
1056       System.err.println("Exception whilst loading jalview XML file : " +
1057                          ex + "\n");
1058     }
1059     catch (Exception ex)
1060     {
1061       //Is Version 1 Jar file?
1062       af = new Jalview2XML_V1().LoadJalviewAlign(file);
1063
1064       if (af != null)
1065       {
1066         System.out.println("Successfully loaded archive file");
1067         return af;
1068       }
1069       ex.printStackTrace();
1070
1071       System.err.println("Exception whilst loading jalview XML file : " +
1072                          ex + "\n");
1073     }
1074
1075     if (Desktop.instance != null)
1076     {
1077       Desktop.instance.stopLoading();
1078     }
1079
1080     Enumeration en = gatherToThisFrame.elements();
1081     while(en.hasMoreElements())
1082     {
1083       Desktop.instance.gatherViews(
1084           (AlignFrame) en.nextElement());
1085     }
1086
1087     if(errorMessage!=null)
1088     {
1089       final String finalErrorMessage = errorMessage;
1090       javax.swing.SwingUtilities.invokeLater(new Runnable()
1091       {
1092         public void run()
1093         {
1094           JOptionPane.showInternalMessageDialog(Desktop.desktop,
1095                                                 finalErrorMessage,
1096                                                 "Error loading Jalview file",
1097                                                 JOptionPane.WARNING_MESSAGE);
1098         }
1099       });
1100     }
1101
1102     return af;
1103   }
1104
1105   Hashtable alreadyLoadedPDB;
1106   String loadPDBFile(String file, String pdbId)
1107   {
1108     if (alreadyLoadedPDB == null)
1109       alreadyLoadedPDB = new Hashtable();
1110
1111     if (alreadyLoadedPDB.containsKey(pdbId))
1112       return alreadyLoadedPDB.get(pdbId).toString();
1113
1114     try
1115     {
1116       JarInputStream jin = null;
1117
1118       if (file.startsWith("http://"))
1119       {
1120         jin = new JarInputStream(new URL(file).openStream());
1121       }
1122       else
1123       {
1124         jin = new JarInputStream(new FileInputStream(file));
1125       }
1126
1127       JarEntry entry = null;
1128       do
1129       {
1130         entry = jin.getNextJarEntry();
1131       }
1132       while (!entry.getName().equals(pdbId));
1133
1134       BufferedReader in = new BufferedReader(new InputStreamReader(jin));
1135       File outFile = File.createTempFile("jalview_pdb", ".txt");
1136       outFile.deleteOnExit();
1137       PrintWriter out = new PrintWriter(new FileOutputStream(outFile));
1138       String data;
1139
1140       while ( (data = in.readLine()) != null)
1141       {
1142         out.println(data);
1143       }
1144       out.close();
1145
1146       alreadyLoadedPDB.put(pdbId, outFile.getAbsolutePath());
1147       return outFile.getAbsolutePath();
1148
1149     }
1150     catch (Exception ex)
1151     {
1152       ex.printStackTrace();
1153     }
1154
1155     return null;
1156   }
1157
1158   AlignFrame LoadFromObject(JalviewModel object,
1159                             String file,
1160                             boolean loadTreesAndStructures)
1161   {
1162     SequenceSet vamsasSet = object.getVamsasModel().getSequenceSet(0);
1163     Sequence[] vamsasSeq = vamsasSet.getSequence();
1164
1165     JalviewModelSequence jms = object.getJalviewModelSequence();
1166
1167     Viewport view = jms.getViewport(0);
1168
1169     //////////////////////////////////
1170     //LOAD SEQUENCES
1171
1172     Vector hiddenSeqs = null;
1173     jalview.datamodel.Sequence jseq;
1174
1175     ArrayList tmpseqs = new ArrayList();
1176
1177     boolean multipleView = false;
1178
1179     JSeq[] JSEQ = object.getJalviewModelSequence().getJSeq();
1180     for (int i = 0; i < JSEQ.length; i++)
1181     {
1182       String seqId = JSEQ[i].getId() + "";
1183
1184       if (seqRefIds.get(seqId) != null)
1185       {
1186         tmpseqs.add( (jalview.datamodel.Sequence) seqRefIds.get(seqId));
1187         multipleView = true;
1188       }
1189       else
1190       {
1191         jseq = new jalview.datamodel.Sequence(vamsasSeq[i].getName(),
1192                                               vamsasSeq[i].getSequence());
1193         jseq.setDescription(vamsasSeq[i].getDescription());
1194         jseq.setStart(JSEQ[i].getStart());
1195         jseq.setEnd(JSEQ[i].getEnd());
1196         seqRefIds.put(vamsasSeq[i].getId(), jseq);
1197         tmpseqs.add(jseq);
1198       }
1199
1200       if (JSEQ[i].getHidden())
1201       {
1202         if (hiddenSeqs == null)
1203         {
1204           hiddenSeqs = new Vector();
1205         }
1206
1207         hiddenSeqs.addElement(
1208             (jalview.datamodel.Sequence) seqRefIds.get(seqId));
1209       }
1210
1211     }
1212
1213     ///SequenceFeatures are added to the DatasetSequence,
1214     // so we must create the dataset before loading features
1215     /////////////////////////////////
1216
1217
1218     jalview.datamodel.Sequence[] orderedSeqs = new jalview.datamodel.Sequence[
1219         tmpseqs.size()];
1220
1221     tmpseqs.toArray(orderedSeqs);
1222
1223     jalview.datamodel.Alignment al =
1224         new jalview.datamodel.Alignment(orderedSeqs);
1225
1226     for(int i=0; i<vamsasSet.getSequenceSetPropertiesCount(); i++ )
1227     {
1228       SequenceSetProperties ssp = vamsasSet.getSequenceSetProperties(i);
1229       al.setProperty(ssp.getKey(), ssp.getValue());
1230     }
1231
1232
1233     al.setDataset(null);
1234     /////////////////////////////////
1235
1236
1237     Hashtable pdbloaded = new Hashtable();
1238
1239     if (!multipleView)
1240     {
1241       for (int i = 0; i < vamsasSeq.length; i++)
1242       {
1243         if (JSEQ[i].getFeaturesCount() > 0)
1244         {
1245           Features[] features = JSEQ[i].getFeatures();
1246           for (int f = 0; f < features.length; f++)
1247           {
1248             jalview.datamodel.SequenceFeature sf
1249                 = new jalview.datamodel.SequenceFeature(features[f].getType(),
1250                 features[f].getDescription(), features[f].getStatus(),
1251                 features[f].getBegin(), features[f].getEnd(),
1252                 features[f].getFeatureGroup());
1253
1254             sf.setScore(features[f].getScore());
1255             for (int od = 0; od < features[f].getOtherDataCount(); od++)
1256             {
1257               OtherData keyValue = features[f].getOtherData(od);
1258               if (keyValue.getKey().startsWith("LINK"))
1259               {
1260                 sf.addLink(keyValue.getValue());
1261               }
1262               else
1263               {
1264                 sf.setValue(keyValue.getKey(), keyValue.getValue());
1265               }
1266
1267             }
1268
1269             al.getSequenceAt(i).getDatasetSequence().addSequenceFeature(sf);
1270           }
1271         }
1272
1273         if (JSEQ[i].getPdbidsCount() > 0)
1274         {
1275           Pdbids[] ids = JSEQ[i].getPdbids();
1276           for (int p = 0; p < ids.length; p++)
1277           {
1278             jalview.datamodel.PDBEntry entry = new jalview.datamodel.
1279                 PDBEntry();
1280             entry.setId(ids[p].getId());
1281             entry.setType(ids[p].getType());
1282             if (ids[p].getFile() != null)
1283             {
1284               if (!pdbloaded.containsKey(ids[p].getFile()))
1285               {
1286                 entry.setFile(loadPDBFile(file, ids[p].getId()));
1287               }
1288               else
1289               {
1290                 entry.setFile(pdbloaded.get(ids[p].getId()).toString());
1291               }
1292             }
1293
1294             al.getSequenceAt(i).getDatasetSequence().addPDBId(entry);
1295           }
1296         }
1297         if (vamsasSeq[i].getDBRefCount() > 0)
1298         {
1299           for (int d = 0; d < vamsasSeq[i].getDBRefCount(); d++)
1300           {
1301             jalview.datamodel.DBRefEntry entry =
1302                 new jalview.datamodel.DBRefEntry(
1303                     vamsasSeq[i].getDBRef(d).getSource(),
1304                     vamsasSeq[i].getDBRef(d).getVersion(),
1305                     vamsasSeq[i].getDBRef(d).getAccessionId()
1306                 );
1307             al.getSequenceAt(i).getDatasetSequence().addDBRef(entry);
1308           }
1309
1310         }
1311       }
1312     }
1313
1314     /////////////////////////////////
1315     //////////////////////////////////
1316     //LOAD ANNOTATIONS
1317     boolean hideQuality = true,
1318         hideConservation = true,
1319         hideConsensus = true;
1320
1321     if (vamsasSet.getAnnotationCount() > 0)
1322     {
1323       Annotation[] an = vamsasSet.getAnnotation();
1324
1325       for (int i = 0; i < an.length; i++)
1326       {
1327         if (an[i].getLabel().equals("Quality"))
1328         {
1329           hideQuality = false;
1330           continue;
1331         }
1332         else if (an[i].getLabel().equals("Conservation"))
1333         {
1334           hideConservation = false;
1335           continue;
1336         }
1337         else if (an[i].getLabel().equals("Consensus"))
1338         {
1339           hideConsensus = false;
1340           continue;
1341         }
1342
1343         if (an[i].getId() != null
1344             && annotationIds.containsKey(an[i].getId()))
1345         {
1346           al.addAnnotation(
1347               (jalview.datamodel.AlignmentAnnotation) annotationIds.get(an[i].
1348               getId())
1349               );
1350
1351           continue;
1352         }
1353
1354         AnnotationElement[] ae = an[i].getAnnotationElement();
1355         jalview.datamodel.Annotation[] anot = null;
1356
1357         if (!an[i].getScoreOnly())
1358         {
1359           anot = new jalview.datamodel.Annotation[
1360                     al.getWidth()];
1361
1362           for (int aa = 0; aa < ae.length && aa < anot.length; aa++)
1363           {
1364             anot[ae[aa].getPosition()] = new jalview.datamodel.Annotation(
1365
1366                     ae[aa].getDisplayCharacter(),
1367                     ae[aa].getDescription(),
1368                     (ae[aa].getSecondaryStructure()==null || ae[aa].getSecondaryStructure().length() == 0) ? ' ' :
1369                       ae[aa].getSecondaryStructure().charAt(0),
1370                       ae[aa].getValue()
1371
1372                             );
1373
1374
1375               anot[ae[aa].getPosition()].colour = new java.awt.Color(ae[aa].
1376                   getColour());
1377           }
1378         }
1379         jalview.datamodel.AlignmentAnnotation jaa = null;
1380
1381         if (an[i].getGraph())
1382         {
1383           jaa = new jalview.datamodel.AlignmentAnnotation(an[i].getLabel(),
1384               an[i].getDescription(), anot, 0, 0,
1385               an[i].getGraphType());
1386
1387           jaa.graphGroup = an[i].getGraphGroup();
1388
1389           if (an[i].getThresholdLine() != null)
1390           {
1391             jaa.setThreshold(new jalview.datamodel.GraphLine(
1392                 an[i].getThresholdLine().getValue(),
1393                 an[i].getThresholdLine().getLabel(),
1394                 new java.awt.Color(an[i].getThresholdLine().getColour()))
1395                 );
1396
1397           }
1398
1399         }
1400         else
1401         {
1402           jaa = new jalview.datamodel.AlignmentAnnotation(an[i].getLabel(),
1403               an[i].getDescription(), anot);
1404         }
1405
1406         if (an[i].getId() != null)
1407         {
1408           annotationIds.put(an[i].getId(), jaa);
1409           jaa.annotationId = an[i].getId();
1410         }
1411
1412         if (an[i].getSequenceRef() != null)
1413         {
1414           jaa.createSequenceMapping(
1415               al.findName(an[i].getSequenceRef()), 1, true
1416               );
1417           al.findName(an[i].getSequenceRef()).addAlignmentAnnotation(jaa);
1418         }
1419         if (an[i].hasScore())
1420         {
1421           jaa.setScore(an[i].getScore());
1422         }
1423         al.addAnnotation(jaa);
1424       }
1425     }
1426
1427     /////////////////////////
1428     //LOAD GROUPS
1429     if (jms.getJGroupCount() > 0)
1430     {
1431       JGroup[] groups = jms.getJGroup();
1432
1433       for (int i = 0; i < groups.length; i++)
1434       {
1435         ColourSchemeI cs = null;
1436
1437         if (groups[i].getColour() != null)
1438         {
1439           if (groups[i].getColour().startsWith("ucs"))
1440           {
1441             cs = GetUserColourScheme(jms, groups[i].getColour());
1442           }
1443           else
1444           {
1445             cs = ColourSchemeProperty.getColour(al,
1446                                                 groups[i].getColour());
1447           }
1448
1449           if (cs != null)
1450           {
1451             cs.setThreshold(groups[i].getPidThreshold(), true);
1452           }
1453         }
1454
1455         Vector seqs = new Vector();
1456
1457         for (int s = 0; s < groups[i].getSeqCount(); s++)
1458         {
1459           String seqId = groups[i].getSeq(s) + "";
1460           jalview.datamodel.SequenceI ts = (jalview.datamodel.SequenceI)
1461               seqRefIds.get(seqId);
1462
1463           if (ts != null)
1464           {
1465             seqs.addElement(ts);
1466           }
1467         }
1468
1469         if (seqs.size() < 1)
1470         {
1471           continue;
1472         }
1473
1474         jalview.datamodel.SequenceGroup sg = new jalview.datamodel.
1475             SequenceGroup(seqs,
1476                           groups[i].getName(), cs, groups[i].getDisplayBoxes(),
1477                           groups[i].getDisplayText(), groups[i].getColourText(),
1478                           groups[i].getStart(), groups[i].getEnd());
1479
1480         sg.setOutlineColour(new java.awt.Color(
1481             groups[i].getOutlineColour()));
1482
1483         sg.textColour = new java.awt.Color(groups[i].getTextCol1());
1484         sg.textColour2 = new java.awt.Color(groups[i].getTextCol2());
1485         sg.thresholdTextColour = groups[i].getTextColThreshold();
1486
1487         if (groups[i].getConsThreshold() != 0)
1488         {
1489           jalview.analysis.Conservation c = new jalview.analysis.Conservation(
1490               "All",
1491               ResidueProperties.propHash, 3, sg.getSequences(null), 0,
1492               sg.getWidth() - 1);
1493           c.calculate();
1494           c.verdict(false, 25);
1495           sg.cs.setConservation(c);
1496         }
1497
1498         al.addGroup(sg);
1499       }
1500     }
1501
1502     /////////////////////////////////
1503     // LOAD VIEWPORT
1504
1505     AlignFrame af = new AlignFrame(al,
1506                                    view.getWidth(),
1507                                    view.getHeight());
1508
1509     af.setFileName(file, "Jalview");
1510
1511     for (int i = 0; i < JSEQ.length; i++)
1512     {
1513       af.viewport.setSequenceColour(
1514           af.viewport.alignment.getSequenceAt(i),
1515           new java.awt.Color(
1516               JSEQ[i].getColour()));
1517     }
1518
1519     //If we just load in the same jar file again, the sequenceSetId
1520     //will be the same, and we end up with multiple references
1521     //to the same sequenceSet. We must modify this id on load
1522     //so that each load of the file gives a unique id
1523     String uniqueSeqSetId = view.getSequenceSetId() + uniqueSetSuffix;
1524
1525     af.viewport.gatherViewsHere = view.getGatheredViews();
1526
1527     if (view.getSequenceSetId() != null)
1528     {
1529       jalview.gui.AlignViewport av =
1530           (jalview.gui.AlignViewport)
1531           viewportsAdded.get(uniqueSeqSetId);
1532
1533       af.viewport.sequenceSetID = uniqueSeqSetId;
1534       if (av != null)
1535       {
1536
1537         af.viewport.historyList = av.historyList;
1538         af.viewport.redoList = av.redoList;
1539       }
1540       else
1541       {
1542         viewportsAdded.put(uniqueSeqSetId, af.viewport);
1543       }
1544
1545       PaintRefresher.Register(af.alignPanel, uniqueSeqSetId);
1546     }
1547     if (hiddenSeqs != null)
1548     {
1549       for (int s = 0; s < JSEQ.length; s++)
1550       {
1551         jalview.datamodel.SequenceGroup hidden =
1552             new jalview.datamodel.SequenceGroup();
1553
1554         for (int r = 0; r < JSEQ[s].getHiddenSequencesCount(); r++)
1555         {
1556           hidden.addSequence(
1557               al.getSequenceAt(JSEQ[s].getHiddenSequences(r))
1558               , false
1559               );
1560         }
1561         af.viewport.hideRepSequences(al.getSequenceAt(s), hidden);
1562       }
1563
1564       jalview.datamodel.SequenceI[] hseqs = new
1565           jalview.datamodel.SequenceI[hiddenSeqs.size()];
1566
1567       for (int s = 0; s < hiddenSeqs.size(); s++)
1568       {
1569         hseqs[s] = (jalview.datamodel.SequenceI) hiddenSeqs.elementAt(s);
1570       }
1571
1572       af.viewport.hideSequence(hseqs);
1573
1574     }
1575
1576     if ( (hideConsensus || hideQuality || hideConservation)
1577         && al.getAlignmentAnnotation() != null)
1578     {
1579       int hSize = al.getAlignmentAnnotation().length;
1580       for (int h = 0; h < hSize; h++)
1581       {
1582         if (
1583             (hideConsensus &&
1584              al.getAlignmentAnnotation()[h].label.equals("Consensus"))
1585             ||
1586             (hideQuality &&
1587              al.getAlignmentAnnotation()[h].label.equals("Quality"))
1588             ||
1589             (hideConservation &&
1590              al.getAlignmentAnnotation()[h].label.equals("Conservation")))
1591         {
1592           al.deleteAnnotation(al.getAlignmentAnnotation()[h]);
1593           hSize--;
1594           h--;
1595         }
1596       }
1597       af.alignPanel.adjustAnnotationHeight();
1598     }
1599
1600     if (view.getViewName() != null)
1601     {
1602       af.viewport.viewName = view.getViewName();
1603       af.setInitialTabVisible();
1604     }
1605     af.setBounds(view.getXpos(), view.getYpos(), view.getWidth(),
1606                  view.getHeight());
1607
1608     af.viewport.setShowAnnotation(view.getShowAnnotation());
1609     af.viewport.setAbovePIDThreshold(view.getPidSelected());
1610
1611     af.viewport.setColourText(view.getShowColourText());
1612
1613     af.viewport.setConservationSelected(view.getConservationSelected());
1614     af.viewport.setShowJVSuffix(view.getShowFullId());
1615     af.viewport.rightAlignIds = view.getRightAlignIds();
1616     af.viewport.setFont(new java.awt.Font(view.getFontName(),
1617                                           view.getFontStyle(), view.getFontSize()));
1618     af.alignPanel.fontChanged();
1619     af.viewport.setRenderGaps(view.getRenderGaps());
1620     af.viewport.setWrapAlignment(view.getWrapAlignment());
1621     af.alignPanel.setWrapAlignment(view.getWrapAlignment());
1622     af.viewport.setShowAnnotation(view.getShowAnnotation());
1623     af.alignPanel.setAnnotationVisible(view.getShowAnnotation());
1624
1625     af.viewport.setShowBoxes(view.getShowBoxes());
1626
1627     af.viewport.setShowText(view.getShowText());
1628
1629     af.viewport.textColour = new java.awt.Color(view.getTextCol1());
1630     af.viewport.textColour2 = new java.awt.Color(view.getTextCol2());
1631     af.viewport.thresholdTextColour = view.getTextColThreshold();
1632
1633     af.viewport.setStartRes(view.getStartRes());
1634     af.viewport.setStartSeq(view.getStartSeq());
1635
1636     ColourSchemeI cs = null;
1637
1638     if (view.getBgColour() != null)
1639     {
1640       if (view.getBgColour().startsWith("ucs"))
1641       {
1642         cs = GetUserColourScheme(jms, view.getBgColour());
1643       }
1644       else if (view.getBgColour().startsWith("Annotation"))
1645       {
1646         //int find annotation
1647         for (int i = 0;
1648              i < af.viewport.alignment.getAlignmentAnnotation().length; i++)
1649         {
1650           if (af.viewport.alignment.getAlignmentAnnotation()[i].label.
1651               equals(view.getAnnotationColours().getAnnotation()))
1652           {
1653             if (af.viewport.alignment.getAlignmentAnnotation()[i].
1654                 getThreshold() == null)
1655             {
1656               af.viewport.alignment.getAlignmentAnnotation()[i].
1657                   setThreshold(
1658                       new jalview.datamodel.GraphLine(
1659                           view.getAnnotationColours().getThreshold(),
1660                           "Threshold", java.awt.Color.black)
1661
1662                   );
1663             }
1664
1665             if (view.getAnnotationColours().getColourScheme().equals(
1666                 "None"))
1667             {
1668               cs = new AnnotationColourGradient(
1669                   af.viewport.alignment.getAlignmentAnnotation()[i],
1670                   new java.awt.Color(view.getAnnotationColours().
1671                                      getMinColour()),
1672                   new java.awt.Color(view.getAnnotationColours().
1673                                      getMaxColour()),
1674                   view.getAnnotationColours().getAboveThreshold());
1675             }
1676             else if (view.getAnnotationColours().getColourScheme().
1677                      startsWith("ucs"))
1678             {
1679               cs = new AnnotationColourGradient(
1680                   af.viewport.alignment.getAlignmentAnnotation()[i],
1681                   GetUserColourScheme(jms, view.getAnnotationColours().
1682                                       getColourScheme()),
1683                   view.getAnnotationColours().getAboveThreshold()
1684                   );
1685             }
1686             else
1687             {
1688               cs = new AnnotationColourGradient(
1689                   af.viewport.alignment.getAlignmentAnnotation()[i],
1690                   ColourSchemeProperty.getColour(al,
1691                                                  view.getAnnotationColours().
1692                                                  getColourScheme()),
1693                   view.getAnnotationColours().getAboveThreshold()
1694                   );
1695             }
1696
1697             // Also use these settings for all the groups
1698             if (al.getGroups() != null)
1699             {
1700               for (int g = 0; g < al.getGroups().size(); g++)
1701               {
1702                 jalview.datamodel.SequenceGroup sg
1703                     = (jalview.datamodel.SequenceGroup) al.getGroups().
1704                     elementAt(g);
1705
1706                 if (sg.cs == null)
1707                 {
1708                   continue;
1709                 }
1710
1711                 /*    if (view.getAnnotationColours().getColourScheme().equals("None"))
1712                     {
1713                       sg.cs = new AnnotationColourGradient(
1714                           af.viewport.alignment.getAlignmentAnnotation()[i],
1715                           new java.awt.Color(view.getAnnotationColours().
1716                                              getMinColour()),
1717                           new java.awt.Color(view.getAnnotationColours().
1718                                              getMaxColour()),
1719                           view.getAnnotationColours().getAboveThreshold());
1720                     }
1721                     else*/
1722                 {
1723                   sg.cs = new AnnotationColourGradient(
1724                       af.viewport.alignment.getAlignmentAnnotation()[i],
1725                       sg.cs,
1726                       view.getAnnotationColours().getAboveThreshold()
1727                       );
1728                 }
1729
1730               }
1731             }
1732
1733             break;
1734           }
1735
1736         }
1737       }
1738       else
1739       {
1740         cs = ColourSchemeProperty.getColour(al, view.getBgColour());
1741       }
1742
1743       if (cs != null)
1744       {
1745         cs.setThreshold(view.getPidThreshold(), true);
1746         cs.setConsensus(af.viewport.hconsensus);
1747       }
1748     }
1749
1750     af.viewport.setGlobalColourScheme(cs);
1751     af.viewport.setColourAppliesToAllGroups(false);
1752
1753     if (view.getConservationSelected() && cs != null)
1754     {
1755       cs.setConservationInc(view.getConsThreshold());
1756     }
1757
1758     af.changeColour(cs);
1759
1760     af.viewport.setColourAppliesToAllGroups(true);
1761
1762     if (view.getShowSequenceFeatures())
1763     {
1764       af.viewport.showSequenceFeatures = true;
1765     }
1766
1767     if (jms.getFeatureSettings() != null)
1768     {
1769       af.viewport.featuresDisplayed = new Hashtable();
1770       String[] renderOrder = new String[jms.getFeatureSettings().
1771           getSettingCount()];
1772       for (int fs = 0; fs < jms.getFeatureSettings().getSettingCount(); fs++)
1773       {
1774         Setting setting = jms.getFeatureSettings().getSetting(fs);
1775
1776         af.alignPanel.seqPanel.seqCanvas.getFeatureRenderer().setColour(setting.
1777             getType(),
1778             new java.awt.Color(setting.getColour()));
1779         renderOrder[fs] = setting.getType();
1780         if (setting.hasOrder())
1781           af.alignPanel.seqPanel.seqCanvas.getFeatureRenderer().setOrder(setting.getType(), setting.getOrder());
1782         else
1783           af.alignPanel.seqPanel.seqCanvas.getFeatureRenderer().setOrder(setting.getType(), fs/jms.getFeatureSettings().getSettingCount());
1784         if (setting.getDisplay())
1785         {
1786           af.viewport.featuresDisplayed.put(
1787               setting.getType(), new Integer(setting.getColour()));
1788         }
1789       }
1790       af.alignPanel.seqPanel.seqCanvas.getFeatureRenderer().renderOrder =
1791           renderOrder;
1792       Hashtable fgtable;
1793       af.alignPanel.seqPanel.seqCanvas.getFeatureRenderer().featureGroups = fgtable=new Hashtable();
1794       for (int gs=0;gs<jms.getFeatureSettings().getGroupCount(); gs++)
1795       {
1796         Group grp = jms.getFeatureSettings().getGroup(gs);
1797         fgtable.put(grp.getName(), new Boolean(grp.getDisplay()));
1798       }
1799     }
1800
1801     if (view.getHiddenColumnsCount() > 0)
1802     {
1803       for (int c = 0; c < view.getHiddenColumnsCount(); c++)
1804       {
1805         af.viewport.hideColumns(
1806             view.getHiddenColumns(c).getStart(),
1807             view.getHiddenColumns(c).getEnd() //+1
1808             );
1809       }
1810     }
1811
1812     af.setMenusFromViewport(af.viewport);
1813
1814     Desktop.addInternalFrame(af, view.getTitle(),
1815                              view.getWidth(), view.getHeight());
1816
1817     //LOAD TREES
1818     ///////////////////////////////////////
1819     if (loadTreesAndStructures && jms.getTreeCount() > 0)
1820     {
1821       try
1822       {
1823         for (int t = 0; t < jms.getTreeCount(); t++)
1824         {
1825
1826           Tree tree = jms.getTree(t);
1827
1828           TreePanel tp = af.ShowNewickTree(new jalview.io.NewickFile(
1829               tree.getNewick()), tree.getTitle(),
1830                                            tree.getWidth(), tree.getHeight(),
1831                                            tree.getXpos(), tree.getYpos());
1832
1833           tp.fitToWindow.setState(tree.getFitToWindow());
1834           tp.fitToWindow_actionPerformed(null);
1835
1836           if (tree.getFontName() != null)
1837           {
1838             tp.setTreeFont(new java.awt.Font(tree.getFontName(),
1839                                              tree.getFontStyle(),
1840                                              tree.getFontSize()));
1841           }
1842           else
1843           {
1844             tp.setTreeFont(new java.awt.Font(view.getFontName(),
1845                                              view.getFontStyle(),
1846                                              tree.getFontSize()));
1847           }
1848
1849           tp.showPlaceholders(tree.getMarkUnlinked());
1850           tp.showBootstrap(tree.getShowBootstrap());
1851           tp.showDistances(tree.getShowDistances());
1852
1853           tp.treeCanvas.threshold = tree.getThreshold();
1854
1855           if (tree.getCurrentTree())
1856           {
1857             af.viewport.setCurrentTree(tp.getTree());
1858           }
1859         }
1860
1861       }
1862       catch (Exception ex)
1863       {
1864         ex.printStackTrace();
1865       }
1866     }
1867
1868     ////LOAD STRUCTURES
1869     if(loadTreesAndStructures)
1870     {
1871       for (int i = 0; i < JSEQ.length; i++)
1872       {
1873         if (JSEQ[i].getPdbidsCount() > 0)
1874         {
1875           Pdbids[] ids = JSEQ[i].getPdbids();
1876           for (int p = 0; p < ids.length; p++)
1877           {
1878             for (int s = 0; s < ids[p].getStructureStateCount(); s++)
1879             {
1880               jalview.datamodel.PDBEntry jpdb = new jalview.datamodel.PDBEntry();
1881
1882               jpdb.setFile(loadPDBFile(ids[p].getFile(), ids[p].getId()));
1883               jpdb.setId(ids[p].getId());
1884
1885               int x = ids[p].getStructureState(s).getXpos();
1886               int y = ids[p].getStructureState(s).getYpos();
1887               int width = ids[p].getStructureState(s).getWidth();
1888               int height = ids[p].getStructureState(s).getHeight();
1889
1890               java.awt.Component comp = null;
1891
1892               JInternalFrame [] frames = Desktop.desktop.getAllFrames();
1893               for(int f=0; f<frames.length; f++)
1894               {
1895                 if(frames[f] instanceof AppJmol)
1896                 {
1897                   if (frames[f].getX() == x && frames[f].getY() == y
1898                       && frames[f].getHeight() == height
1899                       && frames[f].getWidth() == width)
1900                   {
1901                     comp = frames[f];
1902                     break;
1903                   }
1904                 }
1905               }
1906
1907
1908               Desktop.desktop.getComponentAt(x, y);
1909
1910               String pdbFile = loadPDBFile(file, ids[p].getId());
1911
1912               jalview.datamodel.SequenceI[] seq = new jalview.datamodel.
1913                   SequenceI[]
1914                   {
1915                    (jalview.datamodel.SequenceI)
1916                   seqRefIds.get(JSEQ[i].getId()+"")};
1917
1918
1919               if (comp == null)
1920               {
1921                 String state = ids[p].getStructureState(s).getContent();
1922
1923                 StringBuffer newFileLoc = new StringBuffer(state.substring(0,
1924                     state.indexOf("\"", state.indexOf("load")) + 1));
1925
1926                 newFileLoc.append(jpdb.getFile());
1927                 newFileLoc.append(state.substring(
1928                     state.indexOf("\"", state.indexOf("load \"") + 6)));
1929
1930                 new AppJmol(pdbFile,
1931                             ids[p].getId(),
1932                             seq,
1933                             af.alignPanel,
1934                             newFileLoc.toString(),
1935                             new java.awt.Rectangle(x, y, width, height));
1936
1937               }
1938               else if(comp!=null)
1939               {
1940                 StructureSelectionManager.getStructureSelectionManager()
1941                     .setMapping(seq, null, pdbFile,
1942                                 jalview.io.AppletFormatAdapter.FILE);
1943
1944                 ( (AppJmol) comp).addSequence(seq);
1945               }
1946             }
1947           }
1948         }
1949       }
1950     }
1951
1952     return af;
1953   }
1954
1955   public jalview.gui.AlignmentPanel copyAlignPanel(AlignmentPanel ap,
1956       boolean keepSeqRefs)
1957   {
1958     jalview.schemabinding.version2.JalviewModel jm
1959         = SaveState(ap, null, null, null);
1960
1961     if (!keepSeqRefs)
1962     {
1963       seqRefIds.clear();
1964       jm.getJalviewModelSequence().getViewport(0).setSequenceSetId(null);
1965     }
1966     else
1967     {
1968       uniqueSetSuffix = "";
1969     }
1970
1971     viewportsAdded = new Hashtable();
1972
1973     AlignFrame af = LoadFromObject(jm, null, false);
1974     af.alignPanels.clear();
1975     af.closeMenuItem_actionPerformed(true);
1976
1977     /*  if(ap.av.alignment.getAlignmentAnnotation()!=null)
1978       {
1979         for(int i=0; i<ap.av.alignment.getAlignmentAnnotation().length; i++)
1980         {
1981           if(!ap.av.alignment.getAlignmentAnnotation()[i].autoCalculated)
1982           {
1983             af.alignPanel.av.alignment.getAlignmentAnnotation()[i] =
1984                 ap.av.alignment.getAlignmentAnnotation()[i];
1985           }
1986         }
1987       }   */
1988
1989     return af.alignPanel;
1990   }
1991 }