JAL-3078 reset Tree font (only!) on Cancel
[jalview.git] / src / jalview / gui / FontChooser.java
index fdf3d2a..c66f304 100755 (executable)
@@ -49,6 +49,12 @@ public class FontChooser extends GFontChooser
   Font oldFont;
 
   /*
+   * The font on opening the dialog (to be restored on Cancel)
+   * on the other half of a split frame (if applicable)
+   */
+  Font oldComplementFont;
+
+  /*
    * the state of 'scale protein as cDNA' on opening the dialog
    */
   boolean oldProteinScale;
@@ -69,6 +75,10 @@ public class FontChooser extends GFontChooser
 
   private boolean lastSelMono = false;
 
+  private boolean oldSmoothFont;
+
+  private boolean oldComplementSmooth;
+
   /**
    * Creates a new FontChooser for a tree panel
    * 
@@ -94,7 +104,7 @@ public class FontChooser extends GFontChooser
     oldFont = alignPanel.av.getFont();
     oldProteinScale = alignPanel.av.isScaleProteinAsCdna();
     oldMirrorFont = alignPanel.av.isProteinFontAsCdna();
-
+    oldSmoothFont = alignPanel.av.antiAlias;
     this.ap = alignPanel;
     init();
   }
@@ -114,13 +124,17 @@ public class FontChooser extends GFontChooser
     boolean inSplitFrame = ap.av.getCodingComplement() != null;
     if (inSplitFrame)
     {
+      oldComplementFont = ((AlignViewport) ap.av.getCodingComplement())
+              .getFont();
+      oldComplementSmooth = ((AlignViewport) ap.av
+              .getCodingComplement()).antiAlias;
       scaleAsCdna.setVisible(true);
       scaleAsCdna.setSelected(ap.av.isScaleProteinAsCdna());
       fontAsCdna.setVisible(true);
       fontAsCdna.setSelected(ap.av.isProteinFontAsCdna());
     }
 
-    if (tp != null)
+    if (isTreeFont())
     {
       Desktop.addInternalFrame(frame,
               MessageManager.getString("action.change_font_tree_panel"),
@@ -157,9 +171,9 @@ public class FontChooser extends GFontChooser
     fontStyle.setSelectedIndex(oldFont.getStyle());
 
     FontMetrics fm = getGraphics().getFontMetrics(oldFont);
-    monospaced.setSelected(fm.getStringBounds("M", getGraphics())
-            .getWidth() == fm.getStringBounds("|", getGraphics())
-            .getWidth());
+    monospaced.setSelected(
+            fm.getStringBounds("M", getGraphics()).getWidth() == fm
+                    .getStringBounds("|", getGraphics()).getWidth());
 
     init = false;
   }
@@ -169,7 +183,16 @@ public class FontChooser extends GFontChooser
   {
     ap.av.antiAlias = smoothFont.isSelected();
     ap.getAnnotationPanel().image = null;
-    ap.paintAlignment(true);
+    ap.paintAlignment(true, false);
+    if (ap.av.getCodingComplement() != null && ap.av.isProteinFontAsCdna())
+    {
+      ((AlignViewport) ap.av
+              .getCodingComplement()).antiAlias = ap.av.antiAlias;
+      SplitFrame sv = (SplitFrame) ap.alignFrame.getSplitViewContainer();
+      sv.adjustLayout();
+      sv.repaint();
+    }
+
   }
 
   /**
@@ -206,24 +229,31 @@ public class FontChooser extends GFontChooser
   @Override
   protected void cancel_actionPerformed()
   {
-    if (ap != null)
+    if (isTreeFont())
+    {
+      tp.setTreeFont(oldFont);
+    }
+    else if (ap != null)
     {
       ap.av.setFont(oldFont, true);
       ap.av.setScaleProteinAsCdna(oldProteinScale);
       ap.av.setProteinFontAsCdna(oldMirrorFont);
-      ap.paintAlignment(true);
+      ap.av.antiAlias = oldSmoothFont;
+      ap.fontChanged();
 
       if (scaleAsCdna.isVisible() && scaleAsCdna.isEnabled())
       {
         ap.av.getCodingComplement().setScaleProteinAsCdna(oldProteinScale);
         ap.av.getCodingComplement().setProteinFontAsCdna(oldMirrorFont);
-        ap.av.getCodingComplement().setFont(oldFont, true);
+        ((AlignViewport) ap.av
+                .getCodingComplement()).antiAlias = oldComplementSmooth;
+        ap.av.getCodingComplement().setFont(oldComplementFont, true);
+        SplitFrame splitFrame = (SplitFrame) ap.alignFrame
+                .getSplitViewContainer();
+        splitFrame.adjustLayout();
+        splitFrame.repaint();
       }
     }
-    else if (tp != null)
-    {
-      tp.setTreeFont(oldFont);
-    }
 
     try
     {
@@ -233,6 +263,11 @@ public class FontChooser extends GFontChooser
     }
   }
 
+  private boolean isTreeFont()
+  {
+    return tp != null;
+  }
+
   /**
    * DOCUMENT ME!
    */
