3253-omnibus save
[jalview.git] / src / jalview / gui / AlignFrame.java
index 597eb5b..b5c257b 100644 (file)
@@ -33,8 +33,8 @@ import jalview.api.AlignViewControllerGuiI;
 import jalview.api.AlignViewControllerI;
 import jalview.api.AlignViewportI;
 import jalview.api.AlignmentViewPanel;
-//from JalviewLite imports import jalview.api.FeatureRenderer;
 import jalview.api.FeatureSettingsControllerI;
+import jalview.api.FeatureSettingsModelI;
 import jalview.api.SplitContainerI;
 import jalview.api.ViewStyleI;
 import jalview.api.analysis.SimilarityParamsI;
@@ -194,9 +194,9 @@ public class AlignFrame extends GAlignFrame
   /**
    * Current filename for this alignment
    */
-  String fileName = null;
+  private String fileName = null;
 
-  File fileObject;
+  private File fileObject;
 
   /**
    * Creates a new AlignFrame object with specific width and height.
@@ -300,6 +300,9 @@ public class AlignFrame extends GAlignFrame
     }
 
     viewport = new AlignViewport(al, hiddenColumns, sequenceSetId, viewId);
+    // BH! new alignPanel must come later
+    // alignPanel = new AlignmentPanel(this, viewport);
+    // addAlignmentPanel(alignPanel, true);
 
     init();
   }
@@ -320,7 +323,10 @@ public class AlignFrame extends GAlignFrame
     {
       viewport.hideSequence(hiddenSeqs);
     }
-    init();
+ // BH! new alignPanel must come later
+    //alignPanel = new AlignmentPanel(this, viewport);
+    //addAlignmentPanel(alignPanel, true);
+init();
   }
 
   /**
@@ -335,6 +341,8 @@ public class AlignFrame extends GAlignFrame
   {
     viewport = ap.av;
     alignPanel = ap;
+    // BH! adding must come later
+    // addAlignmentPanel(ap, false);
     init();
   }
 
@@ -344,6 +352,7 @@ public class AlignFrame extends GAlignFrame
    */
   void init()
   {
+          // BH! Here is where we create the panel; note the sequence
     boolean newPanel = (alignPanel == null);
     viewport.setShowAutocalculatedAbove(isShowAutoCalculatedAbove());
     if (newPanel)
@@ -366,7 +375,8 @@ public class AlignFrame extends GAlignFrame
     addAlignmentPanel(alignPanel, newPanel);
 
     // setBackground(Color.white); // BH 2019
-                 
+         
+    // BH meaning "without display, one way or another"
     if (!Jalview.isHeadlessMode())
     {
       progressBar = new ProgressBar(this.statusPanel, this.statusBar);
@@ -386,7 +396,7 @@ public class AlignFrame extends GAlignFrame
       // modifyPID.setEnabled(false);
     }
 
-    String sortby = jalview.bin.Cache.getDefault(Preferences.SORT_ALIGNMENT,
+    String sortby = Cache.getDefault(Preferences.SORT_ALIGNMENT,
             "No sort");
 
     if (sortby.equals("Id"))
@@ -398,6 +408,9 @@ public class AlignFrame extends GAlignFrame
       sortPairwiseMenuItem_actionPerformed(null);
     }
 
+    alignPanel.av
+            .setShowAutocalculatedAbove(isShowAutoCalculatedAbove());
+
     setMenusFromViewport(viewport);
     buildSortByAnnotationScoresMenu();
     calculateTree.addActionListener(new ActionListener()
@@ -414,24 +427,10 @@ public class AlignFrame extends GAlignFrame
     if (Desktop.getDesktopPane() != null)
     {
       this.setDropTarget(new java.awt.dnd.DropTarget(this, this));
-      PropertyChangeListener serviceListener = (Platform.isJS() ? null
-              : addServiceListeners());
-      addInternalFrameListener(new javax.swing.event.InternalFrameAdapter()
+      if (!Platform.isJS())
       {
-        @Override
-        public void internalFrameClosed(
-                javax.swing.event.InternalFrameEvent evt)
-        {
-          // System.out.println("deregistering discoverer listener");
-          if (serviceListener != null)
-          {
-            Desktop.getInstance().removeJalviewPropertyChangeListener(
-                    "services", serviceListener);
-          }
-          closeMenuItem_actionPerformed(true);
-        }
-      });
-
+        addServiceListeners();
+      }
       setGUINucleotide();
     }
 
@@ -823,6 +822,7 @@ public class AlignFrame extends GAlignFrame
       {
         ap.av.getAlignment().padGaps();
       }
+      // BH! important option for JalviewJS
       if (Jalview.getInstance().getStartCalculations())
       {
         ap.av.updateConservation(ap);
@@ -848,9 +848,11 @@ public class AlignFrame extends GAlignFrame
   }
 
   /* Set up intrinsic listeners for dynamically generated GUI bits. */
-  private PropertyChangeListener addServiceListeners()
+  private void addServiceListeners()
   {
-    PropertyChangeListener serviceListener = new PropertyChangeListener()
+    PropertyChangeListener thisListener;
+    Desktop.getInstance().addJalviewPropertyChangeListener("services",
+            thisListener = new PropertyChangeListener()
     {
       @Override
       public void propertyChange(PropertyChangeEvent evt)
@@ -862,16 +864,26 @@ public class AlignFrame extends GAlignFrame
             @Override
             public void run()
             {
-              System.err.println("Rebuild WS Menu for service change");
+                      System.err.println(
+                              "Rebuild WS Menu for service change");
               BuildWebServiceMenu();
             }
           });
         }
       }
