JAL-3383 removing colour caching (to a separate branch)
[jalview.git] / src / jalview / gui / AlignFrame.java
index b56f269..0b84e9b 100644 (file)
@@ -28,10 +28,12 @@ import jalview.analysis.GeneticCodeI;
 import jalview.analysis.ParseProperties;
 import jalview.analysis.SequenceIdMatcher;
 import jalview.api.AlignExportSettingsI;
+import jalview.api.AlignFrameI;
 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.SplitContainerI;
 import jalview.api.ViewStyleI;
@@ -105,6 +107,7 @@ import jalview.ws.seqfetcher.DbSourceProxy;
 import java.awt.BorderLayout;
 import java.awt.Color;
 import java.awt.Component;
+import java.awt.Dimension;
 import java.awt.Rectangle;
 import java.awt.Toolkit;
 import java.awt.datatransfer.Clipboard;
@@ -128,6 +131,7 @@ import java.awt.event.MouseEvent;
 import java.awt.print.PageFormat;
 import java.awt.print.PrinterJob;
 import java.beans.PropertyChangeEvent;
+import java.beans.PropertyChangeListener;
 import java.io.File;
 import java.io.FileWriter;
 import java.io.PrintWriter;
@@ -162,7 +166,8 @@ import ext.vamsas.ServiceHandle;
  * @version $Revision$
  */
 @SuppressWarnings("serial")
-public class AlignFrame extends GAlignFrame implements DropTargetListener,
+public class AlignFrame extends GAlignFrame
+        implements AlignFrameI, DropTargetListener,
         IProgressIndicator, AlignViewControllerGuiI, ColourChangeListener
 {
 
@@ -296,9 +301,6 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener,
 
     viewport = new AlignViewport(al, hiddenColumns, sequenceSetId, viewId);
 
-    alignPanel = new AlignmentPanel(this, viewport);
-
-    addAlignmentPanel(alignPanel, true);
     init();
   }
 
@@ -318,8 +320,6 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener,
     {
       viewport.hideSequence(hiddenSeqs);
     }
-    alignPanel = new AlignmentPanel(this, viewport);
-    addAlignmentPanel(alignPanel, true);
     init();
   }
 
@@ -335,7 +335,6 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener,
   {
     viewport = ap.av;
     alignPanel = ap;
-    addAlignmentPanel(ap, false);
     init();
   }
 
@@ -345,11 +344,34 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener,
    */
   void init()
   {
-//       setBackground(Color.white); // BH 2019
+    boolean newPanel = (alignPanel == null);
+    viewport.setShowAutocalculatedAbove(isShowAutoCalculatedAbove());
+    if (newPanel)
+    {
+      if (Platform.isJS())
+      {
+        // need to set this up front if NOANNOTATION is
+        // used in conjunction with SHOWOVERVIEW.
+
+        // I have not determined if this is appropriate for
+        // Jalview/Java, as it means we are setting this flag
+        // for all subsequent AlignFrames. For now, at least,
+        // I am setting it to be JalviewJS-only.
+
+        boolean showAnnotation = Jalview.getInstance().getShowAnnotation();
+        viewport.setShowAnnotation(showAnnotation);
+      }
+      alignPanel = new AlignmentPanel(this, viewport);
+    }
+    addAlignmentPanel(alignPanel, newPanel);
+
+    // setBackground(Color.white); // BH 2019
                  
     if (!Jalview.isHeadlessMode())
     {
       progressBar = new ProgressBar(this.statusPanel, this.statusBar);
+      statusPanel.setVisible(Jalview.getInstance().getShowStatus());
+      alignFrameMenuBar.setVisible(Jalview.getInstance().getAllowMenuBar());
     }
 
     avc = new jalview.controller.AlignViewController(this, viewport,
@@ -376,9 +398,6 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener,
       sortPairwiseMenuItem_actionPerformed(null);
     }
 
-    this.alignPanel.av
-            .setShowAutocalculatedAbove(isShowAutoCalculatedAbove());
-
     setMenusFromViewport(viewport);
     buildSortByAnnotationScoresMenu();
     calculateTree.addActionListener(new ActionListener()
@@ -395,10 +414,24 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener,
     if (Desktop.getDesktopPane() != null)
     {
       this.setDropTarget(new java.awt.dnd.DropTarget(this, this));
-      if (!Platform.isJS())
+      PropertyChangeListener serviceListener = (Platform.isJS() ? null
+              : addServiceListeners());
+      addInternalFrameListener(new javax.swing.event.InternalFrameAdapter()
       {
-        addServiceListeners();
-      }
+        @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);
+        }
+      });
+
       setGUINucleotide();
     }
 
