Merge branch 'develop' into releases/Release_2_11_2_Branch
authorJim Procter <j.procter@dundee.ac.uk>
Wed, 2 Mar 2022 20:51:16 +0000 (20:51 +0000)
committerJim Procter <j.procter@dundee.ac.uk>
Wed, 2 Mar 2022 20:51:16 +0000 (20:51 +0000)
56 files changed:
build.gradle
getdown/lib/FJVL_VERSION
getdown/lib/JVL_VERSION
getdown/lib/getdown-core.jar
getdown/lib/getdown-launcher-local.jar
getdown/lib/getdown-launcher.jar
getdown/src/getdown/ant/pom.xml
getdown/src/getdown/core/pom.xml
getdown/src/getdown/core/src/main/java/com/threerings/getdown/data/Application.java
getdown/src/getdown/core/src/main/java/com/threerings/getdown/data/EnvConfig.java
getdown/src/getdown/core/src/main/java/com/threerings/getdown/util/LaunchUtil.java
getdown/src/getdown/core/src/main/java/jalview/bin/HiDPISetting.java
getdown/src/getdown/core/src/main/java/jalview/bin/MemorySetting.java
getdown/src/getdown/core/src/main/java/jalview/util/StringUtils.java
getdown/src/getdown/launcher/pom.xml
getdown/src/getdown/mvn_cmd
getdown/src/getdown/pom.xml
gradle.properties
help/help/help.jhm
help/help/helpTOC.xml
help/help/html/features/chimera.html
help/help/html/features/clarguments.html
help/help/html/features/preferences.html
help/help/html/features/pymol.html
help/help/html/features/structurechooser.html
help/help/html/io/fileformats.html
help/help/html/memory.html
help/help/html/releases.html
help/help/html/whatsNew.html
j11lib/getdown-core.jar
j8lib/getdown-core.jar
resources/lang/Messages.properties
src/ext/edu/ucsf/rbvi/strucviz2/ChimUtils.java
src/ext/edu/ucsf/rbvi/strucviz2/StructureManager.java
src/jalview/bin/Jalview.java
src/jalview/bin/MemorySetting.java
src/jalview/ext/pymol/PymolCommands.java
src/jalview/ext/pymol/PymolManager.java
src/jalview/ext/rbvi/chimera/JalviewChimeraBinding.java
src/jalview/gui/ChimeraViewFrame.java
src/jalview/gui/Desktop.java
src/jalview/gui/PymolBindingModel.java
src/jalview/gui/PymolViewer.java
src/jalview/gui/SplashScreen.java
src/jalview/util/StringUtils.java
src/jalview/ws/dbsources/Pfam.java
src/jalview/ws/dbsources/Rfam.java
src/jalview/ws/ebi/EBIFetchClient.java
src/mc_view/PDBChain.java
src/org/json/simple/JSONValue.java
src/org/stackoverflowusers/file/WindowsShortcut.java
test/jalview/ext/pymol/PymolCommandsTest.java
utils/dev_macos_install.sh
utils/download_jres.sh
utils/install4j/install4j9_template.install4j [new file with mode: 0644]
utils/osx_signing/README

index 34a3461..cf96abf 100644 (file)
@@ -40,7 +40,7 @@ plugins {
   id 'eclipse'
   id "com.diffplug.gradle.spotless" version "3.28.0"
   id 'com.github.johnrengelman.shadow' version '4.0.3'
-  id 'com.install4j.gradle' version '8.0.10'
+  id 'com.install4j.gradle' version '9.0.6'
   id 'com.dorongold.task-tree' version '1.5' // only needed to display task dependency tree with  gradle task1 [task2 ...] taskTree
   id 'com.palantir.git-version' version '0.12.3'
 }
@@ -450,11 +450,11 @@ ext {
     jreInstallsDir = System.getProperty("user.home") + jreInstallsDir.substring(1)
   }
   macosJavaVMDir = string("${jreInstallsDir}/jre-${JAVA_INTEGER_VERSION}-mac-x64/jre")
-  macosJavaVMTgz = string("${jreInstallsDir}/tgz/jre-${JAVA_INTEGER_VERSION}-mac-x64.tar.gz")
   windowsJavaVMDir = string("${jreInstallsDir}/jre-${JAVA_INTEGER_VERSION}-windows-x64/jre")
-  windowsJavaVMTgz = string("${jreInstallsDir}/tgz/jre-${JAVA_INTEGER_VERSION}-windows-x64.tar.gz")
   linuxJavaVMDir = string("${jreInstallsDir}/jre-${JAVA_INTEGER_VERSION}-linux-x64/jre")
-  linuxJavaVMTgz = string("${jreInstallsDir}/tgz/jre-${JAVA_INTEGER_VERSION}-linux-x64.tar.gz")
+  macosJavaVMTgz = string("${jreInstallsDir}/tgz/jre_${JAVA_INTEGER_VERSION}_mac_x64.tar.gz")
+  windowsJavaVMTgz = string("${jreInstallsDir}/tgz/jre_${JAVA_INTEGER_VERSION}_windows_x64.tar.gz")
+  linuxJavaVMTgz = string("${jreInstallsDir}/tgz/jre_${JAVA_INTEGER_VERSION}_linux_x64.tar.gz")
   install4jDir = string("${jalviewDir}/${install4j_utils_dir}")
   install4jConfFileName = string("jalview-install4j-conf.install4j")
   install4jConfFile = file("${install4jDir}/${install4jConfFileName}")
@@ -1816,6 +1816,11 @@ task copyInstall4jTemplate {
       }
     }
 
