X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;f=src%2Fjalview%2Fgui%2FJalview2XML.java;h=a9763d3ae34dd7a69b1e98cf98171bc876434f84;hb=2e699d341f8e64868e3c279f9c02af617c4e9b44;hp=8cf676d9e0cb8bacf805f8ec3045cc1ec462b11c;hpb=9a87f772b999bac0c81d858fffcdbc4a619ab508;p=jalview.git diff --git a/src/jalview/gui/Jalview2XML.java b/src/jalview/gui/Jalview2XML.java index 8cf676d..a9763d3 100755 --- a/src/jalview/gui/Jalview2XML.java +++ b/src/jalview/gui/Jalview2XML.java @@ -48,10 +48,22 @@ import jalview.schemabinding.version2.*; */ public class Jalview2XML { - // SAVES SEVERAL ALIGNEMENT WINDOWS TO SAME JARFILE + + Hashtable seqRefIds; + + /** + * This maintains a list of viewports, the key being the + * seqSetId. Important to set historyItem and redoList + * for multiple views + */ + Hashtable viewportsAdded; + + String uniqueSetSuffix = ""; + + + // SAVES SEVERAL ALIGNMENT WINDOWS TO SAME JARFILE public void SaveState(File statefile) { - long creation = System.currentTimeMillis(); JInternalFrame[] frames = Desktop.desktop.getAllFrames(); if (frames == null) @@ -107,7 +119,16 @@ public class Jalview2XML shortName = shortName + ".xml"; } - SaveState(af, creation, shortName, jout, out); + int ap, apSize= af.alignPanels.size(); + for (ap = 0; ap < apSize; ap++) + { + AlignmentPanel apanel = (AlignmentPanel) af.alignPanels. + elementAt(ap); + + SaveState(apanel, + apSize == 1 ? shortName : ap+shortName, + jout, out); + } } } @@ -121,26 +142,33 @@ public class Jalview2XML } // USE THIS METHOD TO SAVE A SINGLE ALIGNMENT WINDOW - public void SaveAlignment(AlignFrame af, String jarFile, + public boolean SaveAlignment(AlignFrame af, String jarFile, String fileName) { try { - FileOutputStream fos = new FileOutputStream(jarFile); - JarOutputStream jout = new JarOutputStream(fos); + int ap, apSize= af.alignPanels.size(); + FileOutputStream fos = new FileOutputStream(jarFile); + JarOutputStream jout = new JarOutputStream(fos); + PrintWriter out = new PrintWriter(new OutputStreamWriter(jout, + "UTF-8")); + for( ap=0; ap 24) + { + newColours = new java.awt.Color[23]; + for (int i = 0; i < 23; i++) + { + newColours[i] = new java.awt.Color(Integer.parseInt( + colours.getUserColourScheme().getColour(i+24).getRGB(), 16)); + } + ucs.setLowerCaseColours(newColours); + } + + return ucs; } + /** * DOCUMENT ME! * @@ -767,7 +865,15 @@ public class Jalview2XML */ public AlignFrame LoadJalviewAlign(final String file) { + uniqueSetSuffix = System.currentTimeMillis()%100000 +""; + jalview.gui.AlignFrame af = null; + + seqRefIds = new Hashtable(); + viewportsAdded = new Hashtable(); + + Vector gatherToThisFrame= new Vector(); + try { //UNMARSHALLER SEEMS TO CLOSE JARINPUTSTREAM, MOST ANNOYING @@ -807,7 +913,11 @@ public class Jalview2XML unmar.setValidation(false); object = (JalviewModel) unmar.unmarshal( in ); - af = LoadFromObject(object, file); + af = LoadFromObject(object, file, true); + if(af.viewport.gatherViewsHere) + { + gatherToThisFrame.add(af); + } entryCount++; } else if (jarentry != null) @@ -837,7 +947,6 @@ public class Jalview2XML } catch (Exception ex) { - //Is Version 1 Jar file? af = new Jalview2XML_V1().LoadJalviewAlign(file); @@ -846,7 +955,7 @@ public class Jalview2XML System.out.println("Successfully loaded archive file"); return af; } - ex.printStackTrace(); + System.err.println("Exception whilst loading jalview XML file : " + ex + "\n"); javax.swing.SwingUtilities.invokeLater(new Runnable() @@ -861,12 +970,21 @@ public class Jalview2XML }}); } + if (Desktop.instance != null) + Desktop.instance.stopLoading(); + + for (int i = 0; i < gatherToThisFrame.size(); i++) + { + Desktop.instance.gatherViews( + (AlignFrame) gatherToThisFrame.elementAt(i)); + } + return af; } String loadPDBFile(String file, String pdbId) { - System.out.println("load file "+file); + System.out.println(file +" "+pdbId); try { JarInputStream jin = null; @@ -910,114 +1028,152 @@ public class Jalview2XML } - AlignFrame LoadFromObject(JalviewModel object, String file) + AlignFrame LoadFromObject(JalviewModel object, + String file, + boolean loadTrees ) { - Vector seqids = new Vector(); SequenceSet vamsasSet = object.getVamsasModel().getSequenceSet(0); Sequence[] vamsasSeq = vamsasSet.getSequence(); JalviewModelSequence jms = object.getJalviewModelSequence(); + Viewport view = jms.getViewport(0); + ////////////////////////////////// //LOAD SEQUENCES + Vector hiddenSeqs = null; - jalview.datamodel.Sequence[] jseqs = new jalview.datamodel.Sequence[vamsasSeq.length]; + jalview.datamodel.Sequence jseq; + + ArrayList tmpseqs = new ArrayList(); + + boolean multipleView = false; + JSeq[] JSEQ = object.getJalviewModelSequence().getJSeq(); - for (int i = 0; i < vamsasSeq.length; i++) + for (int i = 0; i < JSEQ.length; i++) { - jseqs[i] = new jalview.datamodel.Sequence(vamsasSeq[i].getName(), - vamsasSeq[i].getSequence()); - jseqs[i].setDescription( vamsasSeq[i].getDescription() ); + String seqId = JSEQ[i].getId() + ""; + + if (seqRefIds.get(seqId) != null) + { + tmpseqs.add( (jalview.datamodel.Sequence) seqRefIds.get(seqId)); + multipleView = true; + } + else + { + jseq = new jalview.datamodel.Sequence(vamsasSeq[i].getName(), + vamsasSeq[i].getSequence()); + jseq.setDescription(vamsasSeq[i].getDescription()); + jseq.setStart(JSEQ[i].getStart()); + jseq.setEnd(JSEQ[i].getEnd()); + seqRefIds.put(vamsasSeq[i].getId(), jseq); + tmpseqs.add( jseq ); + } + + + + if (JSEQ[i].getHidden()) + { + if (hiddenSeqs == null) + hiddenSeqs = new Vector(); + + + hiddenSeqs.addElement( + (jalview.datamodel.Sequence) seqRefIds.get(seqId)); + } - if(JSEQ[i].getHidden()) - { - if(hiddenSeqs == null) - hiddenSeqs = new Vector(); - hiddenSeqs.addElement(jseqs[i]); - } - jseqs[i].setStart(JSEQ[i].getStart()); - jseqs[i].setEnd(JSEQ[i].getEnd()); - jseqs[i].setColor(new java.awt.Color(JSEQ[i].getColour())); - seqids.add(jseqs[i]); } ///SequenceFeatures are added to the DatasetSequence, // so we must create the dataset before loading features ///////////////////////////////// - jalview.datamodel.Alignment al = new jalview.datamodel.Alignment(jseqs); + + + jalview.datamodel.Sequence[] orderedSeqs = new jalview.datamodel.Sequence[ + tmpseqs.size()]; + + tmpseqs.toArray(orderedSeqs) ; + + + jalview.datamodel.Alignment al = + new jalview.datamodel.Alignment(orderedSeqs); + al.setDataset(null); ///////////////////////////////// Hashtable pdbloaded = new Hashtable(); - for (int i = 0; i < vamsasSeq.length; i++) + if(!multipleView) { - if (JSEQ[i].getFeaturesCount() > 0) + for (int i = 0; i < vamsasSeq.length; i++) { - Features[] features = JSEQ[i].getFeatures(); - for (int f = 0; f < features.length; f++) + if (JSEQ[i].getFeaturesCount() > 0) { - jalview.datamodel.SequenceFeature sf - = new jalview.datamodel.SequenceFeature(features[f].getType(), - features[f].getDescription(), features[f].getStatus(), - features[f].getBegin(), features[f].getEnd(), - features[f].getFeatureGroup()); - - sf.setScore(features[f].getScore()); - for(int od=0; od 0) - { - Pdbids[] ids = JSEQ[i].getPdbids(); - for (int p = 0; p < ids.length; p++) + if (JSEQ[i].getPdbidsCount() > 0) { - jalview.datamodel.PDBEntry entry = new jalview.datamodel.PDBEntry(); - entry.setId(ids[p].getId()); - entry.setType(ids[p].getType()); - if (ids[p].getFile() != null) + Pdbids[] ids = JSEQ[i].getPdbids(); + for (int p = 0; p < ids.length; p++) { - if (!pdbloaded.containsKey(ids[p].getFile())) + jalview.datamodel.PDBEntry entry = new jalview.datamodel. + PDBEntry(); + entry.setId(ids[p].getId()); + entry.setType(ids[p].getType()); + if (ids[p].getFile() != null) { - String tmppdb = loadPDBFile(file, ids[p].getId()); - entry.setFile(tmppdb); - pdbloaded.put(ids[p].getId(), tmppdb); + if (!pdbloaded.containsKey(ids[p].getFile())) + { + String tmppdb = loadPDBFile(file, ids[p].getId()); + entry.setFile(tmppdb); + pdbloaded.put(ids[p].getId(), tmppdb); + } + else + entry.setFile(pdbloaded.get(ids[p].getId()).toString()); } - else - entry.setFile(pdbloaded.get(ids[p].getId()).toString()); - } - al.getSequenceAt(i).getDatasetSequence().addPDBId(entry); + al.getSequenceAt(i).getDatasetSequence().addPDBId(entry); + } } - } - if(vamsasSeq[i].getDBRefCount()>0) - { - for(int d=0; d 0) { - jalview.datamodel.DBRefEntry entry = - new jalview.datamodel.DBRefEntry( - vamsasSeq[i].getDBRef(d).getSource(), - vamsasSeq[i].getDBRef(d).getVersion(), - vamsasSeq[i].getDBRef(d).getAccessionId() - ); - al.getSequenceAt(i).getDatasetSequence().addDBRef(entry); - } + for (int d = 0; d < vamsasSeq[i].getDBRefCount(); d++) + { + jalview.datamodel.DBRefEntry entry = + new jalview.datamodel.DBRefEntry( + vamsasSeq[i].getDBRef(d).getSource(), + vamsasSeq[i].getDBRef(d).getVersion(), + vamsasSeq[i].getDBRef(d).getAccessionId() + ); + al.getSequenceAt(i).getDatasetSequence().addDBRef(entry); + } + } } } - ///////////////////////////////// ////////////////////////////////// //LOAD ANNOTATIONS @@ -1025,7 +1181,7 @@ public class Jalview2XML hideConservation = true, hideConsensus = true; - if (vamsasSet.getAnnotation() != null) + if (vamsasSet.getAnnotationCount()>0) { Annotation[] an = vamsasSet.getAnnotation(); @@ -1089,7 +1245,7 @@ public class Jalview2XML if(an[i].getSequenceRef()!=null) { jaa.createSequenceMapping( - al.findName(an[i].getSequenceRef()), 1 + al.findName(an[i].getSequenceRef()), 1, true ); al.findName(an[i].getSequenceRef()).addAlignmentAnnotation(jaa); } @@ -1098,8 +1254,6 @@ public class Jalview2XML } } - - // af.changeColour() ); ///////////////////////// //LOAD GROUPS if (jms.getJGroupCount() > 0) @@ -1127,12 +1281,11 @@ public class Jalview2XML } Vector seqs = new Vector(); - int[] ids = groups[i].getSeq(); - for (int s = 0; s < ids.length; s++) + for (int s = 0; s < groups[i].getSeqCount(); s++) { - seqs.addElement((jalview.datamodel.SequenceI) seqids.elementAt( - ids[s])); + String seqId = groups[i].getSeq(s)+""; + seqs.addElement((jalview.datamodel.SequenceI) seqRefIds.get(seqId)); } jalview.datamodel.SequenceGroup sg = new jalview.datamodel.SequenceGroup(seqs, @@ -1143,6 +1296,10 @@ public class Jalview2XML sg.setOutlineColour(new java.awt.Color( groups[i].getOutlineColour())); + sg.textColour = new java.awt.Color(groups[i].getTextCol1()); + sg.textColour2 = new java.awt.Color(groups[i].getTextCol2()); + sg.thresholdTextColour = groups[i].getTextColThreshold(); + if (groups[i].getConsThreshold() != 0) { jalview.analysis.Conservation c = new jalview.analysis.Conservation("All", @@ -1160,12 +1317,49 @@ public class Jalview2XML ///////////////////////////////// // LOAD VIEWPORT - Viewport[] views = jms.getViewport(); - Viewport view = views[0]; // DEAL WITH MULTIPLE VIEWPORTS LATER + AlignFrame af = new AlignFrame(al, + view.getWidth(), + view.getHeight() ); + + af.setFileName(file, "Jalview"); + + for (int i = 0; i < JSEQ.length; i++) + { + af.viewport.setSequenceColour( + af.viewport.alignment.getSequenceAt(i), + new java.awt.Color( + JSEQ[i].getColour())); + } + + //If we just load in the same jar file again, the sequenceSetId + //will be the same, and we end up with multiple references + //to the same sequenceSet. We must modify this id on load + //so that each load of the file gives a unique id + String uniqueSeqSetId = view.getSequenceSetId()+uniqueSetSuffix; + + af.viewport.gatherViewsHere = view.getGatheredViews(); + + if (view.getSequenceSetId() != null) + { + jalview.gui.AlignViewport av = + (jalview.gui.AlignViewport) + viewportsAdded.get(uniqueSeqSetId); + + af.viewport.sequenceSetID = uniqueSeqSetId; + if(av!=null) + { - AlignFrame af = new AlignFrame(al); + af.viewport.historyList = av.historyList; + af.viewport.redoList = av.redoList; + } + else + { + viewportsAdded.put(uniqueSeqSetId, af.viewport); + } + PaintRefresher.Register(af.alignPanel, uniqueSeqSetId); + } if(hiddenSeqs!=null) { for(int s=0; s 0) + if (loadTrees && jms.getTreeCount() > 0) { try { @@ -1458,5 +1658,27 @@ public class Jalview2XML return af; } + + public jalview.gui.AlignmentPanel copyAlignPanel(AlignmentPanel ap, boolean keepSeqRefs ) + { + jalview.schemabinding.version2.JalviewModel jm + = SaveState(ap, null, null, null); + + if (!keepSeqRefs) + { + seqRefIds.clear(); + jm.getJalviewModelSequence().getViewport(0).setSequenceSetId(null); + } + else + uniqueSetSuffix = ""; + + viewportsAdded = new Hashtable(); + + AlignFrame af = LoadFromObject(jm, null, false); + af.alignPanels.clear(); + af.closeMenuItem_actionPerformed(true); + + return af.alignPanel; + } }