-    };
-
-    Desktop.getInstance().addJalviewPropertyChangeListener("services",
-            serviceListener);
+    });
+    addInternalFrameListener(new javax.swing.event.InternalFrameAdapter()
+    {
+      @Override
+      public void internalFrameClosed(
+              javax.swing.event.InternalFrameEvent evt)
+      {
+        // System.out.println("deregistering discoverer listener");
+        Desktop.getInstance().removeJalviewPropertyChangeListener("services",
+                thisListener);
+        closeMenuItem_actionPerformed(true);
+      }
+    });
     // Finally, build the menu once to get current service state
     new Thread(new Runnable()
     {
@@ -881,7 +893,6 @@ public class AlignFrame extends GAlignFrame
         BuildWebServiceMenu();
       }
     }).start();
-    return serviceListener;
   }
 
   /**
@@ -942,9 +953,8 @@ public class AlignFrame extends GAlignFrame
     scaleLeft.setVisible(av.getWrapAlignment());
     scaleRight.setVisible(av.getWrapAlignment());
     annotationPanelMenuItem.setState(av.isShowAnnotation());
-    /*
-     * Show/hide annotations only enabled if annotation panel is shown
-     */
+    //   Show/hide annotations only enabled if annotation panel is shown
+     
     syncAnnotationMenuItems();
 
     viewBoxesMenuItem.setSelected(av.getShowBoxes());
