JAL-3322 Splashcreen now appears instantly with new setting ui.progress_sync = true...
authorBen Soares <bsoares@dundee.ac.uk>
Wed, 26 Jun 2019 14:50:06 +0000 (15:50 +0100)
committerBen Soares <bsoares@dundee.ac.uk>
Wed, 26 Jun 2019 14:50:06 +0000 (15:50 +0100)
32 files changed:
1  2 
build.gradle
getdown/lib/getdown-core.jar
getdown/lib/getdown-launcher.jar
getdown/src/getdown/core/src/main/java/com/threerings/getdown/data/Application.java
getdown/src/getdown/launcher/src/main/java/com/threerings/getdown/launcher/Getdown.java
getdown/src/getdown/launcher/src/main/java/com/threerings/getdown/launcher/GetdownApp.java
getdown/src/getdown/launcher/src/main/java/com/threerings/getdown/launcher/StatusPanel.java
getdown/src/getdown/launcher/src/main/resources/com/threerings/getdown/messages.properties
getdown/src/getdown/launcher/src/main/resources/com/threerings/getdown/messages_de.properties
getdown/src/getdown/launcher/src/main/resources/com/threerings/getdown/messages_es.properties
getdown/src/getdown/launcher/src/main/resources/com/threerings/getdown/messages_fr.properties
getdown/src/getdown/launcher/src/main/resources/com/threerings/getdown/messages_it.properties
getdown/src/getdown/launcher/src/main/resources/com/threerings/getdown/messages_ja.properties
getdown/src/getdown/launcher/src/main/resources/com/threerings/getdown/messages_ko.properties
getdown/src/getdown/launcher/src/main/resources/com/threerings/getdown/messages_pt.properties
getdown/src/getdown/launcher/src/main/resources/com/threerings/getdown/messages_zh.properties
getdown/src/getdown/mvn_cmd
gradle.properties
j11lib/getdown-core.jar
j8lib/getdown-core.jar
utils/getdown/jalview_logo_background_getdown-640x480.png
utils/getdown/jalview_logo_background_getdown-progress-TEST2.png
utils/getdown/jalview_logo_background_getdown-progress.png
utils/getdown/jalview_logo_background_getdown-progress1.png
utils/getdown/jalview_logo_background_getdown-progress2.png
utils/getdown/jalview_logo_background_getdown-progress3-0.png
utils/getdown/jalview_logo_background_getdown-progress3-1.png
utils/getdown/jalview_logo_background_getdown-progress3.xcf
utils/getdown/jalview_logo_background_getdown-progress4.png
utils/getdown/jalview_logo_background_getdown_error-640x480.png
utils/getdown/jalview_logo_background_getdown_instant-640x480.png
utils/getdown/jalview_logo_background_getdown_instant-640x480.xcf

diff --cc build.gradle
@@@ -51,19 -51,112 +51,112 @@@ def compile_source_compatibilit
  def compile_target_compatibility
  
  ext {
-   // where the getdown channel will be built.
-   // TODO: consider allowing this expression to  be overridden by -P arg
 -      getdownWebsiteDir = jalviewDir + '/' + getdown_website_dir + '/' + JAVA_VERSION
 -      getdownDir = ""
 -      reportRsyncCmd = false
 -        buildDist = true
 -        buildProperties = buildPropertiesFile
 -        switch (CHANNEL) {
 -
 -              case "BUILD":
 -              // TODO: get bamboo build artifact URL for getdown artifacts
 -              getdown_app_dir = getdown_app_dir_alt
 -                buildProperties = jalviewDir + "/" + classesDir +"/" + buildPropertiesFile
 -              break
 -
 -              case "RELEASE":
 -              getdown_channel_name = CHANNEL.toLowerCase()
 -              getdownDir = getdown_channel_name + "/" + JAVA_VERSION
 -              getdown_app_base = getdown_channel_base + "/" + getdownDir
 -              getdown_app_dir = getdown_app_dir_release
 -                buildProperties = jalviewDir + "/" + classesDir +"/" + buildPropertiesFile
 -              reportRsyncCommand = true
 -              break
 -
 -              case "ARCHIVE":
 -              getdown_channel_name = CHANNEL.toLowerCase()+"/"+JALVIEW_VERSION
 -              getdownDir = getdown_channel_name + "/" + JAVA_VERSION
 -              getdown_app_base = getdown_channel_base + "/" + getdownDir
 -              getdown_app_dir = getdown_app_dir_alt
 -                if (!file(ARCHIVEDIR+"/"+packageDir).exists()) {
 -                  print "Must provide an ARCHIVEDIR value to produce an archive distribution"
 -                  exit
 -                } else {
 -                  packageDir = ARCHIVEDIR + "/" + packageDir
 -                  buildProperties = ARCHIVEDIR +"/" + classesDir + "/" + buildPropertiesFile
 -                  buildDist = false
 -                }
 -              reportRsyncCommand = true
 -              break
 -    
 -              case "ARCHIVELOCAL":
 -              getdown_channel_name = "archive" + "/" + JALVIEW_VERSION
 -              getdownDir = getdown_channel_name + "/" + JAVA_VERSION
 -              getdown_app_base = file(getdownWebsiteDir).toURI().toString()
 -              getdown_app_dir = getdown_app_dir_alt
 -                if (!file(ARCHIVEDIR+"/"+packageDir).exists()) {
 -                  print "Must provide an ARCHIVEDIR value to produce an archive distribution"
 -                  exit
 -                } else {
 -                  packageDir = ARCHIVEDIR + "/" + packageDir
 -                  buildProperties = ARCHIVEDIR +"/" + classesDir + "/" + buildPropertiesFile
 -                  buildDist = false
 -                }
 -              reportRsyncCommand = true
 -              break
 -
 -              case "DEVELOP":
 -              getdown_channel_name = CHANNEL.toLowerCase()
 -              getdownDir = getdown_channel_name + "/" + JAVA_VERSION
 -              getdown_app_base = getdown_channel_base + "/" + getdownDir
 -              getdown_app_dir = getdown_app_dir_alt
 -                buildProperties = jalviewDir + "/" + classesDir +"/" + buildPropertiesFile
 -              reportRsyncCommand = true
 -              break
 -
 -              case "TEST-RELEASE":
 -              getdown_channel_name = CHANNEL.toLowerCase()
 -              getdownDir = getdown_channel_name + "/" + JAVA_VERSION
 -              getdown_app_base = getdown_channel_base + "/" + getdownDir
 -              getdown_app_dir = getdown_app_dir_alt
 -                buildProperties = jalviewDir + "/" + classesDir +"/" + buildPropertiesFile
 -              reportRsyncCommand = true
 -              break
 -              
 -              case ~/^SCRATCH(|-\w*)$/:
 -              getdown_channel_name = CHANNEL
 -              getdownDir = getdown_channel_name + "/" + JAVA_VERSION
 -              getdown_app_base = getdown_channel_base + "/" + getdownDir
 -              getdown_app_dir = getdown_app_dir_alt
 -                buildProperties = jalviewDir + "/" + classesDir +"/" + buildPropertiesFile
 -              reportRsyncCommand = true
 -              break
 -              
 -              case "LOCAL":
 -              getdown_app_base = file(getdownWebsiteDir).toURI().toString()
 -              getdown_app_dir = getdown_app_dir_alt
 -                buildProperties = jalviewDir + "/" + classesDir +"/" + buildPropertiesFile
 -              break
 -              
 -              default: // something wrong specified
 -              print("CHANNEL must be one of BUILD, RELEASE, ARCHIVE, DEVELOP, TEST-RELEASE, SCRATCH-..., LOCAL [default]")
 -              exit
 -              break
 -
 -      }
 -      
 -      println("Using a "+CHANNEL+" profile. appbase="+getdown_app_base)
 -      getdownAppDir = getdownWebsiteDir + '/' + getdown_app_dir
 -      //getdownJ11libDir = getdownWebsiteDir + '/' + getdown_j11lib_dir
 -      getdownResourceDir = getdownWebsiteDir + '/' + getdown_resource_dir
 -      getdownInstallDir = getdownWebsiteDir + '/' + getdown_install_dir
 -      getdownLauncher = jalviewDir + '/' + getdown_launcher
 -      getdownFilesDir = jalviewDir + '/' + getdown_files_dir + '/' + JAVA_VERSION + '/'
 -      getdownFilesInstallDir = getdownFilesDir+"/"+getdown_install_dir
 -      modules_compileClasspath = fileTree(dir: "$jalviewDir/$j11modDir", include: ["*.jar"])
 -      modules_runtimeClasspath = modules_compileClasspath
 -      gitHash = ""
 -      gitBranch = ""
 +  getdownWebsiteDir = jalviewDir + '/' + getdown_website_dir + '/' + JAVA_VERSION
++  getdownDir = ""
++  reportRsyncCmd = false
++  buildDist = true
++  buildProperties = buildPropertiesFile
++  switch (CHANNEL) {
++
++    case "BUILD":
++    // TODO: get bamboo build artifact URL for getdown artifacts
++    getdown_app_dir = getdown_app_dir_alt
++    buildProperties = jalviewDir + "/" + classesDir +"/" + buildPropertiesFile
++    break
++
++    case "RELEASE":
++    getdown_channel_name = CHANNEL.toLowerCase()
++    getdownDir = getdown_channel_name + "/" + JAVA_VERSION
++    getdown_app_base = getdown_channel_base + "/" + getdownDir
++    getdown_app_dir = getdown_app_dir_release
++    buildProperties = jalviewDir + "/" + classesDir +"/" + buildPropertiesFile
++    reportRsyncCommand = true
++    break
++
++    case "ARCHIVE":
++    getdown_channel_name = CHANNEL.toLowerCase()+"/"+JALVIEW_VERSION
++    getdownDir = getdown_channel_name + "/" + JAVA_VERSION
++    getdown_app_base = getdown_channel_base + "/" + getdownDir
++    getdown_app_dir = getdown_app_dir_alt
++    if (!file(ARCHIVEDIR+"/"+packageDir).exists()) {
++      print "Must provide an ARCHIVEDIR value to produce an archive distribution"
++      exit
++    } else {
++      packageDir = ARCHIVEDIR + "/" + packageDir
++      buildProperties = ARCHIVEDIR +"/" + classesDir + "/" + buildPropertiesFile
++      buildDist = false
++    }
++    reportRsyncCommand = true
++    break
++
++    case "ARCHIVELOCAL":
++    getdown_channel_name = "archive" + "/" + JALVIEW_VERSION
++    getdownDir = getdown_channel_name + "/" + JAVA_VERSION
++    getdown_app_base = file(getdownWebsiteDir).toURI().toString()
++    getdown_app_dir = getdown_app_dir_alt
++    if (!file(ARCHIVEDIR+"/"+packageDir).exists()) {
++      print "Must provide an ARCHIVEDIR value to produce an archive distribution"
++      exit
++    } else {
++      packageDir = ARCHIVEDIR + "/" + packageDir
++      buildProperties = ARCHIVEDIR +"/" + classesDir + "/" + buildPropertiesFile
++      buildDist = false
++    }
++    reportRsyncCommand = true
++    break
++
++    case "DEVELOP":
++    getdown_channel_name = CHANNEL.toLowerCase()
++    getdownDir = getdown_channel_name + "/" + JAVA_VERSION
++    getdown_app_base = getdown_channel_base + "/" + getdownDir
++    getdown_app_dir = getdown_app_dir_alt
++    buildProperties = jalviewDir + "/" + classesDir +"/" + buildPropertiesFile
++    reportRsyncCommand = true
++    break
++
++    case "TEST-RELEASE":
++    getdown_channel_name = CHANNEL.toLowerCase()
++    getdownDir = getdown_channel_name + "/" + JAVA_VERSION
++    getdown_app_base = getdown_channel_base + "/" + getdownDir
++    getdown_app_dir = getdown_app_dir_alt
++    buildProperties = jalviewDir + "/" + classesDir +"/" + buildPropertiesFile
++    reportRsyncCommand = true
++    break
++
++    case ~/^SCRATCH(|-\w*)$/:
++    getdown_channel_name = CHANNEL
++    getdownDir = getdown_channel_name + "/" + JAVA_VERSION
++    getdown_app_base = getdown_channel_base + "/" + getdownDir
++    getdown_app_dir = getdown_app_dir_alt
++    buildProperties = jalviewDir + "/" + classesDir +"/" + buildPropertiesFile
++    reportRsyncCommand = true
++    break
++
++    case "LOCAL":
++    getdown_app_base = file(getdownWebsiteDir).toURI().toString()
++    getdown_app_dir = getdown_app_dir_alt
++    buildProperties = jalviewDir + "/" + classesDir +"/" + buildPropertiesFile
++    break
++
++    default: // something wrong specified
++    print("CHANNEL must be one of BUILD, RELEASE, ARCHIVE, DEVELOP, TEST-RELEASE, SCRATCH-..., LOCAL [default]")
++    exit
++    break
++
++  }
++
++  println("Using a "+CHANNEL+" profile. appbase="+getdown_app_base)
 +  getdownAppDir = getdownWebsiteDir + '/' + getdown_app_dir
 +  //getdownJ11libDir = getdownWebsiteDir + '/' + getdown_j11lib_dir
 +  getdownResourceDir = getdownWebsiteDir + '/' + getdown_resource_dir
++  getdownInstallDir = getdownWebsiteDir + '/' + getdown_install_dir
 +  getdownLauncher = jalviewDir + '/' + getdown_launcher
 +  getdownFilesDir = jalviewDir + '/' + getdown_files_dir + '/' + JAVA_VERSION + '/'
-   getdown_app_base = getdown_channel_base+"/"+getdown_channel_name+"/"+JAVA_VERSION+"/"
++  getdownFilesInstallDir = getdownFilesDir+"/"+getdown_install_dir
 +  modules_compileClasspath = fileTree(dir: "$jalviewDir/$j11modDir", include: ["*.jar"])
 +  modules_runtimeClasspath = modules_compileClasspath
 +  gitHash = ""
 +  gitBranch = ""
  }
  
  def JAVA_INTEGER_VERSION
