Merge branch 'feature/JAL-3063JAXB' into features/pca_jaxb_datasetrefs_JAL-3171_JAL...
[jalview.git] / src / jalview / gui / Jalview2XML.java
index 689261c..7f07a20 100644 (file)
@@ -194,6 +194,12 @@ public class Jalview2XML
 
   private static final String UTF_8 = "UTF-8";
 
+  /**
+   * prefix for recovering datasets for alignments with multiple views where
+   * non-existent dataset IDs were written for some views
+   */
+  private static final String UNIQSEQSETID = "uniqueSeqSetId.";
+
   // use this with nextCounter() to make unique names for entities
   private int counter = 0;
 
@@ -1127,13 +1133,13 @@ public class Jalview2XML
           {
             TreePanel tp = (TreePanel) frames[t];
 
-            if (tp.treeCanvas.av.getAlignment() == jal)
+            if (tp.getTreeCanvas().getViewport().getAlignment() == jal)
             {
               Tree tree = new Tree();
               tree.setTitle(tp.getTitle());
               tree.setCurrentTree((av.getCurrentTree() == tp.getTree()));
               tree.setNewick(tp.getTree().print());
-              tree.setThreshold(tp.treeCanvas.threshold);
+              tree.setThreshold(tp.getTreeCanvas().getThreshold());
 
               tree.setFitToWindow(tp.fitToWindow.getState());
               tree.setFontName(tp.getTreeFont().getName());
@@ -1149,7 +1155,7 @@ public class Jalview2XML
               tree.setXpos(tp.getX());
               tree.setYpos(tp.getY());
               tree.setId(makeHashCode(tp, null));
-              tree.setLinkToAllViews(tp.treeCanvas.applyToAllViews);
+              tree.setLinkToAllViews(tp.getTreeCanvas().applyToAllViews);
               jms.addTree(tree);
             }
           }
@@ -1291,7 +1297,7 @@ public class Jalview2XML
       {
         view.setComplementId(av.getCodingComplement().getViewId());
       }
-      view.setViewName(av.viewName);
+      view.setViewName(av.getViewName());
       view.setGatheredViews(av.isGatherViewsHere());
 
       Rectangle size = ap.av.getExplodedGeometry();
@@ -1564,27 +1570,27 @@ public class Jalview2XML
       viewer.setXpos(panel.getX());
       viewer.setYpos(panel.getY());
       viewer.setTitle(panel.getTitle());
-      PCAModel pcaModel = panel.pcaModel;
+      PCAModel pcaModel = panel.getPcaModel();
       viewer.setScoreModelName(pcaModel.getScoreModelName());
       viewer.setXDim(panel.getSelectedDimensionIndex(X));
       viewer.setYDim(panel.getSelectedDimensionIndex(Y));
       viewer.setZDim(panel.getSelectedDimensionIndex(Z));
-      viewer.setBgColour(panel.rc.getBackgroundColour().getRGB());
-      viewer.setScaleFactor(panel.rc.scaleFactor);
-      float[] spMin = panel.rc.getSeqMin();
+      viewer.setBgColour(panel.getRotatableCanvas().getBackgroundColour().getRGB());
+      viewer.setScaleFactor(panel.getRotatableCanvas().getScaleFactor());
+      float[] spMin = panel.getRotatableCanvas().getSeqMin();
       SeqPointMin spmin = new SeqPointMin();
       spmin.setXPos(spMin[0]);
       spmin.setYPos(spMin[1]);
       spmin.setZPos(spMin[2]);
       viewer.setSeqPointMin(spmin);
-      float[] spMax = panel.rc.getSeqMax();
+      float[] spMax = panel.getRotatableCanvas().getSeqMax();
       SeqPointMax spmax = new SeqPointMax();
       spmax.setXPos(spMax[0]);
       spmax.setYPos(spMax[1]);
       spmax.setZPos(spMax[2]);
       viewer.setSeqPointMax(spmax);
-      viewer.setShowLabels(panel.rc.showLabels);
-      viewer.setLinkToAllViews(panel.rc.applyToAllViews);
+      viewer.setShowLabels(panel.getRotatableCanvas().isShowLabels());
+      viewer.setLinkToAllViews(panel.getRotatableCanvas().isApplyToAllViews());
       SimilarityParamsI sp = pcaModel.getSimilarityParameters();
       viewer.setIncludeGaps(sp.includeGaps());
       viewer.setMatchGaps(sp.matchGaps());