+    // disable install screen for OSX dmg (for 2.11.2.0)
+    install4jConfigXml.'**'.macosArchive.each { macosArchive -> 
+      macosArchive.'@executeSetupApp' = "false"
+    }
+
     // turn off checksum creation for LOCAL channel
     def e = install4jConfigXml.application[0]
     if (CHANNEL == "LOCAL") {
index 2cac91c..4a5376d 100644 (file)
@@ -1 +1 @@
-1.8.3-1.2.11_FJVL
+1.8.3-1.2.12_FJVL
index 99f8359..ed249ad 100644 (file)
@@ -1 +1 @@
-1.8.3-1.2.11_JVL
+1.8.3-1.2.12_JVL
index a11a269..2e695eb 100644 (file)
Binary files a/getdown/lib/getdown-core.jar and b/getdown/lib/getdown-core.jar differ
index 4ac9d5d..fd89e15 100644 (file)
Binary files a/getdown/lib/getdown-launcher-local.jar and b/getdown/lib/getdown-launcher-local.jar differ
index 999c3fa..38c3a19 100644 (file)
Binary files a/getdown/lib/getdown-launcher.jar and b/getdown/lib/getdown-launcher.jar differ
index e67984c..881c952 100644 (file)
@@ -4,7 +4,7 @@
   <parent>
     <groupId>com.threerings.getdown</groupId>
     <artifactId>getdown</artifactId>
-    <version>1.8.3-1.2.11_FJVL</version>
+    <version>1.8.3-1.2.12_FJVL</version>
   </parent>
 
   <artifactId>getdown-ant</artifactId>
index f909444..3e52eca 100644 (file)
@@ -4,7 +4,7 @@
   <parent>
     <groupId>com.threerings.getdown</groupId>
     <artifactId>getdown</artifactId>
-    <version>1.8.3-1.2.11_FJVL</version>
+    <version>1.8.3-1.2.12_FJVL</version>
   </parent>
 
   <artifactId>getdown-core</artifactId>
index 9deb5bc..8048728 100644 (file)
@@ -1248,7 +1248,7 @@ public class Application
           if (j > -1) {
             ext = filename.substring(j+1);
           }
-          if (ext != null && LOCATOR_FILE_EXTENSION.equals(ext.toLowerCase())) {
+          if (ext != null && LOCATOR_FILE_EXTENSION.equals(ext.toLowerCase(Locale.ROOT))) {
             // this file extension should have been dealt with in Getdown class
           } else {
             _appargs.add(0, "-open");
@@ -1997,7 +1997,7 @@ public class Application
         String locatorFilename = filenames.length >= 1 ? filenames[0] : null;
         if (
                 !StringUtil.isBlank(locatorFilename)
-                && locatorFilename.toLowerCase().endsWith("."+Application.LOCATOR_FILE_EXTENSION)
+                && locatorFilename.toLowerCase(Locale.ROOT).endsWith("."+Application.LOCATOR_FILE_EXTENSION)
                 ) {
           setLocatorFile(locatorFilename);
           // remove the locator filename from the filenames array
@@ -2011,7 +2011,7 @@ public class Application
           // skip any other locator files in a multiple file list
           if (filename.startsWith("jalview://") || filename.startsWith("jalviews://")) {
             setJalviewUri(filename);
-          } else if (! filename.toLowerCase().endsWith("."+Application.LOCATOR_FILE_EXTENSION)) {
+          } else if (! filename.toLowerCase(Locale.ROOT).endsWith("."+Application.LOCATOR_FILE_EXTENSION)) {
             addStartupFile(filename);
           }
         }
index 57b8d84..77997d2 100644 (file)
@@ -147,7 +147,7 @@ public final class EnvConfig {
         String argvLocatorFilename = argv.length > 2 ? argv[2] : null;
         if (
                 !StringUtil.isBlank(argvLocatorFilename)
-                && argvLocatorFilename.toLowerCase().endsWith("."+Application.LOCATOR_FILE_EXTENSION)
+                && argvLocatorFilename.toLowerCase(Locale.ROOT).endsWith("."+Application.LOCATOR_FILE_EXTENSION)
                 ) {
           notes.add(Note.info("locatorFilename in args: '"+argv[2]+"'"));
           Application.setLocatorFile(argvLocatorFilename);
index ae493bb..31a69c3 100644 (file)
@@ -139,7 +139,7 @@ public class LaunchUtil
                MessageDigest md = MessageDigest.getInstance(algo);
                md.update(Files.readAllBytes(Paths.get(file.getAbsolutePath())));
                byte[] digest = md.digest();
-               checksum = DatatypeConverter.printHexBinary(digest).toUpperCase();
+               checksum = DatatypeConverter.printHexBinary(digest).toUpperCase(Locale.ROOT);
        } catch (Exception e) {
                System.out.println("Couldn't create "+algo+" digest of "+file.getPath());
        }
index d6d440a..75106cc 100644 (file)
@@ -1,6 +1,8 @@
 package jalview.bin;
 
 import java.awt.HeadlessException;
+import java.util.Locale;
+
 
 public class HiDPISetting
 {
@@ -43,7 +45,7 @@ public class HiDPISetting
   static
   {
     String system = System.getProperty("os.name") == null ? null
-            : System.getProperty("os.name").toLowerCase();
+            : System.getProperty("os.name").toLowerCase(Locale.ROOT);
     if (system != null)
     {
       isLinux = system.indexOf("linux") > -1;
index 55e304d..f5f0196 100644 (file)
@@ -33,6 +33,7 @@ package jalview.bin;
  * @author bsoares
  *
  */
+import java.util.Locale;
 
 public class MemorySetting
 {
@@ -58,10 +59,10 @@ public class MemorySetting
           + "_CUSTOMISED_SETTINGS";
 
   public static final String MEMORY_JVMMEMPC = NS + "_"
-          + MAX_HEAPSIZE_PERCENT_PROPERTY_NAME.toUpperCase();
+          + MAX_HEAPSIZE_PERCENT_PROPERTY_NAME.toUpperCase(Locale.ROOT);
 
   public static final String MEMORY_JVMMEMMAX = NS + "_"
-          + MAX_HEAPSIZE_PROPERTY_NAME.toUpperCase();
+          + MAX_HEAPSIZE_PROPERTY_NAME.toUpperCase(Locale.ROOT);
 
   protected static boolean logToClassChecked = false;
 
index d758395..afb9c89 100644 (file)
@@ -24,6 +24,7 @@ import java.io.UnsupportedEncodingException;
 import java.net.URLEncoder;
 import java.util.ArrayList;
 import java.util.List;
+import java.util.Locale;
 import java.util.regex.Pattern;
 
 public class StringUtils
@@ -409,9 +410,9 @@ public class StringUtils
     }
     if (s.length() <= 1)
     {
-      return s.toUpperCase();
+      return s.toUpperCase(Locale.ROOT);
     }
-    return s.substring(0, 1).toUpperCase() + s.substring(1).toLowerCase();
+    return s.substring(0, 1).toUpperCase(Locale.ROOT) + s.substring(1).toLowerCase(Locale.ROOT);
   }
 
   /**
@@ -427,7 +428,7 @@ public class StringUtils
     {
       return null;
     }
-    String tmp2up = text.toUpperCase();
+    String tmp2up = text.toUpperCase(Locale.ROOT);
     int startTag = tmp2up.indexOf("<HTML>");
     if (startTag > -1)
     {
@@ -572,9 +573,9 @@ public class StringUtils
   public static int firstCharPosIgnoreCase(String text, String chars)
   {
     int min = text.length() + 1;
-    for (char c : chars.toLowerCase().toCharArray())
+    for (char c : chars.toLowerCase(Locale.ROOT).toCharArray())
     {
-      int i = text.toLowerCase().indexOf(c);
+      int i = text.toLowerCase(Locale.ROOT).indexOf(c);
       if (0 <= i && i < min)
       {
         min = i;
index 5284412..df0ebbe 100644 (file)
@@ -4,7 +4,7 @@
   <parent>
     <groupId>com.threerings.getdown</groupId>
     <artifactId>getdown</artifactId>
-    <version>1.8.3-1.2.11_FJVL</version>
+    <version>1.8.3-1.2.12_FJVL</version>
   </parent>
 
   <artifactId>getdown-launcher</artifactId>
index 4ffb086..4a9d2ea 100755 (executable)
@@ -3,7 +3,7 @@
 if [ x$JVLVERSION != x ]; then
   export VERSION=$JVLVERSION
 else
-  export VERSION=1.8.3-1.2.11_JVL
+  export VERSION=1.8.3-1.2.12_JVL
 fi
 
 if [ x${VERSION%_JVL} = x$VERSION ]; then
index 61b1440..87b361e 100644 (file)
@@ -10,7 +10,7 @@
   <groupId>com.threerings.getdown</groupId>
   <artifactId>getdown</artifactId>
   <packaging>pom</packaging>
-  <version>1.8.3-1.2.11_FJVL</version>
+  <version>1.8.3-1.2.12_FJVL</version>
 
   <name>getdown</name>
   <description>An application installer and updater.</description>
index 8eec281..ae8e8ac 100644 (file)
@@ -114,12 +114,12 @@ flexmark_css = utils/doc/github.css
 channel_properties_dir = utils/channels
 channel_props = channel.props
 
-install4j_home_dir = ~/buildtools/install4j8
+install4j_home_dir = ~/buildtools/install4j9
 install4j_copyright_message = ...
 install4j_bundle_id = org.jalview.jalview-desktop
 install4j_utils_dir = utils/install4j
 install4j_images_dir = utils/install4j
-install4j_template = install4j8_template.install4j
+install4j_template = install4j9_template.install4j
 install4j_info_plist_file_associations = file_associations_auto-Info_plist.xml
 install4j_installer_file_associations = file_associations_auto-install4j8.xml
 #install4j_DMG_uninstaller_app_files = uninstall_old_jalview_files.xml
index 449f34c..78eaa70 100755 (executable)
@@ -60,6 +60,7 @@
    <mapID target="varna" url="html/features/varna.html"/>
    <mapID target="xsspannotation" url="html/features/xsspannotation.html"/>
    <mapID target="preferences" url="html/features/preferences.html"/>     
+   <mapID target="startupprefs" url="html/features/preferences.html#startup"/>     
    <mapID target="strucprefs" url="html/features/preferences.html#structure"/>     
    <mapID target="commandline" url="html/features/commandline.html"/>
    <mapID target="clarguments" url="html/features/clarguments.html"/>
    <mapID target="pdbfts" url="html/features/pdbsequencefetcher.html#pdbfts" />
    <mapID target="siftsmapping" url="html/features/siftsmapping.html" />
    <mapID target="pdbchooser" url="html/features/structurechooser.html" />
+   <mapID target="structuresvia3dbeacons" url="html/features/structurechooser.html#3dbeaconssearch" />   
    <mapID target="selectcolbyannot" url="html/features/columnFilterByAnnotation.html" />
    <mapID target="biojsmsa" url="html/features/biojsmsa.html" />
    
index 9f1942c..cbef398 100755 (executable)
        <tocitem text="Jalview Documentation" target="home" expand="true">
                        <tocitem text="What's new" target="new" expand="true">
                                <tocitem text="Latest Release Notes" target="release"/>
-        <tocitem text="Virtual Features in CDS/Protein Views" target="splitframe.virtualfeats"/>
-                               <tocitem text="VCF Variant Attributes" target="importvcf.attribs"/>
-                               <tocitem text="Feature Filters and Attribute Colourschemes" target="features.featureschemes" />
+        <tocitem text="Support for ChimeraX" target="chimera"/>
+                               <tocitem text="Support for Pymol" target="pymol"/>
+                               <tocitem text="Structures via 3D Beacons" target="structuresvia3dbeacons" />
+                               <tocitem text="Startup Memory Settings" target="startupprefs" />
         <tocitem text="The Java Console, Logging and Reporting Bugs" target="logging" />
                </tocitem>
                
                        <tocitem text="PDB Sequence Fetcher" target="pdbfetcher" />
                        <tocitem text="PDB &amp; 3D-Beacons Structure Chooser" target="pdbchooser" />
                        <tocitem text="Jmol Viewer" target="pdbjmol" />
-                       <tocitem text="Chimera Viewer" target="chimera" />
+                       <tocitem text="Chimera/X Viewer" target="chimera" />
                        <tocitem text="Pymol Viewer" target="pymol" />                  
                </tocitem>
                <tocitem text="Viewing RNA structures" target="varna" expand="false"/>
index eadfa06..6edc155 100644 (file)
@@ -31,7 +31,7 @@
     (http://www.cgl.ucsf.edu/chimera/) can be used for viewing
     structures opened via the <a href="structurechooser.html"><strong>&quot;View
     Structure Data..&quot;</strong> dialog</a>. In Jalview 2.11.2, support 
-    was also added for ChimeraX.
+    was also added for ChimeraX, and <a href="pymol.html">Pymol</a>.
   </p>
   <p>
     You can set a default choice of Jmol or Chimera structure viewer in
index 1eecfb9..c0f4c42 100644 (file)
           and usage stats checks)</div></td>
     </tr>
     <tr>
+      <td><div align="center">-nowebservicediscovery</div></td>
+      <td><div align="left">Do not query configured servers to
+          discover web services (<em>Since 2.11.2.0</em>)</div></td>
+    </tr>
+    <tr>
       <td><div align="center">-open FILE/URL</div></td>
       <td><div align="left">Specify the alignment file to
           open or process by providing additional arguments.</div></td>
           file instead of users default.</div></td>
     </tr>
     <tr>
+      <td><div align="center">-setprop PROPERTY=value</div></td>
+      <td><div align="left">(JalviewJS ONLY) sets the given
+          property to the given value</div></td>
+    </tr>
+    <tr>
       <td><div align="center">-features FILE/URL</div></td>
       <td><div align="left">
           <p>
           File</a> description.
       </td>
     </tr>
+        <tr>
+      <td>
+        <div align="center">-no-annotation</div>
+      </td>
+      <td>Do not display annotation below the alignment. 
+      </td>
+    </tr>
+    
     <tr>
       <td>
         <div align="center">-tree FILE/URL</div>
index 5a3fe7a..d091272 100755 (executable)
     <li>The <a href="#editing"><strong>&quot;Editing&quot;</strong>
         Preferences</a> tab contains settings affecting behaviour when editing alignments.
     </li>
+    <li>The <a href="#startup"><strong>&quot;Startup&quot;</strong>
+        Preferences</a> tab allows you to adjust how much memory is
+      allocated to Jalview when it is launched.
+    </li>
     <li>The <a href="../webServices/webServicesPrefs.html"><strong>&quot;Web
           Service&quot;</strong> Preferences</a> tab allows you to configure the <a
       href="http://www.compbio.dundee.ac.uk/jabaws">JABAWS</a>
     loaded onto the alignment will automatically sort the alignment.
   </p>
   <p>&nbsp;</p>
+  <p>
+    <a name="startup"><strong>Startup</strong></a>
+  </p>
+  <p>
+    When Jalview is launched it by default examines the available memory
+    and requests up to 90% to be allocated to the application, or 32G,
+    which ever is smaller. The <em>Startup</em> tab allows you to adjust
+    the maximum percentage and hard limits for Jalview memory allocation
+    stored in your .jalview_properties file.
+  </p>
+  <p>&nbsp;</p>
   <em>Web Services Preferences</em> - documentation for this tab is
   given in the
   <a href="../webServices/webServicesPrefs.html">Web Services
index 573310a..c6a2ae2 100644 (file)
@@ -48,7 +48,7 @@
   <p>
     <strong>Jalview requires Pymol V 2.5.0 (community edition)
       or later</strong> <br />Jalview requires Pymol's RPC interface, which is
-    not available in older versions of the Pymol community edition.
+    not available in older versions of the Pymol community edition. 
   </p>
   <p>
     <strong>Known Limitations</strong><br />
       example project).</li>
     <li>Pymol to Jalview communication does not support transfer of
       properties or highlighting sequence regions corresponding to
-      structure selections or mouse-overs in Pymol.</li>
-    <li>Jalview to Pymol communication currently doesn't highlight
-      the positions on structures corresponging to moused over residues
-      in Jalview.</li>
+      structure selections or mouse-overs in Pymol.</li>      
   </ul>
   <p>
     Basic screen operations (see <a
index 11cad6b..2c77049 100644 (file)
     <strong>Automated discovery of structure data</strong>
   </p>
   <p>
-    After selecting "3D Structure Data ..", Jalview queries the PDB via
+    After selecting "3D Structure Data ..", Jalview queries its available structure data providers. When Uniprot identifiers are available, it queries the <a href="#3dbeaconssearch">3D-Beacons network</a> (since Jalview 2.11.2), otherwise it searches the PDB via
     the PDBe SOLR Rest API provided by EMBL-EBI to discover PDB IDs
     associated with the sequence. It does this based on the sequence's
     ID string, and any other associated database IDs. <br />
-    <br />
-    Since Jalview 2.11.2, you can also <a href="#3dbeaconssearch">initiate a search
-    of the 3D-Beacons Network</a>.
   </p>
   <p>
     <strong><a name="cachedstructview">Viewing existing
     <strong>Selection of the best structure for each sequence</strong>
   </p>
   <p>Jalview can automatically select the best structures according
-    to meta-data provided by the PDB. For alignments with no existing
-    structure data, the 'PDBe Best Quality' structure for each sequence will
-    by default be selected, but clicking on the drop down menu allows
-    other criteria to be chosen, including Resolution (only defined for
-    X-Ray structures), Highest Protein Chain etc. When 'Invert' is
+    to meta-data provided by the search service. The 'PDBe Best Quality' structure for each sequence will
+    by default be selected when no other structure data is available. If 3D-models from other sources are also available, then 'Best 3D Beacons coverage' will be show.
+    <br/><br/>Clicking on the drop down menu allows
+    other criteria to be chosen. For the PDBe, these include including Resolution (only defined for
+    X-Ray structures), Highest Protein Chain etc. When 3D-Beacons results are available, structures can be selected based on their specific provider, or by their coverage of the aligned sequences.<br/>
+    <br/>When 'Invert' is
     selected, structures are selected in reverse order for the current
     criteria (e.g. worst quality rather than best).</p>
   <p>
 
-    <img src="schooser_main.png" style="width: 499px; height: 437px;">
+    <img src="schooser_main.png" style="width: 820px; height: 458px;">
     <!-- <p><img src="schooser_config.png" style="width: 463px; height: 369px; ">
        <p><img src="schooser_drop-down.png" style="width: 464px; height: 368px; ">
        <p><img src="schooser_enter-id.png" style="width: 467px; height: 373px; ">
     <strong><a name="3dbeaconssearch">3D-Beacons Network Search</a></strong>
   </p>
   <p>
-    To initiate a search of the 3D-Beacons Network&mdash;which searches
-    across experimentally determined and predicted structure models from
-    several resources including PDBe, AlphaFold DB, SWISS-MODEL, PED, SASDB, Genome3D and
-    PDBe-KB&mdash;click on the <strong>3D-Beacons Search</strong> button at the top of the
-    Structure Chooser window.
-    <br/>
-    <img src="3dbeacons_button.png"/>
-    <br/>
-    The 3D-Beacons Network search requires UniProt references and Jalview will ask
-    to attempt to fetch these references for the selected sequences.
-    UniProt references might not always be found in which case you can revert to the PDB
-    search.
-    <br/>
-    <img src="3dbeacons_structurechooser.png"/>
-    <br/>
-    If structures are found through the 3D-Beacons network you can filter which structures
-    are shown using the drop-down filter at the top of the Structure Chooser window.
-    <br/>
-    You can view information about each related model, such as the resource providing
-    each model, in the columns displayed. You can sort the list of models by clicking on
-    column headings.
-    <br/>
-    Select and view the structures in the usual way using the <a href="viewingpdbs.html#afterviewbutton">open structure options</a> at
-    the bottom of the Structure Chooser window.
+    3D beacons searches across experimentally determined and predicted
+    structure models from several resources including PDBe, AlphaFold
+    DB, SWISS-MODEL, PED, SASDB, Genome3D and PDBe-KB.<br /> If your
+    sequences have Uniprot identifiers, Jalview will query the
+    3D-Beacons network to discover relevant 3D structures and models.
+    When no uniprot identifiers are available you can initiate Uniprot
+    identifier discovery and a subsequent search of the 3D-Beacons
+    Network by pressing the <strong>3D-Beacons Search</strong> button at
+    the top of the Structure Chooser window. <br /> <img
+      src="3dbeacons_button.png" /> <br />When the search button is
+    pressed, Jalview will ask to attempt to fetch any additional uniprot
+    references for the selected sequences - we do this because fetching
+    large numbers of Uniprot references can take some time. For
+    sequences without Uniprot accessions, Jalview will still search the
+    PDB for potential matches for the sequence's ID string. <br /> 
+       <br /> <img src="3dbeacons_structurechooser.png" /> <br /> <br />
+    3D Beacons provides some additional information for each model,
+    including what positions on the Uniprot sequence have structure
+    data. These metadata (described below) are shown in the columns of
+    the table and used to provide additional filter options.<br />Use
+    the drop-down filter menu and table to browse and select structures,
+    and finally view them using the
+    <a href="viewingpdbs.html#afterviewbutton">open structure
+      options</a> at the bottom of the Structure Chooser window.
   </p>
 
+  <strong>Options for selecting structures from 3D Beacons</strong><br />
+    Structures found through the 3D-Beacons network can be filtered
+    using the drop-down filter at the top of the Structure Chooser
+    window. The options usually available are:
+  
+  <ul>
+    <li><strong>Best 3D Beacons Coverage</strong> - selects one
+      structure for each sequence from available structures those that
+      are the highest quality (ie experimental structures, or highly
+      accurate predictions) and cover the most number of residues in the
+      alignment.</li>
+    <li><strong>3DB Provider - ...</strong> selects the best
+      quality structure for each sequence provided by a specific source
+      (e.g. PDB, EBI-AlphaFold, SwissModel).</li>
+    <li><strong>Multiple 3D-Beacons Coverage</strong> - employs a
+      heuristic to identify structures providing the best quality
+      structure data for every position in each sequence.<br /> <em>Note:
+        structure superpositions may fail when this option is used
+        because the best covering structure set for a sequence often do
+        not overlap.</em></li>
+  </ul>
   <p>
     <strong>Exploration of meta-data for available structures</strong>
   </p>
   <p>Information on each structure available is displayed in columns
     in the dialog box. By default, only the title, resolution and PDB
-    identifier are shown, but many more are provided by the PDBe. To
-    configure which ones are displayed, select the 'Configure Displayed
-    Columns' tab and tick the columns which you want to see.</p>
+    identifier are shown, but many more are provided by the PDBe.
+    3D-Beacons structures have different data, including a quality score
+    (such as Qmeans_DISCO). To configure which ones are displayed,
+    select the 'Configure Displayed Columns' tab and tick the columns
+    which you want to see.</p>
   <p>
     <img src="schooser_enter-id.png"
-      style="width: 464px; height: 173px;">
-      <br/>
-    <strong>Manual selection/association of PDB files with
-      Sequences</strong>
+      style="width: 464px; height: 173px;"> <br /> <strong>Manual
+      selection/association of PDB files with Sequences</strong>
   </p>
   <p>To manually associate PDB files with a sequence, select 'From
     File', or 'Enter PDB Id' from the drop-down menu:
index af4e2c4..bdde33c 100755 (executable)
@@ -93,6 +93,19 @@ td {
       <td width="23%">.phy</td>
     </tr>
     <tr>
+      <td width="17%">EMBL</td>
+      <td width="60%">Line starts with ID, followed by a space, and
+        is followed by a 7 character identifier terminated with a
+        semicolon.</td>
+      <td width="23%">.txt</td>
+    </tr>
+    <tr>
+      <td width="17%">GenBank</td>
+      <td width="60%">Line starts with LOCUS
+      </td>
+      <td width="23%">.gb,.gbk</td>
+    </tr>
+    <tr>
       <td width="17%">JSON</td>
       <td width="60%">Data starts with '{' <br>Data ends with
         '}' <br> <br>See <a
index 7d6fb85..ec57530 100755 (executable)
   </h2>
   <p>When launched as an Application, Jalview will automatically
     configure the amount of memory allocated to the program to be 90% of
-    physical memory. You may wish to change this behaviour -
-    particularly if you are working on a machine that runs other memory
-    intensive processes.
+    physical memory, or 32GB - which ever is smaller.</p>
+  <p>
+    This behaviour might not be ideal if you are working on a machine
+    that runs other memory intensive processes, and (<em>since
+      Jalview 2.11.2</em>) can be changed via the <a
+      ref="preferences.html#startup">Startup Preferences</a> panel.
+  </p>
   <p>
     <em>Signs that Jalview is Running out of Memory</em><br /> If
     Jalview has not explicitly told you that it has run out of memory,
   </p>
 
   <ul>
-    <li><em><font size="3">JVL file</font></em> <br /> The easiest
-      way to launch Jalview with a different percentage of physical
-      memory available is to create a text file with extension <em>.jvl</em>
+    <li><em><font size="3">Jalview's Startup
+          Preferences panel</font></em> <br /> The easiest way to launch Jalview
+      with a different percentage of physical memory available is to
+      adjust your user preferences via the <a
+      ref="preferences.html#startup">Startup Preferences</a> panel.</li>
+    <li><em><font size="3">JVL file</font></em> <br />Another way
+      to adjust launch settings is with a text file with extension <em>.jvl</em>
       and a single line to specify the percentage of memory you wish
       Jalview to request: <pre>
-      jalview.jvmmempc=50</pre> In Windows and in macOS you can then launch Jalview by
-      double clicking on this file, and your memory setting will be used
-      instead of the default value. <br /> <br /> In Linux or other
-      unix variants you can launch Jalview on the command line and
-      provide your JVL file as an argument with <pre>
-      /PATH_TO_JALVIEW/Jalview /path/to/file/mymemorysetting.jvl</pre> If you want to use a memory setting like this and open a
-      file you can use both the jvl and alignment files as command line
-      arguments, but you must put the <em>jvl</em> file first, e.g. <pre>
-      /PATH_TO_JALVIEW/Jalview /path/to/file/mymemorysetting.jvl /path/to/alignments/myalignment.fa</pre> Alternatively, you can use the standard Jalview command line
+      jalview.jvmmempc=50</pre> In Windows and in macOS you can then launch
+      Jalview by double clicking on this file, and your memory setting
+      will be used instead of the default value. <br /> <br /> In
+      Linux or other unix variants you can launch Jalview on the command
+      line and provide your JVL file as an argument with <pre>
+      /PATH_TO_JALVIEW/Jalview /path/to/file/mymemorysetting.jvl</pre> If you
+      want to use a memory setting like this and open a file you can use
+      both the jvl and alignment files as command line arguments, but
+      you must put the <em>jvl</em> file first, e.g. <pre>
+      /PATH_TO_JALVIEW/Jalview /path/to/file/mymemorysetting.jvl /path/to/alignments/myalignment.fa</pre>
+      Alternatively, you can use the standard Jalview command line
       arguments with or without the jvl file (first), e.g. <pre>
-       /PATH_TO_JALVIEW/Jalview /path/to/file/mymemorysetting.jvl -open https://www.jalview.org/examples/jpred_msa.fasta -annotations https://www.jalview.org/examples/jpred_msa.seq.concise -colour Clustal</pre> You can use command line arguments to control memory
-      settings in Windows and macOS too: <br /> In Windows you must
-      use, e.g. <pre>
-      \PATH_TO_JALVIEW\Jalview.exe %HOMEPATH%\mymemorysetting.jvl -open %HOMEPATH%\myalignment.fa</pre> In macOS you can use the macOS <em>open</em> command like this: <pre>
-      open /Applications/Jalview.app --args ~/mymemorysetting.jvl -open ~/myalignment.fa</pre><em>(put all the Jalview arguments <em>after</em> the --args
-        parameter)
-    </em><br/><br/></li>
+       /PATH_TO_JALVIEW/Jalview /path/to/file/mymemorysetting.jvl -open https://www.jalview.org/examples/jpred_msa.fasta -annotations https://www.jalview.org/examples/jpred_msa.seq.concise -colour Clustal</pre>
+      You can use command line arguments to control memory settings in
+      Windows and macOS too: <br /> In Windows you must use, e.g. <pre>
+      \PATH_TO_JALVIEW\Jalview.exe %HOMEPATH%\mymemorysetting.jvl -open %HOMEPATH%\myalignment.fa</pre>
+      In macOS you can use the macOS <em>open</em> command like this: <pre>
+      open /Applications/Jalview.app --args ~/mymemorysetting.jvl -open ~/myalignment.fa</pre><em>(put
+        all the Jalview arguments <em>after</em> the --args parameter)
+    </em><br />
+    <br /></li>
     <li><em><font size="3">Maximum memory limit</em><br/>
       Since 2.11.1.0, Jalview's configuration includes a 'maximum memory limit':
       <pre>jalview.jvmmemmax = 32G</pre>
index 6c86e2e..9f44951 100755 (executable)
 <title>Release History</title>
 <style>
 ul {
-  /* remove bullets, narrower indent */
-  list-style-type: none;
-  margin: 0;
-  padding-left: 10px;
-  padding-bottom: 4px;
+       /* remove bullets, narrower indent */
+       list-style-type: none;
+       margin: 0;
+       padding-left: 10px;
+       padding-bottom: 4px;
 }
 
 li {
-  /* separate the items from eachother */
-  margin-left: -3px;
-  padding-bottom: 3px;
-  padding-left: 6px;
+       /* separate the items from eachother */
+       margin-left: -3px;
+       padding-bottom: 3px;
+       padding-left: 6px;
 }
 
 li:before {
-  /*   doesnt get processed in javahelp */
-  content: '\00b7 ';
-  padding: 3px;
-  margin-left: -14px;
+       /*   doesnt get processed in javahelp */
+       content: '\00b7 ';
+       padding: 3px;
+       margin-left: -14px;
 }
 </style>
 </head>
@@ -59,30 +59,233 @@ li:before {
     <tr>
       <td width="60" align="center" nowrap><strong><a
           id="Jalview.2.11.2">2.11.2</a><a id="Jalview.2.11.2.0">.0</a><br />
-          <em>24/02/2022</em></strong></td>
+          <em>3/03/2022</em></strong></td>
       <td align="left" valign="top">
         <ul>
           <li>
-            <!-- -->
+            <!-- JAL-3616 JAL-3551 JAL-2322 -->Support for viewing 3D
+            structures with ChimeraX and Pymol in addition to Jmol and
+            Chimera.
+          </li>
+          <li>
+            <!-- JAL-3829 -->Discover 3D structure data for sequences
+            with Uniprot references via 3D-Beacons
+          </li>
+          <li>
+            <!-- JAL-3391 -->Rank and select available structures for
+            Uniprot sequences according to number of residues in
+            structure mapped to positions involved in the alignment
+          </li>
+          <li>
+            <!-- JAL-3503 -->New Preferences tab for adjusting Jalview's
+            memory settings at launch
+          </li>
+          <li>
+            <!-- JAL-3144 -->Reverted to Jalview 'classic' drop-down
+            menu for selecting which database to fetch from in sequence
+            fetcher dialog.
           </li>
-        </ul> <!-- <em>Development</em>
+          <li>
+            <!-- JAL-2226 -->Structure annotation rows for all mapped
+            chains in 3D structures are included in the 'Reference
+            Annotation' for a sequence
+          </li>
+          <li>
+            <!-- JAL-1260 -->Import Genbank and EMBL format flatfiles
+          </li>
+          <li>
+            <!-- JAL-3821 -->ENA record's mol_type honoured so RNA
+            molecules imported from ENA records are shown as RNA
+          <li>
+            <!-- JAL-3863 -->Support for Canonical Uniprot IDs
+          </li>
+          <li>
+            <!-- JAL-3204 -->Updated Jalview bindings for Uniprot XML
+            schema
+          </li>
+          <li>
+            <!-- JAL-3926 -->Uniprot and PDBe autosearch option is
+            disabled by default
+          </li>
+          <li>
+            <!-- JAL-3530 -->-nowebservicediscovery command line
+            argument to prevent automatic discovery of analysis
+            webservices on launch
+          </li>
+          <li>
+            <!-- JAL-3618 -->Allow 'App' directories to be opened when
+            locating Chimera, ChimeraX or Pymol binaries via filechooser
+            opened by double clicking the Structure Preferences' path
+            textbox
+          </li>
+          <li>
+            <!-- JAL-3837 -->GPL license info on splash screen and About
+            text
+          </li>
+        </ul>
+        <em>Jalview Native App</em>
         <ul>
+          <li>
+            <!-- JAL- -->New Jalview Develop app - making it even easier
+            to get at Jalview's development builds
+          </li>
+          <li>
+            <!-- JAL-3594 -->New splashscreens for Jalview, Jalview Test
+            and Jalview Develop applications.
+          </li>
+          <li>
+            <!-- JAL-3728 -->Jalview logos shown for Jalview Java
+            Console and other window widgets in taskbar and dock rather
+            than anonymous 'Java' icons
+          </li>
+        </ul> <em>JalviewJS</em>
+        <ul>
+          <li>
+            <!-- JAL-3624 -->PDB structures mapped to Uniprot Sequences with
+            SIFTS
+          </li>
+          <li>
+            <!-- JAL-3208 -->setprop commandline argument reinstated for JalviewJS only 
+          </li>
+          <li>
+            <!-- JAL-3163 -->Missing message bundle keys are only
+            reported once per key (avoids excessive log output in js
+            console)
+          </li>
+          <li>
+            <!-- JAL-3168 -->Feature type is included in the title of
+            the Feature Settings' Colour Chooser dialog
+          </li>
+          <li></li>
+        </ul> <em>Development</em>
+        <ul>
+          <li>
+            <!--   -->First integrated JalviewJS and Jalview release
+          </li>
           <li>Updated building instructions</li>
-        </ul> -->
+          <li>
+            <!-- JAL-3789, JAL-3679 -->Improved JalviewJS/Jalview build
+            process, added support for system package provided eclipse
+            installs on linux
+          </li>
+          <li>Install4j 9.0.x used for installer packaging</li>
+          <li>Notarized MacOS installer for compatibility with Big
+            Sur and Monterey</li>
+          <li>
+            <!-- JAL-3805 -->Uninstaller application for old
+            (InstallAnywhere based) Jalview installations removed from
+            the DMG
+          </li>
+          <li>
+            <!-- JAL-3930 -->Improved use of installers for unattended
+            installation with a customizedId of "JALVIEW" in install4j's
+            Jalview Launcher
+          </li>
+          <li>
+            <!-- JAL-3907 -->Improved compatibility of Jalview build
+            with Java 17 (next LTS target)
+          </li>
+
+        </ul>
 
       </td>
       <td>
         <ul>
           <li>
-            TO DOCUMENT: JAL-3700,JAL-3751,JAL-3763
+            <!-- JAL-3674 -->Slow structure commands can block Jalview
+            execution
+          </li>
+          <li>
+            <!-- JAL-3904 -->Structure window's viewer-specific menu
+            disappears when only one structure is shown (and many
+            sequences:one chain mappings are present)
+          </li>
+          <li>
+            <!-- JAL-3779 -->Annotation file: PROPERTIES apply only to
+            the first SEQUENCE_GROUP defined
+
+          </li>
+
+          <li>
+            <!-- JAL-3700,JAL-3751,JAL-3763, JAL-3725 -->Selections not
+            propagated between Linked CDS - Protein alignments and their
+            trees (known defect from 2.11.1.3)
+          </li>
+          <li>
+            <!-- JAL-3761  -->Not all codon positions highlighted for
+            overlapping exon splice sites (e.g due to RNA slippage)
+          </li>
+          <li>
+            <!-- JAL-3794 -->X was not being recognised as the unknown
+            base in DNA sequences
           </li>
           <li>
             <!-- JAL-3915 -->Removed RNAview checkbox and logic from
             Structure Preferences
           </li>
+          <li>
+            <!--  JAL-3583 -->Tooltip behaviour improved (slightly)
+          </li>
+          <li>
+            <!-- JAL-3162 -->Can edit a feature so that start &gt; end
+          </li>
+          <li>
+            <!-- JAL-2848 -->Cancel from Amend Features doesn't reset a
+            modified graduated colour
+          </li>
+          <li>
+            <!-- JAL-3788 -->New View with automatic 'Show Overview'
+            preference enabled results in Null Pointer Exceptions when
+            clustal colouring is enabled
+          </li>
+          <li>
+            <!-- JAL-3275 -->Can open multiple Preferences panels
+          </li>
+          <li>
+            <!-- JAL-3949 -->Standard out logging broken: messages only
+            routing to stderr and appear as a raw template
+          </li>
+        </ul> <em>JalviewJS</em>
+        <ul>
+          <li>
+            <!-- JAL-3202 -->Consensus profile may include zero (rounded
+            down) percentage values causing a divide by zero
+          </li>
+          <li>
+            <!-- -->
+          </li>
+          <li>
+            <!-- -->
+          </li>
+          <li>
+            <!-- -->
+          </li>
+          <li>
+            <!-- -->
+          </li>
+          <li>
+            <!-- JAL-3762 -->JalviewJS doesn't honour arguments passed
+            via Info.args when there are arguments on the URL
+          </li>
+          <li>
+            <!-- JAL-3602 -->gradle closure-compiler not using UTF-8
+          </li>
+          <li>
+            <!-- JAL-3603 -->Annotation file fails to load from URL in
+            JalviewJS
+          </li>
         </ul> <em>Development</em>
         <ul>
-          <li>Fixed non-fatal gradle errors during build</li>
+          <li>Gradle
+            <ul>
+              <li>Fixed non-fatal gradle errors during build</li>
+              <li>
+                <!--  JAL-3745 -->Updated build.gradle for use with
+                Gradle v.6.6+
+              </li>
+            </ul>
+          </li>
+
         </ul>
       </td>
     </tr>
@@ -114,11 +317,11 @@ li:before {
       <td align="left" valign="top"><em>Security</em>
         <ul>
           <li>
-            <!-- JAL-3934 -->Version bump library dependency: Log4j 2.16.0 to 2.17.0.
-            </li>
+            <!-- JAL-3934 -->Version bump library dependency: Log4j
+            2.16.0 to 2.17.0.
+          </li>
         </ul></td>
-      <td>
-      </td>
+      <td></td>
     </tr>
     <tr>
       <td width="60" align="center" nowrap><strong><a
@@ -335,7 +538,7 @@ li:before {
           <li>
             <!-- JAL-3477 -->Improved built-in documentation and command
             line help for configuring Jalview's memory
-          </li>                   
+          </li>
         </ul>
       </td>
       <td align="left" valign="top">
@@ -436,13 +639,13 @@ li:before {
           <li>
             <!-- JAL-3748 -->CDS shown in result of submitting proteins
             in a CDS/Protein alignment to a web service is wrong when
-            proteins share a common transcript sequence (e.g.
-            genome of RNA viruses)
+            proteins share a common transcript sequence (e.g. genome of
+            RNA viruses)
           </li>
           <li>
-            <!-- JAL-3576 -->Co-located features exported and re-imported
-            are ordered differently when shown on alignment and in
-            tooltips. (Also affects v2.11.1.0)
+            <!-- JAL-3576 -->Co-located features exported and
+            re-imported are ordered differently when shown on alignment
+            and in tooltips. (Also affects v2.11.1.0)
           </li>
           <li>
             <!-- JAL-3702 -->Drag and drop of alignment file onto
@@ -455,7 +658,8 @@ li:before {
           </li>
           <li>
             <!-- JAL-3127 -->Sequence ID colourscheme not re-applied
-            when alignment view restored from project (since Jalview 2.11.0)
+            when alignment view restored from project (since Jalview
+            2.11.0)
           </li>
           <li>
             <!-- JAL-3749 -->Duplicate CDS sequences are generated when
@@ -511,32 +715,42 @@ li:before {
             with no feature types visible
           </li>
           <li>
-          <!-- JAL-3574 -->Improved support for filtering feature attributes with large integer values
+            <!-- JAL-3574 -->Improved support for filtering feature
+            attributes with large integer values
+          </li>
+        </ul>
+        <em>Jalview Installer</em>
+        <ul>
+          <li>
+            <!-- JAL-3449 -->Versions for install4j and getdown and
+            installer template version reported in console (may be null
+            when Jalview launched as executable jar or via conda)
+          </li>
+          <li>
+            <!-- JAL-3393 -->Layout improvements for OSX .dmg Finder and
+            higher quality background images
           </li>
-        </ul><em>Jalview Installer</em>
-           <ul>
           <li>
-            <!-- JAL-3449 -->Versions for install4j and getdown and installer template version reported
-            in console (may be null when Jalview launched as executable jar or via conda)
+            <!-- JAL-3394 -->New installer/application launcher
+            generated with install4j 8.0.4
           </li>
           <li>
-           <!-- JAL-3393 -->Layout improvements for OSX .dmg Finder and higher quality background images
+            <!-- JAL-3420 -->Jalview File Associations shown for Unix
+            Platforms
           </li>
           <li>
-           <!-- JAL-3394 -->New installer/application launcher generated with install4j 8.0.4
+            <!-- JAL-3477 -->Improved defaults for maximum memory
+            setting when running on large memory machines
           </li>
-             <li>
-               <!-- JAL-3420 -->Jalview File Associations shown for Unix Platforms</li>
-             <li>
-               <!-- JAL-3477 -->Improved defaults for maximum memory setting when running on large memory machines</li>
         </ul> <em>Release processes</em>
         <ul>
           <li>
             <!-- JAL-3508 -->New point release version scheme - 2.11.1.0
           </li>
           <li>
-            <!-- JAL-3577 -->'Jalview Test' installers/apps for easier access to test-release channel builds            
-          </li> 
+            <!-- JAL-3577 -->'Jalview Test' installers/apps for easier
+            access to test-release channel builds
+          </li>
         </ul> <em>Build System</em>
         <ul>
           <li>
@@ -546,9 +760,8 @@ li:before {
             <!-- JAL-3513 -->Test code included in Clover coverage
             report
           </li>
-        </ul>
-        <em>Groovy Scripts</em>
-            <ul>
+        </ul> <em>Groovy Scripts</em>
+        <ul>
           <li>
             <!--  JAL-3547 -->exportconsensus.groovy prints a FASTA file
             to stdout containing the consensus sequence for each
@@ -670,57 +883,69 @@ li:before {
             'Source' in console output
           </li>
           <li>
-            <!-- JAL-3562 -->Test Suite: Certain Functional tests fail on jalview's
-            bamboo server but run fine locally.
+            <!-- JAL-3562 -->Test Suite: Certain Functional tests fail
+            on jalview's bamboo server but run fine locally.
           </li>
         </ul>
       </td>
     </tr>
     <tr>
-      <td width="60" align="center" nowrap>
-          <strong><a name="Jalview.2.11.0">2.11.0</a><br />
-            <em>04/07/2019</em></strong>
-      </td>
+      <td width="60" align="center" nowrap><strong><a
+          name="Jalview.2.11.0">2.11.0</a><br /> <em>04/07/2019</em></strong></td>
       <td align="left" valign="top">
         <ul>
           <li>
-            <!-- JAL-1059, JAL-3196,JAL-3007,JAL-3236 -->Jalview Native Application and
-            Installers built with <a href="https://www.ej-technologies.com/products/install4j/overview.html">install4j</a> (licensed to the Jalview open
-            source project) rather than InstallAnywhere
+            <!-- JAL-1059, JAL-3196,JAL-3007,JAL-3236 -->Jalview Native
+            Application and Installers built with <a
+            href="https://www.ej-technologies.com/products/install4j/overview.html">install4j</a>
+            (licensed to the Jalview open source project) rather than
+            InstallAnywhere
           </li>
           <li>
-            <!-- JAL-1929 -->Jalview Launcher System to auto-configure memory
-            settings, receive over the air updates and launch specific
-            versions via (<a href="https://github.com/threerings/getdown">Three
+            <!-- JAL-1929 -->Jalview Launcher System to auto-configure
+            memory settings, receive over the air updates and launch
+            specific versions via (<a
+            href="https://github.com/threerings/getdown">Three
               Rings' GetDown</a>)
           </li>
           <li>
-            <!-- JAL-1839,JAL-3254,JAL-3260 -->File type associations for
-            formats supported by Jalview (including .jvp project files)
+            <!-- JAL-1839,JAL-3254,JAL-3260 -->File type associations
+            for formats supported by Jalview (including .jvp project
+            files)
           </li>
           <li>
-            <!-- JAL-3260 -->Jalview launch files (.jvl) to pass command line
-            arguments and switch between different getdown channels
+            <!-- JAL-3260 -->Jalview launch files (.jvl) to pass command
+            line arguments and switch between different getdown channels
           </li>
           <li>
-            <!-- JAL-3141 -->Backup files created when saving Jalview project
-            or alignment files
+            <!-- JAL-3141 -->Backup files created when saving Jalview
+            project or alignment files
           </li>
 
           <li>
-            <!-- JAL-1793 -->Annotate nucleotide alignments from VCF data files</li>
-            <li><!-- JAL-2753 -->Version of HTSJDK shipped with Jalview updated to version 2.12.0</li> 
+            <!-- JAL-1793 -->Annotate nucleotide alignments from VCF
+            data files
+          </li>
+          <li>
+            <!-- JAL-2753 -->Version of HTSJDK shipped with Jalview
+            updated to version 2.12.0
+          </li>
           <li>
             <!-- JAL-2620 -->Alternative genetic code tables for
-            'Translate as cDNA'</li>
+            'Translate as cDNA'
+          </li>
           <li>
-            <!-- JAL-3018 -->Update of Ensembl Rest Client to API v10.0</li>
-          <li><strong>Enhanced visualisation and analysis of Sequence Features</strong>
+            <!-- JAL-3018 -->Update of Ensembl Rest Client to API v10.0
+          </li>
+          <li><strong>Enhanced visualisation and analysis
+              of Sequence Features</strong>
             <ul>
-                      <li>
-            <!-- JAL-3140 JAL-2446 -->IntervalStoreJ (NCList
-            implementation that allows updates) used for Sequence Feature collections</li>
-          <li>
+              <li>
+                <!-- JAL-3140 JAL-2446 -->IntervalStoreJ (NCList
+                implementation that allows updates) used for Sequence
+                Feature collections
+              </li>
+              <li>
                 <!-- JAL-2744, JAL-2808,JAL-2069,JAL-2820 -->Sequence
                 features can be filtered and shaded according to any
                 associated attributes (e.g. variant attributes from VCF
@@ -732,173 +957,200 @@ li:before {
                 stored and restored from Jalview Projects
               </li>
               <li>
-                <!-- JAL-3334 -->Use full Sequence Ontology (via BioJava) to
-                recognise variant features
+                <!-- JAL-3334 -->Use full Sequence Ontology (via
+                BioJava) to recognise variant features
               </li>
               <li>
-                <!-- JAL-2897,JAL-3330 -->Show synonymous codon variants on peptide
-                sequences (also coloured red by default)
+                <!-- JAL-2897,JAL-3330 -->Show synonymous codon variants
+                on peptide sequences (also coloured red by default)
               </li>
               <li>
-                <!-- JAL-2792 -->Popup window to show full report for a selected sequence feature's
-                details
+                <!-- JAL-2792 -->Popup window to show full report for a
+                selected sequence feature's details
               </li>
               <li>
-                <!-- JAL-3139,JAL-2816,JAL-1117 -->More efficient sequence feature render
-                algorithm (Z-sort/transparency and filter aware)
+                <!-- JAL-3139,JAL-2816,JAL-1117 -->More efficient
+                sequence feature render algorithm (Z-sort/transparency
+                and filter aware)
               </li>
               <li>
-                <!-- JAL-3049,JAL-3054 -->Improved tooltips in Feature Settings
-                dialog
+                <!-- JAL-3049,JAL-3054 -->Improved tooltips in Feature
+                Settings dialog
               </li>
-            </ul>
-          </li>
+            </ul></li>
           <li>
-            <!-- JAL-3205 -->Symmetric score matrices for faster
-            tree and PCA calculations
+            <!-- JAL-3205 -->Symmetric score matrices for faster tree
+            and PCA calculations
           </li>
           <li><strong>Principal Components Analysis Viewer</strong>
             <ul>
               <li>
-                <!-- JAL-1767,JAL-2647 -->Principal Components Analysis results
-                and Viewer state saved in Jalview Project
+                <!-- JAL-1767,JAL-2647 -->Principal Components Analysis
+                results and Viewer state saved in Jalview Project
+              </li>
+              <li>
+                <!-- JAL-2962 -->'Change parameters' option removed from
+                viewer's drop-down menus
               </li>
-              <li><!-- JAL-2962 -->'Change parameters' option removed from viewer's
-                drop-down menus</li>
               <li>
-                <!-- JAL-2975 -->Can use shift + arrow keys to rotate PCA image
-                incrementally
+                <!-- JAL-2975 -->Can use shift + arrow keys to rotate
+                PCA image incrementally
               </li>
               <li>
                 <!-- JAL-2965, JAL-1285 -->PCA plot is depth cued
               </li>
-            </ul>
-          </li>
+            </ul></li>
           <li>
             <!-- JAL-3127 -->New 'Colour by Sequence ID' option
           </li>
           <li><strong>Speed and Efficiency</strong>
-          <ul>
+            <ul>
               <li>
-                <!-- JAL-2185,JAL-3198 -->More efficient creation of selections and
-                multiple groups when working with large alignments
+                <!-- JAL-2185,JAL-3198 -->More efficient creation of
+                selections and multiple groups when working with large
+                alignments
               </li>
               <li>
-                <!-- JAL-3200 -->Speedier import of annotation rows when parsing
-                Stockholm files
+                <!-- JAL-3200 -->Speedier import of annotation rows when
+                parsing Stockholm files
               </li>
             </ul>
           <li><strong>User Interface</strong>
-          <ul>
+            <ul>
               <li>
-                <!-- JAL-2933 -->Finder panel remembers last position in each
-                view
+                <!-- JAL-2933 -->Finder panel remembers last position in
+                each view
               </li>
               <li>
-                <!-- JAL-2527 JAL-3203 -->Alignment Overview now WYSIWIS (What you see is
-                what is shown)<br />Only visible regions of alignment are shown by
-                default (can be changed in user preferences)
+                <!-- JAL-2527 JAL-3203 -->Alignment Overview now WYSIWIS
+                (What you see is what is shown)<br />Only visible
+                regions of alignment are shown by default (can be
+                changed in user preferences)
               </li>
               <li>
-                <!-- JAL-3169 -->File Chooser stays open after responding Cancel
-                to the Overwrite Dialog
+                <!-- JAL-3169 -->File Chooser stays open after
+                responding Cancel to the Overwrite Dialog
               </li>
               <li>
-                <!-- JAL-2420,JAL-3166 -->Better popup menu behaviour when all
-                sequences are hidden
+                <!-- JAL-2420,JAL-3166 -->Better popup menu behaviour
+                when all sequences are hidden
               </li>
               <li>
                 <!-- JAL-1244 -->Status bar shows bounds when dragging a
-                selection region, and gap count when inserting or deleting gaps
+                selection region, and gap count when inserting or
+                deleting gaps
               </li>
               <li>
-                <!-- JAL-3132 -->Status bar updates over sequence and annotation
-                labels
+                <!-- JAL-3132 -->Status bar updates over sequence and
+                annotation labels
               </li>
               <li>
-                <!-- JAL-3093 -->Annotation tooltips and popup menus are shown
-                when in wrapped mode
+                <!-- JAL-3093 -->Annotation tooltips and popup menus are
+                shown when in wrapped mode
               </li>
               <li>
-                <!-- JAL-3073 -->Can select columns by dragging left/right in a graph or histogram
-                annotation
+                <!-- JAL-3073 -->Can select columns by dragging
+                left/right in a graph or histogram annotation
               </li>
               <li>
-                <!-- JAL-2814,JAL-437 -->Help button on Uniprot and PDB search panels
+                <!-- JAL-2814,JAL-437 -->Help button on Uniprot and PDB
+                search panels
               </li>
               <li>
-                <!-- JAL-2621 -->Cursor changes over draggable box in Overview
-                panel
+                <!-- JAL-2621 -->Cursor changes over draggable box in
+                Overview panel
               </li>
               <li>
-                <!-- JAL-3181 -->Consistent ordering of links in sequence id
-                popup menu
+                <!-- JAL-3181 -->Consistent ordering of links in
+                sequence id popup menu
               </li>
               <li>
-              <!-- JAL-3080 -->Red line indicating tree-cut position not shown if no subgroups are created</li>
+                <!-- JAL-3080 -->Red line indicating tree-cut position
+                not shown if no subgroups are created
+              </li>
               <li>
-              <!-- JAL-3042 -->Removed ability to configure length of search history by right-clicking search box</li>
-              
-               
+                <!-- JAL-3042 -->Removed ability to configure length of
+                search history by right-clicking search box
+              </li>
+
+
             </ul></li>
-            <li><!-- JAL-3232 -->Jalview Groovy Scripting Console updated to Groovy v2.5</li> 
-          <li><strong>Java 11 Support (not yet on general release)</strong>
+          <li>
+            <!-- JAL-3232 -->Jalview Groovy Scripting Console updated to
+            Groovy v2.5
+          </li>
+          <li><strong>Java 11 Support (not yet on general
+              release)</strong>
             <ul>
               <li>
-                <!--  -->OSX GUI integrations for App menu's 'About' entry and
-                trapping CMD-Q
+                <!--  -->OSX GUI integrations for App menu's 'About'
+                entry and trapping CMD-Q
               </li>
             </ul></li>
-        </ul>
-        <em>Deprecations</em>
+        </ul> <em>Deprecations</em>
         <ul>
-          <li><!-- JAL-3035 -->DAS sequence retrieval and annotation
+          <li>
+            <!-- JAL-3035 -->DAS sequence retrieval and annotation
             capabilities removed from the Jalview Desktop
           </li>
-          <li><!-- JAL-3063,JAL-3116 -->Castor library for XML marshalling and
-            unmarshalling has been replaced by JAXB for Jalview projects
-            and XML based data retrieval clients</li>
-          <li><!-- JAL-3311 -->Disable VAMSAS menu in preparation for removal</li> 
-          <li><!--  -->Jalview Desktop no longer distributed via Java Web Start</li>
+          <li>
+            <!-- JAL-3063,JAL-3116 -->Castor library for XML marshalling
+            and unmarshalling has been replaced by JAXB for Jalview
+            projects and XML based data retrieval clients
+          </li>
+          <li>
+            <!-- JAL-3311 -->Disable VAMSAS menu in preparation for
+            removal
+          </li>
+          <li>
+            <!--  -->Jalview Desktop no longer distributed via Java Web
+            Start
+          </li>
         </ul> <em>Documentation</em>
         <ul>
-          <li><!-- JAL-3003 -->Added remarks about transparent rendering effects
-            not supported in EPS figure export
+          <li>
+            <!-- JAL-3003 -->Added remarks about transparent rendering
+            effects not supported in EPS figure export
+          </li>
+          <li>
+            <!-- JAL-2903 -->Typos in documentation for Preferences
+            dialog
           </li>
-          <li><!-- JAL-2903 -->Typos in documentation for Preferences dialog</li>
         </ul> <em>Development and Release Processes</em>
         <ul>
           <li>
-          <!-- JAL-3196,JAL-3179.JAL-2671 -->Build system migrated from Ant to Gradle
+            <!-- JAL-3196,JAL-3179.JAL-2671 -->Build system migrated
+            from Ant to Gradle
+          </li>
+          <li>
+            <!-- JAL-1424 -->Enhanced checks for missing and duplicated
+            keys in Message bundles
           </li>
-      <li>
-      <!-- JAL-1424 -->Enhanced checks for missing and duplicated keys in Message bundles</li>
           <li>
-          <!-- JAL-3225 -->Eclipse project configuration managed with
+            <!-- JAL-3225 -->Eclipse project configuration managed with
             gradle-eclipse
           </li>
           <li>
-          <!-- JAL-3174,JAL-2886,JAL-2729,JAL-1889 -->Atlassian
-            Bamboo continuous integration for unattended Test Suite
-            execution
+            <!-- JAL-3174,JAL-2886,JAL-2729,JAL-1889 -->Atlassian Bamboo
+            continuous integration for unattended Test Suite execution
           </li>
           <li>
-          <!-- JAL-2864 -->Memory test suite to detect leaks in common
+            <!-- JAL-2864 -->Memory test suite to detect leaks in common
             operations
           </li>
           <li>
-          <!-- JAL-2360,JAL-2416 -->More unit test coverage, and minor
+            <!-- JAL-2360,JAL-2416 -->More unit test coverage, and minor
             issues resolved
           </li>
           <li>
-          <!-- JAL-3248 -->Developer documentation migrated to
+            <!-- JAL-3248 -->Developer documentation migrated to
             markdown (with HTML rendering)
           </li>
           <li>
-          <!-- JAL-3287 -->HelpLinksChecker runs on Windows
+            <!-- JAL-3287 -->HelpLinksChecker runs on Windows
           </li>
           <li>
-          <!-- JAL-3289 -->New URLs for publishing development
+            <!-- JAL-3289 -->New URLs for publishing development
             versions of Jalview
           </li>
         </ul>
@@ -913,16 +1165,17 @@ li:before {
             superposition in Jmol fail on Windows
           </li>
           <li>
-            <!-- JAL-3286 -->Blank error dialog is displayed when discovering
-            structures for sequences with lots of PDB structures
+            <!-- JAL-3286 -->Blank error dialog is displayed when
+            discovering structures for sequences with lots of PDB
+            structures
           </li>
           <li>
-            <!-- JAL-3239 -->Text misaligned in EPS or SVG image export with
-            monospaced font
+            <!-- JAL-3239 -->Text misaligned in EPS or SVG image export
+            with monospaced font
           </li>
           <li>
-            <!-- JAL-3171 -->Warning of 'Duplicate entry' when saving Jalview
-            project involving multiple views
+            <!-- JAL-3171 -->Warning of 'Duplicate entry' when saving
+            Jalview project involving multiple views
           </li>
           <li>
             <!-- JAL-3164 -->Overview for complementary view in a linked
@@ -930,79 +1183,81 @@ li:before {
             Annotation dialog hides columns
           </li>
           <li>
-            <!-- JAL-3158 -->Selection highlighting in the complement of a
-            CDS/Protein alignment stops working after making a selection in
-            one view, then making another selection in the other view
+            <!-- JAL-3158 -->Selection highlighting in the complement of
+            a CDS/Protein alignment stops working after making a
+            selection in one view, then making another selection in the
+            other view
           </li>
           <li>
             <!-- JAL-3161 -->Annotations tooltip changes beyond visible
             columns
           </li>
           <li>
-            <!-- JAL-3154 -->Table Columns could be re-ordered in Feature
-            Settings and Jalview Preferences panels
+            <!-- JAL-3154 -->Table Columns could be re-ordered in
+            Feature Settings and Jalview Preferences panels
           </li>
           <li>
-            <!-- JAL-2865 -->Jalview hangs when closing windows, or redrawing the
-            overview with large alignments
+            <!-- JAL-2865 -->Jalview hangs when closing windows, or
+            redrawing the overview with large alignments
           </li>
           <li>
             <!-- JAL-2750 -->Tree and PCA calculation fails for selected
-            region if columns were selected by dragging right-to-left and the
-            mouse moved to the left of the first column
+            region if columns were selected by dragging right-to-left
+            and the mouse moved to the left of the first column
           </li>
           <li>
-            <!-- JAL-3218 -->Couldn't hide selected columns adjacent to a
-            hidden column marker via scale popup menu
+            <!-- JAL-3218 -->Couldn't hide selected columns adjacent to
+            a hidden column marker via scale popup menu
           </li>
           <li>
-            <!-- JAL-2846 -->Error message for trying to load in invalid URLs
-            doesn't tell users the invalid URL
+            <!-- JAL-2846 -->Error message for trying to load in invalid
+            URLs doesn't tell users the invalid URL
           </li>
           <li>
             <!-- JAL-2816 -->Tooltips displayed for features filtered by
             score from view
           </li>
           <li>
-            <!-- JAL-3330 -->Sequence Variants retrieved from Ensembl during
-            show cross references or Fetch Database References are shown in
-            red in original view
+            <!-- JAL-3330 -->Sequence Variants retrieved from Ensembl
+            during show cross references or Fetch Database References
+            are shown in red in original view
           </li>
           <li>
-            <!-- JAL-2898,JAL-2207 -->stop_gained variants not shown correctly on
-            peptide sequence (computed variant shown as p.Res.null)
+            <!-- JAL-2898,JAL-2207 -->stop_gained variants not shown
+            correctly on peptide sequence (computed variant shown as
+            p.Res.null)
           </li>
           <li>
             <!-- JAL-2060 -->'Graduated colour' option not offered for
             manually created features (where feature score is Float.NaN)
           </li>
           <li>
-            <!-- JAL-3097,JAL-3099 -->Blank extra columns drawn or printed
-            when columns are hidden
+            <!-- JAL-3097,JAL-3099 -->Blank extra columns drawn or
+            printed when columns are hidden
           </li>
           <li>
             <!-- JAL-3082 -->Regular expression error for '(' in Select
             Columns by Annotation description
           </li>
           <li>
-            <!-- JAL-3072 -->Scroll doesn't stop on mouse up after dragging
-            out of Scale or Annotation Panel
+            <!-- JAL-3072 -->Scroll doesn't stop on mouse up after
+            dragging out of Scale or Annotation Panel
           </li>
           <li>
-            <!-- JAL-3075 -->Column selection incorrect after scrolling out of
-            scale panel
+            <!-- JAL-3075 -->Column selection incorrect after scrolling
+            out of scale panel
           </li>
           <li>
             <!-- JAL-3074 -->Left/right drag in annotation can scroll
             alignment down
           </li>
           <li>
-            <!-- JAL-3108 -->Error if mouse moved before clicking Reveal in
-            scale panel
+            <!-- JAL-3108 -->Error if mouse moved before clicking Reveal
+            in scale panel
           </li>
           <li>
-            <!-- JAL-3002 -->Column display is out by one after Page Down,
-            Page Up in wrapped mode
+            <!-- JAL-3002 -->Column display is out by one after Page
+            Down, Page Up in wrapped mode
           </li>
           <li>
             <!-- JAL-2839,JAL-781 -->Finder doesn't skip hidden regions
@@ -1011,24 +1266,24 @@ li:before {
             <!-- JAL-2932 -->Finder searches in minimised alignments
           </li>
           <li>
-            <!-- JAL-2250 -->'Apply Colour to All Groups' not always selected
-            on opening an alignment
+            <!-- JAL-2250 -->'Apply Colour to All Groups' not always
+            selected on opening an alignment
           </li>
           <li>
-            <!-- JAL-3180 -->'Colour by Annotation' not marked selected in
-            Colour menu
+            <!-- JAL-3180 -->'Colour by Annotation' not marked selected
+            in Colour menu
           </li>
           <li>
-            <!-- JAL-3201 -->Per-group Clustal colour scheme changes when
-            different groups in the alignment are selected
+            <!-- JAL-3201 -->Per-group Clustal colour scheme changes
+            when different groups in the alignment are selected
           </li>
           <li>
-            <!-- JAL-2717 -->Internationalised colour scheme names not shown
-            correctly in menu
+            <!-- JAL-2717 -->Internationalised colour scheme names not
+            shown correctly in menu
           </li>
           <li>
-            <!-- JAL-3206 -->Colour by Annotation can go black at min/max
-            threshold limit
+            <!-- JAL-3206 -->Colour by Annotation can go black at
+            min/max threshold limit
           </li>
           <li>
             <!-- JAL-3125 -->Value input for graduated feature colour
@@ -1039,56 +1294,59 @@ li:before {
             colour
           </li>
           <li>
-            <!-- JAL-2963 -->PCA points don't dim when rotated about y axis
+            <!-- JAL-2963 -->PCA points don't dim when rotated about y
+            axis
           </li>
           <li>
             <!-- JAL-2959 -->PCA Print dialog continues after Cancel
           </li>
           <li>
-            <!-- JAL-3078 -->Cancel in Tree Font dialog resets alignment, not
-            Tree font
+            <!-- JAL-3078 -->Cancel in Tree Font dialog resets
+            alignment, not Tree font
           </li>
           <li>
-            <!-- JAL-2964 -->Associate Tree with All Views not restored from
-            project file
+            <!-- JAL-2964 -->Associate Tree with All Views not restored
+            from project file
           </li>
           <li>
-            <!-- JAL-2915 -->Scrolling of split frame is sluggish if Overview
-            shown in complementary view
+            <!-- JAL-2915 -->Scrolling of split frame is sluggish if
+            Overview shown in complementary view
           </li>
           <li>
-            <!-- JAL-3313 -->Codon consensus incorrectly scaled when shown
-            without normalisation
+            <!-- JAL-3313 -->Codon consensus incorrectly scaled when
+            shown without normalisation
           </li>
           <li>
-            <!-- JAL-3021 -->Sequence Details report should open positioned at top
-            of report
+            <!-- JAL-3021 -->Sequence Details report should open
+            positioned at top of report
           </li>
           <li>
             <!-- JAL-914 -->Help page can be opened twice
           </li>
           <li>
-          <!-- JAL-3333 -->Fuzzy text in web service status menu on OSX Mojave
+            <!-- JAL-3333 -->Fuzzy text in web service status menu on
+            OSX Mojave
           </li>
         </ul> <em>Editing</em>
         <ul>
           <li>
-            <!-- JAL-2822 -->Start and End should be updated when sequence
-            data at beginning or end of alignment added/removed via 'Edit'
-            sequence
+            <!-- JAL-2822 -->Start and End should be updated when
+            sequence data at beginning or end of alignment added/removed
+            via 'Edit' sequence
           </li>
           <li>
-            <!-- JAL-2541,JAL-2684 (tests) -->Delete/Cut selection doesn't
-            relocate sequence features correctly when start of sequence is
-            removed (Known defect since 2.10)
+            <!-- JAL-2541,JAL-2684 (tests) -->Delete/Cut selection
+            doesn't relocate sequence features correctly when start of
+            sequence is removed (Known defect since 2.10)
           </li>
           <li>
-            <!-- JAL-2830 -->Inserting gap sequence via the Edit Sequence
-            dialog corrupts dataset sequence
+            <!-- JAL-2830 -->Inserting gap sequence via the Edit
+            Sequence dialog corrupts dataset sequence
           </li>
           <li>
-            <!-- JAL-868 -->Structure colours not updated when associated tree
-            repartitions the alignment view (Regression in 2.10.5)
+            <!-- JAL-868 -->Structure colours not updated when
+            associated tree repartitions the alignment view (Regression
+            in 2.10.5)
           </li>
         </ul> <em>Datamodel</em>
         <ul>
@@ -1096,72 +1354,75 @@ li:before {
             <!-- JAL-2986 -->Sequence.findIndex returns wrong value when
             sequence's End is greater than its length
           </li>
-        </ul> <em>Bugs fixed for Java 11 Support (not yet on
-          general release)</em>
+        </ul> <em>Bugs fixed for Java 11 Support (not yet on general
+          release)</em>
         <ul>
           <li>
             <!-- JAL-3288 -->Menus work properly in split-screen
           </li>
         </ul> <em>New Known Defects</em>
         <ul>
-        <li>
-        <!-- JAL-3340 -->Select columns containing feature by double clicking ignores bounds of an existing selected region
-        </li>
-        <li>
-          <!-- JAL-3313 -->Codon consensus logo incorrectly scaled in gapped
-          regions of protein alignment.
-        </li>
-        <li>
-          <!-- JAL-2647 -->Input Data menu entry is greyed out when PCA View
-          is restored from a Jalview 2.11 project
-        </li>
-        <li>
-          <!-- JAL-3213 -->Alignment panel height can be too small after
-          'New View'
-        </li>
-        <li>
-          <!-- JAL-3240 -->Display is incorrect after removing gapped
-          columns within hidden columns
-        </li>
-        <li>
-          <!-- JAL-3314 -->Rightmost selection is lost when mouse re-enters
-          window after dragging left to select columns to left of visible
-          region
-        </li>
-        <li>
-          <!-- JAL-2876 -->Features coloured according to their description
-          string and thresholded by score in earlier versions of Jalview are
-          not shown as thresholded features in 2.11. To workaround please
-          create a Score filter instead.
-        </li>
-        <li>
-        <!-- JAL-3184 -->Cancel on Feature Settings dialog doesn't reset group visibility</li> 
-        <li>
-        <!-- JAL-3338 -->F2 doesn't enable/disable keyboard mode in linked CDS/Protein view
-        </li>
-        <li>
-          <!-- JAL-797 -->Closing tree windows with CMD/CTRL-W for
-          alignments with multiple views can close views unexpectedly
-        </li>
-        </ul>
-        <em>Java 11 Specific defects</em>
-          <ul>
-            <li>
-              <!-- JAL-3235 -->Jalview Properties file is not sorted
-              alphabetically when saved
-            </li>
+          <li>
+            <!-- JAL-3340 -->Select columns containing feature by double
+            clicking ignores bounds of an existing selected region
+          </li>
+          <li>
+            <!-- JAL-3313 -->Codon consensus logo incorrectly scaled in
+            gapped regions of protein alignment.
+          </li>
+          <li>
+            <!-- JAL-2647 -->Input Data menu entry is greyed out when
+            PCA View is restored from a Jalview 2.11 project
+          </li>
+          <li>
+            <!-- JAL-3213 -->Alignment panel height can be too small
+            after 'New View'
+          </li>
+          <li>
+            <!-- JAL-3240 -->Display is incorrect after removing gapped
+            columns within hidden columns
+          </li>
+          <li>
+            <!-- JAL-3314 -->Rightmost selection is lost when mouse
+            re-enters window after dragging left to select columns to
+            left of visible region
+          </li>
+          <li>
+            <!-- JAL-2876 -->Features coloured according to their
+            description string and thresholded by score in earlier
+            versions of Jalview are not shown as thresholded features in
+            2.11. To workaround please create a Score filter instead.
+          </li>
+          <li>
+            <!-- JAL-3184 -->Cancel on Feature Settings dialog doesn't
+            reset group visibility
+          </li>
+          <li>
+            <!-- JAL-3338 -->F2 doesn't enable/disable keyboard mode in
+            linked CDS/Protein view
+          </li>
+          <li>
+            <!-- JAL-797 -->Closing tree windows with CMD/CTRL-W for
+            alignments with multiple views can close views unexpectedly
+          </li>
+        </ul> <em>Java 11 Specific defects</em>
+        <ul>
+          <li>
+            <!-- JAL-3235 -->Jalview Properties file is not sorted
+            alphabetically when saved
+          </li>
         </ul>
       </td>
     </tr>
     <tr>
-    <td width="60" nowrap>
-      <div align="center">
-        <strong><a name="Jalview.2.10.5">2.10.5</a><br /> <em>10/09/2018</em></strong>
-      </div>
-    </td>
-    <td><div align="left">
-        <em></em>
-        <ul>
+      <td width="60" nowrap>
+        <div align="center">
+          <strong><a name="Jalview.2.10.5">2.10.5</a><br /> <em>10/09/2018</em></strong>
+        </div>
+      </td>
+      <td><div align="left">
+          <em></em>
+          <ul>
             <li>
               <!-- JAL-3101 -->Default memory for Jalview webstart and
               InstallAnywhere increased to 1G.
@@ -1193,9 +1454,9 @@ li:before {
             </li>
           </ul>
         </div></td>
-    <td><div align="left">
-        <em></em>
-        <ul>
+      <td><div align="left">
+          <em></em>
+          <ul>
             <li>
               <!-- JAL-3104 -->Poorly scaled bar in quality annotation
               row shown in Feredoxin Structure alignment view of example
@@ -1265,8 +1526,7 @@ li:before {
               latest version of OSX.
             </li>
           </ul>
-        </div>
-    </td>
+        </div></td>
     </tr>
     <tr>
       <td width="60" nowrap>
@@ -1327,7 +1587,10 @@ li:before {
           </ul>
           <em>New Known Defects</em>
           <ul>
-            <li><!-- JAL-3083 -->Cancel option doesn't reset Colour by Annotation</li>
+            <li>
+              <!-- JAL-3083 -->Cancel option doesn't reset Colour by
+              Annotation
+            </li>
           </ul>
         </div></td>
     </tr>
@@ -1363,13 +1626,12 @@ li:before {
               of features (particularly when transparency is disabled)
             </li>
             <li>
-              <!-- JAL-2296,JAL-2295 -->Experimental features in 2.10.2 for
-              exchange of Jalview features and Chimera attributes made
-              generally available
+              <!-- JAL-2296,JAL-2295 -->Experimental features in 2.10.2
+              for exchange of Jalview features and Chimera attributes
+              made generally available
             </li>
           </ul>
-          </div>
-      </td>
+        </div></td>
       <td><div align="left">
           <ul>
             <li>
@@ -1412,8 +1674,8 @@ li:before {
               columns in annotation row
             </li>
             <li>
-              <!-- JAL-2913 -->Preferences panel's ID Width control is not
-              honored in batch mode
+              <!-- JAL-2913 -->Preferences panel's ID Width control is
+              not honored in batch mode
             </li>
             <li>
               <!-- JAL-2945 -->Linked sequence highlighting doesn't work
@@ -1429,9 +1691,9 @@ li:before {
               with negative residue numbers or missing residues fails
             </li>
             <li>
-              <!-- JAL-2952 -->Exception when shading sequence with negative
-              Temperature Factor values from annotated PDB files (e.g.
-              as generated by CONSURF)
+              <!-- JAL-2952 -->Exception when shading sequence with
+              negative Temperature Factor values from annotated PDB
+              files (e.g. as generated by CONSURF)
             </li>
             <li>
               <!-- JAL-2920 -->Uniprot 'sequence variant' features
@@ -1442,20 +1704,22 @@ li:before {
               structure and/or overview windows are also shown
             </li>
             <li>
-              <!-- JAL-2954 -->Selecting columns from highlighted regions
-              very slow for alignments with large numbers of sequences
+              <!-- JAL-2954 -->Selecting columns from highlighted
+              regions very slow for alignments with large numbers of
+              sequences
             </li>
             <li>
               <!-- JAL-2925 -->Copy Consensus fails for group consensus
               with 'StringIndexOutOfBounds'
             </li>
             <li>
-              <!-- JAL-2976 -->VAqua(4) provided as fallback Look and Feel for OSX
-              platforms running Java 10
+              <!-- JAL-2976 -->VAqua(4) provided as fallback Look and
+              Feel for OSX platforms running Java 10
             </li>
             <li>
               <!-- JAL-2960 -->Adding a structure to existing structure
-              view appears to do nothing because the view is hidden behind the alignment view
+              view appears to do nothing because the view is hidden
+              behind the alignment view
             </li>
           </ul>
           <em>Applet</em>
@@ -1467,9 +1731,10 @@ li:before {
           </ul>
           <em>Batch Mode</em>
           <ul>
-          <li>
-            <!-- JAL-2913 -->Fixed ID width preference is not respected
-          </li>
+            <li>
+              <!-- JAL-2913 -->Fixed ID width preference is not
+              respected
+            </li>
           </ul>
           <em>New Known Defects</em>
           <ul>
@@ -1489,35 +1754,64 @@ li:before {
               2.10.4 is to fail back to N&amp;W mapping)
             </li>
             <li>
-              <!-- JAL-2990 -->Export Annotations from File Menu with CSV
-              option gives blank output
+              <!-- JAL-2990 -->Export Annotations from File Menu with
+              CSV option gives blank output
             </li>
           </ul>
-        </div>
-          </td>
+        </div></td>
     </tr>
     <tr>
       <td width="60" nowrap>
         <div align="center">
-          <strong><a name="Jalview.2.10.3b1">2.10.3b1</a><br /> <em>24/1/2018</em></strong>
+          <strong><a name="Jalview.2.10.3b1">2.10.3b1</a><br />
+            <em>24/1/2018</em></strong>
         </div>
       </td>
       <td><div align="left">
-          <ul><li>Updated Certum Codesigning Certificate
-              (Valid till 30th November 2018)</li></ul></div></td>
-      <td><div align="left">
-          <em>Desktop</em><ul>
           <ul>
-            <li><!-- JAL-2859-->Only one structure is loaded when several sequences and structures are selected for viewing/superposing</li>
-            <li><!-- JAL-2851-->Alignment doesn't appear to scroll vertically via trackpad and scrollwheel</li>
-            <li><!-- JAL-2842-->Jalview hangs if up/down arrows pressed in cursor mode when cursor lies in hidden region at start of alignment</li>
-            <li><!-- JAL-2827-->Helix annotation has 'notches' when scrolled into view if columns are hidden</li>
-            <li><!-- JAL-2740-->Annotation column filter can be slow to reset (ie after hitting cancel) for large numbers of hidden columns</li>
-            <li><!-- JAL-2849-->User preference for disabling inclusion of sequence limits when exporting as flat file has no effect</li>             
-            <li><!-- JAL-2679-->Reproducible cross-reference relationships when retrieving sequences from EnsemblGenomes</li>  
+            <li>Updated Certum Codesigning Certificate (Valid till
+              30th November 2018)</li>
           </ul>
-          </div>
-      </td>
+        </div></td>
+      <td><div align="left">
+          <em>Desktop</em>
+          <ul>
+            <ul>
+              <li>
+                <!-- JAL-2859-->Only one structure is loaded when
+                several sequences and structures are selected for
+                viewing/superposing
+              </li>
+              <li>
+                <!-- JAL-2851-->Alignment doesn't appear to scroll
+                vertically via trackpad and scrollwheel
+              </li>
+              <li>
+                <!-- JAL-2842-->Jalview hangs if up/down arrows pressed
+                in cursor mode when cursor lies in hidden region at
+                start of alignment
+              </li>
+              <li>
+                <!-- JAL-2827-->Helix annotation has 'notches' when
+                scrolled into view if columns are hidden
+              </li>
+              <li>
+                <!-- JAL-2740-->Annotation column filter can be slow to
+                reset (ie after hitting cancel) for large numbers of
+                hidden columns
+              </li>
+              <li>
+                <!-- JAL-2849-->User preference for disabling inclusion
+                of sequence limits when exporting as flat file has no
+                effect
+              </li>
+              <li>
+                <!-- JAL-2679-->Reproducible cross-reference
+                relationships when retrieving sequences from
+                EnsemblGenomes
+              </li>
+            </ul>
+        </div></td>
     </tr>
     <tr>
       <td width="60" nowrap>
@@ -1773,14 +2067,16 @@ li:before {
           <em>New features in Jalview Desktop</em>
           <ul>
             <li>
-              <!-- JAL-2748 -->Uniprot Sequence Fetcher now uses web API at uniprot.org 
+              <!-- JAL-2748 -->Uniprot Sequence Fetcher now uses web API
+              at uniprot.org
             </li>
-            <li>  <!-- JAL-2745 -->HTTPS used for all connections to ebi.ac.uk 
+            <li>
+              <!-- JAL-2745 -->HTTPS used for all connections to
+              ebi.ac.uk
             </li>
           </ul>
         </div></td>
-      <td><div align="left">
-        </div></td>
+      <td><div align="left"></div></td>
     </tr>
     <tr>
       <td width="60" nowrap>
@@ -2249,9 +2545,9 @@ li:before {
               recovered correctly from Jalview project file
             </li>
             <li>
-              <!-- JAL-2256 -->Feature colours in overview when first opened
-              (automatically via preferences) are different to the main
-              alignment panel
+              <!-- JAL-2256 -->Feature colours in overview when first
+              opened (automatically via preferences) are different to
+              the main alignment panel
             </li>
           </ul>
           <em>Data import/export</em>
@@ -3127,7 +3423,7 @@ li:before {
               column.
             </li>
             <li>
-              <!-- JAL-1980 -->Null Pointer Exception raised when 
+              <!-- JAL-1980 -->Null Pointer Exception raised when
               pressing Add on an orphaned cut'n'paste window.
             </li>
             <!--  may exclude, this is an external service stability issue  JAL-1941 
@@ -4431,6 +4727,7 @@ li:before {
         <ul>
           <li>URL links generated from description line for
             regular-expression based URL links (applet and application)
+
           
           <li>Non-positional feature URL links are shown in link
             menu</li>
@@ -4883,6 +5180,7 @@ li:before {
           <li>Cancel button for DAS Feature Fetching
           <li>PCA and PDB Viewers zoom via mouse roller
           <li>User-defined sub-tree colours and sub-tree selection
+
           
           <li>'New Window' button on the 'Output to Text box'
         </ul>
@@ -4897,6 +5195,7 @@ li:before {
           <li>Fixed Remove Empty Columns Bug (empty columns at end
             of alignment)
           <li>Slowed DAS Feature Fetching for increased robustness.
+
           
           <li>Made angle brackets in ASCII feature descriptions
             display correctly
@@ -4908,6 +5207,7 @@ li:before {
           <li>WsDbFetch query/result association resolved
           <li>Tree leaf to sequence mapping improved
           <li>Smooth fonts switch moved to FontChooser dialog box.
+
           
         </ul>
       </td>
index 0cf5661..4865615 100755 (executable)
 </head>
 <body>
   <p>
-    <strong>Welcome to Jalview Version $$Version-Rel$$ !!</strong>
-    <br />Please take a
-    look at the <a href="releases.html#Jalview.$$Version-Rel$$">release
+    <strong>Welcome to Jalview Version $$Version-Rel$$ !!</strong> <br />Please
+    take a look at the <a href="releases.html#Jalview.$$Version-Rel$$">release
       notes</a> for this build. Read on for the highlights.
   </p>
   <p>
     <strong>Highlights in 2.11.2</strong>
   </p>
-  <p><strong>New features for working with 3D Structure</strong><br/>
-    Jalview 2.11.2 features a number of new capabilities:<ul><li><strong>Linked viewing with <em>ChimeraX</em> and <em>PyMol</em></strong><br/>Simply configure your prefered viewer for 3D molecular data in <a href="features/preferences.html#structure">Jalview's structure preferences</a>, make sure that Jalview can locate the viewer's installation, and open a new view via the 3D Structure Chooser!</li>
-      <li><strong>View predicted protein structures via 3D-Beacons</strong><br/>
-       Jalview 2.11.2's <a href="features/structurechooser.html">Structure Chooser includes a client for the 3D-Beacons Network</a>, a new service that allows predicted and observed 3D models for proteins in Uniprot from a range of resources, including AlphaFold DB, SWISS-MODEL and a growing number of other resources. 
-      </li>
-  <p><strong>Retrieval
+  <p>
+    <strong>New features for working with 3D Structure</strong><br />
+    Jalview 2.11.2 features a number of new capabilities described
+    below.
   </p>
+
   <p>
-    For the full release notes, see <a
-      href="releases.html#Jalview.2.11.1.4">the Jalview 2.11.1.4
-      release notes</a>.
+    <strong>View predicted protein structures via 3D-Beacons</strong> <br>
+    Jalview 2.11.2's <a href="features/structurechooser.html">Structure
+      Chooser includes a client for the 3D-Beacons Network</a>. Launched in
+    2021, the 3D-Beacons network (<a
+      href="https://www.ebi.ac.uk/pdbe/pdbe-kb/3dbeacons/">www.ebi.ac.uk/pdbe/pdbe-kb/3dbeacons/</a>)
+    provides a central point for the retrieval of predicted and observed
+    3D structures for sequences in Uniprot, including homology models
+    from Swiss-model and deep learning based predictions from the EBI's
+    Alphafold database (Orengo et al. 2020, <a
+      href="https://doi.org/10.12688/f1000research.20559.1">doi:10.12688/f1000research.20559.1</a>).<br>
   </p>
+
   <p>
-    <strong>Known Issues</strong>
+    <strong>Support for viewing structures with ChimeraX and
+      Pymol</strong><br> Jalview's 3D structure viewer system has been
+    re-architected to allow easier integration of external structure
+    viewers, and takes advantage of the strucViz2 Chimera communications
+    library developed by Scooter Morris (<a
+      href="https://doi.org/10.1093/bioinformatics/btm329">doi:10.1093/bioinformatics/btm329</a>).<br /> <br />
+    The <a href="features/preferences.html#structure">Structures
+      Preferences tab</a> provides new options allowing ChimeraX and
+    Pymol to be used for visualising external 3D structures. Jalview
+    2.11.2 has been tested with Pymol 2.5.0 (community) and 2.5.2
+    (incentive). For ChimeraX, we recommend using v1.3 or later.<br />Views
+    from all structure viewers are saved in Jalview Projects, allowing
+    them to be shared with others using Jalview 2.11.2 or later,
+    providing they have the same viewer installed and configured to be
+    used with Jalview.
   </p>
-  <p>New known issues in this release affect recovery of CDS/Protein
-    relationships from project files, and interactive selection of
-    protein sequences from a tree built on linked nucleotide sequences.
-    We will provide patches for these issues as soon as possible.</p>
+  <p>Other highlights include:</p>
+  <ul>
+    <li><strong>Easier configuration of <a
+        href="features/preferences.html#startup">Jalview's memory
+          allocation</a></strong></li>
+    <li>Import of annotated DNA and RNA loci via GenBank and EMBL
+      style flatfile</li>
+
+
+
+
+    <p>
+      For the full release notes, see <a
+        href="releases.html#Jalview.2.11.2.0">the Jalview 2.11.2.0
+        release notes</a>.
+    </p>
+    <p>
+      <strong>Known Issues</strong>
+    </p>
+    <p></p>
   </ul>
 </body>
 </html>
index a11a269..2e695eb 100644 (file)
Binary files a/j11lib/getdown-core.jar and b/j11lib/getdown-core.jar differ
index a11a269..2e695eb 100644 (file)
Binary files a/j8lib/getdown-core.jar and b/j8lib/getdown-core.jar differ
index b448b4c..fec31b8 100644 (file)
@@ -273,7 +273,7 @@ label.viewer_path = Path to {0} program
 label.viewer_path_tip = Jalview will first try any path entered here, else standard installation locations.<br>Double-click to browse for file.
 label.invalid_viewer_path = Path not found or not executable
 label.viewer_missing = Structure viewer not found.<br/>Please enter the path to the executable (if installed),<br/>or download and install the program.
-label.open_viewer_failed = Error opening {0} - is it installed?\nCheck path in Preferences, Structure
+label.open_viewer_failed = Error opening {0} - is it installed?\nCheck configured path in the Preferences' Structure tab 
 label.min_colour = Minimum Colour
 label.max_colour = Maximum Colour
 label.no_colour = No Colour
index 6b5e36c..ad5e350 100644 (file)
@@ -36,6 +36,7 @@ import java.awt.Color;
 import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.List;
+import java.util.Locale;
 import java.util.Map;
 
 import org.slf4j.Logger;
@@ -327,11 +328,11 @@ public abstract class ChimUtils
     String resType = "";
     if (split.length == 2)
     {
-      resType = split[0].trim().toUpperCase();
+      resType = split[0].trim().toUpperCase(Locale.ROOT);
     }
     else if (split.length == 3)
     {
-      resType = split[1].trim().toUpperCase();
+      resType = split[1].trim().toUpperCase(Locale.ROOT);
     }
     if (resType.equalsIgnoreCase("HOH") || resType.equalsIgnoreCase("WAT"))
     {
index 0a248cf..46ed164 100644 (file)
@@ -39,6 +39,7 @@ import java.util.Arrays;
 import java.util.Collection;
 import java.util.HashMap;
 import java.util.List;
+import java.util.Locale;
 import java.util.Map;
 import java.util.Properties;
 import java.util.Set;
@@ -978,16 +979,16 @@ public class StructureManager
     if (os.startsWith("Linux"))
     {
       // ChimeraX .deb and .rpm packages put symbolic link from /usr/bin/chimerax
-      pathList.add(String.format("/usr/bin/%s", chimeraExe.toLowerCase()));
+      pathList.add(String.format("/usr/bin/%s", chimeraExe.toLowerCase(Locale.ROOT)));
       pathList.add(String.format("/usr/bin/%s", chimeraExe));
 
       pathList.add(
-              String.format("/usr/local/bin/%s", chimeraExe.toLowerCase()));
+              String.format("/usr/local/bin/%s", chimeraExe.toLowerCase(Locale.ROOT)));
       pathList.add(String.format("/usr/local/bin/%s", chimeraExe));
 
       // these paths also used by .deb and .rpm
       pathList.add(String.format("/usr/lib/ucsf-%s/bin/%s",
-              chimera.toLowerCase(), chimeraExe));
+              chimera.toLowerCase(Locale.ROOT), chimeraExe));
       pathList.add(String.format("/usr/libexec/UCSF-%s/bin/%s", chimera,
               chimeraExe));
 
@@ -995,15 +996,15 @@ public class StructureManager
 
       // user home paths
       pathList.add(String.format("%s/bin/%s",
-              System.getProperty("user.home"), chimeraExe.toLowerCase()));
+              System.getProperty("user.home"), chimeraExe.toLowerCase(Locale.ROOT)));
       pathList.add(String.format("%s/bin/%s",
               System.getProperty("user.home"), chimeraExe));
       pathList.add(String.format("%s/opt/bin/%s",
-              System.getProperty("user.home"), chimeraExe.toLowerCase()));
+              System.getProperty("user.home"), chimeraExe.toLowerCase(Locale.ROOT)));
       pathList.add(String.format("%s/opt/bin/%s",
               System.getProperty("user.home"), chimeraExe));
       pathList.add(String.format("%s/local/bin/%s",
-              System.getProperty("user.home"), chimeraExe.toLowerCase()));
+              System.getProperty("user.home"), chimeraExe.toLowerCase(Locale.ROOT)));
       pathList.add(String.format("%s/local/bin/%s",
               System.getProperty("user.home"), chimeraExe));
     }
index 0c11808..4c018fb 100755 (executable)
@@ -95,6 +95,10 @@ public class Jalview
   static
   {
     Platform.getURLCommandArguments();
+    Platform.addJ2SDirectDatabaseCall("https://www.jalview.org");
+    Platform.addJ2SDirectDatabaseCall("http://www.jalview.org");
+    Platform.addJ2SDirectDatabaseCall("http://www.compbio.dundee.ac.uk");
+    Platform.addJ2SDirectDatabaseCall("https://www.compbio.dundee.ac.uk");
   }
 
   /*
index 56713b0..bb545cb 100644 (file)
@@ -22,6 +22,8 @@
  */
 package jalview.bin;
 
+import java.util.Locale;
+
 /**
  * Methods to decide on appropriate memory setting for Jalview based on two
  * optionally provided values: jvmmempc - the maximum percentage of total
@@ -57,10 +59,10 @@ public class MemorySetting
           + "_CUSTOMISED_SETTINGS";
 
   public static final String MEMORY_JVMMEMPC = NS + "_"
-          + MAX_HEAPSIZE_PERCENT_PROPERTY_NAME.toUpperCase();
+          + MAX_HEAPSIZE_PERCENT_PROPERTY_NAME.toUpperCase(Locale.ROOT);
 
   public static final String MEMORY_JVMMEMMAX = NS + "_"
-          + MAX_HEAPSIZE_PROPERTY_NAME.toUpperCase();
+          + MAX_HEAPSIZE_PROPERTY_NAME.toUpperCase(Locale.ROOT);
 
   protected static boolean logToClassChecked = false;
 
index ed64c00..b69d3e3 100644 (file)
@@ -114,9 +114,12 @@ public class PymolCommands extends StructureCommandsBase
     String refAtomsAlphaOnly = "("+getAtomSpec(refAtoms, specType)+" and (altloc '' or altloc 'a'))";
     String atomSpec2AlphaOnly = "("+getAtomSpec(atomSpec, specType)+" and (altloc '' or altloc 'a'))";
     // pair_fit mobile -> reference
+    // crashes when undo is enabled on 2.5.2 (incentive)
+    commands.add(new StructureCommand("undo_disable"));
     commands.add(new StructureCommand("pair_fit", 
             atomSpec2AlphaOnly, refAtomsAlphaOnly));
-
+    commands.add(new StructureCommand("undo_enable"));
+    
     /*
      * and show superposed residues as cartoon
      */
index db71269..49ebe08 100644 (file)
@@ -319,7 +319,7 @@ public class PymolManager
       Console.error("Failed to start PyMOL with XMLRPC, response was: "
               + responses);
     }
-    Console.error("PyMOL started with XMLRPC on port " + port);
+    Console.info("PyMOL started with XMLRPC on port " + port);
     return port;
   }
 
index c78a82b..399bad9 100644 (file)
@@ -311,7 +311,7 @@ public abstract class JalviewChimeraBinding extends AAStructureBindingModel
   @Override
   public boolean isViewerRunning()
   {
-    return chimeraManager.isChimeraLaunched();
+    return chimeraManager!=null && chimeraManager.isChimeraLaunched();
   }
 
   /**
index 9d98585..3a17ea3 100644 (file)
@@ -331,6 +331,7 @@ public class ChimeraViewFrame extends StructureViewerBase
                       getViewerName()),
               MessageManager.getString("label.error_loading_file"),
               JvOptionPane.ERROR_MESSAGE);
+      jmb.closeViewer(true);
       this.dispose();
       return;
     }
@@ -444,6 +445,12 @@ public class ChimeraViewFrame extends StructureViewerBase
           Console.error("Couldn't open Chimera viewer!", ex);
         }
       }
+      if (!jmb.isViewerRunning())
+      {
+        // nothing to do
+        // TODO: ensure we tidy up JAL-3619
+        return;
+      }
       int num = -1;
       for (PDBEntry pe : filePDB)
       {
index ad36492..c713a94 100644 (file)
@@ -140,24 +140,32 @@ import jalview.ws.utils.UrlDownloadClient;
 public class Desktop extends jalview.jbgui.GDesktop
     implements DropTargetListener, ClipboardOwner, IProgressIndicator, jalview.api.StructureSelectionManagerProvider {
   private static final String CITATION;
-  static {
-    URL bg_logo_url = ChannelProperties.getImageURL("bg_logo." + String.valueOf(SplashScreen.logoSize));
-    URL uod_logo_url = ChannelProperties.getImageURL("uod_banner." + String.valueOf(SplashScreen.logoSize));
+  static
+  {
+    URL bg_logo_url = ChannelProperties.getImageURL(
+            "bg_logo." + String.valueOf(SplashScreen.logoSize));
+    URL uod_logo_url = ChannelProperties.getImageURL(
+            "uod_banner." + String.valueOf(SplashScreen.logoSize));
     boolean logo = (bg_logo_url != null || uod_logo_url != null);
     StringBuilder sb = new StringBuilder();
-    sb.append("<br><br>Development managed by The Barton Group, University of Dundee, Scotland, UK.");
-    if (logo) {
+    sb.append(
+            "<br><br>Jalview is free software released under GPLv3.<br><br>Development is managed by The Barton Group, University of Dundee, Scotland, UK.");
+    if (logo)
+    {
       sb.append("<br>");
     }
-    sb.append(bg_logo_url == null ? "" : "<img alt=\"Barton Group logo\" src=\"" + bg_logo_url.toString() + "\">");
+    sb.append(bg_logo_url == null ? ""
+            : "<img alt=\"Barton Group logo\" src=\""
+                    + bg_logo_url.toString() + "\">");
     sb.append(uod_logo_url == null ? ""
-        : "&nbsp;<img alt=\"University of Dundee shield\" src=\"" + uod_logo_url.toString() + "\">");
+            : "&nbsp;<img alt=\"University of Dundee shield\" src=\""
+                    + uod_logo_url.toString() + "\">");
     sb.append(
-        "<br><br>For help, see the FAQ at <a href=\"https://www.jalview.org/faq\">www.jalview.org/faq</a> and/or join the jalview-discuss@jalview.org mailing list");
+            "<br><br>For help, see <a href=\"https://www.jalview.org/faq\">www.jalview.org/faq</a> and join <a href=\"https://discourse.jalview.org\">discourse.jalview.org</a>");
     sb.append("<br><br>If  you use Jalview, please cite:"
-        + "<br>Waterhouse, A.M., Procter, J.B., Martin, D.M.A, Clamp, M. and Barton, G. J. (2009)"
-        + "<br>Jalview Version 2 - a multiple sequence alignment editor and analysis workbench"
-        + "<br>Bioinformatics doi: 10.1093/bioinformatics/btp033");
+            + "<br>Waterhouse, A.M., Procter, J.B., Martin, D.M.A, Clamp, M. and Barton, G. J. (2009)"
+            + "<br>Jalview Version 2 - a multiple sequence alignment editor and analysis workbench"
+            + "<br>Bioinformatics <a href=\"https://doi.org/10.1093/bioinformatics/btp033\">doi: 10.1093/bioinformatics/btp033</a>");
     CITATION = sb.toString();
   }
 
index 6aba7b6..42a537b 100644 (file)
@@ -121,7 +121,7 @@ public class PymolBindingModel extends AAStructureBindingModel
   @Override
   public boolean isViewerRunning()
   {
-    return pymolManager.isPymolLaunched();
+    return pymolManager !=null && pymolManager.isPymolLaunched();
   }
 
   @Override
index d426051..2fd4957 100644 (file)
@@ -211,8 +211,18 @@ public class PymolViewer extends StructureViewerBase
         } catch (Exception ex)
         {
           Console.error("Couldn't open PyMOL viewer!", ex);
+          // if we couldn't open Pymol, no point continuing
+          return;
         }
       }
+      if (!binding.isViewerRunning())
+      {
+        // nothing to do
+        // TODO: ensure we tidy up JAL-3619
+
+        return;
+      }
+
       int num = -1;
       for (PDBEntry pe : filePDB)
       {
@@ -250,7 +260,7 @@ public class PymolViewer extends StructureViewerBase
           } catch (Exception ex)
           {
             Console.error(
-                    "Couldn't open " + pe.getFile() + " in Chimera viewer!",
+                    "Couldn't open " + pe.getFile() + " in "+getViewerName()+"!",
                     ex);
           } finally
           {
@@ -314,6 +324,7 @@ public class PymolViewer extends StructureViewerBase
                       getViewerName()),
               MessageManager.getString("label.error_loading_file"),
               JvOptionPane.ERROR_MESSAGE);
+      binding.closeViewer(true);
       this.dispose();
       return;
     }
index 97de08a..61273c7 100755 (executable)
@@ -267,7 +267,7 @@ public class SplashScreen extends JPanel
 
       splashText.setVisible(true);
       splashText.setSize(new Dimension(750,
-              375 + logoSize + (Platform.isJS() ? 40 : 0)));
+              425 + logoSize + (Platform.isJS() ? 40 : 0)));
       splashText.setBackground(bg);
       splashText.setForeground(fg);
       splashText.setFont(font);
index 273f6ec..ff1c944 100644 (file)
@@ -574,9 +574,9 @@ public class StringUtils
   public static int firstCharPosIgnoreCase(String text, String chars)
   {
     int min = text.length() + 1;
-    for (char c : chars.toLowerCase().toCharArray())
+    for (char c : chars.toLowerCase(Locale.ROOT).toCharArray())
     {
-      int i = text.toLowerCase().indexOf(c);
+      int i = text.toLowerCase(Locale.ROOT).indexOf(c);
       if (0 <= i && i < min)
       {
         min = i;
index 47e66ac..456236a 100644 (file)
@@ -22,6 +22,7 @@ package jalview.ws.dbsources;
 
 import jalview.bin.Cache;
 import jalview.datamodel.DBRefSource;
+import jalview.util.Platform;
 
 import com.stevesoft.pat.Regex;
 
@@ -43,6 +44,9 @@ abstract public class Pfam extends Xfam
   static final String PFAM_BASEURL_KEY = "PFAM_BASEURL";
 
   private static final String DEFAULT_PFAM_BASEURL = "https://pfam.xfam.org";
+  static {
+    Platform.addJ2SDirectDatabaseCall(DEFAULT_PFAM_BASEURL);
+  }
 
   public Pfam()
   {
index c9ee7fc..04b3669 100644 (file)
@@ -22,6 +22,7 @@ package jalview.ws.dbsources;
 
 import jalview.bin.Cache;
 import jalview.datamodel.DBRefSource;
+import jalview.util.Platform;
 
 import com.stevesoft.pat.Regex;
 
@@ -36,6 +37,9 @@ abstract public class Rfam extends Xfam
 
   private static final String DEFAULT_RFAM_BASEURL = "https://rfam.xfam.org";
 
+  static {
+    Platform.addJ2SDirectDatabaseCall(DEFAULT_RFAM_BASEURL);
+  }
   /*
    * append to URLs to retrieve as a gzipped file
    */
index 1d04351..1f833d0 100644 (file)
@@ -266,7 +266,9 @@ public class EBIFetchClient
     }
     return null;
   }
-
+  static {
+    Platform.addJ2SDirectDatabaseCall("https://www.ebi.ac.uk/");
+  }
   /**
    * Constructs the URL to fetch from
    * 
index 425bc18..97514e9 100755 (executable)
@@ -35,6 +35,7 @@ import jalview.util.Comparison;
 
 import java.awt.Color;
 import java.util.List;
+import java.util.Locale;
 import java.util.Vector;
 
 public class PDBChain
@@ -83,7 +84,7 @@ public class PDBChain
 
   public PDBChain(String thePdbid, String theId, String tempFactorColumnName)
   {
-    this.pdbid = thePdbid == null ? thePdbid : thePdbid.toLowerCase();
+    this.pdbid = thePdbid == null ? thePdbid : thePdbid.toLowerCase(Locale.ROOT);
     this.id = theId;
     if (tempFactorColumnName!=null && tempFactorColumnName.length()>0)
     {
index d6b2185..eb11cb2 100644 (file)
@@ -10,6 +10,7 @@ import java.io.StringReader;
 import java.io.StringWriter;
 import java.io.Writer;
 import java.util.Collection;
+import java.util.Locale;
 // import java.util.List;
 import java.util.Map;
 
@@ -306,7 +307,7 @@ public class JSONValue {
                                        for(int k=0;k<4-ss.length();k++){
                                                sb.append('0');
                                        }
-                                       sb.append(ss.toUpperCase());
+                                       sb.append(ss.toUpperCase(Locale.ROOT));
                                }
                                else{
                                        sb.append(ch);
index 671e002..60c814b 100644 (file)
@@ -6,6 +6,7 @@ import java.io.FileInputStream;
 import java.io.IOException;
 import java.io.InputStream;
 import java.text.ParseException;
+import java.util.Locale;
 
 /**
  * Represents a Windows shortcut (typically visible to Java only as a '.lnk' file).
@@ -46,7 +47,7 @@ public class WindowsShortcut
         boolean isPotentiallyValid = false;
         try {
             isPotentiallyValid = file.isFile()
-                && file.getName().toLowerCase().endsWith(".lnk")
+                && file.getName().toLowerCase(Locale.ROOT).endsWith(".lnk")
                 && fis.available() >= minimum_length
                 && isMagicPresent(getBytes(fis, 32));
         } finally {
index 7759724..d5dbc86 100644 (file)
@@ -124,17 +124,17 @@ public class PymolCommandsTest
     toAlign.addRange("2", 22, 22, "C");
     List<StructureCommandI> commands = testee.superposeStructures(ref,
             toAlign, AtomSpecType.ALPHA);
-    assertEquals(commands.size(), 2);
+    assertEquals(commands.size(), 4);
     String refSpecCA = "(1//A/12-14/CA 1//B/18+22-23/CA";
     String toAlignSpecCA = "(2//B/15-17+20-21/CA 2//C/22/CA";
     String refSpec = "1//A/12-14/ 1//B/18+22-23/";
     String toAlignSpec = "2//B/15-17+20-21/ 2//C/22/";
     String altLoc =  " and (altloc '' or altloc 'a'))";
     // super command: separate arguments for regions to align
-    assertEquals(commands.get(0),
+    assertEquals(commands.get(1),
             new StructureCommand("pair_fit", toAlignSpecCA+altLoc, refSpecCA+altLoc));
     // show aligned regions: one argument for combined atom specs
-    assertEquals(commands.get(1), new StructureCommand("show", "cartoon",
+    assertEquals(commands.get(3), new StructureCommand("show", "cartoon",
             refSpec + " " + toAlignSpec));
   }
 
index 6f17315..e46f524 100755 (executable)
@@ -1,12 +1,13 @@
 #!/usr/bin/env bash
 
 # perform a dev build and install on local macOS machine
-INSTALLERVOL="Jalview Installer"
-APP=Jalview.app
+INSTALLERVOL="Jalview Non-Release Installer"
+APP="Jalview Local.app"
 
-APPLICATIONS=$HOME/Applications
+APPLICATIONS=/Applications
 CHANNEL=NOCHANNEL
-DMG=build/install4j/11/Jalview-OFFLINE_macos-app_DEVELOPMENT-j11.dmg
+DMG=build/install4j/11/Jalview_Local-TEST-macos-java_11.dmg
+
 
 if [ x$1 != "xnogradle" ]; then
   gradle installers -PCHANNEL=LOCAL -Pinstall4j_media_types=macosArchive
@@ -33,7 +34,10 @@ if [ $? = 0 ]; then
   echo ""
 fi
 if [ -e "/Volumes/$INSTALLERVOL/$APP" ]; then
+  echo "Removing '$APPLICATIONS/$APP'"
   /bin/rm -r "$APPLICATIONS/$APP"
+  echo "Syncing '/Volumes/$INSTALLERVOL/$APP' to '$APPLICATIONS/'"
   rsync -avh "/Volumes/$INSTALLERVOL/$APP" "$APPLICATIONS/"
+  echo "Unmounting '/Volumes/$INSTALLERVOL'"
   umount "/Volumes/$INSTALLERVOL"
 fi
index 8029e82..26442ea 100755 (executable)
@@ -103,6 +103,7 @@ for FEATURE_VERSION in 8 11 17; do
             # make symbolic link with _ instead of - for install4j9
             NEWNAME=${NAME//-/_}
             echo "Linking from ${NEWNAME}.${EXT} for install4j9"
+            [ -e "${ARCHIVEDIR}/${NEWNAME}.${EXT}" ] && $RM "${ARCHIVEDIR}/${NEWNAME}.${EXT}"
             ln -s "${NAME}.${EXT}" "${ARCHIVEDIR}/${NEWNAME}.${EXT}"
             ;;
           *)
diff --git a/utils/install4j/install4j9_template.install4j b/utils/install4j/install4j9_template.install4j
new file mode 100644 (file)
index 0000000..6b07bfc
--- /dev/null
@@ -0,0 +1,1516 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<install4j version="9.0.5" transformSequenceNumber="9">
+  <directoryPresets config="bin/jalview" />
+  <application name="${compiler:JALVIEW_APPLICATION_NAME}" applicationId="${compiler:WINDOWS_APPLICATION_ID}" mediaDir="${compiler:BUILD_DIR}" lzmaCompression="true" shortName="${compiler:INTERNAL_ID}" publisher="University of Dundee" publisherWeb="https://www.jalview.org/" version="${compiler:JALVIEW_VERSION}" allPathsRelative="true" macVolumeId="5aac4968c304f65" javaMinVersion="${compiler:JAVA_MIN_VERSION}" javaMaxVersion="${compiler:JAVA_MAX_VERSION}" allowBetaVM="true" jdkMode="jdk" jdkName="JDK 11.0">
+    <searchSequence>
+      <directory location="${compiler:JRE_DIR}" />
+      <registry />
+      <envVar name="JAVA_HOME" />
+    </searchSequence>
+    <variables>
+      <variable name="JALVIEW_NAME" value="Jalview" />
+      <variable name="JALVIEW_APPLICATION_NAME" value="Jalview" />
+      <variable name="JALVIEW_DIR" value="../.." />
+      <variable name="BUILD_DIR" value="${compiler:JALVIEW_DIR}/build/install4j" />
+      <variable name="OSX_KEYSTORE" />
+      <variable name="OSX_APPLEID" />
+      <variable name="JSIGN_SH" value="echo" />
+      <variable name="JRE_DIR" value="jre" description="The folder under the app folder that the JRE will be either copied or unpacked into" />
+      <variable name="INSTALLER_TEMPLATE_VERSION" value="DEVELOPMENT_default" />
+      <variable name="JALVIEW_VERSION" value="DEVELOPMENT" />
+      <variable name="JAVA_MIN_VERSION" value="11" />
+      <variable name="JAVA_MAX_VERSION" value="11" />
+      <variable name="JAVA_VERSION" value="11" />
+      <variable name="JAVA_INTEGER_VERSION" value="11" />
+      <variable name="VERSION" value="DEVELOPMENT" />
+      <variable name="MACOS_JAVA_VM_DIR" value="${compiler:env.HOME}/buildtools/jre/jre-${compiler:JAVA_INTEGER_VERSION}-mac-x64/jre" />
+      <variable name="WINDOWS_JAVA_VM_DIR" value="${compiler:env.HOME}/buildtools/jre/jre-${compiler:JAVA_INTEGER_VERSION}-windows-x64/jre" />
+      <variable name="LINUX_JAVA_VM_DIR" value="${compiler:env.HOME}/buildtools/jre/jre-${compiler:JAVA_INTEGER_VERSION}-linux-x64/jre" />
+      <variable name="MACOS_JAVA_VM_TGZ" value="${compiler:env.HOME}/buildtools/jre/tgz/jre_${compiler:JAVA_INTEGER_VERSION}_mac_x64.tar.gz" />
+      <variable name="WINDOWS_JAVA_VM_TGZ" value="${compiler:env.HOME}/buildtools/jre/tgz/jre_${compiler:JAVA_INTEGER_VERSION}_windows_x64.tar.gz" />
+      <variable name="LINUX_JAVA_VM_TGZ" value="${compiler:env.HOME}/buildtools/jre/tgz/jre_${compiler:JAVA_INTEGER_VERSION}_linux_x64.tar.gz" />
+      <variable name="COPYRIGHT_MESSAGE" value="..." />
+      <variable name="BUNDLE_ID" value="org.jalview.jalview-desktop" />
+      <variable name="INTERNAL_ID" value="Jalview" />
+      <variable name="WINDOWS_APPLICATION_ID" value="6595-2347-1923-0725" />
+      <variable name="MACOS_DMG_DS_STORE" value="jalview_dmg_DS_Store" />
+      <variable name="MACOS_DMG_BG_IMAGE" value="jalview_dmg_background-72dpi.png" />
+      <variable name="WRAPPER_LINK" value="jalview" />
+      <variable name="BASH_WRAPPER_SCRIPT" value="jalview.sh" />
+      <variable name="WRAPPER_SCRIPT_BIN_DIR" value="bin" />
+      <variable name="INSTALLER_NAME" value="Jalview Installer" />
+      <variable name="INSTALL4J_UTILS_DIR" value="utils/install4j" />
+      <variable name="GETDOWN_WEBSITE_DIR" value="getdown/website" />
+      <variable name="GETDOWN_FILES_DIR" value="getdown/files" />
+      <variable name="GETDOWN_RESOURCE_DIR" value="resource" />
+      <variable name="GETDOWN_DIST_DIR" value="dist" />
+      <variable name="GETDOWN_ALT_DIR" value="alt" />
+      <variable name="GETDOWN_INSTALL_DIR" value="install" />
+      <variable name="INFO_PLIST_FILE_ASSOCIATIONS_FILE" value="file_associations_auto-Info_plist.xml" />
+      <variable name="APPLICATION_CATEGORIES" value="Science;Biology;Java;" />
+      <variable name="APPLICATION_FOLDER" value="Jalview" />
+      <variable name="UNIX_APPLICATION_FOLDER" value="jalview" />
+      <variable name="EXECUTABLE_NAME" value="jalview" />
+      <variable name="EXTRA_SCHEME" value="jalviewx" />
+      <variable name="MAC_ICONS_FILE" value="utils/channels/release/images/jalview_logo.icns" />
+      <variable name="WINDOWS_ICONS_FILE" value="utils/channels/release/images/jalview_logo.ico" />
+      <variable name="PNG_ICON_FILE" value="utils/channels/release/images/jalview_logo.png" />
+      <variable name="BACKGROUND" value="utils/channels/release/images/jalview_logo_background_fade-640x480.png" />
+    </variables>
+    <codeSigning macEnabled="true" macPkcs12File="${compiler:OSX_KEYSTORE}" macNotarize="true" appleId="${compiler:OSX_APPLEID}">
+      <macAdditionalBinaries>
+        <entry>*.dylib</entry>
+        <entry>*.so</entry>
+        <entry>*.jnilib</entry>
+        <entry>unpack200</entry>
+        <entry>tnameserv</entry>
+        <entry>servertool</entry>
+        <entry>rmiregistry</entry>
+        <entry>rmid</entry>
+        <entry>policytool</entry>
+        <entry>pack200</entry>
+        <entry>orbd</entry>
+        <entry>keytool</entry>
+        <entry>jjs</entry>
+        <entry>java</entry>
+        <entry>jspawnhelper</entry>
+        <entry>libfreetype.dylib.6</entry>
+        <entry>applet</entry>
+        <entry>jaotc</entry>
+        <entry>jfr</entry>
+        <entry>jrunscript</entry>
+        <entry>libjli.dylib</entry>
+      </macAdditionalBinaries>
+    </codeSigning>
+  </application>
+  <files defaultUninstallMode="2" preserveSymlinks="false">
+    <filesets>
+      <fileset name="Full file set" id="734" customizedId="FULL_FILE_SET" />
+      <fileset name="Mac OS X JRE" id="880" />
+      <fileset name="Windows JRE" id="882" />
+      <fileset name="Jalview application" id="1873" />
+    </filesets>
+    <roots>
+      <root id="735" fileset="734" />
+      <root id="881" fileset="880" />
+      <root id="883" fileset="882" />
+      <root id="1874" fileset="1873" />
+    </roots>
+    <mountPoints>
+      <mountPoint id="454" />
+      <mountPoint id="736" root="735" />
+      <mountPoint id="884" root="881" />
+      <mountPoint id="885" root="883" />
+      <mountPoint id="1875" root="1874" />
+    </mountPoints>
+    <entries>
+      <dirEntry mountPoint="454" file="${compiler:JALVIEW_DIR}/${compiler:GETDOWN_FILES_DIR}/${compiler:JAVA_VERSION}" uninstallMode="2" overrideOverwriteMode="true" overrideUninstallMode="true" subDirectory="files" />
+      <dirEntry mountPoint="736" file="${compiler:JALVIEW_DIR}/${compiler:GETDOWN_WEBSITE_DIR}/${compiler:JAVA_VERSION}" uninstallMode="2" overrideOverwriteMode="true" overrideUninstallMode="true" subDirectory="files">
+        <exclude>
+          <entry location="${compiler:WRAPPER_SCRIPT_BIN_DIR}" />
+        </exclude>
+      </dirEntry>
+      <dirEntry mountPoint="736" file="${compiler:JALVIEW_DIR}/examples" overwriteMode="1" uninstallMode="2" overrideFileMode="true" overrideOverwriteMode="true" overrideUninstallMode="true" entryMode="subdir" subDirectory="examples" />
+      <dirEntry mountPoint="736" file="${compiler:JALVIEW_DIR}/${compiler:GETDOWN_WEBSITE_DIR}/${compiler:JAVA_VERSION}/${compiler:WRAPPER_SCRIPT_BIN_DIR}" fileMode="755" overrideFileMode="true" overrideUninstallMode="true" entryMode="subdir" subDirectory="${compiler:WRAPPER_SCRIPT_BIN_DIR}" overrideDirMode="true" />
+      <dirEntry mountPoint="884" file="${compiler:MACOS_JAVA_VM_DIR}" fileMode="755" overrideFileMode="true" overrideUninstallMode="true" entryMode="subdir" subDirectory="${compiler:JRE_DIR}" />
+      <dirEntry mountPoint="885" file="${compiler:WINDOWS_JAVA_VM_DIR}" fileMode="755" overrideFileMode="true" overrideUninstallMode="true" entryMode="subdir" subDirectory="${compiler:JRE_DIR}" />
+      <dirEntry mountPoint="1875" file="${compiler:JALVIEW_DIR}/${compiler:GETDOWN_WEBSITE_DIR}/${compiler:JAVA_VERSION}/${compiler:GETDOWN_DIST_DIR}" overwriteMode="1" uninstallMode="2" overrideFileMode="true" overrideOverwriteMode="true" overrideUninstallMode="true" entryMode="subdir" subDirectory="${compiler:GETDOWN_DIST_DIR}" overrideDirMode="true" />
+    </entries>
+    <components>
+      <component name="jalview_getdown" id="1031">
+        <include>
+          <entry filesetId="734" />
+        </include>
+      </component>
+      <component name="macos_java_vm" id="1155">
+        <include>
+          <entry filesetId="880" />
+        </include>
+      </component>
+      <component name="windows_java_vm" id="1156">
+        <include>
+          <entry filesetId="882" />
+        </include>
+      </component>
+      <component name="getdown" id="1276">
+        <include>
+          <entry defaultFileset="true" />
+        </include>
+      </component>
+      <component name="jalview" id="1881">
+        <include>
+          <entry filesetId="1873" />
+        </include>
+      </component>
+    </components>
+  </files>
+  <launchers>
+    <launcher name="Jalview Launcher" id="737" customizedId="JALVIEW" menuName="${compiler:JALVIEW_APPLICATION_NAME}" icnsFile="${compiler:JALVIEW_DIR}/${compiler:MAC_ICONS_FILE}" customMacBundleIdentifier="true" macBundleIdentifier="${compiler:BUNDLE_ID}" fileset="734" useCustomMacosExecutableName="true" customMacosExecutableName="${compiler:JALVIEW_APPLICATION_NAME}">
+      <executable name="${compiler:EXECUTABLE_NAME}" iconSet="true" iconFile="${compiler:JALVIEW_DIR}/${compiler:WINDOWS_ICONS_FILE}" redirectStdout="true" executableMode="gui" changeWorkingDirectory="false" singleInstance="true" checkConsoleParameter="true">
+        <versionInfo include="true" fileDescription="${compiler:sys.fullName}" legalCopyright="${compiler:COPYRIGHT_MESSAGE}" internalName="${compiler:INTERNAL_ID}" productName="${compiler:sys.fullName}" />
+      </executable>
+      <splashScreen width="640" height="480" bitmapFile="${compiler:JALVIEW_DIR}/${compiler:BACKGROUND}" textOverlay="true">
+        <text>
+          <statusLine x="85" y="81" text="${compiler:sys.shortName}" fontSize="18" />
+          <versionLine x="85" y="109" text="version ${compiler:sys.version}" />
+        </text>
+      </splashScreen>
+      <java mainClass="com.threerings.getdown.launcher.GetdownApp" vmParameters="-Dinstaller_template_version=${compiler:INSTALLER_TEMPLATE_VERSION}" arguments="&quot;${launcher:sys.launcherDirectory}&quot; jalview">
+        <classPath>
+          <archive location="getdown-launcher.jar" />
+          <archive location="${compiler:GETDOWN_INSTALL_DIR}/getdown-launcher.jar" failOnError="false" />
+        </classPath>
+        <nativeLibraryDirectories>
+          <directory name="${compiler:JRE_DIR}/bin" />
+          <directory name="${compiler:GETDOWN_DIST_DIR}" />
+        </nativeLibraryDirectories>
+      </java>
+      <macStaticAssociationActions mode="selected">
+        <id>2350</id>
+        <id>2450</id>
+        <id>2641</id>
+      </macStaticAssociationActions>
+      <infoPlist>${compiler:file("${compiler:INFO_PLIST_FILE_ASSOCIATIONS_FILE}")}</infoPlist>
+      <iconImageFiles>
+        <file path="${compiler:JALVIEW_DIR}/${compiler:PNG_ICON_FILE}" />
+      </iconImageFiles>
+    </launcher>
+  </launchers>
+  <installerGui autoUpdateDescriptorUrl="https://www.jalview.org/install4j/updates.xml">
+    <applications>
+      <application id="installer" beanClass="com.install4j.runtime.beans.applications.InstallerApplication" styleId="35" customIcnsFile="${compiler:JALVIEW_DIR}/${compiler:MAC_ICONS_FILE}" customIcoFile="${compiler:JALVIEW_DIR}/${compiler:WINDOWS_ICONS_FILE}">
+        <serializedBean>
+          <property name="useCustomIcon" type="boolean" value="true" />
+        </serializedBean>
+        <styleOverrides>
+          <styleOverride name="Customize banner image" enabled="true">
+            <group id="146" beanClass="com.install4j.runtime.beans.groups.VerticalFormComponentGroup" useExternalParametrization="true" externalParametrizationName="Customize banner image" externalParametrizationMode="include">
+              <serializedBean>
+                <property name="backgroundColor">
+                  <object class="com.install4j.runtime.beans.LightOrDarkColor">
+                    <object class="java.awt.Color">
+                      <int>255</int>
+                      <int>255</int>
+                      <int>255</int>
+                      <int>255</int>
+                    </object>
+                    <object class="java.awt.Color">
+                      <int>49</int>
+                      <int>52</int>
+                      <int>53</int>
+                      <int>255</int>
+                    </object>
+                  </object>
+                </property>
+                <property name="borderSides">
+                  <object class="com.install4j.runtime.beans.formcomponents.BorderSides">
+                    <property name="bottom" type="boolean" value="true" />
+                  </object>
+                </property>
+                <property name="imageEdgeBackgroundColor">
+                  <object class="java.awt.Color">
+                    <int>255</int>
+                    <int>255</int>
+                    <int>255</int>
+                    <int>255</int>
+                  </object>
+                </property>
+                <property name="imageEdgeBorder" type="boolean" value="true" />
+                <property name="imageFile">
+                  <object class="com.install4j.api.beans.ExternalFile">
+                    <string>${compiler:JALVIEW_DIR}/${compiler:BACKGROUND}</string>
+                  </object>
+                </property>
+                <property name="insets">
+                  <object class="java.awt.Insets">
+                    <int>5</int>
+                    <int>10</int>
+                    <int>10</int>
+                    <int>10</int>
+                  </object>
+                </property>
+              </serializedBean>
+              <externalParametrizationPropertyNames>
+                <propertyName>imageAnchor</propertyName>
+                <propertyName>imageEdgeBackgroundColor</propertyName>
+                <propertyName>imageFile</propertyName>
+              </externalParametrizationPropertyNames>
+            </group>
+          </styleOverride>
+          <styleOverride name="Jalview" enabled="true">
+            <formComponent name="Watermark" id="352" beanClass="com.install4j.runtime.beans.formcomponents.SeparatorComponent" insetTop="0" insetLeft="5" insetBottom="0" useExternalParametrization="true" externalParametrizationName="Jalview" externalParametrizationMode="include">
+              <serializedBean>
+                <property name="enabledTitleText" type="boolean" value="false" />
+              </serializedBean>
+              <externalParametrizationPropertyNames>
+                <propertyName>labelText</propertyName>
+              </externalParametrizationPropertyNames>
+            </formComponent>
+          </styleOverride>
+        </styleOverrides>
+        <startup>
+          <screen id="1" beanClass="com.install4j.runtime.beans.screens.StartupScreen" rollbackBarrierExitCode="0">
+            <actions>
+              <action id="22" beanClass="com.install4j.runtime.beans.actions.misc.RequestPrivilegesAction" actionElevationType="none" rollbackBarrierExitCode="0">
+                <serializedBean>
+                  <property name="obtainIfAdminWin" type="boolean" value="false" />
+                </serializedBean>
+              </action>
+              <action name="Set unixUserBinDir (Linux or Unix)" id="2738" beanClass="com.install4j.runtime.beans.actions.control.SetVariableAction" rollbackBarrierExitCode="0">
+                <serializedBean>
+                  <property name="script">
+                    <object class="com.install4j.api.beans.ScriptProperty">
+                      <property name="value" type="string">String userHome = (String)context.getVariable("sys.userHome");
+
+ArrayList&lt;String&gt; tryPaths = new ArrayList&lt;&gt; ();
+tryPaths.add(userHome + File.separator + "bin");
+tryPaths.add(userHome + File.separator + ".local" + File.separator + "bin");
+tryPaths.add(userHome + File.separator + "local" + File.separator + "bin");
+tryPaths.add(userHome + File.separator + "opt" + File.separator + "bin");
+
+if (Util.isMacOS()) { // &amp;&amp; root permission?
+    tryPaths.add(File.separator + "usr" + File.separator + "local" + File.separator + "bin"); 
+}
+
+for (int i = 0; i &lt; tryPaths.size(); i++) {
+    String tryPath = tryPaths.get(i);
+    File unixUserBinDir = new File(tryPath);
+    if (unixUserBinDir.exists()) {
+        return tryPath;
+    }
+}
+
+return null;
+</property>
+                    </object>
+                  </property>
+                  <property name="variableName" type="string">unixUserBinDir</property>
+                </serializedBean>
+                <condition>Util.isLinux() || Util.isUnixInstaller() || Util.isMacOS()</condition>
+              </action>
+              <action name="Set macWrapperLinkLocation (macOS)" id="2745" beanClass="com.install4j.runtime.beans.actions.control.SetVariableAction" rollbackBarrierExitCode="0">
+                <serializedBean>
+                  <property name="script">
+                    <object class="com.install4j.api.beans.ScriptProperty">
+                      <property name="value" type="string">String javaHome = System.getProperty("java.home");
+String appName = ((String)context.getCompilerVariable("JALVIEW_APPLICATION_NAME")) + ".app";
+int i = javaHome.indexOf(appName);
+String wrapperLink = null;
+if (i &gt; -1) {
+    wrapperLink = javaHome.substring(0, i) + appName + File.separator + "Contents" + File.separator + "MacOS" + File.separator + ((String)context.getCompilerVariable("WRAPPER_LINK"));
+}
+return wrapperLink;
+</property>
+                    </object>
+                  </property>
+                  <property name="variableName" type="string">macWrapperLinkLocation</property>
+                </serializedBean>
+                <condition>Util.isMacOS()</condition>
+              </action>
+            </actions>
+          </screen>
+        </startup>
+        <screens>
+          <screen id="2" beanClass="com.install4j.runtime.beans.screens.WelcomeScreen" rollbackBarrierExitCode="0">
+            <styleOverrides>
+              <styleOverride name="Customize banner image" enabled="true">
+                <group id="145" beanClass="com.install4j.runtime.beans.groups.VerticalFormComponentGroup" useExternalParametrization="true" externalParametrizationName="Customize banner image" externalParametrizationMode="include">
+                  <serializedBean>
+                    <property name="backgroundColor">
+                      <object class="com.install4j.runtime.beans.LightOrDarkColor">
+                        <object class="java.awt.Color">
+                          <int>255</int>
+                          <int>255</int>
+                          <int>255</int>
+                          <int>255</int>
+                        </object>
+                        <object class="java.awt.Color">
+                          <int>49</int>
+                          <int>52</int>
+                          <int>53</int>
+                          <int>255</int>
+                        </object>
+                      </object>
+                    </property>
+                    <property name="borderSides">
+                      <object class="com.install4j.runtime.beans.formcomponents.BorderSides">
+                        <property name="bottom" type="boolean" value="true" />
+                      </object>
+                    </property>
+                    <property name="imageEdgeBackgroundColor">
+                      <object class="com.install4j.runtime.beans.LightOrDarkColor">
+                        <object class="java.awt.Color">
+                          <int>25</int>
+                          <int>143</int>
+                          <int>220</int>
+                          <int>255</int>
+                        </object>
+                        <object class="java.awt.Color">
+                          <int>0</int>
+                          <int>74</int>
+                          <int>151</int>
+                          <int>255</int>
+                        </object>
+                      </object>
+                    </property>
+                    <property name="imageEdgeBorder" type="boolean" value="true" />
+                    <property name="imageFile">
+                      <object class="com.install4j.api.beans.ExternalFile">
+                        <string>${compiler:JALVIEW_DIR}/${compiler:BACKGROUND}</string>
+                      </object>
+                    </property>
+                    <property name="insets">
+                      <object class="java.awt.Insets">
+                        <int>5</int>
+                        <int>10</int>
+                        <int>10</int>
+                        <int>10</int>
+                      </object>
+                    </property>
+                  </serializedBean>
+                  <externalParametrizationPropertyNames>
+                    <propertyName>imageAnchor</propertyName>
+                    <propertyName>imageEdgeBackgroundColor</propertyName>
+                    <propertyName>imageFile</propertyName>
+                  </externalParametrizationPropertyNames>
+                </group>
+              </styleOverride>
+            </styleOverrides>
+            <actions>
+              <action id="7" beanClass="com.install4j.runtime.beans.actions.misc.LoadResponseFileAction" rollbackBarrierExitCode="0" multiExec="true">
+                <serializedBean>
+                  <property name="excludedVariables" type="array" elementType="string" length="1">
+                    <element index="0">sys.installationDir</element>
+                  </property>
+                </serializedBean>
+                <condition>context.getBooleanVariable("sys.confirmedUpdateInstallation")</condition>
+              </action>
+            </actions>
+            <formComponents>
+              <formComponent id="3" beanClass="com.install4j.runtime.beans.formcomponents.MultilineLabelComponent">
+                <serializedBean>
+                  <property name="labelText" type="string">${form:welcomeMessage}</property>
+                </serializedBean>
+                <visibilityScript>!context.isConsole()</visibilityScript>
+              </formComponent>
+              <formComponent id="4" beanClass="com.install4j.runtime.beans.formcomponents.ConsoleHandlerFormComponent">
+                <serializedBean>
+                  <property name="consoleScript">
+                    <object class="com.install4j.api.beans.ScriptProperty">
+                      <property name="value" type="string">String message = context.getMessage("ConsoleWelcomeLabel", context.getApplicationName());
+return console.askOkCancel(message, true);
+</property>
+                    </object>
+                  </property>
+                </serializedBean>
+              </formComponent>
+              <formComponent id="5" beanClass="com.install4j.runtime.beans.formcomponents.UpdateAlertComponent" useExternalParametrization="true" externalParametrizationName="Update Alert" externalParametrizationMode="include">
+                <externalParametrizationPropertyNames>
+                  <propertyName>updateCheck</propertyName>
+                </externalParametrizationPropertyNames>
+              </formComponent>
+              <formComponent id="6" beanClass="com.install4j.runtime.beans.formcomponents.MultilineLabelComponent" insetTop="20">
+                <serializedBean>
+                  <property name="labelText" type="string">${i18n:ClickNext}</property>
+                </serializedBean>
+              </formComponent>
+            </formComponents>
+          </screen>
+          <screen id="8" beanClass="com.install4j.runtime.beans.screens.InstallationDirectoryScreen" rollbackBarrierExitCode="0">
+            <condition>!context.getBooleanVariable("sys.confirmedUpdateInstallation")</condition>
+            <actions>
+              <action id="11" beanClass="com.install4j.runtime.beans.actions.misc.LoadResponseFileAction" rollbackBarrierExitCode="0" multiExec="true">
+                <serializedBean>
+                  <property name="excludedVariables" type="array" elementType="string" length="1">
+                    <element index="0">sys.installationDir</element>
+                  </property>
+                </serializedBean>
+                <condition>context.getVariable("sys.responseFile") == null</condition>
+              </action>
+            </actions>
+            <formComponents>
+              <formComponent id="9" beanClass="com.install4j.runtime.beans.formcomponents.MultilineLabelComponent" insetBottom="25">
+                <serializedBean>
+                  <property name="labelText" type="string">${i18n:SelectDirLabel(${compiler:sys.fullName})}</property>
+                </serializedBean>
+              </formComponent>
+              <formComponent id="10" beanClass="com.install4j.runtime.beans.formcomponents.InstallationDirectoryChooserComponent" useExternalParametrization="true" externalParametrizationName="Installation Directory Chooser" externalParametrizationMode="include">
+                <serializedBean>
+                  <property name="requestFocus" type="boolean" value="true" />
+                </serializedBean>
+                <externalParametrizationPropertyNames>
+                  <propertyName>allowSpacesOnUnix</propertyName>
+                  <propertyName>checkFreeSpace</propertyName>
+                  <propertyName>checkWritable</propertyName>
+                  <propertyName>existingDirWarning</propertyName>
+                  <propertyName>manualEntryAllowed</propertyName>
+                  <propertyName>showFreeDiskSpace</propertyName>
+                  <propertyName>showRequiredDiskSpace</propertyName>
+                  <propertyName>standardValidation</propertyName>
+                  <propertyName>suggestAppDir</propertyName>
+                  <propertyName>validateApplicationId</propertyName>
+                  <propertyName>validationScript</propertyName>
+                </externalParametrizationPropertyNames>
+              </formComponent>
+            </formComponents>
+          </screen>
+          <screen id="12" beanClass="com.install4j.runtime.beans.screens.ComponentsScreen" enabled="false" rollbackBarrierExitCode="0">
+            <formComponents>
+              <formComponent id="13" beanClass="com.install4j.runtime.beans.formcomponents.MultilineLabelComponent">
+                <serializedBean>
+                  <property name="labelText" type="string">${i18n:SelectComponentsLabel2}</property>
+                </serializedBean>
+                <visibilityScript>!context.isConsole()</visibilityScript>
+              </formComponent>
+              <formComponent id="14" beanClass="com.install4j.runtime.beans.formcomponents.ComponentSelectorComponent" useExternalParametrization="true" externalParametrizationName="Installation Components" externalParametrizationMode="include">
+                <serializedBean>
+                  <property name="fillVertical" type="boolean" value="true" />
+                </serializedBean>
+                <externalParametrizationPropertyNames>
+                  <propertyName>selectionChangedScript</propertyName>
+                </externalParametrizationPropertyNames>
+              </formComponent>
+            </formComponents>
+          </screen>
+          <screen id="1692" beanClass="com.install4j.runtime.beans.screens.FileAssociationsScreen" rollbackBarrierExitCode="0">
+            <formComponents>
+              <formComponent id="1693" beanClass="com.install4j.runtime.beans.formcomponents.MultilineLabelComponent">
+                <serializedBean>
+                  <property name="labelText" type="string">${i18n:SelectAssociationsLabel}</property>
+                </serializedBean>
+              </formComponent>
+              <formComponent id="1694" beanClass="com.install4j.runtime.beans.formcomponents.FileAssociationsComponent" useExternalParametrization="true" externalParametrizationName="File Associations" externalParametrizationMode="include">
+                <serializedBean>
+                  <property name="fillVertical" type="boolean" value="true" />
+                  <property name="selectionButtonPosition" type="enum" class="com.install4j.runtime.beans.formcomponents.VerticalDockingPosition" value="TOP" />
+                  <property name="showSelectionButtons" type="boolean" value="true" />
+                </serializedBean>
+                <externalParametrizationPropertyNames>
+                  <propertyName>showSelectionButtons</propertyName>
+                  <propertyName>selectionButtonPosition</propertyName>
+                </externalParametrizationPropertyNames>
+              </formComponent>
+            </formComponents>
+          </screen>
+          <screen id="15" beanClass="com.install4j.runtime.beans.screens.InstallationScreen" rollbackBarrier="true" rollbackBarrierExitCode="0">
+            <actions>
+              <action id="17" beanClass="com.install4j.runtime.beans.actions.InstallFilesAction" actionElevationType="elevated" rollbackBarrierExitCode="0" failureStrategy="quit" errorMessage="${i18n:FileCorrupted}" />
+              <action name="Create program group (RELEASE)" id="18" customizedId="PROGRAM_GROUP_RELEASE" beanClass="com.install4j.runtime.beans.actions.desktop.CreateProgramGroupAction" actionElevationType="elevated" rollbackBarrierExitCode="0">
+                <serializedBean>
+                  <property name="allUsers" type="boolean" value="false" />
+                  <property name="categories" type="string">${compiler:APPLICATION_CATEGORIES}</property>
+                  <property name="programGroupEntryConfigs">
+                    <add>
+                      <object class="com.install4j.runtime.beans.screens.components.ProgramGroupFileConfig">
+                        <property name="name" type="string">Examples</property>
+                        <property name="target">
+                          <object class="java.io.File">
+                            <string>examples</string>
+                          </object>
+                        </property>
+                      </object>
+                    </add>
+                  </property>
+                  <property name="programGroupName" type="string">${compiler:JALVIEW_NAME}</property>
+                  <property name="uninstallerMenuName" type="string">${i18n:UninstallerMenuEntry(${compiler:sys.fullName})}</property>
+                </serializedBean>
+                <condition>!context.getBooleanVariable("sys.programGroupDisabled")</condition>
+              </action>
+              <action name="Create program group (NON-RELEASE)" id="2730" customizedId="PROGRAM_GROUP_NON_RELEASE" beanClass="com.install4j.runtime.beans.actions.desktop.CreateProgramGroupAction" actionElevationType="elevated" rollbackBarrierExitCode="0">
+                <serializedBean>
+                  <property name="allUsers" type="boolean" value="false" />
+                  <property name="categories" type="string">${compiler:APPLICATION_CATEGORIES}</property>
+                  <property name="programGroupName" type="string">${compiler:JALVIEW_NAME}</property>
+                  <property name="uninstallerMenuName" type="string">${i18n:UninstallerMenuEntry(${compiler:sys.fullName})}</property>
+                </serializedBean>
+                <condition>!context.getBooleanVariable("sys.programGroupDisabled")</condition>
+              </action>
+              <action id="19" beanClass="com.install4j.runtime.beans.actions.desktop.RegisterAddRemoveAction" actionElevationType="elevated" rollbackBarrierExitCode="0">
+                <serializedBean>
+                  <property name="itemName" type="string">${compiler:sys.fullName} ${compiler:sys.version}</property>
+                </serializedBean>
+              </action>
+              <action id="124" beanClass="com.install4j.runtime.beans.actions.control.SetVariableAction" enabled="false" rollbackBarrierExitCode="0">
+                <serializedBean>
+                  <property name="script">
+                    <object class="com.install4j.api.beans.ScriptProperty">
+                      <property name="value" type="string" />
+                    </object>
+                  </property>
+                  <property name="variableName" type="string" />
+                </serializedBean>
+                <condition>true</condition>
+              </action>
+              <action id="134" beanClass="com.install4j.runtime.beans.actions.misc.AddVmOptionsAction" enabled="false" actionElevationType="elevated" rollbackBarrierExitCode="0">
+                <serializedBean>
+                  <property name="launcherId" type="string">121</property>
+                  <property name="vmOptions" type="array" elementType="string" length="0" />
+                </serializedBean>
+              </action>
+              <group name="File Associations" id="2251" beanClass="com.install4j.runtime.beans.groups.ActionGroup">
+                <beans>
+                  <action id="2253" beanClass="com.install4j.runtime.beans.actions.control.SetMessageAction" actionElevationType="none" rollbackBarrierExitCode="0">
+                    <serializedBean>
+                      <property name="statusMessage" type="string">Creating file associations...</property>
+                      <property name="useDetail" type="boolean" value="true" />
+                      <property name="useStatus" type="boolean" value="true" />
+                    </serializedBean>
+                  </action>
+                  <action id="2254" beanClass="com.install4j.runtime.beans.actions.control.SetProgressAction" actionElevationType="none" rollbackBarrierExitCode="0">
+                    <serializedBean>
+                      <property name="progressChangeType" type="enum" class="com.install4j.runtime.beans.actions.control.ProgressChangeType" value="SET_INDETERMINATE" />
+                    </serializedBean>
+                  </action>
+                  <group name="File Associations Replacement Group" id="2753" customizedId="EXTENSIONS_REPLACED_BY_GRADLE_PARENT_GROUP" beanClass="com.install4j.runtime.beans.groups.ActionGroup">
+                    <beans>
+                      <action name="EXTENSIONS_REPLACED_BY_GRADLE" id="1691" customizedId="EXTENSIONS" beanClass="com.install4j.runtime.beans.actions.desktop.CreateFileAssociationAction" actionElevationType="elevated" rollbackBarrierExitCode="0">
+                        <serializedBean>
+                          <property name="description" type="string">This action, identified by its name "EXTENSIONS_REPLACED_BY_GRADLE", will be replaced by gradle with the contents of file 'file_associations_auto_install4j.xml'.</property>
+                          <property name="extension" type="string">extensions_to_be_replaced_by_gradle</property>
+                          <property name="launcherId" type="string">JALVIEW</property>
+                        </serializedBean>
+                      </action>
+                    </beans>
+                  </group>
+                  <action id="2542" beanClass="com.install4j.runtime.beans.actions.control.SetMessageAction" actionElevationType="none" rollbackBarrierExitCode="0">
+                    <serializedBean>
+                      <property name="statusMessage" type="string">Finished creating file associations</property>
+                      <property name="useDetail" type="boolean" value="true" />
+                      <property name="useStatus" type="boolean" value="true" />
+                    </serializedBean>
+                  </action>
+                  <action id="2541" beanClass="com.install4j.runtime.beans.actions.control.SetProgressAction" actionElevationType="none" rollbackBarrierExitCode="0">
+                    <serializedBean>
+                      <property name="percentValue" type="int" value="100" />
+                    </serializedBean>
+                  </action>
+                </beans>
+              </group>
+              <action id="2350" beanClass="com.install4j.runtime.beans.actions.desktop.UrlHandlerAction" actionElevationType="elevated" rollbackBarrierExitCode="0">
+                <serializedBean>
+                  <property name="launcherId" type="string">JALVIEW</property>
+                  <property name="scheme" type="string">jalview</property>
+                </serializedBean>
+              </action>
+              <action id="2450" beanClass="com.install4j.runtime.beans.actions.desktop.UrlHandlerAction" actionElevationType="elevated" rollbackBarrierExitCode="0">
+                <serializedBean>
+                  <property name="launcherId" type="string">JALVIEW</property>
+                  <property name="scheme" type="string">jalviews</property>
+                </serializedBean>
+              </action>
+              <action id="2641" beanClass="com.install4j.runtime.beans.actions.desktop.UrlHandlerAction" actionElevationType="elevated" rollbackBarrierExitCode="0">
+                <serializedBean>
+                  <property name="launcherId" type="string">JALVIEW</property>
+                  <property name="scheme" type="string">${compiler:EXTRA_SCHEME}</property>
+                </serializedBean>
+              </action>
+            </actions>
+            <formComponents>
+              <formComponent id="16" beanClass="com.install4j.runtime.beans.formcomponents.ProgressComponent">
+                <serializedBean>
+                  <property name="initialStatusMessage" type="string">${i18n:WizardPreparing}</property>
+                </serializedBean>
+              </formComponent>
+            </formComponents>
+          </screen>
+          <screen id="20" beanClass="com.install4j.runtime.beans.screens.FinishedScreen" rollbackBarrierExitCode="0" finishScreen="true">
+            <actions>
+              <action id="2012" beanClass="com.install4j.runtime.beans.actions.desktop.CreateStartMenuEntryAction" actionElevationType="elevated" rollbackBarrierExitCode="0">
+                <serializedBean>
+                  <property name="allUsers" type="boolean" value="false" />
+                  <property name="categories" type="string">${compiler:APPLICATION_CATEGORIES}</property>
+                  <property name="entryName" type="string">${compiler:JALVIEW_APPLICATION_NAME}</property>
+                  <property name="file">
+                    <object class="java.io.File">
+                      <string>${installer:sys.contentDir}/${compiler:EXECUTABLE_NAME}</string>
+                    </object>
+                  </property>
+                  <property name="icon">
+                    <object class="com.install4j.api.beans.ExternalFile">
+                      <string>${compiler:JALVIEW_DIR}/${compiler:WINDOWS_ICONS_FILE}</string>
+                    </object>
+                  </property>
+                  <property name="programGroupName" type="string">${compiler:JALVIEW_NAME}</property>
+                  <property name="unixIconFile">
+                    <object class="com.install4j.api.beans.ExternalFile">
+                      <string>${compiler:JALVIEW_DIR}/${compiler:PNG_ICON_FILE}</string>
+                    </object>
+                  </property>
+                </serializedBean>
+                <condition>!context.getBooleanVariable("sys.programGroupDisabled")</condition>
+              </action>
+              <action id="573" beanClass="com.install4j.runtime.beans.actions.desktop.CreateDesktopLinkAction" actionElevationType="elevated" rollbackBarrierExitCode="0" errorMessage="Could not make desktop link">
+                <serializedBean>
+                  <property name="allUsers" type="boolean" value="false" />
+                  <property name="description" type="string">${compiler:JALVIEW_APPLICATION_NAME}</property>
+                  <property name="file">
+                    <object class="java.io.File">
+                      <string>${installer:sys.contentDir}/${compiler:EXECUTABLE_NAME}</string>
+                    </object>
+                  </property>
+                  <property name="name" type="string">${compiler:JALVIEW_APPLICATION_NAME}</property>
+                  <property name="unixIconFile">
+                    <object class="com.install4j.api.beans.ExternalFile">
+                      <string>${compiler:JALVIEW_DIR}/${compiler:PNG_ICON_FILE}</string>
+                    </object>
+                  </property>
+                  <property name="winIconFile">
+                    <object class="com.install4j.api.beans.ExternalFile">
+                      <string>${compiler:JALVIEW_DIR}/${compiler:WINDOWS_ICONS_FILE}</string>
+                    </object>
+                  </property>
+                </serializedBean>
+                <condition>context.getBooleanVariable("createDesktopLinkAction")</condition>
+              </action>
+              <action id="576" beanClass="com.install4j.runtime.beans.actions.desktop.AddToDockAction" actionElevationType="none" rollbackBarrierExitCode="0">
+                <serializedBean>
+                  <property name="executable">
+                    <object class="java.io.File">
+                      <string>${compiler:JALVIEW_APPLICATION_NAME}.app</string>
+                    </object>
+                  </property>
+                </serializedBean>
+                <condition>context.getBooleanVariable("addToDockAction")</condition>
+              </action>
+              <action name="Linux/Unix symlink" id="2733" beanClass="com.install4j.runtime.beans.actions.files.CreateSymlinkAction" actionElevationType="elevated" rollbackBarrierExitCode="0" errorMessage="Could not make symlink to wrapper script">
+                <serializedBean>
+                  <property name="file">
+                    <object class="java.io.File">
+                      <string>${compiler:WRAPPER_SCRIPT_BIN_DIR}/${compiler:BASH_WRAPPER_SCRIPT}</string>
+                    </object>
+                  </property>
+                  <property name="linkFile">
+                    <object class="java.io.File">
+                      <string>${compiler:WRAPPER_SCRIPT_BIN_DIR}/${compiler:WRAPPER_LINK}</string>
+                    </object>
+                  </property>
+                </serializedBean>
+                <condition>Util.isLinux() || Util.isUnixInstaller() || Util.isMacOS()</condition>
+              </action>
+              <action name="Add Jalview bin to the user's path (Windows)" id="2740" beanClass="com.install4j.runtime.beans.actions.misc.ModifyEnvironmentVariableAction" actionElevationType="elevated" rollbackBarrierExitCode="0" errorMessage="Could not add &quot;${installer:sys.contentDir}\${compiler:WRAPPER_SCRIPT_BIN_DIR}&quot; to the Path environment variable">
+                <serializedBean>
+                  <property name="type" type="enum" class="com.install4j.runtime.beans.actions.misc.ModifyStringType" value="APPEND" />
+                  <property name="value" type="string">${installer:sys.contentDir}\${compiler:WRAPPER_SCRIPT_BIN_DIR}</property>
+                  <property name="variableName" type="string">Path</property>
+                </serializedBean>
+                <condition>context.getBooleanVariable("appendToPathAction")</condition>
+              </action>
+              <action name="Create Linux/Unix symbolic link to jalview.sh in user's local bin" id="2739" beanClass="com.install4j.runtime.beans.actions.files.CreateSymlinkAction" actionElevationType="elevated" rollbackBarrierExitCode="0" errorMessage="Could not make a ${compiler:WRAPPER_LINK} symbolic link in ~/${installer:unixUserBinDir}">
+                <serializedBean>
+                  <property name="file">
+                    <object class="java.io.File">
+                      <string>${installer:sys.contentDir}/${compiler:WRAPPER_SCRIPT_BIN_DIR}/${compiler:BASH_WRAPPER_SCRIPT}</string>
+                    </object>
+                  </property>
+                  <property name="linkFile">
+                    <object class="java.io.File">
+                      <string>${installer:unixUserBinDir}/${compiler:WRAPPER_LINK}</string>
+                    </object>
+                  </property>
+                </serializedBean>
+                <condition>context.getBooleanVariable("makeSymbolicLinkAction") &amp;&amp; ( Util.isLinux() || Util.isUnixInstaller() ) &amp;&amp; ( context.getVariable("unixUserBinDir") != null )</condition>
+              </action>
+              <action name="Create macOS symbolic link to jalview in user's local bin" id="2743" beanClass="com.install4j.runtime.beans.actions.files.CreateSymlinkAction" actionElevationType="elevated" rollbackBarrierExitCode="0" errorMessage="Could not make a ${compiler:WRAPPER_LINK} symbolic link in ~/${installer:unixUserBinDir}">
+                <serializedBean>
+                  <property name="file">
+                    <object class="java.io.File">
+                      <string>${installer:macWrapperLinkLocation}</string>
+                    </object>
+                  </property>
+                  <property name="linkFile">
+                    <object class="java.io.File">
+                      <string>${installer:unixUserBinDir}/${compiler:WRAPPER_LINK}</string>
+                    </object>
+                  </property>
+                </serializedBean>
+                <condition>context.getBooleanVariable("makeSymbolicLinkAction") &amp;&amp; Util.isMacOS() &amp;&amp; ( context.getVariable("unixUserBinDir") != null ) &amp;&amp; ( context.getVariable("macWrapperLinkLocation") != null )</condition>
+              </action>
+            </actions>
+            <formComponents>
+              <formComponent id="21" beanClass="com.install4j.runtime.beans.formcomponents.MultilineLabelComponent" insetBottom="10">
+                <serializedBean>
+                  <property name="labelText" type="string">${form:finishedMessage}</property>
+                </serializedBean>
+              </formComponent>
+              <formComponent name="Add a desktop link" id="574" beanClass="com.install4j.runtime.beans.formcomponents.CheckboxComponent">
+                <serializedBean>
+                  <property name="checkboxText" type="string">${i18n:CreateDesktopIcon}</property>
+                  <property name="initiallySelected" type="boolean" value="true" />
+                  <property name="variableName" type="string">createDesktopLinkAction</property>
+                </serializedBean>
+                <visibilityScript>!Util.isMacOS()</visibilityScript>
+              </formComponent>
+              <formComponent name="Add an executable to the dock" id="577" beanClass="com.install4j.runtime.beans.formcomponents.CheckboxComponent">
+                <serializedBean>
+                  <property name="checkboxText" type="string">${i18n:AddToDock}</property>
+                  <property name="initiallySelected" type="boolean" value="true" />
+                  <property name="variableName" type="string">addToDockAction</property>
+                </serializedBean>
+                <visibilityScript>Util.isMacOS()</visibilityScript>
+              </formComponent>
+              <formComponent name="Add jalview bin to the user's Path environment variable (Windows)" id="2734" beanClass="com.install4j.runtime.beans.formcomponents.CheckboxComponent">
+                <serializedBean>
+                  <property name="checkboxText" type="string">Add ${compiler:JALVIEW_APPLICATION_NAME}'s bin folder to the Path environment variable</property>
+                  <property name="initiallySelected" type="boolean" value="true" />
+                  <property name="variableName" type="string">appendToPathAction</property>
+                </serializedBean>
+                <visibilityScript>Util.isWindows()</visibilityScript>
+              </formComponent>
+              <formComponent name="Make a symbolic link to jalview.sh bash script in the user's local bin (Linux or Unix)" id="2736" beanClass="com.install4j.runtime.beans.formcomponents.CheckboxComponent">
+                <serializedBean>
+                  <property name="checkboxText" type="string">Make a ${compiler:WRAPPER_LINK} symbolic link in ${installer:unixUserBinDir}</property>
+                  <property name="initiallySelected" type="boolean" value="true" />
+                  <property name="variableName" type="string">makeSymbolicLinkAction</property>
+                </serializedBean>
+                <visibilityScript>( Util.isLinux() || Util.isUnixInstaller() || ( Util.isMacOS() &amp;&amp; ( context.getVariable("macWrapperLinkLocation") != null ) ) ) &amp;&amp; ( context.getVariable("unixUserBinDir") != null )</visibilityScript>
+              </formComponent>
+            </formComponents>
+          </screen>
+        </screens>
+      </application>
+      <application id="uninstaller" beanClass="com.install4j.runtime.beans.applications.UninstallerApplication" styleId="35">
+        <serializedBean>
+          <property name="customMacosExecutableName" type="string">${i18n:UninstallerMenuEntry(${compiler:sys.fullName})}</property>
+          <property name="useCustomMacosExecutableName" type="boolean" value="true" />
+        </serializedBean>
+        <styleOverrides>
+          <styleOverride name="Customize banner image" enabled="true">
+            <group id="147" beanClass="com.install4j.runtime.beans.groups.VerticalFormComponentGroup" useExternalParametrization="true" externalParametrizationName="Customize banner image" externalParametrizationMode="include">
+              <serializedBean>
+                <property name="backgroundColor">
+                  <object class="com.install4j.runtime.beans.LightOrDarkColor">
+                    <object class="java.awt.Color">
+                      <int>255</int>
+                      <int>255</int>
+                      <int>255</int>
+                      <int>255</int>
+                    </object>
+                    <object class="java.awt.Color">
+                      <int>49</int>
+                      <int>52</int>
+                      <int>53</int>
+                      <int>255</int>
+                    </object>
+                  </object>
+                </property>
+                <property name="borderSides">
+                  <object class="com.install4j.runtime.beans.formcomponents.BorderSides">
+                    <property name="bottom" type="boolean" value="true" />
+                  </object>
+                </property>
+                <property name="imageEdgeBackgroundColor">
+                  <object class="java.awt.Color">
+                    <int>192</int>
+                    <int>192</int>
+                    <int>192</int>
+                    <int>255</int>
+                  </object>
+                </property>
+                <property name="imageEdgeBorder" type="boolean" value="true" />
+                <property name="imageFile">
+                  <object class="com.install4j.api.beans.ExternalFile">
+                    <string>${compiler:JALVIEW_DIR}/${compiler:BACKGROUND}</string>
+                  </object>
+                </property>
+                <property name="insets">
+                  <object class="java.awt.Insets">
+                    <int>5</int>
+                    <int>10</int>
+                    <int>10</int>
+                    <int>10</int>
+                  </object>
+                </property>
+              </serializedBean>
+              <externalParametrizationPropertyNames>
+                <propertyName>imageAnchor</propertyName>
+                <propertyName>imageEdgeBackgroundColor</propertyName>
+                <propertyName>imageFile</propertyName>
+              </externalParametrizationPropertyNames>
+            </group>
+          </styleOverride>
+        </styleOverrides>
+        <startup>
+          <screen id="23" beanClass="com.install4j.runtime.beans.screens.StartupScreen" rollbackBarrierExitCode="0">
+            <actions>
+              <action id="33" beanClass="com.install4j.runtime.beans.actions.misc.LoadResponseFileAction" rollbackBarrierExitCode="0" />
+              <action id="34" beanClass="com.install4j.runtime.beans.actions.misc.RequireInstallerPrivilegesAction" actionElevationType="none" rollbackBarrierExitCode="0" />
+            </actions>
+          </screen>
+        </startup>
+        <screens>
+          <screen id="24" beanClass="com.install4j.runtime.beans.screens.UninstallWelcomeScreen" rollbackBarrierExitCode="0">
+            <formComponents>
+              <formComponent id="25" beanClass="com.install4j.runtime.beans.formcomponents.MultilineLabelComponent" insetBottom="10">
+                <serializedBean>
+                  <property name="labelText" type="string">${form:welcomeMessage}</property>
+                </serializedBean>
+                <visibilityScript>!context.isConsole()</visibilityScript>
+              </formComponent>
+              <formComponent id="26" beanClass="com.install4j.runtime.beans.formcomponents.ConsoleHandlerFormComponent">
+                <serializedBean>
+                  <property name="consoleScript">
+                    <object class="com.install4j.api.beans.ScriptProperty">
+                      <property name="value" type="string">String message = context.getMessage("ConfirmUninstall", context.getApplicationName());
+return console.askYesNo(message, true);
+</property>
+                    </object>
+                  </property>
+                </serializedBean>
+              </formComponent>
+            </formComponents>
+          </screen>
+          <screen id="27" beanClass="com.install4j.runtime.beans.screens.UninstallationScreen" rollbackBarrierExitCode="0">
+            <actions>
+              <action id="659" beanClass="com.install4j.runtime.beans.actions.control.SetProgressAction" actionElevationType="none" rollbackBarrierExitCode="0">
+                <serializedBean>
+                  <property name="progressChangeType" type="enum" class="com.install4j.runtime.beans.actions.control.ProgressChangeType" value="SET_INDETERMINATE" />
+                </serializedBean>
+              </action>
+              <action id="29" beanClass="com.install4j.runtime.beans.actions.UninstallFilesAction" actionElevationType="elevated" rollbackBarrierExitCode="0" />
+              <action id="660" beanClass="com.install4j.runtime.beans.actions.control.SetProgressAction" enabled="false" actionElevationType="none" rollbackBarrierExitCode="0">
+                <serializedBean>
+                  <property name="percentValue" type="int" value="95" />
+                </serializedBean>
+              </action>
+              <action id="1525" beanClass="com.install4j.runtime.beans.actions.files.DeleteFileAction" actionElevationType="elevated" rollbackBarrierExitCode="0">
+                <serializedBean>
+                  <property name="files" type="array" class="java.io.File" length="40">
+                    <element index="0">
+                      <object class="java.io.File">
+                        <string>jre</string>
+                      </object>
+                    </element>
+                    <element index="1">
+                      <object class="java.io.File">
+                        <string>jre.jar</string>
+                      </object>
+                    </element>
+                    <element index="2">
+                      <object class="java.io.File">
+                        <string>.install4j</string>
+                      </object>
+                    </element>
+                    <element index="3">
+                      <object class="java.io.File">
+                        <string>getdown-launcher.jar</string>
+                      </object>
+                    </element>
+                    <element index="4">
+                      <object class="java.io.File">
+                        <string>getdown-launcher-old.jar</string>
+                      </object>
+                    </element>
+                    <element index="5">
+                      <object class="java.io.File">
+                        <string>getdown-launcher-new.jar</string>
+                      </object>
+                    </element>
+                    <element index="6">
+                      <object class="java.io.File">
+                        <string>gettingdown.lock</string>
+                      </object>
+                    </element>
+                    <element index="7">
+                      <object class="java.io.File">
+                        <string>jre.zip</string>
+                      </object>
+                    </element>
+                    <element index="8">
+                      <object class="java.io.File">
+                        <string>digest.txt</string>
+                      </object>
+                    </element>
+                    <element index="9">
+                      <object class="java.io.File">
+                        <string>digest2.txt</string>
+                      </object>
+                    </element>
+                    <element index="10">
+                      <object class="java.io.File">
+                        <string>getdown-launcher.jarv</string>
+                      </object>
+                    </element>
+                    <element index="11">
+                      <object class="java.io.File">
+                        <string>getdown-launcher-new.jarv</string>
+                      </object>
+                    </element>
+                    <element index="12">
+                      <object class="java.io.File">
+                        <string>launcher.log</string>
+                      </object>
+                    </element>
+                    <element index="13">
+                      <object class="java.io.File">
+                        <string>proxy.txt</string>
+                      </object>
+                    </element>
+                    <element index="14">
+                      <object class="java.io.File">
+                        <string>build_properties</string>
+                      </object>
+                    </element>
+                    <element index="15">
+                      <object class="java.io.File">
+                        <string>channel_launch*.jvl</string>
+                      </object>
+                    </element>
+                    <element index="16">
+                      <object class="java.io.File">
+                        <string>jalview*.jvl</string>
+                      </object>
+                    </element>
+                    <element index="17">
+                      <object class="java.io.File">
+                        <string>*.jarv</string>
+                      </object>
+                    </element>
+                    <element index="18">
+                      <object class="java.io.File">
+                        <string>*.log</string>
+                      </object>
+                    </element>
+                    <element index="19">
+                      <object class="java.io.File">
+                        <string>*.txt</string>
+                      </object>
+                    </element>
+                    <element index="20">
+                      <object class="java.io.File">
+                        <string>*_new</string>
+                      </object>
+                    </element>
+                    <element index="21">
+                      <object class="java.io.File">
+                        <string>hs_err_*.*</string>
+                      </object>
+                    </element>
+                    <element index="22">
+                      <object class="java.io.File">
+                        <string>${compiler:GETDOWN_DIST_DIR}</string>
+                      </object>
+                    </element>
+                    <element index="23">
+                      <object class="java.io.File">
+                        <string>${compiler:GETDOWN_ALT_DIR}</string>
+                      </object>
+                    </element>
+                    <element index="24">
+                      <object class="java.io.File">
+                        <string>${compiler:GETDOWN_RESOURCE_DIR}</string>
+                      </object>
+                    </element>
+                    <element index="25">
+                      <object class="java.io.File">
+                        <string>META-INF</string>
+                      </object>
+                    </element>
+                    <element index="26">
+                      <object class="java.io.File">
+                        <string>install</string>
+                      </object>
+                    </element>
+                    <element index="27">
+                      <object class="java.io.File">
+                        <string>resource</string>
+                      </object>
+                    </element>
+                    <element index="28">
+                      <object class="java.io.File">
+                        <string>dist</string>
+                      </object>
+                    </element>
+                    <element index="29">
+                      <object class="java.io.File">
+                        <string>release</string>
+                      </object>
+                    </element>
+                    <element index="30">
+                      <object class="java.io.File">
+                        <string>alt</string>
+                      </object>
+                    </element>
+                    <element index="31">
+                      <object class="java.io.File">
+                        <string>dev</string>
+                      </object>
+                    </element>
+                    <element index="32">
+                      <object class="java.io.File">
+                        <string>build</string>
+                      </object>
+                    </element>
+                    <element index="33">
+                      <object class="java.io.File">
+                        <string>alt_*</string>
+                      </object>
+                    </element>
+                    <element index="34">
+                      <object class="java.io.File">
+                        <string>dev_*</string>
+                      </object>
+                    </element>
+                    <element index="35">
+                      <object class="java.io.File">
+                        <string>build_*</string>
+                      </object>
+                    </element>
+                    <element index="36">
+                      <object class="java.io.File">
+                        <string>${compiler:WRAPPER_SCRIPT_BIN_DIR}</string>
+                      </object>
+                    </element>
+                    <element index="37">
+                      <object class="java.io.File">
+                        <string>bin</string>
+                      </object>
+                    </element>
+                    <element index="38">
+                      <object class="java.io.File">
+                        <string>channel.props</string>
+                      </object>
+                    </element>
+                    <element index="39">
+                      <object class="java.io.File">
+                        <string>channel.propsv</string>
+                      </object>
+                    </element>
+                  </property>
+                  <property name="recursive" type="boolean" value="true" />
+                </serializedBean>
+              </action>
+              <action id="1791" beanClass="com.install4j.runtime.beans.actions.control.SetProgressAction" actionElevationType="none" rollbackBarrierExitCode="0">
+                <serializedBean>
+                  <property name="percentValue" type="int" value="100" />
+                </serializedBean>
+              </action>
+            </actions>
+            <formComponents>
+              <formComponent id="28" beanClass="com.install4j.runtime.beans.formcomponents.ProgressComponent">
+                <serializedBean>
+                  <property name="initialStatusMessage" type="string">${i18n:UninstallerPreparing}</property>
+                </serializedBean>
+              </formComponent>
+            </formComponents>
+          </screen>
+          <screen id="32" beanClass="com.install4j.runtime.beans.screens.UninstallFailureScreen" rollbackBarrierExitCode="0" finishScreen="true" />
+          <screen id="30" beanClass="com.install4j.runtime.beans.screens.UninstallSuccessScreen" styleId="41" rollbackBarrierExitCode="0" finishScreen="true">
+            <formComponents>
+              <formComponent id="31" beanClass="com.install4j.runtime.beans.formcomponents.MultilineLabelComponent" insetBottom="10">
+                <serializedBean>
+                  <property name="labelText" type="string">${form:successMessage}</property>
+                </serializedBean>
+              </formComponent>
+            </formComponents>
+          </screen>
+        </screens>
+      </application>
+      <application name="MacOS Setup" id="2746" beanClass="com.install4j.runtime.beans.applications.CustomApplication" fileset="734">
+        <serializedBean>
+          <property name="executableDirectory">
+            <object class="java.io.File">
+              <string>.</string>
+            </object>
+          </property>
+          <property name="executableName" type="string">${compiler:WRAPPER_LINK}_setup</property>
+          <property name="windowTitle" type="string">${compiler:sys.fullName}</property>
+        </serializedBean>
+        <startup>
+          <screen id="2747" beanClass="com.install4j.runtime.beans.screens.StartupScreen" rollbackBarrierExitCode="0">
+            <actions>
+              <link id="2749" targetId="22" />
+              <link id="2750" targetId="2738" />
+              <link id="2751" targetId="2745" />
+            </actions>
+          </screen>
+        </startup>
+        <screens>
+          <screen id="2772" beanClass="com.install4j.runtime.beans.screens.FormScreen" rollbackBarrierExitCode="0" backButton="hidden" finishScreen="true">
+            <serializedBean>
+              <property name="title" type="string">Running ${i18n:SetupAppTitle}</property>
+            </serializedBean>
+            <actions>
+              <link id="2778" targetId="576" />
+              <link id="2779" targetId="2743" />
+            </actions>
+            <formComponents>
+              <formComponent id="2773" beanClass="com.install4j.runtime.beans.formcomponents.MultilineLabelComponent" insetBottom="10">
+                <serializedBean>
+                  <property name="labelText" type="string">${i18n:FinishedLabel(${compiler:JALVIEW_APPLICATION_NAME})}</property>
+                </serializedBean>
+              </formComponent>
+              <formComponent name="Add an executable to the dock" id="2775" beanClass="com.install4j.runtime.beans.formcomponents.CheckboxComponent">
+                <serializedBean>
+                  <property name="checkboxText" type="string">${i18n:AddToDock}</property>
+                  <property name="initiallySelected" type="boolean" value="true" />
+                  <property name="variableName" type="string">addToDockAction</property>
+                </serializedBean>
+                <visibilityScript>Util.isMacOS()</visibilityScript>
+              </formComponent>
+              <formComponent name="Make a symbolic link to jalview.sh bash script in the user's local bin (Linux or Unix)" id="2777" beanClass="com.install4j.runtime.beans.formcomponents.CheckboxComponent">
+                <serializedBean>
+                  <property name="checkboxText" type="string">Make a ${compiler:WRAPPER_LINK} symbolic link in ${installer:unixUserBinDir}</property>
+                  <property name="initiallySelected" type="boolean" value="true" />
+                  <property name="variableName" type="string">makeSymbolicLinkAction</property>
+                </serializedBean>
+                <visibilityScript>( Util.isLinux() || Util.isUnixInstaller() || ( Util.isMacOS() &amp;&amp; ( context.getVariable("macWrapperLinkLocation") != null ) ) ) &amp;&amp; ( context.getVariable("unixUserBinDir") != null )</visibilityScript>
+              </formComponent>
+              <formComponent id="2780" beanClass="com.install4j.runtime.beans.formcomponents.MultilineLabelComponent">
+                <serializedBean>
+                  <property name="labelText" type="string">
+${i18n:ClickFinish}
+
+${compiler:JALVIEW_APPLICATION_NAME} will now launch.</property>
+                </serializedBean>
+              </formComponent>
+            </formComponents>
+          </screen>
+        </screens>
+      </application>
+    </applications>
+    <styles defaultStyleId="35">
+      <style name="Standard" id="35" beanClass="com.install4j.runtime.beans.styles.FormStyle">
+        <formComponents>
+          <formComponent name="Header" id="36" beanClass="com.install4j.runtime.beans.styles.NestedStyleComponent" insetTop="0" insetBottom="0">
+            <serializedBean>
+              <property name="styleId" type="string">48</property>
+            </serializedBean>
+          </formComponent>
+          <group name="Main" id="37" beanClass="com.install4j.runtime.beans.groups.VerticalFormComponentGroup">
+            <serializedBean>
+              <property name="imageEdgeAxisType" type="enum" class="com.install4j.runtime.beans.formcomponents.AxisType" value="HORIZONTAL" />
+              <property name="imageEdgeBackgroundColor">
+                <object class="java.awt.Color">
+                  <int>255</int>
+                  <int>255</int>
+                  <int>255</int>
+                  <int>255</int>
+                </object>
+              </property>
+              <property name="imageFile">
+                <object class="com.install4j.api.beans.ExternalFile">
+                  <string>${compiler:JALVIEW_DIR}/${compiler:BACKGROUND}</string>
+                </object>
+              </property>
+              <property name="imageOverlap" type="boolean" value="true" />
+            </serializedBean>
+            <beans>
+              <formComponent id="38" beanClass="com.install4j.runtime.beans.styles.ContentComponent" insetTop="10" insetLeft="20" insetBottom="10" insetRight="20" />
+              <formComponent name="Watermark" id="39" beanClass="com.install4j.runtime.beans.formcomponents.SeparatorComponent" insetTop="0" insetLeft="5" insetBottom="0" useExternalParametrization="true" externalParametrizationName="${compiler:JALVIEW_APPLICATION_NAME}" externalParametrizationMode="include">
+                <serializedBean>
+                  <property name="enabledTitleText" type="boolean" value="false" />
+                </serializedBean>
+                <externalParametrizationPropertyNames>
+                  <propertyName>labelText</propertyName>
+                </externalParametrizationPropertyNames>
+              </formComponent>
+              <formComponent name="Footer" id="40" beanClass="com.install4j.runtime.beans.styles.NestedStyleComponent" insetTop="0" insetBottom="0">
+                <serializedBean>
+                  <property name="styleId" type="string">52</property>
+                </serializedBean>
+              </formComponent>
+            </beans>
+          </group>
+        </formComponents>
+      </style>
+      <style name="Banner" id="41" beanClass="com.install4j.runtime.beans.styles.FormStyle">
+        <formComponents>
+          <group id="42" beanClass="com.install4j.runtime.beans.groups.VerticalFormComponentGroup" useExternalParametrization="true" externalParametrizationName="Customize banner image" externalParametrizationMode="include">
+            <serializedBean>
+              <property name="backgroundColor">
+                <object class="com.install4j.runtime.beans.LightOrDarkColor">
+                  <object class="java.awt.Color">
+                    <int>255</int>
+                    <int>255</int>
+                    <int>255</int>
+                    <int>255</int>
+                  </object>
+                  <object class="java.awt.Color">
+                    <int>49</int>
+                    <int>52</int>
+                    <int>53</int>
+                    <int>255</int>
+                  </object>
+                </object>
+              </property>
+              <property name="borderSides">
+                <object class="com.install4j.runtime.beans.formcomponents.BorderSides">
+                  <property name="bottom" type="boolean" value="true" />
+                </object>
+              </property>
+              <property name="imageEdgeBackgroundColor">
+                <object class="com.install4j.runtime.beans.LightOrDarkColor">
+                  <object class="java.awt.Color">
+                    <int>25</int>
+                    <int>143</int>
+                    <int>220</int>
+                    <int>255</int>
+                  </object>
+                  <object class="java.awt.Color">
+                    <int>0</int>
+                    <int>74</int>
+                    <int>151</int>
+                    <int>255</int>
+                  </object>
+                </object>
+              </property>
+              <property name="imageEdgeBorder" type="boolean" value="true" />
+              <property name="imageFile">
+                <object class="com.install4j.api.beans.ExternalFile">
+                  <string>${compiler:sys.install4jHome}/resource/styles/wizard.png</string>
+                </object>
+              </property>
+              <property name="insets">
+                <object class="java.awt.Insets">
+                  <int>5</int>
+                  <int>10</int>
+                  <int>10</int>
+                  <int>10</int>
+                </object>
+              </property>
+            </serializedBean>
+            <beans>
+              <formComponent id="43" beanClass="com.install4j.runtime.beans.styles.ScreenTitleComponent" insetTop="0">
+                <serializedBean>
+                  <property name="labelFontSizePercent" type="int" value="130" />
+                  <property name="labelFontStyle" type="enum" class="com.install4j.runtime.beans.formcomponents.FontStyle" value="BOLD" />
+                  <property name="labelFontType" type="enum" class="com.install4j.runtime.beans.formcomponents.FontType" value="DERIVED" />
+                </serializedBean>
+              </formComponent>
+              <formComponent id="44" beanClass="com.install4j.runtime.beans.formcomponents.SeparatorComponent" />
+              <formComponent id="45" beanClass="com.install4j.runtime.beans.styles.ContentComponent" insetTop="10" insetBottom="0" />
+            </beans>
+            <externalParametrizationPropertyNames>
+              <propertyName>imageAnchor</propertyName>
+              <propertyName>imageEdgeBackgroundColor</propertyName>
+              <propertyName>imageFile</propertyName>
+            </externalParametrizationPropertyNames>
+          </group>
+          <formComponent id="46" beanClass="com.install4j.runtime.beans.styles.NestedStyleComponent" insetBottom="0">
+            <serializedBean>
+              <property name="styleId" type="string">52</property>
+            </serializedBean>
+          </formComponent>
+        </formComponents>
+      </style>
+      <group name="Style components" id="47" beanClass="com.install4j.runtime.beans.groups.StyleGroup">
+        <beans>
+          <style name="Standard header" id="48" beanClass="com.install4j.runtime.beans.styles.FormStyle">
+            <serializedBean>
+              <property name="fillVertical" type="boolean" value="false" />
+              <property name="standalone" type="boolean" value="false" />
+              <property name="verticalAnchor" type="enum" class="com.install4j.api.beans.Anchor" value="NORTH" />
+            </serializedBean>
+            <formComponents>
+              <group id="49" beanClass="com.install4j.runtime.beans.groups.VerticalFormComponentGroup" useExternalParametrization="true" externalParametrizationName="Customize title bar" externalParametrizationMode="include">
+                <serializedBean>
+                  <property name="backgroundColor">
+                    <object class="com.install4j.runtime.beans.LightOrDarkColor">
+                      <object class="java.awt.Color">
+                        <int>255</int>
+                        <int>255</int>
+                        <int>255</int>
+                        <int>255</int>
+                      </object>
+                      <object class="java.awt.Color">
+                        <int>49</int>
+                        <int>52</int>
+                        <int>53</int>
+                        <int>255</int>
+                      </object>
+                    </object>
+                  </property>
+                  <property name="borderSides">
+                    <object class="com.install4j.runtime.beans.formcomponents.BorderSides">
+                      <property name="bottom" type="boolean" value="true" />
+                    </object>
+                  </property>
+                  <property name="imageAnchor" type="enum" class="com.install4j.api.beans.Anchor" value="NORTHEAST" />
+                  <property name="imageEdgeBorderWidth" type="int" value="2" />
+                  <property name="imageFile">
+                    <object class="com.install4j.api.beans.ExternalFile">
+                      <string>icon:${installer:sys.installerApplicationMode}_header.png</string>
+                    </object>
+                  </property>
+                  <property name="imageInsets">
+                    <object class="java.awt.Insets">
+                      <int>0</int>
+                      <int>5</int>
+                      <int>1</int>
+                      <int>1</int>
+                    </object>
+                  </property>
+                  <property name="insets">
+                    <object class="java.awt.Insets">
+                      <int>0</int>
+                      <int>20</int>
+                      <int>0</int>
+                      <int>10</int>
+                    </object>
+                  </property>
+                </serializedBean>
+                <beans>
+                  <formComponent name="Title" id="50" beanClass="com.install4j.runtime.beans.styles.ScreenTitleComponent">
+                    <serializedBean>
+                      <property name="labelFontStyle" type="enum" class="com.install4j.runtime.beans.formcomponents.FontStyle" value="BOLD" />
+                      <property name="labelFontType" type="enum" class="com.install4j.runtime.beans.formcomponents.FontType" value="DERIVED" />
+                    </serializedBean>
+                  </formComponent>
+                  <formComponent name="Subtitle" id="51" beanClass="com.install4j.runtime.beans.styles.ScreenTitleComponent" insetLeft="8">
+                    <serializedBean>
+                      <property name="titleType" type="enum" class="com.install4j.runtime.beans.styles.TitleType" value="SUB_TITLE" />
+                    </serializedBean>
+                  </formComponent>
+                </beans>
+                <externalParametrizationPropertyNames>
+                  <propertyName>backgroundColor</propertyName>
+                  <propertyName>foregroundColor</propertyName>
+                  <propertyName>imageAnchor</propertyName>
+                  <propertyName>imageFile</propertyName>
+                  <propertyName>imageOverlap</propertyName>
+                </externalParametrizationPropertyNames>
+              </group>
+            </formComponents>
+          </style>
+          <style name="Standard footer" id="52" beanClass="com.install4j.runtime.beans.styles.FormStyle">
+            <serializedBean>
+              <property name="fillVertical" type="boolean" value="false" />
+              <property name="standalone" type="boolean" value="false" />
+              <property name="verticalAnchor" type="enum" class="com.install4j.api.beans.Anchor" value="SOUTH" />
+            </serializedBean>
+            <formComponents>
+              <group id="53" beanClass="com.install4j.runtime.beans.groups.HorizontalFormComponentGroup">
+                <serializedBean>
+                  <property name="alignFirstLabel" type="boolean" value="false" />
+                  <property name="insets">
+                    <object class="java.awt.Insets">
+                      <int>3</int>
+                      <int>5</int>
+                      <int>8</int>
+                      <int>5</int>
+                    </object>
+                  </property>
+                </serializedBean>
+                <beans>
+                  <formComponent id="54" beanClass="com.install4j.runtime.beans.formcomponents.SpringComponent" />
+                  <formComponent name="Back button" id="55" beanClass="com.install4j.runtime.beans.styles.StandardControlButtonComponent">
+                    <serializedBean>
+                      <property name="buttonText" type="string">&lt; ${i18n:ButtonBack}</property>
+                      <property name="controlButtonType" type="enum" class="com.install4j.api.context.ControlButtonType" value="PREVIOUS" />
+                    </serializedBean>
+                  </formComponent>
+                  <formComponent name="Next button" id="56" beanClass="com.install4j.runtime.beans.styles.StandardControlButtonComponent">
+                    <serializedBean>
+                      <property name="buttonText" type="string">${i18n:ButtonNext} &gt;</property>
+                      <property name="controlButtonType" type="enum" class="com.install4j.api.context.ControlButtonType" value="NEXT" />
+                    </serializedBean>
+                  </formComponent>
+                  <formComponent name="Cancel button" id="57" beanClass="com.install4j.runtime.beans.styles.StandardControlButtonComponent" insetLeft="5">
+                    <serializedBean>
+                      <property name="buttonText" type="string">${i18n:ButtonCancel}</property>
+                      <property name="controlButtonType" type="enum" class="com.install4j.api.context.ControlButtonType" value="CANCEL" />
+                    </serializedBean>
+                  </formComponent>
+                </beans>
+              </group>
+            </formComponents>
+          </style>
+        </beans>
+      </group>
+    </styles>
+  </installerGui>
+  <mediaSets>
+    <windows name="Windows x64 EXE Installer" id="743" customizedId="WINDOWS-X64-EXE" mediaFileName="${compiler:APPLICATION_FOLDER}-${compiler:JALVIEW_VERSION}-${compiler:sys.platform}-java_${compiler:JAVA_INTEGER_VERSION}" installDir="${compiler:APPLICATION_FOLDER}" runPostProcessor="true" postProcessor="${compiler:JSIGN_SH} $EXECUTABLE" customInstallBaseDir="~/AppData/Local">
+      <excludedComponents>
+        <component id="1155" />
+        <component id="1156" />
+        <component id="1276" />
+        <component id="1881" />
+      </excludedComponents>
+      <exclude>
+        <entry defaultFileset="true" />
+        <entry filesetId="880" />
+        <entry filesetId="882" />
+        <entry filesetId="1873" />
+        <entry filesetId="2105" />
+      </exclude>
+      <jreBundle jreBundleSource="preCreated" includedJre="${compiler:WINDOWS_JAVA_VM_TGZ}" manualJreEntry="true" />
+    </windows>
+    <macosArchive name="macOS Disk Image" id="878" customizedId="MACOS-X64-DMG" mediaFileName="${compiler:APPLICATION_FOLDER}-${compiler:JALVIEW_VERSION}-${compiler:sys.platform}-java_${compiler:JAVA_INTEGER_VERSION}" volumeName="${compiler:INSTALLER_NAME}" launcherId="737" executeSetupApp="true" setupAppId="2746">
+      <excludedComponents>
+        <component id="1156" />
+        <component id="1276" />
+        <component id="1881" />
+      </excludedComponents>
+      <exclude>
+        <entry defaultFileset="true" />
+        <entry filesetId="882" />
+        <entry filesetId="1873" />
+      </exclude>
+      <jreBundle jreBundleSource="none" />
+      <topLevelFiles>
+        <symlink name="&quot; &quot;" target="/Applications" />
+        <file name=".background/jalview_dmg_background.png" file="${compiler:JALVIEW_DIR}/${compiler:MACOS_DMG_BG_IMAGE}" />
+        <file name=".DS_Store" file="${compiler:JALVIEW_DIR}/${compiler:MACOS_DMG_DS_STORE}" />
+        <file name="${compiler:JALVIEW_APPLICATION_NAME}.app/Contents/Resources/Jalview-File.icns" file="${compiler:JALVIEW_DIR}/${compiler:INSTALL4J_UTILS_DIR}/Jalview-File.icns" />
+        <file name="${compiler:JALVIEW_APPLICATION_NAME}.app/Contents/Resources/jvl_file.icns" file="${compiler:JALVIEW_DIR}/${compiler:INSTALL4J_UTILS_DIR}/jvl_file.icns" />
+        <symlink name="${compiler:JALVIEW_APPLICATION_NAME}.app/Contents/MacOS/${compiler:WRAPPER_LINK}" target="../Resources/app/${compiler:WRAPPER_SCRIPT_BIN_DIR}/${compiler:BASH_WRAPPER_SCRIPT}" />
+      </topLevelFiles>
+    </macosArchive>
+    <unixInstaller name="Linux x64 Shell Installer" id="1595" customizedId="LINUX-X64-SH" mediaFileName="${compiler:UNIX_APPLICATION_FOLDER}-${compiler:JALVIEW_VERSION}-linux_x64-java_${compiler:JAVA_INTEGER_VERSION}" installDir="${compiler:UNIX_APPLICATION_FOLDER}" customInstallBaseDir="~/opt/">
+      <excludedComponents>
+        <component id="1155" />
+        <component id="1156" />
+        <component id="1276" />
+        <component id="1881" />
+      </excludedComponents>
+      <exclude>
+        <entry defaultFileset="true" />
+        <entry filesetId="880" />
+        <entry filesetId="882" />
+        <entry filesetId="1873" />
+        <entry filesetId="2105" />
+      </exclude>
+      <jreBundle jreBundleSource="preCreated" includedJre="${compiler:LINUX_JAVA_VM_TGZ}" manualJreEntry="true" />
+    </unixInstaller>
+    <unixArchive name="Unix .tar.gz Archive" id="1596" customizedId="UNIX--TGZ" mediaFileName="${compiler:UNIX_APPLICATION_FOLDER}-${compiler:JALVIEW_VERSION}-${compiler:sys.platform}-java_${compiler:JAVA_INTEGER_VERSION}" installDir="${compiler:UNIX_APPLICATION_FOLDER}">
+      <excludedComponents>
+        <component id="1155" />
+        <component id="1156" />
+        <component id="1276" />
+        <component id="1881" />
+      </excludedComponents>
+      <exclude>
+        <entry defaultFileset="true" />
+        <entry filesetId="880" />
+        <entry filesetId="882" />
+        <entry filesetId="1873" />
+        <entry filesetId="2105" />
+      </exclude>
+      <jreBundle jreBundleSource="none" includedJre="${compiler:LINUX_JAVA_VM_TGZ}" manualJreEntry="true" />
+    </unixArchive>
+    <unixInstaller name="Unix Shell Installer" id="2639" customizedId="UNIX--SH" mediaFileName="${compiler:UNIX_APPLICATION_FOLDER}-${compiler:JALVIEW_VERSION}-${compiler:sys.platform}-java_${compiler:JAVA_INTEGER_VERSION}" installDir="${compiler:UNIX_APPLICATION_FOLDER}" customInstallBaseDir="~/opt/">
+      <excludedComponents>
+        <component id="1155" />
+        <component id="1156" />
+        <component id="1276" />
+        <component id="1881" />
+      </excludedComponents>
+      <exclude>
+        <entry defaultFileset="true" />
+        <entry filesetId="880" />
+        <entry filesetId="882" />
+        <entry filesetId="1873" />
+        <entry filesetId="2105" />
+      </exclude>
+      <jreBundle jreBundleSource="none" includedJre="${compiler:LINUX_JAVA_VM_TGZ}" manualJreEntry="true" />
+    </unixInstaller>
+  </mediaSets>
+  <buildIds>
+    <mediaSet refId="743" />
+    <mediaSet refId="878" />
+    <mediaSet refId="1595" />
+    <mediaSet refId="1596" />
+    <mediaSet refId="2639" />
+  </buildIds>
+</install4j>
index 057b5b8..65dadf9 100644 (file)
@@ -10,14 +10,23 @@ mkdir newdmg; ditto /Volumes/Jalview\ Develop\ Installer newdmg/
 
 3. Remove the uninstaller if necessary/and/or others, and then deep sign the dmg
 
+
+mkdir t
+cd t
+jar -xf ../newdmg/Jalview\ Develop.app/Contents/Resources/app/alt/Jmol-NO_LOG4J-14.31.53.jar 
+codesign  --remove-signature --force --deep -vvvv -s "Developer ID" --options runtime --entitlements ../utils/osx_signing/entitlements.txt META-INF/jniinchi/1.03_1/MAC-X86_64/JniInchi-1.03_1-MAC-X86_64 
+jar -cf ../newdmg/Jalview\ Develop.app/Contents/Resources/app/alt/Jmol-NO_LOG4J-14.31.53.jar ./*
+cd ..
+rm -Rf t
+
 xattr -cr ./newdmg/Jalview\ Develop.app/Contents/Resources/app/jre/Contents/MacOS/libjli.dylib 
 codesign --verify --deep -v ./newdmg/Jalview\ Develop.app/Contents/Resources/app/jre/Contents/MacOS/libjli.dylib 
 
-codesign --force --deep -vvvv -s "Developer ID" --options runtime --entitlements ./utils/osx_signing/entitlements.txt ./newdmg/Jalview\ Develop.app/Contents/Resources/app/jre/Contents/MacOS/libjli.dylib 
+codesign  --remove-signature --force --deep -vvvv -s "Developer ID" --options runtime --entitlements ./utils/osx_signing/entitlements.txt ./newdmg/Jalview\ Develop.app/Contents/Resources/app/jre/Contents/MacOS/libjli.dylib 
 
-codesign --verify --deep -v ./newdmg/Jalview\ Develop.app/Contents/Resources/app/jre/Contents/MacOS/libjli.dylib 
+codesign  --verify --deep -v ./newdmg/Jalview\ Develop.app/Contents/Resources/app/jre/Contents/MacOS/libjli.dylib 
 
-codesign --force --deep -vvvv -s "Developer ID" --options runtime --entitlements ./utils/osx_signing/entitlements.txt ./newdmg/Jalview\ Develop.app/Contents/MacOS/JavaApplicationStub 
+codesign --remove-signature --force --deep -vvvv -s "Developer ID" --options runtime --entitlements ./utils/osx_signing/entitlements.txt  newdmg/Jalview\ Develop.app/Contents/MacOS/JavaApplicationStub
 
 hdiutil create -megabytes 240 -srcfolder ./newdmg -volname 'Jalview Develop Installer (2.11.2)' Jalview_Develop-2_11_2-macos-java_11.dmg