feature group state and type order preference storage/retrieval.
[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         float rorder=ap.seqPanel.seqCanvas.getFeatureRenderer().getOrder(renderOrder[ro]);
755         if (rorder>-1) {
756           setting.setOrder(rorder);
757         }
758         fs.addSetting(setting);
759         settingsAdded.addElement(renderOrder[ro]);
760       }
761       
762       //Make sure we save none displayed feature settings
763       Enumeration en =
764           ap.seqPanel.seqCanvas.getFeatureRenderer().featureColours.keys();
765       while (en.hasMoreElements())
766       {
767         String key = en.nextElement().toString();
768         if (settingsAdded.contains(key))
769         {
770           continue;
771         }
772
773         Setting setting = new Setting();
774         setting.setType(key);
775         setting.setColour(
776             ap.seqPanel.seqCanvas.getFeatureRenderer().getColour(key).getRGB()
777             );
778
779         setting.setDisplay(false);
780         float rorder = ap.seqPanel.seqCanvas.getFeatureRenderer().getOrder(key);
781         if (rorder>-1) 
782         {
783           setting.setOrder(rorder);
784         }
785         fs.addSetting(setting);
786         settingsAdded.addElement(key);
787       }
788       en = ap.seqPanel.seqCanvas.getFeatureRenderer().featureGroups.keys();
789       Vector groupsAdded=new Vector(); 
790       while (en.hasMoreElements())
791       {
792         String grp = en.nextElement().toString();
793         if (groupsAdded.contains(grp)) 
794         {
795           continue;
796         }
797         Group g = new Group();
798         g.setName(grp);
799         g.setDisplay(((Boolean)ap.seqPanel.seqCanvas.getFeatureRenderer().featureGroups.get(grp)).booleanValue());
800         fs.addGroup(g);
801         groupsAdded.addElement(grp);
802       }
803       jms.setFeatureSettings(fs);
804
805     }
806
807     if (av.hasHiddenColumns)
808     {
809       for (int c = 0; c < av.getColumnSelection().getHiddenColumns().size(); c++)
810       {
811         int[] region = (int[]) av.getColumnSelection().getHiddenColumns().
812             elementAt(c);
813         HiddenColumns hc = new HiddenColumns();
814         hc.setStart(region[0]);
815         hc.setEnd(region[1]);
816         view.addHiddenColumns(hc);
817       }
818     }
819
820     jms.addViewport(view);
821
822     object.setJalviewModelSequence(jms);
823     object.getVamsasModel().addSequenceSet(vamsasSet);
824
825     if (out != null)
826     {
827       //We may not want to right the object to disk,
828       //eg we can copy the alignViewport to a new view object
829       //using save and then load
830       try
831       {
832         if (!fileName.endsWith(".xml"))
833         {
834           fileName = fileName + ".xml";
835         }
836
837         JarEntry entry = new JarEntry(fileName);
838         jout.putNextEntry(entry);
839
840         object.marshal(out);
841       }
842       catch (Exception ex)
843       {
844         ex.printStackTrace();
845       }
846     }
847     return object;
848   }
849
850   String SetUserColourScheme(jalview.schemes.ColourSchemeI cs,
851                              Vector userColours, JalviewModelSequence jms)
852   {
853     String id = null;
854     jalview.schemes.UserColourScheme ucs = (jalview.schemes.UserColourScheme)
855         cs;
856
857     if (!userColours.contains(ucs))
858     {
859       userColours.add(ucs);
860
861       java.awt.Color[] colours = ucs.getColours();
862       jalview.schemabinding.version2.UserColours uc = new jalview.schemabinding.
863           version2.UserColours();
864       jalview.schemabinding.version2.UserColourScheme jbucs = new jalview.
865           schemabinding.version2.UserColourScheme();
866
867       for (int i = 0; i < colours.length; i++)
868       {
869         jalview.schemabinding.version2.Colour col = new jalview.schemabinding.
870             version2.Colour();
871         col.setName(ResidueProperties.aa[i]);
872         col.setRGB(jalview.util.Format.getHexString(colours[i]));
873         jbucs.addColour(col);
874       }
875       if (ucs.getLowerCaseColours() != null)
876       {
877         colours = ucs.getLowerCaseColours();
878         for (int i = 0; i < colours.length; i++)
879         {
880           jalview.schemabinding.version2.Colour col = new jalview.schemabinding.
881               version2.Colour();
882           col.setName(ResidueProperties.aa[i].toLowerCase());
883           col.setRGB(jalview.util.Format.getHexString(colours[i]));
884           jbucs.addColour(col);
885         }
886       }
887
888       id = "ucs" + userColours.indexOf(ucs);
889       uc.setId(id);
890       uc.setUserColourScheme(jbucs);
891       jms.addUserColours(uc);
892     }
893
894     return id;
895   }
896
897   jalview.schemes.UserColourScheme GetUserColourScheme(
898       JalviewModelSequence jms, String id)
899   {
900     UserColours[] uc = jms.getUserColours();
901     UserColours colours = null;
902
903     for (int i = 0; i < uc.length; i++)
904     {
905       if (uc[i].getId().equals(id))
906       {
907         colours = uc[i];
908
909         break;
910       }
911     }
912
913     java.awt.Color[] newColours = new java.awt.Color[24];
914
915     for (int i = 0; i < 24; i++)
916     {
917       newColours[i] = new java.awt.Color(Integer.parseInt(
918           colours.getUserColourScheme().getColour(i).getRGB(), 16));
919     }
920
921     jalview.schemes.UserColourScheme ucs =
922         new jalview.schemes.UserColourScheme(newColours);
923
924     if (colours.getUserColourScheme().getColourCount() > 24)
925     {
926       newColours = new java.awt.Color[23];
927       for (int i = 0; i < 23; i++)
928       {
929         newColours[i] = new java.awt.Color(Integer.parseInt(
930             colours.getUserColourScheme().getColour(i + 24).getRGB(), 16));
931       }
932       ucs.setLowerCaseColours(newColours);
933     }
934
935     return ucs;
936   }
937
938   /**
939    * DOCUMENT ME!
940    *
941    * @param file DOCUMENT ME!
942    */
943   public AlignFrame LoadJalviewAlign(final String file)
944   {
945     uniqueSetSuffix = System.currentTimeMillis() % 100000 + "";
946
947     jalview.gui.AlignFrame af = null;
948
949     seqRefIds = new Hashtable();
950     viewportsAdded = new Hashtable();
951
952     Hashtable gatherToThisFrame = new Hashtable();
953
954     try
955     {
956       //UNMARSHALLER SEEMS TO CLOSE JARINPUTSTREAM, MOST ANNOYING
957       URL url = null;
958
959       if (file.startsWith("http://"))
960       {
961         url = new URL(file);
962       }
963
964       JarInputStream jin = null;
965       JarEntry jarentry = null;
966       int entryCount = 1;
967
968       do
969       {
970         if (url != null)
971         {
972           jin = new JarInputStream(url.openStream());
973         }
974         else
975         {
976           jin = new JarInputStream(new FileInputStream(file));
977         }
978
979         for (int i = 0; i < entryCount; i++)
980         {
981           jarentry = jin.getNextJarEntry();
982         }
983
984         if (jarentry != null && jarentry.getName().endsWith(".xml"))
985         {
986           InputStreamReader in = new InputStreamReader(jin, "UTF-8");
987           JalviewModel object = new JalviewModel();
988
989           Unmarshaller unmar = new Unmarshaller(object);
990           unmar.setValidation(false);
991           object = (JalviewModel) unmar.unmarshal(in);
992
993           af = LoadFromObject(object, file, true);
994           if (af.viewport.gatherViewsHere)
995           {
996             gatherToThisFrame.put(af.viewport.getSequenceSetId(), af);
997           }
998           entryCount++;
999         }
1000         else if (jarentry != null)
1001         {
1002           //Some other file here.
1003           entryCount++;
1004         }
1005       }
1006       while (jarentry != null);
1007     }
1008     catch (java.net.UnknownHostException ex)
1009     {
1010       ex.printStackTrace();
1011       System.err.println("Couldn't locate Jalview XML file : " +
1012                          ex + "\n");
1013
1014       javax.swing.SwingUtilities.invokeLater(new Runnable()
1015       {
1016         public void run()
1017         {
1018           JOptionPane.showInternalMessageDialog(Desktop.desktop,
1019                                                 "Couldn't locate " + file,
1020                                                 "URL not found",
1021                                                 JOptionPane.WARNING_MESSAGE);
1022         }
1023       });
1024     }
1025     catch (Exception ex)
1026     {
1027       //Is Version 1 Jar file?
1028       af = new Jalview2XML_V1().LoadJalviewAlign(file);
1029
1030       if (af != null)
1031       {
1032         System.out.println("Successfully loaded archive file");
1033         return af;
1034       }
1035       ex.printStackTrace();
1036
1037       System.err.println("Exception whilst loading jalview XML file : " +
1038                          ex + "\n");
1039       javax.swing.SwingUtilities.invokeLater(new Runnable()
1040       {
1041         public void run()
1042         {
1043
1044           JOptionPane.showInternalMessageDialog(Desktop.desktop,
1045                                                 "Error loading  " + file,
1046                                                 "Error loading Jalview file",
1047                                                 JOptionPane.WARNING_MESSAGE);
1048         }
1049       });
1050     }
1051
1052     if (Desktop.instance != null)
1053     {
1054       Desktop.instance.stopLoading();
1055     }
1056
1057     Enumeration en = gatherToThisFrame.elements();
1058     while(en.hasMoreElements())
1059     {
1060       Desktop.instance.gatherViews(
1061           (AlignFrame) en.nextElement());
1062     }
1063
1064     return af;
1065   }
1066
1067   Hashtable alreadyLoadedPDB;
1068   String loadPDBFile(String file, String pdbId)
1069   {
1070     if (alreadyLoadedPDB == null)
1071       alreadyLoadedPDB = new Hashtable();
1072
1073     if (alreadyLoadedPDB.containsKey(pdbId))
1074       return alreadyLoadedPDB.get(pdbId).toString();
1075
1076     try
1077     {
1078       JarInputStream jin = null;
1079
1080       if (file.startsWith("http://"))
1081       {
1082         jin = new JarInputStream(new URL(file).openStream());
1083       }
1084       else
1085       {
1086         jin = new JarInputStream(new FileInputStream(file));
1087       }
1088
1089       JarEntry entry = null;
1090       do
1091       {
1092         entry = jin.getNextJarEntry();
1093       }
1094       while (!entry.getName().equals(pdbId));
1095
1096       BufferedReader in = new BufferedReader(new InputStreamReader(jin));
1097       File outFile = File.createTempFile("jalview_pdb", ".txt");
1098       outFile.deleteOnExit();
1099       PrintWriter out = new PrintWriter(new FileOutputStream(outFile));
1100       String data;
1101
1102       while ( (data = in.readLine()) != null)
1103       {
1104         out.println(data);
1105       }
1106       out.close();
1107
1108       alreadyLoadedPDB.put(pdbId, outFile.getAbsolutePath());
1109       return outFile.getAbsolutePath();
1110
1111     }
1112     catch (Exception ex)
1113     {
1114       ex.printStackTrace();
1115     }
1116
1117     return null;
1118   }
1119
1120   AlignFrame LoadFromObject(JalviewModel object,
1121                             String file,
1122                             boolean loadTreesAndStructures)
1123   {
1124     SequenceSet vamsasSet = object.getVamsasModel().getSequenceSet(0);
1125     Sequence[] vamsasSeq = vamsasSet.getSequence();
1126
1127     JalviewModelSequence jms = object.getJalviewModelSequence();
1128
1129     Viewport view = jms.getViewport(0);
1130
1131     //////////////////////////////////
1132     //LOAD SEQUENCES
1133
1134     Vector hiddenSeqs = null;
1135     jalview.datamodel.Sequence jseq;
1136
1137     ArrayList tmpseqs = new ArrayList();
1138
1139     boolean multipleView = false;
1140
1141     JSeq[] JSEQ = object.getJalviewModelSequence().getJSeq();
1142     for (int i = 0; i < JSEQ.length; i++)
1143     {
1144       String seqId = JSEQ[i].getId() + "";
1145
1146       if (seqRefIds.get(seqId) != null)
1147       {
1148         tmpseqs.add( (jalview.datamodel.Sequence) seqRefIds.get(seqId));
1149         multipleView = true;
1150       }
1151       else
1152       {
1153         jseq = new jalview.datamodel.Sequence(vamsasSeq[i].getName(),
1154                                               vamsasSeq[i].getSequence());
1155         jseq.setDescription(vamsasSeq[i].getDescription());
1156         jseq.setStart(JSEQ[i].getStart());
1157         jseq.setEnd(JSEQ[i].getEnd());
1158         seqRefIds.put(vamsasSeq[i].getId(), jseq);
1159         tmpseqs.add(jseq);
1160       }
1161
1162       if (JSEQ[i].getHidden())
1163       {
1164         if (hiddenSeqs == null)
1165         {
1166           hiddenSeqs = new Vector();
1167         }
1168
1169         hiddenSeqs.addElement(
1170             (jalview.datamodel.Sequence) seqRefIds.get(seqId));
1171       }
1172
1173     }
1174
1175     ///SequenceFeatures are added to the DatasetSequence,
1176     // so we must create the dataset before loading features
1177     /////////////////////////////////
1178
1179
1180     jalview.datamodel.Sequence[] orderedSeqs = new jalview.datamodel.Sequence[
1181         tmpseqs.size()];
1182
1183     tmpseqs.toArray(orderedSeqs);
1184
1185     jalview.datamodel.Alignment al =
1186         new jalview.datamodel.Alignment(orderedSeqs);
1187
1188     al.setDataset(null);
1189     /////////////////////////////////
1190
1191
1192     Hashtable pdbloaded = new Hashtable();
1193
1194     if (!multipleView)
1195     {
1196       for (int i = 0; i < vamsasSeq.length; i++)
1197       {
1198         if (JSEQ[i].getFeaturesCount() > 0)
1199         {
1200           Features[] features = JSEQ[i].getFeatures();
1201           for (int f = 0; f < features.length; f++)
1202           {
1203             jalview.datamodel.SequenceFeature sf
1204                 = new jalview.datamodel.SequenceFeature(features[f].getType(),
1205                 features[f].getDescription(), features[f].getStatus(),
1206                 features[f].getBegin(), features[f].getEnd(),
1207                 features[f].getFeatureGroup());
1208
1209             sf.setScore(features[f].getScore());
1210             for (int od = 0; od < features[f].getOtherDataCount(); od++)
1211             {
1212               OtherData keyValue = features[f].getOtherData(od);
1213               if (keyValue.getKey().startsWith("LINK"))
1214               {
1215                 sf.addLink(keyValue.getValue());
1216               }
1217               else
1218               {
1219                 sf.setValue(keyValue.getKey(), keyValue.getValue());
1220               }
1221
1222             }
1223
1224             al.getSequenceAt(i).getDatasetSequence().addSequenceFeature(sf);
1225           }
1226         }
1227
1228         if (JSEQ[i].getPdbidsCount() > 0)
1229         {
1230           Pdbids[] ids = JSEQ[i].getPdbids();
1231           for (int p = 0; p < ids.length; p++)
1232           {
1233             jalview.datamodel.PDBEntry entry = new jalview.datamodel.
1234                 PDBEntry();
1235             entry.setId(ids[p].getId());
1236             entry.setType(ids[p].getType());
1237             if (ids[p].getFile() != null)
1238             {
1239               if (!pdbloaded.containsKey(ids[p].getFile()))
1240               {
1241                 entry.setFile(loadPDBFile(file, ids[p].getId()));
1242               }
1243               else
1244               {
1245                 entry.setFile(pdbloaded.get(ids[p].getId()).toString());
1246               }
1247             }
1248
1249             al.getSequenceAt(i).getDatasetSequence().addPDBId(entry);
1250           }
1251         }
1252         if (vamsasSeq[i].getDBRefCount() > 0)
1253         {
1254           for (int d = 0; d < vamsasSeq[i].getDBRefCount(); d++)
1255           {
1256             jalview.datamodel.DBRefEntry entry =
1257                 new jalview.datamodel.DBRefEntry(
1258                     vamsasSeq[i].getDBRef(d).getSource(),
1259                     vamsasSeq[i].getDBRef(d).getVersion(),
1260                     vamsasSeq[i].getDBRef(d).getAccessionId()
1261                 );
1262             al.getSequenceAt(i).getDatasetSequence().addDBRef(entry);
1263           }
1264
1265         }
1266       }
1267     }
1268
1269     /////////////////////////////////
1270     //////////////////////////////////
1271     //LOAD ANNOTATIONS
1272     boolean hideQuality = true,
1273         hideConservation = true,
1274         hideConsensus = true;
1275
1276     if (vamsasSet.getAnnotationCount() > 0)
1277     {
1278       Annotation[] an = vamsasSet.getAnnotation();
1279
1280       for (int i = 0; i < an.length; i++)
1281       {
1282         if (an[i].getLabel().equals("Quality"))
1283         {
1284           hideQuality = false;
1285           continue;
1286         }
1287         else if (an[i].getLabel().equals("Conservation"))
1288         {
1289           hideConservation = false;
1290           continue;
1291         }
1292         else if (an[i].getLabel().equals("Consensus"))
1293         {
1294           hideConsensus = false;
1295           continue;
1296         }
1297
1298         if (an[i].getId() != null
1299             && annotationIds.containsKey(an[i].getId()))
1300         {
1301           al.addAnnotation(
1302               (jalview.datamodel.AlignmentAnnotation) annotationIds.get(an[i].
1303               getId())
1304               );
1305
1306           continue;
1307         }
1308
1309         AnnotationElement[] ae = an[i].getAnnotationElement();
1310         jalview.datamodel.Annotation[] anot = new jalview.datamodel.Annotation[
1311             al.getWidth()];
1312
1313         for (int aa = 0; aa < ae.length && aa < anot.length; aa++)
1314         {
1315           anot[ae[aa].getPosition()] = new jalview.datamodel.Annotation(ae[aa].
1316               getDisplayCharacter(),
1317               ae[aa].getDescription(),
1318               ae[aa].getSecondaryStructure().length() == 0 ? ' ' :
1319               ae[aa].getSecondaryStructure().charAt(0),
1320                    ae[aa].getValue());
1321           anot[ae[aa].getPosition()].colour = new java.awt.Color(ae[aa].
1322               getColour());
1323         }
1324
1325         jalview.datamodel.AlignmentAnnotation jaa = null;
1326
1327         if (an[i].getGraph())
1328         {
1329           jaa = new jalview.datamodel.AlignmentAnnotation(an[i].getLabel(),
1330               an[i].getDescription(), anot, 0, 0,
1331               an[i].getGraphType());
1332
1333           jaa.graphGroup = an[i].getGraphGroup();
1334
1335           if (an[i].getThresholdLine() != null)
1336           {
1337             jaa.setThreshold(new jalview.datamodel.GraphLine(
1338                 an[i].getThresholdLine().getValue(),
1339                 an[i].getThresholdLine().getLabel(),
1340                 new java.awt.Color(an[i].getThresholdLine().getColour()))
1341                 );
1342
1343           }
1344
1345         }
1346         else
1347         {
1348           jaa = new jalview.datamodel.AlignmentAnnotation(an[i].getLabel(),
1349               an[i].getDescription(), anot);
1350         }
1351
1352         if (an[i].getId() != null)
1353         {
1354           annotationIds.put(an[i].getId(), jaa);
1355           jaa.annotationId = an[i].getId();
1356         }
1357
1358         if (an[i].getSequenceRef() != null)
1359         {
1360           jaa.createSequenceMapping(
1361               al.findName(an[i].getSequenceRef()), 1, true
1362               );
1363           al.findName(an[i].getSequenceRef()).addAlignmentAnnotation(jaa);
1364         }
1365
1366         al.addAnnotation(jaa);
1367       }
1368     }
1369
1370     /////////////////////////
1371     //LOAD GROUPS
1372     if (jms.getJGroupCount() > 0)
1373     {
1374       JGroup[] groups = jms.getJGroup();
1375
1376       for (int i = 0; i < groups.length; i++)
1377       {
1378         ColourSchemeI cs = null;
1379
1380         if (groups[i].getColour() != null)
1381         {
1382           if (groups[i].getColour().startsWith("ucs"))
1383           {
1384             cs = GetUserColourScheme(jms, groups[i].getColour());
1385           }
1386           else
1387           {
1388             cs = ColourSchemeProperty.getColour(al,
1389                                                 groups[i].getColour());
1390           }
1391
1392           if (cs != null)
1393           {
1394             cs.setThreshold(groups[i].getPidThreshold(), true);
1395           }
1396         }
1397
1398         Vector seqs = new Vector();
1399
1400         for (int s = 0; s < groups[i].getSeqCount(); s++)
1401         {
1402           String seqId = groups[i].getSeq(s) + "";
1403           jalview.datamodel.SequenceI ts = (jalview.datamodel.SequenceI)
1404               seqRefIds.get(seqId);
1405
1406           if (ts != null)
1407           {
1408             seqs.addElement(ts);
1409           }
1410         }
1411
1412         if (seqs.size() < 1)
1413         {
1414           continue;
1415         }
1416
1417         jalview.datamodel.SequenceGroup sg = new jalview.datamodel.
1418             SequenceGroup(seqs,
1419                           groups[i].getName(), cs, groups[i].getDisplayBoxes(),
1420                           groups[i].getDisplayText(), groups[i].getColourText(),
1421                           groups[i].getStart(), groups[i].getEnd());
1422
1423         sg.setOutlineColour(new java.awt.Color(
1424             groups[i].getOutlineColour()));
1425
1426         sg.textColour = new java.awt.Color(groups[i].getTextCol1());
1427         sg.textColour2 = new java.awt.Color(groups[i].getTextCol2());
1428         sg.thresholdTextColour = groups[i].getTextColThreshold();
1429
1430         if (groups[i].getConsThreshold() != 0)
1431         {
1432           jalview.analysis.Conservation c = new jalview.analysis.Conservation(
1433               "All",
1434               ResidueProperties.propHash, 3, sg.getSequences(null), 0,
1435               sg.getWidth() - 1);
1436           c.calculate();
1437           c.verdict(false, 25);
1438           sg.cs.setConservation(c);
1439         }
1440
1441         al.addGroup(sg);
1442       }
1443     }
1444
1445     /////////////////////////////////
1446     // LOAD VIEWPORT
1447
1448     AlignFrame af = new AlignFrame(al,
1449                                    view.getWidth(),
1450                                    view.getHeight());
1451
1452     af.setFileName(file, "Jalview");
1453
1454     for (int i = 0; i < JSEQ.length; i++)
1455     {
1456       af.viewport.setSequenceColour(
1457           af.viewport.alignment.getSequenceAt(i),
1458           new java.awt.Color(
1459               JSEQ[i].getColour()));
1460     }
1461
1462     //If we just load in the same jar file again, the sequenceSetId
1463     //will be the same, and we end up with multiple references
1464     //to the same sequenceSet. We must modify this id on load
1465     //so that each load of the file gives a unique id
1466     String uniqueSeqSetId = view.getSequenceSetId() + uniqueSetSuffix;
1467
1468     af.viewport.gatherViewsHere = view.getGatheredViews();
1469
1470     if (view.getSequenceSetId() != null)
1471     {
1472       jalview.gui.AlignViewport av =
1473           (jalview.gui.AlignViewport)
1474           viewportsAdded.get(uniqueSeqSetId);
1475
1476       af.viewport.sequenceSetID = uniqueSeqSetId;
1477       if (av != null)
1478       {
1479
1480         af.viewport.historyList = av.historyList;
1481         af.viewport.redoList = av.redoList;
1482       }
1483       else
1484       {
1485         viewportsAdded.put(uniqueSeqSetId, af.viewport);
1486       }
1487
1488       PaintRefresher.Register(af.alignPanel, uniqueSeqSetId);
1489     }
1490     if (hiddenSeqs != null)
1491     {
1492       for (int s = 0; s < JSEQ.length; s++)
1493       {
1494         jalview.datamodel.SequenceGroup hidden =
1495             new jalview.datamodel.SequenceGroup();
1496
1497         for (int r = 0; r < JSEQ[s].getHiddenSequencesCount(); r++)
1498         {
1499           hidden.addSequence(
1500               al.getSequenceAt(JSEQ[s].getHiddenSequences(r))
1501               , false
1502               );
1503         }
1504         af.viewport.hideRepSequences(al.getSequenceAt(s), hidden);
1505       }
1506
1507       jalview.datamodel.SequenceI[] hseqs = new
1508           jalview.datamodel.SequenceI[hiddenSeqs.size()];
1509
1510       for (int s = 0; s < hiddenSeqs.size(); s++)
1511       {
1512         hseqs[s] = (jalview.datamodel.SequenceI) hiddenSeqs.elementAt(s);
1513       }
1514
1515       af.viewport.hideSequence(hseqs);
1516
1517     }
1518
1519     if ( (hideConsensus || hideQuality || hideConservation)
1520         && al.getAlignmentAnnotation() != null)
1521     {
1522       int hSize = al.getAlignmentAnnotation().length;
1523       for (int h = 0; h < hSize; h++)
1524       {
1525         if (
1526             (hideConsensus &&
1527              al.getAlignmentAnnotation()[h].label.equals("Consensus"))
1528             ||
1529             (hideQuality &&
1530              al.getAlignmentAnnotation()[h].label.equals("Quality"))
1531             ||
1532             (hideConservation &&
1533              al.getAlignmentAnnotation()[h].label.equals("Conservation")))
1534         {
1535           al.deleteAnnotation(al.getAlignmentAnnotation()[h]);
1536           hSize--;
1537           h--;
1538         }
1539       }
1540       af.alignPanel.adjustAnnotationHeight();
1541     }
1542
1543     if (view.getViewName() != null)
1544     {
1545       af.viewport.viewName = view.getViewName();
1546       af.setInitialTabVisible();
1547     }
1548     af.setBounds(view.getXpos(), view.getYpos(), view.getWidth(),
1549                  view.getHeight());
1550
1551     af.viewport.setShowAnnotation(view.getShowAnnotation());
1552     af.viewport.setAbovePIDThreshold(view.getPidSelected());
1553
1554     af.viewport.setColourText(view.getShowColourText());
1555
1556     af.viewport.setConservationSelected(view.getConservationSelected());
1557     af.viewport.setShowJVSuffix(view.getShowFullId());
1558     af.viewport.rightAlignIds = view.getRightAlignIds();
1559     af.viewport.setFont(new java.awt.Font(view.getFontName(),
1560                                           view.getFontStyle(), view.getFontSize()));
1561     af.alignPanel.fontChanged();
1562     af.viewport.setRenderGaps(view.getRenderGaps());
1563     af.viewport.setWrapAlignment(view.getWrapAlignment());
1564     af.alignPanel.setWrapAlignment(view.getWrapAlignment());
1565     af.viewport.setShowAnnotation(view.getShowAnnotation());
1566     af.alignPanel.setAnnotationVisible(view.getShowAnnotation());
1567
1568     af.viewport.setShowBoxes(view.getShowBoxes());
1569
1570     af.viewport.setShowText(view.getShowText());
1571
1572     af.viewport.textColour = new java.awt.Color(view.getTextCol1());
1573     af.viewport.textColour2 = new java.awt.Color(view.getTextCol2());
1574     af.viewport.thresholdTextColour = view.getTextColThreshold();
1575
1576     af.viewport.setStartRes(view.getStartRes());
1577     af.viewport.setStartSeq(view.getStartSeq());
1578
1579     ColourSchemeI cs = null;
1580
1581     if (view.getBgColour() != null)
1582     {
1583       if (view.getBgColour().startsWith("ucs"))
1584       {
1585         cs = GetUserColourScheme(jms, view.getBgColour());
1586       }
1587       else if (view.getBgColour().startsWith("Annotation"))
1588       {
1589         //int find annotation
1590         for (int i = 0;
1591              i < af.viewport.alignment.getAlignmentAnnotation().length; i++)
1592         {
1593           if (af.viewport.alignment.getAlignmentAnnotation()[i].label.
1594               equals(view.getAnnotationColours().getAnnotation()))
1595           {
1596             if (af.viewport.alignment.getAlignmentAnnotation()[i].
1597                 getThreshold() == null)
1598             {
1599               af.viewport.alignment.getAlignmentAnnotation()[i].
1600                   setThreshold(
1601                       new jalview.datamodel.GraphLine(
1602                           view.getAnnotationColours().getThreshold(),
1603                           "Threshold", java.awt.Color.black)
1604
1605                   );
1606             }
1607
1608             if (view.getAnnotationColours().getColourScheme().equals(
1609                 "None"))
1610             {
1611               cs = new AnnotationColourGradient(
1612                   af.viewport.alignment.getAlignmentAnnotation()[i],
1613                   new java.awt.Color(view.getAnnotationColours().
1614                                      getMinColour()),
1615                   new java.awt.Color(view.getAnnotationColours().
1616                                      getMaxColour()),
1617                   view.getAnnotationColours().getAboveThreshold());
1618             }
1619             else if (view.getAnnotationColours().getColourScheme().
1620                      startsWith("ucs"))
1621             {
1622               cs = new AnnotationColourGradient(
1623                   af.viewport.alignment.getAlignmentAnnotation()[i],
1624                   GetUserColourScheme(jms, view.getAnnotationColours().
1625                                       getColourScheme()),
1626                   view.getAnnotationColours().getAboveThreshold()
1627                   );
1628             }
1629             else
1630             {
1631               cs = new AnnotationColourGradient(
1632                   af.viewport.alignment.getAlignmentAnnotation()[i],
1633                   ColourSchemeProperty.getColour(al,
1634                                                  view.getAnnotationColours().
1635                                                  getColourScheme()),
1636                   view.getAnnotationColours().getAboveThreshold()
1637                   );
1638             }
1639
1640             // Also use these settings for all the groups
1641             if (al.getGroups() != null)
1642             {
1643               for (int g = 0; g < al.getGroups().size(); g++)
1644               {
1645                 jalview.datamodel.SequenceGroup sg
1646                     = (jalview.datamodel.SequenceGroup) al.getGroups().
1647                     elementAt(g);
1648
1649                 if (sg.cs == null)
1650                 {
1651                   continue;
1652                 }
1653
1654                 /*    if (view.getAnnotationColours().getColourScheme().equals("None"))
1655                     {
1656                       sg.cs = new AnnotationColourGradient(
1657                           af.viewport.alignment.getAlignmentAnnotation()[i],
1658                           new java.awt.Color(view.getAnnotationColours().
1659                                              getMinColour()),
1660                           new java.awt.Color(view.getAnnotationColours().
1661                                              getMaxColour()),
1662                           view.getAnnotationColours().getAboveThreshold());
1663                     }
1664                     else*/
1665                 {
1666                   sg.cs = new AnnotationColourGradient(
1667                       af.viewport.alignment.getAlignmentAnnotation()[i],
1668                       sg.cs,
1669                       view.getAnnotationColours().getAboveThreshold()
1670                       );
1671                 }
1672
1673               }
1674             }
1675
1676             break;
1677           }
1678
1679         }
1680       }
1681       else
1682       {
1683         cs = ColourSchemeProperty.getColour(al, view.getBgColour());
1684       }
1685
1686       if (cs != null)
1687       {
1688         cs.setThreshold(view.getPidThreshold(), true);
1689         cs.setConsensus(af.viewport.hconsensus);
1690       }
1691     }
1692
1693     af.viewport.setGlobalColourScheme(cs);
1694     af.viewport.setColourAppliesToAllGroups(false);
1695
1696     if (view.getConservationSelected() && cs != null)
1697     {
1698       cs.setConservationInc(view.getConsThreshold());
1699     }
1700
1701     af.changeColour(cs);
1702
1703     af.viewport.setColourAppliesToAllGroups(true);
1704
1705     if (view.getShowSequenceFeatures())
1706     {
1707       af.viewport.showSequenceFeatures = true;
1708     }
1709
1710     if (jms.getFeatureSettings() != null)
1711     {
1712       af.viewport.featuresDisplayed = new Hashtable();
1713       String[] renderOrder = new String[jms.getFeatureSettings().
1714           getSettingCount()];
1715       for (int fs = 0; fs < jms.getFeatureSettings().getSettingCount(); fs++)
1716       {
1717         Setting setting = jms.getFeatureSettings().getSetting(fs);
1718
1719         af.alignPanel.seqPanel.seqCanvas.getFeatureRenderer().setColour(setting.
1720             getType(),
1721             new java.awt.Color(setting.getColour()));
1722         renderOrder[fs] = setting.getType();
1723         if (setting.hasOrder())
1724           af.alignPanel.seqPanel.seqCanvas.getFeatureRenderer().setOrder(setting.getType(), setting.getOrder());
1725         else
1726           af.alignPanel.seqPanel.seqCanvas.getFeatureRenderer().setOrder(setting.getType(), fs/jms.getFeatureSettings().getSettingCount());
1727         if (setting.getDisplay())
1728         {
1729           af.viewport.featuresDisplayed.put(
1730               setting.getType(), new Integer(setting.getColour()));
1731         }
1732       }
1733       af.alignPanel.seqPanel.seqCanvas.getFeatureRenderer().renderOrder =
1734           renderOrder;
1735       Hashtable fgtable;
1736       af.alignPanel.seqPanel.seqCanvas.getFeatureRenderer().featureGroups = fgtable=new Hashtable();
1737       for (int gs=0;gs<jms.getFeatureSettings().getGroupCount(); gs++) 
1738       {
1739         Group grp = jms.getFeatureSettings().getGroup(gs);
1740         fgtable.put(grp.getName(), new Boolean(grp.getDisplay()));
1741       }
1742     }
1743     
1744     if (view.getHiddenColumnsCount() > 0)
1745     {
1746       for (int c = 0; c < view.getHiddenColumnsCount(); c++)
1747       {
1748         af.viewport.hideColumns(
1749             view.getHiddenColumns(c).getStart(),
1750             view.getHiddenColumns(c).getEnd() //+1
1751             );
1752       }
1753     }
1754
1755     af.setMenusFromViewport(af.viewport);
1756
1757     Desktop.addInternalFrame(af, view.getTitle(),
1758                              view.getWidth(), view.getHeight());
1759
1760     //LOAD TREES
1761     ///////////////////////////////////////
1762     if (loadTreesAndStructures && jms.getTreeCount() > 0)
1763     {
1764       try
1765       {
1766         for (int t = 0; t < jms.getTreeCount(); t++)
1767         {
1768
1769           Tree tree = jms.getTree(t);
1770
1771           TreePanel tp = af.ShowNewickTree(new jalview.io.NewickFile(
1772               tree.getNewick()), tree.getTitle(),
1773                                            tree.getWidth(), tree.getHeight(),
1774                                            tree.getXpos(), tree.getYpos());
1775
1776           tp.fitToWindow.setState(tree.getFitToWindow());
1777           tp.fitToWindow_actionPerformed(null);
1778
1779           if (tree.getFontName() != null)
1780           {
1781             tp.setTreeFont(new java.awt.Font(tree.getFontName(),
1782                                              tree.getFontStyle(),
1783                                              tree.getFontSize()));
1784           }
1785           else
1786           {
1787             tp.setTreeFont(new java.awt.Font(view.getFontName(),
1788                                              view.getFontStyle(),
1789                                              tree.getFontSize()));
1790           }
1791
1792           tp.showPlaceholders(tree.getMarkUnlinked());
1793           tp.showBootstrap(tree.getShowBootstrap());
1794           tp.showDistances(tree.getShowDistances());
1795
1796           tp.treeCanvas.threshold = tree.getThreshold();
1797
1798           if (tree.getCurrentTree())
1799           {
1800             af.viewport.setCurrentTree(tp.getTree());
1801           }
1802         }
1803
1804       }
1805       catch (Exception ex)
1806       {
1807         ex.printStackTrace();
1808       }
1809     }
1810
1811     ////LOAD STRUCTURES
1812     if(loadTreesAndStructures)
1813     {
1814       for (int i = 0; i < JSEQ.length; i++)
1815       {
1816         if (JSEQ[i].getPdbidsCount() > 0)
1817         {
1818           Pdbids[] ids = JSEQ[i].getPdbids();
1819           for (int p = 0; p < ids.length; p++)
1820           {
1821             for (int s = 0; s < ids[p].getStructureStateCount(); s++)
1822             {
1823               jalview.datamodel.PDBEntry jpdb = new jalview.datamodel.PDBEntry();
1824
1825               jpdb.setFile(loadPDBFile(ids[p].getFile(), ids[p].getId()));
1826               jpdb.setId(ids[p].getId());
1827
1828               int x = ids[p].getStructureState(s).getXpos();
1829               int y = ids[p].getStructureState(s).getYpos();
1830               int width = ids[p].getStructureState(s).getWidth();
1831               int height = ids[p].getStructureState(s).getHeight();
1832
1833               java.awt.Component comp = Desktop.desktop.getComponentAt(x, y);
1834
1835               String pdbFile = loadPDBFile(file, ids[p].getId());
1836
1837               jalview.datamodel.SequenceI[] seq = new jalview.datamodel.SequenceI[]
1838                   {
1839                   al.getSequenceAt(i)};
1840
1841               if (comp == null ||
1842                   (comp.getWidth() != width && comp.getHeight() != height))
1843               {
1844                 String state = ids[p].getStructureState(s).getContent();
1845
1846                 StringBuffer newFileLoc = new StringBuffer(state.substring(0,
1847                     state.indexOf("\"", state.indexOf("load")) + 1));
1848
1849                 newFileLoc.append(jpdb.getFile());
1850                 newFileLoc.append(state.substring(
1851                     state.indexOf("\"", state.indexOf("load \"") + 6)));
1852
1853                 new AppJMol(pdbFile,
1854                             ids[p].getId(),
1855                             seq,
1856                             af.alignPanel,
1857                             newFileLoc.toString(),
1858                             new java.awt.Rectangle(x, y, width, height));
1859
1860               }
1861               else if(comp!=null)
1862               {
1863                 StructureSelectionManager.getStructureSelectionManager()
1864                     .setMapping(seq, pdbFile,
1865                                 jalview.io.AppletFormatAdapter.FILE);
1866
1867                 ( (AppJMol) comp).addSequence(seq);
1868               }
1869             }
1870           }
1871         }
1872       }
1873     }
1874
1875     return af;
1876   }
1877
1878   public jalview.gui.AlignmentPanel copyAlignPanel(AlignmentPanel ap,
1879       boolean keepSeqRefs)
1880   {
1881     jalview.schemabinding.version2.JalviewModel jm
1882         = SaveState(ap, null, null, null);
1883
1884     if (!keepSeqRefs)
1885     {
1886       seqRefIds.clear();
1887       jm.getJalviewModelSequence().getViewport(0).setSequenceSetId(null);
1888     }
1889     else
1890     {
1891       uniqueSetSuffix = "";
1892     }
1893
1894     viewportsAdded = new Hashtable();
1895
1896     AlignFrame af = LoadFromObject(jm, null, false);
1897     af.alignPanels.clear();
1898     af.closeMenuItem_actionPerformed(true);
1899
1900     /*  if(ap.av.alignment.getAlignmentAnnotation()!=null)
1901       {
1902         for(int i=0; i<ap.av.alignment.getAlignmentAnnotation().length; i++)
1903         {
1904           if(!ap.av.alignment.getAlignmentAnnotation()[i].autoCalculated)
1905           {
1906             af.alignPanel.av.alignment.getAlignmentAnnotation()[i] =
1907                 ap.av.alignment.getAlignmentAnnotation()[i];
1908           }
1909         }
1910       }   */
1911
1912     return af.alignPanel;
1913   }
1914 }