@@ -1608,7 +1614,7 @@ public class Jalview2XML
       /*
        * (end points of) axes on display
        */
-      for (Point p : panel.rc.axisEndPoints)
+      for (Point p : panel.getRotatableCanvas().getAxisEndPoints())
       {
         Axis axis = new Axis();
         axis.setXPos(p.x);
@@ -3071,6 +3077,28 @@ public class Jalview2XML
             : null;
 
     // ////////////////////////////////
+    // INITIALISE ALIGNMENT SEQUENCESETID AND VIEWID
+    //
+    //
+    // 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
+
+    /**
+     * used to resolve correct alignment dataset for alignments with multiple
+     * views
+     */
+    String uniqueSeqSetId = null;
+    String viewId = null;
+    if (view != null)
+    {
+      uniqueSeqSetId = view.getSequenceSetId() + uniqueSetSuffix;
+      viewId = (view.getId() == null ? null
+              : view.getId() + uniqueSetSuffix);
+    }
+
+    // ////////////////////////////////
     // LOAD SEQUENCES
 
     List<SequenceI> hiddenSeqs = null;
@@ -3188,7 +3216,7 @@ public class Jalview2XML
 
       // finally, verify all data in vamsasSet is actually present in al
       // passing on flag indicating if it is actually a stored dataset
-      recoverDatasetFor(vamsasSet, al, isdsal);
+      recoverDatasetFor(vamsasSet, al, isdsal, uniqueSeqSetId);
     }
 
     if (referenceseqForView != null)
@@ -3736,13 +3764,6 @@ public class Jalview2XML
     // ///////////////////////////////
     // LOAD VIEWPORT
 
-    // 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;
-    String viewId = (view.getId() == null ? null
-            : view.getId() + uniqueSetSuffix);
     AlignFrame af = null;
     AlignViewport av = null;
     // now check to see if we really need to create a new viewport.
@@ -3967,10 +3988,11 @@ public class Jalview2XML
           tp.setTitle(tree.getTitle());
           tp.setBounds(new Rectangle(tree.getXpos(), tree.getYpos(),
                   tree.getWidth(), tree.getHeight()));
