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