@@ -551,7 +584,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener,
         switch (evt.getKeyCode())
         {
 
-        case 27: // escape key
+        case KeyEvent.VK_ESCAPE: // escape key
           deselectAllSequenceMenuItem_actionPerformed(null);
 
           break;
@@ -790,9 +823,12 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener,
       {
         ap.av.getAlignment().padGaps();
       }
-      ap.av.updateConservation(ap);
-      ap.av.updateConsensus(ap);
-      ap.av.updateStrucConsensus(ap);
+      if (Jalview.getInstance().getStartCalculations())
+      {
+        ap.av.updateConservation(ap);
+        ap.av.updateConsensus(ap);
+        ap.av.updateStrucConsensus(ap);
+      }
     }
   }
 
@@ -812,45 +848,30 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener,
   }
 
   /* Set up intrinsic listeners for dynamically generated GUI bits. */
-  private void addServiceListeners()
+  private PropertyChangeListener addServiceListeners()
   {
-    final java.beans.PropertyChangeListener thisListener;
-    Desktop.getInstance().addJalviewPropertyChangeListener("services",
-            thisListener = new java.beans.PropertyChangeListener()
-            {
-              @Override
-              public void propertyChange(PropertyChangeEvent evt)
-              {
-                // // System.out.println("Discoverer property change.");
-                // if (evt.getPropertyName().equals("services"))
-                {
-                  SwingUtilities.invokeLater(new Runnable()
-                  {
-
-                    @Override
-                    public void run()
-                    {
-                      System.err.println(
-                              "Rebuild WS Menu for service change");
-                      BuildWebServiceMenu();
-                    }
-
-                  });
-                }
-              }
-            });
-    addInternalFrameListener(new javax.swing.event.InternalFrameAdapter()
+    PropertyChangeListener serviceListener = new PropertyChangeListener()
     {
       @Override
-      public void internalFrameClosed(
-              javax.swing.event.InternalFrameEvent evt)
+      public void propertyChange(PropertyChangeEvent evt)
       {
-        // System.out.println("deregistering discoverer listener");
-        Desktop.getInstance().removeJalviewPropertyChangeListener("services",
-                thisListener);
-        closeMenuItem_actionPerformed(true);
+        {
+          SwingUtilities.invokeLater(new Runnable()
+          {
+
+            @Override
+            public void run()
+            {
+              System.err.println("Rebuild WS Menu for service change");
+              BuildWebServiceMenu();
+            }
+          });
+        }
       }
-    });
+    };
+
+    Desktop.getInstance().addJalviewPropertyChangeListener("services",
+            serviceListener);
     // Finally, build the menu once to get current service state
     new Thread(new Runnable()
     {
@@ -860,6 +881,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener,
         BuildWebServiceMenu();
       }
     }).start();
+    return serviceListener;
   }
 
   /**
@@ -923,10 +945,8 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener,
     /*
      * Show/hide annotations only enabled if annotation panel is shown
      */
-    showAllSeqAnnotations.setEnabled(annotationPanelMenuItem.getState());
-    hideAllSeqAnnotations.setEnabled(annotationPanelMenuItem.getState());
-    showAllAlAnnotations.setEnabled(annotationPanelMenuItem.getState());
-    hideAllAlAnnotations.setEnabled(annotationPanelMenuItem.getState());
+    syncAnnotationMenuItems();
+
     viewBoxesMenuItem.setSelected(av.getShowBoxes());
     viewTextMenuItem.setSelected(av.getShowText());
     showNonconservedMenuItem.setSelected(av.getShowUnconserved());
@@ -944,7 +964,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener,
     applyToAllGroups.setState(av.getColourAppliesToAllGroups());
     showNpFeatsMenuitem.setSelected(av.isShowNPFeats());
     showDbRefsMenuitem.setSelected(av.isShowDBRefs());
-    autoCalculate.setSelected(av.autoCalculateConsensus);
+    autoCalculate.setSelected(av.getAutoCalculateConsensusAndConservation());
     sortByTree.setSelected(av.sortByTree);
     listenToViewSelections.setSelected(av.followSelection);
 
@@ -3294,13 +3314,20 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener,
   {
     final boolean setVisible = annotationPanelMenuItem.isSelected();
     viewport.setShowAnnotation(setVisible);
-    this.showAllSeqAnnotations.setEnabled(setVisible);
-    this.hideAllSeqAnnotations.setEnabled(setVisible);
-    this.showAllAlAnnotations.setEnabled(setVisible);
-    this.hideAllAlAnnotations.setEnabled(setVisible);
+    syncAnnotationMenuItems();
     alignPanel.updateLayout();
   }
 