@@@ -75,105 -168,105 +168,105 @@@ def getdown_alt_multi_java_locatio
  // this property is for the Java library used in eclipse
  def eclipse_java_runtime_name
  if (JAVA_VERSION.equals("1.8")) {
 -      JAVA_INTEGER_VERSION = "8"
 -      //libDir = j8libDir
 -      libDir = j11libDir
 -      libDistDir = j8libDir
 -      compile_source_compatibility = 1.8
 -      compile_target_compatibility = 1.8
 -      getdown_alt_java_min_version = getdown_alt_java8_min_version
 -      getdown_alt_multi_java_location = getdown_alt_java8_txt_multi_java_location
 -      eclipse_java_runtime_name = "JavaSE-1.8"
 +  JAVA_INTEGER_VERSION = "8"
 +  //libDir = j8libDir
 +  libDir = j11libDir
 +  libDistDir = j8libDir
 +  compile_source_compatibility = 1.8
 +  compile_target_compatibility = 1.8
 +  getdown_alt_java_min_version = getdown_alt_java8_min_version
 +  getdown_alt_multi_java_location = getdown_alt_java8_txt_multi_java_location
 +  eclipse_java_runtime_name = "JavaSE-1.8"
  } else if (JAVA_VERSION.equals("11")) {
 -      JAVA_INTEGER_VERSION = "11"
 -      libDir = j11libDir
 -      libDistDir = j11libDir
 -      compile_source_compatibility = 11
 -      compile_target_compatibility = 11
 -      getdown_alt_java_min_version = getdown_alt_java11_min_version
 -      getdown_alt_multi_java_location = getdown_alt_java11_txt_multi_java_location
 -      eclipse_java_runtime_name = "JavaSE-11"
 -      additional_compiler_args += [
 -              '--module-path', ext.modules_compileClasspath.asPath,
 -              '--add-modules', j11modules
 -      ]
 +  JAVA_INTEGER_VERSION = "11"
 +  libDir = j11libDir
 +  libDistDir = j11libDir
 +  compile_source_compatibility = 11
 +  compile_target_compatibility = 11
 +  getdown_alt_java_min_version = getdown_alt_java11_min_version
 +  getdown_alt_multi_java_location = getdown_alt_java11_txt_multi_java_location
 +  eclipse_java_runtime_name = "JavaSE-11"
 +  additional_compiler_args += [
-     '--module-path', ext.modules_compileClasspath.asPath,
-     '--add-modules', j11modules
++  '--module-path', ext.modules_compileClasspath.asPath,
++  '--add-modules', j11modules
 +  ]
  } else if (JAVA_VERSION.equals("12") || JAVA_VERSION.equals("13")) {
 -      JAVA_INTEGER_VERSION = JAVA_VERSION
 -      libDir = j11libDir
 -      libDistDir = j11libDir
 -      compile_source_compatibility = JAVA_VERSION
 -      compile_target_compatibility = JAVA_VERSION
 -      getdown_alt_java_min_version = getdown_alt_java11_min_version
 -      getdown_alt_multi_java_location = getdown_alt_java11_txt_multi_java_location
 -      eclipse_java_runtime_name = "JavaSE-11"
 -      additional_compiler_args += [
 -              '--module-path', ext.modules_compileClasspath.asPath,
 -              '--add-modules', j11modules
 -      ]
 +  JAVA_INTEGER_VERSION = JAVA_VERSION
 +  libDir = j11libDir
 +  libDistDir = j11libDir
 +  compile_source_compatibility = JAVA_VERSION
 +  compile_target_compatibility = JAVA_VERSION
 +  getdown_alt_java_min_version = getdown_alt_java11_min_version
 +  getdown_alt_multi_java_location = getdown_alt_java11_txt_multi_java_location
 +  eclipse_java_runtime_name = "JavaSE-11"
 +  additional_compiler_args += [
-     '--module-path', ext.modules_compileClasspath.asPath,
-     '--add-modules', j11modules
++  '--module-path', ext.modules_compileClasspath.asPath,
++  '--add-modules', j11modules
 +  ]
  } else {
 -      throw new GradleException("JAVA_VERSION=$JAVA_VERSION not currently supported by Jalview")
 +  throw new GradleException("JAVA_VERSION=$JAVA_VERSION not currently supported by Jalview")
  }
  
  sourceSets {
  
 -      main {
 -              java {
 -                      srcDirs "$jalviewDir/$sourceDir"
 -                      outputDir = file("$classes")
 -              }
 -
 -              resources {
 -                      srcDirs "$jalviewDir/$resourceDir"
 -              }
 -
 -              jar.destinationDir = file("$jalviewDir/$packageDir")
 -
 -              compileClasspath = files(sourceSets.main.java.outputDir)
 -              compileClasspath += fileTree(dir: "$jalviewDir/$libDir", include: ["*.jar"])
 -
 -              runtimeClasspath = compileClasspath
 -      }
 -      clover {
 -              java {
 -                      srcDirs = [ cloverInstrDir ]
 -                      outputDir = file("${buildDir}/${cloverClassesDir}")
 -              }
 -
 -              resources {
 -                      srcDirs = sourceSets.main.resources.srcDirs
 -              }
 -              compileClasspath = configurations.cloverRuntime + files( sourceSets.clover.java.outputDir )
 -              compileClasspath += files(sourceSets.main.java.outputDir)
 -              compileClasspath += sourceSets.main.compileClasspath
 -              compileClasspath += fileTree(dir: "$jalviewDir/$utilsDir", include: ["**/*.jar"])
 -              compileClasspath += fileTree(dir: "$jalviewDir/$libDir", include: ["*.jar"])
 -
 -              runtimeClasspath = compileClasspath
 -      }
 -
 -      test {
 -              java {
 -                      srcDirs "$jalviewDir/$testSourceDir"
 -                      outputDir = file("$jalviewDir/$testOutputDir")
 -              }
 -
 -              resources {
 -                      srcDirs = sourceSets.main.resources.srcDirs
 -              }
 -
 -              compileClasspath = files( sourceSets.test.java.outputDir )
 -
 -              if (use_clover) {
 -                      compileClasspath += sourceSets.clover.compileClasspath
 -              } else {
 -                      compileClasspath += files(sourceSets.main.java.outputDir)
 -              }
 -
 -              compileClasspath += fileTree(dir: "$jalviewDir/$utilsDir", include: ["**/*.jar"])
 -              compileClasspath += fileTree(dir: "$jalviewDir/$libDir", include: ["*.jar"])
 -
 -              runtimeClasspath = compileClasspath
 -      }
 +  main {
 +    java {
 +      srcDirs "$jalviewDir/$sourceDir"
 +      outputDir = file("$classes")
 +    }
 +
 +    resources {
 +      srcDirs "$jalviewDir/$resourceDir"
 +    }
 +
 +    jar.destinationDir = file("$jalviewDir/$packageDir")
 +
 +    compileClasspath = files(sourceSets.main.java.outputDir)
 +    compileClasspath += fileTree(dir: "$jalviewDir/$libDir", include: ["*.jar"])
 +
 +    runtimeClasspath = compileClasspath
 +  }
 +  clover {
 +    java {
 +      srcDirs = [ cloverInstrDir ]
 +      outputDir = file("${buildDir}/${cloverClassesDir}")
 +    }
 +
 +    resources {
 +      srcDirs = sourceSets.main.resources.srcDirs
 +    }
 +    compileClasspath = configurations.cloverRuntime + files( sourceSets.clover.java.outputDir )
 +    compileClasspath += files(sourceSets.main.java.outputDir)
 +    compileClasspath += sourceSets.main.compileClasspath
 +    compileClasspath += fileTree(dir: "$jalviewDir/$utilsDir", include: ["**/*.jar"])
 +    compileClasspath += fileTree(dir: "$jalviewDir/$libDir", include: ["*.jar"])
 +
 +    runtimeClasspath = compileClasspath
 +  }
 +
 +  test {
 +    java {
 +      srcDirs "$jalviewDir/$testSourceDir"
 +      outputDir = file("$jalviewDir/$testOutputDir")
 +    }
 +
 +    resources {
 +      srcDirs = sourceSets.main.resources.srcDirs
 +    }
 +
 +    compileClasspath = files( sourceSets.test.java.outputDir )
 +
 +    if (use_clover) {
 +      compileClasspath += sourceSets.clover.compileClasspath
 +    } else {
 +      compileClasspath += files(sourceSets.main.java.outputDir)
 +    }
-     
++
 +    compileClasspath += fileTree(dir: "$jalviewDir/$utilsDir", include: ["**/*.jar"])
 +    compileClasspath += fileTree(dir: "$jalviewDir/$libDir", include: ["*.jar"])
 +
 +    runtimeClasspath = compileClasspath
 +  }
  }
  
  // clover bits
