JAL-1690 refining 'copy format from' as applied to splitframe panels
[jalview.git] / src / jalview / gui / AlignFrame.java
index fcf4301..80838e2 100644 (file)
@@ -364,7 +364,9 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener,
 
     final List<AlignmentPanel> selviews = new ArrayList<AlignmentPanel>();
     final List<AlignmentPanel> origview = new ArrayList<AlignmentPanel>();
-    ViewSelectionMenu vsel = new ViewSelectionMenu("Transfer colours from",
+    final String menuLabel = MessageManager
+            .getString("label.copy_format_from");
+    ViewSelectionMenu vsel = new ViewSelectionMenu(menuLabel,
             new ViewSetProvider()
             {
 
@@ -373,7 +375,11 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener,
               {
                 origview.clear();
                 origview.add(alignPanel);
-                return Desktop.getAlignmentPanels(null);
+                // make an array of all alignment panels except for this one
+                List<AlignmentPanel> aps = new ArrayList<AlignmentPanel>(
+                        Arrays.asList(Desktop.getAlignmentPanels(null)));
+                aps.remove(AlignFrame.this.alignPanel);
+                return aps.toArray(new AlignmentPanel[aps.size()]);
               }
             }, selviews, new ItemListener()
             {
@@ -383,32 +389,43 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener,
               {
                 if (origview.size() > 0)
                 {
+                  final AlignmentPanel ap = origview.get(0);
+
+                  /*
+                   * Copy the ViewStyle of the selected panel to 'this one'.
+                   * Don't change value of 'scaleProteinAsCdna' unless copying
+                   * from a SplitFrame.
+                   */
                   ViewStyleI vs = selviews.get(0).getAlignViewport()
                           .getViewStyle();
-                  origview.get(0).getAlignViewport().setViewStyle(vs);
-                  AlignViewportI complement = origview.get(0)
-                          .getAlignViewport().getCodingComplement();
-                  if (complement != null)
+                  boolean fromSplitFrame = selviews.get(0)
+                          .getAlignViewport().getCodingComplement() != null;
+                  if (!fromSplitFrame)
+                  {
+                    vs.setScaleProteinAsCdna(ap.getAlignViewport()
+                            .getViewStyle().isScaleProteinAsCdna());
+                  }
+                  ap.getAlignViewport().setViewStyle(vs);
+
+                  /*
+                   * Also rescale ViewStyle of SplitFrame complement if there is
+                   * one _and_ it is set to 'scaledProteinAsCdna'; we don't copy
+                   * the whole ViewStyle (allow cDNA protein to have different
+                   * fonts)
+                   */
+                  AlignViewportI complement = ap.getAlignViewport()
+                          .getCodingComplement();
+                  if (complement != null && vs.isScaleProteinAsCdna())
                   {
                     AlignFrame af = Desktop.getAlignFrameFor(complement);
-                    if (complement.isNucleotide())
-                    {
-                      complement.setViewStyle(vs);
-                      vs.setCharWidth(vs.getCharWidth() / 3);
-                    }
-                    else
-                    {
-                      int rw = vs.getCharWidth();
-                      vs.setCharWidth(rw * 3);
-                      complement.setViewStyle(vs);
-                      vs.setCharWidth(rw);
-                    }
-                    af.alignPanel.updateLayout();
+                    ((SplitFrame) af.getSplitViewContainer())
+                            .adjustLayout();
                     af.setMenusForViewport();
                   }
-                  origview.get(0).updateLayout();
-                  origview.get(0).setSelected(true);
-                  origview.get(0).alignFrame.setMenusForViewport();
+
+                  ap.updateLayout();
+                  ap.setSelected(true);
+                  ap.alignFrame.setMenusForViewport();
 
                 }
               }