Merge remote-tracking branch 'origin/merge/JAL-845_JAL-1640' into
[jalview.git] / src / jalview / gui / AlignViewport.java
index deba021..6208597 100644 (file)
@@ -43,6 +43,7 @@ import jalview.analysis.AlignmentUtils.MappingResult;
 import jalview.analysis.AnnotationSorter.SequenceAnnotationOrder;
 import jalview.analysis.NJTree;
 import jalview.api.AlignViewportI;
+import jalview.api.ViewStyleI;
 import jalview.bin.Cache;
 import jalview.commands.CommandI;
 import jalview.datamodel.Alignment;
@@ -59,12 +60,11 @@ import jalview.structure.SelectionSource;
 import jalview.structure.StructureSelectionManager;
 import jalview.structure.VamsasSource;
 import jalview.util.MessageManager;
-import jalview.util.StringUtils;
 import jalview.viewmodel.AlignmentViewport;
 import jalview.ws.params.AutoCalcSetting;
 
-import java.awt.Color;
 import java.awt.Container;
+import java.awt.Dimension;
 import java.awt.Font;
 import java.awt.Rectangle;
 import java.io.File;
@@ -95,62 +95,27 @@ public class AlignViewport extends AlignmentViewport implements
 
   int endSeq;
 
-  boolean showJVSuffix = true;
-
-  boolean showText = true;
-
-  boolean showColourText = false;
-
-  boolean showBoxes = true;
-
-  boolean wrapAlignment = false;
-
-  boolean renderGaps = true;
 
   SequenceAnnotationOrder sortAnnotationsBy = null;
 
-  int charHeight;
-
-  int charWidth;
-
-  boolean validCharWidth;
-
-  int wrappedWidth;
-
   Font font;
 
-  boolean seqNameItalics;
-
   NJTree currentTree = null;
 
-  boolean scaleAboveWrapped = false;
-
-  boolean scaleLeftWrapped = true;
-
-  boolean scaleRightWrapped = true;
-
-  boolean showHiddenMarkers = true;
-
   boolean cursorMode = false;
 
   boolean antiAlias = false;
 
-  Rectangle explodedPosition;
+  private Rectangle explodedGeometry;
 
   String viewName;
 
-  boolean gatherViewsHere = false;
+  private boolean gatherViewsHere = false;
 
   private Deque<CommandI> historyList = new ArrayDeque<CommandI>();
 
   private Deque<CommandI> redoList = new ArrayDeque<CommandI>();
 