@@@ -190,196 -283,196 +283,196 @@@ configurations 
  }
  
  eclipse {
 -      project {
 -              name = "Jalview with gradle build"
 -
 -              natures 'org.eclipse.jdt.core.javanature',
 -              'org.eclipse.jdt.groovy.core.groovyNature',
 -              'org.eclipse.buildship.core.gradleprojectnature'
 -
 -              buildCommand 'org.eclipse.jdt.core.javabuilder'
 -              buildCommand 'org.eclipse.buildship.core.gradleprojectbuilder'
 -      }
 -
 -      classpath {
 -              //defaultOutputDir = sourceSets.main.java.outputDir
 -              def removeThese = []
 -              configurations.each{ if (it.isCanBeResolved()) {
 -                              removeThese += it
 -                      }
 -              }
 -
 -              minusConfigurations += removeThese
 -              plusConfigurations = [ ]
 -              file {
 -
 -                      whenMerged { cp ->
 -                              def removeTheseToo = []
 -                              HashMap<String, Boolean> addedSrcPath = new HashMap<>();
 -                              cp.entries.each { entry ->
 -                                      if (entry.kind == 'src') {
 -                                              if (addedSrcPath.getAt(entry.path) || !(entry.path == "src" || entry.path == "test")) {
 -                                                      removeTheseToo += entry
 -                                              } else {
 -                                                      addedSrcPath.putAt(entry.path, true)
 -                                              }
 -                                      }
 -                              }
 -                              cp.entries.removeAll(removeTheseToo)
 -
 -                              print ("CP="+cp.inspect())
 -
 -                              cp.entries += new Output("bin/main")
 -                              cp.entries += new Library(fileReference(helpParentDir))
 -                              cp.entries += new Library(fileReference(resourceDir))
 -
 -                              HashMap<String, Boolean> addedLibPath = new HashMap<>();
 -
 -                              // changing from sourcesets.main.classpath to specific Java version lib
 -                              //sourceSets.main.compileClasspath.each{
 -                              fileTree("$jalviewDir/$libDistDir").include("**/*.jar").include("*.jar").each {
 -                                      //don't want to add outputDir as eclipse is using its own output dir in bin/main
 -                                      if (it.isDirectory() || ! it.exists()) {
 -                                              // don't add dirs to classpath
 -                                              return
 -                                      }
 -                                      def itPath = it.toString()
 -                                      if (itPath.startsWith(jalviewDirAbsolutePath+"/")) {
 -                                              itPath = itPath.substring(jalviewDirAbsolutePath.length()+1)
 -                                      }
 -                                      if (addedLibPath.get(itPath)) {
 -                                              //println("Not adding duplicate entry "+itPath)
 -                                      } else {
 -                                              //println("Adding entry "+itPath)
 -                                              cp.entries += new Library(fileReference(itPath))
 -                                              addedLibPath.put(itPath, true)
 -                                      }
 -                              }
 -
 -                              // changing from sourcesets.main.classpath to specific Java version lib
 -                              //sourceSets.test.compileClasspath.each{
 -                              fileTree(dir: "$jalviewDir/$utilsDir", include: ["**/*.jar"]).each {
 -                                      //if ((it.isDirectory() || ! it.exists()) && ! (it.equals(sourceSets.main.java.outputDir))) {
 -                                      //no longer want to add outputDir as eclipse is using its own output dir in bin/main
 -                                      if (it.isDirectory() || ! it.exists()) {
 -                                              // don't add dirs to classpath
 -                                              return false // groovy "break" in .each loop
 -                                      }
 -                                      def itPath = it.toString()
 -                                      if (itPath.startsWith(jalviewDirAbsolutePath+"/")) {
 -                                              itPath = itPath.substring(jalviewDirAbsolutePath.length()+1)
 -                                      }
 -                                      if (addedLibPath.get(itPath)) {
 -                                              // don't duplicate
 -                                      } else {
 -                                              def lib = new Library(fileReference(itPath))
 -                                              // this doesn't work... yet.  Adding test=true attribute using withXml below
 -                                              //def attrs = new Node(null, 'attributes', ["test":"true"])
 -                                              //lib.appendNode(attrs) //
 -                                              cp.entries += lib
 -                                              addedLibPath.put(itPath, true)
 -                                      }
 -                              }
 -                      }
 -
 -                      // withXml changes ignored by buildship, these add the "test=true" attribute
 -                      withXml {
 -                              def node = it.asNode()
 -
 -                              def srcTestAttributes
 -                              node.children().each{ cpe ->
 -                                      def attributes = cpe.attributes()
 -                                      if (attributes.get("kind") == "src" && attributes.get("path") == "test") {
 -                                              srcTestAttributes = cpe.find { a -> a.name() == "attributes" }
 -                                              return
 -                                      }
 -                              }
 -                              def addTestAttribute = true
 -                              srcTestAttributes.each{a ->
 -                                      if (a.name() == "attribute" && a.attributes().getAt("name") == "test") {
 -                                              addTestAttribute = false
 -                                      }
 -                              }
 -                              if (addTestAttribute) {
 -                                      srcTestAttributes.append(new Node(null, "attribute", [name:"test", value:"true"]))
 -                              }
 -
 -                              node.children().each{ cpe ->
 -                                      def attributes = cpe.attributes()
 -                                      if (attributes.get("kind") == "lib" && attributes.get("path").startsWith("utils/")) {
 -                                              cpe.appendNode('attributes')
 -                                              .appendNode('attribute', [name:"test", value:"true"])
 -                                      }
 -                              }
 -                      } // withXML
 -              } // file
 -
 -              containers 'org.eclipse.buildship.core.gradleclasspathcontainer'
 -      } // classpath
 -
 -      jdt {
 -              // for the IDE, use java 11 compatibility
 -              sourceCompatibility = compile_source_compatibility
 -              targetCompatibility = compile_target_compatibility
 -              javaRuntimeName = eclipse_java_runtime_name
 -
 -              file {
 -                      withProperties { props ->
 -                              def jalview_prefs = new Properties()
 -                              def ins = new FileInputStream(jalviewDirAbsolutePath+"/"+eclipse_extra_jdt_prefs_file)
 -                              jalview_prefs.load(ins)
 -                              ins.close()
 -                              jalview_prefs.forEach { t, v ->
 -                                      if (props.getAt(t) == null) {
 -                                              props.putAt(t, v)
 -                                      }
 -                              }
 -                      }
 -              }
 -      }
 -
 -      //synchronizationTasks eclipseClasspath
 -      //autoBuildTasks eclipseClasspath
 +  project {
 +    name = "Jalview with gradle build"
 +
 +    natures 'org.eclipse.jdt.core.javanature',
-         'org.eclipse.jdt.groovy.core.groovyNature',
-         'org.eclipse.buildship.core.gradleprojectnature'
++    'org.eclipse.jdt.groovy.core.groovyNature',
++    'org.eclipse.buildship.core.gradleprojectnature'
 +
 +    buildCommand 'org.eclipse.jdt.core.javabuilder'
 +    buildCommand 'org.eclipse.buildship.core.gradleprojectbuilder'
 +  }
 +
 +  classpath {
 +    //defaultOutputDir = sourceSets.main.java.outputDir
 +    def removeThese = []
 +    configurations.each{ if (it.isCanBeResolved()) {
-         removeThese += it
-       }
++      removeThese += it
 +    }
++  }
 +
-     minusConfigurations += removeThese
-     plusConfigurations = [ ]
-     file {
-       whenMerged { cp ->
-         def removeTheseToo = []
-         HashMap<String, Boolean> addedSrcPath = new HashMap<>();
-         cp.entries.each { entry ->
-           if (entry.kind == 'src') {
-             if (addedSrcPath.getAt(entry.path) || !(entry.path == "src" || entry.path == "test")) {
-               removeTheseToo += entry
-             } else {
-               addedSrcPath.putAt(entry.path, true)
-             }
-           }
-         }
-         cp.entries.removeAll(removeTheseToo)
-         
-         print ("CP="+cp.inspect())
-         
-         cp.entries += new Output("bin/main")
-         cp.entries += new Library(fileReference(helpParentDir))
-         cp.entries += new Library(fileReference(resourceDir))
-         
-         HashMap<String, Boolean> addedLibPath = new HashMap<>();
-         
-         // changing from sourcesets.main.classpath to specific Java version lib
-         //sourceSets.main.compileClasspath.each{
-         fileTree("$jalviewDir/$libDistDir").include("**/*.jar").include("*.jar").each {
-           //don't want to add outputDir as eclipse is using its own output dir in bin/main
-           if (it.isDirectory() || ! it.exists()) {
-             // don't add dirs to classpath
-             return
-           }
-           def itPath = it.toString()
-           if (itPath.startsWith(jalviewDirAbsolutePath+"/")) {
-             itPath = itPath.substring(jalviewDirAbsolutePath.length()+1)
-           }
-           if (addedLibPath.get(itPath)) {
-             //println("Not adding duplicate entry "+itPath)
++  minusConfigurations += removeThese
++  plusConfigurations = [ ]
++  file {
++
++    whenMerged { cp ->
++      def removeTheseToo = []
++      HashMap<String, Boolean> addedSrcPath = new HashMap<>();
++      cp.entries.each { entry ->
++        if (entry.kind == 'src') {
++          if (addedSrcPath.getAt(entry.path) || !(entry.path == "src" || entry.path == "test")) {
++            removeTheseToo += entry
 +          } else {
-             //println("Adding entry "+itPath)
-             cp.entries += new Library(fileReference(itPath))
-             addedLibPath.put(itPath, true)
++            addedSrcPath.putAt(entry.path, true)
 +          }
 +        }
++      }
++      cp.entries.removeAll(removeTheseToo)
 +
-         // changing from sourcesets.main.classpath to specific Java version lib
-         //sourceSets.test.compileClasspath.each{
-         fileTree(dir: "$jalviewDir/$utilsDir", include: ["**/*.jar"]).each {
-           //if ((it.isDirectory() || ! it.exists()) && ! (it.equals(sourceSets.main.java.outputDir))) {
-           //no longer want to add outputDir as eclipse is using its own output dir in bin/main
-           if (it.isDirectory() || ! it.exists()) {
-             // don't add dirs to classpath
-             return false // groovy "break" in .each loop
-           }
-           def itPath = it.toString()
-           if (itPath.startsWith(jalviewDirAbsolutePath+"/")) {
-             itPath = itPath.substring(jalviewDirAbsolutePath.length()+1)
-           }
-           if (addedLibPath.get(itPath)) {
-             // don't duplicate
-           } else {
-             def lib = new Library(fileReference(itPath))
-             // this doesn't work... yet.  Adding test=true attribute using withXml below
-             //def attrs = new Node(null, 'attributes', ["test":"true"])
-             //lib.appendNode(attrs) //
-             cp.entries += lib
-             addedLibPath.put(itPath, true)
-           }
++      print ("CP="+cp.inspect())
++
++      cp.entries += new Output("bin/main")
++      cp.entries += new Library(fileReference(helpParentDir))
++      cp.entries += new Library(fileReference(resourceDir))
++
++      HashMap<String, Boolean> addedLibPath = new HashMap<>();
++
++      // changing from sourcesets.main.classpath to specific Java version lib
++      //sourceSets.main.compileClasspath.each{
++      fileTree("$jalviewDir/$libDistDir").include("**/*.jar").include("*.jar").each {
++        //don't want to add outputDir as eclipse is using its own output dir in bin/main
++        if (it.isDirectory() || ! it.exists()) {
++          // don't add dirs to classpath
++          return
++        }
++        def itPath = it.toString()
++        if (itPath.startsWith(jalviewDirAbsolutePath+"/")) {
++          itPath = itPath.substring(jalviewDirAbsolutePath.length()+1)
 +        }
-       }  
++        if (addedLibPath.get(itPath)) {
++          //println("Not adding duplicate entry "+itPath)
++        } else {
++          //println("Adding entry "+itPath)
++          cp.entries += new Library(fileReference(itPath))
++          addedLibPath.put(itPath, true)
++        }
++      }
++
++      // changing from sourcesets.main.classpath to specific Java version lib
++      //sourceSets.test.compileClasspath.each{
++      fileTree(dir: "$jalviewDir/$utilsDir", include: ["**/*.jar"]).each {
++        //if ((it.isDirectory() || ! it.exists()) && ! (it.equals(sourceSets.main.java.outputDir))) {
++        //no longer want to add outputDir as eclipse is using its own output dir in bin/main
++        if (it.isDirectory() || ! it.exists()) {
++          // don't add dirs to classpath
++          return false // groovy "break" in .each loop
++        }
++        def itPath = it.toString()
++        if (itPath.startsWith(jalviewDirAbsolutePath+"/")) {
++          itPath = itPath.substring(jalviewDirAbsolutePath.length()+1)
++        }
++        if (addedLibPath.get(itPath)) {
++          // don't duplicate
++        } else {
++          def lib = new Library(fileReference(itPath))
++          // this doesn't work... yet.  Adding test=true attribute using withXml below
++          //def attrs = new Node(null, 'attributes', ["test":"true"])
++          //lib.appendNode(attrs) //
++          cp.entries += lib
++          addedLibPath.put(itPath, true)
++        }
++        }
++      }
 +
 +      // withXml changes ignored by buildship, these add the "test=true" attribute
 +      withXml {
 +        def node = it.asNode()
-         
++
 +        def srcTestAttributes
 +        node.children().each{ cpe ->
 +          def attributes = cpe.attributes()
 +          if (attributes.get("kind") == "src" && attributes.get("path") == "test") {
 +            srcTestAttributes = cpe.find { a -> a.name() == "attributes" }
 +            return
 +          }
 +        }
 +        def addTestAttribute = true
 +        srcTestAttributes.each{a ->
 +          if (a.name() == "attribute" && a.attributes().getAt("name") == "test") {
 +            addTestAttribute = false
 +          }
 +        }
 +        if (addTestAttribute) {
 +          srcTestAttributes.append(new Node(null, "attribute", [name:"test", value:"true"]))
 +        }
 +
 +        node.children().each{ cpe ->
 +          def attributes = cpe.attributes()
 +          if (attributes.get("kind") == "lib" && attributes.get("path").startsWith("utils/")) {
 +            cpe.appendNode('attributes')
-                 .appendNode('attribute', [name:"test", value:"true"])
++            .appendNode('attribute', [name:"test", value:"true"])
 +          }
 +        }
 +      } // withXML
 +    } // file
 +
 +    containers 'org.eclipse.buildship.core.gradleclasspathcontainer'
 +  } // classpath
 +
 +  jdt {
 +    // for the IDE, use java 11 compatibility
 +    sourceCompatibility = compile_source_compatibility
 +    targetCompatibility = compile_target_compatibility
 +    javaRuntimeName = eclipse_java_runtime_name
 +
 +    file {
 +      withProperties { props ->
 +        def jalview_prefs = new Properties()
 +        def ins = new FileInputStream(jalviewDirAbsolutePath+"/"+eclipse_extra_jdt_prefs_file)
 +        jalview_prefs.load(ins)
 +        ins.close()
 +        jalview_prefs.forEach { t, v ->
 +          if (props.getAt(t) == null) {
 +            props.putAt(t, v)
 +          }
 +        }
 +      }
 +    }
 +  }
-   
++
 +  //synchronizationTasks eclipseClasspath
 +  //autoBuildTasks eclipseClasspath
- } 
+ }
  
  task cloverInstr() {
 -      // only instrument source, we build test classes as normal
 -      inputs.files files (sourceSets.main.allJava) // , fileTree(dir:"$jalviewDir/$testSourceDir", include: ["**/*.java"]))
 -      outputs.dir cloverInstrDir
 -
 -      doFirst {
 -              delete cloverInstrDir
 -              def argsList = ["--initstring", "${buildDir}/clover/clover.db",
 -                      "-d", "${buildDir}/${cloverSourcesInstrDir}"]
 -              argsList.addAll(inputs.files.files.collect({ file ->
 -                      file.absolutePath
 -              }))
 -              String[] args = argsList.toArray()
 -              println("About to instrument "+args.length +" files")
 -              com.atlassian.clover.CloverInstr.mainImpl(args)
 -      }
 +  // only instrument source, we build test classes as normal
 +  inputs.files files (sourceSets.main.allJava) // , fileTree(dir:"$jalviewDir/$testSourceDir", include: ["**/*.java"]))
 +  outputs.dir cloverInstrDir
 +
 +  doFirst {
 +    delete cloverInstrDir
 +    def argsList = ["--initstring", "${buildDir}/clover/clover.db",
-       "-d", "${buildDir}/${cloverSourcesInstrDir}"]
++    "-d", "${buildDir}/${cloverSourcesInstrDir}"]
 +    argsList.addAll(inputs.files.files.collect({ file ->
 +      file.absolutePath
 +    }))
 +    String[] args = argsList.toArray()
 +    println("About to instrument "+args.length +" files")
 +    com.atlassian.clover.CloverInstr.mainImpl(args)
 +  }
  }
-   
  
  task cloverReport {
 -      group = "Verification"
 -      description = "Createst the Clover report"
 -      inputs.dir "${buildDir}/clover"
 -      outputs.dir "${reportsDir}/clover"
 -      onlyIf {
 -              file("${buildDir}/clover/clover.db").exists()
 -      }
 -      doFirst {
 -              def argsList = ["--initstring", "${buildDir}/clover/clover.db",
 -                      "-o", "${reportsDir}/clover"]
 -              String[] args = argsList.toArray()
 -              com.atlassian.clover.reporters.html.HtmlReporter.runReport(args)
 -
 -              // and generate ${reportsDir}/clover/clover.xml
 -              args = ["--initstring", "${buildDir}/clover/clover.db",
 -                      "-o", "${reportsDir}/clover/clover.xml"].toArray()
 -              com.atlassian.clover.reporters.xml.XMLReporter.runReport(args)
 -      }
 +  group = "Verification"
-   description = "Createst the Clover report"
-   inputs.dir "${buildDir}/clover"
-   outputs.dir "${reportsDir}/clover"
-   onlyIf {
-     file("${buildDir}/clover/clover.db").exists()
-   }
++    description = "Createst the Clover report"
++    inputs.dir "${buildDir}/clover"
++    outputs.dir "${reportsDir}/clover"
++    onlyIf {
++      file("${buildDir}/clover/clover.db").exists()
++    }
 +  doFirst {
 +    def argsList = ["--initstring", "${buildDir}/clover/clover.db",
-       "-o", "${reportsDir}/clover"]
++    "-o", "${reportsDir}/clover"]
 +    String[] args = argsList.toArray()
 +    com.atlassian.clover.reporters.html.HtmlReporter.runReport(args)
 +
 +    // and generate ${reportsDir}/clover/clover.xml
 +    args = ["--initstring", "${buildDir}/clover/clover.db",
-       "-o", "${reportsDir}/clover/clover.xml"].toArray()
++    "-o", "${reportsDir}/clover/clover.xml"].toArray()
 +    com.atlassian.clover.reporters.xml.XMLReporter.runReport(args)
 +  }
  }
  
  // end clover bits
