JAL-3608 streamlined LaF methods and allow specificying "vaqua", "quaqua"
[jalview.git] / src / jalview / bin / Jalview.java
index cfcc2f7..08c12d6 100755 (executable)
@@ -43,8 +43,8 @@ import java.util.logging.ConsoleHandler;
 import java.util.logging.Level;
 import java.util.logging.Logger;
 
-import javax.swing.LookAndFeel;
 import javax.swing.UIManager;
+import javax.swing.UIManager.LookAndFeelInfo;
 
 import com.threerings.getdown.util.LaunchUtil;
 
@@ -367,10 +367,20 @@ public class Jalview
 
     desktop = null;
 
-    // property laf = "crossplatform", "system", "gtk" or "mac"
+    // property laf = "crossplatform", "system", "gtk", "metal" or "mac"
     // If not set (or chosen laf fails), use the normal SystemLaF and if on Mac,
     // try Quaqua/Vaqua.
-    String laf = System.getProperty("laf", "none");
+    String lafProp = System.getProperty("laf");
+    String lafSetting = Cache.getDefault("PREFERRED_LAF", null);
+    String laf = "none";
+    if (lafProp != null)
+    {
+      laf = lafProp;
+    }
+    else if (lafSetting != null)
+    {
+      laf = lafSetting;
+    }
     boolean lafSet = false;
     switch (laf)
     {
@@ -390,9 +400,33 @@ public class Jalview
       break;
     case "gtk":
       lafSet = setGtkLookAndFeel();
-      {
-        System.err.println("Could not set requested laf=" + laf);
-      }
+    {
+      System.err.println("Could not set requested laf=" + laf);
+    }
+      break;
+    case "metal":
+      lafSet = setMetalLookAndFeel();
+    {
+      System.err.println("Could not set requested laf=" + laf);
+    }
+      break;
+    case "nimbus":
+      lafSet = setNimbusLookAndFeel();
+    {
+      System.err.println("Could not set requested laf=" + laf);
+    }
+      break;
+    case "quaqua":
+      lafSet = setQuaquaLookAndFeel();
+    {
+      System.err.println("Could not set requested laf=" + laf);
+    }
+      break;
+    case "vaqua":
+      lafSet = setVaquaLookAndFeel();
+    {
+      System.err.println("Could not set requested laf=" + laf);
+    }
       break;
     case "mac":
       lafSet = setMacLookAndFeel();
@@ -409,6 +443,10 @@ public class Jalview
     if (!lafSet)
     {
       setSystemLookAndFeel();
+      if (Platform.isLinux() && !Platform.isJS())
+      {
+        setMetalLookAndFeel();
+      }
       if (Platform.isAMacAndNotJS())
       {
         setMacLookAndFeel();
@@ -884,13 +922,24 @@ public class Jalview
     return set;
   }
 
-  private static boolean setGtkLookAndFeel()
+  private static boolean setSpecificLookAndFeel(String name,
+          String className, boolean nameStartsWith)
   {
     boolean set = false;
-    String laf = "com.sun.java.swing.plaf.gtk.GTKLookAndFeel";
     try
     {
-      UIManager.setLookAndFeel(laf);
+      for (LookAndFeelInfo info : UIManager.getInstalledLookAndFeels())
+      {
+        if (info.getName() != null && nameStartsWith
+                ? info.getName().toLowerCase()
+                        .startsWith(name.toLowerCase())
+                : info.getName().toLowerCase().equals(name.toLowerCase()))
+        {
+          className = info.getClassName();
+          break;
+        }
+      }
+      UIManager.setLookAndFeel(className);
       set = true;
     } catch (Exception ex)
     {
@@ -900,43 +949,49 @@ public class Jalview
     return set;
   }
 
+  private static boolean setGtkLookAndFeel()
+  {
+    return setSpecificLookAndFeel("gtk",
+            "com.sun.java.swing.plaf.gtk.GTKLookAndFeel", true);
+  }
+
+  private static boolean setMetalLookAndFeel()
+  {
+    return setSpecificLookAndFeel("metal",
+            "javax.swing.plaf.metal.MetalLookAndFeel", false);
+  }
+
+  private static boolean setNimbusLookAndFeel()
+  {
+    return setSpecificLookAndFeel("nimbus",
+            "javax.swing.plaf.nimbus.NimbusLookAndFeel", false);
+  }
+
+  private static boolean setQuaquaLookAndFeel()
+  {
+    return setSpecificLookAndFeel("quaqua",
+            ch.randelshofer.quaqua.QuaquaManager.getLookAndFeel().getClass()
+                    .getName(),
+            false);
+  }
+
+  private static boolean setVaquaLookAndFeel()
+  {
+    return setSpecificLookAndFeel("vaqua",
+            "org.violetlib.aqua.AquaLookAndFeel", false);
+  }
+
   private static boolean setMacLookAndFeel()
   {
     boolean set = false;
-    LookAndFeel lookAndFeel = ch.randelshofer.quaqua.QuaquaManager
-            .getLookAndFeel();
     System.setProperty("com.apple.mrj.application.apple.menu.about.name",
             "Jalview");
     System.setProperty("apple.laf.useScreenMenuBar", "true");
-    if (lookAndFeel != null)
-    {
-      try
-      {
-        UIManager.setLookAndFeel(lookAndFeel);
-        set = true;
-      } catch (Throwable e)
-      {
-        System.err.println(
-                "Failed to set QuaQua look and feel: " + e.toString());
-      }
-    }
-    if (lookAndFeel == null
-            || !(lookAndFeel.getClass().isAssignableFrom(
-                    UIManager.getLookAndFeel().getClass()))
-            || !UIManager.getLookAndFeel().getClass().toString()
-                    .toLowerCase().contains("quaqua"))
+    set = setQuaquaLookAndFeel();
+    if ((!set) || !UIManager.getLookAndFeel().getClass().toString()
+            .toLowerCase().contains("quaqua"))
     {
-      try
-      {
-        System.err.println(
-                "Quaqua LaF not available on this plaform. Using VAqua(4).\nSee https://issues.jalview.org/browse/JAL-2976");
-        UIManager.setLookAndFeel("org.violetlib.aqua.AquaLookAndFeel");
-        set = true;
-      } catch (Throwable e)
-      {
-        System.err
-                .println("Failed to reset look and feel: " + e.toString());
-      }
+      set = setVaquaLookAndFeel();
     }
     return set;
   }