-  int thresholdTextColour = 0;
-
-  Color textColour = Color.black;
-
-  Color textColour2 = Color.white;
-
   private AnnotationColumnChooser annotationColumnSelectionState;
   /**
    * Creates a new AlignViewport object.
@@ -259,32 +224,46 @@ public class AlignViewport extends AlignmentViewport implements
     init();
   }
 
-  void init()
+  private void applyViewProperties()
   {
-    this.startRes = 0;
-    this.endRes = alignment.getWidth() - 1;
-    this.startSeq = 0;
-    this.endSeq = alignment.getHeight() - 1;
-
     antiAlias = Cache.getDefault("ANTI_ALIAS", false);
 
-    showJVSuffix = Cache.getDefault("SHOW_JVSUFFIX", true);
+    viewStyle.setShowJVSuffix(Cache.getDefault("SHOW_JVSUFFIX", true));
     setShowAnnotation(Cache.getDefault("SHOW_ANNOTATIONS", true));
 
     setRightAlignIds(Cache.getDefault("RIGHT_ALIGN_IDS", false));
-    centreColumnLabels = Cache.getDefault("CENTRE_COLUMN_LABELS", false);
+    setCentreColumnLabels(Cache.getDefault("CENTRE_COLUMN_LABELS", false));
     autoCalculateConsensus = Cache.getDefault("AUTO_CALC_CONSENSUS", true);
 
     setPadGaps(Cache.getDefault("PAD_GAPS", true));
-    shownpfeats = Cache.getDefault("SHOW_NPFEATS_TOOLTIP", true);
-    showdbrefs = Cache.getDefault("SHOW_DBREFS_TOOLTIP", true);
+    setShowNPFeats(Cache.getDefault("SHOW_NPFEATS_TOOLTIP", true));
+    setShowDBRefs(Cache.getDefault("SHOW_DBREFS_TOOLTIP", true));
+    viewStyle.setSeqNameItalics(Cache.getDefault("ID_ITALICS", true));
+    viewStyle.setWrapAlignment(Cache.getDefault("WRAP_ALIGNMENT", false));
+    viewStyle.setShowUnconserved(Cache
+            .getDefault("SHOW_UNCONSERVED", false));
+    sortByTree = Cache.getDefault("SORT_BY_TREE", false);
+    followSelection = Cache.getDefault("FOLLOW_SELECTIONS", true);
+    sortAnnotationsBy = SequenceAnnotationOrder.valueOf(Cache.getDefault(
+            Preferences.SORT_ANNOTATIONS,
+            SequenceAnnotationOrder.NONE.name()));
+    showAutocalculatedAbove = Cache.getDefault(
+            Preferences.SHOW_AUTOCALC_ABOVE, false);
+
+  }
+
+  void init()
+  {
+    this.startRes = 0;
+    this.endRes = alignment.getWidth() - 1;
+    this.startSeq = 0;
+    this.endSeq = alignment.getHeight() - 1;
+    applyViewProperties();
 
     String fontName = Cache.getDefault("FONT_NAME", "SansSerif");
     String fontStyle = Cache.getDefault("FONT_STYLE", Font.PLAIN + "");
     String fontSize = Cache.getDefault("FONT_SIZE", "10");
 
-    seqNameItalics = Cache.getDefault("ID_ITALICS", true);
-
     int style = 0;
 
     if (fontStyle.equals("bold"))
@@ -296,7 +275,7 @@ public class AlignViewport extends AlignmentViewport implements
       style = 2;
     }
 
-    setFont(new Font(fontName, style, Integer.parseInt(fontSize)));
+    setFont(new Font(fontName, style, Integer.parseInt(fontSize)), true);
 
     alignment
             .setGapCharacter(Cache.getDefault("GAP_SYMBOL", "-").charAt(0));
@@ -330,7 +309,7 @@ public class AlignViewport extends AlignmentViewport implements
       {
         globalColourScheme = UserDefinedColours.loadDefaultColours();
         ((UserColourScheme) globalColourScheme).setThreshold(0,
-                getIgnoreGapsConsensus());
+                isIgnoreGapsConsensus());
       }
 
       if (globalColourScheme != null)
@@ -338,31 +317,9 @@ public class AlignViewport extends AlignmentViewport implements
         globalColourScheme.setConsensus(hconsensus);
       }
     }
-
-    wrapAlignment = Cache.getDefault("WRAP_ALIGNMENT", false);
-    showUnconserved = Cache.getDefault("SHOW_UNCONSERVED", false);
-    sortByTree = Cache.getDefault("SORT_BY_TREE", false);
-    followSelection = Cache.getDefault("FOLLOW_SELECTIONS", true);
-    sortAnnotationsBy = SequenceAnnotationOrder.valueOf(Cache.getDefault(
-            Preferences.SORT_ANNOTATIONS,
-            SequenceAnnotationOrder.NONE.name()));
-    showAutocalculatedAbove = Cache.getDefault(
-            Preferences.SHOW_AUTOCALC_ABOVE, false);
   }
 
   /**
-   * centre columnar annotation labels in displayed alignment annotation TODO:
-   * add to jalviewXML and annotation display settings
-   */
-  boolean centreColumnLabels = false;
-
-  private boolean showdbrefs;
-
-  private boolean shownpfeats;
-
-  // --------END Structure Conservation
-
-  /**
    * get the consensus sequence as displayed under the PID consensus annotation
    * row.
    * 
@@ -506,105 +463,52 @@ public class AlignViewport extends AlignmentViewport implements
     return endSeq;
   }
 
+  boolean validCharWidth;
+
   /**
-   * DOCUMENT ME!
+   * update view settings with the given font. You may need to call
+   * alignPanel.fontChanged to update the layout geometry
    * 
-   * @param f
-   *          DOCUMENT ME!
+   * @param setGrid
+   *          when true, charWidth/height is set according to font mentrics
    */