@@@ -460,18 -553,18 +553,18 @@@ task setGitVals 
  }
  
  task createBuildProperties(type: WriteProperties) {
 -      dependsOn setGitVals
 -      inputs.dir("$jalviewDir/$sourceDir")
 -      inputs.dir("$classes")
 -      inputs.dir("$jalviewDir/$resourceDir")
 -      outputFile (buildProperties)
 -      // taking time specific comment out to allow better incremental builds
 -      comment "--Jalview Build Details--\n"+getDate("yyyy-MM-dd HH:mm:ss")
 -      //comment "--Jalview Build Details--\n"+getDate("yyyy-MM-dd")
 -      property "BUILD_DATE", getDate("HH:mm:ss dd MMMM yyyy")
 -      property "VERSION", JALVIEW_VERSION
 -      property "INSTALLATION", INSTALLATION+" git-commit:"+project.ext.gitHash+" ["+project.ext.gitBranch+"]"
 -      outputs.file(outputFile)
 +  dependsOn setGitVals
 +  inputs.dir("$jalviewDir/$sourceDir")
 +  inputs.dir("$classes")
 +  inputs.dir("$jalviewDir/$resourceDir")
-   outputFile "$classes/$buildPropertiesFile"
++  outputFile (buildProperties)
 +  // taking time specific comment out to allow better incremental builds
 +  comment "--Jalview Build Details--\n"+getDate("yyyy-MM-dd HH:mm:ss")
 +  //comment "--Jalview Build Details--\n"+getDate("yyyy-MM-dd")
 +  property "BUILD_DATE", getDate("HH:mm:ss dd MMMM yyyy")
 +  property "VERSION", JALVIEW_VERSION
 +  property "INSTALLATION", INSTALLATION+" git-commit:"+project.ext.gitHash+" ["+project.ext.gitBranch+"]"
 +  outputs.file(outputFile)
  }
  
  def buildingHTML = "$jalviewDir/$docDir/building.html"