@@ -1053,83 +1063,91 @@ public class AlignFrame extends GAlignFrame
   @Override
   public void reload_actionPerformed(ActionEvent e)
   {
-    if (fileName != null)
+    if (fileName == null)
     {
-      // TODO: JAL-1108 - ensure all associated frames are closed regardless of
-      // originating file's format
-      // TODO: work out how to recover feature settings for correct view(s) when
-      // file is reloaded.
-      if (FileFormat.Jalview.equals(currentFileFormat))
+      return;
+    }
+    // TODO: JAL-1108 - ensure all associated frames are closed regardless of
+    // originating file's format
+    // TODO: work out how to recover feature settings for correct view(s) when
+    // file is reloaded.
+    if (FileFormat.Jalview.equals(currentFileFormat))
+    {
+      JInternalFrame[] frames = Desktop.getDesktopPane().getAllFrames();
+      for (int i = 0; i < frames.length; i++)
       {
-        JInternalFrame[] frames = Desktop.getDesktopPane().getAllFrames();
-        for (int i = 0; i < frames.length; i++)
+        if (frames[i] instanceof AlignFrame && frames[i] != this
+                && ((AlignFrame) frames[i]).fileName != null
+                && ((AlignFrame) frames[i]).fileName.equals(fileName))
         {
-          if (frames[i] instanceof AlignFrame && frames[i] != this
-                  && ((AlignFrame) frames[i]).fileName != null
-                  && ((AlignFrame) frames[i]).fileName.equals(fileName))
+          try
+          {
+            frames[i].setSelected(true);
+            Desktop.getInstance().closeAssociatedWindows();
+          } catch (java.beans.PropertyVetoException ex)
           {
-            try
-            {
-              frames[i].setSelected(true);
-              Desktop.getInstance().closeAssociatedWindows();
-            } catch (java.beans.PropertyVetoException ex)
-            {
-            }
           }
-
         }
-        Desktop.getInstance().closeAssociatedWindows();
 
-        FileLoader loader = new FileLoader();
-        DataSourceType protocol = fileName.startsWith("http:")
-                ? DataSourceType.URL
-                : DataSourceType.FILE;
-        loader.loadFile(viewport, fileName, protocol, currentFileFormat);
+      }
+      Desktop.getInstance().closeAssociatedWindows();
+
+      FileLoader loader = new FileLoader();
+      DataSourceType protocol = fileName.startsWith("http:")
+              ? DataSourceType.URL
+              : DataSourceType.FILE;
+      if (fileObject == null)
+      {
+        loader.LoadFile(fileName, protocol, currentFileFormat);
       }
       else
       {
-        Rectangle bounds = this.getBounds();
-
-        FileLoader loader = new FileLoader();
+        loader.loadFile(null, fileObject, protocol, currentFileFormat);
+      }
+    }
+    else
+    {
+      Rectangle bounds = this.getBounds();
 
-        AlignFrame newframe = null;
+      FileLoader loader = new FileLoader();
 
-        if (fileObject == null)
-        {
+      AlignFrame newframe = null;
 
-          DataSourceType protocol = (fileName.startsWith("http:")
-                  ? DataSourceType.URL
-                  : DataSourceType.FILE);
-          newframe = loader.loadFileWaitTillLoaded(fileName, protocol,
-                  currentFileFormat);
-        }
-        else
-        {
-          newframe = loader.loadFileWaitTillLoaded(fileObject,
-                  DataSourceType.FILE, currentFileFormat);
-        }
+      if (fileObject == null)
+      {
+// BH! Q: What about https?
+        DataSourceType protocol = (fileName.startsWith("http:")
+                ? DataSourceType.URL
+                : DataSourceType.FILE);
+        newframe = loader.LoadFileWaitTillLoaded(fileName, protocol,
+                currentFileFormat);
+      }
+      else
+      {
+        newframe = loader.loadFileWaitTillLoaded(fileObject,
+                DataSourceType.FILE, currentFileFormat);
+      }
 
-        newframe.setBounds(bounds);
-        if (featureSettings != null && featureSettings.isShowing())
+      newframe.setBounds(bounds);
+      if (featureSettings != null && featureSettings.isShowing())
+      {
+        final Rectangle fspos = featureSettings.frame.getBounds();
+        // TODO: need a 'show feature settings' function that takes bounds -
+        // need to refactor Desktop.addFrame
+        newframe.featureSettings_actionPerformed(null);
+        final FeatureSettings nfs = newframe.featureSettings;
+        Jalview.execRunnable(new Runnable()
         {
-          final Rectangle fspos = featureSettings.frame.getBounds();
-          // TODO: need a 'show feature settings' function that takes bounds -
-          // need to refactor Desktop.addFrame
-          newframe.featureSettings_actionPerformed(null);
-          final FeatureSettings nfs = newframe.featureSettings;
-          SwingUtilities.invokeLater(new Runnable()
+          @Override
+          public void run()
           {
-            @Override
-            public void run()
-            {
-              nfs.frame.setBounds(fspos);
-            }
-          });
-          this.featureSettings.close();
-          this.featureSettings = null;
-        }
-        this.closeMenuItem_actionPerformed(true);
+            nfs.frame.setBounds(fspos);
+          }
+        });
+        this.featureSettings.close();
+        this.featureSettings = null;
       }
+      this.closeMenuItem_actionPerformed(true);
     }
   }
 
