Use Jalview2XML to copy AlignmentPanel
authoramwaterhouse <Andrew Waterhouse>
Fri, 3 Nov 2006 14:26:13 +0000 (14:26 +0000)
committeramwaterhouse <Andrew Waterhouse>
Fri, 3 Nov 2006 14:26:13 +0000 (14:26 +0000)
src/jalview/gui/AlignFrame.java
src/jalview/gui/Jalview2XML.java

index 7ef0e25..4641fdb 100755 (executable)
@@ -166,33 +166,21 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener
             case KeyEvent.VK_V:
               if (!evt.isControlDown())
               {
-                AlignmentI al;
-                if(viewport.hasHiddenRows)
-                {
-                  al = viewport.alignment.getHiddenSequences().getFullAlignment();
-                }
-                else
-                  al = new Alignment(viewport.alignment.getSequencesArray());
-
-                AlignViewport newview = new AlignViewport(al);
+                AlignmentPanel newap =
+                    new Jalview2XML().copyAlignPanel(alignPanel, true);
 
                 if(viewport.viewName==null)
                   viewport.viewName="View 1";
 
-                newview.historyList = viewport.historyList;
-                newview.redoList = viewport.redoList;
-
-                newview.sequenceSetID = viewport.getSequenceSetId();
-                newview.viewName = "View " +
+                newap.av.historyList = viewport.historyList;
+                newap.av.redoList = viewport.redoList;
+                newap.av.viewName = "View " +
                     (Desktop.getViewCount(viewport.getSequenceSetId())+1);
 
-                AlignmentPanel newap = new AlignmentPanel(af, newview);
-
-                PaintRefresher.Register(newap, viewport.getSequenceSetId());
-                PaintRefresher.Register(alignPanel, viewport.getSequenceSetId());
-
                 addAlignmentPanel(newap, true);
+
                 tabbedPane.setSelectedIndex(tabbedPane.getTabCount()-1);
+
               }
               break;
             case KeyEvent.VK_G:
index f188e31..1e449cc 100755 (executable)
@@ -48,6 +48,19 @@ import jalview.schemabinding.version2.*;
  */
 public class Jalview2XML
 {
+
+  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)
     {
@@ -112,9 +125,6 @@ public class Jalview2XML
                       AlignmentPanel apanel = (AlignmentPanel) af.alignPanels.
                           elementAt(ap);
 
-                      if (apanel.av.explodedPosition == null)
-                        apanel.av.explodedPosition = af.getBounds();
-
                       SaveState(apanel,
                                 apSize == 1 ? shortName : ap+shortName,
                                 jout, out);
@@ -146,9 +156,6 @@ public class Jalview2XML
           {
             AlignmentPanel apanel = (AlignmentPanel)af.alignPanels.elementAt(ap);
 
-            if (apanel.av.explodedPosition == null)
-              apanel.av.explodedPosition = af.getBounds();
-
             SaveState(apanel,
                       apSize==1?fileName:fileName+ap,
                       jout, out);
@@ -172,7 +179,7 @@ public class Jalview2XML
      * @param jout DOCUMENT ME!
      * @param out DOCUMENT ME!
      */
-    public void SaveState(AlignmentPanel ap,
+    public JalviewModel SaveState(AlignmentPanel ap,
                           String fileName,
                           JarOutputStream jout,
                           PrintWriter out)
@@ -240,7 +247,7 @@ public class Jalview2XML
               }
 
               vamsasSet.addSequence(vamsasSeq);
-              seqRefIds.put(id+"", vamsasSeq);
+              seqRefIds.put(id+"", jal.getSequenceAt(i));
             }
 
             jseq = new JSeq();
@@ -581,10 +588,22 @@ public class Jalview2XML
         view.setViewName(av.viewName);
         view.setGatheredViews(av.gatherViewsHere);
 
-        view.setXpos(av.explodedPosition.x);
-        view.setYpos(av.explodedPosition.y);
-        view.setWidth(av.explodedPosition.width);
-        view.setHeight(av.explodedPosition.height);
+
+        if (ap.av.explodedPosition != null)
+        {
+          view.setXpos(av.explodedPosition.x);
+          view.setYpos(av.explodedPosition.y);
+          view.setWidth(av.explodedPosition.width);
+          view.setHeight(av.explodedPosition.height);
+        }
+        else
+        {
+          view.setXpos(ap.alignFrame.getBounds().x);
+          view.setYpos(ap.alignFrame.getBounds().y);
+          view.setWidth(ap.alignFrame.getBounds().width);
+          view.setHeight(ap.alignFrame.getBounds().height);
+        }
+
         view.setStartRes(av.startRes);
         view.setStartSeq(av.startSeq);
 
@@ -718,22 +737,29 @@ public class Jalview2XML
         object.setJalviewModelSequence(jms);
         object.getVamsasModel().addSequenceSet(vamsasSet);
 
-        try
+        if(out!=null)
         {
+          //We may not want to right the object to disk,
+          //eg we can copy the alignViewport to a new view object
+          //using save and then load
+          try
+          {
             if (!fileName.endsWith(".xml"))
             {
-                fileName = fileName + ".xml";
+              fileName = fileName + ".xml";
             }
 
             JarEntry entry = new JarEntry(fileName);
             jout.putNextEntry(entry);
 
             object.marshal(out);
-        }
-        catch (Exception ex)
-        {
+          }
+          catch (Exception ex)
+          {
             ex.printStackTrace();
+          }
         }
+        return object;
     }
 
     String SetUserColourScheme(jalview.schemes.ColourSchemeI cs,
@@ -819,14 +845,6 @@ public class Jalview2XML
         return ucs;
     }
 
-    Hashtable seqRefIds;
-
-    /**
-     * This maintains a list of viewports, the key being the
-     * seqSetId. Important to set historyItem and redoList
-     * for multiple views
-     */
-    Hashtable viewportsAdded;
 
     /**
      * DOCUMENT ME!
@@ -835,6 +853,8 @@ public class Jalview2XML
      */
     public AlignFrame LoadJalviewAlign(final String file)
     {
+        uniqueSetSuffix = System.currentTimeMillis()%100000 +"";
+
         jalview.gui.AlignFrame af = null;
 
         seqRefIds = new Hashtable();
@@ -1284,7 +1304,12 @@ public class Jalview2XML
                                        view.getWidth(),
                                        view.getHeight() );
 
-        af.viewport.sequenceSetID = view.getSequenceSetId();
+
+        //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();
 
@@ -1292,19 +1317,21 @@ public class Jalview2XML
         {
           jalview.gui.AlignViewport av =
               (jalview.gui.AlignViewport)
-              viewportsAdded.get(view.getSequenceSetId());
+              viewportsAdded.get(uniqueSeqSetId);
 
+          af.viewport.sequenceSetID = uniqueSeqSetId;
           if(av!=null)
           {
+
             af.viewport.historyList = av.historyList;
             af.viewport.redoList = av.redoList;
           }
           else
           {
-            viewportsAdded.put(view.getSequenceSetId(), af.viewport);
+            viewportsAdded.put(uniqueSeqSetId, af.viewport);
           }
 
-          PaintRefresher.Register(af.alignPanel, view.getSequenceSetId());
+          PaintRefresher.Register(af.alignPanel, uniqueSeqSetId);
         }
         if(hiddenSeqs!=null)
         {
@@ -1594,5 +1621,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);
+      af.alignPanels.clear();
+      af.closeMenuItem_actionPerformed(null);
+
+      return af.alignPanel;
+    }
 }