@@@ -524,24 -617,24 +617,24 @@@ task syncDocs(type: Sync) 
  def helpFile = "$classes/$helpDir/help.jhm"
  
  task copyHelp(type: Copy) {
 -      def inputDir = "$jalviewDir/$helpParentDir/$helpDir"
 -      def outputDir = "$classes/$helpDir"
 -      from(inputDir) {
 -              exclude '**/*.gif'
 -              exclude '**/*.jpg'
 -              exclude '**/*.png'
 -              filter(ReplaceTokens, beginToken: '$$', endToken: '$$', tokens: ['Version-Rel': JALVIEW_VERSION])
 -      }
 -      from(inputDir) {
 -              include '**/*.gif'
 -              include '**/*.jpg'
 -              include '**/*.png'
 -      }
 -      into outputDir
 -
 -      inputs.dir(inputDir)
 -      outputs.files(helpFile)
 -      outputs.dir(outputDir)
 +  def inputDir = "$jalviewDir/$helpParentDir/$helpDir"
 +  def outputDir = "$classes/$helpDir"
 +  from(inputDir) {
 +    exclude '**/*.gif'
-     exclude '**/*.jpg'
-     exclude '**/*.png'
-     filter(ReplaceTokens, beginToken: '$$', endToken: '$$', tokens: ['Version-Rel': JALVIEW_VERSION])
++      exclude '**/*.jpg'
++      exclude '**/*.png'
++      filter(ReplaceTokens, beginToken: '$$', endToken: '$$', tokens: ['Version-Rel': JALVIEW_VERSION])
 +  }
 +  from(inputDir) {
 +    include '**/*.gif'
-     include '**/*.jpg'
-     include '**/*.png'
++      include '**/*.jpg'
++      include '**/*.png'
 +  }
 +  into outputDir
 +
 +  inputs.dir(inputDir)
 +  outputs.files(helpFile)
 +  outputs.dir(outputDir)
  }
  
  task syncLib(type: Sync) {
@@@ -569,26 -662,28 +662,28 @@@ task prepare 
  
  //testReportDirName = "test-reports" // note that test workingDir will be $jalviewDir
  test {
 -      dependsOn prepare
 -      dependsOn compileJava
 -      if (use_clover) {
 -              dependsOn cloverInstr
 -      }
 -
 -        if (use_clover) {
 -          print("Running tests " + (use_clover?"WITH":"WITHOUT") + " clover [clover="+use_clover+"]\n")
 -        }
 -
 -      useTestNG() {
 -              includeGroups testngGroups
 -              preserveOrder true
 -              useDefaultListeners=true
 -      }
 -
 -      workingDir = jalviewDir
 -      //systemProperties 'clover.jar' System.properties.clover.jar
 -      sourceCompatibility = compile_source_compatibility
 -      targetCompatibility = compile_target_compatibility
 -      jvmArgs += additional_compiler_args
 -      print ("Setting target compatibility to "+targetCompatibility+"\n")
 +  dependsOn prepare
 +  dependsOn compileJava
 +  if (use_clover) {
 +    dependsOn cloverInstr
 +  }
 +
-   print("Running tests " + (use_clover?"WITH":"WITHOUT") + " clover [clover="+use_clover+"]\n")
++  if (use_clover) {
++    print("Running tests " + (use_clover?"WITH":"WITHOUT") + " clover [clover="+use_clover+"]\n")
++  }
 +
 +  useTestNG() {
 +    includeGroups testngGroups
 +    preserveOrder true
 +    useDefaultListeners=true
 +  }
 +
 +  workingDir = jalviewDir
 +  //systemProperties 'clover.jar' System.properties.clover.jar
 +  sourceCompatibility = compile_source_compatibility
 +  targetCompatibility = compile_target_compatibility
 +  jvmArgs += additional_compiler_args
 +  print ("Setting target compatibility to "+targetCompatibility+"\n")
  }
  
  task buildIndices(type: JavaExec) {
@@@ -701,169 -796,183 +796,184 @@@ task cleanDist 
  }
  
  shadowJar {
 -      group = "distribution"
 -        if (buildDist) {
 -          dependsOn makeDist
 -        }
 -      from ("$jalviewDir/$libDistDir") {
 -              include("*.jar")
 -      }
 -      manifest {
 -              attributes 'Implementation-Version': JALVIEW_VERSION
 -      }
 -      mainClassName = shadowJarMainClass
 -      mergeServiceFiles()
 -      classifier = "all-"+JALVIEW_VERSION+"-j"+JAVA_VERSION
 -      minimize()
 +  group = "distribution"
-   dependsOn makeDist
++  if (buildDist) {
++    dependsOn makeDist
++  }
 +  from ("$jalviewDir/$libDistDir") {
 +    include("*.jar")
 +  }
++  manifest {
++    attributes 'Implementation-Version': JALVIEW_VERSION
++  }
 +  mainClassName = shadowJarMainClass
 +  mergeServiceFiles()
-   classifier = "all-"+JAVA_VERSION
++  classifier = "all-"+JALVIEW_VERSION+"-j"+JAVA_VERSION
 +  minimize()
  }
  
  task getdownWebsite() {
 -      group = "distribution"
 -      description = "Create the getdown minimal app folder, and website folder for this version of jalview. Website folder also used for offline app installer"
 -        if (buildDist) {
 -          dependsOn makeDist
 -        }
 -      def getdownWebsiteResourceFilenames = []
 -      def getdownTextString = ""
 -      def getdownResourceDir = project.ext.getdownResourceDir
 -      def getdownAppDir = project.ext.getdownAppDir
 -      def getdownResourceFilenames = []
 -
 -      doFirst {
 -              copy {
 -                      from buildProperties
 -                      rename(buildPropertiesFile, getdown_build_properties)
 -                      into project.ext.getdownWebsiteDir
 -              }
 -              getdownWebsiteResourceFilenames += getdown_build_properties
 -              
 -              // go through properties looking for getdown_txt_...
 -              def props = project.properties.sort { it.key }
 -              props.put("getdown_txt_java_min_version", getdown_alt_java_min_version)
 -              props.put("getdown_txt_multi_java_location", getdown_alt_multi_java_location)
 -
 -              props.put("getdown_txt_appbase", getdown_app_base)
 -              props.each{ prop, val ->
 -                      if (prop.startsWith("getdown_txt_") && val != null) {
 -                              if (prop.startsWith("getdown_txt_multi_")) {
 -                                      def key = prop.substring(18)
 -                                      val.split(",").each{ v ->
 -                                              def line = key + " = " + v + "\n"
 -                                              getdownTextString += line
 -                                      }
 -                              } else {
 -                                      // file values rationalised
 -                                      if (val.indexOf('/') > -1 || prop.startsWith("getdown_txt_resource")) {
 -                                              def r = null
 -                                              if (val.indexOf('/') == 0) {
 -                                                      // absolute path
 -                                                      r = file(val)
 -                                              } else if (val.indexOf('/') > 0) {
 -                                                      // relative path (relative to jalviewDir)
 -                                                      r = file( jalviewDir + '/' + val )
 -                                              }
 -                                              if (r.exists()) {
 -                                                      val = getdown_resource_dir + '/' + r.getName()
 -                                                      getdownWebsiteResourceFilenames += val
 -                                                      getdownResourceFilenames += r.getPath()
 -                                              }
 -                                      }
 -                                      if (! prop.startsWith("getdown_txt_resource")) {
 -                                              def line = prop.substring(12) + " = " + val + "\n"
 -                                              getdownTextString += line
 -                                      }
 -                              }
 -                      }
 -              }
 -
 -              getdownWebsiteResourceFilenames.each{ filename ->
 -                      getdownTextString += "resource = "+filename+"\n"
 -              }
 -              getdownResourceFilenames.each{ filename ->
 -                      copy {
 -                              from filename
 -                              into project.ext.getdownResourceDir
 -                      }
 -              }
 -
 -              def codeFiles = []
 -              fileTree(file(packageDir)).each{ f ->
 -                      if (f.isDirectory()) {
 -                              def files = fileTree(dir: f, include: ["*"]).getFiles()
 -                              codeFiles += files
 -                      } else if (f.exists()) {
 -                              codeFiles += f
 -                      }
 -              }
 -              codeFiles.sort().each{f ->
 -                      def line = "code = " + getdown_app_dir + '/' + f.getName() + "\n"
 -                      getdownTextString += line
 -                      copy {
 -                              from f.getPath()
 -                              into project.ext.getdownAppDir
 -                      }
 -              }
 -
 -              // NOT USING MODULES YET, EVERYTHING SHOULD BE IN dist
 -              /*
 -               if (JAVA_VERSION.equals("11")) {
 -               def j11libFiles = fileTree(dir: "$jalviewDir/$j11libDir", include: ["*.jar"]).getFiles()
 -               j11libFiles.sort().each{f ->
 -               def line = "code = " + getdown_j11lib_dir + '/' + f.getName() + "\n"
 -               getdownTextString += line
 -               copy {
 -               from f.getPath()
 -               into project.ext.getdownJ11libDir
 -               }
 -               }
 -               }
 -               */
 -
 -              // getdown-launcher.jar should not be in main application class path so the main application can move it when updated.  Listed as a resource so it gets updated.
 -              //getdownTextString += "class = " + file(getdownLauncher).getName() + "\n"
 -              getdownTextString += "resource = " + getdown_launcher_new + "\n"
 -              getdownTextString += "class = " + mainClass + "\n"
 -
 -              def getdown_txt = file(project.ext.getdownWebsiteDir + "/getdown.txt")
 -              getdown_txt.write(getdownTextString)
 -
 -              def launch_jvl = file(project.ext.getdownWebsiteDir + "/" + getdown_launch_jvl)
 -              launch_jvl.write("appbase="+props.get("getdown_txt_appbase"))
 -
 -              copy {
 -                      from getdownLauncher
 -                      rename(file(getdownLauncher).getName(), getdown_launcher_new)
 -                      into project.ext.getdownWebsiteDir
 -              }
 -
 -              copy {
 -                      from getdownLauncher
 -                      into project.ext.getdownWebsiteDir
 -              }
 -                
 -                if (! (CHANNEL.startsWith("ARCHIVE") || CHANNEL.startsWith("DEVELOP"))) {
 -                  copy {
 -                          from getdown_txt
 -                          from getdownLauncher
 -                          from getdownWebsiteDir+"/"+getdown_build_properties
 -                          into getdownInstallDir
 -                  }
 -                  
 -                  copy {
 -                          from getdownInstallDir
 -                          into getdownFilesInstallDir
 -                  }
 -                }
 -      
 -              copy {
 -                      from getdown_txt
 -                      from launch_jvl
 -                      from getdownLauncher
 -                      from getdownWebsiteDir+"/"+getdown_build_properties
 -                      into getdownFilesDir
 -              }
 -
 -              copy {
 -                      from jalviewDir + '/' + project.getProperty('getdown_txt_ui.background_image')
 -                      from jalviewDir + '/' + project.getProperty('getdown_txt_ui.error_background')
 -                      from jalviewDir + '/' + project.getProperty('getdown_txt_ui.progress_image')
 -                      from jalviewDir + '/' + project.getProperty('getdown_txt_ui.icon')
 -                      from jalviewDir + '/' + project.getProperty('getdown_txt_ui.mac_dock_icon')
 -                      into project.ext.getdownFilesDir + '/' + getdown_resource_dir
 -              }
 -      }
 -
 -        if (buildDist) {
 -          inputs.dir(jalviewDir + '/' + packageDir)
 +  group = "distribution"
 +  description = "Create the getdown minimal app folder, and website folder for this version of jalview. Website folder also used for offline app installer"
-   dependsOn makeDist
++  if (buildDist) {
++    dependsOn makeDist
++  }
++
++      // clean the getdown website and files dir before creating getdown folders
++      delete project.ext.getdownWebsiteDir
++      delete project.ext.getdownFilesDir
++
 +  def getdownWebsiteResourceFilenames = []
 +  def getdownTextString = ""
 +  def getdownResourceDir = project.ext.getdownResourceDir
 +  def getdownAppDir = project.ext.getdownAppDir
 +  def getdownResourceFilenames = []
-   
-   copy {
-               from "$classes/$buildPropertiesFile"
-               rename(buildPropertiesFile, getdown_install_build_properties)
-               into project.ext.getdownWebsiteDir
-   }
-   getdownResourceFilenames += getdown_current_build_properties
-   
++
 +  doFirst {
++    copy {
++      from buildProperties
++      rename(buildPropertiesFile, getdown_build_properties)
++      into project.ext.getdownWebsiteDir
++    }
++    getdownWebsiteResourceFilenames += getdown_build_properties
++
 +    // go through properties looking for getdown_txt_...
 +    def props = project.properties.sort { it.key }
 +    props.put("getdown_txt_java_min_version", getdown_alt_java_min_version)
 +    props.put("getdown_txt_multi_java_location", getdown_alt_multi_java_location)
-       props.put("getdown_txt_resource", "$classes/$buildPropertiesFile")
 +
-     if (getdown_local == "true") {
-       getdown_app_base = file(getdownWebsiteDir).toURI().toString()
-     }
 +    props.put("getdown_txt_appbase", getdown_app_base)
 +    props.each{ prop, val ->
 +      if (prop.startsWith("getdown_txt_") && val != null) {
 +        if (prop.startsWith("getdown_txt_multi_")) {
 +          def key = prop.substring(18)
 +          val.split(",").each{ v ->
 +            def line = key + " = " + v + "\n"
 +            getdownTextString += line
 +          }
 +        } else {
 +          // file values rationalised
 +          if (val.indexOf('/') > -1 || prop.startsWith("getdown_txt_resource")) {
 +            def r = null
 +            if (val.indexOf('/') == 0) {
 +              // absolute path
 +              r = file(val)
 +            } else if (val.indexOf('/') > 0) {
 +              // relative path (relative to jalviewDir)
 +              r = file( jalviewDir + '/' + val )
 +            }
 +            if (r.exists()) {
 +              val = getdown_resource_dir + '/' + r.getName()
 +              getdownWebsiteResourceFilenames += val
 +              getdownResourceFilenames += r.getPath()
 +            }
 +          }
-                 if (! prop.startsWith("getdown_txt_resource")) {
-                         def line = prop.substring(12) + " = " + val + "\n"
-                         getdownTextString += line
-                 }
++          if (! prop.startsWith("getdown_txt_resource")) {
++            def line = prop.substring(12) + " = " + val + "\n"
++            getdownTextString += line
++          }
          }
 -      outputs.dir(project.ext.getdownWebsiteDir)
 -      outputs.dir(project.ext.getdownFilesDir)
 +      }
 +    }
 +
 +    getdownWebsiteResourceFilenames.each{ filename ->
 +      getdownTextString += "resource = "+filename+"\n"
 +    }
 +    getdownResourceFilenames.each{ filename ->
 +      copy {
 +        from filename
 +        into project.ext.getdownResourceDir
 +      }
 +    }
 +
 +    def codeFiles = []
-     makeDist.outputs.files.each{ f ->
++    fileTree(file(packageDir)).each{ f ->
 +      if (f.isDirectory()) {
 +        def files = fileTree(dir: f, include: ["*"]).getFiles()
 +        codeFiles += files
 +      } else if (f.exists()) {
 +        codeFiles += f
 +      }
 +    }
 +    codeFiles.sort().each{f ->
 +      def line = "code = " + getdown_app_dir + '/' + f.getName() + "\n"
 +      getdownTextString += line
 +      copy {
 +        from f.getPath()
 +        into project.ext.getdownAppDir
 +      }
 +    }
 +
 +    // NOT USING MODULES YET, EVERYTHING SHOULD BE IN dist
 +    /*
-      if (JAVA_VERSION.equals("11")) {
-      def j11libFiles = fileTree(dir: "$jalviewDir/$j11libDir", include: ["*.jar"]).getFiles()
-      j11libFiles.sort().each{f ->
-      def line = "code = " + getdown_j11lib_dir + '/' + f.getName() + "\n"
-      getdownTextString += line
-      copy {
-      from f.getPath()
-      into project.ext.getdownJ11libDir
-      }
-      }
-      }
++    if (JAVA_VERSION.equals("11")) {
++    def j11libFiles = fileTree(dir: "$jalviewDir/$j11libDir", include: ["*.jar"]).getFiles()
++    j11libFiles.sort().each{f ->
++    def line = "code = " + getdown_j11lib_dir + '/' + f.getName() + "\n"
++    getdownTextString += line
++    copy {
++    from f.getPath()
++    into project.ext.getdownJ11libDir
++    }
++    }
++    }
 +     */
 +
 +    // getdown-launcher.jar should not be in main application class path so the main application can move it when updated.  Listed as a resource so it gets updated.
 +    //getdownTextString += "class = " + file(getdownLauncher).getName() + "\n"
 +    getdownTextString += "resource = " + getdown_launcher_new + "\n"
 +    getdownTextString += "class = " + mainClass + "\n"
 +
 +    def getdown_txt = file(project.ext.getdownWebsiteDir + "/getdown.txt")
 +    getdown_txt.write(getdownTextString)
-       
-       def launch_jvl = file(project.ext.getdownWebsiteDir + "/" + getdown_launch_jvl)
-       launch_jvl.write("appbase="+props.get("getdown_txt_appbase"))
 +
-     copy {
-       from getdown_txt
-         from launch_jvl
-         from project.ext.getdownWebsiteDir+"/"+getdown_current_build_properties
-         from project.ext.getdownWebsiteDir+"/"+getdown_install_build_properties
-       into project.ext.getdownFilesDir
-     }
++    def launch_jvl = file(project.ext.getdownWebsiteDir + "/" + getdown_launch_jvl)
++    launch_jvl.write("appbase="+props.get("getdown_txt_appbase"))
 +
 +    copy {
 +      from getdownLauncher
-       into project.ext.getdownWebsiteDir
 +      rename(file(getdownLauncher).getName(), getdown_launcher_new)
++      into project.ext.getdownWebsiteDir
 +    }
 +
 +    copy {
 +      from getdownLauncher
-       into project.ext.getdownFilesDir
++      into project.ext.getdownWebsiteDir
++    }
++
++    if (! (CHANNEL.startsWith("ARCHIVE") || CHANNEL.startsWith("DEVELOP"))) {
++      copy {
++        from getdown_txt
++        from getdownLauncher
++        from getdownWebsiteDir+"/"+getdown_build_properties
++        into getdownInstallDir
++      }
++
++      copy {
++        from getdownInstallDir
++        into getdownFilesInstallDir
++      }
 +    }
 +
 +    copy {
++      from getdown_txt
++      from launch_jvl
 +      from getdownLauncher
-       into project.ext.getdownWebsiteDir
++      from getdownWebsiteDir+"/"+getdown_build_properties
++      into getdownFilesDir
 +    }
 +
 +    copy {
-       from jalviewDir + '/' + project.getProperty('getdown_txt_ui.background_image')
-       from jalviewDir + '/' + project.getProperty('getdown_txt_ui.error_background')
-       from jalviewDir + '/' + project.getProperty('getdown_txt_ui.progress_image')
-       from jalviewDir + '/' + project.getProperty('getdown_txt_ui.icon')
-       from jalviewDir + '/' + project.getProperty('getdown_txt_ui.mac_dock_icon')
++        from getdownResourceDir
 +      into project.ext.getdownFilesDir + '/' + getdown_resource_dir
 +    }
 +  }
 +
-   inputs.dir(jalviewDir + '/' + packageDir)
++  if (buildDist) {
++    inputs.dir(jalviewDir + '/' + packageDir)
++  }
 +  outputs.dir(project.ext.getdownWebsiteDir)
 +  outputs.dir(project.ext.getdownFilesDir)
  }
  
  task getdownDigest(type: JavaExec) {
  }
  
  task getdown() {
 -      group = "distribution"
 -      description = "Create the minimal and full getdown app folder for installers and website and create digest file"
 -      dependsOn getdownDigest
 -      doLast {
 -              if (reportRsyncCommand) {
 -                      def fromDir = getdownWebsiteDir + (getdownWebsiteDir.endsWith("/")?"":"/")
 -                      def toDir = getdown_rsync_dest + "/" + getdownDir + (getdownDir.endsWith("/")?"":"/")
 -                      println "LIKELY RSYNC COMMAND:"
 -                        println "rsync -avh --delete '$fromDir' '$toDir'"
 -                        if (RUNRSYNC == "true") {
 -                          exec {
 -                                  commandLine "mkdir", "-p", toDir
 -                          }
 -                          exec {
 -                                  commandLine "rsync", "-avh", "--delete", fromDir, toDir
 -                          }
 -                        }
 -              }
 -      }
 +  group = "distribution"
 +  description = "Create the minimal and full getdown app folder for installers and website and create digest file"
 +  dependsOn getdownDigest
++  doLast {
++    if (reportRsyncCommand) {
++      def fromDir = getdownWebsiteDir + (getdownWebsiteDir.endsWith("/")?"":"/")
++      def toDir = getdown_rsync_dest + "/" + getdownDir + (getdownDir.endsWith("/")?"":"/")
++      println "LIKELY RSYNC COMMAND:"
++      println "rsync -avh --delete '$fromDir' '$toDir'"
++      if (RUNRSYNC == "true") {
++        exec {
++          commandLine "mkdir", "-p", toDir
++        }
++        exec {
++          commandLine "rsync", "-avh", "--delete", fromDir, toDir
++        }
++      }
++    }
++  }
  }
  
  clean {
@@@ -918,83 -1043,89 +1044,89 @@@ def install4jConfFile = "jalview-instal
  install4jConf = "$install4jDir/$install4jConfFile"
  
  task copyInstall4jTemplate(type: Copy) {
 -      macosJavaVMDir = System.env.HOME+"/buildtools/jre/openjdk-java_vm/getdown/macos-jre"+JAVA_VERSION+"/jre"
 -      macosJavaVMTgz = System.env.HOME+"/buildtools/jre/openjdk-java_vm/install4j/tgz/macos-jre"+JAVA_VERSION+".tar.gz"
 -      windowsJavaVMDir = System.env.HOME+"/buildtools/jre/openjdk-java_vm/getdown/windows-jre"+JAVA_VERSION+"/jre"
 -      windowsJavaVMTgz = System.env.HOME+"/buildtools/jre/openjdk-java_vm/install4j/tgz/windows-jre"+JAVA_VERSION+".tar.gz"
 -      from (install4jDir) {
 -              include install4jTemplate
 -              rename (install4jTemplate, install4jConfFile)
 -              filter(ReplaceTokens, beginToken: '', endToken: '', tokens: ['9999999999': JAVA_VERSION])
 -              filter(ReplaceTokens, beginToken: '$$', endToken: '$$',
 -              tokens: [
 -                      'JAVA_VERSION': JAVA_VERSION,
 -                      'JAVA_INTEGER_VERSION': JAVA_INTEGER_VERSION,
 -                      'VERSION': JALVIEW_VERSION,
 -                      'MACOS_JAVA_VM_DIR': macosJavaVMDir,
 -                      'MACOS_JAVA_VM_TGZ': macosJavaVMTgz,
 -                      'WINDOWS_JAVA_VM_DIR': windowsJavaVMDir,
 -                      'WINDOWS_JAVA_VM_TGZ': windowsJavaVMTgz,
 -                      'INSTALL4JINFOPLISTFILEASSOCIATIONS': install4jInfoPlistFileAssociations,
 -                      'COPYRIGHT_MESSAGE': install4jCopyrightMessage,
 -                      'MACOS_BUNDLE_ID': install4jMacOSBundleId,
 -                      'GETDOWN_RESOURCE_DIR': getdown_resource_dir,
 -                      'GETDOWN_DIST_DIR': getdown_app_dir,
 -                      'GETDOWN_ALT_DIR': getdown_app_dir_alt,
 -                      'GETDOWN_INSTALL_DIR': getdown_install_dir
 -              ]
 -              )
 -              if (OSX_KEYPASS=="") {
 -                      filter(ReplaceTokens, beginToken: 'codeSigning macEnabled="', endToken: '"', tokens: ['true':'codeSigning macEnabled="false"'])
 -                      filter(ReplaceTokens, beginToken: 'runPostProcessor="true" ',endToken: 'Processor', tokens: ['post':'runPostProcessor="false" postProcessor'])
 -              }
 -      }
 -      into install4jDir
 -      outputs.files(install4jConf)
 -
 -      doLast {
 -              // include file associations in installer
 -              def installerFileAssociationsXml = file("$install4jDir/$install4jInstallerFileAssociations").text
 -              ant.replaceregexp(
 -              byline: false,
 -              flags: "s",
 -              match: '<action name="EXTENSIONS_REPLACED_BY_GRADLE".*?</action>',
 -              replace: installerFileAssociationsXml,
 -              file: install4jConf
 -              )
 -              /*
 -               // include uninstaller applescript app files in dmg
 -               def installerDMGUninstallerXml = file("$install4jDir/$install4jDMGUninstallerAppFiles").text
 -               ant.replaceregexp(
 -               byline: false,
 -               flags: "s",
 -               match: '<file name="UNINSTALL_OLD_JALVIEW_APP_REPLACED_IN_GRADLE" file=.*?>',
 -               replace: installerDMGUninstallerXml,
 -               file: install4jConf
 -               )
 -               */
 -      }
 +  macosJavaVMDir = System.env.HOME+"/buildtools/jre/openjdk-java_vm/getdown/macos-jre"+JAVA_VERSION+"/jre"
 +  macosJavaVMTgz = System.env.HOME+"/buildtools/jre/openjdk-java_vm/install4j/tgz/macos-jre"+JAVA_VERSION+".tar.gz"
 +  windowsJavaVMDir = System.env.HOME+"/buildtools/jre/openjdk-java_vm/getdown/windows-jre"+JAVA_VERSION+"/jre"
 +  windowsJavaVMTgz = System.env.HOME+"/buildtools/jre/openjdk-java_vm/install4j/tgz/windows-jre"+JAVA_VERSION+".tar.gz"
 +  from (install4jDir) {
 +    include install4jTemplate
 +    rename (install4jTemplate, install4jConfFile)
 +    filter(ReplaceTokens, beginToken: '', endToken: '', tokens: ['9999999999': JAVA_VERSION])
 +    filter(ReplaceTokens, beginToken: '$$', endToken: '$$',
-       tokens: [
-         'JAVA_VERSION': JAVA_VERSION,
-         'JAVA_INTEGER_VERSION': JAVA_INTEGER_VERSION,
-         'VERSION': JALVIEW_VERSION,
-         'MACOS_JAVA_VM_DIR': macosJavaVMDir,
-         'MACOS_JAVA_VM_TGZ': macosJavaVMTgz,
-         'WINDOWS_JAVA_VM_DIR': windowsJavaVMDir,
-         'WINDOWS_JAVA_VM_TGZ': windowsJavaVMTgz,
-         'INSTALL4JINFOPLISTFILEASSOCIATIONS': install4jInfoPlistFileAssociations,
-         'COPYRIGHT_MESSAGE': install4jCopyrightMessage,
-         'MACOS_BUNDLE_ID': install4jMacOSBundleId
-       ]
++    tokens: [
++    'JAVA_VERSION': JAVA_VERSION,
++    'JAVA_INTEGER_VERSION': JAVA_INTEGER_VERSION,
++    'VERSION': JALVIEW_VERSION,
++    'MACOS_JAVA_VM_DIR': macosJavaVMDir,
++    'MACOS_JAVA_VM_TGZ': macosJavaVMTgz,
++    'WINDOWS_JAVA_VM_DIR': windowsJavaVMDir,
++    'WINDOWS_JAVA_VM_TGZ': windowsJavaVMTgz,
++    'INSTALL4JINFOPLISTFILEASSOCIATIONS': install4jInfoPlistFileAssociations,
++    'COPYRIGHT_MESSAGE': install4jCopyrightMessage,
++    'MACOS_BUNDLE_ID': install4jMacOSBundleId,
++    'GETDOWN_RESOURCE_DIR': getdown_resource_dir,
++    'GETDOWN_DIST_DIR': getdown_app_dir,
++    'GETDOWN_ALT_DIR': getdown_app_dir_alt,
++    'GETDOWN_INSTALL_DIR': getdown_install_dir
++    ]
 +    )
 +    if (OSX_KEYPASS=="") {
 +      filter(ReplaceTokens, beginToken: 'codeSigning macEnabled="', endToken: '"', tokens: ['true':'codeSigning macEnabled="false"'])
 +      filter(ReplaceTokens, beginToken: 'runPostProcessor="true" ',endToken: 'Processor', tokens: ['post':'runPostProcessor="false" postProcessor'])
 +    }
 +  }
 +  into install4jDir
 +  outputs.files(install4jConf)
 +
 +  doLast {
 +    // include file associations in installer
 +    def installerFileAssociationsXml = file("$install4jDir/$install4jInstallerFileAssociations").text
 +    ant.replaceregexp(
 +      byline: false,
 +      flags: "s",
 +      match: '<action name="EXTENSIONS_REPLACED_BY_GRADLE".*?</action>',
 +      replace: installerFileAssociationsXml,
 +      file: install4jConf
 +    )
 +    /*
 +    // include uninstaller applescript app files in dmg
 +    def installerDMGUninstallerXml = file("$install4jDir/$install4jDMGUninstallerAppFiles").text
 +    ant.replaceregexp(
-       byline: false,
-       flags: "s",
-       match: '<file name="UNINSTALL_OLD_JALVIEW_APP_REPLACED_IN_GRADLE" file=.*?>',
-       replace: installerDMGUninstallerXml,
-       file: install4jConf
++    byline: false,
++    flags: "s",
++    match: '<file name="UNINSTALL_OLD_JALVIEW_APP_REPLACED_IN_GRADLE" file=.*?>',
++    replace: installerDMGUninstallerXml,
++    file: install4jConf
 +    )
-     */
++     */
 +  }
  }
  
  task installers(type: com.install4j.gradle.Install4jTask) {
 -      group = "distribution"
 -      description = "Create the install4j installers"
 -      dependsOn getdown
 -      dependsOn copyInstall4jTemplate
 -      projectFile = file(install4jConf)
 -      println("Using projectFile "+projectFile)
 -      variables = [majorVersion: version.substring(2, 11), build: 001, OSX_KEYSTORE: OSX_KEYSTORE, JSIGN_SH: JSIGN_SH]
 -      destination = "$jalviewDir/$install4jBuildDir/$JAVA_VERSION"
 -      buildSelected = true
 -
 -      if (OSX_KEYPASS) {
 -              macKeystorePassword=OSX_KEYPASS
 -
 -      }
 -
 -      inputs.dir(project.ext.getdownWebsiteDir)
 -      inputs.file(install4jConf)
 -      inputs.dir(macosJavaVMDir)
 -      inputs.dir(windowsJavaVMDir)
 -      outputs.dir("$jalviewDir/$install4jBuildDir/$JAVA_VERSION")
 -      
 +  group = "distribution"
 +  description = "Create the install4j installers"
 +  dependsOn getdown
 +  dependsOn copyInstall4jTemplate
 +  projectFile = file(install4jConf)
 +  println("Using projectFile "+projectFile)
 +  variables = [majorVersion: version.substring(2, 11), build: 001, OSX_KEYSTORE: OSX_KEYSTORE, JSIGN_SH: JSIGN_SH]
 +  destination = "$jalviewDir/$install4jBuildDir/$JAVA_VERSION"
 +  buildSelected = true
 +
 +  if (OSX_KEYPASS) {
 +    macKeystorePassword=OSX_KEYPASS
-     
++
 +  }
-   
++
 +  inputs.dir(project.ext.getdownWebsiteDir)
 +  inputs.file(install4jConf)
 +  inputs.dir(macosJavaVMDir)
 +  inputs.dir(windowsJavaVMDir)
 +  outputs.dir("$jalviewDir/$install4jBuildDir/$JAVA_VERSION")
++
  }
  
  clean {
 -      delete install4jConf
 +  delete install4jConf
  }
index 97fecd3,c034313..7ee98a0
Binary files differ
index 941383b,62e87f4..42efe3c
Binary files differ
@@@ -70,13 -70,13 +70,18 @@@ public class Applicatio
          public enum Step
          {
              UPDATE_JAVA(10),
--            VERIFY_METADATA(15, 65, 95),
--            DOWNLOAD(40),
++            //VERIFY_METADATA(15, 65, 95),
++            VERIFY_METADATA(15, 45, 90),
++            DOWNLOAD(50),
              PATCH(60),
--            VERIFY_RESOURCES(70, 97),
--            REDOWNLOAD_RESOURCES(90),
--            UNPACK(98),
--            LAUNCH(99);
++            //VERIFY_RESOURCES(70, 97),
++            VERIFY_RESOURCES(30, 60),
++            //REDOWNLOAD_RESOURCES(90),
++            REDOWNLOAD_RESOURCES(70),
++            //UNPACK(98),
++            UNPACK(90),
++            //LAUNCH(99);
++            LAUNCH(100);
  
              /** What is the final percent value for this step? */
              public final List<Integer> defaultPercents;
@@@ -734,8 -734,8 +734,8 @@@ public abstract class Getdown extends T
                  }
              }
  
--            _container.setVisible(true);
--            _container.validate();
++            //_container.setVisible(true);
++            //_container.validate();
  
              // if we have a UI open and we haven't been around for at least 5 seconds (the default
              // for min_show_seconds), don't stick a fork in ourselves straight away but give our
                                                  instantSplashPane.setSize(bwidth,bheight);
                                                  instantSplashPane.setPreferredSize(new Dimension(bwidth,bheight));
  
--                                                _layers.add(instantSplashPane, Integer.valueOf(0));
--                                              
++                                                _layers.add(instantSplashPane, Integer.valueOf(1));
++                                                
                                                  _container.setPreferredSize(new Dimension(bwidth,bheight));
                        }
                      } catch (Exception e) {
                      _patchNotes.setFont(StatusPanel.FONT);
                      _layers.add(_patchNotes);
                      _status = new StatusPanel(_msgs);
--                                      //setStatusAsync("test", stepToGlobalPercent(1), -1L, false);
--                    _layers.add(_status, Integer.valueOf(10));
++                    setStatusAsync("m.initialising", 0, -1L, true);
++                    //_layers.add(_status, Integer.valueOf(2));
                      initInterface();
                  }
                  showContainer();
                      _status.setProgress(0, -1L);
                  } else if (percent >= 0) {
                      _status.setProgress(percent, remaining);
++                } else {
++                      //_status.setStatus("m.initialising", false);
                  }