@@ -1307,7 +1325,7 @@ public class AlignFrame extends GAlignFrame
           try
           {
             String tempFilePath = doBackup ? backupfiles.getTempFilePath() : file;
-                       PrintWriter out = new PrintWriter(
+                        PrintWriter out = new PrintWriter(
                     new FileWriter(tempFilePath));
 
             out.print(output);
@@ -1566,6 +1584,11 @@ public class AlignFrame extends GAlignFrame
 
       if (closeAllTabs)
       {
+        if (featureSettings != null && featureSettings.isOpen())
+        {
+          featureSettings.close();
+          featureSettings = null;
+        }
         /*
          * this will raise an INTERNAL_FRAME_CLOSED event and this method will
          * be called recursively, with the frame now in 'closed' state
@@ -2181,7 +2204,7 @@ public class AlignFrame extends GAlignFrame
                     newGraphGroups.add(q, null);
                   }
                   newGraphGroups.set(newann.graphGroup,
-                          new Integer(++fgroup));
+                          Integer.valueOf(++fgroup));
                 }
                 newann.graphGroup = newGraphGroups.get(newann.graphGroup)
                         .intValue();
@@ -2228,7 +2251,7 @@ public class AlignFrame extends GAlignFrame
                     newGraphGroups.add(q, null);
                   }
                   newGraphGroups.set(newann.graphGroup,
-                          new Integer(++fgroup));
+                          Integer.valueOf(++fgroup));
                 }
                 newann.graphGroup = newGraphGroups.get(newann.graphGroup)
                         .intValue();
@@ -2426,33 +2449,33 @@ public class AlignFrame extends GAlignFrame
 
     Runnable okAction = new Runnable() 
     {
-               @Override
-               public void run() 
-               {
-                   SequenceI[] cut = sg.getSequences()
-                           .toArray(new SequenceI[sg.getSize()]);
-
-                   addHistoryItem(new EditCommand(
-                           MessageManager.getString("label.cut_sequences"), Action.CUT,
-                           cut, sg.getStartRes(), sg.getEndRes() - sg.getStartRes() + 1,
-                           viewport.getAlignment()));
-
-                   viewport.setSelectionGroup(null);
-                   viewport.sendSelection();
-                   viewport.getAlignment().deleteGroup(sg);
-
-                   viewport.firePropertyChange("alignment", null,
-                           viewport.getAlignment().getSequences());
-                   if (viewport.getAlignment().getHeight() < 1)
-                   {
-                     try
-                     {
-                       AlignFrame.this.setClosed(true);
-                     } catch (Exception ex)
-                     {
-                     }
-                   }
-               }};
+                @Override
+                public void run() 
+                {
+                    SequenceI[] cut = sg.getSequences()
+                            .toArray(new SequenceI[sg.getSize()]);
+
+                    addHistoryItem(new EditCommand(
+                            MessageManager.getString("label.cut_sequences"), Action.CUT,
+                            cut, sg.getStartRes(), sg.getEndRes() - sg.getStartRes() + 1,
+                            viewport.getAlignment()));
+
+                    viewport.setSelectionGroup(null);
+                    viewport.sendSelection();
+                    viewport.getAlignment().deleteGroup(sg);
+
+                    viewport.firePropertyChange("alignment", null,
+                            viewport.getAlignment().getSequences());
+                    if (viewport.getAlignment().getHeight() < 1)
+                    {
+                      try
+                      {
+                        AlignFrame.this.setClosed(true);
+                      } catch (Exception ex)
+                      {
+                      }
+                    }
+                }};
 
     /*
      * If the cut affects all sequences, prompt for confirmation
@@ -2460,20 +2483,20 @@ public class AlignFrame extends GAlignFrame
     boolean wholeHeight = sg.getSize() == viewport.getAlignment().getHeight();
     boolean wholeWidth = (((sg.getEndRes() - sg.getStartRes())
             + 1) == viewport.getAlignment().getWidth()) ? true : false;
-       if (wholeHeight && wholeWidth)
-       {
-           JvOptionPane dialog = JvOptionPane.newOptionDialog(Desktop.getDesktopPane());
-               dialog.setResponseHandler(0, okAction); // 0 = OK_OPTION
-           Object[] options = new Object[] { MessageManager.getString("action.ok"),
-                   MessageManager.getString("action.cancel") };
-               dialog.showDialog(MessageManager.getString("warn.delete_all"),
-                   MessageManager.getString("label.delete_all"),
-                   JvOptionPane.DEFAULT_OPTION, JvOptionPane.PLAIN_MESSAGE, null,
-                   options, options[0]);
-       } else 
-       {
-               okAction.run();
-       }
+        if (wholeHeight && wholeWidth)
+        {
+            JvOptionPane dialog = JvOptionPane.newOptionDialog(Desktop.getDesktopPane());
+                dialog.setResponseHandler(0, okAction); // 0 = OK_OPTION
+            Object[] options = new Object[] { MessageManager.getString("action.ok"),
+                    MessageManager.getString("action.cancel") };
+                dialog.showDialog(MessageManager.getString("warn.delete_all"),
+                    MessageManager.getString("label.delete_all"),
+                    JvOptionPane.DEFAULT_OPTION, JvOptionPane.PLAIN_MESSAGE, null,
+                    options, options[0]);
+        } else 
+        {
+                okAction.run();
+        }
   }
 
   /**
@@ -3273,9 +3296,15 @@ public class AlignFrame extends GAlignFrame
   @Override
   public void featureSettings_actionPerformed(ActionEvent e)
   {
+    showFeatureSettingsUI();
+  }
+
+  @Override
+  public FeatureSettingsControllerI showFeatureSettingsUI()
+  {
     if (featureSettings != null)
     {
-      featureSettings.close();
+      featureSettings.closeOldSettings();
       featureSettings = null;
     }
     if (!showSeqFeatures.isSelected())
@@ -3285,6 +3314,7 @@ public class AlignFrame extends GAlignFrame
       showSeqFeatures_actionPerformed(null);
     }
     featureSettings = new FeatureSettings(this);
+    return featureSettings;
   }
 
   /**
@@ -3393,13 +3423,11 @@ public class AlignFrame extends GAlignFrame
     // undecorated overview with defined size
     frame.setName(Jalview.getAppID("overview"));
     //
-    Dimension dim = (Dimension) Platform.getEmbeddedAttribute(frame,
-            Platform.EMBEDDED_DIM);
+    Dimension dim = Platform.getDimIfEmbedded(frame, -1, -1);
     if (dim != null && dim.width == 0)
     {
       dim = null; // hidden, not embedded
     }
-
     OverviewPanel overview = new OverviewPanel(alignPanel, dim);
 
     frame.setContentPane(overview);
@@ -3778,7 +3806,8 @@ public class AlignFrame extends GAlignFrame
 
     frameTitle += this.title;
 
-    Desktop.addInternalFrame(tp, frameTitle, 600, 500);
+    Dimension dim = Platform.getDimIfEmbedded(tp, 600, 500);
+    Desktop.addInternalFrame(tp, frameTitle, dim.width, dim.height);
   }
 
   /**
@@ -4130,15 +4159,24 @@ public class AlignFrame extends GAlignFrame
       if (nf.getTree() != null)
       {
         tp = new TreePanel(alignPanel, nf, treeTitle, input);
-
-        tp.setSize(w, h);
+        Dimension dim = Platform.getDimIfEmbedded(tp, -1, -1);
+        if (dim == null)
+        {
+          dim = new Dimension(w, h);
+        }
+        else
+        {
+          // no offset, either
+          x = 0;
+        }
+        tp.setSize(dim.width, dim.height);
 
         if (x > 0 && y > 0)
         {
           tp.setLocation(x, y);
         }
 
-        Desktop.addInternalFrame(tp, treeTitle, w, h);
+        Desktop.addInternalFrame(tp, treeTitle, dim.width, dim.height);
       }
     } catch (Exception ex)
     {
@@ -4156,6 +4194,10 @@ public class AlignFrame extends GAlignFrame
    */
   public void BuildWebServiceMenu()
   {
+    if (Jalview.isSynchronous())
+    {
+      return;
+    }
     while (buildingMenu)
     {
       try
@@ -4528,7 +4570,6 @@ public class AlignFrame extends GAlignFrame
     {
       viewport.setShowSequenceFeatures(true);
       showSeqFeatures.setSelected(true);
-      alignPanel.getAlignment().resetColors();
     }
 
   }
@@ -4681,6 +4722,7 @@ public class AlignFrame extends GAlignFrame
                   // associating PDB files which have no IDs.
                   for (SequenceI toassoc : (SequenceI[]) fm[2])
                   {
+                         // BH! check
                     PDBEntry pe = AssociatePdbFileWithSeq
                             .associatePdbWithSeq(fm[0].toString(),
                                     (DataSourceType) fm[1], toassoc, false);
@@ -4848,12 +4890,24 @@ public class AlignFrame extends GAlignFrame
           {
             if (parseFeaturesFile(file, sourceType))
             {
+              SplitFrame splitFrame = (SplitFrame) getSplitViewContainer();
+              if (splitFrame != null)
+              {
+                splitFrame.repaint();
+              }
+              else
+              {
               alignPanel.paintAlignment(true, true);
             }
           }
+          }
           else
           {
-            new FileLoader().loadFile(viewport, file, sourceType, format);
+                 if (file instanceof File) {
+                  new FileLoader().loadFile(viewport, (File) file, sourceType, format);
+                 } else {
+                  new FileLoader().LoadFile(viewport, (String) file, sourceType, format);
+                 }
           }
         }
       }
@@ -4912,6 +4966,21 @@ public class AlignFrame extends GAlignFrame
       viewport = alignPanel.av;
       avc.setViewportAndAlignmentPanel(viewport, alignPanel);
       setMenusFromViewport(viewport);
+      if (featureSettings != null && featureSettings.isOpen()
+              && featureSettings.fr.getViewport() != viewport)
+      {
+        if (viewport.isShowSequenceFeatures())
+        {
+          // refresh the featureSettings to reflect UI change
+          showFeatureSettingsUI();
+    }
+        else
+        {
+          // close feature settings for this view.
+          featureSettings.close();
+        }
+      }
+
     }
 
     /*
@@ -5135,6 +5204,13 @@ public class AlignFrame extends GAlignFrame
               @Override
               public void finished()
               {
+
+                for (FeatureSettingsModelI srcSettings : dbRefFetcher
+                        .getFeatureSettingsModels())
+                {
+
+                  alignPanel.av.mergeFeaturesStyle(srcSettings);
+                }
                 AlignFrame.this.setMenusForViewport();
               }
             });
@@ -5146,12 +5222,12 @@ public class AlignFrame extends GAlignFrame
 
     });
     rfetch.add(fetchr);
-    new Thread(new Runnable()
+    Jalview.execThread(new Thread(new Runnable()
     {
       @Override
       public void run()
       {
-        javax.swing.SwingUtilities.invokeLater(new Runnable()
+        Jalview.execRunnable(new Runnable()
         {
           @Override
           public void run()
@@ -5181,6 +5257,7 @@ public class AlignFrame extends GAlignFrame
               }
               if (otherdb.size() == 1)
               {
+                 // BH cleaner code
                 DbSourceProxy src = otherdb.get(0);
                 DbSourceProxy[] dassource = new DbSourceProxy[] {
                     src };
@@ -5211,6 +5288,10 @@ public class AlignFrame extends GAlignFrame
                                   @Override
                                   public void finished()
                                   {
+                                    FeatureSettingsModelI srcSettings = dassource[0]
+                                            .getFeatureColourScheme();
+                                    alignPanel.av.mergeFeaturesStyle(
+                                            srcSettings);
                                     AlignFrame.this.setMenusForViewport();
                                   }
                                 });
@@ -5370,7 +5451,7 @@ public class AlignFrame extends GAlignFrame
           }
         });
       }
-    }).start();
+    }));
 
   }
 
@@ -5841,6 +5922,20 @@ public class AlignFrame extends GAlignFrame
 
   }
 
+
+  private Rectangle lastFeatureSettingsBounds = null;
+  @Override
+  public void setFeatureSettingsGeometry(Rectangle bounds)
+  {
+    lastFeatureSettingsBounds = bounds;
+  }
+
+  @Override
+  public Rectangle getFeatureSettingsGeometry()
+  {
+    return lastFeatureSettingsBounds;
+  }
+  
   /**
    * BH 2019 from JalviewLite
    *