@@ -257,8 +292,9 @@ public class FontChooser extends GFontChooser
     double iw = iBounds.getWidth();
     if (mw < 1 || iw < 1)
     {
-      String message = iBounds.getHeight() < 1 ? MessageManager
-              .getString("label.font_doesnt_have_letters_defined")
+      String message = iBounds.getHeight() < 1
+              ? MessageManager
+                      .getString("label.font_doesnt_have_letters_defined")
               : MessageManager.getString("label.font_too_small");
       JvOptionPane.showInternalMessageDialog(this, message,
               MessageManager.getString("label.invalid_font"),
@@ -271,8 +307,8 @@ public class FontChooser extends GFontChooser
       {
         fontSize.setSelectedItem(lastSelected.getSize());
       }
-      if (!lastSelected.getName().equals(
-              fontName.getSelectedItem().toString()))
+      if (!lastSelected.getName()
+              .equals(fontName.getSelectedItem().toString()))
       {
         fontName.setSelectedItem(lastSelected.getName());
       }
@@ -286,7 +322,7 @@ public class FontChooser extends GFontChooser
       }
       return;
     }
-    if (tp != null)
+    if (isTreeFont())
     {
       tp.setTreeFont(newFont);
     }
@@ -296,27 +332,21 @@ public class FontChooser extends GFontChooser
       ap.fontChanged();
 
       /*
-       * adjust other half of split frame if any, if either same
-       * font, or proportionate scaling, is selected
+       * adjust other half of split frame if present, whether or not same font or
+       * scale to cDNA is selected, because a font change may affect character
+       * width, and this is kept the same in both panels
        */
-      if (fontAsCdna.isEnabled())
+      if (fontAsCdna.isVisible())
       {
         if (fontAsCdna.isSelected())
         {
-          /*
-           * copy the font
-           */
           ap.av.getCodingComplement().setFont(newFont, true);
         }
-        if (fontAsCdna.isSelected() || scaleAsCdna.isSelected())
-        {
-          /*
-           * adjust layout for font change and/or sizing
-           */
-          SplitFrame splitFrame = (SplitFrame) ap.alignFrame
-                  .getSplitViewContainer();
-          splitFrame.repaint();
-        }
+
+        SplitFrame splitFrame = (SplitFrame) ap.alignFrame
+                .getSplitViewContainer();
+        splitFrame.adjustLayout();
+        splitFrame.repaint();
       }
     }
 
@@ -395,8 +425,8 @@ public class FontChooser extends GFontChooser
   protected void scaleAsCdna_actionPerformed()
   {
     ap.av.setScaleProteinAsCdna(scaleAsCdna.isSelected());
-    ap.av.getCodingComplement().setScaleProteinAsCdna(
-            scaleAsCdna.isSelected());
+    ap.av.getCodingComplement()
+            .setScaleProteinAsCdna(scaleAsCdna.isSelected());
     final SplitFrame splitFrame = (SplitFrame) ap.alignFrame
             .getSplitViewContainer();
     splitFrame.adjustLayout();
@@ -405,8 +435,8 @@ public class FontChooser extends GFontChooser
 
   /**
    * Turn on/off mirroring of font across split frame. If turning on, also
-   * copies the current font across the split frame. If turning off, does not
-   * change fonts.
+   * copies the current font across the split frame. If turning off, restores
+   * the other half of the split frame to its initial font.
    */
   @Override
   protected void mirrorFonts_actionPerformed()
@@ -415,9 +445,14 @@ public class FontChooser extends GFontChooser
     ap.av.setProteinFontAsCdna(selected);
     ap.av.getCodingComplement().setProteinFontAsCdna(selected);
 
-    if (selected)
+    /*
+     * reset other half of split frame if turning option off
+     */
+    if (!selected)
     {
-      changeFont();
+      ap.av.getCodingComplement().setFont(oldComplementFont, true);
     }
+
+    changeFont();
   }
 }