++                
              }
          });
++        
++        if (! _addedStatusLayer) {
++              _layers.add(_status, Integer.valueOf(2));
++              _addedStatusLayer = true;
++              initInterface();
++        }
++        
      }
  
      protected void reportTrackingEvent (String event, int progress)
        } catch (Exception e) {
          log.warning("Could't read config when invoking GUI action", "Exception", e.getMessage());
        }
--      if (! (_ifc == null) && _ifc.progressSync) {
++      if (_ifc != null && _ifc.progressSync) {
          try {
-           //EventQueue.invokeAndWait(r);
-           r.run();
+           EventQueue.invokeAndWait(r);
++          //r.run();
          } catch (Exception e) {
            log.warning("Tried to invokeAndWait but couldn't. Going to invokeLater instead", "Exception", e.getMessage());
            EventQueue.invokeLater(r);
          }
        } else {
-         //EventQueue.invokeLater(r);
-         r.run();
+         EventQueue.invokeLater(r);
++        //r.run();
        }
        
++      //try { Thread.sleep(500); } catch (Exception e) {}
++      
      }
      
      protected Application _app;
      protected AbortPanel _abort;
      protected RotatingBackgrounds _background;
  
++    protected boolean _addedStatusLayer;
      protected boolean _dead;
      protected boolean _silent;
      protected boolean _launchInSilent;
      protected boolean _noUpdate;
      protected long _startup;