-          tp.av = av;
-          tp.treeCanvas.av = av; // af.viewport;
-          tp.treeCanvas.ap = ap; // af.alignPanel;
-
+          tp.setViewport(av); // af.viewport; // TODO: verify 'associate with all
+          // views'
+          // works still
+          tp.getTreeCanvas().setViewport(av); // af.viewport;
+          tp.getTreeCanvas().setAssociatedPanel(ap); // af.alignPanel;
         }
         if (tp == null)
         {
@@ -3997,8 +4019,8 @@ public class Jalview2XML
         tp.showBootstrap(tree.getShowBootstrap());
         tp.showDistances(tree.getShowDistances());
 
-        tp.treeCanvas.threshold = tree.getThreshold();
-        tp.treeCanvas.applyToAllViews = tree.isLinkToAllViews();
+        tp.getTreeCanvas().setThreshold(tree.getThreshold());
+        tp.getTreeCanvas().applyToAllViews = tree.isLinkToAllViews();
 
         if (tree.getCurrentTree())
         {
@@ -4731,7 +4753,7 @@ public class Jalview2XML
 
     if (view.getViewName() != null)
     {
-      af.viewport.viewName = view.getViewName();
+      af.viewport.setViewName(view.getViewName());
       af.setInitialTabVisible();
     }
     af.setBounds(view.getXpos(), view.getYpos(), view.getWidth(),
@@ -5286,13 +5308,25 @@ public class Jalview2XML
   }
 
   private void recoverDatasetFor(SequenceSet vamsasSet, AlignmentI al,
-          boolean ignoreUnrefed)
+          boolean ignoreUnrefed, String uniqueSeqSetId)
   {
     jalview.datamodel.AlignmentI ds = getDatasetFor(
             vamsasSet.getDatasetId());
     Vector dseqs = null;
     if (ds == null)
     {
+      if (!ignoreUnrefed)
+      {
+        // try to resolve the dataset via uniqueSeqSetId
+        ds = getDatasetFor(UNIQSEQSETID + uniqueSeqSetId);
+        if (ds != null)
+        {
+          addDatasetRef(vamsasSet.getDatasetId(), ds);
+        }
+      }
+    }
+    if (ds == null)
+    {
       // create a list of new dataset sequences
       dseqs = new Vector();
     }
@@ -5315,6 +5349,8 @@ public class Jalview2XML
     if (al.getDataset() == null && !ignoreUnrefed)
     {
       al.setDataset(ds);
+      // register dataset for the alignment's uniqueSeqSetId for legacy projects
+      addDatasetRef(UNIQSEQSETID + uniqueSeqSetId, ds);
     }
   }
 
@@ -5656,6 +5692,9 @@ public class Jalview2XML
     initSeqRefs();
     JalviewModel jm = saveState(ap, null, null, null);
 
+    addDatasetRef(jm.getVamsasModel().getSequenceSet()[0].getDatasetId(),
+            ap.getAlignment().getDataset());
+
     uniqueSetSuffix = "";
     jm.getJalviewModelSequence().getViewport(0).setId(null);
     // we don't overwrite the view we just copied
@@ -5945,9 +5984,9 @@ public class Jalview2XML
   
         boolean showLabels = viewer.isShowLabels();
         panel.setShowLabels(showLabels);
-        panel.rc.showLabels = showLabels;
-        panel.rc.bgColour = new Color(viewer.getBgColour());
-        panel.rc.applyToAllViews = viewer.isLinkToAllViews();
+        panel.getRotatableCanvas().setShowLabels(showLabels);
+        panel.getRotatableCanvas().setBgColour(new Color(viewer.getBgColour()));
+        panel.getRotatableCanvas().setApplyToAllViews(viewer.isLinkToAllViews());
 
         /*
          * load PCA output data
@@ -5966,7 +6005,7 @@ public class Jalview2XML
         MatrixI result = loadDoubleMatrix(pcaData.getEigenMatrix());
         pca.setEigenmatrix(result);
 
-        panel.pcaModel.setPCA(pca);
+        panel.getPcaModel().setPCA(pca);
 
         /*
          * we haven't saved the input data! (JAL-2647 to do)
@@ -5991,30 +6030,30 @@ public class Jalview2XML
                   seq, pt);
           seqPoints.add(seqPoint);
         }
-        panel.rc.setPoints(seqPoints, seqPoints.size());
+        panel.getRotatableCanvas().setPoints(seqPoints, seqPoints.size());
 
         /*
          * set min-max ranges and scale after setPoints (which recomputes them)
          */
-        panel.rc.scaleFactor = viewer.getScaleFactor();
+        panel.getRotatableCanvas().setScaleFactor(viewer.getScaleFactor());
         SeqPointMin spMin = viewer.getSeqPointMin();
         float[] min = new float[] { spMin.getXPos(), spMin.getYPos(),
             spMin.getZPos() };
         SeqPointMax spMax = viewer.getSeqPointMax();
         float[] max = new float[] { spMax.getXPos(), spMax.getYPos(),
             spMax.getZPos() };
-        panel.rc.setSeqMinMax(min, max);
+        panel.getRotatableCanvas().setSeqMinMax(min, max);
 
         // todo: hold points list in PCAModel only
-        panel.pcaModel.setSequencePoints(seqPoints);
+        panel.getPcaModel().setSequencePoints(seqPoints);
 
         panel.setSelectedDimensionIndex(viewer.getXDim(), X);
         panel.setSelectedDimensionIndex(viewer.getYDim(), Y);
         panel.setSelectedDimensionIndex(viewer.getZDim(), Z);
 
         // is this duplication needed?
-        panel.top = seqPoints.size() - 1;
-        panel.pcaModel.setTop(seqPoints.size() - 1);
+        panel.setTop(seqPoints.size() - 1);
+        panel.getPcaModel().setTop(seqPoints.size() - 1);
 
         /*
          * add the axes' end points for the display
@@ -6022,7 +6061,7 @@ public class Jalview2XML
         for (int i = 0; i < 3; i++)
         {
           Axis axis = viewer.getAxis(i);
-          panel.rc.axisEndPoints[i] = new Point(axis.getXPos(),
+          panel.getRotatableCanvas().getAxisEndPoints()[i] = new Point(axis.getXPos(),
                   axis.getYPos(), axis.getZPos());
         }