-  public void setFont(Font f)
+  public void setFont(Font f, boolean setGrid)
   {
     font = f;
 
     Container c = new Container();
 
     java.awt.FontMetrics fm = c.getFontMetrics(font);
-    setCharHeight(fm.getHeight());
-    setCharWidth(fm.charWidth('M'));
-    validCharWidth = true;
-  }
-
-  /**
-   * DOCUMENT ME!
-   * 
-   * @return DOCUMENT ME!
-   */
-  public Font getFont()
-  {
-    return font;
-  }
-
-  /**
-   * DOCUMENT ME!
-   * 
-   * @param w
-   *          DOCUMENT ME!
-   */
-  public void setCharWidth(int w)
-  {
-    this.charWidth = w;
-  }
-
-  /**
-   * DOCUMENT ME!
-   * 
-   * @return DOCUMENT ME!
-   */
-  public int getCharWidth()
-  {
-    return charWidth;
-  }
-
-  /**
-   * DOCUMENT ME!
-   * 
-   * @param h
-   *          DOCUMENT ME!
-   */
-  public void setCharHeight(int h)
-  {
-    this.charHeight = h;
-  }
+    int w = viewStyle.getCharWidth(), ww = fm.charWidth('M'), h = viewStyle
+            .getCharHeight();
+    if (setGrid)
+    {
+      setCharHeight(fm.getHeight());
+      setCharWidth(ww);
+    }
+    viewStyle.setFontName(font.getName());
+    viewStyle.setFontStyle(font.getStyle());
+    viewStyle.setFontSize(font.getSize());
 
-  /**
-   * DOCUMENT ME!
-   * 
-   * @return DOCUMENT ME!
-   */
-  public int getCharHeight()
-  {
-    return charHeight;
+    validCharWidth = true;
   }
 
-  /**
-   * DOCUMENT ME!
-   * 
-   * @param w
-   *          DOCUMENT ME!
-   */
-  public void setWrappedWidth(int w)
+  @Override
+  public void setViewStyle(ViewStyleI settingsForView)
   {
-    this.wrappedWidth = w;
-  }
+    super.setViewStyle(settingsForView);
+    setFont(new Font(viewStyle.getFontName(), viewStyle.getFontStyle(),
+            viewStyle.getFontSize()), false);
 
-  /**
-   * DOCUMENT ME!
-   * 
-   * @return DOCUMENT ME!
-   */
-  public int getWrappedWidth()
-  {
-    return wrappedWidth;
   }
-
   /**
    * DOCUMENT ME!
    * 
    * @return DOCUMENT ME!
    */
-  public AlignmentI getAlignment()
+  public Font getFont()
   {
-    return alignment;
+    return font;
   }
 
   /**
@@ -631,101 +535,6 @@ public class AlignViewport extends AlignmentViewport implements
   /**
    * DOCUMENT ME!
    * 
-   * @param state
-   *          DOCUMENT ME!
-   */
-  public void setWrapAlignment(boolean state)
-  {
-    wrapAlignment = state;
-  }
-
-  /**
-   * DOCUMENT ME!
-   * 
-   * @param state
-   *          DOCUMENT ME!
-   */
-  public void setShowText(boolean state)
-  {
-    showText = state;
-  }
-
-  /**
-   * DOCUMENT ME!
-   * 
-   * @param state
-   *          DOCUMENT ME!
-   */
-  public void setRenderGaps(boolean state)
-  {
-    renderGaps = state;
-  }
-
-  /**
-   * DOCUMENT ME!
-   * 
-   * @return DOCUMENT ME!
-   */
-  public boolean getColourText()
-  {
-    return showColourText;
-  }
-
-  /**
-   * DOCUMENT ME!
-   * 
-   * @param state
-   *          DOCUMENT ME!
-   */
-  public void setColourText(boolean state)
-  {
-    showColourText = state;
-  }
-
-  /**
-   * DOCUMENT ME!
-   * 
-   * @param state
-   *          DOCUMENT ME!
-   */
-  public void setShowBoxes(boolean state)
-  {
-    showBoxes = state;
-  }
-
-  /**
-   * DOCUMENT ME!
-   * 
-   * @return DOCUMENT ME!
-   */
-  public boolean getWrapAlignment()
-  {
-    return wrapAlignment;
-  }
-
-  /**
-   * DOCUMENT ME!
-   * 
-   * @return DOCUMENT ME!
-   */
-  public boolean getShowText()
-  {
-    return showText;
-  }
-
-  /**
-   * DOCUMENT ME!
-   * 
-   * @return DOCUMENT ME!
-   */
-  public boolean getShowBoxes()
-  {
-    return showBoxes;
-  }
-
-  /**
-   * DOCUMENT ME!
-   * 
    * @return DOCUMENT ME!
    */
   public char getGapCharacter()