--
++    
      protected Set<Resource> _toInstallResources;
      protected boolean _readyToInstall;
  
@@@ -143,13 -141,13 +143,6 @@@ public class GetdownAp
            // move window to top, always on top
            if (_ifc.keepOnTop) {
                  log.info("Keep on top set to ", "keep_on_top", _ifc.keepOnTop);
--                        EQinvoke(new Runnable() {
--                                      @Override
--                                      public void run() {
--                                              _frame.toFront();
--                                              _frame.repaint();
--                                      }
--                              });
                          _frame.setAlwaysOnTop(true);
            }
  
@@@ -107,7 -107,7 +107,7 @@@ public final class StatusPanel extends 
          // maybe update the progress label
          if (_progress != percent) {
              _progress = percent;
--            if (!_ifc.hideProgressText) {
++            if (_ifc != null && !_ifc.hideProgressText) {
                  String msg = MessageFormat.format(get("m.complete"), percent);
                  _newplab = createLabel(msg, new Color(_ifc.progressText, true));
              }
              }
              remaining /= values;
  
--            if (!_ifc.hideProgressText) {
++            if (_ifc != null && !_ifc.hideProgressText) {
                  // now compute our display value
                  int minutes = (int)(remaining / 60), seconds = (int)(remaining % 60);
                  String remstr = minutes + ":" + ((seconds < 10) ? "0" : "") + seconds;
       */
      protected void updateStatusLabel ()
      {
++        if (_ifc == null) {
++              return;
++        }
          String status = _status;
          if (!_displayError) {
              for (int ii = 0; ii < _statusDots; ii++) {
                  status += " .";
              }
          }
--        
++ 
        StringBuilder labelText = new StringBuilder();
        if (_ifc.displayVersion) {
 -              labelText.append("version: "+Build.version());
 +              labelText.append("launcher version: "+Build.version());
                labelText.append("\n");
        }
        if (_ifc.displayAppbase) {
@@@ -108,3 -108,3 +108,6 @@@ m.invalid_appbase = The configuration f
  m.missing_class = The configuration file is missing the application class.
  m.missing_code = The configuration file specifies no code resources.
  m.invalid_digest_file = The digest file is invalid.
++
++# When at 0%
++m.initialising = Initialising
@@@ -114,3 -114,3 +114,6 @@@ m.missing_class = In der Konfigurations
  m.missing_code = Die Konfigurationsdatei enth\u00e4lt keine Codequellen.
  m.invalid_digest_file = Die Hashwertedatei ist ung\u00fcltig.
  
++
++# When at 0%
++m.initialising = Initialising
@@@ -113,3 -113,3 +113,6 @@@ m.missing_class = Al archivo de configu
  m.missing_code = El archivo de configuraci\u00f3n especifica que no hay recursos de c\u00f3digo.
  m.invalid_digest_file = El archivo digest no es v\u00e1lido.
  
++
++# When at 0%
++m.initialising = Initialising
@@@ -109,3 -109,3 +109,6 @@@ m.invalid_appbase = Le fichier de confi
  m.missing_class = Le fichier de configuration ne contient pas la classe de l'application.
  m.missing_code = Le fichier de configuration ne sp\u00e9cifie aucune ressource de code.
  m.invalid_digest_file = Le fichier digest est invalide.
++
++# When at 0%
++m.initialising = Initialising
@@@ -112,3 -112,3 +112,6 @@@ m.invalid_appbase = Il tag "appbase" no
  m.missing_class = Il file di configurazione non contiene la classe da eseguire (tag "class").
  m.missing_code = Il file di configurazione non contiene alcuna risorsa (tag "code").
  m.invalid_digest_file = Il file di digest non รจ valido.
++
++# When at 0%
++m.initialising = Initialising
@@@ -105,3 -105,3 +105,6 @@@ m.invalid_appbase = \u8a2d\u5b9a\u30d5\
  m.missing_class = \u8a2d\u5b9a\u30d5\u30a1\u30a4\u30eb\u306e\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u30af\u30e9\u30b9\u304c\u4e0d\u660e\u3067\u3059\u3002 
  m.missing_code = \u8a2d\u5b9a\u30d5\u30a1\u30a4\u30eb\u3067\u30b3\u30fc\u30c9\u30ea\u30bd\u30fc\u30b9\u304c\u6307\u5b9a\u3055\u308c\u3066\u3044\u307e\u305b\u3093\u3002 
  m.invalid_digest_file = \u30c0\u30a4\u30b8\u30a7\u30b9\u30c8\u30d5\u30a1\u30a4\u30eb\u304c\u7121\u52b9\u3067\u3059\u3002 
++
++# When at 0%
++m.initialising = Initialising
@@@ -100,3 -100,3 +100,6 @@@ m.invalid_appbase = \uC124\uC815 \uD30C
  m.missing_class = \uC124\uC815 \uD30C\uC77C\uC5D0 \uC5B4\uD50C\uB9AC\uCF00\uC774\uC158 \uD074\uB798\uC2A4\uAC00 \uC5C6\uC2B5\uB2C8\uB2E4.
  m.missing_code = \uC124\uC815 \uD30C\uC77C\uC5D0 \uB9AC\uC18C\uC2A4\uC5D0 \uB300\uD55C \uCF54\uB4DC\uAC00 \uBA85\uC2DC\uB418\uC5B4 \uC788\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4.
  m.invalid_digest_file = \uB2E4\uC774\uC81C\uC2A4\uD2B8 \uD30C\uC77C\uC774 \uC798\uBABB\uB418\uC5C8\uC2B5\uB2C8\uB2E4.
++
++# When at 0%
++m.initialising = Initialising
@@@ -116,3 -116,3 +116,6 @@@ m.invalid_appbase = O arquivo de config
  m.missing_class = O arquivo de configura\u00E7\u00E3o n\u00E3o possui a classe de aplicativo.
  m.missing_code = O arquivo de configura\u00E7\u00E3o n\u00E3o especifica um recurso de c\u00F3digo.
  m.invalid_digest_file = O arquivo digest \u00E9 inv\u00E1lido.
++
++# When at 0%
++m.initialising = Initialising
@@@ -59,3 -59,3 +59,6 @@@ m.invalid_appbase = \u914d\u7f6e\u6587\
  m.missing_class = \u914d\u7f6e\u6587\u4ef6\u4e2d\u65e0\u6cd5\u627e\u5230\u7a0b\u5e8f\u6587\u4ef6\u3002
  m.missing_code = \u914d\u7f6e\u6587\u4ef6\u4e2d\u65e0\u6cd5\u627e\u5230\u6307\u5b9a\u7684\u8d44\u6e90\u3002
  m.invalid_digest_file = \u65e0\u6548\u7684\u914d\u7f6e\u6587\u4ef6\u3002
++
++# When at 0%
++m.initialising = Initialising
@@@ -14,7 -14,7 +14,7 @@@ echo "Setting VERSION to '$VERSION'
  
  perl -p -i -e 's|(<version>)[^<]*JVL[^<]*(</version>)|${1}$ENV{VERSION}${2}|;' pom.xml */pom.xml
  
--mvn clean package -Dgetdown.host.whitelist="jalview.org,*.jalview.org"
++mvn package -Dgetdown.host.whitelist="jalview.org,*.jalview.org"
  RET=$?
  if [ x$RET = x0 ]; then
    cp launcher/target/getdown-launcher-$VERSION.jar ../../../getdown/lib/getdown-launcher.jar && echo "Copied getdown-launcher.jar to getdown/lib"
@@@ -69,12 -66,12 +66,12 @@@ getdown_txt_ui.progress_sync = tru
  getdown_txt_ui.keep_on_top = true
  getdown_txt_ui.display_appbase = true
  getdown_txt_ui.display_version = true
--getdown_txt_ui.min_show_seconds = 7
++getdown_txt_ui.min_show_seconds = 6
  getdown_txt_ui.background = FFFFFF
--getdown_txt_ui.background_image = resources/images/jalview_logo_background_getdown-640x480.png
--getdown_txt_ui.instant_background_image = resources/images/jalview_logo_background_getdown_instant-640x480.png
--getdown_txt_ui.error_background = resources/images/jetset_jalview_splash.png
--getdown_txt_ui.progress_image = resources/images/jalview_logo_background_getdown-progress.png
++getdown_txt_ui.background_image = utils/getdown/jalview_logo_background_getdown-640x480.png
++getdown_txt_ui.instant_background_image = utils/getdown/jalview_logo_background_getdown_instant-640x480.png
++getdown_txt_ui.error_background = utils/getdown/jalview_logo_background_getdown_error-640x480.png
++getdown_txt_ui.progress_image = utils/getdown/jalview_logo_background_getdown-progress.png
  getdown_txt_ui.icon = resources/images/JalviewLogo_Huge.png
  getdown_txt_ui.progress = 20, 440, 600, 22
  getdown_txt_ui.progress_bar = AAAAFF
index 97fecd3,c034313..7ee98a0
Binary files differ
index 97fecd3,c034313..7ee98a0
Binary files differ
index 0000000,0000000..f2a6ce5
new file mode 100644 (file)
Binary files differ