Merge branch 'features/JAL-2608closeOverview' into develop
authorJim Procter <jprocter@issues.jalview.org>
Tue, 24 Oct 2017 16:09:42 +0000 (17:09 +0100)
committerJim Procter <jprocter@issues.jalview.org>
Tue, 24 Oct 2017 16:09:42 +0000 (17:09 +0100)
1  2 
src/jalview/appletgui/AlignFrame.java
src/jalview/appletgui/OverviewPanel.java
src/jalview/gui/AlignmentPanel.java
src/jalview/gui/OverviewPanel.java

@@@ -343,7 -343,7 +343,7 @@@ public class AlignFrame extends Embmenu
      createAlignFrameWindow(embedded);
      validate();
      alignPanel.adjustAnnotationHeight();
 -    alignPanel.paintAlignment(true);
 +    alignPanel.paintAlignment(true, true);
    }
  
    public AlignViewport getAlignViewport()
        {
          viewport.featureSettings.refreshTable();
        }
 -      alignPanel.paintAlignment(true);
 +      alignPanel.paintAlignment(true, true);
        statusBar.setText(MessageManager
                .getString("label.successfully_added_features_alignment"));
      }
        break;
  
      }
 -    alignPanel.paintAlignment(true);
 +    // TODO: repaint flags set only if the keystroke warrants it
 +    alignPanel.paintAlignment(true, true);
    }
  
    /**
      {
        applyAutoAnnotationSettings_actionPerformed();
      }
 -    alignPanel.paintAlignment(true);
 +    // TODO: repaint flags set only if warranted
 +    alignPanel.paintAlignment(true, true);
    }
  
    /**
      else if (source == invertColSel)
      {
        viewport.invertColumnSelection();
 -      alignPanel.paintAlignment(true);
 +      alignPanel.paintAlignment(false, false);
        viewport.sendSelection();
      }
      else if (source == remove2LeftMenuItem)
      else if (source == showColumns)
      {
        viewport.showAllHiddenColumns();
 -      alignPanel.paintAlignment(true);
 +      alignPanel.paintAlignment(true, true);
        viewport.sendSelection();
      }
      else if (source == showSeqs)
      {
        viewport.showAllHiddenSeqs();
 -      alignPanel.paintAlignment(true);
 +      alignPanel.paintAlignment(true, true);
        // uncomment if we want to slave sequence selections in split frame
        // viewport.sendSelection();
      }
      else if (source == hideColumns)
      {
        viewport.hideSelectedColumns();
 -      alignPanel.paintAlignment(true);
 +      alignPanel.paintAlignment(true, true);
        viewport.sendSelection();
      }
      else if (source == hideSequences
              && viewport.getSelectionGroup() != null)
      {
        viewport.hideAllSelectedSeqs();
 -      alignPanel.paintAlignment(true);
 +      alignPanel.paintAlignment(true, true);
        // uncomment if we want to slave sequence selections in split frame
        // viewport.sendSelection();
      }
      else if (source == hideAllButSelection)
      {
        toggleHiddenRegions(false, false);
 -      alignPanel.paintAlignment(true);
 +      alignPanel.paintAlignment(true, true);
        viewport.sendSelection();
      }
      else if (source == hideAllSelection)
        viewport.expandColSelection(sg, false);
        viewport.hideAllSelectedSeqs();
        viewport.hideSelectedColumns();
 -      alignPanel.paintAlignment(true);
 +      alignPanel.paintAlignment(true, true);
        viewport.sendSelection();
      }
      else if (source == showAllHidden)
      {
        viewport.showAllHiddenColumns();
        viewport.showAllHiddenSeqs();
 -      alignPanel.paintAlignment(true);
 +      alignPanel.paintAlignment(true, true);
        viewport.sendSelection();
      }
      else if (source == showGroupConsensus)
      {
        System.exit(0);
      }
-     else
+     viewport = null;
+     if (alignPanel != null && alignPanel.overviewPanel != null)
      {
+       alignPanel.overviewPanel.dispose();
      }
-     viewport = null;
      alignPanel = null;
      this.dispose();
    }
      }
      viewport.getAlignment().moveSelectedSequencesByOne(sg,
              up ? null : viewport.getHiddenRepSequences(), up);
 -    alignPanel.paintAlignment(true);
 +    alignPanel.paintAlignment(true, false);
  
      /*
       * Also move cDNA/protein complement sequences
                viewport, complement);
        complement.getAlignment().moveSelectedSequencesByOne(mappedSelection,
                up ? null : complement.getHiddenRepSequences(), up);
 -      getSplitFrame().getComplement(this).alignPanel.paintAlignment(true);
 +      getSplitFrame().getComplement(this).alignPanel.paintAlignment(true,
 +              false);
      }
    }
  
      {
        PaintRefresher.Refresh(this, viewport.getSequenceSetId());
        alignPanel.updateAnnotation();
 -      alignPanel.paintAlignment(true);
 +      alignPanel.paintAlignment(true, true);
      }
    }
  
      // JAL-2034 - should delegate to
      // alignPanel to decide if overview needs
      // updating.
 -    alignPanel.paintAlignment(false);
 +    alignPanel.paintAlignment(false, false);
      PaintRefresher.Refresh(alignPanel, viewport.getSequenceSetId());
      viewport.sendSelection();
    }
      // JAL-2034 - should delegate to
      // alignPanel to decide if overview needs
      // updating.
 -    alignPanel.paintAlignment(false);
 +    alignPanel.paintAlignment(false, false);
      PaintRefresher.Refresh(alignPanel, viewport.getSequenceSetId());
      viewport.sendSelection();
    }
    public void invertColSel_actionPerformed()
    {
      viewport.invertColumnSelection();
 -    alignPanel.paintAlignment(true);
 +    alignPanel.paintAlignment(true, false);
      PaintRefresher.Refresh(alignPanel, viewport.getSequenceSetId());
      viewport.sendSelection();
    }
    {
      viewport.setShowJVSuffix(seqLimits.getState());
      alignPanel.fontChanged();
 -    alignPanel.paintAlignment(true);
 +    alignPanel.paintAlignment(true, false);
    }
  
    protected void colourTextMenuItem_actionPerformed()
    {
      viewport.setColourText(colourTextMenuItem.getState());
 -    alignPanel.paintAlignment(true);
 +    alignPanel.paintAlignment(false, false);
    }
  
    protected void displayNonconservedMenuItem_actionPerformed()
    {
      viewport.setShowUnconserved(displayNonconservedMenuItem.getState());
 -    alignPanel.paintAlignment(true);
 +    alignPanel.paintAlignment(false, false);
    }
  
    protected void wrapMenuItem_actionPerformed()
      scaleAbove.setEnabled(wrapMenuItem.getState());
      scaleLeft.setEnabled(wrapMenuItem.getState());
      scaleRight.setEnabled(wrapMenuItem.getState());
 -    alignPanel.paintAlignment(true);
 +    alignPanel.paintAlignment(true, false);
    }
  
    public void overviewMenuItem_actionPerformed()
    {
      viewport.setGlobalColourScheme(cs);
  
 -    alignPanel.paintAlignment(true);
 +    alignPanel.paintAlignment(true, true);
    }
  
    protected void modifyPID_actionPerformed()
  
      addHistoryItem(new OrderCommand("Pairwise Sort", oldOrder,
              viewport.getAlignment()));
 -    alignPanel.paintAlignment(true);
 +    alignPanel.paintAlignment(true, false);
    }
  
    public void sortIDMenuItem_actionPerformed()
      AlignmentSorter.sortByID(viewport.getAlignment());
      addHistoryItem(
              new OrderCommand("ID Sort", oldOrder, viewport.getAlignment()));
 -    alignPanel.paintAlignment(true);
 +    alignPanel.paintAlignment(true, false);
    }
  
    public void sortLengthMenuItem_actionPerformed()
      AlignmentSorter.sortByLength(viewport.getAlignment());
      addHistoryItem(new OrderCommand("Length Sort", oldOrder,
              viewport.getAlignment()));
 -    alignPanel.paintAlignment(true);
 +    alignPanel.paintAlignment(true, false);
    }
  
    public void sortGroupMenuItem_actionPerformed()
      AlignmentSorter.sortByGroup(viewport.getAlignment());
      addHistoryItem(new OrderCommand("Group Sort", oldOrder,
              viewport.getAlignment()));
 -    alignPanel.paintAlignment(true);
 +    alignPanel.paintAlignment(true, false);
  
    }
  
            current.insertCharAt(Width - 1, viewport.getGapCharacter());
          }
        }
 -      alignPanel.paintAlignment(true);
 +      alignPanel.paintAlignment(false, false);
      }
  
      if ((viewport.getSelectionGroup() != null
            current.insertCharAt(Width - 1, viewport.getGapCharacter());
          }
        }
 -      alignPanel.paintAlignment(true);
 +      alignPanel.paintAlignment(false, false);
  
      }
  
      addHistoryItem(new OrderCommand(MessageManager
              .formatMessage("label.order_by_params", new String[]
              { title }), oldOrder, viewport.getAlignment()));
 -    alignPanel.paintAlignment(true);
 +    alignPanel.paintAlignment(true, false);
    }
  
    /**
        addHistoryItem(new OrderCommand(undoname, oldOrder,
                viewport.getAlignment()));
      }
 -    alignPanel.paintAlignment(true);
 +    alignPanel.paintAlignment(true, false);
      return true;
    }
  
@@@ -31,6 -31,7 +31,7 @@@ import java.awt.BorderLayout
  import java.awt.CheckboxMenuItem;
  import java.awt.Cursor;
  import java.awt.Dimension;
+ import java.awt.Frame;
  import java.awt.Panel;
  import java.awt.PopupMenu;
  import java.awt.event.ComponentAdapter;
@@@ -148,12 -149,11 +149,12 @@@ public class OverviewPanel extends Pane
      }
      else
      {
 +      // don't do anything if the mouse press is in the overview's box
 +      // (wait to see if it's a drag instead)
 +      // otherwise update the viewport
        if (!od.isPositionInBox(evt.getX(), evt.getY()))
 -      {
 -        // don't do anything if the mouse press is in the overview's box
 -        // (wait to see if it's a drag instead)
 -        // otherwise update the viewport
 +      { 
 +      draggingBox = false;
          od.updateViewportFromMouse(evt.getX(), evt.getY(),
                  av.getAlignment().getHiddenSequences(),
                  av.getAlignment().getHiddenColumns());
    @Override
    public void mouseReleased(MouseEvent evt)
    {
 -    if (draggingBox)
 -    {
 -      draggingBox = false;
 -    }
    }
  
    @Override
                  av.getAlignment().getHiddenSequences(),
                  av.getAlignment().getHiddenColumns());
        }
 -      ap.paintAlignment(false);
 +      ap.paintAlignment(false, false);
      }
    }
  
      try
      {
        av.getRanges().removePropertyChangeListener(this);
+       Frame parent = (Frame) getParent();
+       parent.dispose();
+       parent.setVisible(false);
      } finally
      {
        av = null;
@@@ -97,6 -97,9 +97,6 @@@ public class AlignmentPanel extends GAl
  
    private AnnotationLabels alabels;
  
 -  // this value is set false when selection area being dragged
 -  boolean fastPaint = true;
 -
    private int hextent = 0;
  
    private int vextent = 0;
  
      alignFrame.updateEditMenuBar();
  
 -    paintAlignment(true);
 +    // no idea if we need to update structure
 +    paintAlignment(true, true);
  
    }
  
              new Dimension(10, av.getCharHeight() + fm.getDescent()));
      idSpaceFillerPanel1.setPreferredSize(
              new Dimension(10, av.getCharHeight() + fm.getDescent()));
 -
 +    idwidthAdjuster.invalidate();
 +    scalePanelHolder.invalidate();
      getIdPanel().getIdCanvas().gg = null;
      getSeqPanel().seqCanvas.img = null;
      getAnnotationPanel().adjustPanelHeight();
      getIdPanel().getIdCanvas().setPreferredSize(d);
      hscrollFillerPanel.setPreferredSize(d);
  
 -    if (this.alignFrame.getSplitViewContainer() != null)
 -    {
 -      ((SplitFrame) this.alignFrame.getSplitViewContainer()).adjustLayout();
 -    }
 -
      repaint();
    }
  
        scrollNeeded = vpRanges.scrollToWrappedVisible(start);
      }
  
 -    paintAlignment(redrawOverview);
 +    paintAlignment(redrawOverview, false);
  
      return scrollNeeded;
    }
      }
      validateAnnotationDimensions(true);
      addNotify();
 -    paintAlignment(true);
 +    // TODO: many places call this method and also paintAlignment with various
 +    // different settings. this means multiple redraws are triggered...
 +    paintAlignment(true, false);
    }
  
    /**
        }
        else
        {
 -        int widthInRes = (canvasWidth / av.getCharWidth()) - 1;
 +        int widthInRes = (canvasWidth / av.getCharWidth());
          int heightInSeq = (getSeqPanel().seqCanvas.getHeight()
 -                / av.getCharHeight()) - 1;
 +                / av.getCharHeight());
  
          vpRanges.setViewportWidth(widthInRes);
          vpRanges.setViewportHeight(heightInSeq);
        }
        vpRanges.setViewportStartAndHeight(y, height);
      }
 -    if (!fastPaint)
 -    {
 -      repaint();
 -    }
 +    repaint();
    }
  
    /**
      repaint();
    }
  
 -  /**
 -   * Repaint the alignment including the annotations and overview panels (if
 -   * shown).
 +  /* (non-Javadoc)
 +   * @see jalview.api.AlignmentViewPanel#paintAlignment(boolean)
     */
    @Override
 -  public void paintAlignment(boolean updateOverview)
 +  public void paintAlignment(boolean updateOverview,
 +          boolean updateStructures)
    {
      final AnnotationSorter sorter = new AnnotationSorter(getAlignment(),
              av.isShowAutocalculatedAbove());
              av.getSortAnnotationsBy());
      repaint();
  
 -    if (updateOverview)
 +    if (updateStructures)
      {
 -      // TODO: determine if this paintAlignment changed structure colours
        av.getStructureSelectionManager().sequenceColoursChanged(this);
 +    }
 +    if (updateOverview)
 +    {
  
        if (overviewPanel != null)
        {
       * single graphics context), then reset to (0, scale height)
       */
      alignmentGraphics.translate(alignmentGraphicsOffset, scaleHeight);
 -    getSeqPanel().seqCanvas.drawPanel(alignmentGraphics, startRes, endRes,
 -            startSeq, endSeq, 0);
 +    getSeqPanel().seqCanvas.drawPanelForPrinting(alignmentGraphics, startRes,
 +            endRes, startSeq, endSeq);
      alignmentGraphics.translate(-alignmentGraphicsOffset, 0);
  
      if (av.isShowAnnotation() && (endSeq == alignmentHeight))
  
      pg.translate(idWidth, 0);
  
 -    getSeqPanel().seqCanvas.drawWrappedPanel(pg, pwidth - idWidth,
 +    getSeqPanel().seqCanvas.drawWrappedPanelForPrinting(pg, pwidth - idWidth,
              totalHeight, 0);
  
      if ((pi * pheight) < totalHeight)
      if (annotationPanel != null)
      {
        annotationPanel.dispose();
+       annotationPanel = null;
      }
  
      if (av != null)
     */
    protected void closeChildFrames()
    {
+     if (overviewPanel != null)
+     {
+       overviewPanel.dispose();
+       overviewPanel = null;
+     }
      if (calculationDialog != null)
      {
        calculationDialog.closeFrame();
+       calculationDialog = null;
      }
    }
  
      if (adjustHeight)
      {
        // sort, repaint, update overview
 -      paintAlignment(true);
 +      paintAlignment(true, false);
      }
      else
      {
@@@ -20,8 -20,6 +20,8 @@@
   */
  package jalview.gui;
  
 +import jalview.bin.Cache;
 +import jalview.renderer.OverviewRenderer;
  import jalview.util.MessageManager;
  import jalview.util.Platform;
  import jalview.viewmodel.OverviewDimensions;
@@@ -40,8 -38,10 +40,10 @@@ import java.awt.event.MouseAdapter
  import java.awt.event.MouseEvent;
  import java.awt.event.MouseMotionAdapter;
  import java.beans.PropertyChangeEvent;
+ import java.beans.PropertyVetoException;
  
  import javax.swing.JCheckBoxMenuItem;
+ import javax.swing.JInternalFrame;
  import javax.swing.JPanel;
  import javax.swing.JPopupMenu;
  import javax.swing.SwingUtilities;
@@@ -70,8 -70,6 +72,8 @@@ public class OverviewPanel extends JPan
  
    private boolean draggingBox = false;
  
 +  private ProgressPanel progressPanel;
 +
    /**
     * Creates a new OverviewPanel object.
     * 
      this.av = alPanel.av;
      this.ap = alPanel;
  
 -    od = new OverviewDimensionsShowHidden(av.getRanges(),
 +    showHidden = Cache.getDefault(Preferences.SHOW_OV_HIDDEN_AT_START,
 +            true);
 +    if (showHidden)
 +    {
 +      od = new OverviewDimensionsShowHidden(av.getRanges(),
              (av.isShowAnnotation()
                      && av.getAlignmentConservationAnnotation() != null));
 +    }
 +    else
 +    {
 +      od = new OverviewDimensionsHideHidden(av.getRanges(),
 +              (av.isShowAnnotation()
 +                      && av.getAlignmentConservationAnnotation() != null));
 +    }
  
 -    setSize(od.getWidth(), od.getHeight());
 -
 -    oviewCanvas = new OverviewCanvas(od, av);
      setLayout(new BorderLayout());
 +    progressPanel = new ProgressPanel(OverviewRenderer.UPDATE,
 +            MessageManager.getString("label.oview_calc"), getWidth());
 +    this.add(progressPanel, BorderLayout.SOUTH);
 +    oviewCanvas = new OverviewCanvas(od, av, progressPanel);
 +
      add(oviewCanvas, BorderLayout.CENTER);
  
      av.getRanges().addPropertyChangeListener(this);
  
 +    // without this the overview window does not size to fit the overview canvas
 +    setPreferredSize(new Dimension(od.getWidth(), od.getHeight()));
 +
      addComponentListener(new ComponentAdapter()
      {
        @Override
        public void componentResized(ComponentEvent evt)
        {
 -        if ((getWidth() != od.getWidth())
 -                || (getHeight() != (od.getHeight())))
 +        // Resize is called on the initial display of the overview.
 +        // This code adjusts sizes to account for the progress bar if it has not
 +        // already been accounted for, which triggers another resize call for
 +        // the correct sizing, at which point the overview image is updated.
 +        // (This avoids a double recalculation of the image.)
 +        if (getWidth() == od.getWidth() && getHeight() == od.getHeight()
 +                + progressPanel.getHeight())
          {
            updateOverviewImage();
 -          setBoxPosition();
 +        }
 +        else
 +        {
 +          if ((getWidth() > 0) && (getHeight() > 0))
 +          {
 +            od.setWidth(getWidth());
 +            od.setHeight(getHeight() - progressPanel.getHeight());
 +          }
 +
 +          setPreferredSize(new Dimension(od.getWidth(),
 +                  od.getHeight() + progressPanel.getHeight()));
          }
        }
 +
      });
  
      addMouseMotionListener(new MouseMotionAdapter()
            }
          }
          else
 -        // if (!av.getWrapAlignment())
          {
 +          // don't do anything if the mouse press is in the overview's box
 +          // (wait to see if it's a drag instead)
 +          // otherwise update the viewport
            if (!od.isPositionInBox(evt.getX(), evt.getY()))
            {
 -            // don't do anything if the mouse press is in the overview's box
 -            // (wait to see if it's a drag instead)
 -            // otherwise update the viewport
 +            draggingBox = false;
              od.updateViewportFromMouse(evt.getX(), evt.getY(),
                      av.getAlignment().getHiddenSequences(),
                      av.getAlignment().getHiddenColumns());
        }
  
        @Override
 -      public void mouseReleased(MouseEvent evt)
 -      {
 -        if (draggingBox)
 -        {
 -          draggingBox = false;
 -        }
 -      }
 -
 -      @Override
        public void mouseClicked(MouseEvent evt)
        {
          if (SwingUtilities.isRightMouseButton(evt))
          }
        }
      });
 -
 -    updateOverviewImage();
    }
  
    /*
      if ((getWidth() > 0) && (getHeight() > 0))
      {
        od.setWidth(getWidth());
 -      od.setHeight(getHeight());
 +      od.setHeight(getHeight() - progressPanel.getHeight());
      }
 -
 -    setPreferredSize(new Dimension(od.getWidth(), od.getHeight()));
 +    
 +    setPreferredSize(new Dimension(od.getWidth(),
 +            od.getHeight() + progressPanel.getHeight()));
  
      if (oviewCanvas.restartDraw())
      {
      Thread thread = new Thread(this);
      thread.start();
      repaint();
 +
 +    
    }
  
    @Override
    public void run()
    {
 -    oviewCanvas.draw(av.isShowSequenceFeatures(),
 -            (av.isShowAnnotation()
 -                    && av.getAlignmentConservationAnnotation() != null),
 -            ap.getSeqPanel().seqCanvas.getFeatureRenderer());
 -    setBoxPosition();
 +    if (oviewCanvas != null)
 +    {
 +      oviewCanvas.draw(av.isShowSequenceFeatures(),
 +              (av.isShowAnnotation()
 +                      && av.getAlignmentConservationAnnotation() != null),
 +              ap.getSeqPanel().seqCanvas.getFeatureRenderer());
 +      setBoxPosition();
 +    }
    }
  
    /**
     */
    private void setBoxPosition()
    {
 -    od.setBoxPosition(av.getAlignment().getHiddenSequences(),
 -            av.getAlignment().getHiddenColumns());
 -    repaint();
 +    if (od != null)
 +    {
 +      od.setBoxPosition(av.getAlignment().getHiddenSequences(),
 +              av.getAlignment().getHiddenColumns());
 +      repaint();
 +    }
    }
  
    @Override
    {
      try
      {
-       av.getRanges().removePropertyChangeListener(this);
+       if (av != null)
+       {
+         av.getRanges().removePropertyChangeListener(this);
+       }
 +      oviewCanvas.dispose();
++
+       /*
+        * close the parent frame (which also removes it from the
+        * Desktop Windows menu)
+        */
+       ((JInternalFrame) SwingUtilities.getAncestorOfClass(
+               JInternalFrame.class, (this))).setClosed(true);
+     } catch (PropertyVetoException e)
+     {
+       // ignore
      } finally
      {
 +      progressPanel = null;
        av = null;
        oviewCanvas = null;
        ap = null;