/site
/.gradle
/build
-/utils/HelpLinksChecker.out
+/utils/HelpLinksChecker.touch
/getdown/website
/getdown/full_app
/getdown/files
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 + '/'
- 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 = ""
def additional_compiler_args = []
// these are getdown.txt properties defined dependent on the JAVA_VERSION
def getdown_alt_java_min_version
+def getdown_alt_java_max_version
// this property is assigned below and expanded to multiple lines in the getdown task
def getdown_alt_multi_java_location
// this property is for the Java library used in eclipse
compile_source_compatibility = 1.8
compile_target_compatibility = 1.8
getdown_alt_java_min_version = getdown_alt_java8_min_version
+ getdown_alt_java_max_version = getdown_alt_java8_max_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")) {
compile_source_compatibility = 11
compile_target_compatibility = 11
getdown_alt_java_min_version = getdown_alt_java11_min_version
+ getdown_alt_java_max_version = getdown_alt_java11_max_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
+ ]
+} 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_java_max_version = getdown_alt_java11_max_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")
} else {
compileClasspath += files(sourceSets.main.java.outputDir)
}
-
+
compileClasspath += fileTree(dir: "$jalviewDir/$utilsDir", include: ["**/*.jar"])
compileClasspath += fileTree(dir: "$jalviewDir/$libDir", include: ["*.jar"])
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'
//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()
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
}
}
}
-
+
//synchronizationTasks eclipseClasspath
//autoBuildTasks eclipseClasspath
-}
+}
task cloverInstr() {
// only instrument source, we build test classes as normal
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
}))
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()
- }
+ 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)
}
}
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")
def buildingMD = "$jalviewDir/$docDir/building.md"
def css = "$jalviewDir/$docDir/github.css"
- def pandoc = pandoc_exec
+ def pandoc = null
+ pandoc_exec.split(",").each {
+ if (file(it.trim()).exists()) {
+ pandoc = it.trim()
+ return true
+ }
+ }
+
def hostname = "hostname".execute().text.trim()
- if (! file(pandoc).exists() && hostname.equals("jv-bamboo")) {
+ if ((pandoc == null || ! file(pandoc).exists()) && hostname.equals("jv-bamboo")) {
pandoc = System.getProperty("user.home")+"/buildtools/pandoc/bin/pandoc"
}
- if (file(pandoc).exists()) {
- commandLine pandoc, '-s', '-o', buildingHTML, '--metadata', 'pagetitle="Building Jalview from Source"', '--toc', '-H', css, buildingMD
- } else {
- commandLine "true"
+ doFirst {
+ if (pandoc != null && file(pandoc).exists()) {
+ commandLine pandoc, '-s', '-o', buildingHTML, '--metadata', 'pagetitle="Building Jalview from Source"', '--toc', '-H', css, buildingMD
+ } else {
+ println("Cannot find pandoc. Skipping convert building.md to HTML")
+ throw new StopExecutionException()
+ }
}
ignoreExitValue true
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
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
outputs.file("$jalviewDir/$utilsDir/BufferedLineReader.class")
}
-def helplinkscheckeroutputfile = file("$jalviewDir/$utilsDir/HelpLinksChecker.out")
+def helplinkscheckertouchfile = file("$jalviewDir/$utilsDir/HelpLinksChecker.touch")
task linkCheck(type: JavaExec) {
dependsOn prepare, compileLinkCheck
classpath = files("$jalviewDir/$utilsDir")
def help = "$classes/$helpDir"
args = [ "$classes/$helpDir", "-nointernet" ]
- doFirst {
- helplinkscheckeroutputfile.createNewFile()
- standardOutput new FileOutputStream(helplinkscheckeroutputfile, false)
+ doLast {
+ helplinkscheckertouchfile.createNewFile()
}
- outputs.file(helplinkscheckeroutputfile)
+ inputs.dir("$classes/$helpDir")
+ outputs.file(helplinkscheckertouchfile)
}
task cleanPackageDir(type: Delete) {
shadowJar {
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"
- 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 = []
+
doFirst {
+ copy {
+ from buildProperties
+ rename(buildPropertiesFile, getdown_build_properties)
+ into project.ext.getdownAppDir
+ }
+ getdownWebsiteResourceFilenames += getdown_app_dir+"/"+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)
+ if (getdown_alt_java_min_version.length() > 0) {
+ props.put("getdown_txt_java_min_version", getdown_alt_java_min_version)
+ }
+ if (getdown_alt_java_max_version.length() > 0) {
+ props.put("getdown_txt_java_max_version", getdown_alt_java_max_version)
+ }
+ props.put("getdown_txt_multi_java_location", getdown_alt_multi_java_location)
- 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) {
}
} else {
// file values rationalised
- if (val.indexOf('/') > -1) {
+ if (val.indexOf('/') > -1 || prop.startsWith("getdown_txt_resource")) {
def r = null
if (val.indexOf('/') == 0) {
// absolute path
getdownResourceFilenames += r.getPath()
}
}
- def line = prop.substring(12) + " = " + val + "\n"
- getdownTextString += line
+ if (! prop.startsWith("getdown_txt_resource")) {
+ def line = prop.substring(12) + " = " + val + "\n"
+ getdownTextString += line
+ }
}
}
}
}
def codeFiles = []
- makeDist.outputs.files.each{ f ->
+ fileTree(file(packageDir)).each{ f ->
if (f.isDirectory()) {
def files = fileTree(dir: f, include: ["*"]).getFiles()
codeFiles += files
// 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 = " + 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
- into project.ext.getdownFilesDir
+ from getdownLauncher
+ 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)
}
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 "mkdir -p '$toDir'\nrsync -avh --delete '$fromDir' '$toDir'"
+ if (RUNRSYNC == "true") {
+ exec {
+ commandLine "mkdir", "-p", toDir
+ }
+ exec {
+ commandLine "rsync", "-avh", "--delete", fromDir, toDir
+ }
+ }
+ }
+ }
}
clean {
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"'])
// 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
)
- */
+ */
}
}
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
}
+
+++ /dev/null
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
- <name>getdown</name>
- <comment></comment>
- <projects>
- </projects>
- <buildSpec>
- <buildCommand>
- <name>org.eclipse.m2e.core.maven2Builder</name>
- <arguments>
- </arguments>
- </buildCommand>
- </buildSpec>
- <natures>
- <nature>org.eclipse.m2e.core.maven2Nature</nature>
- </natures>
-</projectDescription>
+++ /dev/null
-eclipse.preferences.version=1
-encoding/<project>=UTF-8
+++ /dev/null
-activeProfiles=
-eclipse.preferences.version=1
-resolveWorkspaceProjects=true
-version=1
+++ /dev/null
-language: java
-sudo: false
-script: "mvn -B clean verify"
-
-cache:
- directories:
- - '$HOME/.m2/repository'
-
-jdk:
- - openjdk7
- - oraclejdk8
<parent>
<groupId>com.threerings.getdown</groupId>
<artifactId>getdown</artifactId>
- <version>1.8.3-SNAPSHOT</version>
+ <version>1.8.3-1.1.4_JVL</version>
</parent>
<artifactId>getdown-ant</artifactId>
<parent>
<groupId>com.threerings.getdown</groupId>
<artifactId>getdown</artifactId>
- <version>1.8.3-SNAPSHOT</version>
+ <version>1.8.3-1.1.4_JVL</version>
</parent>
<artifactId>getdown-core</artifactId>
separated by commas (app1.foo.com,app2.bar.com,app3.baz.com). -->
<properties>
<getdown.host.whitelist>jalview.org,*.jalview.org</getdown.host.whitelist>
+ <connect_timeout>8</connect_timeout>
+ <read_timeout>15</read_timeout>
</properties>
<build>
<filter token="build_time" value="${getdown.build.time}" />
<filter token="build_version" value="${project.version}" />
<filter token="host_whitelist" value="${getdown.host.whitelist}" />
+ <filter token="connect_timeout" value="${connect_timeout}" />
+ <filter token="read_timeout" value="${read_timeout}" />
</filterset>
</copy>
</target>
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import java.util.zip.GZIPInputStream;
-import com.sun.management.OperatingSystemMXBean;
-import java.lang.management.ManagementFactory;
import jalview.bin.MemorySetting;
{
/** The name of our configuration file. */
public static final String CONFIG_FILE = "getdown.txt";
+
+ /** Dir where a backup config file might reside */
+ public static final String BACKUP_CONFIG_DIR = "install";
/** The name of our target version file. */
public static final String VERSION_FILE = "version.txt";
*/
public enum Step
{
- UPDATE_JAVA(10),
- VERIFY_METADATA(15, 65, 95),
- DOWNLOAD(40),
+ //UPDATE_JAVA(10),
+ UPDATE_JAVA(20),
+ //VERIFY_METADATA(15, 65, 95),
+ VERIFY_METADATA(15, 45, 90),
+ DOWNLOAD(60),
PATCH(60),
- VERIFY_RESOURCES(70, 97),
- REDOWNLOAD_RESOURCES(90),
- UNPACK(98),
- LAUNCH(99);
+ //VERIFY_RESOURCES(70, 97),
+ VERIFY_RESOURCES(40, 90),
+ //REDOWNLOAD_RESOURCES(90),
+ REDOWNLOAD_RESOURCES(80),
+ //UNPACK(98),
+ UNPACK(95),
+ //LAUNCH(99);
+ LAUNCH(100);
/** What is the final percent value for this step? */
public final List<Integer> defaultPercents;
/** The paths (relative to the appdir) of images for the window icon. */
public final List<String> iconImages;
+ /** The path (relative to the appdir) to a single background image to appear first. */
+ public final String instantBackgroundImage;
+
/** The path (relative to the appdir) to a single background image. */
public final String backgroundImage;
/** Whether progress text should be hidden or not. */
public final boolean hideProgressText;
+ /** Whether the splash screen should update non-asynchronously before being shown. */
+ public final boolean progressSync;
+
+ /** Whether the splash screen should update non-asynchronously after being shown. */
+ public final boolean progressSyncAfterShown;
+
+ /** Whether the splash screen should retain focus. */
+ public final boolean keepOnTop;
+
+ /** Whether to display the appbase. */
+ public final boolean displayAppbase;
+
+ /** Whether to display the version. */
+ public final boolean displayVersion;
+
/** The minimum number of seconds to display the GUI. This is to prevent the GUI from
* flashing up on the screen and immediately disappearing, which can be confusing to the
* user. */
@Override
public String toString ()
{
- return "[name=" + name + ", bg=" + background + ", bg=" + backgroundImage +
+ return "[name=" + name + ", bg=" + background + ", bg=" + backgroundImage + ", instant_bg=" + instantBackgroundImage +
", pi=" + progressImage + ", prect=" + progress + ", pt=" + progressText +
", pb=" + progressBar + ", srect=" + status + ", st=" + statusText +
", shadow=" + textShadow + ", err=" + installError + ", nrect=" + patchNotes +
", notes=" + patchNotesUrl + ", stepPercentages=" + stepPercentages +
- ", hideProgressText" + hideProgressText + ", minShow=" + minShowSeconds + "]";
+ ", hideProgressText=" + hideProgressText + ", keepOnTop=" + keepOnTop + ", progressSync=" + progressSync +
+ ", progressSyncAfterShown=" + progressSyncAfterShown + ", minShow=" + minShowSeconds +
+ ", displayAppbase=" + displayAppbase + ", displayVersion=" + displayVersion + "]";
}
public UpdateInterface (Config config)
this.name = config.getString("ui.name");
this.progress = config.getRect("ui.progress", new Rectangle(5, 5, 300, 15));
this.progressText = config.getColor("ui.progress_text", Color.BLACK);
- this.hideProgressText = config.getBoolean("ui.hide_progress_text");
+ this.hideProgressText = config.getBoolean("ui.hide_progress_text");
+ this.progressSync = config.getBoolean("ui.progress_sync_before_shown");
+ this.progressSyncAfterShown = config.getBoolean("ui.progress_sync_after_shown");
+ this.keepOnTop = config.getBoolean("ui.keep_on_top");
+ this.displayAppbase = config.getBoolean("ui.display_appbase");
+ this.displayVersion = config.getBoolean("ui.display_version");
this.minShowSeconds = config.getInt("ui.min_show_seconds", 5);
this.progressBar = config.getColor("ui.progress_bar", 0x6699CC);
this.status = config.getRect("ui.status", new Rectangle(5, 25, 500, 100));
this.textShadow = config.getColor("ui.text_shadow", Color.CLEAR);
this.hideDecorations = config.getBoolean("ui.hide_decorations");
this.backgroundImage = config.getString("ui.background_image");
+ this.instantBackgroundImage = config.getString("ui.instant_background_image");
// default to black or white bg color, depending on the brightness of the progressText
int defaultBackground = (0.5f < Color.brightness(this.progressText)) ?
Color.BLACK : Color.WHITE;
*
*/
public Application (EnvConfig envc) {
- _envc = envc;
- _config = getLocalPath(envc.appDir, CONFIG_FILE);
+ _envc = envc;
+ _config = getLocalPath(envc.appDir, CONFIG_FILE);
+ _backupConfig = getLocalPath(envc.appDir, BACKUP_CONFIG_DIR+File.separator+CONFIG_FILE);
+ log.warning("Backup config file now", "_backupConfig", _backupConfig, "exists", _backupConfig.exists(), "isReadable", _backupConfig.canRead());
}
/**
* Returns the configured application directory.
*/
public File getAppDir () {
- return _envc.appDir;
+ return _envc.appDir;
}
/**
*/
public boolean useCodeCache ()
{
- return _useCodeCache;
+ return _useCodeCache;
}
/**
*/
public int getCodeCacheRetentionDays ()
{
- return _codeCacheRetentionDays;
+ return _codeCacheRetentionDays;
}
/**
* app files from its hosting server.
*/
public int maxConcurrentDownloads () {
- return _maxConcDownloads;
+ return _maxConcDownloads;
}
/**
*/
public Resource getConfigResource ()
{
- try {
- return createResource(CONFIG_FILE, Resource.NORMAL);
- } catch (Exception e) {
- throw new RuntimeException("Invalid appbase '" + _vappbase + "'.", e);
- }
+ try {
+ return createResource(CONFIG_FILE, Resource.NORMAL);
+ } catch (Exception e) {
+ throw new RuntimeException("Invalid appbase '" + _vappbase + "'.", e);
+ }
}
/**
*/
public List<Resource> getCodeResources ()
{
- return _codes;
+ return _codes;
}
/**
} catch (Exception e) {
log.warning("Failure reading config file", "file", _config, e);
}
+ if (config == null || config.getString("appbase") == null || config.getString("appbase").isEmpty()) {
+ try {
+ Config backupConfig = Config.parseConfig(_backupConfig, opts);
+ config = backupConfig;
+ log.warning("Using backup config file", "appdir", getAppDir(), "backupConfig", _backupConfig.getAbsoluteFile());
+ } catch (Exception e) {
+ log.warning("Failure reading backup config file", "file", _backupConfig, e);
+ }
+ }
// see if there's an override config from locator file
Config locatorConfig = createLocatorConfig(opts);
try {
Config tmpConfig = null;
+ Map<String, Object> tmpData = new HashMap<>();
if (_locatorFile.exists()) {
tmpConfig = Config.parseConfig(_locatorFile, opts);
+ // appbase is sanitised in HostWhitelist
+ Map<String, Object> tmpConfigData = tmpConfig.getData();
+ if (tmpConfig != null) {
+ for (Map.Entry<String, Object> entry : tmpConfigData.entrySet()) {
+ String key = entry.getKey();
+ Object value = entry.getValue();
+ String mkey = key.indexOf('.') > -1 ? key.substring(key.indexOf('.') + 1) : key;
+ if (Config.allowedReplaceKeys.contains(mkey) || Config.allowedMergeKeys.contains(mkey)) {
+ tmpData.put(key, value);
+ }
+ }
+ } else {
+ log.warning("Error occurred reading config file", "file", _locatorFile);
+ }
} else {
log.warning("Given locator file does not exist", "file", _locatorFile);
}
- // appbase is sanitised in HostWhitelist
- Map<String, Object> tmpData = new HashMap<>();
- for (Map.Entry<String, Object> entry : tmpConfig.getData().entrySet()) {
- String key = entry.getKey();
- Object value = entry.getValue();
- String mkey = key.indexOf('.') > -1 ? key.substring(key.indexOf('.') + 1) : key;
- if (Config.allowedReplaceKeys.contains(mkey) || Config.allowedMergeKeys.contains(mkey)) {
- tmpData.put(key, value);
- }
- }
locatorConfig = new Config(tmpData);
} catch (Exception e) {
log.warning("Failure reading locator file", "file", _locatorFile, e);
}
- log.info("Returning locatorConfig", locatorConfig);
-
return locatorConfig;
}
+ public String getAppbase() {
+ return _appbase;
+ }
+
protected final EnvConfig _envc;
protected File _config;
+ protected File _backupConfig;
protected Digest _digest;
protected long _version = -1;
public static List<String> hostWhitelist () {
return Arrays.asList(StringUtil.parseStringArray("@host_whitelist@"));
}
+
+ /*
+ * <p>The default connect_timeout to use. Overridden by system property of the same name at runtime
+ */
+ public static int defaultConnectTimeout () {
+ try {
+ return Integer.valueOf("@connect_timeout@");
+ } catch (Exception e) {
+ return 0;
+ }
+ }
+
+ /*
+ * <p>The default read_timeout to use. Overridden by system property of the same name at runtime
+ */
+ public static int defaultReadTimeout () {
+ try {
+ return Integer.valueOf("@read_timeout@");
+ } catch (Exception e) {
+ return 30;
+ }
+ }
}
import java.util.regex.Pattern;
import com.threerings.getdown.util.VersionUtil;
+import com.threerings.getdown.data.Build;
/**
* This class encapsulates all system properties that are read and processed by Getdown. Don't
* to more quickly timeout its startup update check if the server with which it is
* communicating is not available. Usage: {@code -Dconnect_timeout=N}. */
public static int connectTimeout () {
- return Integer.getInteger("connect_timeout", 0);
+ return Integer.getInteger("connect_timeout", Build.defaultConnectTimeout());
}
/** Specifies the read timeout (in seconds) to use when downloading all files from the server.
* update process wil fail. Setting the timeout to zero (or a negative value) will disable it.
* Usage: {@code -Dread_timeout=N}. */
public static int readTimeout () {
- return Integer.getInteger("read_timeout", 30);
+ return Integer.getInteger("read_timeout", Build.defaultReadTimeout());
}
/** Returns the number of threads used to perform digesting and verifying operations in
} else if (allowedReplaceKeys.contains(mkey)){
// replace value
-
_data.put(key, nvalue);
+
} else {
log.warning("Not merging key '"+key+"' into config");
}
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.PrintStream;
+import java.nio.file.Files;
+import java.nio.file.Paths;
import java.util.Locale;
+import javax.xml.bind.DatatypeConverter;
+
+import java.security.MessageDigest;
+
import static com.threerings.getdown.Log.log;
/**
return vmpath;
}
+ private static String _getMD5FileChecksum (File file) {
+ // check md5 digest
+ String algo = "MD5";
+ String checksum = "";
+ try {
+ MessageDigest md = MessageDigest.getInstance(algo);
+ md.update(Files.readAllBytes(Paths.get(file.getAbsolutePath())));
+ byte[] digest = md.digest();
+ checksum = DatatypeConverter.printHexBinary(digest).toUpperCase();
+ } catch (Exception e) {
+ System.out.println("Couldn't create "+algo+" digest of "+file.getPath());
+ }
+ return checksum;
+ }
+
/**
* Upgrades Getdown by moving an installation managed copy of the Getdown jar file over the
* non-managed copy (which would be used to run Getdown itself).
// we assume getdown's jar file size changes with every upgrade, this is not guaranteed,
// but in reality it will, and it allows us to avoid pointlessly upgrading getdown every
// time the client is updated which is unnecessarily flirting with danger
- if (!newgd.exists() || newgd.length() == curgd.length()) {
+ if (!newgd.exists())
+ {
return;
}
+
+ if (newgd.length() == curgd.length()) {
+ if (_getMD5FileChecksum(newgd).equals(_getMD5FileChecksum(curgd)))
+ {
+ return;
+ }
+ }
log.info("Updating Getdown with " + newgd + "...");
} catch (NoClassDefFoundError e)
{
// com.sun.management.OperatingSystemMXBean doesn't exist in this JVM
- System.out.println("No com.sun.management.OperatingSystemMXBean");
+ System.err.println("No com.sun.management.OperatingSystemMXBean");
}
// We didn't get a com.sun.management.OperatingSystemMXBean.
<parent>
<groupId>com.threerings.getdown</groupId>
<artifactId>getdown</artifactId>
- <version>1.8.3-SNAPSHOT</version>
+ <version>1.8.3-1.1.4_JVL</version>
</parent>
<artifactId>getdown-launcher</artifactId>
<build>
<plugins>
+ <!--
<plugin>
<groupId>com.github.wvengen</groupId>
<artifactId>proguard-maven-plugin</artifactId>
<addMavenDescriptor>false</addMavenDescriptor>
</configuration>
</plugin>
-
+ -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<goals>
<goal>shade</goal>
</goals>
+ <!--
+ <configuration>
+ <minimizeJar>true</minimizeJar>
+ <filters>
+ <filter>
+ <artifact>install4j-runtime</artifact>
+ <includes>
+ <include>**</include>
+ </includes>
+ </filter>
+ </filters>
+ </configuration>
+ -->
</execution>
</executions>
</plugin>
import java.awt.Container;
import java.awt.Dimension;
import java.awt.EventQueue;
+import java.awt.Graphics;
import java.awt.GraphicsEnvironment;
import java.awt.Image;
import java.awt.event.ActionEvent;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLayeredPane;
+import javax.swing.JPanel;
import com.samskivert.swing.util.SwingUtil;
import com.threerings.getdown.data.*;
Config config = _app.init(true);
if (preloads) doPredownloads(_app.getResources());
_ifc = new Application.UpdateInterface(config);
+ if (_status != null) {
+ _status.setAppbase(_app.getAppbase());
+ }
}
/**
throw new IOException("m.java_download_failed");
}
+ // on Windows, if the local JVM is in use, we will not be able to replace it with an
+ // updated JVM; we detect this by attempting to rename the java.dll to its same name, which
+ // will fail on Windows for in use files; hackery!
+ File javaLocalDir = new File(_app.getAppDir(), LaunchUtil.LOCAL_JAVA_DIR+File.separator);
+ File javaDll = new File(javaLocalDir, "bin" + File.separator + "java.dll");
+ if (javaDll.exists()) {
+ if (!javaDll.renameTo(javaDll)) {
+ log.info("Cannot update local Java VM as it is in use.");
+ return;
+ }
+ log.info("Can update local Java VM as it is not in use.");
+ }
+
reportTrackingEvent("jvm_start", -1);
updateStatus("m.downloading_java");
// show the patch notes button, if applicable
if (!StringUtil.isBlank(_ifc.patchNotesUrl)) {
createInterfaceAsync(false);
- EventQueue.invokeLater(new Runnable() {
+ EQinvoke(new Runnable() {
public void run () {
_patchNotes.setVisible(true);
}
} else {
proc = _app.createProcess(false);
}
-
+
// close standard in to avoid choking standard out of the launched process
proc.getInputStream().close();
// close standard out, since we're not going to write to anything to it anyway
}
}
+ //_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
// lovely user a chance to see what we're doing
if (_silent || (_container != null && !reinit)) {
return;
}
-
- EventQueue.invokeLater(new Runnable() {
+
+ EQinvoke (new Runnable() {
public void run () {
+
if (_container == null || reinit) {
if (_container == null) {
_container = createContainer();
}
configureContainer();
_layers = new JLayeredPane();
+
+
+
+ // added in the instant display of a splashscreen
+ try {
+ readConfig(false);
+ Graphics g = _container.getGraphics();
+ BufferedImage iBgImage = loadImage(_ifc.instantBackgroundImage);
+ boolean ibg = true;
+ if (iBgImage == null) {
+ iBgImage = loadImage(_ifc.backgroundImage);
+ ibg = false;
+ }
+ if (iBgImage != null) {
+ final BufferedImage bgImage = iBgImage;
+ int bwidth = bgImage.getWidth();
+ int bheight = bgImage.getHeight();
+
+ log.info("Displaying instant background image", ibg?"instant_background_image":"background_image");
+
+ instantSplashPane = new JPanel() {
+ @Override
+ protected void paintComponent(Graphics g)
+ {
+ super.paintComponent(g);
+ // attempt to draw a background image...
+ if (bgImage != null) {
+ g.drawImage(bgImage, 0, 0, this);
+ }
+ }
+ };
+
+ instantSplashPane.setSize(bwidth,bheight);
+ instantSplashPane.setPreferredSize(new Dimension(bwidth,bheight));
+
+ _layers.add(instantSplashPane, Integer.valueOf(1));
+
+ _container.setPreferredSize(new Dimension(bwidth,bheight));
+ }
+ } catch (Exception e) {
+ log.warning("Failed to set instant background image", "ibg", _ifc.instantBackgroundImage);
+ }
+
_container.add(_layers, BorderLayout.CENTER);
_patchNotes = new JButton(new AbstractAction(_msgs.getString("m.patch_notes")) {
@Override public void actionPerformed (ActionEvent event) {
_patchNotes.setFont(StatusPanel.FONT);
_layers.add(_patchNotes);
_status = new StatusPanel(_msgs);
- _layers.add(_status);
+ setStatusAsync("m.initialising", 0, -1L, true);
+ //_layers.add(_status, Integer.valueOf(2));
initInterface();
}
showContainer();
}
});
+
}
/**
_status.init(_ifc, _background, getProgressImage());
Dimension size = _status.getPreferredSize();
_status.setSize(size);
+ //_status.updateStatusLabel();
_layers.setPreferredSize(size);
_patchNotes.setBounds(_ifc.patchNotes.x, _ifc.patchNotes.y,
protected RotatingBackgrounds getBackground ()
{
- if (_ifc.rotatingBackgrounds != null) {
+ if (_ifc.rotatingBackgrounds != null && _ifc.rotatingBackgrounds.size() > 0) {
if (_ifc.backgroundImage != null) {
log.warning("ui.background_image and ui.rotating_background were both specified. " +
"The background image is being used.");
}
- return new RotatingBackgrounds(loadImage(_ifc.backgroundImage));
- //return new RotatingBackgrounds(_ifc.rotatingBackgrounds, _ifc.errorBackground, Getdown.this);
+ return new RotatingBackgrounds(_ifc.rotatingBackgrounds, _ifc.errorBackground, Getdown.this);
} else if (_ifc.backgroundImage != null) {
return new RotatingBackgrounds(loadImage(_ifc.backgroundImage));
} else {
createInterfaceAsync(false);
}
- EventQueue.invokeLater(new Runnable() {
+ EQinvoke(new Runnable() {
public void run () {
- if (_status == null) {
+
+ if (_status == null) {
if (message != null) {
log.info("Dropping status '" + message + "'.");
}
_status.setProgress(0, -1L);
} else if (percent >= 0) {
_status.setProgress(percent, remaining);
+ } else {
+ //_status.setStatus("m.initialising", false);
}
+
}
});
+
+ if (_status != null && ! _addedStatusLayer) {
+ _layers.add(_status, Integer.valueOf(2));
+ _addedStatusLayer = true;
+ initInterface();
+ }
+
}
protected void reportTrackingEvent (String event, int progress)
setStatusAsync(null, stepToGlobalPercent(percent), -1L, false);
}
};
-
+
+ // Asynchronous or synchronous progress updates
+ protected void EQinvoke(Runnable r) {
+
+ try {
+ readConfig(false);
+ } catch (Exception e) {
+ log.warning("Could't read config when invoking GUI action", "Exception", e.getMessage());
+ }
+ if (_ifc != null && (_shownContainer?_ifc.progressSyncAfterShown:_ifc.progressSync)) {
+ try {
+ 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();
+ }
+
+ //try { Thread.sleep(500); } catch (Exception e) {}
+
+ }
+
protected Application _app;
protected Application.UpdateInterface _ifc = new Application.UpdateInterface(Config.EMPTY);
protected ResourceBundle _msgs;
protected Container _container;
protected JLayeredPane _layers;
+ protected JPanel instantSplashPane;
protected StatusPanel _status;
protected JButton _patchNotes;
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;
protected boolean _enableTracking = true;
protected int _reportedProgress = 0;
+ protected boolean _shownContainer;
+
/** Number of minutes to wait after startup before beginning any real heavy lifting. */
protected int _delay;
import java.awt.Color;
import java.awt.Container;
-import java.awt.EventQueue;
import java.awt.Image;
import java.awt.event.ActionEvent;
import java.awt.event.KeyEvent;
import javax.swing.KeyStroke;
import javax.swing.WindowConstants;
-import com.install4j.api.launcher.StartupNotification;
import com.samskivert.swing.util.SwingUtil;
import com.threerings.getdown.data.Application;
+import com.threerings.getdown.data.Build;
import com.threerings.getdown.data.EnvConfig;
import com.threerings.getdown.data.SysProps;
import com.threerings.getdown.util.LaunchUtil;
import com.threerings.getdown.util.StringUtil;
import static com.threerings.getdown.Log.log;
+import jalview.bin.StartupNotificationListener;
/**
* The main application entry point for Getdown.
}
if (abort) System.exit(-1);
+ log.info("Starting ...");
try
{
- StartupNotification.registerStartupListener(
- new StartupNotification.Listener() {
- @Override
- public void startupPerformed(String parameters)
- {
- log.warning("StartupNotification.Listener.startupPerformed: '"+parameters+"'");
- setStartupFilesParameterString(parameters);
- }
- });
+ jalview.bin.StartupNotificationListener.setListener();
} catch (Exception e)
{
e.printStackTrace();
+ } catch (NoClassDefFoundError e)
+ {
+ log.warning("Starting without install4j classes");
+ } catch (Throwable t)
+ {
+ t.printStackTrace();
}
// record a few things for posterity
log.info("-- User Name: " + System.getProperty("user.name"));
log.info("-- User Home: " + System.getProperty("user.home"));
log.info("-- Cur dir: " + System.getProperty("user.dir"));
+ log.info("-- launcher version: "+Build.version());
log.info("-- startupFilesParameterString: " + startupFilesParameterString);
log.info("---------------------------------------------");
handleWindowClose();
}
});
+
+ // keep_on_top
+ try {
+ readConfig(false);
+ } catch (Exception e) {
+ log.warning("Error reading config for keep_on_top");
+ }
+ // move window to top, always on top
+ if (_ifc.keepOnTop) {
+ log.info("Keep on top set to ", "keep_on_top", _ifc.keepOnTop);
+ _frame.setAlwaysOnTop(true);
+ }
+
// handle close on ESC
String cancelId = "Cancel"; // $NON-NLS-1$
_frame.getRootPane().getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(
log.warning("Failed to set background", "bg", _ifc.background, e);
}
- if (_ifc.iconImages != null) {
+ if (_ifc.iconImages != null && _ifc.iconImages.size() > 0) {
ArrayList<Image> icons = new ArrayList<>();
for (String path : _ifc.iconImages) {
Image img = loadImage(path);
SwingUtil.centerWindow(_frame);
_frame.setVisible(true);
}
+ _shownContainer = true;
}
@Override
super.fail(message);
// super.fail causes the UI to be created (if needed) on the next UI tick, so we
// want to wait until that happens before we attempt to redecorate the window
- EventQueue.invokeLater(new Runnable() {
+ EQinvoke(new Runnable() {
@Override
public void run() {
// if the frame was set to be undecorated, make window decoration available
import com.samskivert.util.Throttle;
import com.threerings.getdown.data.Application.UpdateInterface;
+import com.threerings.getdown.data.Build;
import com.threerings.getdown.util.MessageUtil;
import com.threerings.getdown.util.Rectangle;
import com.threerings.getdown.util.StringUtil;
// 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 += " .";
}
}
- _newlab = createLabel(status, new Color(_ifc.statusText, true));
+
+ StringBuilder labelText = new StringBuilder();
+ if (_ifc.displayVersion) {
+ labelText.append("launcher version: "+Build.version());
+ labelText.append("\n");
+ }
+ if (_ifc.displayAppbase) {
+ labelText.append("appbase: "+_appbase);
+ labelText.append("\n");
+ }
+ labelText.append(status);
+
+ _newlab = createLabel(labelText.toString(), new Color(_ifc.statusText, true));
// set the width of the label to the width specified
int width = _ifc.status.width;
if (width == 0) {
return key;
}
}
+
+ public void setAppbase(String appbase) {
+ _appbase = appbase;
+ }
protected Image _barimg;
protected RotatingBackgrounds _bg;
protected Throttle _rthrottle = new Throttle(1, 1000L);
protected static final Font FONT = new Font("SansSerif", Font.BOLD, 12);
+
+ public String _appbase;
}
--- /dev/null
+package jalview.bin;
+
+import com.threerings.getdown.launcher.GetdownApp;
+import static com.threerings.getdown.Log.log;
+
+public class StartupNotificationListener {
+
+ public static void setListener() {
+
+
+ try {
+ com.install4j.api.launcher.StartupNotification.registerStartupListener(
+ new com.install4j.api.launcher.StartupNotification.Listener() {
+ @Override
+ public void startupPerformed(String parameters) {
+ log.info("StartupNotification.Listener.startupPerformed: '"+parameters+"'");
+ GetdownApp.setStartupFilesParameterString(parameters);
+ }
+ }
+ );
+ } catch (Exception e) {
+ e.printStackTrace();
+ } catch (NoClassDefFoundError t) {
+ log.warning("Starting without install4j classes");
+ }
+
+ }
+
+}
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
+m.starting = Starting
m.missing_code = Die Konfigurationsdatei enth\u00e4lt keine Codequellen.
m.invalid_digest_file = Die Hashwertedatei ist ung\u00fcltig.
+
+# When at 0%
+m.initialising = Initialising
+m.starting = Starting
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
+m.starting = Starting
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
+m.starting = Starting
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
+m.starting = Starting
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
+m.starting = Starting
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
+m.starting = Starting
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
+m.starting = Starting
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
+m.starting = Starting
-mvn clean package -Dgetdown.host.whitelist="jalview.org,*.jalview.org" && cp launcher/target/getdown-launcher-1.8.3-SNAPSHOT.jar ../../../getdown/lib/getdown-launcher.jar && cp core/target/getdown-core-1.8.3-SNAPSHOT.jar ../../../getdown/lib/getdown-core-1.8.3-SNAPSHOT.jar && cp core/target/getdown-core-1.8.3-SNAPSHOT.jar ../../../j8lib/getdown-core.jar && cp core/target/getdown-core-1.8.3-SNAPSHOT.jar ../../../j11lib/getdown-core.jar
+#!/usr/bin/env bash
+
+if [ x$JVLVERSION != x ]; then
+ export VERSION=$JVLVERSION
+else
+ export VERSION=1.8.3-1.1.4_JVL
+fi
+
+if [ x${VERSION%_JVL} = x$VERSION ]; then
+ VERSION=${VERSION}_JVL
+fi
+
+echo "Setting VERSION to '$VERSION'"
+
+perl -p -i -e 's|(<version>)[^<]*JVL[^<]*(</version>)|${1}$ENV{VERSION}${2}|;' pom.xml */pom.xml
+
+mvn package -Dgetdown.host.whitelist="jalview.org,*.jalview.org" -Dconnect_timeout=8 -Dread_timeout=15
+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"
+ cp core/target/getdown-core-$VERSION.jar ../../../getdown/lib/getdown-core.jar && echo "Copied getdown-core.jar to getdown/lib"
+ cp core/target/getdown-core-$VERSION.jar ../../../j8lib/getdown-core.jar && echo "Copied getdown-core.jar to j8lib"
+ cp core/target/getdown-core-$VERSION.jar ../../../j11lib/getdown-core.jar && echo "Copied getdown-core.jar to j11lib"
+fi
<groupId>com.threerings.getdown</groupId>
<artifactId>getdown</artifactId>
<packaging>pom</packaging>
- <version>1.8.3-SNAPSHOT</version>
+ <version>1.8.3-1.1.4_JVL</version>
<name>getdown</name>
<description>An application installer and updater.</description>
<groupId>com.install4j</groupId>
<artifactId>install4j-runtime</artifactId>
<version>7.0.11</version>
- <!--<scope>provided</scope>-->
+ <scope>provided</scope>
</dependency>
</dependencies>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
- <version>3.7.0</version>
+ <version>3.8.1</version>
<configuration>
- <source>1.7</source>
- <target>1.7</target>
+ <source>1.8</source>
+ <target>1.8</target>
<fork>true</fork>
<showDeprecation>true</showDeprecation>
<showWarnings>true</showWarnings>
cloverClassesDir = clover-classes
cloverSourcesInstrDir = sources-instr
packageDir = dist
+ARCHIVEDIR =
outputJar = jalview.jar
testSourceDir = test
getdown_local = false
getdown_website_dir = getdown/website
getdown_resource_dir = resource
-getdown_app_dir = dist
#getdown_j11lib_dir = j11lib
getdown_files_dir = getdown/files
getdown_launcher = getdown/lib/getdown-launcher.jar
-getdown_core = getdown/lib/getdown-core-1.8.3-SNAPSHOT.jar
-getdown_base_txt = getdown/files/getdown.txt
+getdown_launcher_new = getdown-launcher-new.jar
+getdown_core = getdown/lib/getdown-core.jar
+getdown_launch_jvl = channel_launch.jvl
+getdown_build_properties = build_properties
getdown_txt_title = Jalview
-getdown_channel_base = http://www.jalview.org/getdown/jalview
-getdown_channel_name = TEST
getdown_txt_allow_offline = true
+getdown_txt_max_concurrent_downloads = 10
getdown_txt_jalview.jvmmempc = 90
-getdown_txt_multi_jvmarg = -Dgetdownappdir="%APPDIR%"
+getdown_txt_multi_jvmarg = -Dgetdownappdir=%APPDIR%
getdown_txt_strict_comments = true
getdown_txt_title = Jalview
getdown_txt_ui.name = Jalview
+getdown_txt_ui.progress_sync_before_shown = true
+getdown_txt_ui.progress_sync_after_shown = false
+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 = 6
getdown_txt_ui.background = FFFFFF
-getdown_txt_ui.background_image = resources/images/jalview_logo_background_getdown-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
getdown_txt_ui.progress_text = 000000
getdown_txt_ui.status = 20, 380, 600, 58
getdown_txt_ui.status_text = 000066
-getdown_txt_ui.text_shadow = EEEEFF
-getdown_txt_ui.install_error = http://www.jalview.org/download/error
+#getdown_txt_ui.text_shadow = FFFFFF
+getdown_txt_ui.install_error = http://www.jalview.org/faq/getdownerror
getdown_txt_ui.mac_dock_icon = resources/images/jalview_logos.ico
getdown_alt_java8_min_version = 01080000
+getdown_alt_java8_max_version = 01089999
getdown_alt_java11_min_version = 11000000
-getdown_alt_java11_txt_multi_java_location = [windows-amd64] /getdown/jre/windows-jre11.tgz,[linux-amd64] /getdown/jre/linux-jre11.tgz,[mac os x] /getdown/jre/macos-jre11.tgz
+getdown_alt_java11_max_version =
+getdown_alt_java11_txt_multi_java_location = [windows-amd64] /getdown/jre/windows-jre11.jar,[linux-amd64] /getdown/jre/linux-jre11.tgz,[mac os x] /getdown/jre/macos-jre11.tgz
getdown_alt_java8_txt_multi_java_location = [windows-amd64] /getdown/jre/windows-jre1.8.tgz,[linux-amd64] /getdown/jre/linux-jre1.8.tgz,[mac os x] /getdown/jre/macos-jre1.8.tgz
JRE_installs = /Users/bsoares/Java/installs
Windows_JRE8 = OpenJDK8U-jdk_x64_windows_hotspot_8u202b08/jdk8u202-b08
eclipse_extra_jdt_prefs_file = .settings/org.eclipse.jdt.core.jalview.prefs
-pandoc_exec = /usr/local/bin/pandoc
+pandoc_exec = /usr/local/bin/pandoc,/usr/bin/pandoc
dev = false
+CHANNEL=LOCAL
+getdown_channel_base = http://www.jalview.org/getdown
+getdown_channel_name = SCRATCH-DEFAULT
+getdown_app_dir_release = release
+getdown_app_dir_alt = alt
+getdown_install_dir = install
+getdown_rsync_dest = /Volumes/jalview/docroot/getdown
+reportRsyncCommand =
+RUNRSYNC=false
<mapID target="overview" url="html/features/overview.html" />
<mapID target="overviewprefs" url="html/features/preferences.html#overview" />
+
+ <mapID target="importvcf" url="html/features/importvcf.html" />
</map>
<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="Structure Chooser" target="pdbchooser"/>
- <tocitem text="Chimera Annotation Exchange" target="chimera.annotxfer"/>
+ <tocitem text="VCF Import" target="vcfimport"/>
+ <tocitem text="Feature Filters and Attribute Colourschemes" target="features.featureschemes" />
+
</tocitem>
<tocitem text="Editing Alignments" target="edit" />
<tocitem text="Select Columns by Annotation" target="selectcolbyannot" />
<tocitem text="Nucleic Acid Support" target="nucleicAcids" expand="false">
+ <tocitem text="Annotating from VCF" target="importvcf" />
<tocitem text="Viewing RNA structure" target="varna" />
<tocitem text="RNA Structure Consensus" target="calcs.alstrconsensus" />
<tocitem text="RNA Helices coloring" target="colours.rnahelices" />
nucleotide substitution matrix</a>, or by sequence percentage identity,
or sequence feature similarity.
</p>
- <img src="pcaviewer.gif">
+ <img src="pcaviewer.png">
<p>
<strong>The PCA Viewer</strong>
</p>
towards the front of the view.</p>
<p>
The 3d view can be rotated by dragging the mouse with the <strong>left
- mouse button</strong> pressed. The view can also be zoomed in and out with
+ mouse button</strong> pressed, or with the <strong>arrow
+ keys</strong> when <strong>SHIFT</strong> is pressed. The
+ view can also be zoomed in and out with
the up and down <strong>arrow keys</strong> (and the roll bar of the
mouse if present). Labels will be shown for each sequence if the
entry in the View menu is checked, and the plot background colour
<p>
Initially, the display shows the first three components of the
similarity space, but any eigenvector can be used by changing the
- selected dimension for the x, y, or z axis through each ones menu
+ selected dimension for the x, y, or z axis through each one's menu
located below the 3d display. The <strong><em>Reset</em></strong>
button will reset axis and rotation settings to their defaults.
</p>
<em>The output of points and transformed point coordinates was
added to the Jalview desktop in v2.7.</em> <em>The Reset button
and Change Parameters menu were added in Jalview 2.8.</em> <em>Support
- for PAM250 based PCA was added in Jalview 2.8.1.</em>
+ for PAM250 based PCA was added in Jalview 2.8.1.</em><em>In Jalview 2.11, support for saving and restoring PCAs in Project files was added, and the Change parameters menu removed.</em>
</p>
<p>
<strong>Reproducing PCA calculations performed with older
alignment, such as another tree viewer.
</p>
<p>
- <strong><em><a name="partitioning">Grouping sequences by partitioning</a> the
- tree at a particular distance</em></strong><br> Clicking anywhere along
- the extent of the tree (but not on a leaf or internal node) defines
- a tree 'partition', by cutting every branch of the tree spanning the
- depth where the mouse-click occurred. Groups are created containing
- sequences at the leaves of each connected sub tree. These groups are
- each given a different colour, which are reflected in other windows
- in the same way as if the sequence IDs were selected, and can be
- edited in the same way as user defined sequence groups.
- </p>
+ <strong><em><a name="partitioning">Grouping
+ sequences by partitioning</a> the tree at a particular distance</em></strong><br>
+ Clicking anywhere along the extent of the tree (but not on a leaf or
+ internal node) defines a tree 'partition', by cutting every branch of
+ the tree spanning the depth where the mouse-click occurred. A red line
+ will be shown where the partition was made, and groups are created
+ containing sequences at the leaves of each connected sub tree. These
+ groups are each given a different colour, which are reflected in other
+ windows in the same way as if the sequence IDs were selected, and can
+ be edited in the same way as user defined sequence groups.
+ </p>
<p>
Tree partitions are useful for comparing clusters produced by
different methods and measures. They are also an effective way of
a new scheme in the Colour menu.</p>
<p>
The <strong>"Colour→<a
- href="../colourSchemes/textcolour.html">Colour Text...</a>"
+ href="textcolour.html">Colour Text...</a>"
</strong> entry opens a dialog box to set a different text colour for light
and dark background, and the intensity threshold for transition
between them.
</p>
- <p>The default colour schemes are summarised in the table below:
- <div align="center">
- <p> </p>
- <p>
- <strong>Protein Colour Schemes</strong>
- </p>
- <table border="1">
- <tr>
- <td>
- <table border="1">
- <tr>
- <td nowrap></td>
- <td>A</td>
- <td>R</td>
- <td>N</td>
- <td>D</td>
- <td>C</td>
- <td>Q</td>
- <td>E</td>
- <td>G</td>
- <td>H</td>
- <td>I</td>
- <td>L</td>
- <td>K</td>
- <td>M</td>
- <td>F</td>
- <td>P</td>
- <td>S</td>
- <td>T</td>
- <td>W</td>
- <td>Y</td>
- <td>V</td>
- <td>B</td>
- <td>X</td>
- <td>Z</td>
- </tr>
- <tr>
- <td height="24">Clustal</td>
- <td bgcolor="#80a0f0"></td>
- <td bgcolor="#f01505"></td>
- <td bgcolor="#00ff00"></td>
- <td bgcolor="#c048c0"></td>
- <td bgcolor="#f08080"></td>
- <td bgcolor="#00ff00"></td>
- <td bgcolor="#c048c0"></td>
- <td bgcolor="#f09048"></td>
- <td bgcolor="#15a4a4"></td>
- <td bgcolor="#80a0f0"></td>
- <td bgcolor="#80a0f0"></td>
- <td bgcolor="#f01505"></td>
- <td bgcolor="#80a0f0"></td>
- <td bgcolor="#80a0f0"></td>
- <td bgcolor="#ffff00"></td>
- <td bgcolor="#00ff00"></td>
- <td bgcolor="#00ff00"></td>
- <td bgcolor="#80a0f0"></td>
- <td bgcolor="#15a4a4"></td>
- <td bgcolor="#80a0f0"></td>
- <td></td>
- <td></td>
- <td></td>
- </tr>
- <tr>
- <td height="24">Zappo</td>
- <td bgcolor="#ffafaf"></td>
- <td bgcolor="#6464ff"></td>
- <td bgcolor="#00ff00"></td>
- <td bgcolor="#ff0000"></td>
- <td bgcolor="#ffff00"></td>
- <td bgcolor="#00ff00"></td>
- <td bgcolor="#ff0000"></td>
- <td bgcolor="#ff00ff"></td>
- <td bgcolor="#6464ff"></td>
- <td bgcolor="#ffafaf"></td>
- <td bgcolor="#ffafaf"></td>
- <td bgcolor="#6464ff"></td>
- <td bgcolor="#ffafaf"></td>
- <td bgcolor="#ffc800"></td>
- <td bgcolor="#ff00ff"></td>
- <td bgcolor="#00ff00"></td>
- <td bgcolor="#00ff00"></td>
- <td bgcolor="#ffc800"></td>
- <td bgcolor="#ffc800"></td>
- <td bgcolor="#ffafaf"></td>
- <td></td>
- <td></td>
- <td></td>
- </tr>
- <tr>
- <td>Taylor</td>
- <td bgcolor="#ccff00"></td>
- <td bgcolor="#0000ff"></td>
- <td bgcolor="#cc00ff"></td>
- <td bgcolor="#ff0000"></td>
- <td bgcolor="#ffff00"></td>
- <td bgcolor="#ff00cc"></td>
- <td bgcolor="#ff0066"></td>
- <td bgcolor="#ff9900"></td>
- <td bgcolor="#0066ff"></td>
- <td bgcolor="#66ff00"></td>
- <td bgcolor="#33ff00"></td>
- <td bgcolor="#6600ff"></td>
- <td bgcolor="#00ff00"></td>
- <td bgcolor="#00ff66"></td>
- <td bgcolor="#ffcc00"></td>
- <td bgcolor="#ff3300"></td>
- <td bgcolor="#ff6600"></td>
- <td bgcolor="#00ccff"></td>
- <td bgcolor="#00ffcc"></td>
- <td bgcolor="#99ff00"></td>
- <td></td>
- <td></td>
- <td></td>
- </tr>
- <tr>
- <td>Hydrophobicity</td>
- <td bgcolor="#ad0052"></td>
- <td bgcolor="#0000ff"></td>
- <td bgcolor="#0c00f3"></td>
- <td bgcolor="#0c00f3"></td>
- <td bgcolor="#c2003d"></td>
- <td bgcolor="#0c00f3"></td>
- <td bgcolor="#0c00f3"></td>
- <td bgcolor="#6a0095"></td>
- <td bgcolor="#1500ea"></td>
- <td bgcolor="#ff0000"></td>
- <td bgcolor="#ea0015"></td>
- <td bgcolor="#0000ff"></td>
- <td bgcolor="#b0004f"></td>
- <td bgcolor="#cb0034"></td>
- <td bgcolor="#4600b9"></td>
- <td bgcolor="#5e00a1"></td>
- <td bgcolor="#61009e"></td>
- <td bgcolor="#5b00a4"></td>
- <td bgcolor="#4f00b0"></td>
- <td bgcolor="#f60009"></td>
- <td bgcolor="#0c00f3"></td>
- <td bgcolor="#680097"></td>
- <td bgcolor="#0c00f3"></td>
- </tr>
- <tr>
- <td>Helix Propensity</td>
- <td bgcolor="#e718e7"></td>
- <td bgcolor="#6f906f"></td>
- <td bgcolor="#1be41b"></td>
- <td bgcolor="#778877"></td>
- <td bgcolor="#23dc23"></td>
- <td bgcolor="#926d92"></td>
- <td bgcolor="#ff00ff"></td>
- <td bgcolor="#00ff00"></td>
- <td bgcolor="#758a75"></td>
- <td bgcolor="#8a758a"></td>
- <td bgcolor="#ae51ae"></td>
- <td bgcolor="#a05fa0"></td>
- <td bgcolor="#ef10ef"></td>
- <td bgcolor="#986798"></td>
- <td bgcolor="#00ff00"></td>
- <td bgcolor="#36c936"></td>
- <td bgcolor="#47b847"></td>
- <td bgcolor="#8a758a"></td>
- <td bgcolor="#21de21"></td>
- <td bgcolor="#857a85"></td>
- <td bgcolor="#49b649"></td>
- <td bgcolor="#758a75"></td>
- <td bgcolor="#c936c9"></td>
- </tr>
- <tr>
- <td nowrap>Strand Propensity</td>
- <td bgcolor="#5858a7"></td>
- <td bgcolor="#6b6b94"></td>
- <td bgcolor="#64649b"></td>
- <td bgcolor="#2121de"></td>
- <td bgcolor="#9d9d62"></td>
- <td bgcolor="#8c8c73"></td>
- <td bgcolor="#0000ff"></td>
- <td bgcolor="#4949b6"></td>
- <td bgcolor="#60609f"></td>
- <td bgcolor="#ecec13"></td>
- <td bgcolor="#b2b24d"></td>
- <td bgcolor="#4747b8"></td>
- <td bgcolor="#82827d"></td>
- <td bgcolor="#c2c23d"></td>
- <td bgcolor="#2323dc"></td>
- <td bgcolor="#4949b6"></td>
- <td bgcolor="#9d9d62"></td>
- <td bgcolor="#c0c03f"></td>
- <td bgcolor="#d3d32c"></td>
- <td bgcolor="#ffff00"></td>
- <td bgcolor="#4343bc"></td>
- <td bgcolor="#797986"></td>
- <td bgcolor="#4747b8"></td>
- </tr>
- <tr>
- <td>Turn Propensity</td>
- <td bgcolor="#2cd3d3"></td>
- <td bgcolor="#708f8f"></td>
- <td bgcolor="#ff0000"></td>
- <td bgcolor="#e81717"></td>
- <td bgcolor="#a85757"></td>
- <td bgcolor="#3fc0c0"></td>
- <td bgcolor="#778888"></td>
- <td bgcolor="#ff0000"></td>
- <td bgcolor="#708f8f"></td>
- <td bgcolor="#00ffff"></td>
- <td bgcolor="#1ce3e3"></td>
- <td bgcolor="#7e8181"></td>
- <td bgcolor="#1ee1e1"></td>
- <td bgcolor="#1ee1e1"></td>
- <td bgcolor="#f60909"></td>
- <td bgcolor="#e11e1e"></td>
- <td bgcolor="#738c8c"></td>
- <td bgcolor="#738c8c"></td>
- <td bgcolor="#9d6262"></td>
- <td bgcolor="#07f8f8"></td>
- <td bgcolor="#f30c0c"></td>
- <td bgcolor="#7c8383"></td>
- <td bgcolor="#5ba4a4"></td>
- </tr>
- <tr>
- <td>Buried Index</td>
- <td bgcolor="#00a35c"></td>
- <td bgcolor="#00fc03"></td>
- <td bgcolor="#00eb14"></td>
- <td bgcolor="#00eb14"></td>
- <td bgcolor="#0000ff"></td>
- <td bgcolor="#00f10e"></td>
- <td bgcolor="#00f10e"></td>
- <td bgcolor="#009d62"></td>
- <td bgcolor="#00d52a"></td>
- <td bgcolor="#0054ab"></td>
- <td bgcolor="#007b84"></td>
- <td bgcolor="#00ff00"></td>
- <td bgcolor="#009768"></td>
- <td bgcolor="#008778"></td>
- <td bgcolor="#00e01f"></td>
- <td bgcolor="#00d52a"></td>
- <td bgcolor="#00db24"></td>
- <td bgcolor="#00a857"></td>
- <td bgcolor="#00e619"></td>
- <td bgcolor="#005fa0"></td>
- <td bgcolor="#00eb14"></td>
- <td bgcolor="#00b649"></td>
- <td bgcolor="#00f10e"></td>
- </tr>
- </table>
- </td>
- </tr>
- </table>
- <p> </p>
- <p>
- <strong>Nucleotide Colour Schemes</strong>
- </p>
- <table border="1">
- <tr>
- <td>
- <table border="1">
- <tr>
- <td nowrap></td>
- <td>A</td>
- <!--Adenine-->
- <td>C</td>
- <!--Cytosine-->
- <td>G</td>
- <!--Guanine-->
- <td>T</td>
- <!--Thymine-->
- <td>U</td>
- <!--Uracil-->
- <td>I</td>
- <!--Inosine-->
- <td>X</td>
- <!--Xanthine-->
- <td>R</td>
- <!--Unknown Purine-->
- <td>Y</td>
- <!--Unknown Pyrimidine-->
- <td>N</td>
- <!--Unknown-->
- <td>W</td>
- <!--Weak nucleotide (A or T)-->
- <td>S</td>
- <!--Strong nucleotide (G or C)-->
- <td>M</td>
- <!--Amino (A or C)-->
- <td>K</td>
- <!--Keto (G or T)-->
- <td>B</td>
- <!--Not A (G or C or T)-->
- <td>H</td>
- <!--Not G (A or C or T)-->
- <td>D</td>
- <!--Not C (A or G or T)-->
- <td>V</td>
- <!--Not T (A or G or C-->
- </tr>
- <tr>
- <td height="24">Nucleotide</td>
- <td bgcolor="#64F73F"></td>
- <td bgcolor="#FFB340"></td>
- <td bgcolor="#EB413C"></td>
- <td bgcolor="#3C88EE"></td>
- <td bgcolor="#3C88EE"></td>
- <td></td>
- <td></td>
- <td></td>
- <td></td>
- <td></td>
- <td></td>
- <td></td>
- <td></td>
- <td></td>
- <td></td>
- <td></td>
- <td></td>
- <td></td>
- </tr>
- <tr>
- <td height="24">Purine/Pyrimidine</td>
- <td bgcolor="#FF83FA"></td>
- <td bgcolor="#40E0D0"></td>
- <td bgcolor="#FF83FA"></td>
- <td bgcolor="#40E0D0"></td>
- <td bgcolor="#40E0D0"></td>
- <td></td>
- <td></td>
- <td bgcolor="#FF83FA"></td>
- <td bgcolor="#40E0D0"></td>
- <td></td>
- <td></td>
- <td></td>
- <td></td>
- <td></td>
- <td></td>
- <td></td>
- <td></td>
- <td></td>
- </tr>
- </table>
- </td>
- </tr>
- </table>
+ <p>
+ <strong>Dynamic colour schemes</strong>
+ </p>
+ <p>
+ Alignments and groups may be coloured according to <a
+ href="annotationColouring.html">associated sequence and alignment
+ annotation</a>. Any applied colour schemes (such as those shown in the
+ table below) can also be <a href="conservation.html">shaded by
+ amino acid physico-chemical property conservation</a> to reveal patterns
+ of variation, or applied selectively to <a href="abovePID.html">Above
+ Identity Threshold</a>.
+ </p>
+ <p>
+ Alignments and groups can also be shaded according to percentage
+ abundance of aligned residues (using <a href="pid.html">Percentage
+ Identity</a>), and for protein alignments, the <a href="blosum.html">BLOSUM
+ 62 Score</a> and <a href="clustal.html">ClustalX</a> shading schemes
+ highlight amino acid conservation.
+ </p>
+ <p>
+ The <strong>Sequence ID</strong> colour scheme shades sequences with
+ the same colour assigned to their Sequence ID. Colours are assigned
+ when groups are created by <a href="../calculations/treeviewer.html">partitioning
+ a tree</a> or subdividing the alignment by sequence with <strong>Select→Make
+ Groups For Selection</strong>.
+ </p>
+ <p>
+ <strong>Amino acid and Nucleotide based colour schemes</strong>
+ <p>The built-in colour schemes based on amino acid and nucleotide symbols are
+ summarised in the table below:
+
+ <div align="center"><p> </p>
+ <p>
+ <strong>Protein Colour Schemes</strong>
+ </p>
+ <table border="1">
+ <tr>
+ <td>
+ <table border="1">
+ <tr>
+ <td nowrap></td>
+ <td>A</td>
+ <td>R</td>
+ <td>N</td>
+ <td>D</td>
+ <td>C</td>
+ <td>Q</td>
+ <td>E</td>
+ <td>G</td>
+ <td>H</td>
+ <td>I</td>
+ <td>L</td>
+ <td>K</td>
+ <td>M</td>
+ <td>F</td>
+ <td>P</td>
+ <td>S</td>
+ <td>T</td>
+ <td>W</td>
+ <td>Y</td>
+ <td>V</td>
+ <td>B</td>
+ <td>X</td>
+ <td>Z</td>
+ </tr>
+ <tr>
+ <td height="24">Clustal</td>
+ <td bgcolor="#80a0f0"></td>
+ <td bgcolor="#f01505"></td>
+ <td bgcolor="#00ff00"></td>
+ <td bgcolor="#c048c0"></td>
+ <td bgcolor="#f08080"></td>
+ <td bgcolor="#00ff00"></td>
+ <td bgcolor="#c048c0"></td>
+ <td bgcolor="#f09048"></td>
+ <td bgcolor="#15a4a4"></td>
+ <td bgcolor="#80a0f0"></td>
+ <td bgcolor="#80a0f0"></td>
+ <td bgcolor="#f01505"></td>
+ <td bgcolor="#80a0f0"></td>
+ <td bgcolor="#80a0f0"></td>
+ <td bgcolor="#ffff00"></td>
+ <td bgcolor="#00ff00"></td>
+ <td bgcolor="#00ff00"></td>
+ <td bgcolor="#80a0f0"></td>
+ <td bgcolor="#15a4a4"></td>
+ <td bgcolor="#80a0f0"></td>
+ <td></td>
+ <td></td>
+ <td></td>
+ </tr>
+ <tr>
+ <td height="24">Zappo</td>
+ <td bgcolor="#ffafaf"></td>
+ <td bgcolor="#6464ff"></td>
+ <td bgcolor="#00ff00"></td>
+ <td bgcolor="#ff0000"></td>
+ <td bgcolor="#ffff00"></td>
+ <td bgcolor="#00ff00"></td>
+ <td bgcolor="#ff0000"></td>
+ <td bgcolor="#ff00ff"></td>
+ <td bgcolor="#6464ff"></td>
+ <td bgcolor="#ffafaf"></td>
+ <td bgcolor="#ffafaf"></td>
+ <td bgcolor="#6464ff"></td>
+ <td bgcolor="#ffafaf"></td>
+ <td bgcolor="#ffc800"></td>
+ <td bgcolor="#ff00ff"></td>
+ <td bgcolor="#00ff00"></td>
+ <td bgcolor="#00ff00"></td>
+ <td bgcolor="#ffc800"></td>
+ <td bgcolor="#ffc800"></td>
+ <td bgcolor="#ffafaf"></td>
+ <td></td>
+ <td></td>
+ <td></td>
+ </tr>
+ <tr>
+ <td>Taylor</td>
+ <td bgcolor="#ccff00"></td>
+ <td bgcolor="#0000ff"></td>
+ <td bgcolor="#cc00ff"></td>
+ <td bgcolor="#ff0000"></td>
+ <td bgcolor="#ffff00"></td>
+ <td bgcolor="#ff00cc"></td>
+ <td bgcolor="#ff0066"></td>
+ <td bgcolor="#ff9900"></td>
+ <td bgcolor="#0066ff"></td>
+ <td bgcolor="#66ff00"></td>
+ <td bgcolor="#33ff00"></td>
+ <td bgcolor="#6600ff"></td>
+ <td bgcolor="#00ff00"></td>
+ <td bgcolor="#00ff66"></td>
+ <td bgcolor="#ffcc00"></td>
+ <td bgcolor="#ff3300"></td>
+ <td bgcolor="#ff6600"></td>
+ <td bgcolor="#00ccff"></td>
+ <td bgcolor="#00ffcc"></td>
+ <td bgcolor="#99ff00"></td>
+ <td></td>
+ <td></td>
+ <td></td>
+ </tr>
+ <tr>
+ <td>Hydrophobicity</td>
+ <td bgcolor="#ad0052"></td>
+ <td bgcolor="#0000ff"></td>
+ <td bgcolor="#0c00f3"></td>
+ <td bgcolor="#0c00f3"></td>
+ <td bgcolor="#c2003d"></td>
+ <td bgcolor="#0c00f3"></td>
+ <td bgcolor="#0c00f3"></td>
+ <td bgcolor="#6a0095"></td>
+ <td bgcolor="#1500ea"></td>
+ <td bgcolor="#ff0000"></td>
+ <td bgcolor="#ea0015"></td>
+ <td bgcolor="#0000ff"></td>
+ <td bgcolor="#b0004f"></td>
+ <td bgcolor="#cb0034"></td>
+ <td bgcolor="#4600b9"></td>
+ <td bgcolor="#5e00a1"></td>
+ <td bgcolor="#61009e"></td>
+ <td bgcolor="#5b00a4"></td>
+ <td bgcolor="#4f00b0"></td>
+ <td bgcolor="#f60009"></td>
+ <td bgcolor="#0c00f3"></td>
+ <td bgcolor="#680097"></td>
+ <td bgcolor="#0c00f3"></td>
+ </tr>
+ <tr>
+ <td>Helix Propensity</td>
+ <td bgcolor="#e718e7"></td>
+ <td bgcolor="#6f906f"></td>
+ <td bgcolor="#1be41b"></td>
+ <td bgcolor="#778877"></td>
+ <td bgcolor="#23dc23"></td>
+ <td bgcolor="#926d92"></td>
+ <td bgcolor="#ff00ff"></td>
+ <td bgcolor="#00ff00"></td>
+ <td bgcolor="#758a75"></td>
+ <td bgcolor="#8a758a"></td>
+ <td bgcolor="#ae51ae"></td>
+ <td bgcolor="#a05fa0"></td>
+ <td bgcolor="#ef10ef"></td>
+ <td bgcolor="#986798"></td>
+ <td bgcolor="#00ff00"></td>
+ <td bgcolor="#36c936"></td>
+ <td bgcolor="#47b847"></td>
+ <td bgcolor="#8a758a"></td>
+ <td bgcolor="#21de21"></td>
+ <td bgcolor="#857a85"></td>
+ <td bgcolor="#49b649"></td>
+ <td bgcolor="#758a75"></td>
+ <td bgcolor="#c936c9"></td>
+ </tr>
+ <tr>
+ <td nowrap>Strand Propensity</td>
+ <td bgcolor="#5858a7"></td>
+ <td bgcolor="#6b6b94"></td>
+ <td bgcolor="#64649b"></td>
+ <td bgcolor="#2121de"></td>
+ <td bgcolor="#9d9d62"></td>
+ <td bgcolor="#8c8c73"></td>
+ <td bgcolor="#0000ff"></td>
+ <td bgcolor="#4949b6"></td>
+ <td bgcolor="#60609f"></td>
+ <td bgcolor="#ecec13"></td>
+ <td bgcolor="#b2b24d"></td>
+ <td bgcolor="#4747b8"></td>
+ <td bgcolor="#82827d"></td>
+ <td bgcolor="#c2c23d"></td>
+ <td bgcolor="#2323dc"></td>
+ <td bgcolor="#4949b6"></td>
+ <td bgcolor="#9d9d62"></td>
+ <td bgcolor="#c0c03f"></td>
+ <td bgcolor="#d3d32c"></td>
+ <td bgcolor="#ffff00"></td>
+ <td bgcolor="#4343bc"></td>
+ <td bgcolor="#797986"></td>
+ <td bgcolor="#4747b8"></td>
+ </tr>
+ <tr>
+ <td>Turn Propensity</td>
+ <td bgcolor="#2cd3d3"></td>
+ <td bgcolor="#708f8f"></td>
+ <td bgcolor="#ff0000"></td>
+ <td bgcolor="#e81717"></td>
+ <td bgcolor="#a85757"></td>
+ <td bgcolor="#3fc0c0"></td>
+ <td bgcolor="#778888"></td>
+ <td bgcolor="#ff0000"></td>
+ <td bgcolor="#708f8f"></td>
+ <td bgcolor="#00ffff"></td>
+ <td bgcolor="#1ce3e3"></td>
+ <td bgcolor="#7e8181"></td>
+ <td bgcolor="#1ee1e1"></td>
+ <td bgcolor="#1ee1e1"></td>
+ <td bgcolor="#f60909"></td>
+ <td bgcolor="#e11e1e"></td>
+ <td bgcolor="#738c8c"></td>
+ <td bgcolor="#738c8c"></td>
+ <td bgcolor="#9d6262"></td>
+ <td bgcolor="#07f8f8"></td>
+ <td bgcolor="#f30c0c"></td>
+ <td bgcolor="#7c8383"></td>
+ <td bgcolor="#5ba4a4"></td>
+ </tr>
+ <tr>
+ <td>Buried Index</td>
+ <td bgcolor="#00a35c"></td>
+ <td bgcolor="#00fc03"></td>
+ <td bgcolor="#00eb14"></td>
+ <td bgcolor="#00eb14"></td>
+ <td bgcolor="#0000ff"></td>
+ <td bgcolor="#00f10e"></td>
+ <td bgcolor="#00f10e"></td>
+ <td bgcolor="#009d62"></td>
+ <td bgcolor="#00d52a"></td>
+ <td bgcolor="#0054ab"></td>
+ <td bgcolor="#007b84"></td>
+ <td bgcolor="#00ff00"></td>
+ <td bgcolor="#009768"></td>
+ <td bgcolor="#008778"></td>
+ <td bgcolor="#00e01f"></td>
+ <td bgcolor="#00d52a"></td>
+ <td bgcolor="#00db24"></td>
+ <td bgcolor="#00a857"></td>
+ <td bgcolor="#00e619"></td>
+ <td bgcolor="#005fa0"></td>
+ <td bgcolor="#00eb14"></td>
+ <td bgcolor="#00b649"></td>
+ <td bgcolor="#00f10e"></td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+ </table>
+ <p> </p>
+ <p>
+ <strong>Nucleotide Colour Schemes</strong>
+ </p>
+ <table border="1">
+ <tr>
+ <td>
+ <table border="1">
+ <tr>
+ <td nowrap></td>
+ <td>A</td>
+ <!--Adenine-->
+ <td>C</td>
+ <!--Cytosine-->
+ <td>G</td>
+ <!--Guanine-->
+ <td>T</td>
+ <!--Thymine-->
+ <td>U</td>
+ <!--Uracil-->
+ <td>I</td>
+ <!--Inosine-->
+ <td>X</td>
+ <!--Xanthine-->
+ <td>R</td>
+ <!--Unknown Purine-->
+ <td>Y</td>
+ <!--Unknown Pyrimidine-->
+ <td>N</td>
+ <!--Unknown-->
+ <td>W</td>
+ <!--Weak nucleotide (A or T)-->
+ <td>S</td>
+ <!--Strong nucleotide (G or C)-->
+ <td>M</td>
+ <!--Amino (A or C)-->
+ <td>K</td>
+ <!--Keto (G or T)-->
+ <td>B</td>
+ <!--Not A (G or C or T)-->
+ <td>H</td>
+ <!--Not G (A or C or T)-->
+ <td>D</td>
+ <!--Not C (A or G or T)-->
+ <td>V</td>
+ <!--Not T (A or G or C-->
+ </tr>
+ <tr>
+ <td height="24">Nucleotide</td>
+ <td bgcolor="#64F73F"></td>
+ <td bgcolor="#FFB340"></td>
+ <td bgcolor="#EB413C"></td>
+ <td bgcolor="#3C88EE"></td>
+ <td bgcolor="#3C88EE"></td>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td></td>
+ </tr>
+ <tr>
+ <td height="24">Purine/Pyrimidine</td>
+ <td bgcolor="#FF83FA"></td>
+ <td bgcolor="#40E0D0"></td>
+ <td bgcolor="#FF83FA"></td>
+ <td bgcolor="#40E0D0"></td>
+ <td bgcolor="#40E0D0"></td>
+ <td></td>
+ <td></td>
+ <td bgcolor="#FF83FA"></td>
+ <td bgcolor="#40E0D0"></td>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td></td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+ </table>
- </div>
- <p align="center"> </p>
+ </div>
+ <p align="center"> </p>
</body>
</html>
<body>
<p>
- <strong>Sequence feature colour schemes</strong>
- </p>
- <p>
- Jalview can visualize annotation present on parts of a sequence by
- overlaying colours according to the annotation present at each
- position. It allows features to be colored either according to type,
- or for a particular type, according to an individual feature's
- associated label or score. The <a href="featuresettings.html">Feature
- Settings dialog box</a> controls the order and display of each
- sequence annotation type, and also allows the colour scheme used for
- the the feature to be changed <em>via</em> the 'Graduated Colour'
- option in the sequence feature pop-up menu (obtained by
- right-clicking on a sequence feature).
+ <strong>Visualisation of Sequence Features</strong>
</p>
+ <p>Jalview can visualize sequence features - the positional
+ annotation present on parts of a sequence, as colours overlaid on
+ corresponding positions in the alignment. Features may be coloured
+ either according to their type, or for a particular type, according to
+ each feature's associated label, score, or other attributes.</p>
+ <p>
+ The <a href="featuresettings.html">Feature Settings dialog box</a>
+ controls the order and display of each feature type, and
+ also allows filters and colour schemes to be configured.
+ </p>
- <center>
- <img src="featurecoloursettings.gif"><br />Graduated feature
- colour scheme settings dialog box</img>
- </center>
- <p>The Graduated Feature Colour dialog box has the following
- controls:
- <ul>
- <li><em>Colour by Label</em> - when checked this derives a
- colour for each feature based on the label text.</li>
- <li><em>Min and Max Color boxes</em> - Click on these boxes to
- set the minimum and maximum colours used to shade features by
- their associated score.</li>
- <li><em>Threshold type combo box</em> - Allows features to be
- hidden features if their score is below or above a given
- threshold.<br /> <em>Set the threshold using the slider or
- type it in to the text box. The threshold cannot be set outside
- the available range of feature scores.</em></li>
- <li><em>Threshold is Min/Max</em> - When checked, the threshold
- will be used as the upper or lower limit when shading the features
- according to their score using the Min and Max colour.</li>
- </ul>
- </p>
- <p>
- <strong>Icon styles for graduated feature styles</strong><br />
- <p>
- When a graduated colourscheme is applied to a feature, it is
- indicated in the feature settings or amend feature dialog box by the
- following types of icon:<br />
- <center>
- <table width="50%" border="1">
- <tr>
- <td><strong>Type of Colouring</strong></td>
- <td><strong>Icon</strong></td>
- </tr>
- <tr>
- <td><em>Graduated colour by Feature Score</em></td>
- <td><img src="fcsminmax.gif" /></td>
- </tr>
- <tr>
- <td><em>Graduated colour thresholded (less than) by
- feature Score</em></td>
- <td><img src="fcsltthan.gif" /></td>
- </tr>
- <tr>
- <td><em>Graduated colour thresholded (greater than) by
- feature Score</em></td>
- <td><img src="fcsgtthan.gif" /></td>
- </tr>
- <tr>
- <td><em>Colour by Feature Label (may also be
- thresholded)</em></td>
- <td><img src="fcsntlabel.gif" /></td>
- </tr>
- <tr>
- <td align="center" colspan="2"><em> <strong>The
- current threshold is given in the icon's tooltip.</strong>
- </em></td>
- </tr>
- </table>
- </center>
- </p>
- <em>Graduated feature colours were introduced in Jalview 2.5</em>
+
+ <div align="center">
+ <img src="featureDisplaySettings.png" /><br />
+ <em>Feature Display Settings dialog for 'sequence_variant'
+ features imported from VCF</em>
+ </div>
+ <p>The Feature Display Settings has the following controls:
+ <p><strong>Colour</strong></p>
+ <ul>
+ <li><em>Simple Colour</em> - select this to assign a given colour
+ to any features of this type. The assigned colour can be changed by
+ clicking on the colour box.</li>
+ <li><em>Colour by text</em> - this option derives a colour for
+ each feature based on its label, or any other attributes presented <em>via</em>
+ the drop-down menu.</li>
+ <li><em>Graduated Colour</em> - shade features according to
+ associated score, or other numeric attribute.
+ <ul>
+ <li><em>Min and Max Color boxes</em> - Click on these boxes to
+ set the minimum and maximum colours for the shading scheme.</li>
+ <li><em>Threshold type combo box</em> - Specify an exclusion
+ threshold.<br />Set the threshold using the slider or
+ type it in to the text box. The threshold cannot be set outside
+ the available range of values observed for the selected attribute.</li>
+ <li><em>Threshold is Min/Max</em> - When checked, the threshold
+ will be used as the upper or lower limit for shading using the Min
+ and Max colour.</li>
+ </ul></li>
+ </ul>
+ <p>
+ <strong><em>Filters</em></strong><br /> Any number of filter
+ conditions may be specified to select features based on one or more
+ attributes. The <strong>join</strong> condition specifies whether all
+ filters must apply (<strong><em>And</em></strong>) or whether any one
+ filter must apply (<strong><em>Or</em></strong>) for a feature to be
+ selected.
+ </p>
+ <p>The filters available depend on the type of attribute:</p>
+ <ul>
+ <li><strong>Numeric</strong> - specify a threshold above, equal
+ to or below which a feature will be selected or ignored.</li>
+ <li><strong>String</strong> - select or ignore features based on
+ presence, absence, equivalence, or containment of a string.</li>
+ </ul>
+ <p>
+ The filters and colour schemes active for a particular feature type
+ are shown in the <em>Colour</em> and <em>Configuration</em> columns in
+ the feature settings dialog. Styles and filters can be saved as a
+ Jalview Feature Colours file, and are also exported and imported via <a
+ href="featuresFormat.html">Jalview Feature files</a>.
+
+ <p>
+ <strong>Icon styles for feature rendering styles</strong><br />
+
+ <p>
+ When a graduated colour scheme is applied to a feature according to
+ the value of a particular attribute, it is indicated in the feature
+ settings or amend feature dialog box by the following types of icon:<br />
+
+ <div align="center">
+ <table width="50%" border="1">
+ <tr>
+ <td><strong>Type of Colouring</strong></td>
+ <td><strong>Icon</strong></td>
+ </tr>
+ <tr>
+ <td><em>Graduated colour by Feature Score</em></td>
+ <td><img src="fcsminmax.gif" /></td>
+ </tr>
+ <tr>
+ <td><em>Graduated colour thresholded (less than) by
+ feature Score</em></td>
+ <td><img src="fcsltthan.gif" /></td>
+ </tr>
+ <tr>
+ <td><em>Graduated colour thresholded (greater than) by
+ feature Score</em></td>
+ <td><img src="fcsgtthan.gif" /></td>
+ </tr>
+ <tr>
+ <td><em>Colour by Feature Label (may also be thresholded)</em></td>
+ <td><img src="fcsntlabel.gif" /></td>
+ </tr>
+ <tr>
+ <td align="center" colspan="2"><em> <strong>The
+ current threshold and attribute is given in the icon's tooltip.</strong>
+ </em></td>
+ </tr>
+ </table>
+ </div>
+ </p>
+ <em>Graduated feature colours were introduced in Jalview 2.5.
+ Attribute based colouring and filters were added in Jalview 2.11.</em>
</body>
</html>
<p>
<strong>Sequence Feature Settings Dialog Box</strong>
</p>
+ <p>
+ Select <strong>View→Feature Settings...</strong> in an alignment
+ window to open the feature settings dialog box, which allows
+ precise control the visibility and appearance of sequence features for
+ an alignment view.
+ </p>
+ <div align="center">
+ <img src="featureSettings.png" width="400"> <br/>
+ Sequence Feature Settings for the Jalview Application (version 2.11)
+ </div>
+ <p>The top section of the dialog box lists all the sequence feature
+ groups, along with a tickbox for each that controls whether its
+ features are displayed. When many groups are present, their names may
+ be truncated, but the full name be shown in a tooltip when the mouse
+ hovers over their checkbox.</p>
+ <p><em>Feature colour schemes and filters</em>
+ <p>
+ The table in the middle lists all the feature types in the currently
+ selected groups, along with their display style, any configured
+ filters, and a tickbox indicating whether the type is enabled for
+ display.</p><p>Features may be highlighted with either a single colour or a <a
+ href="featureschemes.html">feature colourscheme</a> based on
+ either the scores associated with that feature or from the feature's
+ description (e.g. to distinguish different names associated with a
+ DOMAIN feature).The colour used for a feature can
+ be changed by clicking on its <strong><em>colour box</em></strong>. To configure the shading
+ style or filter for a feature, click its <strong><em>configuration</em></strong> box.
+ </p>
+ <p>
+ <em>Feature settings pop-up menu</em><br> <strong>Right-click</strong>
+ on a feature to open a pop-up menu that allows you to
+ <ul>
+ <li>Hide, show and select columns containing that feature</li>
+ <li>Sort the alignment or current selection according to count or score for that feature
+ type (see below)</li>
+ </ul>
+
+ <p>
+ <strong>Transparency and Feature Ordering</strong>
+ </p>
+ <p>Sequence features represent a variety of different types of
+ positional annotation, and often overlap. For example, a metal binding
+ site feature may be attached to one position along a stretch of
+ sequence marked with a secondary structure feature.</p>
+ <p>
+ The ordering of the sequence features in the dialog box list is the
+ order used by Jalview for rendering sequence features. A feature at
+ the bottom of the list is rendered <em>below</em> a feature higher
+ up in the list.<br> <em><strong>You can change
+ the order of a feature by dragging it up and down the list with
+ the mouse.</strong></em>
+ </p>
+ <p>
+ Use the <strong><em>Optimise order</em></strong> button to adjust the
+ feature render ordering to place features that on average cover shorter regions
+ of sequence above features annotating longer regions.
+ </p>
+ <p><a name="transparency"></a>
+ The <strong><em>transparency slider</em></strong> controls
+ the visibility of features rendered below other features. Reducing
+ the transparency will mean that features at the top of the list can
+ obscure features lower down, and increasing it allows the user to
+ 'see through' the upper layers of a set of features.
+ </p>
<p>
- Select <strong>View→Feature Settings...</strong> menu entry in
- an alignment window to open the feature settings dialog box, which
- allows you to precisely control the presence and appearance of
- sequence features for the current alignment.
+ <strong><em>You can save all features, with their
+ current colours and visibility in a Jalview format file. </em></strong>
</p>
- <center>
- <img src="featureSettings.gif" width="400" height="452"> <br>
- Sequence Feature Settings for the Jalview Application</img>
- </center>
<p>
- The top section of the dialog box lists all the sequence feature
- groups, along with a tickbox for each that controls whether its
- features are displayed. The table in the middle lists all the
- features in the currently selected groups, along with their display
- style and whether they are currently being displayed (only the
- ticked features and groups are displayed). <strong><em>You
- can change the colour or shading style used for a feature in the
- associated alignment by clicking on its colour box.</em></strong>
+ <a name="selectbyfeature"><strong>Selecting alignment
+ columns by feature</strong></a>
</p>
<p>
- <a name="selectbyfeature"><strong><em>Selecting
- alignment columns by feature</em></strong></a><br> <strong>Double-clicking
- a feature type</strong> in the <strong>Feature Settings</strong> dialog
- allows you to select columns in the alignment that contain (or do
- not contain) features of that type. If a region of the alignment is
- currently selected, then only features in the current selection will
- be searched. The following keys affect the way in which selections
- are made:
- <ul>
+ Double-clicking a <strong>feature type</strong> in the <strong>Feature
+ Settings</strong> dialog allows you to select columns in the
+ alignment that contain (or do not contain) features of that type that
+ are currently visible (e.g. not filtered out or otherwise excluded due
+ to an applied colour scheme threshold). If a region of the alignment
+ is currently selected, then only features in the current selection
+ will be searched. The following keys affect the way in which
+ selections are made:<ul>
<li>Hold down <strong>Alt</strong> to select columns not
containing features of a particular type.
</li>
<em>Select columns by feature was added in Jalview 2.8.1</em>
</p>
<p>
- <strong><em>Feature settings pop-up menu</em></strong><br> <strong>Right-click</strong>
- on a feature to open a pop-up menu that allows you to
- <ul>
- <li>Hide, show and select columns containing that feature</li>
- <li>Sort the alignment or current selection using that feature
- type (see below)</li>
- <li>Toggle the type of colouring used for the feature</li>
- </ul>
- <p>
- Features may be highlighted with either a single colour or a <a
- href="featureschemes.html">feature colourscheme</a> based on
- either the scores associated with that feature or from the feature's
- description (e.g. to distinguish different names associated with a
- DOMAIN feature).
- </p>
- <p>
<strong><a name="sortbyfeature">Ordering alignment by
- features</a></strong><br> The 'Seq Sort by Score' and 'Seq Sort by
+ features</a></strong></p><p>The 'Seq Sort by Score' and 'Seq Sort by
Density' buttons will sort the alignment based on the average score
or total number of currently active features and groups on each
sequence. To order the alignment using a specific feature type, use
introduced in Jalview 2.5</em>
</p>
- <p>
- <strong>Transparency and Feature Ordering</strong>
- </p>
- <p>It is important to realise that sequence features are often not
- distinct and often overlap (for example, a metal binding site
- feature may be attached to one position along a stretch of sequence
- marked with a secondary structure feature).</p>
- <p>
- The ordering of the sequence features in the dialog box list is the
- order used by Jalview for rendering sequence features. A feature at
- the bottom of the list is rendered <em>below</em> a feature higher
- up in the list.<br> <em><strong>You can change
- the order of a feature by dragging it up and down the list with
- the mouse (not applet)</strong></em>.
- </p>
- <p>
- The <strong><em>Optimise order</em></strong> button (currently only
- available in the application) will re-order the feature render
- ordering based on the average length of each feature type.
- </p>
- <p><a name="transparency"></a>
- The <strong><em>transparency slider setting</em></strong> controls
- the visibility of features rendered below other features. Reducing
- the transparency will mean that features at the top of the list can
- obscure features lower down, and increasing it allows the user to
- 'see through' the upper layers of a set of features.
- </p>
- <p>
- <strong><em>You can save all features, with their
- current colours and visibility in a Jalview format file. </em></strong>
- </p>
</body>
</html>
--- /dev/null
+<html>
+<!--
+ * Jalview - A Sequence Alignment Editor and Viewer ($$Version-Rel$$)
+ * Copyright (C) $$Year-Rel$$ The Jalview Authors
+ *
+ * This file is part of Jalview.
+ *
+ * Jalview is free software: you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation, either version 3
+ * of the License, or (at your option) any later version.
+ *
+ * Jalview is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty
+ * of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+ * PURPOSE. See the GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Jalview. If not, see <http://www.gnu.org/licenses/>.
+ * The Jalview Authors are detailed in the 'AUTHORS' file.
+ -->
+<head>
+<title>Importing Variants from VCF</title>
+</head>
+<body>
+ <p>
+ <strong>Importing Genomic Variants from VCF</strong>
+ </p>
+
+ <p>Jalview can annotate nucleotide sequences associated with
+ genomic loci with features representing variants imported from VCF
+ files. This new feature in Jalview 2.11, is currently tuned to work
+ best with tab indexed VCF files produced by the GATK Variant
+ Annotation Pipeline (with or without annotation provided by the
+ Ensembl Variant Effect Predictor), but other sources of VCF files
+ should also work.</p>
+ <p>
+ If your sequences have genomic loci, then a <strong>Taxon
+ name</strong> and <strong>chromosome location</strong> should be shown in
+ the Sequence Details report and the Sequence ID tooltip (providing
+ you have enabled it via the submenu in the <em><strong>View</strong></em>
+ menu). Jalview matches the assembly information provided in the VCF
+ file to the taxon name, using an internal lookup table. If a match
+ is found, Jalview employs the Ensembl API's lift-over services to
+ locate your sequences' loci in the VCF file assembly's reference
+ frame. If all goes well, after loading a VCF, Jalview will report
+ the number of variants added as sequence features via the alignment
+ window's status bar. These are added by default when loci are
+ retrieved from Ensembl.
+ </p>
+ <p>
+ <strong>Working with variants from organisms other than
+ H.sapiens.</strong>
+ </p>
+ <ol>
+ <li>Look in your VCF file to identify keywords in the
+ ##reference header that define what species and assembly name the
+ VCF was generated against.</li>
+ <li>Look at ensembl.org to identify the species' short name,
+ and the assembly's unique.</li>
+ <li>Add mappings to the <strong>VCF_SPECIES</strong> and <strong>VCF_ASSEMBLY</strong>
+ properties in your .jalview_properties file. For example:<pre>
+VCF_SPECIES=1000genomes=homo_sapiens,c_elegans=celegans
+VCF_ASSEMBLY=assembly19=GRCh37,hs37=GRCh37</pre><br /> <br />These allow
+ annotations to be mapped from both Human 1000genomes VCF files and
+ C.elegans files.
+ </li>
+ </ol>
+ <strong>Work in Progress!</strong>
+ <p>VCF support in Jalview is under active development. Please get
+ in touch via our mailing list if you have any questions, problems or
+ otherwise find it useful !</p>
+</body>
+</html>
annotations</a>.
</em></li>
<li><strong>Load VCF File<br>
- </strong><em>Load VCF annotations from a plain text or tab-indexed file.
- <br>This option is offered for nucleotide alignments, and requires at least one
- sequence to have known genomic coordinates.
- <br>Genomic coordinates are attached to entries retrieved from Ensembl.
- <br>Support for VCF was added in Jalview 2.11.
- </em></li>
+ </strong><em><a href="../features/importvcf.html">Load VCF annotations</a> from a plain text, or indexed file (.csi,.tsi).
+ <br>Only available for nucleotide alignments, and requires at least one
+ sequence to have known genomic coordinates.</em></li>
<li><strong>Close (Control W)</strong><br> <em>Close
the alignment window. Make sure you have saved your alignment
before you close - either as a Jalview project or by using the <strong>Save
</tr>
<tr>
<td width="60" align="center" nowrap>
- <strong><a name="Jalview.2.11">2.11</a><br />
- <em>20/06/2019</em></strong>
+ <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
+ </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
+ Rings' GetDown</a>)
+ </li>
+ <li>
+ <!-- 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
+ </li>
+ <li>
+ <!-- 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>
<li>
<!-- JAL-2620 -->Alternative genetic code tables for
'Translate as cDNA'</li>
<!-- 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-2808,JAL-2069 -->Sequence features can be filtered and
- shaded according to any associated attributes (e.g. variant
- attributes from VCF file, or key-value pairs imported from
- column 9 of GFF file)
+ <!-- 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
+ file, or key-value pairs imported from column 9 of GFF
+ file)
+ </li>
+ <li>
+ <!-- JAL-2879 -->Feature Attributes and shading schemes
+ stored and restored from Jalview Projects
+ </li>
+ <li>
+ <!-- JAL-3334 -->Use full Sequence Ontology (via BioJava) to
+ recognise variant features
</li>
<li>
- <!-- JAL-2897 -->Show synonymous codon variants on peptide
- sequences
+ <!-- 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
</li>
<li>
- <!-- JAL-3139,JAL-2816 -->More efficient sequence feature render
+ <!-- JAL-3139,JAL-2816,JAL-1117 -->More efficient sequence feature render
algorithm (Z-sort/transparency and filter aware)
</li>
<li>
</ul>
</li>
<li>
- <!-- JAL-3141 -->Backup files created when saving Jalview project
- or alignment files
- </li>
- <li><strong>Principal Components Analysis Viewer</strong>
+ <!-- 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
</li>
- <li>'Change parameters' option removed from viewer's
+ <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
</li>
<li>
- <!-- JAL-2965 -->PCA plot is depth cued
+ <!-- JAL-2965, JAL-1285 -->PCA plot is depth cued
</li>
</ul>
</li>
<li><strong>Speed and Efficiency</strong>
<ul>
<li>
- <!-- JAL-3198 -->More efficient creation of selections and
+ <!-- JAL-2185,JAL-3198 -->More efficient creation of selections and
multiple groups when working with large alignments
</li>
<li>
view
</li>
<li>
- <!-- JAL-2527 -->Alignment Overview now WYSIWIS (What you see is
+ <!-- JAL-2527 JAL-3203 -->Alignment Overview now WYSIWIS (What you see is
what is shown)<br />Only visible region of alignment is shown by
default (can be changed in user preferences)
</li>
when in wrapped mode
</li>
<li>
- <!-- JAL-3073 -->Can select columns by dragging left/right in
- annotations
+ <!-- JAL-3073 -->Can select columns by dragging left/right in a graph or histogram
+ annotation
</li>
<li>
- <!-- JAL-2814 -->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
popup menu
</li>
<li>
- <!-- JAL-3021 -->Sequence Details report opens positioned to top
- of report
- </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>
+
+
</ul></li>
- <li><strong>Java 11 Support</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>
- <!-- JAL- -->Java 11 Native Desktop installer, standalone JAR
- and getdown release channels
- </li>
- <li>
<!-- -->OSX GUI integrations for App menu's 'About' entry and
trapping CMD-Q
</li>
<!-- JAL-3035 -->DAS sequence retrieval and annotation
capabilities removed from the Jalview Desktop
</li>
- <li><!-- -->Jalview Desktop no longer distributed via Java Web Start</li>
- </ul>
- <em>Development and Release Processes</em>
- <ul>
- <li>
- <!-- JAL-3196,JAL-3007 -->Jalview Native Application and
- Installers built with Install4j (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
- Rings' GetDown</a>)
- </li>
- <li>
- <!-- JAL-3196,JAL-3179 -->Build system migrated from Ant to Gradle
- </li>
- <li>
- <!-- JAL-3225 -->Eclipse project configuration managed with
- gradle-eclipse
- </li>
- <li>
- Atlassian Bamboo continuous integration server for
- unattended Test Suite execution</li>
- <li>
- <!-- JAL-2864 -->Memory test suite to detect leaks in common
- operations</li>
- <li>
- <!-- JAL-3140 -->IntervalStoreJ (new updatable NCList
- implementation) used for Sequence Feature collections</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>
- </ul>
- </td>
- <td align="left" valign="top">
+ <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>
+ <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
+ </li>
+ <li><!-- JAL-1424 -->Enhanced checks for missing and duplicated keys in Message bundles</li>
<li>
- <!-- JAL-3143 -->Timeouts when retrieving data from Ensembl</li>
- <li>
- <!-- JAL-3244 -->'View [Structure] Mappings' and structure superposition in Jmol fail on Windows</li>
- <li>
- <!-- 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</li>
- <li>
- <!-- JAL-3164 -->Overview for complementary view in a linked
- CDS/Protein alignment is not updated when Hide Columns by
- 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</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</li>
- <li>
- <!-- JAL-2865 -->Jalview hangs when closing windows
- or the overview updates 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</li>
- <li>
- <!-- 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</li>
- <li>
- <!-- JAL-3178 -->Nonpositional features lose feature group
- on export as Jalview features file</li>
- <li>
- <!-- 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</li>
- <li>
- <!-- 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</li>
- <li>
- <!-- JAL-3002 -->Column display is out by one after Page Down, Page Up in wrapped mode</li>
- <li>
- <!-- JAL-2839 -->Finder doesn't skip hidden regions</li>
- <li>
- <!-- JAL-2932 -->Finder searches in minimised alignments</li>
- <li>
- <!-- 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</li>
- <li>
- <!-- 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</li>
- <li>
- <!-- JAL-3206 -->Colour by Annotation can go black at min/max threshold limit</li>
- <li>
- <!-- JAL-3125 -->Value input for graduated feature colour threshold gets 'unrounded'</li>
- <li>
- <!-- JAL-2982 -->PCA image export doesn't respect background colour</li>
- <li>
- <!-- JAL-2963 -->PCA points don't dim when rotated about y axis</li>
+ <!-- JAL-3225 -->Eclipse project configuration managed with
+ gradle-eclipse
+ </li>
<li>
- <!-- JAL-2959 -->PCA Print dialog continues after Cancel</li>
+ <!-- JAL-3174,JAL-2886,JAL-2729,JAL-1889 --> Atlassian
+ Bamboo continuous integration for unattended Test Suite
+ execution
+ </li>
<li>
- <!-- JAL-3078 -->Cancel in Tree Font dialog resets alignment, not Tree font</li>
+ <!-- JAL-2864 -->Memory test suite to detect leaks in common
+ operations
+ </li>
<li>
- <!-- JAL-2964 -->Associate Tree with All Views not restored from project file</li>
+ <!-- JAL-2360,JAL-2416 -->More unit test coverage, and minor
+ issues resolved.
+ </li>
<li>
- <!-- JAL-2915 -->Scrolling of split frame is sluggish if Overview shown in complementary view</li>
+ <!-- JAL-3248 -->Developer documentation migrated to
+ markdown (with HTML rendering)
+ </li>
<li>
- <!-- JAL-2898 -->stop_gained variants not shown correctly on peptide sequence</li>
+ <!-- JAL-3287 -->HelpLinksChecker runs on Windows
+ </li>
<li>
- <!-- JAL-914 -->Help page can be opened twice</li>
- </ul>
- <em>Editing</em>
- <ul>
+ <!-- JAL-3289 -->New URLs for publishing development
+ versions of Jalview
+ </li>
<li>
- <!-- 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 -->Delete/Cut selection doesn't relocate
- sequence features correctly when start of sequence is
- removed (Known defect since 2.10)</li>
</ul>
- <em>New Known Defects</em>
- <ul>
- <li>
- <!-- JAL-2647 -->Input Data menu entry is greyed out when PCA View is restored from a Jalview 2.11 project</li>
+ </td>
+ <td align="left" valign="top">
+ <ul>
+ <li>
+ <!-- JAL-3143 -->Timeouts when retrieving data from Ensembl
+ </li>
+ <li>
+ <!-- JAL-3244 -->'View [Structure] Mappings' and structure
+ 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
+ </li>
+ <li>
+ <!-- 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
+ </li>
+ <li>
+ <!-- JAL-3164 -->Overview for complementary view in a linked
+ CDS/Protein alignment is not updated when Hide Columns by
+ 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
+ </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
+ </li>
+ <li>
+ <!-- JAL-2865 -->Jalview hangs when closing windows or the
+ overview updates 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
+ </li>
+ <li>
+ <!-- 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
+ </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
+ </li>
<li>
- <!-- JAL-3213 -->Alignment panel height can be too small after 'New View'</li>
+ <!-- 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 if feature score is Float.NaN)
+ </li>
+ <li>
+ <!-- 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
+ </li>
+ <li>
+ <!-- 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
+ </li>
+ <li>
+ <!-- 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
+ </li>
+ <li>
+ <!-- JAL-2932 -->Finder searches in minimised alignments
+ </li>
+ <li>
+ <!-- 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
+ </li>
+ <li>
+ <!-- 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
+ </li>
+ <li>
+ <!-- JAL-3206 -->Colour by Annotation can go black at min/max
+ threshold limit
+ </li>
+ <li>
+ <!-- JAL-3125 -->Value input for graduated feature colour
+ threshold gets 'unrounded'
+ </li>
+ <li>
+ <!-- JAL-2982 -->PCA image export doesn't respect background
+ colour
+ </li>
+ <li>
+ <!-- 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
+ </li>
+ <li>
+ <!-- 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
+ </li>
+ <li>
+ <!-- JAL-3313 -->Codon consensus incorrectly scaled when shown
+ without normalisation
+ </li>
+ <li>
+ <!-- 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
+ </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
+ </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)
+ </li>
+ <li>
+ <!-- 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)
+ </li>
+ </ul>
+ <em>Datamodel</em>
+ <ul>
+ <li>
+ <!-- JAL-2986 -->Sequence.findIndex returns wrong value when
+ sequence's End is greater than its length
+ </li>
+ <li><strong>Bugs fixed for Java 11 Support (not
+ yet on general release)</strong>
+ <ul>
+ <li>
+ <!-- JAL-3288 -->Menus work properly in split-screen
+ </li>
+ </ul></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-3240 -->Display is incorrect after removing gapped columns within hidden columns</li>
+ <!-- JAL-797 -->Closing tree windows with CMD/CTRL-W for
+ alignments with multiple views can close views unexpectedly
+ </li>
+ <li><strong>Java 11 Specific defects</strong>
+ <ul>
+ <li>
+ <!-- JAL-3235 -->Jalview Properties file is not sorted
+ alphabetically when saved
+ </li>
+ </ul>
+ </li>
</ul>
- </td>
- </tr>
+ </td>
+ </tr>
<tr>
<td width="60" nowrap>
<div align="center">
open URL in the browser can be dropped onto Jalview.</em>
</li>
</ul>
+ <em>New Known Defects</em>
+ <ul>
+ <li><!-- JAL-3083 -->Cancel option doesn't reset Colour by Annotation</li>
+ </ul>
</div></td>
</tr>
<tr>
<!-- JAL-2593 -->Improved performance when rendering lots
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
+ </li>
</ul>
</div>
</td>
Sequences' enabled) or Ensembl isoforms (Workaround in
2.10.4 is to fail back to N&W mapping)
</li>
- </ul>
+ <li>
+ <!-- JAL-2990 -->Export Annotations from File Menu with CSV
+ option gives blank output
+ </li>
+ </ul>
</div>
</td>
</tr>
<!-- JAL-2589 -->User defined gap colour not shown in
overview when features overlaid on alignment
</li>
+ <li>
+ <!-- JAL-2567 -->Feature settings for different views not
+ 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
+ </li>
</ul>
<em>Data import/export</em>
<ul>
</ul>
<p>
The full list of bugs fixed in this release can be found in the <a
- href="releases.html#Jalview.2.11">2.11 Release Notes</a>.
+ href="releases.html#Jalview.2.11.0">2.11 Release Notes</a>.
</p>
<p>
<strong>Jalview and Java 11, 13, and onwards</strong>
label.structure_chooser_no_of_structures = Structure Chooser - {0} Found ({1})
info.no_pdb_entry_found_for = No PDB entry found for {0}
exception.unable_to_detect_internet_connection = Jalview is unable to detect an internet connection
-exception.fts_rest_service_no_longer_available = {0} rest services no longer available!
-exception.resource_not_be_found = The requested resource could not be found
-exception.fts_server_error = There seems to be an error from the {0} server
exception.fts_server_unreachable = Jalview is unable to reach the {0} server. \nPlease ensure that you are connected to the internet and try again.
label.nw_mapping = Needleman & Wunsch Alignment
label.sifts_mapping = SIFTs Mapping
action.prev_page= <<
label.next_page_tooltip=Next Page
label.prev_page_tooltip=Previous Page
-exception.bad_request=Bad request. There is a problem with your input.
-exception.service_not_available=Service not available. The server is being updated, try again later.
status.launching_3d_structure_viewer = Launching 3D Structure viewer...
status.fetching_3d_structures_for_selected_entries = Fetching 3D Structures for selected entries...
status.fetching_dbrefs_for_sequences_without_valid_refs = Fetching db refs for {0} sequence(s) without valid db ref required for SIFTS mapping
label.show_selected_annotations=Mostrar anotaciones seleccionadas
status.colouring_chimera=Coloreando Chimera
label.configure_displayed_columns=Configurar Columnas Mostradas
-exception.resource_not_be_found=El recurso solicitado no se ha encontrado
label.aacon_calculations=cálculos AACon
label.pdb_web-service_error=Error de servicio web PDB
exception.unable_to_detect_internet_connection=Jalview no puede detectar una conexión a Internet
exception.outofmemory_loading_mmcif_file=Sin memoria al cargar el fichero mmCIF
label.hide_columns_not_containing=Ocultar las columnas que no contengan
label.pdb_sequence_fetcher=Recuperador de secuencias PDB
-exception.fts_server_error=Parece que hay un error desde el servidor {0}
-exception.service_not_available=Servicio no disponible. El servidor se está actualizando, vuelva a intentarlo más tarde.
status.waiting_for_user_to_select_output_file=Esperando que el usuario seleccione el fichero {0}
action.prev_page=<<
status.cancelled_image_export_operation=Operación de exportación {0} cancelada
label.couldnt_run_groovy_script=No se ha podido ejecutar el script Groovy
-exception.bad_request=Solicitud incorrecta. Hay un problema con su entrada.
label.run_groovy=Ejecutar script Groovy desde la consola
action.next_page=>>
label.uniprot_sequence_fetcher=Recuperador de secuencias UniProt
label.sifts_mapping=Mapeado SIFTs
label.mapping_method=Método de mapeo de secuencia \u27F7 estructura
info.error_creating_file=Error al crear fichero {0}
-exception.fts_rest_service_no_longer_available= Servicios Rest {0} ya no están disponibles!
status.launching_3d_structure_viewer=Lanzando visualizador de estructura 3D...
status.obtaining_mapping_with_sifts=Obteniendo mapeo por SIFTS
status.fetching_3d_structures_for=Buscando la estructura 3D para {0}
for (int col = 0; col < cols; col++)
{
// todo would prefer a Java bean for consensus data
- Hashtable<String, int[]> columnHash = new Hashtable<String, int[]>();
+ Hashtable<String, int[]> columnHash = new Hashtable<>();
// #seqs, #ungapped seqs, counts indexed by (codon encoded + 1)
int[] codonCounts = new int[66];
codonCounts[0] = alignment.getSequences().size();
{
codonCounts[codonEncoded + 2]++;
ungappedCount++;
+ break;
}
}
}
*/
void setFollowHighlight(boolean b);
+ /**
+ * configure the feature renderer with predefined feature settings
+ *
+ * @param featureSettings
+ */
public void applyFeaturesStyle(FeatureSettingsModelI featureSettings);
/**
+ * Apply the given feature settings on top of existing feature settings.
+ */
+ public void mergeFeaturesStyle(FeatureSettingsModelI featureSettings);
+
+ /**
* check if current selection group is defined on the view, or is simply a
* temporary group.
*
*/
boolean isOutwithThreshold(SequenceFeature sf);
- /*
- * Answers a human-readable text description of the colour, suitable for
- * display as a tooltip, possibly internationalised for the user's locale.
+ /**
+ * Answers a human-readable text description of the colour, suitable for display
+ * as a tooltip, possibly internationalised for the user's locale.
*
* @return
*/
}
/**
- * Applies the supplied feature settings descriptor to currently known
- * features. This supports an 'initial configuration' of feature colouring
- * based on a preset or user favourite. This may then be modified in the usual
- * way using the Feature Settings dialogue.
+ * Applies the supplied feature settings descriptor to currently known features.
+ * This supports an 'initial configuration' of feature colouring based on a
+ * preset or user favourite. This may then be modified in the usual way using
+ * the Feature Settings dialogue. NOT IMPLEMENTED FOR APPLET
*
* @param featureSettings
*/
// TODO implement for applet
}
+ /**
+ * Merges the supplied feature settings descriptor with existing feature styles.
+ * This supports an 'initial configuration' of feature colouring based on a
+ * preset or user favourite. This may then be modified in the usual way using
+ * the Feature Settings dialogue. NOT IMPLEMENTED FOR APPLET
+ *
+ * @param featureSettings
+ */
+ @Override
+ public void mergeFeaturesStyle(FeatureSettingsModelI featureSettings)
+ {
+ // TODO Auto-generated method stub
+
+ }
}
+ System.getProperty("os.version")
+ (jalview.bin.Cache.getDefault("VERSION", "TEST")
.equals("DEVELOPMENT")
- ? "\nJava path:"
+ ? "\nGetdown appdir: " + System.getProperty("getdownappdir") + "\nJava path: "
+ System.getProperty(
"java.home")
+ File.separator + "bin"
+ File.separator + "java"
- : "");
+ : "");
}
/**
perms.add(new AllPermission());
return (perms);
}
-
+
@Override
public void refresh()
{
class FeatureFetcher
{
/*
- * TODO: generalise to track all jalview events to orchestrate batch
- * processing events.
+ * TODO: generalise to track all jalview events to orchestrate batch processing
+ * events.
*/
private int queued = 0;
* main class for Jalview application
*
* @param args
- * open <em>filename</em>
+ * open <em>filename</em>
*/
public static void main(String[] args)
{
// report Jalview version
Cache.loadBuildProperties(true);
- String appdirString = System.getProperty("getdownappdir");
- if (appdirString != null && appdirString.length() > 0)
- {
- final File appdir = new File(appdirString);
- new Thread()
- {
- @Override
- public void run()
- {
- LaunchUtil.upgradeGetdown(
- new File(appdir, "getdown-launcher-old.jar"),
- new File(appdir, "getdown-launcher.jar"),
- new File(appdir, "getdown-launcher-new.jar"));
- }
- }.start();
-
- }
ArgsParser aparser = new ArgsParser(args);
boolean headless = false;
"Failed to set QuaQua look and feel: " + e.toString());
}
}
- if (lookAndFeel == null || !(lookAndFeel.getClass()
- .isAssignableFrom(UIManager.getLookAndFeel().getClass()))
+ if (lookAndFeel == null
+ || !(lookAndFeel.getClass().isAssignableFrom(
+ UIManager.getLookAndFeel().getClass()))
|| !UIManager.getLookAndFeel().getClass().toString()
.toLowerCase().contains("quaqua"))
{
}
/*
- * configure 'full' SO model if preferences say to,
- * else use the default (SO Lite)
+ * configure 'full' SO model if preferences say to, else use the default (SO
+ * Lite)
*/
- if (Cache.getDefault("USE_FULL_SO", false))
+ if (Cache.getDefault("USE_FULL_SO", true))
{
SequenceOntologyFactory.setInstance(new SequenceOntology());
}
BioJsHTMLOutput.updateBioJS();
}
+ // Move any new getdown-launcher-new.jar into place over old
+ // getdown-launcher.jar
+ String appdirString = System.getProperty("getdownappdir");
+ if (appdirString != null && appdirString.length() > 0)
+ {
+ final File appdir = new File(appdirString);
+ new Thread()
+ {
+ @Override
+ public void run()
+ {
+ LaunchUtil.upgradeGetdown(
+ new File(appdir, "getdown-launcher-old.jar"),
+ new File(appdir, "getdown-launcher.jar"),
+ new File(appdir, "getdown-launcher-new.jar"));
+ }
+ }.start();
+ }
+
String file = null, data = null;
FileFormatI format = null;
DataSourceType protocol = null;
{
data.replaceAll("%20", " ");
- ColourSchemeI cs = ColourSchemeProperty
- .getColourScheme(af.getViewport(),
- af.getViewport().getAlignment(), data);
+ ColourSchemeI cs = ColourSchemeProperty.getColourScheme(
+ af.getViewport(), af.getViewport().getAlignment(), data);
if (cs != null)
{
* Locate the given string as a file and pass it to the groovy interpreter.
*
* @param groovyscript
- * the script to execute
+ * the script to execute
* @param jalviewContext
- * the Jalview Desktop object passed in to the groovy binding as the
- * 'Jalview' object.
+ * the Jalview Desktop object passed in to the groovy
+ * binding as the 'Jalview' object.
*/
private void executeGroovyScript(String groovyscript, AlignFrame af)
{
}
/**
- * Quit method delegates to Desktop.quit - unless running in headless mode
- * when it just ends the JVM
+ * Quit method delegates to Desktop.quit - unless running in headless mode when
+ * it just ends the JVM
*/
public void quit()
{
} catch (NoClassDefFoundError e)
{
// com.sun.management.OperatingSystemMXBean doesn't exist in this JVM
- System.out.println("No com.sun.management.OperatingSystemMXBean");
+ Cache.log.error("No com.sun.management.OperatingSystemMXBean");
}
// We didn't get a com.sun.management.OperatingSystemMXBean.
// old ds and edited ds are different, so
// create the new dataset sequence
SequenceI newds = new Sequence(oldds);
- newds.setSequence(fullseq);
+ newds.setSequence(fullseq.toUpperCase());
if (command.oldds == null)
{
*/
public abstract class FTSRestClient implements FTSRestClientI
{
- protected Collection<FTSDataColumnI> dataColumns = new ArrayList<FTSDataColumnI>();
+ protected Collection<FTSDataColumnI> dataColumns = new ArrayList<>();
- protected Collection<FTSDataColumnGroupI> dataColumnGroups = new ArrayList<FTSDataColumnGroupI>();
+ protected Collection<FTSDataColumnGroupI> dataColumnGroups = new ArrayList<>();
- protected Collection<FTSDataColumnI> searchableDataColumns = new ArrayList<FTSDataColumnI>();
+ protected Collection<FTSDataColumnI> searchableDataColumns = new ArrayList<>();
- protected Collection<FTSDataColumnI> defaulDisplayedDataColumns = new ArrayList<FTSDataColumnI>();
+ protected Collection<FTSDataColumnI> defaulDisplayedDataColumns = new ArrayList<>();
protected FTSDataColumnI primaryKeyColumn;
throw new Exception("Couldn't find data column group with id : " + id);
}
- public String getMessageByHTTPStatusCode(int code, String service)
+ public static String getMessageByHTTPStatusCode(int code, String service)
{
String message = "";
switch (code)
{
case 400:
- message = MessageManager.getString("exception.bad_request");
+ message = "Bad request. There is a problem with your input.";
break;
case 410:
message = MessageManager.formatMessage(
- "exception.fts_rest_service_no_longer_available", service);
+ service + " rest services no longer available!");
break;
case 403:
case 404:
- message = MessageManager.getString("exception.resource_not_be_found");
+ message = "The requested resource could not be found";
break;
case 408:
case 409:
case 502:
case 504:
case 505:
- message = MessageManager.formatMessage("exception.fts_server_error",
- service);
+ message = "There seems to be an error from the " + service
+ + " server";
break;
case 503:
- message = MessageManager.getString("exception.service_not_available");
+ message = "Service not available. The server is being updated, try again later.";
break;
default:
break;
}
- return message;
+ return String.valueOf(code) + " " + message;
}
protected String getResourceFile(String fileName)
// System.out.println("query >>>>>>> " + pdbRestRequest.toString());
// Check the response status and report exception if one occurs
- if (clientResponse.getStatus() != 200)
+ int responseStatus = clientResponse.getStatus();
+ if (responseStatus != 200)
{
String errorMessage = "";
- if (clientResponse.getStatus() == 400)
+ if (responseStatus == 400)
{
errorMessage = parseJsonExceptionString(responseString);
throw new Exception(errorMessage);
else
{
errorMessage = getMessageByHTTPStatusCode(
- clientResponse.getStatus(), "PDB");
+ responseStatus, "PDB");
throw new Exception(errorMessage);
}
}
import jalview.api.AlignViewportI;
import jalview.api.AlignmentViewPanel;
import jalview.api.FeatureSettingsControllerI;
+import jalview.api.FeatureSettingsModelI;
import jalview.api.SplitContainerI;
import jalview.api.ViewStyleI;
import jalview.api.analysis.SimilarityParamsI;
@Override
public void finished()
{
+
+ for (FeatureSettingsModelI srcSettings : dbRefFetcher
+ .getFeatureSettingsModels())
+ {
+
+ alignPanel.av.mergeFeaturesStyle(srcSettings);
+ }
AlignFrame.this.setMenusForViewport();
}
});
@Override
public void finished()
{
+ FeatureSettingsModelI srcSettings = dassource[0]
+ .getFeatureColourScheme();
+ alignPanel.av.mergeFeaturesStyle(
+ srcSettings);
AlignFrame.this.setMenusForViewport();
}
});
import jalview.structure.SelectionSource;
import jalview.structure.StructureSelectionManager;
import jalview.structure.VamsasSource;
+import jalview.util.ColorUtils;
import jalview.util.MessageManager;
import jalview.viewmodel.AlignmentViewport;
import jalview.ws.params.AutoCalcSetting;
import java.awt.Font;
import java.awt.FontMetrics;
import java.awt.Rectangle;
+import java.util.ArrayList;
import java.util.Hashtable;
import java.util.Iterator;
import java.util.List;
@Override
public void applyFeaturesStyle(FeatureSettingsModelI featureSettings)
{
+ transferFeaturesStyles(featureSettings, false);
+ }
+
+ /**
+ * Applies the supplied feature settings descriptor to currently known features.
+ * This supports an 'initial configuration' of feature colouring based on a
+ * preset or user favourite. This may then be modified in the usual way using
+ * the Feature Settings dialogue.
+ *
+ * @param featureSettings
+ */
+ @Override
+ public void mergeFeaturesStyle(FeatureSettingsModelI featureSettings)
+ {
+ transferFeaturesStyles(featureSettings, true);
+ }
+
+ /**
+ * when mergeOnly is set, then group and feature visibility or feature colours
+ * are not modified for features and groups already known to the feature
+ * renderer. Feature ordering is always adjusted, and transparency is always set
+ * regardless.
+ *
+ * @param featureSettings
+ * @param mergeOnly
+ */
+ private void transferFeaturesStyles(FeatureSettingsModelI featureSettings,
+ boolean mergeOnly)
+ {
if (featureSettings == null)
{
return;
}
-
+
FeatureRenderer fr = getAlignPanel().getSeqPanel().seqCanvas
.getFeatureRenderer();
+ List<String> origRenderOrder = new ArrayList(),
+ origGroups = new ArrayList();
+ // preserve original render order - allows differentiation between user configured colours and autogenerated ones
+ origRenderOrder.addAll(fr.getRenderOrder());
+ origGroups.addAll(fr.getFeatureGroups());
+
fr.findAllFeatures(true);
List<String> renderOrder = fr.getRenderOrder();
FeaturesDisplayedI displayed = fr.getFeaturesDisplayed();
- displayed.clear();
+ if (!mergeOnly)
+ {
+ // only clear displayed features if we are mergeing
+ displayed.clear();
+ }
// TODO this clears displayed.featuresRegistered - do we care?
-
+ //
+ // JAL-3330 - JBP - yes we do - calling applyFeatureStyle to a view where
+ // feature visibility has already been configured is not very friendly
/*
* set feature colour if specified by feature settings
* set visibility of all features
{
FeatureColourI preferredColour = featureSettings
.getFeatureColour(type);
- if (preferredColour != null)
- {
- fr.setColour(type, preferredColour);
- }
- if (featureSettings.isFeatureDisplayed(type))
+ FeatureColourI origColour = fr.getFeatureStyle(type);
+ if (!mergeOnly || (!origRenderOrder.contains(type)
+ || origColour == null
+ || (!origColour.isGraduatedColour()
+ && origColour.getColour() != null
+ && origColour.getColour().equals(
+ ColorUtils.createColourFromName(type)))))
{
- displayed.setVisible(type);
+ // if we are merging, only update if there wasn't already a colour defined for
+ // this type
+ if (preferredColour != null)
+ {
+ fr.setColour(type, preferredColour);
+ }
+ if (featureSettings.isFeatureDisplayed(type))
+ {
+ displayed.setVisible(type);
+ }
}
}
*/
for (String group : fr.getFeatureGroups())
{
- fr.setGroupVisibility(group, featureSettings.isGroupDisplayed(group));
+ if (!mergeOnly || !origGroups.contains(group))
+ {
+ // when merging, display groups only if the aren't already marked as not visible
+ fr.setGroupVisibility(group,
+ featureSettings.isGroupDisplayed(group));
+ }
}
/*
FeatureSettingsModelI featureColourScheme = new SequenceFetcher()
.getFeatureColourScheme(source);
+ if (dna && AlignmentUtils.looksLikeEnsembl(alignment))
+ {
+ // override default featureColourScheme so products have Ensembl variant colours
+ featureColourScheme = new SequenceFetcher()
+ .getFeatureColourScheme(DBRefSource.ENSEMBL);
+ }
+
AlignmentI xrefsAlignment = makeCrossReferencesAlignment(dataset,
xrefs);
if (!dna)
/*
* apply 'database source' feature configuration
- * if any was found
+ * if any - first to the new splitframe view about to be displayed
*/
- // TODO is this the feature colouring for the original
- // alignment or the fetched xrefs? either could be Ensembl
+
newFrame.getViewport().applyFeaturesStyle(featureColourScheme);
copyThis.getViewport().applyFeaturesStyle(featureColourScheme);
+ /*
+ * and for JAL-3330 also to original alignFrame view(s)
+ * this currently trashes any original settings.
+ */
+ for (AlignmentViewPanel origpanel: alignFrame.getAlignPanels()) {
+ origpanel.getAlignViewport()
+ .mergeFeaturesStyle(featureColourScheme);
+ }
+
SplitFrame sf = new SplitFrame(dna ? copyThis : newFrame,
dna ? newFrame : copyThis);
+
newFrame.setVisible(true);
copyThis.setVisible(true);
String linkedTitle = MessageManager
boolean isUniProtRefsFound = false;
StringBuilder queryBuilder = new StringBuilder();
Set<String> seqRefs = new LinkedHashSet<>();
+
+ /*
+ * note PDBs as DBRefEntry so they are not duplicated in query
+ */
+ Set<String> pdbids = new HashSet<>();
if (seq.getAllPDBEntries() != null
&& queryBuilder.length() < MAX_QLENGTH)
{
if (isValidSeqName(entry.getId()))
{
- queryBuilder.append("pdb_id:").append(entry.getId().toLowerCase())
- .append(" OR ");
+ String id = entry.getId().toLowerCase();
+ queryBuilder.append("pdb_id:").append(id).append(" OR ");
isPDBRefsFound = true;
+ pdbids.add(id);
}
}
}
else if (dbRef.getSource().equalsIgnoreCase(DBRefSource.PDB))
{
- queryBuilder.append("pdb_id:")
- .append(getDBRefId(dbRef).toLowerCase()).append(" OR ");
- isPDBRefsFound = true;
+ String id = getDBRefId(dbRef).toLowerCase();
+ if (!pdbids.contains(id))
+ {
+ queryBuilder.append("pdb_id:").append(id).append(" OR ");
+ isPDBRefsFound = true;
+ pdbids.add(id);
+ }
}
else
{
import java.awt.BorderLayout;
import java.awt.Color;
-import java.awt.Font;
+import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.GridLayout;
import java.awt.Image;
import java.awt.MediaTracker;
+import java.awt.RenderingHints;
import java.awt.event.ActionEvent;
import java.awt.image.BufferedImage;
import java.util.Vector;
import javax.swing.JComponent;
import javax.swing.JEditorPane;
import javax.swing.JInternalFrame;
-import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTabbedPane;
Image image;
- int angle = 0;
+ float angle = 0f;
String title = "";
setInfoText(info);
java.net.URL url = getClass()
- .getResource("/images/Jalview_Logo_small.png");
+ .getResource("/images/Jalview_Logo_small_with_border.png");
image = java.awt.Toolkit.getDefaultToolkit().createImage(url);
MediaTracker mt = new MediaTracker(this);
}
AnimatedPanel ap = new AnimatedPanel();
- titlePanel.add(ap, BorderLayout.CENTER);
+ ap.setPreferredSize(new Dimension(60, 60));
+ titlePanel.add(ap, BorderLayout.WEST);
+ titlePanel.add(titleText, BorderLayout.CENTER);
+ setStatus(currentStatus);
Thread thread = new Thread(ap);
thread.start();
frame.addInternalFrameListener(
new javax.swing.event.InternalFrameAdapter()
{
- public void internalFrameClosed(
+ @Override
+ public void internalFrameClosed(
javax.swing.event.InternalFrameEvent evt)
{
// System.out.println("Shutting down webservice client");
public void setStatus(int status)
{
currentStatus = status;
+
+ String message = null;
+ switch (currentStatus)
+ {
+ case STATE_QUEUING:
+ message = MessageManager.getString("label.state_queueing");
+ break;
+
+ case STATE_RUNNING:
+ message = MessageManager.getString("label.state_running");
+ break;
+
+ case STATE_STOPPED_OK:
+ message = MessageManager.getString("label.state_completed");
+ break;
+
+ case STATE_CANCELLED_OK:
+ message = MessageManager.getString("label.state_job_cancelled");
+ break;
+
+ case STATE_STOPPED_ERROR:
+ message = MessageManager.getString("label.state_job_error");
+ break;
+
+ case STATE_STOPPED_SERVERERROR:
+ message = MessageManager.getString("label.server_error_try_later");
+ break;
+ }
+ titleText.setText(title + (message == null ? "" : " - " + message));
+ titleText.repaint();
}
/**
* @param e
* DOCUMENT ME!
*/
- protected void cancel_actionPerformed(ActionEvent e)
+ @Override
+protected void cancel_actionPerformed(ActionEvent e)
{
if (!serviceIsCancellable)
{
{
javax.swing.SwingUtilities.invokeLater(new Runnable()
{
- public void run()
+ @Override
+ public void run()
{
JvOptionPane.showInternalMessageDialog(Desktop.desktop, message,
title, JvOptionPane.WARNING_MESSAGE);
BufferedImage offscreen;
+ @Override
public void run()
{
startTime = System.currentTimeMillis();
+ float invSpeed = 15f;
+ float factor = 1f;
while (currentStatus < STATE_STOPPED_OK)
{
+ if (currentStatus == STATE_QUEUING)
+ {
+ invSpeed = 25f;
+ factor = 1f;
+ }
+ else if (currentStatus == STATE_RUNNING)
+ {
+ invSpeed = 10f;
+ factor = (float) (0.5 + 1.5
+ * (0.5 - (0.5 * Math.sin(3.14159 / 180 * (angle + 45)))));
+ }
try
{
Thread.sleep(50);
- int units = (int) ((System.currentTimeMillis() - startTime)
- / 10f);
- angle += units;
+ float delta = (System.currentTimeMillis() - startTime) / invSpeed;
+ angle += delta * factor;
angle %= 360;
startTime = System.currentTimeMillis();
if (currentStatus >= STATE_STOPPED_OK)
{
+ park();
angle = 0;
}
cancel.setEnabled(false);
}
+ public void park()
+ {
+ startTime = System.currentTimeMillis();
+
+ while (angle < 360)
+ {
+ float invSpeed = 5f;
+ float factor = 1f;
+ try
+ {
+ Thread.sleep(25);
+
+ float delta = (System.currentTimeMillis() - startTime) / invSpeed;
+ angle += delta * factor;
+ startTime = System.currentTimeMillis();
+
+ if (angle >= 360)
+ {
+ angle = 360;
+ }
+
+ repaint();
+ } catch (Exception ex)
+ {
+ }
+ }
+
+ }
+
void drawPanel()
{
if (offscreen == null || offscreen.getWidth(this) != getWidth()
|| offscreen.getHeight(this) != getHeight())
{
offscreen = new BufferedImage(getWidth(), getHeight(),
- BufferedImage.TYPE_INT_ARGB);
+ BufferedImage.TYPE_INT_RGB);
}
Graphics2D g = (Graphics2D) offscreen.getGraphics();
+ g.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
+ RenderingHints.VALUE_ANTIALIAS_ON);
+ g.setRenderingHint(RenderingHints.KEY_INTERPOLATION,
+ RenderingHints.VALUE_INTERPOLATION_BICUBIC);
+ g.setRenderingHint(RenderingHints.KEY_RENDERING,
+ RenderingHints.VALUE_RENDER_QUALITY);
+
g.setColor(Color.white);
g.fillRect(0, 0, getWidth(), getHeight());
- g.setFont(new Font("Arial", Font.BOLD, 12));
- g.setColor(Color.black);
-
- switch (currentStatus)
- {
- case STATE_QUEUING:
- g.drawString(
- title.concat(" - ").concat(
- MessageManager.getString("label.state_queueing")),
- 60, 30);
-
- break;
-
- case STATE_RUNNING:
- g.drawString(
- title.concat(" - ").concat(
- MessageManager.getString("label.state_running")),
- 60, 30);
-
- break;
-
- case STATE_STOPPED_OK:
- g.drawString(
- title.concat(" - ").concat(
- MessageManager.getString("label.state_completed")),
- 60, 30);
-
- break;
-
- case STATE_CANCELLED_OK:
- g.drawString(
- title.concat(" - ")
- .concat(MessageManager
- .getString("label.state_job_cancelled")),
- 60, 30);
-
- break;
-
- case STATE_STOPPED_ERROR:
- g.drawString(
- title.concat(" - ").concat(
- MessageManager.getString("label.state_job_error")),
- 60, 30);
-
- break;
-
- case STATE_STOPPED_SERVERERROR:
- g.drawString(
- title.concat(" - ")
- .concat(MessageManager
- .getString("label.server_error_try_later")),
- 60, 30);
-
- break;
- }
-
if (image != null)
{
int x = image.getWidth(this) / 2, y = image.getHeight(this) / 2;
- g.rotate(Math.toRadians(angle), 10 + x, 10 + y);
- g.drawImage(image, 10, 10, this);
- g.rotate(-Math.toRadians(angle), 10 + x, 10 + y);
+ g.rotate(3.14159 / 180 * (angle), x, y);
+ g.drawImage(image, 0, 0, this);
+ g.rotate(-3.14159 / 180 * (angle), x, y);
}
}
- public void paintComponent(Graphics g1)
+ @Override
+ public void paintComponent(Graphics g1)
{
drawPanel();
renderAsHtml = b;
}
- public void hyperlinkUpdate(HyperlinkEvent e)
+ @Override
+public void hyperlinkUpdate(HyperlinkEvent e)
{
Desktop.hyperlinkUpdate(e);
}
import jalview.gui.JvSwingUtils;
import jalview.util.MessageManager;
-import jalview.util.ShortcutKeyMaskExWrapper;
import java.awt.BorderLayout;
import java.awt.Font;
});
close.setAccelerator(javax.swing.KeyStroke.getKeyStroke(
java.awt.event.KeyEvent.VK_W,
- ShortcutKeyMaskExWrapper.getMenuShortcutKeyMaskEx(), false));
+ jalview.util.ShortcutKeyMaskExWrapper
+ .getMenuShortcutKeyMaskEx(),
+ false));
selectAll.setText(MessageManager.getString("action.select_all"));
selectAll.setAccelerator(javax.swing.KeyStroke.getKeyStroke(
java.awt.event.KeyEvent.VK_A,
- ShortcutKeyMaskExWrapper.getMenuShortcutKeyMaskEx(), false));
+ jalview.util.ShortcutKeyMaskExWrapper
+ .getMenuShortcutKeyMaskEx(),
+ false));
selectAll.addActionListener(new ActionListener()
{
@Override
save.setText(MessageManager.getString("action.save"));
save.setAccelerator(javax.swing.KeyStroke.getKeyStroke(
java.awt.event.KeyEvent.VK_S,
- ShortcutKeyMaskExWrapper.getMenuShortcutKeyMaskEx(), false));
+ jalview.util.ShortcutKeyMaskExWrapper
+ .getMenuShortcutKeyMaskEx(),
+ false));
save.addActionListener(new ActionListener()
{
@Override
});
copyItem.setAccelerator(javax.swing.KeyStroke.getKeyStroke(
java.awt.event.KeyEvent.VK_C,
- ShortcutKeyMaskExWrapper.getMenuShortcutKeyMaskEx(), false));
+ jalview.util.ShortcutKeyMaskExWrapper
+ .getMenuShortcutKeyMaskEx(),
+ false));
editMenubar.add(jMenu1);
editMenubar.add(editMenu);
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
+import java.awt.Font;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.GridLayout;
protected JPanel buttonPanel = new JPanel();
+ public JLabel titleText = new JLabel();
+
public JButton cancel = new JButton();
public JButton showResultsNewFrame = new JButton();
*/
private void jbInit() throws Exception
{
- infoText.setFont(new java.awt.Font("Verdana", 0, 10));
+ infoText.setFont(new Font("Verdana", 0, 10));
infoText.setBorder(null);
infoText.setEditable(false);
infoText.setText("");
titlePanel.setBackground(Color.white);
titlePanel.setPreferredSize(new Dimension(0, 60));
titlePanel.setLayout(borderLayout3);
+ titleText.setFont(new Font("Arial", Font.BOLD, 12));
+ titleText.setBorder(null);
+ titleText.setText("");
jScrollPane1.setBorder(null);
jScrollPane1.setPreferredSize(new Dimension(400, 70));
- cancel.setFont(new java.awt.Font("Verdana", 0, 11));
+ cancel.setFont(new Font("Verdana", 0, 11));
cancel.setText(MessageManager.getString("action.cancel"));
cancel.addActionListener(new java.awt.event.ActionListener()
{
- public void actionPerformed(ActionEvent e)
+ @Override
+ public void actionPerformed(ActionEvent e)
{
cancel_actionPerformed(e);
}
if (specversion >= modern)
{
- wrapper = new ShortcutKeyMaskExWrapper11();
+ wrapper = new jalview.util.ShortcutKeyMaskExWrapper11();
+ SHIFT_DOWN_MASK = jalview.util.ShortcutKeyMaskExWrapper11.SHIFT_DOWN_MASK;
+ ALT_DOWN_MASK = jalview.util.ShortcutKeyMaskExWrapper11.ALT_DOWN_MASK;
}
else
{
- wrapper = new ShortcutKeyMaskExWrapper8();
+ wrapper = new jalview.util.ShortcutKeyMaskExWrapper8();
+ SHIFT_DOWN_MASK = jalview.util.ShortcutKeyMaskExWrapper8.SHIFT_DOWN_MASK;
+ ALT_DOWN_MASK = jalview.util.ShortcutKeyMaskExWrapper8.ALT_DOWN_MASK;
}
- SHIFT_DOWN_MASK = wrapper.SHIFT_DOWN_MASK;
- ALT_DOWN_MASK = wrapper.ALT_DOWN_MASK;
}
public static int getMenuShortcutKeyMaskEx()
public class ShortcutKeyMaskExWrapper11 implements ShortcutKeyMaskExWrapperI
{
- public final static int SHIFT_DOWN_MASK = KeyEvent.SHIFT_DOWN_MASK;
- public final static int ALT_DOWN_MASK = KeyEvent.ALT_DOWN_MASK;
+ public final static int SHIFT_DOWN_MASK;
+
+ public final static int ALT_DOWN_MASK;
+
+ static
+ {
+ SHIFT_DOWN_MASK = KeyEvent.SHIFT_DOWN_MASK;
+ ALT_DOWN_MASK = KeyEvent.ALT_DOWN_MASK;
+ }
@Override
public int getMenuShortcutKeyMaskEx()
return e.getModifiersEx();
}
+
}
public class ShortcutKeyMaskExWrapper8 implements ShortcutKeyMaskExWrapperI
{
- public final static int SHIFT_DOWN_MASK = KeyEvent.SHIFT_MASK;
- public final static int ALT_DOWN_MASK = KeyEvent.ALT_MASK;
+ public final static int SHIFT_DOWN_MASK;
+
+ public final static int ALT_DOWN_MASK;
+
+ static
+ {
+ SHIFT_DOWN_MASK = KeyEvent.SHIFT_MASK;
+ ALT_DOWN_MASK = KeyEvent.ALT_MASK;
+ }
@Override
public int getMenuShortcutKeyMaskEx()
package jalview.ws;
import jalview.analysis.AlignSeq;
+import jalview.api.FeatureSettingsModelI;
import jalview.bin.Cache;
import jalview.datamodel.AlignmentI;
import jalview.datamodel.DBRefEntry;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Enumeration;
+import java.util.HashMap;
import java.util.Hashtable;
import java.util.List;
+import java.util.Map;
import java.util.StringTokenizer;
import java.util.Vector;
Arrays.asList(dataset));
List<String> warningMessages = new ArrayList<>();
+ // clear any old feature display settings recorded from past sessions
+ featureDisplaySettings = null;
+
int db = 0;
while (sdataset.size() > 0 && db < dbSources.length)
{
}
if (retrieved != null)
{
- transferReferences(sdataset, dbsource.getDbSource(), retrieved,
+ transferReferences(sdataset, dbsource, retrieved,
trimDsSeqs, warningMessages);
}
}
* @param warningMessages
* a list of messages to add to
*/
- boolean transferReferences(Vector<SequenceI> sdataset, String dbSource,
+ boolean transferReferences(Vector<SequenceI> sdataset,
+ DbSourceProxy dbSourceProxy,
AlignmentI retrievedAl, boolean trimDatasetSeqs,
List<String> warningMessages)
{
return false;
}
+ String dbSource = dbSourceProxy.getDbName();
boolean modified = false;
SequenceI[] retrieved = recoverDbSequences(
retrievedAl.getSequencesArray());
* seqs.elementAt(jj); if (!sequenceMatches.contains(sequence)) {
* sequenceMatches.addElement(sequence); } } } }
*/
+ if (sequenceMatches.size() > 0)
+ {
+ addFeatureSettings(dbSourceProxy);
+ }
// sequenceMatches now contains the set of all sequences associated with
// the returned db record
final String retrievedSeqString = retrievedSeq.getSequenceAsString();
return modified;
}
+ Map<String, FeatureSettingsModelI> featureDisplaySettings = null;
+
+ private void addFeatureSettings(DbSourceProxy dbSourceProxy)
+ {
+ FeatureSettingsModelI fsettings = dbSourceProxy
+ .getFeatureColourScheme();
+ if (fsettings != null)
+ {
+ if (featureDisplaySettings == null)
+ {
+ featureDisplaySettings = new HashMap<>();
+ }
+ featureDisplaySettings.put(dbSourceProxy.getDbName(), fsettings);
+ }
+ }
+
+ /**
+ *
+ * @return any feature settings associated with sources that have provided sequences
+ */
+ public List<FeatureSettingsModelI>getFeatureSettingsModels()
+ {
+ return featureDisplaySettings == null
+ ? Arrays.asList(new FeatureSettingsModelI[0])
+ : Arrays.asList(featureDisplaySettings.values()
+ .toArray(new FeatureSettingsModelI[1]));
+ }
/**
* Adds the message to the list unless it already contains it
*
int i = 0;
for (int j = sorted.length - 1; j >= 0; j--, i++)
{
- srcs[i] = sorted[j];
+ tosort[i] = sorted[j];
}
- return srcs;
+ return tosort;
}
}
testee = new EditCommand();
seqs = new SequenceI[4];
seqs[0] = new Sequence("seq0", "abcdefghjk");
- seqs[0].setDatasetSequence(new Sequence("seq0ds", "abcdefghjk"));
+ seqs[0].setDatasetSequence(new Sequence("seq0ds", "ABCDEFGHJK"));
seqs[1] = new Sequence("seq1", "fghjklmnopq");
- seqs[1].setDatasetSequence(new Sequence("seq1ds", "fghjklmnopq"));
+ seqs[1].setDatasetSequence(new Sequence("seq1ds", "FGHJKLMNOPQ"));
seqs[2] = new Sequence("seq2", "qrstuvwxyz");
- seqs[2].setDatasetSequence(new Sequence("seq2ds", "qrstuvwxyz"));
+ seqs[2].setDatasetSequence(new Sequence("seq2ds", "QRSTUVWXYZ"));
seqs[3] = new Sequence("seq3", "1234567890");
seqs[3].setDatasetSequence(new Sequence("seq3ds", "1234567890"));
al = new Alignment(seqs);
4, 8, al);
assertEquals("abcdefghjk", seqs[0].getSequenceAsString());
assertEquals("fghjZ-xYopq", seqs[1].getSequenceAsString());
- assertEquals("fghjZxYopq",
+ // Dataset Sequence should always be uppercase
+ assertEquals("fghjZxYopq".toUpperCase(),
seqs[1].getDatasetSequence().getSequenceAsString());
assertEquals("qrstuvwxyz", seqs[2].getSequenceAsString());
assertEquals("1234567890", seqs[3].getSequenceAsString());
assertEquals("ABxyZ-DEF", seq.getSequenceAsString());
assertEquals(1, seq.getStart());
assertEquals(8, seq.getEnd());
- assertEquals("ABxyZDEF",
+ // Dataset sequence always uppercase
+ assertEquals("ABxyZDEF".toUpperCase(),
seq.getDatasetSequence().getSequenceAsString());
assertEquals(8, seq.getDatasetSequence().getEnd());
assertEquals("ABxyZ-DEF", seq.getSequenceAsString());
assertEquals(1, seq.getStart());
assertEquals(8, seq.getEnd());
- assertEquals("ABxyZDEF",
+ // dataset sequence should be Uppercase
+ assertEquals("ABxyZDEF".toUpperCase(),
seq.getDatasetSequence().getSequenceAsString());
assertEquals(8, seq.getDatasetSequence().getEnd());
assertEquals("----klmnopq", seqs[1].getSequenceAsString());
// and ds is preserved
assertTrue(dsseq == seqs[1].getDatasetSequence());
- // and it is unchanged
- assertEquals("fghjklmnopq", dsseq.getSequenceAsString());
+ // and it is unchanged and UPPERCASE !
+ assertEquals("fghjklmnopq".toUpperCase(), dsseq.getSequenceAsString());
// and that alignment sequence start has been adjusted
assertEquals(5, seqs[1].getStart());
assertEquals(11, seqs[1].getEnd());
assertEquals("----klmnopq", seqs[1].getSequenceAsString());
// and ds is preserved
assertTrue(dsseq == seqs[1].getDatasetSequence());
- // and it is unchanged
- assertEquals("fghjklmnopq", dsseq.getSequenceAsString());
+ // and it is unchanged AND UPPERCASE !
+ assertEquals("fghjklmnopq".toUpperCase(), dsseq.getSequenceAsString());
// and that alignment sequence start has been adjusted
assertEquals(5, seqs[1].getStart());
assertEquals(11, seqs[1].getEnd());
AlignFrame af;
@BeforeClass(alwaysRun = true)
- public void setUpJvOptionPane()
+ public static void setUpBeforeClass() throws Exception
+ {
+ setUpJvOptionPane();
+ /*
+ * use read-only test properties file
+ */
+ Cache.loadProperties("test/jalview/io/testProps.jvprops");
+ Jalview.main(new String[] { "-nonews" });
+ }
+
+ @AfterMethod(alwaysRun = true)
+ public void tearDown()
+ {
+ Desktop.instance.closeAll_actionPerformed(null);
+ }
+
+ /**
+ * configure (read-only) properties for test to ensure Consensus is computed for
+ * colour Above PID testing
+ */
+ @BeforeMethod(alwaysRun = true)
+ public void setUp()
+ {
+ Cache.loadProperties("test/jalview/io/testProps.jvprops");
+ Cache.applicationProperties.setProperty("SHOW_IDENTITY",
+ Boolean.TRUE.toString());
+ af = new FileLoader().LoadFileWaitTillLoaded("examples/uniref50.fa",
+ DataSourceType.FILE);
+
+ /*
+ * wait for Consensus thread to complete
+ */
+ synchronized (this)
+ {
+ while (af.getViewport().getConsensusSeq() == null)
+ {
+ try
+ {
+ wait(50);
+ } catch (InterruptedException e)
+ {
+ }
+ }
+ }
+ }
+
+ public static void setUpJvOptionPane()
{
JvOptionPane.setInteractiveMode(false);
JvOptionPane.setMockResponse(JvOptionPane.CANCEL_OPTION);
assertEquals(next[1], 8);
}
- @BeforeClass(alwaysRun = true)
- public static void setUpBeforeClass() throws Exception
- {
- /*
- * use read-only test properties file
- */
- Cache.loadProperties("test/jalview/io/testProps.jvprops");
- Jalview.main(new String[] { "-nonews" });
- }
-
- @AfterMethod(alwaysRun = true)
- public void tearDown()
- {
- Desktop.instance.closeAll_actionPerformed(null);
- }
-
- /**
- * configure (read-only) properties for test to ensure Consensus is computed
- * for colour Above PID testing
- */
- @BeforeMethod(alwaysRun = true)
- public void setUp()
- {
- Cache.loadProperties("test/jalview/io/testProps.jvprops");
- Cache.applicationProperties.setProperty("SHOW_IDENTITY",
- Boolean.TRUE.toString());
- af = new FileLoader().LoadFileWaitTillLoaded("examples/uniref50.fa",
- DataSourceType.FILE);
-
- /*
- * wait for Consensus thread to complete
- */
- synchronized (this)
- {
- while (af.getViewport().getConsensusSeq() == null)
- {
- try
- {
- wait(50);
- } catch (InterruptedException e)
- {
- }
- }
- }
- }
-
/**
* Test that changing background (alignment) colour scheme
* <ul>
assertEquals(Color.yellow, fc1.getColour());
assertEquals(10f, fc1.getMin());
assertEquals(20f, fc1.getMax());
+
+ /*
+ * modify original attribute label and check that copy doesn't change
+ */
+ fc.setAttributeName("MAF", "AF");
+ assertArrayEquals(new String[] { "AF" }, fc1.getAttributeName());
+
}
@Test(groups = { "Functional" })
import jalview.ws.seqfetcher.DbSourceProxy;
import java.util.Enumeration;
+import java.util.HashMap;
import java.util.List;
+import java.util.Map;
import java.util.Vector;
+import org.testng.Assert;
import org.testng.annotations.BeforeClass;
+import org.testng.annotations.Test;
public class SequenceFetcherTest
{
JvOptionPane.setMockResponse(JvOptionPane.CANCEL_OPTION);
}
+ @Test(groups = "Functional")
+ public void testNoDuplicatesInFetchDbRefs()
+ {
+ Map<String, List<DbSourceProxy>> seen = new HashMap<>();
+ jalview.ws.SequenceFetcher sfetcher = new jalview.ws.SequenceFetcher();
+ String dupes = "";
+ for (String src : sfetcher.getOrderedSupportedSources())
+ {
+ List<DbSourceProxy> seenitem = seen.get(src);
+ if (seenitem != null)
+ {
+ dupes += (dupes.length() > 0 ? "," : "") + src;
+ }
+ else
+ {
+ seen.put(src, sfetcher.getSourceProxy(src));
+ }
+ }
+ if (dupes.length() > 0)
+ {
+ Assert.fail("Duplicate sources : " + dupes);
+ }
+ }
+
/**
* simple run method to test dbsources.
*
--- /dev/null
+#!/usr/bin/env bash
+
+J8HOME=/path/to/java8/jdk
+J11HOME=/path/to/java11/jdk
+OLDBUILDDIR=/path/to/old/build/root
+JALVIEWDIR=/path/to/recent/jalview
+LOCALARCHIVEDIR=/path/to/where/to/store/archive/locally
+WEBSITEDOCROOTMOUNT=/path/to/mounted/website/docroot
+
+
+cd OLDBUILDDIR
+mkdir tar
+cd tar
+wget http://www.jalview.org/source/jalview_2_08b.tar.gz http://www.jalview.org/source/jalview_2_2_1.tar.gz http://www.jalview.org/source/jalview_2_3_buildfix.tar.gz http://www.jalview.org/source/jalview_2_4_0b2.tar.gz http://www.jalview.org/source/jalview_2_5_1.tar.gz http://www.jalview.org/source/jalview_2_6_1.tar.gz http://www.jalview.org/source/jalview_2_7.tar.gz http://www.jalview.org/source/jalview_2_8_2b1.tar.gz http://www.jalview.org/source/jalview_2_9_0b1.tar.gz http://www.jalview.org/source/jalview_2_10_5.tar.gz
+cd -
+
+export JAVA_HOME=J8HOME
+export PATH=$JAVA_HOME/bin:$PATH
+
+for x in tar/jalview_*.tar.gz
+do
+ V=${x#*jalview_}
+ V=${V%.tar.gz}
+ echo $V
+ tar --one-top-level -xvf $x
+ cd jalview_$V/jalview
+ ant makedist -DJALVIEW_VERSION="$V"
+ cd -
+done
+
+export JAVA_HOME=J11HOME
+export PATH=$JAVA_HOME/bin:$PATH
+
+cd $JALVIEWDIR
+for x in $OLDBUILDDIR/jalview_*/jalview
+do
+ V=${x##*jalview_}
+ V=${V%/jalview}
+ echo $V
+ [ -e getdown/website ] && /bin/rm -r getdown/website
+ [ -e getdown/files ] && /bin/rm -r getdown/website
+ gradle getdown -PCHANNEL=ARCHIVE -PJALVIEW_VERSION="$V" -PJAVA_VERSION=1.8 -PARCHIVEDIR=$x -Pgetdown_rsync_dest=$LOCALARCHIVEDIR -PRUNRSYNC=true
+done
+
+
+cd $LOCALARCHIVEDIR
+rsync -avh --delete $LOCALARCHIVEDIR/archive/ $WEBSITEDOCROOTMOUNT/getdown/archive/
+
<key>CFBundleIconFile</key>
<string>applet</string>
<key>CFBundleIdentifier</key>
- <string>com.apple.ScriptEditor.id.Uninstall-Old-Jalview--optional</string>
+ <string>com.apple.ScriptEditor.id.Uninstall-Old-Jalview</string>
<key>CFBundleInfoDictionaryVersion</key>
<string>6.0</string>
<key>CFBundleName</key>
- <string>Uninstall Old Jalview (optional)</string>
+ <string>Uninstall Old Jalview</string>
<key>CFBundlePackageType</key>
<string>APPL</string>
<key>CFBundleShortVersionString</key>
</dict>
<key>LSRequiresCarbon</key>
<true/>
+ <key>NSAppleEventsUsageDescription</key>
+ <string>This script needs to control other applications to run.</string>
+ <key>NSAppleMusicUsageDescription</key>
+ <string>This script needs access to your music to run.</string>
+ <key>NSCalendarsUsageDescription</key>
+ <string>This script needs access to your calendars to run.</string>
+ <key>NSCameraUsageDescription</key>
+ <string>This script needs access to your camera to run.</string>
+ <key>NSContactsUsageDescription</key>
+ <string>This script needs access to your contacts to run.</string>
+ <key>NSHomeKitUsageDescription</key>
+ <string>This script needs access to your HomeKit Home to run.</string>
+ <key>NSMicrophoneUsageDescription</key>
+ <string>This script needs access to your microphone to run.</string>
+ <key>NSPhotoLibraryUsageDescription</key>
+ <string>This script needs access to your photos to run.</string>
+ <key>NSRemindersUsageDescription</key>
+ <string>This script needs access to your reminders to run.</string>
+ <key>NSSiriUsageDescription</key>
+ <string>This script needs access to Siri to run.</string>
+ <key>NSSystemAdministrationUsageDescription</key>
+ <string>This script needs access to administer this system to run.</string>
<key>WindowState</key>
<dict>
<key>bundleDividerCollapsed</key>
<key>bundlePositionOfDivider</key>
<real>0.0</real>
<key>dividerCollapsed</key>
- <false/>
+ <true/>
<key>eventLogLevel</key>
<integer>2</integer>
<key>name</key>
<key>positionOfDivider</key>
<real>421</real>
<key>savedFrame</key>
- <string>20 1180 700 672 0 0 3360 1867 </string>
+ <string>272 342 1754 910 0 0 3360 1867 </string>
<key>selectedTab</key>
- <string>description</string>
+ <string>result</string>
</dict>
</dict>
</plist>
-{\rtf1\ansi\ansicpg1252\cocoartf1561\cocoasubrtf600
+{\rtf1\ansi\ansicpg1252\cocoartf1671\cocoasubrtf500
{\fonttbl}
{\colortbl;\red255\green255\blue255;}
{\*\expandedcolortbl;;}
--- /dev/null
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<plist version="1.0">
+<dict>
+ <key>files</key>
+ <dict>
+ <key>Resources/Scripts/main.scpt</key>
+ <data>
+ KEuZnZPFR5wgwG/qEhXMd5yBoi4=
+ </data>
+ <key>Resources/applet.icns</key>
+ <data>
+ vIRz6m6+ZxDNfi4iTsXj5rdcZUA=
+ </data>
+ <key>Resources/applet.rsrc</key>
+ <data>
+ oLbJze+WI6mK9fT14HFV6EwFoEI=
+ </data>
+ <key>Resources/description.rtfd/TXT.rtf</key>
+ <data>
+ JdCHmFsejhMRQNi2CzUAg7xM/6Q=
+ </data>
+ </dict>
+ <key>files2</key>
+ <dict>
+ <key>Resources/Scripts/main.scpt</key>
+ <dict>
+ <key>hash</key>
+ <data>
+ KEuZnZPFR5wgwG/qEhXMd5yBoi4=
+ </data>
+ <key>hash2</key>
+ <data>
+ Y+OMztx129elZ3oX0uhaiMMNU87xhkEPVzSuhF528t0=
+ </data>
+ </dict>
+ <key>Resources/applet.icns</key>
+ <dict>
+ <key>hash</key>
+ <data>
+ vIRz6m6+ZxDNfi4iTsXj5rdcZUA=
+ </data>
+ <key>hash2</key>
+ <data>
+ D7gig1wJlOzR/Iy+y6TESLN0j/cIpjThUyO1pj5fZEc=
+ </data>
+ </dict>
+ <key>Resources/applet.rsrc</key>
+ <dict>
+ <key>hash</key>
+ <data>
+ oLbJze+WI6mK9fT14HFV6EwFoEI=
+ </data>
+ <key>hash2</key>
+ <data>
+ 6bi/D/GzKmLhXbbC8+OLEX9+44Au0XOyGRd+kfw6uzA=
+ </data>
+ </dict>
+ <key>Resources/description.rtfd/TXT.rtf</key>
+ <dict>
+ <key>hash</key>
+ <data>
+ JdCHmFsejhMRQNi2CzUAg7xM/6Q=
+ </data>
+ <key>hash2</key>
+ <data>
+ e8RCmynIiyJGwHTnWQowZeGP0OUnjjA6SQTvIzP7Hxs=
+ </data>
+ </dict>
+ </dict>
+ <key>rules</key>
+ <dict>
+ <key>^Resources/</key>
+ <true/>
+ <key>^Resources/.*\.lproj/</key>
+ <dict>
+ <key>optional</key>
+ <true/>
+ <key>weight</key>
+ <real>1000</real>
+ </dict>
+ <key>^Resources/.*\.lproj/locversion.plist$</key>
+ <dict>
+ <key>omit</key>
+ <true/>
+ <key>weight</key>
+ <real>1100</real>
+ </dict>
+ <key>^Resources/Base\.lproj/</key>
+ <dict>
+ <key>weight</key>
+ <real>1010</real>
+ </dict>
+ <key>^version.plist$</key>
+ <true/>
+ </dict>
+ <key>rules2</key>
+ <dict>
+ <key>.*\.dSYM($|/)</key>
+ <dict>
+ <key>weight</key>
+ <real>11</real>
+ </dict>
+ <key>^(.*/)?\.DS_Store$</key>
+ <dict>
+ <key>omit</key>
+ <true/>
+ <key>weight</key>
+ <real>2000</real>
+ </dict>
+ <key>^(Frameworks|SharedFrameworks|PlugIns|Plug-ins|XPCServices|Helpers|MacOS|Library/(Automator|Spotlight|LoginItems))/</key>
+ <dict>
+ <key>nested</key>
+ <true/>
+ <key>weight</key>
+ <real>10</real>
+ </dict>
+ <key>^.*</key>
+ <true/>
+ <key>^Info\.plist$</key>
+ <dict>
+ <key>omit</key>
+ <true/>
+ <key>weight</key>
+ <real>20</real>
+ </dict>
+ <key>^PkgInfo$</key>
+ <dict>
+ <key>omit</key>
+ <true/>
+ <key>weight</key>
+ <real>20</real>
+ </dict>
+ <key>^Resources/</key>
+ <dict>
+ <key>weight</key>
+ <real>20</real>
+ </dict>
+ <key>^Resources/.*\.lproj/</key>
+ <dict>
+ <key>optional</key>
+ <true/>
+ <key>weight</key>
+ <real>1000</real>
+ </dict>
+ <key>^Resources/.*\.lproj/locversion.plist$</key>
+ <dict>
+ <key>omit</key>
+ <true/>
+ <key>weight</key>
+ <real>1100</real>
+ </dict>
+ <key>^Resources/Base\.lproj/</key>
+ <dict>
+ <key>weight</key>
+ <real>1010</real>
+ </dict>
+ <key>^[^/]+$</key>
+ <dict>
+ <key>nested</key>
+ <true/>
+ <key>weight</key>
+ <real>10</real>
+ </dict>
+ <key>^embedded\.provisionprofile$</key>
+ <dict>
+ <key>weight</key>
+ <real>20</real>
+ </dict>
+ <key>^version\.plist$</key>
+ <dict>
+ <key>weight</key>
+ <real>20</real>
+ </dict>
+ </dict>
+</dict>
+</plist>
<?xml version="1.0" encoding="UTF-8"?>
-<install4j version="7.0.9" transformSequenceNumber="7">
+<install4j version="7.0.11" transformSequenceNumber="7">
<directoryPresets config="." />
<application name="Jalview" distributionSourceDir="" applicationId="6595-2347-1923-0725" mediaDir="../../build/install4j" mediaFilePattern="${compiler:sys.shortName}_${compiler:sys.platform}_${compiler:sys.version}" compression="6" lzmaCompression="true" pack200Compression="false" excludeSignedFromPacking="true" commonExternalFiles="false" createMd5Sums="true" shrinkRuntime="true" shortName="Jalview" publisher="University of Dundee" publisherWeb="http://www.jalview.org/" version="$$VERSION$$" allPathsRelative="true" backupOnSave="false" autoSave="false" convertDotsToUnderscores="true" macSignature="????" macVolumeId="5aac4968c304f65" javaMinVersion="9999999999" javaMaxVersion="" allowBetaVM="true" jdkMode="jdk" jdkName="JDK 11.0">
<languages skipLanguageSelection="false" languageSelectionInPrincipalLanguage="false">
<dirEntry mountPoint="885" file="$$WINDOWS_JAVA_VM_DIR$$" overwriteMode="4" shared="false" fileMode="755" uninstallMode="0" overrideFileMode="true" overrideOverwriteMode="false" overrideUninstallMode="true" entryMode="subdir" subDirectory="${compiler:JRE_DIR}" excludeSuffixes="" dirMode="755" overrideDirMode="false">
<exclude />
</dirEntry>
- <dirEntry mountPoint="1875" file="../../getdown/website/$$JAVA_VERSION$$/dist" overwriteMode="1" shared="false" fileMode="644" uninstallMode="2" overrideFileMode="true" overrideOverwriteMode="true" overrideUninstallMode="true" entryMode="subdir" subDirectory="dist" excludeSuffixes="" dirMode="755" overrideDirMode="true">
+ <dirEntry mountPoint="1875" file="../../getdown/website/$$JAVA_VERSION$$/$$GETDOWN_DIST_DIR$$" overwriteMode="1" shared="false" fileMode="644" uninstallMode="2" overrideFileMode="true" overrideOverwriteMode="true" overrideUninstallMode="true" entryMode="subdir" subDirectory="$$GETDOWN_DIST_DIR$$" excludeSuffixes="" dirMode="755" overrideDirMode="true">
<exclude />
</dirEntry>
<dirEntry mountPoint="2107" file="Uninstall Old Jalview.app" overwriteMode="4" shared="false" fileMode="755" uninstallMode="0" overrideFileMode="true" overrideOverwriteMode="false" overrideUninstallMode="false" entryMode="subdir" subDirectory="Uninstall Old Jalview.app" excludeSuffixes="" dirMode="755" overrideDirMode="true">
<java mainClass="com.threerings.getdown.launcher.GetdownApp" mainMode="1" vmParameters="" arguments=". jalview" allowVMPassthroughParameters="true" preferredVM="" bundleRuntime="true">
<classPath>
<archive location="getdown-launcher.jar" failOnError="true" />
+ <scanDirectory location="$$GETDOWN_INSTALL_DIR$$" failOnError="false" />
</classPath>
<modulePath />
<nativeLibraryDirectories />
<java mainClass="com.threerings.getdown.launcher.GetdownApp" mainMode="1" vmParameters="" arguments=". jalview" allowVMPassthroughParameters="true" preferredVM="" bundleRuntime="true">
<classPath>
<archive location="getdown-launcher.jar" failOnError="true" />
+ <scanDirectory location="$$GETDOWN_INSTALL_DIR$$" failOnError="false" />
</classPath>
<modulePath />
<nativeLibraryDirectories />
</splashScreen>
<java mainClass="jalview.bin.Launcher" mainMode="1" vmParameters="" arguments="" allowVMPassthroughParameters="true" preferredVM="" bundleRuntime="true">
<classPath>
- <scanDirectory location="dist" failOnError="false" />
+ <scanDirectory location="$$GETDOWN_DIST_DIR$$" failOnError="false" />
</classPath>
<modulePath />
<nativeLibraryDirectories />
<java class="java.beans.XMLDecoder">
<object class="com.install4j.runtime.beans.actions.files.DeleteFileAction">
<void property="files">
- <array class="java.io.File" length="17">
+ <array class="java.io.File" length="31">
<void index="0">
<object class="java.io.File">
<string>jre</string>
</void>
<void index="1">
<object class="java.io.File">
- <string>.install4j</string>
+ <string>jre.jar</string>
</object>
</void>
<void index="2">
<object class="java.io.File">
- <string>dist</string>
+ <string>.install4j</string>
</object>
</void>
<void index="3">
<object class="java.io.File">
- <string>resource</string>
+ <string>$$GETDOWN_DIST_DIR$$</string>
</object>
</void>
<void index="4">
<object class="java.io.File">
- <string>getdown-launcher.jar</string>
+ <string>$$GETDOWN_ALT_DIR$$</string>
</object>
</void>
<void index="5">
<object class="java.io.File">
- <string>getdown-launcher-old.jar</string>
+ <string>$$GETDOWN_RESOURCE_DIR$$</string>
</object>
</void>
<void index="6">
<object class="java.io.File">
- <string>getdown-launcher-new.jar</string>
+ <string>getdown-launcher.jar</string>
</object>
</void>
<void index="7">
<object class="java.io.File">
- <string>*.jarv</string>
+ <string>getdown-launcher-old.jar</string>
</object>
</void>
<void index="8">
<object class="java.io.File">
- <string>gettingdown.lock</string>
+ <string>getdown-launcher-new.jar</string>
</object>
</void>
<void index="9">
<object class="java.io.File">
- <string>*.log</string>
+ <string>*.jarv</string>
</object>
</void>
<void index="10">
<object class="java.io.File">
- <string>*.txt</string>
+ <string>gettingdown.lock</string>
</object>
</void>
<void index="11">
<object class="java.io.File">
- <string>*_new</string>
+ <string>*.log</string>
</object>
</void>
<void index="12">
<object class="java.io.File">
- <string>digest.txt</string>
+ <string>*.txt</string>
</object>
</void>
<void index="13">
<object class="java.io.File">
- <string>digest2.txt</string>
+ <string>*_new</string>
</object>
</void>
<void index="14">
<object class="java.io.File">
- <string>getdown-launcher.jarv</string>
+ <string>digest.txt</string>
</object>
</void>
<void index="15">
<object class="java.io.File">
- <string>launcher.log</string>
+ <string>digest2.txt</string>
</object>
</void>
<void index="16">
<object class="java.io.File">
+ <string>getdown-launcher.jarv</string>
+ </object>
+ </void>
+ <void index="17">
+ <object class="java.io.File">
+ <string>getdown-launcher-new.jarv</string>
+ </object>
+ </void>
+ <void index="18">
+ <object class="java.io.File">
+ <string>channel_launch.jvl</string>
+ </object>
+ </void>
+ <void index="19">
+ <object class="java.io.File">
+ <string>launcher.log</string>
+ </object>
+ </void>
+ <void index="20">
+ <object class="java.io.File">
<string>proxy.txt</string>
</object>
</void>
+ <void index="21">
+ <object class="java.io.File">
+ <string>META-INF</string>
+ </object>
+ </void>
+ <void index="22">
+ <object class="java.io.File">
+ <string>install/getdown-launcher.jar</string>
+ </object>
+ </void>
+ <void index="23">
+ <object class="java.io.File">
+ <string>install/getdown.txt</string>
+ </object>
+ </void>
+ <void index="24">
+ <object class="java.io.File">
+ <string>install/build_properties</string>
+ </object>
+ </void>
+ <void index="25">
+ <object class="java.io.File">
+ <string>build_properties</string>
+ </object>
+ </void>
+ <void index="26">
+ <object class="java.io.File">
+ <string>install</string>
+ </object>
+ </void>
+ <void index="27">
+ <object class="java.io.File">
+ <string>dist</string>
+ </object>
+ </void>
+ <void index="28">
+ <object class="java.io.File">
+ <string>release</string>
+ </object>
+ </void>
+ <void index="29">
+ <object class="java.io.File">
+ <string>alt</string>
+ </object>
+ </void>
+ <void index="30">
+ <object class="java.io.File">
+ <string>resource</string>
+ </object>
+ </void>
</array>
</void>
<void property="recursive">
<group name="" id="49" customizedId="" beanClass="com.install4j.runtime.beans.groups.VerticalFormComponentGroup" enabled="true" commentSet="false" comment="" actionElevationType="inherit" useExternalParametrization="true" externalParametrizationName="Customize title bar" externalParametrizationMode="include">
<serializedBean>
<java class="java.beans.XMLDecoder">
- <object class="com.install4j.runtime.beans.groups.VerticalFormComponentGroup">
+ <object class="com.install4j.runtime.beans.groups.VerticalFormComponentGroup" id="VerticalFormComponentGroup0">
<void property="backgroundColor">
<object class="java.awt.Color">
<int>255</int>
<string>icon:${installer:sys.installerApplicationMode}_header.png</string>
</object>
</void>
+ <void id="Integer0" property="cellSpacing" />
+ <void id="Integer1" property="borderWidth" />
<void property="imageInsets">
<object class="java.awt.Insets">
- <int>0</int>
+ <object idref="Integer0" />
<int>5</int>
- <int>1</int>
- <int>1</int>
+ <object idref="Integer1" />
+ <object idref="Integer1" />
</object>
</void>
<void property="insets">
<object class="java.awt.Insets">
- <int>0</int>
+ <object idref="Integer0" />
<int>20</int>
- <int>0</int>
+ <object idref="Integer0" />
<int>10</int>
</object>
</void>
<group name="" id="53" customizedId="" beanClass="com.install4j.runtime.beans.groups.HorizontalFormComponentGroup" enabled="true" commentSet="false" comment="" actionElevationType="inherit" useExternalParametrization="false" externalParametrizationName="" externalParametrizationMode="all">
<serializedBean>
<java class="java.beans.XMLDecoder">
- <object class="com.install4j.runtime.beans.groups.HorizontalFormComponentGroup">
+ <object class="com.install4j.runtime.beans.groups.HorizontalFormComponentGroup" id="HorizontalFormComponentGroup0">
<void property="alignFirstLabel">
<boolean>false</boolean>
</void>
+ <void id="Integer0" property="cellSpacing" />
<void property="insets">
<object class="java.awt.Insets">
<int>3</int>
- <int>5</int>
+ <object idref="Integer0" />
<int>8</int>
- <int>5</int>
+ <object idref="Integer0" />
</object>
</void>
</object>