@@ -779,110 +588,6 @@ public class AlignViewport extends AlignmentViewport implements
   }
 
   /**
-   * DOCUMENT ME!
-   * 
-   * @return DOCUMENT ME!
-   */
-  public boolean getShowJVSuffix()
-  {
-    return showJVSuffix;
-  }
-
-  /**
-   * DOCUMENT ME!
-   * 
-   * @param b
-   *          DOCUMENT ME!
-   */
-  public void setShowJVSuffix(boolean b)
-  {
-    showJVSuffix = b;
-  }
-
-  /**
-   * DOCUMENT ME!
-   * 
-   * @return DOCUMENT ME!
-   */
-  public boolean getScaleAboveWrapped()
-  {
-    return scaleAboveWrapped;
-  }
-
-  /**
-   * DOCUMENT ME!
-   * 
-   * @return DOCUMENT ME!
-   */
-  public boolean getScaleLeftWrapped()
-  {
-    return scaleLeftWrapped;
-  }
-
-  /**
-   * DOCUMENT ME!
-   * 
-   * @return DOCUMENT ME!
-   */
-  public boolean getScaleRightWrapped()
-  {
-    return scaleRightWrapped;
-  }
-
-  /**
-   * DOCUMENT ME!
-   * 
-   * @param b
-   *          DOCUMENT ME!
-   */
-  public void setScaleAboveWrapped(boolean b)
-  {
-    scaleAboveWrapped = b;
-  }
-
-  /**
-   * DOCUMENT ME!
-   * 
-   * @param b
-   *          DOCUMENT ME!
-   */
-  public void setScaleLeftWrapped(boolean b)
-  {
-    scaleLeftWrapped = b;
-  }
-
-  /**
-   * DOCUMENT ME!
-   * 
-   * @param b
-   *          DOCUMENT ME!
-   */
-  public void setScaleRightWrapped(boolean b)
-  {
-    scaleRightWrapped = b;
-  }
-
-  public void setDataset(boolean b)
-  {
-    isDataset = b;
-  }
-
-  public boolean isDataset()
-  {
-    return isDataset;
-  }
-
-  public boolean getShowHiddenMarkers()
-  {
-    return showHiddenMarkers;
-  }
-
-  public void setShowHiddenMarkers(boolean show)
-  {
-    showHiddenMarkers = show;
-  }
-
-  /**
    * returns the visible column regions of the alignment
    * 
    * @param selectedRegionOnly
@@ -955,55 +660,6 @@ public class AlignViewport extends AlignmentViewport implements
     return false;
   }
 
-  public boolean getCentreColumnLabels()
-  {
-    return centreColumnLabels;
-  }
-
-  public void setCentreColumnLabels(boolean centrecolumnlabels)
-  {
-    centreColumnLabels = centrecolumnlabels;
-  }
-
-  /**
-   * enable or disable the display of Database Cross References in the sequence
-   * ID tooltip
-   */
-  public void setShowDbRefs(boolean show)
-  {
-    showdbrefs = show;
-  }
-
-  /**
-   * 
-   * @return true if Database References are to be displayed on tooltips.
-   */
-  public boolean isShowDbRefs()
-  {
-    return showdbrefs;
-  }
-
-  /**
-   * 
-   * @return true if Non-positional features are to be displayed on tooltips.
-   */
-  public boolean isShowNpFeats()
-  {
-    return shownpfeats;
-  }
-
-  /**
-   * enable or disable the display of Non-Positional sequence features in the
-   * sequence ID tooltip
-   * 
-   * @param show
-   */
-  public void setShowNpFeats(boolean show)
-  {
-    shownpfeats = show;
-  }
-
-
   /**
    * when set, view will scroll to show the highlighted position
    */