+  private void syncAnnotationMenuItems()
+  {
+    final boolean setVisible = annotationPanelMenuItem.isSelected();
+    showAllSeqAnnotations.setEnabled(setVisible);
+    hideAllSeqAnnotations.setEnabled(setVisible);
+    showAllAlAnnotations.setEnabled(setVisible);
+    hideAllAlAnnotations.setEnabled(setVisible);
+  }
+
+
   @Override
   public void alignmentProperties()
   {
@@ -3361,12 +3388,38 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener,
     }
 
     JInternalFrame frame = new JInternalFrame();
-    final OverviewPanel overview = new OverviewPanel(alignPanel);
+
+    // BH 2019.07.26 we allow for an embedded
+    // undecorated overview with defined size
+    frame.setName(Jalview.getAppID("overview"));
+    //
+    Dimension dim = (Dimension) Platform.getEmbeddedAttribute(frame,
+            Platform.EMBEDDED_DIM);
+    if (dim != null && dim.width == 0)
+    {
+      dim = null; // hidden, not embedded
+    }
+
+    OverviewPanel overview = new OverviewPanel(alignPanel, dim);
+
     frame.setContentPane(overview);
+    if (dim == null)
+    {
+      dim = new Dimension();
+      // was frame.getSize(), but that is 0,0 at this point;
+    }
+    else
+    {
+      // we are imbedding, and so we have an undecorated frame
+      // and we can set the the frame dimensions accordingly.
+    }
+    // allowing for unresizable option using, style="resize:none"
+    boolean resizable = (Platform.getEmbeddedAttribute(frame,
+            "resize") != "none");
     Desktop.addInternalFrame(frame, MessageManager
             .formatMessage("label.overview_params", new Object[]
-            { this.getTitle() }), true, frame.getWidth(), frame.getHeight(),
-            true, true);
+            { this.getTitle() }), true, dim.width, dim.height, resizable,
+            true);
     frame.pack();
     frame.setLayer(JLayeredPane.PALETTE_LAYER);
     frame.addInternalFrameListener(
@@ -3646,8 +3699,8 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener,
   @Override
   public void autoCalculate_actionPerformed(ActionEvent e)
   {
-    viewport.autoCalculateConsensus = autoCalculate.isSelected();
-    if (viewport.autoCalculateConsensus)
+    viewport.setAutoCalculateConsensusAndConservation(autoCalculate.isSelected());
+    if (viewport.getAutoCalculateConsensusAndConservation())
     {
       viewport.firePropertyChange("alignment", null,
               viewport.getAlignment().getSequences());
@@ -5787,6 +5840,67 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener,
 
   }
 
+  /**
+   * BH 2019 from JalviewLite
+   * 
+   * get sequence feature groups that are hidden or shown
+   * 
+   * @param visible
+   *          true is visible
+   * @return list
+   */
+  public String[] getFeatureGroupsOfState(boolean visible)
+  {
+    jalview.api.FeatureRenderer fr = null;
+    if (alignPanel != null
+            && (fr = alignPanel
+                    .getFeatureRenderer()) != null)
+    {
+      List<String> gps = fr.getGroups(visible);
+      String[] _gps = gps.toArray(new String[gps.size()]);
+      return _gps;
+    }
+    return null;
+  }
+
+  public void scrollTo(int row, int column)
+  {
+    alignPanel.getSeqPanel().scrollTo(row, column);
+  }
+
+  public void scrollToRow(int row)
+  {
+    alignPanel.getSeqPanel().scrollToRow(row);
+  }
+
+  public void scrollToColumn(int column)
+  {
+    alignPanel.getSeqPanel().scrollToColumn(column);
+  }
+
+  /**
+   * 
+   * @return list of feature groups on the view
+   */
+  public String[] getFeatureGroups()
+  {
+    jalview.api.FeatureRenderer fr = null;
+    if (alignPanel != null
+            && (fr = alignPanel.getFeatureRenderer()) != null)
+    {
+      List<String> gps = fr.getFeatureGroups();
+      String[] _gps = gps.toArray(new String[gps.size()]);
+      return _gps;
+    }
+    return null;
+  }
+
+  public void select(SequenceGroup sel, ColumnSelection csel,
+          HiddenColumns hidden)
+  {
+    alignPanel.getSeqPanel().selection(sel, csel, hidden, null);
+  }
+
 }
 
 class PrintThread extends Thread