Merge branch 'task/JAL-3609_HiDPI_support_in_java' into task/JAL-3608_and_JAL-3609_me...
authorBen Soares <b.soares@dundee.ac.uk>
Wed, 8 Jul 2020 11:25:26 +0000 (12:25 +0100)
committerBen Soares <b.soares@dundee.ac.uk>
Wed, 8 Jul 2020 11:25:26 +0000 (12:25 +0100)
1  2 
src/jalview/bin/Jalview.java

@@@ -40,8 -40,8 +40,8 @@@ import java.util.HashMap
  import java.util.Map;
  import java.util.Vector;
  
 -import javax.swing.LookAndFeel;
  import javax.swing.UIManager;
 +import javax.swing.UIManager.LookAndFeelInfo;
  
  import com.threerings.getdown.util.LaunchUtil;
  
@@@ -297,7 -297,51 +297,7 @@@ public class Jalvie
  
      desktop = null;
  
 -    try
 -    {
 -      UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
 -    } catch (Exception ex)
 -    {
 -      System.err.println("Unexpected Look and Feel Exception");
 -      ex.printStackTrace();
 -    }
 -    if (Platform.isAMac())
 -    {
 -
 -      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);
 -        } 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"))
 -      {
 -        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");
 -        } catch (Throwable e)
 -        {
 -          System.err.println(
 -                  "Failed to reset look and feel: " + e.toString());
 -        }
 -      }
 -    }
 +    setLookAndFeel();
  
      /*
       * configure 'full' SO model if preferences say to, else use the default (SO
  
      if (!headless)
      {
        desktop = new Desktop();
        desktop.setInBatchMode(true); // indicate we are starting up
  
          JalviewTaskbar.setTaskbar(this);
        } catch (Exception e)
        {
 -        System.out.println("Cannot set Taskbar");
 +        Cache.log.info("Cannot set Taskbar");
 +        Cache.log.error(e.getMessage());
          // e.printStackTrace();
        } catch (Throwable t)
        {
 -        System.out.println("Cannot set Taskbar");
 +        Cache.log.info("Cannot set Taskbar");
 +        Cache.log.error(t.getMessage());
          // t.printStackTrace();
        }
  
      }
    }
  
 +  private static void setLookAndFeel()
 +  {
 +    // property laf = "crossplatform", "system", "gtk", "metal", "nimbus" or
 +    // "mac"
 +    // If not set (or chosen laf fails), use the normal SystemLaF and if on Mac,
 +    // try Quaqua/Vaqua.
 +    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)
 +    {
 +    case "crossplatform":
 +      lafSet = setCrossPlatformLookAndFeel();
 +      if (!lafSet)
 +      {
 +        Cache.log.error("Could not set requested laf=" + laf);
 +      }
 +      break;
 +    case "system":
 +      lafSet = setSystemLookAndFeel();
 +      if (!lafSet)
 +      {
 +        Cache.log.error("Could not set requested laf=" + laf);
 +      }
 +      break;
 +    case "gtk":
 +      lafSet = setGtkLookAndFeel();
 +      if (!lafSet)
 +      {
 +        Cache.log.error("Could not set requested laf=" + laf);
 +      }
 +      break;
 +    case "metal":
 +      lafSet = setMetalLookAndFeel();
 +      if (!lafSet)
 +      {
 +        Cache.log.error("Could not set requested laf=" + laf);
 +      }
 +      break;
 +    case "nimbus":
 +      lafSet = setNimbusLookAndFeel();
 +      if (!lafSet)
 +      {
 +        Cache.log.error("Could not set requested laf=" + laf);
 +      }
 +      break;
 +    case "quaqua":
 +      lafSet = setQuaquaLookAndFeel();
 +      if (!lafSet)
 +      {
 +        Cache.log.error("Could not set requested laf=" + laf);
 +      }
 +      break;
 +    case "vaqua":
 +      lafSet = setVaquaLookAndFeel();
 +      if (!lafSet)
 +      {
 +        Cache.log.error("Could not set requested laf=" + laf);
 +      }
 +      break;
 +    case "mac":
 +      lafSet = setMacLookAndFeel();
 +      if (!lafSet)
 +      {
 +        Cache.log.error("Could not set requested laf=" + laf);
 +      }
 +      break;
 +    case "none":
 +      break;
 +    default:
 +      Cache.log.error("Requested laf=" + laf + " not implemented");
 +    }
 +    if (!lafSet)
 +    {
 +      setSystemLookAndFeel();
 +      if (Platform.isLinux())
 +      {
 +        setMetalLookAndFeel();
 +      }
 +      if (Platform.isAMac())
 +      {
 +        setMacLookAndFeel();
 +      }
 +    }
 +  }
 +
 +  private static boolean setCrossPlatformLookAndFeel()
 +  {
 +    boolean set = false;
 +    try
 +    {
 +      UIManager.setLookAndFeel(
 +              UIManager.getCrossPlatformLookAndFeelClassName());
 +      set = true;
 +    } catch (Exception ex)
 +    {
 +      Cache.log.error("Unexpected Look and Feel Exception");
 +      Cache.log.error(ex.getMessage());
 +      Cache.log.debug(Cache.getStackTraceString(ex));
 +    }
 +    return set;
 +  }
 +
 +  private static boolean setSystemLookAndFeel()
 +  {
 +    boolean set = false;
 +    try
 +    {
 +      UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
 +      set = true;
 +    } catch (Exception ex)
 +    {
 +      Cache.log.error("Unexpected Look and Feel Exception");
 +      Cache.log.error(ex.getMessage());
 +      Cache.log.debug(Cache.getStackTraceString(ex));
 +    }
 +    return set;
 +  }
 +
 +  private static boolean setSpecificLookAndFeel(String name,
 +          String className, boolean nameStartsWith)
 +  {
 +    boolean set = false;
 +    try
 +    {
 +      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)
 +    {
 +      Cache.log.error("Unexpected Look and Feel Exception");
 +      Cache.log.error(ex.getMessage());
 +      Cache.log.debug(Cache.getStackTraceString(ex));
 +    }
 +    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;
 +    System.setProperty("com.apple.mrj.application.apple.menu.about.name",
 +            "Jalview");
 +    System.setProperty("apple.laf.useScreenMenuBar", "true");
 +    set = setQuaquaLookAndFeel();
 +    if ((!set) || !UIManager.getLookAndFeel().getClass().toString()
 +            .toLowerCase().contains("quaqua"))
 +    {
 +      set = setVaquaLookAndFeel();
 +    }
 +    return set;
 +  }
 +
    private static void showUsage()
    {
      System.out.println(