@@ -1340,6 +996,10 @@ public class AlignViewport extends AlignmentViewport implements
   {
     // TODO: promote to AlignViewportI? applet CutAndPasteTransfer is different
 
+    // JBPComment: title is a largely redundant parameter at the moment
+    // JBPComment: this really should be an 'insert/pre/append' controller
+    // JBPComment: but the DNA/Protein check makes it a bit more complex
+
     // refactored from FileLoader / CutAndPasteTransfer / SequenceFetcher with
     // this comment:
     // TODO: create undo object for this JAL-1101
@@ -1350,6 +1010,7 @@ public class AlignViewport extends AlignmentViewport implements
      */
     if (getAlignment().isNucleotide() != al.isNucleotide())
     {
+      // TODO: JAL-845 try a bit harder to link up imported sequences
       final Set<String> sequenceNames = getAlignment().getSequenceNames();
       sequenceNames.retainAll(al.getSequenceNames());
       if (!sequenceNames.isEmpty()) // at least one sequence name in both
@@ -1360,6 +1021,8 @@ public class AlignViewport extends AlignmentViewport implements
         }
       }
     }
+    // TODO: JAL-407 regardless of above - identical sequences (based on ID and
+    // provenance) should share the same dataset sequence
 
     for (int i = 0; i < al.getHeight(); i++)
     {
@@ -1367,6 +1030,8 @@ public class AlignViewport extends AlignmentViewport implements
     }
     // TODO this call was done by SequenceFetcher but not FileLoader or
     // CutAndPasteTransfer. Is it needed?
+    // JBPComment: this repositions the view to show the new sequences
+    // JBPComment: so it is needed for UX
     setEndSeq(getAlignment().getHeight());
     firePropertyChange("alignment", null, getAlignment().getSequences());
   }
@@ -1463,6 +1128,8 @@ public class AlignViewport extends AlignmentViewport implements
 
     if (openSplitPane)
     {
+      // TODO: move this kind of constructor stuff to a factory/controller
+      // method ?
       /*
        * Open in split pane. DNA sequence above, protein below.
        */
@@ -1478,10 +1145,10 @@ public class AlignViewport extends AlignmentViewport implements
       cdnaFrame.setVisible(true);
       proteinFrame.setVisible(true);
       String sep = String.valueOf(File.separatorChar);
-      String proteinShortName = StringUtils.getLastToken(
-              proteinFrame.getTitle(), sep);
-      String dnaShortName = StringUtils.getLastToken(cdnaFrame.getTitle(),
-              sep);
+      String proteinShortName = proteinFrame.getTitle().substring(
+              proteinFrame.getTitle().lastIndexOf(sep) + 1);
+      String dnaShortName = cdnaFrame.getTitle().substring(
+              cdnaFrame.getTitle().lastIndexOf(sep) + 1);
       String linkedTitle = MessageManager.formatMessage(
               "label.linked_view_title", dnaShortName, proteinShortName);
       JInternalFrame splitFrame = new SplitFrame(cdnaFrame, proteinFrame);
@@ -1520,4 +1187,39 @@ public class AlignViewport extends AlignmentViewport implements
   {
     this.annotationColumnSelectionState = currentAnnotationColumnSelectionState;
   }
+
+  @Override
+  public void setIdWidth(int i)
+  {
+    super.setIdWidth(i);
+    AlignmentPanel ap = getAlignPanel();
+    if (ap != null)
+    {
+      // modify GUI elements to reflect geometry change
+      Dimension idw = getAlignPanel().getIdPanel().getIdCanvas()
+              .getPreferredSize();
+      idw.width = i;
+      getAlignPanel().getIdPanel().getIdCanvas().setPreferredSize(idw);
+    }
+  }
+
+  public Rectangle getExplodedGeometry()
+  {
+    return explodedGeometry;
+  }
+
+  public void setExplodedGeometry(Rectangle explodedPosition)
+  {
+    this.explodedGeometry = explodedPosition;
+  }
+
+  public boolean isGatherViewsHere()
+  {
+    return gatherViewsHere;
+  }
+
+  public void setGatherViewsHere(boolean gatherViewsHere)
+  {
+    this.gatherViewsHere = gatherViewsHere;
+  }
 }