}
jalviewjsTransferSiteLibDir = string("${jalviewjsBuildDir}/tmp/${jalviewjs_site_dir}_lib")
jalviewjsTransferSiteSwingJsDir = string("${jalviewjsBuildDir}/tmp/${jalviewjs_site_dir}_swingjs")
+ jalviewjsTransferSiteMergeDir = string("${jalviewjsBuildDir}/tmp/${jalviewjs_site_dir}_merge")
jalviewjsTransferSiteCoreDir = string("${jalviewjsBuildDir}/tmp/${jalviewjs_site_dir}_core")
jalviewjsJalviewCoreHtmlFile = string("")
jalviewjsJalviewCoreName = string(jalviewjs_core_name)
task jalviewjsTransferUnzipLib {
- def zipFiles = fileTree(dir: "${jalviewDir}/${jalviewjs_libjs_dir}", include: "*.zip")
+ def zipFiles = fileTree(dir: "${jalviewDir}/${jalviewjs_libjs_dir}", include: "*.zip").sort()
doLast {
zipFiles.each { file_zip ->
copy {
from zipTree(file_zip)
into "${jalviewDir}/${jalviewjsTransferSiteLibDir}"
+
+ // The following replace() is needed due to a mismatch in Jmol calls to
+ // colorPtToFFRGB$javajs_util_T3d when only colorPtToFFRGB$javajs_util_T3 is defined
+ // in the SwingJS.zip (github or the one distributed with JSmol)
+ if (file_zip.getName().equals("Jmol-SwingJS.zip")) {
+ filter { line ->
+ def l = ""
+ while(!line.equals(l)) {
+ line = line.replace('colorPtToFFRGB$javajs_util_T3d', 'colorPtToFFRGB$javajs_util_T3')
+ l = line
+ }
+ return line
+ }
+ }
}
}
}
task jalviewjsTransferUnzipAllLibs {
- dependsOn jalviewjsTransferUnzipSwingJs
dependsOn jalviewjsTransferUnzipLib
+ dependsOn jalviewjsTransferUnzipSwingJs
}
include "**"
}
- // should this be exclude really ?
+ // should this be exclude really ? No, swingjs dir should be transferred last (and overwrite)
duplicatesStrategy "INCLUDE"
outputs.files outputFiles
}
+task jalviewjsTranserSiteMergeLibDirs (type: Sync) {
+ dependsOn jalviewjsTransferUnzipAllLibs
+ dependsOn jalviewjsTransferUnzipSwingJs
+ dependsOn jalviewjsTranspile
+
+ def inputFiles = fileTree(dir: "${jalviewDir}/${jalviewjsTransferSiteLibDir}")
+ // merge swingjs lib last
+ inputFiles += fileTree(dir: "${jalviewDir}/${jalviewjsTransferSiteSwingJsDir}")
+
+ def outputDir = "${jalviewDir}/${jalviewjsTransferSiteMergeDir}"
+
+ from inputFiles
+ into outputDir
+ def outputFiles = []
+ rename { filename ->
+ outputFiles += "${outputDir}/${filename}"
+ null
+ }
+
+ exclude "**/*.html"
+ exclude "**/*.htm"
+
+ // should this be exclude really ? No, swingjs dir should be transferred last (and overwrite)
+ duplicatesStrategy "INCLUDE"
+
+ outputs.files outputFiles
+ inputs.files inputFiles
+}
+
+
+task jalviewjsTranserSiteMergeSwingDir (type: Sync) {
+ dependsOn jalviewjsTransferUnzipAllLibs
+ dependsOn jalviewjsTransferUnzipSwingJs
+ dependsOn jalviewjsTranspile
+
+ // merge jalview files very last
+ def inputFiles = fileTree(dir: "${jalviewDir}/${jalviewjsTransferSiteJsDir}")
+
+ def outputDir = "${jalviewDir}/${jalviewjsTransferSiteMergeDir}"
+
+ from inputFiles
+ into outputDir
+ def outputFiles = []
+ rename { filename ->
+ outputFiles += "${outputDir}/${filename}"
+ null
+ }
+ preserve {
+ include "**"
+ }
+
+ // should this be exclude really ? No, jalview dir should be transferred last (and overwrite)
+ duplicatesStrategy "INCLUDE"
+
+ outputs.files outputFiles
+ inputs.files inputFiles
+}
+
+
+task jalviewjsTranserSiteMergeDirs {
+ dependsOn jalviewjsTranserSiteMergeLibDirs
+ dependsOn jalviewjsTranserSiteMergeSwingDir
+}
+
+
def jalviewjsCallCore(String name, FileCollection list, String prefixFile, String suffixFile, String jsfile, String zjsfile, File logOutFile, Boolean logOutConsole) {
def stdout = new ByteArrayOutputStream()
def coreTop = file(prefixFile)
def coreBottom = file(suffixFile)
+ def missingFiles = []
coreFile.getParentFile().mkdirs()
coreFile.createNewFile()
coreFile.write( coreTop.getText("UTF-8") )
msg = "...file '"+f.getPath()+"' does not exist, skipping"
println(msg)
logOutFile.append(msg+"\n")
+ missingFiles += f
}
}
coreFile.append( coreBottom.getText("UTF-8") )
classpath = files(["${jalviewDir}/${jalviewjs_closure_compiler}"])
main = "com.google.javascript.jscomp.CommandLineRunner"
jvmArgs = [ "-Dfile.encoding=UTF-8" ]
- args = [ "--compilation_level", "SIMPLE_OPTIMIZATIONS", "--warning_level", "QUIET", "--charset", "UTF-8", "--js", jsfile, "--js_output_file", zjsfile ]
+ args = [ "--compilation_level", jalviewjs_closure_compiler_optimization_level, "--warning_level", "QUIET", "--charset", "UTF-8", "--js", jsfile, "--js_output_file", zjsfile ]
maxHeapSize = "2g"
msg = "\nRunning '"+commandLine.join(' ')+"'\n"
}
}
msg = "--"
+ if (missingFiles.size() > 0) {
+ msg += "\n!!! These files were listed but missing:\n"
+ missingFiles.each { file -> msg += "!!! " + file.getPath() + "\n" }
+ msg = "--"
+ }
println(msg)
logOutFile.append(msg+"\n")
}
task jalviewjsBuildAllCores {
group "JalviewJS"
description "Build the core js lib closures listed in the classlists dir"
- dependsOn jalviewjsTranspile
- dependsOn jalviewjsTransferUnzipSwingJs
+ dependsOn jalviewjsTranserSiteMergeDirs
- def j2sDir = "${jalviewDir}/${jalviewjsTransferSiteJsDir}/${jalviewjs_j2s_subdir}"
- def swingJ2sDir = "${jalviewDir}/${jalviewjsTransferSiteSwingJsDir}/${jalviewjs_j2s_subdir}"
- def libJ2sDir = "${jalviewDir}/${jalviewjsTransferSiteLibDir}/${jalviewjs_j2s_subdir}"
- def jsDir = "${jalviewDir}/${jalviewjsTransferSiteSwingJsDir}/${jalviewjs_js_subdir}"
+ def j2sDir = "${jalviewDir}/${jalviewjsTransferSiteMergeDir}/${jalviewjs_j2s_subdir}"
+ def swingJ2sDir = "${jalviewDir}/${jalviewjsTransferSiteMergeDir}/${jalviewjs_j2s_subdir}"
+ def libJ2sDir = "${jalviewDir}/${jalviewjsTransferSiteMergeDir}/${jalviewjs_j2s_subdir}"
+ def jsDir = "${jalviewDir}/${jalviewjsTransferSiteMergeDir}/${jalviewjs_js_subdir}"
def outputDir = "${jalviewDir}/${jalviewjsTransferSiteCoreDir}/${jalviewjs_j2s_subdir}/core"
def prefixFile = "${jsDir}/core/coretop2.js"
def suffixFile = "${jsDir}/core/corebottom2.js"
outputs.file(zjsfile)
}
- // _stevesoft core. add any cores without a classlist here (and the inputs and outputs)
- def stevesoftClasslistName = "_stevesoft"
- def stevesoftClasslist = [
- 'jsfile': "${outputDir}/core${stevesoftClasslistName}.js",
- 'zjsfile': "${outputDir}/core${stevesoftClasslistName}.z.js",
- 'list': fileTree(dir: j2sDir, include: "com/stevesoft/pat/**/*.js"),
- 'name': stevesoftClasslistName
- ]
- jalviewjsCoreClasslists += stevesoftClasslist
- inputs.files(stevesoftClasslist['list'])
- outputs.file(stevesoftClasslist['jsfile'])
- outputs.file(stevesoftClasslist['zjsfile'])
-
// _all core
def allClasslistName = "_all"
def allJsFiles = fileTree(dir: j2sDir, include: "**/*.js")
task jalviewjsPublishCoreTemplates {
dependsOn jalviewjsBuildAllCores
+
def inputFileName = "${jalviewDir}/${j2s_coretemplate_html}"
def inputFile = file(inputFileName)
def outputDir = "${jalviewDir}/${jalviewjsTransferSiteCoreDir}"
task jalviewjsSyncCore (type: Sync) {
dependsOn jalviewjsBuildAllCores
dependsOn jalviewjsPublishCoreTemplates
+
def inputFiles = fileTree(dir: "${jalviewDir}/${jalviewjsTransferSiteCoreDir}")
def outputDir = "${jalviewDir}/${jalviewjsSiteDir}"
// this Copy version of TransferSiteJs will delete anything else in the target dir
+task jalviewjsCopyTransferSiteMergeDir(type: Copy) {
+ dependsOn jalviewjsTranserSiteMergeDirs
+
+ from "${jalviewDir}/${jalviewjsTransferSiteMergeDir}"
+ into "${jalviewDir}/${jalviewjsSiteDir}"
+}
+
+
+// this Copy version of TransferSiteJs will delete anything else in the target dir
task jalviewjsCopyTransferSiteJs(type: Copy) {
dependsOn jalviewjsTranspile
+
from "${jalviewDir}/${jalviewjsTransferSiteJsDir}"
into "${jalviewDir}/${jalviewjsSiteDir}"
}
task jalviewjsPrepareSite {
group "JalviewJS"
description "Prepares the website folder including unzipping files and copying resources"
- dependsOn jalviewjsSyncAllLibs
+ //dependsOn jalviewjsSyncAllLibs // now using jalviewjsCopyTransferSiteMergeDir
dependsOn jalviewjsSyncResources
dependsOn jalviewjsSyncSiteResources
dependsOn jalviewjsSyncBuildProperties
task jalviewjsBuildSite {
group "JalviewJS"
description "Builds the whole website including transpiled code"
- dependsOn jalviewjsCopyTransferSiteJs
+ dependsOn jalviewjsCopyTransferSiteMergeDir
dependsOn jalviewjsPrepareSite
}
execStdout = stdout
execStderr = stderr
}
- def execArgs = [
+ // macOS not running properly with timeout arguments
+ def execArgs = macOS ? [] : [
+ "--virtual-time-budget=${timeoutms}",
+ ]
+ execArgs += [
"--no-sandbox", // --no-sandbox IS USED BY THE THORIUM APPIMAGE ON THE BUILDSERVER
"--headless=new",
"--disable-gpu",
- "--timeout=${timeoutms}",
- "--virtual-time-budget=${timeoutms}",
"--user-data-dir=${jalviewDirAbsolutePath}/${jalviewjsBuildDir}/${jalviewjs_chromium_user_dir}",
"--profile-directory=${jalviewjs_chromium_profile_name}",
"--allow-file-access-from-files",
jalviewjs_j2s_transpile_stdout = j2s-transpile.out
#jalviewjs_j2s_stderr = j2s-transpile.err # all going into out
jalviewjs_j2s_to_console = true
-jalviewjs_closure_compiler = tools/closure_compiler.jar
+jalviewjs_closure_compiler = tools/closure-compiler-v20230802.jar
+jalviewjs_closure_compiler_optimization_level = SIMPLE_OPTIMIZATIONS
jalviewjs_j2s_closure_stdout = j2s-closure.out
# for checking jalviewjs launches okay
jalviewjs_chromium_binary = ~/buildtools/chromium/chrome
-jalviewjs_macos_chromium_binary = /Applications/Chromium.app/Contents/MacOS/Chromium
+jalviewjs_macos_chromium_binary = ~/buildtools/chromium/Google Chrome for Testing.app/Contents/MacOS/Google Chrome for Testing
jalviewjs_chromium_user_dir = chromium
-jalviewjs_chromium_idle_timeout = 10
-jalviewjs_chromium_overall_timeout = 40
+jalviewjs_chromium_idle_timeout = 8
+jalviewjs_chromium_overall_timeout = 15
jalviewjs_chromium_profile_name = BUILD
jalviewjs_stderr_launch = utils/jalviewjs/chromium_test/jalview_bin_Jalview-stderr.html
jalviewjs_desktop_init_string = JALVIEWJS: CREATED DESKTOP
import jalview.util.ColorUtils;
import jalview.util.FileUtils;
import jalview.util.HttpUtils;
+import jalview.util.IdUtils;
+import jalview.util.IdUtils.IdType;
import jalview.util.ImageMaker;
import jalview.util.ImageMaker.TYPE;
import jalview.util.MessageManager;
if (avm.containsArg(Arg.APPEND) || avm.containsArg(Arg.OPEN))
{
commandArgsProvided = true;
- final long progress = System.currentTimeMillis();
+ final long progress = IdUtils.newId(IdType.PROGRESS);
boolean first = true;
boolean progressBarSet = false;
}
}
if (progressBarSet && desktop != null)
+ {
desktop.setProgressBar(null, progress);
-
+ }
}
// open the structure (from same PDB file or given PDBfile)
}
continue;
}
- try
+
+ /**
+ * @j2sIgnore no Thread.sleep(long)
+ */
{
- long tries = 1000;
- while (structureViewer.isBusy() && tries > 0)
+ try
{
- Thread.sleep(25);
- if (structureViewer.isBusy())
+ int tries = 1000;
+ while (structureViewer.isBusy() && tries > 0)
{
- tries--;
- Console.debug(
- "Waiting for viewer for " + structureFilepath);
+ Thread.sleep(25);
+ if (structureViewer.isBusy())
+ {
+ tries--;
+ Console.debug(
+ "Waiting for viewer for " + structureFilepath);
+ }
}
- }
- if (tries == 0 && structureViewer.isBusy())
+ if (tries == 0 && structureViewer.isBusy())
+ {
+ addWarn("Gave up waiting for structure viewer to load file '"
+ + structureFile
+ + "'. Something may have gone wrong.");
+ }
+ } catch (Exception x)
{
- addWarn("Gave up waiting for structure viewer to load file '"
- + structureFile
- + "'. Something may have gone wrong.");
+ addError("Exception whilst waiting for structure viewer "
+ + structureFilepath, x);
+ isError = true;
}
- } catch (Exception x)
- {
- addError("Exception whilst waiting for structure viewer "
- + structureFilepath, x);
- isError = true;
}
// add StructureViewer to svMap list
import jalview.schemes.ColourSchemeProperty;
import jalview.util.ChannelProperties;
import jalview.util.HttpUtils;
+import jalview.util.IdUtils;
+import jalview.util.IdUtils.IdType;
import jalview.util.LaunchUtils;
import jalview.util.MessageManager;
import jalview.util.Platform;
public void addFetcher(final AlignFrame af,
final Vector<String> dasSources)
{
- final long id = System.currentTimeMillis();
+ final long id = IdUtils.newId(IdType.PROGRESS);
queued++;
final FeatureFetcher us = this;
new Thread(new Runnable()
{
System.setSecurityManager(null);
}
+ else
+ {
+ setJSNamespace();
+ }
if (args == null || args.length == 0 || (args.length == 1
&& (args[0] == null || args[0].length() == 0)))
if (aparser.contains("help") || aparser.contains("h"))
{
/*
- * Now using new usage statement.
- showUsage();
- */
+ * Now using new usage statement. showUsage();
+ */
Console.outPrintln(Arg.usage());
Jalview.exit(null, ExitCode.OK);
}
setLookAndFeel();
/*
- * configure 'full' SO model if preferences say to, else use the default (full SO)
- * - as JS currently doesn't have OBO parsing, it must use 'Lite' version
+ * configure 'full' SO model if preferences say to, else use the default (full
+ * SO) - as JS currently doesn't have OBO parsing, it must use 'Lite' version
*/
boolean soDefault = !Platform.isJS();
if (Cache.getDefault("USE_FULL_SO", soDefault))
}
// Run Commands from cli
- cmds = new Commands(argparser, headlessArg);
- cmds.processArgs();
- boolean commandsSuccess = cmds.argsWereParsed();
-
- if (commandsSuccess)
+ boolean commandsSuccess = false;
+ if (!(argparser.isMixedStyle() || argparser.isOldStyle()))
{
- if (headlessArg)
+ cmds = new Commands(argparser, headlessArg);
+ cmds.processArgs();
+ commandsSuccess = cmds.argsWereParsed();
+
+ if (commandsSuccess)
{
- if (argparser.getBoolean(Arg.NOQUIT))
+ if (headlessArg)
{
- Console.warn(
- "Completed " + Arg.HEADLESS.getName() + " commands, but "
- + Arg.NOQUIT + " is set so not quitting!");
- }
- else
- {
- Jalview.exit("Successfully completed commands in headless mode",
- ExitCode.OK);
+ if (argparser.getBoolean(Arg.NOQUIT))
+ {
+ Console.warn("Completed " + Arg.HEADLESS.getName()
+ + " commands, but " + Arg.NOQUIT
+ + " is set so not quitting!");
+ }
+ else
+ {
+ Jalview.exit("Successfully completed commands in headless mode",
+ ExitCode.OK);
+ }
}
+ Console.info("Successfully completed commands");
}
- Console.info("Successfully completed commands");
- }
- else
- {
- if (headlessArg)
+ else
{
- Jalview.exit("Error when running Commands in headless mode",
- ExitCode.ERROR_RUNNING_COMMANDS);
+ if (headlessArg)
+ {
+ Jalview.exit("Error when running Commands in headless mode",
+ ExitCode.ERROR_RUNNING_COMMANDS);
+ }
+ Console.warn("Error when running commands");
}
- Console.warn("Error when running commands");
}
// Check if JVM and compile version might cause problems and log if it
desktop.setProgressBar(
MessageManager
.getString("status.processing_commandline_args"),
- progress = System.currentTimeMillis());
+ progress = IdUtils.newId(IdType.PROGRESS));
}
Console.outPrintln("CMD [-open " + file + "] executed successfully!");
ChannelProperties.getProperty("app_name"));
System.setProperty("apple.laf.useScreenMenuBar", "true");
/*
- * broken native LAFs on (ARM?) macbooks
- set = setQuaquaLookAndFeel();
- if ((!set) || !UIManager.getLookAndFeel().getClass().toString()
- .toLowerCase(Locale.ROOT).contains("quaqua"))
- {
- set = setVaquaLookAndFeel();
- }
+ * broken native LAFs on (ARM?) macbooks set = setQuaquaLookAndFeel(); if
+ * ((!set) || !UIManager.getLookAndFeel().getClass().toString()
+ * .toLowerCase(Locale.ROOT).contains("quaqua")) { set = setVaquaLookAndFeel();
+ * }
*/
set = setFlatLookAndFeel();
return set;
}
/*
- private static void showUsage()
- {
- jalview.bin.Console.outPrintln(
- "Usage: jalview -open [FILE] [OUTPUT_FORMAT] [OUTPUT_FILE]\n\n"
- + "-nodisplay\tRun Jalview without User Interface.\n"
- + "-props FILE\tUse the given Jalview properties file instead of users default.\n"
- + "-colour COLOURSCHEME\tThe colourscheme to be applied to the alignment\n"
- + "-annotations FILE\tAdd precalculated annotations to the alignment.\n"
- + "-tree FILE\tLoad the given newick format tree file onto the alignment\n"
- + "-features FILE\tUse the given file to mark features on the alignment.\n"
- + "-fasta FILE\tCreate alignment file FILE in Fasta format.\n"
- + "-clustal FILE\tCreate alignment file FILE in Clustal format.\n"
- + "-pfam FILE\tCreate alignment file FILE in PFAM format.\n"
- + "-msf FILE\tCreate alignment file FILE in MSF format.\n"
- + "-pileup FILE\tCreate alignment file FILE in Pileup format\n"
- + "-pir FILE\tCreate alignment file FILE in PIR format.\n"
- + "-blc FILE\tCreate alignment file FILE in BLC format.\n"
- + "-json FILE\tCreate alignment file FILE in JSON format.\n"
- + "-jalview FILE\tCreate alignment file FILE in Jalview format.\n"
- + "-png FILE\tCreate PNG image FILE from alignment.\n"
- + "-svg FILE\tCreate SVG image FILE from alignment.\n"
- + "-html FILE\tCreate HTML file from alignment.\n"
- + "-biojsMSA FILE\tCreate BioJS MSA Viewer HTML file from alignment.\n"
- + "-imgMap FILE\tCreate HTML file FILE with image map of PNG image.\n"
- + "-eps FILE\tCreate EPS file FILE from alignment.\n"
- + "-questionnaire URL\tQueries the given URL for information about any Jalview user questionnaires.\n"
- + "-noquestionnaire\tTurn off questionnaire check.\n"
- + "-nonews\tTurn off check for Jalview news.\n"
- + "-nousagestats\tTurn off analytics tracking for this session.\n"
- + "-sortbytree OR -nosortbytree\tEnable or disable sorting of the given alignment by the given tree\n"
- // +
- // "-setprop PROPERTY=VALUE\tSet the given Jalview property,
- // after all other properties files have been read\n\t
- // (quote the 'PROPERTY=VALUE' pair to ensure spaces are
- // passed in correctly)"
- + "-jabaws URL\tSpecify URL for Jabaws services (e.g. for a local installation).\n"
- + "-fetchfrom nickname\tQuery nickname for features for the alignments and display them.\n"
- + "-groovy FILE\tExecute groovy script in FILE, after all other arguments have been processed (if FILE is the text 'STDIN' then the file will be read from STDIN)\n"
- + "-jvmmempc=PERCENT\tOnly available with standalone executable jar or jalview.bin.Launcher. Limit maximum heap size (memory) to PERCENT% of total physical memory detected. This defaults to 90 if total physical memory can be detected. See https://www.jalview.org/help/html/memory.html for more details.\n"
- + "-jvmmemmax=MAXMEMORY\tOnly available with standalone executable jar or jalview.bin.Launcher. Limit maximum heap size (memory) to MAXMEMORY. MAXMEMORY can be specified in bytes, kilobytes(k), megabytes(m), gigabytes(g) or if you're lucky enough, terabytes(t). This defaults to 32g if total physical memory can be detected, or to 8g if total physical memory cannot be detected. See https://www.jalview.org/help/html/memory.html for more details.\n"
- + "\n~Read documentation in Application or visit https://www.jalview.org for description of Features and Annotations file~\n\n");
- }
- */
+ * private static void showUsage() { jalview.bin.Console.outPrintln(
+ * "Usage: jalview -open [FILE] [OUTPUT_FORMAT] [OUTPUT_FILE]\n\n" +
+ * "-nodisplay\tRun Jalview without User Interface.\n" +
+ * "-props FILE\tUse the given Jalview properties file instead of users default.\n"
+ * + "-colour COLOURSCHEME\tThe colourscheme to be applied to the alignment\n" +
+ * "-annotations FILE\tAdd precalculated annotations to the alignment.\n" +
+ * "-tree FILE\tLoad the given newick format tree file onto the alignment\n" +
+ * "-features FILE\tUse the given file to mark features on the alignment.\n" +
+ * "-fasta FILE\tCreate alignment file FILE in Fasta format.\n" +
+ * "-clustal FILE\tCreate alignment file FILE in Clustal format.\n" +
+ * "-pfam FILE\tCreate alignment file FILE in PFAM format.\n" +
+ * "-msf FILE\tCreate alignment file FILE in MSF format.\n" +
+ * "-pileup FILE\tCreate alignment file FILE in Pileup format\n" +
+ * "-pir FILE\tCreate alignment file FILE in PIR format.\n" +
+ * "-blc FILE\tCreate alignment file FILE in BLC format.\n" +
+ * "-json FILE\tCreate alignment file FILE in JSON format.\n" +
+ * "-jalview FILE\tCreate alignment file FILE in Jalview format.\n" +
+ * "-png FILE\tCreate PNG image FILE from alignment.\n" +
+ * "-svg FILE\tCreate SVG image FILE from alignment.\n" +
+ * "-html FILE\tCreate HTML file from alignment.\n" +
+ * "-biojsMSA FILE\tCreate BioJS MSA Viewer HTML file from alignment.\n" +
+ * "-imgMap FILE\tCreate HTML file FILE with image map of PNG image.\n" +
+ * "-eps FILE\tCreate EPS file FILE from alignment.\n" +
+ * "-questionnaire URL\tQueries the given URL for information about any Jalview user questionnaires.\n"
+ * + "-noquestionnaire\tTurn off questionnaire check.\n" +
+ * "-nonews\tTurn off check for Jalview news.\n" +
+ * "-nousagestats\tTurn off analytics tracking for this session.\n" +
+ * "-sortbytree OR -nosortbytree\tEnable or disable sorting of the given alignment by the given tree\n"
+ * // + // "-setprop PROPERTY=VALUE\tSet the given Jalview property, // after
+ * all other properties files have been read\n\t // (quote the 'PROPERTY=VALUE'
+ * pair to ensure spaces are // passed in correctly)" +
+ * "-jabaws URL\tSpecify URL for Jabaws services (e.g. for a local installation).\n"
+ * +
+ * "-fetchfrom nickname\tQuery nickname for features for the alignments and display them.\n"
+ * +
+ * "-groovy FILE\tExecute groovy script in FILE, after all other arguments have been processed (if FILE is the text 'STDIN' then the file will be read from STDIN)\n"
+ * +
+ * "-jvmmempc=PERCENT\tOnly available with standalone executable jar or jalview.bin.Launcher. Limit maximum heap size (memory) to PERCENT% of total physical memory detected. This defaults to 90 if total physical memory can be detected. See https://www.jalview.org/help/html/memory.html for more details.\n"
+ * +
+ * "-jvmmemmax=MAXMEMORY\tOnly available with standalone executable jar or jalview.bin.Launcher. Limit maximum heap size (memory) to MAXMEMORY. MAXMEMORY can be specified in bytes, kilobytes(k), megabytes(m), gigabytes(g) or if you're lucky enough, terabytes(t). This defaults to 32g if total physical memory can be detected, or to 8g if total physical memory cannot be detected. See https://www.jalview.org/help/html/memory.html for more details.\n"
+ * +
+ * "\n~Read documentation in Application or visit https://www.jalview.org for description of Features and Annotations file~\n\n"
+ * ); }
+ */
private static void startUsageStats(final Desktop desktop)
{
}
}
+ /**
+ * Namespace (if set) by JalviewJS
+ */
+ private String JSNamespace = null;
+
+ private void setJSNamespace(String ns)
+ {
+ if (!Platform.isJS())
+ {
+ return;
+ }
+ Console.outPrintln("JSNamespace set to '" + ns + "'");
+ JSNamespace = ns;
+ }
+
+ public String getJSNamespace()
+ {
+ return JSNamespace;
+ }
+
+ public void setJSNamespace()
+ {
+ if (!Platform.isJS())
+ {
+ return;
+ }
+ String ns = null;
+ /**
+ * @j2sNative var namespace = J2S.thisApplet.__Info.namespace;
+ *
+ * if (namespace === undefined)
+ *
+ * {
+ *
+ * System.out.println("No namespace given");
+ *
+ * }
+ *
+ * else
+ *
+ * {
+ *
+ * ns = namespace;
+ *
+ * }
+ */
+ setJSNamespace(ns);
+ }
+
}
*/
package jalview.bin;
-import jalview.util.Platform;
-
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.Timer;
+import jalview.util.Platform;
+
/**
* Entry point for JalviewJS development.
*
* @j2sNative
*
* J2S.thisApplet.__Info.args =
- * ["open","examples/uniref50.fa","features",
- * "examples/exampleFeatures.txt"];
+ * ["--open","examples/exampleFile_2_7.jar"];
*/
}
*/
private boolean allStructures = false;
+ /**
+ * flag to say whether to ignore or reject non-string values args with a value
+ * e.g., --wrap=hello
+ *
+ * Default is false (i.e. reject non-string args that have a value. It is set
+ * to true for JalviewJS in Platform.getURLCommandArguments().
+ */
+ private static boolean ignoreNonStringValues = false;
+
protected static final Map<String, Arg> argMap;
protected Map<String, ArgValuesMap> linkedArgs = new HashMap<>();
}
if (!a.hasOption(Opt.STRING) && equalPos > -1)
{
- // set --argname=value when arg does not accept values
- Console.error("Argument '" + a.argString()
- + "' does not expect a value (given as '" + arg
- + "'). Ignoring.");
- continue;
+ if (getIgnoreNonStringValues())
+ {
+ // delete equals sign and value
+ val = null;
+ arg = arg.substring(0, equalPos);
+ }
+ else
+ {
+ // set --argname=value when arg does not accept values
+ Console.error("Argument '" + a.argString()
+ + "' does not expect a value (given as '" + arg
+ + "'). Ignoring.");
+ continue;
+ }
}
if (!a.hasOption(Opt.LINKED) && linkedId != null)
{
this.currentStructureFilename = s;
}
+ public static boolean getIgnoreNonStringValues()
+ {
+ return ignoreNonStringValues;
+ }
+
+ public static void setIgnoreNonStringValues(boolean b)
+ {
+ ignoreNonStringValues = b;
+ }
}
\ No newline at end of file
import jalview.io.FileFormat;
import jalview.io.FormatAdapter;
import jalview.util.Comparison;
+import jalview.util.IdUtils;
+import jalview.util.IdUtils.IdType;
import jalview.util.MessageManager;
import jalview.util.Platform;
MessageManager.formatMessage(
"action.clustering_matrix_for",
cm.getAnnotDescr(), 5f),
- progBar = System.currentTimeMillis());
+ progBar = IdUtils.newId(IdType.PROGRESS));
cm.setGroupSet(GroupSet.makeGroups(cm, true));
cm.randomlyReColourGroups();
cm.transferGroupColorsTo(alignmentAnnotation);
{
try
{
- Console.debug("Waiting around for jmb notify.");
waitTotal += waitFor;
-
- // Thread.sleep() throws an exception in JS
- Thread.sleep(waitFor);
+ /**
+ * @j2sIgnore no Thread.sleep()
+ */
+ {
+ Console.debug("Waiting around for jmb notify.");
+ // Thread.sleep() throws an exception in JS
+ Thread.sleep(waitFor);
+ }
} catch (Exception e)
{
}
*/
package jalview.gui;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
import jalview.analysis.AlignmentUtils;
import jalview.analysis.CrossRef;
import jalview.api.AlignmentViewPanel;
import jalview.io.gff.SequenceOntologyI;
import jalview.structure.StructureSelectionManager;
import jalview.util.DBRefUtils;
+import jalview.util.IdUtils;
+import jalview.util.IdUtils.IdType;
import jalview.util.MapList;
import jalview.util.MappingUtils;
import jalview.util.MessageManager;
import jalview.viewmodel.seqfeatures.FeatureRendererModel;
import jalview.ws.SequenceFetcher;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-
/**
* Factory constructor and runnable for discovering and displaying
* cross-references for a set of aligned sequences
@Override
public void run()
{
- final long sttime = System.currentTimeMillis();
+ final long id = IdUtils.newId(IdType.PROGRESS);
alignFrame.setProgressBar(MessageManager.formatMessage(
"status.searching_for_sequences_from", new Object[]
- { source }), sttime);
+ { source }), id);
try
{
AlignmentI alignment = alignFrame.getViewport().getAlignment();
{
alignFrame.setProgressBar(MessageManager.formatMessage(
"status.finished_searching_for_sequences_from", new Object[]
- { source }), sttime);
+ { source }), id);
}
}
import jalview.urls.IdOrgSettings;
import jalview.util.BrowserLauncher;
import jalview.util.ChannelProperties;
+import jalview.util.IdUtils;
+import jalview.util.IdUtils.IdType;
import jalview.util.ImageMaker.TYPE;
import jalview.util.LaunchUtils;
import jalview.util.MessageManager;
if (LaunchUtils.getJavaVersion() >= 11)
{
/*
- * Send this message to stderr as the warning that follows (due to
- * reflection) also goes to stderr.
+ * Send this message to stderr as the warning that follows (due to reflection)
+ * also goes to stderr.
*/
jalview.bin.Console.errPrintln(
"Linux platform only! You may have the following warning next: \"WARNING: An illegal reflective access operation has occurred\"\nThis is expected and cannot be avoided, sorry about that.");
Platform.isJS() ? desktop.getDesktopManager()
: new DefaultDesktopManager()));
/*
- (Platform.isWindowsAndNotJS() ? new DefaultDesktopManager()
- : Platform.isAMacAndNotJS()
- ? new AquaInternalFrameManager(
- desktop.getDesktopManager())
- : desktop.getDesktopManager())));
- */
+ * (Platform.isWindowsAndNotJS() ? new DefaultDesktopManager() :
+ * Platform.isAMacAndNotJS() ? new AquaInternalFrameManager(
+ * desktop.getDesktopManager()) : desktop.getDesktopManager())));
+ */
Rectangle dims = getLastKnownDimensions("");
if (dims != null)
if (Platform.isJS())
{
+ String ns = Jalview.getInstance().getJSNamespace();
+ if (ns != null)
+ {
+
+ String nsc = ns + (ns.length() > 0 ? ":" : "");
+ String splashId = nsc + "jalviewSplash";
+ /**
+ * @j2sNative let splash = document.getElementById(splashId);
+ *
+ * if (splash != null) {
+ *
+ * splash.style.display = "none";
+ *
+ * }
+ */
+ }
// used for jalviewjsTest
jalview.bin.Console.info("JALVIEWJS: CREATED DESKTOP");
}
@Override
public void run()
{
- long now = System.currentTimeMillis();
+ long progressId = IdUtils.newId(IdType.PROGRESS);
Desktop.instance.setProgressBar(
- MessageManager.getString("status.refreshing_news"), now);
+ MessageManager.getString("status.refreshing_news"),
+ progressId);
jvnews.refreshNews();
- Desktop.instance.setProgressBar(null, now);
+ Desktop.instance.setProgressBar(null, progressId);
jvnews.showNews();
}
}).start();
}
}
evt.dropComplete(success); // need this to ensure input focus is properly
- // transfered to any new windows created
+ // transfered to any new windows created
}
/**
// TODO: refactor to Jalview desktop session controller action.
setProgressBar(MessageManager.formatMessage(
"label.saving_jalview_project", new Object[]
- { chosenFile.getName() }), chosenFile.hashCode());
+ { chosenFile.getName() }),
+ IdUtils.newId(IdType.PROGRESS, chosenFile));
Cache.setProperty("LAST_DIRECTORY", chosenFile.getParent());
// TODO catch and handle errors for savestate
// TODO prevent user from messing with the Desktop whilst we're saving
MessageManager.getString("label.couldnt_save_project"),
JvOptionPane.WARNING_MESSAGE);
}
- setProgressBar(null, chosenFile.hashCode());
+ setProgressBar(null, IdUtils.newId(IdType.PROGRESS, chosenFile));
}
}).start();
}
JalviewFileChooser chooser = new JalviewFileChooser(
Cache.getProperty("LAST_DIRECTORY"), suffix, desc,
"Jalview Project", true, BackupFiles.getEnabled()); // last two
- // booleans:
- // allFiles,
+ // booleans:
+ // allFiles,
// allowBackupFiles
chooser.setFileView(new JalviewFileView());
chooser.setDialogTitle(MessageManager.getString("label.restore_state"));
{
progress.setProgressBar(MessageManager
.formatMessage("status.opening_params", new Object[]
- { url }), this.hashCode());
+ { url }), IdUtils.newId(IdType.PROGRESS, this));
}
jalview.util.BrowserLauncher.openURL(url);
} catch (Exception ex)
}
if (progress != null)
{
- progress.setProgressBar(null, this.hashCode());
+ progress.setProgressBar(null,
+ IdUtils.newId(IdType.PROGRESS, this));
}
}
}).start();
{
Objects.requireNonNull(ttext,
"Tootip text to format must not be null!");
- ttext = ttext.trim();
+ if (enclose)
+ {
+ ttext = ttext.trim();
+ }
boolean maxLengthExceeded = false;
- if (ttext.contains("<br>"))
+ boolean hasBr = false;
+ for (String br : new String[] { "<br>", "<br/>" })
{
- String[] htmllines = ttext.split("<br>");
- for (String line : htmllines)
+ if (ttext.contains(br))
{
- maxLengthExceeded = line.length() > 60;
- if (maxLengthExceeded)
+ hasBr = true;
+ String[] htmllines = ttext.split(br);
+ StringBuilder sb = new StringBuilder();
+ for (String line : htmllines)
{
- break;
+ if (enclose)
+ {
+ line = line.replaceAll("\\s+", " ");
+ line = line.trim();
+ }
+ if (line.length() == 0 || line.equals(" "))
+ {
+ continue;
+ }
+ String linetext = line.replaceAll("<[^>]+>", "");
+ maxLengthExceeded = linetext.length() > 60;
+ if (sb.length() > 0)
+ {
+ sb.append(br);
+ }
+ sb.append(line);
}
+ ttext = sb.toString();
}
}
- else
+ if (enclose)
+ {
+ ttext = ttext.replaceAll("\\s+", " ");
+ ttext = ttext.trim();
+ }
+ if (!hasBr)
{
maxLengthExceeded = ttext.length() > 60;
}
// + "<style> p.ttip {width:350px;margin:-14px 0px -14px
// 0px;padding:2px;overflow-wrap:break-word;}"
// + "</style><p class=\"ttip\">"
- + ttext + " </div>"
+ + ttext + "</div>"
// + "</p>"
+ ((enclose ? "</html>" : ""));
}
import jalview.io.exceptions.ImageOutputException;
import jalview.jbgui.GPCAPanel;
import jalview.math.RotatableMatrix.Axis;
+import jalview.util.IdUtils;
+import jalview.util.IdUtils.IdType;
import jalview.util.ImageMaker;
import jalview.util.MessageManager;
import jalview.viewmodel.AlignmentViewport;
public void run()
{
working = true;
- long progId = System.currentTimeMillis();
+ long progId = IdUtils.newId(IdType.PROGRESS);
IProgressIndicator progress = this;
String message = MessageManager.getString("label.pca_recalculating");
if (getParent() == null)
}
}
+ @Override
public void makePCAImage(ImageMaker.TYPE type)
{
int width = getRotatableCanvas().getWidth();
}
if (unshownFeatures > 0)
{
- tooltipText.append("<br/>").append("... ").append("<i>")
+ tooltipText.append("<br/>... <i>")
.append(MessageManager.formatMessage(
"label.features_not_shown", unshownFeatures))
.append("</i>");
import jalview.io.FileFormatI;
import jalview.io.gff.SequenceOntologyI;
import jalview.util.DBRefUtils;
+import jalview.util.IdUtils;
+import jalview.util.IdUtils.IdType;
import jalview.util.MessageManager;
import jalview.util.Platform;
import jalview.ws.seqfetcher.DbSourceProxy;
"status.fetching_sequence_queries_from", new String[]
{ Integer.valueOf(nqueries).toString(),
proxy.getDbName() }),
- Thread.currentThread().hashCode());
+ IdUtils.newId(IdType.PROGRESS, Thread.currentThread()));
if (proxy.getMaximumQueryCount() == 1)
{
/*
}
guiWindow.setProgressBar(
MessageManager.getString("status.finshed_querying"),
- Thread.currentThread().hashCode());
+ IdUtils.newId(IdType.PROGRESS, Thread.currentThread()));
}
guiWindow
.setProgressBar(
? MessageManager
.getString("status.parsing_results")
: MessageManager.getString("status.processing"),
- Thread.currentThread().hashCode());
+ IdUtils.newId(IdType.PROGRESS, Thread.currentThread()));
// process results
while (presult.size() > 0)
{
preferredFeatureColours);
}
// only remove visual delay after we finished parsing.
- guiWindow.setProgressBar(null, Thread.currentThread().hashCode());
+ guiWindow.setProgressBar(null,
+ IdUtils.newId(IdType.PROGRESS, Thread.currentThread()));
if (nextFetch.size() > 0)
{
StringBuffer sb = new StringBuffer();
import jalview.structure.StructureImportSettings.TFType;
import jalview.structure.StructureMapping;
import jalview.structure.StructureSelectionManager;
+import jalview.util.IdUtils;
+import jalview.util.IdUtils.IdType;
import jalview.util.MessageManager;
import jalview.util.Platform;
import jalview.util.StringUtils;
*/
public void promptForTDBFetch(boolean ignoreGui)
{
- final long progressId = System.currentTimeMillis();
+ final long progressId = IdUtils.newId(IdType.PROGRESS);
// final action after prompting and discovering db refs
final Runnable strucDiscovery = new Runnable()
final String progress = MessageManager
.getString("label.working_ellipsis");
- setProgressBar(progress, progress.hashCode());
+ setProgressBar(progress, IdUtils.newId(IdType.PROGRESS, progress));
Runnable viewStruc = new Runnable()
{
@Override
@Override
public void run()
{
- setProgressBar("Complete.", progress.hashCode());
+ setProgressBar("Complete.",
+ IdUtils.newId(IdType.PROGRESS, progress));
closeAction(preferredHeight);
mainFrame.dispose();
}
import jalview.structure.StructureMapping;
import jalview.structures.models.AAStructureBindingModel;
import jalview.util.BrowserLauncher;
+import jalview.util.IdUtils;
+import jalview.util.IdUtils.IdType;
import jalview.util.MessageManager;
import jalview.ws.dbsources.EBIAlfaFold;
import jalview.ws.dbsources.Pdb;
*
* @return TRUE if the view is NOT being coloured by the alignment colours.
*/
+ @Override
public boolean isColouredByViewer()
{
return !getBinding().isColourBySequence();
}
+ @Override
public String getViewId()
{
if (viewId == null)
}
}
+ @Override
public abstract ViewerType getViewerType();
/**
{
// TODO would rather have startProgress/stopProgress as the
// IProgressIndicator interface
- long tm = random.nextLong();
+ long tm = IdUtils.newId(IdType.PROGRESS);
if (progressBar != null)
{
progressBar.setProgressBar(msg, tm);
EBIAlfaFold afclient = new EBIAlfaFold();
AlignmentI pdbseq = null;
String pdbid = processingEntry.getId();
- long handle = System.currentTimeMillis()
- + Thread.currentThread().hashCode();
+ long handle = IdUtils.newId(IdType.PROGRESS);
/*
* Write 'fetching PDB' progress on AlignFrame as we are not yet visible
*
* @return
*/
+ @Override
public File saveSession()
{
if (getBinding() == null)
import jalview.bin.Cache;
import jalview.jbgui.GWsPreferences;
+import jalview.util.IdUtils;
+import jalview.util.IdUtils.IdType;
import jalview.util.MessageManager;
import jalview.ws.jws2.Jws2Discoverer;
import jalview.ws.rest.RestServiceDescription;
@Override
public void run()
{
- long ct = System.currentTimeMillis();
+ long ct = IdUtils.newId(IdType.PROGRESS);
Desktop.instance.setProgressBar(MessageManager
.getString("status.refreshing_web_service_menus"), ct);
if (lastrefresh != update)
import jalview.gui.AlignmentPanel;
import jalview.gui.IProgressIndicator;
import jalview.io.exceptions.ImageOutputException;
+import jalview.util.IdUtils;
+import jalview.util.IdUtils.IdType;
import jalview.util.MessageManager;
public abstract class HTMLOutput implements Runnable
this.ap = ap;
this.pIndicator = ap.alignFrame;
this.description = desc;
- this.pSessionId = System.currentTimeMillis();
+ this.pSessionId = IdUtils.newId(IdType.PROGRESS);
}
/**
return false;
}
- public String getExtension(File f)
+ public static String getExtension(File f)
{
- if (f != null)
+ if (f == null)
+ {
+ return "";
+ }
+ String ext = getExtension(f.getName(), true, true);
+ return ext;
+ }
+
+ public static String getExtension(String filename, boolean ignoreGz,
+ boolean emptyStringForNoExtension)
+ {
+ if (filename == null)
{
- String filename = f.getName();
- int i = filename.lastIndexOf('.');
+ return emptyStringForNoExtension ? "" : null;
+ }
+ int i = filename.lastIndexOf('.');
- if ((i > 0) && (i < (filename.length() - 1)))
+ // i>0 as we don't consider a file ".hidden" to be an extension of "hidden"
+ // i<(filename.length()-1) since we don't consider a file "hi." to have an
+ // extension
+ if (i > 0 && i < (filename.length() - 1))
+ {
+ String ext = filename.substring(i + 1).toLowerCase(Locale.ROOT);
+ if (ignoreGz && ext.equals("gz"))
{
- return filename.substring(i + 1).toLowerCase(Locale.ROOT);
+ // don't allow .gz all the way down! (only one in fact)
+ return getExtension(filename.substring(0, i), false,
+ emptyStringForNoExtension);
+ }
+ else
+ {
+ return ext;
}
-
- ;
}
- return "";
+ return emptyStringForNoExtension ? "" : null;
}
public void addExtension(String extension)
*/
package jalview.io;
-import java.util.Locale;
-
-import jalview.util.MessageManager;
-
import java.io.File;
import java.net.URL;
import java.util.HashMap;
import java.util.Iterator;
+import java.util.Locale;
import java.util.Map;
import javax.swing.Icon;
import javax.swing.ImageIcon;
import javax.swing.filechooser.FileView;
+import jalview.util.MessageManager;
+
public class JalviewFileView extends FileView
{
private static Map<String, String> extensions;
*/
public static String getExtension(File f)
{
- String ext = null;
- String s = f.getName();
- int i = s.lastIndexOf('.');
-
- if ((i > 0) && (i < (s.length() - 1)))
+ // don't set an icon for folders (that's flatlaf's job!)
+ if (f.isDirectory())
{
- ext = s.substring(i + 1).toLowerCase(Locale.ROOT);
+ return null;
}
-
- return ext;
+ // ignore .gz and want null for no extension
+ return JalviewFileFilter.getExtension(f.getName(), true, false);
}
/**
import jalview.io.DataSourceType;
import jalview.io.StructureFile;
import jalview.structure.StructureImportSettings.TFType;
+import jalview.util.IdUtils;
+import jalview.util.IdUtils.IdType;
import jalview.util.MappingUtils;
import jalview.util.MessageManager;
import jalview.util.Platform;
IProgressIndicator progress, TFType tft, String paeFilename,
boolean doXferSettings)
{
- long progressSessionId = System.currentTimeMillis() * 3;
+ long progressSessionId = IdUtils.newId(IdType.PROGRESS);
/**
* do we extract and transfer annotation from 3D data ?
--- /dev/null
+package jalview.util;
+
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Map;
+import java.util.Set;
+
+import jalview.bin.Console;
+
+public class IdUtils
+{
+ /**
+ * id generating tools avoiding Random.nextLong() for JalviewJS. Avoids
+ * collisions.
+ */
+
+ public static enum IdType
+ {
+ GENERAL, PROGRESS;
+ }
+
+ private static int count = 0;
+
+ private static Map<IdType, Set<Long>> typeMap = new HashMap<>();
+
+ static
+ {
+ for (IdType t : IdType.values())
+ {
+ typeMap.put(t, new HashSet<>());
+ }
+ }
+
+ public static long newId()
+ {
+ return newId(IdType.GENERAL, null);
+ }
+
+ public static long newId(IdType t)
+ {
+ return newId(t, null);
+ }
+
+ public static long newId(IdType t, Object o)
+ {
+ Set<Long> idSet = typeMap.get(t);
+ long newId = 0;
+ if (o == null)
+ {
+ // get a new hashCode -- not tied to an object.
+ // Adding Integer.MAX_VALUE should avoid collisions with object generated
+ // Ids.
+ newId = Integer.MAX_VALUE + t.hashCode() + System.currentTimeMillis()
+ + count;
+ while (idSet.contains(newId))
+ {
+ newId += count;
+ }
+ }
+ else
+ {
+ // generate the hashcode tied to this object for this type
+ newId = t.hashCode() + o.hashCode();
+ if (idSet.contains(newId))
+ {
+ Console.debug("Using an existing id for Type " + t.name()
+ + " and object " + o.toString() + ": '" + newId + "'");
+ }
+ else
+ {
+ idSet.add(newId);
+ }
+ }
+ count++;
+ return newId;
+ }
+
+ public static void NOTremoveId(IdType t, Object o)
+ {
+ if (o == null)
+ {
+ return;
+ }
+ Set<Long> idSet = typeMap.get(t);
+ long id = t.hashCode() + o.hashCode();
+ idSet.remove(id);
+ }
+
+ public static void NOTremoveId(IdType t, long id)
+ {
+ Set<Long> idSet = typeMap.get(t);
+ idSet.remove(id);
+ }
+
+}
import org.json.simple.parser.JSONParser;
import org.json.simple.parser.ParseException;
+import jalview.bin.argparser.ArgParser;
import jalview.javascript.json.JSON;
/**
{
jalview.bin.Console.outPrintln(
"Platform adding known access-control-allow-origin * for domain "
- + domain);
- /**
- * @j2sNative
- *
- * J2S.addDirectDatabaseCall(domain);
- */
+ + domain);/**
+ * @j2sNative
+ *
+ * J2S.addDirectDatabaseCall(domain);
+ */
}
}
public static void getURLCommandArguments()
{
- try
- {
- /**
- * Retrieve the first query field as command arguments to Jalview. Include
- * only if prior to "?j2s" or "&j2s" or "#". Assign the applet's
- * __Info.args element to this value.
- *
- * @j2sNative var a =
- * decodeURI((document.location.href.replace("&","?").split("?j2s")[0]
- * + "?").split("?")[1].split("#")[0]); a &&
- * (jalview.bin.Console.outPrintln("URL arguments detected were
- * "+a)) && (J2S.thisApplet.__Info.urlargs = a.split(" "));
- * (!J2S.thisApplet.__Info.args || J2S.thisApplet.__Info.args
- * == "" || J2S.thisApplet.__Info.args == "??") &&
- * (J2S.thisApplet.__Info.args = a) &&
- * (jalview.bin.Console.outPrintln("URL arguments were passed
- * to J2S main."));
- */
- } catch (Throwable t)
+
+ // setting ArgParser.ignoreNonStringValues allows non-string args to be
+ // set with, e.g., --wrap=hello
+ // which might be necessary for a querystring, plus we don't have access
+ // to Arg.hasOption(Opt.STRING)
+ if (Platform.isJS())
{
+ ArgParser.setIgnoreNonStringValues(true);
+ try
+ {
+
+ String ns = null;
+
+ // extra spaces between lines of javascript to avoid eclipse comment
+ // munging into one line
+
+ /**
+ * Retrieve the first query field as command arguments to Jalview.
+ * Include only if prior to "?j2s" or "&j2s" or "#". Assign the applet's
+ * __Info.args element to this value.
+ *
+ * if a namespace has been given in Info={...}. Use this namespace to
+ * find arguments and values in the querystring parameters. Arguments
+ * that do not take a value do not need to have a value in the
+ * querystring. If they do they will be ignored. Note, this means you
+ * cannot do 'debug=false' instead of 'nodebug'. If querystringnamepsace
+ * is an empty string ("") then no colon (":") will be expected.
+ *
+ * if namespace is not defined then use the old style single first
+ * parameter for arguments
+ *
+ * @j2sNative var namespace = J2S.thisApplet.__Info.namespace;
+ *
+ * if (namespace === undefined)
+ *
+ * {
+ *
+ * System.out.println("No namespace given");
+ *
+ * var a =
+ * decodeURI((document.location.href.replace("&","?").split("?j2s")[0]
+ * + "?").split("?")[1].split("#")[0]);
+ *
+ * a && (System.out.println("URL arguments detected were
+ * "+a)) && (J2S.thisApplet.__Info.urlargs = a.split(" "));
+ *
+ * (!J2S.thisApplet.__Info.args || J2S.thisApplet.__Info.args
+ * == "" || J2S.thisApplet.__Info.args == "??") &&
+ * (J2S.thisApplet.__Info.args = a) &&
+ * (System.out.println("URL arguments were passed to J2S
+ * main."));
+ *
+ * }
+ *
+ * else // namespace is defined
+ *
+ * {
+ *
+ * ns = "";
+ *
+ * var nsc = "";
+ *
+ * if (J2S.thisApplet.__Info.namespace) {
+ *
+ * ns = J2S.thisApplet.__Info.namespace;
+ *
+ * nsc = ns + ":";
+ *
+ * }
+ *
+ * System.out.println("Querystring namespace is '" + nsc +
+ * "'");
+ *
+ * var qsParams = new
+ * URLSearchParams(window.location.search);
+ *
+ * var qsargs = [];
+ *
+ * for (var param of qsParams) {
+ *
+ * var key = param[0];
+ *
+ * var val = param[1];
+ *
+ * if (key.startsWith(nsc)) {
+ *
+ * var arg = key.substring(nsc.length);
+ *
+ * qsargs.push("--" + arg + "=" + val);
+ *
+ * System.out.println("Setting arg '"+arg+"' to '"+val+"'");
+ *
+ * }
+ *
+ * }
+ *
+ * qsargs && (System.out.println("URL parameters detected
+ * were "+qsargs.join(" "))) &&
+ * (J2S.thisApplet.__Info.urlargs = qsargs);
+ *
+ * (!J2S.thisApplet.__Info.args || J2S.thisApplet.__Info.args
+ * == "" || J2S.thisApplet.__Info.args == "??") &&
+ * (J2S.thisApplet.__Info.args = qsargs.join(" ")) &&
+ * (System.out.println("URL parameters were passed to J2S
+ * main."));
+ *
+ * }
+ */
+ } catch (Throwable t)
+ {
+ /**
+ * @j2sNative System.err.println("Problem looking for arguments");
+ * console.log("Problem looking for arguments");
+ * console.log(t);
+ */
+ }
}
}
{
return CONSOLEWIDTH;
}
-}
+
+}
\ No newline at end of file
import java.util.ArrayList;
import java.util.List;
import java.util.Locale;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
public class StringUtils
{
- private static final Pattern DELIMITERS_PATTERN = Pattern
- .compile(".*='[^']*(?!')");
-
private static final char PERCENT = '%';
private static final boolean DEBUG = false;
* Parses the input string into components separated by the delimiter. Unlike
* String.split(), this method will ignore occurrences of the delimiter which
* are nested within single quotes in name-value pair values, e.g. a='b,c'.
+ * New implementation to avoid Pattern for jalviewjs.
*
* @param input
* @param delimiter
public static String[] separatorListToArray(String input,
String delimiter)
{
- int seplen = delimiter.length();
- if (input == null || input.equals("") || input.equals(delimiter))
+ if (input == null
+ // these two shouldn't return null (one or two "" respectively)
+ || input.equals("") || input.equals(delimiter))
{
return null;
}
- List<String> jv = new ArrayList<>();
- int cp = 0, pos, escape;
- boolean wasescaped = false, wasquoted = false;
- String lstitem = null;
- while ((pos = input.indexOf(delimiter, cp)) >= cp)
+
+ final char escapeChar = '\\';
+ final char quoteChar = '\'';
+ int ilength = input.length();
+ int dlength = delimiter.length();
+ List<String> values = new ArrayList<>();
+
+ boolean escape = false;
+ boolean inquote = false;
+
+ int start = 0;
+ for (int i = 0; i < ilength; i++)
{
- escape = (pos > 0 && input.charAt(pos - 1) == '\\') ? -1 : 0;
- if (wasescaped || wasquoted)
+ if (!escape && !inquote && ilength >= i + dlength
+ && input.substring(i, i + dlength).equals(delimiter))
{
- // append to previous pos
- jv.set(jv.size() - 1, lstitem = lstitem + delimiter
- + input.substring(cp, pos + escape));
+ // found a delimiter
+ values.add(input.substring(start, i));
+ i += dlength;
+ start = i;
+ continue;
}
- else
+ char c = input.charAt(i);
+ if (c == escapeChar)
{
- jv.add(lstitem = input.substring(cp, pos + escape));
+ escape = !escape;
+ continue;
}
- cp = pos + seplen;
- wasescaped = escape == -1;
- // last separator may be in an unmatched quote
- wasquoted = DELIMITERS_PATTERN.matcher(lstitem).matches();
- }
- if (cp < input.length())
- {
- String c = input.substring(cp);
- if (wasescaped || wasquoted)
+ if (escape)
{
- // append final separator
- jv.set(jv.size() - 1, lstitem + delimiter + c);
+ escape = false;
+ continue;
}
- else
+ if (c == quoteChar)
{
- if (!c.equals(delimiter))
- {
- jv.add(c);
- }
+ inquote = !inquote;
}
}
- if (jv.size() > 0)
- {
- String[] v = jv.toArray(new String[jv.size()]);
- jv.clear();
- if (DEBUG)
- {
- jalview.bin.Console.errPrintln("Array from '" + delimiter
- + "' separated List:\n" + v.length);
- for (int i = 0; i < v.length; i++)
- {
- jalview.bin.Console.errPrintln("item " + i + " '" + v[i] + "'");
- }
- }
- return v;
- }
- if (DEBUG)
- {
- jalview.bin.Console.errPrintln(
- "Empty Array from '" + delimiter + "' separated List");
- }
- return null;
+ // add the last value
+ values.add(input.substring(start, ilength));
+
+ return values.toArray(new String[values.size()]);
}
/**
public static int indexOfFirstWhitespace(String text)
{
- int index = -1;
- Pattern pat = Pattern.compile("\\s");
- Matcher m = pat.matcher(text);
- if (m.find())
+ // Rewritten to not use regex for Jalviewjs. Probably more efficient this
+ // way anyway.
+ if (text == null)
{
- index = m.start();
+ return -1;
+ }
+ for (int i = 0; i < text.length(); i++)
+ {
+ if (Character.isWhitespace(text.charAt(i)))
+ {
+ return i;
+ }
}
- return index;
+ return -1;
}
/*
*/
package jalview.ws;
-import java.util.Locale;
-
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.Locale;
import java.util.Map;
-import java.util.StringTokenizer;
import java.util.Vector;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import jalview.gui.IProgressIndicator;
import jalview.gui.OOMWarning;
import jalview.util.DBRefUtils;
+import jalview.util.IdUtils;
+import jalview.util.IdUtils.IdType;
import jalview.util.MessageManager;
import jalview.ws.seqfetcher.DbSourceProxy;
import uk.ac.ebi.picr.model.UPEntry;
throw new Error(MessageManager
.getString("error.implementation_error_must_init_dbsources"));
}
- long startTime = System.currentTimeMillis();
+ long progressId = IdUtils.newId(IdType.PROGRESS);
if (progressWindow != null)
{
progressWindow.setProgressBar(
MessageManager.getString("status.fetching_db_refs"),
- startTime);
+ progressId);
}
try
{
{
progressWindow.setProgressBar(
MessageManager.getString("label.dbref_search_completed"),
- startTime);
+ progressId);
}
for (FetchFinishedListenerI listener : listeners)
*/
package jalview.ws.jws2;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import compbio.data.sequence.FastaSequence;
+import compbio.metadata.Argument;
+import compbio.metadata.ChunkHolder;
+import compbio.metadata.JobStatus;
+import compbio.metadata.JobSubmissionException;
+import compbio.metadata.Option;
+import compbio.metadata.ResultNotAvailableException;
import jalview.analysis.AlignSeq;
import jalview.analysis.SeqsetUtils;
import jalview.api.AlignViewportI;
import jalview.gui.IProgressIndicator;
import jalview.gui.IProgressIndicatorHandler;
import jalview.schemes.ResidueProperties;
+import jalview.util.IdUtils;
+import jalview.util.IdUtils.IdType;
import jalview.workers.AlignCalcWorker;
import jalview.ws.jws2.dm.AAConSettings;
import jalview.ws.jws2.dm.JabaWsParamSet;
import jalview.ws.jws2.jabaws2.Jws2Instance;
import jalview.ws.params.WsParamSetI;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-import compbio.data.sequence.FastaSequence;
-import compbio.metadata.Argument;
-import compbio.metadata.ChunkHolder;
-import compbio.metadata.JobStatus;
-import compbio.metadata.JobSubmissionException;
-import compbio.metadata.Option;
-import compbio.metadata.ResultNotAvailableException;
-
public abstract class AbstractJabaCalcWorker extends AlignCalcWorker
{
if (guiProgress != null)
{
guiProgress.setProgressBar("JABA " + getServiceActionText(),
- progressId = System.currentTimeMillis());
+ progressId = IdUtils.newId(IdType.PROGRESS));
}
rslt = submitToService(seqs);
if (guiProgress != null)
*/
package jalview.ws.jws2;
+import java.util.ArrayList;
+import java.util.Hashtable;
+import java.util.List;
+import java.util.Map;
+import java.util.Vector;
+
+import javax.swing.JInternalFrame;
+
+import compbio.data.msa.MsaWS;
+import compbio.metadata.Argument;
+import compbio.metadata.ChunkHolder;
+import compbio.metadata.JobStatus;
+import compbio.metadata.Preset;
import jalview.analysis.AlignSeq;
import jalview.bin.Console;
import jalview.datamodel.Alignment;
import jalview.gui.Desktop;
import jalview.gui.SplitFrame;
import jalview.gui.WebserviceInfo;
+import jalview.util.IdUtils;
+import jalview.util.IdUtils.IdType;
import jalview.util.MessageManager;
import jalview.ws.AWsJob;
import jalview.ws.JobStateSummary;
import jalview.ws.jws2.dm.JabaWsParamSet;
import jalview.ws.params.WsParamSetI;
-import java.util.ArrayList;
-import java.util.Hashtable;
-import java.util.List;
-import java.util.Map;
-import java.util.Vector;
-
-import javax.swing.JInternalFrame;
-
-import compbio.data.msa.MsaWS;
-import compbio.metadata.Argument;
-import compbio.metadata.ChunkHolder;
-import compbio.metadata.JobStatus;
-import compbio.metadata.Preset;
-
class MsaWSThread extends AWS2Thread implements WSClientI
{
boolean submitGaps = false; // pass sequences including gaps to alignment
@Override
public void parseResult()
{
- long progbar = System.currentTimeMillis();
+ long progbar = IdUtils.newId(IdType.PROGRESS);
wsInfo.setProgressBar(
MessageManager.getString("status.collecting_job_results"),
progbar);
java2script/SwingJS Notes
=========================
+updated 3/11/2023 -- adds support for Java Regex Matcher.start/end(groupID) and .start/end(groupName)
updated 12/31/2020 -- full support for 64-bit long
updated 12/6/2020 -- note about restrictions on long, including BitSet and Scanner
updated 3/21/2020 -- adds note about HashMap, Hashtable, and HashSet iterator ordering
Some browsers cannot process Regex "look-behind" process such as (?<=\W)
java.util.regex.Matcher and Pattern use JavaScript's RegExp object rather than
the native Java object. These are not identical. Only flags /igm are supported.
-Matcher.start(groupID) is not supported.
+Matcher.start(groupID)/.end(groupID) is supported.
+(x*)? failure returns null, not empty string.
java.util.Formatter will function correctly for all standard %... patterns.
-20210728172208
+20230831104534
+++ /dev/null
-This is sources/net.sf.j2s.java.core/dist/DEV_NOTES.txt
-
-_j2sclasslist.txt
-
-the list of .js files concatenated into coreswingjs.js and minified to coreswingjs.z.js
-
-
-SwingJS-site.zip
-
-the full site directory for SwingJS including all files not in the test/ directory.
+++ /dev/null
-java/applet/Applet.js
-java/applet/AppletContext.js
-java/applet/AppletStub.js
-java/applet/JSApplet.js
-java/awt/ActiveEvent.js
-java/awt/Adjustable.js
-java/awt/AWTEvent.js
-java/awt/AWTEventMulticaster.js
-java/awt/AWTKeyStroke.js
-java/awt/BasicStroke.js
-java/awt/BorderLayout.js
-java/awt/Button.js
-java/awt/Color.js
-java/awt/color/ColorSpace.js
-java/awt/Component.js
-java/awt/ComponentOrientation.js
-java/awt/ContainerOrderFocusTraversalPolicy.js
-java/awt/Container.js
-java/awt/Cursor.js
-java/awt/DefaultFocusTraversalPolicy.js
-java/awt/DefaultKeyboardFocusManager.js
-java/awt/Dialog.js
-java/awt/Dimension.js
-java/awt/dnd/peer/DropTargetPeer.js
-java/awt/event/ActionListener.js
-java/awt/event/AdjustmentEvent.js
-java/awt/event/AdjustmentListener.js
-java/awt/event/AWTEventListener.js
-java/awt/event/ComponentAdapter.js
-java/awt/event/ComponentEvent.js
-java/awt/event/ComponentListener.js
-java/awt/event/ContainerListener.js
-java/awt/event/FocusEvent.js
-java/awt/event/FocusListener.js
-java/awt/event/HierarchyBoundsListener.js
-java/awt/event/HierarchyListener.js
-java/awt/event/InputEvent.js
-java/awt/event/InputMethodListener.js
-java/awt/event/InvocationEvent.js
-java/awt/event/ItemEvent.js
-java/awt/event/ItemListener.js
-java/awt/event/KeyListener.js
-java/awt/event/MouseEvent.js
-java/awt/event/MouseListener.js
-java/awt/event/MouseMotionListener.js
-java/awt/event/MouseWheelListener.js
-java/awt/event/TextListener.js
-java/awt/event/WindowAdapter.js
-java/awt/event/WindowEvent.js
-java/awt/event/WindowFocusListener.js
-java/awt/event/WindowListener.js
-java/awt/event/WindowStateListener.js
-java/awt/EventDispatchThread.js
-java/awt/EventFilter.js
-java/awt/EventQueue.js
-java/awt/EventQueueItem.js
-java/awt/FlowLayout.js
-java/awt/FocusTraversalPolicy.js
-java/awt/Font.js
-java/awt/font/FontRenderContext.js
-java/awt/FontMetrics.js
-java/awt/Frame.js
-java/awt/geom/AffineTransform.js
-java/awt/geom/Dimension2D.js
-java/awt/geom/Path2D.js
-java/awt/geom/PathIterator.js
-java/awt/geom/Point2D.js
-java/awt/geom/Rectangle2D.js
-java/awt/geom/RectangularShape.js
-java/awt/geom/RectIterator.js
-java/awt/GraphicsCallback.js
-java/awt/GraphicsConfiguration.js
-java/awt/GraphicsDevice.js
-java/awt/GraphicsEnvironment.js
-java/awt/Image.js
-java/awt/image/ImageObserver.js
-java/awt/Insets.js
-java/awt/ItemSelectable.js
-java/awt/JSComponent.js
-java/awt/JSDialog.js
-java/awt/JSFrame.js
-java/awt/JSPanel.js
-java/awt/KeyboardFocusManager.js
-java/awt/KeyEventDispatcher.js
-java/awt/KeyEventPostProcessor.js
-java/awt/Label.js
-java/awt/LayoutManager.js
-java/awt/LayoutManager2.js
-java/awt/LightweightDispatcher.js
-java/awt/Paint.js
-java/awt/Panel.js
-java/awt/peer/ComponentPeer.js
-java/awt/peer/ContainerPeer.js
-java/awt/peer/FramePeer.js
-java/awt/peer/KeyboardFocusManagerPeer.js
-java/awt/peer/LightweightPeer.js
-java/awt/peer/WindowPeer.js
-java/awt/Point.js
-java/awt/Queue.js
-java/awt/Rectangle.js
-java/awt/RenderingHints.js
-java/awt/Scrollbar.js
-java/awt/ScrollPane.js
-java/awt/Shape.js
-java/awt/Stroke.js
-java/awt/TextArea.js
-java/awt/TextComponent.js
-java/awt/TextField.js
-java/awt/Toolkit.js
-java/awt/Transparency.js
-java/awt/Window.js
-java/beans/ChangeListenerMap.js
-java/beans/PropertyChangeEvent.js
-java/beans/PropertyChangeListener.js
-java/beans/PropertyChangeSupport.js
-java/lang/AbstractStringBuilder.js
-java/lang/Class.js
-java/lang/Enum.js
-java/lang/Iterable.js
-java/lang/reflect/Constructor.js
-java/lang/reflect/Method.js
-java/lang/StringBuffer.js
-java/lang/StringBuilder.js
-java/lang/Thread.js
-java/lang/ThreadGroup.js
-java/math/RoundingMode.js
-java/net/URL.js
-java/net/URLStreamHandlerFactory.js
-java/net/HttpURLConnection.js
-java/net/URLStreamHandler.js
-javax/net/ssl/HttpsUrlConnection.js
-java/text/CharacterIterator.js
-java/text/DecimalFormat.js
-java/text/DecimalFormatSymbols.js
-java/text/DigitList.js
-java/text/FieldPosition.js
-java/text/Format.js
-java/text/NumberFormat.js
-java/util/AbstractCollection.js
-java/util/AbstractList.js
-java/util/AbstractMap.js
-java/util/AbstractSequentialList.js
-java/util/AbstractSet.js
-java/util/ArrayList.js
-java/util/Arrays.js
-java/util/Collection.js
-java/util/Collections.js
-java/util/Comparator.js
-java/util/Deque.js
-java/util/Dictionary.js
-java/util/Enumeration.js
-java/util/EventListener.js
-java/util/EventObject.js
-java/util/HashMap.js
-java/util/HashSet.js
-java/util/Hashtable.js
-java/util/IdentityHashMap.js
-java/util/Iterator.js
-java/util/LinkedHashMap.js
-java/util/LinkedList.js
-java/util/List.js
-java/util/ListResourceBundle.js
-java/util/Locale.js
-java/util/Map.js
-java/util/Objects.js
-java/util/Queue.js
-java/util/Random.js
-java/util/RandomAccess.js
-java/util/ResourceBundle.js
-java/util/Set.js
-java/util/TimSort.js
-java/util/Vector.js
-javajs/api/JSFunction.js
-javajs/util/AjaxURLConnection.js
-javajs/util/AjaxURLStreamHandlerFactory.js
-javajs/util/AU.js
-javajs/util/JSThread.js
-javajs/util/Lst.js
-javajs/util/PT.js
-javajs/util/Rdr.js
-javajs/util/SB.js
-javax/swing/AbstractAction.js
-javax/swing/AbstractButton.js
-javax/swing/AbstractListModel.js
-javax/swing/Action.js
-javax/swing/ActionMap.js
-javax/swing/AncestorNotifier.js
-javax/swing/ArrayTable.js
-javax/swing/border/AbstractBorder.js
-javax/swing/border/BevelBorder.js
-javax/swing/border/Border.js
-javax/swing/border/CompoundBorder.js
-javax/swing/border/EmptyBorder.js
-javax/swing/border/EtchedBorder.js
-javax/swing/border/LineBorder.js
-javax/swing/border/TitledBorder.js
-javax/swing/BorderFactory.js
-javax/swing/BoundedRangeModel.js
-javax/swing/BoxLayout.js
-javax/swing/ButtonGroup.js
-javax/swing/ButtonModel.js
-javax/swing/ClientPropertyKey.js
-javax/swing/ComboBoxModel.js
-javax/swing/DefaultBoundedRangeModel.js
-javax/swing/DefaultButtonModel.js
-javax/swing/DefaultComboBoxModel.js
-javax/swing/DefaultSingleSelectionModel.js
-javax/swing/DropMode.js
-javax/swing/event/AncestorEvent.js
-javax/swing/event/AncestorListener.js
-javax/swing/event/CaretEvent.js
-javax/swing/event/CaretListener.js
-javax/swing/event/ChangeEvent.js
-javax/swing/event/ChangeListener.js
-javax/swing/event/DocumentEvent.js
-javax/swing/event/DocumentListener.js
-javax/swing/event/EventListenerList.js
-javax/swing/event/ListDataEvent.js
-javax/swing/event/ListDataListener.js
-javax/swing/event/UndoableEditEvent.js
-javax/swing/event/UndoableEditListener.js
-javax/swing/FocusManager.js
-javax/swing/InternalFrameFocusTraversalPolicy.js
-javax/swing/LayoutComparator.js
-javax/swing/LayoutFocusTraversalPolicy.js
-javax/swing/SortingFocusTraversalPolicy.js
-javax/swing/SwingContainerOrderFocusTraversalPolicy.js
-javax/swing/SwingDefaultFocusTraversalPolicy.js
-javax/swing/Icon.js
-javax/swing/ImageIcon.js
-javax/swing/InputMap.js
-javax/swing/JApplet.js
-javax/swing/JButton.js
-javax/swing/JCheckBox.js
-javax/swing/JCheckBoxMenuItem.js
-javax/swing/JComboBox.js
-javax/swing/JComponent.js
-javax/swing/JFrame.js
-javax/swing/JLabel.js
-javax/swing/JLayeredPane.js
-javax/swing/JMenu.js
-javax/swing/JMenuBar.js
-javax/swing/JMenuItem.js
-javax/swing/JPanel.js
-javax/swing/JPopupMenu.js
-javax/swing/JRadioButtonMenuItem.js
-javax/swing/JRootPane.js
-javax/swing/JScrollBar.js
-javax/swing/JScrollPane.js
-javax/swing/JSeparator.js
-javax/swing/JTextArea.js
-javax/swing/JTextField.js
-javax/swing/JToggleButton.js
-javax/swing/JViewport.js
-javax/swing/KeyboardManager.js
-javax/swing/KeyStroke.js
-javax/swing/ListModel.js
-javax/swing/LookAndFeel.js
-javax/swing/MenuElement.js
-javax/swing/MutableComboBoxModel.js
-javax/swing/plaf/ActionMapUIResource.js
-javax/swing/plaf/basic/BasicBorders.js
-javax/swing/plaf/BorderUIResource.js
-javax/swing/plaf/ColorUIResource.js
-javax/swing/plaf/ComponentUI.js
-javax/swing/plaf/DimensionUIResource.js
-javax/swing/plaf/FontUIResource.js
-javax/swing/plaf/InputMapUIResource.js
-javax/swing/plaf/InsetsUIResource.js
-javax/swing/plaf/UIResource.js
-javax/swing/RepaintManager.js
-javax/swing/RootPaneContainer.js
-javax/swing/Scrollable.js
-javax/swing/ScrollPaneConstants.js
-javax/swing/ScrollPaneLayout.js
-javax/swing/SingleSelectionModel.js
-javax/swing/SizeRequirements.js
-javax/swing/SwingConstants.js
-javax/swing/SwingPaintEventDispatcher.js
-javax/swing/SwingUtilities.js
-javax/swing/text/AbstractDocument.js
-javax/swing/text/AttributeSet.js
-javax/swing/text/Caret.js
-javax/swing/text/DefaultCaret.js
-javax/swing/text/DefaultEditorKit.js
-javax/swing/text/Document.js
-javax/swing/text/EditorKit.js
-javax/swing/text/Element.js
-javax/swing/text/GapContent.js
-javax/swing/text/GapVector.js
-javax/swing/text/JTextComponent.js
-javax/swing/text/MutableAttributeSet.js
-javax/swing/text/PlainDocument.js
-javax/swing/text/PlainView.js
-javax/swing/text/Position.js
-javax/swing/text/Segment.js
-javax/swing/text/SegmentCache.js
-javax/swing/text/SimpleAttributeSet.js
-javax/swing/text/Style.js
-javax/swing/text/StyleConstants.js
-javax/swing/text/StyleContext.js
-javax/swing/text/TabExpander.js
-javax/swing/text/TextAction.js
-javax/swing/text/Utilities.js
-javax/swing/text/View.js
-javax/swing/tree/TreeNode.js
-javax/swing/UIDefaults.js
-javax/swing/UIManager.js
-javax/swing/undo/AbstractUndoableEdit.js
-javax/swing/undo/CompoundEdit.js
-javax/swing/undo/UndoableEdit.js
-javax/swing/ViewportLayout.js
-javax/swing/WindowConstants.js
-sun/awt/AppContext.js
-sun/awt/AWTAutoShutdown.js
-sun/awt/CausedFocusEvent.js
-sun/awt/ComponentFactory.js
-sun/awt/KeyboardFocusManagerPeerProvider.js
-sun/awt/MostRecentKeyValue.js
-sun/awt/MostRecentThreadAppContext.js
-sun/awt/PaintEventDispatcher.js
-sun/awt/PostEventQueue.js
-sun/awt/RequestFocusController.js
-sun/awt/SunToolkit.js
-sun/awt/WindowClosingListener.js
-sun/awt/WindowClosingSupport.js
-sun/awt/image/DataStealer.js
-sun/awt/image/IntegerComponentRaster.js
-sun/awt/image/IntegerInterleavedRaster.js
-sun/awt/image/SunWritableRaster.js
-sun/font/FontDesignMetrics.js
-sun/swing/DefaultLookup.js
-sun/swing/SwingLazyValue.js
-sun/text/resources/FormatData.js
-sun/text/resources/en/FormatData_en.js
-sun/util/resources/LocaleData.js
-sun/util/locale/BaseLocale.js
-sun/util/locale/LocaleUtils.js
-sun/util/locale/provider/LocaleProviderAdapter.js
-sun/util/locale/provider/LocaleDataMetaInfo.js
-swingjs/a2s/A2SContainer.js
-swingjs/a2s/A2SEvent.js
-swingjs/a2s/A2SListener.js
-swingjs/a2s/Applet.js
-swingjs/a2s/Button.js
-swingjs/a2s/Label.js
-swingjs/a2s/Panel.js
-swingjs/a2s/Scrollbar.js
-swingjs/a2s/ScrollPane.js
-swingjs/a2s/TextArea.js
-swingjs/a2s/TextField.js
-swingjs/api/Interface.js
-swingjs/api/js/DOMNode.js
-swingjs/api/js/HTML5CanvasContext2D.js
-swingjs/api/js/JSInterface.js
-swingjs/jquery/JQueryUI.js
-swingjs/JSApp.js
-swingjs/JSAppletThread.js
-swingjs/JSAppletViewer.js
-swingjs/JSFocusPeer.js
-swingjs/JSFontMetrics.js
-swingjs/JSFrameViewer.js
-swingjs/JSGraphics2D.js
-swingjs/JSGraphicsConfiguration.js
-swingjs/JSGraphicsEnvironment.js
-swingjs/JSImage.js
-swingjs/JSImagekit.js
-swingjs/JSMouse.js
-swingjs/JSNullComponentPeer.js
-swingjs/JSScreenDevice.js
-swingjs/JSThreadGroup.js
-swingjs/JSToolkit.js
-swingjs/JSUtil.js
-swingjs/plaf/ButtonListener.js
-swingjs/plaf/DefaultMenuLayout.js
-swingjs/plaf/HTML5LookAndFeel.js
-swingjs/plaf/JSAppletUI.js
-swingjs/plaf/JSButtonUI.js
-swingjs/plaf/JSCheckBoxMenuItemUI.js
-swingjs/plaf/JSCheckBoxUI.js
-swingjs/plaf/JSComboBoxUI.js
-swingjs/plaf/JSComponentUI.js
-swingjs/plaf/JSEventHandler.js
-swingjs/plaf/JSFrameUI.js
-swingjs/plaf/JSGraphicsUtils.js
-swingjs/plaf/JSLabelUI.js
-swingjs/plaf/JSLayeredPaneUI.js
-swingjs/plaf/JSLightweightUI.js
-swingjs/plaf/JSMenuBarUI.js
-swingjs/plaf/JSMenuItemUI.js
-swingjs/plaf/JSMenuUI.js
-swingjs/plaf/JSPanelUI.js
-swingjs/plaf/JSPopupMenuSeparatorUI.js
-swingjs/plaf/JSPopupMenuUI.js
-swingjs/plaf/JSRadioButtonMenuItemUI.js
-swingjs/plaf/JSRadioButtonUI.js
-swingjs/plaf/JSRootPaneUI.js
-swingjs/plaf/JSScrollBarUI.js
-swingjs/plaf/JSScrollPaneUI.js
-swingjs/plaf/JSSeparatorUI.js
-swingjs/plaf/JSSliderUI.js
-swingjs/plaf/JSTextAreaUI.js
-swingjs/plaf/JSTextFieldUI.js
-swingjs/plaf/JSTextUI.js
-swingjs/plaf/JSTextViewUI.js
-swingjs/plaf/JSViewportUI.js
-swingjs/plaf/JSWindowUI.js
-swingjs/plaf/LazyActionMap.js
-swingjs/plaf/Resizer.js
-swingjs/plaf/TextListener.js
-
-
+++ /dev/null
-Notes
-=====
-
----IMPORTANT CHARACTER SET NOTE---
-
-It is critical that all development work in Java2Script
-be done in UTF-8. This means:
-
-- making sure your Eclipse project is set up for UTF-8 (not the Eclipse default?)
-- making sure your server can serve up UTF-8 by default for any browser-loaded files
-- making sure you don't edit a Java2Script class file or one of the site .js files
- using a non-UTF-8 editor. It may replace non-Latin characters with "?" or garbage.
-- making sure that your web pages are delivered with proper headings indicating HTML5 and UTF-8
-
-<!DOCTYPE html>
-<html>
-<head>
-<meta charset="utf-8">
-
-Note that the DOCTYPE tag is critical for some browsers to switch into HTML5 mode. (MSIE?)
-
-
-
-
-In particular, the Mandarin character 秘 (mi; "secret") is used extensively throughout
-the SwingJS class files to distinguish j2s-specific fields and methods that must not
-ever be shadowed or overridden by subclasses. For example, we see in java.lang.Thread.java:
-
- public static JSThread 秘thisThread;
-
-----------------------------------
-
-
-updated 12/6/2020 -- note about restrictions on long, including BitSet and Scanner
-updated 3/21/2020 -- adds note about HashMap, Hashtable, and HashSet iterator ordering
-updated 3/20/2020 -- adds note about interning, new String("xxx"), and "xxx"
-updated 2/26/2020 -- adds Graphics.setClip issue
-updated 12/22/19 -- additional issues
-updated 11/03/19 -- adds information about File.exists() and points to src/javajs/async
-updated 10/26/19 -- adds information about File.createTempFile()
-updated 8/16/19 -- minor typos and added summary paragraph
-updated 7/19/19 -- clarification that AWT and Swing classes are supported directly
-updated 5/13/19 -- Mandarin U+79D8 reserved character; Missing Math methods; int and long
-updated 5/10/19 -- adds a section on static issues in multi-(duplicate)-applet pages
-updated 1/4/19 -- nio
-updated 9/15/18 -- adds integer 1/0 == Infinity
-updated 7/24/18 -- most classes replaced with https://github.com/frohoff/jdk8u-jdk
-updated 6/5/17 -- reserved package name "window"
-updated 3/11/17 -- myClass.getField
-updated 3/7/17 -- overloading of JSplitPane.setDividerLocation
-updated 3/2/17 -- more indication of classes not implemented (KeyListener)
-
-=============================================================================
-SwingJS and OpenJDK 8+
-=============================================================================
-
-SwingJS implements a wide range of the Java language in JavaScript. The base
-version for this implementation is OpenJDK8. some classes are implemented using
-older source code, and there are some missing methods. For the most part, this is
-no real problem. You can add or modify any java class just be adding it as source
-in your project. Or (preferably) you can contact me, and I can get it into the
-distribution. Or (even more preferably) you can do that via a patch submission.
-
-=================
-DESIGN PHILOSOPHY
-=================
-
-The java2script/SwingJS design goal is to recreate a recognizable, easily debuggable
-equivalent in JavaScript for as much of Java as practical. This means, for example,
-that one can call in JavaScript
-
- new java.util.Hashtable()
-
-and for all practical purposes it will appear that Java is running.
-
-
-Method and Field Disambiguation
--------------------------------
-
-SwingJS has no problem with the overloading of methods, for example:
-
- public void print(int b);
- public void print(float b);
-
-JavaScript does not allow overloading of methods, and the common practice in
-Java of naming a field the same as a method -- isAllowed and isAllowed() -- is
-not possible in JavaScript. As a result, SwingJS implements "fully-qualified"
-method names using "$" parameter type separation. Thus, these methods in SwingJS
-will be referred to as print$I and print$F. The rules for this encoding are
-relatively simple:
-
-1. The seven primitive types in Java are encoded $I (int), $L (long), $F (float),
-$D (double), $B (byte) $Z (boolean), and $H (short).
-
-2. String and Object are encoded as $S and $O, respectively.
-
-3. "java_lang_" is dropped for all other classes in the java.lang package (as in Java).
- For example: $StringBuffer, not $java_lang_StringBuffer
-
-4. All other classes are encoded as
-
- "$" + Class.getName().replace(".","_")
-
-For example, in Java we see:
-
- public void equals(Object o) {...}
-
-Whereas in SwingJS we have:
-
- Clazz.newMeth(C$, 'equals$O', function (o) {...}
-
-And
-
- this.getContentPane().add(bar, "North");
-
-becomes
-
- this.getContentPane$().add$java_awt_Component$O(bar, "North");
-
-5. Arrays are indicated with appended "A" for each level. So
-
- setDataVector(Object[][] dataVector, Object[] columnIdentifiers)
-
-becomes
-
- setDataVector$OAA$OA(dataVector, columnIdentifiers)
-
-(It is recognized that this design does introduce a bit of ambiguity, in that
- in principal there could be user class named XA and X in the same package,
- and methods a(X[]) and a(XA) in the same class that cannot be distinguished.
- The benefit of this simple system, however, triumphed over the unlikelyhood
- of that scenario.) The transpiler could be set to flag this possibility.
-
-6. Constructors are prepended with "c$". So
-
- public JLabel(String text) {...}
-
-becomes:
-
- Clazz.newMeth(C$, 'c$$S', function (text) {...});
-
-Field disambiguation involves prepending. In Java, a class and its subclass
-can both have the same field name, such as
-
- boolean visible;
-
-When this happens, it is called "shadowing", and though not recommended, Java allows
-it. The Java2Script transpiler will prepend such shadowing fields with "$" so that the
-subclass instance has both "visible" (for use in its methods inherited from its
-superclass) and "$visible" (for its own methods). Thus, we might see in Java:
-
- this.visible = super.visible;
-
-while in SwingJS we will see:
-
- this.$visible=this.visible;
-
-since JavaScript does not have the "super" keyword.
-
-
-
-Parameterless methods such as toString() are appended with "$" to become toString$().
-The one exception to this rule is private methods, which are saved in (truly) private
-array in the class (and are not accessible by reflection). Private parameterless
-methods retain their simple Java name, since they cannot conflict with field names.
-
-This renaming of methods has a few consequences, which are discussed more fully below.
-See particularly the section on "qualified field and method names", where it is described
-how you can use packages or classes or interfaces with ".api.js" in them to represent JavaScript
-objects for which all method names are to be left unqualified. Note that it is not
-possible to cherry-pick methods to be unqualified; only full packages, classes or
-interfaces can hold this status.
-
-The swingjs.api.js package in particular contains a number of useful interfaces that
-you can import into your project for JavaScript-specific capabilities.
-
-
-Applet vs. Application
-----------------------
-
-One of the very cool aspects of SwingJS is that it doesn't particularly matter if a browser-based
-Java app is an "applet" or an "application". We don't need JNLP (Java Network Launch Protocol)
-because now we can just start up any Java application in a browser just as easily as any applet.
-The associative array that passes information to the SwingJS applet (information that formerly
-might have been part of the APPLET tag, such as width, height, and codebase, always referred to
-in our writing as "the Info array") allows the option to specify the JApplet/Applet "code"
-class or the application "main" class. Either one will run just fine.
-
-
-Performance
------------
-
-Obviously, there are limitations. One is performance, but we have seen reproducible
-performance at 1/6 - 1/3 the speed of Java. Achieving this performance may require
-some refactoring of the Java to make it more efficient in both Java and JavaScript.
-"for" loops need to be more carefully crafted; use of "new" and "instanceof" need to be
-minimized in critical areas. Note that method overloading -- that is, the same method name
-with different parameters, such as read(int) and read(byte) -- is no longer any problem.
-
-
-Threads
--------
-
-Although there is only a single thread in JavaScript, meaning Thread.wait(), Thread.sleep(int) and
-Thread.notify() cannot be reproduced, we have found that this is not a serious limitation.
-For example, javax.swing.Timer() works perfectly in JavaScript. All it means is that threads
-that use sleep(int) or notify() must be refactored to allow Timer-like callbacks. That is,
-they must allow full exit and re-entry of Thread.run(), not the typical while/sleep motif.
-
-The key is to create a state-based run() that can be exited and re-entered in JavaScript.
-
-
-Static fields
--------------
-
-Final static primitive "constant" fields (String, boolean, int, etc.) such as
-
-static final int TEST = 3;
-static final String MY_STRING = "my " + "string";
-
-are converted to their primitive form automatically by the Eclipse Java compiler
-and do not appear in the JavaScript by their names.
-
-Other static fields are properties of their class and can be used as expected.
-
-Note, however, that SwingJS runs all "Java" code on a page in a common "jvm"
-(like older versions of Java). So, like the older Java schema, the JavaScript
-equivalents of both applets and applications will share all of their static
-fields and methods. This includes java.lang.System.
-
-Basically, SwingJS implementations of Java run in a browser page-based sandbox
-instead of an applet-specific one.
-
-In general, this is no problem. But if we are to implement pages with
-multiple applets present, we must be sure to only have static references
-that are "final" or specifically meant to be shared in a JavaScript
-environment only (since they will not be shared in Java).
-
-A simple solution, if static non-constant references are needed, is to attach the
-field to Thread.currentThread.threadGroup(), which is an applet-specific reference.
-Be sure, if you do this, that you use explicit setters and getters:
-
-For example,
-
-private static String myvar;
-
-...
-
-public void setMyVar(String x) {
- ThreadGroup g = Thread.currentThread().threadGroup();
- /**
- * @j2sNative g._myvar = x;
- *
- */
- {
- myvar = x;
- }
-}
-
-public String getMyVar() {
- ThreadGroup g = Thread.currentThread().threadGroup();
- /**
- * @j2sNative return g._myvar || null;
- *
- */
- {
- return myvar;
- }
-}
-
- in Java will get and set x the same in JavaScript and in Java.
-
-
-A convenient way to do this in general is to supply a singleton class with
-explicitly private-only constructors and then refer to it in Java and in JavaScript
-instead of using static field, referring to myclass.getIntance().xxx instead of
-myclass.xxx in Java (and JavaScript).
-
-This was done extensively in the Jalview project. See jalview.bin.Instance.
-
-
-Helper Packages -- swingjs/ and javajs/
----------------------------------------
-
-The SwingJS library is the swingjs/ package. There are interfaces that may be of assistance
-in swingjs/api, but other than that, it is not recommended that developers access classes in
-this package. The "public" nature of their methods is really an internal necessity.
-
-In addition to swingjs/, though, there are several useful classes in the javajs/ package
-that could be very useful. This package is a stand-alone package that can be
-cloned in any Java project that also would be great to have in any JavaScript project
--- SwingJS-related or not. Functionality ranges from reading and writing various file
-formats, including PDF, BMP, PNG, GIF, JPG, JSON, ZIP, and CompoundDocument formats.
-
-A variety of highly efficient three- and four-dimensional point, vector, matrix, and
-quaternion classes are included, as they were developed for JSmol and inherited from that
-project.
-
-Of particular interest should be javajs/async/, which includes
-
-javajs.async.Async
-javajs.async.AsyncColorChooser
-javajs.async.AsyncDialog
-javajs.async.AsyncFileChooser
-
-See javajs.async.Async JavaDoc comments for a full description of
-these useful classes.
-
-
-Modal Dialogs
--------------
-
-Although true modal dialogs are not possible with only one thread, a functional equivalent --
-asynchronous modal dialogs -- is relatively easy to set up. All the JOptionPane dialogs will
-return PropertyChangeEvents to signal that they have been disposed of and containing the results.
-See below and classes in the javajs.async package.
-
-
-Native calls
-------------
-
-Native calls in Java are calls to operating system methods that are not in Java. JavaScript
-has no access to these, of course, and they must all be replaced by JavaScript equivalents.
-Fortunately, they are not common, and those that are present in Java (for example, in calculating
-checksums in ZIP file creation) are at a low enough level that most developers do not utilize them
-or do not even have access to them. All native calls in Java classes have been replaced by
-Java equivalents.
-
-
-Swing GUI Peers and UIClasses
------------------------------
-
-One of the biggest adaptations introduced in SwingJS is in the area of the graphical
-user interface. The issue here is complex but workable. In Java there are two background
-concepts -- the Component "peer" (one per "heavy-weight" component, such as a Frame) and the
-component "uiClass" (one per component, such as JButton or JTextField).
-
-Peers are native objects of the operating system. These are the virtual buttons and text areas
-that the user is interacting with at a very base level. Their events are being passed on to
-Java or the browser by the operating system. UI classes provide a consistent "look and feel"
-for these native objects, rendering them onto the native window canvas and handling all
-user-generated events. They paint the borders, the backgrounds, the highlights, of every
-control you see in Java. There is one-to-one correspondence of Swing classes and UI classes.
-Setting the Look and Feel for a project amounts to selecting the directory from which to draw
-these UI classes. The UI classes can be found in the javax.swing.plaf ("platform look and feel")
-package.
-
-Early on in the development of SwingJS, we decided not to fully reproduce the painfully detailed
-bit-by-bit painting of controls as is done in Java. Instead, we felt it was wiser to utilize the standard
-HTML5 UI capabilities as much as possible, using DIV, and INPUT especially, with extensive use
-of CSS and sometimes jQuery (menus, and sliders, for example). Thus, we have created a new
-set of UIs -- the "HTML5 Look and Feel". These classes can be found in swingjs.plaf. Besides being
-more adaptable, this approach allows far more versatility to SwingJS developers, allowing them
-to modify the GUI to suit their needs if desired.
-
-In SwingJS, since we have no access to native peers except through the browser DOM,
-it seemed logical to merge the peer and UI idea. So instead of having one peer per heavy-weight control and
-one UI class instance for each control type, we just have one UI class instance per control, and
-that UI class instance is what is being referred to when a "peer" is notified.
-
-In some ways this is a throw back to when all of Swing's components were subclasses of
-specific AWT components such as Button and List. These "heavy-weight components" all had their
-own individual native peers and thus automatically took on the look and feel provided by the OS.
-Later Swing versions implemented full look and feel for all peers, leaving only JDialog, JFrame,
-and a few other classes to have native peers. But in SwingJS we have again a 1:1 map of component
-and UI class/peer instance.
-
-The origin of most issues (read "bugs") in relation to the GUI will probably be found in the
-swingjs.plaf JSxxxxUI.java code.
-
-
-Swing-only Components -- no longer an issue
--------------------------------------------
-
-Swing was introduced into Java well after the Java Abstract Window Toolkit (AWT) was well
-established. As such, its designers chose to allow AWT controls such as Button and List to be used
-alongside their Swing counterparts JButton and JList. Reading the code, it is clear that this
-design choice posed a huge headache for Swing class developers.
-
-For SwingJS, we decided from the beginning NOT to allow this mixed-mode programming and
-instead to require that all components be Swing components.
-
-However, this is no longer an issue. All AWT components in SwingJS are now subclasses of
-javax.swing.JComponent. So far, we have found no problem with this.
-
-
-The a2s Adapter Package
------------------------
-
-Originally, we thought that we would restrict ourselves to JApplets only. That is, only
-Swing-based applets. But as we worked, we discovered that there are a lot of great
-applets out there that are pre-Swing pure-AWT java.applet.Applet applets. Our problem was
-that we also wanted it to be possible to quickly adapt these applets to JavaScript as well.
-
-The solution turned out to be simple: Write a package (a2s) that recreates the interface for
-non-Swing components as subclasses of Swing components. Thus, a2s.Button subclasses javax.swing.JButton
-but also accepts all of the methods of java.awt.Button. This works amazingly well, with a few
-special adaptations to the core javax.swing to be "AWT-aware." All AWT components now subclass
-a2s components, which in turn subclass JComponents. So no changes in code are necessary. We have
-successfully transpiled over 500 applets using this strategy. (Kind of surprising, actually, that
-the original Java developers did not see that option. But we have a hindsight advantage here.)
-
-
-Working with Files
-==================
-
-Simple String file names are not optimal for passing information about
-read files within SwingJS applications.
-
-All work with files should either use Path or File objects exclusively.
-These objects, after a file is read or checked for existence, will already
-contain the file byte[] data. Doing something like this:
-
-File f = File("./test.dat");
-boolean isOK = f.exists();
-
-will load f with its byte[] data, if the file exists.
-
-But if after that, we use:
-
-File f2 = new File(f.getAbsolutePath());
-
-f2 will not contain that data. Such copying should be done as:
-
-File f2 = new File(f);
-
-in which case, the byte[] data will be transferred.
-
-
-SwingJS uses the following criteria to determine if File.exists() returns true:
-
-(1) if this File object has been used directly to read data, or
-(2) if reading data using this File object is successful.
-
-Note that you cannot check to see if a file exists before input or if it
-was actually written or if it already exists prior to writing in SwingJS.
-
-Thus, you should check each use of file.exists() carefully, and if necessary, provide a J2sNative
-block that gives an appropriate "OK" message, for example:
-
-(/** @j2sNative 1 ? false : */ outputfile.exits())
-
-or
-
-(/** @j2sNative 1 ? true : */ inputfile.exits())
-
-Temporary files can be created in SwingJS. SwingJS will maintain a pseudo-filesystem for files
-created with File.createTempFile(). This is useful in that closure of writing to a temporary file
-does not generate a pseudo-download to the user's machine.
-
-
-UNIMPLEMENTED CLASSES BY DESIGN
-===============================
-
-The SwingJS implementation of the following classes are present
-in a way that gracefully bypasses their functionality:
-
-accessibility
-security
-serialization
-
-
-
-TODO LIST FOR UNIMPLEMENTED CLASSES
-===================================
-
-JEditorPane (minimal implementation) - DONE 12/2018; some issues still
-JSplitPane - DONE 8/2018
-JTabbedPane - DONE 10/2018
-JTree - done 12/2019
-
-
-MINOR ISSUES--required some rewriting/refactoring by Bob and Udo
-================================================================
-
-Thread.currentThread() == dispatchThread
-
-
-MINOR ISSUES--requiring some rewriting/refactoring outside of SwingJS
-=====================================================================
-
-See below for a full discussion.
-
-Restrictions on long
-Restriction on BitSet and Scanner
-HashMap, Hashtable, and HashSet iterator ordering
-interning, new String("xxx") vs "xxx"
-Names with "$" and "_"
-positive integers do not add to give negative numbers
-ArrayIndexOutOfBounds
-java.awt.Color
-native methods
-javax.swing.JFileDialog
-key focus
-LookAndFeel and UI Classes
-System.exit(0) does not stop all processes
-list cell renderers must be JComponents
-myClass.getField not implemented
-"window" and other reserved JavaScript names
-reserved field and method names
-qualified field and method names
-missing Math methods
-Component.getGraphics(), Graphics.dispose()
-Graphics.setClip()
-
-MAJOR ISSUES--for Bob and Udo within SwingJS
-============================================
-
-fonts
-OS-dependent classes
-AWT component peers
-some aspects of reflection
-
-MAJOR ISSUES--to be resolved by implementers
-============================================
-
-fonts
-threads
-modal dialogs
-image loading
-BigDecimal not fully implemented
-no format internationalization
-no winding rules
-text-related field implementation
-Formatter/Regex limitations
-integer 1/0 == Infinity
-
-========================================================================
-
-DISCUSS
-=======
-
-Table row/col sorter needs checking after removal of java.text.Collator references
-
-I had to move all of SunHints class to RenderingHints, or the
-two classes could not be loaded. Shouldn't be a problem, I think. The sun classes are
-not accessible to developers in Java anyway, since they are generally package private.
-
-==========================================================================
-
-//////////////////////////////////////////////////////////////////////////////
-
-UNIMPLEMENTED CLASSES
-=====================
-
-accessibility
--------------
-
-All Accessibility handling has been commented out to save the download footprint.
-This removes the need for sun.misc.SharedSecrets as well.
-Nothing says we could not implement accessibility. We just didn't.
-
-
-security
---------
-
-All JavaScript security is handled by the browser natively.
-Thus, Java security checking is no longer necessary, and
-java.security.AccessController has been simplified to work without
-native security checking.
-
-Note that private methods in a class are REALLY private.
-
-
-serialization
--------------
-
-All serialization has been removed. It was never very useful for Swing anyway,
-because one needs exactly the same Java version to save and restore serialized objects.
-
-
-keyboard accelerators and mnemonics
------------------------------------
-
-This work was completed in the spring of 2019. Note that in a browser, some
-key strokes, particularly CTRL-keys, are not available. Bummer.
-
-
-MINOR ISSUES--required some rewriting/refactoring by Bob and Udo
-================================================================
-
-
-Thread.currentThread() == dispatchThread
-----------------------------------------
-
-changed to JSToolkit.isDispatchThread()
-
-
-MINOR ISSUES--requiring some rewriting/refactoring outside of SwingJS
-=====================================================================
-
-restrictions on long
---------------------
-
-Java's 64-bit long type is not supported in JavaScript. There is no Int64Array in JavaScript,
-and 0x20000000000000 + 1 evaluates to 0x20000000000000, not 0x20000000000001.
-(Likewise, -0x20000000000000 - 1 is left unchanged.)
-
-The largest "integer" value in JavaScript is 9007199254740991 (9.007199254740991E13, or 0x1FFFFFFFFFFFFFF).
-Effectively, you get to use only 53 bits of the long, not 64. Trying to set a long larger than
-0x1FFFFFFFFFFFFFF or smaller than -0x1FFFFFFFFFFFFFF will result in a NumberFormatException.
-
-The transpiler handles conversion to long the same as Java for all cases other than from double.
-
-For small double values, there is no problem, and, in fact, this is a known trick used to round
-doubles and floats toward zero:
-
-double d;
-d = (long) 3.8;
-assert(d == 3);
-d = (long) -3.8;
-assert(d == -3);
-
-SwingJS will evaluate (long) d as 0 for d > 9007199254740991
-or d < -9007199254740991, same as Java returns for Double.NaN.
-So, in Java we have:
-
- assert(((long) Double.NaN) == 0);
- assert(((int) Double.NaN) == 0);
- assert(((long) Float.NaN) == 0);
- assert(((int) Float.NaN) == 0);
-
-and also, in JavaScript only, we also have:
-
- double d = 0x2000000000000L;
- assert(((long) d) == 0);
-
-
-restrictions on BitSet and Scanner
-----------------------------------
-
-Because of the issue of long being only 53 bits, any time a method returns a long value, considerations must
-be made as to whether this will work in JavaScript. In particular, BitSet and Scanner have issues.
-
-In SwingJS, java.util.BitSet has been implemented as a 32-bit integer-based bitset. This was no problem in
-Java 6, but starting with Java 7, a method was added to BitSet that allows for the extraction of the
-underlying long[] word data. This is not work in JavaScript. Instead, SwingJS java.util.Bitset.toLongArray() will deliver
-32-bit int[] data.
-
-SwingJS Scanner has hasNextLong() and nextLong(), and although it will scan through long numbers,
-Scanner will choke on long numbers greater than the JavaScript 53-bit limit. hasNextLong() will
-return false, and nextLong() will throw an InputMismatchException triggered by the NumberFormatException
-thrown by Long.parseLong().
-
-
-HashMap, Hashtable, and HashSet iterator ordering
--------------------------------------------------
-
-In Java, iterators for HashMap, Hashtable, and HashSet do not guarantee any particular order.
-From the HashMap documentation for Java 8:
-
- This class makes no guarantees as to the order of the map; in particular, it does not
- guarantee that the order will remain constant over time.
-
-Likewise, for HashSet (because it is simply a convenience method for HashMap<Object,PRESENT>:
-
- [HashSet] makes no guarantees as to the iteration order of the set.
-
-JavaScript's Map object is different. It is basically a LinkedHashMap, so it guarantees iteration
-in order of object addition.
-
-Starting with java2script 3.2.9.v1, these classes use the JavaScript Map object rather than hash codes
-whenever all keys are strictly of JavaScript typeof "string". If any key is introduced that is not a string, the
-implementation falls back to using hash codes, the same as Java.
-
-Note strings created using new String("xxxx") are NOT typeof "string"; they are typeof "object".
-
-The result is significantly faster performance (3-12 x faster) than originally, and up to 3 x faster
-performance in JavaScript than in Java itself. Right. Faster than Java.
-
-The JavaScript Map implementation is implemented UNLESS the constructor used is the one that
-specifies both initial capacity and load factor in their constructor. Thus,
-
-new Hashtable()
-new HashMap()
-new HashMap(16)
-new HashSet()
-
-all use the JavaScript Map. But
-
-new Hashtable(11, 0.75f)
-new HashMap(16, 0.75f)
-new HashSet(16, 0.75f)
-
-do not.
-
-This design allows for opting out of the JavaScript Map use in order to retain the exact behavior of
-iterators in JavaScript as in Java.
-
-
-interning, new String("xxx") vs "xxx"
--------------------------------------
-
-Note that the following are true in JavaScript:
-
-typeof new String("xxxx") == "object"
-typeof "xxxx" == "string"
-var s = "x";typeof ("xxx" + s) == "string"
-
-There is no equivalence to this behavior in Java, where a String is a String is a String.
-
-Be aware that SwingJS does not always create a JavaScript String object using JavaScript's
-new String(...) constructor. It only does this for Java new String("xxxx") or new String(new String()).
-
-In all other cases, new String(...) (in Java) results in a simple "xxxx" string in JavaScript.
-That is, it will be JavaScript typeof "string", not typeof "object".
-
-The reason for this design is that several classes in the Java core use toString()
-methods that return new String(), and those classes that do that would cause a JavaScript error
-if implicitly stringified if new String() returned a JavaScript String object.
-
-This is fine in JavaScript
-
-test1 = function() { return { toString:function(){ return "OK" } } }
-"testing" + new test1()
->> "testingOK"
-
-But for whatever reason in JavaScript:
-
-test2 = function() { return { toString:function(){ return new String("OK") } } }
-"testing" + new test2()
->> Uncaught TypeError: Cannot convert object to primitive value
-
-The lesson here is never to use
-
- return new String("...");
-
-in a Java toString() method. In Java it will be fine; in JavaScript it will also be fine as long as
-that method is never called in JavaScript implicitly in the context of string concatenation.
-
-A note about interning. Consider the following six Java constructions, where we have a == "x";
-
-"xxx"
-"xx" + "x"
-new String("xxx").intern()
-
-new String("xxx")
-"xx" + a.toString()
-"xx" + a
-
-All six of these will return java.lang.String for .getClass().getName().
-However, the first three are String literals, while the last three are String objects.
-Thus:
- "xxx" == "xxx"
- "xxx" == "xx" + "x"
- "xxx" == new String("xxx").intern()
-
-but none of the other three are equivalent to "xxx" or each other:
-
- "xxx" != new String("xxx")
- "xxx" != "xx" + a.toString()
- "xxx" != "xx" + a
- new String("xxx") != new String("xxx")
- "xx" + a != new String("xxx")
-
-etc.
-
-As in Java, in SwingJS, all of the following Java assertions pass as true:
-
- assert("xxx" == "xx" + "x");
- assert("xxx" == ("xx" + a).intern());
- assert("xxx" === new String("xxx").intern());
-
-and both of these do as well:
-
- assert(new String("xxx") != "xxx");
- assert(new String("xxx") != new String("xxx"));
-
-But the following two fail to assert true:
-
- assert("xxx" != "xx" + a);
- assert("xxx" != "xx" + a.toString());
-
-because in JavaScript, both of these right-side expressions evaluate to a simple "interned" string.
-
-In Java, however, these assertions are true because Java implicitly "boxes" String
-concatentaion as a String object, not a literal.
-
-Most of us know not to generally use == with Strings unless they are explicitly interned.
-Where this problem may arise, though, is in IdentityHashMap, which compares objects using
-System.identityHashCode(), which is not the same for different objects or their string literal equivalents.
-
-My recommendation, if you need to use IdentityHashMap with strings is to always use an explicit String.intern()
-for any keys -- unless you really want to keep every string as separate keys even if they are the same sequence,
-in which case, use new String(). This will work in Java and in JavaScript.
-
-Be aware when working with strings that come from SwingJS and are being used by other JavaScript modules
-that those that are String objects will return "object" for the JavaScript typeof operator, not "string".
-
-The easy way to ensure this is no problem is to concatenate strings with "" to force immediate interning:
-
- var x = aJavaObject.getString() + "";
-
-unless you are certain that the string is being returned is a raw JavaScript string.
-
-Names with "$" and "_"
-----------------------
-
-For the most part, this should be no problem.
-
-Note that the use of $ and _ in Java field names has always been discouraged:
-[https://docs.oracle.com/javase/tutorial/java/nutsandbolts/variables.html]
-
- You may find some situations where auto-generated names will contain the dollar sign,
- but your variable names should always avoid using it. A similar convention
- exists for the underscore character; while it's technically legal to begin your
- variable's name with "_", this practice is discouraged.
-
-Some impacts of transpiling method names with full qualification:
-
-1) SwingJS will introduce fields that start with $ or _. These will not conflict
- if the above convention is followed.
-
-2) Fields that have the same Java name as a method are not an issue.
-
-3) Fields that have a Java name with $ that matches a transpiled method name,
- such as toString$, will need to be refactored in Java to not have that name collision.
-
-4) Fields in a subclass that have the same name as private fields in a superclass
- represent a name collision, because the superclass method needs to call its private
- field even if invoked from a subclass. The solution was to modify the subclass field
- name using one or more prepended $.
-
-5) Use of Class.getDeclaredMethods() reflection will return Method objects having the transpiled
- name, not the Java name. This could require some j2sNative adjustment
- to strip the $... parameters from the name if that is needed.
-
-6) Use of Method.getParameterTypes() should work fine, provided class names
- do not contain "_". This is because the transpiler converts "." to "_" when
- creating the fully qualified JavaScript name.
-
-
-positive integers do not add to give negative numbers
------------------------------------------------------
-
-In Java, the following is true:
-
- 2000000000 + 2000000000 == -294967296
-
-But in SwingJS, that will be 4000000000. So, for example, the following
-strategy will fail in SwingJS:
-
- int newLength = lineBuf.length * 2;
- if (newLength < 0) {
- newLength = Integer.MAX_VALUE;
- }
-
-"-1" in JavaScript is not 0xFFFFFFFF.
-
-And one must take care to not compare a negative number with a 32-bit mask. So
-
-(b & 0xFF000000) == 0xFF000000
-
-is true in Java for (int) b = -1, but is false in JavaScript, because 0xFF000000 is 4278190080,
-while (-1 & 0xFF000000) is, strangely enough, -16777216, and, in fact,
-
-(0xFF000000 & 0xFF000000) != 0xFF000000
-
-because -16777216 is not 4278190080.
-
-The fix is that one must compare similar operations:
-
-if ((b & 0xFF000000) == (0xFF000000 & 0xFF000000)) .....
-
-Importantly, the JavaScript Int32Array does behave properly. From
-the Firefox developer console:
-
->> x = new Int32Array(1)
-<- Int32Array(1) [ 0 ]
->> x[0] = 4000000000
-<- 4000000000
->> x[0]
-<- -294967296
-
-Notice that, perhaps unexpectedly, the following two constructs produce
-different results in JavaScript:
-
-x = new Int32Array(1);
-b = x[0] = 4000000000;
-
-(b will be 4000000000)
-
-and
-
-x = new Int32Array(1);
-x[0] = 4000000000;
-b = x[0];
-
-(b will be -294967296)
-
-
-SwingJS leverages array typing to handle all byte and short arithmetic so as
-to ensure that any byte or short operation in JavaScript does give the same
-result in Java. The design decision to not also do this with integer math was
-a trade-off between performance and handling edge cases.
-
-
-ArrayIndexOutOfBounds
----------------------
-
-You cannot implicitly throw an ArrayIndexOutOfBoundsException in JavaScript.
-JavaScript will simply return "undefined", not throw an Exception. So:
-
-boolean notAGoodIdeaIsOutOfBounds(String[] sa, int i) {
- try {
- return (sa[i] == sa[i]);
- } catch (ArrayIndexOutOfBoundsException e) {
- return false;
- }
-}
-
-will work in Java but not in JavaScript. Code should not depend upon this sort
-of trap anyway, if you ask me.
-
-Throwable vs Error vs Exception
--------------------------------
-
-True JavaScript errors are trapped as Throwable, whereas you can still trap
-Error and Exception as well. So if you want to be sure to catch any JavaScript
-error, use try{}catch (Throwable t){}, not try{}catch (Exception e){}.
-
-j
-ava.awt.Color
---------------
-
-ColorSpace: only "support" CS_sRGB.
-
- TODO -- any volunteers??
-
-
-javax.swing.JFileDialog
------------------------
-
-HTML5 cannot expose a file reading directory structure. But you certainly
-can still do file reading and writing. It just works a little differently.
-It's a simple modification:
-
- b = new JButton("FileOpenDialog");
- b.addActionListener(new ActionListener() {
-
- @Override
- public void actionPerformed(ActionEvent e) {
- JFileChooser fc = new JFileChooser();
- Test_Dialog.this.onDialogReturn(fc.showOpenDialog(Test_Dialog.this));
- // Java will wait until the dialog is closed, then enter the onDialogReturn method.
- // JavaScript will exit with NaN immediately, and then call back with its actual value
- // asynchronously.
- }
-
- });
-
- public void onDialogReturn(int value) {
- if (value != Math.floor(value))
- return; // in JavaScript, this will be NaN, indicating the dialog has been opened
- // If we are here, the dialog has closed, in both Java and JavaScript.
- System.out.println("int value is " + value);
- }
-
-
- @Override
- public void propertyChange(PropertyChangeEvent event) {
- Object val = event.getNewValue();
- String name = event.getPropertyName();
- System.out.println(name);
- switch (event.getSource().getClass().getName()) {
- case "javax.swing.JOptionPane":
- switch (name) {
- case "inputValue":
- onDialogReturn(val);
- return;
- case "value":
- if (val instanceof Integer)
- onDialogReturn(((Integer) val).intValue());
- else
- onDialogReturn(val);
- return;
- }
- break;
- case "javax.swing.ColorChooserDialog":
- switch (name) {
- case "SelectedColor":
- onDialogReturn(val);
- return;
- }
- break;
- case "javax.swing.JFileChooser":
- switch (name) {
- case "SelectedFile":
- File file = (File) val;
- byte[] array = (val == null ? null : /** @j2sNative file.秘bytes || */
- null);
- onDialogReturn("fileName is '" + file.getName() + "'\n\n" + new String(array));
- return;
- }
- break;
- }
- System.out.println(
- event.getSource().getClass().getName() + " " + event.getPropertyName() + ": " + event.getNewValue());
- }
-
-
-Developers are encouraged to create a separate class that handles general calls to JFileDialog.
-An example class can be found in the SwingJS distribution as
-
-/sources/net.sf.j2s.java.core/src/javajs/async/AsyncFileChooser.java.
-
-
-javax.swing.JOptionPane dialogs
--------------------------------
-
-For this action to work, the parentComponent must implement
-propertyChangeListener, and any call to JOptionPanel should allow for
-an asynchronous response, meaning that there is no actionable code following the
-call to the dialog opening.
-
-In addition, for compatibility with the Java version, implementation should
-wrap the call to getConfirmDialog or getOptionDialog in a method call to
-handle the Java:
-
-onDialogReturn(JOptionPane.showConfirmDialog(parentFrame,
-messageOrMessagePanel, "title", JOptionPane.OK_CANCEL_OPTION));
-
-Then parentFrame.propertyChange(event) should also call onDialogReturn.
-
-This will then work in both Java and JavaScript.
-
-Note that there is an int and an Object version of onDialogReturn().
-
-
-In JavaScript:
-
-The initial return from JOptionPane.showConfirmDialog and showMessageDialog
-will be (SwingJS) JDialog.ASYNCHRONOUS_INTEGER (NaN), testable as an impossible
-Java int value using ret != -(-ret) if the parent implements PropertyChangeListener, or -1
-(CLOSE_OPTION) if not.
-
-For showOptionDialog (which returns Object) or showInputDialog (which returns
-String), the initial return will be (SwingJS) JDialog.ASYNCHRONOUS_OBJECT, testable as
-((Object) ret) instanceof javax.swing.plaf.UIResource if the parent implements
-PropertyChangeListeneer, or null if not.
-
-The second return will be the desired return.
-
-In Java:
-
-The initial return will be the one and only modal final return.
-
-
-
-For full compatibility, The calling method must not continue beyond this
-call.
-
-All of the standard Java events associated with Components are also
-available.
-
-Certain fall back mechanisms are possible, where onReturn does not exist, but
-only for the following cases:
-
-
-For showMessageDialog, for WARNING_MESSAGE and ERROR_MESSAGE, a simple
-JavaScript alert() is used, returning 0 (OK_OPTION) or -1 (CLOSED_OPTION).
-
-For showInputDialog, if the message is a string, a simple JavaScript prompt()
-with input box is used, returning the entered string or null.
-
-For showConfirmDialog, a simple JavaScript confirm() is used, in which case:
-
-for YES_NO_OPTION: YES_OPTION or NO_OPTION
-
-for YES_NO_CANCEL_OPTION: YES_OPTION or CANCEL_OPTION
-
-for OK_CANCEL_OPTION or any other: OK_OPTION or CANCEL_OPTION
-
-Note that you should implement a response for CLOSED_OPTION for
-showConfirmDialog. For other dialogs, a null return indicates the dialog was
-closed, just as for Java.
-
-Developers are encouraged to create a separate class that handles general calls.
-An example class can be found in the SwingJS distribution as src/javajs/async/AsyncDialog.java.
-Very simple modifications to the Java allows asynchronous operation using AsyncDialog. Here
-is a simple "do you want to close this frame" example, where you can see that what we have
-done is to set the reply into an ActionListener that is defined in the constructor of
-the AsyncDisplay object:
-
-// Original:
-//
-// private void promptQuit() {
-// int sel = JOptionPane.showConfirmDialog(null, PROMPT_EXIT, NAME, JOptionPane.YES_NO_OPTION);
-// switch (sel) {
-// case JOptionPane.YES_OPTION:
-// resultsTab.clean();
-// seqs.dispose();
-// if (fromMain) {
-// System.exit(0);
-// }
-// break;
-// }
-// }
-
- private void promptQuitAsync() {
- new AsyncDialog(new ActionListener() {
-
- @Override
- public void actionPerformed(ActionEvent e) {
- int sel = ((AsyncDialog)e.getSource()).getOption();
- switch (sel) {
- case JOptionPane.YES_OPTION:
- resultsTab.clean();
- seqs.dispose();
- if (fromMain) {
- System.exit(0);
- }
- break;
- }
- }}).showConfirmDialog(null, PROMPT_EXIT, NAME, JOptionPane.YES_NO_OPTION);
- }
-
-Very simple!
-
-
-native methods
---------------
-
-The J2S compiler ignores all static native method declarations.
-Anything of this nature needs to be implemented in JavaScript if it is needed,
-using j2sNative blocks:
-
-/**
- * @j2sNative
- *
- * var putYourJavaScriptCodeHere
- *
- */
-
- Note that if you follow that directly with a {...} block, then
- the javadoc code will run in JavaScript, and the {...} code will run in Java.
-
-
-key Focus
----------
-
-As of June, 2019, the keyboard focus manager is fully implemented.
-The one catch is that JTextPane and JTextArea, which already consume
-VK_TAB in Java, cannot use CTRL-TAB to continue a tabbing cycle around
-the components in a window. Instead, CTRL-TAB is absorbed by the browser.
-
-
-LookAndFeel and UI Classes
---------------------------
-
-SwingJS implements the native browser look and feel as swingjs.plaf.HTML5LookAndFeel.
-There are small differences between all look and feels -- MacOS, Windows, SwingJS.
-
-Expert developers know how to coerce changes in the UI by subclassing the UI for a
-component. This probably will not work in SwingJS.
-
-Note that LookAndFeel in Java usually determines canvas size in a Frame because
-different operating systems (Mac OS vs Windows vs HTML5) will have
-different edge sizes on their frames. If you want to ensure a component size,
-use getContentPane().setPreferredSize().
-
-
-System.exit(0) does not stop all processes
-------------------------------------------
-
-Although System.ext(int) has been implemented in JavaScript, it just closes the
-frames, stops all pending javax.swing.Timer objects in the queue, and runs any
-threads added using Runtime.getRuntime().addShutdownHook(Thread).
-It may not stop all "threads." So don't rely on that.
-Applications are responsible for shutting down prior to executing System.exit(0).
-
-
-myClass.getField not implemented
---------------------------------
-
-java.lang.reflect.Field is implemented minimally. It is not
-certain that Field.getDeclaringClass() will work. If you just want a
-value of a field, you can do this:
-
-/**
- *@j2sNative
- *
- * return myClass[name]
- */
-
-But that is not a java.lang.reflection.Field object.
-
-
-"window" and other reserved JavaScript names
---------------------------------------------
-
-No reserved top-level JavaScript name is allowed for a package name. So, for example,
-one must rename packages such as "window" or "document" to names such as "win" or "doc".
-
-reserved field and method names
--------------------------------
-
-In order to minimize the chance of added SwingJS field and method names colliding with ones
-developers might use in subclassing Java classes, we have added U+79D8 (first character of Mandarin
-"secret") to the characters already disrecommended by Java documentation ("$" and "_"). The only problem
-would be if you use that character followed by certain English words in certain classes. For example
-\u79D8canvas for JComponents (in java.awt.JSComponent) and \u79D8byte (in java.io.File).
-
-qualified field and method names
---------------------------------
-
-Method names in SwingJS are fully qualified, meaning two methods with the same Java name but different
-parameters, such as write(int) and write(double), must not have the same name in JavaScript. (In this
-case, we will have write$I and write$D.) However, in certain cases it may be desirable to leave the
-method names unqualified. In particular, when an interface actually represents a JavaScript object,
-the transpiler can leave a method name unqualified. The default situation for this is a class name
-includes ".api.js" (case-sensitive). This means that any method in any class in a package js within
-a package api, or any private interface js that has an outer interface api, will have all-unqualified
-methods. An example of this is swingjs.plaf.JSComboPopupList, which needs to communicate with a jQuery
-object directly using the following interface:
-
- private interface api {
-
- interface js extends JQueryObject {
-
- abstract js j2sCB(Object options);
-
- abstract Object[] j2sCB(String method);
-
- abstract Object[] j2sCB(String method, Object o);
-
- abstract Object[] j2sCB(String method, int i);
-
- abstract int j2sCB(String OPTION, String name);
-
- }
- }
-
-Notice that all these variants of j2sCB() will call the same method in JavaScript by design.
-
-
-missing Math methods
---------------------
-
-java.lang.Math is worked out, but some methods are missing, either because they
-involve long integer value that are inaccessible in JavaScript, or because I just
-didn't implement them. This is a result of continued Java development.
-It is easy enough to add these methods if you have the source. They go into j2sClazz.js,
-which is combined with other initial libraries into swingjs2.js by build_site.xml
-
-
-Component.getGraphics(), Graphics.dispose()
--------------------------------------------
-
-Use of component.getGraphics() is discouraged in Java and in SwingJS.
-Specifically in SwingJS, any call to component.getGraphics() or
-BufferedImage.createGraphics() or Graphics.create(...) should be matched with graphics.dispose(),
-particularly when it is called outside the context of a paint(Graphics)
-call from the system.
-
-If you see your graphics scrolling down the page with each repaint,
-look for where you have used Component.getGraphics() and not Graphics.dispose().
-For example, this will definitely NOT work in SwingJS:
-
- this.paint(getGraphics())
-
-and really should not work in Java, either, as it is technically a resource memory leak.
-
-Instead, if you really do not want to use repaint(), use this:
-
- Graphics g = getGraphics();
- paint(g);
- g.dispose();
-
-
-
-Graphics.setClip()
-------------------
-
-The HTML5 canvas.clip() method is permanent. You can only reset the clip using
-save/restore. This is different from Java, where you can temporarily change it using
-
- Shape oldClip = Graphics.getClip();
- Graphics.setClip(newClip);
- ...
- Graphics.setClip(oldClip);
-
-If you need to do something like this, you must schedule the paints
-to not have overlapping clip needs.
-
-
-MAJOR ISSUES--for Bob and Udo within SwingJS
-============================================
-
-fonts
------
-
-Fonts and FontMetrics will all be handled in JavaScript. Font matching will
-not be exact, and composite (drawn) fonts will not be supported.
-
-SwingJS handles calls such as font.getFontMetrics(g).stringWidth("xxx") by
-creating a <div> containing that text, placing it in an obscure location on
-the page, and reading div.getBoundingClientRect(). This is a VERY precise
-value, but can be a pixel or two off from what Java reports for the same font.
-
-
-OS-dependent classes
---------------------
-
-Static classes such as:
-
- java.awt.Toolkit
- java.awt.GraphicsEnvironment
-
-
-which are created using Class.forName are implemented using classes in the swingjs package.
-
-AWTAccessor is not implemented.
-
-
-AWT component peers and component "ui" user interfaces
-------------------------------------------------------
-
-ComponentPeer is a class that represents a native AWT component.
-Components with such peers are called "heavy-weight" components.
-They are expected to do the dirty work of graphics drawing.
-
-Java Swing implements peers only for JApplet, JDialog, JFrame, and JWindow.
-References to such objects have been removed, but clearly there must be
-some connection to similar DOM objects, even for "light-weight" components.
-
-
-
-MAJOR ISSUES--to be resolved by implementers
-============================================
-
-fonts
------
-
-Glyph/composite/outline fonts are not supported.
-
-
-
-threads
--------
-
-Thread locking and synchronization are not relevant to JavaScript.
-Thus, anything requiring "notify.." or "waitFor.." could be a serious issue.
-
-All threading must be "faked" in JavaScript. Specifically not available is:
-
- Thread.sleep()
-
-javax.swing.AbstractButton#doClick(pressTime) will not work, as it requires Thread.sleep();
-
-However, java.lang.Thread itself is implemented and used extensively.
-
-Methods thread.start() and thread.run() both work fine.
-
-For simple applications that use Thread.sleep() just to have a delay, as in a frame rate, for
-example, one can use javax.swing.Timer instead. That is fully implemented.
-
-Likewise, java.util.Timer can be replaced with no loss of performance with javax.Swing.Timer.
-Note that java.util.TimerTask is implemented, but it can also be replaced by an implementation of Runnable.
-
-task = new TimerTask(){....};
-t = new java.util.Timer();
-t.schedule(task, 0, 1);
-
-becomes
-
-task = new TimerTask(){....}; // or task = new Runnable() {...}
-t = new javax.swing.Timer(1, new ActionListener() {
- @Override
- public void actionPerformed(ActionEvent e) {
- task.run();
- }
-};
-t.setInitialDelay(0); // not particularly necessary
-t.start();
-
-In addition, SwingJS provides swingjs.JSThread, which can be subclassed
-if desired. This class allows simple
-
- while(!interrupted()){
- wait()
- ...
- }
-
-action through an asynchronous function run1(mode). For example:
-
- protected void run1(int mode) {
- try {
- while (true)
- switch (mode) {
- case INIT:
- // once-through stuff here
- mode = LOOP;
- break;
- case LOOP:
- if (!doDispatch || isInterrupted()) {
- mode = DONE;
- } else {
- Runnable r = new Runnable() {
- public void run() {
- // put the loop code here
- }
- };
- dispatchAndReturn(r);
- if (isJS)
- return;
- }
- break;
- // add more cases as needed
- case DONE:
- // finish up here
- if (isInterrupted())
- return;
- // or here
- break;
- }
- } finally {
- // stuff here to be executed after each loop in JS or at the end in Java
- }
- }
-
-image loading
--------------
-- All image loading in SwingJS is synchronous. A MediaTracker call will immediately return "complete".
- However, it still may take one system clock tick to fully load images. Thus, it is recommended that
- images be preloaded in the static block of the applet if it is necessary that they be available in init().
- This is only an issue if you are trying to access the pixel buffer of the image in JavaScript.
-
-- Applet.getImage(path, name) will return null if the image does not exist.
-
-- BufferedImage: only "support" imageType RGB and ARGB
-
- -BH: This is a temporary edit, just to get us started. Certainly GRAY will be needed
-
-
-BigInteger and BigDecimal
--------------------------
-
-java.math.BigInteger is fully supported; java.math.BigDecimal is roughed
-in and not fully tested (07/2019).
-
-Both classes present significant issues for JavaScript, as they are based in
-Java's 64-bit long for all their operations. Here is the JavaDoc note I added
-to BigInteger:
-
- * SwingJS note: Because of the limitations of JavaScript with regard
- * to long-integer bit storage as a double, this implementation drops
- * the integer storage bit length to 24, giving 48 for long and leaving
- * the last 16 bits clear for the exponent of the double number. This should
- * not affect performance significantly. It does increase the storage
- * size by about 33%. By bringing an "int" to 3 bytes, we can easily construct
- * and use byte[] data intended for the original BitSet.
-
-"Easily" may be a bit strong there. This was a serious challenge.
-
-BigDecimal seems to run normally, but in order to do that, my hack involves
-reducing the size of an integer that is allowed to be stored as such and not
-in byte[] as a BigInteger. I'm sure there is a performance hit, but it does work.
-
-no format internationalization
-------------------------------
-
-For now, just en for number and date formatters
-
-no winding rules
-----------------
-
- When filling a graphic, only nonzero winding rule is implemented in HTML5 Canvas2D.
-
-
-
-text-related field implementation
----------------------------------
-
-Text fields are:
-
-JTextField (JavaScript <input type="text">)
-JTextArea (JavaScript <textarea>)
-JTextPane (JavaScript <div>)
-JEditorPane (JavaScript <div>)
-
-For the initial implementation, we don't implement infinite undo/redo, and the abstract
-document model is much less elaborate. Only PlainDocument (in the form of JSPlainDocument)
-is implemented. The Document returned by JTextField.getDocument() is a javax.swing.text.Document.
-
-All scrolling is handled by HTML5. javax.swing.AutoScroller is not implemented.
-public static methods .stop, .isRunning, .processMouseDragged require true Java threading
-and so are not implmented. javax.swing.text.View and its subclasses are not implemented.
-
-The JS document model does not allow two text fields to address the same underlying document.
-
-JavaScript is slightly different from Java in that the field value is changed asynchronously after
-the keypressed event, so Java actions that are keyed to KEY_PRESSED may not pick up the new
-key value even after SwingUtilities.invokeLater() is called. Thus, key pressed actions may need
-to be recorded after a key released event instead.
-
-Formatter/Regex limitations
----------------------------
-
-Some browsers cannot process Regex "look-behind" process such as (?<=\W)
-java.util.regex.Matcher and Pattern use JavaScript's RegExp object rather than
-the native Java object. These are not identical. Only flags /igm are supported.
-Matcher.start(groupID) is not supported.
-
-java.util.Formatter will function correctly for all standard %... patterns.
-
-integer 1/0 == Infinity
------------------------
-
-1/0 in Java throws "java.lang.ArithmeticException: / by zero", but in JavaScript is just Infinity.
-
-
-
-Summary
--------
-
-These are all the known limitations of SwingJS. We have not found any of these limitations
-to be show-stoppers. The primary issue for newcomers to SwingJS is having the source code.
-You must check that source code for all your library jar files is available or, if you
-choose, you will need to decompile those classes. We have used decompilation on some projects,
-and it works just fine. So, technically, all we really need are JAR/class files. But the
-source is by far superior. It's generally prettier, and it has the license information that
-may or may not be present with the JAR or class files. Use class files at your own risk.
-
-Bob Hanson
-2019.08.16
-
-
-Additional Issues
------------------
-
-Annotation is working for classes, methods, and fields (12/22/19). Method reflection, however,
-is limited. Interfaces do not expose their methods, as the transpiler does not actually transpile
-the interfaces themselves. And method reflection only includes annotated methods.
-
-java.util.concurrent is not fully elaborated. This package is rewritten to not actually use the
-memory handling capabilities of concurrency, which JavaScript does not have access to.
-
-System.getProperties() just returns a minimal set of properties.
-
-
+++ /dev/null
-20201222130550
+++ /dev/null
-This is sources/net.sf.j2s.java.core/dist/DEV_NOTES.txt
-
-_j2sclasslist.txt
-
-the list of .js files concatenated into coreswingjs.js and minified to coreswingjs.z.js
-
-
-SwingJS-site.zip
-
-the full site directory for SwingJS including all files not in the test/ directory.
+++ /dev/null
-java/applet/Applet.js
-java/applet/AppletContext.js
-java/applet/AppletStub.js
-java/applet/JSApplet.js
-java/awt/ActiveEvent.js
-java/awt/Adjustable.js
-java/awt/AWTEvent.js
-java/awt/AWTEventMulticaster.js
-java/awt/AWTKeyStroke.js
-java/awt/BasicStroke.js
-java/awt/BorderLayout.js
-java/awt/Button.js
-java/awt/Color.js
-java/awt/color/ColorSpace.js
-java/awt/Component.js
-java/awt/ComponentOrientation.js
-java/awt/ContainerOrderFocusTraversalPolicy.js
-java/awt/Container.js
-java/awt/Cursor.js
-java/awt/DefaultFocusTraversalPolicy.js
-java/awt/DefaultKeyboardFocusManager.js
-java/awt/Dialog.js
-java/awt/Dimension.js
-java/awt/dnd/peer/DropTargetPeer.js
-java/awt/event/ActionListener.js
-java/awt/event/AdjustmentEvent.js
-java/awt/event/AdjustmentListener.js
-java/awt/event/AWTEventListener.js
-java/awt/event/ComponentAdapter.js
-java/awt/event/ComponentEvent.js
-java/awt/event/ComponentListener.js
-java/awt/event/ContainerListener.js
-java/awt/event/FocusEvent.js
-java/awt/event/FocusListener.js
-java/awt/event/HierarchyBoundsListener.js
-java/awt/event/HierarchyListener.js
-java/awt/event/InputEvent.js
-java/awt/event/InputMethodListener.js
-java/awt/event/InvocationEvent.js
-java/awt/event/ItemEvent.js
-java/awt/event/ItemListener.js
-java/awt/event/KeyListener.js
-java/awt/event/MouseEvent.js
-java/awt/event/MouseListener.js
-java/awt/event/MouseMotionListener.js
-java/awt/event/MouseWheelListener.js
-java/awt/event/TextListener.js
-java/awt/event/WindowAdapter.js
-java/awt/event/WindowEvent.js
-java/awt/event/WindowFocusListener.js
-java/awt/event/WindowListener.js
-java/awt/event/WindowStateListener.js
-java/awt/EventDispatchThread.js
-java/awt/EventFilter.js
-java/awt/EventQueue.js
-java/awt/EventQueueItem.js
-java/awt/FlowLayout.js
-java/awt/FocusTraversalPolicy.js
-java/awt/Font.js
-java/awt/font/FontRenderContext.js
-java/awt/FontMetrics.js
-java/awt/Frame.js
-java/awt/geom/AffineTransform.js
-java/awt/geom/Dimension2D.js
-java/awt/geom/Path2D.js
-java/awt/geom/PathIterator.js
-java/awt/geom/Point2D.js
-java/awt/geom/Rectangle2D.js
-java/awt/geom/RectangularShape.js
-java/awt/geom/RectIterator.js
-java/awt/GraphicsCallback.js
-java/awt/GraphicsConfiguration.js
-java/awt/GraphicsDevice.js
-java/awt/GraphicsEnvironment.js
-java/awt/Image.js
-java/awt/image/ImageObserver.js
-java/awt/Insets.js
-java/awt/ItemSelectable.js
-java/awt/JSComponent.js
-java/awt/JSDialog.js
-java/awt/JSFrame.js
-java/awt/JSPanel.js
-java/awt/KeyboardFocusManager.js
-java/awt/KeyEventDispatcher.js
-java/awt/KeyEventPostProcessor.js
-java/awt/Label.js
-java/awt/LayoutManager.js
-java/awt/LayoutManager2.js
-java/awt/LightweightDispatcher.js
-java/awt/Paint.js
-java/awt/Panel.js
-java/awt/peer/ComponentPeer.js
-java/awt/peer/ContainerPeer.js
-java/awt/peer/FramePeer.js
-java/awt/peer/KeyboardFocusManagerPeer.js
-java/awt/peer/LightweightPeer.js
-java/awt/peer/WindowPeer.js
-java/awt/Point.js
-java/awt/Queue.js
-java/awt/Rectangle.js
-java/awt/RenderingHints.js
-java/awt/Scrollbar.js
-java/awt/ScrollPane.js
-java/awt/Shape.js
-java/awt/Stroke.js
-java/awt/TextArea.js
-java/awt/TextComponent.js
-java/awt/TextField.js
-java/awt/Toolkit.js
-java/awt/Transparency.js
-java/awt/Window.js
-java/beans/ChangeListenerMap.js
-java/beans/PropertyChangeEvent.js
-java/beans/PropertyChangeListener.js
-java/beans/PropertyChangeSupport.js
-java/lang/AbstractStringBuilder.js
-java/lang/Class.js
-java/lang/Enum.js
-java/lang/Iterable.js
-java/lang/reflect/Constructor.js
-java/lang/reflect/Method.js
-java/lang/StringBuffer.js
-java/lang/StringBuilder.js
-java/lang/Thread.js
-java/lang/ThreadGroup.js
-java/math/RoundingMode.js
-java/net/URL.js
-java/net/URLStreamHandlerFactory.js
-java/net/HttpURLConnection.js
-java/net/URLStreamHandler.js
-javax/net/ssl/HttpsUrlConnection.js
-java/text/CharacterIterator.js
-java/text/DecimalFormat.js
-java/text/DecimalFormatSymbols.js
-java/text/DigitList.js
-java/text/FieldPosition.js
-java/text/Format.js
-java/text/NumberFormat.js
-java/util/AbstractCollection.js
-java/util/AbstractList.js
-java/util/AbstractMap.js
-java/util/AbstractSequentialList.js
-java/util/AbstractSet.js
-java/util/ArrayList.js
-java/util/Arrays.js
-java/util/Collection.js
-java/util/Collections.js
-java/util/Comparator.js
-java/util/Deque.js
-java/util/Dictionary.js
-java/util/Enumeration.js
-java/util/EventListener.js
-java/util/EventObject.js
-java/util/HashMap.js
-java/util/HashSet.js
-java/util/Hashtable.js
-java/util/IdentityHashMap.js
-java/util/Iterator.js
-java/util/LinkedHashMap.js
-java/util/LinkedList.js
-java/util/List.js
-java/util/ListResourceBundle.js
-java/util/Locale.js
-java/util/Map.js
-java/util/Objects.js
-java/util/Queue.js
-java/util/Random.js
-java/util/RandomAccess.js
-java/util/ResourceBundle.js
-java/util/Set.js
-java/util/TimSort.js
-java/util/Vector.js
-javajs/api/JSFunction.js
-javajs/util/AjaxURLConnection.js
-javajs/util/AjaxURLStreamHandlerFactory.js
-javajs/util/AU.js
-javajs/util/JSThread.js
-javajs/util/Lst.js
-javajs/util/PT.js
-javajs/util/Rdr.js
-javajs/util/SB.js
-javax/swing/AbstractAction.js
-javax/swing/AbstractButton.js
-javax/swing/AbstractListModel.js
-javax/swing/Action.js
-javax/swing/ActionMap.js
-javax/swing/AncestorNotifier.js
-javax/swing/ArrayTable.js
-javax/swing/border/AbstractBorder.js
-javax/swing/border/BevelBorder.js
-javax/swing/border/Border.js
-javax/swing/border/CompoundBorder.js
-javax/swing/border/EmptyBorder.js
-javax/swing/border/EtchedBorder.js
-javax/swing/border/LineBorder.js
-javax/swing/border/TitledBorder.js
-javax/swing/BorderFactory.js
-javax/swing/BoundedRangeModel.js
-javax/swing/BoxLayout.js
-javax/swing/ButtonGroup.js
-javax/swing/ButtonModel.js
-javax/swing/ClientPropertyKey.js
-javax/swing/ComboBoxModel.js
-javax/swing/DefaultBoundedRangeModel.js
-javax/swing/DefaultButtonModel.js
-javax/swing/DefaultComboBoxModel.js
-javax/swing/DefaultSingleSelectionModel.js
-javax/swing/DropMode.js
-javax/swing/event/AncestorEvent.js
-javax/swing/event/AncestorListener.js
-javax/swing/event/CaretEvent.js
-javax/swing/event/CaretListener.js
-javax/swing/event/ChangeEvent.js
-javax/swing/event/ChangeListener.js
-javax/swing/event/DocumentEvent.js
-javax/swing/event/DocumentListener.js
-javax/swing/event/EventListenerList.js
-javax/swing/event/ListDataEvent.js
-javax/swing/event/ListDataListener.js
-javax/swing/event/UndoableEditEvent.js
-javax/swing/event/UndoableEditListener.js
-javax/swing/FocusManager.js
-javax/swing/InternalFrameFocusTraversalPolicy.js
-javax/swing/LayoutComparator.js
-javax/swing/LayoutFocusTraversalPolicy.js
-javax/swing/SortingFocusTraversalPolicy.js
-javax/swing/SwingContainerOrderFocusTraversalPolicy.js
-javax/swing/SwingDefaultFocusTraversalPolicy.js
-javax/swing/Icon.js
-javax/swing/ImageIcon.js
-javax/swing/InputMap.js
-javax/swing/JApplet.js
-javax/swing/JButton.js
-javax/swing/JCheckBox.js
-javax/swing/JCheckBoxMenuItem.js
-javax/swing/JComboBox.js
-javax/swing/JComponent.js
-javax/swing/JFrame.js
-javax/swing/JLabel.js
-javax/swing/JLayeredPane.js
-javax/swing/JMenu.js
-javax/swing/JMenuBar.js
-javax/swing/JMenuItem.js
-javax/swing/JPanel.js
-javax/swing/JPopupMenu.js
-javax/swing/JRadioButtonMenuItem.js
-javax/swing/JRootPane.js
-javax/swing/JScrollBar.js
-javax/swing/JScrollPane.js
-javax/swing/JSeparator.js
-javax/swing/JTextArea.js
-javax/swing/JTextField.js
-javax/swing/JToggleButton.js
-javax/swing/JViewport.js
-javax/swing/KeyboardManager.js
-javax/swing/KeyStroke.js
-javax/swing/ListModel.js
-javax/swing/LookAndFeel.js
-javax/swing/MenuElement.js
-javax/swing/MutableComboBoxModel.js
-javax/swing/plaf/ActionMapUIResource.js
-javax/swing/plaf/basic/BasicBorders.js
-javax/swing/plaf/BorderUIResource.js
-javax/swing/plaf/ColorUIResource.js
-javax/swing/plaf/ComponentUI.js
-javax/swing/plaf/DimensionUIResource.js
-javax/swing/plaf/FontUIResource.js
-javax/swing/plaf/InputMapUIResource.js
-javax/swing/plaf/InsetsUIResource.js
-javax/swing/plaf/UIResource.js
-javax/swing/RepaintManager.js
-javax/swing/RootPaneContainer.js
-javax/swing/Scrollable.js
-javax/swing/ScrollPaneConstants.js
-javax/swing/ScrollPaneLayout.js
-javax/swing/SingleSelectionModel.js
-javax/swing/SizeRequirements.js
-javax/swing/SwingConstants.js
-javax/swing/SwingPaintEventDispatcher.js
-javax/swing/SwingUtilities.js
-javax/swing/text/AbstractDocument.js
-javax/swing/text/AttributeSet.js
-javax/swing/text/Caret.js
-javax/swing/text/DefaultCaret.js
-javax/swing/text/DefaultEditorKit.js
-javax/swing/text/Document.js
-javax/swing/text/EditorKit.js
-javax/swing/text/Element.js
-javax/swing/text/GapContent.js
-javax/swing/text/GapVector.js
-javax/swing/text/JTextComponent.js
-javax/swing/text/MutableAttributeSet.js
-javax/swing/text/PlainDocument.js
-javax/swing/text/PlainView.js
-javax/swing/text/Position.js
-javax/swing/text/Segment.js
-javax/swing/text/SegmentCache.js
-javax/swing/text/SimpleAttributeSet.js
-javax/swing/text/Style.js
-javax/swing/text/StyleConstants.js
-javax/swing/text/StyleContext.js
-javax/swing/text/TabExpander.js
-javax/swing/text/TextAction.js
-javax/swing/text/Utilities.js
-javax/swing/text/View.js
-javax/swing/tree/TreeNode.js
-javax/swing/UIDefaults.js
-javax/swing/UIManager.js
-javax/swing/undo/AbstractUndoableEdit.js
-javax/swing/undo/CompoundEdit.js
-javax/swing/undo/UndoableEdit.js
-javax/swing/ViewportLayout.js
-javax/swing/WindowConstants.js
-sun/awt/AppContext.js
-sun/awt/AWTAutoShutdown.js
-sun/awt/CausedFocusEvent.js
-sun/awt/ComponentFactory.js
-sun/awt/KeyboardFocusManagerPeerProvider.js
-sun/awt/MostRecentKeyValue.js
-sun/awt/MostRecentThreadAppContext.js
-sun/awt/PaintEventDispatcher.js
-sun/awt/PostEventQueue.js
-sun/awt/RequestFocusController.js
-sun/awt/SunToolkit.js
-sun/awt/WindowClosingListener.js
-sun/awt/WindowClosingSupport.js
-sun/awt/image/DataStealer.js
-sun/awt/image/IntegerComponentRaster.js
-sun/awt/image/IntegerInterleavedRaster.js
-sun/awt/image/SunWritableRaster.js
-sun/font/FontDesignMetrics.js
-sun/swing/DefaultLookup.js
-sun/swing/SwingLazyValue.js
-sun/text/resources/FormatData.js
-sun/text/resources/en/FormatData_en.js
-sun/util/resources/LocaleData.js
-sun/util/locale/BaseLocale.js
-sun/util/locale/LocaleUtils.js
-sun/util/locale/provider/LocaleProviderAdapter.js
-sun/util/locale/provider/LocaleDataMetaInfo.js
-swingjs/a2s/A2SContainer.js
-swingjs/a2s/A2SEvent.js
-swingjs/a2s/A2SListener.js
-swingjs/a2s/Applet.js
-swingjs/a2s/Button.js
-swingjs/a2s/Label.js
-swingjs/a2s/Panel.js
-swingjs/a2s/Scrollbar.js
-swingjs/a2s/ScrollPane.js
-swingjs/a2s/TextArea.js
-swingjs/a2s/TextField.js
-swingjs/api/Interface.js
-swingjs/api/js/DOMNode.js
-swingjs/api/js/HTML5CanvasContext2D.js
-swingjs/api/js/JSInterface.js
-swingjs/jquery/JQueryUI.js
-swingjs/JSApp.js
-swingjs/JSAppletThread.js
-swingjs/JSAppletViewer.js
-swingjs/JSFocusPeer.js
-swingjs/JSFontMetrics.js
-swingjs/JSFrameViewer.js
-swingjs/JSGraphics2D.js
-swingjs/JSGraphicsConfiguration.js
-swingjs/JSGraphicsEnvironment.js
-swingjs/JSImage.js
-swingjs/JSImagekit.js
-swingjs/JSMouse.js
-swingjs/JSNullComponentPeer.js
-swingjs/JSScreenDevice.js
-swingjs/JSThreadGroup.js
-swingjs/JSToolkit.js
-swingjs/JSUtil.js
-swingjs/plaf/ButtonListener.js
-swingjs/plaf/DefaultMenuLayout.js
-swingjs/plaf/HTML5LookAndFeel.js
-swingjs/plaf/JSAppletUI.js
-swingjs/plaf/JSButtonUI.js
-swingjs/plaf/JSCheckBoxMenuItemUI.js
-swingjs/plaf/JSCheckBoxUI.js
-swingjs/plaf/JSComboBoxUI.js
-swingjs/plaf/JSComponentUI.js
-swingjs/plaf/JSEventHandler.js
-swingjs/plaf/JSFrameUI.js
-swingjs/plaf/JSGraphicsUtils.js
-swingjs/plaf/JSLabelUI.js
-swingjs/plaf/JSLayeredPaneUI.js
-swingjs/plaf/JSLightweightUI.js
-swingjs/plaf/JSMenuBarUI.js
-swingjs/plaf/JSMenuItemUI.js
-swingjs/plaf/JSMenuUI.js
-swingjs/plaf/JSPanelUI.js
-swingjs/plaf/JSPopupMenuSeparatorUI.js
-swingjs/plaf/JSPopupMenuUI.js
-swingjs/plaf/JSRadioButtonMenuItemUI.js
-swingjs/plaf/JSRadioButtonUI.js
-swingjs/plaf/JSRootPaneUI.js
-swingjs/plaf/JSScrollBarUI.js
-swingjs/plaf/JSScrollPaneUI.js
-swingjs/plaf/JSSeparatorUI.js
-swingjs/plaf/JSSliderUI.js
-swingjs/plaf/JSTextAreaUI.js
-swingjs/plaf/JSTextFieldUI.js
-swingjs/plaf/JSTextUI.js
-swingjs/plaf/JSTextViewUI.js
-swingjs/plaf/JSViewportUI.js
-swingjs/plaf/JSWindowUI.js
-swingjs/plaf/LazyActionMap.js
-swingjs/plaf/Resizer.js
-swingjs/plaf/TextListener.js
-
-
+++ /dev/null
-Notes
-=====
-
----IMPORTANT CHARACTER SET NOTE---
-
-It is critical that all development work in Java2Script
-be done in UTF-8. This means:
-
-- making sure your Eclipse project is set up for UTF-8 (not the Eclipse default?)
-- making sure your server can serve up UTF-8 by default for any browser-loaded files
-- making sure you don't edit a Java2Script class file or one of the site .js files
- using a non-UTF-8 editor. It may replace non-Latin characters with "?" or garbage.
-- making sure that your web pages are delivered with proper headings indicating HTML5 and UTF-8
-
-<!DOCTYPE html>
-<html>
-<head>
-<meta charset="utf-8">
-
-Note that the DOCTYPE tag is critical for some browsers to switch into HTML5 mode. (MSIE?)
-
-
-
-
-In particular, the Mandarin character 秘 (mi; "secret") is used extensively throughout
-the SwingJS class files to distinguish j2s-specific fields and methods that must not
-ever be shadowed or overridden by subclasses. For example, we see in java.lang.Thread.java:
-
- public static JSThread 秘thisThread;
-
-----------------------------------
-
-
-updated 12/6/2020 -- note about restrictions on long, including BitSet and Scanner
-updated 3/21/2020 -- adds note about HashMap, Hashtable, and HashSet iterator ordering
-updated 3/20/2020 -- adds note about interning, new String("xxx"), and "xxx"
-updated 2/26/2020 -- adds Graphics.setClip issue
-updated 12/22/19 -- additional issues
-updated 11/03/19 -- adds information about File.exists() and points to src/javajs/async
-updated 10/26/19 -- adds information about File.createTempFile()
-updated 8/16/19 -- minor typos and added summary paragraph
-updated 7/19/19 -- clarification that AWT and Swing classes are supported directly
-updated 5/13/19 -- Mandarin U+79D8 reserved character; Missing Math methods; int and long
-updated 5/10/19 -- adds a section on static issues in multi-(duplicate)-applet pages
-updated 1/4/19 -- nio
-updated 9/15/18 -- adds integer 1/0 == Infinity
-updated 7/24/18 -- most classes replaced with https://github.com/frohoff/jdk8u-jdk
-updated 6/5/17 -- reserved package name "window"
-updated 3/11/17 -- myClass.getField
-updated 3/7/17 -- overloading of JSplitPane.setDividerLocation
-updated 3/2/17 -- more indication of classes not implemented (KeyListener)
-
-=============================================================================
-SwingJS and OpenJDK 8+
-=============================================================================
-
-SwingJS implements a wide range of the Java language in JavaScript. The base
-version for this implementation is OpenJDK8. some classes are implemented using
-older source code, and there are some missing methods. For the most part, this is
-no real problem. You can add or modify any java class just be adding it as source
-in your project. Or (preferably) you can contact me, and I can get it into the
-distribution. Or (even more preferably) you can do that via a patch submission.
-
-=================
-DESIGN PHILOSOPHY
-=================
-
-The java2script/SwingJS design goal is to recreate a recognizable, easily debuggable
-equivalent in JavaScript for as much of Java as practical. This means, for example,
-that one can call in JavaScript
-
- new java.util.Hashtable()
-
-and for all practical purposes it will appear that Java is running.
-
-
-Method and Field Disambiguation
--------------------------------
-
-SwingJS has no problem with the overloading of methods, for example:
-
- public void print(int b);
- public void print(float b);
-
-JavaScript does not allow overloading of methods, and the common practice in
-Java of naming a field the same as a method -- isAllowed and isAllowed() -- is
-not possible in JavaScript. As a result, SwingJS implements "fully-qualified"
-method names using "$" parameter type separation. Thus, these methods in SwingJS
-will be referred to as print$I and print$F. The rules for this encoding are
-relatively simple:
-
-1. The seven primitive types in Java are encoded $I (int), $L (long), $F (float),
-$D (double), $B (byte) $Z (boolean), and $H (short).
-
-2. String and Object are encoded as $S and $O, respectively.
-
-3. "java_lang_" is dropped for all other classes in the java.lang package (as in Java).
- For example: $StringBuffer, not $java_lang_StringBuffer
-
-4. All other classes are encoded as
-
- "$" + Class.getName().replace(".","_")
-
-For example, in Java we see:
-
- public void equals(Object o) {...}
-
-Whereas in SwingJS we have:
-
- Clazz.newMeth(C$, 'equals$O', function (o) {...}
-
-And
-
- this.getContentPane().add(bar, "North");
-
-becomes
-
- this.getContentPane$().add$java_awt_Component$O(bar, "North");
-
-5. Arrays are indicated with appended "A" for each level. So
-
- setDataVector(Object[][] dataVector, Object[] columnIdentifiers)
-
-becomes
-
- setDataVector$OAA$OA(dataVector, columnIdentifiers)
-
-(It is recognized that this design does introduce a bit of ambiguity, in that
- in principal there could be user class named XA and X in the same package,
- and methods a(X[]) and a(XA) in the same class that cannot be distinguished.
- The benefit of this simple system, however, triumphed over the unlikelyhood
- of that scenario.) The transpiler could be set to flag this possibility.
-
-6. Constructors are prepended with "c$". So
-
- public JLabel(String text) {...}
-
-becomes:
-
- Clazz.newMeth(C$, 'c$$S', function (text) {...});
-
-Field disambiguation involves prepending. In Java, a class and its subclass
-can both have the same field name, such as
-
- boolean visible;
-
-When this happens, it is called "shadowing", and though not recommended, Java allows
-it. The Java2Script transpiler will prepend such shadowing fields with "$" so that the
-subclass instance has both "visible" (for use in its methods inherited from its
-superclass) and "$visible" (for its own methods). Thus, we might see in Java:
-
- this.visible = super.visible;
-
-while in SwingJS we will see:
-
- this.$visible=this.visible;
-
-since JavaScript does not have the "super" keyword.
-
-
-
-Parameterless methods such as toString() are appended with "$" to become toString$().
-The one exception to this rule is private methods, which are saved in (truly) private
-array in the class (and are not accessible by reflection). Private parameterless
-methods retain their simple Java name, since they cannot conflict with field names.
-
-This renaming of methods has a few consequences, which are discussed more fully below.
-See particularly the section on "qualified field and method names", where it is described
-how you can use packages or classes or interfaces with ".api.js" in them to represent JavaScript
-objects for which all method names are to be left unqualified. Note that it is not
-possible to cherry-pick methods to be unqualified; only full packages, classes or
-interfaces can hold this status.
-
-The swingjs.api.js package in particular contains a number of useful interfaces that
-you can import into your project for JavaScript-specific capabilities.
-
-
-Applet vs. Application
-----------------------
-
-One of the very cool aspects of SwingJS is that it doesn't particularly matter if a browser-based
-Java app is an "applet" or an "application". We don't need JNLP (Java Network Launch Protocol)
-because now we can just start up any Java application in a browser just as easily as any applet.
-The associative array that passes information to the SwingJS applet (information that formerly
-might have been part of the APPLET tag, such as width, height, and codebase, always referred to
-in our writing as "the Info array") allows the option to specify the JApplet/Applet "code"
-class or the application "main" class. Either one will run just fine.
-
-
-Performance
------------
-
-Obviously, there are limitations. One is performance, but we have seen reproducible
-performance at 1/6 - 1/3 the speed of Java. Achieving this performance may require
-some refactoring of the Java to make it more efficient in both Java and JavaScript.
-"for" loops need to be more carefully crafted; use of "new" and "instanceof" need to be
-minimized in critical areas. Note that method overloading -- that is, the same method name
-with different parameters, such as read(int) and read(byte) -- is no longer any problem.
-
-
-Threads
--------
-
-Although there is only a single thread in JavaScript, meaning Thread.wait(), Thread.sleep(int) and
-Thread.notify() cannot be reproduced, we have found that this is not a serious limitation.
-For example, javax.swing.Timer() works perfectly in JavaScript. All it means is that threads
-that use sleep(int) or notify() must be refactored to allow Timer-like callbacks. That is,
-they must allow full exit and re-entry of Thread.run(), not the typical while/sleep motif.
-
-The key is to create a state-based run() that can be exited and re-entered in JavaScript.
-
-
-Static fields
--------------
-
-Final static primitive "constant" fields (String, boolean, int, etc.) such as
-
-static final int TEST = 3;
-static final String MY_STRING = "my " + "string";
-
-are converted to their primitive form automatically by the Eclipse Java compiler
-and do not appear in the JavaScript by their names.
-
-Other static fields are properties of their class and can be used as expected.
-
-Note, however, that SwingJS runs all "Java" code on a page in a common "jvm"
-(like older versions of Java). So, like the older Java schema, the JavaScript
-equivalents of both applets and applications will share all of their static
-fields and methods. This includes java.lang.System.
-
-Basically, SwingJS implementations of Java run in a browser page-based sandbox
-instead of an applet-specific one.
-
-In general, this is no problem. But if we are to implement pages with
-multiple applets present, we must be sure to only have static references
-that are "final" or specifically meant to be shared in a JavaScript
-environment only (since they will not be shared in Java).
-
-A simple solution, if static non-constant references are needed, is to attach the
-field to Thread.currentThread.threadGroup(), which is an applet-specific reference.
-Be sure, if you do this, that you use explicit setters and getters:
-
-For example,
-
-private static String myvar;
-
-...
-
-public void setMyVar(String x) {
- ThreadGroup g = Thread.currentThread().threadGroup();
- /**
- * @j2sNative g._myvar = x;
- *
- */
- {
- myvar = x;
- }
-}
-
-public String getMyVar() {
- ThreadGroup g = Thread.currentThread().threadGroup();
- /**
- * @j2sNative return g._myvar || null;
- *
- */
- {
- return myvar;
- }
-}
-
- in Java will get and set x the same in JavaScript and in Java.
-
-
-A convenient way to do this in general is to supply a singleton class with
-explicitly private-only constructors and then refer to it in Java and in JavaScript
-instead of using static field, referring to myclass.getIntance().xxx instead of
-myclass.xxx in Java (and JavaScript).
-
-This was done extensively in the Jalview project. See jalview.bin.Instance.
-
-
-Helper Packages -- swingjs/ and javajs/
----------------------------------------
-
-The SwingJS library is the swingjs/ package. There are interfaces that may be of assistance
-in swingjs/api, but other than that, it is not recommended that developers access classes in
-this package. The "public" nature of their methods is really an internal necessity.
-
-In addition to swingjs/, though, there are several useful classes in the javajs/ package
-that could be very useful. This package is a stand-alone package that can be
-cloned in any Java project that also would be great to have in any JavaScript project
--- SwingJS-related or not. Functionality ranges from reading and writing various file
-formats, including PDF, BMP, PNG, GIF, JPG, JSON, ZIP, and CompoundDocument formats.
-
-A variety of highly efficient three- and four-dimensional point, vector, matrix, and
-quaternion classes are included, as they were developed for JSmol and inherited from that
-project.
-
-Of particular interest should be javajs/async/, which includes
-
-javajs.async.Async
-javajs.async.AsyncColorChooser
-javajs.async.AsyncDialog
-javajs.async.AsyncFileChooser
-
-See javajs.async.Async JavaDoc comments for a full description of
-these useful classes.
-
-
-Modal Dialogs
--------------
-
-Although true modal dialogs are not possible with only one thread, a functional equivalent --
-asynchronous modal dialogs -- is relatively easy to set up. All the JOptionPane dialogs will
-return PropertyChangeEvents to signal that they have been disposed of and containing the results.
-See below and classes in the javajs.async package.
-
-
-Native calls
-------------
-
-Native calls in Java are calls to operating system methods that are not in Java. JavaScript
-has no access to these, of course, and they must all be replaced by JavaScript equivalents.
-Fortunately, they are not common, and those that are present in Java (for example, in calculating
-checksums in ZIP file creation) are at a low enough level that most developers do not utilize them
-or do not even have access to them. All native calls in Java classes have been replaced by
-Java equivalents.
-
-
-Swing GUI Peers and UIClasses
------------------------------
-
-One of the biggest adaptations introduced in SwingJS is in the area of the graphical
-user interface. The issue here is complex but workable. In Java there are two background
-concepts -- the Component "peer" (one per "heavy-weight" component, such as a Frame) and the
-component "uiClass" (one per component, such as JButton or JTextField).
-
-Peers are native objects of the operating system. These are the virtual buttons and text areas
-that the user is interacting with at a very base level. Their events are being passed on to
-Java or the browser by the operating system. UI classes provide a consistent "look and feel"
-for these native objects, rendering them onto the native window canvas and handling all
-user-generated events. They paint the borders, the backgrounds, the highlights, of every
-control you see in Java. There is one-to-one correspondence of Swing classes and UI classes.
-Setting the Look and Feel for a project amounts to selecting the directory from which to draw
-these UI classes. The UI classes can be found in the javax.swing.plaf ("platform look and feel")
-package.
-
-Early on in the development of SwingJS, we decided not to fully reproduce the painfully detailed
-bit-by-bit painting of controls as is done in Java. Instead, we felt it was wiser to utilize the standard
-HTML5 UI capabilities as much as possible, using DIV, and INPUT especially, with extensive use
-of CSS and sometimes jQuery (menus, and sliders, for example). Thus, we have created a new
-set of UIs -- the "HTML5 Look and Feel". These classes can be found in swingjs.plaf. Besides being
-more adaptable, this approach allows far more versatility to SwingJS developers, allowing them
-to modify the GUI to suit their needs if desired.
-
-In SwingJS, since we have no access to native peers except through the browser DOM,
-it seemed logical to merge the peer and UI idea. So instead of having one peer per heavy-weight control and
-one UI class instance for each control type, we just have one UI class instance per control, and
-that UI class instance is what is being referred to when a "peer" is notified.
-
-In some ways this is a throw back to when all of Swing's components were subclasses of
-specific AWT components such as Button and List. These "heavy-weight components" all had their
-own individual native peers and thus automatically took on the look and feel provided by the OS.
-Later Swing versions implemented full look and feel for all peers, leaving only JDialog, JFrame,
-and a few other classes to have native peers. But in SwingJS we have again a 1:1 map of component
-and UI class/peer instance.
-
-The origin of most issues (read "bugs") in relation to the GUI will probably be found in the
-swingjs.plaf JSxxxxUI.java code.
-
-
-Swing-only Components -- no longer an issue
--------------------------------------------
-
-Swing was introduced into Java well after the Java Abstract Window Toolkit (AWT) was well
-established. As such, its designers chose to allow AWT controls such as Button and List to be used
-alongside their Swing counterparts JButton and JList. Reading the code, it is clear that this
-design choice posed a huge headache for Swing class developers.
-
-For SwingJS, we decided from the beginning NOT to allow this mixed-mode programming and
-instead to require that all components be Swing components.
-
-However, this is no longer an issue. All AWT components in SwingJS are now subclasses of
-javax.swing.JComponent. So far, we have found no problem with this.
-
-
-The a2s Adapter Package
------------------------
-
-Originally, we thought that we would restrict ourselves to JApplets only. That is, only
-Swing-based applets. But as we worked, we discovered that there are a lot of great
-applets out there that are pre-Swing pure-AWT java.applet.Applet applets. Our problem was
-that we also wanted it to be possible to quickly adapt these applets to JavaScript as well.
-
-The solution turned out to be simple: Write a package (a2s) that recreates the interface for
-non-Swing components as subclasses of Swing components. Thus, a2s.Button subclasses javax.swing.JButton
-but also accepts all of the methods of java.awt.Button. This works amazingly well, with a few
-special adaptations to the core javax.swing to be "AWT-aware." All AWT components now subclass
-a2s components, which in turn subclass JComponents. So no changes in code are necessary. We have
-successfully transpiled over 500 applets using this strategy. (Kind of surprising, actually, that
-the original Java developers did not see that option. But we have a hindsight advantage here.)
-
-
-Working with Files
-==================
-
-Simple String file names are not optimal for passing information about
-read files within SwingJS applications.
-
-All work with files should either use Path or File objects exclusively.
-These objects, after a file is read or checked for existence, will already
-contain the file byte[] data. Doing something like this:
-
-File f = File("./test.dat");
-boolean isOK = f.exists();
-
-will load f with its byte[] data, if the file exists.
-
-But if after that, we use:
-
-File f2 = new File(f.getAbsolutePath());
-
-f2 will not contain that data. Such copying should be done as:
-
-File f2 = new File(f);
-
-in which case, the byte[] data will be transferred.
-
-
-SwingJS uses the following criteria to determine if File.exists() returns true:
-
-(1) if this File object has been used directly to read data, or
-(2) if reading data using this File object is successful.
-
-Note that you cannot check to see if a file exists before input or if it
-was actually written or if it already exists prior to writing in SwingJS.
-
-Thus, you should check each use of file.exists() carefully, and if necessary, provide a J2sNative
-block that gives an appropriate "OK" message, for example:
-
-(/** @j2sNative 1 ? false : */ outputfile.exits())
-
-or
-
-(/** @j2sNative 1 ? true : */ inputfile.exits())
-
-Temporary files can be created in SwingJS. SwingJS will maintain a pseudo-filesystem for files
-created with File.createTempFile(). This is useful in that closure of writing to a temporary file
-does not generate a pseudo-download to the user's machine.
-
-
-UNIMPLEMENTED CLASSES BY DESIGN
-===============================
-
-The SwingJS implementation of the following classes are present
-in a way that gracefully bypasses their functionality:
-
-accessibility
-security
-serialization
-
-
-
-TODO LIST FOR UNIMPLEMENTED CLASSES
-===================================
-
-JEditorPane (minimal implementation) - DONE 12/2018; some issues still
-JSplitPane - DONE 8/2018
-JTabbedPane - DONE 10/2018
-JTree - done 12/2019
-
-
-MINOR ISSUES--required some rewriting/refactoring by Bob and Udo
-================================================================
-
-Thread.currentThread() == dispatchThread
-
-
-MINOR ISSUES--requiring some rewriting/refactoring outside of SwingJS
-=====================================================================
-
-See below for a full discussion.
-
-Restrictions on long
-Restriction on BitSet and Scanner
-HashMap, Hashtable, and HashSet iterator ordering
-interning, new String("xxx") vs "xxx"
-Names with "$" and "_"
-positive integers do not add to give negative numbers
-ArrayIndexOutOfBounds
-java.awt.Color
-native methods
-javax.swing.JFileDialog
-key focus
-LookAndFeel and UI Classes
-System.exit(0) does not stop all processes
-list cell renderers must be JComponents
-myClass.getField not implemented
-"window" and other reserved JavaScript names
-reserved field and method names
-qualified field and method names
-missing Math methods
-Component.getGraphics(), Graphics.dispose()
-Graphics.setClip()
-
-MAJOR ISSUES--for Bob and Udo within SwingJS
-============================================
-
-fonts
-OS-dependent classes
-AWT component peers
-some aspects of reflection
-
-MAJOR ISSUES--to be resolved by implementers
-============================================
-
-fonts
-threads
-modal dialogs
-image loading
-BigDecimal not fully implemented
-no format internationalization
-no winding rules
-text-related field implementation
-Formatter/Regex limitations
-integer 1/0 == Infinity
-
-========================================================================
-
-DISCUSS
-=======
-
-Table row/col sorter needs checking after removal of java.text.Collator references
-
-I had to move all of SunHints class to RenderingHints, or the
-two classes could not be loaded. Shouldn't be a problem, I think. The sun classes are
-not accessible to developers in Java anyway, since they are generally package private.
-
-==========================================================================
-
-//////////////////////////////////////////////////////////////////////////////
-
-UNIMPLEMENTED CLASSES
-=====================
-
-accessibility
--------------
-
-All Accessibility handling has been commented out to save the download footprint.
-This removes the need for sun.misc.SharedSecrets as well.
-Nothing says we could not implement accessibility. We just didn't.
-
-
-security
---------
-
-All JavaScript security is handled by the browser natively.
-Thus, Java security checking is no longer necessary, and
-java.security.AccessController has been simplified to work without
-native security checking.
-
-Note that private methods in a class are REALLY private.
-
-
-serialization
--------------
-
-All serialization has been removed. It was never very useful for Swing anyway,
-because one needs exactly the same Java version to save and restore serialized objects.
-
-
-keyboard accelerators and mnemonics
------------------------------------
-
-This work was completed in the spring of 2019. Note that in a browser, some
-key strokes, particularly CTRL-keys, are not available. Bummer.
-
-
-MINOR ISSUES--required some rewriting/refactoring by Bob and Udo
-================================================================
-
-
-Thread.currentThread() == dispatchThread
-----------------------------------------
-
-changed to JSToolkit.isDispatchThread()
-
-
-MINOR ISSUES--requiring some rewriting/refactoring outside of SwingJS
-=====================================================================
-
-restrictions on long
---------------------
-
-Java's 64-bit long type is not supported in JavaScript. There is no Int64Array in JavaScript,
-and 0x20000000000000 + 1 evaluates to 0x20000000000000, not 0x20000000000001.
-(Likewise, -0x20000000000000 - 1 is left unchanged.)
-
-The largest "integer" value in JavaScript is 9007199254740991 (9.007199254740991E13, or 0x1FFFFFFFFFFFFFF).
-Effectively, you get to use only 53 bits of the long, not 64. Trying to set a long larger than
-0x1FFFFFFFFFFFFFF or smaller than -0x1FFFFFFFFFFFFFF will result in a NumberFormatException.
-
-The transpiler handles conversion to long the same as Java for all cases other than from double.
-
-For small double values, there is no problem, and, in fact, this is a known trick used to round
-doubles and floats toward zero:
-
-double d;
-d = (long) 3.8;
-assert(d == 3);
-d = (long) -3.8;
-assert(d == -3);
-
-SwingJS will evaluate (long) d as 0 for d > 9007199254740991
-or d < -9007199254740991, same as Java returns for Double.NaN.
-So, in Java we have:
-
- assert(((long) Double.NaN) == 0);
- assert(((int) Double.NaN) == 0);
- assert(((long) Float.NaN) == 0);
- assert(((int) Float.NaN) == 0);
-
-and also, in JavaScript only, we also have:
-
- double d = 0x2000000000000L;
- assert(((long) d) == 0);
-
-
-restrictions on BitSet and Scanner
-----------------------------------
-
-Because of the issue of long being only 53 bits, any time a method returns a long value, considerations must
-be made as to whether this will work in JavaScript. In particular, BitSet and Scanner have issues.
-
-In SwingJS, java.util.BitSet has been implemented as a 32-bit integer-based bitset. This was no problem in
-Java 6, but starting with Java 7, a method was added to BitSet that allows for the extraction of the
-underlying long[] word data. This is not work in JavaScript. Instead, SwingJS java.util.Bitset.toLongArray() will deliver
-32-bit int[] data.
-
-SwingJS Scanner has hasNextLong() and nextLong(), and although it will scan through long numbers,
-Scanner will choke on long numbers greater than the JavaScript 53-bit limit. hasNextLong() will
-return false, and nextLong() will throw an InputMismatchException triggered by the NumberFormatException
-thrown by Long.parseLong().
-
-
-HashMap, Hashtable, and HashSet iterator ordering
--------------------------------------------------
-
-In Java, iterators for HashMap, Hashtable, and HashSet do not guarantee any particular order.
-From the HashMap documentation for Java 8:
-
- This class makes no guarantees as to the order of the map; in particular, it does not
- guarantee that the order will remain constant over time.
-
-Likewise, for HashSet (because it is simply a convenience method for HashMap<Object,PRESENT>:
-
- [HashSet] makes no guarantees as to the iteration order of the set.
-
-JavaScript's Map object is different. It is basically a LinkedHashMap, so it guarantees iteration
-in order of object addition.
-
-Starting with java2script 3.2.9.v1, these classes use the JavaScript Map object rather than hash codes
-whenever all keys are strictly of JavaScript typeof "string". If any key is introduced that is not a string, the
-implementation falls back to using hash codes, the same as Java.
-
-Note strings created using new String("xxxx") are NOT typeof "string"; they are typeof "object".
-
-The result is significantly faster performance (3-12 x faster) than originally, and up to 3 x faster
-performance in JavaScript than in Java itself. Right. Faster than Java.
-
-The JavaScript Map implementation is implemented UNLESS the constructor used is the one that
-specifies both initial capacity and load factor in their constructor. Thus,
-
-new Hashtable()
-new HashMap()
-new HashMap(16)
-new HashSet()
-
-all use the JavaScript Map. But
-
-new Hashtable(11, 0.75f)
-new HashMap(16, 0.75f)
-new HashSet(16, 0.75f)
-
-do not.
-
-This design allows for opting out of the JavaScript Map use in order to retain the exact behavior of
-iterators in JavaScript as in Java.
-
-
-interning, new String("xxx") vs "xxx"
--------------------------------------
-
-Note that the following are true in JavaScript:
-
-typeof new String("xxxx") == "object"
-typeof "xxxx" == "string"
-var s = "x";typeof ("xxx" + s) == "string"
-
-There is no equivalence to this behavior in Java, where a String is a String is a String.
-
-Be aware that SwingJS does not always create a JavaScript String object using JavaScript's
-new String(...) constructor. It only does this for Java new String("xxxx") or new String(new String()).
-
-In all other cases, new String(...) (in Java) results in a simple "xxxx" string in JavaScript.
-That is, it will be JavaScript typeof "string", not typeof "object".
-
-The reason for this design is that several classes in the Java core use toString()
-methods that return new String(), and those classes that do that would cause a JavaScript error
-if implicitly stringified if new String() returned a JavaScript String object.
-
-This is fine in JavaScript
-
-test1 = function() { return { toString:function(){ return "OK" } } }
-"testing" + new test1()
->> "testingOK"
-
-But for whatever reason in JavaScript:
-
-test2 = function() { return { toString:function(){ return new String("OK") } } }
-"testing" + new test2()
->> Uncaught TypeError: Cannot convert object to primitive value
-
-The lesson here is never to use
-
- return new String("...");
-
-in a Java toString() method. In Java it will be fine; in JavaScript it will also be fine as long as
-that method is never called in JavaScript implicitly in the context of string concatenation.
-
-A note about interning. Consider the following six Java constructions, where we have a == "x";
-
-"xxx"
-"xx" + "x"
-new String("xxx").intern()
-
-new String("xxx")
-"xx" + a.toString()
-"xx" + a
-
-All six of these will return java.lang.String for .getClass().getName().
-However, the first three are String literals, while the last three are String objects.
-Thus:
- "xxx" == "xxx"
- "xxx" == "xx" + "x"
- "xxx" == new String("xxx").intern()
-
-but none of the other three are equivalent to "xxx" or each other:
-
- "xxx" != new String("xxx")
- "xxx" != "xx" + a.toString()
- "xxx" != "xx" + a
- new String("xxx") != new String("xxx")
- "xx" + a != new String("xxx")
-
-etc.
-
-As in Java, in SwingJS, all of the following Java assertions pass as true:
-
- assert("xxx" == "xx" + "x");
- assert("xxx" == ("xx" + a).intern());
- assert("xxx" === new String("xxx").intern());
-
-and both of these do as well:
-
- assert(new String("xxx") != "xxx");
- assert(new String("xxx") != new String("xxx"));
-
-But the following two fail to assert true:
-
- assert("xxx" != "xx" + a);
- assert("xxx" != "xx" + a.toString());
-
-because in JavaScript, both of these right-side expressions evaluate to a simple "interned" string.
-
-In Java, however, these assertions are true because Java implicitly "boxes" String
-concatentaion as a String object, not a literal.
-
-Most of us know not to generally use == with Strings unless they are explicitly interned.
-Where this problem may arise, though, is in IdentityHashMap, which compares objects using
-System.identityHashCode(), which is not the same for different objects or their string literal equivalents.
-
-My recommendation, if you need to use IdentityHashMap with strings is to always use an explicit String.intern()
-for any keys -- unless you really want to keep every string as separate keys even if they are the same sequence,
-in which case, use new String(). This will work in Java and in JavaScript.
-
-Be aware when working with strings that come from SwingJS and are being used by other JavaScript modules
-that those that are String objects will return "object" for the JavaScript typeof operator, not "string".
-
-The easy way to ensure this is no problem is to concatenate strings with "" to force immediate interning:
-
- var x = aJavaObject.getString() + "";
-
-unless you are certain that the string is being returned is a raw JavaScript string.
-
-Names with "$" and "_"
-----------------------
-
-For the most part, this should be no problem.
-
-Note that the use of $ and _ in Java field names has always been discouraged:
-[https://docs.oracle.com/javase/tutorial/java/nutsandbolts/variables.html]
-
- You may find some situations where auto-generated names will contain the dollar sign,
- but your variable names should always avoid using it. A similar convention
- exists for the underscore character; while it's technically legal to begin your
- variable's name with "_", this practice is discouraged.
-
-Some impacts of transpiling method names with full qualification:
-
-1) SwingJS will introduce fields that start with $ or _. These will not conflict
- if the above convention is followed.
-
-2) Fields that have the same Java name as a method are not an issue.
-
-3) Fields that have a Java name with $ that matches a transpiled method name,
- such as toString$, will need to be refactored in Java to not have that name collision.
-
-4) Fields in a subclass that have the same name as private fields in a superclass
- represent a name collision, because the superclass method needs to call its private
- field even if invoked from a subclass. The solution was to modify the subclass field
- name using one or more prepended $.
-
-5) Use of Class.getDeclaredMethods() reflection will return Method objects having the transpiled
- name, not the Java name. This could require some j2sNative adjustment
- to strip the $... parameters from the name if that is needed.
-
-6) Use of Method.getParameterTypes() should work fine, provided class names
- do not contain "_". This is because the transpiler converts "." to "_" when
- creating the fully qualified JavaScript name.
-
-
-positive integers do not add to give negative numbers
------------------------------------------------------
-
-In Java, the following is true:
-
- 2000000000 + 2000000000 == -294967296
-
-But in SwingJS, that will be 4000000000. So, for example, the following
-strategy will fail in SwingJS:
-
- int newLength = lineBuf.length * 2;
- if (newLength < 0) {
- newLength = Integer.MAX_VALUE;
- }
-
-"-1" in JavaScript is not 0xFFFFFFFF.
-
-And one must take care to not compare a negative number with a 32-bit mask. So
-
-(b & 0xFF000000) == 0xFF000000
-
-is true in Java for (int) b = -1, but is false in JavaScript, because 0xFF000000 is 4278190080,
-while (-1 & 0xFF000000) is, strangely enough, -16777216, and, in fact,
-
-(0xFF000000 & 0xFF000000) != 0xFF000000
-
-because -16777216 is not 4278190080.
-
-The fix is that one must compare similar operations:
-
-if ((b & 0xFF000000) == (0xFF000000 & 0xFF000000)) .....
-
-Importantly, the JavaScript Int32Array does behave properly. From
-the Firefox developer console:
-
->> x = new Int32Array(1)
-<- Int32Array(1) [ 0 ]
->> x[0] = 4000000000
-<- 4000000000
->> x[0]
-<- -294967296
-
-Notice that, perhaps unexpectedly, the following two constructs produce
-different results in JavaScript:
-
-x = new Int32Array(1);
-b = x[0] = 4000000000;
-
-(b will be 4000000000)
-
-and
-
-x = new Int32Array(1);
-x[0] = 4000000000;
-b = x[0];
-
-(b will be -294967296)
-
-
-SwingJS leverages array typing to handle all byte and short arithmetic so as
-to ensure that any byte or short operation in JavaScript does give the same
-result in Java. The design decision to not also do this with integer math was
-a trade-off between performance and handling edge cases.
-
-
-ArrayIndexOutOfBounds
----------------------
-
-You cannot implicitly throw an ArrayIndexOutOfBoundsException in JavaScript.
-JavaScript will simply return "undefined", not throw an Exception. So:
-
-boolean notAGoodIdeaIsOutOfBounds(String[] sa, int i) {
- try {
- return (sa[i] == sa[i]);
- } catch (ArrayIndexOutOfBoundsException e) {
- return false;
- }
-}
-
-will work in Java but not in JavaScript. Code should not depend upon this sort
-of trap anyway, if you ask me.
-
-Throwable vs Error vs Exception
--------------------------------
-
-True JavaScript errors are trapped as Throwable, whereas you can still trap
-Error and Exception as well. So if you want to be sure to catch any JavaScript
-error, use try{}catch (Throwable t){}, not try{}catch (Exception e){}.
-
-j
-ava.awt.Color
---------------
-
-ColorSpace: only "support" CS_sRGB.
-
- TODO -- any volunteers??
-
-
-javax.swing.JFileDialog
------------------------
-
-HTML5 cannot expose a file reading directory structure. But you certainly
-can still do file reading and writing. It just works a little differently.
-It's a simple modification:
-
- b = new JButton("FileOpenDialog");
- b.addActionListener(new ActionListener() {
-
- @Override
- public void actionPerformed(ActionEvent e) {
- JFileChooser fc = new JFileChooser();
- Test_Dialog.this.onDialogReturn(fc.showOpenDialog(Test_Dialog.this));
- // Java will wait until the dialog is closed, then enter the onDialogReturn method.
- // JavaScript will exit with NaN immediately, and then call back with its actual value
- // asynchronously.
- }
-
- });
-
- public void onDialogReturn(int value) {
- if (value != Math.floor(value))
- return; // in JavaScript, this will be NaN, indicating the dialog has been opened
- // If we are here, the dialog has closed, in both Java and JavaScript.
- System.out.println("int value is " + value);
- }
-
-
- @Override
- public void propertyChange(PropertyChangeEvent event) {
- Object val = event.getNewValue();
- String name = event.getPropertyName();
- System.out.println(name);
- switch (event.getSource().getClass().getName()) {
- case "javax.swing.JOptionPane":
- switch (name) {
- case "inputValue":
- onDialogReturn(val);
- return;
- case "value":
- if (val instanceof Integer)
- onDialogReturn(((Integer) val).intValue());
- else
- onDialogReturn(val);
- return;
- }
- break;
- case "javax.swing.ColorChooserDialog":
- switch (name) {
- case "SelectedColor":
- onDialogReturn(val);
- return;
- }
- break;
- case "javax.swing.JFileChooser":
- switch (name) {
- case "SelectedFile":
- File file = (File) val;
- byte[] array = (val == null ? null : /** @j2sNative file.秘bytes || */
- null);
- onDialogReturn("fileName is '" + file.getName() + "'\n\n" + new String(array));
- return;
- }
- break;
- }
- System.out.println(
- event.getSource().getClass().getName() + " " + event.getPropertyName() + ": " + event.getNewValue());
- }
-
-
-Developers are encouraged to create a separate class that handles general calls to JFileDialog.
-An example class can be found in the SwingJS distribution as
-
-/sources/net.sf.j2s.java.core/src/javajs/async/AsyncFileChooser.java.
-
-
-javax.swing.JOptionPane dialogs
--------------------------------
-
-For this action to work, the parentComponent must implement
-propertyChangeListener, and any call to JOptionPanel should allow for
-an asynchronous response, meaning that there is no actionable code following the
-call to the dialog opening.
-
-In addition, for compatibility with the Java version, implementation should
-wrap the call to getConfirmDialog or getOptionDialog in a method call to
-handle the Java:
-
-onDialogReturn(JOptionPane.showConfirmDialog(parentFrame,
-messageOrMessagePanel, "title", JOptionPane.OK_CANCEL_OPTION));
-
-Then parentFrame.propertyChange(event) should also call onDialogReturn.
-
-This will then work in both Java and JavaScript.
-
-Note that there is an int and an Object version of onDialogReturn().
-
-
-In JavaScript:
-
-The initial return from JOptionPane.showConfirmDialog and showMessageDialog
-will be (SwingJS) JDialog.ASYNCHRONOUS_INTEGER (NaN), testable as an impossible
-Java int value using ret != -(-ret) if the parent implements PropertyChangeListener, or -1
-(CLOSE_OPTION) if not.
-
-For showOptionDialog (which returns Object) or showInputDialog (which returns
-String), the initial return will be (SwingJS) JDialog.ASYNCHRONOUS_OBJECT, testable as
-((Object) ret) instanceof javax.swing.plaf.UIResource if the parent implements
-PropertyChangeListeneer, or null if not.
-
-The second return will be the desired return.
-
-In Java:
-
-The initial return will be the one and only modal final return.
-
-
-
-For full compatibility, The calling method must not continue beyond this
-call.
-
-All of the standard Java events associated with Components are also
-available.
-
-Certain fall back mechanisms are possible, where onReturn does not exist, but
-only for the following cases:
-
-
-For showMessageDialog, for WARNING_MESSAGE and ERROR_MESSAGE, a simple
-JavaScript alert() is used, returning 0 (OK_OPTION) or -1 (CLOSED_OPTION).
-
-For showInputDialog, if the message is a string, a simple JavaScript prompt()
-with input box is used, returning the entered string or null.
-
-For showConfirmDialog, a simple JavaScript confirm() is used, in which case:
-
-for YES_NO_OPTION: YES_OPTION or NO_OPTION
-
-for YES_NO_CANCEL_OPTION: YES_OPTION or CANCEL_OPTION
-
-for OK_CANCEL_OPTION or any other: OK_OPTION or CANCEL_OPTION
-
-Note that you should implement a response for CLOSED_OPTION for
-showConfirmDialog. For other dialogs, a null return indicates the dialog was
-closed, just as for Java.
-
-Developers are encouraged to create a separate class that handles general calls.
-An example class can be found in the SwingJS distribution as src/javajs/async/AsyncDialog.java.
-Very simple modifications to the Java allows asynchronous operation using AsyncDialog. Here
-is a simple "do you want to close this frame" example, where you can see that what we have
-done is to set the reply into an ActionListener that is defined in the constructor of
-the AsyncDisplay object:
-
-// Original:
-//
-// private void promptQuit() {
-// int sel = JOptionPane.showConfirmDialog(null, PROMPT_EXIT, NAME, JOptionPane.YES_NO_OPTION);
-// switch (sel) {
-// case JOptionPane.YES_OPTION:
-// resultsTab.clean();
-// seqs.dispose();
-// if (fromMain) {
-// System.exit(0);
-// }
-// break;
-// }
-// }
-
- private void promptQuitAsync() {
- new AsyncDialog(new ActionListener() {
-
- @Override
- public void actionPerformed(ActionEvent e) {
- int sel = ((AsyncDialog)e.getSource()).getOption();
- switch (sel) {
- case JOptionPane.YES_OPTION:
- resultsTab.clean();
- seqs.dispose();
- if (fromMain) {
- System.exit(0);
- }
- break;
- }
- }}).showConfirmDialog(null, PROMPT_EXIT, NAME, JOptionPane.YES_NO_OPTION);
- }
-
-Very simple!
-
-
-native methods
---------------
-
-The J2S compiler ignores all static native method declarations.
-Anything of this nature needs to be implemented in JavaScript if it is needed,
-using j2sNative blocks:
-
-/**
- * @j2sNative
- *
- * var putYourJavaScriptCodeHere
- *
- */
-
- Note that if you follow that directly with a {...} block, then
- the javadoc code will run in JavaScript, and the {...} code will run in Java.
-
-
-key Focus
----------
-
-As of June, 2019, the keyboard focus manager is fully implemented.
-The one catch is that JTextPane and JTextArea, which already consume
-VK_TAB in Java, cannot use CTRL-TAB to continue a tabbing cycle around
-the components in a window. Instead, CTRL-TAB is absorbed by the browser.
-
-
-LookAndFeel and UI Classes
---------------------------
-
-SwingJS implements the native browser look and feel as swingjs.plaf.HTML5LookAndFeel.
-There are small differences between all look and feels -- MacOS, Windows, SwingJS.
-
-Expert developers know how to coerce changes in the UI by subclassing the UI for a
-component. This probably will not work in SwingJS.
-
-Note that LookAndFeel in Java usually determines canvas size in a Frame because
-different operating systems (Mac OS vs Windows vs HTML5) will have
-different edge sizes on their frames. If you want to ensure a component size,
-use getContentPane().setPreferredSize().
-
-
-System.exit(0) does not stop all processes
-------------------------------------------
-
-Although System.ext(int) has been implemented in JavaScript, it just closes the
-frames, stops all pending javax.swing.Timer objects in the queue, and runs any
-threads added using Runtime.getRuntime().addShutdownHook(Thread).
-It may not stop all "threads." So don't rely on that.
-Applications are responsible for shutting down prior to executing System.exit(0).
-
-
-myClass.getField not implemented
---------------------------------
-
-java.lang.reflect.Field is implemented minimally. It is not
-certain that Field.getDeclaringClass() will work. If you just want a
-value of a field, you can do this:
-
-/**
- *@j2sNative
- *
- * return myClass[name]
- */
-
-But that is not a java.lang.reflection.Field object.
-
-
-"window" and other reserved JavaScript names
---------------------------------------------
-
-No reserved top-level JavaScript name is allowed for a package name. So, for example,
-one must rename packages such as "window" or "document" to names such as "win" or "doc".
-
-reserved field and method names
--------------------------------
-
-In order to minimize the chance of added SwingJS field and method names colliding with ones
-developers might use in subclassing Java classes, we have added U+79D8 (first character of Mandarin
-"secret") to the characters already disrecommended by Java documentation ("$" and "_"). The only problem
-would be if you use that character followed by certain English words in certain classes. For example
-\u79D8canvas for JComponents (in java.awt.JSComponent) and \u79D8byte (in java.io.File).
-
-qualified field and method names
---------------------------------
-
-Method names in SwingJS are fully qualified, meaning two methods with the same Java name but different
-parameters, such as write(int) and write(double), must not have the same name in JavaScript. (In this
-case, we will have write$I and write$D.) However, in certain cases it may be desirable to leave the
-method names unqualified. In particular, when an interface actually represents a JavaScript object,
-the transpiler can leave a method name unqualified. The default situation for this is a class name
-includes ".api.js" (case-sensitive). This means that any method in any class in a package js within
-a package api, or any private interface js that has an outer interface api, will have all-unqualified
-methods. An example of this is swingjs.plaf.JSComboPopupList, which needs to communicate with a jQuery
-object directly using the following interface:
-
- private interface api {
-
- interface js extends JQueryObject {
-
- abstract js j2sCB(Object options);
-
- abstract Object[] j2sCB(String method);
-
- abstract Object[] j2sCB(String method, Object o);
-
- abstract Object[] j2sCB(String method, int i);
-
- abstract int j2sCB(String OPTION, String name);
-
- }
- }
-
-Notice that all these variants of j2sCB() will call the same method in JavaScript by design.
-
-
-missing Math methods
---------------------
-
-java.lang.Math is worked out, but some methods are missing, either because they
-involve long integer value that are inaccessible in JavaScript, or because I just
-didn't implement them. This is a result of continued Java development.
-It is easy enough to add these methods if you have the source. They go into j2sClazz.js,
-which is combined with other initial libraries into swingjs2.js by build_site.xml
-
-
-Component.getGraphics(), Graphics.dispose()
--------------------------------------------
-
-Use of component.getGraphics() is discouraged in Java and in SwingJS.
-Specifically in SwingJS, any call to component.getGraphics() or
-BufferedImage.createGraphics() or Graphics.create(...) should be matched with graphics.dispose(),
-particularly when it is called outside the context of a paint(Graphics)
-call from the system.
-
-If you see your graphics scrolling down the page with each repaint,
-look for where you have used Component.getGraphics() and not Graphics.dispose().
-For example, this will definitely NOT work in SwingJS:
-
- this.paint(getGraphics())
-
-and really should not work in Java, either, as it is technically a resource memory leak.
-
-Instead, if you really do not want to use repaint(), use this:
-
- Graphics g = getGraphics();
- paint(g);
- g.dispose();
-
-
-
-Graphics.setClip()
-------------------
-
-The HTML5 canvas.clip() method is permanent. You can only reset the clip using
-save/restore. This is different from Java, where you can temporarily change it using
-
- Shape oldClip = Graphics.getClip();
- Graphics.setClip(newClip);
- ...
- Graphics.setClip(oldClip);
-
-If you need to do something like this, you must schedule the paints
-to not have overlapping clip needs.
-
-
-MAJOR ISSUES--for Bob and Udo within SwingJS
-============================================
-
-fonts
------
-
-Fonts and FontMetrics will all be handled in JavaScript. Font matching will
-not be exact, and composite (drawn) fonts will not be supported.
-
-SwingJS handles calls such as font.getFontMetrics(g).stringWidth("xxx") by
-creating a <div> containing that text, placing it in an obscure location on
-the page, and reading div.getBoundingClientRect(). This is a VERY precise
-value, but can be a pixel or two off from what Java reports for the same font.
-
-
-OS-dependent classes
---------------------
-
-Static classes such as:
-
- java.awt.Toolkit
- java.awt.GraphicsEnvironment
-
-
-which are created using Class.forName are implemented using classes in the swingjs package.
-
-AWTAccessor is not implemented.
-
-
-AWT component peers and component "ui" user interfaces
-------------------------------------------------------
-
-ComponentPeer is a class that represents a native AWT component.
-Components with such peers are called "heavy-weight" components.
-They are expected to do the dirty work of graphics drawing.
-
-Java Swing implements peers only for JApplet, JDialog, JFrame, and JWindow.
-References to such objects have been removed, but clearly there must be
-some connection to similar DOM objects, even for "light-weight" components.
-
-
-
-MAJOR ISSUES--to be resolved by implementers
-============================================
-
-fonts
------
-
-Glyph/composite/outline fonts are not supported.
-
-
-
-threads
--------
-
-Thread locking and synchronization are not relevant to JavaScript.
-Thus, anything requiring "notify.." or "waitFor.." could be a serious issue.
-
-All threading must be "faked" in JavaScript. Specifically not available is:
-
- Thread.sleep()
-
-javax.swing.AbstractButton#doClick(pressTime) will not work, as it requires Thread.sleep();
-
-However, java.lang.Thread itself is implemented and used extensively.
-
-Methods thread.start() and thread.run() both work fine.
-
-For simple applications that use Thread.sleep() just to have a delay, as in a frame rate, for
-example, one can use javax.swing.Timer instead. That is fully implemented.
-
-Likewise, java.util.Timer can be replaced with no loss of performance with javax.Swing.Timer.
-Note that java.util.TimerTask is implemented, but it can also be replaced by an implementation of Runnable.
-
-task = new TimerTask(){....};
-t = new java.util.Timer();
-t.schedule(task, 0, 1);
-
-becomes
-
-task = new TimerTask(){....}; // or task = new Runnable() {...}
-t = new javax.swing.Timer(1, new ActionListener() {
- @Override
- public void actionPerformed(ActionEvent e) {
- task.run();
- }
-};
-t.setInitialDelay(0); // not particularly necessary
-t.start();
-
-In addition, SwingJS provides swingjs.JSThread, which can be subclassed
-if desired. This class allows simple
-
- while(!interrupted()){
- wait()
- ...
- }
-
-action through an asynchronous function run1(mode). For example:
-
- protected void run1(int mode) {
- try {
- while (true)
- switch (mode) {
- case INIT:
- // once-through stuff here
- mode = LOOP;
- break;
- case LOOP:
- if (!doDispatch || isInterrupted()) {
- mode = DONE;
- } else {
- Runnable r = new Runnable() {
- public void run() {
- // put the loop code here
- }
- };
- dispatchAndReturn(r);
- if (isJS)
- return;
- }
- break;
- // add more cases as needed
- case DONE:
- // finish up here
- if (isInterrupted())
- return;
- // or here
- break;
- }
- } finally {
- // stuff here to be executed after each loop in JS or at the end in Java
- }
- }
-
-image loading
--------------
-- All image loading in SwingJS is synchronous. A MediaTracker call will immediately return "complete".
- However, it still may take one system clock tick to fully load images. Thus, it is recommended that
- images be preloaded in the static block of the applet if it is necessary that they be available in init().
- This is only an issue if you are trying to access the pixel buffer of the image in JavaScript.
-
-- Applet.getImage(path, name) will return null if the image does not exist.
-
-- BufferedImage: only "support" imageType RGB and ARGB
-
- -BH: This is a temporary edit, just to get us started. Certainly GRAY will be needed
-
-
-BigInteger and BigDecimal
--------------------------
-
-java.math.BigInteger is fully supported; java.math.BigDecimal is roughed
-in and not fully tested (07/2019).
-
-Both classes present significant issues for JavaScript, as they are based in
-Java's 64-bit long for all their operations. Here is the JavaDoc note I added
-to BigInteger:
-
- * SwingJS note: Because of the limitations of JavaScript with regard
- * to long-integer bit storage as a double, this implementation drops
- * the integer storage bit length to 24, giving 48 for long and leaving
- * the last 16 bits clear for the exponent of the double number. This should
- * not affect performance significantly. It does increase the storage
- * size by about 33%. By bringing an "int" to 3 bytes, we can easily construct
- * and use byte[] data intended for the original BitSet.
-
-"Easily" may be a bit strong there. This was a serious challenge.
-
-BigDecimal seems to run normally, but in order to do that, my hack involves
-reducing the size of an integer that is allowed to be stored as such and not
-in byte[] as a BigInteger. I'm sure there is a performance hit, but it does work.
-
-no format internationalization
-------------------------------
-
-For now, just en for number and date formatters
-
-no winding rules
-----------------
-
- When filling a graphic, only nonzero winding rule is implemented in HTML5 Canvas2D.
-
-
-
-text-related field implementation
----------------------------------
-
-Text fields are:
-
-JTextField (JavaScript <input type="text">)
-JTextArea (JavaScript <textarea>)
-JTextPane (JavaScript <div>)
-JEditorPane (JavaScript <div>)
-
-For the initial implementation, we don't implement infinite undo/redo, and the abstract
-document model is much less elaborate. Only PlainDocument (in the form of JSPlainDocument)
-is implemented. The Document returned by JTextField.getDocument() is a javax.swing.text.Document.
-
-All scrolling is handled by HTML5. javax.swing.AutoScroller is not implemented.
-public static methods .stop, .isRunning, .processMouseDragged require true Java threading
-and so are not implmented. javax.swing.text.View and its subclasses are not implemented.
-
-The JS document model does not allow two text fields to address the same underlying document.
-
-JavaScript is slightly different from Java in that the field value is changed asynchronously after
-the keypressed event, so Java actions that are keyed to KEY_PRESSED may not pick up the new
-key value even after SwingUtilities.invokeLater() is called. Thus, key pressed actions may need
-to be recorded after a key released event instead.
-
-Formatter/Regex limitations
----------------------------
-
-Some browsers cannot process Regex "look-behind" process such as (?<=\W)
-java.util.regex.Matcher and Pattern use JavaScript's RegExp object rather than
-the native Java object. These are not identical. Only flags /igm are supported.
-Matcher.start(groupID) is not supported.
-
-java.util.Formatter will function correctly for all standard %... patterns.
-
-integer 1/0 == Infinity
------------------------
-
-1/0 in Java throws "java.lang.ArithmeticException: / by zero", but in JavaScript is just Infinity.
-
-
-
-Summary
--------
-
-These are all the known limitations of SwingJS. We have not found any of these limitations
-to be show-stoppers. The primary issue for newcomers to SwingJS is having the source code.
-You must check that source code for all your library jar files is available or, if you
-choose, you will need to decompile those classes. We have used decompilation on some projects,
-and it works just fine. So, technically, all we really need are JAR/class files. But the
-source is by far superior. It's generally prettier, and it has the license information that
-may or may not be present with the JAR or class files. Use class files at your own risk.
-
-Bob Hanson
-2019.08.16
-
-
-Additional Issues
------------------
-
-Annotation is working for classes, methods, and fields (12/22/19). Method reflection, however,
-is limited. Interfaces do not expose their methods, as the transpiler does not actually transpile
-the interfaces themselves. And method reflection only includes annotated methods.
-
-java.util.concurrent is not fully elaborated. This package is rewritten to not actually use the
-memory handling capabilities of concurrency, which JavaScript does not have access to.
-
-System.getProperties() just returns a minimal set of properties.
-
-
+++ /dev/null
-20201222130056
+++ /dev/null
-This is sources/net.sf.j2s.java.core/dist/DEV_NOTES.txt
-
-_j2sclasslist.txt
-
-the list of .js files concatenated into coreswingjs.js and minified to coreswingjs.z.js
-
-
-SwingJS-site.zip
-
-the full site directory for SwingJS including all files not in the test/ directory.
+++ /dev/null
-java/applet/Applet.js
-java/applet/AppletContext.js
-java/applet/AppletStub.js
-java/applet/JSApplet.js
-java/awt/ActiveEvent.js
-java/awt/Adjustable.js
-java/awt/AWTEvent.js
-java/awt/AWTEventMulticaster.js
-java/awt/AWTKeyStroke.js
-java/awt/BasicStroke.js
-java/awt/BorderLayout.js
-java/awt/Button.js
-java/awt/Color.js
-java/awt/color/ColorSpace.js
-java/awt/Component.js
-java/awt/ComponentOrientation.js
-java/awt/ContainerOrderFocusTraversalPolicy.js
-java/awt/Container.js
-java/awt/Cursor.js
-java/awt/DefaultFocusTraversalPolicy.js
-java/awt/DefaultKeyboardFocusManager.js
-java/awt/Dialog.js
-java/awt/Dimension.js
-java/awt/dnd/peer/DropTargetPeer.js
-java/awt/event/ActionListener.js
-java/awt/event/AdjustmentEvent.js
-java/awt/event/AdjustmentListener.js
-java/awt/event/AWTEventListener.js
-java/awt/event/ComponentAdapter.js
-java/awt/event/ComponentEvent.js
-java/awt/event/ComponentListener.js
-java/awt/event/ContainerListener.js
-java/awt/event/FocusEvent.js
-java/awt/event/FocusListener.js
-java/awt/event/HierarchyBoundsListener.js
-java/awt/event/HierarchyListener.js
-java/awt/event/InputEvent.js
-java/awt/event/InputMethodListener.js
-java/awt/event/InvocationEvent.js
-java/awt/event/ItemEvent.js
-java/awt/event/ItemListener.js
-java/awt/event/KeyListener.js
-java/awt/event/MouseEvent.js
-java/awt/event/MouseListener.js
-java/awt/event/MouseMotionListener.js
-java/awt/event/MouseWheelListener.js
-java/awt/event/TextListener.js
-java/awt/event/WindowAdapter.js
-java/awt/event/WindowEvent.js
-java/awt/event/WindowFocusListener.js
-java/awt/event/WindowListener.js
-java/awt/event/WindowStateListener.js
-java/awt/EventDispatchThread.js
-java/awt/EventFilter.js
-java/awt/EventQueue.js
-java/awt/EventQueueItem.js
-java/awt/FlowLayout.js
-java/awt/FocusTraversalPolicy.js
-java/awt/Font.js
-java/awt/font/FontRenderContext.js
-java/awt/FontMetrics.js
-java/awt/Frame.js
-java/awt/geom/AffineTransform.js
-java/awt/geom/Dimension2D.js
-java/awt/geom/Path2D.js
-java/awt/geom/PathIterator.js
-java/awt/geom/Point2D.js
-java/awt/geom/Rectangle2D.js
-java/awt/geom/RectangularShape.js
-java/awt/geom/RectIterator.js
-java/awt/GraphicsCallback.js
-java/awt/GraphicsConfiguration.js
-java/awt/GraphicsDevice.js
-java/awt/GraphicsEnvironment.js
-java/awt/Image.js
-java/awt/image/ImageObserver.js
-java/awt/Insets.js
-java/awt/ItemSelectable.js
-java/awt/JSComponent.js
-java/awt/JSDialog.js
-java/awt/JSFrame.js
-java/awt/JSPanel.js
-java/awt/KeyboardFocusManager.js
-java/awt/KeyEventDispatcher.js
-java/awt/KeyEventPostProcessor.js
-java/awt/Label.js
-java/awt/LayoutManager.js
-java/awt/LayoutManager2.js
-java/awt/LightweightDispatcher.js
-java/awt/Paint.js
-java/awt/Panel.js
-java/awt/peer/ComponentPeer.js
-java/awt/peer/ContainerPeer.js
-java/awt/peer/FramePeer.js
-java/awt/peer/KeyboardFocusManagerPeer.js
-java/awt/peer/LightweightPeer.js
-java/awt/peer/WindowPeer.js
-java/awt/Point.js
-java/awt/Queue.js
-java/awt/Rectangle.js
-java/awt/RenderingHints.js
-java/awt/Scrollbar.js
-java/awt/ScrollPane.js
-java/awt/Shape.js
-java/awt/Stroke.js
-java/awt/TextArea.js
-java/awt/TextComponent.js
-java/awt/TextField.js
-java/awt/Toolkit.js
-java/awt/Transparency.js
-java/awt/Window.js
-java/beans/ChangeListenerMap.js
-java/beans/PropertyChangeEvent.js
-java/beans/PropertyChangeListener.js
-java/beans/PropertyChangeSupport.js
-java/lang/AbstractStringBuilder.js
-java/lang/Class.js
-java/lang/Enum.js
-java/lang/Iterable.js
-java/lang/reflect/Constructor.js
-java/lang/reflect/Method.js
-java/lang/StringBuffer.js
-java/lang/StringBuilder.js
-java/lang/Thread.js
-java/lang/ThreadGroup.js
-java/math/RoundingMode.js
-java/net/URL.js
-java/net/URLStreamHandlerFactory.js
-java/net/HttpURLConnection.js
-java/net/URLStreamHandler.js
-javax/net/ssl/HttpsUrlConnection.js
-java/text/CharacterIterator.js
-java/text/DecimalFormat.js
-java/text/DecimalFormatSymbols.js
-java/text/DigitList.js
-java/text/FieldPosition.js
-java/text/Format.js
-java/text/NumberFormat.js
-java/util/AbstractCollection.js
-java/util/AbstractList.js
-java/util/AbstractMap.js
-java/util/AbstractSequentialList.js
-java/util/AbstractSet.js
-java/util/ArrayList.js
-java/util/Arrays.js
-java/util/Collection.js
-java/util/Collections.js
-java/util/Comparator.js
-java/util/Deque.js
-java/util/Dictionary.js
-java/util/Enumeration.js
-java/util/EventListener.js
-java/util/EventObject.js
-java/util/HashMap.js
-java/util/HashSet.js
-java/util/Hashtable.js
-java/util/IdentityHashMap.js
-java/util/Iterator.js
-java/util/LinkedHashMap.js
-java/util/LinkedList.js
-java/util/List.js
-java/util/ListResourceBundle.js
-java/util/Locale.js
-java/util/Map.js
-java/util/Objects.js
-java/util/Queue.js
-java/util/Random.js
-java/util/RandomAccess.js
-java/util/ResourceBundle.js
-java/util/Set.js
-java/util/TimSort.js
-java/util/Vector.js
-javajs/api/JSFunction.js
-javajs/util/AjaxURLConnection.js
-javajs/util/AjaxURLStreamHandlerFactory.js
-javajs/util/AU.js
-javajs/util/JSThread.js
-javajs/util/Lst.js
-javajs/util/PT.js
-javajs/util/Rdr.js
-javajs/util/SB.js
-javax/swing/AbstractAction.js
-javax/swing/AbstractButton.js
-javax/swing/AbstractListModel.js
-javax/swing/Action.js
-javax/swing/ActionMap.js
-javax/swing/AncestorNotifier.js
-javax/swing/ArrayTable.js
-javax/swing/border/AbstractBorder.js
-javax/swing/border/BevelBorder.js
-javax/swing/border/Border.js
-javax/swing/border/CompoundBorder.js
-javax/swing/border/EmptyBorder.js
-javax/swing/border/EtchedBorder.js
-javax/swing/border/LineBorder.js
-javax/swing/border/TitledBorder.js
-javax/swing/BorderFactory.js
-javax/swing/BoundedRangeModel.js
-javax/swing/BoxLayout.js
-javax/swing/ButtonGroup.js
-javax/swing/ButtonModel.js
-javax/swing/ClientPropertyKey.js
-javax/swing/ComboBoxModel.js
-javax/swing/DefaultBoundedRangeModel.js
-javax/swing/DefaultButtonModel.js
-javax/swing/DefaultComboBoxModel.js
-javax/swing/DefaultSingleSelectionModel.js
-javax/swing/DropMode.js
-javax/swing/event/AncestorEvent.js
-javax/swing/event/AncestorListener.js
-javax/swing/event/CaretEvent.js
-javax/swing/event/CaretListener.js
-javax/swing/event/ChangeEvent.js
-javax/swing/event/ChangeListener.js
-javax/swing/event/DocumentEvent.js
-javax/swing/event/DocumentListener.js
-javax/swing/event/EventListenerList.js
-javax/swing/event/ListDataEvent.js
-javax/swing/event/ListDataListener.js
-javax/swing/event/UndoableEditEvent.js
-javax/swing/event/UndoableEditListener.js
-javax/swing/FocusManager.js
-javax/swing/InternalFrameFocusTraversalPolicy.js
-javax/swing/LayoutComparator.js
-javax/swing/LayoutFocusTraversalPolicy.js
-javax/swing/SortingFocusTraversalPolicy.js
-javax/swing/SwingContainerOrderFocusTraversalPolicy.js
-javax/swing/SwingDefaultFocusTraversalPolicy.js
-javax/swing/Icon.js
-javax/swing/ImageIcon.js
-javax/swing/InputMap.js
-javax/swing/JApplet.js
-javax/swing/JButton.js
-javax/swing/JCheckBox.js
-javax/swing/JCheckBoxMenuItem.js
-javax/swing/JComboBox.js
-javax/swing/JComponent.js
-javax/swing/JFrame.js
-javax/swing/JLabel.js
-javax/swing/JLayeredPane.js
-javax/swing/JMenu.js
-javax/swing/JMenuBar.js
-javax/swing/JMenuItem.js
-javax/swing/JPanel.js
-javax/swing/JPopupMenu.js
-javax/swing/JRadioButtonMenuItem.js
-javax/swing/JRootPane.js
-javax/swing/JScrollBar.js
-javax/swing/JScrollPane.js
-javax/swing/JSeparator.js
-javax/swing/JTextArea.js
-javax/swing/JTextField.js
-javax/swing/JToggleButton.js
-javax/swing/JViewport.js
-javax/swing/KeyboardManager.js
-javax/swing/KeyStroke.js
-javax/swing/ListModel.js
-javax/swing/LookAndFeel.js
-javax/swing/MenuElement.js
-javax/swing/MutableComboBoxModel.js
-javax/swing/plaf/ActionMapUIResource.js
-javax/swing/plaf/basic/BasicBorders.js
-javax/swing/plaf/BorderUIResource.js
-javax/swing/plaf/ColorUIResource.js
-javax/swing/plaf/ComponentUI.js
-javax/swing/plaf/DimensionUIResource.js
-javax/swing/plaf/FontUIResource.js
-javax/swing/plaf/InputMapUIResource.js
-javax/swing/plaf/InsetsUIResource.js
-javax/swing/plaf/UIResource.js
-javax/swing/RepaintManager.js
-javax/swing/RootPaneContainer.js
-javax/swing/Scrollable.js
-javax/swing/ScrollPaneConstants.js
-javax/swing/ScrollPaneLayout.js
-javax/swing/SingleSelectionModel.js
-javax/swing/SizeRequirements.js
-javax/swing/SwingConstants.js
-javax/swing/SwingPaintEventDispatcher.js
-javax/swing/SwingUtilities.js
-javax/swing/text/AbstractDocument.js
-javax/swing/text/AttributeSet.js
-javax/swing/text/Caret.js
-javax/swing/text/DefaultCaret.js
-javax/swing/text/DefaultEditorKit.js
-javax/swing/text/Document.js
-javax/swing/text/EditorKit.js
-javax/swing/text/Element.js
-javax/swing/text/GapContent.js
-javax/swing/text/GapVector.js
-javax/swing/text/JTextComponent.js
-javax/swing/text/MutableAttributeSet.js
-javax/swing/text/PlainDocument.js
-javax/swing/text/PlainView.js
-javax/swing/text/Position.js
-javax/swing/text/Segment.js
-javax/swing/text/SegmentCache.js
-javax/swing/text/SimpleAttributeSet.js
-javax/swing/text/Style.js
-javax/swing/text/StyleConstants.js
-javax/swing/text/StyleContext.js
-javax/swing/text/TabExpander.js
-javax/swing/text/TextAction.js
-javax/swing/text/Utilities.js
-javax/swing/text/View.js
-javax/swing/tree/TreeNode.js
-javax/swing/UIDefaults.js
-javax/swing/UIManager.js
-javax/swing/undo/AbstractUndoableEdit.js
-javax/swing/undo/CompoundEdit.js
-javax/swing/undo/UndoableEdit.js
-javax/swing/ViewportLayout.js
-javax/swing/WindowConstants.js
-sun/awt/AppContext.js
-sun/awt/AWTAutoShutdown.js
-sun/awt/CausedFocusEvent.js
-sun/awt/ComponentFactory.js
-sun/awt/KeyboardFocusManagerPeerProvider.js
-sun/awt/MostRecentKeyValue.js
-sun/awt/MostRecentThreadAppContext.js
-sun/awt/PaintEventDispatcher.js
-sun/awt/PostEventQueue.js
-sun/awt/RequestFocusController.js
-sun/awt/SunToolkit.js
-sun/awt/WindowClosingListener.js
-sun/awt/WindowClosingSupport.js
-sun/awt/image/DataStealer.js
-sun/awt/image/IntegerComponentRaster.js
-sun/awt/image/IntegerInterleavedRaster.js
-sun/awt/image/SunWritableRaster.js
-sun/font/FontDesignMetrics.js
-sun/swing/DefaultLookup.js
-sun/swing/SwingLazyValue.js
-sun/text/resources/FormatData.js
-sun/text/resources/en/FormatData_en.js
-sun/util/resources/LocaleData.js
-sun/util/locale/BaseLocale.js
-sun/util/locale/LocaleUtils.js
-sun/util/locale/provider/LocaleProviderAdapter.js
-sun/util/locale/provider/LocaleDataMetaInfo.js
-swingjs/a2s/A2SContainer.js
-swingjs/a2s/A2SEvent.js
-swingjs/a2s/A2SListener.js
-swingjs/a2s/Applet.js
-swingjs/a2s/Button.js
-swingjs/a2s/Label.js
-swingjs/a2s/Panel.js
-swingjs/a2s/Scrollbar.js
-swingjs/a2s/ScrollPane.js
-swingjs/a2s/TextArea.js
-swingjs/a2s/TextField.js
-swingjs/api/Interface.js
-swingjs/api/js/DOMNode.js
-swingjs/api/js/HTML5CanvasContext2D.js
-swingjs/api/js/JSInterface.js
-swingjs/jquery/JQueryUI.js
-swingjs/JSApp.js
-swingjs/JSAppletThread.js
-swingjs/JSAppletViewer.js
-swingjs/JSFocusPeer.js
-swingjs/JSFontMetrics.js
-swingjs/JSFrameViewer.js
-swingjs/JSGraphics2D.js
-swingjs/JSGraphicsConfiguration.js
-swingjs/JSGraphicsEnvironment.js
-swingjs/JSImage.js
-swingjs/JSImagekit.js
-swingjs/JSMouse.js
-swingjs/JSNullComponentPeer.js
-swingjs/JSScreenDevice.js
-swingjs/JSThreadGroup.js
-swingjs/JSToolkit.js
-swingjs/JSUtil.js
-swingjs/plaf/ButtonListener.js
-swingjs/plaf/DefaultMenuLayout.js
-swingjs/plaf/HTML5LookAndFeel.js
-swingjs/plaf/JSAppletUI.js
-swingjs/plaf/JSButtonUI.js
-swingjs/plaf/JSCheckBoxMenuItemUI.js
-swingjs/plaf/JSCheckBoxUI.js
-swingjs/plaf/JSComboBoxUI.js
-swingjs/plaf/JSComponentUI.js
-swingjs/plaf/JSEventHandler.js
-swingjs/plaf/JSFrameUI.js
-swingjs/plaf/JSGraphicsUtils.js
-swingjs/plaf/JSLabelUI.js
-swingjs/plaf/JSLayeredPaneUI.js
-swingjs/plaf/JSLightweightUI.js
-swingjs/plaf/JSMenuBarUI.js
-swingjs/plaf/JSMenuItemUI.js
-swingjs/plaf/JSMenuUI.js
-swingjs/plaf/JSPanelUI.js
-swingjs/plaf/JSPopupMenuSeparatorUI.js
-swingjs/plaf/JSPopupMenuUI.js
-swingjs/plaf/JSRadioButtonMenuItemUI.js
-swingjs/plaf/JSRadioButtonUI.js
-swingjs/plaf/JSRootPaneUI.js
-swingjs/plaf/JSScrollBarUI.js
-swingjs/plaf/JSScrollPaneUI.js
-swingjs/plaf/JSSeparatorUI.js
-swingjs/plaf/JSSliderUI.js
-swingjs/plaf/JSTextAreaUI.js
-swingjs/plaf/JSTextFieldUI.js
-swingjs/plaf/JSTextUI.js
-swingjs/plaf/JSTextViewUI.js
-swingjs/plaf/JSViewportUI.js
-swingjs/plaf/JSWindowUI.js
-swingjs/plaf/LazyActionMap.js
-swingjs/plaf/Resizer.js
-swingjs/plaf/TextListener.js
-
-
+++ /dev/null
-Notes
-=====
-
----IMPORTANT CHARACTER SET NOTE---
-
-It is critical that all development work in Java2Script
-be done in UTF-8. This means:
-
-- making sure your Eclipse project is set up for UTF-8 (not the Eclipse default?)
-- making sure your server can serve up UTF-8 by default for any browser-loaded files
-- making sure you don't edit a Java2Script class file or one of the site .js files
- using a non-UTF-8 editor. It may replace non-Latin characters with "?" or garbage.
-- making sure that your web pages are delivered with proper headings indicating HTML5 and UTF-8
-
-<!DOCTYPE html>
-<html>
-<head>
-<meta charset="utf-8">
-
-Note that the DOCTYPE tag is critical for some browsers to switch into HTML5 mode. (MSIE?)
-
-
-
-
-In particular, the Mandarin character 秘 (mi; "secret") is used extensively throughout
-the SwingJS class files to distinguish j2s-specific fields and methods that must not
-ever be shadowed or overridden by subclasses. For example, we see in java.lang.Thread.java:
-
- public static JSThread 秘thisThread;
-
-----------------------------------
-
-
-updated 12/6/2020 -- note about restrictions on long, including BitSet and Scanner
-updated 3/21/2020 -- adds note about HashMap, Hashtable, and HashSet iterator ordering
-updated 3/20/2020 -- adds note about interning, new String("xxx"), and "xxx"
-updated 2/26/2020 -- adds Graphics.setClip issue
-updated 12/22/19 -- additional issues
-updated 11/03/19 -- adds information about File.exists() and points to src/javajs/async
-updated 10/26/19 -- adds information about File.createTempFile()
-updated 8/16/19 -- minor typos and added summary paragraph
-updated 7/19/19 -- clarification that AWT and Swing classes are supported directly
-updated 5/13/19 -- Mandarin U+79D8 reserved character; Missing Math methods; int and long
-updated 5/10/19 -- adds a section on static issues in multi-(duplicate)-applet pages
-updated 1/4/19 -- nio
-updated 9/15/18 -- adds integer 1/0 == Infinity
-updated 7/24/18 -- most classes replaced with https://github.com/frohoff/jdk8u-jdk
-updated 6/5/17 -- reserved package name "window"
-updated 3/11/17 -- myClass.getField
-updated 3/7/17 -- overloading of JSplitPane.setDividerLocation
-updated 3/2/17 -- more indication of classes not implemented (KeyListener)
-
-=============================================================================
-SwingJS and OpenJDK 8+
-=============================================================================
-
-SwingJS implements a wide range of the Java language in JavaScript. The base
-version for this implementation is OpenJDK8. some classes are implemented using
-older source code, and there are some missing methods. For the most part, this is
-no real problem. You can add or modify any java class just be adding it as source
-in your project. Or (preferably) you can contact me, and I can get it into the
-distribution. Or (even more preferably) you can do that via a patch submission.
-
-=================
-DESIGN PHILOSOPHY
-=================
-
-The java2script/SwingJS design goal is to recreate a recognizable, easily debuggable
-equivalent in JavaScript for as much of Java as practical. This means, for example,
-that one can call in JavaScript
-
- new java.util.Hashtable()
-
-and for all practical purposes it will appear that Java is running.
-
-
-Method and Field Disambiguation
--------------------------------
-
-SwingJS has no problem with the overloading of methods, for example:
-
- public void print(int b);
- public void print(float b);
-
-JavaScript does not allow overloading of methods, and the common practice in
-Java of naming a field the same as a method -- isAllowed and isAllowed() -- is
-not possible in JavaScript. As a result, SwingJS implements "fully-qualified"
-method names using "$" parameter type separation. Thus, these methods in SwingJS
-will be referred to as print$I and print$F. The rules for this encoding are
-relatively simple:
-
-1. The seven primitive types in Java are encoded $I (int), $L (long), $F (float),
-$D (double), $B (byte) $Z (boolean), and $H (short).
-
-2. String and Object are encoded as $S and $O, respectively.
-
-3. "java_lang_" is dropped for all other classes in the java.lang package (as in Java).
- For example: $StringBuffer, not $java_lang_StringBuffer
-
-4. All other classes are encoded as
-
- "$" + Class.getName().replace(".","_")
-
-For example, in Java we see:
-
- public void equals(Object o) {...}
-
-Whereas in SwingJS we have:
-
- Clazz.newMeth(C$, 'equals$O', function (o) {...}
-
-And
-
- this.getContentPane().add(bar, "North");
-
-becomes
-
- this.getContentPane$().add$java_awt_Component$O(bar, "North");
-
-5. Arrays are indicated with appended "A" for each level. So
-
- setDataVector(Object[][] dataVector, Object[] columnIdentifiers)
-
-becomes
-
- setDataVector$OAA$OA(dataVector, columnIdentifiers)
-
-(It is recognized that this design does introduce a bit of ambiguity, in that
- in principal there could be user class named XA and X in the same package,
- and methods a(X[]) and a(XA) in the same class that cannot be distinguished.
- The benefit of this simple system, however, triumphed over the unlikelyhood
- of that scenario.) The transpiler could be set to flag this possibility.
-
-6. Constructors are prepended with "c$". So
-
- public JLabel(String text) {...}
-
-becomes:
-
- Clazz.newMeth(C$, 'c$$S', function (text) {...});
-
-Field disambiguation involves prepending. In Java, a class and its subclass
-can both have the same field name, such as
-
- boolean visible;
-
-When this happens, it is called "shadowing", and though not recommended, Java allows
-it. The Java2Script transpiler will prepend such shadowing fields with "$" so that the
-subclass instance has both "visible" (for use in its methods inherited from its
-superclass) and "$visible" (for its own methods). Thus, we might see in Java:
-
- this.visible = super.visible;
-
-while in SwingJS we will see:
-
- this.$visible=this.visible;
-
-since JavaScript does not have the "super" keyword.
-
-
-
-Parameterless methods such as toString() are appended with "$" to become toString$().
-The one exception to this rule is private methods, which are saved in (truly) private
-array in the class (and are not accessible by reflection). Private parameterless
-methods retain their simple Java name, since they cannot conflict with field names.
-
-This renaming of methods has a few consequences, which are discussed more fully below.
-See particularly the section on "qualified field and method names", where it is described
-how you can use packages or classes or interfaces with ".api.js" in them to represent JavaScript
-objects for which all method names are to be left unqualified. Note that it is not
-possible to cherry-pick methods to be unqualified; only full packages, classes or
-interfaces can hold this status.
-
-The swingjs.api.js package in particular contains a number of useful interfaces that
-you can import into your project for JavaScript-specific capabilities.
-
-
-Applet vs. Application
-----------------------
-
-One of the very cool aspects of SwingJS is that it doesn't particularly matter if a browser-based
-Java app is an "applet" or an "application". We don't need JNLP (Java Network Launch Protocol)
-because now we can just start up any Java application in a browser just as easily as any applet.
-The associative array that passes information to the SwingJS applet (information that formerly
-might have been part of the APPLET tag, such as width, height, and codebase, always referred to
-in our writing as "the Info array") allows the option to specify the JApplet/Applet "code"
-class or the application "main" class. Either one will run just fine.
-
-
-Performance
------------
-
-Obviously, there are limitations. One is performance, but we have seen reproducible
-performance at 1/6 - 1/3 the speed of Java. Achieving this performance may require
-some refactoring of the Java to make it more efficient in both Java and JavaScript.
-"for" loops need to be more carefully crafted; use of "new" and "instanceof" need to be
-minimized in critical areas. Note that method overloading -- that is, the same method name
-with different parameters, such as read(int) and read(byte) -- is no longer any problem.
-
-
-Threads
--------
-
-Although there is only a single thread in JavaScript, meaning Thread.wait(), Thread.sleep(int) and
-Thread.notify() cannot be reproduced, we have found that this is not a serious limitation.
-For example, javax.swing.Timer() works perfectly in JavaScript. All it means is that threads
-that use sleep(int) or notify() must be refactored to allow Timer-like callbacks. That is,
-they must allow full exit and re-entry of Thread.run(), not the typical while/sleep motif.
-
-The key is to create a state-based run() that can be exited and re-entered in JavaScript.
-
-
-Static fields
--------------
-
-Final static primitive "constant" fields (String, boolean, int, etc.) such as
-
-static final int TEST = 3;
-static final String MY_STRING = "my " + "string";
-
-are converted to their primitive form automatically by the Eclipse Java compiler
-and do not appear in the JavaScript by their names.
-
-Other static fields are properties of their class and can be used as expected.
-
-Note, however, that SwingJS runs all "Java" code on a page in a common "jvm"
-(like older versions of Java). So, like the older Java schema, the JavaScript
-equivalents of both applets and applications will share all of their static
-fields and methods. This includes java.lang.System.
-
-Basically, SwingJS implementations of Java run in a browser page-based sandbox
-instead of an applet-specific one.
-
-In general, this is no problem. But if we are to implement pages with
-multiple applets present, we must be sure to only have static references
-that are "final" or specifically meant to be shared in a JavaScript
-environment only (since they will not be shared in Java).
-
-A simple solution, if static non-constant references are needed, is to attach the
-field to Thread.currentThread.threadGroup(), which is an applet-specific reference.
-Be sure, if you do this, that you use explicit setters and getters:
-
-For example,
-
-private static String myvar;
-
-...
-
-public void setMyVar(String x) {
- ThreadGroup g = Thread.currentThread().threadGroup();
- /**
- * @j2sNative g._myvar = x;
- *
- */
- {
- myvar = x;
- }
-}
-
-public String getMyVar() {
- ThreadGroup g = Thread.currentThread().threadGroup();
- /**
- * @j2sNative return g._myvar || null;
- *
- */
- {
- return myvar;
- }
-}
-
- in Java will get and set x the same in JavaScript and in Java.
-
-
-A convenient way to do this in general is to supply a singleton class with
-explicitly private-only constructors and then refer to it in Java and in JavaScript
-instead of using static field, referring to myclass.getIntance().xxx instead of
-myclass.xxx in Java (and JavaScript).
-
-This was done extensively in the Jalview project. See jalview.bin.Instance.
-
-
-Helper Packages -- swingjs/ and javajs/
----------------------------------------
-
-The SwingJS library is the swingjs/ package. There are interfaces that may be of assistance
-in swingjs/api, but other than that, it is not recommended that developers access classes in
-this package. The "public" nature of their methods is really an internal necessity.
-
-In addition to swingjs/, though, there are several useful classes in the javajs/ package
-that could be very useful. This package is a stand-alone package that can be
-cloned in any Java project that also would be great to have in any JavaScript project
--- SwingJS-related or not. Functionality ranges from reading and writing various file
-formats, including PDF, BMP, PNG, GIF, JPG, JSON, ZIP, and CompoundDocument formats.
-
-A variety of highly efficient three- and four-dimensional point, vector, matrix, and
-quaternion classes are included, as they were developed for JSmol and inherited from that
-project.
-
-Of particular interest should be javajs/async/, which includes
-
-javajs.async.Async
-javajs.async.AsyncColorChooser
-javajs.async.AsyncDialog
-javajs.async.AsyncFileChooser
-
-See javajs.async.Async JavaDoc comments for a full description of
-these useful classes.
-
-
-Modal Dialogs
--------------
-
-Although true modal dialogs are not possible with only one thread, a functional equivalent --
-asynchronous modal dialogs -- is relatively easy to set up. All the JOptionPane dialogs will
-return PropertyChangeEvents to signal that they have been disposed of and containing the results.
-See below and classes in the javajs.async package.
-
-
-Native calls
-------------
-
-Native calls in Java are calls to operating system methods that are not in Java. JavaScript
-has no access to these, of course, and they must all be replaced by JavaScript equivalents.
-Fortunately, they are not common, and those that are present in Java (for example, in calculating
-checksums in ZIP file creation) are at a low enough level that most developers do not utilize them
-or do not even have access to them. All native calls in Java classes have been replaced by
-Java equivalents.
-
-
-Swing GUI Peers and UIClasses
------------------------------
-
-One of the biggest adaptations introduced in SwingJS is in the area of the graphical
-user interface. The issue here is complex but workable. In Java there are two background
-concepts -- the Component "peer" (one per "heavy-weight" component, such as a Frame) and the
-component "uiClass" (one per component, such as JButton or JTextField).
-
-Peers are native objects of the operating system. These are the virtual buttons and text areas
-that the user is interacting with at a very base level. Their events are being passed on to
-Java or the browser by the operating system. UI classes provide a consistent "look and feel"
-for these native objects, rendering them onto the native window canvas and handling all
-user-generated events. They paint the borders, the backgrounds, the highlights, of every
-control you see in Java. There is one-to-one correspondence of Swing classes and UI classes.
-Setting the Look and Feel for a project amounts to selecting the directory from which to draw
-these UI classes. The UI classes can be found in the javax.swing.plaf ("platform look and feel")
-package.
-
-Early on in the development of SwingJS, we decided not to fully reproduce the painfully detailed
-bit-by-bit painting of controls as is done in Java. Instead, we felt it was wiser to utilize the standard
-HTML5 UI capabilities as much as possible, using DIV, and INPUT especially, with extensive use
-of CSS and sometimes jQuery (menus, and sliders, for example). Thus, we have created a new
-set of UIs -- the "HTML5 Look and Feel". These classes can be found in swingjs.plaf. Besides being
-more adaptable, this approach allows far more versatility to SwingJS developers, allowing them
-to modify the GUI to suit their needs if desired.
-
-In SwingJS, since we have no access to native peers except through the browser DOM,
-it seemed logical to merge the peer and UI idea. So instead of having one peer per heavy-weight control and
-one UI class instance for each control type, we just have one UI class instance per control, and
-that UI class instance is what is being referred to when a "peer" is notified.
-
-In some ways this is a throw back to when all of Swing's components were subclasses of
-specific AWT components such as Button and List. These "heavy-weight components" all had their
-own individual native peers and thus automatically took on the look and feel provided by the OS.
-Later Swing versions implemented full look and feel for all peers, leaving only JDialog, JFrame,
-and a few other classes to have native peers. But in SwingJS we have again a 1:1 map of component
-and UI class/peer instance.
-
-The origin of most issues (read "bugs") in relation to the GUI will probably be found in the
-swingjs.plaf JSxxxxUI.java code.
-
-
-Swing-only Components -- no longer an issue
--------------------------------------------
-
-Swing was introduced into Java well after the Java Abstract Window Toolkit (AWT) was well
-established. As such, its designers chose to allow AWT controls such as Button and List to be used
-alongside their Swing counterparts JButton and JList. Reading the code, it is clear that this
-design choice posed a huge headache for Swing class developers.
-
-For SwingJS, we decided from the beginning NOT to allow this mixed-mode programming and
-instead to require that all components be Swing components.
-
-However, this is no longer an issue. All AWT components in SwingJS are now subclasses of
-javax.swing.JComponent. So far, we have found no problem with this.
-
-
-The a2s Adapter Package
------------------------
-
-Originally, we thought that we would restrict ourselves to JApplets only. That is, only
-Swing-based applets. But as we worked, we discovered that there are a lot of great
-applets out there that are pre-Swing pure-AWT java.applet.Applet applets. Our problem was
-that we also wanted it to be possible to quickly adapt these applets to JavaScript as well.
-
-The solution turned out to be simple: Write a package (a2s) that recreates the interface for
-non-Swing components as subclasses of Swing components. Thus, a2s.Button subclasses javax.swing.JButton
-but also accepts all of the methods of java.awt.Button. This works amazingly well, with a few
-special adaptations to the core javax.swing to be "AWT-aware." All AWT components now subclass
-a2s components, which in turn subclass JComponents. So no changes in code are necessary. We have
-successfully transpiled over 500 applets using this strategy. (Kind of surprising, actually, that
-the original Java developers did not see that option. But we have a hindsight advantage here.)
-
-
-Working with Files
-==================
-
-Simple String file names are not optimal for passing information about
-read files within SwingJS applications.
-
-All work with files should either use Path or File objects exclusively.
-These objects, after a file is read or checked for existence, will already
-contain the file byte[] data. Doing something like this:
-
-File f = File("./test.dat");
-boolean isOK = f.exists();
-
-will load f with its byte[] data, if the file exists.
-
-But if after that, we use:
-
-File f2 = new File(f.getAbsolutePath());
-
-f2 will not contain that data. Such copying should be done as:
-
-File f2 = new File(f);
-
-in which case, the byte[] data will be transferred.
-
-
-SwingJS uses the following criteria to determine if File.exists() returns true:
-
-(1) if this File object has been used directly to read data, or
-(2) if reading data using this File object is successful.
-
-Note that you cannot check to see if a file exists before input or if it
-was actually written or if it already exists prior to writing in SwingJS.
-
-Thus, you should check each use of file.exists() carefully, and if necessary, provide a J2sNative
-block that gives an appropriate "OK" message, for example:
-
-(/** @j2sNative 1 ? false : */ outputfile.exits())
-
-or
-
-(/** @j2sNative 1 ? true : */ inputfile.exits())
-
-Temporary files can be created in SwingJS. SwingJS will maintain a pseudo-filesystem for files
-created with File.createTempFile(). This is useful in that closure of writing to a temporary file
-does not generate a pseudo-download to the user's machine.
-
-
-UNIMPLEMENTED CLASSES BY DESIGN
-===============================
-
-The SwingJS implementation of the following classes are present
-in a way that gracefully bypasses their functionality:
-
-accessibility
-security
-serialization
-
-
-
-TODO LIST FOR UNIMPLEMENTED CLASSES
-===================================
-
-JEditorPane (minimal implementation) - DONE 12/2018; some issues still
-JSplitPane - DONE 8/2018
-JTabbedPane - DONE 10/2018
-JTree - done 12/2019
-
-
-MINOR ISSUES--required some rewriting/refactoring by Bob and Udo
-================================================================
-
-Thread.currentThread() == dispatchThread
-
-
-MINOR ISSUES--requiring some rewriting/refactoring outside of SwingJS
-=====================================================================
-
-See below for a full discussion.
-
-Restrictions on long
-Restriction on BitSet and Scanner
-HashMap, Hashtable, and HashSet iterator ordering
-interning, new String("xxx") vs "xxx"
-Names with "$" and "_"
-positive integers do not add to give negative numbers
-ArrayIndexOutOfBounds
-java.awt.Color
-native methods
-javax.swing.JFileDialog
-key focus
-LookAndFeel and UI Classes
-System.exit(0) does not stop all processes
-list cell renderers must be JComponents
-myClass.getField not implemented
-"window" and other reserved JavaScript names
-reserved field and method names
-qualified field and method names
-missing Math methods
-Component.getGraphics(), Graphics.dispose()
-Graphics.setClip()
-
-MAJOR ISSUES--for Bob and Udo within SwingJS
-============================================
-
-fonts
-OS-dependent classes
-AWT component peers
-some aspects of reflection
-
-MAJOR ISSUES--to be resolved by implementers
-============================================
-
-fonts
-threads
-modal dialogs
-image loading
-BigDecimal not fully implemented
-no format internationalization
-no winding rules
-text-related field implementation
-Formatter/Regex limitations
-integer 1/0 == Infinity
-
-========================================================================
-
-DISCUSS
-=======
-
-Table row/col sorter needs checking after removal of java.text.Collator references
-
-I had to move all of SunHints class to RenderingHints, or the
-two classes could not be loaded. Shouldn't be a problem, I think. The sun classes are
-not accessible to developers in Java anyway, since they are generally package private.
-
-==========================================================================
-
-//////////////////////////////////////////////////////////////////////////////
-
-UNIMPLEMENTED CLASSES
-=====================
-
-accessibility
--------------
-
-All Accessibility handling has been commented out to save the download footprint.
-This removes the need for sun.misc.SharedSecrets as well.
-Nothing says we could not implement accessibility. We just didn't.
-
-
-security
---------
-
-All JavaScript security is handled by the browser natively.
-Thus, Java security checking is no longer necessary, and
-java.security.AccessController has been simplified to work without
-native security checking.
-
-Note that private methods in a class are REALLY private.
-
-
-serialization
--------------
-
-All serialization has been removed. It was never very useful for Swing anyway,
-because one needs exactly the same Java version to save and restore serialized objects.
-
-
-keyboard accelerators and mnemonics
------------------------------------
-
-This work was completed in the spring of 2019. Note that in a browser, some
-key strokes, particularly CTRL-keys, are not available. Bummer.
-
-
-MINOR ISSUES--required some rewriting/refactoring by Bob and Udo
-================================================================
-
-
-Thread.currentThread() == dispatchThread
-----------------------------------------
-
-changed to JSToolkit.isDispatchThread()
-
-
-MINOR ISSUES--requiring some rewriting/refactoring outside of SwingJS
-=====================================================================
-
-restrictions on long
---------------------
-
-Java's 64-bit long type is not supported in JavaScript. There is no Int64Array in JavaScript,
-and 0x20000000000000 + 1 evaluates to 0x20000000000000, not 0x20000000000001.
-(Likewise, -0x20000000000000 - 1 is left unchanged.)
-
-The largest "integer" value in JavaScript is 9007199254740991 (9.007199254740991E13, or 0x1FFFFFFFFFFFFFF).
-Effectively, you get to use only 53 bits of the long, not 64. Trying to set a long larger than
-0x1FFFFFFFFFFFFFF or smaller than -0x1FFFFFFFFFFFFFF will result in a NumberFormatException.
-
-The transpiler handles conversion to long the same as Java for all cases other than from double.
-
-For small double values, there is no problem, and, in fact, this is a known trick used to round
-doubles and floats toward zero:
-
-double d;
-d = (long) 3.8;
-assert(d == 3);
-d = (long) -3.8;
-assert(d == -3);
-
-SwingJS will evaluate (long) d as 0 for d > 9007199254740991
-or d < -9007199254740991, same as Java returns for Double.NaN.
-So, in Java we have:
-
- assert(((long) Double.NaN) == 0);
- assert(((int) Double.NaN) == 0);
- assert(((long) Float.NaN) == 0);
- assert(((int) Float.NaN) == 0);
-
-and also, in JavaScript only, we also have:
-
- double d = 0x2000000000000L;
- assert(((long) d) == 0);
-
-
-restrictions on BitSet and Scanner
-----------------------------------
-
-Because of the issue of long being only 53 bits, any time a method returns a long value, considerations must
-be made as to whether this will work in JavaScript. In particular, BitSet and Scanner have issues.
-
-In SwingJS, java.util.BitSet has been implemented as a 32-bit integer-based bitset. This was no problem in
-Java 6, but starting with Java 7, a method was added to BitSet that allows for the extraction of the
-underlying long[] word data. This is not work in JavaScript. Instead, SwingJS java.util.Bitset.toLongArray() will deliver
-32-bit int[] data.
-
-SwingJS Scanner has hasNextLong() and nextLong(), and although it will scan through long numbers,
-Scanner will choke on long numbers greater than the JavaScript 53-bit limit. hasNextLong() will
-return false, and nextLong() will throw an InputMismatchException triggered by the NumberFormatException
-thrown by Long.parseLong().
-
-
-HashMap, Hashtable, and HashSet iterator ordering
--------------------------------------------------
-
-In Java, iterators for HashMap, Hashtable, and HashSet do not guarantee any particular order.
-From the HashMap documentation for Java 8:
-
- This class makes no guarantees as to the order of the map; in particular, it does not
- guarantee that the order will remain constant over time.
-
-Likewise, for HashSet (because it is simply a convenience method for HashMap<Object,PRESENT>:
-
- [HashSet] makes no guarantees as to the iteration order of the set.
-
-JavaScript's Map object is different. It is basically a LinkedHashMap, so it guarantees iteration
-in order of object addition.
-
-Starting with java2script 3.2.9.v1, these classes use the JavaScript Map object rather than hash codes
-whenever all keys are strictly of JavaScript typeof "string". If any key is introduced that is not a string, the
-implementation falls back to using hash codes, the same as Java.
-
-Note strings created using new String("xxxx") are NOT typeof "string"; they are typeof "object".
-
-The result is significantly faster performance (3-12 x faster) than originally, and up to 3 x faster
-performance in JavaScript than in Java itself. Right. Faster than Java.
-
-The JavaScript Map implementation is implemented UNLESS the constructor used is the one that
-specifies both initial capacity and load factor in their constructor. Thus,
-
-new Hashtable()
-new HashMap()
-new HashMap(16)
-new HashSet()
-
-all use the JavaScript Map. But
-
-new Hashtable(11, 0.75f)
-new HashMap(16, 0.75f)
-new HashSet(16, 0.75f)
-
-do not.
-
-This design allows for opting out of the JavaScript Map use in order to retain the exact behavior of
-iterators in JavaScript as in Java.
-
-
-interning, new String("xxx") vs "xxx"
--------------------------------------
-
-Note that the following are true in JavaScript:
-
-typeof new String("xxxx") == "object"
-typeof "xxxx" == "string"
-var s = "x";typeof ("xxx" + s) == "string"
-
-There is no equivalence to this behavior in Java, where a String is a String is a String.
-
-Be aware that SwingJS does not always create a JavaScript String object using JavaScript's
-new String(...) constructor. It only does this for Java new String("xxxx") or new String(new String()).
-
-In all other cases, new String(...) (in Java) results in a simple "xxxx" string in JavaScript.
-That is, it will be JavaScript typeof "string", not typeof "object".
-
-The reason for this design is that several classes in the Java core use toString()
-methods that return new String(), and those classes that do that would cause a JavaScript error
-if implicitly stringified if new String() returned a JavaScript String object.
-
-This is fine in JavaScript
-
-test1 = function() { return { toString:function(){ return "OK" } } }
-"testing" + new test1()
->> "testingOK"
-
-But for whatever reason in JavaScript:
-
-test2 = function() { return { toString:function(){ return new String("OK") } } }
-"testing" + new test2()
->> Uncaught TypeError: Cannot convert object to primitive value
-
-The lesson here is never to use
-
- return new String("...");
-
-in a Java toString() method. In Java it will be fine; in JavaScript it will also be fine as long as
-that method is never called in JavaScript implicitly in the context of string concatenation.
-
-A note about interning. Consider the following six Java constructions, where we have a == "x";
-
-"xxx"
-"xx" + "x"
-new String("xxx").intern()
-
-new String("xxx")
-"xx" + a.toString()
-"xx" + a
-
-All six of these will return java.lang.String for .getClass().getName().
-However, the first three are String literals, while the last three are String objects.
-Thus:
- "xxx" == "xxx"
- "xxx" == "xx" + "x"
- "xxx" == new String("xxx").intern()
-
-but none of the other three are equivalent to "xxx" or each other:
-
- "xxx" != new String("xxx")
- "xxx" != "xx" + a.toString()
- "xxx" != "xx" + a
- new String("xxx") != new String("xxx")
- "xx" + a != new String("xxx")
-
-etc.
-
-As in Java, in SwingJS, all of the following Java assertions pass as true:
-
- assert("xxx" == "xx" + "x");
- assert("xxx" == ("xx" + a).intern());
- assert("xxx" === new String("xxx").intern());
-
-and both of these do as well:
-
- assert(new String("xxx") != "xxx");
- assert(new String("xxx") != new String("xxx"));
-
-But the following two fail to assert true:
-
- assert("xxx" != "xx" + a);
- assert("xxx" != "xx" + a.toString());
-
-because in JavaScript, both of these right-side expressions evaluate to a simple "interned" string.
-
-In Java, however, these assertions are true because Java implicitly "boxes" String
-concatentaion as a String object, not a literal.
-
-Most of us know not to generally use == with Strings unless they are explicitly interned.
-Where this problem may arise, though, is in IdentityHashMap, which compares objects using
-System.identityHashCode(), which is not the same for different objects or their string literal equivalents.
-
-My recommendation, if you need to use IdentityHashMap with strings is to always use an explicit String.intern()
-for any keys -- unless you really want to keep every string as separate keys even if they are the same sequence,
-in which case, use new String(). This will work in Java and in JavaScript.
-
-Be aware when working with strings that come from SwingJS and are being used by other JavaScript modules
-that those that are String objects will return "object" for the JavaScript typeof operator, not "string".
-
-The easy way to ensure this is no problem is to concatenate strings with "" to force immediate interning:
-
- var x = aJavaObject.getString() + "";
-
-unless you are certain that the string is being returned is a raw JavaScript string.
-
-Names with "$" and "_"
-----------------------
-
-For the most part, this should be no problem.
-
-Note that the use of $ and _ in Java field names has always been discouraged:
-[https://docs.oracle.com/javase/tutorial/java/nutsandbolts/variables.html]
-
- You may find some situations where auto-generated names will contain the dollar sign,
- but your variable names should always avoid using it. A similar convention
- exists for the underscore character; while it's technically legal to begin your
- variable's name with "_", this practice is discouraged.
-
-Some impacts of transpiling method names with full qualification:
-
-1) SwingJS will introduce fields that start with $ or _. These will not conflict
- if the above convention is followed.
-
-2) Fields that have the same Java name as a method are not an issue.
-
-3) Fields that have a Java name with $ that matches a transpiled method name,
- such as toString$, will need to be refactored in Java to not have that name collision.
-
-4) Fields in a subclass that have the same name as private fields in a superclass
- represent a name collision, because the superclass method needs to call its private
- field even if invoked from a subclass. The solution was to modify the subclass field
- name using one or more prepended $.
-
-5) Use of Class.getDeclaredMethods() reflection will return Method objects having the transpiled
- name, not the Java name. This could require some j2sNative adjustment
- to strip the $... parameters from the name if that is needed.
-
-6) Use of Method.getParameterTypes() should work fine, provided class names
- do not contain "_". This is because the transpiler converts "." to "_" when
- creating the fully qualified JavaScript name.
-
-
-positive integers do not add to give negative numbers
------------------------------------------------------
-
-In Java, the following is true:
-
- 2000000000 + 2000000000 == -294967296
-
-But in SwingJS, that will be 4000000000. So, for example, the following
-strategy will fail in SwingJS:
-
- int newLength = lineBuf.length * 2;
- if (newLength < 0) {
- newLength = Integer.MAX_VALUE;
- }
-
-"-1" in JavaScript is not 0xFFFFFFFF.
-
-And one must take care to not compare a negative number with a 32-bit mask. So
-
-(b & 0xFF000000) == 0xFF000000
-
-is true in Java for (int) b = -1, but is false in JavaScript, because 0xFF000000 is 4278190080,
-while (-1 & 0xFF000000) is, strangely enough, -16777216, and, in fact,
-
-(0xFF000000 & 0xFF000000) != 0xFF000000
-
-because -16777216 is not 4278190080.
-
-The fix is that one must compare similar operations:
-
-if ((b & 0xFF000000) == (0xFF000000 & 0xFF000000)) .....
-
-Importantly, the JavaScript Int32Array does behave properly. From
-the Firefox developer console:
-
->> x = new Int32Array(1)
-<- Int32Array(1) [ 0 ]
->> x[0] = 4000000000
-<- 4000000000
->> x[0]
-<- -294967296
-
-Notice that, perhaps unexpectedly, the following two constructs produce
-different results in JavaScript:
-
-x = new Int32Array(1);
-b = x[0] = 4000000000;
-
-(b will be 4000000000)
-
-and
-
-x = new Int32Array(1);
-x[0] = 4000000000;
-b = x[0];
-
-(b will be -294967296)
-
-
-SwingJS leverages array typing to handle all byte and short arithmetic so as
-to ensure that any byte or short operation in JavaScript does give the same
-result in Java. The design decision to not also do this with integer math was
-a trade-off between performance and handling edge cases.
-
-
-ArrayIndexOutOfBounds
----------------------
-
-You cannot implicitly throw an ArrayIndexOutOfBoundsException in JavaScript.
-JavaScript will simply return "undefined", not throw an Exception. So:
-
-boolean notAGoodIdeaIsOutOfBounds(String[] sa, int i) {
- try {
- return (sa[i] == sa[i]);
- } catch (ArrayIndexOutOfBoundsException e) {
- return false;
- }
-}
-
-will work in Java but not in JavaScript. Code should not depend upon this sort
-of trap anyway, if you ask me.
-
-Throwable vs Error vs Exception
--------------------------------
-
-True JavaScript errors are trapped as Throwable, whereas you can still trap
-Error and Exception as well. So if you want to be sure to catch any JavaScript
-error, use try{}catch (Throwable t){}, not try{}catch (Exception e){}.
-
-j
-ava.awt.Color
---------------
-
-ColorSpace: only "support" CS_sRGB.
-
- TODO -- any volunteers??
-
-
-javax.swing.JFileDialog
------------------------
-
-HTML5 cannot expose a file reading directory structure. But you certainly
-can still do file reading and writing. It just works a little differently.
-It's a simple modification:
-
- b = new JButton("FileOpenDialog");
- b.addActionListener(new ActionListener() {
-
- @Override
- public void actionPerformed(ActionEvent e) {
- JFileChooser fc = new JFileChooser();
- Test_Dialog.this.onDialogReturn(fc.showOpenDialog(Test_Dialog.this));
- // Java will wait until the dialog is closed, then enter the onDialogReturn method.
- // JavaScript will exit with NaN immediately, and then call back with its actual value
- // asynchronously.
- }
-
- });
-
- public void onDialogReturn(int value) {
- if (value != Math.floor(value))
- return; // in JavaScript, this will be NaN, indicating the dialog has been opened
- // If we are here, the dialog has closed, in both Java and JavaScript.
- System.out.println("int value is " + value);
- }
-
-
- @Override
- public void propertyChange(PropertyChangeEvent event) {
- Object val = event.getNewValue();
- String name = event.getPropertyName();
- System.out.println(name);
- switch (event.getSource().getClass().getName()) {
- case "javax.swing.JOptionPane":
- switch (name) {
- case "inputValue":
- onDialogReturn(val);
- return;
- case "value":
- if (val instanceof Integer)
- onDialogReturn(((Integer) val).intValue());
- else
- onDialogReturn(val);
- return;
- }
- break;
- case "javax.swing.ColorChooserDialog":
- switch (name) {
- case "SelectedColor":
- onDialogReturn(val);
- return;
- }
- break;
- case "javax.swing.JFileChooser":
- switch (name) {
- case "SelectedFile":
- File file = (File) val;
- byte[] array = (val == null ? null : /** @j2sNative file.秘bytes || */
- null);
- onDialogReturn("fileName is '" + file.getName() + "'\n\n" + new String(array));
- return;
- }
- break;
- }
- System.out.println(
- event.getSource().getClass().getName() + " " + event.getPropertyName() + ": " + event.getNewValue());
- }
-
-
-Developers are encouraged to create a separate class that handles general calls to JFileDialog.
-An example class can be found in the SwingJS distribution as
-
-/sources/net.sf.j2s.java.core/src/javajs/async/AsyncFileChooser.java.
-
-
-javax.swing.JOptionPane dialogs
--------------------------------
-
-For this action to work, the parentComponent must implement
-propertyChangeListener, and any call to JOptionPanel should allow for
-an asynchronous response, meaning that there is no actionable code following the
-call to the dialog opening.
-
-In addition, for compatibility with the Java version, implementation should
-wrap the call to getConfirmDialog or getOptionDialog in a method call to
-handle the Java:
-
-onDialogReturn(JOptionPane.showConfirmDialog(parentFrame,
-messageOrMessagePanel, "title", JOptionPane.OK_CANCEL_OPTION));
-
-Then parentFrame.propertyChange(event) should also call onDialogReturn.
-
-This will then work in both Java and JavaScript.
-
-Note that there is an int and an Object version of onDialogReturn().
-
-
-In JavaScript:
-
-The initial return from JOptionPane.showConfirmDialog and showMessageDialog
-will be (SwingJS) JDialog.ASYNCHRONOUS_INTEGER (NaN), testable as an impossible
-Java int value using ret != -(-ret) if the parent implements PropertyChangeListener, or -1
-(CLOSE_OPTION) if not.
-
-For showOptionDialog (which returns Object) or showInputDialog (which returns
-String), the initial return will be (SwingJS) JDialog.ASYNCHRONOUS_OBJECT, testable as
-((Object) ret) instanceof javax.swing.plaf.UIResource if the parent implements
-PropertyChangeListeneer, or null if not.
-
-The second return will be the desired return.
-
-In Java:
-
-The initial return will be the one and only modal final return.
-
-
-
-For full compatibility, The calling method must not continue beyond this
-call.
-
-All of the standard Java events associated with Components are also
-available.
-
-Certain fall back mechanisms are possible, where onReturn does not exist, but
-only for the following cases:
-
-
-For showMessageDialog, for WARNING_MESSAGE and ERROR_MESSAGE, a simple
-JavaScript alert() is used, returning 0 (OK_OPTION) or -1 (CLOSED_OPTION).
-
-For showInputDialog, if the message is a string, a simple JavaScript prompt()
-with input box is used, returning the entered string or null.
-
-For showConfirmDialog, a simple JavaScript confirm() is used, in which case:
-
-for YES_NO_OPTION: YES_OPTION or NO_OPTION
-
-for YES_NO_CANCEL_OPTION: YES_OPTION or CANCEL_OPTION
-
-for OK_CANCEL_OPTION or any other: OK_OPTION or CANCEL_OPTION
-
-Note that you should implement a response for CLOSED_OPTION for
-showConfirmDialog. For other dialogs, a null return indicates the dialog was
-closed, just as for Java.
-
-Developers are encouraged to create a separate class that handles general calls.
-An example class can be found in the SwingJS distribution as src/javajs/async/AsyncDialog.java.
-Very simple modifications to the Java allows asynchronous operation using AsyncDialog. Here
-is a simple "do you want to close this frame" example, where you can see that what we have
-done is to set the reply into an ActionListener that is defined in the constructor of
-the AsyncDisplay object:
-
-// Original:
-//
-// private void promptQuit() {
-// int sel = JOptionPane.showConfirmDialog(null, PROMPT_EXIT, NAME, JOptionPane.YES_NO_OPTION);
-// switch (sel) {
-// case JOptionPane.YES_OPTION:
-// resultsTab.clean();
-// seqs.dispose();
-// if (fromMain) {
-// System.exit(0);
-// }
-// break;
-// }
-// }
-
- private void promptQuitAsync() {
- new AsyncDialog(new ActionListener() {
-
- @Override
- public void actionPerformed(ActionEvent e) {
- int sel = ((AsyncDialog)e.getSource()).getOption();
- switch (sel) {
- case JOptionPane.YES_OPTION:
- resultsTab.clean();
- seqs.dispose();
- if (fromMain) {
- System.exit(0);
- }
- break;
- }
- }}).showConfirmDialog(null, PROMPT_EXIT, NAME, JOptionPane.YES_NO_OPTION);
- }
-
-Very simple!
-
-
-native methods
---------------
-
-The J2S compiler ignores all static native method declarations.
-Anything of this nature needs to be implemented in JavaScript if it is needed,
-using j2sNative blocks:
-
-/**
- * @j2sNative
- *
- * var putYourJavaScriptCodeHere
- *
- */
-
- Note that if you follow that directly with a {...} block, then
- the javadoc code will run in JavaScript, and the {...} code will run in Java.
-
-
-key Focus
----------
-
-As of June, 2019, the keyboard focus manager is fully implemented.
-The one catch is that JTextPane and JTextArea, which already consume
-VK_TAB in Java, cannot use CTRL-TAB to continue a tabbing cycle around
-the components in a window. Instead, CTRL-TAB is absorbed by the browser.
-
-
-LookAndFeel and UI Classes
---------------------------
-
-SwingJS implements the native browser look and feel as swingjs.plaf.HTML5LookAndFeel.
-There are small differences between all look and feels -- MacOS, Windows, SwingJS.
-
-Expert developers know how to coerce changes in the UI by subclassing the UI for a
-component. This probably will not work in SwingJS.
-
-Note that LookAndFeel in Java usually determines canvas size in a Frame because
-different operating systems (Mac OS vs Windows vs HTML5) will have
-different edge sizes on their frames. If you want to ensure a component size,
-use getContentPane().setPreferredSize().
-
-
-System.exit(0) does not stop all processes
-------------------------------------------
-
-Although System.ext(int) has been implemented in JavaScript, it just closes the
-frames, stops all pending javax.swing.Timer objects in the queue, and runs any
-threads added using Runtime.getRuntime().addShutdownHook(Thread).
-It may not stop all "threads." So don't rely on that.
-Applications are responsible for shutting down prior to executing System.exit(0).
-
-
-myClass.getField not implemented
---------------------------------
-
-java.lang.reflect.Field is implemented minimally. It is not
-certain that Field.getDeclaringClass() will work. If you just want a
-value of a field, you can do this:
-
-/**
- *@j2sNative
- *
- * return myClass[name]
- */
-
-But that is not a java.lang.reflection.Field object.
-
-
-"window" and other reserved JavaScript names
---------------------------------------------
-
-No reserved top-level JavaScript name is allowed for a package name. So, for example,
-one must rename packages such as "window" or "document" to names such as "win" or "doc".
-
-reserved field and method names
--------------------------------
-
-In order to minimize the chance of added SwingJS field and method names colliding with ones
-developers might use in subclassing Java classes, we have added U+79D8 (first character of Mandarin
-"secret") to the characters already disrecommended by Java documentation ("$" and "_"). The only problem
-would be if you use that character followed by certain English words in certain classes. For example
-\u79D8canvas for JComponents (in java.awt.JSComponent) and \u79D8byte (in java.io.File).
-
-qualified field and method names
---------------------------------
-
-Method names in SwingJS are fully qualified, meaning two methods with the same Java name but different
-parameters, such as write(int) and write(double), must not have the same name in JavaScript. (In this
-case, we will have write$I and write$D.) However, in certain cases it may be desirable to leave the
-method names unqualified. In particular, when an interface actually represents a JavaScript object,
-the transpiler can leave a method name unqualified. The default situation for this is a class name
-includes ".api.js" (case-sensitive). This means that any method in any class in a package js within
-a package api, or any private interface js that has an outer interface api, will have all-unqualified
-methods. An example of this is swingjs.plaf.JSComboPopupList, which needs to communicate with a jQuery
-object directly using the following interface:
-
- private interface api {
-
- interface js extends JQueryObject {
-
- abstract js j2sCB(Object options);
-
- abstract Object[] j2sCB(String method);
-
- abstract Object[] j2sCB(String method, Object o);
-
- abstract Object[] j2sCB(String method, int i);
-
- abstract int j2sCB(String OPTION, String name);
-
- }
- }
-
-Notice that all these variants of j2sCB() will call the same method in JavaScript by design.
-
-
-missing Math methods
---------------------
-
-java.lang.Math is worked out, but some methods are missing, either because they
-involve long integer value that are inaccessible in JavaScript, or because I just
-didn't implement them. This is a result of continued Java development.
-It is easy enough to add these methods if you have the source. They go into j2sClazz.js,
-which is combined with other initial libraries into swingjs2.js by build_site.xml
-
-
-Component.getGraphics(), Graphics.dispose()
--------------------------------------------
-
-Use of component.getGraphics() is discouraged in Java and in SwingJS.
-Specifically in SwingJS, any call to component.getGraphics() or
-BufferedImage.createGraphics() or Graphics.create(...) should be matched with graphics.dispose(),
-particularly when it is called outside the context of a paint(Graphics)
-call from the system.
-
-If you see your graphics scrolling down the page with each repaint,
-look for where you have used Component.getGraphics() and not Graphics.dispose().
-For example, this will definitely NOT work in SwingJS:
-
- this.paint(getGraphics())
-
-and really should not work in Java, either, as it is technically a resource memory leak.
-
-Instead, if you really do not want to use repaint(), use this:
-
- Graphics g = getGraphics();
- paint(g);
- g.dispose();
-
-
-
-Graphics.setClip()
-------------------
-
-The HTML5 canvas.clip() method is permanent. You can only reset the clip using
-save/restore. This is different from Java, where you can temporarily change it using
-
- Shape oldClip = Graphics.getClip();
- Graphics.setClip(newClip);
- ...
- Graphics.setClip(oldClip);
-
-If you need to do something like this, you must schedule the paints
-to not have overlapping clip needs.
-
-
-MAJOR ISSUES--for Bob and Udo within SwingJS
-============================================
-
-fonts
------
-
-Fonts and FontMetrics will all be handled in JavaScript. Font matching will
-not be exact, and composite (drawn) fonts will not be supported.
-
-SwingJS handles calls such as font.getFontMetrics(g).stringWidth("xxx") by
-creating a <div> containing that text, placing it in an obscure location on
-the page, and reading div.getBoundingClientRect(). This is a VERY precise
-value, but can be a pixel or two off from what Java reports for the same font.
-
-
-OS-dependent classes
---------------------
-
-Static classes such as:
-
- java.awt.Toolkit
- java.awt.GraphicsEnvironment
-
-
-which are created using Class.forName are implemented using classes in the swingjs package.
-
-AWTAccessor is not implemented.
-
-
-AWT component peers and component "ui" user interfaces
-------------------------------------------------------
-
-ComponentPeer is a class that represents a native AWT component.
-Components with such peers are called "heavy-weight" components.
-They are expected to do the dirty work of graphics drawing.
-
-Java Swing implements peers only for JApplet, JDialog, JFrame, and JWindow.
-References to such objects have been removed, but clearly there must be
-some connection to similar DOM objects, even for "light-weight" components.
-
-
-
-MAJOR ISSUES--to be resolved by implementers
-============================================
-
-fonts
------
-
-Glyph/composite/outline fonts are not supported.
-
-
-
-threads
--------
-
-Thread locking and synchronization are not relevant to JavaScript.
-Thus, anything requiring "notify.." or "waitFor.." could be a serious issue.
-
-All threading must be "faked" in JavaScript. Specifically not available is:
-
- Thread.sleep()
-
-javax.swing.AbstractButton#doClick(pressTime) will not work, as it requires Thread.sleep();
-
-However, java.lang.Thread itself is implemented and used extensively.
-
-Methods thread.start() and thread.run() both work fine.
-
-For simple applications that use Thread.sleep() just to have a delay, as in a frame rate, for
-example, one can use javax.swing.Timer instead. That is fully implemented.
-
-Likewise, java.util.Timer can be replaced with no loss of performance with javax.Swing.Timer.
-Note that java.util.TimerTask is implemented, but it can also be replaced by an implementation of Runnable.
-
-task = new TimerTask(){....};
-t = new java.util.Timer();
-t.schedule(task, 0, 1);
-
-becomes
-
-task = new TimerTask(){....}; // or task = new Runnable() {...}
-t = new javax.swing.Timer(1, new ActionListener() {
- @Override
- public void actionPerformed(ActionEvent e) {
- task.run();
- }
-};
-t.setInitialDelay(0); // not particularly necessary
-t.start();
-
-In addition, SwingJS provides swingjs.JSThread, which can be subclassed
-if desired. This class allows simple
-
- while(!interrupted()){
- wait()
- ...
- }
-
-action through an asynchronous function run1(mode). For example:
-
- protected void run1(int mode) {
- try {
- while (true)
- switch (mode) {
- case INIT:
- // once-through stuff here
- mode = LOOP;
- break;
- case LOOP:
- if (!doDispatch || isInterrupted()) {
- mode = DONE;
- } else {
- Runnable r = new Runnable() {
- public void run() {
- // put the loop code here
- }
- };
- dispatchAndReturn(r);
- if (isJS)
- return;
- }
- break;
- // add more cases as needed
- case DONE:
- // finish up here
- if (isInterrupted())
- return;
- // or here
- break;
- }
- } finally {
- // stuff here to be executed after each loop in JS or at the end in Java
- }
- }
-
-image loading
--------------
-- All image loading in SwingJS is synchronous. A MediaTracker call will immediately return "complete".
- However, it still may take one system clock tick to fully load images. Thus, it is recommended that
- images be preloaded in the static block of the applet if it is necessary that they be available in init().
- This is only an issue if you are trying to access the pixel buffer of the image in JavaScript.
-
-- Applet.getImage(path, name) will return null if the image does not exist.
-
-- BufferedImage: only "support" imageType RGB and ARGB
-
- -BH: This is a temporary edit, just to get us started. Certainly GRAY will be needed
-
-
-BigInteger and BigDecimal
--------------------------
-
-java.math.BigInteger is fully supported; java.math.BigDecimal is roughed
-in and not fully tested (07/2019).
-
-Both classes present significant issues for JavaScript, as they are based in
-Java's 64-bit long for all their operations. Here is the JavaDoc note I added
-to BigInteger:
-
- * SwingJS note: Because of the limitations of JavaScript with regard
- * to long-integer bit storage as a double, this implementation drops
- * the integer storage bit length to 24, giving 48 for long and leaving
- * the last 16 bits clear for the exponent of the double number. This should
- * not affect performance significantly. It does increase the storage
- * size by about 33%. By bringing an "int" to 3 bytes, we can easily construct
- * and use byte[] data intended for the original BitSet.
-
-"Easily" may be a bit strong there. This was a serious challenge.
-
-BigDecimal seems to run normally, but in order to do that, my hack involves
-reducing the size of an integer that is allowed to be stored as such and not
-in byte[] as a BigInteger. I'm sure there is a performance hit, but it does work.
-
-no format internationalization
-------------------------------
-
-For now, just en for number and date formatters
-
-no winding rules
-----------------
-
- When filling a graphic, only nonzero winding rule is implemented in HTML5 Canvas2D.
-
-
-
-text-related field implementation
----------------------------------
-
-Text fields are:
-
-JTextField (JavaScript <input type="text">)
-JTextArea (JavaScript <textarea>)
-JTextPane (JavaScript <div>)
-JEditorPane (JavaScript <div>)
-
-For the initial implementation, we don't implement infinite undo/redo, and the abstract
-document model is much less elaborate. Only PlainDocument (in the form of JSPlainDocument)
-is implemented. The Document returned by JTextField.getDocument() is a javax.swing.text.Document.
-
-All scrolling is handled by HTML5. javax.swing.AutoScroller is not implemented.
-public static methods .stop, .isRunning, .processMouseDragged require true Java threading
-and so are not implmented. javax.swing.text.View and its subclasses are not implemented.
-
-The JS document model does not allow two text fields to address the same underlying document.
-
-JavaScript is slightly different from Java in that the field value is changed asynchronously after
-the keypressed event, so Java actions that are keyed to KEY_PRESSED may not pick up the new
-key value even after SwingUtilities.invokeLater() is called. Thus, key pressed actions may need
-to be recorded after a key released event instead.
-
-Formatter/Regex limitations
----------------------------
-
-Some browsers cannot process Regex "look-behind" process such as (?<=\W)
-java.util.regex.Matcher and Pattern use JavaScript's RegExp object rather than
-the native Java object. These are not identical. Only flags /igm are supported.
-Matcher.start(groupID) is not supported.
-
-java.util.Formatter will function correctly for all standard %... patterns.
-
-integer 1/0 == Infinity
------------------------
-
-1/0 in Java throws "java.lang.ArithmeticException: / by zero", but in JavaScript is just Infinity.
-
-
-
-Summary
--------
-
-These are all the known limitations of SwingJS. We have not found any of these limitations
-to be show-stoppers. The primary issue for newcomers to SwingJS is having the source code.
-You must check that source code for all your library jar files is available or, if you
-choose, you will need to decompile those classes. We have used decompilation on some projects,
-and it works just fine. So, technically, all we really need are JAR/class files. But the
-source is by far superior. It's generally prettier, and it has the license information that
-may or may not be present with the JAR or class files. Use class files at your own risk.
-
-Bob Hanson
-2019.08.16
-
-
-Additional Issues
------------------
-
-Annotation is working for classes, methods, and fields (12/22/19). Method reflection, however,
-is limited. Interfaces do not expose their methods, as the transpiler does not actually transpile
-the interfaces themselves. And method reflection only includes annotated methods.
-
-java.util.concurrent is not fully elaborated. This package is rewritten to not actually use the
-memory handling capabilities of concurrency, which JavaScript does not have access to.
-
-System.getProperties() just returns a minimal set of properties.
-
-
+++ /dev/null
-20201219175119
+++ /dev/null
-This is sources/net.sf.j2s.java.core/dist/DEV_NOTES.txt
-
-_j2sclasslist.txt
-
-the list of .js files concatenated into coreswingjs.js and minified to coreswingjs.z.js
-
-
-SwingJS-site.zip
-
-the full site directory for SwingJS including all files not in the test/ directory.
+++ /dev/null
-Unexpected error. File contents could not be restored from local history during undo/redo.
\ No newline at end of file
+++ /dev/null
-java/applet/Applet.js
-java/applet/AppletContext.js
-java/applet/AppletStub.js
-java/applet/JSApplet.js
-java/awt/ActiveEvent.js
-java/awt/Adjustable.js
-java/awt/AWTEvent.js
-java/awt/AWTEventMulticaster.js
-java/awt/AWTKeyStroke.js
-java/awt/BasicStroke.js
-java/awt/BorderLayout.js
-java/awt/Button.js
-java/awt/Color.js
-java/awt/color/ColorSpace.js
-java/awt/Component.js
-java/awt/ComponentOrientation.js
-java/awt/ContainerOrderFocusTraversalPolicy.js
-java/awt/Container.js
-java/awt/Cursor.js
-java/awt/DefaultFocusTraversalPolicy.js
-java/awt/DefaultKeyboardFocusManager.js
-java/awt/Dialog.js
-java/awt/Dimension.js
-java/awt/dnd/peer/DropTargetPeer.js
-java/awt/event/ActionListener.js
-java/awt/event/AdjustmentEvent.js
-java/awt/event/AdjustmentListener.js
-java/awt/event/AWTEventListener.js
-java/awt/event/ComponentAdapter.js
-java/awt/event/ComponentEvent.js
-java/awt/event/ComponentListener.js
-java/awt/event/ContainerListener.js
-java/awt/event/FocusEvent.js
-java/awt/event/FocusListener.js
-java/awt/event/HierarchyBoundsListener.js
-java/awt/event/HierarchyListener.js
-java/awt/event/InputEvent.js
-java/awt/event/InputMethodListener.js
-java/awt/event/InvocationEvent.js
-java/awt/event/ItemEvent.js
-java/awt/event/ItemListener.js
-java/awt/event/KeyListener.js
-java/awt/event/MouseEvent.js
-java/awt/event/MouseListener.js
-java/awt/event/MouseMotionListener.js
-java/awt/event/MouseWheelListener.js
-java/awt/event/TextListener.js
-java/awt/event/WindowAdapter.js
-java/awt/event/WindowEvent.js
-java/awt/event/WindowFocusListener.js
-java/awt/event/WindowListener.js
-java/awt/event/WindowStateListener.js
-java/awt/EventDispatchThread.js
-java/awt/EventFilter.js
-java/awt/EventQueue.js
-java/awt/EventQueueItem.js
-java/awt/FlowLayout.js
-java/awt/FocusTraversalPolicy.js
-java/awt/Font.js
-java/awt/font/FontRenderContext.js
-java/awt/FontMetrics.js
-java/awt/Frame.js
-java/awt/geom/AffineTransform.js
-java/awt/geom/Dimension2D.js
-java/awt/geom/Path2D.js
-java/awt/geom/PathIterator.js
-java/awt/geom/Point2D.js
-java/awt/geom/Rectangle2D.js
-java/awt/geom/RectangularShape.js
-java/awt/geom/RectIterator.js
-java/awt/GraphicsCallback.js
-java/awt/GraphicsConfiguration.js
-java/awt/GraphicsDevice.js
-java/awt/GraphicsEnvironment.js
-java/awt/Image.js
-java/awt/image/ImageObserver.js
-java/awt/Insets.js
-java/awt/ItemSelectable.js
-java/awt/JSComponent.js
-java/awt/JSDialog.js
-java/awt/JSFrame.js
-java/awt/JSPanel.js
-java/awt/KeyboardFocusManager.js
-java/awt/KeyEventDispatcher.js
-java/awt/KeyEventPostProcessor.js
-java/awt/Label.js
-java/awt/LayoutManager.js
-java/awt/LayoutManager2.js
-java/awt/LightweightDispatcher.js
-java/awt/Paint.js
-java/awt/Panel.js
-java/awt/peer/ComponentPeer.js
-java/awt/peer/ContainerPeer.js
-java/awt/peer/FramePeer.js
-java/awt/peer/KeyboardFocusManagerPeer.js
-java/awt/peer/LightweightPeer.js
-java/awt/peer/WindowPeer.js
-java/awt/Point.js
-java/awt/Queue.js
-java/awt/Rectangle.js
-java/awt/RenderingHints.js
-java/awt/Scrollbar.js
-java/awt/ScrollPane.js
-java/awt/Shape.js
-java/awt/Stroke.js
-java/awt/TextArea.js
-java/awt/TextComponent.js
-java/awt/TextField.js
-java/awt/Toolkit.js
-java/awt/Transparency.js
-java/awt/Window.js
-java/beans/ChangeListenerMap.js
-java/beans/PropertyChangeEvent.js
-java/beans/PropertyChangeListener.js
-java/beans/PropertyChangeSupport.js
-java/lang/AbstractStringBuilder.js
-java/lang/Class.js
-java/lang/Enum.js
-java/lang/Iterable.js
-java/lang/reflect/Constructor.js
-java/lang/reflect/Method.js
-java/lang/StringBuffer.js
-java/lang/StringBuilder.js
-java/lang/Thread.js
-java/lang/ThreadGroup.js
-java/math/RoundingMode.js
-java/net/URL.js
-java/net/URLStreamHandlerFactory.js
-java/net/HttpURLConnection.js
-java/net/URLStreamHandler.js
-javax/net/ssl/HttpsUrlConnection.js
-java/text/CharacterIterator.js
-java/text/DecimalFormat.js
-java/text/DecimalFormatSymbols.js
-java/text/DigitList.js
-java/text/FieldPosition.js
-java/text/Format.js
-java/text/NumberFormat.js
-java/util/AbstractCollection.js
-java/util/AbstractList.js
-java/util/AbstractMap.js
-java/util/AbstractSequentialList.js
-java/util/AbstractSet.js
-java/util/ArrayList.js
-java/util/Arrays.js
-java/util/Collection.js
-java/util/Collections.js
-java/util/Comparator.js
-java/util/Deque.js
-java/util/Dictionary.js
-java/util/Enumeration.js
-java/util/EventListener.js
-java/util/EventObject.js
-java/util/HashMap.js
-java/util/HashSet.js
-java/util/Hashtable.js
-java/util/IdentityHashMap.js
-java/util/Iterator.js
-java/util/LinkedHashMap.js
-java/util/LinkedList.js
-java/util/List.js
-java/util/ListResourceBundle.js
-java/util/Locale.js
-java/util/Map.js
-java/util/Objects.js
-java/util/Queue.js
-java/util/Random.js
-java/util/RandomAccess.js
-java/util/ResourceBundle.js
-java/util/Set.js
-java/util/TimSort.js
-java/util/Vector.js
-javajs/api/JSFunction.js
-javajs/util/AjaxURLConnection.js
-javajs/util/AjaxURLStreamHandlerFactory.js
-javajs/util/AU.js
-javajs/util/JSThread.js
-javajs/util/Lst.js
-javajs/util/PT.js
-javajs/util/Rdr.js
-javajs/util/SB.js
-javax/swing/AbstractAction.js
-javax/swing/AbstractButton.js
-javax/swing/AbstractListModel.js
-javax/swing/Action.js
-javax/swing/ActionMap.js
-javax/swing/AncestorNotifier.js
-javax/swing/ArrayTable.js
-javax/swing/border/AbstractBorder.js
-javax/swing/border/BevelBorder.js
-javax/swing/border/Border.js
-javax/swing/border/CompoundBorder.js
-javax/swing/border/EmptyBorder.js
-javax/swing/border/EtchedBorder.js
-javax/swing/border/LineBorder.js
-javax/swing/border/TitledBorder.js
-javax/swing/BorderFactory.js
-javax/swing/BoundedRangeModel.js
-javax/swing/BoxLayout.js
-javax/swing/ButtonGroup.js
-javax/swing/ButtonModel.js
-javax/swing/ClientPropertyKey.js
-javax/swing/ComboBoxModel.js
-javax/swing/DefaultBoundedRangeModel.js
-javax/swing/DefaultButtonModel.js
-javax/swing/DefaultComboBoxModel.js
-javax/swing/DefaultSingleSelectionModel.js
-javax/swing/DropMode.js
-javax/swing/event/AncestorEvent.js
-javax/swing/event/AncestorListener.js
-javax/swing/event/CaretEvent.js
-javax/swing/event/CaretListener.js
-javax/swing/event/ChangeEvent.js
-javax/swing/event/ChangeListener.js
-javax/swing/event/DocumentEvent.js
-javax/swing/event/DocumentListener.js
-javax/swing/event/EventListenerList.js
-javax/swing/event/ListDataEvent.js
-javax/swing/event/ListDataListener.js
-javax/swing/event/UndoableEditEvent.js
-javax/swing/event/UndoableEditListener.js
-javax/swing/FocusManager.js
-javax/swing/InternalFrameFocusTraversalPolicy.js
-javax/swing/LayoutComparator.js
-javax/swing/LayoutFocusTraversalPolicy.js
-javax/swing/SortingFocusTraversalPolicy.js
-javax/swing/SwingContainerOrderFocusTraversalPolicy.js
-javax/swing/SwingDefaultFocusTraversalPolicy.js
-javax/swing/Icon.js
-javax/swing/ImageIcon.js
-javax/swing/InputMap.js
-javax/swing/JApplet.js
-javax/swing/JButton.js
-javax/swing/JCheckBox.js
-javax/swing/JCheckBoxMenuItem.js
-javax/swing/JComboBox.js
-javax/swing/JComponent.js
-javax/swing/JFrame.js
-javax/swing/JLabel.js
-javax/swing/JLayeredPane.js
-javax/swing/JMenu.js
-javax/swing/JMenuBar.js
-javax/swing/JMenuItem.js
-javax/swing/JPanel.js
-javax/swing/JPopupMenu.js
-javax/swing/JRadioButtonMenuItem.js
-javax/swing/JRootPane.js
-javax/swing/JScrollBar.js
-javax/swing/JScrollPane.js
-javax/swing/JSeparator.js
-javax/swing/JTextArea.js
-javax/swing/JTextField.js
-javax/swing/JToggleButton.js
-javax/swing/JViewport.js
-javax/swing/KeyboardManager.js
-javax/swing/KeyStroke.js
-javax/swing/ListModel.js
-javax/swing/LookAndFeel.js
-javax/swing/MenuElement.js
-javax/swing/MutableComboBoxModel.js
-javax/swing/plaf/ActionMapUIResource.js
-javax/swing/plaf/basic/BasicBorders.js
-javax/swing/plaf/BorderUIResource.js
-javax/swing/plaf/ColorUIResource.js
-javax/swing/plaf/ComponentUI.js
-javax/swing/plaf/DimensionUIResource.js
-javax/swing/plaf/FontUIResource.js
-javax/swing/plaf/InputMapUIResource.js
-javax/swing/plaf/InsetsUIResource.js
-javax/swing/plaf/UIResource.js
-javax/swing/RepaintManager.js
-javax/swing/RootPaneContainer.js
-javax/swing/Scrollable.js
-javax/swing/ScrollPaneConstants.js
-javax/swing/ScrollPaneLayout.js
-javax/swing/SingleSelectionModel.js
-javax/swing/SizeRequirements.js
-javax/swing/SwingConstants.js
-javax/swing/SwingPaintEventDispatcher.js
-javax/swing/SwingUtilities.js
-javax/swing/text/AbstractDocument.js
-javax/swing/text/AttributeSet.js
-javax/swing/text/Caret.js
-javax/swing/text/DefaultCaret.js
-javax/swing/text/DefaultEditorKit.js
-javax/swing/text/Document.js
-javax/swing/text/EditorKit.js
-javax/swing/text/Element.js
-javax/swing/text/GapContent.js
-javax/swing/text/GapVector.js
-javax/swing/text/JTextComponent.js
-javax/swing/text/MutableAttributeSet.js
-javax/swing/text/PlainDocument.js
-javax/swing/text/PlainView.js
-javax/swing/text/Position.js
-javax/swing/text/Segment.js
-javax/swing/text/SegmentCache.js
-javax/swing/text/SimpleAttributeSet.js
-javax/swing/text/Style.js
-javax/swing/text/StyleConstants.js
-javax/swing/text/StyleContext.js
-javax/swing/text/TabExpander.js
-javax/swing/text/TextAction.js
-javax/swing/text/Utilities.js
-javax/swing/text/View.js
-javax/swing/tree/TreeNode.js
-javax/swing/UIDefaults.js
-javax/swing/UIManager.js
-javax/swing/undo/AbstractUndoableEdit.js
-javax/swing/undo/CompoundEdit.js
-javax/swing/undo/UndoableEdit.js
-javax/swing/ViewportLayout.js
-javax/swing/WindowConstants.js
-sun/awt/AppContext.js
-sun/awt/AWTAutoShutdown.js
-sun/awt/CausedFocusEvent.js
-sun/awt/ComponentFactory.js
-sun/awt/KeyboardFocusManagerPeerProvider.js
-sun/awt/MostRecentKeyValue.js
-sun/awt/MostRecentThreadAppContext.js
-sun/awt/PaintEventDispatcher.js
-sun/awt/PostEventQueue.js
-sun/awt/RequestFocusController.js
-sun/awt/SunToolkit.js
-sun/awt/WindowClosingListener.js
-sun/awt/WindowClosingSupport.js
-sun/awt/image/DataStealer.js
-sun/awt/image/IntegerComponentRaster.js
-sun/awt/image/IntegerInterleavedRaster.js
-sun/awt/image/SunWritableRaster.js
-sun/font/FontDesignMetrics.js
-sun/swing/DefaultLookup.js
-sun/swing/SwingLazyValue.js
-sun/text/resources/FormatData.js
-sun/text/resources/FormatData_en.js
-sun/util/resources/LocaleData.js
-swingjs/a2s/A2SContainer.js
-swingjs/a2s/A2SEvent.js
-swingjs/a2s/A2SListener.js
-swingjs/a2s/Applet.js
-swingjs/a2s/Button.js
-swingjs/a2s/Label.js
-swingjs/a2s/Panel.js
-swingjs/a2s/Scrollbar.js
-swingjs/a2s/ScrollPane.js
-swingjs/a2s/TextArea.js
-swingjs/a2s/TextField.js
-swingjs/api/Interface.js
-swingjs/api/js/DOMNode.js
-swingjs/api/js/HTML5CanvasContext2D.js
-swingjs/api/js/JSInterface.js
-swingjs/jquery/JQueryUI.js
-swingjs/JSApp.js
-swingjs/JSAppletThread.js
-swingjs/JSAppletViewer.js
-swingjs/JSFocusPeer.js
-swingjs/JSFontMetrics.js
-swingjs/JSFrameViewer.js
-swingjs/JSGraphics2D.js
-swingjs/JSGraphicsConfiguration.js
-swingjs/JSGraphicsEnvironment.js
-swingjs/JSImage.js
-swingjs/JSImagekit.js
-swingjs/JSMouse.js
-swingjs/JSNullComponentPeer.js
-swingjs/JSScreenDevice.js
-swingjs/JSThreadGroup.js
-swingjs/JSToolkit.js
-swingjs/JSUtil.js
-swingjs/plaf/ButtonListener.js
-swingjs/plaf/DefaultMenuLayout.js
-swingjs/plaf/HTML5LookAndFeel.js
-swingjs/plaf/JSAppletUI.js
-swingjs/plaf/JSButtonUI.js
-swingjs/plaf/JSCheckBoxMenuItemUI.js
-swingjs/plaf/JSCheckBoxUI.js
-swingjs/plaf/JSComboBoxUI.js
-swingjs/plaf/JSComponentUI.js
-swingjs/plaf/JSEventHandler.js
-swingjs/plaf/JSFrameUI.js
-swingjs/plaf/JSGraphicsUtils.js
-swingjs/plaf/JSLabelUI.js
-swingjs/plaf/JSLayeredPaneUI.js
-swingjs/plaf/JSLightweightUI.js
-swingjs/plaf/JSMenuBarUI.js
-swingjs/plaf/JSMenuItemUI.js
-swingjs/plaf/JSMenuUI.js
-swingjs/plaf/JSPanelUI.js
-swingjs/plaf/JSPopupMenuSeparatorUI.js
-swingjs/plaf/JSPopupMenuUI.js
-swingjs/plaf/JSRadioButtonMenuItemUI.js
-swingjs/plaf/JSRadioButtonUI.js
-swingjs/plaf/JSRootPaneUI.js
-swingjs/plaf/JSScrollBarUI.js
-swingjs/plaf/JSScrollPaneUI.js
-swingjs/plaf/JSSeparatorUI.js
-swingjs/plaf/JSSliderUI.js
-swingjs/plaf/JSTextAreaUI.js
-swingjs/plaf/JSTextFieldUI.js
-swingjs/plaf/JSTextUI.js
-swingjs/plaf/JSTextViewUI.js
-swingjs/plaf/JSViewportUI.js
-swingjs/plaf/JSWindowUI.js
-swingjs/plaf/LazyActionMap.js
-swingjs/plaf/Resizer.js
-swingjs/plaf/TextListener.js
-
-
+++ /dev/null
-20200205074936
+++ /dev/null
-This is sources/net.sf.j2s.java.core/dist/DEV_NOTES.txt
-
-_j2sclasslist.txt
-
-the list of .js files concatenated into coreswingjs.js and minified to coreswingjs.z.js
-
-
-SwingJS-site.zip
-
-the full site directory for SwingJS including all files not in the test/ directory.
+++ /dev/null
-Unexpected error. File contents could not be restored from local history during undo/redo.
\ No newline at end of file
+++ /dev/null
-java/applet/Applet.js
-java/applet/AppletContext.js
-java/applet/AppletStub.js
-java/applet/JSApplet.js
-java/awt/ActiveEvent.js
-java/awt/Adjustable.js
-java/awt/AWTEvent.js
-java/awt/AWTEventMulticaster.js
-java/awt/AWTKeyStroke.js
-java/awt/BasicStroke.js
-java/awt/BorderLayout.js
-java/awt/Button.js
-java/awt/Color.js
-java/awt/color/ColorSpace.js
-java/awt/Component.js
-java/awt/ComponentOrientation.js
-java/awt/ContainerOrderFocusTraversalPolicy.js
-java/awt/Container.js
-java/awt/Cursor.js
-java/awt/DefaultFocusTraversalPolicy.js
-java/awt/DefaultKeyboardFocusManager.js
-java/awt/Dialog.js
-java/awt/Dimension.js
-java/awt/dnd/peer/DropTargetPeer.js
-java/awt/event/ActionListener.js
-java/awt/event/AdjustmentEvent.js
-java/awt/event/AdjustmentListener.js
-java/awt/event/AWTEventListener.js
-java/awt/event/ComponentAdapter.js
-java/awt/event/ComponentEvent.js
-java/awt/event/ComponentListener.js
-java/awt/event/ContainerListener.js
-java/awt/event/FocusEvent.js
-java/awt/event/FocusListener.js
-java/awt/event/HierarchyBoundsListener.js
-java/awt/event/HierarchyListener.js
-java/awt/event/InputEvent.js
-java/awt/event/InputMethodListener.js
-java/awt/event/InvocationEvent.js
-java/awt/event/ItemEvent.js
-java/awt/event/ItemListener.js
-java/awt/event/KeyListener.js
-java/awt/event/MouseEvent.js
-java/awt/event/MouseListener.js
-java/awt/event/MouseMotionListener.js
-java/awt/event/MouseWheelListener.js
-java/awt/event/TextListener.js
-java/awt/event/WindowAdapter.js
-java/awt/event/WindowEvent.js
-java/awt/event/WindowFocusListener.js
-java/awt/event/WindowListener.js
-java/awt/event/WindowStateListener.js
-java/awt/EventDispatchThread.js
-java/awt/EventFilter.js
-java/awt/EventQueue.js
-java/awt/EventQueueItem.js
-java/awt/FlowLayout.js
-java/awt/FocusTraversalPolicy.js
-java/awt/Font.js
-java/awt/font/FontRenderContext.js
-java/awt/FontMetrics.js
-java/awt/Frame.js
-java/awt/geom/AffineTransform.js
-java/awt/geom/Dimension2D.js
-java/awt/geom/Path2D.js
-java/awt/geom/PathIterator.js
-java/awt/geom/Point2D.js
-java/awt/geom/Rectangle2D.js
-java/awt/geom/RectangularShape.js
-java/awt/geom/RectIterator.js
-java/awt/GraphicsCallback.js
-java/awt/GraphicsConfiguration.js
-java/awt/GraphicsDevice.js
-java/awt/GraphicsEnvironment.js
-java/awt/Image.js
-java/awt/image/ImageObserver.js
-java/awt/Insets.js
-java/awt/ItemSelectable.js
-java/awt/JSComponent.js
-java/awt/JSDialog.js
-java/awt/JSFrame.js
-java/awt/JSPanel.js
-java/awt/KeyboardFocusManager.js
-java/awt/KeyEventDispatcher.js
-java/awt/KeyEventPostProcessor.js
-java/awt/Label.js
-java/awt/LayoutManager.js
-java/awt/LayoutManager2.js
-java/awt/LightweightDispatcher.js
-java/awt/Paint.js
-java/awt/Panel.js
-java/awt/peer/ComponentPeer.js
-java/awt/peer/ContainerPeer.js
-java/awt/peer/FramePeer.js
-java/awt/peer/KeyboardFocusManagerPeer.js
-java/awt/peer/LightweightPeer.js
-java/awt/peer/WindowPeer.js
-java/awt/Point.js
-java/awt/Queue.js
-java/awt/Rectangle.js
-java/awt/RenderingHints.js
-java/awt/Scrollbar.js
-java/awt/ScrollPane.js
-java/awt/Shape.js
-java/awt/Stroke.js
-java/awt/TextArea.js
-java/awt/TextComponent.js
-java/awt/TextField.js
-java/awt/Toolkit.js
-java/awt/Transparency.js
-java/awt/Window.js
-java/beans/ChangeListenerMap.js
-java/beans/PropertyChangeEvent.js
-java/beans/PropertyChangeListener.js
-java/beans/PropertyChangeSupport.js
-java/lang/AbstractStringBuilder.js
-java/lang/Class.js
-java/lang/Enum.js
-java/lang/Iterable.js
-java/lang/reflect/Constructor.js
-java/lang/reflect/Method.js
-java/lang/StringBuffer.js
-java/lang/StringBuilder.js
-java/lang/Thread.js
-java/lang/ThreadGroup.js
-java/math/RoundingMode.js
-java/net/URL.js
-java/net/URLStreamHandlerFactory.js
-java/net/HttpURLConnection.js
-java/net/URLStreamHandler.js
-javax/net/ssl/HttpsUrlConnection.js
-java/text/CharacterIterator.js
-java/text/DecimalFormat.js
-java/text/DecimalFormatSymbols.js
-java/text/DigitList.js
-java/text/FieldPosition.js
-java/text/Format.js
-java/text/NumberFormat.js
-java/util/AbstractCollection.js
-java/util/AbstractList.js
-java/util/AbstractMap.js
-java/util/AbstractSequentialList.js
-java/util/AbstractSet.js
-java/util/ArrayList.js
-java/util/Arrays.js
-java/util/Collection.js
-java/util/Collections.js
-java/util/Comparator.js
-java/util/Deque.js
-java/util/Dictionary.js
-java/util/Enumeration.js
-java/util/EventListener.js
-java/util/EventObject.js
-java/util/HashMap.js
-java/util/HashSet.js
-java/util/Hashtable.js
-java/util/IdentityHashMap.js
-java/util/Iterator.js
-java/util/LinkedHashMap.js
-java/util/LinkedList.js
-java/util/List.js
-java/util/ListResourceBundle.js
-java/util/Locale.js
-java/util/Map.js
-java/util/Objects.js
-java/util/Queue.js
-java/util/Random.js
-java/util/RandomAccess.js
-java/util/ResourceBundle.js
-java/util/Set.js
-java/util/TimSort.js
-java/util/Vector.js
-javajs/api/JSFunction.js
-javajs/util/AjaxURLConnection.js
-javajs/util/AjaxURLStreamHandlerFactory.js
-javajs/util/AU.js
-javajs/util/JSThread.js
-javajs/util/Lst.js
-javajs/util/PT.js
-javajs/util/Rdr.js
-javajs/util/SB.js
-javax/swing/AbstractAction.js
-javax/swing/AbstractButton.js
-javax/swing/AbstractListModel.js
-javax/swing/Action.js
-javax/swing/ActionMap.js
-javax/swing/AncestorNotifier.js
-javax/swing/ArrayTable.js
-javax/swing/border/AbstractBorder.js
-javax/swing/border/BevelBorder.js
-javax/swing/border/Border.js
-javax/swing/border/CompoundBorder.js
-javax/swing/border/EmptyBorder.js
-javax/swing/border/EtchedBorder.js
-javax/swing/border/LineBorder.js
-javax/swing/border/TitledBorder.js
-javax/swing/BorderFactory.js
-javax/swing/BoundedRangeModel.js
-javax/swing/BoxLayout.js
-javax/swing/ButtonGroup.js
-javax/swing/ButtonModel.js
-javax/swing/ClientPropertyKey.js
-javax/swing/ComboBoxModel.js
-javax/swing/DefaultBoundedRangeModel.js
-javax/swing/DefaultButtonModel.js
-javax/swing/DefaultComboBoxModel.js
-javax/swing/DefaultSingleSelectionModel.js
-javax/swing/DropMode.js
-javax/swing/event/AncestorEvent.js
-javax/swing/event/AncestorListener.js
-javax/swing/event/CaretEvent.js
-javax/swing/event/CaretListener.js
-javax/swing/event/ChangeEvent.js
-javax/swing/event/ChangeListener.js
-javax/swing/event/DocumentEvent.js
-javax/swing/event/DocumentListener.js
-javax/swing/event/EventListenerList.js
-javax/swing/event/ListDataEvent.js
-javax/swing/event/ListDataListener.js
-javax/swing/event/UndoableEditEvent.js
-javax/swing/event/UndoableEditListener.js
-javax/swing/FocusManager.js
-javax/swing/InternalFrameFocusTraversalPolicy.js
-javax/swing/LayoutComparator.js
-javax/swing/LayoutFocusTraversalPolicy.js
-javax/swing/SortingFocusTraversalPolicy.js
-javax/swing/SwingContainerOrderFocusTraversalPolicy.js
-javax/swing/SwingDefaultFocusTraversalPolicy.js
-javax/swing/Icon.js
-javax/swing/ImageIcon.js
-javax/swing/InputMap.js
-javax/swing/JApplet.js
-javax/swing/JButton.js
-javax/swing/JCheckBox.js
-javax/swing/JCheckBoxMenuItem.js
-javax/swing/JComboBox.js
-javax/swing/JComponent.js
-javax/swing/JFrame.js
-javax/swing/JLabel.js
-javax/swing/JLayeredPane.js
-javax/swing/JMenu.js
-javax/swing/JMenuBar.js
-javax/swing/JMenuItem.js
-javax/swing/JPanel.js
-javax/swing/JPopupMenu.js
-javax/swing/JRadioButtonMenuItem.js
-javax/swing/JRootPane.js
-javax/swing/JScrollBar.js
-javax/swing/JScrollPane.js
-javax/swing/JSeparator.js
-javax/swing/JTextArea.js
-javax/swing/JTextField.js
-javax/swing/JToggleButton.js
-javax/swing/JViewport.js
-javax/swing/KeyboardManager.js
-javax/swing/KeyStroke.js
-javax/swing/ListModel.js
-javax/swing/LookAndFeel.js
-javax/swing/MenuElement.js
-javax/swing/MutableComboBoxModel.js
-javax/swing/plaf/ActionMapUIResource.js
-javax/swing/plaf/basic/BasicBorders.js
-javax/swing/plaf/BorderUIResource.js
-javax/swing/plaf/ColorUIResource.js
-javax/swing/plaf/ComponentUI.js
-javax/swing/plaf/DimensionUIResource.js
-javax/swing/plaf/FontUIResource.js
-javax/swing/plaf/InputMapUIResource.js
-javax/swing/plaf/InsetsUIResource.js
-javax/swing/plaf/UIResource.js
-javax/swing/RepaintManager.js
-javax/swing/RootPaneContainer.js
-javax/swing/Scrollable.js
-javax/swing/ScrollPaneConstants.js
-javax/swing/ScrollPaneLayout.js
-javax/swing/SingleSelectionModel.js
-javax/swing/SizeRequirements.js
-javax/swing/SwingConstants.js
-javax/swing/SwingPaintEventDispatcher.js
-javax/swing/SwingUtilities.js
-javax/swing/text/AbstractDocument.js
-javax/swing/text/AttributeSet.js
-javax/swing/text/Caret.js
-javax/swing/text/DefaultCaret.js
-javax/swing/text/DefaultEditorKit.js
-javax/swing/text/Document.js
-javax/swing/text/EditorKit.js
-javax/swing/text/Element.js
-javax/swing/text/GapContent.js
-javax/swing/text/GapVector.js
-javax/swing/text/JTextComponent.js
-javax/swing/text/MutableAttributeSet.js
-javax/swing/text/PlainDocument.js
-javax/swing/text/PlainView.js
-javax/swing/text/Position.js
-javax/swing/text/Segment.js
-javax/swing/text/SegmentCache.js
-javax/swing/text/SimpleAttributeSet.js
-javax/swing/text/Style.js
-javax/swing/text/StyleConstants.js
-javax/swing/text/StyleContext.js
-javax/swing/text/TabExpander.js
-javax/swing/text/TextAction.js
-javax/swing/text/Utilities.js
-javax/swing/text/View.js
-javax/swing/tree/TreeNode.js
-javax/swing/UIDefaults.js
-javax/swing/UIManager.js
-javax/swing/undo/AbstractUndoableEdit.js
-javax/swing/undo/CompoundEdit.js
-javax/swing/undo/UndoableEdit.js
-javax/swing/ViewportLayout.js
-javax/swing/WindowConstants.js
-sun/awt/AppContext.js
-sun/awt/AWTAutoShutdown.js
-sun/awt/CausedFocusEvent.js
-sun/awt/ComponentFactory.js
-sun/awt/KeyboardFocusManagerPeerProvider.js
-sun/awt/MostRecentKeyValue.js
-sun/awt/MostRecentThreadAppContext.js
-sun/awt/PaintEventDispatcher.js
-sun/awt/PostEventQueue.js
-sun/awt/RequestFocusController.js
-sun/awt/SunToolkit.js
-sun/awt/WindowClosingListener.js
-sun/awt/WindowClosingSupport.js
-sun/awt/image/DataStealer.js
-sun/awt/image/IntegerComponentRaster.js
-sun/awt/image/IntegerInterleavedRaster.js
-sun/awt/image/SunWritableRaster.js
-sun/font/FontDesignMetrics.js
-sun/swing/DefaultLookup.js
-sun/swing/SwingLazyValue.js
-sun/text/resources/FormatData.js
-sun/text/resources/en/FormatData_en.js
-sun/util/resources/LocaleData.js
-sun/util/locale/BaseLocale.js
-sun/util/locale/LocaleUtils.js
-sun/util/locale/provider/LocaleProviderAdapter.js
-sun/util/locale/provider/LocaleDataMetaInfo.js
-swingjs/a2s/A2SContainer.js
-swingjs/a2s/A2SEvent.js
-swingjs/a2s/A2SListener.js
-swingjs/a2s/Applet.js
-swingjs/a2s/Button.js
-swingjs/a2s/Label.js
-swingjs/a2s/Panel.js
-swingjs/a2s/Scrollbar.js
-swingjs/a2s/ScrollPane.js
-swingjs/a2s/TextArea.js
-swingjs/a2s/TextField.js
-swingjs/api/Interface.js
-swingjs/api/js/DOMNode.js
-swingjs/api/js/HTML5CanvasContext2D.js
-swingjs/api/js/JSInterface.js
-swingjs/jquery/JQueryUI.js
-swingjs/JSApp.js
-swingjs/JSAppletThread.js
-swingjs/JSAppletViewer.js
-swingjs/JSFocusPeer.js
-swingjs/JSFontMetrics.js
-swingjs/JSFrameViewer.js
-swingjs/JSGraphics2D.js
-swingjs/JSGraphicsConfiguration.js
-swingjs/JSGraphicsEnvironment.js
-swingjs/JSImage.js
-swingjs/JSImagekit.js
-swingjs/JSMouse.js
-swingjs/JSNullComponentPeer.js
-swingjs/JSScreenDevice.js
-swingjs/JSThreadGroup.js
-swingjs/JSToolkit.js
-swingjs/JSUtil.js
-swingjs/plaf/ButtonListener.js
-swingjs/plaf/DefaultMenuLayout.js
-swingjs/plaf/HTML5LookAndFeel.js
-swingjs/plaf/JSAppletUI.js
-swingjs/plaf/JSButtonUI.js
-swingjs/plaf/JSCheckBoxMenuItemUI.js
-swingjs/plaf/JSCheckBoxUI.js
-swingjs/plaf/JSComboBoxUI.js
-swingjs/plaf/JSComponentUI.js
-swingjs/plaf/JSEventHandler.js
-swingjs/plaf/JSFrameUI.js
-swingjs/plaf/JSGraphicsUtils.js
-swingjs/plaf/JSLabelUI.js
-swingjs/plaf/JSLayeredPaneUI.js
-swingjs/plaf/JSLightweightUI.js
-swingjs/plaf/JSMenuBarUI.js
-swingjs/plaf/JSMenuItemUI.js
-swingjs/plaf/JSMenuUI.js
-swingjs/plaf/JSPanelUI.js
-swingjs/plaf/JSPopupMenuSeparatorUI.js
-swingjs/plaf/JSPopupMenuUI.js
-swingjs/plaf/JSRadioButtonMenuItemUI.js
-swingjs/plaf/JSRadioButtonUI.js
-swingjs/plaf/JSRootPaneUI.js
-swingjs/plaf/JSScrollBarUI.js
-swingjs/plaf/JSScrollPaneUI.js
-swingjs/plaf/JSSeparatorUI.js
-swingjs/plaf/JSSliderUI.js
-swingjs/plaf/JSTextAreaUI.js
-swingjs/plaf/JSTextFieldUI.js
-swingjs/plaf/JSTextUI.js
-swingjs/plaf/JSTextViewUI.js
-swingjs/plaf/JSViewportUI.js
-swingjs/plaf/JSWindowUI.js
-swingjs/plaf/LazyActionMap.js
-swingjs/plaf/Resizer.js
-swingjs/plaf/TextListener.js
-
-
+++ /dev/null
-20200220124544
+++ /dev/null
-This is sources/net.sf.j2s.java.core/dist/DEV_NOTES.txt
-
-_j2sclasslist.txt
-
-the list of .js files concatenated into coreswingjs.js and minified to coreswingjs.z.js
-
-
-SwingJS-site.zip
-
-the full site directory for SwingJS including all files not in the test/ directory.
+++ /dev/null
-Unexpected error. File contents could not be restored from local history during undo/redo.
\ No newline at end of file
+++ /dev/null
-java/applet/Applet.js
-java/applet/AppletContext.js
-java/applet/AppletStub.js
-java/applet/JSApplet.js
-java/awt/ActiveEvent.js
-java/awt/Adjustable.js
-java/awt/AWTEvent.js
-java/awt/AWTEventMulticaster.js
-java/awt/AWTKeyStroke.js
-java/awt/BasicStroke.js
-java/awt/BorderLayout.js
-java/awt/Button.js
-java/awt/Color.js
-java/awt/color/ColorSpace.js
-java/awt/Component.js
-java/awt/ComponentOrientation.js
-java/awt/ContainerOrderFocusTraversalPolicy.js
-java/awt/Container.js
-java/awt/Cursor.js
-java/awt/DefaultFocusTraversalPolicy.js
-java/awt/DefaultKeyboardFocusManager.js
-java/awt/Dialog.js
-java/awt/Dimension.js
-java/awt/dnd/peer/DropTargetPeer.js
-java/awt/event/ActionListener.js
-java/awt/event/AdjustmentEvent.js
-java/awt/event/AdjustmentListener.js
-java/awt/event/AWTEventListener.js
-java/awt/event/ComponentAdapter.js
-java/awt/event/ComponentEvent.js
-java/awt/event/ComponentListener.js
-java/awt/event/ContainerListener.js
-java/awt/event/FocusEvent.js
-java/awt/event/FocusListener.js
-java/awt/event/HierarchyBoundsListener.js
-java/awt/event/HierarchyListener.js
-java/awt/event/InputEvent.js
-java/awt/event/InputMethodListener.js
-java/awt/event/InvocationEvent.js
-java/awt/event/ItemEvent.js
-java/awt/event/ItemListener.js
-java/awt/event/KeyListener.js
-java/awt/event/MouseEvent.js
-java/awt/event/MouseListener.js
-java/awt/event/MouseMotionListener.js
-java/awt/event/MouseWheelListener.js
-java/awt/event/TextListener.js
-java/awt/event/WindowAdapter.js
-java/awt/event/WindowEvent.js
-java/awt/event/WindowFocusListener.js
-java/awt/event/WindowListener.js
-java/awt/event/WindowStateListener.js
-java/awt/EventDispatchThread.js
-java/awt/EventFilter.js
-java/awt/EventQueue.js
-java/awt/EventQueueItem.js
-java/awt/FlowLayout.js
-java/awt/FocusTraversalPolicy.js
-java/awt/Font.js
-java/awt/font/FontRenderContext.js
-java/awt/FontMetrics.js
-java/awt/Frame.js
-java/awt/geom/AffineTransform.js
-java/awt/geom/Dimension2D.js
-java/awt/geom/Path2D.js
-java/awt/geom/PathIterator.js
-java/awt/geom/Point2D.js
-java/awt/geom/Rectangle2D.js
-java/awt/geom/RectangularShape.js
-java/awt/geom/RectIterator.js
-java/awt/GraphicsCallback.js
-java/awt/GraphicsConfiguration.js
-java/awt/GraphicsDevice.js
-java/awt/GraphicsEnvironment.js
-java/awt/Image.js
-java/awt/image/ImageObserver.js
-java/awt/Insets.js
-java/awt/ItemSelectable.js
-java/awt/JSComponent.js
-java/awt/JSDialog.js
-java/awt/JSFrame.js
-java/awt/JSPanel.js
-java/awt/KeyboardFocusManager.js
-java/awt/KeyEventDispatcher.js
-java/awt/KeyEventPostProcessor.js
-java/awt/Label.js
-java/awt/LayoutManager.js
-java/awt/LayoutManager2.js
-java/awt/LightweightDispatcher.js
-java/awt/Paint.js
-java/awt/Panel.js
-java/awt/peer/ComponentPeer.js
-java/awt/peer/ContainerPeer.js
-java/awt/peer/FramePeer.js
-java/awt/peer/KeyboardFocusManagerPeer.js
-java/awt/peer/LightweightPeer.js
-java/awt/peer/WindowPeer.js
-java/awt/Point.js
-java/awt/Queue.js
-java/awt/Rectangle.js
-java/awt/RenderingHints.js
-java/awt/Scrollbar.js
-java/awt/ScrollPane.js
-java/awt/Shape.js
-java/awt/Stroke.js
-java/awt/TextArea.js
-java/awt/TextComponent.js
-java/awt/TextField.js
-java/awt/Toolkit.js
-java/awt/Transparency.js
-java/awt/Window.js
-java/beans/ChangeListenerMap.js
-java/beans/PropertyChangeEvent.js
-java/beans/PropertyChangeListener.js
-java/beans/PropertyChangeSupport.js
-java/lang/AbstractStringBuilder.js
-java/lang/Class.js
-java/lang/Enum.js
-java/lang/Iterable.js
-java/lang/reflect/Constructor.js
-java/lang/reflect/Method.js
-java/lang/StringBuffer.js
-java/lang/StringBuilder.js
-java/lang/Thread.js
-java/lang/ThreadGroup.js
-java/math/RoundingMode.js
-java/net/URL.js
-java/net/URLStreamHandlerFactory.js
-java/net/HttpURLConnection.js
-java/net/URLStreamHandler.js
-javax/net/ssl/HttpsUrlConnection.js
-java/text/CharacterIterator.js
-java/text/DecimalFormat.js
-java/text/DecimalFormatSymbols.js
-java/text/DigitList.js
-java/text/FieldPosition.js
-java/text/Format.js
-java/text/NumberFormat.js
-java/util/AbstractCollection.js
-java/util/AbstractList.js
-java/util/AbstractMap.js
-java/util/AbstractSequentialList.js
-java/util/AbstractSet.js
-java/util/ArrayList.js
-java/util/Arrays.js
-java/util/Collection.js
-java/util/Collections.js
-java/util/Comparator.js
-java/util/Deque.js
-java/util/Dictionary.js
-java/util/Enumeration.js
-java/util/EventListener.js
-java/util/EventObject.js
-java/util/HashMap.js
-java/util/HashSet.js
-java/util/Hashtable.js
-java/util/IdentityHashMap.js
-java/util/Iterator.js
-java/util/LinkedHashMap.js
-java/util/LinkedList.js
-java/util/List.js
-java/util/ListResourceBundle.js
-java/util/Locale.js
-java/util/Map.js
-java/util/Objects.js
-java/util/Queue.js
-java/util/Random.js
-java/util/RandomAccess.js
-java/util/ResourceBundle.js
-java/util/Set.js
-java/util/TimSort.js
-java/util/Vector.js
-javajs/api/JSFunction.js
-javajs/util/AjaxURLConnection.js
-javajs/util/AjaxURLStreamHandlerFactory.js
-javajs/util/AU.js
-javajs/util/JSThread.js
-javajs/util/Lst.js
-javajs/util/PT.js
-javajs/util/Rdr.js
-javajs/util/SB.js
-javax/swing/AbstractAction.js
-javax/swing/AbstractButton.js
-javax/swing/AbstractListModel.js
-javax/swing/Action.js
-javax/swing/ActionMap.js
-javax/swing/AncestorNotifier.js
-javax/swing/ArrayTable.js
-javax/swing/border/AbstractBorder.js
-javax/swing/border/BevelBorder.js
-javax/swing/border/Border.js
-javax/swing/border/CompoundBorder.js
-javax/swing/border/EmptyBorder.js
-javax/swing/border/EtchedBorder.js
-javax/swing/border/LineBorder.js
-javax/swing/border/TitledBorder.js
-javax/swing/BorderFactory.js
-javax/swing/BoundedRangeModel.js
-javax/swing/BoxLayout.js
-javax/swing/ButtonGroup.js
-javax/swing/ButtonModel.js
-javax/swing/ClientPropertyKey.js
-javax/swing/ComboBoxModel.js
-javax/swing/DefaultBoundedRangeModel.js
-javax/swing/DefaultButtonModel.js
-javax/swing/DefaultComboBoxModel.js
-javax/swing/DefaultSingleSelectionModel.js
-javax/swing/DropMode.js
-javax/swing/event/AncestorEvent.js
-javax/swing/event/AncestorListener.js
-javax/swing/event/CaretEvent.js
-javax/swing/event/CaretListener.js
-javax/swing/event/ChangeEvent.js
-javax/swing/event/ChangeListener.js
-javax/swing/event/DocumentEvent.js
-javax/swing/event/DocumentListener.js
-javax/swing/event/EventListenerList.js
-javax/swing/event/ListDataEvent.js
-javax/swing/event/ListDataListener.js
-javax/swing/event/UndoableEditEvent.js
-javax/swing/event/UndoableEditListener.js
-javax/swing/FocusManager.js
-javax/swing/InternalFrameFocusTraversalPolicy.js
-javax/swing/LayoutComparator.js
-javax/swing/LayoutFocusTraversalPolicy.js
-javax/swing/SortingFocusTraversalPolicy.js
-javax/swing/SwingContainerOrderFocusTraversalPolicy.js
-javax/swing/SwingDefaultFocusTraversalPolicy.js
-javax/swing/Icon.js
-javax/swing/ImageIcon.js
-javax/swing/InputMap.js
-javax/swing/JApplet.js
-javax/swing/JButton.js
-javax/swing/JCheckBox.js
-javax/swing/JCheckBoxMenuItem.js
-javax/swing/JComboBox.js
-javax/swing/JComponent.js
-javax/swing/JFrame.js
-javax/swing/JLabel.js
-javax/swing/JLayeredPane.js
-javax/swing/JMenu.js
-javax/swing/JMenuBar.js
-javax/swing/JMenuItem.js
-javax/swing/JPanel.js
-javax/swing/JPopupMenu.js
-javax/swing/JRadioButtonMenuItem.js
-javax/swing/JRootPane.js
-javax/swing/JScrollBar.js
-javax/swing/JScrollPane.js
-javax/swing/JSeparator.js
-javax/swing/JTextArea.js
-javax/swing/JTextField.js
-javax/swing/JToggleButton.js
-javax/swing/JViewport.js
-javax/swing/KeyboardManager.js
-javax/swing/KeyStroke.js
-javax/swing/ListModel.js
-javax/swing/LookAndFeel.js
-javax/swing/MenuElement.js
-javax/swing/MutableComboBoxModel.js
-javax/swing/plaf/ActionMapUIResource.js
-javax/swing/plaf/basic/BasicBorders.js
-javax/swing/plaf/BorderUIResource.js
-javax/swing/plaf/ColorUIResource.js
-javax/swing/plaf/ComponentUI.js
-javax/swing/plaf/DimensionUIResource.js
-javax/swing/plaf/FontUIResource.js
-javax/swing/plaf/InputMapUIResource.js
-javax/swing/plaf/InsetsUIResource.js
-javax/swing/plaf/UIResource.js
-javax/swing/RepaintManager.js
-javax/swing/RootPaneContainer.js
-javax/swing/Scrollable.js
-javax/swing/ScrollPaneConstants.js
-javax/swing/ScrollPaneLayout.js
-javax/swing/SingleSelectionModel.js
-javax/swing/SizeRequirements.js
-javax/swing/SwingConstants.js
-javax/swing/SwingPaintEventDispatcher.js
-javax/swing/SwingUtilities.js
-javax/swing/text/AbstractDocument.js
-javax/swing/text/AttributeSet.js
-javax/swing/text/Caret.js
-javax/swing/text/DefaultCaret.js
-javax/swing/text/DefaultEditorKit.js
-javax/swing/text/Document.js
-javax/swing/text/EditorKit.js
-javax/swing/text/Element.js
-javax/swing/text/GapContent.js
-javax/swing/text/GapVector.js
-javax/swing/text/JTextComponent.js
-javax/swing/text/MutableAttributeSet.js
-javax/swing/text/PlainDocument.js
-javax/swing/text/PlainView.js
-javax/swing/text/Position.js
-javax/swing/text/Segment.js
-javax/swing/text/SegmentCache.js
-javax/swing/text/SimpleAttributeSet.js
-javax/swing/text/Style.js
-javax/swing/text/StyleConstants.js
-javax/swing/text/StyleContext.js
-javax/swing/text/TabExpander.js
-javax/swing/text/TextAction.js
-javax/swing/text/Utilities.js
-javax/swing/text/View.js
-javax/swing/tree/TreeNode.js
-javax/swing/UIDefaults.js
-javax/swing/UIManager.js
-javax/swing/undo/AbstractUndoableEdit.js
-javax/swing/undo/CompoundEdit.js
-javax/swing/undo/UndoableEdit.js
-javax/swing/ViewportLayout.js
-javax/swing/WindowConstants.js
-sun/awt/AppContext.js
-sun/awt/AWTAutoShutdown.js
-sun/awt/CausedFocusEvent.js
-sun/awt/ComponentFactory.js
-sun/awt/KeyboardFocusManagerPeerProvider.js
-sun/awt/MostRecentKeyValue.js
-sun/awt/MostRecentThreadAppContext.js
-sun/awt/PaintEventDispatcher.js
-sun/awt/PostEventQueue.js
-sun/awt/RequestFocusController.js
-sun/awt/SunToolkit.js
-sun/awt/WindowClosingListener.js
-sun/awt/WindowClosingSupport.js
-sun/awt/image/DataStealer.js
-sun/awt/image/IntegerComponentRaster.js
-sun/awt/image/IntegerInterleavedRaster.js
-sun/awt/image/SunWritableRaster.js
-sun/font/FontDesignMetrics.js
-sun/swing/DefaultLookup.js
-sun/swing/SwingLazyValue.js
-sun/text/resources/FormatData.js
-sun/text/resources/en/FormatData_en.js
-sun/util/resources/LocaleData.js
-sun/util/locale/BaseLocale.js
-sun/util/locale/LocaleUtils.js
-sun/util/locale/provider/LocaleProviderAdapter.js
-sun/util/locale/provider/LocaleDataMetaInfo.js
-swingjs/a2s/A2SContainer.js
-swingjs/a2s/A2SEvent.js
-swingjs/a2s/A2SListener.js
-swingjs/a2s/Applet.js
-swingjs/a2s/Button.js
-swingjs/a2s/Label.js
-swingjs/a2s/Panel.js
-swingjs/a2s/Scrollbar.js
-swingjs/a2s/ScrollPane.js
-swingjs/a2s/TextArea.js
-swingjs/a2s/TextField.js
-swingjs/api/Interface.js
-swingjs/api/js/DOMNode.js
-swingjs/api/js/HTML5CanvasContext2D.js
-swingjs/api/js/JSInterface.js
-swingjs/jquery/JQueryUI.js
-swingjs/JSApp.js
-swingjs/JSAppletThread.js
-swingjs/JSAppletViewer.js
-swingjs/JSFocusPeer.js
-swingjs/JSFontMetrics.js
-swingjs/JSFrameViewer.js
-swingjs/JSGraphics2D.js
-swingjs/JSGraphicsConfiguration.js
-swingjs/JSGraphicsEnvironment.js
-swingjs/JSImage.js
-swingjs/JSImagekit.js
-swingjs/JSMouse.js
-swingjs/JSNullComponentPeer.js
-swingjs/JSScreenDevice.js
-swingjs/JSThreadGroup.js
-swingjs/JSToolkit.js
-swingjs/JSUtil.js
-swingjs/plaf/ButtonListener.js
-swingjs/plaf/DefaultMenuLayout.js
-swingjs/plaf/HTML5LookAndFeel.js
-swingjs/plaf/JSAppletUI.js
-swingjs/plaf/JSButtonUI.js
-swingjs/plaf/JSCheckBoxMenuItemUI.js
-swingjs/plaf/JSCheckBoxUI.js
-swingjs/plaf/JSComboBoxUI.js
-swingjs/plaf/JSComponentUI.js
-swingjs/plaf/JSEventHandler.js
-swingjs/plaf/JSFrameUI.js
-swingjs/plaf/JSGraphicsUtils.js
-swingjs/plaf/JSLabelUI.js
-swingjs/plaf/JSLayeredPaneUI.js
-swingjs/plaf/JSLightweightUI.js
-swingjs/plaf/JSMenuBarUI.js
-swingjs/plaf/JSMenuItemUI.js
-swingjs/plaf/JSMenuUI.js
-swingjs/plaf/JSPanelUI.js
-swingjs/plaf/JSPopupMenuSeparatorUI.js
-swingjs/plaf/JSPopupMenuUI.js
-swingjs/plaf/JSRadioButtonMenuItemUI.js
-swingjs/plaf/JSRadioButtonUI.js
-swingjs/plaf/JSRootPaneUI.js
-swingjs/plaf/JSScrollBarUI.js
-swingjs/plaf/JSScrollPaneUI.js
-swingjs/plaf/JSSeparatorUI.js
-swingjs/plaf/JSSliderUI.js
-swingjs/plaf/JSTextAreaUI.js
-swingjs/plaf/JSTextFieldUI.js
-swingjs/plaf/JSTextUI.js
-swingjs/plaf/JSTextViewUI.js
-swingjs/plaf/JSViewportUI.js
-swingjs/plaf/JSWindowUI.js
-swingjs/plaf/LazyActionMap.js
-swingjs/plaf/Resizer.js
-swingjs/plaf/TextListener.js
-
-
+++ /dev/null
-Notes
-=====
-
----IMPORTANT CHARACTER SET NOTE---
-
-It is critical that all development work in Java2Script
-be done in UTF-8. This means:
-
-- making sure your Eclipse project is set up for UTF-8 (not the Eclipse default?)
-- making sure your server can serve up UTF-8 by default for any browser-loaded files
-- making sure you don't edit a Java2Script class file or one of the site .js files
- using a non-UTF-8 editor. It may replace non-Latin characters with "?" or garbage.
-- making sure that your web pages are delivered with proper headings indicating HTML5 and UTF-8
-
-<!DOCTYPE html>
-<html>
-<head>
-<meta charset="utf-8">
-
-Note that the DOCTYPE tag is critical for some browsers to switch into HTML5 mode. (MSIE?)
-
-
-
-
-In particular, the Mandarin character 秘 (mi; "secret") is used extensively throughout
-the SwingJS class files to distinguish j2s-specific fields and methods that must not
-ever be shadowed or overridden by subclasses. For example, we see in java.lang.Thread.java:
-
- public static JSThread 秘thisThread;
-
-----------------------------------
-
-
-updated 3/21/2020 -- adds note about HashMap, Hashtable, and HashSet iterator ordering
-updated 3/20/2020 -- adds note about interning, new String("xxx"), and "xxx"
-updated 2/26/2020 -- adds Graphics.setClip issue
-updated 12/22/19 -- additional issues
-updated 11/03/19 -- adds information about File.exists() and points to src/javajs/async
-updated 10/26/19 -- adds information about File.createTempFile()
-updated 8/16/19 -- minor typos and added summary paragraph
-updated 7/19/19 -- clarification that AWT and Swing classes are supported directly
-updated 5/13/19 -- Mandarin U+79D8 reserved character; Missing Math methods; int and long
-updated 5/10/19 -- adds a section on static issues in multi-(duplicate)-applet pages
-updated 1/4/19 -- nio
-updated 9/15/18 -- adds integer 1/0 == Infinity
-updated 7/24/18 -- most classes replaced with https://github.com/frohoff/jdk8u-jdk
-updated 6/5/17 -- reserved package name "window"
-updated 3/11/17 -- myClass.getField
-updated 3/7/17 -- overloading of JSplitPane.setDividerLocation
-updated 3/2/17 -- more indication of classes not implemented (KeyListener)
-
-=============================================================================
-SwingJS and OpenJDK 8+
-=============================================================================
-
-SwingJS implements a wide range of the Java language in JavaScript. The base
-version for this implementation is OpenJDK8. some classes are implemented using
-older source code, and there are some missing methods. For the most part, this is
-no real problem. You can add or modify any java class just be adding it as source
-in your project. Or (preferably) you can contact me, and I can get it into the
-distribution. Or (even more preferably) you can do that via a patch submission.
-
-=================
-DESIGN PHILOSOPHY
-=================
-
-The java2script/SwingJS design goal is to recreate a recognizable, easily debuggable
-equivalent in JavaScript for as much of Java as practical. This means, for example,
-that one can call in JavaScript
-
- new java.util.Hashtable()
-
-and for all practical purposes it will appear that Java is running.
-
-
-Method and Field Disambiguation
--------------------------------
-
-SwingJS has no problem with the overloading of methods, for example:
-
- public void print(int b);
- public void print(float b);
-
-JavaScript does not allow overloading of methods, and the common practice in
-Java of naming a field the same as a method -- isAllowed and isAllowed() -- is
-not possible in JavaScript. As a result, SwingJS implements "fully-qualified"
-method names using "$" parameter type separation. Thus, these methods in SwingJS
-will be referred to as print$I and print$F. The rules for this encoding are
-relatively simple:
-
-1. The seven primitive types in Java are encoded $I (int), $L (long), $F (float),
-$D (double), $B (byte) $Z (boolean), and $H (short).
-
-2. String and Object are encoded as $S and $O, respectively.
-
-3. "java_lang_" is dropped for all other classes in the java.lang package (as in Java).
- For example: $StringBuffer, not $java_lang_StringBuffer
-
-4. All other classes are encoded as
-
- "$" + Class.getName().replace(".","_")
-
-For example, in Java we see:
-
- public void equals(Object o) {...}
-
-Whereas in SwingJS we have:
-
- Clazz.newMeth(C$, 'equals$O', function (o) {...}
-
-And
-
- this.getContentPane().add(bar, "North");
-
-becomes
-
- this.getContentPane$().add$java_awt_Component$O(bar, "North");
-
-5. Arrays are indicated with appended "A" for each level. So
-
- setDataVector(Object[][] dataVector, Object[] columnIdentifiers)
-
-becomes
-
- setDataVector$OAA$OA(dataVector, columnIdentifiers)
-
-(It is recognized that this design does introduce a bit of ambiguity, in that
- in principal there could be user class named XA and X in the same package,
- and methods a(X[]) and a(XA) in the same class that cannot be distinguished.
- The benefit of this simple system, however, triumphed over the unlikelyhood
- of that scenario.) The transpiler could be set to flag this possibility.
-
-6. Constructors are prepended with "c$". So
-
- public JLabel(String text) {...}
-
-becomes:
-
- Clazz.newMeth(C$, 'c$$S', function (text) {...});
-
-Field disambiguation involves prepending. In Java, a class and its subclass
-can both have the same field name, such as
-
- boolean visible;
-
-When this happens, it is called "shadowing", and though not recommended, Java allows
-it. The Java2Script transpiler will prepend such shadowing fields with "$" so that the
-subclass instance has both "visible" (for use in its methods inherited from its
-superclass) and "$visible" (for its own methods). Thus, we might see in Java:
-
- this.visible = super.visible;
-
-while in SwingJS we will see:
-
- this.$visible=this.visible;
-
-since JavaScript does not have the "super" keyword.
-
-
-
-Parameterless methods such as toString() are appended with "$" to become toString$().
-The one exception to this rule is private methods, which are saved in (truly) private
-array in the class (and are not accessible by reflection). Private parameterless
-methods retain their simple Java name, since they cannot conflict with field names.
-
-This renaming of methods has a few consequences, which are discussed more fully below.
-See particularly the section on "qualified field and method names", where it is described
-how you can use packages or classes or interfaces with ".api.js" in them to represent JavaScript
-objects for which all method names are to be left unqualified. Note that it is not
-possible to cherry-pick methods to be unqualified; only full packages, classes or
-interfaces can hold this status.
-
-The swingjs.api.js package in particular contains a number of useful interfaces that
-you can import into your project for JavaScript-specific capabilities.
-
-
-Applet vs. Application
-----------------------
-
-One of the very cool aspects of SwingJS is that it doesn't particularly matter if a browser-based
-Java app is an "applet" or an "application". We don't need JNLP (Java Network Launch Protocol)
-because now we can just start up any Java application in a browser just as easily as any applet.
-The associative array that passes information to the SwingJS applet (information that formerly
-might have been part of the APPLET tag, such as width, height, and codebase, always referred to
-in our writing as "the Info array") allows the option to specify the JApplet/Applet "code"
-class or the application "main" class. Either one will run just fine.
-
-
-Performance
------------
-
-Obviously, there are limitations. One is performance, but we have seen reproducible
-performance at 1/6 - 1/3 the speed of Java. Achieving this performance may require
-some refactoring of the Java to make it more efficient in both Java and JavaScript.
-"for" loops need to be more carefully crafted; use of "new" and "instanceof" need to be
-minimized in critical areas. Note that method overloading -- that is, the same method name
-with different parameters, such as read(int) and read(byte) -- is no longer any problem.
-
-
-Threads
--------
-
-Although there is only a single thread in JavaScript, meaning Thread.wait(), Thread.sleep(int) and
-Thread.notify() cannot be reproduced, we have found that this is not a serious limitation.
-For example, javax.swing.Timer() works perfectly in JavaScript. All it means is that threads
-that use sleep(int) or notify() must be refactored to allow Timer-like callbacks. That is,
-they must allow full exit and re-entry of Thread.run(), not the typical while/sleep motif.
-
-The key is to create a state-based run() that can be exited and re-entered in JavaScript.
-
-
-Static fields
--------------
-
-Final static primitive "constant" fields (String, boolean, int, etc.) such as
-
-static final int TEST = 3;
-static final String MY_STRING = "my " + "string";
-
-are converted to their primitive form automatically by the Eclipse Java compiler
-and do not appear in the JavaScript by their names.
-
-Other static fields are properties of their class and can be used as expected.
-
-Note, however, that SwingJS runs all "Java" code on a page in a common "jvm"
-(like older versions of Java). So, like the older Java schema, the JavaScript
-equivalents of both applets and applications will share all of their static
-fields and methods. This includes java.lang.System.
-
-Basically, SwingJS implementations of Java run in a browser page-based sandbox
-instead of an applet-specific one.
-
-In general, this is no problem. But if we are to implement pages with
-multiple applets present, we must be sure to only have static references
-that are "final" or specifically meant to be shared in a JavaScript
-environment only (since they will not be shared in Java).
-
-A simple solution, if static non-constant references are needed, is to attach the
-field to Thread.currentThread.threadGroup(), which is an applet-specific reference.
-Be sure, if you do this, that you use explicit setters and getters:
-
-For example,
-
-private static String myvar;
-
-...
-
-public void setMyVar(String x) {
- ThreadGroup g = Thread.currentThread().threadGroup();
- /**
- * @j2sNative g._myvar = x;
- *
- */
- {
- myvar = x;
- }
-}
-
-public String getMyVar() {
- ThreadGroup g = Thread.currentThread().threadGroup();
- /**
- * @j2sNative return g._myvar || null;
- *
- */
- {
- return myvar;
- }
-}
-
- in Java will get and set x the same in JavaScript and in Java.
-
-
-A convenient way to do this in general is to supply a singleton class with
-explicitly private-only constructors and then refer to it in Java and in JavaScript
-instead of using static field, referring to myclass.getIntance().xxx instead of
-myclass.xxx in Java (and JavaScript).
-
-This was done extensively in the Jalview project. See jalview.bin.Instance.
-
-
-Helper Packages -- swingjs/ and javajs/
----------------------------------------
-
-The SwingJS library is the swingjs/ package. There are interfaces that may be of assistance
-in swingjs/api, but other than that, it is not recommended that developers access classes in
-this package. The "public" nature of their methods is really an internal necessity.
-
-In addition to swingjs/, though, there are several useful classes in the javajs/ package
-that could be very useful. This package is a stand-alone package that can be
-cloned in any Java project that also would be great to have in any JavaScript project
--- SwingJS-related or not. Functionality ranges from reading and writing various file
-formats, including PDF, BMP, PNG, GIF, JPG, JSON, ZIP, and CompoundDocument formats.
-
-A variety of highly efficient three- and four-dimensional point, vector, matrix, and
-quaternion classes are included, as they were developed for JSmol and inherited from that
-project.
-
-Of particular interest should be javajs/async/, which includes
-
-javajs.async.Async
-javajs.async.AsyncColorChooser
-javajs.async.AsyncDialog
-javajs.async.AsyncFileChooser
-
-See javajs.async.Async JavaDoc comments for a full description of
-these useful classes.
-
-
-Modal Dialogs
--------------
-
-Although true modal dialogs are not possible with only one thread, a functional equivalent --
-asynchronous modal dialogs -- is relatively easy to set up. All the JOptionPane dialogs will
-return PropertyChangeEvents to signal that they have been disposed of and containing the results.
-See below and classes in the javajs.async package.
-
-
-Native calls
-------------
-
-Native calls in Java are calls to operating system methods that are not in Java. JavaScript
-has no access to these, of course, and they must all be replaced by JavaScript equivalents.
-Fortunately, they are not common, and those that are present in Java (for example, in calculating
-checksums in ZIP file creation) are at a low enough level that most developers do not utilize them
-or do not even have access to them. All native calls in Java classes have been replaced by
-Java equivalents.
-
-
-Swing GUI Peers and UIClasses
------------------------------
-
-One of the biggest adaptations introduced in SwingJS is in the area of the graphical
-user interface. The issue here is complex but workable. In Java there are two background
-concepts -- the Component "peer" (one per "heavy-weight" component, such as a Frame) and the
-component "uiClass" (one per component, such as JButton or JTextField).
-
-Peers are native objects of the operating system. These are the virtual buttons and text areas
-that the user is interacting with at a very base level. Their events are being passed on to
-Java or the browser by the operating system. UI classes provide a consistent "look and feel"
-for these native objects, rendering them onto the native window canvas and handling all
-user-generated events. They paint the borders, the backgrounds, the highlights, of every
-control you see in Java. There is one-to-one correspondence of Swing classes and UI classes.
-Setting the Look and Feel for a project amounts to selecting the directory from which to draw
-these UI classes. The UI classes can be found in the javax.swing.plaf ("platform look and feel")
-package.
-
-Early on in the development of SwingJS, we decided not to fully reproduce the painfully detailed
-bit-by-bit painting of controls as is done in Java. Instead, we felt it was wiser to utilize the standard
-HTML5 UI capabilities as much as possible, using DIV, and INPUT especially, with extensive use
-of CSS and sometimes jQuery (menus, and sliders, for example). Thus, we have created a new
-set of UIs -- the "HTML5 Look and Feel". These classes can be found in swingjs.plaf. Besides being
-more adaptable, this approach allows far more versatility to SwingJS developers, allowing them
-to modify the GUI to suit their needs if desired.
-
-In SwingJS, since we have no access to native peers except through the browser DOM,
-it seemed logical to merge the peer and UI idea. So instead of having one peer per heavy-weight control and
-one UI class instance for each control type, we just have one UI class instance per control, and
-that UI class instance is what is being referred to when a "peer" is notified.
-
-In some ways this is a throw back to when all of Swing's components were subclasses of
-specific AWT components such as Button and List. These "heavy-weight components" all had their
-own individual native peers and thus automatically took on the look and feel provided by the OS.
-Later Swing versions implemented full look and feel for all peers, leaving only JDialog, JFrame,
-and a few other classes to have native peers. But in SwingJS we have again a 1:1 map of component
-and UI class/peer instance.
-
-The origin of most issues (read "bugs") in relation to the GUI will probably be found in the
-swingjs.plaf JSxxxxUI.java code.
-
-
-Swing-only Components -- no longer an issue
--------------------------------------------
-
-Swing was introduced into Java well after the Java Abstract Window Toolkit (AWT) was well
-established. As such, its designers chose to allow AWT controls such as Button and List to be used
-alongside their Swing counterparts JButton and JList. Reading the code, it is clear that this
-design choice posed a huge headache for Swing class developers.
-
-For SwingJS, we decided from the beginning NOT to allow this mixed-mode programming and
-instead to require that all components be Swing components.
-
-However, this is no longer an issue. All AWT components in SwingJS are now subclasses of
-javax.swing.JComponent. So far, we have found no problem with this.
-
-
-The a2s Adapter Package
------------------------
-
-Originally, we thought that we would restrict ourselves to JApplets only. That is, only
-Swing-based applets. But as we worked, we discovered that there are a lot of great
-applets out there that are pre-Swing pure-AWT java.applet.Applet applets. Our problem was
-that we also wanted it to be possible to quickly adapt these applets to JavaScript as well.
-
-The solution turned out to be simple: Write a package (a2s) that recreates the interface for
-non-Swing components as subclasses of Swing components. Thus, a2s.Button subclasses javax.swing.JButton
-but also accepts all of the methods of java.awt.Button. This works amazingly well, with a few
-special adaptations to the core javax.swing to be "AWT-aware." All AWT components now subclass
-a2s components, which in turn subclass JComponents. So no changes in code are necessary. We have
-successfully transpiled over 500 applets using this strategy. (Kind of surprising, actually, that
-the original Java developers did not see that option. But we have a hindsight advantage here.)
-
-
-Working with Files
-==================
-
-Simple String file names are not optimal for passing information about
-read files within SwingJS applications.
-
-All work with files should either use Path or File objects exclusively.
-These objects, after a file is read or checked for existence, will already
-contain the file byte[] data. Doing something like this:
-
-File f = File("./test.dat");
-boolean isOK = f.exists();
-
-will load f with its byte[] data, if the file exists.
-
-But if after that, we use:
-
-File f2 = new File(f.getAbsolutePath());
-
-f2 will not contain that data. Such copying should be done as:
-
-File f2 = new File(f);
-
-in which case, the byte[] data will be transferred.
-
-
-SwingJS uses the following criteria to determine if File.exists() returns true:
-
-(1) if this File object has been used directly to read data, or
-(2) if reading data using this File object is successful.
-
-Note that you cannot check to see if a file exists before input or if it
-was actually written or if it already exists prior to writing in SwingJS.
-
-Thus, you should check each use of file.exists() carefully, and if necessary, provide a J2sNative
-block that gives an appropriate "OK" message, for example:
-
-(/** @j2sNative 1 ? false : */ outputfile.exits())
-
-or
-
-(/** @j2sNative 1 ? true : */ inputfile.exits())
-
-Temporary files can be created in SwingJS. SwingJS will maintain a pseudo-filesystem for files
-created with File.createTempFile(). This is useful in that closure of writing to a temporary file
-does not generate a pseudo-download to the user's machine.
-
-
-UNIMPLEMENTED CLASSES BY DESIGN
-===============================
-
-The SwingJS implementation of the following classes are present
-in a way that gracefully bypasses their functionality:
-
-accessibility
-security
-serialization
-
-
-
-TODO LIST FOR UNIMPLEMENTED CLASSES
-===================================
-
-JEditorPane (minimal implementation) - DONE 12/2018; some issues still
-JSplitPane - DONE 8/2018
-JTabbedPane - DONE 10/2018
-JTree - done 12/2019
-
-
-MINOR ISSUES--required some rewriting/refactoring by Bob and Udo
-================================================================
-
-Thread.currentThread() == dispatchThread
-
-
-MINOR ISSUES--requiring some rewriting/refactoring outside of SwingJS
-=====================================================================
-
-See below for a full discussion.
-
-HashMap, Hashtable, and HashSet iterator ordering
-interning, new String("xxx") vs "xxx"
-Names with "$" and "_"
-positive integers do not add to give negative numbers
-ArrayIndexOutOfBounds
-java.awt.Color
-native methods
-javax.swing.JFileDialog
-key focus
-LookAndFeel and UI Classes
-System.exit(0) does not stop all processes
-list cell renderers must be JComponents
-myClass.getField not implemented
-"window" and other reserved JavaScript names
-reserved field and method names
-qualified field and method names
-missing Math methods
-Component.getGraphics(), Graphics.dispose()
-Graphics.setClip()
-
-MAJOR ISSUES--for Bob and Udo within SwingJS
-============================================
-
-fonts
-OS-dependent classes
-AWT component peers
-some aspects of reflection
-
-MAJOR ISSUES--to be resolved by implementers
-============================================
-
-fonts
-threads
-modal dialogs
-image loading
-BigDecimal not fully implemented
-no format internationalization
-no winding rules
-text-related field implementation
-Formatter/Regex limitations
-integer 1/0 == Infinity
-
-========================================================================
-
-DISCUSS
-=======
-
-Table row/col sorter needs checking after removal of java.text.Collator references
-
-I had to move all of SunHints class to RenderingHints, or the
-two classes could not be loaded. Shouldn't be a problem, I think. The sun classes are
-not accessible to developers in Java anyway, since they are generally package private.
-
-==========================================================================
-
-//////////////////////////////////////////////////////////////////////////////
-
-UNIMPLEMENTED CLASSES
-=====================
-
-accessibility
--------------
-
-All Accessibility handling has been commented out to save the download footprint.
-This removes the need for sun.misc.SharedSecrets as well.
-Nothing says we could not implement accessibility. We just didn't.
-
-
-security
---------
-
-All JavaScript security is handled by the browser natively.
-Thus, Java security checking is no longer necessary, and
-java.security.AccessController has been simplified to work without
-native security checking.
-
-Note that private methods in a class are REALLY private.
-
-
-serialization
--------------
-
-All serialization has been removed. It was never very useful for Swing anyway,
-because one needs exactly the same Java version to save and restore serialized objects.
-
-
-keyboard accelerators and mnemonics
------------------------------------
-
-This work was completed in the spring of 2019. Note that in a browser, some
-key strokes, particularly CTRL-keys, are not available. Bummer.
-
-
-MINOR ISSUES--required some rewriting/refactoring by Bob and Udo
-================================================================
-
-
-Thread.currentThread() == dispatchThread
-----------------------------------------
-
-changed to JSToolkit.isDispatchThread()
-
-
-MINOR ISSUES--requiring some rewriting/refactoring outside of SwingJS
-=====================================================================
-
-HashMap, Hashtable, and HashSet iterator ordering
--------------------------------------------------
-
-In Java, iterators for HashMap, Hashtable, and HashSet do not guarantee any particular order.
-From the HashMap documentation for Java 8:
-
- This class makes no guarantees as to the order of the map; in particular, it does not
- guarantee that the order will remain constant over time.
-
-Likewise, for HashSet (because it is simply a convenience method for HashMap<Object,PRESENT>:
-
- [HashSet] makes no guarantees as to the iteration order of the set.
-
-JavaScript's Map object is different. It is basically a LinkedHashMap, so it guarantees iteration
-in order of object addition.
-
-Starting with java2script 3.2.9.v1, these classes use the JavaScript Map object rather than hash codes
-whenever all keys are strictly of JavaScript typeof "string". If any key is introduced that is not a string, the
-implementation falls back to using hash codes, the same as Java.
-
-Note strings created using new String("xxxx") are NOT typeof "string"; they are typeof "object".
-
-The result is significantly faster performance (3-12 x faster) than originally, and up to 3 x faster
-performance in JavaScript than in Java itself. Right. Faster than Java.
-
-The JavaScript Map implementation is implemented UNLESS the constructor used is the one that
-specifies both initial capacity and load factor in their constructor. Thus,
-
-new Hashtable()
-new HashMap()
-new HashMap(16)
-new HashSet()
-
-all use the JavaScript Map. But
-
-new Hashtable(11, 0.75f)
-new HashMap(16, 0.75f)
-new HashSet(16, 0.75f)
-
-do not.
-
-This design allows for opting out of the JavaScript Map use in order to retain the exact behavior of
-iterators in JavaScript as in Java.
-
-
-interning, new String("xxx") vs "xxx"
--------------------------------------
-
-Note that the following are true in JavaScript:
-
-typeof new String("xxxx") == "object"
-typeof "xxxx" == "string"
-var s = "x";typeof ("xxx" + s) == "string"
-
-There is no equivalence to this behavior in Java, where a String is a String is a String.
-
-Be aware that SwingJS does not always create a JavaScript String object using JavaScript's
-new String(...) constructor. It only does this for Java new String("xxxx") or new String(new String()).
-
-In all other cases, new String(...) (in Java) results in a simple "xxxx" string in JavaScript.
-That is, it will be JavaScript typeof "string", not typeof "object".
-
-The reason for this design is that several classes in the Java core use toString()
-methods that return new String(), and those classes that do that would cause a JavaScript error
-if implicitly stringified if new String() returned a JavaScript String object.
-
-This is fine in JavaScript
-
-test1 = function() { return { toString:function(){ return "OK" } } }
-"testing" + new test1()
->> "testingOK"
-
-But for whatever reason in JavaScript:
-
-test2 = function() { return { toString:function(){ return new String("OK") } } }
-"testing" + new test2()
->> Uncaught TypeError: Cannot convert object to primitive value
-
-The lesson here is never to use
-
- return new String("...");
-
-in a Java toString() method. In Java it will be fine; in JavaScript it will also be fine as long as
-that method is never called in JavaScript implicitly in the context of string concatenation.
-
-A note about interning. Consider the following six Java constructions, where we have a == "x";
-
-"xxx"
-"xx" + "x"
-new String("xxx").intern()
-
-new String("xxx")
-"xx" + a.toString()
-"xx" + a
-
-All six of these will return java.lang.String for .getClass().getName().
-However, the first three are String literals, while the last three are String objects.
-Thus:
- "xxx" == "xxx"
- "xxx" == "xx" + "x"
- "xxx" == new String("xxx").intern()
-
-but none of the other three are equivalent to "xxx" or each other:
-
- "xxx" != new String("xxx")
- "xxx" != "xx" + a.toString()
- "xxx" != "xx" + a
- new String("xxx") != new String("xxx")
- "xx" + a != new String("xxx")
-
-etc.
-
-As in Java, in SwingJS, all of the following Java assertions pass as true:
-
- assert("xxx" == "xx" + "x");
- assert("xxx" == ("xx" + a).intern());
- assert("xxx" === new String("xxx").intern());
-
-and both of these do as well:
-
- assert(new String("xxx") != "xxx");
- assert(new String("xxx") != new String("xxx"));
-
-But the following two fail to assert true:
-
- assert("xxx" != "xx" + a);
- assert("xxx" != "xx" + a.toString());
-
-because in JavaScript, both of these right-side expressions evaluate to a simple "interned" string.
-
-In Java, however, these assertions are true because Java implicitly "boxes" String
-concatentaion as a String object, not a literal.
-
-Most of us know not to generally use == with Strings unless they are explicitly interned.
-Where this problem may arise, though, is in IdentityHashMap, which compares objects using
-System.identityHashCode(), which is not the same for different objects or their string literal equivalents.
-
-My recommendation, if you need to use IdentityHashMap with strings is to always use an explicit String.intern()
-for any keys -- unless you really want to keep every string as separate keys even if they are the same sequence,
-in which case, use new String(). This will work in Java and in JavaScript.
-
-Be aware when working with strings that come from SwingJS and are being used by other JavaScript modules
-that those that are String objects will return "object" for the JavaScript typeof operator, not "string".
-
-The easy way to ensure this is no problem is to concatenate strings with "" to force immediate interning:
-
- var x = aJavaObject.getString() + "";
-
-unless you are certain that the string is being returned is a raw JavaScript string.
-
-Names with "$" and "_"
-----------------------
-
-For the most part, this should be no problem.
-
-Note that the use of $ and _ in Java field names has always been discouraged:
-[https://docs.oracle.com/javase/tutorial/java/nutsandbolts/variables.html]
-
- You may find some situations where auto-generated names will contain the dollar sign,
- but your variable names should always avoid using it. A similar convention
- exists for the underscore character; while it's technically legal to begin your
- variable's name with "_", this practice is discouraged.
-
-Some impacts of transpiling method names with full qualification:
-
-1) SwingJS will introduce fields that start with $ or _. These will not conflict
- if the above convention is followed.
-
-2) Fields that have the same Java name as a method are not an issue.
-
-3) Fields that have a Java name with $ that matches a transpiled method name,
- such as toString$, will need to be refactored in Java to not have that name collision.
-
-4) Fields in a subclass that have the same name as private fields in a superclass
- represent a name collision, because the superclass method needs to call its private
- field even if invoked from a subclass. The solution was to modify the subclass field
- name using one or more prepended $.
-
-5) Use of Class.getDeclaredMethods() reflection will return Method objects having the transpiled
- name, not the Java name. This could require some j2sNative adjustment
- to strip the $... parameters from the name if that is needed.
-
-6) Use of Method.getParameterTypes() should work fine, provided class names
- do not contain "_". This is because the transpiler converts "." to "_" when
- creating the fully qualified JavaScript name.
-
-
-positive integers do not add to give negative numbers
------------------------------------------------------
-
-In Java, the following is true:
-
- 2000000000 + 2000000000 == -294967296
-
-But in SwingJS, that will be 4000000000. So, for example, the following
-strategy will fail in SwingJS:
-
- int newLength = lineBuf.length * 2;
- if (newLength < 0) {
- newLength = Integer.MAX_VALUE;
- }
-
-"-1" in JavaScript is not 0xFFFFFFFF.
-
-And one must take care to not compare a negative number with a 32-bit mask. So
-
-(b & 0xFF000000) == 0xFF000000
-
-is true in Java for (int) b = -1, but is false in JavaScript, because 0xFF000000 is 4278190080,
-while (-1 & 0xFF000000) is, strangely enough, -16777216, and, in fact,
-
-(0xFF000000 & 0xFF000000) != 0xFF000000
-
-because -16777216 is not 4278190080.
-
-The fix is that one must compare similar operations:
-
-if ((b & 0xFF000000) == (0xFF000000 & 0xFF000000)) .....
-
-Importantly, the JavaScript Int32Array does behave properly. From
-the Firefox developer console:
-
->> x = new Int32Array(1)
-<- Int32Array(1) [ 0 ]
->> x[0] = 4000000000
-<- 4000000000
->> x[0]
-<- -294967296
-
-Notice that, perhaps unexpectedly, the following two constructs produce
-different results in JavaScript:
-
-x = new Int32Array(1);
-b = x[0] = 4000000000;
-
-(b will be 4000000000)
-
-and
-
-x = new Int32Array(1);
-x[0] = 4000000000;
-b = x[0];
-
-(b will be -294967296)
-
-
-SwingJS leverages array typing to handle all byte and short arithmetic so as
-to ensure that any byte or short operation in JavaScript does give the same
-result in Java. The design decision to not also do this with integer math was
-a trade-off between performance and handling edge cases.
-
-
-ArrayIndexOutOfBounds
----------------------
-
-You cannot implicitly throw an ArrayIndexOutOfBoundsException in JavaScript.
-JavaScript will simply return "undefined", not throw an Exception. So:
-
-boolean notAGoodIdeaIsOutOfBounds(String[] sa, int i) {
- try {
- return (sa[i] == sa[i]);
- } catch (ArrayIndexOutOfBoundsException e) {
- return false;
- }
-}
-
-will work in Java but not in JavaScript. Code should not depend upon this sort
-of trap anyway, if you ask me.
-
-Throwable vs Error vs Exception
--------------------------------
-
-True JavaScript errors are trapped as Throwable, whereas you can still trap
-Error and Exception as well. So if you want to be sure to catch any JavaScript
-error, use try{}catch (Throwable t){}, not try{}catch (Exception e){}.
-
-j
-ava.awt.Color
---------------
-
-ColorSpace: only "support" CS_sRGB.
-
- TODO -- any volunteers??
-
-
-javax.swing.JFileDialog
------------------------
-
-HTML5 cannot expose a file reading directory structure. But you certainly
-can still do file reading and writing. It just works a little differently.
-It's a simple modification:
-
- b = new JButton("FileOpenDialog");
- b.addActionListener(new ActionListener() {
-
- @Override
- public void actionPerformed(ActionEvent e) {
- JFileChooser fc = new JFileChooser();
- Test_Dialog.this.onDialogReturn(fc.showOpenDialog(Test_Dialog.this));
- // Java will wait until the dialog is closed, then enter the onDialogReturn method.
- // JavaScript will exit with NaN immediately, and then call back with its actual value
- // asynchronously.
- }
-
- });
-
- public void onDialogReturn(int value) {
- if (value != Math.floor(value))
- return; // in JavaScript, this will be NaN, indicating the dialog has been opened
- // If we are here, the dialog has closed, in both Java and JavaScript.
- System.out.println("int value is " + value);
- }
-
-
- @Override
- public void propertyChange(PropertyChangeEvent event) {
- Object val = event.getNewValue();
- String name = event.getPropertyName();
- System.out.println(name);
- switch (event.getSource().getClass().getName()) {
- case "javax.swing.JOptionPane":
- switch (name) {
- case "inputValue":
- onDialogReturn(val);
- return;
- case "value":
- if (val instanceof Integer)
- onDialogReturn(((Integer) val).intValue());
- else
- onDialogReturn(val);
- return;
- }
- break;
- case "javax.swing.ColorChooserDialog":
- switch (name) {
- case "SelectedColor":
- onDialogReturn(val);
- return;
- }
- break;
- case "javax.swing.JFileChooser":
- switch (name) {
- case "SelectedFile":
- File file = (File) val;
- byte[] array = (val == null ? null : /** @j2sNative file.秘bytes || */
- null);
- onDialogReturn("fileName is '" + file.getName() + "'\n\n" + new String(array));
- return;
- }
- break;
- }
- System.out.println(
- event.getSource().getClass().getName() + " " + event.getPropertyName() + ": " + event.getNewValue());
- }
-
-
-Developers are encouraged to create a separate class that handles general calls to JFileDialog.
-An example class can be found in the SwingJS distribution as
-
-/sources/net.sf.j2s.java.core/src/javajs/async/AsyncFileChooser.java.
-
-
-javax.swing.JOptionPane dialogs
--------------------------------
-
-For this action to work, the parentComponent must implement
-propertyChangeListener, and any call to JOptionPanel should allow for
-an asynchronous response, meaning that there is no actionable code following the
-call to the dialog opening.
-
-In addition, for compatibility with the Java version, implementation should
-wrap the call to getConfirmDialog or getOptionDialog in a method call to
-handle the Java:
-
-onDialogReturn(JOptionPane.showConfirmDialog(parentFrame,
-messageOrMessagePanel, "title", JOptionPane.OK_CANCEL_OPTION));
-
-Then parentFrame.propertyChange(event) should also call onDialogReturn.
-
-This will then work in both Java and JavaScript.
-
-Note that there is an int and an Object version of onDialogReturn().
-
-
-In JavaScript:
-
-The initial return from JOptionPane.showConfirmDialog and showMessageDialog
-will be (SwingJS) JDialog.ASYNCHRONOUS_INTEGER (NaN), testable as an impossible
-Java int value using ret != -(-ret) if the parent implements PropertyChangeListener, or -1
-(CLOSE_OPTION) if not.
-
-For showOptionDialog (which returns Object) or showInputDialog (which returns
-String), the initial return will be (SwingJS) JDialog.ASYNCHRONOUS_OBJECT, testable as
-((Object) ret) instanceof javax.swing.plaf.UIResource if the parent implements
-PropertyChangeListeneer, or null if not.
-
-The second return will be the desired return.
-
-In Java:
-
-The initial return will be the one and only modal final return.
-
-
-
-For full compatibility, The calling method must not continue beyond this
-call.
-
-All of the standard Java events associated with Components are also
-available.
-
-Certain fall back mechanisms are possible, where onReturn does not exist, but
-only for the following cases:
-
-
-For showMessageDialog, for WARNING_MESSAGE and ERROR_MESSAGE, a simple
-JavaScript alert() is used, returning 0 (OK_OPTION) or -1 (CLOSED_OPTION).
-
-For showInputDialog, if the message is a string, a simple JavaScript prompt()
-with input box is used, returning the entered string or null.
-
-For showConfirmDialog, a simple JavaScript confirm() is used, in which case:
-
-for YES_NO_OPTION: YES_OPTION or NO_OPTION
-
-for YES_NO_CANCEL_OPTION: YES_OPTION or CANCEL_OPTION
-
-for OK_CANCEL_OPTION or any other: OK_OPTION or CANCEL_OPTION
-
-Note that you should implement a response for CLOSED_OPTION for
-showConfirmDialog. For other dialogs, a null return indicates the dialog was
-closed, just as for Java.
-
-Developers are encouraged to create a separate class that handles general calls.
-An example class can be found in the SwingJS distribution as src/javajs/async/AsyncDialog.java.
-Very simple modifications to the Java allows asynchronous operation using AsyncDialog. Here
-is a simple "do you want to close this frame" example, where you can see that what we have
-done is to set the reply into an ActionListener that is defined in the constructor of
-the AsyncDisplay object:
-
-// Original:
-//
-// private void promptQuit() {
-// int sel = JOptionPane.showConfirmDialog(null, PROMPT_EXIT, NAME, JOptionPane.YES_NO_OPTION);
-// switch (sel) {
-// case JOptionPane.YES_OPTION:
-// resultsTab.clean();
-// seqs.dispose();
-// if (fromMain) {
-// System.exit(0);
-// }
-// break;
-// }
-// }
-
- private void promptQuitAsync() {
- new AsyncDialog(new ActionListener() {
-
- @Override
- public void actionPerformed(ActionEvent e) {
- int sel = ((AsyncDialog)e.getSource()).getOption();
- switch (sel) {
- case JOptionPane.YES_OPTION:
- resultsTab.clean();
- seqs.dispose();
- if (fromMain) {
- System.exit(0);
- }
- break;
- }
- }}).showConfirmDialog(null, PROMPT_EXIT, NAME, JOptionPane.YES_NO_OPTION);
- }
-
-Very simple!
-
-
-native methods
---------------
-
-The J2S compiler ignores all static native method declarations.
-Anything of this nature needs to be implemented in JavaScript if it is needed,
-using j2sNative blocks:
-
-/**
- * @j2sNative
- *
- * var putYourJavaScriptCodeHere
- *
- */
-
- Note that if you follow that directly with a {...} block, then
- the javadoc code will run in JavaScript, and the {...} code will run in Java.
-
-
-key Focus
----------
-
-As of June, 2019, the keyboard focus manager is fully implemented.
-The one catch is that JTextPane and JTextArea, which already consume
-VK_TAB in Java, cannot use CTRL-TAB to continue a tabbing cycle around
-the components in a window. Instead, CTRL-TAB is absorbed by the browser.
-
-
-LookAndFeel and UI Classes
---------------------------
-
-SwingJS implements the native browser look and feel as swingjs.plaf.HTML5LookAndFeel.
-There are small differences between all look and feels -- MacOS, Windows, SwingJS.
-
-Expert developers know how to coerce changes in the UI by subclassing the UI for a
-component. This probably will not work in SwingJS.
-
-Note that LookAndFeel in Java usually determines canvas size in a Frame because
-different operating systems (Mac OS vs Windows vs HTML5) will have
-different edge sizes on their frames. If you want to ensure a component size,
-use getContentPane().setPreferredSize().
-
-
-System.exit(0) does not stop all processes
-------------------------------------------
-
-Although System.ext(int) has been implemented in JavaScript, it just closes the
-frames, stops all pending javax.swing.Timer objects in the queue, and runs any
-threads added using Runtime.getRuntime().addShutdownHook(Thread).
-It may not stop all "threads." So don't rely on that.
-Applications are responsible for shutting down prior to executing System.exit(0).
-
-
-myClass.getField not implemented
---------------------------------
-
-java.lang.reflect.Field is implemented minimally. It is not
-certain that Field.getDeclaringClass() will work. If you just want a
-value of a field, you can do this:
-
-/**
- *@j2sNative
- *
- * return myClass[name]
- */
-
-But that is not a java.lang.reflection.Field object.
-
-
-"window" and other reserved JavaScript names
---------------------------------------------
-
-No reserved top-level JavaScript name is allowed for a package name. So, for example,
-one must rename packages such as "window" or "document" to names such as "win" or "doc".
-
-reserved field and method names
--------------------------------
-
-In order to minimize the chance of added SwingJS field and method names colliding with ones
-developers might use in subclassing Java classes, we have added U+79D8 (first character of Mandarin
-"secret") to the characters already disrecommended by Java documentation ("$" and "_"). The only problem
-would be if you use that character followed by certain English words in certain classes. For example
-\u79D8canvas for JComponents (in java.awt.JSComponent) and \u79D8byte (in java.io.File).
-
-qualified field and method names
---------------------------------
-
-Method names in SwingJS are fully qualified, meaning two methods with the same Java name but different
-parameters, such as write(int) and write(double), must not have the same name in JavaScript. (In this
-case, we will have write$I and write$D.) However, in certain cases it may be desirable to leave the
-method names unqualified. In particular, when an interface actually represents a JavaScript object,
-the transpiler can leave a method name unqualified. The default situation for this is a class name
-includes ".api.js" (case-sensitive). This means that any method in any class in a package js within
-a package api, or any private interface js that has an outer interface api, will have all-unqualified
-methods. An example of this is swingjs.plaf.JSComboPopupList, which needs to communicate with a jQuery
-object directly using the following interface:
-
- private interface api {
-
- interface js extends JQueryObject {
-
- abstract js j2sCB(Object options);
-
- abstract Object[] j2sCB(String method);
-
- abstract Object[] j2sCB(String method, Object o);
-
- abstract Object[] j2sCB(String method, int i);
-
- abstract int j2sCB(String OPTION, String name);
-
- }
- }
-
-Notice that all these variants of j2sCB() will call the same method in JavaScript by design.
-
-
-missing Math methods
---------------------
-
-java.lang.Math is worked out, but some methods are missing, either because they
-involve long integer value that are inaccessible in JavaScript, or because I just
-didn't implement them. This is a result of continued Java development.
-It is easy enough to add these methods if you have the source. They go into j2sClazz.js,
-which is combined with other initial libraries into swingjs2.js by build_site.xml
-
-
-Component.getGraphics(), Graphics.dispose()
--------------------------------------------
-
-Use of component.getGraphics() is discouraged in Java and in SwingJS.
-Specifically in SwingJS, any call to component.getGraphics() or
-BufferedImage.createGraphics() or Graphics.create(...) should be matched with graphics.dispose(),
-particularly when it is called outside the context of a paint(Graphics)
-call from the system.
-
-If you see your graphics scrolling down the page with each repaint,
-look for where you have used Component.getGraphics() and not Graphics.dispose().
-For example, this will definitely NOT work in SwingJS:
-
- this.paint(getGraphics())
-
-and really should not work in Java, either, as it is technically a resource memory leak.
-
-Instead, if you really do not want to use repaint(), use this:
-
- Graphics g = getGraphics();
- paint(g);
- g.dispose();
-
-
-
-Graphics.setClip()
-------------------
-
-The HTML5 canvas.clip() method is permanent. You can only reset the clip using
-save/restore. This is different from Java, where you can temporarily change it using
-
- Shape oldClip = Graphics.getClip();
- Graphics.setClip(newClip);
- ...
- Graphics.setClip(oldClip);
-
-If you need to do something like this, you must schedule the paints
-to not have overlapping clip needs.
-
-
-MAJOR ISSUES--for Bob and Udo within SwingJS
-============================================
-
-fonts
------
-
-Fonts and FontMetrics will all be handled in JavaScript. Font matching will
-not be exact, and composite (drawn) fonts will not be supported.
-
-SwingJS handles calls such as font.getFontMetrics(g).stringWidth("xxx") by
-creating a <div> containing that text, placing it in an obscure location on
-the page, and reading div.getBoundingClientRect(). This is a VERY precise
-value, but can be a pixel or two off from what Java reports for the same font.
-
-
-OS-dependent classes
---------------------
-
-Static classes such as:
-
- java.awt.Toolkit
- java.awt.GraphicsEnvironment
-
-
-which are created using Class.forName are implemented using classes in the swingjs package.
-
-AWTAccessor is not implemented.
-
-
-AWT component peers and component "ui" user interfaces
-------------------------------------------------------
-
-ComponentPeer is a class that represents a native AWT component.
-Components with such peers are called "heavy-weight" components.
-They are expected to do the dirty work of graphics drawing.
-
-Java Swing implements peers only for JApplet, JDialog, JFrame, and JWindow.
-References to such objects have been removed, but clearly there must be
-some connection to similar DOM objects, even for "light-weight" components.
-
-
-
-MAJOR ISSUES--to be resolved by implementers
-============================================
-
-fonts
------
-
-Glyph/composite/outline fonts are not supported.
-
-
-
-threads
--------
-
-Thread locking and synchronization are not relevant to JavaScript.
-Thus, anything requiring "notify.." or "waitFor.." could be a serious issue.
-
-All threading must be "faked" in JavaScript. Specifically not available is:
-
- Thread.sleep()
-
-javax.swing.AbstractButton#doClick(pressTime) will not work, as it requires Thread.sleep();
-
-However, java.lang.Thread itself is implemented and used extensively.
-
-Methods thread.start() and thread.run() both work fine.
-
-For simple applications that use Thread.sleep() just to have a delay, as in a frame rate, for
-example, one can use javax.swing.Timer instead. That is fully implemented.
-
-Likewise, java.util.Timer can be replaced with no loss of performance with javax.Swing.Timer.
-Note that java.util.TimerTask is implemented, but it can also be replaced by an implementation of Runnable.
-
-task = new TimerTask(){....};
-t = new java.util.Timer();
-t.schedule(task, 0, 1);
-
-becomes
-
-task = new TimerTask(){....}; // or task = new Runnable() {...}
-t = new javax.swing.Timer(1, new ActionListener() {
- @Override
- public void actionPerformed(ActionEvent e) {
- task.run();
- }
-};
-t.setInitialDelay(0); // not particularly necessary
-t.start();
-
-In addition, SwingJS provides swingjs.JSThread, which can be subclassed
-if desired. This class allows simple
-
- while(!interrupted()){
- wait()
- ...
- }
-
-action through an asynchronous function run1(mode). For example:
-
- protected void run1(int mode) {
- try {
- while (true)
- switch (mode) {
- case INIT:
- // once-through stuff here
- mode = LOOP;
- break;
- case LOOP:
- if (!doDispatch || isInterrupted()) {
- mode = DONE;
- } else {
- Runnable r = new Runnable() {
- public void run() {
- // put the loop code here
- }
- };
- dispatchAndReturn(r);
- if (isJS)
- return;
- }
- break;
- // add more cases as needed
- case DONE:
- // finish up here
- if (isInterrupted())
- return;
- // or here
- break;
- }
- } finally {
- // stuff here to be executed after each loop in JS or at the end in Java
- }
- }
-
-image loading
--------------
-- All image loading in SwingJS is synchronous. A MediaTracker call will immediately return "complete".
- However, it still may take one system clock tick to fully load images. Thus, it is recommended that
- images be preloaded in the static block of the applet if it is necessary that they be available in init().
- This is only an issue if you are trying to access the pixel buffer of the image in JavaScript.
-
-- Applet.getImage(path, name) will return null if the image does not exist.
-
-- BufferedImage: only "support" imageType RGB and ARGB
-
- -BH: This is a temporary edit, just to get us started. Certainly GRAY will be needed
-
-
-BigInteger and BigDecimal
--------------------------
-
-java.math.BigInteger is fully supported; java.math.BigDecimal is roughed
-in and not fully tested (07/2019).
-
-Both classes present significant issues for JavaScript, as they are based in
-Java's 64-bit long for all their operations. Here is the JavaDoc note I added
-to BigInteger:
-
- * SwingJS note: Because of the limitations of JavaScript with regard
- * to long-integer bit storage as a double, this implementation drops
- * the integer storage bit length to 24, giving 48 for long and leaving
- * the last 16 bits clear for the exponent of the double number. This should
- * not affect performance significantly. It does increase the storage
- * size by about 33%. By bringing an "int" to 3 bytes, we can easily construct
- * and use byte[] data intended for the original BitSet.
-
-"Easily" may be a bit strong there. This was a serious challenge.
-
-BigDecimal seems to run normally, but in order to do that, my hack involves
-reducing the size of an integer that is allowed to be stored as such and not
-in byte[] as a BigInteger. I'm sure there is a performance hit, but it does work.
-
-no format internationalization
-------------------------------
-
-For now, just en for number and date formatters
-
-no winding rules
-----------------
-
- When filling a graphic, only nonzero winding rule is implemented in HTML5 Canvas2D.
-
-
-
-text-related field implementation
----------------------------------
-
-Text fields are:
-
-JTextField (JavaScript <input type="text">)
-JTextArea (JavaScript <textarea>)
-JTextPane (JavaScript <div>)
-JEditorPane (JavaScript <div>)
-
-For the initial implementation, we don't implement infinite undo/redo, and the abstract
-document model is much less elaborate. Only PlainDocument (in the form of JSPlainDocument)
-is implemented. The Document returned by JTextField.getDocument() is a javax.swing.text.Document.
-
-All scrolling is handled by HTML5. javax.swing.AutoScroller is not implemented.
-public static methods .stop, .isRunning, .processMouseDragged require true Java threading
-and so are not implmented. javax.swing.text.View and its subclasses are not implemented.
-
-The JS document model does not allow two text fields to address the same underlying document.
-
-JavaScript is slightly different from Java in that the field value is changed asynchronously after
-the keypressed event, so Java actions that are keyed to KEY_PRESSED may not pick up the new
-key value even after SwingUtilities.invokeLater() is called. Thus, key pressed actions may need
-to be recorded after a key released event instead.
-
-Formatter/Regex limitations
----------------------------
-
-Some browsers cannot process Regex "look-behind" process such as (?<=\W)
-java.util.regex.Matcher and Pattern use JavaScript's RegExp object rather than
-the native Java object. These are not identical. Only flags /igm are supported.
-Matcher.start(groupID) is not supported.
-
-java.util.Formatter will function correctly for all standard %... patterns.
-
-integer 1/0 == Infinity
------------------------
-
-1/0 in Java throws "java.lang.ArithmeticException: / by zero", but in JavaScript is just Infinity.
-
-
-
-Summary
--------
-
-These are all the known limitations of SwingJS. We have not found any of these limitations
-to be show-stoppers. The primary issue for newcomers to SwingJS is having the source code.
-You must check that source code for all your library jar files is available or, if you
-choose, you will need to decompile those classes. We have used decompilation on some projects,
-and it works just fine. So, technically, all we really need are JAR/class files. But the
-source is by far superior. It's generally prettier, and it has the license information that
-may or may not be present with the JAR or class files. Use class files at your own risk.
-
-Bob Hanson
-2019.08.16
-
-
-Additional Issues
------------------
-
-Annotation is working for classes, methods, and fields (12/22/19). Method reflection, however,
-is limited. Interfaces do not expose their methods, as the transpiler does not actually transpile
-the interfaces themselves. And method reflection only includes annotated methods.
-
-java.util.concurrent is not fully elaborated. This package is rewritten to not actually use the
-memory handling capabilities of concurrency, which JavaScript does not have access to.
-
-System.getProperties() just returns a minimal set of properties.
-
-
+++ /dev/null
-20201127032339
+++ /dev/null
-This is sources/net.sf.j2s.java.core/dist/DEV_NOTES.txt
-
-_j2sclasslist.txt
-
-the list of .js files concatenated into coreswingjs.js and minified to coreswingjs.z.js
-
-
-SwingJS-site.zip
-
-the full site directory for SwingJS including all files not in the test/ directory.
+++ /dev/null
-java/applet/Applet.js
-java/applet/AppletContext.js
-java/applet/AppletStub.js
-java/applet/JSApplet.js
-java/awt/ActiveEvent.js
-java/awt/Adjustable.js
-java/awt/AWTEvent.js
-java/awt/AWTEventMulticaster.js
-java/awt/AWTKeyStroke.js
-java/awt/BasicStroke.js
-java/awt/BorderLayout.js
-java/awt/Button.js
-java/awt/Color.js
-java/awt/color/ColorSpace.js
-java/awt/Component.js
-java/awt/ComponentOrientation.js
-java/awt/ContainerOrderFocusTraversalPolicy.js
-java/awt/Container.js
-java/awt/Cursor.js
-java/awt/DefaultFocusTraversalPolicy.js
-java/awt/DefaultKeyboardFocusManager.js
-java/awt/Dialog.js
-java/awt/Dimension.js
-java/awt/dnd/peer/DropTargetPeer.js
-java/awt/event/ActionListener.js
-java/awt/event/AdjustmentEvent.js
-java/awt/event/AdjustmentListener.js
-java/awt/event/AWTEventListener.js
-java/awt/event/ComponentAdapter.js
-java/awt/event/ComponentEvent.js
-java/awt/event/ComponentListener.js
-java/awt/event/ContainerListener.js
-java/awt/event/FocusEvent.js
-java/awt/event/FocusListener.js
-java/awt/event/HierarchyBoundsListener.js
-java/awt/event/HierarchyListener.js
-java/awt/event/InputEvent.js
-java/awt/event/InputMethodListener.js
-java/awt/event/InvocationEvent.js
-java/awt/event/ItemEvent.js
-java/awt/event/ItemListener.js
-java/awt/event/KeyListener.js
-java/awt/event/MouseEvent.js
-java/awt/event/MouseListener.js
-java/awt/event/MouseMotionListener.js
-java/awt/event/MouseWheelListener.js
-java/awt/event/TextListener.js
-java/awt/event/WindowAdapter.js
-java/awt/event/WindowEvent.js
-java/awt/event/WindowFocusListener.js
-java/awt/event/WindowListener.js
-java/awt/event/WindowStateListener.js
-java/awt/EventDispatchThread.js
-java/awt/EventFilter.js
-java/awt/EventQueue.js
-java/awt/EventQueueItem.js
-java/awt/FlowLayout.js
-java/awt/FocusTraversalPolicy.js
-java/awt/Font.js
-java/awt/font/FontRenderContext.js
-java/awt/FontMetrics.js
-java/awt/Frame.js
-java/awt/geom/AffineTransform.js
-java/awt/geom/Dimension2D.js
-java/awt/geom/Path2D.js
-java/awt/geom/PathIterator.js
-java/awt/geom/Point2D.js
-java/awt/geom/Rectangle2D.js
-java/awt/geom/RectangularShape.js
-java/awt/geom/RectIterator.js
-java/awt/GraphicsCallback.js
-java/awt/GraphicsConfiguration.js
-java/awt/GraphicsDevice.js
-java/awt/GraphicsEnvironment.js
-java/awt/Image.js
-java/awt/image/ImageObserver.js
-java/awt/Insets.js
-java/awt/ItemSelectable.js
-java/awt/JSComponent.js
-java/awt/JSDialog.js
-java/awt/JSFrame.js
-java/awt/JSPanel.js
-java/awt/KeyboardFocusManager.js
-java/awt/KeyEventDispatcher.js
-java/awt/KeyEventPostProcessor.js
-java/awt/Label.js
-java/awt/LayoutManager.js
-java/awt/LayoutManager2.js
-java/awt/LightweightDispatcher.js
-java/awt/Paint.js
-java/awt/Panel.js
-java/awt/peer/ComponentPeer.js
-java/awt/peer/ContainerPeer.js
-java/awt/peer/FramePeer.js
-java/awt/peer/KeyboardFocusManagerPeer.js
-java/awt/peer/LightweightPeer.js
-java/awt/peer/WindowPeer.js
-java/awt/Point.js
-java/awt/Queue.js
-java/awt/Rectangle.js
-java/awt/RenderingHints.js
-java/awt/Scrollbar.js
-java/awt/ScrollPane.js
-java/awt/Shape.js
-java/awt/Stroke.js
-java/awt/TextArea.js
-java/awt/TextComponent.js
-java/awt/TextField.js
-java/awt/Toolkit.js
-java/awt/Transparency.js
-java/awt/Window.js
-java/beans/ChangeListenerMap.js
-java/beans/PropertyChangeEvent.js
-java/beans/PropertyChangeListener.js
-java/beans/PropertyChangeSupport.js
-java/lang/AbstractStringBuilder.js
-java/lang/Class.js
-java/lang/Enum.js
-java/lang/Iterable.js
-java/lang/reflect/Constructor.js
-java/lang/reflect/Method.js
-java/lang/StringBuffer.js
-java/lang/StringBuilder.js
-java/lang/Thread.js
-java/lang/ThreadGroup.js
-java/math/RoundingMode.js
-java/net/URL.js
-java/net/URLStreamHandlerFactory.js
-java/net/HttpURLConnection.js
-java/net/URLStreamHandler.js
-javax/net/ssl/HttpsUrlConnection.js
-java/text/CharacterIterator.js
-java/text/DecimalFormat.js
-java/text/DecimalFormatSymbols.js
-java/text/DigitList.js
-java/text/FieldPosition.js
-java/text/Format.js
-java/text/NumberFormat.js
-java/util/AbstractCollection.js
-java/util/AbstractList.js
-java/util/AbstractMap.js
-java/util/AbstractSequentialList.js
-java/util/AbstractSet.js
-java/util/ArrayList.js
-java/util/Arrays.js
-java/util/Collection.js
-java/util/Collections.js
-java/util/Comparator.js
-java/util/Deque.js
-java/util/Dictionary.js
-java/util/Enumeration.js
-java/util/EventListener.js
-java/util/EventObject.js
-java/util/HashMap.js
-java/util/HashSet.js
-java/util/Hashtable.js
-java/util/IdentityHashMap.js
-java/util/Iterator.js
-java/util/LinkedHashMap.js
-java/util/LinkedList.js
-java/util/List.js
-java/util/ListResourceBundle.js
-java/util/Locale.js
-java/util/Map.js
-java/util/Objects.js
-java/util/Queue.js
-java/util/Random.js
-java/util/RandomAccess.js
-java/util/ResourceBundle.js
-java/util/Set.js
-java/util/TimSort.js
-java/util/Vector.js
-javajs/api/JSFunction.js
-javajs/util/AjaxURLConnection.js
-javajs/util/AjaxURLStreamHandlerFactory.js
-javajs/util/AU.js
-javajs/util/JSThread.js
-javajs/util/Lst.js
-javajs/util/PT.js
-javajs/util/Rdr.js
-javajs/util/SB.js
-javax/swing/AbstractAction.js
-javax/swing/AbstractButton.js
-javax/swing/AbstractListModel.js
-javax/swing/Action.js
-javax/swing/ActionMap.js
-javax/swing/AncestorNotifier.js
-javax/swing/ArrayTable.js
-javax/swing/border/AbstractBorder.js
-javax/swing/border/BevelBorder.js
-javax/swing/border/Border.js
-javax/swing/border/CompoundBorder.js
-javax/swing/border/EmptyBorder.js
-javax/swing/border/EtchedBorder.js
-javax/swing/border/LineBorder.js
-javax/swing/border/TitledBorder.js
-javax/swing/BorderFactory.js
-javax/swing/BoundedRangeModel.js
-javax/swing/BoxLayout.js
-javax/swing/ButtonGroup.js
-javax/swing/ButtonModel.js
-javax/swing/ClientPropertyKey.js
-javax/swing/ComboBoxModel.js
-javax/swing/DefaultBoundedRangeModel.js
-javax/swing/DefaultButtonModel.js
-javax/swing/DefaultComboBoxModel.js
-javax/swing/DefaultSingleSelectionModel.js
-javax/swing/DropMode.js
-javax/swing/event/AncestorEvent.js
-javax/swing/event/AncestorListener.js
-javax/swing/event/CaretEvent.js
-javax/swing/event/CaretListener.js
-javax/swing/event/ChangeEvent.js
-javax/swing/event/ChangeListener.js
-javax/swing/event/DocumentEvent.js
-javax/swing/event/DocumentListener.js
-javax/swing/event/EventListenerList.js
-javax/swing/event/ListDataEvent.js
-javax/swing/event/ListDataListener.js
-javax/swing/event/UndoableEditEvent.js
-javax/swing/event/UndoableEditListener.js
-javax/swing/FocusManager.js
-javax/swing/InternalFrameFocusTraversalPolicy.js
-javax/swing/LayoutComparator.js
-javax/swing/LayoutFocusTraversalPolicy.js
-javax/swing/SortingFocusTraversalPolicy.js
-javax/swing/SwingContainerOrderFocusTraversalPolicy.js
-javax/swing/SwingDefaultFocusTraversalPolicy.js
-javax/swing/Icon.js
-javax/swing/ImageIcon.js
-javax/swing/InputMap.js
-javax/swing/JApplet.js
-javax/swing/JButton.js
-javax/swing/JCheckBox.js
-javax/swing/JCheckBoxMenuItem.js
-javax/swing/JComboBox.js
-javax/swing/JComponent.js
-javax/swing/JFrame.js
-javax/swing/JLabel.js
-javax/swing/JLayeredPane.js
-javax/swing/JMenu.js
-javax/swing/JMenuBar.js
-javax/swing/JMenuItem.js
-javax/swing/JPanel.js
-javax/swing/JPopupMenu.js
-javax/swing/JRadioButtonMenuItem.js
-javax/swing/JRootPane.js
-javax/swing/JScrollBar.js
-javax/swing/JScrollPane.js
-javax/swing/JSeparator.js
-javax/swing/JTextArea.js
-javax/swing/JTextField.js
-javax/swing/JToggleButton.js
-javax/swing/JViewport.js
-javax/swing/KeyboardManager.js
-javax/swing/KeyStroke.js
-javax/swing/ListModel.js
-javax/swing/LookAndFeel.js
-javax/swing/MenuElement.js
-javax/swing/MutableComboBoxModel.js
-javax/swing/plaf/ActionMapUIResource.js
-javax/swing/plaf/basic/BasicBorders.js
-javax/swing/plaf/BorderUIResource.js
-javax/swing/plaf/ColorUIResource.js
-javax/swing/plaf/ComponentUI.js
-javax/swing/plaf/DimensionUIResource.js
-javax/swing/plaf/FontUIResource.js
-javax/swing/plaf/InputMapUIResource.js
-javax/swing/plaf/InsetsUIResource.js
-javax/swing/plaf/UIResource.js
-javax/swing/RepaintManager.js
-javax/swing/RootPaneContainer.js
-javax/swing/Scrollable.js
-javax/swing/ScrollPaneConstants.js
-javax/swing/ScrollPaneLayout.js
-javax/swing/SingleSelectionModel.js
-javax/swing/SizeRequirements.js
-javax/swing/SwingConstants.js
-javax/swing/SwingPaintEventDispatcher.js
-javax/swing/SwingUtilities.js
-javax/swing/text/AbstractDocument.js
-javax/swing/text/AttributeSet.js
-javax/swing/text/Caret.js
-javax/swing/text/DefaultCaret.js
-javax/swing/text/DefaultEditorKit.js
-javax/swing/text/Document.js
-javax/swing/text/EditorKit.js
-javax/swing/text/Element.js
-javax/swing/text/GapContent.js
-javax/swing/text/GapVector.js
-javax/swing/text/JTextComponent.js
-javax/swing/text/MutableAttributeSet.js
-javax/swing/text/PlainDocument.js
-javax/swing/text/PlainView.js
-javax/swing/text/Position.js
-javax/swing/text/Segment.js
-javax/swing/text/SegmentCache.js
-javax/swing/text/SimpleAttributeSet.js
-javax/swing/text/Style.js
-javax/swing/text/StyleConstants.js
-javax/swing/text/StyleContext.js
-javax/swing/text/TabExpander.js
-javax/swing/text/TextAction.js
-javax/swing/text/Utilities.js
-javax/swing/text/View.js
-javax/swing/tree/TreeNode.js
-javax/swing/UIDefaults.js
-javax/swing/UIManager.js
-javax/swing/undo/AbstractUndoableEdit.js
-javax/swing/undo/CompoundEdit.js
-javax/swing/undo/UndoableEdit.js
-javax/swing/ViewportLayout.js
-javax/swing/WindowConstants.js
-sun/awt/AppContext.js
-sun/awt/AWTAutoShutdown.js
-sun/awt/CausedFocusEvent.js
-sun/awt/ComponentFactory.js
-sun/awt/KeyboardFocusManagerPeerProvider.js
-sun/awt/MostRecentKeyValue.js
-sun/awt/MostRecentThreadAppContext.js
-sun/awt/PaintEventDispatcher.js
-sun/awt/PostEventQueue.js
-sun/awt/RequestFocusController.js
-sun/awt/SunToolkit.js
-sun/awt/WindowClosingListener.js
-sun/awt/WindowClosingSupport.js
-sun/awt/image/DataStealer.js
-sun/awt/image/IntegerComponentRaster.js
-sun/awt/image/IntegerInterleavedRaster.js
-sun/awt/image/SunWritableRaster.js
-sun/font/FontDesignMetrics.js
-sun/swing/DefaultLookup.js
-sun/swing/SwingLazyValue.js
-sun/text/resources/FormatData.js
-sun/text/resources/en/FormatData_en.js
-sun/util/resources/LocaleData.js
-sun/util/locale/BaseLocale.js
-sun/util/locale/LocaleUtils.js
-sun/util/locale/provider/LocaleProviderAdapter.js
-sun/util/locale/provider/LocaleDataMetaInfo.js
-swingjs/a2s/A2SContainer.js
-swingjs/a2s/A2SEvent.js
-swingjs/a2s/A2SListener.js
-swingjs/a2s/Applet.js
-swingjs/a2s/Button.js
-swingjs/a2s/Label.js
-swingjs/a2s/Panel.js
-swingjs/a2s/Scrollbar.js
-swingjs/a2s/ScrollPane.js
-swingjs/a2s/TextArea.js
-swingjs/a2s/TextField.js
-swingjs/api/Interface.js
-swingjs/api/js/DOMNode.js
-swingjs/api/js/HTML5CanvasContext2D.js
-swingjs/api/js/JSInterface.js
-swingjs/jquery/JQueryUI.js
-swingjs/JSApp.js
-swingjs/JSAppletThread.js
-swingjs/JSAppletViewer.js
-swingjs/JSFocusPeer.js
-swingjs/JSFontMetrics.js
-swingjs/JSFrameViewer.js
-swingjs/JSGraphics2D.js
-swingjs/JSGraphicsConfiguration.js
-swingjs/JSGraphicsEnvironment.js
-swingjs/JSImage.js
-swingjs/JSImagekit.js
-swingjs/JSMouse.js
-swingjs/JSNullComponentPeer.js
-swingjs/JSScreenDevice.js
-swingjs/JSThreadGroup.js
-swingjs/JSToolkit.js
-swingjs/JSUtil.js
-swingjs/plaf/ButtonListener.js
-swingjs/plaf/DefaultMenuLayout.js
-swingjs/plaf/HTML5LookAndFeel.js
-swingjs/plaf/JSAppletUI.js
-swingjs/plaf/JSButtonUI.js
-swingjs/plaf/JSCheckBoxMenuItemUI.js
-swingjs/plaf/JSCheckBoxUI.js
-swingjs/plaf/JSComboBoxUI.js
-swingjs/plaf/JSComponentUI.js
-swingjs/plaf/JSEventHandler.js
-swingjs/plaf/JSFrameUI.js
-swingjs/plaf/JSGraphicsUtils.js
-swingjs/plaf/JSLabelUI.js
-swingjs/plaf/JSLayeredPaneUI.js
-swingjs/plaf/JSLightweightUI.js
-swingjs/plaf/JSMenuBarUI.js
-swingjs/plaf/JSMenuItemUI.js
-swingjs/plaf/JSMenuUI.js
-swingjs/plaf/JSPanelUI.js
-swingjs/plaf/JSPopupMenuSeparatorUI.js
-swingjs/plaf/JSPopupMenuUI.js
-swingjs/plaf/JSRadioButtonMenuItemUI.js
-swingjs/plaf/JSRadioButtonUI.js
-swingjs/plaf/JSRootPaneUI.js
-swingjs/plaf/JSScrollBarUI.js
-swingjs/plaf/JSScrollPaneUI.js
-swingjs/plaf/JSSeparatorUI.js
-swingjs/plaf/JSSliderUI.js
-swingjs/plaf/JSTextAreaUI.js
-swingjs/plaf/JSTextFieldUI.js
-swingjs/plaf/JSTextUI.js
-swingjs/plaf/JSTextViewUI.js
-swingjs/plaf/JSViewportUI.js
-swingjs/plaf/JSWindowUI.js
-swingjs/plaf/LazyActionMap.js
-swingjs/plaf/Resizer.js
-swingjs/plaf/TextListener.js
-
-
+++ /dev/null
-Notes
-=====
-
----IMPORTANT CHARACTER SET NOTE---
-
-It is critical that all development work in Java2Script
-be done in UTF-8. This means:
-
-- making sure your Eclipse project is set up for UTF-8 (not the Eclipse default?)
-- making sure your server can serve up UTF-8 by default for any browser-loaded files
-- making sure you don't edit a Java2Script class file or one of the site .js files
- using a non-UTF-8 editor. It may replace non-Latin characters with "?" or garbage.
-- making sure that your web pages are delivered with proper headings indicating HTML5 and UTF-8
-
-<!DOCTYPE html>
-<html>
-<head>
-<meta charset="utf-8">
-
-Note that the DOCTYPE tag is critical for some browsers to switch into HTML5 mode. (MSIE?)
-
-
-
-
-In particular, the Mandarin character 秘 (mi; "secret") is used extensively throughout
-the SwingJS class files to distinguish j2s-specific fields and methods that must not
-ever be shadowed or overridden by subclasses. For example, we see in java.lang.Thread.java:
-
- public static JSThread 秘thisThread;
-
-----------------------------------
-
-
-updated 12/6/2020 -- note about restrictions on long, including BitSet and Scanner
-updated 3/21/2020 -- adds note about HashMap, Hashtable, and HashSet iterator ordering
-updated 3/20/2020 -- adds note about interning, new String("xxx"), and "xxx"
-updated 2/26/2020 -- adds Graphics.setClip issue
-updated 12/22/19 -- additional issues
-updated 11/03/19 -- adds information about File.exists() and points to src/javajs/async
-updated 10/26/19 -- adds information about File.createTempFile()
-updated 8/16/19 -- minor typos and added summary paragraph
-updated 7/19/19 -- clarification that AWT and Swing classes are supported directly
-updated 5/13/19 -- Mandarin U+79D8 reserved character; Missing Math methods; int and long
-updated 5/10/19 -- adds a section on static issues in multi-(duplicate)-applet pages
-updated 1/4/19 -- nio
-updated 9/15/18 -- adds integer 1/0 == Infinity
-updated 7/24/18 -- most classes replaced with https://github.com/frohoff/jdk8u-jdk
-updated 6/5/17 -- reserved package name "window"
-updated 3/11/17 -- myClass.getField
-updated 3/7/17 -- overloading of JSplitPane.setDividerLocation
-updated 3/2/17 -- more indication of classes not implemented (KeyListener)
-
-=============================================================================
-SwingJS and OpenJDK 8+
-=============================================================================
-
-SwingJS implements a wide range of the Java language in JavaScript. The base
-version for this implementation is OpenJDK8. some classes are implemented using
-older source code, and there are some missing methods. For the most part, this is
-no real problem. You can add or modify any java class just be adding it as source
-in your project. Or (preferably) you can contact me, and I can get it into the
-distribution. Or (even more preferably) you can do that via a patch submission.
-
-=================
-DESIGN PHILOSOPHY
-=================
-
-The java2script/SwingJS design goal is to recreate a recognizable, easily debuggable
-equivalent in JavaScript for as much of Java as practical. This means, for example,
-that one can call in JavaScript
-
- new java.util.Hashtable()
-
-and for all practical purposes it will appear that Java is running.
-
-
-Method and Field Disambiguation
--------------------------------
-
-SwingJS has no problem with the overloading of methods, for example:
-
- public void print(int b);
- public void print(float b);
-
-JavaScript does not allow overloading of methods, and the common practice in
-Java of naming a field the same as a method -- isAllowed and isAllowed() -- is
-not possible in JavaScript. As a result, SwingJS implements "fully-qualified"
-method names using "$" parameter type separation. Thus, these methods in SwingJS
-will be referred to as print$I and print$F. The rules for this encoding are
-relatively simple:
-
-1. The seven primitive types in Java are encoded $I (int), $L (long), $F (float),
-$D (double), $B (byte) $Z (boolean), and $H (short).
-
-2. String and Object are encoded as $S and $O, respectively.
-
-3. "java_lang_" is dropped for all other classes in the java.lang package (as in Java).
- For example: $StringBuffer, not $java_lang_StringBuffer
-
-4. All other classes are encoded as
-
- "$" + Class.getName().replace(".","_")
-
-For example, in Java we see:
-
- public void equals(Object o) {...}
-
-Whereas in SwingJS we have:
-
- Clazz.newMeth(C$, 'equals$O', function (o) {...}
-
-And
-
- this.getContentPane().add(bar, "North");
-
-becomes
-
- this.getContentPane$().add$java_awt_Component$O(bar, "North");
-
-5. Arrays are indicated with appended "A" for each level. So
-
- setDataVector(Object[][] dataVector, Object[] columnIdentifiers)
-
-becomes
-
- setDataVector$OAA$OA(dataVector, columnIdentifiers)
-
-(It is recognized that this design does introduce a bit of ambiguity, in that
- in principal there could be user class named XA and X in the same package,
- and methods a(X[]) and a(XA) in the same class that cannot be distinguished.
- The benefit of this simple system, however, triumphed over the unlikelyhood
- of that scenario.) The transpiler could be set to flag this possibility.
-
-6. Constructors are prepended with "c$". So
-
- public JLabel(String text) {...}
-
-becomes:
-
- Clazz.newMeth(C$, 'c$$S', function (text) {...});
-
-Field disambiguation involves prepending. In Java, a class and its subclass
-can both have the same field name, such as
-
- boolean visible;
-
-When this happens, it is called "shadowing", and though not recommended, Java allows
-it. The Java2Script transpiler will prepend such shadowing fields with "$" so that the
-subclass instance has both "visible" (for use in its methods inherited from its
-superclass) and "$visible" (for its own methods). Thus, we might see in Java:
-
- this.visible = super.visible;
-
-while in SwingJS we will see:
-
- this.$visible=this.visible;
-
-since JavaScript does not have the "super" keyword.
-
-
-
-Parameterless methods such as toString() are appended with "$" to become toString$().
-The one exception to this rule is private methods, which are saved in (truly) private
-array in the class (and are not accessible by reflection). Private parameterless
-methods retain their simple Java name, since they cannot conflict with field names.
-
-This renaming of methods has a few consequences, which are discussed more fully below.
-See particularly the section on "qualified field and method names", where it is described
-how you can use packages or classes or interfaces with ".api.js" in them to represent JavaScript
-objects for which all method names are to be left unqualified. Note that it is not
-possible to cherry-pick methods to be unqualified; only full packages, classes or
-interfaces can hold this status.
-
-The swingjs.api.js package in particular contains a number of useful interfaces that
-you can import into your project for JavaScript-specific capabilities.
-
-
-Applet vs. Application
-----------------------
-
-One of the very cool aspects of SwingJS is that it doesn't particularly matter if a browser-based
-Java app is an "applet" or an "application". We don't need JNLP (Java Network Launch Protocol)
-because now we can just start up any Java application in a browser just as easily as any applet.
-The associative array that passes information to the SwingJS applet (information that formerly
-might have been part of the APPLET tag, such as width, height, and codebase, always referred to
-in our writing as "the Info array") allows the option to specify the JApplet/Applet "code"
-class or the application "main" class. Either one will run just fine.
-
-
-Performance
------------
-
-Obviously, there are limitations. One is performance, but we have seen reproducible
-performance at 1/6 - 1/3 the speed of Java. Achieving this performance may require
-some refactoring of the Java to make it more efficient in both Java and JavaScript.
-"for" loops need to be more carefully crafted; use of "new" and "instanceof" need to be
-minimized in critical areas. Note that method overloading -- that is, the same method name
-with different parameters, such as read(int) and read(byte) -- is no longer any problem.
-
-
-Threads
--------
-
-Although there is only a single thread in JavaScript, meaning Thread.wait(), Thread.sleep(int) and
-Thread.notify() cannot be reproduced, we have found that this is not a serious limitation.
-For example, javax.swing.Timer() works perfectly in JavaScript. All it means is that threads
-that use sleep(int) or notify() must be refactored to allow Timer-like callbacks. That is,
-they must allow full exit and re-entry of Thread.run(), not the typical while/sleep motif.
-
-The key is to create a state-based run() that can be exited and re-entered in JavaScript.
-
-
-Static fields
--------------
-
-Final static primitive "constant" fields (String, boolean, int, etc.) such as
-
-static final int TEST = 3;
-static final String MY_STRING = "my " + "string";
-
-are converted to their primitive form automatically by the Eclipse Java compiler
-and do not appear in the JavaScript by their names.
-
-Other static fields are properties of their class and can be used as expected.
-
-Note, however, that SwingJS runs all "Java" code on a page in a common "jvm"
-(like older versions of Java). So, like the older Java schema, the JavaScript
-equivalents of both applets and applications will share all of their static
-fields and methods. This includes java.lang.System.
-
-Basically, SwingJS implementations of Java run in a browser page-based sandbox
-instead of an applet-specific one.
-
-In general, this is no problem. But if we are to implement pages with
-multiple applets present, we must be sure to only have static references
-that are "final" or specifically meant to be shared in a JavaScript
-environment only (since they will not be shared in Java).
-
-A simple solution, if static non-constant references are needed, is to attach the
-field to Thread.currentThread.threadGroup(), which is an applet-specific reference.
-Be sure, if you do this, that you use explicit setters and getters:
-
-For example,
-
-private static String myvar;
-
-...
-
-public void setMyVar(String x) {
- ThreadGroup g = Thread.currentThread().threadGroup();
- /**
- * @j2sNative g._myvar = x;
- *
- */
- {
- myvar = x;
- }
-}
-
-public String getMyVar() {
- ThreadGroup g = Thread.currentThread().threadGroup();
- /**
- * @j2sNative return g._myvar || null;
- *
- */
- {
- return myvar;
- }
-}
-
- in Java will get and set x the same in JavaScript and in Java.
-
-
-A convenient way to do this in general is to supply a singleton class with
-explicitly private-only constructors and then refer to it in Java and in JavaScript
-instead of using static field, referring to myclass.getIntance().xxx instead of
-myclass.xxx in Java (and JavaScript).
-
-This was done extensively in the Jalview project. See jalview.bin.Instance.
-
-
-Helper Packages -- swingjs/ and javajs/
----------------------------------------
-
-The SwingJS library is the swingjs/ package. There are interfaces that may be of assistance
-in swingjs/api, but other than that, it is not recommended that developers access classes in
-this package. The "public" nature of their methods is really an internal necessity.
-
-In addition to swingjs/, though, there are several useful classes in the javajs/ package
-that could be very useful. This package is a stand-alone package that can be
-cloned in any Java project that also would be great to have in any JavaScript project
--- SwingJS-related or not. Functionality ranges from reading and writing various file
-formats, including PDF, BMP, PNG, GIF, JPG, JSON, ZIP, and CompoundDocument formats.
-
-A variety of highly efficient three- and four-dimensional point, vector, matrix, and
-quaternion classes are included, as they were developed for JSmol and inherited from that
-project.
-
-Of particular interest should be javajs/async/, which includes
-
-javajs.async.Async
-javajs.async.AsyncColorChooser
-javajs.async.AsyncDialog
-javajs.async.AsyncFileChooser
-
-See javajs.async.Async JavaDoc comments for a full description of
-these useful classes.
-
-
-Modal Dialogs
--------------
-
-Although true modal dialogs are not possible with only one thread, a functional equivalent --
-asynchronous modal dialogs -- is relatively easy to set up. All the JOptionPane dialogs will
-return PropertyChangeEvents to signal that they have been disposed of and containing the results.
-See below and classes in the javajs.async package.
-
-
-Native calls
-------------
-
-Native calls in Java are calls to operating system methods that are not in Java. JavaScript
-has no access to these, of course, and they must all be replaced by JavaScript equivalents.
-Fortunately, they are not common, and those that are present in Java (for example, in calculating
-checksums in ZIP file creation) are at a low enough level that most developers do not utilize them
-or do not even have access to them. All native calls in Java classes have been replaced by
-Java equivalents.
-
-
-Swing GUI Peers and UIClasses
------------------------------
-
-One of the biggest adaptations introduced in SwingJS is in the area of the graphical
-user interface. The issue here is complex but workable. In Java there are two background
-concepts -- the Component "peer" (one per "heavy-weight" component, such as a Frame) and the
-component "uiClass" (one per component, such as JButton or JTextField).
-
-Peers are native objects of the operating system. These are the virtual buttons and text areas
-that the user is interacting with at a very base level. Their events are being passed on to
-Java or the browser by the operating system. UI classes provide a consistent "look and feel"
-for these native objects, rendering them onto the native window canvas and handling all
-user-generated events. They paint the borders, the backgrounds, the highlights, of every
-control you see in Java. There is one-to-one correspondence of Swing classes and UI classes.
-Setting the Look and Feel for a project amounts to selecting the directory from which to draw
-these UI classes. The UI classes can be found in the javax.swing.plaf ("platform look and feel")
-package.
-
-Early on in the development of SwingJS, we decided not to fully reproduce the painfully detailed
-bit-by-bit painting of controls as is done in Java. Instead, we felt it was wiser to utilize the standard
-HTML5 UI capabilities as much as possible, using DIV, and INPUT especially, with extensive use
-of CSS and sometimes jQuery (menus, and sliders, for example). Thus, we have created a new
-set of UIs -- the "HTML5 Look and Feel". These classes can be found in swingjs.plaf. Besides being
-more adaptable, this approach allows far more versatility to SwingJS developers, allowing them
-to modify the GUI to suit their needs if desired.
-
-In SwingJS, since we have no access to native peers except through the browser DOM,
-it seemed logical to merge the peer and UI idea. So instead of having one peer per heavy-weight control and
-one UI class instance for each control type, we just have one UI class instance per control, and
-that UI class instance is what is being referred to when a "peer" is notified.
-
-In some ways this is a throw back to when all of Swing's components were subclasses of
-specific AWT components such as Button and List. These "heavy-weight components" all had their
-own individual native peers and thus automatically took on the look and feel provided by the OS.
-Later Swing versions implemented full look and feel for all peers, leaving only JDialog, JFrame,
-and a few other classes to have native peers. But in SwingJS we have again a 1:1 map of component
-and UI class/peer instance.
-
-The origin of most issues (read "bugs") in relation to the GUI will probably be found in the
-swingjs.plaf JSxxxxUI.java code.
-
-
-Swing-only Components -- no longer an issue
--------------------------------------------
-
-Swing was introduced into Java well after the Java Abstract Window Toolkit (AWT) was well
-established. As such, its designers chose to allow AWT controls such as Button and List to be used
-alongside their Swing counterparts JButton and JList. Reading the code, it is clear that this
-design choice posed a huge headache for Swing class developers.
-
-For SwingJS, we decided from the beginning NOT to allow this mixed-mode programming and
-instead to require that all components be Swing components.
-
-However, this is no longer an issue. All AWT components in SwingJS are now subclasses of
-javax.swing.JComponent. So far, we have found no problem with this.
-
-
-The a2s Adapter Package
------------------------
-
-Originally, we thought that we would restrict ourselves to JApplets only. That is, only
-Swing-based applets. But as we worked, we discovered that there are a lot of great
-applets out there that are pre-Swing pure-AWT java.applet.Applet applets. Our problem was
-that we also wanted it to be possible to quickly adapt these applets to JavaScript as well.
-
-The solution turned out to be simple: Write a package (a2s) that recreates the interface for
-non-Swing components as subclasses of Swing components. Thus, a2s.Button subclasses javax.swing.JButton
-but also accepts all of the methods of java.awt.Button. This works amazingly well, with a few
-special adaptations to the core javax.swing to be "AWT-aware." All AWT components now subclass
-a2s components, which in turn subclass JComponents. So no changes in code are necessary. We have
-successfully transpiled over 500 applets using this strategy. (Kind of surprising, actually, that
-the original Java developers did not see that option. But we have a hindsight advantage here.)
-
-
-Working with Files
-==================
-
-Simple String file names are not optimal for passing information about
-read files within SwingJS applications.
-
-All work with files should either use Path or File objects exclusively.
-These objects, after a file is read or checked for existence, will already
-contain the file byte[] data. Doing something like this:
-
-File f = File("./test.dat");
-boolean isOK = f.exists();
-
-will load f with its byte[] data, if the file exists.
-
-But if after that, we use:
-
-File f2 = new File(f.getAbsolutePath());
-
-f2 will not contain that data. Such copying should be done as:
-
-File f2 = new File(f);
-
-in which case, the byte[] data will be transferred.
-
-
-SwingJS uses the following criteria to determine if File.exists() returns true:
-
-(1) if this File object has been used directly to read data, or
-(2) if reading data using this File object is successful.
-
-Note that you cannot check to see if a file exists before input or if it
-was actually written or if it already exists prior to writing in SwingJS.
-
-Thus, you should check each use of file.exists() carefully, and if necessary, provide a J2sNative
-block that gives an appropriate "OK" message, for example:
-
-(/** @j2sNative 1 ? false : */ outputfile.exits())
-
-or
-
-(/** @j2sNative 1 ? true : */ inputfile.exits())
-
-Temporary files can be created in SwingJS. SwingJS will maintain a pseudo-filesystem for files
-created with File.createTempFile(). This is useful in that closure of writing to a temporary file
-does not generate a pseudo-download to the user's machine.
-
-
-UNIMPLEMENTED CLASSES BY DESIGN
-===============================
-
-The SwingJS implementation of the following classes are present
-in a way that gracefully bypasses their functionality:
-
-accessibility
-security
-serialization
-
-
-
-TODO LIST FOR UNIMPLEMENTED CLASSES
-===================================
-
-JEditorPane (minimal implementation) - DONE 12/2018; some issues still
-JSplitPane - DONE 8/2018
-JTabbedPane - DONE 10/2018
-JTree - done 12/2019
-
-
-MINOR ISSUES--required some rewriting/refactoring by Bob and Udo
-================================================================
-
-Thread.currentThread() == dispatchThread
-
-
-MINOR ISSUES--requiring some rewriting/refactoring outside of SwingJS
-=====================================================================
-
-See below for a full discussion.
-
-Restrictions on long
-Restriction on BitSet and Scanner
-HashMap, Hashtable, and HashSet iterator ordering
-interning, new String("xxx") vs "xxx"
-Names with "$" and "_"
-positive integers do not add to give negative numbers
-ArrayIndexOutOfBounds
-java.awt.Color
-native methods
-javax.swing.JFileDialog
-key focus
-LookAndFeel and UI Classes
-System.exit(0) does not stop all processes
-list cell renderers must be JComponents
-myClass.getField not implemented
-"window" and other reserved JavaScript names
-reserved field and method names
-qualified field and method names
-missing Math methods
-Component.getGraphics(), Graphics.dispose()
-Graphics.setClip()
-
-MAJOR ISSUES--for Bob and Udo within SwingJS
-============================================
-
-fonts
-OS-dependent classes
-AWT component peers
-some aspects of reflection
-
-MAJOR ISSUES--to be resolved by implementers
-============================================
-
-fonts
-threads
-modal dialogs
-image loading
-BigDecimal not fully implemented
-no format internationalization
-no winding rules
-text-related field implementation
-Formatter/Regex limitations
-integer 1/0 == Infinity
-
-========================================================================
-
-DISCUSS
-=======
-
-Table row/col sorter needs checking after removal of java.text.Collator references
-
-I had to move all of SunHints class to RenderingHints, or the
-two classes could not be loaded. Shouldn't be a problem, I think. The sun classes are
-not accessible to developers in Java anyway, since they are generally package private.
-
-==========================================================================
-
-//////////////////////////////////////////////////////////////////////////////
-
-UNIMPLEMENTED CLASSES
-=====================
-
-accessibility
--------------
-
-All Accessibility handling has been commented out to save the download footprint.
-This removes the need for sun.misc.SharedSecrets as well.
-Nothing says we could not implement accessibility. We just didn't.
-
-
-security
---------
-
-All JavaScript security is handled by the browser natively.
-Thus, Java security checking is no longer necessary, and
-java.security.AccessController has been simplified to work without
-native security checking.
-
-Note that private methods in a class are REALLY private.
-
-
-serialization
--------------
-
-All serialization has been removed. It was never very useful for Swing anyway,
-because one needs exactly the same Java version to save and restore serialized objects.
-
-
-keyboard accelerators and mnemonics
------------------------------------
-
-This work was completed in the spring of 2019. Note that in a browser, some
-key strokes, particularly CTRL-keys, are not available. Bummer.
-
-
-MINOR ISSUES--required some rewriting/refactoring by Bob and Udo
-================================================================
-
-
-Thread.currentThread() == dispatchThread
-----------------------------------------
-
-changed to JSToolkit.isDispatchThread()
-
-
-MINOR ISSUES--requiring some rewriting/refactoring outside of SwingJS
-=====================================================================
-
-restrictions on long
---------------------
-
-Java's 64-bit long type is not supported in JavaScript. There is no Int64Array in JavaScript,
-and 0x20000000000000 + 1 evaluates to 0x20000000000000, not 0x20000000000001.
-(Likewise, -0x20000000000000 - 1 is left unchanged.)
-
-The largest "integer" value in JavaScript is 9007199254740991 (9.007199254740991E13, or 0x1FFFFFFFFFFFFFF).
-Effectively, you get to use only 53 bits of the long, not 64. Trying to set a long larger than
-0x1FFFFFFFFFFFFFF or smaller than -0x1FFFFFFFFFFFFFF will result in a NumberFormatException.
-
-The transpiler handles conversion to long the same as Java for all cases other than from double.
-
-For small double values, there is no problem, and, in fact, this is a known trick used to round
-doubles and floats toward zero:
-
-double d;
-d = (long) 3.8;
-assert(d == 3);
-d = (long) -3.8;
-assert(d == -3);
-
-SwingJS will evaluate (long) d as 0 for d > 9007199254740991
-or d < -9007199254740991, same as Java returns for Double.NaN.
-So, in Java we have:
-
- assert(((long) Double.NaN) == 0);
- assert(((int) Double.NaN) == 0);
- assert(((long) Float.NaN) == 0);
- assert(((int) Float.NaN) == 0);
-
-and also, in JavaScript only, we also have:
-
- double d = 0x2000000000000L;
- assert(((long) d) == 0);
-
-
-restrictions on BitSet and Scanner
-----------------------------------
-
-Because of the issue of long being only 53 bits, any time a method returns a long value, considerations must
-be made as to whether this will work in JavaScript. In particular, BitSet and Scanner have issues.
-
-In SwingJS, java.util.BitSet has been implemented as a 32-bit integer-based bitset. This was no problem in
-Java 6, but starting with Java 7, a method was added to BitSet that allows for the extraction of the
-underlying long[] word data. This is not work in JavaScript. Instead, SwingJS java.util.Bitset.toLongArray() will deliver
-32-bit int[] data.
-
-SwingJS Scanner has hasNextLong() and nextLong(), and although it will scan through long numbers,
-Scanner will choke on long numbers greater than the JavaScript 53-bit limit. hasNextLong() will
-return false, and nextLong() will throw an InputMismatchException triggered by the NumberFormatException
-thrown by Long.parseLong().
-
-
-HashMap, Hashtable, and HashSet iterator ordering
--------------------------------------------------
-
-In Java, iterators for HashMap, Hashtable, and HashSet do not guarantee any particular order.
-From the HashMap documentation for Java 8:
-
- This class makes no guarantees as to the order of the map; in particular, it does not
- guarantee that the order will remain constant over time.
-
-Likewise, for HashSet (because it is simply a convenience method for HashMap<Object,PRESENT>:
-
- [HashSet] makes no guarantees as to the iteration order of the set.
-
-JavaScript's Map object is different. It is basically a LinkedHashMap, so it guarantees iteration
-in order of object addition.
-
-Starting with java2script 3.2.9.v1, these classes use the JavaScript Map object rather than hash codes
-whenever all keys are strictly of JavaScript typeof "string". If any key is introduced that is not a string, the
-implementation falls back to using hash codes, the same as Java.
-
-Note strings created using new String("xxxx") are NOT typeof "string"; they are typeof "object".
-
-The result is significantly faster performance (3-12 x faster) than originally, and up to 3 x faster
-performance in JavaScript than in Java itself. Right. Faster than Java.
-
-The JavaScript Map implementation is implemented UNLESS the constructor used is the one that
-specifies both initial capacity and load factor in their constructor. Thus,
-
-new Hashtable()
-new HashMap()
-new HashMap(16)
-new HashSet()
-
-all use the JavaScript Map. But
-
-new Hashtable(11, 0.75f)
-new HashMap(16, 0.75f)
-new HashSet(16, 0.75f)
-
-do not.
-
-This design allows for opting out of the JavaScript Map use in order to retain the exact behavior of
-iterators in JavaScript as in Java.
-
-
-interning, new String("xxx") vs "xxx"
--------------------------------------
-
-Note that the following are true in JavaScript:
-
-typeof new String("xxxx") == "object"
-typeof "xxxx" == "string"
-var s = "x";typeof ("xxx" + s) == "string"
-
-There is no equivalence to this behavior in Java, where a String is a String is a String.
-
-Be aware that SwingJS does not always create a JavaScript String object using JavaScript's
-new String(...) constructor. It only does this for Java new String("xxxx") or new String(new String()).
-
-In all other cases, new String(...) (in Java) results in a simple "xxxx" string in JavaScript.
-That is, it will be JavaScript typeof "string", not typeof "object".
-
-The reason for this design is that several classes in the Java core use toString()
-methods that return new String(), and those classes that do that would cause a JavaScript error
-if implicitly stringified if new String() returned a JavaScript String object.
-
-This is fine in JavaScript
-
-test1 = function() { return { toString:function(){ return "OK" } } }
-"testing" + new test1()
->> "testingOK"
-
-But for whatever reason in JavaScript:
-
-test2 = function() { return { toString:function(){ return new String("OK") } } }
-"testing" + new test2()
->> Uncaught TypeError: Cannot convert object to primitive value
-
-The lesson here is never to use
-
- return new String("...");
-
-in a Java toString() method. In Java it will be fine; in JavaScript it will also be fine as long as
-that method is never called in JavaScript implicitly in the context of string concatenation.
-
-A note about interning. Consider the following six Java constructions, where we have a == "x";
-
-"xxx"
-"xx" + "x"
-new String("xxx").intern()
-
-new String("xxx")
-"xx" + a.toString()
-"xx" + a
-
-All six of these will return java.lang.String for .getClass().getName().
-However, the first three are String literals, while the last three are String objects.
-Thus:
- "xxx" == "xxx"
- "xxx" == "xx" + "x"
- "xxx" == new String("xxx").intern()
-
-but none of the other three are equivalent to "xxx" or each other:
-
- "xxx" != new String("xxx")
- "xxx" != "xx" + a.toString()
- "xxx" != "xx" + a
- new String("xxx") != new String("xxx")
- "xx" + a != new String("xxx")
-
-etc.
-
-As in Java, in SwingJS, all of the following Java assertions pass as true:
-
- assert("xxx" == "xx" + "x");
- assert("xxx" == ("xx" + a).intern());
- assert("xxx" === new String("xxx").intern());
-
-and both of these do as well:
-
- assert(new String("xxx") != "xxx");
- assert(new String("xxx") != new String("xxx"));
-
-But the following two fail to assert true:
-
- assert("xxx" != "xx" + a);
- assert("xxx" != "xx" + a.toString());
-
-because in JavaScript, both of these right-side expressions evaluate to a simple "interned" string.
-
-In Java, however, these assertions are true because Java implicitly "boxes" String
-concatentaion as a String object, not a literal.
-
-Most of us know not to generally use == with Strings unless they are explicitly interned.
-Where this problem may arise, though, is in IdentityHashMap, which compares objects using
-System.identityHashCode(), which is not the same for different objects or their string literal equivalents.
-
-My recommendation, if you need to use IdentityHashMap with strings is to always use an explicit String.intern()
-for any keys -- unless you really want to keep every string as separate keys even if they are the same sequence,
-in which case, use new String(). This will work in Java and in JavaScript.
-
-Be aware when working with strings that come from SwingJS and are being used by other JavaScript modules
-that those that are String objects will return "object" for the JavaScript typeof operator, not "string".
-
-The easy way to ensure this is no problem is to concatenate strings with "" to force immediate interning:
-
- var x = aJavaObject.getString() + "";
-
-unless you are certain that the string is being returned is a raw JavaScript string.
-
-Names with "$" and "_"
-----------------------
-
-For the most part, this should be no problem.
-
-Note that the use of $ and _ in Java field names has always been discouraged:
-[https://docs.oracle.com/javase/tutorial/java/nutsandbolts/variables.html]
-
- You may find some situations where auto-generated names will contain the dollar sign,
- but your variable names should always avoid using it. A similar convention
- exists for the underscore character; while it's technically legal to begin your
- variable's name with "_", this practice is discouraged.
-
-Some impacts of transpiling method names with full qualification:
-
-1) SwingJS will introduce fields that start with $ or _. These will not conflict
- if the above convention is followed.
-
-2) Fields that have the same Java name as a method are not an issue.
-
-3) Fields that have a Java name with $ that matches a transpiled method name,
- such as toString$, will need to be refactored in Java to not have that name collision.
-
-4) Fields in a subclass that have the same name as private fields in a superclass
- represent a name collision, because the superclass method needs to call its private
- field even if invoked from a subclass. The solution was to modify the subclass field
- name using one or more prepended $.
-
-5) Use of Class.getDeclaredMethods() reflection will return Method objects having the transpiled
- name, not the Java name. This could require some j2sNative adjustment
- to strip the $... parameters from the name if that is needed.
-
-6) Use of Method.getParameterTypes() should work fine, provided class names
- do not contain "_". This is because the transpiler converts "." to "_" when
- creating the fully qualified JavaScript name.
-
-
-positive integers do not add to give negative numbers
------------------------------------------------------
-
-In Java, the following is true:
-
- 2000000000 + 2000000000 == -294967296
-
-But in SwingJS, that will be 4000000000. So, for example, the following
-strategy will fail in SwingJS:
-
- int newLength = lineBuf.length * 2;
- if (newLength < 0) {
- newLength = Integer.MAX_VALUE;
- }
-
-"-1" in JavaScript is not 0xFFFFFFFF.
-
-And one must take care to not compare a negative number with a 32-bit mask. So
-
-(b & 0xFF000000) == 0xFF000000
-
-is true in Java for (int) b = -1, but is false in JavaScript, because 0xFF000000 is 4278190080,
-while (-1 & 0xFF000000) is, strangely enough, -16777216, and, in fact,
-
-(0xFF000000 & 0xFF000000) != 0xFF000000
-
-because -16777216 is not 4278190080.
-
-The fix is that one must compare similar operations:
-
-if ((b & 0xFF000000) == (0xFF000000 & 0xFF000000)) .....
-
-Importantly, the JavaScript Int32Array does behave properly. From
-the Firefox developer console:
-
->> x = new Int32Array(1)
-<- Int32Array(1) [ 0 ]
->> x[0] = 4000000000
-<- 4000000000
->> x[0]
-<- -294967296
-
-Notice that, perhaps unexpectedly, the following two constructs produce
-different results in JavaScript:
-
-x = new Int32Array(1);
-b = x[0] = 4000000000;
-
-(b will be 4000000000)
-
-and
-
-x = new Int32Array(1);
-x[0] = 4000000000;
-b = x[0];
-
-(b will be -294967296)
-
-
-SwingJS leverages array typing to handle all byte and short arithmetic so as
-to ensure that any byte or short operation in JavaScript does give the same
-result in Java. The design decision to not also do this with integer math was
-a trade-off between performance and handling edge cases.
-
-
-ArrayIndexOutOfBounds
----------------------
-
-You cannot implicitly throw an ArrayIndexOutOfBoundsException in JavaScript.
-JavaScript will simply return "undefined", not throw an Exception. So:
-
-boolean notAGoodIdeaIsOutOfBounds(String[] sa, int i) {
- try {
- return (sa[i] == sa[i]);
- } catch (ArrayIndexOutOfBoundsException e) {
- return false;
- }
-}
-
-will work in Java but not in JavaScript. Code should not depend upon this sort
-of trap anyway, if you ask me.
-
-Throwable vs Error vs Exception
--------------------------------
-
-True JavaScript errors are trapped as Throwable, whereas you can still trap
-Error and Exception as well. So if you want to be sure to catch any JavaScript
-error, use try{}catch (Throwable t){}, not try{}catch (Exception e){}.
-
-j
-ava.awt.Color
---------------
-
-ColorSpace: only "support" CS_sRGB.
-
- TODO -- any volunteers??
-
-
-javax.swing.JFileDialog
------------------------
-
-HTML5 cannot expose a file reading directory structure. But you certainly
-can still do file reading and writing. It just works a little differently.
-It's a simple modification:
-
- b = new JButton("FileOpenDialog");
- b.addActionListener(new ActionListener() {
-
- @Override
- public void actionPerformed(ActionEvent e) {
- JFileChooser fc = new JFileChooser();
- Test_Dialog.this.onDialogReturn(fc.showOpenDialog(Test_Dialog.this));
- // Java will wait until the dialog is closed, then enter the onDialogReturn method.
- // JavaScript will exit with NaN immediately, and then call back with its actual value
- // asynchronously.
- }
-
- });
-
- public void onDialogReturn(int value) {
- if (value != Math.floor(value))
- return; // in JavaScript, this will be NaN, indicating the dialog has been opened
- // If we are here, the dialog has closed, in both Java and JavaScript.
- System.out.println("int value is " + value);
- }
-
-
- @Override
- public void propertyChange(PropertyChangeEvent event) {
- Object val = event.getNewValue();
- String name = event.getPropertyName();
- System.out.println(name);
- switch (event.getSource().getClass().getName()) {
- case "javax.swing.JOptionPane":
- switch (name) {
- case "inputValue":
- onDialogReturn(val);
- return;
- case "value":
- if (val instanceof Integer)
- onDialogReturn(((Integer) val).intValue());
- else
- onDialogReturn(val);
- return;
- }
- break;
- case "javax.swing.ColorChooserDialog":
- switch (name) {
- case "SelectedColor":
- onDialogReturn(val);
- return;
- }
- break;
- case "javax.swing.JFileChooser":
- switch (name) {
- case "SelectedFile":
- File file = (File) val;
- byte[] array = (val == null ? null : /** @j2sNative file.秘bytes || */
- null);
- onDialogReturn("fileName is '" + file.getName() + "'\n\n" + new String(array));
- return;
- }
- break;
- }
- System.out.println(
- event.getSource().getClass().getName() + " " + event.getPropertyName() + ": " + event.getNewValue());
- }
-
-
-Developers are encouraged to create a separate class that handles general calls to JFileDialog.
-An example class can be found in the SwingJS distribution as
-
-/sources/net.sf.j2s.java.core/src/javajs/async/AsyncFileChooser.java.
-
-
-javax.swing.JOptionPane dialogs
--------------------------------
-
-For this action to work, the parentComponent must implement
-propertyChangeListener, and any call to JOptionPanel should allow for
-an asynchronous response, meaning that there is no actionable code following the
-call to the dialog opening.
-
-In addition, for compatibility with the Java version, implementation should
-wrap the call to getConfirmDialog or getOptionDialog in a method call to
-handle the Java:
-
-onDialogReturn(JOptionPane.showConfirmDialog(parentFrame,
-messageOrMessagePanel, "title", JOptionPane.OK_CANCEL_OPTION));
-
-Then parentFrame.propertyChange(event) should also call onDialogReturn.
-
-This will then work in both Java and JavaScript.
-
-Note that there is an int and an Object version of onDialogReturn().
-
-
-In JavaScript:
-
-The initial return from JOptionPane.showConfirmDialog and showMessageDialog
-will be (SwingJS) JDialog.ASYNCHRONOUS_INTEGER (NaN), testable as an impossible
-Java int value using ret != -(-ret) if the parent implements PropertyChangeListener, or -1
-(CLOSE_OPTION) if not.
-
-For showOptionDialog (which returns Object) or showInputDialog (which returns
-String), the initial return will be (SwingJS) JDialog.ASYNCHRONOUS_OBJECT, testable as
-((Object) ret) instanceof javax.swing.plaf.UIResource if the parent implements
-PropertyChangeListeneer, or null if not.
-
-The second return will be the desired return.
-
-In Java:
-
-The initial return will be the one and only modal final return.
-
-
-
-For full compatibility, The calling method must not continue beyond this
-call.
-
-All of the standard Java events associated with Components are also
-available.
-
-Certain fall back mechanisms are possible, where onReturn does not exist, but
-only for the following cases:
-
-
-For showMessageDialog, for WARNING_MESSAGE and ERROR_MESSAGE, a simple
-JavaScript alert() is used, returning 0 (OK_OPTION) or -1 (CLOSED_OPTION).
-
-For showInputDialog, if the message is a string, a simple JavaScript prompt()
-with input box is used, returning the entered string or null.
-
-For showConfirmDialog, a simple JavaScript confirm() is used, in which case:
-
-for YES_NO_OPTION: YES_OPTION or NO_OPTION
-
-for YES_NO_CANCEL_OPTION: YES_OPTION or CANCEL_OPTION
-
-for OK_CANCEL_OPTION or any other: OK_OPTION or CANCEL_OPTION
-
-Note that you should implement a response for CLOSED_OPTION for
-showConfirmDialog. For other dialogs, a null return indicates the dialog was
-closed, just as for Java.
-
-Developers are encouraged to create a separate class that handles general calls.
-An example class can be found in the SwingJS distribution as src/javajs/async/AsyncDialog.java.
-Very simple modifications to the Java allows asynchronous operation using AsyncDialog. Here
-is a simple "do you want to close this frame" example, where you can see that what we have
-done is to set the reply into an ActionListener that is defined in the constructor of
-the AsyncDisplay object:
-
-// Original:
-//
-// private void promptQuit() {
-// int sel = JOptionPane.showConfirmDialog(null, PROMPT_EXIT, NAME, JOptionPane.YES_NO_OPTION);
-// switch (sel) {
-// case JOptionPane.YES_OPTION:
-// resultsTab.clean();
-// seqs.dispose();
-// if (fromMain) {
-// System.exit(0);
-// }
-// break;
-// }
-// }
-
- private void promptQuitAsync() {
- new AsyncDialog(new ActionListener() {
-
- @Override
- public void actionPerformed(ActionEvent e) {
- int sel = ((AsyncDialog)e.getSource()).getOption();
- switch (sel) {
- case JOptionPane.YES_OPTION:
- resultsTab.clean();
- seqs.dispose();
- if (fromMain) {
- System.exit(0);
- }
- break;
- }
- }}).showConfirmDialog(null, PROMPT_EXIT, NAME, JOptionPane.YES_NO_OPTION);
- }
-
-Very simple!
-
-
-native methods
---------------
-
-The J2S compiler ignores all static native method declarations.
-Anything of this nature needs to be implemented in JavaScript if it is needed,
-using j2sNative blocks:
-
-/**
- * @j2sNative
- *
- * var putYourJavaScriptCodeHere
- *
- */
-
- Note that if you follow that directly with a {...} block, then
- the javadoc code will run in JavaScript, and the {...} code will run in Java.
-
-
-key Focus
----------
-
-As of June, 2019, the keyboard focus manager is fully implemented.
-The one catch is that JTextPane and JTextArea, which already consume
-VK_TAB in Java, cannot use CTRL-TAB to continue a tabbing cycle around
-the components in a window. Instead, CTRL-TAB is absorbed by the browser.
-
-
-LookAndFeel and UI Classes
---------------------------
-
-SwingJS implements the native browser look and feel as swingjs.plaf.HTML5LookAndFeel.
-There are small differences between all look and feels -- MacOS, Windows, SwingJS.
-
-Expert developers know how to coerce changes in the UI by subclassing the UI for a
-component. This probably will not work in SwingJS.
-
-Note that LookAndFeel in Java usually determines canvas size in a Frame because
-different operating systems (Mac OS vs Windows vs HTML5) will have
-different edge sizes on their frames. If you want to ensure a component size,
-use getContentPane().setPreferredSize().
-
-
-System.exit(0) does not stop all processes
-------------------------------------------
-
-Although System.ext(int) has been implemented in JavaScript, it just closes the
-frames, stops all pending javax.swing.Timer objects in the queue, and runs any
-threads added using Runtime.getRuntime().addShutdownHook(Thread).
-It may not stop all "threads." So don't rely on that.
-Applications are responsible for shutting down prior to executing System.exit(0).
-
-
-myClass.getField not implemented
---------------------------------
-
-java.lang.reflect.Field is implemented minimally. It is not
-certain that Field.getDeclaringClass() will work. If you just want a
-value of a field, you can do this:
-
-/**
- *@j2sNative
- *
- * return myClass[name]
- */
-
-But that is not a java.lang.reflection.Field object.
-
-
-"window" and other reserved JavaScript names
---------------------------------------------
-
-No reserved top-level JavaScript name is allowed for a package name. So, for example,
-one must rename packages such as "window" or "document" to names such as "win" or "doc".
-
-reserved field and method names
--------------------------------
-
-In order to minimize the chance of added SwingJS field and method names colliding with ones
-developers might use in subclassing Java classes, we have added U+79D8 (first character of Mandarin
-"secret") to the characters already disrecommended by Java documentation ("$" and "_"). The only problem
-would be if you use that character followed by certain English words in certain classes. For example
-\u79D8canvas for JComponents (in java.awt.JSComponent) and \u79D8byte (in java.io.File).
-
-qualified field and method names
---------------------------------
-
-Method names in SwingJS are fully qualified, meaning two methods with the same Java name but different
-parameters, such as write(int) and write(double), must not have the same name in JavaScript. (In this
-case, we will have write$I and write$D.) However, in certain cases it may be desirable to leave the
-method names unqualified. In particular, when an interface actually represents a JavaScript object,
-the transpiler can leave a method name unqualified. The default situation for this is a class name
-includes ".api.js" (case-sensitive). This means that any method in any class in a package js within
-a package api, or any private interface js that has an outer interface api, will have all-unqualified
-methods. An example of this is swingjs.plaf.JSComboPopupList, which needs to communicate with a jQuery
-object directly using the following interface:
-
- private interface api {
-
- interface js extends JQueryObject {
-
- abstract js j2sCB(Object options);
-
- abstract Object[] j2sCB(String method);
-
- abstract Object[] j2sCB(String method, Object o);
-
- abstract Object[] j2sCB(String method, int i);
-
- abstract int j2sCB(String OPTION, String name);
-
- }
- }
-
-Notice that all these variants of j2sCB() will call the same method in JavaScript by design.
-
-
-missing Math methods
---------------------
-
-java.lang.Math is worked out, but some methods are missing, either because they
-involve long integer value that are inaccessible in JavaScript, or because I just
-didn't implement them. This is a result of continued Java development.
-It is easy enough to add these methods if you have the source. They go into j2sClazz.js,
-which is combined with other initial libraries into swingjs2.js by build_site.xml
-
-
-Component.getGraphics(), Graphics.dispose()
--------------------------------------------
-
-Use of component.getGraphics() is discouraged in Java and in SwingJS.
-Specifically in SwingJS, any call to component.getGraphics() or
-BufferedImage.createGraphics() or Graphics.create(...) should be matched with graphics.dispose(),
-particularly when it is called outside the context of a paint(Graphics)
-call from the system.
-
-If you see your graphics scrolling down the page with each repaint,
-look for where you have used Component.getGraphics() and not Graphics.dispose().
-For example, this will definitely NOT work in SwingJS:
-
- this.paint(getGraphics())
-
-and really should not work in Java, either, as it is technically a resource memory leak.
-
-Instead, if you really do not want to use repaint(), use this:
-
- Graphics g = getGraphics();
- paint(g);
- g.dispose();
-
-
-
-Graphics.setClip()
-------------------
-
-The HTML5 canvas.clip() method is permanent. You can only reset the clip using
-save/restore. This is different from Java, where you can temporarily change it using
-
- Shape oldClip = Graphics.getClip();
- Graphics.setClip(newClip);
- ...
- Graphics.setClip(oldClip);
-
-If you need to do something like this, you must schedule the paints
-to not have overlapping clip needs.
-
-
-MAJOR ISSUES--for Bob and Udo within SwingJS
-============================================
-
-fonts
------
-
-Fonts and FontMetrics will all be handled in JavaScript. Font matching will
-not be exact, and composite (drawn) fonts will not be supported.
-
-SwingJS handles calls such as font.getFontMetrics(g).stringWidth("xxx") by
-creating a <div> containing that text, placing it in an obscure location on
-the page, and reading div.getBoundingClientRect(). This is a VERY precise
-value, but can be a pixel or two off from what Java reports for the same font.
-
-
-OS-dependent classes
---------------------
-
-Static classes such as:
-
- java.awt.Toolkit
- java.awt.GraphicsEnvironment
-
-
-which are created using Class.forName are implemented using classes in the swingjs package.
-
-AWTAccessor is not implemented.
-
-
-AWT component peers and component "ui" user interfaces
-------------------------------------------------------
-
-ComponentPeer is a class that represents a native AWT component.
-Components with such peers are called "heavy-weight" components.
-They are expected to do the dirty work of graphics drawing.
-
-Java Swing implements peers only for JApplet, JDialog, JFrame, and JWindow.
-References to such objects have been removed, but clearly there must be
-some connection to similar DOM objects, even for "light-weight" components.
-
-
-
-MAJOR ISSUES--to be resolved by implementers
-============================================
-
-fonts
------
-
-Glyph/composite/outline fonts are not supported.
-
-
-
-threads
--------
-
-Thread locking and synchronization are not relevant to JavaScript.
-Thus, anything requiring "notify.." or "waitFor.." could be a serious issue.
-
-All threading must be "faked" in JavaScript. Specifically not available is:
-
- Thread.sleep()
-
-javax.swing.AbstractButton#doClick(pressTime) will not work, as it requires Thread.sleep();
-
-However, java.lang.Thread itself is implemented and used extensively.
-
-Methods thread.start() and thread.run() both work fine.
-
-For simple applications that use Thread.sleep() just to have a delay, as in a frame rate, for
-example, one can use javax.swing.Timer instead. That is fully implemented.
-
-Likewise, java.util.Timer can be replaced with no loss of performance with javax.Swing.Timer.
-Note that java.util.TimerTask is implemented, but it can also be replaced by an implementation of Runnable.
-
-task = new TimerTask(){....};
-t = new java.util.Timer();
-t.schedule(task, 0, 1);
-
-becomes
-
-task = new TimerTask(){....}; // or task = new Runnable() {...}
-t = new javax.swing.Timer(1, new ActionListener() {
- @Override
- public void actionPerformed(ActionEvent e) {
- task.run();
- }
-};
-t.setInitialDelay(0); // not particularly necessary
-t.start();
-
-In addition, SwingJS provides swingjs.JSThread, which can be subclassed
-if desired. This class allows simple
-
- while(!interrupted()){
- wait()
- ...
- }
-
-action through an asynchronous function run1(mode). For example:
-
- protected void run1(int mode) {
- try {
- while (true)
- switch (mode) {
- case INIT:
- // once-through stuff here
- mode = LOOP;
- break;
- case LOOP:
- if (!doDispatch || isInterrupted()) {
- mode = DONE;
- } else {
- Runnable r = new Runnable() {
- public void run() {
- // put the loop code here
- }
- };
- dispatchAndReturn(r);
- if (isJS)
- return;
- }
- break;
- // add more cases as needed
- case DONE:
- // finish up here
- if (isInterrupted())
- return;
- // or here
- break;
- }
- } finally {
- // stuff here to be executed after each loop in JS or at the end in Java
- }
- }
-
-image loading
--------------
-- All image loading in SwingJS is synchronous. A MediaTracker call will immediately return "complete".
- However, it still may take one system clock tick to fully load images. Thus, it is recommended that
- images be preloaded in the static block of the applet if it is necessary that they be available in init().
- This is only an issue if you are trying to access the pixel buffer of the image in JavaScript.
-
-- Applet.getImage(path, name) will return null if the image does not exist.
-
-- BufferedImage: only "support" imageType RGB and ARGB
-
- -BH: This is a temporary edit, just to get us started. Certainly GRAY will be needed
-
-
-BigInteger and BigDecimal
--------------------------
-
-java.math.BigInteger is fully supported; java.math.BigDecimal is roughed
-in and not fully tested (07/2019).
-
-Both classes present significant issues for JavaScript, as they are based in
-Java's 64-bit long for all their operations. Here is the JavaDoc note I added
-to BigInteger:
-
- * SwingJS note: Because of the limitations of JavaScript with regard
- * to long-integer bit storage as a double, this implementation drops
- * the integer storage bit length to 24, giving 48 for long and leaving
- * the last 16 bits clear for the exponent of the double number. This should
- * not affect performance significantly. It does increase the storage
- * size by about 33%. By bringing an "int" to 3 bytes, we can easily construct
- * and use byte[] data intended for the original BitSet.
-
-"Easily" may be a bit strong there. This was a serious challenge.
-
-BigDecimal seems to run normally, but in order to do that, my hack involves
-reducing the size of an integer that is allowed to be stored as such and not
-in byte[] as a BigInteger. I'm sure there is a performance hit, but it does work.
-
-no format internationalization
-------------------------------
-
-For now, just en for number and date formatters
-
-no winding rules
-----------------
-
- When filling a graphic, only nonzero winding rule is implemented in HTML5 Canvas2D.
-
-
-
-text-related field implementation
----------------------------------
-
-Text fields are:
-
-JTextField (JavaScript <input type="text">)
-JTextArea (JavaScript <textarea>)
-JTextPane (JavaScript <div>)
-JEditorPane (JavaScript <div>)
-
-For the initial implementation, we don't implement infinite undo/redo, and the abstract
-document model is much less elaborate. Only PlainDocument (in the form of JSPlainDocument)
-is implemented. The Document returned by JTextField.getDocument() is a javax.swing.text.Document.
-
-All scrolling is handled by HTML5. javax.swing.AutoScroller is not implemented.
-public static methods .stop, .isRunning, .processMouseDragged require true Java threading
-and so are not implmented. javax.swing.text.View and its subclasses are not implemented.
-
-The JS document model does not allow two text fields to address the same underlying document.
-
-JavaScript is slightly different from Java in that the field value is changed asynchronously after
-the keypressed event, so Java actions that are keyed to KEY_PRESSED may not pick up the new
-key value even after SwingUtilities.invokeLater() is called. Thus, key pressed actions may need
-to be recorded after a key released event instead.
-
-Formatter/Regex limitations
----------------------------
-
-Some browsers cannot process Regex "look-behind" process such as (?<=\W)
-java.util.regex.Matcher and Pattern use JavaScript's RegExp object rather than
-the native Java object. These are not identical. Only flags /igm are supported.
-Matcher.start(groupID) is not supported.
-
-java.util.Formatter will function correctly for all standard %... patterns.
-
-integer 1/0 == Infinity
------------------------
-
-1/0 in Java throws "java.lang.ArithmeticException: / by zero", but in JavaScript is just Infinity.
-
-
-
-Summary
--------
-
-These are all the known limitations of SwingJS. We have not found any of these limitations
-to be show-stoppers. The primary issue for newcomers to SwingJS is having the source code.
-You must check that source code for all your library jar files is available or, if you
-choose, you will need to decompile those classes. We have used decompilation on some projects,
-and it works just fine. So, technically, all we really need are JAR/class files. But the
-source is by far superior. It's generally prettier, and it has the license information that
-may or may not be present with the JAR or class files. Use class files at your own risk.
-
-Bob Hanson
-2019.08.16
-
-
-Additional Issues
------------------
-
-Annotation is working for classes, methods, and fields (12/22/19). Method reflection, however,
-is limited. Interfaces do not expose their methods, as the transpiler does not actually transpile
-the interfaces themselves. And method reflection only includes annotated methods.
-
-java.util.concurrent is not fully elaborated. This package is rewritten to not actually use the
-memory handling capabilities of concurrency, which JavaScript does not have access to.
-
-System.getProperties() just returns a minimal set of properties.
-
-
+++ /dev/null
-20201219150605
-20210208070817
+20220627235431
java2script/SwingJS Notes
=========================
+updated 3/11/2023 -- adds support for Java Regex Matcher.start/end(groupID) and .start/end(groupName)
updated 12/31/2020 -- full support for 64-bit long
updated 12/6/2020 -- note about restrictions on long, including BitSet and Scanner
updated 3/21/2020 -- adds note about HashMap, Hashtable, and HashSet iterator ordering
Some browsers cannot process Regex "look-behind" process such as (?<=\W)
java.util.regex.Matcher and Pattern use JavaScript's RegExp object rather than
the native Java object. These are not identical. Only flags /igm are supported.
-Matcher.start(groupID) is not supported.
+Matcher.start(groupID)/.end(groupID) is supported.
+(x*)? failure returns null, not empty string.
java.util.Formatter will function correctly for all standard %... patterns.
-20210728172208
+20230831104534
+++ /dev/null
-This is sources/net.sf.j2s.java.core/dist/DEV_NOTES.txt
-
-_j2sclasslist.txt
-
-the list of .js files concatenated into coreswingjs.js and minified to coreswingjs.z.js
-
-
-SwingJS-site.zip
-
-the full site directory for SwingJS including all files not in the test/ directory.
+++ /dev/null
-This directory holds 3.2.9 transpiler and runtime tagged previous
-to the transpiler fix for boxed number direct manipulation:
-
-Long L = Long.valueOf(3);
-L++;
-L /= 2;
-L += 10;
-L = L / 5;
-
-etc.
-
-These assignments are not made properly and fail.
-
-In addition, this runtime does not handle Long properly and also had an issue with Short.equals(Object)
-
-just saving this and will probably delete it.
-
+++ /dev/null
-java/applet/Applet.js
-java/applet/AppletContext.js
-java/applet/AppletStub.js
-java/applet/JSApplet.js
-java/awt/ActiveEvent.js
-java/awt/Adjustable.js
-java/awt/AWTEvent.js
-java/awt/AWTEventMulticaster.js
-java/awt/AWTKeyStroke.js
-java/awt/BasicStroke.js
-java/awt/BorderLayout.js
-java/awt/Button.js
-java/awt/Color.js
-java/awt/color/ColorSpace.js
-java/awt/Component.js
-java/awt/ComponentOrientation.js
-java/awt/ContainerOrderFocusTraversalPolicy.js
-java/awt/Container.js
-java/awt/Cursor.js
-java/awt/DefaultFocusTraversalPolicy.js
-java/awt/DefaultKeyboardFocusManager.js
-java/awt/Dialog.js
-java/awt/Dimension.js
-java/awt/dnd/peer/DropTargetPeer.js
-java/awt/event/ActionListener.js
-java/awt/event/AdjustmentEvent.js
-java/awt/event/AdjustmentListener.js
-java/awt/event/AWTEventListener.js
-java/awt/event/ComponentAdapter.js
-java/awt/event/ComponentEvent.js
-java/awt/event/ComponentListener.js
-java/awt/event/ContainerListener.js
-java/awt/event/FocusEvent.js
-java/awt/event/FocusListener.js
-java/awt/event/HierarchyBoundsListener.js
-java/awt/event/HierarchyListener.js
-java/awt/event/InputEvent.js
-java/awt/event/InputMethodListener.js
-java/awt/event/InvocationEvent.js
-java/awt/event/ItemEvent.js
-java/awt/event/ItemListener.js
-java/awt/event/KeyListener.js
-java/awt/event/MouseEvent.js
-java/awt/event/MouseListener.js
-java/awt/event/MouseMotionListener.js
-java/awt/event/MouseWheelListener.js
-java/awt/event/TextListener.js
-java/awt/event/WindowAdapter.js
-java/awt/event/WindowEvent.js
-java/awt/event/WindowFocusListener.js
-java/awt/event/WindowListener.js
-java/awt/event/WindowStateListener.js
-java/awt/EventDispatchThread.js
-java/awt/EventFilter.js
-java/awt/EventQueue.js
-java/awt/EventQueueItem.js
-java/awt/FlowLayout.js
-java/awt/FocusTraversalPolicy.js
-java/awt/Font.js
-java/awt/font/FontRenderContext.js
-java/awt/FontMetrics.js
-java/awt/Frame.js
-java/awt/geom/AffineTransform.js
-java/awt/geom/Dimension2D.js
-java/awt/geom/Path2D.js
-java/awt/geom/PathIterator.js
-java/awt/geom/Point2D.js
-java/awt/geom/Rectangle2D.js
-java/awt/geom/RectangularShape.js
-java/awt/geom/RectIterator.js
-java/awt/GraphicsCallback.js
-java/awt/GraphicsConfiguration.js
-java/awt/GraphicsDevice.js
-java/awt/GraphicsEnvironment.js
-java/awt/Image.js
-java/awt/image/ImageObserver.js
-java/awt/Insets.js
-java/awt/ItemSelectable.js
-java/awt/JSComponent.js
-java/awt/JSDialog.js
-java/awt/JSFrame.js
-java/awt/JSPanel.js
-java/awt/KeyboardFocusManager.js
-java/awt/KeyEventDispatcher.js
-java/awt/KeyEventPostProcessor.js
-java/awt/Label.js
-java/awt/LayoutManager.js
-java/awt/LayoutManager2.js
-java/awt/LightweightDispatcher.js
-java/awt/Paint.js
-java/awt/Panel.js
-java/awt/peer/ComponentPeer.js
-java/awt/peer/ContainerPeer.js
-java/awt/peer/FramePeer.js
-java/awt/peer/KeyboardFocusManagerPeer.js
-java/awt/peer/LightweightPeer.js
-java/awt/peer/WindowPeer.js
-java/awt/Point.js
-java/awt/Queue.js
-java/awt/Rectangle.js
-java/awt/RenderingHints.js
-java/awt/Scrollbar.js
-java/awt/ScrollPane.js
-java/awt/Shape.js
-java/awt/Stroke.js
-java/awt/TextArea.js
-java/awt/TextComponent.js
-java/awt/TextField.js
-java/awt/Toolkit.js
-java/awt/Transparency.js
-java/awt/Window.js
-java/beans/ChangeListenerMap.js
-java/beans/PropertyChangeEvent.js
-java/beans/PropertyChangeListener.js
-java/beans/PropertyChangeSupport.js
-java/lang/AbstractStringBuilder.js
-java/lang/Class.js
-java/lang/Enum.js
-java/lang/Iterable.js
-java/lang/reflect/Constructor.js
-java/lang/reflect/Method.js
-java/lang/StringBuffer.js
-java/lang/StringBuilder.js
-java/lang/Thread.js
-java/lang/ThreadGroup.js
-java/math/RoundingMode.js
-java/net/URL.js
-java/net/URLStreamHandlerFactory.js
-java/net/HttpURLConnection.js
-java/net/URLStreamHandler.js
-javax/net/ssl/HttpsUrlConnection.js
-java/text/CharacterIterator.js
-java/text/DecimalFormat.js
-java/text/DecimalFormatSymbols.js
-java/text/DigitList.js
-java/text/FieldPosition.js
-java/text/Format.js
-java/text/NumberFormat.js
-java/util/AbstractCollection.js
-java/util/AbstractList.js
-java/util/AbstractMap.js
-java/util/AbstractSequentialList.js
-java/util/AbstractSet.js
-java/util/ArrayList.js
-java/util/Arrays.js
-java/util/Collection.js
-java/util/Collections.js
-java/util/Comparator.js
-java/util/Deque.js
-java/util/Dictionary.js
-java/util/Enumeration.js
-java/util/EventListener.js
-java/util/EventObject.js
-java/util/HashMap.js
-java/util/HashSet.js
-java/util/Hashtable.js
-java/util/IdentityHashMap.js
-java/util/Iterator.js
-java/util/LinkedHashMap.js
-java/util/LinkedList.js
-java/util/List.js
-java/util/ListResourceBundle.js
-java/util/Locale.js
-java/util/Map.js
-java/util/Objects.js
-java/util/Queue.js
-java/util/Random.js
-java/util/RandomAccess.js
-java/util/ResourceBundle.js
-java/util/Set.js
-java/util/TimSort.js
-java/util/Vector.js
-javajs/api/JSFunction.js
-javajs/util/AjaxURLConnection.js
-javajs/util/AjaxURLStreamHandlerFactory.js
-javajs/util/AU.js
-javajs/util/JSThread.js
-javajs/util/Lst.js
-javajs/util/PT.js
-javajs/util/Rdr.js
-javajs/util/SB.js
-javax/swing/AbstractAction.js
-javax/swing/AbstractButton.js
-javax/swing/AbstractListModel.js
-javax/swing/Action.js
-javax/swing/ActionMap.js
-javax/swing/AncestorNotifier.js
-javax/swing/ArrayTable.js
-javax/swing/border/AbstractBorder.js
-javax/swing/border/BevelBorder.js
-javax/swing/border/Border.js
-javax/swing/border/CompoundBorder.js
-javax/swing/border/EmptyBorder.js
-javax/swing/border/EtchedBorder.js
-javax/swing/border/LineBorder.js
-javax/swing/border/TitledBorder.js
-javax/swing/BorderFactory.js
-javax/swing/BoundedRangeModel.js
-javax/swing/BoxLayout.js
-javax/swing/ButtonGroup.js
-javax/swing/ButtonModel.js
-javax/swing/ClientPropertyKey.js
-javax/swing/ComboBoxModel.js
-javax/swing/DefaultBoundedRangeModel.js
-javax/swing/DefaultButtonModel.js
-javax/swing/DefaultComboBoxModel.js
-javax/swing/DefaultSingleSelectionModel.js
-javax/swing/DropMode.js
-javax/swing/event/AncestorEvent.js
-javax/swing/event/AncestorListener.js
-javax/swing/event/CaretEvent.js
-javax/swing/event/CaretListener.js
-javax/swing/event/ChangeEvent.js
-javax/swing/event/ChangeListener.js
-javax/swing/event/DocumentEvent.js
-javax/swing/event/DocumentListener.js
-javax/swing/event/EventListenerList.js
-javax/swing/event/ListDataEvent.js
-javax/swing/event/ListDataListener.js
-javax/swing/event/UndoableEditEvent.js
-javax/swing/event/UndoableEditListener.js
-javax/swing/FocusManager.js
-javax/swing/InternalFrameFocusTraversalPolicy.js
-javax/swing/LayoutComparator.js
-javax/swing/LayoutFocusTraversalPolicy.js
-javax/swing/SortingFocusTraversalPolicy.js
-javax/swing/SwingContainerOrderFocusTraversalPolicy.js
-javax/swing/SwingDefaultFocusTraversalPolicy.js
-javax/swing/Icon.js
-javax/swing/ImageIcon.js
-javax/swing/InputMap.js
-javax/swing/JApplet.js
-javax/swing/JButton.js
-javax/swing/JCheckBox.js
-javax/swing/JCheckBoxMenuItem.js
-javax/swing/JComboBox.js
-javax/swing/JComponent.js
-javax/swing/JFrame.js
-javax/swing/JLabel.js
-javax/swing/JLayeredPane.js
-javax/swing/JMenu.js
-javax/swing/JMenuBar.js
-javax/swing/JMenuItem.js
-javax/swing/JPanel.js
-javax/swing/JPopupMenu.js
-javax/swing/JRadioButtonMenuItem.js
-javax/swing/JRootPane.js
-javax/swing/JScrollBar.js
-javax/swing/JScrollPane.js
-javax/swing/JSeparator.js
-javax/swing/JTextArea.js
-javax/swing/JTextField.js
-javax/swing/JToggleButton.js
-javax/swing/JViewport.js
-javax/swing/KeyboardManager.js
-javax/swing/KeyStroke.js
-javax/swing/ListModel.js
-javax/swing/LookAndFeel.js
-javax/swing/MenuElement.js
-javax/swing/MutableComboBoxModel.js
-javax/swing/plaf/ActionMapUIResource.js
-javax/swing/plaf/basic/BasicBorders.js
-javax/swing/plaf/BorderUIResource.js
-javax/swing/plaf/ColorUIResource.js
-javax/swing/plaf/ComponentUI.js
-javax/swing/plaf/DimensionUIResource.js
-javax/swing/plaf/FontUIResource.js
-javax/swing/plaf/InputMapUIResource.js
-javax/swing/plaf/InsetsUIResource.js
-javax/swing/plaf/UIResource.js
-javax/swing/RepaintManager.js
-javax/swing/RootPaneContainer.js
-javax/swing/Scrollable.js
-javax/swing/ScrollPaneConstants.js
-javax/swing/ScrollPaneLayout.js
-javax/swing/SingleSelectionModel.js
-javax/swing/SizeRequirements.js
-javax/swing/SwingConstants.js
-javax/swing/SwingPaintEventDispatcher.js
-javax/swing/SwingUtilities.js
-javax/swing/text/AbstractDocument.js
-javax/swing/text/AttributeSet.js
-javax/swing/text/Caret.js
-javax/swing/text/DefaultCaret.js
-javax/swing/text/DefaultEditorKit.js
-javax/swing/text/Document.js
-javax/swing/text/EditorKit.js
-javax/swing/text/Element.js
-javax/swing/text/GapContent.js
-javax/swing/text/GapVector.js
-javax/swing/text/JTextComponent.js
-javax/swing/text/MutableAttributeSet.js
-javax/swing/text/PlainDocument.js
-javax/swing/text/PlainView.js
-javax/swing/text/Position.js
-javax/swing/text/Segment.js
-javax/swing/text/SegmentCache.js
-javax/swing/text/SimpleAttributeSet.js
-javax/swing/text/Style.js
-javax/swing/text/StyleConstants.js
-javax/swing/text/StyleContext.js
-javax/swing/text/TabExpander.js
-javax/swing/text/TextAction.js
-javax/swing/text/Utilities.js
-javax/swing/text/View.js
-javax/swing/tree/TreeNode.js
-javax/swing/UIDefaults.js
-javax/swing/UIManager.js
-javax/swing/undo/AbstractUndoableEdit.js
-javax/swing/undo/CompoundEdit.js
-javax/swing/undo/UndoableEdit.js
-javax/swing/ViewportLayout.js
-javax/swing/WindowConstants.js
-sun/awt/AppContext.js
-sun/awt/AWTAutoShutdown.js
-sun/awt/CausedFocusEvent.js
-sun/awt/ComponentFactory.js
-sun/awt/KeyboardFocusManagerPeerProvider.js
-sun/awt/MostRecentKeyValue.js
-sun/awt/MostRecentThreadAppContext.js
-sun/awt/PaintEventDispatcher.js
-sun/awt/PostEventQueue.js
-sun/awt/RequestFocusController.js
-sun/awt/SunToolkit.js
-sun/awt/WindowClosingListener.js
-sun/awt/WindowClosingSupport.js
-sun/awt/image/DataStealer.js
-sun/awt/image/IntegerComponentRaster.js
-sun/awt/image/IntegerInterleavedRaster.js
-sun/awt/image/SunWritableRaster.js
-sun/font/FontDesignMetrics.js
-sun/swing/DefaultLookup.js
-sun/swing/SwingLazyValue.js
-sun/text/resources/FormatData.js
-sun/text/resources/en/FormatData_en.js
-sun/util/resources/LocaleData.js
-sun/util/locale/BaseLocale.js
-sun/util/locale/LocaleUtils.js
-sun/util/locale/provider/LocaleProviderAdapter.js
-sun/util/locale/provider/LocaleDataMetaInfo.js
-swingjs/a2s/A2SContainer.js
-swingjs/a2s/A2SEvent.js
-swingjs/a2s/A2SListener.js
-swingjs/a2s/Applet.js
-swingjs/a2s/Button.js
-swingjs/a2s/Label.js
-swingjs/a2s/Panel.js
-swingjs/a2s/Scrollbar.js
-swingjs/a2s/ScrollPane.js
-swingjs/a2s/TextArea.js
-swingjs/a2s/TextField.js
-swingjs/api/Interface.js
-swingjs/api/js/DOMNode.js
-swingjs/api/js/HTML5CanvasContext2D.js
-swingjs/api/js/JSInterface.js
-swingjs/jquery/JQueryUI.js
-swingjs/JSApp.js
-swingjs/JSAppletThread.js
-swingjs/JSAppletViewer.js
-swingjs/JSFocusPeer.js
-swingjs/JSFontMetrics.js
-swingjs/JSFrameViewer.js
-swingjs/JSGraphics2D.js
-swingjs/JSGraphicsConfiguration.js
-swingjs/JSGraphicsEnvironment.js
-swingjs/JSImage.js
-swingjs/JSImagekit.js
-swingjs/JSMouse.js
-swingjs/JSNullComponentPeer.js
-swingjs/JSScreenDevice.js
-swingjs/JSThreadGroup.js
-swingjs/JSToolkit.js
-swingjs/JSUtil.js
-swingjs/plaf/ButtonListener.js
-swingjs/plaf/DefaultMenuLayout.js
-swingjs/plaf/HTML5LookAndFeel.js
-swingjs/plaf/JSAppletUI.js
-swingjs/plaf/JSButtonUI.js
-swingjs/plaf/JSCheckBoxMenuItemUI.js
-swingjs/plaf/JSCheckBoxUI.js
-swingjs/plaf/JSComboBoxUI.js
-swingjs/plaf/JSComponentUI.js
-swingjs/plaf/JSEventHandler.js
-swingjs/plaf/JSFrameUI.js
-swingjs/plaf/JSGraphicsUtils.js
-swingjs/plaf/JSLabelUI.js
-swingjs/plaf/JSLayeredPaneUI.js
-swingjs/plaf/JSLightweightUI.js
-swingjs/plaf/JSMenuBarUI.js
-swingjs/plaf/JSMenuItemUI.js
-swingjs/plaf/JSMenuUI.js
-swingjs/plaf/JSPanelUI.js
-swingjs/plaf/JSPopupMenuSeparatorUI.js
-swingjs/plaf/JSPopupMenuUI.js
-swingjs/plaf/JSRadioButtonMenuItemUI.js
-swingjs/plaf/JSRadioButtonUI.js
-swingjs/plaf/JSRootPaneUI.js
-swingjs/plaf/JSScrollBarUI.js
-swingjs/plaf/JSScrollPaneUI.js
-swingjs/plaf/JSSeparatorUI.js
-swingjs/plaf/JSSliderUI.js
-swingjs/plaf/JSTextAreaUI.js
-swingjs/plaf/JSTextFieldUI.js
-swingjs/plaf/JSTextUI.js
-swingjs/plaf/JSTextViewUI.js
-swingjs/plaf/JSViewportUI.js
-swingjs/plaf/JSWindowUI.js
-swingjs/plaf/LazyActionMap.js
-swingjs/plaf/Resizer.js
-swingjs/plaf/TextListener.js
-
-
+++ /dev/null
-Notes
-=====
-
----IMPORTANT CHARACTER SET NOTE---
-
-It is critical that all development work in Java2Script
-be done in UTF-8. This means:
-
-- making sure your Eclipse project is set up for UTF-8 (not the Eclipse default?)
-- making sure your server can serve up UTF-8 by default for any browser-loaded files
-- making sure you don't edit a Java2Script class file or one of the site .js files
- using a non-UTF-8 editor. It may replace non-Latin characters with "?" or garbage.
-- making sure that your web pages are delivered with proper headings indicating HTML5 and UTF-8
-
-<!DOCTYPE html>
-<html>
-<head>
-<meta charset="utf-8">
-
-Note that the DOCTYPE tag is critical for some browsers to switch into HTML5 mode. (MSIE?)
-
-
-
-
-In particular, the Mandarin character 秘 (mi; "secret") is used extensively throughout
-the SwingJS class files to distinguish j2s-specific fields and methods that must not
-ever be shadowed or overridden by subclasses. For example, we see in java.lang.Thread.java:
-
- public static JSThread 秘thisThread;
-
-----------------------------------
-
-
-updated 12/6/2020 -- note about restrictions on long, including BitSet and Scanner
-updated 3/21/2020 -- adds note about HashMap, Hashtable, and HashSet iterator ordering
-updated 3/20/2020 -- adds note about interning, new String("xxx"), and "xxx"
-updated 2/26/2020 -- adds Graphics.setClip issue
-updated 12/22/19 -- additional issues
-updated 11/03/19 -- adds information about File.exists() and points to src/javajs/async
-updated 10/26/19 -- adds information about File.createTempFile()
-updated 8/16/19 -- minor typos and added summary paragraph
-updated 7/19/19 -- clarification that AWT and Swing classes are supported directly
-updated 5/13/19 -- Mandarin U+79D8 reserved character; Missing Math methods; int and long
-updated 5/10/19 -- adds a section on static issues in multi-(duplicate)-applet pages
-updated 1/4/19 -- nio
-updated 9/15/18 -- adds integer 1/0 == Infinity
-updated 7/24/18 -- most classes replaced with https://github.com/frohoff/jdk8u-jdk
-updated 6/5/17 -- reserved package name "window"
-updated 3/11/17 -- myClass.getField
-updated 3/7/17 -- overloading of JSplitPane.setDividerLocation
-updated 3/2/17 -- more indication of classes not implemented (KeyListener)
-
-=============================================================================
-SwingJS and OpenJDK 8+
-=============================================================================
-
-SwingJS implements a wide range of the Java language in JavaScript. The base
-version for this implementation is OpenJDK8. some classes are implemented using
-older source code, and there are some missing methods. For the most part, this is
-no real problem. You can add or modify any java class just be adding it as source
-in your project. Or (preferably) you can contact me, and I can get it into the
-distribution. Or (even more preferably) you can do that via a patch submission.
-
-=================
-DESIGN PHILOSOPHY
-=================
-
-The java2script/SwingJS design goal is to recreate a recognizable, easily debuggable
-equivalent in JavaScript for as much of Java as practical. This means, for example,
-that one can call in JavaScript
-
- new java.util.Hashtable()
-
-and for all practical purposes it will appear that Java is running.
-
-
-Method and Field Disambiguation
--------------------------------
-
-SwingJS has no problem with the overloading of methods, for example:
-
- public void print(int b);
- public void print(float b);
-
-JavaScript does not allow overloading of methods, and the common practice in
-Java of naming a field the same as a method -- isAllowed and isAllowed() -- is
-not possible in JavaScript. As a result, SwingJS implements "fully-qualified"
-method names using "$" parameter type separation. Thus, these methods in SwingJS
-will be referred to as print$I and print$F. The rules for this encoding are
-relatively simple:
-
-1. The seven primitive types in Java are encoded $I (int), $L (long), $F (float),
-$D (double), $B (byte) $Z (boolean), and $H (short).
-
-2. String and Object are encoded as $S and $O, respectively.
-
-3. "java_lang_" is dropped for all other classes in the java.lang package (as in Java).
- For example: $StringBuffer, not $java_lang_StringBuffer
-
-4. All other classes are encoded as
-
- "$" + Class.getName().replace(".","_")
-
-For example, in Java we see:
-
- public void equals(Object o) {...}
-
-Whereas in SwingJS we have:
-
- Clazz.newMeth(C$, 'equals$O', function (o) {...}
-
-And
-
- this.getContentPane().add(bar, "North");
-
-becomes
-
- this.getContentPane$().add$java_awt_Component$O(bar, "North");
-
-5. Arrays are indicated with appended "A" for each level. So
-
- setDataVector(Object[][] dataVector, Object[] columnIdentifiers)
-
-becomes
-
- setDataVector$OAA$OA(dataVector, columnIdentifiers)
-
-(It is recognized that this design does introduce a bit of ambiguity, in that
- in principal there could be user class named XA and X in the same package,
- and methods a(X[]) and a(XA) in the same class that cannot be distinguished.
- The benefit of this simple system, however, triumphed over the unlikelyhood
- of that scenario.) The transpiler could be set to flag this possibility.
-
-6. Constructors are prepended with "c$". So
-
- public JLabel(String text) {...}
-
-becomes:
-
- Clazz.newMeth(C$, 'c$$S', function (text) {...});
-
-Field disambiguation involves prepending. In Java, a class and its subclass
-can both have the same field name, such as
-
- boolean visible;
-
-When this happens, it is called "shadowing", and though not recommended, Java allows
-it. The Java2Script transpiler will prepend such shadowing fields with "$" so that the
-subclass instance has both "visible" (for use in its methods inherited from its
-superclass) and "$visible" (for its own methods). Thus, we might see in Java:
-
- this.visible = super.visible;
-
-while in SwingJS we will see:
-
- this.$visible=this.visible;
-
-since JavaScript does not have the "super" keyword.
-
-
-
-Parameterless methods such as toString() are appended with "$" to become toString$().
-The one exception to this rule is private methods, which are saved in (truly) private
-array in the class (and are not accessible by reflection). Private parameterless
-methods retain their simple Java name, since they cannot conflict with field names.
-
-This renaming of methods has a few consequences, which are discussed more fully below.
-See particularly the section on "qualified field and method names", where it is described
-how you can use packages or classes or interfaces with ".api.js" in them to represent JavaScript
-objects for which all method names are to be left unqualified. Note that it is not
-possible to cherry-pick methods to be unqualified; only full packages, classes or
-interfaces can hold this status.
-
-The swingjs.api.js package in particular contains a number of useful interfaces that
-you can import into your project for JavaScript-specific capabilities.
-
-
-Applet vs. Application
-----------------------
-
-One of the very cool aspects of SwingJS is that it doesn't particularly matter if a browser-based
-Java app is an "applet" or an "application". We don't need JNLP (Java Network Launch Protocol)
-because now we can just start up any Java application in a browser just as easily as any applet.
-The associative array that passes information to the SwingJS applet (information that formerly
-might have been part of the APPLET tag, such as width, height, and codebase, always referred to
-in our writing as "the Info array") allows the option to specify the JApplet/Applet "code"
-class or the application "main" class. Either one will run just fine.
-
-
-Performance
------------
-
-Obviously, there are limitations. One is performance, but we have seen reproducible
-performance at 1/6 - 1/3 the speed of Java. Achieving this performance may require
-some refactoring of the Java to make it more efficient in both Java and JavaScript.
-"for" loops need to be more carefully crafted; use of "new" and "instanceof" need to be
-minimized in critical areas. Note that method overloading -- that is, the same method name
-with different parameters, such as read(int) and read(byte) -- is no longer any problem.
-
-
-Threads
--------
-
-Although there is only a single thread in JavaScript, meaning Thread.wait(), Thread.sleep(int) and
-Thread.notify() cannot be reproduced, we have found that this is not a serious limitation.
-For example, javax.swing.Timer() works perfectly in JavaScript. All it means is that threads
-that use sleep(int) or notify() must be refactored to allow Timer-like callbacks. That is,
-they must allow full exit and re-entry of Thread.run(), not the typical while/sleep motif.
-
-The key is to create a state-based run() that can be exited and re-entered in JavaScript.
-
-
-Static fields
--------------
-
-Final static primitive "constant" fields (String, boolean, int, etc.) such as
-
-static final int TEST = 3;
-static final String MY_STRING = "my " + "string";
-
-are converted to their primitive form automatically by the Eclipse Java compiler
-and do not appear in the JavaScript by their names.
-
-Other static fields are properties of their class and can be used as expected.
-
-Note, however, that SwingJS runs all "Java" code on a page in a common "jvm"
-(like older versions of Java). So, like the older Java schema, the JavaScript
-equivalents of both applets and applications will share all of their static
-fields and methods. This includes java.lang.System.
-
-Basically, SwingJS implementations of Java run in a browser page-based sandbox
-instead of an applet-specific one.
-
-In general, this is no problem. But if we are to implement pages with
-multiple applets present, we must be sure to only have static references
-that are "final" or specifically meant to be shared in a JavaScript
-environment only (since they will not be shared in Java).
-
-A simple solution, if static non-constant references are needed, is to attach the
-field to Thread.currentThread.threadGroup(), which is an applet-specific reference.
-Be sure, if you do this, that you use explicit setters and getters:
-
-For example,
-
-private static String myvar;
-
-...
-
-public void setMyVar(String x) {
- ThreadGroup g = Thread.currentThread().threadGroup();
- /**
- * @j2sNative g._myvar = x;
- *
- */
- {
- myvar = x;
- }
-}
-
-public String getMyVar() {
- ThreadGroup g = Thread.currentThread().threadGroup();
- /**
- * @j2sNative return g._myvar || null;
- *
- */
- {
- return myvar;
- }
-}
-
- in Java will get and set x the same in JavaScript and in Java.
-
-
-A convenient way to do this in general is to supply a singleton class with
-explicitly private-only constructors and then refer to it in Java and in JavaScript
-instead of using static field, referring to myclass.getIntance().xxx instead of
-myclass.xxx in Java (and JavaScript).
-
-This was done extensively in the Jalview project. See jalview.bin.Instance.
-
-
-Helper Packages -- swingjs/ and javajs/
----------------------------------------
-
-The SwingJS library is the swingjs/ package. There are interfaces that may be of assistance
-in swingjs/api, but other than that, it is not recommended that developers access classes in
-this package. The "public" nature of their methods is really an internal necessity.
-
-In addition to swingjs/, though, there are several useful classes in the javajs/ package
-that could be very useful. This package is a stand-alone package that can be
-cloned in any Java project that also would be great to have in any JavaScript project
--- SwingJS-related or not. Functionality ranges from reading and writing various file
-formats, including PDF, BMP, PNG, GIF, JPG, JSON, ZIP, and CompoundDocument formats.
-
-A variety of highly efficient three- and four-dimensional point, vector, matrix, and
-quaternion classes are included, as they were developed for JSmol and inherited from that
-project.
-
-Of particular interest should be javajs/async/, which includes
-
-javajs.async.Async
-javajs.async.AsyncColorChooser
-javajs.async.AsyncDialog
-javajs.async.AsyncFileChooser
-
-See javajs.async.Async JavaDoc comments for a full description of
-these useful classes.
-
-
-Modal Dialogs
--------------
-
-Although true modal dialogs are not possible with only one thread, a functional equivalent --
-asynchronous modal dialogs -- is relatively easy to set up. All the JOptionPane dialogs will
-return PropertyChangeEvents to signal that they have been disposed of and containing the results.
-See below and classes in the javajs.async package.
-
-
-Native calls
-------------
-
-Native calls in Java are calls to operating system methods that are not in Java. JavaScript
-has no access to these, of course, and they must all be replaced by JavaScript equivalents.
-Fortunately, they are not common, and those that are present in Java (for example, in calculating
-checksums in ZIP file creation) are at a low enough level that most developers do not utilize them
-or do not even have access to them. All native calls in Java classes have been replaced by
-Java equivalents.
-
-
-Swing GUI Peers and UIClasses
------------------------------
-
-One of the biggest adaptations introduced in SwingJS is in the area of the graphical
-user interface. The issue here is complex but workable. In Java there are two background
-concepts -- the Component "peer" (one per "heavy-weight" component, such as a Frame) and the
-component "uiClass" (one per component, such as JButton or JTextField).
-
-Peers are native objects of the operating system. These are the virtual buttons and text areas
-that the user is interacting with at a very base level. Their events are being passed on to
-Java or the browser by the operating system. UI classes provide a consistent "look and feel"
-for these native objects, rendering them onto the native window canvas and handling all
-user-generated events. They paint the borders, the backgrounds, the highlights, of every
-control you see in Java. There is one-to-one correspondence of Swing classes and UI classes.
-Setting the Look and Feel for a project amounts to selecting the directory from which to draw
-these UI classes. The UI classes can be found in the javax.swing.plaf ("platform look and feel")
-package.
-
-Early on in the development of SwingJS, we decided not to fully reproduce the painfully detailed
-bit-by-bit painting of controls as is done in Java. Instead, we felt it was wiser to utilize the standard
-HTML5 UI capabilities as much as possible, using DIV, and INPUT especially, with extensive use
-of CSS and sometimes jQuery (menus, and sliders, for example). Thus, we have created a new
-set of UIs -- the "HTML5 Look and Feel". These classes can be found in swingjs.plaf. Besides being
-more adaptable, this approach allows far more versatility to SwingJS developers, allowing them
-to modify the GUI to suit their needs if desired.
-
-In SwingJS, since we have no access to native peers except through the browser DOM,
-it seemed logical to merge the peer and UI idea. So instead of having one peer per heavy-weight control and
-one UI class instance for each control type, we just have one UI class instance per control, and
-that UI class instance is what is being referred to when a "peer" is notified.
-
-In some ways this is a throw back to when all of Swing's components were subclasses of
-specific AWT components such as Button and List. These "heavy-weight components" all had their
-own individual native peers and thus automatically took on the look and feel provided by the OS.
-Later Swing versions implemented full look and feel for all peers, leaving only JDialog, JFrame,
-and a few other classes to have native peers. But in SwingJS we have again a 1:1 map of component
-and UI class/peer instance.
-
-The origin of most issues (read "bugs") in relation to the GUI will probably be found in the
-swingjs.plaf JSxxxxUI.java code.
-
-
-Swing-only Components -- no longer an issue
--------------------------------------------
-
-Swing was introduced into Java well after the Java Abstract Window Toolkit (AWT) was well
-established. As such, its designers chose to allow AWT controls such as Button and List to be used
-alongside their Swing counterparts JButton and JList. Reading the code, it is clear that this
-design choice posed a huge headache for Swing class developers.
-
-For SwingJS, we decided from the beginning NOT to allow this mixed-mode programming and
-instead to require that all components be Swing components.
-
-However, this is no longer an issue. All AWT components in SwingJS are now subclasses of
-javax.swing.JComponent. So far, we have found no problem with this.
-
-
-The a2s Adapter Package
------------------------
-
-Originally, we thought that we would restrict ourselves to JApplets only. That is, only
-Swing-based applets. But as we worked, we discovered that there are a lot of great
-applets out there that are pre-Swing pure-AWT java.applet.Applet applets. Our problem was
-that we also wanted it to be possible to quickly adapt these applets to JavaScript as well.
-
-The solution turned out to be simple: Write a package (a2s) that recreates the interface for
-non-Swing components as subclasses of Swing components. Thus, a2s.Button subclasses javax.swing.JButton
-but also accepts all of the methods of java.awt.Button. This works amazingly well, with a few
-special adaptations to the core javax.swing to be "AWT-aware." All AWT components now subclass
-a2s components, which in turn subclass JComponents. So no changes in code are necessary. We have
-successfully transpiled over 500 applets using this strategy. (Kind of surprising, actually, that
-the original Java developers did not see that option. But we have a hindsight advantage here.)
-
-
-Working with Files
-==================
-
-Simple String file names are not optimal for passing information about
-read files within SwingJS applications.
-
-All work with files should either use Path or File objects exclusively.
-These objects, after a file is read or checked for existence, will already
-contain the file byte[] data. Doing something like this:
-
-File f = File("./test.dat");
-boolean isOK = f.exists();
-
-will load f with its byte[] data, if the file exists.
-
-But if after that, we use:
-
-File f2 = new File(f.getAbsolutePath());
-
-f2 will not contain that data. Such copying should be done as:
-
-File f2 = new File(f);
-
-in which case, the byte[] data will be transferred.
-
-
-SwingJS uses the following criteria to determine if File.exists() returns true:
-
-(1) if this File object has been used directly to read data, or
-(2) if reading data using this File object is successful.
-
-Note that you cannot check to see if a file exists before input or if it
-was actually written or if it already exists prior to writing in SwingJS.
-
-Thus, you should check each use of file.exists() carefully, and if necessary, provide a J2sNative
-block that gives an appropriate "OK" message, for example:
-
-(/** @j2sNative 1 ? false : */ outputfile.exits())
-
-or
-
-(/** @j2sNative 1 ? true : */ inputfile.exits())
-
-Temporary files can be created in SwingJS. SwingJS will maintain a pseudo-filesystem for files
-created with File.createTempFile(). This is useful in that closure of writing to a temporary file
-does not generate a pseudo-download to the user's machine.
-
-
-UNIMPLEMENTED CLASSES BY DESIGN
-===============================
-
-The SwingJS implementation of the following classes are present
-in a way that gracefully bypasses their functionality:
-
-accessibility
-security
-serialization
-
-
-
-TODO LIST FOR UNIMPLEMENTED CLASSES
-===================================
-
-JEditorPane (minimal implementation) - DONE 12/2018; some issues still
-JSplitPane - DONE 8/2018
-JTabbedPane - DONE 10/2018
-JTree - done 12/2019
-
-
-MINOR ISSUES--required some rewriting/refactoring by Bob and Udo
-================================================================
-
-Thread.currentThread() == dispatchThread
-
-
-MINOR ISSUES--requiring some rewriting/refactoring outside of SwingJS
-=====================================================================
-
-See below for a full discussion.
-
-Restrictions on long
-Restriction on BitSet and Scanner
-HashMap, Hashtable, and HashSet iterator ordering
-interning, new String("xxx") vs "xxx"
-Names with "$" and "_"
-positive integers do not add to give negative numbers
-ArrayIndexOutOfBounds
-java.awt.Color
-native methods
-javax.swing.JFileDialog
-key focus
-LookAndFeel and UI Classes
-System.exit(0) does not stop all processes
-list cell renderers must be JComponents
-myClass.getField not implemented
-"window" and other reserved JavaScript names
-reserved field and method names
-qualified field and method names
-missing Math methods
-Component.getGraphics(), Graphics.dispose()
-Graphics.setClip()
-
-MAJOR ISSUES--for Bob and Udo within SwingJS
-============================================
-
-fonts
-OS-dependent classes
-AWT component peers
-some aspects of reflection
-
-MAJOR ISSUES--to be resolved by implementers
-============================================
-
-fonts
-threads
-modal dialogs
-image loading
-BigDecimal not fully implemented
-no format internationalization
-no winding rules
-text-related field implementation
-Formatter/Regex limitations
-integer 1/0 == Infinity
-
-========================================================================
-
-DISCUSS
-=======
-
-Table row/col sorter needs checking after removal of java.text.Collator references
-
-I had to move all of SunHints class to RenderingHints, or the
-two classes could not be loaded. Shouldn't be a problem, I think. The sun classes are
-not accessible to developers in Java anyway, since they are generally package private.
-
-==========================================================================
-
-//////////////////////////////////////////////////////////////////////////////
-
-UNIMPLEMENTED CLASSES
-=====================
-
-accessibility
--------------
-
-All Accessibility handling has been commented out to save the download footprint.
-This removes the need for sun.misc.SharedSecrets as well.
-Nothing says we could not implement accessibility. We just didn't.
-
-
-security
---------
-
-All JavaScript security is handled by the browser natively.
-Thus, Java security checking is no longer necessary, and
-java.security.AccessController has been simplified to work without
-native security checking.
-
-Note that private methods in a class are REALLY private.
-
-
-serialization
--------------
-
-All serialization has been removed. It was never very useful for Swing anyway,
-because one needs exactly the same Java version to save and restore serialized objects.
-
-
-keyboard accelerators and mnemonics
------------------------------------
-
-This work was completed in the spring of 2019. Note that in a browser, some
-key strokes, particularly CTRL-keys, are not available. Bummer.
-
-
-MINOR ISSUES--required some rewriting/refactoring by Bob and Udo
-================================================================
-
-
-Thread.currentThread() == dispatchThread
-----------------------------------------
-
-changed to JSToolkit.isDispatchThread()
-
-
-MINOR ISSUES--requiring some rewriting/refactoring outside of SwingJS
-=====================================================================
-
-restrictions on long
---------------------
-
-Java's 64-bit long type is not supported in JavaScript. There is no Int64Array in JavaScript,
-and 0x20000000000000 + 1 evaluates to 0x20000000000000, not 0x20000000000001.
-(Likewise, -0x20000000000000 - 1 is left unchanged.)
-
-The largest "integer" value in JavaScript is 9007199254740991 (9.007199254740991E13, or 0x1FFFFFFFFFFFFFF).
-Effectively, you get to use only 53 bits of the long, not 64. Trying to set a long larger than
-0x1FFFFFFFFFFFFFF or smaller than -0x1FFFFFFFFFFFFFF will result in a NumberFormatException.
-
-The transpiler handles conversion to long the same as Java for all cases other than from double.
-
-For small double values, there is no problem, and, in fact, this is a known trick used to round
-doubles and floats toward zero:
-
-double d;
-d = (long) 3.8;
-assert(d == 3);
-d = (long) -3.8;
-assert(d == -3);
-
-SwingJS will evaluate (long) d as 0 for d > 9007199254740991
-or d < -9007199254740991, same as Java returns for Double.NaN.
-So, in Java we have:
-
- assert(((long) Double.NaN) == 0);
- assert(((int) Double.NaN) == 0);
- assert(((long) Float.NaN) == 0);
- assert(((int) Float.NaN) == 0);
-
-and also, in JavaScript only, we also have:
-
- double d = 0x2000000000000L;
- assert(((long) d) == 0);
-
-
-restrictions on BitSet and Scanner
-----------------------------------
-
-Because of the issue of long being only 53 bits, any time a method returns a long value, considerations must
-be made as to whether this will work in JavaScript. In particular, BitSet and Scanner have issues.
-
-In SwingJS, java.util.BitSet has been implemented as a 32-bit integer-based bitset. This was no problem in
-Java 6, but starting with Java 7, a method was added to BitSet that allows for the extraction of the
-underlying long[] word data. This is not work in JavaScript. Instead, SwingJS java.util.Bitset.toLongArray() will deliver
-32-bit int[] data.
-
-SwingJS Scanner has hasNextLong() and nextLong(), and although it will scan through long numbers,
-Scanner will choke on long numbers greater than the JavaScript 53-bit limit. hasNextLong() will
-return false, and nextLong() will throw an InputMismatchException triggered by the NumberFormatException
-thrown by Long.parseLong().
-
-
-HashMap, Hashtable, and HashSet iterator ordering
--------------------------------------------------
-
-In Java, iterators for HashMap, Hashtable, and HashSet do not guarantee any particular order.
-From the HashMap documentation for Java 8:
-
- This class makes no guarantees as to the order of the map; in particular, it does not
- guarantee that the order will remain constant over time.
-
-Likewise, for HashSet (because it is simply a convenience method for HashMap<Object,PRESENT>:
-
- [HashSet] makes no guarantees as to the iteration order of the set.
-
-JavaScript's Map object is different. It is basically a LinkedHashMap, so it guarantees iteration
-in order of object addition.
-
-Starting with java2script 3.2.9.v1, these classes use the JavaScript Map object rather than hash codes
-whenever all keys are strictly of JavaScript typeof "string". If any key is introduced that is not a string, the
-implementation falls back to using hash codes, the same as Java.
-
-Note strings created using new String("xxxx") are NOT typeof "string"; they are typeof "object".
-
-The result is significantly faster performance (3-12 x faster) than originally, and up to 3 x faster
-performance in JavaScript than in Java itself. Right. Faster than Java.
-
-The JavaScript Map implementation is implemented UNLESS the constructor used is the one that
-specifies both initial capacity and load factor in their constructor. Thus,
-
-new Hashtable()
-new HashMap()
-new HashMap(16)
-new HashSet()
-
-all use the JavaScript Map. But
-
-new Hashtable(11, 0.75f)
-new HashMap(16, 0.75f)
-new HashSet(16, 0.75f)
-
-do not.
-
-This design allows for opting out of the JavaScript Map use in order to retain the exact behavior of
-iterators in JavaScript as in Java.
-
-
-interning, new String("xxx") vs "xxx"
--------------------------------------
-
-Note that the following are true in JavaScript:
-
-typeof new String("xxxx") == "object"
-typeof "xxxx" == "string"
-var s = "x";typeof ("xxx" + s) == "string"
-
-There is no equivalence to this behavior in Java, where a String is a String is a String.
-
-Be aware that SwingJS does not always create a JavaScript String object using JavaScript's
-new String(...) constructor. It only does this for Java new String("xxxx") or new String(new String()).
-
-In all other cases, new String(...) (in Java) results in a simple "xxxx" string in JavaScript.
-That is, it will be JavaScript typeof "string", not typeof "object".
-
-The reason for this design is that several classes in the Java core use toString()
-methods that return new String(), and those classes that do that would cause a JavaScript error
-if implicitly stringified if new String() returned a JavaScript String object.
-
-This is fine in JavaScript
-
-test1 = function() { return { toString:function(){ return "OK" } } }
-"testing" + new test1()
->> "testingOK"
-
-But for whatever reason in JavaScript:
-
-test2 = function() { return { toString:function(){ return new String("OK") } } }
-"testing" + new test2()
->> Uncaught TypeError: Cannot convert object to primitive value
-
-The lesson here is never to use
-
- return new String("...");
-
-in a Java toString() method. In Java it will be fine; in JavaScript it will also be fine as long as
-that method is never called in JavaScript implicitly in the context of string concatenation.
-
-A note about interning. Consider the following six Java constructions, where we have a == "x";
-
-"xxx"
-"xx" + "x"
-new String("xxx").intern()
-
-new String("xxx")
-"xx" + a.toString()
-"xx" + a
-
-All six of these will return java.lang.String for .getClass().getName().
-However, the first three are String literals, while the last three are String objects.
-Thus:
- "xxx" == "xxx"
- "xxx" == "xx" + "x"
- "xxx" == new String("xxx").intern()
-
-but none of the other three are equivalent to "xxx" or each other:
-
- "xxx" != new String("xxx")
- "xxx" != "xx" + a.toString()
- "xxx" != "xx" + a
- new String("xxx") != new String("xxx")
- "xx" + a != new String("xxx")
-
-etc.
-
-As in Java, in SwingJS, all of the following Java assertions pass as true:
-
- assert("xxx" == "xx" + "x");
- assert("xxx" == ("xx" + a).intern());
- assert("xxx" === new String("xxx").intern());
-
-and both of these do as well:
-
- assert(new String("xxx") != "xxx");
- assert(new String("xxx") != new String("xxx"));
-
-But the following two fail to assert true:
-
- assert("xxx" != "xx" + a);
- assert("xxx" != "xx" + a.toString());
-
-because in JavaScript, both of these right-side expressions evaluate to a simple "interned" string.
-
-In Java, however, these assertions are true because Java implicitly "boxes" String
-concatentaion as a String object, not a literal.
-
-Most of us know not to generally use == with Strings unless they are explicitly interned.
-Where this problem may arise, though, is in IdentityHashMap, which compares objects using
-System.identityHashCode(), which is not the same for different objects or their string literal equivalents.
-
-My recommendation, if you need to use IdentityHashMap with strings is to always use an explicit String.intern()
-for any keys -- unless you really want to keep every string as separate keys even if they are the same sequence,
-in which case, use new String(). This will work in Java and in JavaScript.
-
-Be aware when working with strings that come from SwingJS and are being used by other JavaScript modules
-that those that are String objects will return "object" for the JavaScript typeof operator, not "string".
-
-The easy way to ensure this is no problem is to concatenate strings with "" to force immediate interning:
-
- var x = aJavaObject.getString() + "";
-
-unless you are certain that the string is being returned is a raw JavaScript string.
-
-Names with "$" and "_"
-----------------------
-
-For the most part, this should be no problem.
-
-Note that the use of $ and _ in Java field names has always been discouraged:
-[https://docs.oracle.com/javase/tutorial/java/nutsandbolts/variables.html]
-
- You may find some situations where auto-generated names will contain the dollar sign,
- but your variable names should always avoid using it. A similar convention
- exists for the underscore character; while it's technically legal to begin your
- variable's name with "_", this practice is discouraged.
-
-Some impacts of transpiling method names with full qualification:
-
-1) SwingJS will introduce fields that start with $ or _. These will not conflict
- if the above convention is followed.
-
-2) Fields that have the same Java name as a method are not an issue.
-
-3) Fields that have a Java name with $ that matches a transpiled method name,
- such as toString$, will need to be refactored in Java to not have that name collision.
-
-4) Fields in a subclass that have the same name as private fields in a superclass
- represent a name collision, because the superclass method needs to call its private
- field even if invoked from a subclass. The solution was to modify the subclass field
- name using one or more prepended $.
-
-5) Use of Class.getDeclaredMethods() reflection will return Method objects having the transpiled
- name, not the Java name. This could require some j2sNative adjustment
- to strip the $... parameters from the name if that is needed.
-
-6) Use of Method.getParameterTypes() should work fine, provided class names
- do not contain "_". This is because the transpiler converts "." to "_" when
- creating the fully qualified JavaScript name.
-
-
-positive integers do not add to give negative numbers
------------------------------------------------------
-
-In Java, the following is true:
-
- 2000000000 + 2000000000 == -294967296
-
-But in SwingJS, that will be 4000000000. So, for example, the following
-strategy will fail in SwingJS:
-
- int newLength = lineBuf.length * 2;
- if (newLength < 0) {
- newLength = Integer.MAX_VALUE;
- }
-
-"-1" in JavaScript is not 0xFFFFFFFF.
-
-And one must take care to not compare a negative number with a 32-bit mask. So
-
-(b & 0xFF000000) == 0xFF000000
-
-is true in Java for (int) b = -1, but is false in JavaScript, because 0xFF000000 is 4278190080,
-while (-1 & 0xFF000000) is, strangely enough, -16777216, and, in fact,
-
-(0xFF000000 & 0xFF000000) != 0xFF000000
-
-because -16777216 is not 4278190080.
-
-The fix is that one must compare similar operations:
-
-if ((b & 0xFF000000) == (0xFF000000 & 0xFF000000)) .....
-
-Importantly, the JavaScript Int32Array does behave properly. From
-the Firefox developer console:
-
->> x = new Int32Array(1)
-<- Int32Array(1) [ 0 ]
->> x[0] = 4000000000
-<- 4000000000
->> x[0]
-<- -294967296
-
-Notice that, perhaps unexpectedly, the following two constructs produce
-different results in JavaScript:
-
-x = new Int32Array(1);
-b = x[0] = 4000000000;
-
-(b will be 4000000000)
-
-and
-
-x = new Int32Array(1);
-x[0] = 4000000000;
-b = x[0];
-
-(b will be -294967296)
-
-
-SwingJS leverages array typing to handle all byte and short arithmetic so as
-to ensure that any byte or short operation in JavaScript does give the same
-result in Java. The design decision to not also do this with integer math was
-a trade-off between performance and handling edge cases.
-
-
-ArrayIndexOutOfBounds
----------------------
-
-You cannot implicitly throw an ArrayIndexOutOfBoundsException in JavaScript.
-JavaScript will simply return "undefined", not throw an Exception. So:
-
-boolean notAGoodIdeaIsOutOfBounds(String[] sa, int i) {
- try {
- return (sa[i] == sa[i]);
- } catch (ArrayIndexOutOfBoundsException e) {
- return false;
- }
-}
-
-will work in Java but not in JavaScript. Code should not depend upon this sort
-of trap anyway, if you ask me.
-
-Throwable vs Error vs Exception
--------------------------------
-
-True JavaScript errors are trapped as Throwable, whereas you can still trap
-Error and Exception as well. So if you want to be sure to catch any JavaScript
-error, use try{}catch (Throwable t){}, not try{}catch (Exception e){}.
-
-j
-ava.awt.Color
---------------
-
-ColorSpace: only "support" CS_sRGB.
-
- TODO -- any volunteers??
-
-
-javax.swing.JFileDialog
------------------------
-
-HTML5 cannot expose a file reading directory structure. But you certainly
-can still do file reading and writing. It just works a little differently.
-It's a simple modification:
-
- b = new JButton("FileOpenDialog");
- b.addActionListener(new ActionListener() {
-
- @Override
- public void actionPerformed(ActionEvent e) {
- JFileChooser fc = new JFileChooser();
- Test_Dialog.this.onDialogReturn(fc.showOpenDialog(Test_Dialog.this));
- // Java will wait until the dialog is closed, then enter the onDialogReturn method.
- // JavaScript will exit with NaN immediately, and then call back with its actual value
- // asynchronously.
- }
-
- });
-
- public void onDialogReturn(int value) {
- if (value != Math.floor(value))
- return; // in JavaScript, this will be NaN, indicating the dialog has been opened
- // If we are here, the dialog has closed, in both Java and JavaScript.
- System.out.println("int value is " + value);
- }
-
-
- @Override
- public void propertyChange(PropertyChangeEvent event) {
- Object val = event.getNewValue();
- String name = event.getPropertyName();
- System.out.println(name);
- switch (event.getSource().getClass().getName()) {
- case "javax.swing.JOptionPane":
- switch (name) {
- case "inputValue":
- onDialogReturn(val);
- return;
- case "value":
- if (val instanceof Integer)
- onDialogReturn(((Integer) val).intValue());
- else
- onDialogReturn(val);
- return;
- }
- break;
- case "javax.swing.ColorChooserDialog":
- switch (name) {
- case "SelectedColor":
- onDialogReturn(val);
- return;
- }
- break;
- case "javax.swing.JFileChooser":
- switch (name) {
- case "SelectedFile":
- File file = (File) val;
- byte[] array = (val == null ? null : /** @j2sNative file.秘bytes || */
- null);
- onDialogReturn("fileName is '" + file.getName() + "'\n\n" + new String(array));
- return;
- }
- break;
- }
- System.out.println(
- event.getSource().getClass().getName() + " " + event.getPropertyName() + ": " + event.getNewValue());
- }
-
-
-Developers are encouraged to create a separate class that handles general calls to JFileDialog.
-An example class can be found in the SwingJS distribution as
-
-/sources/net.sf.j2s.java.core/src/javajs/async/AsyncFileChooser.java.
-
-
-javax.swing.JOptionPane dialogs
--------------------------------
-
-For this action to work, the parentComponent must implement
-propertyChangeListener, and any call to JOptionPanel should allow for
-an asynchronous response, meaning that there is no actionable code following the
-call to the dialog opening.
-
-In addition, for compatibility with the Java version, implementation should
-wrap the call to getConfirmDialog or getOptionDialog in a method call to
-handle the Java:
-
-onDialogReturn(JOptionPane.showConfirmDialog(parentFrame,
-messageOrMessagePanel, "title", JOptionPane.OK_CANCEL_OPTION));
-
-Then parentFrame.propertyChange(event) should also call onDialogReturn.
-
-This will then work in both Java and JavaScript.
-
-Note that there is an int and an Object version of onDialogReturn().
-
-
-In JavaScript:
-
-The initial return from JOptionPane.showConfirmDialog and showMessageDialog
-will be (SwingJS) JDialog.ASYNCHRONOUS_INTEGER (NaN), testable as an impossible
-Java int value using ret != -(-ret) if the parent implements PropertyChangeListener, or -1
-(CLOSE_OPTION) if not.
-
-For showOptionDialog (which returns Object) or showInputDialog (which returns
-String), the initial return will be (SwingJS) JDialog.ASYNCHRONOUS_OBJECT, testable as
-((Object) ret) instanceof javax.swing.plaf.UIResource if the parent implements
-PropertyChangeListeneer, or null if not.
-
-The second return will be the desired return.
-
-In Java:
-
-The initial return will be the one and only modal final return.
-
-
-
-For full compatibility, The calling method must not continue beyond this
-call.
-
-All of the standard Java events associated with Components are also
-available.
-
-Certain fall back mechanisms are possible, where onReturn does not exist, but
-only for the following cases:
-
-
-For showMessageDialog, for WARNING_MESSAGE and ERROR_MESSAGE, a simple
-JavaScript alert() is used, returning 0 (OK_OPTION) or -1 (CLOSED_OPTION).
-
-For showInputDialog, if the message is a string, a simple JavaScript prompt()
-with input box is used, returning the entered string or null.
-
-For showConfirmDialog, a simple JavaScript confirm() is used, in which case:
-
-for YES_NO_OPTION: YES_OPTION or NO_OPTION
-
-for YES_NO_CANCEL_OPTION: YES_OPTION or CANCEL_OPTION
-
-for OK_CANCEL_OPTION or any other: OK_OPTION or CANCEL_OPTION
-
-Note that you should implement a response for CLOSED_OPTION for
-showConfirmDialog. For other dialogs, a null return indicates the dialog was
-closed, just as for Java.
-
-Developers are encouraged to create a separate class that handles general calls.
-An example class can be found in the SwingJS distribution as src/javajs/async/AsyncDialog.java.
-Very simple modifications to the Java allows asynchronous operation using AsyncDialog. Here
-is a simple "do you want to close this frame" example, where you can see that what we have
-done is to set the reply into an ActionListener that is defined in the constructor of
-the AsyncDisplay object:
-
-// Original:
-//
-// private void promptQuit() {
-// int sel = JOptionPane.showConfirmDialog(null, PROMPT_EXIT, NAME, JOptionPane.YES_NO_OPTION);
-// switch (sel) {
-// case JOptionPane.YES_OPTION:
-// resultsTab.clean();
-// seqs.dispose();
-// if (fromMain) {
-// System.exit(0);
-// }
-// break;
-// }
-// }
-
- private void promptQuitAsync() {
- new AsyncDialog(new ActionListener() {
-
- @Override
- public void actionPerformed(ActionEvent e) {
- int sel = ((AsyncDialog)e.getSource()).getOption();
- switch (sel) {
- case JOptionPane.YES_OPTION:
- resultsTab.clean();
- seqs.dispose();
- if (fromMain) {
- System.exit(0);
- }
- break;
- }
- }}).showConfirmDialog(null, PROMPT_EXIT, NAME, JOptionPane.YES_NO_OPTION);
- }
-
-Very simple!
-
-
-native methods
---------------
-
-The J2S compiler ignores all static native method declarations.
-Anything of this nature needs to be implemented in JavaScript if it is needed,
-using j2sNative blocks:
-
-/**
- * @j2sNative
- *
- * var putYourJavaScriptCodeHere
- *
- */
-
- Note that if you follow that directly with a {...} block, then
- the javadoc code will run in JavaScript, and the {...} code will run in Java.
-
-
-key Focus
----------
-
-As of June, 2019, the keyboard focus manager is fully implemented.
-The one catch is that JTextPane and JTextArea, which already consume
-VK_TAB in Java, cannot use CTRL-TAB to continue a tabbing cycle around
-the components in a window. Instead, CTRL-TAB is absorbed by the browser.
-
-
-LookAndFeel and UI Classes
---------------------------
-
-SwingJS implements the native browser look and feel as swingjs.plaf.HTML5LookAndFeel.
-There are small differences between all look and feels -- MacOS, Windows, SwingJS.
-
-Expert developers know how to coerce changes in the UI by subclassing the UI for a
-component. This probably will not work in SwingJS.
-
-Note that LookAndFeel in Java usually determines canvas size in a Frame because
-different operating systems (Mac OS vs Windows vs HTML5) will have
-different edge sizes on their frames. If you want to ensure a component size,
-use getContentPane().setPreferredSize().
-
-
-System.exit(0) does not stop all processes
-------------------------------------------
-
-Although System.ext(int) has been implemented in JavaScript, it just closes the
-frames, stops all pending javax.swing.Timer objects in the queue, and runs any
-threads added using Runtime.getRuntime().addShutdownHook(Thread).
-It may not stop all "threads." So don't rely on that.
-Applications are responsible for shutting down prior to executing System.exit(0).
-
-
-myClass.getField not implemented
---------------------------------
-
-java.lang.reflect.Field is implemented minimally. It is not
-certain that Field.getDeclaringClass() will work. If you just want a
-value of a field, you can do this:
-
-/**
- *@j2sNative
- *
- * return myClass[name]
- */
-
-But that is not a java.lang.reflection.Field object.
-
-
-"window" and other reserved JavaScript names
---------------------------------------------
-
-No reserved top-level JavaScript name is allowed for a package name. So, for example,
-one must rename packages such as "window" or "document" to names such as "win" or "doc".
-
-reserved field and method names
--------------------------------
-
-In order to minimize the chance of added SwingJS field and method names colliding with ones
-developers might use in subclassing Java classes, we have added U+79D8 (first character of Mandarin
-"secret") to the characters already disrecommended by Java documentation ("$" and "_"). The only problem
-would be if you use that character followed by certain English words in certain classes. For example
-\u79D8canvas for JComponents (in java.awt.JSComponent) and \u79D8byte (in java.io.File).
-
-qualified field and method names
---------------------------------
-
-Method names in SwingJS are fully qualified, meaning two methods with the same Java name but different
-parameters, such as write(int) and write(double), must not have the same name in JavaScript. (In this
-case, we will have write$I and write$D.) However, in certain cases it may be desirable to leave the
-method names unqualified. In particular, when an interface actually represents a JavaScript object,
-the transpiler can leave a method name unqualified. The default situation for this is a class name
-includes ".api.js" (case-sensitive). This means that any method in any class in a package js within
-a package api, or any private interface js that has an outer interface api, will have all-unqualified
-methods. An example of this is swingjs.plaf.JSComboPopupList, which needs to communicate with a jQuery
-object directly using the following interface:
-
- private interface api {
-
- interface js extends JQueryObject {
-
- abstract js j2sCB(Object options);
-
- abstract Object[] j2sCB(String method);
-
- abstract Object[] j2sCB(String method, Object o);
-
- abstract Object[] j2sCB(String method, int i);
-
- abstract int j2sCB(String OPTION, String name);
-
- }
- }
-
-Notice that all these variants of j2sCB() will call the same method in JavaScript by design.
-
-
-missing Math methods
---------------------
-
-java.lang.Math is worked out, but some methods are missing, either because they
-involve long integer value that are inaccessible in JavaScript, or because I just
-didn't implement them. This is a result of continued Java development.
-It is easy enough to add these methods if you have the source. They go into j2sClazz.js,
-which is combined with other initial libraries into swingjs2.js by build_site.xml
-
-
-Component.getGraphics(), Graphics.dispose()
--------------------------------------------
-
-Use of component.getGraphics() is discouraged in Java and in SwingJS.
-Specifically in SwingJS, any call to component.getGraphics() or
-BufferedImage.createGraphics() or Graphics.create(...) should be matched with graphics.dispose(),
-particularly when it is called outside the context of a paint(Graphics)
-call from the system.
-
-If you see your graphics scrolling down the page with each repaint,
-look for where you have used Component.getGraphics() and not Graphics.dispose().
-For example, this will definitely NOT work in SwingJS:
-
- this.paint(getGraphics())
-
-and really should not work in Java, either, as it is technically a resource memory leak.
-
-Instead, if you really do not want to use repaint(), use this:
-
- Graphics g = getGraphics();
- paint(g);
- g.dispose();
-
-
-
-Graphics.setClip()
-------------------
-
-The HTML5 canvas.clip() method is permanent. You can only reset the clip using
-save/restore. This is different from Java, where you can temporarily change it using
-
- Shape oldClip = Graphics.getClip();
- Graphics.setClip(newClip);
- ...
- Graphics.setClip(oldClip);
-
-If you need to do something like this, you must schedule the paints
-to not have overlapping clip needs.
-
-
-MAJOR ISSUES--for Bob and Udo within SwingJS
-============================================
-
-fonts
------
-
-Fonts and FontMetrics will all be handled in JavaScript. Font matching will
-not be exact, and composite (drawn) fonts will not be supported.
-
-SwingJS handles calls such as font.getFontMetrics(g).stringWidth("xxx") by
-creating a <div> containing that text, placing it in an obscure location on
-the page, and reading div.getBoundingClientRect(). This is a VERY precise
-value, but can be a pixel or two off from what Java reports for the same font.
-
-
-OS-dependent classes
---------------------
-
-Static classes such as:
-
- java.awt.Toolkit
- java.awt.GraphicsEnvironment
-
-
-which are created using Class.forName are implemented using classes in the swingjs package.
-
-AWTAccessor is not implemented.
-
-
-AWT component peers and component "ui" user interfaces
-------------------------------------------------------
-
-ComponentPeer is a class that represents a native AWT component.
-Components with such peers are called "heavy-weight" components.
-They are expected to do the dirty work of graphics drawing.
-
-Java Swing implements peers only for JApplet, JDialog, JFrame, and JWindow.
-References to such objects have been removed, but clearly there must be
-some connection to similar DOM objects, even for "light-weight" components.
-
-
-
-MAJOR ISSUES--to be resolved by implementers
-============================================
-
-fonts
------
-
-Glyph/composite/outline fonts are not supported.
-
-
-
-threads
--------
-
-Thread locking and synchronization are not relevant to JavaScript.
-Thus, anything requiring "notify.." or "waitFor.." could be a serious issue.
-
-All threading must be "faked" in JavaScript. Specifically not available is:
-
- Thread.sleep()
-
-javax.swing.AbstractButton#doClick(pressTime) will not work, as it requires Thread.sleep();
-
-However, java.lang.Thread itself is implemented and used extensively.
-
-Methods thread.start() and thread.run() both work fine.
-
-For simple applications that use Thread.sleep() just to have a delay, as in a frame rate, for
-example, one can use javax.swing.Timer instead. That is fully implemented.
-
-Likewise, java.util.Timer can be replaced with no loss of performance with javax.Swing.Timer.
-Note that java.util.TimerTask is implemented, but it can also be replaced by an implementation of Runnable.
-
-task = new TimerTask(){....};
-t = new java.util.Timer();
-t.schedule(task, 0, 1);
-
-becomes
-
-task = new TimerTask(){....}; // or task = new Runnable() {...}
-t = new javax.swing.Timer(1, new ActionListener() {
- @Override
- public void actionPerformed(ActionEvent e) {
- task.run();
- }
-};
-t.setInitialDelay(0); // not particularly necessary
-t.start();
-
-In addition, SwingJS provides swingjs.JSThread, which can be subclassed
-if desired. This class allows simple
-
- while(!interrupted()){
- wait()
- ...
- }
-
-action through an asynchronous function run1(mode). For example:
-
- protected void run1(int mode) {
- try {
- while (true)
- switch (mode) {
- case INIT:
- // once-through stuff here
- mode = LOOP;
- break;
- case LOOP:
- if (!doDispatch || isInterrupted()) {
- mode = DONE;
- } else {
- Runnable r = new Runnable() {
- public void run() {
- // put the loop code here
- }
- };
- dispatchAndReturn(r);
- if (isJS)
- return;
- }
- break;
- // add more cases as needed
- case DONE:
- // finish up here
- if (isInterrupted())
- return;
- // or here
- break;
- }
- } finally {
- // stuff here to be executed after each loop in JS or at the end in Java
- }
- }
-
-image loading
--------------
-- All image loading in SwingJS is synchronous. A MediaTracker call will immediately return "complete".
- However, it still may take one system clock tick to fully load images. Thus, it is recommended that
- images be preloaded in the static block of the applet if it is necessary that they be available in init().
- This is only an issue if you are trying to access the pixel buffer of the image in JavaScript.
-
-- Applet.getImage(path, name) will return null if the image does not exist.
-
-- BufferedImage: only "support" imageType RGB and ARGB
-
- -BH: This is a temporary edit, just to get us started. Certainly GRAY will be needed
-
-
-BigInteger and BigDecimal
--------------------------
-
-java.math.BigInteger is fully supported; java.math.BigDecimal is roughed
-in and not fully tested (07/2019).
-
-Both classes present significant issues for JavaScript, as they are based in
-Java's 64-bit long for all their operations. Here is the JavaDoc note I added
-to BigInteger:
-
- * SwingJS note: Because of the limitations of JavaScript with regard
- * to long-integer bit storage as a double, this implementation drops
- * the integer storage bit length to 24, giving 48 for long and leaving
- * the last 16 bits clear for the exponent of the double number. This should
- * not affect performance significantly. It does increase the storage
- * size by about 33%. By bringing an "int" to 3 bytes, we can easily construct
- * and use byte[] data intended for the original BitSet.
-
-"Easily" may be a bit strong there. This was a serious challenge.
-
-BigDecimal seems to run normally, but in order to do that, my hack involves
-reducing the size of an integer that is allowed to be stored as such and not
-in byte[] as a BigInteger. I'm sure there is a performance hit, but it does work.
-
-no format internationalization
-------------------------------
-
-For now, just en for number and date formatters
-
-no winding rules
-----------------
-
- When filling a graphic, only nonzero winding rule is implemented in HTML5 Canvas2D.
-
-
-
-text-related field implementation
----------------------------------
-
-Text fields are:
-
-JTextField (JavaScript <input type="text">)
-JTextArea (JavaScript <textarea>)
-JTextPane (JavaScript <div>)
-JEditorPane (JavaScript <div>)
-
-For the initial implementation, we don't implement infinite undo/redo, and the abstract
-document model is much less elaborate. Only PlainDocument (in the form of JSPlainDocument)
-is implemented. The Document returned by JTextField.getDocument() is a javax.swing.text.Document.
-
-All scrolling is handled by HTML5. javax.swing.AutoScroller is not implemented.
-public static methods .stop, .isRunning, .processMouseDragged require true Java threading
-and so are not implmented. javax.swing.text.View and its subclasses are not implemented.
-
-The JS document model does not allow two text fields to address the same underlying document.
-
-JavaScript is slightly different from Java in that the field value is changed asynchronously after
-the keypressed event, so Java actions that are keyed to KEY_PRESSED may not pick up the new
-key value even after SwingUtilities.invokeLater() is called. Thus, key pressed actions may need
-to be recorded after a key released event instead.
-
-Formatter/Regex limitations
----------------------------
-
-Some browsers cannot process Regex "look-behind" process such as (?<=\W)
-java.util.regex.Matcher and Pattern use JavaScript's RegExp object rather than
-the native Java object. These are not identical. Only flags /igm are supported.
-Matcher.start(groupID) is not supported.
-
-java.util.Formatter will function correctly for all standard %... patterns.
-
-integer 1/0 == Infinity
------------------------
-
-1/0 in Java throws "java.lang.ArithmeticException: / by zero", but in JavaScript is just Infinity.
-
-
-
-Summary
--------
-
-These are all the known limitations of SwingJS. We have not found any of these limitations
-to be show-stoppers. The primary issue for newcomers to SwingJS is having the source code.
-You must check that source code for all your library jar files is available or, if you
-choose, you will need to decompile those classes. We have used decompilation on some projects,
-and it works just fine. So, technically, all we really need are JAR/class files. But the
-source is by far superior. It's generally prettier, and it has the license information that
-may or may not be present with the JAR or class files. Use class files at your own risk.
-
-Bob Hanson
-2019.08.16
-
-
-Additional Issues
------------------
-
-Annotation is working for classes, methods, and fields (12/22/19). Method reflection, however,
-is limited. Interfaces do not expose their methods, as the transpiler does not actually transpile
-the interfaces themselves. And method reflection only includes annotated methods.
-
-java.util.concurrent is not fully elaborated. This package is rewritten to not actually use the
-memory handling capabilities of concurrency, which JavaScript does not have access to.
-
-System.getProperties() just returns a minimal set of properties.
-
-
+++ /dev/null
-20201219150605
import static org.testng.Assert.assertSame;
import static org.testng.Assert.assertTrue;
-import jalview.datamodel.SequenceFeature;
-
import java.util.ArrayList;
import java.util.List;
import java.util.Set;
import org.testng.annotations.Test;
+import jalview.datamodel.SequenceFeature;
+
public class FeatureStoreTest
{
}
@Test(groups = "Functional")
+ public void testFindFeatures_colocated()
+ {
+ FeatureStore fs = new FeatureStore();
+ SequenceFeature sf1 = new SequenceFeature("domain", "Cath", 10, 50, Float.NaN,
+ null);
+ fs.addFeature(sf1);
+ SequenceFeature sf2 = new SequenceFeature("domain", "Pfam", 10, 50, Float.NaN,
+ null);
+ fs.addFeature(sf2);
+ List<SequenceFeature> features = fs.findOverlappingFeatures(1, 100);
+
+ /*
+ * check co-located features are returned in the order they were added
+ */
+ assertEquals(features.size(), 2);
+ assertSame(features.get(0), sf1);
+ assertSame(features.get(1), sf2);
+ }
+
+ @Test(groups = "Functional")
public void testFindFeatures_mixed()
{
FeatureStore fs = new FeatureStore();
*/
package jalview.gui;
-import static org.testng.AssertJUnit.assertEquals;
-import static org.testng.AssertJUnit.assertFalse;
+import static org.testng.Assert.assertEquals;
+import static org.testng.Assert.assertFalse;
import javax.swing.JScrollBar;
* operating range is 25 - 425 (400 wide) so value 125 is a quarter of this
* range
*/
- assertEquals(125, JvSwingUtils.getScrollValueForProportion(sb, 0.25f));
+ assertEquals(JvSwingUtils.getScrollValueForProportion(sb, 0.25f), 125);
}
/**
public void testWrapTooltip_shortText()
{
String tip = "hello world";
- assertEquals(tip, JvSwingUtils.wrapTooltip(false, tip));
- assertEquals("<html>" + tip + "</html>",
- JvSwingUtils.wrapTooltip(true, tip));
+ assertEquals(JvSwingUtils.wrapTooltip(false, tip), tip,
+ "Text was not kept the same");
+ assertEquals(JvSwingUtils.wrapTooltip(true, tip),
+ "<html>" + tip + "</html>",
+ "Text was not simply wrapped in HTML");
tip = "012345678901234567890123456789012345678901234567890123456789"; // 60
- assertEquals(tip, JvSwingUtils.wrapTooltip(false, tip));
- assertEquals("<html>" + tip + "</html>",
- JvSwingUtils.wrapTooltip(true, tip));
+ assertEquals(JvSwingUtils.wrapTooltip(false, tip), tip,
+ "Text was not kept the same");
+ assertEquals(JvSwingUtils.wrapTooltip(true, tip),
+ "<html>" + tip + "</html>",
+ "Text was not simply wrapped in HTML");
tip = "0123456789012345678901234567890123456789012345678901234567890"; // 61
- assertFalse(tip.equals(JvSwingUtils.wrapTooltip(false, tip)));
- assertFalse(("<html>" + tip + "</html>")
- .equals(JvSwingUtils.wrapTooltip(true, tip)));
+ assertFalse(tip.equals(JvSwingUtils.wrapTooltip(false, tip)),
+ "Text is the same when it should be shortened/wrapped over lines");
+ assertFalse(
+ ("<html>" + tip + "</html>")
+ .equals(JvSwingUtils.wrapTooltip(true, tip)),
+ "Text is only wrapped in HTML tags when it should be shortened/wrapped over lines");
}
/**
@Test(groups = { "Functional" })
public void testWrapTooltip_multilineShortText()
{
+ // <br>
String tip = "Now is the winter of our discontent<br>Made glorious summer by this sun of York";
- assertEquals(tip, JvSwingUtils.wrapTooltip(false, tip));
- assertEquals("<html>" + tip + "</html>",
- JvSwingUtils.wrapTooltip(true, tip));
+ assertEquals(JvSwingUtils.wrapTooltip(false, tip), tip,
+ "Text was not kept the same");
+ assertEquals(JvSwingUtils.wrapTooltip(true, tip),
+ "<html>" + tip + "</html>",
+ "Text was not simply wrapped in HTML");
+
+ // <br/>
+ tip = "Now is the winter of our discontent<br/>Made glorious summer by this sun of York";
+ assertEquals(JvSwingUtils.wrapTooltip(false, tip), tip,
+ "Text was not kept the same");
+ assertEquals(JvSwingUtils.wrapTooltip(true, tip),
+ "<html>" + tip + "</html>",
+ "Text was not simply wrapped in HTML");
}
/**
@Test(groups = { "Functional" })
public void testWrapTooltip_longText()
{
+ // 76 characters > 60
String tip = "Now is the winter of our discontent made glorious summer by this sun of York";
String expected = "<style> div.ttip {width:350px;white-space:pre-wrap;padding:2px;overflow-wrap:break-word;}</style>"
- + "<div class=\"ttip\">" + tip + " </div>";
- assertEquals("<html>" + expected + "</html>",
- JvSwingUtils.wrapTooltip(true, tip));
- assertEquals(expected, JvSwingUtils.wrapTooltip(false, tip));
+ + "<div class=\"ttip\">" + tip + "</div>";
+ assertEquals(JvSwingUtils.wrapTooltip(true, tip),
+ "<html>" + expected + "</html>",
+ "Text was not wrapped in HTML with styling and div");
+ assertEquals(JvSwingUtils.wrapTooltip(false, tip), expected,
+ "Text was not just styled with div");
}
}
testee.configureReferenceAnnotationsMenu(menu, seqs);
assertTrue(menu.isEnabled());
String s = MessageManager.getString("label.add_annotations_for");
- String expected = "<html><style> div.ttip {width:350px;white-space:pre-wrap;padding:2px;overflow-wrap:break-word;}</style>"
- + "<div class=\"ttip\">" + s
- + "<br/>Jmol/secondary structure<br/>PDB/Temp </div></html>";
+ String expected = "<html>" + s
+ + "<br/>Jmol/secondary structure<br/>PDB/Temp</html>";
assertEquals(expected, menu.getToolTipText());
}
testee.configureReferenceAnnotationsMenu(menu, seqs);
assertTrue(menu.isEnabled());
String s = MessageManager.getString("label.add_annotations_for");
- String expected = "<html><style> div.ttip {width:350px;white-space:pre-wrap;padding:2px;overflow-wrap:break-word;}</style>"
- + "<div class=\"ttip\">" + s
- + "<br/>Jmol/secondary structure<br/>PDB/Temp </div></html>";
+ String expected = "<html>" + s
+ + "<br/>Jmol/secondary structure<br/>PDB/Temp</html>";
assertEquals(expected, menu.getToolTipText());
}
import static org.testng.Assert.assertNull;
import static org.testng.Assert.assertTrue;
+import java.io.File;
+import java.io.IOException;
+import java.io.PrintWriter;
+import java.util.List;
+import java.util.Map;
+
+import org.testng.annotations.BeforeClass;
+import org.testng.annotations.BeforeTest;
+import org.testng.annotations.Test;
+
import jalview.bin.Cache;
import jalview.bin.Console;
import jalview.datamodel.AlignmentI;
import jalview.io.gff.Gff3Helper;
import jalview.util.MapList;
-import java.io.File;
-import java.io.IOException;
-import java.io.PrintWriter;
-import java.util.List;
-import java.util.Map;
-
-import org.testng.annotations.BeforeClass;
-import org.testng.annotations.BeforeTest;
-import org.testng.annotations.Test;
-
public class VCFLoaderTest
{
private static final float DELTA = 0.00001f;
.getSequenceFeatures();
SequenceFeatures.sortFeatures(geneFeatures, true);
assertEquals(geneFeatures.size(), 5);
+
SequenceFeature sf = geneFeatures.get(0);
assertEquals(sf.getFeatureGroup(), "VCF");
assertEquals(sf.getBegin(), 2);
assertEquals(sf.getEnd(), 2);
+ assertEquals(sf.getType(), SEQUENCE_VARIANT);
+ assertEquals(sf.getScore(), 0f);
+ assertEquals(Float.parseFloat((String) sf.getValue("AF")), 5.0e-03,
+ DELTA);
+ assertEquals(sf.getValue("AC_Female"), "12");
+ // malformed float for AF_AFR is ignored (JAL-3375)
+ assertNull(sf.getValue("AC_AFR"));
+ assertEquals(sf.getValue(Gff3Helper.ALLELES), "A,T");
+
+ sf = geneFeatures.get(1);
+ assertEquals(sf.getFeatureGroup(), "VCF");
+ assertEquals(sf.getBegin(), 2);
+ assertEquals(sf.getEnd(), 2);
assertEquals(sf.getScore(), 0f);
assertEquals(sf.getValue("AF"), "4.0e-03");
assertEquals(sf.getValue("AF_AFR"), "2.3e-4");
// malformed integer for AC_Female is ignored (JAL-3375)
assertNull(sf.getValue("AC_Female"));
- sf = geneFeatures.get(1);
- assertEquals(sf.getFeatureGroup(), "VCF");
- assertEquals(sf.getBegin(), 2);
- assertEquals(sf.getEnd(), 2);
- assertEquals(sf.getType(), SEQUENCE_VARIANT);
- assertEquals(sf.getScore(), 0f);
- assertEquals(Float.parseFloat((String) sf.getValue("AF")), 5.0e-03,
- DELTA);
- assertEquals(sf.getValue("AC_Female"), "12");
- // malformed float for AF_AFR is ignored (JAL-3375)
- assertNull(sf.getValue("AC_AFR"));
- assertEquals(sf.getValue(Gff3Helper.ALLELES), "A,T");
-
sf = geneFeatures.get(2);
assertEquals(sf.getFeatureGroup(), "VCF");
assertEquals(sf.getBegin(), 4);
assertEquals(sf.getEnd(), 4);
assertEquals(sf.getType(), SEQUENCE_VARIANT);
assertEquals(sf.getScore(), 0f);
- assertEquals(Float.parseFloat((String) sf.getValue("AF")), 2.0e-03,
+ assertEquals(Float.parseFloat((String) sf.getValue("AF")), 3.0e-03,
DELTA);
- assertEquals(sf.getValue(Gff3Helper.ALLELES), "G,C");
+ assertEquals(sf.getValue(Gff3Helper.ALLELES), "G,GA");
+ assertNull(sf.getValue("ID")); // '.' is ignored
+ assertNull(sf.getValue("FILTER")); // '.' is ignored
sf = geneFeatures.get(3);
assertEquals(sf.getFeatureGroup(), "VCF");
assertEquals(sf.getEnd(), 4);
assertEquals(sf.getType(), SEQUENCE_VARIANT);
assertEquals(sf.getScore(), 0f);
- assertEquals(Float.parseFloat((String) sf.getValue("AF")), 3.0e-03,
+ assertEquals(Float.parseFloat((String) sf.getValue("AF")), 2.0e-03,
DELTA);
- assertEquals(sf.getValue(Gff3Helper.ALLELES), "G,GA");
- assertNull(sf.getValue("ID")); // '.' is ignored
- assertNull(sf.getValue("FILTER")); // '.' is ignored
+ assertEquals(sf.getValue(Gff3Helper.ALLELES), "G,C");
sf = geneFeatures.get(4);
assertEquals(sf.getFeatureGroup(), "VCF");
List<SequenceFeature> transcriptFeatures = al.getSequenceAt(1)
.getSequenceFeatures();
assertEquals(transcriptFeatures.size(), 3);
+
sf = transcriptFeatures.get(0);
assertEquals(sf.getFeatureGroup(), "VCF");
assertEquals(sf.getBegin(), 2);
assertEquals(sf.getEnd(), 2);
assertEquals(sf.getType(), SEQUENCE_VARIANT);
assertEquals(sf.getScore(), 0f);
- assertEquals(Float.parseFloat((String) sf.getValue("AF")), 2.0e-03,
+ assertEquals(Float.parseFloat((String) sf.getValue("AF")), 3.0e-03,
DELTA);
- assertEquals(sf.getValue(Gff3Helper.ALLELES), "G,C");
+ assertEquals(sf.getValue(Gff3Helper.ALLELES), "G,GA");
+
sf = transcriptFeatures.get(1);
assertEquals(sf.getFeatureGroup(), "VCF");
assertEquals(sf.getBegin(), 2);
assertEquals(sf.getEnd(), 2);
assertEquals(sf.getType(), SEQUENCE_VARIANT);
assertEquals(sf.getScore(), 0f);
- assertEquals(Float.parseFloat((String) sf.getValue("AF")), 3.0e-03,
+ assertEquals(Float.parseFloat((String) sf.getValue("AF")), 2.0e-03,
DELTA);
- assertEquals(sf.getValue(Gff3Helper.ALLELES), "G,GA");
+ assertEquals(sf.getValue(Gff3Helper.ALLELES), "G,C");
/*
* verify SNP variant feature(s) computed and added to protein
DELTA);
/*
- * variant A/C at 45051611 maps to T/G at gene position 24
+ * variant A/T at 45051611 maps to T/A at gene position 24
*/
sf = geneFeatures.get(3);
assertEquals(sf.getFeatureGroup(), "VCF");
assertEquals(sf.getEnd(), 24);
assertEquals(sf.getType(), SEQUENCE_VARIANT);
assertEquals(sf.getScore(), 0f);
- assertEquals(sf.getValue(Gff3Helper.ALLELES), "T,G");
- assertEquals(Float.parseFloat((String) sf.getValue("AF")), 4.0e-03,
+ assertEquals(sf.getValue(Gff3Helper.ALLELES), "T,A");
+ assertEquals(Float.parseFloat((String) sf.getValue("AF")), 5.0e-03,
DELTA);
/*
- * variant A/T at 45051611 maps to T/A at gene position 24
+ * variant A/C at 45051611 maps to T/G at gene position 24
*/
sf = geneFeatures.get(4);
assertEquals(sf.getFeatureGroup(), "VCF");
assertEquals(sf.getEnd(), 24);
assertEquals(sf.getType(), SEQUENCE_VARIANT);
assertEquals(sf.getScore(), 0f);
- assertEquals(sf.getValue(Gff3Helper.ALLELES), "T,A");
- assertEquals(Float.parseFloat((String) sf.getValue("AF")), 5.0e-03,
+ assertEquals(sf.getValue(Gff3Helper.ALLELES), "T,G");
+ assertEquals(Float.parseFloat((String) sf.getValue("AF")), 4.0e-03,
DELTA);
/*
assertEquals(sf.getBegin(), 13);
assertEquals(sf.getEnd(), 13);
assertEquals(sf.getScore(), 0f);
- assertEquals(Float.parseFloat((String) sf.getValue("AF")), 0.5f, DELTA);
- assertEquals(sf.getValue("alleles"), "C,T");
+ assertEquals(Float.parseFloat((String) sf.getValue("AF")), 0.4f, DELTA);
+ assertEquals(sf.getValue("alleles"), "C,G");
map = (Map) sf.getValue("CSQ");
assertEquals(map.size(), 9);
assertEquals(sf.getBegin(), 13);
assertEquals(sf.getEnd(), 13);
assertEquals(sf.getScore(), 0f);
- assertEquals(Float.parseFloat((String) sf.getValue("AF")), 0.4f, DELTA);
- assertEquals(sf.getValue("alleles"), "C,G");
+ assertEquals(Float.parseFloat((String) sf.getValue("AF")), 0.5f, DELTA);
+ assertEquals(sf.getValue("alleles"), "C,T");
map = (Map) sf.getValue("CSQ");
assertEquals(map.size(), 9);
assertEquals(sf.getBegin(), 17);
assertEquals(sf.getEnd(), 17);
assertEquals(sf.getScore(), 0f);
- assertEquals(Float.parseFloat((String) sf.getValue("AF")), 0.7f, DELTA);
- assertEquals(sf.getValue("alleles"), "A,G");
+ assertEquals(Float.parseFloat((String) sf.getValue("AF")), 0.6f, DELTA);
+ assertEquals(sf.getValue("alleles"), "A,AC");
map = (Map) sf.getValue("CSQ");
assertEquals(map.size(), 9);
assertEquals(sf.getBegin(), 17);
assertEquals(sf.getEnd(), 17); // insertion
assertEquals(sf.getScore(), 0f);
- assertEquals(Float.parseFloat((String) sf.getValue("AF")), 0.6f, DELTA);
- assertEquals(sf.getValue("alleles"), "A,AC");
+ assertEquals(Float.parseFloat((String) sf.getValue("AF")), 0.7f, DELTA);
+ assertEquals(sf.getValue("alleles"), "A,G");
map = (Map) sf.getValue("CSQ");
assertEquals(map.size(), 9);
assertEquals(sf.getBegin(), 11);
assertEquals(sf.getEnd(), 11);
assertEquals(sf.getScore(), 0f);
- assertEquals(Float.parseFloat((String) sf.getValue("AF")), 0.7f, DELTA);
- assertEquals(sf.getValue("alleles"), "A,G");
+ assertEquals(Float.parseFloat((String) sf.getValue("AF")), 0.6f, DELTA);
+ assertEquals(sf.getValue("alleles"), "A,AC");
+ map = (Map) sf.getValue("CSQ");
assertEquals(map.size(), 9);
assertEquals(sf.getValueAsString("CSQ", "Feature"), "transcript3");
assertEquals(sf.getBegin(), 11);
assertEquals(sf.getEnd(), 11);
assertEquals(sf.getScore(), 0f);
- assertEquals(Float.parseFloat((String) sf.getValue("AF")), 0.6f, DELTA);
- assertEquals(sf.getValue("alleles"), "A,AC");
+ assertEquals(Float.parseFloat((String) sf.getValue("AF")), 0.7f, DELTA);
+ assertEquals(sf.getValue("alleles"), "A,G");
+ map = (Map) sf.getValue("CSQ");
assertEquals(map.size(), 9);
assertEquals(sf.getValueAsString("CSQ", "Feature"), "transcript3");
assertEquals(sf.getBegin(), 7);
assertEquals(sf.getEnd(), 7);
assertEquals(sf.getScore(), 0f);
- assertEquals(Float.parseFloat((String) sf.getValue("AF")), 0.5f, DELTA);
- assertEquals(sf.getValue("alleles"), "C,T");
+ assertEquals(Float.parseFloat((String) sf.getValue("AF")), 0.4f, DELTA);
+ assertEquals(sf.getValue("alleles"), "C,G");
+ map = (Map) sf.getValue("CSQ");
assertEquals(map.size(), 9);
assertEquals(sf.getValueAsString("CSQ", "Feature"), "transcript4");
assertEquals(sf.getBegin(), 7);
assertEquals(sf.getEnd(), 7);
assertEquals(sf.getScore(), 0f);
- assertEquals(Float.parseFloat((String) sf.getValue("AF")), 0.4f, DELTA);
- assertEquals(sf.getValue("alleles"), "C,G");
+ assertEquals(Float.parseFloat((String) sf.getValue("AF")), 0.5f, DELTA);
+ assertEquals(sf.getValue("alleles"), "C,T");
+ map = (Map) sf.getValue("CSQ");
assertEquals(map.size(), 9);
assertEquals(sf.getValueAsString("CSQ", "Feature"), "transcript4");
assertEquals(sf.getBegin(), 11);
assertEquals(sf.getEnd(), 11);
assertEquals(sf.getScore(), 0f);
- assertEquals(Float.parseFloat((String) sf.getValue("AF")), 0.7f, DELTA);
- assertEquals(sf.getValue("alleles"), "A,G");
+ assertEquals(Float.parseFloat((String) sf.getValue("AF")), 0.6f, DELTA);
+ assertEquals(sf.getValue("alleles"), "A,AC");
+ map = (Map) sf.getValue("CSQ");
assertEquals(map.size(), 9);
assertEquals(sf.getValueAsString("CSQ", "Feature"), "transcript4");
assertEquals(sf.getBegin(), 11);
assertEquals(sf.getEnd(), 11);
assertEquals(sf.getScore(), 0f);
- assertEquals(Float.parseFloat((String) sf.getValue("AF")), 0.6f, DELTA);
- assertEquals(sf.getValue("alleles"), "A,AC");
+ assertEquals(Float.parseFloat((String) sf.getValue("AF")), 0.7f, DELTA);
+ assertEquals(sf.getValue("alleles"), "A,G");
+ map = (Map) sf.getValue("CSQ");
assertEquals(map.size(), 9);
assertEquals(sf.getValueAsString("CSQ", "Feature"), "transcript4");
}
import static org.testng.AssertJUnit.assertNull;
import static org.testng.AssertJUnit.assertTrue;
-import jalview.gui.JvOptionPane;
-
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.Test;
+import jalview.gui.JvOptionPane;
+
public class StringUtilsTest
{
*/
assertEquals("[abc='|'d, ef, g]", Arrays.toString(
StringUtils.separatorListToArray("abc='|'d|ef|g", "|")));
+
+ /*
+ * edge cases
+ */
+ assertEquals("[abc=';'d, ef, g, key='val;ue;key2=what]",
+ Arrays.toString(StringUtils.separatorListToArray(
+ "abc=';'d;ef;g;key='val;ue;key2=what", ";")));
+ assertEquals("[hello\\world, jello'\\world', mello'wo\\'rld']",
+ Arrays.toString(StringUtils.separatorListToArray(
+ "hello\\world;jello'\\world';mello'wo\\'rld'", ";")));
+ // this next one checks that an escaped single quote doesn't end a quoted
+ // section so the following separator is treated as part of the quoted text,
+ // not as a separator.
+ assertEquals("[hello\\world, jello'\\world', mello'wo\\'r;ld']",
+ Arrays.toString(StringUtils.separatorListToArray(
+ "hello\\world;jello'\\world';mello'wo\\'r;ld'", ";")));
+ assertEquals("[hello\\;jello, mello\\;';'w, world]",
+ Arrays.toString(StringUtils.separatorListToArray(
+ "hello\\;jello;mello\\;';'w;world", ";")));
}
@Test(groups = { "Functional" })
-java/applet/Applet.js
+com/github/reinert/jjschema/Attributes.js
+com/stevesoft/pat/AmpersandRule.js
+com/stevesoft/pat/Any.js
+com/stevesoft/pat/BackG.js
+com/stevesoft/pat/BackMatch.js
+com/stevesoft/pat/BackRefRule.js
+com/stevesoft/pat/Backup.js
+com/stevesoft/pat/BasicStringBufferLike.js
+com/stevesoft/pat/Bits.js
+com/stevesoft/pat/Boundary.js
+com/stevesoft/pat/Bracket.js
+com/stevesoft/pat/Branch.js
+com/stevesoft/pat/CaseMgr.js
+com/stevesoft/pat/ChangeRule.js
+com/stevesoft/pat/CodeRule.js
+com/stevesoft/pat/Ctrl.js
+com/stevesoft/pat/Custom.js
+com/stevesoft/pat/CustomEndpoint.js
+com/stevesoft/pat/DirFileRegex.js
+com/stevesoft/pat/DotMulti.js
+com/stevesoft/pat/End.js
+com/stevesoft/pat/FastBracket.js
+com/stevesoft/pat/FastChar.js
+com/stevesoft/pat/FastMulti.js
+com/stevesoft/pat/FileRegex.js
+com/stevesoft/pat/Group.js
+com/stevesoft/pat/LeftRule.js
+com/stevesoft/pat/Multi.js
+com/stevesoft/pat/MultiMin.js
+com/stevesoft/pat/Multi_stage2.js
+com/stevesoft/pat/NUnicodeAlpha.js
+com/stevesoft/pat/NUnicodeCurrency.js
+com/stevesoft/pat/NUnicodeDigit.js
+com/stevesoft/pat/NUnicodeMath.js
+com/stevesoft/pat/NUnicodePunct.js
+com/stevesoft/pat/NUnicodeW.js
+com/stevesoft/pat/NUnicodeWhite.js
+com/stevesoft/pat/NoPattern.js
+com/stevesoft/pat/NonDirFileRegex.js
+com/stevesoft/pat/NotImplementedError.js
+com/stevesoft/pat/NullPattern.js
+com/stevesoft/pat/NullRule.js
+com/stevesoft/pat/Or.js
+com/stevesoft/pat/OrMark.js
+com/stevesoft/pat/PartialBuffer.js
+com/stevesoft/pat/Pattern.js
+com/stevesoft/pat/PatternSub.js
+com/stevesoft/pat/PopRule.js
+com/stevesoft/pat/Prop.js
+com/stevesoft/pat/Pthings.js
+com/stevesoft/pat/PushRule.js
+com/stevesoft/pat/RBuffer.js
+com/stevesoft/pat/Range.js
+com/stevesoft/pat/RegOpt.js
+com/stevesoft/pat/RegRes.js
+com/stevesoft/pat/RegSyntax.js
+com/stevesoft/pat/RegSyntaxError.js
+com/stevesoft/pat/Regex.js
+com/stevesoft/pat/RegexReader.js
+com/stevesoft/pat/RegexTokenizer.js
+com/stevesoft/pat/RegexWriter.js
+com/stevesoft/pat/ReplaceRule.js
+com/stevesoft/pat/Replacer.js
+com/stevesoft/pat/RightRule.js
+com/stevesoft/pat/Rthings.js
+com/stevesoft/pat/RuleHolder.js
+com/stevesoft/pat/Skip.js
+com/stevesoft/pat/Skip2.js
+com/stevesoft/pat/SkipBMH.js
+com/stevesoft/pat/Skipped.js
+com/stevesoft/pat/SpecialRule.js
+com/stevesoft/pat/Start.js
+com/stevesoft/pat/StrPos.js
+com/stevesoft/pat/StringBufferLike.js
+com/stevesoft/pat/StringLike.js
+com/stevesoft/pat/StringRule.js
+com/stevesoft/pat/SubMark.js
+com/stevesoft/pat/TransPat.js
+com/stevesoft/pat/Transformer.js
+com/stevesoft/pat/UniValidator.js
+com/stevesoft/pat/UnicodeAlpha.js
+com/stevesoft/pat/UnicodeCurrency.js
+com/stevesoft/pat/UnicodeDigit.js
+com/stevesoft/pat/UnicodeLower.js
+com/stevesoft/pat/UnicodeMath.js
+com/stevesoft/pat/UnicodePunct.js
+com/stevesoft/pat/UnicodeUpper.js
+com/stevesoft/pat/UnicodeW.js
+com/stevesoft/pat/UnicodeWhite.js
+com/stevesoft/pat/Validator.js
+com/stevesoft/pat/WantMoreTextReplaceRule.js
+com/stevesoft/pat/lookAhead.js
+com/stevesoft/pat/oneChar.js
+com/stevesoft/pat/parsePerl.js
+com/stevesoft/pat/patInf.js
+com/stevesoft/pat/patInt.js
+com/stevesoft/pat/wrap/CharArrayBufferWrap.js
+com/stevesoft/pat/wrap/CharArrayWrap.js
+com/stevesoft/pat/wrap/RandomAccessFileWrap.js
+com/stevesoft/pat/wrap/StringBufferWrap.js
+com/stevesoft/pat/wrap/StringWrap.js
+com/stevesoft/pat/wrap/WriterWrap.js
+core/package.js
+ext/edu/ucsf/rbvi/strucviz2/ChimUtils.js
+ext/edu/ucsf/rbvi/strucviz2/ChimeraChain.js
+ext/edu/ucsf/rbvi/strucviz2/ChimeraManager.js
+ext/edu/ucsf/rbvi/strucviz2/ChimeraModel.js
+ext/edu/ucsf/rbvi/strucviz2/ChimeraResidue.js
+ext/edu/ucsf/rbvi/strucviz2/ChimeraStructuralObject.js
+ext/edu/ucsf/rbvi/strucviz2/ChimeraTreeModel.js
+ext/edu/ucsf/rbvi/strucviz2/StructureManager.js
+ext/edu/ucsf/rbvi/strucviz2/StructureSettings.js
+ext/edu/ucsf/rbvi/strucviz2/port/ListenerThreads.js
+ext/vamsas/IRegistry.js
+ext/vamsas/IRegistryService.js
+ext/vamsas/IRegistryServiceLocator.js
+ext/vamsas/Jpred.js
+ext/vamsas/JpredService.js
+ext/vamsas/JpredServiceLocator.js
+ext/vamsas/JpredSoapBindingStub.js
+ext/vamsas/MuscleWS.js
+ext/vamsas/MuscleWSService.js
+ext/vamsas/MuscleWSServiceLocator.js
+ext/vamsas/MuscleWSSoapBindingStub.js
+ext/vamsas/RegistryServiceSoapBindingStub.js
+ext/vamsas/SeqSearchI.js
+ext/vamsas/SeqSearchServiceLocator.js
+ext/vamsas/SeqSearchServiceService.js
+ext/vamsas/SeqSearchServiceSoapBindingStub.js
+ext/vamsas/ServiceHandle.js
+ext/vamsas/ServiceHandles.js
+intervalstore/api/IntervalI.js
+intervalstore/api/IntervalStoreI.js
+intervalstore/impl/BinarySearcher.js
+intervalstore/impl/IntervalStore.js
+intervalstore/impl/NCList.js
+intervalstore/impl/NCNode.js
+jalview/analysis/AAFrequency.js
+jalview/analysis/AlignSeq.js
+jalview/analysis/AlignmentAnnotationUtils.js
+jalview/analysis/AlignmentSorter.js
+jalview/analysis/AlignmentUtils.js
+jalview/analysis/AnnotationSorter.js
+jalview/analysis/AverageDistanceEngine.js
+jalview/analysis/AverageDistanceTree.js
+jalview/analysis/CodingUtils.js
+jalview/analysis/CodonComparator.js
+jalview/analysis/Conservation.js
+jalview/analysis/CrossRef.js
+jalview/analysis/Dna.js
+jalview/analysis/Finder.js
+jalview/analysis/GeneticCodeI.js
+jalview/analysis/GeneticCodes.js
+jalview/analysis/Grouping.js
+jalview/analysis/NJTree.js
+jalview/analysis/PCA.js
+jalview/analysis/ParseProperties.js
+jalview/analysis/Rna.js
+jalview/analysis/SecStrConsensus.js
+jalview/analysis/SeqsetUtils.js
+jalview/analysis/SequenceIdMatcher.js
+jalview/analysis/StructureFrequency.js
+jalview/analysis/TreeBuilder.js
+jalview/analysis/TreeEngine.js
+jalview/analysis/TreeModel.js
+jalview/analysis/WUSSParseException.js
+jalview/analysis/scoremodels/DistanceScoreModel.js
+jalview/analysis/scoremodels/FeatureDistanceModel.js
+jalview/analysis/scoremodels/PIDModel.js
+jalview/analysis/scoremodels/ScoreMatrix.js
+jalview/analysis/scoremodels/ScoreModels.js
+jalview/analysis/scoremodels/SimilarityParams.js
+jalview/analysis/scoremodels/SimilarityScoreModel.js
+jalview/analysis/scoremodels/SmithWatermanModel.js
+jalview/analytics/Plausible.js
+jalview/api/AlignCalcManagerI.js
+jalview/api/AlignCalcWorkerI.js
+jalview/api/AlignExportSettingsI.js
+jalview/api/AlignViewControllerGuiI.js
+jalview/api/AlignViewControllerI.js
+jalview/api/AlignViewportI.js
+jalview/api/AlignmentColsCollectionI.js
+jalview/api/AlignmentRowsCollectionI.js
+jalview/api/AlignmentViewPanel.js
+jalview/api/BuildDetailsI.js
+jalview/api/ComplexAlignFile.js
+jalview/api/DBRefEntryI.js
+jalview/api/FeatureColourI.js
+jalview/api/FeatureRenderer.js
+jalview/api/FeatureSettingsControllerI.js
+jalview/api/FeatureSettingsModelI.js
+jalview/api/FeaturesDisplayedI.js
+jalview/api/FeaturesSourceI.js
+jalview/api/FinderI.js
+jalview/api/OOMHandlerI.js
+jalview/api/RendererListenerI.js
+jalview/api/RotatableCanvasI.js
+jalview/api/SequenceRenderer.js
+jalview/api/SequenceStructureBinding.js
+jalview/api/SiftsClientI.js
+jalview/api/SplitContainerI.js
+jalview/api/StructureSelectionManagerProvider.js
+jalview/api/ViewStyleI.js
+jalview/api/analysis/PairwiseScoreModelI.js
+jalview/api/analysis/ScoreModelI.js
+jalview/api/analysis/SimilarityParamsI.js
+jalview/api/structures/JalviewStructureDisplayI.js
+jalview/appletgui/APopupMenu.js
+jalview/appletgui/AlignFrame.js
+jalview/appletgui/AlignViewport.js
+jalview/appletgui/AlignmentPanel.js
+jalview/appletgui/AnnotationColourChooser.js
+jalview/appletgui/AnnotationColumnChooser.js
+jalview/appletgui/AnnotationLabels.js
+jalview/appletgui/AnnotationPanel.js
+jalview/appletgui/AnnotationRowFilter.js
+jalview/appletgui/AppletJmol.js
+jalview/appletgui/AppletJmolBinding.js
+jalview/appletgui/CutAndPasteTransfer.js
+jalview/appletgui/EditNameDialog.js
+jalview/appletgui/EmbmenuFrame.js
+jalview/appletgui/ExtJmol.js
+jalview/appletgui/FeatureColourChooser.js
+jalview/appletgui/FeatureRenderer.js
+jalview/appletgui/FeatureSettings.js
+jalview/appletgui/Finder.js
+jalview/appletgui/FontChooser.js
+jalview/appletgui/IdCanvas.js
+jalview/appletgui/IdPanel.js
+jalview/appletgui/IdwidthAdjuster.js
+jalview/appletgui/JVDialog.js
+jalview/appletgui/OverviewCanvas.js
+jalview/appletgui/OverviewPanel.js
+jalview/appletgui/PCAPanel.js
+jalview/appletgui/PaintRefresher.js
+jalview/appletgui/PairwiseAlignPanel.js
+jalview/appletgui/RedundancyPanel.js
+jalview/appletgui/RotatableCanvas.js
+jalview/appletgui/ScalePanel.js
+jalview/appletgui/SeqCanvas.js
+jalview/appletgui/SeqPanel.js
+jalview/appletgui/SequenceRenderer.js
+jalview/appletgui/SliderPanel.js
+jalview/appletgui/SplitFrame.js
+jalview/appletgui/TitledPanel.js
+jalview/appletgui/Tooltip.js
+jalview/appletgui/TreeCanvas.js
+jalview/appletgui/TreePanel.js
+jalview/appletgui/UserDefinedColours.js
+jalview/bin/ArgsParser.js
+jalview/bin/BuildDetails.js
+jalview/bin/Cache.js
+jalview/bin/Commands.js
+jalview/bin/Console.js
+jalview/bin/GetMemory.js
+jalview/bin/HiDPISetting.js
+jalview/bin/Jalview.js
+jalview/bin/JalviewJS2.js
+jalview/bin/JalviewLite.js
+jalview/bin/JalviewLiteURLRetrieve.js
+jalview/bin/JalviewTaskbar.js
+jalview/bin/Launcher.js
+jalview/bin/MemorySetting.js
+jalview/bin/ScreenInfo.js
+jalview/bin/argparser/Arg.js
+jalview/bin/argparser/ArgParser.js
+jalview/bin/argparser/ArgValue.js
+jalview/bin/argparser/ArgValues.js
+jalview/bin/argparser/ArgValuesMap.js
+jalview/bin/argparser/BootstrapArgs.js
+jalview/bin/argparser/SubVals.js
+jalview/bin/groovy/JalviewObject.js
+jalview/bin/groovy/JalviewObjectI.js
+jalview/commands/ChangeCaseCommand.js
+jalview/commands/CommandI.js
+jalview/commands/EditCommand.js
+jalview/commands/OrderCommand.js
+jalview/commands/RemoveGapColCommand.js
+jalview/commands/RemoveGapsCommand.js
+jalview/commands/SlideSequencesCommand.js
+jalview/commands/TrimRegionCommand.js
+jalview/controller/AlignViewController.js
+jalview/controller/FeatureSettingsController.js
+jalview/controller/FeatureSettingsControllerGuiI.js
+jalview/datamodel/ASequence.js
+jalview/datamodel/ASequenceI.js
+jalview/datamodel/AlignExportSettingsAdapter.js
+jalview/datamodel/AlignedCodon.js
+jalview/datamodel/AlignedCodonFrame.js
+jalview/datamodel/Alignment.js
+jalview/datamodel/AlignmentAnnotation.js
+jalview/datamodel/AlignmentExportData.js
+jalview/datamodel/AlignmentI.js
+jalview/datamodel/AlignmentOrder.js
+jalview/datamodel/AlignmentView.js
+jalview/datamodel/AllColsCollection.js
+jalview/datamodel/AllColsIterator.js
+jalview/datamodel/AllRowsCollection.js
+jalview/datamodel/AllRowsIterator.js
+jalview/datamodel/AnnotatedCollectionI.js
+jalview/datamodel/Annotation.js
+jalview/datamodel/BinaryNode.js
+jalview/datamodel/BinarySequence.js
+jalview/datamodel/CigarArray.js
+jalview/datamodel/CigarBase.js
+jalview/datamodel/CigarCigar.js
+jalview/datamodel/CigarSimple.js
+jalview/datamodel/ColumnSelection.js
+jalview/datamodel/ContactListI.js
+jalview/datamodel/ContactListImpl.js
+jalview/datamodel/ContactListProviderI.js
+jalview/datamodel/ContactMapHolder.js
+jalview/datamodel/ContactMapHolderI.js
+jalview/datamodel/ContactMatrix.js
+jalview/datamodel/ContactMatrixI.js
+jalview/datamodel/ContactRange.js
+jalview/datamodel/ContiguousI.js
+jalview/datamodel/DBRefEntry.js
+jalview/datamodel/DBRefSource.js
+jalview/datamodel/FeatureProperties.js
+jalview/datamodel/FloatContactMatrix.js
+jalview/datamodel/GeneLociI.js
+jalview/datamodel/GeneLocus.js
+jalview/datamodel/GraphLine.js
+jalview/datamodel/GroupSet.js
+jalview/datamodel/GroupSetHolder.js
+jalview/datamodel/GroupSetI.js
+jalview/datamodel/HiddenColumns.js
+jalview/datamodel/HiddenColumnsCursor.js
+jalview/datamodel/HiddenCursorPosition.js
+jalview/datamodel/HiddenSequences.js
+jalview/datamodel/IncompleteCodonException.js
+jalview/datamodel/MappedFeatures.js
+jalview/datamodel/Mapping.js
+jalview/datamodel/MappingType.js
+jalview/datamodel/NodeTransformI.js
+jalview/datamodel/PDBEntry.js
+jalview/datamodel/Point.js
+jalview/datamodel/Profile.js
+jalview/datamodel/ProfileI.js
+jalview/datamodel/Profiles.js
+jalview/datamodel/ProfilesI.js
+jalview/datamodel/Provenance.js
+jalview/datamodel/ProvenanceEntry.js
+jalview/datamodel/Range.js
+jalview/datamodel/RangeElementsIterator.js
+jalview/datamodel/RangeIterator.js
+jalview/datamodel/ResidueCount.js
+jalview/datamodel/RnaViewerModel.js
+jalview/datamodel/SearchResultMatchI.js
+jalview/datamodel/SearchResults.js
+jalview/datamodel/SearchResultsI.js
+jalview/datamodel/SecondaryStructureAnnotation.js
+jalview/datamodel/SeqCigar.js
+jalview/datamodel/SeqDistanceContactMatrix.js
+jalview/datamodel/Sequence.js
+jalview/datamodel/SequenceCollectionI.js
+jalview/datamodel/SequenceCursor.js
+jalview/datamodel/SequenceDummy.js
+jalview/datamodel/SequenceFeature.js
+jalview/datamodel/SequenceGroup.js
+jalview/datamodel/SequenceI.js
+jalview/datamodel/SequenceNode.js
+jalview/datamodel/SequencePoint.js
+jalview/datamodel/StartRegionIterator.js
+jalview/datamodel/StructureViewerModel.js
+jalview/datamodel/VisibleColsCollection.js
+jalview/datamodel/VisibleContigsIterator.js
+jalview/datamodel/VisibleRowsCollection.js
+jalview/datamodel/VisibleRowsIterator.js
+jalview/datamodel/annotations/AlphaFoldAnnotationRowBuilder.js
+jalview/datamodel/annotations/AnnotationRowBuilder.js
+jalview/datamodel/features/FeatureAttributeType.js
+jalview/datamodel/features/FeatureAttributes.js
+jalview/datamodel/features/FeatureLocationI.js
+jalview/datamodel/features/FeatureMatcher.js
+jalview/datamodel/features/FeatureMatcherI.js
+jalview/datamodel/features/FeatureMatcherSet.js
+jalview/datamodel/features/FeatureMatcherSetI.js
+jalview/datamodel/features/FeatureSource.js
+jalview/datamodel/features/FeatureSourceI.js
+jalview/datamodel/features/FeatureSources.js
+jalview/datamodel/features/FeatureStore.js
+jalview/datamodel/features/SequenceFeatures.js
+jalview/datamodel/features/SequenceFeaturesI.js
+jalview/exceptions/JalviewException.js
+jalview/ext/android/ContainerHelpers.js
+jalview/ext/android/SparseDoubleArray.js
+jalview/ext/android/SparseIntArray.js
+jalview/ext/android/SparseShortArray.js
+jalview/ext/ensembl/EnsemblCdna.js
+jalview/ext/ensembl/EnsemblCds.js
+jalview/ext/ensembl/EnsemblData.js
+jalview/ext/ensembl/EnsemblFeatures.js
+jalview/ext/ensembl/EnsemblGene.js
+jalview/ext/ensembl/EnsemblGenome.js
+jalview/ext/ensembl/EnsemblGenomes.js
+jalview/ext/ensembl/EnsemblInfo.js
+jalview/ext/ensembl/EnsemblLookup.js
+jalview/ext/ensembl/EnsemblMap.js
+jalview/ext/ensembl/EnsemblProtein.js
+jalview/ext/ensembl/EnsemblRestClient.js
+jalview/ext/ensembl/EnsemblSeqProxy.js
+jalview/ext/ensembl/EnsemblSequenceFetcher.js
+jalview/ext/ensembl/EnsemblSymbol.js
+jalview/ext/ensembl/EnsemblXref.js
+jalview/ext/ensembl/Species.js
+jalview/ext/htsjdk/HtsContigDb.js
+jalview/ext/htsjdk/VCFReader.js
+jalview/ext/jmol/JalviewJmolBinding.js
+jalview/ext/jmol/JmolCommands.js
+jalview/ext/jmol/JmolParser.js
+jalview/ext/paradise/Annotate3D.js
+jalview/ext/pymol/PymolCommands.js
+jalview/ext/pymol/PymolManager.js
+jalview/ext/rbvi/chimera/ChimeraCommands.js
+jalview/ext/rbvi/chimera/ChimeraListener.js
+jalview/ext/rbvi/chimera/ChimeraXCommands.js
+jalview/ext/rbvi/chimera/ChimeraXManager.js
+jalview/ext/rbvi/chimera/JalviewChimeraBinding.js
+jalview/ext/so/SequenceOntology.js
+jalview/ext/varna/JalviewVarnaBinding.js
+jalview/ext/varna/RnaModel.js
+jalview/ext/varna/VarnaCommands.js
+jalview/fts/api/FTSData.js
+jalview/fts/api/FTSDataColumnI.js
+jalview/fts/api/FTSRestClientI.js
+jalview/fts/api/GFTSPanelI.js
+jalview/fts/api/StructureFTSRestClientI.js
+jalview/fts/core/DecimalFormatTableCellRenderer.js
+jalview/fts/core/FTSDataColumnPreferences.js
+jalview/fts/core/FTSRestClient.js
+jalview/fts/core/FTSRestRequest.js
+jalview/fts/core/FTSRestResponse.js
+jalview/fts/core/GFTSPanel.js
+jalview/fts/service/alphafold/AlphafoldRestClient.js
+jalview/fts/service/pdb/PDBFTSPanel.js
+jalview/fts/service/pdb/PDBFTSRestClient.js
+jalview/fts/service/threedbeacons/TDB_FTSData.js
+jalview/fts/service/threedbeacons/TDBeaconsFTSPanel.js
+jalview/fts/service/threedbeacons/TDBeaconsFTSRestClient.js
+jalview/fts/service/uniprot/UniProtFTSRestClient.js
+jalview/fts/service/uniprot/UniprotFTSPanel.js
+jalview/gui/APQHandlers.js
+jalview/gui/AlignExportOptions.js
+jalview/gui/AlignFrame.js
+jalview/gui/AlignViewport.js
+jalview/gui/AlignmentPanel.js
+jalview/gui/AnnotationChooser.js
+jalview/gui/AnnotationColourChooser.js
+jalview/gui/AnnotationColumnChooser.js
+jalview/gui/AnnotationExporter.js
+jalview/gui/AnnotationLabels.js
+jalview/gui/AnnotationPanel.js
+jalview/gui/AnnotationRowFilter.js
+jalview/gui/AppJmol.js
+jalview/gui/AppJmolBinding.js
+jalview/gui/AppVarna.js
+jalview/gui/AppVarnaBinding.js
+jalview/gui/AssociatePdbFileWithSeq.js
+jalview/gui/BlogReader.js
+jalview/gui/CalculationChooser.js
+jalview/gui/ChimeraViewFrame.js
+jalview/gui/ChimeraXViewFrame.js
+jalview/gui/ColourMenuHelper.js
+jalview/gui/ComboBoxTooltipRenderer.js
+jalview/gui/Console.js
+jalview/gui/CrossRefAction.js
+jalview/gui/CutAndPasteHtmlTransfer.js
+jalview/gui/CutAndPasteTransfer.js
+jalview/gui/Desktop.js
+jalview/gui/EditNameDialog.js
+jalview/gui/FeatureEditor.js
+jalview/gui/FeatureRenderer.js
+jalview/gui/FeatureSettings.js
+jalview/gui/FeatureTypeSettings.js
+jalview/gui/Finder.js
+jalview/gui/FontChooser.js
+jalview/gui/Help.js
+jalview/gui/IProgressIndicator.js
+jalview/gui/IProgressIndicatorHandler.js
+jalview/gui/IdCanvas.js
+jalview/gui/IdPanel.js
+jalview/gui/IdwidthAdjuster.js
+jalview/gui/ImageExporter.js
+jalview/gui/JDatabaseTree.js
+jalview/gui/JalviewBooleanRadioButtons.js
+jalview/gui/JalviewChangeSupport.js
+jalview/gui/JalviewChimeraBindingModel.js
+jalview/gui/JalviewChimeraXBindingModel.js
+jalview/gui/JalviewColourChooser.js
+jalview/gui/JalviewDialog.js
+jalview/gui/JvOptionPane.js
+jalview/gui/JvSwingUtils.js
+jalview/gui/LineartOptions.js
+jalview/gui/MenuChooser.js
+jalview/gui/OOMWarning.js
+jalview/gui/OptsAndParamsPage.js
+jalview/gui/OptsParametersContainerI.js
+jalview/gui/OverviewCanvas.js
+jalview/gui/OverviewPanel.js
+jalview/gui/PCAPanel.js
+jalview/gui/PaintRefresher.js
+jalview/gui/PairwiseAlignPanel.js
+jalview/gui/PopupMenu.js
+jalview/gui/Preferences.js
+jalview/gui/ProgressBar.js
+jalview/gui/ProgressPanel.js
+jalview/gui/PromptUserConfig.js
+jalview/gui/PymolBindingModel.js
+jalview/gui/PymolViewer.js
+jalview/gui/QuitHandler.js
+jalview/gui/RedundancyPanel.js
+jalview/gui/RestInputParamEditDialog.js
+jalview/gui/RestServiceEditorPane.js
+jalview/gui/RotatableCanvas.js
+jalview/gui/ScalePanel.js
+jalview/gui/SeqCanvas.js
+jalview/gui/SeqPanel.js
+jalview/gui/SequenceFetcher.js
+jalview/gui/SequenceRenderer.js
+jalview/gui/Slider.js
+jalview/gui/SliderPanel.js
+jalview/gui/SplashScreen.js
+jalview/gui/SplitFrame.js
+jalview/gui/StructureChooser.js
+jalview/gui/StructureViewer.js
+jalview/gui/StructureViewerBase.js
+jalview/gui/TextColourChooser.js
+jalview/gui/TreeCanvas.js
+jalview/gui/TreePanel.js
+jalview/gui/UserDefinedColours.js
+jalview/gui/UserQuestionnaireCheck.js
+jalview/gui/VamsasApplication.js
+jalview/gui/ViewSelectionMenu.js
+jalview/gui/WebserviceInfo.js
+jalview/gui/WsJobParameters.js
+jalview/gui/WsParamSetManager.js
+jalview/gui/WsPreferences.js
+jalview/gui/structurechooser/PDBStructureChooserQuerySource.js
+jalview/gui/structurechooser/StructureChooserQuerySource.js
+jalview/gui/structurechooser/TDBResultAnalyser.js
+jalview/gui/structurechooser/ThreeDBStructureChooserQuerySource.js
+jalview/httpserver/AbstractRequestHandler.js
+jalview/httpserver/HttpServer.js
+jalview/io/AMSAFile.js
+jalview/io/AlignFile.js
+jalview/io/AlignmentFileReaderI.js
+jalview/io/AlignmentFileWriterI.js
+jalview/io/AlignmentProperties.js
+jalview/io/AnnotationFile.js
+jalview/io/AppletFormatAdapter.js
+jalview/io/BLCFile.js
+jalview/io/BackupFilenameFilter.js
+jalview/io/BackupFilenameParts.js
+jalview/io/BackupFiles.js
+jalview/io/BackupFilesPresetEntry.js
+jalview/io/BioJsHTMLOutput.js
+jalview/io/ClustalFile.js
+jalview/io/DBRefFile.js
+jalview/io/DataSourceType.js
+jalview/io/EMBLLikeFlatFile.js
+jalview/io/EmblFlatFile.js
+jalview/io/FastaFile.js
+jalview/io/FeaturesFile.js
+jalview/io/FileFormat.js
+jalview/io/FileFormatException.js
+jalview/io/FileFormatI.js
+jalview/io/FileFormats.js
+jalview/io/FileLoader.js
+jalview/io/FileParse.js
+jalview/io/FormatAdapter.js
+jalview/io/GenBankFile.js
+jalview/io/HTMLOutput.js
+jalview/io/HtmlFile.js
+jalview/io/HtmlSvgOutput.js
+jalview/io/IdentifyFile.js
+jalview/io/InputStreamParser.js
+jalview/io/IntKeyStringValueEntry.js
+jalview/io/JPredFile.js
+jalview/io/JSONFile.js
+jalview/io/JalviewFileChooser.js
+jalview/io/JalviewFileFilter.js
+jalview/io/JalviewFileView.js
+jalview/io/JnetAnnotationMaker.js
+jalview/io/MSFfile.js
+jalview/io/ModellerDescription.js
+jalview/io/NewickFile.js
+jalview/io/PContactPredictionFile.js
+jalview/io/PDBFeatureSettings.js
+jalview/io/PIRFile.js
+jalview/io/PfamFile.js
+jalview/io/PhylipFile.js
+jalview/io/PileUpfile.js
+jalview/io/RnamlFile.js
+jalview/io/ScoreMatrixFile.js
+jalview/io/SequenceAnnotationReport.js
+jalview/io/SimpleBlastFile.js
+jalview/io/StockholmFile.js
+jalview/io/StructureFile.js
+jalview/io/TCoffeeScoreFile.js
+jalview/io/VamsasAppDatastore.js
+jalview/io/WSWUBlastClient.js
+jalview/io/cache/AppCache.js
+jalview/io/cache/JvCacheableInputBox.js
+jalview/io/exceptions/ImageOutputException.js
+jalview/io/gff/ExonerateHelper.js
+jalview/io/gff/Gff2Helper.js
+jalview/io/gff/Gff3Helper.js
+jalview/io/gff/GffConstants.js
+jalview/io/gff/GffHelperBase.js
+jalview/io/gff/GffHelperFactory.js
+jalview/io/gff/GffHelperI.js
+jalview/io/gff/InterProScanHelper.js
+jalview/io/gff/SequenceOntologyFactory.js
+jalview/io/gff/SequenceOntologyI.js
+jalview/io/gff/SequenceOntologyLite.js
+jalview/io/packed/DataProvider.js
+jalview/io/packed/JalviewDataset.js
+jalview/io/packed/ParsePackedSet.js
+jalview/io/packed/SimpleDataProvider.js
+jalview/io/vamsas/Datasetsequence.js
+jalview/io/vamsas/DatastoreItem.js
+jalview/io/vamsas/DatastoreRegistry.js
+jalview/io/vamsas/Dbref.js
+jalview/io/vamsas/LocalDocSyncObject.js
+jalview/io/vamsas/Rangetype.js
+jalview/io/vamsas/Sequencefeature.js
+jalview/io/vamsas/Sequencemapping.js
+jalview/io/vamsas/Tree.js
+jalview/io/vcf/VCFLoader.js
+jalview/javascript/JSFunctionExec.js
+jalview/javascript/JalviewLiteJsApi.js
+jalview/javascript/JsCallBack.js
+jalview/javascript/JsSelectionSender.js
+jalview/javascript/MouseOverListener.js
+jalview/javascript/MouseOverStructureListener.js
+jalview/javascript/json/JSON.js
+jalview/javascript/web/Client.js
+jalview/javascript/web/ClientResponse.js
+jalview/javascript/web/WebResource.js
+jalview/jbgui/FilterOption.js
+jalview/jbgui/GAlignFrame.js
+jalview/jbgui/GAlignmentPanel.js
+jalview/jbgui/GCutAndPasteHtmlTransfer.js
+jalview/jbgui/GCutAndPasteTransfer.js
+jalview/jbgui/GDesktop.js
+jalview/jbgui/GFinder.js
+jalview/jbgui/GFontChooser.js
+jalview/jbgui/GPCAPanel.js
+jalview/jbgui/GPairwiseAlignPanel.js
+jalview/jbgui/GPreferences.js
+jalview/jbgui/GRestInputParamEditDialog.js
+jalview/jbgui/GRestServiceEditorPane.js
+jalview/jbgui/GRnaStructureViewer.js
+jalview/jbgui/GSequenceLink.js
+jalview/jbgui/GSliderPanel.js
+jalview/jbgui/GSplitFrame.js
+jalview/jbgui/GStructureChooser.js
+jalview/jbgui/GStructureViewer.js
+jalview/jbgui/GTreePanel.js
+jalview/jbgui/GUserDefinedColours.js
+jalview/jbgui/GWebserviceInfo.js
+jalview/jbgui/GWsPreferences.js
+jalview/json/binding/biojs/BioJSReleasePojo.js
+jalview/json/binding/biojs/BioJSRepositoryPojo.js
+jalview/json/binding/biojson/v1/AlignmentAnnotationPojo.js
+jalview/json/binding/biojson/v1/AlignmentPojo.js
+jalview/json/binding/biojson/v1/AnnotationDisplaySettingPojo.js
+jalview/json/binding/biojson/v1/AnnotationPojo.js
+jalview/json/binding/biojson/v1/ColourSchemeMapper.js
+jalview/json/binding/biojson/v1/SequenceFeaturesPojo.js
+jalview/json/binding/biojson/v1/SequenceGrpPojo.js
+jalview/json/binding/biojson/v1/SequencePojo.js
+jalview/log/JLogger.js
+jalview/log/JLoggerI.js
+jalview/log/JLoggerLog4j.js
+jalview/log/JalviewAppender.js
+jalview/math/AlignmentDimension.js
+jalview/math/Matrix.js
+jalview/math/MatrixI.js
+jalview/math/RotatableMatrix.js
+jalview/math/SparseMatrix.js
+jalview/project/Jalview2XML.js
+jalview/renderer/AnnotationRenderer.js
+jalview/renderer/AnnotationRendererFactory.js
+jalview/renderer/AwtRenderPanelI.js
+jalview/renderer/ContactGeometry.js
+jalview/renderer/ContactMapRenderer.js
+jalview/renderer/OverviewRenderer.js
+jalview/renderer/OverviewResColourFinder.js
+jalview/renderer/ResidueColourFinder.js
+jalview/renderer/ResidueShader.js
+jalview/renderer/ResidueShaderI.js
+jalview/renderer/ScaleRenderer.js
+jalview/renderer/api/AnnotationRendererFactoryI.js
+jalview/renderer/api/AnnotationRowRendererI.js
+jalview/renderer/seqfeatures/FeatureColourFinder.js
+jalview/renderer/seqfeatures/FeatureRenderer.js
+jalview/rest/RestHandler.js
+jalview/schemes/AnnotationColourGradient.js
+jalview/schemes/BlossomColourScheme.js
+jalview/schemes/Blosum62ColourScheme.js
+jalview/schemes/BuriedColourScheme.js
+jalview/schemes/ClustalxColourScheme.js
+jalview/schemes/ColourSchemeI.js
+jalview/schemes/ColourSchemeLoader.js
+jalview/schemes/ColourSchemeProperty.js
+jalview/schemes/ColourSchemes.js
+jalview/schemes/Consensus.js
+jalview/schemes/CovariationColourScheme.js
+jalview/schemes/FeatureColour.js
+jalview/schemes/FeatureSettingsAdapter.js
+jalview/schemes/FlowerColourScheme.js
+jalview/schemes/FollowerColourScheme.js
+jalview/schemes/HelixColourScheme.js
+jalview/schemes/HydrophobicColourScheme.js
+jalview/schemes/IdColourScheme.js
+jalview/schemes/JalviewColourScheme.js
+jalview/schemes/NucleotideAmbiguityColourScheme.js
+jalview/schemes/NucleotideColourScheme.js
+jalview/schemes/OceanColourScheme.js
+jalview/schemes/PIDColourScheme.js
+jalview/schemes/PurinePyrimidineColourScheme.js
+jalview/schemes/RNAHelicesColour.js
+jalview/schemes/RNAHelicesColourChooser.js
+jalview/schemes/RNAInteractionColourScheme.js
+jalview/schemes/ResidueColourScheme.js
+jalview/schemes/ResidueProperties.js
+jalview/schemes/ScoreColourScheme.js
+jalview/schemes/StrandColourScheme.js
+jalview/schemes/SunsetColourScheme.js
+jalview/schemes/TCoffeeColourScheme.js
+jalview/schemes/TaylorColourScheme.js
+jalview/schemes/TurnColourScheme.js
+jalview/schemes/UserColourScheme.js
+jalview/schemes/ZappoColourScheme.js
+jalview/structure/AlignmentViewPanelListener.js
+jalview/structure/AtomSpec.js
+jalview/structure/AtomSpecModel.js
+jalview/structure/CommandListener.js
+jalview/structure/SecondaryStructureListener.js
+jalview/structure/SelectionListener.js
+jalview/structure/SelectionSource.js
+jalview/structure/SequenceListener.js
+jalview/structure/StructureCommand.js
+jalview/structure/StructureCommandI.js
+jalview/structure/StructureCommandsBase.js
+jalview/structure/StructureCommandsI.js
+jalview/structure/StructureImportSettings.js
+jalview/structure/StructureListener.js
+jalview/structure/StructureMapping.js
+jalview/structure/StructureMappingcommandSet.js
+jalview/structure/StructureSelectionManager.js
+jalview/structure/VamsasListener.js
+jalview/structure/VamsasSource.js
+jalview/structures/models/AAStructureBindingModel.js
+jalview/structures/models/SequenceStructureBindingModel.js
+jalview/urls/CustomUrlProvider.js
+jalview/urls/IdOrgSettings.js
+jalview/urls/IdentifiersUrlProvider.js
+jalview/urls/UrlLinkDisplay.js
+jalview/urls/UrlLinkTableModel.js
+jalview/urls/UrlProvider.js
+jalview/urls/UrlProviderImpl.js
+jalview/urls/api/UrlProviderFactoryI.js
+jalview/urls/api/UrlProviderI.js
+jalview/urls/applet/AppletUrlProviderFactory.js
+jalview/urls/desktop/DesktopUrlProviderFactory.js
+jalview/util/AWTConsole.js
+jalview/util/ArrayUtils.js
+jalview/util/BrowserLauncher.js
+jalview/util/CaseInsensitiveString.js
+jalview/util/ChannelProperties.js
+jalview/util/ColorUtils.js
+jalview/util/Comparison.js
+jalview/util/DBRefUtils.js
+jalview/util/DnaUtils.js
+jalview/util/FileUtils.js
+jalview/util/Format.js
+jalview/util/GroupUrlLink.js
+jalview/util/HttpUtils.js
+jalview/util/IdUtils.js
+jalview/util/ImageMaker.js
+jalview/util/IntRangeComparator.js
+jalview/util/JSONUtils.js
+jalview/util/LaunchUtils.js
+jalview/util/LinkedIdentityHashSet.js
+jalview/util/Log4j.js
+jalview/util/MapList.js
+jalview/util/MapUtils.js
+jalview/util/MappingUtils.js
+jalview/util/MathUtils.js
+jalview/util/MessageManager.js
+jalview/util/ParseHtmlBodyAndLinks.js
+jalview/util/Platform.js
+jalview/util/QuickSort.js
+jalview/util/ReverseListIterator.js
+jalview/util/SetUtils.js
+jalview/util/ShiftList.js
+jalview/util/ShortcutKeyMaskExWrapper.js
+jalview/util/ShortcutKeyMaskExWrapper11.js
+jalview/util/ShortcutKeyMaskExWrapper8.js
+jalview/util/ShortcutKeyMaskExWrapperI.js
+jalview/util/SparseCount.js
+jalview/util/StringUtils.js
+jalview/util/TableSorter.js
+jalview/util/UrlConstants.js
+jalview/util/UrlLink.js
+jalview/util/dialogrunner/DialogRunnerI.js
+jalview/util/imagemaker/BitmapImageSizing.js
+jalview/util/jarInputStreamProvider.js
+jalview/util/matcher/Condition.js
+jalview/util/matcher/Matcher.js
+jalview/util/matcher/MatcherI.js
+jalview/viewmodel/AlignmentViewport.js
+jalview/viewmodel/OverviewDimensions.js
+jalview/viewmodel/OverviewDimensionsHideHidden.js
+jalview/viewmodel/OverviewDimensionsShowHidden.js
+jalview/viewmodel/PCAModel.js
+jalview/viewmodel/ViewportListenerI.js
+jalview/viewmodel/ViewportProperties.js
+jalview/viewmodel/ViewportRanges.js
+jalview/viewmodel/annotationfilter/AnnotationFilterParameter.js
+jalview/viewmodel/seqfeatures/FeatureRendererModel.js
+jalview/viewmodel/seqfeatures/FeatureRendererSettings.js
+jalview/viewmodel/seqfeatures/FeatureSettingsModel.js
+jalview/viewmodel/seqfeatures/FeaturesDisplayed.js
+jalview/viewmodel/styles/ViewStyle.js
+jalview/workers/AlignCalcManager.js
+jalview/workers/AlignCalcWorker.js
+jalview/workers/AlignmentAnnotationFactory.js
+jalview/workers/AnnotationProviderI.js
+jalview/workers/AnnotationWorker.js
+jalview/workers/ColumnCounterSetWorker.js
+jalview/workers/ComplementConsensusThread.js
+jalview/workers/ConsensusThread.js
+jalview/workers/ConservationThread.js
+jalview/workers/FeatureSetCounterI.js
+jalview/workers/StrucConsensusThread.js
+jalview/ws/AWSThread.js
+jalview/ws/AWsJob.js
+jalview/ws/DBRefFetcher.js
+jalview/ws/HttpClientUtils.js
+jalview/ws/JobStateSummary.js
+jalview/ws/SequenceFetcher.js
+jalview/ws/SequenceFetcherFactory.js
+jalview/ws/WSClient.js
+jalview/ws/WSClientI.js
+jalview/ws/WSMenuEntryProviderI.js
+jalview/ws/datamodel/MappableContactMatrixI.js
+jalview/ws/datamodel/alphafold/MappableContactMatrix.js
+jalview/ws/datamodel/alphafold/PAEContactMatrix.js
+jalview/ws/dbsources/EBIAlfaFold.js
+jalview/ws/dbsources/EbiFileRetrievedProxy.js
+jalview/ws/dbsources/EmblCdsSource.js
+jalview/ws/dbsources/EmblFlatfileSource.js
+jalview/ws/dbsources/EmblSource.js
+jalview/ws/dbsources/EmblXmlSource.js
+jalview/ws/dbsources/GeneDbSource.js
+jalview/ws/dbsources/Pdb.js
+jalview/ws/dbsources/Pfam.js
+jalview/ws/dbsources/PfamFull.js
+jalview/ws/dbsources/PfamSeed.js
+jalview/ws/dbsources/Rfam.js
+jalview/ws/dbsources/RfamFull.js
+jalview/ws/dbsources/RfamSeed.js
+jalview/ws/dbsources/TDBeacons.js
+jalview/ws/dbsources/Uniprot.js
+jalview/ws/dbsources/UniprotName.js
+jalview/ws/dbsources/Xfam.js
+jalview/ws/ebi/EBIFetchClient.js
+jalview/ws/io/mime/HttpContentHandler.js
+jalview/ws/io/mime/JalviewMimeContentHandler.js
+jalview/ws/io/mime/MimeTypes.js
+jalview/ws/jws1/Annotate3D.js
+jalview/ws/jws1/Discoverer.js
+jalview/ws/jws1/JPredClient.js
+jalview/ws/jws1/JPredThread.js
+jalview/ws/jws1/JWS1Thread.js
+jalview/ws/jws1/MsaWSClient.js
+jalview/ws/jws1/MsaWSThread.js
+jalview/ws/jws1/SeqSearchWSClient.js
+jalview/ws/jws1/SeqSearchWSThread.js
+jalview/ws/jws1/WS1Client.js
+jalview/ws/jws1/WSJob.js
+jalview/ws/jws2/AAConClient.js
+jalview/ws/jws2/AADisorderClient.js
+jalview/ws/jws2/AWS2Thread.js
+jalview/ws/jws2/AbstractJabaCalcWorker.js
+jalview/ws/jws2/JWs2Job.js
+jalview/ws/jws2/JabaParamStore.js
+jalview/ws/jws2/JabaPreset.js
+jalview/ws/jws2/JabaWsServerQuery.js
+jalview/ws/jws2/JabawsCalcWorker.js
+jalview/ws/jws2/JabawsMsaInterfaceAlignCalcWorker.js
+jalview/ws/jws2/Jws2Client.js
+jalview/ws/jws2/Jws2Discoverer.js
+jalview/ws/jws2/MsaWSClient.js
+jalview/ws/jws2/MsaWSThread.js
+jalview/ws/jws2/ParameterUtils.js
+jalview/ws/jws2/RNAalifoldClient.js
+jalview/ws/jws2/SequenceAnnotationWSClient.js
+jalview/ws/jws2/dm/AAConSettings.js
+jalview/ws/jws2/dm/JabaOption.js
+jalview/ws/jws2/dm/JabaParameter.js
+jalview/ws/jws2/dm/JabaValueConstrain.js
+jalview/ws/jws2/dm/JabaWsParamSet.js
+jalview/ws/jws2/jabaws2/Jws2Instance.js
+jalview/ws/jws2/jabaws2/Jws2InstanceFactory.js
+jalview/ws/params/ArgumentI.js
+jalview/ws/params/AutoCalcSetting.js
+jalview/ws/params/InvalidArgumentException.js
+jalview/ws/params/OptionI.js
+jalview/ws/params/ParamDatastoreI.js
+jalview/ws/params/ParamManager.js
+jalview/ws/params/ParameterI.js
+jalview/ws/params/ValueConstrainI.js
+jalview/ws/params/WsParamSetI.js
+jalview/ws/params/simple/BooleanOption.js
+jalview/ws/params/simple/IntegerParameter.js
+jalview/ws/params/simple/Option.js
+jalview/ws/params/simple/Parameter.js
+jalview/ws/params/simple/StringChoiceParameter.js
+jalview/ws/rest/AlignmentProcessor.js
+jalview/ws/rest/HttpResultSet.js
+jalview/ws/rest/InputType.js
+jalview/ws/rest/NoValidInputDataException.js
+jalview/ws/rest/RestClient.js
+jalview/ws/rest/RestJob.js
+jalview/ws/rest/RestJobThread.js
+jalview/ws/rest/RestServiceDescription.js
+jalview/ws/rest/params/Alignment.js
+jalview/ws/rest/params/AnnotationFile.js
+jalview/ws/rest/params/JobConstant.js
+jalview/ws/rest/params/SeqGroupIndexVector.js
+jalview/ws/rest/params/SeqIdVector.js
+jalview/ws/rest/params/SeqVector.js
+jalview/ws/rest/params/Tree.js
+jalview/ws/seqfetcher/ASequenceFetcher.js
+jalview/ws/seqfetcher/DbSourceProxy.js
+jalview/ws/seqfetcher/DbSourceProxyImpl.js
+jalview/ws/sifts/MappingOutputPojo.js
+jalview/ws/sifts/SiftsClient.js
+jalview/ws/sifts/SiftsException.js
+jalview/ws/sifts/SiftsSettings.js
+jalview/ws/uimodel/AlignAnalysisUIText.js
+jalview/ws/utils/UrlDownloadClient.js
+jalview/xml/binding/embl/EntrySetType.js
+jalview/xml/binding/embl/EntryType.js
+jalview/xml/binding/embl/ObjectFactory.js
+jalview/xml/binding/embl/ROOT.js
+jalview/xml/binding/embl/XrefType.js
+jalview/xml/binding/jalview/AlcodonFrame.js
+jalview/xml/binding/jalview/Annotation.js
+jalview/xml/binding/jalview/AnnotationColourScheme.js
+jalview/xml/binding/jalview/AnnotationElement.js
+jalview/xml/binding/jalview/DoubleMatrix.js
+jalview/xml/binding/jalview/DoubleVector.js
+jalview/xml/binding/jalview/Feature.js
+jalview/xml/binding/jalview/FeatureMatcher.js
+jalview/xml/binding/jalview/FeatureMatcherSet.js
+jalview/xml/binding/jalview/FilterBy.js
+jalview/xml/binding/jalview/JalviewModel.js
+jalview/xml/binding/jalview/JalviewUserColours.js
+jalview/xml/binding/jalview/MapListType.js
+jalview/xml/binding/jalview/MapOnAMatrixType.js
+jalview/xml/binding/jalview/Mapping.js
+jalview/xml/binding/jalview/MatrixType.js
+jalview/xml/binding/jalview/NoValueColour.js
+jalview/xml/binding/jalview/ObjectFactory.js
+jalview/xml/binding/jalview/PcaDataType.js
+jalview/xml/binding/jalview/Pdbentry.js
+jalview/xml/binding/jalview/Property.js
+jalview/xml/binding/jalview/Sequence.js
+jalview/xml/binding/jalview/SequenceSet.js
+jalview/xml/binding/jalview/SequenceType.js
+jalview/xml/binding/jalview/ThresholdType.js
+jalview/xml/binding/jalview/VAMSAS.js
+jalview/xml/binding/jalview/WebServiceParameterSet.js
+jalview/xml/binding/jalview/package-info.js
+jalview/xml/binding/sifts/Alignment.js
+jalview/xml/binding/sifts/EntityType.js
+jalview/xml/binding/sifts/Entry.js
+jalview/xml/binding/sifts/ObjectFactory.js
+jalview/xml/binding/sifts/package-info.js
+jalview/xml/binding/uniprot/CitationType.js
+jalview/xml/binding/uniprot/CofactorType.js
+jalview/xml/binding/uniprot/CommentType.js
+jalview/xml/binding/uniprot/ConsortiumType.js
+jalview/xml/binding/uniprot/DbReferenceType.js
+jalview/xml/binding/uniprot/Entry.js
+jalview/xml/binding/uniprot/EventType.js
+jalview/xml/binding/uniprot/EvidenceType.js
+jalview/xml/binding/uniprot/EvidencedStringType.js
+jalview/xml/binding/uniprot/FeatureType.js
+jalview/xml/binding/uniprot/GeneLocationType.js
+jalview/xml/binding/uniprot/GeneNameType.js
+jalview/xml/binding/uniprot/GeneType.js
+jalview/xml/binding/uniprot/ImportedFromType.js
+jalview/xml/binding/uniprot/InteractantType.js
+jalview/xml/binding/uniprot/IsoformType.js
+jalview/xml/binding/uniprot/KeywordType.js
+jalview/xml/binding/uniprot/LocationType.js
+jalview/xml/binding/uniprot/MoleculeType.js
+jalview/xml/binding/uniprot/NameListType.js
+jalview/xml/binding/uniprot/ObjectFactory.js
+jalview/xml/binding/uniprot/OrganismNameType.js
+jalview/xml/binding/uniprot/OrganismType.js
+jalview/xml/binding/uniprot/PersonType.js
+jalview/xml/binding/uniprot/PhysiologicalReactionType.js
+jalview/xml/binding/uniprot/PositionType.js
+jalview/xml/binding/uniprot/PropertyType.js
+jalview/xml/binding/uniprot/ProteinExistenceType.js
+jalview/xml/binding/uniprot/ProteinType.js
+jalview/xml/binding/uniprot/ReactionType.js
+jalview/xml/binding/uniprot/ReferenceType.js
+jalview/xml/binding/uniprot/SequenceType.js
+jalview/xml/binding/uniprot/SourceDataType.js
+jalview/xml/binding/uniprot/SourceType.js
+jalview/xml/binding/uniprot/StatusType.js
+jalview/xml/binding/uniprot/SubcellularLocationType.js
+jalview/xml/binding/uniprot/Uniprot.js
+jalview/xml/binding/uniprot/package-info.js
java/applet/AppletContext.js
java/applet/AppletStub.js
java/applet/JSApplet.js
-java/awt/ActiveEvent.js
-java/awt/Adjustable.js
java/awt/AWTEvent.js
java/awt/AWTEventMulticaster.js
java/awt/AWTKeyStroke.js
+java/awt/ActiveEvent.js
+java/awt/Adjustable.js
+java/awt/AlphaComposite.js
java/awt/BasicStroke.js
java/awt/BorderLayout.js
-java/awt/Button.js
+java/awt/CardLayout.js
java/awt/Color.js
-java/awt/color/ColorSpace.js
java/awt/Component.js
java/awt/ComponentOrientation.js
-java/awt/ContainerOrderFocusTraversalPolicy.js
+java/awt/Composite.js
java/awt/Container.js
+java/awt/ContainerOrderFocusTraversalPolicy.js
java/awt/Cursor.js
java/awt/DefaultFocusTraversalPolicy.js
java/awt/DefaultKeyboardFocusManager.js
-java/awt/Dialog.js
java/awt/Dimension.js
+java/awt/EventDispatchThread.js
+java/awt/EventFilter.js
+java/awt/EventQueue.js
+java/awt/EventQueueItem.js
+java/awt/FlowLayout.js
+java/awt/FocusTraversalPolicy.js
+java/awt/Font.js
+java/awt/FontMetrics.js
+java/awt/Graphics.js
+java/awt/Graphics2D.js
+java/awt/GraphicsCallback.js
+java/awt/GraphicsConfiguration.js
+java/awt/GraphicsDevice.js
+java/awt/GraphicsEnvironment.js
+java/awt/GridBagConstraints.js
+java/awt/GridBagLayout.js
+java/awt/GridBagLayoutInfo.js
+java/awt/GridLayout.js
+java/awt/Image.js
+java/awt/Insets.js
+java/awt/ItemSelectable.js
+java/awt/JSComponent.js
+java/awt/JSDialog.js
+java/awt/JSFrame.js
+java/awt/JSPanel.js
+java/awt/KeyEventDispatcher.js
+java/awt/KeyEventPostProcessor.js
+java/awt/KeyboardFocusManager.js
+java/awt/LayoutManager.js
+java/awt/LayoutManager2.js
+java/awt/LightweightDispatcher.js
+java/awt/Paint.js
+java/awt/Point.js
+java/awt/Queue.js
+java/awt/Rectangle.js
+java/awt/RenderingHints.js
+java/awt/SentEvent.js
+java/awt/Shape.js
+java/awt/Stroke.js
+java/awt/Taskbar.js
+java/awt/TextComponent.js
+java/awt/Toolkit.js
+java/awt/Transparency.js
+java/awt/VKCollection.js
+java/awt/Window.js
+java/awt/color/ColorSpace.js
+java/awt/datatransfer/ClipboardOwner.js
+java/awt/datatransfer/FlavorMap.js
+java/awt/datatransfer/FlavorTable.js
+java/awt/datatransfer/SystemFlavorMap.js
+java/awt/dnd/DropTarget.js
+java/awt/dnd/DropTargetContext.js
+java/awt/dnd/DropTargetListener.js
java/awt/dnd/peer/DropTargetPeer.js
+java/awt/event/AWTEventListener.js
+java/awt/event/ActionEvent.js
java/awt/event/ActionListener.js
java/awt/event/AdjustmentEvent.js
java/awt/event/AdjustmentListener.js
-java/awt/event/AWTEventListener.js
java/awt/event/ComponentAdapter.js
java/awt/event/ComponentEvent.js
java/awt/event/ComponentListener.js
+java/awt/event/ContainerEvent.js
java/awt/event/ContainerListener.js
+java/awt/event/FocusAdapter.js
java/awt/event/FocusEvent.js
java/awt/event/FocusListener.js
java/awt/event/HierarchyBoundsListener.js
java/awt/event/InvocationEvent.js
java/awt/event/ItemEvent.js
java/awt/event/ItemListener.js
+java/awt/event/KeyAdapter.js
+java/awt/event/KeyEvent.js
java/awt/event/KeyListener.js
+java/awt/event/MouseAdapter.js
java/awt/event/MouseEvent.js
java/awt/event/MouseListener.js
+java/awt/event/MouseMotionAdapter.js
java/awt/event/MouseMotionListener.js
+java/awt/event/MouseWheelEvent.js
java/awt/event/MouseWheelListener.js
java/awt/event/TextListener.js
java/awt/event/WindowAdapter.js
java/awt/event/WindowFocusListener.js
java/awt/event/WindowListener.js
java/awt/event/WindowStateListener.js
-java/awt/EventDispatchThread.js
-java/awt/EventFilter.js
-java/awt/EventQueue.js
-java/awt/EventQueueItem.js
-java/awt/FlowLayout.js
-java/awt/FocusTraversalPolicy.js
-java/awt/Font.js
java/awt/font/FontRenderContext.js
-java/awt/FontMetrics.js
-java/awt/Frame.js
+java/awt/font/TextAttribute.js
java/awt/geom/AffineTransform.js
java/awt/geom/Dimension2D.js
java/awt/geom/Path2D.js
java/awt/geom/PathIterator.js
java/awt/geom/Point2D.js
+java/awt/geom/RectIterator.js
java/awt/geom/Rectangle2D.js
java/awt/geom/RectangularShape.js
-java/awt/geom/RectIterator.js
-java/awt/GraphicsCallback.js
-java/awt/GraphicsConfiguration.js
-java/awt/GraphicsDevice.js
-java/awt/GraphicsEnvironment.js
+java/awt/image/BufferedImage.js
+java/awt/image/ColorModel.js
+java/awt/image/DataBuffer.js
+java/awt/image/DataBufferInt.js
+java/awt/image/DirectColorModel.js
+java/awt/image/ImageConsumer.js
java/awt/image/ImageObserver.js
-java/awt/Insets.js
-java/awt/ItemSelectable.js
-java/awt/JSComponent.js
-java/awt/JSDialog.js
-java/awt/JSFrame.js
-java/awt/JSPanel.js
-java/awt/KeyboardFocusManager.js
-java/awt/KeyEventDispatcher.js
-java/awt/KeyEventPostProcessor.js
-java/awt/Label.js
-java/awt/LayoutManager.js
-java/awt/LayoutManager2.js
-java/awt/LightweightDispatcher.js
-java/awt/Paint.js
-java/awt/Panel.js
+java/awt/image/PackedColorModel.js
+java/awt/image/Raster.js
+java/awt/image/RenderedImage.js
+java/awt/image/SampleModel.js
+java/awt/image/SinglePixelPackedSampleModel.js
+java/awt/image/WritableRaster.js
java/awt/peer/ComponentPeer.js
java/awt/peer/ContainerPeer.js
java/awt/peer/FramePeer.js
java/awt/peer/KeyboardFocusManagerPeer.js
java/awt/peer/LightweightPeer.js
java/awt/peer/WindowPeer.js
-java/awt/Point.js
-java/awt/Queue.js
-java/awt/Rectangle.js
-java/awt/RenderingHints.js
-java/awt/Scrollbar.js
-java/awt/ScrollPane.js
-java/awt/Shape.js
-java/awt/Stroke.js
-java/awt/TextArea.js
-java/awt/TextComponent.js
-java/awt/TextField.js
-java/awt/Toolkit.js
-java/awt/Transparency.js
-java/awt/Window.js
+java/awt/print/Printable.js
java/beans/ChangeListenerMap.js
java/beans/PropertyChangeEvent.js
java/beans/PropertyChangeListener.js
java/beans/PropertyChangeSupport.js
+java/io/BufferedInputStream.js
+java/io/BufferedWriter.js
+java/io/DataInput.js
+java/io/DataInputStream.js
+java/io/File.js
+java/io/FileOutputStream.js
+java/io/FileReader.js
+java/io/FileSystem.js
+java/io/FilenameFilter.js
+java/io/FilterInputStream.js
+java/io/FilterOutputStream.js
+java/io/InputStream.js
+java/io/InputStreamReader.js
+java/io/ObjectStreamField.js
+java/io/OutputStreamWriter.js
+java/io/PrintStream.js
+java/io/StringWriter.js
+java/io/Writer.js
java/lang/AbstractStringBuilder.js
+java/lang/ApplicationShutdownHooks.js
java/lang/Class.js
java/lang/Enum.js
java/lang/Iterable.js
-java/lang/reflect/Constructor.js
-java/lang/reflect/Method.js
+java/lang/Runtime.js
+java/lang/Shutdown.js
java/lang/StringBuffer.js
java/lang/StringBuilder.js
java/lang/Thread.js
java/lang/ThreadGroup.js
-java/math/RoundingMode.js
+java/lang/ThreadLocal.js
+java/lang/ref/ReferenceQueue.js
+java/lang/reflect/AccessibleObject.js
+java/lang/reflect/AnnotatedElement.js
+java/lang/reflect/Constructor.js
+java/lang/reflect/Method.js
+java/math/BigDecimal.js
+java/math/BigInteger.js
+java/math/MathContext.js
+java/net/ContentHandler.js
+java/net/HttpURLConnection.js
+java/net/URI.js
java/net/URL.js
+java/net/URLConnection.js
+java/net/URLEncoder.js
+java/net/URLStreamHandler.js
java/net/URLStreamHandlerFactory.js
+java/net/UnknownHostException.js
+java/nio/file/FileSystem.js
+java/nio/file/FileSystems.js
+java/nio/file/Path.js
+java/nio/file/Watchable.js
+java/nio/file/spi/FileSystemProvider.js
+java/security/AccessController.js
+java/security/PrivilegedAction.js
+java/security/PrivilegedExceptionAction.js
java/text/CharacterIterator.js
-java/text/DecimalFormat.js
-java/text/DecimalFormatSymbols.js
-java/text/DigitList.js
-java/text/FieldPosition.js
-java/text/Format.js
-java/text/NumberFormat.js
+java/text/DateFormat.js
+java/text/DateFormatSymbols.js
+java/text/MessageFormat.js
+java/text/SimpleDateFormat.js
+java/text/spi/BreakIteratorProvider.js
+java/text/spi/CollatorProvider.js
+java/text/spi/DateFormatProvider.js
+java/text/spi/DateFormatSymbolsProvider.js
+java/text/spi/DecimalFormatSymbolsProvider.js
+java/text/spi/NumberFormatProvider.js
java/util/AbstractCollection.js
java/util/AbstractList.js
java/util/AbstractMap.js
+java/util/AbstractQueue.js
java/util/AbstractSequentialList.js
java/util/AbstractSet.js
+java/util/ArrayDeque.js
java/util/ArrayList.js
java/util/Arrays.js
+java/util/BitSet.js
+java/util/Calendar.js
java/util/Collection.js
java/util/Collections.js
java/util/Comparator.js
java/util/Deque.js
java/util/Dictionary.js
+java/util/EnumMap.js
+java/util/EnumSet.js
java/util/Enumeration.js
java/util/EventListener.js
java/util/EventObject.js
+java/util/Formatter.js
+java/util/GregorianCalendar.js
java/util/HashMap.js
java/util/HashSet.js
java/util/Hashtable.js
java/util/IdentityHashMap.js
java/util/Iterator.js
+java/util/JumboEnumSet.js
java/util/LinkedHashMap.js
+java/util/LinkedHashSet.js
java/util/LinkedList.js
java/util/List.js
-java/util/ListResourceBundle.js
+java/util/ListIterator.js
java/util/Locale.js
java/util/Map.js
+java/util/NavigableMap.js
+java/util/NavigableSet.js
java/util/Objects.js
+java/util/Properties.js
+java/util/PropertyResourceBundle.js
java/util/Queue.js
java/util/Random.js
java/util/RandomAccess.js
-java/util/ResourceBundle.js
+java/util/RegularEnumSet.js
+java/util/ServiceLoader.js
java/util/Set.js
+java/util/SortedMap.js
+java/util/SortedSet.js
+java/util/Spliterator.js
+java/util/StringTokenizer.js
java/util/TimSort.js
+java/util/TimeZone.js
+java/util/TreeMap.js
+java/util/TreeSet.js
java/util/Vector.js
-javajs/api/JSFunction.js
+java/util/WeakHashMap.js
+java/util/concurrent/AbstractExecutorService.js
+java/util/concurrent/BlockingQueue.js
+java/util/concurrent/Callable.js
+java/util/concurrent/Executor.js
+java/util/concurrent/ExecutorService.js
+java/util/concurrent/Executors.js
+java/util/concurrent/Future.js
+java/util/concurrent/FutureTask.js
+java/util/concurrent/LinkedBlockingQueue.js
+java/util/concurrent/RejectedExecutionHandler.js
+java/util/concurrent/RunnableFuture.js
+java/util/concurrent/Semaphore.js
+java/util/concurrent/ThreadFactory.js
+java/util/concurrent/ThreadPoolExecutor.js
+java/util/concurrent/TimeUnit.js
+java/util/concurrent/locks/AbstractOwnableSynchronizer.js
+java/util/concurrent/locks/AbstractQueuedSynchronizer.js
+java/util/concurrent/locks/Condition.js
+java/util/concurrent/locks/Lock.js
+java/util/concurrent/locks/ReadWriteLock.js
+java/util/concurrent/locks/ReentrantLock.js
+java/util/concurrent/locks/ReentrantReadWriteLock.js
+java/util/function/BiConsumer.js
+java/util/function/BiFunction.js
+java/util/function/BinaryOperator.js
+java/util/function/Consumer.js
+java/util/function/Function.js
+java/util/function/Supplier.js
+java/util/jar/JarEntry.js
+java/util/jar/JarInputStream.js
+java/util/regex/Pattern.js
+java/util/spi/CalendarDataProvider.js
+java/util/spi/CurrencyNameProvider.js
+java/util/spi/LocaleNameProvider.js
+java/util/spi/TimeZoneNameProvider.js
+java/util/stream/AbstractPipeline.js
+java/util/stream/BaseStream.js
+java/util/stream/Collector.js
+java/util/stream/Collectors.js
+java/util/stream/PipelineHelper.js
+java/util/stream/ReduceOps.js
+java/util/stream/ReferencePipeline.js
+java/util/stream/Sink.js
+java/util/stream/Stream.js
+java/util/stream/StreamOpFlag.js
+java/util/stream/StreamShape.js
+java/util/stream/StreamSupport.js
+java/util/stream/TerminalOp.js
+java/util/stream/TerminalSink.js
+java/util/zip/CRC32.js
+java/util/zip/Inflater.js
+java/util/zip/InflaterInputStream.js
+java/util/zip/ZipConstants.js
+java/util/zip/ZipEntry.js
+java/util/zip/ZipInputStream.js
+javajs/api/BytePoster.js
+javajs/api/GenericLineReader.js
+javajs/api/GenericOutputChannel.js
+javajs/api/JSONEncodable.js
+javajs/async/SwingJSUtils.js
+javajs/util/A4d.js
javajs/util/AjaxURLConnection.js
+javajs/util/AjaxURLStreamHandler.js
javajs/util/AjaxURLStreamHandlerFactory.js
-javajs/util/AU.js
+javajs/util/BS.js
+javajs/util/Base64.js
+javajs/util/CU.js
+javajs/util/DF.js
+javajs/util/Encoding.js
javajs/util/JSThread.js
+javajs/util/LimitedLineReader.js
javajs/util/Lst.js
+javajs/util/M3.js
+javajs/util/M34.js
+javajs/util/M34d.js
+javajs/util/M3d.js
+javajs/util/M4d.js
+javajs/util/OC.js
+javajs/util/P3d.js
+javajs/util/P3i.js
+javajs/util/P4d.js
javajs/util/PT.js
+javajs/util/Rdr.js
javajs/util/SB.js
-javax/net/ssl/HttpsUrlConnection.js
+javajs/util/T3d.js
+javajs/util/T3i.js
+javajs/util/T4d.js
+javajs/util/V3d.js
+javax/net/ssl/HttpsURLConnection.js
javax/swing/AbstractAction.js
javax/swing/AbstractButton.js
javax/swing/AbstractListModel.js
javax/swing/ActionMap.js
javax/swing/AncestorNotifier.js
javax/swing/ArrayTable.js
-javax/swing/border/AbstractBorder.js
-javax/swing/border/BevelBorder.js
-javax/swing/border/Border.js
-javax/swing/border/CompoundBorder.js
-javax/swing/border/EmptyBorder.js
-javax/swing/border/EtchedBorder.js
-javax/swing/border/LineBorder.js
+javax/swing/Autoscroller.js
javax/swing/BorderFactory.js
javax/swing/BoundedRangeModel.js
javax/swing/BoxLayout.js
javax/swing/ButtonGroup.js
javax/swing/ButtonModel.js
+javax/swing/CellRendererPane.js
javax/swing/ClientPropertyKey.js
+javax/swing/ComboBoxEditor.js
javax/swing/ComboBoxModel.js
+javax/swing/ComponentInputMap.js
javax/swing/DefaultBoundedRangeModel.js
javax/swing/DefaultButtonModel.js
javax/swing/DefaultComboBoxModel.js
+javax/swing/DefaultDesktopManager.js
+javax/swing/DefaultListCellRenderer.js
+javax/swing/DefaultListSelectionModel.js
+javax/swing/DefaultRowSorter.js
javax/swing/DefaultSingleSelectionModel.js
+javax/swing/DesktopManager.js
javax/swing/DropMode.js
-javax/swing/event/AncestorEvent.js
-javax/swing/event/AncestorListener.js
-javax/swing/event/CaretEvent.js
-javax/swing/event/CaretListener.js
-javax/swing/event/ChangeEvent.js
-javax/swing/event/ChangeListener.js
-javax/swing/event/DocumentEvent.js
-javax/swing/event/DocumentListener.js
-javax/swing/event/EventListenerList.js
-javax/swing/event/ListDataEvent.js
-javax/swing/event/ListDataListener.js
-javax/swing/event/UndoableEditEvent.js
-javax/swing/event/UndoableEditListener.js
javax/swing/FocusManager.js
-javax/swing/InternalFrameFocusTraversalPolicy.js
-javax/swing/LayoutComparator.js
-javax/swing/LayoutFocusTraversalPolicy.js
-javax/swing/SortingFocusTraversalPolicy.js
-javax/swing/SwingContainerOrderFocusTraversalPolicy.js
-javax/swing/SwingDefaultFocusTraversalPolicy.js
+javax/swing/Icon.js
+javax/swing/ImageIcon.js
javax/swing/InputMap.js
+javax/swing/InternalFrameFocusTraversalPolicy.js
javax/swing/JApplet.js
javax/swing/JButton.js
javax/swing/JCheckBox.js
javax/swing/JCheckBoxMenuItem.js
javax/swing/JComboBox.js
javax/swing/JComponent.js
+javax/swing/JDesktopPane.js
+javax/swing/JDialog.js
+javax/swing/JFileChooser.js
javax/swing/JFrame.js
+javax/swing/JInternalFrame.js
javax/swing/JLabel.js
javax/swing/JLayeredPane.js
+javax/swing/JList.js
javax/swing/JMenu.js
javax/swing/JMenuBar.js
javax/swing/JMenuItem.js
+javax/swing/JOptionPane.js
javax/swing/JPanel.js
javax/swing/JPopupMenu.js
+javax/swing/JProgressBar.js
javax/swing/JRadioButtonMenuItem.js
javax/swing/JRootPane.js
javax/swing/JScrollBar.js
javax/swing/JScrollPane.js
javax/swing/JSeparator.js
+javax/swing/JTabbedPane.js
+javax/swing/JTable.js
javax/swing/JTextArea.js
javax/swing/JTextField.js
javax/swing/JToggleButton.js
+javax/swing/JToolTip.js
javax/swing/JViewport.js
-javax/swing/KeyboardManager.js
+javax/swing/JWindow.js
javax/swing/KeyStroke.js
+javax/swing/KeyboardManager.js
+javax/swing/LayoutComparator.js
+javax/swing/LayoutFocusTraversalPolicy.js
+javax/swing/ListCellRenderer.js
javax/swing/ListModel.js
+javax/swing/ListSelectionModel.js
javax/swing/LookAndFeel.js
javax/swing/MenuElement.js
+javax/swing/MenuSelectionManager.js
javax/swing/MutableComboBoxModel.js
-javax/swing/plaf/ActionMapUIResource.js
-javax/swing/plaf/basic/BasicBorders.js
-javax/swing/plaf/BorderUIResource.js
-javax/swing/plaf/ColorUIResource.js
-javax/swing/plaf/ComponentUI.js
-javax/swing/plaf/DimensionUIResource.js
-javax/swing/plaf/FontUIResource.js
-javax/swing/plaf/InputMapUIResource.js
-javax/swing/plaf/InsetsUIResource.js
-javax/swing/plaf/UIResource.js
+javax/swing/Popup.js
+javax/swing/PopupFactory.js
javax/swing/RepaintManager.js
javax/swing/RootPaneContainer.js
-javax/swing/Scrollable.js
+javax/swing/RowSorter.js
javax/swing/ScrollPaneConstants.js
javax/swing/ScrollPaneLayout.js
+javax/swing/Scrollable.js
javax/swing/SingleSelectionModel.js
javax/swing/SizeRequirements.js
+javax/swing/SortOrder.js
+javax/swing/SortingFocusTraversalPolicy.js
+javax/swing/Spring.js
+javax/swing/SpringLayout.js
javax/swing/SwingConstants.js
+javax/swing/SwingContainerOrderFocusTraversalPolicy.js
+javax/swing/SwingDefaultFocusTraversalPolicy.js
javax/swing/SwingPaintEventDispatcher.js
javax/swing/SwingUtilities.js
+javax/swing/Timer.js
+javax/swing/ToolTipManager.js
+javax/swing/TransferHandler.js
+javax/swing/UIDefaults.js
+javax/swing/UIManager.js
+javax/swing/ViewportLayout.js
+javax/swing/WindowConstants.js
+javax/swing/border/AbstractBorder.js
+javax/swing/border/BevelBorder.js
+javax/swing/border/Border.js
+javax/swing/border/CompoundBorder.js
+javax/swing/border/EmptyBorder.js
+javax/swing/border/EtchedBorder.js
+javax/swing/border/LineBorder.js
+javax/swing/border/TitledBorder.js
+javax/swing/event/AncestorEvent.js
+javax/swing/event/AncestorListener.js
+javax/swing/event/CaretEvent.js
+javax/swing/event/CaretListener.js
+javax/swing/event/CellEditorListener.js
+javax/swing/event/ChangeEvent.js
+javax/swing/event/ChangeListener.js
+javax/swing/event/DocumentEvent.js
+javax/swing/event/DocumentListener.js
+javax/swing/event/EventListenerList.js
+javax/swing/event/HyperlinkListener.js
+javax/swing/event/InternalFrameAdapter.js
+javax/swing/event/InternalFrameEvent.js
+javax/swing/event/InternalFrameListener.js
+javax/swing/event/ListDataEvent.js
+javax/swing/event/ListDataListener.js
+javax/swing/event/ListSelectionEvent.js
+javax/swing/event/ListSelectionListener.js
+javax/swing/event/MenuEvent.js
+javax/swing/event/MenuKeyListener.js
+javax/swing/event/MenuListener.js
+javax/swing/event/MouseInputListener.js
+javax/swing/event/RowSorterEvent.js
+javax/swing/event/RowSorterListener.js
+javax/swing/event/SwingPropertyChangeSupport.js
+javax/swing/event/TableColumnModelEvent.js
+javax/swing/event/TableColumnModelListener.js
+javax/swing/event/TableModelEvent.js
+javax/swing/event/TableModelListener.js
+javax/swing/event/UndoableEditEvent.js
+javax/swing/event/UndoableEditListener.js
+javax/swing/filechooser/FileFilter.js
+javax/swing/filechooser/FileView.js
+javax/swing/plaf/ActionMapUIResource.js
+javax/swing/plaf/BorderUIResource.js
+javax/swing/plaf/ColorUIResource.js
+javax/swing/plaf/ComponentInputMapUIResource.js
+javax/swing/plaf/ComponentUI.js
+javax/swing/plaf/DimensionUIResource.js
+javax/swing/plaf/FontUIResource.js
+javax/swing/plaf/InputMapUIResource.js
+javax/swing/plaf/InsetsUIResource.js
+javax/swing/plaf/UIResource.js
+javax/swing/plaf/basic/BasicBorders.js
+javax/swing/plaf/basic/BasicGraphicsUtils.js
+javax/swing/table/AbstractTableModel.js
+javax/swing/table/DefaultTableCellRenderer.js
+javax/swing/table/DefaultTableColumnModel.js
+javax/swing/table/DefaultTableModel.js
+javax/swing/table/JTableHeader.js
+javax/swing/table/TableCellRenderer.js
+javax/swing/table/TableColumn.js
+javax/swing/table/TableColumnModel.js
+javax/swing/table/TableModel.js
+javax/swing/table/TableRowSorter.js
javax/swing/text/AbstractDocument.js
javax/swing/text/AttributeSet.js
+javax/swing/text/BoxView.js
javax/swing/text/Caret.js
+javax/swing/text/CompositeView.js
javax/swing/text/DefaultCaret.js
javax/swing/text/DefaultEditorKit.js
javax/swing/text/Document.js
javax/swing/text/TextAction.js
javax/swing/text/Utilities.js
javax/swing/text/View.js
+javax/swing/text/WrappedPlainView.js
javax/swing/tree/TreeNode.js
-javax/swing/UIDefaults.js
-javax/swing/UIManager.js
javax/swing/undo/AbstractUndoableEdit.js
javax/swing/undo/CompoundEdit.js
javax/swing/undo/UndoableEdit.js
-javax/swing/ViewportLayout.js
-javax/swing/WindowConstants.js
-sun/awt/AppContext.js
+javax/xml/bind/ContextFinder.js
+javax/xml/bind/GetPropertyAction.js
+javax/xml/bind/JAXBContext.js
+javax/xml/bind/JAXBContextFactory.js
+javax/xml/bind/JAXBElement.js
+javax/xml/bind/ModuleUtil.js
+javax/xml/bind/ServiceLoaderUtil.js
+javax/xml/bind/Unmarshaller.js
+javax/xml/bind/ValidationEventHandler.js
+javax/xml/bind/annotation/adapters/CollapsedStringAdapter.js
+javax/xml/bind/annotation/adapters/XmlAdapter.js
+javax/xml/bind/helpers/AbstractUnmarshallerImpl.js
+javax/xml/bind/helpers/DefaultValidationEventHandler.js
+javax/xml/datatype/XMLGregorianCalendar.js
+javax/xml/namespace/QName.js
+javax/xml/stream/XMLInputFactory.js
+javax/xml/stream/XMLStreamConstants.js
+javax/xml/stream/XMLStreamReader.js
+mc_view/AppletPDBCanvas.js
+mc_view/AppletPDBViewer.js
+mc_view/Atom.js
+mc_view/Bond.js
+mc_view/MCMatrix.js
+mc_view/PDBCanvas.js
+mc_view/PDBChain.js
+mc_view/PDBfile.js
+mc_view/Residue.js
+mc_view/Zsort.js
+net/miginfocom/layout/AC.js
+net/miginfocom/layout/AnimSpec.js
+net/miginfocom/layout/BoundSize.js
+net/miginfocom/layout/CC.js
+net/miginfocom/layout/ComponentWrapper.js
+net/miginfocom/layout/ConstraintParser.js
+net/miginfocom/layout/ContainerWrapper.js
+net/miginfocom/layout/DimConstraint.js
+net/miginfocom/layout/Grid.js
+net/miginfocom/layout/LC.js
+net/miginfocom/layout/LayoutUtil.js
+net/miginfocom/layout/LinkHandler.js
+net/miginfocom/layout/PlatformDefaults.js
+net/miginfocom/layout/ResizeConstraint.js
+net/miginfocom/layout/UnitValue.js
+net/miginfocom/swing/MigLayout.js
+net/miginfocom/swing/SwingComponentWrapper.js
+net/miginfocom/swing/SwingContainerWrapper.js
+org/apache/xerces/jaxp/datatype/XMLGregorianCalendarImpl.js
+org/jibble/epsgraphics/EpsDocument.js
+org/jibble/epsgraphics/EpsException.js
+org/jibble/epsgraphics/EpsGraphics2D.js
+org/jmol/adapter/readers/pdb/PdbReader.js
+org/jmol/adapter/smarter/Atom.js
+org/jmol/adapter/smarter/AtomIterator.js
+org/jmol/adapter/smarter/AtomSetCollection.js
+org/jmol/adapter/smarter/AtomSetCollectionReader.js
+org/jmol/adapter/smarter/AtomSetObject.js
+org/jmol/adapter/smarter/Bond.js
+org/jmol/adapter/smarter/Resolver.js
+org/jmol/adapter/smarter/SmarterJmolAdapter.js
+org/jmol/adapter/smarter/Structure.js
+org/jmol/adapter/smarter/StructureIterator.js
+org/jmol/api/AtomIndexIterator.js
+org/jmol/api/EventManager.js
+org/jmol/api/FontManager.js
+org/jmol/api/GenericFileInterface.js
+org/jmol/api/GenericMouseInterface.js
+org/jmol/api/GenericPlatform.js
+org/jmol/api/Interface.js
+org/jmol/api/JmolAdapter.js
+org/jmol/api/JmolAdapterAtomIterator.js
+org/jmol/api/JmolAdapterStructureIterator.js
+org/jmol/api/JmolCallbackListener.js
+org/jmol/api/JmolGraphicsInterface.js
+org/jmol/api/JmolMeasurementClient.js
+org/jmol/api/JmolRendererInterface.js
+org/jmol/api/JmolRepaintManager.js
+org/jmol/api/JmolScriptEvaluator.js
+org/jmol/api/JmolScriptFunction.js
+org/jmol/api/JmolScriptManager.js
+org/jmol/api/JmolSelectionListener.js
+org/jmol/api/JmolStatusListener.js
+org/jmol/api/JmolViewer.js
+org/jmol/api/PlatformViewer.js
+org/jmol/api/SymmetryInterface.js
+org/jmol/api/Translator.js
+org/jmol/atomdata/AtomDataServer.js
+org/jmol/atomdata/RadiusData.js
+org/jmol/awt/AwtFile.js
+org/jmol/awt/AwtFont.js
+org/jmol/awt/Display.js
+org/jmol/awt/Image.js
+org/jmol/awt/Mouse.js
+org/jmol/awt/Platform.js
+org/jmol/bspt/Bspf.js
+org/jmol/bspt/Bspt.js
+org/jmol/bspt/CubeIterator.js
+org/jmol/bspt/Element.js
+org/jmol/bspt/Leaf.js
+org/jmol/bspt/Node.js
+org/jmol/c/CBK.js
+org/jmol/c/FIL.js
+org/jmol/c/PAL.js
+org/jmol/c/STER.js
+org/jmol/c/STR.js
+org/jmol/c/VDW.js
+org/jmol/dssx/Bridge.js
+org/jmol/dssx/DSSP.js
+org/jmol/g3d/CylinderRenderer.js
+org/jmol/g3d/G3DRenderer.js
+org/jmol/g3d/Graphics3D.js
+org/jmol/g3d/HermiteRenderer.js
+org/jmol/g3d/LineRenderer.js
+org/jmol/g3d/Pixelator.js
+org/jmol/g3d/Platform3D.js
+org/jmol/g3d/PrecisionRenderer.js
+org/jmol/g3d/SphereRenderer.js
+org/jmol/g3d/TextRenderer.js
+org/jmol/g3d/TextString.js
+org/jmol/g3d/TriangleRenderer.js
+org/jmol/i18n/GT.js
+org/jmol/i18n/Language.js
+org/jmol/i18n/Resource.js
+org/jmol/io/FileReader.js
+org/jmol/modelset/Atom.js
+org/jmol/modelset/AtomCollection.js
+org/jmol/modelset/AtomIteratorWithinModel.js
+org/jmol/modelset/Bond.js
+org/jmol/modelset/BondCollection.js
+org/jmol/modelset/BondIterator.js
+org/jmol/modelset/BondIteratorSelected.js
+org/jmol/modelset/Chain.js
+org/jmol/modelset/Group.js
+org/jmol/modelset/HBond.js
+org/jmol/modelset/LabelToken.js
+org/jmol/modelset/Measurement.js
+org/jmol/modelset/MeasurementData.js
+org/jmol/modelset/MeasurementPending.js
+org/jmol/modelset/Model.js
+org/jmol/modelset/ModelLoader.js
+org/jmol/modelset/ModelSet.js
+org/jmol/modelset/Orientation.js
+org/jmol/modelset/Structure.js
+org/jmol/modelset/Text.js
+org/jmol/modelset/TickInfo.js
+org/jmol/modelsetbio/AlphaMonomer.js
+org/jmol/modelsetbio/AlphaPolymer.js
+org/jmol/modelsetbio/AminoMonomer.js
+org/jmol/modelsetbio/AminoPolymer.js
+org/jmol/modelsetbio/BioModel.js
+org/jmol/modelsetbio/BioModelSet.js
+org/jmol/modelsetbio/BioPolymer.js
+org/jmol/modelsetbio/BioResolver.js
+org/jmol/modelsetbio/Helix.js
+org/jmol/modelsetbio/Monomer.js
+org/jmol/modelsetbio/ProteinStructure.js
+org/jmol/modelsetbio/Sheet.js
+org/jmol/modelsetbio/Turn.js
+org/jmol/render/BallsRenderer.js
+org/jmol/render/BbcageRenderer.js
+org/jmol/render/CageRenderer.js
+org/jmol/render/FontLineShapeRenderer.js
+org/jmol/render/FrankRenderer.js
+org/jmol/render/HoverRenderer.js
+org/jmol/render/LabelsRenderer.js
+org/jmol/render/MeasuresRenderer.js
+org/jmol/render/RepaintManager.js
+org/jmol/render/ShapeRenderer.js
+org/jmol/render/SticksRenderer.js
+org/jmol/render/TextRenderer.js
+org/jmol/render/UccageRenderer.js
+org/jmol/renderbio/BioShapeRenderer.js
+org/jmol/renderbio/CartoonRenderer.js
+org/jmol/renderbio/RocketsRenderer.js
+org/jmol/renderbio/StrandsRenderer.js
+org/jmol/script/ContextToken.js
+org/jmol/script/SV.js
+org/jmol/script/ScriptCompiler.js
+org/jmol/script/ScriptContext.js
+org/jmol/script/ScriptError.js
+org/jmol/script/ScriptEval.js
+org/jmol/script/ScriptExpr.js
+org/jmol/script/ScriptFlowContext.js
+org/jmol/script/ScriptFunction.js
+org/jmol/script/ScriptManager.js
+org/jmol/script/ScriptMathProcessor.js
+org/jmol/script/ScriptParam.js
+org/jmol/script/ScriptQueueThread.js
+org/jmol/script/ScriptTokenParser.js
+org/jmol/script/T.js
+org/jmol/scriptext/CmdExt.js
+org/jmol/scriptext/MathExt.js
+org/jmol/scriptext/ScriptExt.js
+org/jmol/shape/AtomShape.js
+org/jmol/shape/Balls.js
+org/jmol/shape/Bbcage.js
+org/jmol/shape/Echo.js
+org/jmol/shape/FontLineShape.js
+org/jmol/shape/Frank.js
+org/jmol/shape/Hover.js
+org/jmol/shape/Labels.js
+org/jmol/shape/Measures.js
+org/jmol/shape/Mesh.js
+org/jmol/shape/Shape.js
+org/jmol/shape/Sticks.js
+org/jmol/shape/TextShape.js
+org/jmol/shape/Uccage.js
+org/jmol/shapebio/BioShape.js
+org/jmol/shapebio/BioShapeCollection.js
+org/jmol/shapebio/Cartoon.js
+org/jmol/shapebio/Rockets.js
+org/jmol/symmetry/Symmetry.js
+org/jmol/symmetry/SymmetryInfo.js
+org/jmol/symmetry/UnitCell.js
+org/jmol/thread/HoverWatcherThread.js
+org/jmol/thread/JmolThread.js
+org/jmol/thread/TimeoutThread.js
+org/jmol/util/BSUtil.js
+org/jmol/util/BoxInfo.js
+org/jmol/util/C.js
+org/jmol/util/ColorEncoder.js
+org/jmol/util/CommandHistory.js
+org/jmol/util/DefaultLogger.js
+org/jmol/util/Edge.js
+org/jmol/util/Elements.js
+org/jmol/util/Escape.js
+org/jmol/util/Font.js
+org/jmol/util/GData.js
+org/jmol/util/Geodesic.js
+org/jmol/util/Int2IntHash.js
+org/jmol/util/Int2IntHashEntry.js
+org/jmol/util/Logger.js
+org/jmol/util/LoggerInterface.js
+org/jmol/util/MeshSurface.js
+org/jmol/util/Node.js
+org/jmol/util/Normix.js
+org/jmol/util/Point3fi.js
+org/jmol/util/Rectangle.js
+org/jmol/util/Rgb16.js
+org/jmol/util/Shader.js
+org/jmol/util/SimpleEdge.js
+org/jmol/util/SimpleNode.js
+org/jmol/util/SimpleUnitCell.js
+org/jmol/util/TempArray.js
+org/jmol/viewer/ActionManager.js
+org/jmol/viewer/AnimationManager.js
+org/jmol/viewer/ColorManager.js
+org/jmol/viewer/FileManager.js
+org/jmol/viewer/Gesture.js
+org/jmol/viewer/GlobalSettings.js
+org/jmol/viewer/JC.js
+org/jmol/viewer/JmolStateCreator.js
+org/jmol/viewer/ModelManager.js
+org/jmol/viewer/MotionPoint.js
+org/jmol/viewer/MouseState.js
+org/jmol/viewer/SelectionManager.js
+org/jmol/viewer/ShapeManager.js
+org/jmol/viewer/StateCreator.js
+org/jmol/viewer/StateManager.js
+org/jmol/viewer/StatusManager.js
+org/jmol/viewer/TransformManager.js
+org/jmol/viewer/Viewer.js
+org/jmol/viewer/binding/Binding.js
+org/jmol/viewer/binding/JmolBinding.js
+org/json/CDL.js
+org/json/Cookie.js
+org/json/CookieList.js
+org/json/HTTP.js
+org/json/HTTPTokener.js
+org/json/JSONArray.js
+org/json/JSONException.js
+org/json/JSONML.js
+org/json/JSONObject.js
+org/json/JSONPointer.js
+org/json/JSONPointerException.js
+org/json/JSONPropertyIgnore.js
+org/json/JSONPropertyName.js
+org/json/JSONString.js
+org/json/JSONStringer.js
+org/json/JSONTokener.js
+org/json/JSONWriter.js
+org/json/Property.js
+org/json/XML.js
+org/json/XMLTokener.js
+org/json/simple/ItemList.js
+org/json/simple/JSONArray.js
+org/json/simple/JSONAware.js
+org/json/simple/JSONObject.js
+org/json/simple/JSONStreamAware.js
+org/json/simple/JSONValue.js
+org/json/simple/parser/ContainerFactory.js
+org/json/simple/parser/ContentHandler.js
+org/json/simple/parser/JSONParser.js
+org/json/simple/parser/ParseException.js
+org/json/simple/parser/Yylex.js
+org/json/simple/parser/Yytoken.js
+org/stackoverflowusers/file/WindowsShortcut.js
+org/xml/sax/AttributeList.js
+org/xml/sax/Attributes.js
+org/xml/sax/ContentHandler.js
+org/xml/sax/InputSource.js
+org/xml/sax/Parser.js
+org/xml/sax/XMLReader.js
+org/xml/sax/ext/Attributes2.js
sun/awt/AWTAutoShutdown.js
+sun/awt/AppContext.js
sun/awt/CausedFocusEvent.js
sun/awt/ComponentFactory.js
-sun/awt/KeyboardFocusManagerPeerProvider.js
+sun/awt/EventQueueItem.js
sun/awt/MostRecentKeyValue.js
sun/awt/MostRecentThreadAppContext.js
sun/awt/PaintEventDispatcher.js
sun/awt/PostEventQueue.js
sun/awt/RequestFocusController.js
+sun/awt/SunGraphicsCallback.js
sun/awt/SunToolkit.js
-sun/awt/WindowClosingListener.js
-sun/awt/WindowClosingSupport.js
+sun/awt/image/DataStealer.js
+sun/awt/image/IntegerComponentRaster.js
+sun/awt/image/IntegerInterleavedRaster.js
+sun/awt/image/SunWritableRaster.js
+sun/font/AttributeValues.js
+sun/font/EAttribute.js
sun/font/FontDesignMetrics.js
+sun/java2d/StateTrackable.js
+sun/java2d/StateTrackableDelegate.js
sun/swing/DefaultLookup.js
+sun/swing/StringUIClientPropertyKey.js
sun/swing/SwingLazyValue.js
-sun/text/resources/FormatData.js
-sun/text/resources/FormatData_en.js
-sun/util/resources/LocaleData.js
-swingjs/a2s/A2SContainer.js
-swingjs/a2s/A2SEvent.js
-swingjs/a2s/A2SListener.js
-swingjs/a2s/Applet.js
-swingjs/a2s/Button.js
-swingjs/a2s/Label.js
-swingjs/a2s/Panel.js
-swingjs/a2s/Scrollbar.js
-swingjs/a2s/ScrollPane.js
-swingjs/a2s/TextArea.js
-swingjs/a2s/TextField.js
-swingjs/api/Interface.js
-swingjs/api/js/DOMNode.js
-swingjs/api/js/HTML5CanvasContext2D.js
-swingjs/api/js/JSInterface.js
-swingjs/jquery/JQueryUI.js
+sun/swing/SwingUtilities2.js
+sun/swing/UIAction.js
+sun/swing/UIClientPropertyKey.js
+sun/swing/table/DefaultTableCellHeaderRenderer.js
+sun/text/resources/en/FormatData_en_GB.js
+sun/util/calendar/AbstractCalendar.js
+sun/util/calendar/BaseCalendar.js
+sun/util/calendar/CalendarDate.js
+sun/util/calendar/CalendarSystem.js
+sun/util/calendar/CalendarUtils.js
+sun/util/calendar/Gregorian.js
+sun/util/calendar/ZoneInfo.js
+sun/util/calendar/ZoneInfoFile.js
+sun/util/locale/BaseLocale.js
+sun/util/locale/LanguageTag.js
+sun/util/locale/LocaleUtils.js
+sun/util/locale/provider/AvailableLanguageTags.js
+sun/util/locale/provider/CalendarDataProviderImpl.js
+sun/util/locale/provider/CalendarDataUtility.js
+sun/util/locale/provider/CalendarProviderImpl.js
+sun/util/locale/provider/DateFormatProviderImpl.js
+sun/util/locale/provider/LocaleResources.js
+sun/util/locale/provider/LocaleServiceProviderPool.js
+sun/util/spi/CalendarProvider.js
swingjs/JSApp.js
swingjs/JSAppletThread.js
swingjs/JSAppletViewer.js
+swingjs/JSDummyApplet.js
+swingjs/JSFileSystem.js
swingjs/JSFocusPeer.js
swingjs/JSFontMetrics.js
swingjs/JSFrameViewer.js
swingjs/JSGraphics2D.js
swingjs/JSGraphicsConfiguration.js
swingjs/JSGraphicsEnvironment.js
+swingjs/JSImage.js
+swingjs/JSImagekit.js
+swingjs/JSKeyEvent.js
+swingjs/JSMenuManager.js
swingjs/JSMouse.js
-swingjs/JSNullComponentPeer.js
swingjs/JSScreenDevice.js
swingjs/JSThreadGroup.js
swingjs/JSToolkit.js
swingjs/JSUtil.js
+swingjs/api/Interface.js
+swingjs/api/JSUtilI.js
+swingjs/api/js/DOMNode.js
+swingjs/api/js/HTML5Applet.js
+swingjs/api/js/HTML5Canvas.js
+swingjs/api/js/HTML5CanvasContext2D.js
+swingjs/api/js/JSFunction.js
+swingjs/api/js/JSInterface.js
+swingjs/jquery/JQueryUI.js
+swingjs/json/JSON.js
+swingjs/jzlib/Adler32.js
+swingjs/jzlib/CRC32.js
+swingjs/jzlib/Checksum.js
+swingjs/jzlib/InfBlocks.js
+swingjs/jzlib/InfCodes.js
+swingjs/jzlib/InfTree.js
+swingjs/jzlib/Inflate.js
+swingjs/jzlib/Inflater.js
+swingjs/jzlib/InflaterInputStream.js
+swingjs/jzlib/ZStream.js
+swingjs/plaf/BasicComboBoxEditor.js
+swingjs/plaf/BasicComboBoxRenderer.js
+swingjs/plaf/BasicHTML.js
swingjs/plaf/ButtonListener.js
+swingjs/plaf/CellHolder.js
swingjs/plaf/DefaultMenuLayout.js
swingjs/plaf/HTML5LookAndFeel.js
swingjs/plaf/JSAppletUI.js
swingjs/plaf/JSCheckBoxMenuItemUI.js
swingjs/plaf/JSCheckBoxUI.js
swingjs/plaf/JSComboBoxUI.js
+swingjs/plaf/JSComboPopupList.js
swingjs/plaf/JSComponentUI.js
+swingjs/plaf/JSDesktopIconUI.js
+swingjs/plaf/JSDesktopPaneUI.js
swingjs/plaf/JSEventHandler.js
swingjs/plaf/JSFrameUI.js
swingjs/plaf/JSGraphicsUtils.js
+swingjs/plaf/JSInternalFrameUI.js
swingjs/plaf/JSLabelUI.js
swingjs/plaf/JSLayeredPaneUI.js
swingjs/plaf/JSLightweightUI.js
+swingjs/plaf/JSListUI.js
swingjs/plaf/JSMenuBarUI.js
swingjs/plaf/JSMenuItemUI.js
swingjs/plaf/JSMenuUI.js
swingjs/plaf/JSPanelUI.js
swingjs/plaf/JSPopupMenuSeparatorUI.js
swingjs/plaf/JSPopupMenuUI.js
+swingjs/plaf/JSPopupUI.js
+swingjs/plaf/JSProgressBarUI.js
swingjs/plaf/JSRadioButtonMenuItemUI.js
swingjs/plaf/JSRadioButtonUI.js
swingjs/plaf/JSRootPaneUI.js
swingjs/plaf/JSScrollPaneUI.js
swingjs/plaf/JSSeparatorUI.js
swingjs/plaf/JSSliderUI.js
+swingjs/plaf/JSTabbedPaneUI.js
+swingjs/plaf/JSTableHeaderUI.js
+swingjs/plaf/JSTableUI.js
swingjs/plaf/JSTextAreaUI.js
swingjs/plaf/JSTextFieldUI.js
swingjs/plaf/JSTextUI.js
-swingjs/plaf/JSTextViewUI.js
+swingjs/plaf/JSToolTipUI.js
swingjs/plaf/JSViewportUI.js
swingjs/plaf/JSWindowUI.js
swingjs/plaf/LazyActionMap.js
swingjs/plaf/Resizer.js
swingjs/plaf/TextListener.js
-
-
+swingjs/xml/JSJAXBClass.js
+swingjs/xml/JSJAXBContext.js
+swingjs/xml/JSJAXBContextFactory.js
+swingjs/xml/JSJAXBField.js
+swingjs/xml/JSJAXBUnmarshaller.js
+swingjs/xml/JSSAXAttributes.js
+swingjs/xml/JSSAXParser.js
+swingjs/xml/JSXMLGregorianCalendarImpl.js
+swingjs/xml/JSXMLInputFactory.js
+swingjs/xml/JSXMLStreamReader.js
+swingjs/xml/JSXMLStreamReader.jscore/package.js
+uk/ac/ebi/picr/model/CrossReference.js
+uk/ac/ebi/picr/model/CrossReference_Helper.js
+uk/ac/ebi/picr/model/UPEntry.js
+uk/ac/ebi/picr/model/UPEntry_Helper.js
+uk/ac/ebi/www/Data.js
+uk/ac/ebi/www/InputParams.js
+uk/ac/ebi/www/WSFile.js
+uk/ac/ebi/www/WSWUBlast.js
+uk/ac/ebi/www/WSWUBlastService.js
+uk/ac/ebi/www/WSWUBlastServiceLocator.js
+uk/ac/ebi/www/WSWUBlastSoapBindingStub.js
+uk/ac/ebi/www/picr/AccessionMappingService/AccessionMapperBindingStub.js
+uk/ac/ebi/www/picr/AccessionMappingService/AccessionMapperInterface.js
+uk/ac/ebi/www/picr/AccessionMappingService/AccessionMapperService.js
+uk/ac/ebi/www/picr/AccessionMappingService/AccessionMapperServiceLocator.js
+vamsas/IMsaWS.js
+vamsas/objects/simple/Alignment.js
+vamsas/objects/simple/Alignment_Helper.js
+vamsas/objects/simple/JpredResult.js
+vamsas/objects/simple/JpredResult_Helper.js
+vamsas/objects/simple/MsaResult.js
+vamsas/objects/simple/MsaResult_Helper.js
+vamsas/objects/simple/Msfalignment.js
+vamsas/objects/simple/Msfalignment_Helper.js
+vamsas/objects/simple/Object.js
+vamsas/objects/simple/Object_Helper.js
+vamsas/objects/simple/Result.js
+vamsas/objects/simple/Result_Helper.js
+vamsas/objects/simple/Secstructpred.js
+vamsas/objects/simple/Secstructpred_Helper.js
+vamsas/objects/simple/SeqSearchResult.js
+vamsas/objects/simple/SeqSearchResult_Helper.js
+vamsas/objects/simple/Sequence.js
+vamsas/objects/simple/SequenceSet.js
+vamsas/objects/simple/SequenceSet_Helper.js
+vamsas/objects/simple/Sequence_Helper.js
+vamsas/objects/simple/WsJobId.js
+vamsas/objects/simple/WsJobId_Helper.js
serverURL: 'https://chemapps.stolaf.edu/jmol/jsmol/php/jsmol.php',
j2sPath: 'swingjs/j2s',
console: window.console,
- allowjavascript: true
+ allowjavascript: true,
+ namespace: ""
}
</script>
</head>
<body>
<script>
-// we define console.err because swingjs2.js calls it instead of console.error
-window.console.err = function() {
- this.error.apply(this,arguments);
-}
SwingJS.getApplet('testApplet', Info)
getClassList = function(){J2S._saveFile('_j2sclasslist.txt', Clazz.ClassFilesLoaded.sort().join('\n'))}
</script>
+++ /dev/null
-jalview/analysis/AAFrequency.js
-jalview/analysis/AlignSeq.js
-jalview/analysis/AlignmentAnnotationUtils.js
-jalview/analysis/AlignmentUtils.js
-jalview/analysis/AnnotationSorter.js
-jalview/analysis/Conservation.js
-jalview/analysis/CrossRef.js
-jalview/analysis/NJTree.js
-jalview/analysis/SeqsetUtils.js
-jalview/analysis/TreeBuilder.js
-jalview/analysis/TreeModel.js
-jalview/analysis/scoremodels/DistanceScoreModel.js
-jalview/analysis/scoremodels/FeatureDistanceModel.js
-jalview/analysis/scoremodels/PIDModel.js
-jalview/analysis/scoremodels/ScoreMatrix.js
-jalview/analysis/scoremodels/ScoreModels.js
-jalview/analysis/scoremodels/SimilarityParams.js
-jalview/analysis/scoremodels/SimilarityScoreModel.js
-jalview/api/AlignCalcManagerI.js
-jalview/api/AlignCalcWorkerI.js
-jalview/api/AlignViewControllerGuiI.js
-jalview/api/AlignViewControllerI.js
-jalview/api/AlignViewportI.js
-jalview/api/AlignmentViewPanel.js
-jalview/api/BuildDetailsI.js
-jalview/api/FeatureColourI.js
-jalview/api/FeatureRenderer.js
-jalview/api/FeaturesDisplayedI.js
-jalview/api/OOMHandlerI.js
-jalview/api/SequenceRenderer.js
-jalview/api/StructureSelectionManagerProvider.js
-jalview/api/ViewStyleI.js
-jalview/api/analysis/PairwiseScoreModelI.js
-jalview/api/analysis/ScoreModelI.js
-jalview/api/analysis/SimilarityParamsI.js
-jalview/bin/ArgsParser.js
-jalview/bin/BuildDetails.js
-jalview/bin/Cache.js
-jalview/bin/Jalview.js
-jalview/bin/JalviewJS2.js
-jalview/controller/AlignViewController.js
-jalview/datamodel/ASequence.js
-jalview/datamodel/ASequenceI.js
-jalview/datamodel/Alignment.js
-jalview/datamodel/AlignmentAnnotation.js
-jalview/datamodel/AlignmentI.js
-jalview/datamodel/AlignmentView.js
-jalview/datamodel/AnnotatedCollectionI.js
-jalview/datamodel/Annotation.js
-jalview/datamodel/BinaryNode.js
-jalview/datamodel/CigarArray.js
-jalview/datamodel/CigarBase.js
-jalview/datamodel/CigarSimple.js
-jalview/datamodel/ColumnSelection.js
-jalview/datamodel/ContiguousI.js
-jalview/datamodel/DBRefSource.js
-jalview/datamodel/HiddenColumns.js
-jalview/datamodel/HiddenColumnsCursor.js
-jalview/datamodel/HiddenCursorPosition.js
-jalview/datamodel/HiddenSequences.js
-jalview/datamodel/PDBEntry.js
-jalview/datamodel/Profile.js
-jalview/datamodel/ProfileI.js
-jalview/datamodel/Profiles.js
-jalview/datamodel/ProfilesI.js
-jalview/datamodel/Range.js
-jalview/datamodel/RangeIterator.js
-jalview/datamodel/ResidueCount.js
-jalview/datamodel/SearchResults.js
-jalview/datamodel/SearchResultsI.js
-jalview/datamodel/SeqCigar.js
-jalview/datamodel/Sequence.js
-jalview/datamodel/SequenceCollectionI.js
-jalview/datamodel/SequenceCursor.js
-jalview/datamodel/SequenceFeature.js
-jalview/datamodel/SequenceGroup.js
-jalview/datamodel/SequenceI.js
-jalview/datamodel/SequenceNode.js
-jalview/datamodel/features/FeatureLocationI.js
-jalview/datamodel/features/FeatureMatcher.js
-jalview/datamodel/features/FeatureMatcherI.js
-jalview/datamodel/features/FeatureMatcherSet.js
-jalview/datamodel/features/FeatureMatcherSetI.js
-jalview/datamodel/features/FeatureStore.js
-jalview/datamodel/features/RangeComparator.js
-jalview/datamodel/features/SequenceFeatures.js
-jalview/datamodel/features/SequenceFeaturesI.js
-jalview/gui/AlignFrame.js
-jalview/gui/AlignViewport.js
-jalview/gui/AlignmentPanel.js
-jalview/gui/AnnotationLabels.js
-jalview/gui/AnnotationPanel.js
-jalview/gui/CalculationChooser.js
-jalview/gui/ColourMenuHelper.js
-jalview/gui/ComboBoxTooltipRenderer.js
-jalview/gui/Desktop.js
-jalview/gui/FeatureRenderer.js
-jalview/gui/IProgressIndicator.js
-jalview/gui/IdCanvas.js
-jalview/gui/IdPanel.js
-jalview/gui/IdwidthAdjuster.js
-jalview/gui/JalviewChangeSupport.js
-jalview/gui/JvSwingUtils.js
-jalview/gui/PaintRefresher.js
-jalview/gui/PopupMenu.js
-jalview/gui/Preferences.js
-jalview/gui/ProgressBar.js
-jalview/gui/ScalePanel.js
-jalview/gui/SeqCanvas.js
-jalview/gui/SeqPanel.js
-jalview/gui/SequenceRenderer.js
-jalview/gui/TreeCanvas.js
-jalview/gui/TreePanel.js
-jalview/gui/ViewSelectionMenu.js
-jalview/io/AlignFile.js
-jalview/io/AlignmentFileReaderI.js
-jalview/io/AlignmentFileWriterI.js
-jalview/io/AppletFormatAdapter.js
-jalview/io/DataSourceType.js
-jalview/io/FileFormat.js
-jalview/io/FileFormatI.js
-jalview/io/FileFormats.js
-jalview/io/FileLoader.js
-jalview/io/FileParse.js
-jalview/io/IdentifyFile.js
-jalview/io/PIRFile.js
-jalview/io/ScoreMatrixFile.js
-jalview/io/SequenceAnnotationReport.js
-jalview/javascript/log4j/ConsoleAppender.js
-jalview/javascript/log4j/Layout.js
-jalview/javascript/log4j/Level.js
-jalview/javascript/log4j/Logger.js
-jalview/javascript/log4j/Priority.js
-jalview/javascript/log4j/SimpleLayout.js
-jalview/javascript/log4j/spi/OptionHandler.js
-jalview/jbgui/GAlignFrame.js
-jalview/jbgui/GAlignmentPanel.js
-jalview/jbgui/GDesktop.js
-jalview/jbgui/GPreferences.js
-jalview/jbgui/GTreePanel.js
-jalview/math/Matrix.js
-jalview/math/MatrixI.js
-jalview/project/Jalview2XML.js
-jalview/renderer/AnnotationRenderer.js
-jalview/renderer/AwtRenderPanelI.js
-jalview/renderer/ResidueColourFinder.js
-jalview/renderer/ResidueShader.js
-jalview/renderer/ResidueShaderI.js
-jalview/renderer/ScaleRenderer.js
-jalview/renderer/seqfeatures/FeatureRenderer.js
-jalview/schemes/Blosum62ColourScheme.js
-jalview/schemes/BuriedColourScheme.js
-jalview/schemes/ClustalxColourScheme.js
-jalview/schemes/ColourSchemeI.js
-jalview/schemes/ColourSchemeProperty.js
-jalview/schemes/ColourSchemes.js
-jalview/schemes/Consensus.js
-jalview/schemes/FeatureColour.js
-jalview/schemes/HelixColourScheme.js
-jalview/schemes/HydrophobicColourScheme.js
-jalview/schemes/JalviewColourScheme.js
-jalview/schemes/NucleotideColourScheme.js
-jalview/schemes/PIDColourScheme.js
-jalview/schemes/PurinePyrimidineColourScheme.js
-jalview/schemes/RNAHelicesColour.js
-jalview/schemes/ResidueColourScheme.js
-jalview/schemes/ResidueProperties.js
-jalview/schemes/ScoreColourScheme.js
-jalview/schemes/StrandColourScheme.js
-jalview/schemes/TCoffeeColourScheme.js
-jalview/schemes/TaylorColourScheme.js
-jalview/schemes/TurnColourScheme.js
-jalview/schemes/ZappoColourScheme.js
-jalview/structure/CommandListener.js
-jalview/structure/SelectionListener.js
-jalview/structure/SelectionSource.js
-jalview/structure/SequenceListener.js
-jalview/structure/StructureImportSettings.js
-jalview/structure/StructureSelectionManager.js
-jalview/structure/VamsasSource.js
-jalview/urls/CustomUrlProvider.js
-jalview/urls/IdOrgSettings.js
-jalview/urls/IdentifiersUrlProvider.js
-jalview/urls/UrlLinkDisplay.js
-jalview/urls/UrlLinkTableModel.js
-jalview/urls/UrlProvider.js
-jalview/urls/UrlProviderImpl.js
-jalview/urls/api/UrlProviderFactoryI.js
-jalview/urls/api/UrlProviderI.js
-jalview/urls/desktop/DesktopUrlProviderFactory.js
-jalview/util/ColorUtils.js
-jalview/util/Comparison.js
-jalview/util/DBRefUtils.js
-jalview/util/Format.js
-jalview/util/MessageManager.js
-jalview/util/Platform.js
-jalview/util/QuickSort.js
-jalview/util/StringUtils.js
-jalview/util/UrlLink.js
-jalview/util/jarInputStreamProvider.js
-jalview/util/matcher/Condition.js
-jalview/util/matcher/Matcher.js
-jalview/util/matcher/MatcherI.js
-jalview/viewmodel/AlignmentViewport.js
-jalview/viewmodel/ViewportListenerI.js
-jalview/viewmodel/ViewportProperties.js
-jalview/viewmodel/ViewportRanges.js
-jalview/viewmodel/seqfeatures/FeatureRendererModel.js
-jalview/viewmodel/seqfeatures/FeatureRendererSettings.js
-jalview/viewmodel/seqfeatures/FeaturesDisplayed.js
-jalview/viewmodel/styles/ViewStyle.js
-jalview/workers/AlignCalcManager.js
-jalview/workers/AlignCalcWorker.js
-jalview/workers/ConsensusThread.js
-jalview/workers/ConservationThread.js
-jalview/ws/sifts/SiftsSettings.js
-jalview/xml/binding/jalview/Annotation.js
-jalview/xml/binding/jalview/AnnotationElement.js
-jalview/xml/binding/jalview/Feature.js
-jalview/xml/binding/jalview/FeatureMatcher.js
-jalview/xml/binding/jalview/FeatureMatcherSet.js
-jalview/xml/binding/jalview/FilterBy.js
-jalview/xml/binding/jalview/JalviewModel.js
-jalview/xml/binding/jalview/NoValueColour.js
-jalview/xml/binding/jalview/Pdbentry.js
-jalview/xml/binding/jalview/Sequence.js
-jalview/xml/binding/jalview/SequenceSet.js
-jalview/xml/binding/jalview/SequenceType.js
-jalview/xml/binding/jalview/VAMSAS.js
-jalview/xml/binding/jalview/WebServiceParameterSet.js
-java/applet/AppletContext.js
-java/applet/AppletStub.js
-java/applet/JSApplet.js
-java/awt/AWTEvent.js
-java/awt/AWTEventMulticaster.js
-java/awt/AWTKeyStroke.js
-java/awt/ActiveEvent.js
-java/awt/Adjustable.js
-java/awt/AlphaComposite.js
-java/awt/BasicStroke.js
-java/awt/BorderLayout.js
-java/awt/Color.js
-java/awt/Component.js
-java/awt/ComponentOrientation.js
-java/awt/Composite.js
-java/awt/Container.js
-java/awt/ContainerOrderFocusTraversalPolicy.js
-java/awt/Cursor.js
-java/awt/DefaultFocusTraversalPolicy.js
-java/awt/DefaultKeyboardFocusManager.js
-java/awt/Dialog.js
-java/awt/Dimension.js
-java/awt/EventDispatchThread.js
-java/awt/EventFilter.js
-java/awt/EventQueue.js
-java/awt/EventQueueItem.js
-java/awt/FlowLayout.js
-java/awt/FocusTraversalPolicy.js
-java/awt/Font.js
-java/awt/FontMetrics.js
-java/awt/GraphicsCallback.js
-java/awt/GraphicsConfiguration.js
-java/awt/GraphicsDevice.js
-java/awt/GraphicsEnvironment.js
-java/awt/GridLayout.js
-java/awt/Image.js
-java/awt/Insets.js
-java/awt/ItemSelectable.js
-java/awt/JSComponent.js
-java/awt/JSDialog.js
-java/awt/JSFrame.js
-java/awt/JSPanel.js
-java/awt/KeyEventDispatcher.js
-java/awt/KeyEventPostProcessor.js
-java/awt/KeyboardFocusManager.js
-java/awt/LayoutManager.js
-java/awt/LayoutManager2.js
-java/awt/LightweightDispatcher.js
-java/awt/Paint.js
-java/awt/Point.js
-java/awt/Queue.js
-java/awt/Rectangle.js
-java/awt/RenderingHints.js
-java/awt/SentEvent.js
-java/awt/Shape.js
-java/awt/Stroke.js
-java/awt/Toolkit.js
-java/awt/Transparency.js
-java/awt/VKCollection.js
-java/awt/Window.js
-java/awt/color/ColorSpace.js
-java/awt/datatransfer/ClipboardOwner.js
-java/awt/datatransfer/FlavorMap.js
-java/awt/datatransfer/FlavorTable.js
-java/awt/datatransfer/SystemFlavorMap.js
-java/awt/dnd/DropTarget.js
-java/awt/dnd/DropTargetContext.js
-java/awt/dnd/DropTargetListener.js
-java/awt/dnd/peer/DropTargetPeer.js
-java/awt/event/AWTEventListener.js
-java/awt/event/ActionEvent.js
-java/awt/event/ActionListener.js
-java/awt/event/AdjustmentEvent.js
-java/awt/event/AdjustmentListener.js
-java/awt/event/ComponentAdapter.js
-java/awt/event/ComponentEvent.js
-java/awt/event/ComponentListener.js
-java/awt/event/ContainerEvent.js
-java/awt/event/ContainerListener.js
-java/awt/event/FocusAdapter.js
-java/awt/event/FocusEvent.js
-java/awt/event/FocusListener.js
-java/awt/event/HierarchyBoundsListener.js
-java/awt/event/HierarchyListener.js
-java/awt/event/InputEvent.js
-java/awt/event/InputMethodListener.js
-java/awt/event/InvocationEvent.js
-java/awt/event/ItemEvent.js
-java/awt/event/ItemListener.js
-java/awt/event/KeyAdapter.js
-java/awt/event/KeyEvent.js
-java/awt/event/KeyListener.js
-java/awt/event/MouseAdapter.js
-java/awt/event/MouseEvent.js
-java/awt/event/MouseListener.js
-java/awt/event/MouseMotionAdapter.js
-java/awt/event/MouseMotionListener.js
-java/awt/event/MouseWheelListener.js
-java/awt/event/TextListener.js
-java/awt/event/WindowAdapter.js
-java/awt/event/WindowEvent.js
-java/awt/event/WindowFocusListener.js
-java/awt/event/WindowListener.js
-java/awt/event/WindowStateListener.js
-java/awt/font/FontRenderContext.js
-java/awt/geom/AffineTransform.js
-java/awt/geom/Dimension2D.js
-java/awt/geom/Path2D.js
-java/awt/geom/PathIterator.js
-java/awt/geom/Point2D.js
-java/awt/geom/RectIterator.js
-java/awt/geom/Rectangle2D.js
-java/awt/geom/RectangularShape.js
-java/awt/image/BufferedImage.js
-java/awt/image/ColorModel.js
-java/awt/image/DataBuffer.js
-java/awt/image/DataBufferInt.js
-java/awt/image/DirectColorModel.js
-java/awt/image/ImageObserver.js
-java/awt/image/PackedColorModel.js
-java/awt/image/Raster.js
-java/awt/image/RenderedImage.js
-java/awt/image/SampleModel.js
-java/awt/image/SinglePixelPackedSampleModel.js
-java/awt/image/WritableRaster.js
-java/awt/peer/ComponentPeer.js
-java/awt/peer/ContainerPeer.js
-java/awt/peer/FramePeer.js
-java/awt/peer/KeyboardFocusManagerPeer.js
-java/awt/peer/LightweightPeer.js
-java/awt/peer/WindowPeer.js
-java/awt/print/Printable.js
-java/beans/ChangeListenerMap.js
-java/beans/PropertyChangeEvent.js
-java/beans/PropertyChangeListener.js
-java/beans/PropertyChangeSupport.js
-java/io/BufferedInputStream.js
-java/io/BufferedReader.js
-java/io/ByteArrayInputStream.js
-java/io/Closeable.js
-java/io/File.js
-java/io/FileDescriptor.js
-java/io/FileInputStream.js
-java/io/FileReader.js
-java/io/FileSystem.js
-java/io/FilterInputStream.js
-java/io/InputStream.js
-java/io/InputStreamReader.js
-java/io/PushbackInputStream.js
-java/io/Reader.js
-java/lang/AbstractStringBuilder.js
-java/lang/AutoCloseable.js
-java/lang/Class.js
-java/lang/Enum.js
-java/lang/Iterable.js
-java/lang/Readable.js
-java/lang/Runtime.js
-java/lang/StringBuffer.js
-java/lang/StringBuilder.js
-java/lang/Thread.js
-java/lang/ThreadGroup.js
-java/lang/reflect/Constructor.js
-java/lang/reflect/Method.js
-java/math/BigDecimal.js
-java/math/BigInteger.js
-java/math/MathContext.js
-java/math/RoundingMode.js
-java/net/HttpURLConnection.js
-java/net/MalformedURLException.js
-java/net/URL.js
-java/net/URLConnection.js
-java/net/URLDecoder.js
-java/net/URLStreamHandler.js
-java/net/URLStreamHandlerFactory.js
-java/nio/Bits.js
-java/nio/Buffer.js
-java/nio/ByteBuffer.js
-java/nio/ByteOrder.js
-java/nio/CharBuffer.js
-java/nio/HeapByteBuffer.js
-java/nio/HeapCharBuffer.js
-java/nio/charset/Charset.js
-java/nio/charset/CharsetDecoder.js
-java/nio/charset/CoderResult.js
-java/nio/charset/CodingErrorAction.js
-java/security/AccessControlContext.js
-java/security/AccessController.js
-java/security/PrivilegedAction.js
-java/security/PrivilegedExceptionAction.js
-java/text/AttributedCharacterIterator.js
-java/text/CharacterIterator.js
-java/text/DateFormat.js
-java/text/DateFormatSymbols.js
-java/text/DecimalFormat.js
-java/text/DecimalFormatSymbols.js
-java/text/DigitList.js
-java/text/FieldPosition.js
-java/text/Format.js
-java/text/MessageFormat.js
-java/text/NumberFormat.js
-java/text/SimpleDateFormat.js
-java/util/AbstractCollection.js
-java/util/AbstractList.js
-java/util/AbstractMap.js
-java/util/AbstractQueue.js
-java/util/AbstractSequentialList.js
-java/util/AbstractSet.js
-java/util/ArrayDeque.js
-java/util/ArrayList.js
-java/util/Arrays.js
-java/util/BitSet.js
-java/util/Calendar.js
-java/util/Collection.js
-java/util/Collections.js
-java/util/Comparator.js
-java/util/Deque.js
-java/util/Dictionary.js
-java/util/DualPivotQuicksort.js
-java/util/Enumeration.js
-java/util/EventListener.js
-java/util/EventObject.js
-java/util/GregorianCalendar.js
-java/util/HashMap.js
-java/util/HashSet.js
-java/util/Hashtable.js
-java/util/IdentityHashMap.js
-java/util/Iterator.js
-java/util/LinkedHashMap.js
-java/util/LinkedList.js
-java/util/List.js
-java/util/ListIterator.js
-java/util/ListResourceBundle.js
-java/util/Locale.js
-java/util/Map.js
-java/util/NavigableMap.js
-java/util/NavigableSet.js
-java/util/Objects.js
-java/util/Properties.js
-java/util/PropertyResourceBundle.js
-java/util/Queue.js
-java/util/RandomAccess.js
-java/util/ResourceBundle.js
-java/util/Set.js
-java/util/SortedMap.js
-java/util/SortedSet.js
-java/util/StringTokenizer.js
-java/util/TimSort.js
-java/util/TimeZone.js
-java/util/TreeMap.js
-java/util/TreeSet.js
-java/util/Vector.js
-java/util/concurrent/AbstractExecutorService.js
-java/util/concurrent/BlockingQueue.js
-java/util/concurrent/ConcurrentHashMap.js
-java/util/concurrent/ConcurrentMap.js
-java/util/concurrent/Executor.js
-java/util/concurrent/ExecutorService.js
-java/util/concurrent/Executors.js
-java/util/concurrent/LinkedBlockingQueue.js
-java/util/concurrent/RejectedExecutionHandler.js
-java/util/concurrent/Semaphore.js
-java/util/concurrent/ThreadFactory.js
-java/util/concurrent/ThreadPoolExecutor.js
-java/util/concurrent/TimeUnit.js
-java/util/concurrent/atomic/AtomicBoolean.js
-java/util/concurrent/atomic/AtomicInteger.js
-java/util/concurrent/locks/AbstractOwnableSynchronizer.js
-java/util/concurrent/locks/AbstractQueuedSynchronizer.js
-java/util/concurrent/locks/Condition.js
-java/util/concurrent/locks/Lock.js
-java/util/concurrent/locks/ReadWriteLock.js
-java/util/concurrent/locks/ReentrantLock.js
-java/util/concurrent/locks/ReentrantReadWriteLock.js
-java/util/jar/JarEntry.js
-java/util/jar/JarInputStream.js
-java/util/logging/Level.js
-java/util/logging/Logger.js
-java/util/regex/MatchResult.js
-java/util/regex/Matcher.js
-java/util/regex/Pattern.js
-java/util/zip/CRC32.js
-java/util/zip/Inflater.js
-java/util/zip/InflaterInputStream.js
-java/util/zip/ZipConstants.js
-java/util/zip/ZipEntry.js
-java/util/zip/ZipInputStream.js
-javajs/api/GenericLineReader.js
-javajs/api/JSFunction.js
-javajs/api/JSONEncodable.js
-javajs/util/AU.js
-javajs/util/AjaxURLConnection.js
-javajs/util/AjaxURLStreamHandler.js
-javajs/util/AjaxURLStreamHandlerFactory.js
-javajs/util/Encoding.js
-javajs/util/JSThread.js
-javajs/util/Lst.js
-javajs/util/PT.js
-javajs/util/Rdr.js
-javajs/util/SB.js
-javax/swing/AbstractAction.js
-javax/swing/AbstractButton.js
-javax/swing/AbstractListModel.js
-javax/swing/Action.js
-javax/swing/ActionMap.js
-javax/swing/AncestorNotifier.js
-javax/swing/ArrayTable.js
-javax/swing/BorderFactory.js
-javax/swing/BoundedRangeModel.js
-javax/swing/BoxLayout.js
-javax/swing/ButtonGroup.js
-javax/swing/ButtonModel.js
-javax/swing/ClientPropertyKey.js
-javax/swing/ComboBoxModel.js
-javax/swing/ComponentInputMap.js
-javax/swing/DefaultBoundedRangeModel.js
-javax/swing/DefaultButtonModel.js
-javax/swing/DefaultComboBoxModel.js
-javax/swing/DefaultDesktopManager.js
-javax/swing/DefaultListCellRenderer.js
-javax/swing/DefaultSingleSelectionModel.js
-javax/swing/DesktopManager.js
-javax/swing/InputMap.js
-javax/swing/JApplet.js
-javax/swing/JButton.js
-javax/swing/JCheckBox.js
-javax/swing/JCheckBoxMenuItem.js
-javax/swing/JComboBox.js
-javax/swing/JComponent.js
-javax/swing/JDesktopPane.js
-javax/swing/JDialog.js
-javax/swing/JFrame.js
-javax/swing/JInternalFrame.js
-javax/swing/JLabel.js
-javax/swing/JLayeredPane.js
-javax/swing/JMenu.js
-javax/swing/JMenuBar.js
-javax/swing/JMenuItem.js
-javax/swing/JPanel.js
-javax/swing/JPopupMenu.js
-javax/swing/JProgressBar.js
-javax/swing/JRadioButton.js
-javax/swing/JRadioButtonMenuItem.js
-javax/swing/JRootPane.js
-javax/swing/JScrollBar.js
-javax/swing/JScrollPane.js
-javax/swing/JSeparator.js
-javax/swing/JTabbedPane.js
-javax/swing/JToggleButton.js
-javax/swing/JToolTip.js
-javax/swing/JViewport.js
-javax/swing/JWindow.js
-javax/swing/KeyStroke.js
-javax/swing/KeyboardManager.js
-javax/swing/ListCellRenderer.js
-javax/swing/ListModel.js
-javax/swing/LookAndFeel.js
-javax/swing/MenuElement.js
-javax/swing/MenuSelectionManager.js
-javax/swing/MutableComboBoxModel.js
-javax/swing/Popup.js
-javax/swing/PopupFactory.js
-javax/swing/RepaintManager.js
-javax/swing/RootPaneContainer.js
-javax/swing/ScrollPaneConstants.js
-javax/swing/ScrollPaneLayout.js
-javax/swing/Scrollable.js
-javax/swing/SingleSelectionModel.js
-javax/swing/SizeRequirements.js
-javax/swing/SwingConstants.js
-javax/swing/SwingPaintEventDispatcher.js
-javax/swing/SwingUtilities.js
-javax/swing/Timer.js
-javax/swing/ToolTipManager.js
-javax/swing/UIDefaults.js
-javax/swing/UIManager.js
-javax/swing/ViewportLayout.js
-javax/swing/WindowConstants.js
-javax/swing/border/AbstractBorder.js
-javax/swing/border/BevelBorder.js
-javax/swing/border/Border.js
-javax/swing/border/EmptyBorder.js
-javax/swing/border/EtchedBorder.js
-javax/swing/border/LineBorder.js
-javax/swing/border/TitledBorder.js
-javax/swing/event/AncestorEvent.js
-javax/swing/event/AncestorListener.js
-javax/swing/event/ChangeEvent.js
-javax/swing/event/ChangeListener.js
-javax/swing/event/EventListenerList.js
-javax/swing/event/InternalFrameAdapter.js
-javax/swing/event/InternalFrameEvent.js
-javax/swing/event/InternalFrameListener.js
-javax/swing/event/ListDataListener.js
-javax/swing/event/MenuKeyListener.js
-javax/swing/event/MenuListener.js
-javax/swing/event/TableModelListener.js
-javax/swing/plaf/ActionMapUIResource.js
-javax/swing/plaf/BorderUIResource.js
-javax/swing/plaf/ColorUIResource.js
-javax/swing/plaf/ComponentInputMapUIResource.js
-javax/swing/plaf/ComponentUI.js
-javax/swing/plaf/DimensionUIResource.js
-javax/swing/plaf/FontUIResource.js
-javax/swing/plaf/InsetsUIResource.js
-javax/swing/plaf/UIResource.js
-javax/swing/plaf/basic/BasicBorders.js
-javax/swing/table/AbstractTableModel.js
-javax/swing/table/TableModel.js
-javax/xml/bind/ContextFinder.js
-javax/xml/bind/GetPropertyAction.js
-javax/xml/bind/JAXBContext.js
-javax/xml/bind/JAXBContextFactory.js
-javax/xml/bind/JAXBElement.js
-javax/xml/bind/ModuleUtil.js
-javax/xml/bind/ServiceLoaderUtil.js
-javax/xml/bind/Unmarshaller.js
-javax/xml/bind/ValidationEventHandler.js
-javax/xml/bind/annotation/adapters/CollapsedStringAdapter.js
-javax/xml/bind/annotation/adapters/XmlAdapter.js
-javax/xml/bind/helpers/AbstractUnmarshallerImpl.js
-javax/xml/bind/helpers/DefaultValidationEventHandler.js
-javax/xml/datatype/XMLGregorianCalendar.js
-javax/xml/namespace/QName.js
-javax/xml/stream/XMLInputFactory.js
-javax/xml/stream/XMLStreamReader.js
-org/apache/xerces/jaxp/datatype/XMLGregorianCalendarImpl.js
-org/json/simple/parser/JSONParser.js
-org/json/simple/parser/ParseException.js
-org/json/simple/parser/Yylex.js
-org/xml/sax/AttributeList.js
-org/xml/sax/Attributes.js
-org/xml/sax/ContentHandler.js
-org/xml/sax/InputSource.js
-org/xml/sax/Parser.js
-org/xml/sax/XMLReader.js
-org/xml/sax/ext/Attributes2.js
-sun/awt/AWTAccessor.js
-sun/awt/AWTAutoShutdown.js
-sun/awt/AppContext.js
-sun/awt/CausedFocusEvent.js
-sun/awt/ComponentFactory.js
-sun/awt/EventQueueItem.js
-sun/awt/KeyboardFocusManagerPeerProvider.js
-sun/awt/MostRecentKeyValue.js
-sun/awt/MostRecentThreadAppContext.js
-sun/awt/PaintEventDispatcher.js
-sun/awt/PostEventQueue.js
-sun/awt/RequestFocusController.js
-sun/awt/SunGraphicsCallback.js
-sun/awt/SunToolkit.js
-sun/awt/WindowClosingListener.js
-sun/awt/WindowClosingSupport.js
-sun/awt/image/DataStealer.js
-sun/awt/image/IntegerComponentRaster.js
-sun/awt/image/IntegerInterleavedRaster.js
-sun/awt/image/SunWritableRaster.js
-sun/font/FontDesignMetrics.js
-sun/java2d/StateTrackable.js
-sun/java2d/StateTrackableDelegate.js
-sun/nio/cs/ArrayDecoder.js
-sun/nio/cs/HistoricallyNamedCharset.js
-sun/nio/cs/StandardCharsets.js
-sun/nio/cs/ThreadLocalCoders.js
-sun/nio/cs/UTF_8.js
-sun/nio/cs/Unicode.js
-sun/swing/DefaultLookup.js
-sun/swing/SwingLazyValue.js
-sun/swing/UIAction.js
-sun/text/resources/FormatData.js
-sun/text/resources/FormatData_en.js
-sun/util/calendar/AbstractCalendar.js
-sun/util/calendar/BaseCalendar.js
-sun/util/calendar/CalendarDate.js
-sun/util/calendar/CalendarSystem.js
-sun/util/calendar/CalendarUtils.js
-sun/util/calendar/Gregorian.js
-sun/util/calendar/ZoneInfo.js
-sun/util/resources/LocaleData.js
-swingjs/JSApp.js
-swingjs/JSApplet.js
-swingjs/JSAppletThread.js
-swingjs/JSAppletViewer.js
-swingjs/JSCharSet.js
-swingjs/JSFocusPeer.js
-swingjs/JSFontMetrics.js
-swingjs/JSFrameViewer.js
-swingjs/JSGraphics2D.js
-swingjs/JSGraphicsConfiguration.js
-swingjs/JSGraphicsEnvironment.js
-swingjs/JSKeyEvent.js
-swingjs/JSMenuManager.js
-swingjs/JSMouse.js
-swingjs/JSScreenDevice.js
-swingjs/JSThreadGroup.js
-swingjs/JSToolkit.js
-swingjs/JSUtil.js
-swingjs/a2s/Dialog.js
-swingjs/api/Interface.js
-swingjs/api/js/DOMNode.js
-swingjs/api/js/HTML5CanvasContext2D.js
-swingjs/api/js/JSInterface.js
-swingjs/jquery/JQueryUI.js
-swingjs/jzlib/Adler32.js
-swingjs/jzlib/CRC32.js
-swingjs/jzlib/Checksum.js
-swingjs/jzlib/InfBlocks.js
-swingjs/jzlib/InfCodes.js
-swingjs/jzlib/InfTree.js
-swingjs/jzlib/Inflate.js
-swingjs/jzlib/Inflater.js
-swingjs/jzlib/InflaterInputStream.js
-swingjs/jzlib/ZStream.js
-swingjs/plaf/ButtonListener.js
-swingjs/plaf/DefaultMenuLayout.js
-swingjs/plaf/HTML5LookAndFeel.js
-swingjs/plaf/JSAppletUI.js
-swingjs/plaf/JSButtonUI.js
-swingjs/plaf/JSCheckBoxMenuItemUI.js
-swingjs/plaf/JSCheckBoxUI.js
-swingjs/plaf/JSComboBoxUI.js
-swingjs/plaf/JSComponentUI.js
-swingjs/plaf/JSDesktopIconUI.js
-swingjs/plaf/JSDesktopPaneUI.js
-swingjs/plaf/JSEventHandler.js
-swingjs/plaf/JSFrameUI.js
-swingjs/plaf/JSGraphicsUtils.js
-swingjs/plaf/JSInternalFrameUI.js
-swingjs/plaf/JSLabelUI.js
-swingjs/plaf/JSLayeredPaneUI.js
-swingjs/plaf/JSLightweightUI.js
-swingjs/plaf/JSMenuBarUI.js
-swingjs/plaf/JSMenuItemUI.js
-swingjs/plaf/JSMenuUI.js
-swingjs/plaf/JSPanelUI.js
-swingjs/plaf/JSPopupMenuSeparatorUI.js
-swingjs/plaf/JSPopupMenuUI.js
-swingjs/plaf/JSPopupUI.js
-swingjs/plaf/JSProgressBarUI.js
-swingjs/plaf/JSRadioButtonMenuItemUI.js
-swingjs/plaf/JSRadioButtonUI.js
-swingjs/plaf/JSRootPaneUI.js
-swingjs/plaf/JSScrollBarUI.js
-swingjs/plaf/JSScrollPaneUI.js
-swingjs/plaf/JSSeparatorUI.js
-swingjs/plaf/JSSliderUI.js
-swingjs/plaf/JSTabbedPaneUI.js
-swingjs/plaf/JSToolTipUI.js
-swingjs/plaf/JSViewportUI.js
-swingjs/plaf/JSWindowUI.js
-swingjs/plaf/LazyActionMap.js
-swingjs/plaf/Resizer.js
-swingjs/xml/JSJAXBClass.js
-swingjs/xml/JSJAXBContext.js
-swingjs/xml/JSJAXBContextFactory.js
-swingjs/xml/JSJAXBField.js
-swingjs/xml/JSJAXBUnmarshaller.js
-swingjs/xml/JSSAXAttributes.js
-swingjs/xml/JSSAXParser.js
-swingjs/xml/JSXMLGregorianCalendarImpl.js
-swingjs/xml/JSXMLInputFactory.js
-swingjs/xml/JSXMLStreamReader.js
+++ /dev/null
-com/stevesoft/pat/Boundary.js
-com/stevesoft/pat/Start.js
-intervalstore/api/IntervalI.js
-intervalstore/api/IntervalStoreI.js
-intervalstore/impl/BinarySearcher.js
-intervalstore/impl/IntervalStore.js
-intervalstore/impl/NCList.js
-intervalstore/impl/NCNode.js
-jalview/bin/JalviewTaskbar.js
-jalview/datamodel/AlignedCodonFrame.js
-jalview/ext/ensembl/EnsemblFeatures.js
-jalview/ext/ensembl/EnsemblLookup.js
-jalview/ext/ensembl/EnsemblSymbol.js
-jalview/ext/ensembl/EnsemblXref.js
-jalview/ext/ensembl/Species.js
-jalview/fts/api/StructureFTSRestClientI.js
-jalview/fts/service/threedbeacons/TDBeaconsFTSRestClient.js
-jalview/gui/APQHandlers.js
-jalview/gui/CrossRefAction.js
-jalview/gui/CutAndPasteTransfer.js
-jalview/gui/JvOptionPane.js
-jalview/gui/SplashScreen.js
-jalview/gui/structurechooser/PDBStructureChooserQuerySource.js
-jalview/gui/structurechooser/StructureChooserQuerySource.js
-jalview/gui/structurechooser/TDBResultAnalyser.js
-jalview/gui/structurechooser/ThreeDBStructureChooserQuerySource.js
-jalview/io/gff/SequenceOntologyFactory.js
-jalview/io/gff/SequenceOntologyI.js
-jalview/io/gff/SequenceOntologyLite.js
-jalview/jbgui/FilterOption.js
-jalview/jbgui/GCutAndPasteTransfer.js
-jalview/structure/AtomSpecModel.js
-jalview/structure/StructureCommand.js
-jalview/structure/StructureCommandI.js
-jalview/structure/StructureCommandsBase.js
-jalview/structure/StructureCommandsI.js
-jalview/util/ChannelProperties.js
-jalview/util/HttpUtils.js
-jalview/util/IntRangeComparator.js
-jalview/util/JSONUtils.js
-jalview/util/ShortcutKeyMaskExWrapper.js
-jalview/util/ShortcutKeyMaskExWrapper8.js
-jalview/util/ShortcutKeyMaskExWrapperI.js
-jalview/ws/SequenceFetcherFactory.js
-jalview/ws/dbsources/EBIAlfaFold.js
-jalview/ws/dbsources/EmblFlatfileSource.js
-jalview/ws/utils/UrlDownloadClient.js
-jalview/xml/binding/uniprot/InteractantType.js
-jalview/xml/binding/uniprot/MoleculeType.js
-jalview/xml/binding/uniprot/ReactionType.js
-java/applet/AppletContext.js
-java/applet/AppletStub.js
-java/applet/JSApplet.js
-java/awt/AWTEvent.js
-java/awt/AWTEventMulticaster.js
-java/awt/AWTKeyStroke.js
-java/awt/ActiveEvent.js
-java/awt/Adjustable.js
-java/awt/AlphaComposite.js
-java/awt/BasicStroke.js
-java/awt/BorderLayout.js
-java/awt/CardLayout.js
-java/awt/Color.js
-java/awt/Component.js
-java/awt/ComponentOrientation.js
-java/awt/Composite.js
-java/awt/Container.js
-java/awt/ContainerOrderFocusTraversalPolicy.js
-java/awt/Cursor.js
-java/awt/DefaultFocusTraversalPolicy.js
-java/awt/DefaultKeyboardFocusManager.js
-java/awt/Desktop.js
-java/awt/Dialog.js
-java/awt/Dimension.js
-java/awt/EventDispatchThread.js
-java/awt/EventFilter.js
-java/awt/EventQueue.js
-java/awt/EventQueueItem.js
-java/awt/FlowLayout.js
-java/awt/FocusTraversalPolicy.js
-java/awt/Font.js
-java/awt/FontMetrics.js
-java/awt/GraphicsCallback.js
-java/awt/GraphicsConfiguration.js
-java/awt/GraphicsDevice.js
-java/awt/GraphicsEnvironment.js
-java/awt/GridBagConstraints.js
-java/awt/GridBagLayout.js
-java/awt/GridBagLayoutInfo.js
-java/awt/GridLayout.js
-java/awt/Image.js
-java/awt/Insets.js
-java/awt/ItemSelectable.js
-java/awt/JSComponent.js
-java/awt/JSDialog.js
-java/awt/JSFrame.js
-java/awt/JSPanel.js
-java/awt/KeyEventDispatcher.js
-java/awt/KeyEventPostProcessor.js
-java/awt/KeyboardFocusManager.js
-java/awt/LayoutManager.js
-java/awt/LayoutManager2.js
-java/awt/LightweightDispatcher.js
-java/awt/Paint.js
-java/awt/Point.js
-java/awt/Queue.js
-java/awt/Rectangle.js
-java/awt/RenderingHints.js
-java/awt/SentEvent.js
-java/awt/Shape.js
-java/awt/Stroke.js
-java/awt/Taskbar.js
-java/awt/TextComponent.js
-java/awt/Toolkit.js
-java/awt/Transparency.js
-java/awt/VKCollection.js
-java/awt/Window.js
-java/awt/color/ColorSpace.js
-java/awt/datatransfer/ClipboardOwner.js
-java/awt/datatransfer/FlavorMap.js
-java/awt/datatransfer/FlavorTable.js
-java/awt/datatransfer/SystemFlavorMap.js
-java/awt/dnd/DropTarget.js
-java/awt/dnd/DropTargetContext.js
-java/awt/dnd/DropTargetListener.js
-java/awt/dnd/peer/DropTargetPeer.js
-java/awt/event/AWTEventListener.js
-java/awt/event/ActionEvent.js
-java/awt/event/ActionListener.js
-java/awt/event/AdjustmentEvent.js
-java/awt/event/AdjustmentListener.js
-java/awt/event/ComponentAdapter.js
-java/awt/event/ComponentEvent.js
-java/awt/event/ComponentListener.js
-java/awt/event/ContainerEvent.js
-java/awt/event/ContainerListener.js
-java/awt/event/FocusAdapter.js
-java/awt/event/FocusEvent.js
-java/awt/event/FocusListener.js
-java/awt/event/HierarchyBoundsListener.js
-java/awt/event/HierarchyEvent.js
-java/awt/event/HierarchyListener.js
-java/awt/event/InputEvent.js
-java/awt/event/InputMethodListener.js
-java/awt/event/InvocationEvent.js
-java/awt/event/ItemEvent.js
-java/awt/event/ItemListener.js
-java/awt/event/KeyAdapter.js
-java/awt/event/KeyEvent.js
-java/awt/event/KeyListener.js
-java/awt/event/MouseAdapter.js
-java/awt/event/MouseEvent.js
-java/awt/event/MouseListener.js
-java/awt/event/MouseMotionAdapter.js
-java/awt/event/MouseMotionListener.js
-java/awt/event/MouseWheelEvent.js
-java/awt/event/MouseWheelListener.js
-java/awt/event/TextListener.js
-java/awt/event/WindowAdapter.js
-java/awt/event/WindowEvent.js
-java/awt/event/WindowFocusListener.js
-java/awt/event/WindowListener.js
-java/awt/event/WindowStateListener.js
-java/awt/font/FontRenderContext.js
-java/awt/font/TextAttribute.js
-java/awt/geom/AffineTransform.js
-java/awt/geom/Dimension2D.js
-java/awt/geom/Path2D.js
-java/awt/geom/PathIterator.js
-java/awt/geom/Point2D.js
-java/awt/geom/RectIterator.js
-java/awt/geom/Rectangle2D.js
-java/awt/geom/RectangularShape.js
-java/awt/image/BufferedImage.js
-java/awt/image/ColorModel.js
-java/awt/image/DataBuffer.js
-java/awt/image/DataBufferInt.js
-java/awt/image/DirectColorModel.js
-java/awt/image/ImageConsumer.js
-java/awt/image/ImageObserver.js
-java/awt/image/ImageProducer.js
-java/awt/image/PackedColorModel.js
-java/awt/image/PixelGrabber.js
-java/awt/image/Raster.js
-java/awt/image/RenderedImage.js
-java/awt/image/SampleModel.js
-java/awt/image/SinglePixelPackedSampleModel.js
-java/awt/image/WritableRaster.js
-java/awt/peer/ComponentPeer.js
-java/awt/peer/ContainerPeer.js
-java/awt/peer/DialogPeer.js
-java/awt/peer/FramePeer.js
-java/awt/peer/KeyboardFocusManagerPeer.js
-java/awt/peer/LightweightPeer.js
-java/awt/peer/WindowPeer.js
-java/awt/print/Printable.js
-java/beans/ChangeListenerMap.js
-java/beans/PropertyChangeEvent.js
-java/beans/PropertyChangeListener.js
-java/beans/PropertyChangeSupport.js
-java/io/BufferedInputStream.js
-java/io/BufferedReader.js
-java/io/BufferedWriter.js
-java/io/ByteArrayInputStream.js
-java/io/ByteArrayOutputStream.js
-java/io/Closeable.js
-java/io/DataInput.js
-java/io/DataInputStream.js
-java/io/File.js
-java/io/FileDescriptor.js
-java/io/FileInputStream.js
-java/io/FileOutputStream.js
-java/io/FileReader.js
-java/io/FileSystem.js
-java/io/FilenameFilter.js
-java/io/FilterInputStream.js
-java/io/FilterOutputStream.js
-java/io/InputStream.js
-java/io/InputStreamReader.js
-java/io/ObjectStreamField.js
-java/io/OutputStream.js
-java/io/OutputStreamWriter.js
-java/io/PrintStream.js
-java/io/Reader.js
-java/io/StringReader.js
-java/io/StringWriter.js
-java/io/Writer.js
-java/lang/AbstractStringBuilder.js
-java/lang/AutoCloseable.js
-java/lang/Class.js
-java/lang/Enum.js
-java/lang/Iterable.js
-java/lang/Readable.js
-java/lang/Runtime.js
-java/lang/StringBuffer.js
-java/lang/StringBuilder.js
-java/lang/Thread.js
-java/lang/ThreadGroup.js
-java/lang/ThreadLocal.js
-java/lang/ref/ReferenceQueue.js
-java/lang/reflect/AccessibleObject.js
-java/lang/reflect/AnnotatedElement.js
-java/lang/reflect/Constructor.js
-java/lang/reflect/Method.js
-java/math/BigDecimal.js
-java/math/BigInteger.js
-java/math/MathContext.js
-java/math/RoundingMode.js
-java/net/ContentHandler.js
-java/net/HttpURLConnection.js
-java/net/URI.js
-java/net/URL.js
-java/net/URLConnection.js
-java/net/URLStreamHandler.js
-java/net/URLStreamHandlerFactory.js
-java/net/UnknownHostException.js
-java/nio/file/FileSystem.js
-java/nio/file/FileSystems.js
-java/nio/file/Path.js
-java/nio/file/Watchable.js
-java/nio/file/spi/FileSystemProvider.js
-java/security/AccessController.js
-java/security/PrivilegedAction.js
-java/security/PrivilegedExceptionAction.js
-java/text/AttributedCharacterIterator.js
-java/text/CharacterIterator.js
-java/text/DateFormat.js
-java/text/DateFormatSymbols.js
-java/text/DecimalFormat.js
-java/text/DecimalFormatSymbols.js
-java/text/DigitList.js
-java/text/FieldPosition.js
-java/text/Format.js
-java/text/MessageFormat.js
-java/text/NumberFormat.js
-java/text/SimpleDateFormat.js
-java/text/spi/BreakIteratorProvider.js
-java/text/spi/CollatorProvider.js
-java/text/spi/DateFormatProvider.js
-java/text/spi/DateFormatSymbolsProvider.js
-java/text/spi/DecimalFormatSymbolsProvider.js
-java/text/spi/NumberFormatProvider.js
-java/util/AbstractCollection.js
-java/util/AbstractList.js
-java/util/AbstractMap.js
-java/util/AbstractQueue.js
-java/util/AbstractSequentialList.js
-java/util/AbstractSet.js
-java/util/ArrayDeque.js
-java/util/ArrayList.js
-java/util/Arrays.js
-java/util/BitSet.js
-java/util/Calendar.js
-java/util/Collection.js
-java/util/Collections.js
-java/util/ComparableTimSort.js
-java/util/Comparator.js
-java/util/Deque.js
-java/util/Dictionary.js
-java/util/DualPivotQuicksort.js
-java/util/Enumeration.js
-java/util/EventListener.js
-java/util/EventObject.js
-java/util/Formatter.js
-java/util/GregorianCalendar.js
-java/util/HashMap.js
-java/util/HashSet.js
-java/util/Hashtable.js
-java/util/IdentityHashMap.js
-java/util/Iterator.js
-java/util/LinkedHashMap.js
-java/util/LinkedHashSet.js
-java/util/LinkedList.js
-java/util/List.js
-java/util/ListIterator.js
-java/util/Locale.js
-java/util/Map.js
-java/util/NavigableMap.js
-java/util/NavigableSet.js
-java/util/Objects.js
-java/util/Properties.js
-java/util/PropertyResourceBundle.js
-java/util/Queue.js
-java/util/Random.js
-java/util/RandomAccess.js
-java/util/RandomAccessSubList.js
-java/util/ResourceBundle.js
-java/util/ServiceLoader.js
-java/util/Set.js
-java/util/SortedMap.js
-java/util/SortedSet.js
-java/util/Stack.js
-java/util/StringTokenizer.js
-java/util/SubList.js
-java/util/TimSort.js
-java/util/TimeZone.js
-java/util/TreeMap.js
-java/util/TreeSet.js
-java/util/Vector.js
-java/util/WeakHashMap.js
-java/util/concurrent/AbstractExecutorService.js
-java/util/concurrent/BlockingQueue.js
-java/util/concurrent/ConcurrentHashMap.js
-java/util/concurrent/ConcurrentMap.js
-java/util/concurrent/Executor.js
-java/util/concurrent/ExecutorService.js
-java/util/concurrent/Executors.js
-java/util/concurrent/LinkedBlockingQueue.js
-java/util/concurrent/RejectedExecutionHandler.js
-java/util/concurrent/Semaphore.js
-java/util/concurrent/ThreadFactory.js
-java/util/concurrent/ThreadPoolExecutor.js
-java/util/concurrent/TimeUnit.js
-java/util/concurrent/atomic/AtomicInteger.js
-java/util/concurrent/locks/AbstractOwnableSynchronizer.js
-java/util/concurrent/locks/AbstractQueuedSynchronizer.js
-java/util/concurrent/locks/Condition.js
-java/util/concurrent/locks/Lock.js
-java/util/concurrent/locks/ReadWriteLock.js
-java/util/concurrent/locks/ReentrantLock.js
-java/util/concurrent/locks/ReentrantReadWriteLock.js
-java/util/jar/JarEntry.js
-java/util/jar/JarInputStream.js
-java/util/regex/MatchResult.js
-java/util/regex/Matcher.js
-java/util/regex/Pattern.js
-java/util/spi/CalendarDataProvider.js
-java/util/spi/CurrencyNameProvider.js
-java/util/spi/LocaleNameProvider.js
-java/util/spi/LocaleServiceProvider.js
-java/util/spi/TimeZoneNameProvider.js
-java/util/zip/CRC32.js
-java/util/zip/Inflater.js
-java/util/zip/InflaterInputStream.js
-java/util/zip/ZipConstants.js
-java/util/zip/ZipEntry.js
-java/util/zip/ZipInputStream.js
-javajs/api/BytePoster.js
-javajs/api/GenericCifDataParser.js
-javajs/api/GenericLineReader.js
-javajs/api/GenericOutputChannel.js
-javajs/api/JSONEncodable.js
-javajs/util/A4.js
-javajs/util/AU.js
-javajs/util/AjaxURLConnection.js
-javajs/util/AjaxURLStreamHandler.js
-javajs/util/AjaxURLStreamHandlerFactory.js
-javajs/util/BS.js
-javajs/util/Base64.js
-javajs/util/CU.js
-javajs/util/CifDataParser.js
-javajs/util/DF.js
-javajs/util/Encoding.js
-javajs/util/JSThread.js
-javajs/util/LimitedLineReader.js
-javajs/util/Lst.js
-javajs/util/M3.js
-javajs/util/M34.js
-javajs/util/M4.js
-javajs/util/OC.js
-javajs/util/P3.js
-javajs/util/P3i.js
-javajs/util/P4.js
-javajs/util/PT.js
-javajs/util/Rdr.js
-javajs/util/SB.js
-javajs/util/T3.js
-javajs/util/T3i.js
-javajs/util/T4.js
-javajs/util/V3.js
-javax/net/ssl/HttpsURLConnection.js
-javax/swing/AbstractAction.js
-javax/swing/AbstractButton.js
-javax/swing/AbstractListModel.js
-javax/swing/Action.js
-javax/swing/ActionMap.js
-javax/swing/AncestorNotifier.js
-javax/swing/ArrayTable.js
-javax/swing/Autoscroller.js
-javax/swing/BorderFactory.js
-javax/swing/BoundedRangeModel.js
-javax/swing/BoxLayout.js
-javax/swing/ButtonGroup.js
-javax/swing/ButtonModel.js
-javax/swing/CellRendererPane.js
-javax/swing/ClientPropertyKey.js
-javax/swing/ComboBoxEditor.js
-javax/swing/ComboBoxModel.js
-javax/swing/ComponentInputMap.js
-javax/swing/DefaultBoundedRangeModel.js
-javax/swing/DefaultButtonModel.js
-javax/swing/DefaultComboBoxModel.js
-javax/swing/DefaultDesktopManager.js
-javax/swing/DefaultListCellRenderer.js
-javax/swing/DefaultListSelectionModel.js
-javax/swing/DefaultRowSorter.js
-javax/swing/DefaultSingleSelectionModel.js
-javax/swing/DesktopManager.js
-javax/swing/DropMode.js
-javax/swing/FocusManager.js
-javax/swing/Icon.js
-javax/swing/ImageIcon.js
-javax/swing/InputMap.js
-javax/swing/InternalFrameFocusTraversalPolicy.js
-javax/swing/JApplet.js
-javax/swing/JButton.js
-javax/swing/JCheckBox.js
-javax/swing/JCheckBoxMenuItem.js
-javax/swing/JComboBox.js
-javax/swing/JComponent.js
-javax/swing/JDesktopPane.js
-javax/swing/JDialog.js
-javax/swing/JFrame.js
-javax/swing/JInternalFrame.js
-javax/swing/JLabel.js
-javax/swing/JLayeredPane.js
-javax/swing/JList.js
-javax/swing/JMenu.js
-javax/swing/JMenuBar.js
-javax/swing/JMenuItem.js
-javax/swing/JOptionPane.js
-javax/swing/JPanel.js
-javax/swing/JPopupMenu.js
-javax/swing/JProgressBar.js
-javax/swing/JRadioButtonMenuItem.js
-javax/swing/JRootPane.js
-javax/swing/JScrollBar.js
-javax/swing/JScrollPane.js
-javax/swing/JSeparator.js
-javax/swing/JTabbedPane.js
-javax/swing/JTable.js
-javax/swing/JTextArea.js
-javax/swing/JTextField.js
-javax/swing/JToggleButton.js
-javax/swing/JToolTip.js
-javax/swing/JViewport.js
-javax/swing/JWindow.js
-javax/swing/KeyStroke.js
-javax/swing/KeyboardManager.js
-javax/swing/LayoutComparator.js
-javax/swing/LayoutFocusTraversalPolicy.js
-javax/swing/ListCellRenderer.js
-javax/swing/ListModel.js
-javax/swing/ListSelectionModel.js
-javax/swing/LookAndFeel.js
-javax/swing/MenuElement.js
-javax/swing/MenuSelectionManager.js
-javax/swing/MutableComboBoxModel.js
-javax/swing/Popup.js
-javax/swing/PopupFactory.js
-javax/swing/RepaintManager.js
-javax/swing/RootPaneContainer.js
-javax/swing/RowSorter.js
-javax/swing/ScrollPaneConstants.js
-javax/swing/ScrollPaneLayout.js
-javax/swing/Scrollable.js
-javax/swing/SingleSelectionModel.js
-javax/swing/SizeRequirements.js
-javax/swing/SortOrder.js
-javax/swing/SortingFocusTraversalPolicy.js
-javax/swing/SwingConstants.js
-javax/swing/SwingContainerOrderFocusTraversalPolicy.js
-javax/swing/SwingDefaultFocusTraversalPolicy.js
-javax/swing/SwingPaintEventDispatcher.js
-javax/swing/SwingUtilities.js
-javax/swing/Timer.js
-javax/swing/ToolTipManager.js
-javax/swing/TransferHandler.js
-javax/swing/UIDefaults.js
-javax/swing/UIManager.js
-javax/swing/ViewportLayout.js
-javax/swing/WindowConstants.js
-javax/swing/border/AbstractBorder.js
-javax/swing/border/BevelBorder.js
-javax/swing/border/Border.js
-javax/swing/border/CompoundBorder.js
-javax/swing/border/EmptyBorder.js
-javax/swing/border/EtchedBorder.js
-javax/swing/border/LineBorder.js
-javax/swing/event/AncestorEvent.js
-javax/swing/event/AncestorListener.js
-javax/swing/event/CaretEvent.js
-javax/swing/event/CaretListener.js
-javax/swing/event/CellEditorListener.js
-javax/swing/event/ChangeEvent.js
-javax/swing/event/ChangeListener.js
-javax/swing/event/DocumentEvent.js
-javax/swing/event/DocumentListener.js
-javax/swing/event/EventListenerList.js
-javax/swing/event/HyperlinkListener.js
-javax/swing/event/InternalFrameAdapter.js
-javax/swing/event/InternalFrameEvent.js
-javax/swing/event/InternalFrameListener.js
-javax/swing/event/ListDataEvent.js
-javax/swing/event/ListDataListener.js
-javax/swing/event/ListSelectionEvent.js
-javax/swing/event/ListSelectionListener.js
-javax/swing/event/MenuEvent.js
-javax/swing/event/MenuKeyListener.js
-javax/swing/event/MenuListener.js
-javax/swing/event/MouseInputListener.js
-javax/swing/event/RowSorterEvent.js
-javax/swing/event/RowSorterListener.js
-javax/swing/event/SwingPropertyChangeSupport.js
-javax/swing/event/TableColumnModelEvent.js
-javax/swing/event/TableColumnModelListener.js
-javax/swing/event/TableModelEvent.js
-javax/swing/event/TableModelListener.js
-javax/swing/event/UndoableEditEvent.js
-javax/swing/event/UndoableEditListener.js
-javax/swing/plaf/ActionMapUIResource.js
-javax/swing/plaf/BorderUIResource.js
-javax/swing/plaf/ColorUIResource.js
-javax/swing/plaf/ComponentInputMapUIResource.js
-javax/swing/plaf/ComponentUI.js
-javax/swing/plaf/DimensionUIResource.js
-javax/swing/plaf/FontUIResource.js
-javax/swing/plaf/InputMapUIResource.js
-javax/swing/plaf/InsetsUIResource.js
-javax/swing/plaf/UIResource.js
-javax/swing/plaf/basic/BasicBorders.js
-javax/swing/plaf/basic/BasicGraphicsUtils.js
-javax/swing/table/AbstractTableModel.js
-javax/swing/table/DefaultTableCellRenderer.js
-javax/swing/table/DefaultTableColumnModel.js
-javax/swing/table/DefaultTableModel.js
-javax/swing/table/JTableHeader.js
-javax/swing/table/TableCellRenderer.js
-javax/swing/table/TableColumn.js
-javax/swing/table/TableColumnModel.js
-javax/swing/table/TableModel.js
-javax/swing/table/TableRowSorter.js
-javax/swing/text/AbstractDocument.js
-javax/swing/text/AttributeSet.js
-javax/swing/text/BoxView.js
-javax/swing/text/Caret.js
-javax/swing/text/CompositeView.js
-javax/swing/text/DefaultCaret.js
-javax/swing/text/DefaultEditorKit.js
-javax/swing/text/Document.js
-javax/swing/text/EditorKit.js
-javax/swing/text/Element.js
-javax/swing/text/GapContent.js
-javax/swing/text/GapVector.js
-javax/swing/text/JTextComponent.js
-javax/swing/text/MutableAttributeSet.js
-javax/swing/text/PlainDocument.js
-javax/swing/text/PlainView.js
-javax/swing/text/Position.js
-javax/swing/text/Segment.js
-javax/swing/text/SegmentCache.js
-javax/swing/text/SimpleAttributeSet.js
-javax/swing/text/Style.js
-javax/swing/text/StyleConstants.js
-javax/swing/text/StyleContext.js
-javax/swing/text/TabExpander.js
-javax/swing/text/TextAction.js
-javax/swing/text/Utilities.js
-javax/swing/text/View.js
-javax/swing/text/WrappedPlainView.js
-javax/swing/tree/TreeNode.js
-javax/swing/undo/AbstractUndoableEdit.js
-javax/swing/undo/CompoundEdit.js
-javax/swing/undo/UndoableEdit.js
-javax/xml/bind/ContextFinder.js
-javax/xml/bind/GetPropertyAction.js
-javax/xml/bind/JAXBContext.js
-javax/xml/bind/JAXBContextFactory.js
-javax/xml/bind/JAXBElement.js
-javax/xml/bind/ModuleUtil.js
-javax/xml/bind/ServiceLoaderUtil.js
-javax/xml/bind/Unmarshaller.js
-javax/xml/bind/ValidationEventHandler.js
-javax/xml/bind/annotation/adapters/CollapsedStringAdapter.js
-javax/xml/bind/annotation/adapters/XmlAdapter.js
-javax/xml/bind/helpers/AbstractUnmarshallerImpl.js
-javax/xml/bind/helpers/DefaultValidationEventHandler.js
-javax/xml/datatype/XMLGregorianCalendar.js
-javax/xml/namespace/QName.js
-javax/xml/stream/XMLInputFactory.js
-javax/xml/stream/XMLStreamConstants.js
-javax/xml/stream/XMLStreamReader.js
-net/miginfocom/layout/AC.js
-net/miginfocom/layout/AnimSpec.js
-net/miginfocom/layout/BoundSize.js
-net/miginfocom/layout/CC.js
-net/miginfocom/layout/ComponentWrapper.js
-net/miginfocom/layout/ConstraintParser.js
-net/miginfocom/layout/ContainerWrapper.js
-net/miginfocom/layout/DimConstraint.js
-net/miginfocom/layout/Grid.js
-net/miginfocom/layout/LC.js
-net/miginfocom/layout/LayoutUtil.js
-net/miginfocom/layout/LinkHandler.js
-net/miginfocom/layout/PlatformDefaults.js
-net/miginfocom/layout/ResizeConstraint.js
-net/miginfocom/layout/UnitValue.js
-net/miginfocom/swing/MigLayout.js
-net/miginfocom/swing/SwingComponentWrapper.js
-net/miginfocom/swing/SwingContainerWrapper.js
-org/apache/xerces/jaxp/datatype/XMLGregorianCalendarImpl.js
-org/jmol/adapter/readers/cif/CifReader.js
-org/jmol/adapter/readers/cif/MMCifReader.js
-org/jmol/adapter/readers/pdb/PdbReader.js
-org/jmol/adapter/smarter/Atom.js
-org/jmol/adapter/smarter/AtomIterator.js
-org/jmol/adapter/smarter/AtomSetCollection.js
-org/jmol/adapter/smarter/AtomSetCollectionReader.js
-org/jmol/adapter/smarter/AtomSetObject.js
-org/jmol/adapter/smarter/Bond.js
-org/jmol/adapter/smarter/BondIterator.js
-org/jmol/adapter/smarter/Resolver.js
-org/jmol/adapter/smarter/SmarterJmolAdapter.js
-org/jmol/adapter/smarter/Structure.js
-org/jmol/adapter/smarter/StructureIterator.js
-org/jmol/api/AtomIndexIterator.js
-org/jmol/api/EventManager.js
-org/jmol/api/FontManager.js
-org/jmol/api/GenericFileInterface.js
-org/jmol/api/GenericMouseInterface.js
-org/jmol/api/GenericPlatform.js
-org/jmol/api/Interface.js
-org/jmol/api/JmolAdapter.js
-org/jmol/api/JmolAdapterAtomIterator.js
-org/jmol/api/JmolAdapterBondIterator.js
-org/jmol/api/JmolAdapterStructureIterator.js
-org/jmol/api/JmolCallbackListener.js
-org/jmol/api/JmolFilesReaderInterface.js
-org/jmol/api/JmolGraphicsInterface.js
-org/jmol/api/JmolMeasurementClient.js
-org/jmol/api/JmolRendererInterface.js
-org/jmol/api/JmolRepaintManager.js
-org/jmol/api/JmolScriptEvaluator.js
-org/jmol/api/JmolScriptFunction.js
-org/jmol/api/JmolScriptManager.js
-org/jmol/api/JmolSelectionListener.js
-org/jmol/api/JmolStatusListener.js
-org/jmol/api/JmolViewer.js
-org/jmol/api/PlatformViewer.js
-org/jmol/api/SymmetryInterface.js
-org/jmol/api/Translator.js
-org/jmol/atomdata/AtomDataServer.js
-org/jmol/atomdata/RadiusData.js
-org/jmol/awt/AwtFile.js
-org/jmol/awt/AwtFont.js
-org/jmol/awt/Display.js
-org/jmol/awt/Image.js
-org/jmol/awt/Mouse.js
-org/jmol/awt/Platform.js
-org/jmol/bspt/Bspf.js
-org/jmol/bspt/Bspt.js
-org/jmol/bspt/CubeIterator.js
-org/jmol/bspt/Element.js
-org/jmol/bspt/Leaf.js
-org/jmol/bspt/Node.js
-org/jmol/c/CBK.js
-org/jmol/c/FIL.js
-org/jmol/c/PAL.js
-org/jmol/c/STER.js
-org/jmol/c/STR.js
-org/jmol/c/VDW.js
-org/jmol/dssx/Bridge.js
-org/jmol/dssx/DSSP.js
-org/jmol/g3d/CylinderRenderer.js
-org/jmol/g3d/G3DRenderer.js
-org/jmol/g3d/Graphics3D.js
-org/jmol/g3d/HermiteRenderer.js
-org/jmol/g3d/LineRenderer.js
-org/jmol/g3d/Pixelator.js
-org/jmol/g3d/Platform3D.js
-org/jmol/g3d/PrecisionRenderer.js
-org/jmol/g3d/SphereRenderer.js
-org/jmol/g3d/TextRenderer.js
-org/jmol/g3d/TextString.js
-org/jmol/g3d/TriangleRenderer.js
-org/jmol/i18n/GT.js
-org/jmol/i18n/Language.js
-org/jmol/i18n/Resource.js
-org/jmol/io/FileReader.js
-org/jmol/io/FilesReader.js
-org/jmol/modelset/Atom.js
-org/jmol/modelset/AtomCollection.js
-org/jmol/modelset/AtomIteratorWithinModel.js
-org/jmol/modelset/Bond.js
-org/jmol/modelset/BondCollection.js
-org/jmol/modelset/BondIterator.js
-org/jmol/modelset/BondIteratorSelected.js
-org/jmol/modelset/Chain.js
-org/jmol/modelset/Group.js
-org/jmol/modelset/HBond.js
-org/jmol/modelset/LabelToken.js
-org/jmol/modelset/Measurement.js
-org/jmol/modelset/MeasurementData.js
-org/jmol/modelset/MeasurementPending.js
-org/jmol/modelset/Model.js
-org/jmol/modelset/ModelLoader.js
-org/jmol/modelset/ModelSet.js
-org/jmol/modelset/Orientation.js
-org/jmol/modelset/Structure.js
-org/jmol/modelset/Text.js
-org/jmol/modelset/TickInfo.js
-org/jmol/modelsetbio/AlphaMonomer.js
-org/jmol/modelsetbio/AlphaPolymer.js
-org/jmol/modelsetbio/AminoMonomer.js
-org/jmol/modelsetbio/AminoPolymer.js
-org/jmol/modelsetbio/BioModel.js
-org/jmol/modelsetbio/BioModelSet.js
-org/jmol/modelsetbio/BioPolymer.js
-org/jmol/modelsetbio/BioResolver.js
-org/jmol/modelsetbio/Helix.js
-org/jmol/modelsetbio/Monomer.js
-org/jmol/modelsetbio/ProteinStructure.js
-org/jmol/modelsetbio/Sheet.js
-org/jmol/modelsetbio/Turn.js
-org/jmol/render/BallsRenderer.js
-org/jmol/render/BbcageRenderer.js
-org/jmol/render/CageRenderer.js
-org/jmol/render/FontLineShapeRenderer.js
-org/jmol/render/FrankRenderer.js
-org/jmol/render/HoverRenderer.js
-org/jmol/render/LabelsRenderer.js
-org/jmol/render/MeasuresRenderer.js
-org/jmol/render/RepaintManager.js
-org/jmol/render/ShapeRenderer.js
-org/jmol/render/SticksRenderer.js
-org/jmol/render/TextRenderer.js
-org/jmol/render/UccageRenderer.js
-org/jmol/renderbio/BioShapeRenderer.js
-org/jmol/renderbio/CartoonRenderer.js
-org/jmol/renderbio/RocketsRenderer.js
-org/jmol/renderbio/StrandsRenderer.js
-org/jmol/script/ContextToken.js
-org/jmol/script/SV.js
-org/jmol/script/ScriptCompiler.js
-org/jmol/script/ScriptContext.js
-org/jmol/script/ScriptError.js
-org/jmol/script/ScriptEval.js
-org/jmol/script/ScriptExpr.js
-org/jmol/script/ScriptFlowContext.js
-org/jmol/script/ScriptFunction.js
-org/jmol/script/ScriptManager.js
-org/jmol/script/ScriptMathProcessor.js
-org/jmol/script/ScriptParam.js
-org/jmol/script/ScriptQueueThread.js
-org/jmol/script/ScriptTokenParser.js
-org/jmol/script/T.js
-org/jmol/scriptext/CmdExt.js
-org/jmol/scriptext/MathExt.js
-org/jmol/scriptext/ScriptExt.js
-org/jmol/shape/AtomShape.js
-org/jmol/shape/Balls.js
-org/jmol/shape/Bbcage.js
-org/jmol/shape/Echo.js
-org/jmol/shape/FontLineShape.js
-org/jmol/shape/Frank.js
-org/jmol/shape/Hover.js
-org/jmol/shape/Labels.js
-org/jmol/shape/Measures.js
-org/jmol/shape/Mesh.js
-org/jmol/shape/Shape.js
-org/jmol/shape/Sticks.js
-org/jmol/shape/TextShape.js
-org/jmol/shape/Uccage.js
-org/jmol/shapebio/BioShape.js
-org/jmol/shapebio/BioShapeCollection.js
-org/jmol/shapebio/Cartoon.js
-org/jmol/shapebio/Rockets.js
-org/jmol/symmetry/Symmetry.js
-org/jmol/symmetry/SymmetryInfo.js
-org/jmol/symmetry/UnitCell.js
-org/jmol/thread/HoverWatcherThread.js
-org/jmol/thread/JmolThread.js
-org/jmol/thread/TimeoutThread.js
-org/jmol/util/BSUtil.js
-org/jmol/util/BoxInfo.js
-org/jmol/util/C.js
-org/jmol/util/ColorEncoder.js
-org/jmol/util/CommandHistory.js
-org/jmol/util/DefaultLogger.js
-org/jmol/util/Edge.js
-org/jmol/util/Elements.js
-org/jmol/util/Escape.js
-org/jmol/util/Font.js
-org/jmol/util/GData.js
-org/jmol/util/Geodesic.js
-org/jmol/util/Int2IntHash.js
-org/jmol/util/Int2IntHashEntry.js
-org/jmol/util/Logger.js
-org/jmol/util/LoggerInterface.js
-org/jmol/util/MeshSurface.js
-org/jmol/util/Node.js
-org/jmol/util/Normix.js
-org/jmol/util/Point3fi.js
-org/jmol/util/Rectangle.js
-org/jmol/util/Rgb16.js
-org/jmol/util/Shader.js
-org/jmol/util/SimpleEdge.js
-org/jmol/util/SimpleNode.js
-org/jmol/util/SimpleUnitCell.js
-org/jmol/util/TempArray.js
-org/jmol/viewer/ActionManager.js
-org/jmol/viewer/AnimationManager.js
-org/jmol/viewer/ColorManager.js
-org/jmol/viewer/FileManager.js
-org/jmol/viewer/Gesture.js
-org/jmol/viewer/GlobalSettings.js
-org/jmol/viewer/JC.js
-org/jmol/viewer/ModelManager.js
-org/jmol/viewer/MotionPoint.js
-org/jmol/viewer/MouseState.js
-org/jmol/viewer/SelectionManager.js
-org/jmol/viewer/ShapeManager.js
-org/jmol/viewer/StateManager.js
-org/jmol/viewer/StatusManager.js
-org/jmol/viewer/TransformManager.js
-org/jmol/viewer/Viewer.js
-org/jmol/viewer/binding/Binding.js
-org/jmol/viewer/binding/JmolBinding.js
-org/json/simple/parser/ParseException.js
-org/xml/sax/AttributeList.js
-org/xml/sax/Attributes.js
-org/xml/sax/ContentHandler.js
-org/xml/sax/InputSource.js
-org/xml/sax/Parser.js
-org/xml/sax/XMLReader.js
-org/xml/sax/ext/Attributes2.js
-sun/awt/AWTAutoShutdown.js
-sun/awt/AppContext.js
-sun/awt/CausedFocusEvent.js
-sun/awt/ComponentFactory.js
-sun/awt/EventQueueItem.js
-sun/awt/MostRecentKeyValue.js
-sun/awt/MostRecentThreadAppContext.js
-sun/awt/PaintEventDispatcher.js
-sun/awt/PostEventQueue.js
-sun/awt/RequestFocusController.js
-sun/awt/SunGraphicsCallback.js
-sun/awt/SunToolkit.js
-sun/awt/image/DataStealer.js
-sun/awt/image/IntegerComponentRaster.js
-sun/awt/image/IntegerInterleavedRaster.js
-sun/awt/image/OffScreenImageSource.js
-sun/awt/image/SunWritableRaster.js
-sun/font/AttributeValues.js
-sun/font/EAttribute.js
-sun/font/FontDesignMetrics.js
-sun/java2d/StateTrackable.js
-sun/java2d/StateTrackableDelegate.js
-sun/net/www/MessageHeader.js
-sun/swing/DefaultLookup.js
-sun/swing/StringUIClientPropertyKey.js
-sun/swing/SwingLazyValue.js
-sun/swing/SwingUtilities2.js
-sun/swing/UIAction.js
-sun/swing/UIClientPropertyKey.js
-sun/swing/table/DefaultTableCellHeaderRenderer.js
-sun/text/resources/FormatData.js
-sun/text/resources/en/FormatData_en.js
-sun/text/resources/en/FormatData_en_GB.js
-sun/text/resources/en/FormatData_en_US.js
-sun/util/calendar/AbstractCalendar.js
-sun/util/calendar/BaseCalendar.js
-sun/util/calendar/CalendarDate.js
-sun/util/calendar/CalendarSystem.js
-sun/util/calendar/CalendarUtils.js
-sun/util/calendar/Gregorian.js
-sun/util/calendar/ZoneInfo.js
-sun/util/calendar/ZoneInfoFile.js
-sun/util/locale/BaseLocale.js
-sun/util/locale/LanguageTag.js
-sun/util/locale/LocaleUtils.js
-sun/util/locale/provider/AuxLocaleProviderAdapter.js
-sun/util/locale/provider/AvailableLanguageTags.js
-sun/util/locale/provider/CalendarDataProviderImpl.js
-sun/util/locale/provider/CalendarDataUtility.js
-sun/util/locale/provider/CalendarProviderImpl.js
-sun/util/locale/provider/DateFormatProviderImpl.js
-sun/util/locale/provider/JRELocaleProviderAdapter.js
-sun/util/locale/provider/LocaleDataMetaInfo.js
-sun/util/locale/provider/LocaleProviderAdapter.js
-sun/util/locale/provider/LocaleResources.js
-sun/util/locale/provider/LocaleServiceProviderPool.js
-sun/util/locale/provider/ResourceBundleBasedAdapter.js
-sun/util/locale/provider/SPILocaleProviderAdapter.js
-sun/util/resources/LocaleData.js
-sun/util/resources/ParallelListResourceBundle.js
-sun/util/spi/CalendarProvider.js
-swingjs/JSApp.js
-swingjs/JSAppletThread.js
-swingjs/JSAppletViewer.js
-swingjs/JSDummyApplet.js
-swingjs/JSFileSystem.js
-swingjs/JSFocusPeer.js
-swingjs/JSFontMetrics.js
-swingjs/JSFrameViewer.js
-swingjs/JSGraphics2D.js
-swingjs/JSGraphicsConfiguration.js
-swingjs/JSGraphicsEnvironment.js
-swingjs/JSImage.js
-swingjs/JSImagekit.js
-swingjs/JSKeyEvent.js
-swingjs/JSMenuManager.js
-swingjs/JSMouse.js
-swingjs/JSScreenDevice.js
-swingjs/JSThreadGroup.js
-swingjs/JSToolkit.js
-swingjs/JSUtil.js
-swingjs/a2s/A2SContainer.js
-swingjs/a2s/Dialog.js
-swingjs/api/Interface.js
-swingjs/api/JSUtilI.js
-swingjs/api/js/DOMNode.js
-swingjs/api/js/HTML5Canvas.js
-swingjs/api/js/HTML5CanvasContext2D.js
-swingjs/api/js/JSFunction.js
-swingjs/api/js/JSInterface.js
-swingjs/jquery/JQueryUI.js
-swingjs/json/JSON.js
-swingjs/jzlib/Adler32.js
-swingjs/jzlib/CRC32.js
-swingjs/jzlib/Checksum.js
-swingjs/jzlib/InfBlocks.js
-swingjs/jzlib/InfCodes.js
-swingjs/jzlib/InfTree.js
-swingjs/jzlib/Inflate.js
-swingjs/jzlib/Inflater.js
-swingjs/jzlib/InflaterInputStream.js
-swingjs/jzlib/ZStream.js
-swingjs/plaf/BasicComboBoxEditor.js
-swingjs/plaf/BasicComboBoxRenderer.js
-swingjs/plaf/BasicHTML.js
-swingjs/plaf/ButtonListener.js
-swingjs/plaf/CellHolder.js
-swingjs/plaf/DefaultMenuLayout.js
-swingjs/plaf/HTML5LookAndFeel.js
-swingjs/plaf/JSAppletUI.js
-swingjs/plaf/JSButtonUI.js
-swingjs/plaf/JSCheckBoxMenuItemUI.js
-swingjs/plaf/JSCheckBoxUI.js
-swingjs/plaf/JSComboBoxUI.js
-swingjs/plaf/JSComboPopupList.js
-swingjs/plaf/JSComponentUI.js
-swingjs/plaf/JSDesktopIconUI.js
-swingjs/plaf/JSDesktopPaneUI.js
-swingjs/plaf/JSDialogUI.js
-swingjs/plaf/JSEventHandler.js
-swingjs/plaf/JSFrameUI.js
-swingjs/plaf/JSGraphicsUtils.js
-swingjs/plaf/JSInternalFrameUI.js
-swingjs/plaf/JSLabelUI.js
-swingjs/plaf/JSLayeredPaneUI.js
-swingjs/plaf/JSLightweightUI.js
-swingjs/plaf/JSListUI.js
-swingjs/plaf/JSMenuBarUI.js
-swingjs/plaf/JSMenuItemUI.js
-swingjs/plaf/JSMenuUI.js
-swingjs/plaf/JSOptionPaneUI.js
-swingjs/plaf/JSPanelUI.js
-swingjs/plaf/JSPopupMenuSeparatorUI.js
-swingjs/plaf/JSPopupMenuUI.js
-swingjs/plaf/JSPopupUI.js
-swingjs/plaf/JSProgressBarUI.js
-swingjs/plaf/JSRadioButtonMenuItemUI.js
-swingjs/plaf/JSRadioButtonUI.js
-swingjs/plaf/JSRootPaneUI.js
-swingjs/plaf/JSScrollBarUI.js
-swingjs/plaf/JSScrollPaneUI.js
-swingjs/plaf/JSSeparatorUI.js
-swingjs/plaf/JSSliderUI.js
-swingjs/plaf/JSTabbedPaneUI.js
-swingjs/plaf/JSTableHeaderUI.js
-swingjs/plaf/JSTableUI.js
-swingjs/plaf/JSTextAreaUI.js
-swingjs/plaf/JSTextFieldUI.js
-swingjs/plaf/JSTextUI.js
-swingjs/plaf/JSToolTipUI.js
-swingjs/plaf/JSViewportUI.js
-swingjs/plaf/JSWindowUI.js
-swingjs/plaf/LazyActionMap.js
-swingjs/plaf/Resizer.js
-swingjs/plaf/TextListener.js
-swingjs/xml/JSJAXBClass.js
-swingjs/xml/JSJAXBContext.js
-swingjs/xml/JSJAXBContextFactory.js
-swingjs/xml/JSJAXBField.js
-swingjs/xml/JSJAXBUnmarshaller.js
-swingjs/xml/JSSAXAttributes.js
-swingjs/xml/JSSAXParser.js
-swingjs/xml/JSXMLGregorianCalendarImpl.js
-swingjs/xml/JSXMLInputFactory.js
-swingjs/xml/JSXMLStreamReader.js
serverURL: 'https://chemapps.stolaf.edu/jmol/jsmol/php/jsmol.php',
j2sPath: 'swingjs/j2s',
console:'sysoutdiv',
- allowjavascript: true
+ allowjavascript: true,
+ namespace: ""
}
</script>
</head>
--- /dev/null
+HEADER 01-JUN-22
+TITLE ALPHAFOLD MONOMER V2.0 PREDICTION FOR FERREDOXIN-1, CHLOROPLASTIC
+TITLE 2 (P00221)
+COMPND MOL_ID: 1;
+COMPND 2 MOLECULE: FERREDOXIN-1, CHLOROPLASTIC;
+COMPND 3 CHAIN: A
+SOURCE MOL_ID: 1;
+SOURCE 2 ORGANISM_SCIENTIFIC: SPINACIA OLERACEA;
+SOURCE 3 ORGANISM_TAXID: 3562
+REMARK 1
+REMARK 1 REFERENCE 1
+REMARK 1 AUTH JOHN JUMPER, RICHARD EVANS, ALEXANDER PRITZEL, TIM GREEN,
+REMARK 1 AUTH 2 MICHAEL FIGURNOV, OLAF RONNEBERGER, KATHRYN TUNYASUVUNAKOOL,
+REMARK 1 AUTH 3 RUSS BATES, AUGUSTIN ZIDEK, ANNA POTAPENKO, ALEX BRIDGLAND,
+REMARK 1 AUTH 4 CLEMENS MEYER, SIMON A A KOHL, ANDREW J BALLARD,
+REMARK 1 AUTH 5 ANDREW COWIE, BERNARDINO ROMERA-PAREDES, STANISLAV NIKOLOV,
+REMARK 1 AUTH 6 RISHUB JAIN, JONAS ADLER, TREVOR BACK, STIG PETERSEN,
+REMARK 1 AUTH 7 DAVID REIMAN, ELLEN CLANCY, MICHAL ZIELINSKI,
+REMARK 1 AUTH 8 MARTIN STEINEGGER, MICHALINA PACHOLSKA, TAMAS BERGHAMMER,
+REMARK 1 AUTH 9 DAVID SILVER, ORIOL VINYALS, ANDREW W SENIOR,
+REMARK 1 AUTH10 KORAY KAVUKCUOGLU, PUSHMEET KOHLI, DEMIS HASSABIS
+REMARK 1 TITL HIGHLY ACCURATE PROTEIN STRUCTURE PREDICTION WITH ALPHAFOLD
+REMARK 1 REF NATURE V. 596 583 2021
+REMARK 1 REFN ISSN 0028-0836
+REMARK 1 PMID 34265844
+REMARK 1 DOI 10.1038/s41586-021-03819-2
+REMARK 1
+REMARK 1 DISCLAIMERS
+REMARK 1 ALPHAFOLD DATA, COPYRIGHT (2021) DEEPMIND TECHNOLOGIES LIMITED. THE
+REMARK 1 INFORMATION PROVIDED IS THEORETICAL MODELLING ONLY AND CAUTION SHOULD
+REMARK 1 BE EXERCISED IN ITS USE. IT IS PROVIDED "AS-IS" WITHOUT ANY WARRANTY
+REMARK 1 OF ANY KIND, WHETHER EXPRESSED OR IMPLIED. NO WARRANTY IS GIVEN THAT
+REMARK 1 USE OF THE INFORMATION SHALL NOT INFRINGE THE RIGHTS OF ANY THIRD
+REMARK 1 PARTY. THE INFORMATION IS NOT INTENDED TO BE A SUBSTITUTE FOR
+REMARK 1 PROFESSIONAL MEDICAL ADVICE, DIAGNOSIS, OR TREATMENT, AND DOES NOT
+REMARK 1 CONSTITUTE MEDICAL OR OTHER PROFESSIONAL ADVICE. IT IS AVAILABLE FOR
+REMARK 1 ACADEMIC AND COMMERCIAL PURPOSES, UNDER CC-BY 4.0 LICENCE.
+DBREF XXXX A 1 147 UNP P00221 FER1_SPIOL 1 147
+SEQRES 1 A 147 MET ALA ALA THR THR THR THR MET MET GLY MET ALA THR
+SEQRES 2 A 147 THR PHE VAL PRO LYS PRO GLN ALA PRO PRO MET MET ALA
+SEQRES 3 A 147 ALA LEU PRO SER ASN THR GLY ARG SER LEU PHE GLY LEU
+SEQRES 4 A 147 LYS THR GLY SER ARG GLY GLY ARG MET THR MET ALA ALA
+SEQRES 5 A 147 TYR LYS VAL THR LEU VAL THR PRO THR GLY ASN VAL GLU
+SEQRES 6 A 147 PHE GLN CYS PRO ASP ASP VAL TYR ILE LEU ASP ALA ALA
+SEQRES 7 A 147 GLU GLU GLU GLY ILE ASP LEU PRO TYR SER CYS ARG ALA
+SEQRES 8 A 147 GLY SER CYS SER SER CYS ALA GLY LYS LEU LYS THR GLY
+SEQRES 9 A 147 SER LEU ASN GLN ASP ASP GLN SER PHE LEU ASP ASP ASP
+SEQRES 10 A 147 GLN ILE ASP GLU GLY TRP VAL LEU THR CYS ALA ALA TYR
+SEQRES 11 A 147 PRO VAL SER ASP VAL THR ILE GLU THR HIS LYS GLU GLU
+SEQRES 12 A 147 GLU LEU THR ALA
+CRYST1 1.000 1.000 1.000 90.00 90.00 90.00 P 1 1
+ORIGX1 1.000000 0.000000 0.000000 0.00000
+ORIGX2 0.000000 1.000000 0.000000 0.00000
+ORIGX3 0.000000 0.000000 1.000000 0.00000
+SCALE1 1.000000 0.000000 0.000000 0.00000
+SCALE2 0.000000 1.000000 0.000000 0.00000
+SCALE3 0.000000 0.000000 1.000000 0.00000
+MODEL 1
+ATOM 1 N MET A 1 -39.014 9.370 -46.392 1.00 56.42 N
+ATOM 2 CA MET A 1 -38.101 9.939 -47.404 1.00 56.42 C
+ATOM 3 C MET A 1 -37.586 11.272 -46.873 1.00 56.42 C
+ATOM 4 CB MET A 1 -38.814 10.144 -48.758 1.00 56.42 C
+ATOM 5 O MET A 1 -38.287 12.259 -47.001 1.00 56.42 O
+ATOM 6 CG MET A 1 -39.336 8.853 -49.398 1.00 56.42 C
+ATOM 7 SD MET A 1 -40.197 9.160 -50.960 1.00 56.42 S
+ATOM 8 CE MET A 1 -40.798 7.495 -51.352 1.00 56.42 C
+ATOM 9 N ALA A 2 -36.441 11.282 -46.191 1.00 52.97 N
+ATOM 10 CA ALA A 2 -35.633 12.474 -45.908 1.00 52.97 C
+ATOM 11 C ALA A 2 -34.298 11.969 -45.346 1.00 52.97 C
+ATOM 12 CB ALA A 2 -36.323 13.418 -44.914 1.00 52.97 C
+ATOM 13 O ALA A 2 -34.277 11.276 -44.333 1.00 52.97 O
+ATOM 14 N ALA A 3 -33.226 12.210 -46.094 1.00 60.41 N
+ATOM 15 CA ALA A 3 -31.889 11.705 -45.836 1.00 60.41 C
+ATOM 16 C ALA A 3 -31.203 12.519 -44.731 1.00 60.41 C
+ATOM 17 CB ALA A 3 -31.119 11.774 -47.162 1.00 60.41 C
+ATOM 18 O ALA A 3 -31.166 13.746 -44.800 1.00 60.41 O
+ATOM 19 N THR A 4 -30.639 11.836 -43.738 1.00 75.74 N
+ATOM 20 CA THR A 4 -29.713 12.408 -42.759 1.00 75.74 C
+ATOM 21 C THR A 4 -28.288 12.255 -43.286 1.00 75.74 C
+ATOM 22 CB THR A 4 -29.885 11.755 -41.378 1.00 75.74 C
+ATOM 23 O THR A 4 -27.767 11.154 -43.439 1.00 75.74 O
+ATOM 24 CG2 THR A 4 -31.086 12.351 -40.643 1.00 75.74 C
+ATOM 25 OG1 THR A 4 -30.133 10.370 -41.494 1.00 75.74 O
+ATOM 26 N THR A 5 -27.675 13.384 -43.629 1.00 73.15 N
+ATOM 27 CA THR A 5 -26.292 13.499 -44.093 1.00 73.15 C
+ATOM 28 C THR A 5 -25.312 13.322 -42.938 1.00 73.15 C
+ATOM 29 CB THR A 5 -26.068 14.866 -44.758 1.00 73.15 C
+ATOM 30 O THR A 5 -25.357 14.052 -41.950 1.00 73.15 O
+ATOM 31 CG2 THR A 5 -26.638 14.892 -46.177 1.00 73.15 C
+ATOM 32 OG1 THR A 5 -26.727 15.872 -44.019 1.00 73.15 O
+ATOM 33 N THR A 6 -24.420 12.351 -43.099 1.00 67.00 N
+ATOM 34 CA THR A 6 -23.256 12.052 -42.263 1.00 67.00 C
+ATOM 35 C THR A 6 -22.177 13.123 -42.448 1.00 67.00 C
+ATOM 36 CB THR A 6 -22.698 10.685 -42.709 1.00 67.00 C
+ATOM 37 O THR A 6 -21.684 13.305 -43.560 1.00 67.00 O
+ATOM 38 CG2 THR A 6 -21.659 10.094 -41.760 1.00 67.00 C
+ATOM 39 OG1 THR A 6 -23.744 9.744 -42.826 1.00 67.00 O
+ATOM 40 N THR A 7 -21.772 13.797 -41.371 1.00 68.61 N
+ATOM 41 CA THR A 7 -20.586 14.668 -41.358 1.00 68.61 C
+ATOM 42 C THR A 7 -19.461 13.943 -40.633 1.00 68.61 C
+ATOM 43 CB THR A 7 -20.860 16.037 -40.714 1.00 68.61 C
+ATOM 44 O THR A 7 -19.570 13.644 -39.447 1.00 68.61 O
+ATOM 45 CG2 THR A 7 -19.727 17.030 -40.983 1.00 68.61 C
+ATOM 46 OG1 THR A 7 -22.024 16.606 -41.266 1.00 68.61 O
+ATOM 47 N MET A 8 -18.394 13.636 -41.369 1.00 67.08 N
+ATOM 48 CA MET A 8 -17.144 13.096 -40.846 1.00 67.08 C
+ATOM 49 C MET A 8 -16.195 14.248 -40.479 1.00 67.08 C
+ATOM 50 CB MET A 8 -16.487 12.177 -41.894 1.00 67.08 C
+ATOM 51 O MET A 8 -15.835 15.048 -41.336 1.00 67.08 O
+ATOM 52 CG MET A 8 -17.331 10.945 -42.243 1.00 67.08 C
+ATOM 53 SD MET A 8 -16.394 9.671 -43.131 1.00 67.08 S
+ATOM 54 CE MET A 8 -17.646 8.366 -43.244 1.00 67.08 C
+ATOM 55 N MET A 9 -15.749 14.292 -39.227 1.00 67.60 N
+ATOM 56 CA MET A 9 -14.502 14.928 -38.780 1.00 67.60 C
+ATOM 57 C MET A 9 -13.861 13.880 -37.856 1.00 67.60 C
+ATOM 58 CB MET A 9 -14.779 16.249 -38.030 1.00 67.60 C
+ATOM 59 O MET A 9 -14.491 13.455 -36.899 1.00 67.60 O
+ATOM 60 CG MET A 9 -14.778 17.512 -38.909 1.00 67.60 C
+ATOM 61 SD MET A 9 -16.392 18.248 -39.302 1.00 67.60 S
+ATOM 62 CE MET A 9 -15.832 19.839 -39.972 1.00 67.60 C
+ATOM 63 N GLY A 10 -12.709 13.281 -38.147 1.00 61.80 N
+ATOM 64 CA GLY A 10 -11.450 13.942 -38.472 1.00 61.80 C
+ATOM 65 C GLY A 10 -10.628 14.061 -37.186 1.00 61.80 C
+ATOM 66 O GLY A 10 -10.470 15.160 -36.672 1.00 61.80 O
+ATOM 67 N MET A 11 -10.169 12.933 -36.630 1.00 68.90 N
+ATOM 68 CA MET A 11 -9.299 12.907 -35.449 1.00 68.90 C
+ATOM 69 C MET A 11 -7.849 12.748 -35.907 1.00 68.90 C
+ATOM 70 CB MET A 11 -9.730 11.809 -34.464 1.00 68.90 C
+ATOM 71 O MET A 11 -7.453 11.704 -36.420 1.00 68.90 O
+ATOM 72 CG MET A 11 -11.105 12.118 -33.862 1.00 68.90 C
+ATOM 73 SD MET A 11 -11.617 10.959 -32.571 1.00 68.90 S
+ATOM 74 CE MET A 11 -13.085 11.820 -31.949 1.00 68.90 C
+ATOM 75 N ALA A 12 -7.081 13.827 -35.776 1.00 61.95 N
+ATOM 76 CA ALA A 12 -5.652 13.854 -36.038 1.00 61.95 C
+ATOM 77 C ALA A 12 -4.907 13.176 -34.879 1.00 61.95 C
+ATOM 78 CB ALA A 12 -5.228 15.317 -36.228 1.00 61.95 C
+ATOM 79 O ALA A 12 -4.921 13.666 -33.754 1.00 61.95 O
+ATOM 80 N THR A 13 -4.245 12.056 -35.156 1.00 68.99 N
+ATOM 81 CA THR A 13 -3.341 11.386 -34.216 1.00 68.99 C
+ATOM 82 C THR A 13 -1.956 12.025 -34.298 1.00 68.99 C
+ATOM 83 CB THR A 13 -3.259 9.881 -34.519 1.00 68.99 C
+ATOM 84 O THR A 13 -1.209 11.795 -35.252 1.00 68.99 O
+ATOM 85 CG2 THR A 13 -4.580 9.169 -34.230 1.00 68.99 C
+ATOM 86 OG1 THR A 13 -2.949 9.691 -35.883 1.00 68.99 O
+ATOM 87 N THR A 14 -1.594 12.836 -33.308 1.00 70.93 N
+ATOM 88 CA THR A 14 -0.216 13.297 -33.105 1.00 70.93 C
+ATOM 89 C THR A 14 0.611 12.185 -32.464 1.00 70.93 C
+ATOM 90 CB THR A 14 -0.162 14.578 -32.257 1.00 70.93 C
+ATOM 91 O THR A 14 0.535 11.946 -31.263 1.00 70.93 O
+ATOM 92 CG2 THR A 14 -0.412 15.813 -33.121 1.00 70.93 C
+ATOM 93 OG1 THR A 14 -1.151 14.557 -31.254 1.00 70.93 O
+ATOM 94 N PHE A 15 1.408 11.510 -33.290 1.00 65.35 N
+ATOM 95 CA PHE A 15 2.501 10.634 -32.877 1.00 65.35 C
+ATOM 96 C PHE A 15 3.608 11.463 -32.206 1.00 65.35 C
+ATOM 97 CB PHE A 15 3.057 9.914 -34.122 1.00 65.35 C
+ATOM 98 O PHE A 15 4.233 12.301 -32.856 1.00 65.35 O
+ATOM 99 CG PHE A 15 2.510 8.521 -34.363 1.00 65.35 C
+ATOM 100 CD1 PHE A 15 3.308 7.404 -34.051 1.00 65.35 C
+ATOM 101 CD2 PHE A 15 1.222 8.331 -34.900 1.00 65.35 C
+ATOM 102 CE1 PHE A 15 2.824 6.103 -34.272 1.00 65.35 C
+ATOM 103 CE2 PHE A 15 0.737 7.028 -35.118 1.00 65.35 C
+ATOM 104 CZ PHE A 15 1.538 5.915 -34.805 1.00 65.35 C
+ATOM 105 N VAL A 16 3.879 11.206 -30.924 1.00 69.16 N
+ATOM 106 CA VAL A 16 5.053 11.728 -30.209 1.00 69.16 C
+ATOM 107 C VAL A 16 6.105 10.614 -30.129 1.00 69.16 C
+ATOM 108 CB VAL A 16 4.685 12.247 -28.804 1.00 69.16 C
+ATOM 109 O VAL A 16 5.853 9.591 -29.492 1.00 69.16 O
+ATOM 110 CG1 VAL A 16 5.923 12.780 -28.066 1.00 69.16 C
+ATOM 111 CG2 VAL A 16 3.664 13.390 -28.891 1.00 69.16 C
+ATOM 112 N PRO A 17 7.283 10.760 -30.762 1.00 68.00 N
+ATOM 113 CA PRO A 17 8.367 9.795 -30.622 1.00 68.00 C
+ATOM 114 C PRO A 17 9.140 10.019 -29.310 1.00 68.00 C
+ATOM 115 CB PRO A 17 9.225 9.974 -31.876 1.00 68.00 C
+ATOM 116 O PRO A 17 9.602 11.122 -29.017 1.00 68.00 O
+ATOM 117 CG PRO A 17 9.023 11.444 -32.246 1.00 68.00 C
+ATOM 118 CD PRO A 17 7.616 11.776 -31.748 1.00 68.00 C
+ATOM 119 N LYS A 18 9.303 8.946 -28.527 1.00 66.26 N
+ATOM 120 CA LYS A 18 10.091 8.895 -27.284 1.00 66.26 C
+ATOM 121 C LYS A 18 11.603 8.938 -27.597 1.00 66.26 C
+ATOM 122 CB LYS A 18 9.671 7.623 -26.519 1.00 66.26 C
+ATOM 123 O LYS A 18 12.047 8.200 -28.480 1.00 66.26 O
+ATOM 124 CG LYS A 18 10.240 7.480 -25.097 1.00 66.26 C
+ATOM 125 CD LYS A 18 9.583 6.288 -24.372 1.00 66.26 C
+ATOM 126 CE LYS A 18 10.233 6.032 -23.003 1.00 66.26 C
+ATOM 127 NZ LYS A 18 9.415 5.123 -22.151 1.00 66.26 N
+ATOM 128 N PRO A 19 12.415 9.751 -26.894 1.00 67.49 N
+ATOM 129 CA PRO A 19 13.861 9.796 -27.100 1.00 67.49 C
+ATOM 130 C PRO A 19 14.553 8.556 -26.510 1.00 67.49 C
+ATOM 131 CB PRO A 19 14.326 11.109 -26.464 1.00 67.49 C
+ATOM 132 O PRO A 19 14.304 8.164 -25.370 1.00 67.49 O
+ATOM 133 CG PRO A 19 13.292 11.364 -25.367 1.00 67.49 C
+ATOM 134 CD PRO A 19 12.006 10.748 -25.916 1.00 67.49 C
+ATOM 135 N GLN A 20 15.431 7.942 -27.305 1.00 60.48 N
+ATOM 136 CA GLN A 20 16.304 6.832 -26.914 1.00 60.48 C
+ATOM 137 C GLN A 20 17.501 7.354 -26.101 1.00 60.48 C
+ATOM 138 CB GLN A 20 16.795 6.101 -28.179 1.00 60.48 C
+ATOM 139 O GLN A 20 18.190 8.279 -26.531 1.00 60.48 O
+ATOM 140 CG GLN A 20 15.684 5.314 -28.899 1.00 60.48 C
+ATOM 141 CD GLN A 20 16.153 4.671 -30.206 1.00 60.48 C
+ATOM 142 NE2 GLN A 20 15.459 3.669 -30.698 1.00 60.48 N
+ATOM 143 OE1 GLN A 20 17.131 5.056 -30.823 1.00 60.48 O
+ATOM 144 N ALA A 21 17.770 6.744 -24.944 1.00 63.79 N
+ATOM 145 CA ALA A 21 18.982 6.983 -24.163 1.00 63.79 C
+ATOM 146 C ALA A 21 20.168 6.174 -24.736 1.00 63.79 C
+ATOM 147 CB ALA A 21 18.708 6.618 -22.698 1.00 63.79 C
+ATOM 148 O ALA A 21 19.989 4.997 -25.060 1.00 63.79 O
+ATOM 149 N PRO A 22 21.377 6.755 -24.859 1.00 69.72 N
+ATOM 150 CA PRO A 22 22.566 6.021 -25.281 1.00 69.72 C
+ATOM 151 C PRO A 22 23.206 5.223 -24.125 1.00 69.72 C
+ATOM 152 CB PRO A 22 23.510 7.080 -25.849 1.00 69.72 C
+ATOM 153 O PRO A 22 23.093 5.618 -22.961 1.00 69.72 O
+ATOM 154 CG PRO A 22 23.172 8.319 -25.020 1.00 69.72 C
+ATOM 155 CD PRO A 22 21.677 8.173 -24.730 1.00 69.72 C
+ATOM 156 N PRO A 23 23.908 4.114 -24.428 1.00 54.38 N
+ATOM 157 CA PRO A 23 24.531 3.259 -23.429 1.00 54.38 C
+ATOM 158 C PRO A 23 25.875 3.820 -22.933 1.00 54.38 C
+ATOM 159 CB PRO A 23 24.677 1.898 -24.119 1.00 54.38 C
+ATOM 160 O PRO A 23 26.640 4.425 -23.680 1.00 54.38 O
+ATOM 161 CG PRO A 23 24.928 2.278 -25.575 1.00 54.38 C
+ATOM 162 CD PRO A 23 24.106 3.552 -25.758 1.00 54.38 C
+ATOM 163 N MET A 24 26.130 3.557 -21.647 1.00 54.35 N
+ATOM 164 CA MET A 24 27.420 3.347 -20.972 1.00 54.35 C
+ATOM 165 C MET A 24 28.663 3.269 -21.879 1.00 54.35 C
+ATOM 166 CB MET A 24 27.288 2.023 -20.174 1.00 54.35 C
+ATOM 167 O MET A 24 28.665 2.495 -22.828 1.00 54.35 O
+ATOM 168 CG MET A 24 26.918 0.804 -21.048 1.00 54.35 C
+ATOM 169 SD MET A 24 26.336 -0.675 -20.187 1.00 54.35 S
+ATOM 170 CE MET A 24 25.725 -1.615 -21.619 1.00 54.35 C
+ATOM 171 N MET A 25 29.736 3.994 -21.521 1.00 57.94 N
+ATOM 172 CA MET A 25 31.137 3.522 -21.443 1.00 57.94 C
+ATOM 173 C MET A 25 32.107 4.684 -21.139 1.00 57.94 C
+ATOM 174 CB MET A 25 31.622 2.799 -22.721 1.00 57.94 C
+ATOM 175 O MET A 25 32.029 5.750 -21.737 1.00 57.94 O
+ATOM 176 CG MET A 25 31.249 1.303 -22.751 1.00 57.94 C
+ATOM 177 SD MET A 25 32.392 0.111 -22.025 1.00 57.94 S
+ATOM 178 CE MET A 25 31.287 -1.331 -22.097 1.00 57.94 C
+ATOM 179 N ALA A 26 33.075 4.375 -20.269 1.00 54.08 N
+ATOM 180 CA ALA A 26 34.419 4.952 -20.157 1.00 54.08 C
+ATOM 181 C ALA A 26 34.587 6.408 -19.664 1.00 54.08 C
+ATOM 182 CB ALA A 26 35.161 4.695 -21.477 1.00 54.08 C
+ATOM 183 O ALA A 26 34.390 7.367 -20.397 1.00 54.08 O
+ATOM 184 N ALA A 27 35.151 6.570 -18.462 1.00 53.27 N
+ATOM 185 CA ALA A 27 36.600 6.774 -18.296 1.00 53.27 C
+ATOM 186 C ALA A 27 36.923 7.323 -16.892 1.00 53.27 C
+ATOM 187 CB ALA A 27 37.186 7.717 -19.361 1.00 53.27 C
+ATOM 188 O ALA A 27 36.566 8.443 -16.539 1.00 53.27 O
+ATOM 189 N LEU A 28 37.655 6.530 -16.107 1.00 53.66 N
+ATOM 190 CA LEU A 28 38.425 7.000 -14.954 1.00 53.66 C
+ATOM 191 C LEU A 28 39.713 7.659 -15.466 1.00 53.66 C
+ATOM 192 CB LEU A 28 38.781 5.786 -14.071 1.00 53.66 C
+ATOM 193 O LEU A 28 40.328 7.138 -16.401 1.00 53.66 O
+ATOM 194 CG LEU A 28 37.589 5.186 -13.302 1.00 53.66 C
+ATOM 195 CD1 LEU A 28 37.835 3.706 -13.007 1.00 53.66 C
+ATOM 196 CD2 LEU A 28 37.377 5.913 -11.974 1.00 53.66 C
+ATOM 197 N PRO A 29 40.194 8.715 -14.795 1.00 58.78 N
+ATOM 198 CA PRO A 29 41.602 8.685 -14.429 1.00 58.78 C
+ATOM 199 C PRO A 29 41.873 9.128 -12.988 1.00 58.78 C
+ATOM 200 CB PRO A 29 42.333 9.560 -15.447 1.00 58.78 C
+ATOM 201 O PRO A 29 41.378 10.136 -12.487 1.00 58.78 O
+ATOM 202 CG PRO A 29 41.267 10.542 -15.933 1.00 58.78 C
+ATOM 203 CD PRO A 29 39.944 10.041 -15.343 1.00 58.78 C
+ATOM 204 N SER A 30 42.752 8.344 -12.369 1.00 56.77 N
+ATOM 205 CA SER A 30 43.668 8.691 -11.289 1.00 56.77 C
+ATOM 206 C SER A 30 44.260 10.093 -11.456 1.00 56.77 C
+ATOM 207 CB SER A 30 44.853 7.710 -11.388 1.00 56.77 C
+ATOM 208 O SER A 30 44.618 10.444 -12.576 1.00 56.77 O
+ATOM 209 OG SER A 30 44.410 6.372 -11.553 1.00 56.77 O
+ATOM 210 N ASN A 31 44.463 10.832 -10.357 1.00 63.36 N
+ATOM 211 CA ASN A 31 45.768 11.393 -9.957 1.00 63.36 C
+ATOM 212 C ASN A 31 45.614 12.475 -8.859 1.00 63.36 C
+ATOM 213 CB ASN A 31 46.575 11.969 -11.150 1.00 63.36 C
+ATOM 214 O ASN A 31 45.147 13.575 -9.115 1.00 63.36 O
+ATOM 215 CG ASN A 31 48.038 12.187 -10.869 1.00 63.36 C
+ATOM 216 ND2 ASN A 31 48.645 13.181 -11.465 1.00 63.36 N
+ATOM 217 OD1 ASN A 31 48.677 11.424 -10.167 1.00 63.36 O
+ATOM 218 N THR A 32 46.108 12.141 -7.664 1.00 54.93 N
+ATOM 219 CA THR A 32 47.033 12.944 -6.839 1.00 54.93 C
+ATOM 220 C THR A 32 46.662 14.357 -6.373 1.00 54.93 C
+ATOM 221 CB THR A 32 48.407 12.958 -7.522 1.00 54.93 C
+ATOM 222 O THR A 32 46.634 15.313 -7.138 1.00 54.93 O
+ATOM 223 CG2 THR A 32 49.533 13.643 -6.754 1.00 54.93 C
+ATOM 224 OG1 THR A 32 48.804 11.616 -7.640 1.00 54.93 O
+ATOM 225 N GLY A 33 46.630 14.511 -5.043 1.00 56.81 N
+ATOM 226 CA GLY A 33 46.861 15.785 -4.352 1.00 56.81 C
+ATOM 227 C GLY A 33 46.065 15.890 -3.048 1.00 56.81 C
+ATOM 228 O GLY A 33 44.940 16.353 -3.052 1.00 56.81 O
+ATOM 229 N ARG A 34 46.548 15.344 -1.926 1.00 51.39 N
+ATOM 230 CA ARG A 34 47.347 16.091 -0.932 1.00 51.39 C
+ATOM 231 C ARG A 34 46.556 17.221 -0.246 1.00 51.39 C
+ATOM 232 CB ARG A 34 48.669 16.563 -1.577 1.00 51.39 C
+ATOM 233 O ARG A 34 46.625 18.359 -0.678 1.00 51.39 O
+ATOM 234 CG ARG A 34 49.687 17.235 -0.641 1.00 51.39 C
+ATOM 235 CD ARG A 34 51.028 17.363 -1.388 1.00 51.39 C
+ATOM 236 NE ARG A 34 51.769 18.586 -1.017 1.00 51.39 N
+ATOM 237 NH1 ARG A 34 52.138 19.415 -3.144 1.00 51.39 N
+ATOM 238 NH2 ARG A 34 52.886 20.539 -1.376 1.00 51.39 N
+ATOM 239 CZ ARG A 34 52.256 19.499 -1.846 1.00 51.39 C
+ATOM 240 N SER A 35 45.935 16.919 0.896 1.00 52.75 N
+ATOM 241 CA SER A 35 46.165 17.685 2.132 1.00 52.75 C
+ATOM 242 C SER A 35 45.643 16.922 3.348 1.00 52.75 C
+ATOM 243 CB SER A 35 45.559 19.093 2.142 1.00 52.75 C
+ATOM 244 O SER A 35 44.482 16.532 3.418 1.00 52.75 O
+ATOM 245 OG SER A 35 46.184 19.813 3.193 1.00 52.75 O
+ATOM 246 N LEU A 36 46.551 16.717 4.298 1.00 54.39 N
+ATOM 247 CA LEU A 36 46.304 16.287 5.668 1.00 54.39 C
+ATOM 248 C LEU A 36 45.699 17.458 6.468 1.00 54.39 C
+ATOM 249 CB LEU A 36 47.669 15.857 6.250 1.00 54.39 C
+ATOM 250 O LEU A 36 45.882 18.612 6.085 1.00 54.39 O
+ATOM 251 CG LEU A 36 48.251 14.564 5.636 1.00 54.39 C
+ATOM 252 CD1 LEU A 36 49.779 14.610 5.598 1.00 54.39 C
+ATOM 253 CD2 LEU A 36 47.826 13.347 6.457 1.00 54.39 C
+ATOM 254 N PHE A 37 45.088 17.134 7.612 1.00 44.45 N
+ATOM 255 CA PHE A 37 44.546 18.027 8.653 1.00 44.45 C
+ATOM 256 C PHE A 37 43.172 18.655 8.386 1.00 44.45 C
+ATOM 257 CB PHE A 37 45.574 19.069 9.126 1.00 44.45 C
+ATOM 258 O PHE A 37 43.037 19.649 7.684 1.00 44.45 O
+ATOM 259 CG PHE A 37 46.672 18.475 9.975 1.00 44.45 C
+ATOM 260 CD1 PHE A 37 46.537 18.487 11.374 1.00 44.45 C
+ATOM 261 CD2 PHE A 37 47.807 17.891 9.383 1.00 44.45 C
+ATOM 262 CE1 PHE A 37 47.529 17.909 12.182 1.00 44.45 C
+ATOM 263 CE2 PHE A 37 48.793 17.299 10.191 1.00 44.45 C
+ATOM 264 CZ PHE A 37 48.654 17.310 11.590 1.00 44.45 C
+ATOM 265 N GLY A 38 42.148 18.114 9.055 1.00 51.45 N
+ATOM 266 CA GLY A 38 40.809 18.702 9.051 1.00 51.45 C
+ATOM 267 C GLY A 38 39.759 17.914 9.827 1.00 51.45 C
+ATOM 268 O GLY A 38 38.642 17.756 9.355 1.00 51.45 O
+ATOM 269 N LEU A 39 40.101 17.397 11.010 1.00 53.14 N
+ATOM 270 CA LEU A 39 39.106 16.944 11.979 1.00 53.14 C
+ATOM 271 C LEU A 39 38.278 18.162 12.408 1.00 53.14 C
+ATOM 272 CB LEU A 39 39.855 16.323 13.184 1.00 53.14 C
+ATOM 273 O LEU A 39 38.760 18.950 13.219 1.00 53.14 O
+ATOM 274 CG LEU A 39 38.945 15.700 14.261 1.00 53.14 C
+ATOM 275 CD1 LEU A 39 38.463 14.317 13.825 1.00 53.14 C
+ATOM 276 CD2 LEU A 39 39.703 15.548 15.581 1.00 53.14 C
+ATOM 277 N LYS A 40 37.055 18.331 11.893 1.00 55.15 N
+ATOM 278 CA LYS A 40 36.002 19.040 12.632 1.00 55.15 C
+ATOM 279 C LYS A 40 34.601 18.850 12.045 1.00 55.15 C
+ATOM 280 CB LYS A 40 36.336 20.541 12.825 1.00 55.15 C
+ATOM 281 O LYS A 40 34.255 19.392 11.007 1.00 55.15 O
+ATOM 282 CG LYS A 40 36.486 20.839 14.329 1.00 55.15 C
+ATOM 283 CD LYS A 40 36.888 22.288 14.604 1.00 55.15 C
+ATOM 284 CE LYS A 40 37.055 22.473 16.118 1.00 55.15 C
+ATOM 285 NZ LYS A 40 36.893 23.892 16.514 1.00 55.15 N
+ATOM 286 N THR A 41 33.795 18.171 12.861 1.00 41.56 N
+ATOM 287 CA THR A 41 32.403 18.503 13.207 1.00 41.56 C
+ATOM 288 C THR A 41 31.346 18.529 12.107 1.00 41.56 C
+ATOM 289 CB THR A 41 32.314 19.804 14.033 1.00 41.56 C
+ATOM 290 O THR A 41 31.192 19.512 11.393 1.00 41.56 O
+ATOM 291 CG2 THR A 41 32.717 19.566 15.486 1.00 41.56 C
+ATOM 292 OG1 THR A 41 33.159 20.815 13.533 1.00 41.56 O
+ATOM 293 N GLY A 42 30.462 17.530 12.182 1.00 47.00 N
+ATOM 294 CA GLY A 42 29.032 17.754 11.987 1.00 47.00 C
+ATOM 295 C GLY A 42 28.445 17.043 10.783 1.00 47.00 C
+ATOM 296 O GLY A 42 28.078 17.695 9.811 1.00 47.00 O
+ATOM 297 N SER A 43 28.259 15.725 10.890 1.00 57.62 N
+ATOM 298 CA SER A 43 27.234 15.042 10.101 1.00 57.62 C
+ATOM 299 C SER A 43 25.874 15.578 10.557 1.00 57.62 C
+ATOM 300 CB SER A 43 27.340 13.519 10.262 1.00 57.62 C
+ATOM 301 O SER A 43 25.264 15.073 11.497 1.00 57.62 O
+ATOM 302 OG SER A 43 26.536 12.901 9.284 1.00 57.62 O
+ATOM 303 N ARG A 44 25.433 16.692 9.964 1.00 48.74 N
+ATOM 304 CA ARG A 44 24.026 17.087 9.983 1.00 48.74 C
+ATOM 305 C ARG A 44 23.314 16.088 9.082 1.00 48.74 C
+ATOM 306 CB ARG A 44 23.838 18.537 9.498 1.00 48.74 C
+ATOM 307 O ARG A 44 23.161 16.338 7.893 1.00 48.74 O
+ATOM 308 CG ARG A 44 24.181 19.584 10.566 1.00 48.74 C
+ATOM 309 CD ARG A 44 23.943 20.990 10.000 1.00 48.74 C
+ATOM 310 NE ARG A 44 24.103 22.036 11.031 1.00 48.74 N
+ATOM 311 NH1 ARG A 44 24.420 23.811 9.606 1.00 48.74 N
+ATOM 312 NH2 ARG A 44 24.371 24.163 11.808 1.00 48.74 N
+ATOM 313 CZ ARG A 44 24.298 23.326 10.811 1.00 48.74 C
+ATOM 314 N GLY A 45 22.942 14.941 9.651 1.00 54.92 N
+ATOM 315 CA GLY A 45 21.943 14.067 9.052 1.00 54.92 C
+ATOM 316 C GLY A 45 20.707 14.916 8.788 1.00 54.92 C
+ATOM 317 O GLY A 45 20.055 15.372 9.729 1.00 54.92 O
+ATOM 318 N GLY A 46 20.470 15.234 7.517 1.00 56.22 N
+ATOM 319 CA GLY A 46 19.290 15.960 7.089 1.00 56.22 C
+ATOM 320 C GLY A 46 18.082 15.105 7.425 1.00 56.22 C
+ATOM 321 O GLY A 46 17.857 14.083 6.789 1.00 56.22 O
+ATOM 322 N ARG A 47 17.340 15.497 8.460 1.00 59.12 N
+ATOM 323 CA ARG A 47 15.985 15.004 8.686 1.00 59.12 C
+ATOM 324 C ARG A 47 15.154 15.527 7.518 1.00 59.12 C
+ATOM 325 CB ARG A 47 15.463 15.511 10.043 1.00 59.12 C
+ATOM 326 O ARG A 47 14.759 16.689 7.545 1.00 59.12 O
+ATOM 327 CG ARG A 47 16.134 14.809 11.232 1.00 59.12 C
+ATOM 328 CD ARG A 47 15.638 15.409 12.554 1.00 59.12 C
+ATOM 329 NE ARG A 47 15.842 14.475 13.678 1.00 59.12 N
+ATOM 330 NH1 ARG A 47 15.577 15.970 15.401 1.00 59.12 N
+ATOM 331 NH2 ARG A 47 15.792 13.792 15.848 1.00 59.12 N
+ATOM 332 CZ ARG A 47 15.742 14.751 14.966 1.00 59.12 C
+ATOM 333 N MET A 48 14.995 14.716 6.472 1.00 61.00 N
+ATOM 334 CA MET A 48 13.955 14.929 5.468 1.00 61.00 C
+ATOM 335 C MET A 48 12.645 14.935 6.259 1.00 61.00 C
+ATOM 336 CB MET A 48 13.972 13.794 4.424 1.00 61.00 C
+ATOM 337 O MET A 48 12.292 13.938 6.883 1.00 61.00 O
+ATOM 338 CG MET A 48 15.235 13.736 3.546 1.00 61.00 C
+ATOM 339 SD MET A 48 15.199 14.753 2.043 1.00 61.00 S
+ATOM 340 CE MET A 48 16.717 14.196 1.226 1.00 61.00 C
+ATOM 341 N THR A 49 12.020 16.099 6.400 1.00 59.24 N
+ATOM 342 CA THR A 49 10.679 16.179 6.974 1.00 59.24 C
+ATOM 343 C THR A 49 9.741 15.592 5.931 1.00 59.24 C
+ATOM 344 CB THR A 49 10.298 17.632 7.300 1.00 59.24 C
+ATOM 345 O THR A 49 9.546 16.231 4.899 1.00 59.24 O
+ATOM 346 CG2 THR A 49 11.093 18.174 8.491 1.00 59.24 C
+ATOM 347 OG1 THR A 49 10.578 18.472 6.202 1.00 59.24 O
+ATOM 348 N MET A 50 9.240 14.383 6.175 1.00 79.45 N
+ATOM 349 CA MET A 50 8.248 13.734 5.314 1.00 79.45 C
+ATOM 350 C MET A 50 6.986 14.593 5.291 1.00 79.45 C
+ATOM 351 CB MET A 50 7.968 12.300 5.803 1.00 79.45 C
+ATOM 352 O MET A 50 6.570 15.102 6.342 1.00 79.45 O
+ATOM 353 CG MET A 50 9.249 11.454 5.922 1.00 79.45 C
+ATOM 354 SD MET A 50 10.398 11.565 4.519 1.00 79.45 S
+ATOM 355 CE MET A 50 9.469 10.566 3.342 1.00 79.45 C
+ATOM 356 N ALA A 51 6.433 14.841 4.104 1.00 91.56 N
+ATOM 357 CA ALA A 51 5.160 15.536 4.012 1.00 91.56 C
+ATOM 358 C ALA A 51 4.064 14.578 4.487 1.00 91.56 C
+ATOM 359 CB ALA A 51 4.934 16.057 2.588 1.00 91.56 C
+ATOM 360 O ALA A 51 4.138 13.378 4.254 1.00 91.56 O
+ATOM 361 N ALA A 52 3.057 15.098 5.181 1.00 95.10 N
+ATOM 362 CA ALA A 52 1.871 14.329 5.528 1.00 95.10 C
+ATOM 363 C ALA A 52 0.669 14.971 4.846 1.00 95.10 C
+ATOM 364 CB ALA A 52 1.720 14.232 7.050 1.00 95.10 C
+ATOM 365 O ALA A 52 0.546 16.202 4.833 1.00 95.10 O
+ATOM 366 N TYR A 53 -0.188 14.132 4.283 1.00 97.39 N
+ATOM 367 CA TYR A 53 -1.379 14.542 3.561 1.00 97.39 C
+ATOM 368 C TYR A 53 -2.631 14.015 4.246 1.00 97.39 C
+ATOM 369 CB TYR A 53 -1.295 14.063 2.112 1.00 97.39 C
+ATOM 370 O TYR A 53 -2.649 12.923 4.824 1.00 97.39 O
+ATOM 371 CG TYR A 53 -0.123 14.633 1.337 1.00 97.39 C
+ATOM 372 CD1 TYR A 53 -0.064 16.014 1.061 1.00 97.39 C
+ATOM 373 CD2 TYR A 53 0.915 13.789 0.904 1.00 97.39 C
+ATOM 374 CE1 TYR A 53 1.043 16.549 0.370 1.00 97.39 C
+ATOM 375 CE2 TYR A 53 2.005 14.315 0.189 1.00 97.39 C
+ATOM 376 OH TYR A 53 3.177 16.206 -0.686 1.00 97.39 O
+ATOM 377 CZ TYR A 53 2.085 15.698 -0.057 1.00 97.39 C
+ATOM 378 N LYS A 54 -3.713 14.787 4.142 1.00 97.92 N
+ATOM 379 CA LYS A 54 -5.016 14.377 4.650 1.00 97.92 C
+ATOM 380 C LYS A 54 -5.618 13.329 3.715 1.00 97.92 C
+ATOM 381 CB LYS A 54 -5.909 15.611 4.825 1.00 97.92 C
+ATOM 382 O LYS A 54 -5.936 13.620 2.562 1.00 97.92 O
+ATOM 383 CG LYS A 54 -7.288 15.203 5.350 1.00 97.92 C
+ATOM 384 CD LYS A 54 -8.208 16.406 5.570 1.00 97.92 C
+ATOM 385 CE LYS A 54 -9.594 15.814 5.820 1.00 97.92 C
+ATOM 386 NZ LYS A 54 -10.628 16.809 6.166 1.00 97.92 N
+ATOM 387 N VAL A 55 -5.860 12.135 4.243 1.00 98.15 N
+ATOM 388 CA VAL A 55 -6.557 11.056 3.540 1.00 98.15 C
+ATOM 389 C VAL A 55 -7.974 10.942 4.088 1.00 98.15 C
+ATOM 390 CB VAL A 55 -5.793 9.728 3.658 1.00 98.15 C
+ATOM 391 O VAL A 55 -8.179 10.772 5.287 1.00 98.15 O
+ATOM 392 CG1 VAL A 55 -6.529 8.611 2.905 1.00 98.15 C
+ATOM 393 CG2 VAL A 55 -4.379 9.849 3.078 1.00 98.15 C
+ATOM 394 N THR A 56 -8.963 11.042 3.201 1.00 98.06 N
+ATOM 395 CA THR A 56 -10.382 10.840 3.522 1.00 98.06 C
+ATOM 396 C THR A 56 -10.857 9.534 2.899 1.00 98.06 C
+ATOM 397 CB THR A 56 -11.229 12.021 3.029 1.00 98.06 C
+ATOM 398 O THR A 56 -10.897 9.411 1.675 1.00 98.06 O
+ATOM 399 CG2 THR A 56 -12.694 11.910 3.457 1.00 98.06 C
+ATOM 400 OG1 THR A 56 -10.691 13.223 3.538 1.00 98.06 O
+ATOM 401 N LEU A 57 -11.231 8.556 3.721 1.00 97.93 N
+ATOM 402 CA LEU A 57 -11.762 7.276 3.261 1.00 97.93 C
+ATOM 403 C LEU A 57 -13.282 7.270 3.401 1.00 97.93 C
+ATOM 404 CB LEU A 57 -11.137 6.102 4.023 1.00 97.93 C
+ATOM 405 O LEU A 57 -13.824 7.414 4.498 1.00 97.93 O
+ATOM 406 CG LEU A 57 -9.604 6.057 4.017 1.00 97.93 C
+ATOM 407 CD1 LEU A 57 -9.154 4.961 4.979 1.00 97.93 C
+ATOM 408 CD2 LEU A 57 -9.026 5.793 2.628 1.00 97.93 C
+ATOM 409 N VAL A 58 -13.974 7.069 2.286 1.00 97.35 N
+ATOM 410 CA VAL A 58 -15.422 6.854 2.250 1.00 97.35 C
+ATOM 411 C VAL A 58 -15.656 5.351 2.371 1.00 97.35 C
+ATOM 412 CB VAL A 58 -16.030 7.460 0.973 1.00 97.35 C
+ATOM 413 O VAL A 58 -15.510 4.614 1.396 1.00 97.35 O
+ATOM 414 CG1 VAL A 58 -17.543 7.222 0.892 1.00 97.35 C
+ATOM 415 CG2 VAL A 58 -15.764 8.969 0.880 1.00 97.35 C
+ATOM 416 N THR A 59 -15.952 4.893 3.589 1.00 95.76 N
+ATOM 417 CA THR A 59 -16.236 3.481 3.891 1.00 95.76 C
+ATOM 418 C THR A 59 -17.751 3.230 3.931 1.00 95.76 C
+ATOM 419 CB THR A 59 -15.582 3.017 5.210 1.00 95.76 C
+ATOM 420 O THR A 59 -18.518 4.176 4.129 1.00 95.76 O
+ATOM 421 CG2 THR A 59 -14.139 3.486 5.406 1.00 95.76 C
+ATOM 422 OG1 THR A 59 -16.328 3.444 6.325 1.00 95.76 O
+ATOM 423 N PRO A 60 -18.223 1.973 3.824 1.00 93.95 N
+ATOM 424 CA PRO A 60 -19.646 1.644 3.973 1.00 93.95 C
+ATOM 425 C PRO A 60 -20.249 2.051 5.329 1.00 93.95 C
+ATOM 426 CB PRO A 60 -19.727 0.125 3.778 1.00 93.95 C
+ATOM 427 O PRO A 60 -21.447 2.308 5.424 1.00 93.95 O
+ATOM 428 CG PRO A 60 -18.502 -0.202 2.926 1.00 93.95 C
+ATOM 429 CD PRO A 60 -17.465 0.794 3.430 1.00 93.95 C
+ATOM 430 N THR A 61 -19.423 2.125 6.377 1.00 93.58 N
+ATOM 431 CA THR A 61 -19.835 2.493 7.744 1.00 93.58 C
+ATOM 432 C THR A 61 -19.868 4.013 7.954 1.00 93.58 C
+ATOM 433 CB THR A 61 -18.892 1.824 8.760 1.00 93.58 C
+ATOM 434 O THR A 61 -20.513 4.499 8.884 1.00 93.58 O
+ATOM 435 CG2 THR A 61 -19.376 1.916 10.208 1.00 93.58 C
+ATOM 436 OG1 THR A 61 -18.794 0.446 8.473 1.00 93.58 O
+ATOM 437 N GLY A 62 -19.193 4.778 7.094 1.00 94.71 N
+ATOM 438 CA GLY A 62 -19.093 6.232 7.173 1.00 94.71 C
+ATOM 439 C GLY A 62 -17.763 6.772 6.649 1.00 94.71 C
+ATOM 440 O GLY A 62 -16.882 6.026 6.217 1.00 94.71 O
+ATOM 441 N ASN A 63 -17.609 8.092 6.708 1.00 96.32 N
+ATOM 442 CA ASN A 63 -16.379 8.757 6.288 1.00 96.32 C
+ATOM 443 C ASN A 63 -15.406 8.851 7.463 1.00 96.32 C
+ATOM 444 CB ASN A 63 -16.692 10.140 5.700 1.00 96.32 C
+ATOM 445 O ASN A 63 -15.789 9.303 8.544 1.00 96.32 O
+ATOM 446 CG ASN A 63 -17.540 10.089 4.443 1.00 96.32 C
+ATOM 447 ND2 ASN A 63 -17.931 11.230 3.930 1.00 96.32 N
+ATOM 448 OD1 ASN A 63 -17.876 9.053 3.900 1.00 96.32 O
+ATOM 449 N VAL A 64 -14.155 8.471 7.230 1.00 96.72 N
+ATOM 450 CA VAL A 64 -13.058 8.595 8.197 1.00 96.72 C
+ATOM 451 C VAL A 64 -11.926 9.410 7.586 1.00 96.72 C
+ATOM 452 CB VAL A 64 -12.579 7.229 8.721 1.00 96.72 C
+ATOM 453 O VAL A 64 -11.695 9.368 6.379 1.00 96.72 O
+ATOM 454 CG1 VAL A 64 -13.699 6.502 9.475 1.00 96.72 C
+ATOM 455 CG2 VAL A 64 -12.073 6.308 7.614 1.00 96.72 C
+ATOM 456 N GLU A 65 -11.240 10.184 8.417 1.00 97.27 N
+ATOM 457 CA GLU A 65 -10.158 11.069 7.996 1.00 97.27 C
+ATOM 458 C GLU A 65 -8.942 10.836 8.885 1.00 97.27 C
+ATOM 459 CB GLU A 65 -10.580 12.544 8.087 1.00 97.27 C
+ATOM 460 O GLU A 65 -9.082 10.760 10.105 1.00 97.27 O
+ATOM 461 CG GLU A 65 -11.793 12.919 7.220 1.00 97.27 C
+ATOM 462 CD GLU A 65 -12.090 14.428 7.259 1.00 97.27 C
+ATOM 463 OE1 GLU A 65 -12.737 14.962 6.328 1.00 97.27 O
+ATOM 464 OE2 GLU A 65 -11.555 15.162 8.124 1.00 97.27 O
+ATOM 465 N PHE A 66 -7.760 10.764 8.282 1.00 97.26 N
+ATOM 466 CA PHE A 66 -6.496 10.629 9.002 1.00 97.26 C
+ATOM 467 C PHE A 66 -5.343 11.282 8.228 1.00 97.26 C
+ATOM 468 CB PHE A 66 -6.227 9.152 9.318 1.00 97.26 C
+ATOM 469 O PHE A 66 -5.514 11.745 7.096 1.00 97.26 O
+ATOM 470 CG PHE A 66 -5.916 8.288 8.116 1.00 97.26 C
+ATOM 471 CD1 PHE A 66 -6.950 7.869 7.260 1.00 97.26 C
+ATOM 472 CD2 PHE A 66 -4.589 7.912 7.842 1.00 97.26 C
+ATOM 473 CE1 PHE A 66 -6.648 7.086 6.138 1.00 97.26 C
+ATOM 474 CE2 PHE A 66 -4.301 7.123 6.719 1.00 97.26 C
+ATOM 475 CZ PHE A 66 -5.329 6.696 5.873 1.00 97.26 C
+ATOM 476 N GLN A 67 -4.179 11.379 8.868 1.00 97.06 N
+ATOM 477 CA GLN A 67 -2.956 11.909 8.265 1.00 97.06 C
+ATOM 478 C GLN A 67 -2.069 10.753 7.812 1.00 97.06 C
+ATOM 479 CB GLN A 67 -2.216 12.791 9.282 1.00 97.06 C
+ATOM 480 O GLN A 67 -1.722 9.900 8.621 1.00 97.06 O
+ATOM 481 CG GLN A 67 -2.870 14.168 9.471 1.00 97.06 C
+ATOM 482 CD GLN A 67 -2.617 15.130 8.310 1.00 97.06 C
+ATOM 483 NE2 GLN A 67 -3.041 16.369 8.415 1.00 97.06 N
+ATOM 484 OE1 GLN A 67 -2.023 14.822 7.296 1.00 97.06 O
+ATOM 485 N CYS A 68 -1.678 10.750 6.541 1.00 96.89 N
+ATOM 486 CA CYS A 68 -0.785 9.744 5.979 1.00 96.89 C
+ATOM 487 C CYS A 68 0.507 10.417 5.495 1.00 96.89 C
+ATOM 488 CB CYS A 68 -1.514 9.024 4.848 1.00 96.89 C
+ATOM 489 O CYS A 68 0.426 11.353 4.691 1.00 96.89 O
+ATOM 490 SG CYS A 68 -0.529 7.626 4.233 1.00 96.89 S
+ATOM 491 N PRO A 69 1.686 9.979 5.966 1.00 96.13 N
+ATOM 492 CA PRO A 69 2.965 10.376 5.385 1.00 96.13 C
+ATOM 493 C PRO A 69 3.059 10.022 3.894 1.00 96.13 C
+ATOM 494 CB PRO A 69 4.031 9.646 6.202 1.00 96.13 C
+ATOM 495 O PRO A 69 2.423 9.075 3.431 1.00 96.13 O
+ATOM 496 CG PRO A 69 3.341 9.355 7.533 1.00 96.13 C
+ATOM 497 CD PRO A 69 1.900 9.098 7.105 1.00 96.13 C
+ATOM 498 N ASP A 70 3.862 10.775 3.150 1.00 95.31 N
+ATOM 499 CA ASP A 70 4.097 10.590 1.715 1.00 95.31 C
+ATOM 500 C ASP A 70 4.979 9.375 1.372 1.00 95.31 C
+ATOM 501 CB ASP A 70 4.626 11.908 1.117 1.00 95.31 C
+ATOM 502 O ASP A 70 5.054 8.980 0.211 1.00 95.31 O
+ATOM 503 CG ASP A 70 5.987 12.427 1.615 1.00 95.31 C
+ATOM 504 OD1 ASP A 70 6.517 11.955 2.643 1.00 95.31 O
+ATOM 505 OD2 ASP A 70 6.474 13.421 1.023 1.00 95.31 O
+ATOM 506 N ASP A 71 5.604 8.754 2.375 1.00 94.63 N
+ATOM 507 CA ASP A 71 6.423 7.538 2.284 1.00 94.63 C
+ATOM 508 C ASP A 71 5.790 6.291 2.905 1.00 94.63 C
+ATOM 509 CB ASP A 71 7.794 7.794 2.915 1.00 94.63 C
+ATOM 510 O ASP A 71 6.451 5.257 3.023 1.00 94.63 O
+ATOM 511 CG ASP A 71 7.780 8.101 4.432 1.00 94.63 C
+ATOM 512 OD1 ASP A 71 6.756 8.595 4.958 1.00 94.63 O
+ATOM 513 OD2 ASP A 71 8.850 7.917 5.064 1.00 94.63 O
+ATOM 514 N VAL A 72 4.521 6.368 3.303 1.00 96.39 N
+ATOM 515 CA VAL A 72 3.788 5.250 3.902 1.00 96.39 C
+ATOM 516 C VAL A 72 2.587 4.904 3.030 1.00 96.39 C
+ATOM 517 CB VAL A 72 3.399 5.565 5.359 1.00 96.39 C
+ATOM 518 O VAL A 72 1.912 5.785 2.494 1.00 96.39 O
+ATOM 519 CG1 VAL A 72 2.631 4.412 6.015 1.00 96.39 C
+ATOM 520 CG2 VAL A 72 4.644 5.803 6.226 1.00 96.39 C
+ATOM 521 N TYR A 73 2.308 3.608 2.885 1.00 97.16 N
+ATOM 522 CA TYR A 73 1.112 3.164 2.183 1.00 97.16 C
+ATOM 523 C TYR A 73 -0.148 3.576 2.939 1.00 97.16 C
+ATOM 524 CB TYR A 73 1.123 1.648 1.976 1.00 97.16 C
+ATOM 525 O TYR A 73 -0.243 3.427 4.158 1.00 97.16 O
+ATOM 526 CG TYR A 73 2.229 1.135 1.080 1.00 97.16 C
+ATOM 527 CD1 TYR A 73 2.374 1.637 -0.229 1.00 97.16 C
+ATOM 528 CD2 TYR A 73 3.085 0.120 1.546 1.00 97.16 C
+ATOM 529 CE1 TYR A 73 3.349 1.092 -1.083 1.00 97.16 C
+ATOM 530 CE2 TYR A 73 4.086 -0.398 0.707 1.00 97.16 C
+ATOM 531 OH TYR A 73 5.159 -0.437 -1.427 1.00 97.16 O
+ATOM 532 CZ TYR A 73 4.211 0.083 -0.611 1.00 97.16 C
+ATOM 533 N ILE A 74 -1.162 4.016 2.196 1.00 97.32 N
+ATOM 534 CA ILE A 74 -2.444 4.457 2.757 1.00 97.32 C
+ATOM 535 C ILE A 74 -3.081 3.376 3.644 1.00 97.32 C
+ATOM 536 CB ILE A 74 -3.377 4.895 1.606 1.00 97.32 C
+ATOM 537 O ILE A 74 -3.637 3.709 4.688 1.00 97.32 O
+ATOM 538 CG1 ILE A 74 -2.829 6.201 0.985 1.00 97.32 C
+ATOM 539 CG2 ILE A 74 -4.829 5.089 2.081 1.00 97.32 C
+ATOM 540 CD1 ILE A 74 -3.557 6.658 -0.283 1.00 97.32 C
+ATOM 541 N LEU A 75 -2.996 2.097 3.253 1.00 97.32 N
+ATOM 542 CA LEU A 75 -3.491 0.988 4.074 1.00 97.32 C
+ATOM 543 C LEU A 75 -2.756 0.893 5.419 1.00 97.32 C
+ATOM 544 CB LEU A 75 -3.370 -0.336 3.297 1.00 97.32 C
+ATOM 545 O LEU A 75 -3.410 0.764 6.448 1.00 97.32 O
+ATOM 546 CG LEU A 75 -3.830 -1.569 4.103 1.00 97.32 C
+ATOM 547 CD1 LEU A 75 -5.321 -1.507 4.427 1.00 97.32 C
+ATOM 548 CD2 LEU A 75 -3.589 -2.855 3.318 1.00 97.32 C
+ATOM 549 N ASP A 76 -1.426 0.966 5.415 1.00 96.85 N
+ATOM 550 CA ASP A 76 -0.616 0.805 6.626 1.00 96.85 C
+ATOM 551 C ASP A 76 -0.880 1.951 7.612 1.00 96.85 C
+ATOM 552 CB ASP A 76 0.879 0.737 6.259 1.00 96.85 C
+ATOM 553 O ASP A 76 -1.127 1.718 8.793 1.00 96.85 O
+ATOM 554 CG ASP A 76 1.297 -0.492 5.437 1.00 96.85 C
+ATOM 555 OD1 ASP A 76 0.500 -1.449 5.279 1.00 96.85 O
+ATOM 556 OD2 ASP A 76 2.448 -0.496 4.954 1.00 96.85 O
+ATOM 557 N ALA A 77 -0.930 3.189 7.113 1.00 97.02 N
+ATOM 558 CA ALA A 77 -1.268 4.351 7.930 1.00 97.02 C
+ATOM 559 C ALA A 77 -2.718 4.300 8.459 1.00 97.02 C
+ATOM 560 CB ALA A 77 -0.990 5.601 7.091 1.00 97.02 C
+ATOM 561 O ALA A 77 -2.984 4.738 9.576 1.00 97.02 O
+ATOM 562 N ALA A 78 -3.660 3.734 7.697 1.00 96.98 N
+ATOM 563 CA ALA A 78 -5.030 3.524 8.164 1.00 96.98 C
+ATOM 564 C ALA A 78 -5.096 2.479 9.296 1.00 96.98 C
+ATOM 565 CB ALA A 78 -5.907 3.134 6.966 1.00 96.98 C
+ATOM 566 O ALA A 78 -5.784 2.704 10.294 1.00 96.98 O
+ATOM 567 N GLU A 79 -4.355 1.370 9.179 1.00 96.34 N
+ATOM 568 CA GLU A 79 -4.269 0.340 10.223 1.00 96.34 C
+ATOM 569 C GLU A 79 -3.676 0.893 11.530 1.00 96.34 C
+ATOM 570 CB GLU A 79 -3.420 -0.861 9.754 1.00 96.34 C
+ATOM 571 O GLU A 79 -4.181 0.578 12.610 1.00 96.34 O
+ATOM 572 CG GLU A 79 -4.108 -1.783 8.732 1.00 96.34 C
+ATOM 573 CD GLU A 79 -3.284 -3.051 8.418 1.00 96.34 C
+ATOM 574 OE1 GLU A 79 -3.872 -4.098 8.069 1.00 96.34 O
+ATOM 575 OE2 GLU A 79 -2.032 -3.064 8.516 1.00 96.34 O
+ATOM 576 N GLU A 80 -2.645 1.742 11.453 1.00 96.41 N
+ATOM 577 CA GLU A 80 -2.038 2.387 12.630 1.00 96.41 C
+ATOM 578 C GLU A 80 -3.024 3.294 13.384 1.00 96.41 C
+ATOM 579 CB GLU A 80 -0.792 3.193 12.224 1.00 96.41 C
+ATOM 580 O GLU A 80 -3.022 3.332 14.617 1.00 96.41 O
+ATOM 581 CG GLU A 80 0.406 2.289 11.887 1.00 96.41 C
+ATOM 582 CD GLU A 80 1.729 3.052 11.682 1.00 96.41 C
+ATOM 583 OE1 GLU A 80 2.773 2.363 11.584 1.00 96.41 O
+ATOM 584 OE2 GLU A 80 1.738 4.305 11.717 1.00 96.41 O
+ATOM 585 N GLU A 81 -3.921 3.959 12.656 1.00 96.03 N
+ATOM 586 CA GLU A 81 -4.999 4.785 13.211 1.00 96.03 C
+ATOM 587 C GLU A 81 -6.222 3.957 13.663 1.00 96.03 C
+ATOM 588 CB GLU A 81 -5.372 5.865 12.183 1.00 96.03 C
+ATOM 589 O GLU A 81 -7.202 4.499 14.179 1.00 96.03 O
+ATOM 590 CG GLU A 81 -4.228 6.871 11.949 1.00 96.03 C
+ATOM 591 CD GLU A 81 -3.940 7.779 13.159 1.00 96.03 C
+ATOM 592 OE1 GLU A 81 -2.749 8.015 13.467 1.00 96.03 O
+ATOM 593 OE2 GLU A 81 -4.909 8.301 13.761 1.00 96.03 O
+ATOM 594 N GLY A 82 -6.176 2.629 13.504 1.00 95.60 N
+ATOM 595 CA GLY A 82 -7.244 1.709 13.898 1.00 95.60 C
+ATOM 596 C GLY A 82 -8.432 1.674 12.932 1.00 95.60 C
+ATOM 597 O GLY A 82 -9.535 1.291 13.331 1.00 95.60 O
+ATOM 598 N ILE A 83 -8.230 2.085 11.679 1.00 95.50 N
+ATOM 599 CA ILE A 83 -9.231 2.035 10.612 1.00 95.50 C
+ATOM 600 C ILE A 83 -9.098 0.700 9.877 1.00 95.50 C
+ATOM 601 CB ILE A 83 -9.074 3.233 9.652 1.00 95.50 C
+ATOM 602 O ILE A 83 -8.067 0.407 9.277 1.00 95.50 O
+ATOM 603 CG1 ILE A 83 -9.211 4.584 10.396 1.00 95.50 C
+ATOM 604 CG2 ILE A 83 -10.104 3.132 8.508 1.00 95.50 C
+ATOM 605 CD1 ILE A 83 -8.733 5.786 9.571 1.00 95.50 C
+ATOM 606 N ASP A 84 -10.168 -0.092 9.890 1.00 94.24 N
+ATOM 607 CA ASP A 84 -10.205 -1.381 9.200 1.00 94.24 C
+ATOM 608 C ASP A 84 -10.549 -1.202 7.713 1.00 94.24 C
+ATOM 609 CB ASP A 84 -11.178 -2.321 9.928 1.00 94.24 C
+ATOM 610 O ASP A 84 -11.539 -0.552 7.355 1.00 94.24 O
+ATOM 611 CG ASP A 84 -11.042 -3.785 9.495 1.00 94.24 C
+ATOM 612 OD1 ASP A 84 -9.917 -4.187 9.126 1.00 94.24 O
+ATOM 613 OD2 ASP A 84 -12.060 -4.507 9.597 1.00 94.24 O
+ATOM 614 N LEU A 85 -9.721 -1.779 6.844 1.00 95.31 N
+ATOM 615 CA LEU A 85 -9.887 -1.774 5.393 1.00 95.31 C
+ATOM 616 C LEU A 85 -9.721 -3.190 4.843 1.00 95.31 C
+ATOM 617 CB LEU A 85 -8.858 -0.835 4.736 1.00 95.31 C
+ATOM 618 O LEU A 85 -8.950 -3.975 5.389 1.00 95.31 O
+ATOM 619 CG LEU A 85 -9.108 0.669 4.905 1.00 95.31 C
+ATOM 620 CD1 LEU A 85 -8.027 1.422 4.120 1.00 95.31 C
+ATOM 621 CD2 LEU A 85 -10.483 1.074 4.361 1.00 95.31 C
+ATOM 622 N PRO A 86 -10.389 -3.532 3.730 1.00 95.42 N
+ATOM 623 CA PRO A 86 -10.244 -4.851 3.138 1.00 95.42 C
+ATOM 624 C PRO A 86 -8.841 -5.013 2.532 1.00 95.42 C
+ATOM 625 CB PRO A 86 -11.374 -4.946 2.111 1.00 95.42 C
+ATOM 626 O PRO A 86 -8.372 -4.173 1.763 1.00 95.42 O
+ATOM 627 CG PRO A 86 -11.584 -3.496 1.676 1.00 95.42 C
+ATOM 628 CD PRO A 86 -11.302 -2.709 2.954 1.00 95.42 C
+ATOM 629 N TYR A 87 -8.162 -6.112 2.867 1.00 95.33 N
+ATOM 630 CA TYR A 87 -6.882 -6.503 2.275 1.00 95.33 C
+ATOM 631 C TYR A 87 -6.713 -8.026 2.268 1.00 95.33 C
+ATOM 632 CB TYR A 87 -5.712 -5.822 3.004 1.00 95.33 C
+ATOM 633 O TYR A 87 -7.380 -8.757 2.997 1.00 95.33 O
+ATOM 634 CG TYR A 87 -5.512 -6.249 4.446 1.00 95.33 C
+ATOM 635 CD1 TYR A 87 -6.110 -5.500 5.471 1.00 95.33 C
+ATOM 636 CD2 TYR A 87 -4.725 -7.375 4.771 1.00 95.33 C
+ATOM 637 CE1 TYR A 87 -5.940 -5.864 6.816 1.00 95.33 C
+ATOM 638 CE2 TYR A 87 -4.543 -7.740 6.121 1.00 95.33 C
+ATOM 639 OH TYR A 87 -4.908 -7.275 8.447 1.00 95.33 O
+ATOM 640 CZ TYR A 87 -5.141 -6.975 7.145 1.00 95.33 C
+ATOM 641 N SER A 88 -5.795 -8.518 1.431 1.00 95.57 N
+ATOM 642 CA SER A 88 -5.434 -9.941 1.392 1.00 95.57 C
+ATOM 643 C SER A 88 -3.943 -10.141 1.117 1.00 95.57 C
+ATOM 644 CB SER A 88 -6.310 -10.676 0.368 1.00 95.57 C
+ATOM 645 O SER A 88 -3.199 -10.545 2.006 1.00 95.57 O
+ATOM 646 OG SER A 88 -6.017 -12.057 0.398 1.00 95.57 O
+ATOM 647 N CYS A 89 -3.477 -9.800 -0.090 1.00 96.40 N
+ATOM 648 CA CYS A 89 -2.105 -10.079 -0.525 1.00 96.40 C
+ATOM 649 C CYS A 89 -1.047 -9.091 0.003 1.00 96.40 C
+ATOM 650 CB CYS A 89 -2.078 -10.126 -2.061 1.00 96.40 C
+ATOM 651 O CYS A 89 0.110 -9.476 0.141 1.00 96.40 O
+ATOM 652 SG CYS A 89 -2.555 -8.587 -2.908 1.00 96.40 S
+ATOM 653 N ARG A 90 -1.422 -7.821 0.245 1.00 94.02 N
+ATOM 654 CA ARG A 90 -0.526 -6.698 0.627 1.00 94.02 C
+ATOM 655 C ARG A 90 0.710 -6.514 -0.275 1.00 94.02 C
+ATOM 656 CB ARG A 90 -0.131 -6.770 2.116 1.00 94.02 C
+ATOM 657 O ARG A 90 1.730 -6.002 0.162 1.00 94.02 O
+ATOM 658 CG ARG A 90 -1.330 -6.752 3.072 1.00 94.02 C
+ATOM 659 CD ARG A 90 -0.886 -6.724 4.543 1.00 94.02 C
+ATOM 660 NE ARG A 90 -0.436 -5.388 5.006 1.00 94.02 N
+ATOM 661 NH1 ARG A 90 -1.367 -5.440 7.122 1.00 94.02 N
+ATOM 662 NH2 ARG A 90 -0.231 -3.687 6.539 1.00 94.02 N
+ATOM 663 CZ ARG A 90 -0.662 -4.856 6.201 1.00 94.02 C
+ATOM 664 N ALA A 91 0.620 -6.942 -1.531 1.00 94.91 N
+ATOM 665 CA ALA A 91 1.715 -6.879 -2.502 1.00 94.91 C
+ATOM 666 C ALA A 91 1.319 -6.138 -3.791 1.00 94.91 C
+ATOM 667 CB ALA A 91 2.198 -8.313 -2.759 1.00 94.91 C
+ATOM 668 O ALA A 91 1.973 -6.305 -4.815 1.00 94.91 O
+ATOM 669 N GLY A 92 0.197 -5.405 -3.778 1.00 95.29 N
+ATOM 670 CA GLY A 92 -0.312 -4.705 -4.964 1.00 95.29 C
+ATOM 671 C GLY A 92 -0.662 -5.630 -6.139 1.00 95.29 C
+ATOM 672 O GLY A 92 -0.607 -5.203 -7.286 1.00 95.29 O
+ATOM 673 N SER A 93 -0.968 -6.904 -5.875 1.00 95.82 N
+ATOM 674 CA SER A 93 -1.162 -7.949 -6.897 1.00 95.82 C
+ATOM 675 C SER A 93 -2.557 -8.589 -6.878 1.00 95.82 C
+ATOM 676 CB SER A 93 -0.066 -9.004 -6.751 1.00 95.82 C
+ATOM 677 O SER A 93 -2.790 -9.600 -7.539 1.00 95.82 O
+ATOM 678 OG SER A 93 -0.122 -9.627 -5.475 1.00 95.82 O
+ATOM 679 N CYS A 94 -3.487 -8.025 -6.105 1.00 96.09 N
+ATOM 680 CA CYS A 94 -4.852 -8.518 -5.947 1.00 96.09 C
+ATOM 681 C CYS A 94 -5.857 -7.358 -5.846 1.00 96.09 C
+ATOM 682 CB CYS A 94 -4.925 -9.441 -4.715 1.00 96.09 C
+ATOM 683 O CYS A 94 -5.490 -6.248 -5.466 1.00 96.09 O
+ATOM 684 SG CYS A 94 -4.602 -8.674 -3.091 1.00 96.09 S
+ATOM 685 N SER A 95 -7.134 -7.636 -6.121 1.00 94.83 N
+ATOM 686 CA SER A 95 -8.246 -6.672 -6.091 1.00 94.83 C
+ATOM 687 C SER A 95 -8.809 -6.374 -4.699 1.00 94.83 C
+ATOM 688 CB SER A 95 -9.391 -7.203 -6.962 1.00 94.83 C
+ATOM 689 O SER A 95 -9.620 -5.465 -4.558 1.00 94.83 O
+ATOM 690 OG SER A 95 -9.674 -8.556 -6.635 1.00 94.83 O
+ATOM 691 N SER A 96 -8.403 -7.102 -3.656 1.00 96.73 N
+ATOM 692 CA SER A 96 -9.071 -7.016 -2.346 1.00 96.73 C
+ATOM 693 C SER A 96 -8.940 -5.653 -1.669 1.00 96.73 C
+ATOM 694 CB SER A 96 -8.566 -8.115 -1.415 1.00 96.73 C
+ATOM 695 O SER A 96 -9.832 -5.247 -0.934 1.00 96.73 O
+ATOM 696 OG SER A 96 -8.599 -9.362 -2.083 1.00 96.73 O
+ATOM 697 N CYS A 97 -7.849 -4.928 -1.939 1.00 96.99 N
+ATOM 698 CA CYS A 97 -7.617 -3.576 -1.423 1.00 96.99 C
+ATOM 699 C CYS A 97 -8.096 -2.475 -2.397 1.00 96.99 C
+ATOM 700 CB CYS A 97 -6.152 -3.458 -0.943 1.00 96.99 C
+ATOM 701 O CYS A 97 -7.664 -1.325 -2.301 1.00 96.99 O
+ATOM 702 SG CYS A 97 -4.885 -3.197 -2.230 1.00 96.99 S
+ATOM 703 N ALA A 98 -8.963 -2.818 -3.361 1.00 97.36 N
+ATOM 704 CA ALA A 98 -9.425 -1.886 -4.382 1.00 97.36 C
+ATOM 705 C ALA A 98 -10.331 -0.784 -3.816 1.00 97.36 C
+ATOM 706 CB ALA A 98 -10.109 -2.632 -5.533 1.00 97.36 C
+ATOM 707 O ALA A 98 -11.282 -1.016 -3.056 1.00 97.36 O
+ATOM 708 N GLY A 99 -10.048 0.433 -4.263 1.00 97.46 N
+ATOM 709 CA GLY A 99 -10.836 1.628 -4.033 1.00 97.46 C
+ATOM 710 C GLY A 99 -10.931 2.494 -5.286 1.00 97.46 C
+ATOM 711 O GLY A 99 -10.322 2.208 -6.318 1.00 97.46 O
+ATOM 712 N LYS A 100 -11.693 3.583 -5.179 1.00 97.48 N
+ATOM 713 CA LYS A 100 -11.872 4.572 -6.243 1.00 97.48 C
+ATOM 714 C LYS A 100 -11.452 5.956 -5.767 1.00 97.48 C
+ATOM 715 CB LYS A 100 -13.329 4.539 -6.736 1.00 97.48 C
+ATOM 716 O LYS A 100 -12.020 6.488 -4.813 1.00 97.48 O
+ATOM 717 CG LYS A 100 -13.491 5.175 -8.122 1.00 97.48 C
+ATOM 718 CD LYS A 100 -13.015 4.215 -9.220 1.00 97.48 C
+ATOM 719 CE LYS A 100 -13.097 4.892 -10.581 1.00 97.48 C
+ATOM 720 NZ LYS A 100 -12.581 4.009 -11.651 1.00 97.48 N
+ATOM 721 N LEU A 101 -10.480 6.555 -6.442 1.00 98.00 N
+ATOM 722 CA LEU A 101 -10.034 7.917 -6.186 1.00 98.00 C
+ATOM 723 C LEU A 101 -11.112 8.913 -6.636 1.00 98.00 C
+ATOM 724 CB LEU A 101 -8.694 8.134 -6.908 1.00 98.00 C
+ATOM 725 O LEU A 101 -11.552 8.899 -7.784 1.00 98.00 O
+ATOM 726 CG LEU A 101 -8.023 9.486 -6.604 1.00 98.00 C
+ATOM 727 CD1 LEU A 101 -7.683 9.622 -5.119 1.00 98.00 C
+ATOM 728 CD2 LEU A 101 -6.736 9.603 -7.417 1.00 98.00 C
+ATOM 729 N LYS A 102 -11.550 9.788 -5.728 1.00 97.25 N
+ATOM 730 CA LYS A 102 -12.512 10.864 -6.019 1.00 97.25 C
+ATOM 731 C LYS A 102 -11.840 12.201 -6.250 1.00 97.25 C
+ATOM 732 CB LYS A 102 -13.526 11.002 -4.876 1.00 97.25 C
+ATOM 733 O LYS A 102 -12.257 12.950 -7.128 1.00 97.25 O
+ATOM 734 CG LYS A 102 -14.434 9.786 -4.730 1.00 97.25 C
+ATOM 735 CD LYS A 102 -15.290 9.533 -5.983 1.00 97.25 C
+ATOM 736 CE LYS A 102 -16.151 8.365 -5.566 1.00 97.25 C
+ATOM 737 NZ LYS A 102 -17.104 7.824 -6.558 1.00 97.25 N
+ATOM 738 N THR A 103 -10.846 12.521 -5.431 1.00 97.23 N
+ATOM 739 CA THR A 103 -10.115 13.788 -5.480 1.00 97.23 C
+ATOM 740 C THR A 103 -8.674 13.581 -5.033 1.00 97.23 C
+ATOM 741 CB THR A 103 -10.760 14.876 -4.599 1.00 97.23 C
+ATOM 742 O THR A 103 -8.389 12.680 -4.242 1.00 97.23 O
+ATOM 743 CG2 THR A 103 -12.205 15.212 -4.970 1.00 97.23 C
+ATOM 744 OG1 THR A 103 -10.772 14.484 -3.250 1.00 97.23 O
+ATOM 745 N GLY A 104 -7.786 14.450 -5.517 1.00 96.90 N
+ATOM 746 CA GLY A 104 -6.362 14.432 -5.196 1.00 96.90 C
+ATOM 747 C GLY A 104 -5.527 13.596 -6.163 1.00 96.90 C
+ATOM 748 O GLY A 104 -5.995 13.183 -7.224 1.00 96.90 O
+ATOM 749 N SER A 105 -4.273 13.379 -5.785 1.00 96.43 N
+ATOM 750 CA SER A 105 -3.296 12.592 -6.526 1.00 96.43 C
+ATOM 751 C SER A 105 -2.557 11.644 -5.589 1.00 96.43 C
+ATOM 752 CB SER A 105 -2.295 13.511 -7.229 1.00 96.43 C
+ATOM 753 O SER A 105 -2.205 11.997 -4.463 1.00 96.43 O
+ATOM 754 OG SER A 105 -2.957 14.297 -8.205 1.00 96.43 O
+ATOM 755 N LEU A 106 -2.292 10.442 -6.086 1.00 96.86 N
+ATOM 756 CA LEU A 106 -1.520 9.412 -5.404 1.00 96.86 C
+ATOM 757 C LEU A 106 -0.552 8.757 -6.385 1.00 96.86 C
+ATOM 758 CB LEU A 106 -2.467 8.422 -4.704 1.00 96.86 C
+ATOM 759 O LEU A 106 -0.781 8.781 -7.594 1.00 96.86 O
+ATOM 760 CG LEU A 106 -3.499 7.707 -5.601 1.00 96.86 C
+ATOM 761 CD1 LEU A 106 -2.954 6.439 -6.261 1.00 96.86 C
+ATOM 762 CD2 LEU A 106 -4.687 7.329 -4.721 1.00 96.86 C
+ATOM 763 N ASN A 107 0.526 8.195 -5.855 1.00 96.33 N
+ATOM 764 CA ASN A 107 1.431 7.322 -6.585 1.00 96.33 C
+ATOM 765 C ASN A 107 1.070 5.875 -6.232 1.00 96.33 C
+ATOM 766 CB ASN A 107 2.887 7.696 -6.242 1.00 96.33 C
+ATOM 767 O ASN A 107 0.990 5.544 -5.053 1.00 96.33 O
+ATOM 768 CG ASN A 107 3.876 6.848 -7.026 1.00 96.33 C
+ATOM 769 ND2 ASN A 107 4.879 7.421 -7.639 1.00 96.33 N
+ATOM 770 OD1 ASN A 107 3.724 5.652 -7.147 1.00 96.33 O
+ATOM 771 N GLN A 108 0.851 5.033 -7.238 1.00 96.30 N
+ATOM 772 CA GLN A 108 0.638 3.596 -7.060 1.00 96.30 C
+ATOM 773 C GLN A 108 1.542 2.769 -7.982 1.00 96.30 C
+ATOM 774 CB GLN A 108 -0.859 3.247 -7.159 1.00 96.30 C
+ATOM 775 O GLN A 108 1.148 1.707 -8.437 1.00 96.30 O
+ATOM 776 CG GLN A 108 -1.502 3.575 -8.521 1.00 96.30 C
+ATOM 777 CD GLN A 108 -2.982 3.206 -8.556 1.00 96.30 C
+ATOM 778 NE2 GLN A 108 -3.791 3.933 -9.297 1.00 96.30 N
+ATOM 779 OE1 GLN A 108 -3.439 2.281 -7.899 1.00 96.30 O
+ATOM 780 N ASP A 109 2.751 3.249 -8.280 1.00 95.43 N
+ATOM 781 CA ASP A 109 3.690 2.600 -9.209 1.00 95.43 C
+ATOM 782 C ASP A 109 4.161 1.215 -8.715 1.00 95.43 C
+ATOM 783 CB ASP A 109 4.913 3.512 -9.438 1.00 95.43 C
+ATOM 784 O ASP A 109 4.617 0.395 -9.511 1.00 95.43 O
+ATOM 785 CG ASP A 109 4.617 4.854 -10.128 1.00 95.43 C
+ATOM 786 OD1 ASP A 109 3.605 4.956 -10.855 1.00 95.43 O
+ATOM 787 OD2 ASP A 109 5.438 5.792 -9.950 1.00 95.43 O
+ATOM 788 N ASP A 110 4.030 0.942 -7.412 1.00 95.52 N
+ATOM 789 CA ASP A 110 4.407 -0.331 -6.780 1.00 95.52 C
+ATOM 790 C ASP A 110 3.375 -1.455 -7.009 1.00 95.52 C
+ATOM 791 CB ASP A 110 4.657 -0.098 -5.274 1.00 95.52 C
+ATOM 792 O ASP A 110 3.621 -2.619 -6.677 1.00 95.52 O
+ATOM 793 CG ASP A 110 5.966 0.649 -4.958 1.00 95.52 C
+ATOM 794 OD1 ASP A 110 6.852 0.728 -5.839 1.00 95.52 O
+ATOM 795 OD2 ASP A 110 6.114 1.101 -3.799 1.00 95.52 O
+ATOM 796 N GLN A 111 2.209 -1.136 -7.576 1.00 95.77 N
+ATOM 797 CA GLN A 111 1.164 -2.108 -7.889 1.00 95.77 C
+ATOM 798 C GLN A 111 1.426 -2.838 -9.223 1.00 95.77 C
+ATOM 799 CB GLN A 111 -0.197 -1.401 -7.809 1.00 95.77 C
+ATOM 800 O GLN A 111 2.146 -2.355 -10.092 1.00 95.77 O
+ATOM 801 CG GLN A 111 -0.557 -0.609 -9.080 1.00 95.77 C
+ATOM 802 CD GLN A 111 -1.216 -1.439 -10.160 1.00 95.77 C
+ATOM 803 NE2 GLN A 111 -1.048 -1.083 -11.412 1.00 95.77 N
+ATOM 804 OE1 GLN A 111 -1.871 -2.431 -9.882 1.00 95.77 O
+ATOM 805 N SER A 112 0.819 -4.013 -9.414 1.00 95.91 N
+ATOM 806 CA SER A 112 0.989 -4.844 -10.623 1.00 95.91 C
+ATOM 807 C SER A 112 -0.301 -5.497 -11.139 1.00 95.91 C
+ATOM 808 CB SER A 112 2.064 -5.908 -10.363 1.00 95.91 C
+ATOM 809 O SER A 112 -0.243 -6.378 -11.997 1.00 95.91 O
+ATOM 810 OG SER A 112 1.715 -6.728 -9.258 1.00 95.91 O
+ATOM 811 N PHE A 113 -1.456 -5.108 -10.600 1.00 96.54 N
+ATOM 812 CA PHE A 113 -2.754 -5.725 -10.874 1.00 96.54 C
+ATOM 813 C PHE A 113 -3.638 -4.888 -11.808 1.00 96.54 C
+ATOM 814 CB PHE A 113 -3.449 -5.969 -9.533 1.00 96.54 C
+ATOM 815 O PHE A 113 -4.209 -5.446 -12.740 1.00 96.54 O
+ATOM 816 CG PHE A 113 -4.826 -6.586 -9.647 1.00 96.54 C
+ATOM 817 CD1 PHE A 113 -5.977 -5.778 -9.594 1.00 96.54 C
+ATOM 818 CD2 PHE A 113 -4.953 -7.970 -9.864 1.00 96.54 C
+ATOM 819 CE1 PHE A 113 -7.245 -6.353 -9.781 1.00 96.54 C
+ATOM 820 CE2 PHE A 113 -6.224 -8.544 -10.040 1.00 96.54 C
+ATOM 821 CZ PHE A 113 -7.370 -7.734 -10.005 1.00 96.54 C
+ATOM 822 N LEU A 114 -3.754 -3.582 -11.555 1.00 96.33 N
+ATOM 823 CA LEU A 114 -4.530 -2.651 -12.371 1.00 96.33 C
+ATOM 824 C LEU A 114 -3.795 -2.350 -13.678 1.00 96.33 C
+ATOM 825 CB LEU A 114 -4.811 -1.339 -11.609 1.00 96.33 C
+ATOM 826 O LEU A 114 -2.580 -2.128 -13.664 1.00 96.33 O
+ATOM 827 CG LEU A 114 -5.566 -1.484 -10.278 1.00 96.33 C
+ATOM 828 CD1 LEU A 114 -5.686 -0.117 -9.598 1.00 96.33 C
+ATOM 829 CD2 LEU A 114 -6.978 -2.038 -10.461 1.00 96.33 C
+ATOM 830 N ASP A 115 -4.537 -2.316 -14.779 1.00 95.81 N
+ATOM 831 CA ASP A 115 -4.045 -1.814 -16.062 1.00 95.81 C
+ATOM 832 C ASP A 115 -4.138 -0.277 -16.155 1.00 95.81 C
+ATOM 833 CB ASP A 115 -4.740 -2.552 -17.222 1.00 95.81 C
+ATOM 834 O ASP A 115 -4.715 0.390 -15.292 1.00 95.81 O
+ATOM 835 CG ASP A 115 -6.260 -2.373 -17.259 1.00 95.81 C
+ATOM 836 OD1 ASP A 115 -6.710 -1.214 -17.147 1.00 95.81 O
+ATOM 837 OD2 ASP A 115 -6.958 -3.399 -17.427 1.00 95.81 O
+ATOM 838 N ASP A 116 -3.526 0.293 -17.196 1.00 95.50 N
+ATOM 839 CA ASP A 116 -3.459 1.746 -17.387 1.00 95.50 C
+ATOM 840 C ASP A 116 -4.860 2.374 -17.523 1.00 95.50 C
+ATOM 841 CB ASP A 116 -2.604 2.074 -18.629 1.00 95.50 C
+ATOM 842 O ASP A 116 -5.105 3.445 -16.968 1.00 95.50 O
+ATOM 843 CG ASP A 116 -1.114 1.697 -18.533 1.00 95.50 C
+ATOM 844 OD1 ASP A 116 -0.602 1.477 -17.414 1.00 95.50 O
+ATOM 845 OD2 ASP A 116 -0.464 1.626 -19.607 1.00 95.50 O
+ATOM 846 N ASP A 117 -5.798 1.689 -18.191 1.00 95.97 N
+ATOM 847 CA ASP A 117 -7.170 2.175 -18.378 1.00 95.97 C
+ATOM 848 C ASP A 117 -7.895 2.256 -17.022 1.00 95.97 C
+ATOM 849 CB ASP A 117 -7.946 1.263 -19.356 1.00 95.97 C
+ATOM 850 O ASP A 117 -8.546 3.255 -16.706 1.00 95.97 O
+ATOM 851 CG ASP A 117 -7.475 1.293 -20.823 1.00 95.97 C
+ATOM 852 OD1 ASP A 117 -6.917 2.320 -21.273 1.00 95.97 O
+ATOM 853 OD2 ASP A 117 -7.742 0.304 -21.550 1.00 95.97 O
+ATOM 854 N GLN A 118 -7.733 1.243 -16.167 1.00 95.95 N
+ATOM 855 CA GLN A 118 -8.296 1.236 -14.820 1.00 95.95 C
+ATOM 856 C GLN A 118 -7.694 2.341 -13.938 1.00 95.95 C
+ATOM 857 CB GLN A 118 -8.072 -0.139 -14.175 1.00 95.95 C
+ATOM 858 O GLN A 118 -8.418 3.018 -13.196 1.00 95.95 O
+ATOM 859 CG GLN A 118 -8.974 -1.221 -14.782 1.00 95.95 C
+ATOM 860 CD GLN A 118 -8.649 -2.616 -14.256 1.00 95.95 C
+ATOM 861 NE2 GLN A 118 -9.591 -3.531 -14.310 1.00 95.95 N
+ATOM 862 OE1 GLN A 118 -7.585 -2.911 -13.733 1.00 95.95 O
+ATOM 863 N ILE A 119 -6.381 2.557 -14.014 1.00 95.94 N
+ATOM 864 CA ILE A 119 -5.715 3.648 -13.290 1.00 95.94 C
+ATOM 865 C ILE A 119 -6.273 5.004 -13.743 1.00 95.94 C
+ATOM 866 CB ILE A 119 -4.185 3.555 -13.468 1.00 95.94 C
+ATOM 867 O ILE A 119 -6.622 5.828 -12.893 1.00 95.94 O
+ATOM 868 CG1 ILE A 119 -3.648 2.296 -12.749 1.00 95.94 C
+ATOM 869 CG2 ILE A 119 -3.489 4.820 -12.927 1.00 95.94 C
+ATOM 870 CD1 ILE A 119 -2.194 1.970 -13.109 1.00 95.94 C
+ATOM 871 N ASP A 120 -6.433 5.212 -15.051 1.00 95.31 N
+ATOM 872 CA ASP A 120 -6.968 6.446 -15.636 1.00 95.31 C
+ATOM 873 C ASP A 120 -8.439 6.689 -15.269 1.00 95.31 C
+ATOM 874 CB ASP A 120 -6.807 6.404 -17.167 1.00 95.31 C
+ATOM 875 O ASP A 120 -8.857 7.827 -15.036 1.00 95.31 O
+ATOM 876 CG ASP A 120 -5.413 6.806 -17.671 1.00 95.31 C
+ATOM 877 OD1 ASP A 120 -4.601 7.318 -16.863 1.00 95.31 O
+ATOM 878 OD2 ASP A 120 -5.219 6.767 -18.908 1.00 95.31 O
+ATOM 879 N GLU A 121 -9.235 5.628 -15.130 1.00 95.80 N
+ATOM 880 CA GLU A 121 -10.590 5.729 -14.590 1.00 95.80 C
+ATOM 881 C GLU A 121 -10.610 6.136 -13.105 1.00 95.80 C
+ATOM 882 CB GLU A 121 -11.328 4.398 -14.751 1.00 95.80 C
+ATOM 883 O GLU A 121 -11.679 6.453 -12.576 1.00 95.80 O
+ATOM 884 CG GLU A 121 -11.754 4.046 -16.178 1.00 95.80 C
+ATOM 885 CD GLU A 121 -12.500 2.701 -16.216 1.00 95.80 C
+ATOM 886 OE1 GLU A 121 -12.871 2.292 -17.337 1.00 95.80 O
+ATOM 887 OE2 GLU A 121 -12.804 2.158 -15.117 1.00 95.80 O
+ATOM 888 N GLY A 122 -9.472 6.089 -12.407 1.00 96.68 N
+ATOM 889 CA GLY A 122 -9.322 6.431 -10.994 1.00 96.68 C
+ATOM 890 C GLY A 122 -9.406 5.234 -10.048 1.00 96.68 C
+ATOM 891 O GLY A 122 -9.763 5.408 -8.883 1.00 96.68 O
+ATOM 892 N TRP A 123 -9.153 4.012 -10.521 1.00 97.54 N
+ATOM 893 CA TRP A 123 -8.994 2.858 -9.633 1.00 97.54 C
+ATOM 894 C TRP A 123 -7.672 2.934 -8.869 1.00 97.54 C
+ATOM 895 CB TRP A 123 -9.129 1.551 -10.415 1.00 97.54 C
+ATOM 896 O TRP A 123 -6.649 3.372 -9.397 1.00 97.54 O
+ATOM 897 CG TRP A 123 -10.508 1.316 -10.946 1.00 97.54 C
+ATOM 898 CD1 TRP A 123 -10.933 1.429 -12.224 1.00 97.54 C
+ATOM 899 CD2 TRP A 123 -11.663 0.864 -10.196 1.00 97.54 C
+ATOM 900 CE2 TRP A 123 -12.768 0.728 -11.092 1.00 97.54 C
+ATOM 901 CE3 TRP A 123 -11.848 0.503 -8.847 1.00 97.54 C
+ATOM 902 NE1 TRP A 123 -12.268 1.104 -12.322 1.00 97.54 N
+ATOM 903 CH2 TRP A 123 -14.168 -0.071 -9.301 1.00 97.54 C
+ATOM 904 CZ2 TRP A 123 -14.017 0.281 -10.651 1.00 97.54 C
+ATOM 905 CZ3 TRP A 123 -13.088 0.024 -8.408 1.00 97.54 C
+ATOM 906 N VAL A 124 -7.702 2.521 -7.603 1.00 97.69 N
+ATOM 907 CA VAL A 124 -6.526 2.522 -6.731 1.00 97.69 C
+ATOM 908 C VAL A 124 -6.454 1.262 -5.883 1.00 97.69 C
+ATOM 909 CB VAL A 124 -6.448 3.804 -5.877 1.00 97.69 C
+ATOM 910 O VAL A 124 -7.473 0.789 -5.379 1.00 97.69 O
+ATOM 911 CG1 VAL A 124 -7.683 4.047 -4.996 1.00 97.69 C
+ATOM 912 CG2 VAL A 124 -5.210 3.798 -4.974 1.00 97.69 C
+ATOM 913 N LEU A 125 -5.241 0.754 -5.667 1.00 97.68 N
+ATOM 914 CA LEU A 125 -4.957 -0.262 -4.655 1.00 97.68 C
+ATOM 915 C LEU A 125 -4.387 0.384 -3.389 1.00 97.68 C
+ATOM 916 CB LEU A 125 -4.015 -1.318 -5.253 1.00 97.68 C
+ATOM 917 O LEU A 125 -3.219 0.760 -3.345 1.00 97.68 O
+ATOM 918 CG LEU A 125 -4.623 -2.132 -6.411 1.00 97.68 C
+ATOM 919 CD1 LEU A 125 -3.751 -3.353 -6.675 1.00 97.68 C
+ATOM 920 CD2 LEU A 125 -6.037 -2.660 -6.139 1.00 97.68 C
+ATOM 921 N THR A 126 -5.194 0.488 -2.327 1.00 97.06 N
+ATOM 922 CA THR A 126 -4.805 1.192 -1.084 1.00 97.06 C
+ATOM 923 C THR A 126 -3.589 0.575 -0.390 1.00 97.06 C
+ATOM 924 CB THR A 126 -5.959 1.229 -0.072 1.00 97.06 C
+ATOM 925 O THR A 126 -2.879 1.260 0.343 1.00 97.06 O
+ATOM 926 CG2 THR A 126 -7.185 1.967 -0.612 1.00 97.06 C
+ATOM 927 OG1 THR A 126 -6.354 -0.084 0.255 1.00 97.06 O
+ATOM 928 N CYS A 127 -3.331 -0.709 -0.647 1.00 97.42 N
+ATOM 929 CA CYS A 127 -2.204 -1.459 -0.111 1.00 97.42 C
+ATOM 930 C CYS A 127 -0.864 -1.216 -0.823 1.00 97.42 C
+ATOM 931 CB CYS A 127 -2.584 -2.945 -0.063 1.00 97.42 C
+ATOM 932 O CYS A 127 0.151 -1.718 -0.353 1.00 97.42 O
+ATOM 933 SG CYS A 127 -3.025 -3.847 -1.584 1.00 97.42 S
+ATOM 934 N ALA A 128 -0.858 -0.487 -1.940 1.00 97.30 N
+ATOM 935 CA ALA A 128 0.342 -0.134 -2.701 1.00 97.30 C
+ATOM 936 C ALA A 128 0.251 1.307 -3.243 1.00 97.30 C
+ATOM 937 CB ALA A 128 0.563 -1.184 -3.800 1.00 97.30 C
+ATOM 938 O ALA A 128 0.688 1.587 -4.356 1.00 97.30 O
+ATOM 939 N ALA A 129 -0.375 2.209 -2.478 1.00 97.44 N
+ATOM 940 CA ALA A 129 -0.588 3.601 -2.863 1.00 97.44 C
+ATOM 941 C ALA A 129 -0.025 4.568 -1.815 1.00 97.44 C
+ATOM 942 CB ALA A 129 -2.084 3.835 -3.097 1.00 97.44 C
+ATOM 943 O ALA A 129 -0.355 4.454 -0.633 1.00 97.44 O
+ATOM 944 N TYR A 130 0.757 5.545 -2.273 1.00 97.59 N
+ATOM 945 CA TYR A 130 1.282 6.666 -1.493 1.00 97.59 C
+ATOM 946 C TYR A 130 0.526 7.955 -1.831 1.00 97.59 C
+ATOM 947 CB TYR A 130 2.766 6.887 -1.792 1.00 97.59 C
+ATOM 948 O TYR A 130 0.332 8.262 -3.014 1.00 97.59 O
+ATOM 949 CG TYR A 130 3.642 5.689 -1.525 1.00 97.59 C
+ATOM 950 CD1 TYR A 130 4.092 5.418 -0.220 1.00 97.59 C
+ATOM 951 CD2 TYR A 130 4.018 4.858 -2.593 1.00 97.59 C
+ATOM 952 CE1 TYR A 130 4.939 4.315 0.018 1.00 97.59 C
+ATOM 953 CE2 TYR A 130 4.871 3.771 -2.360 1.00 97.59 C
+ATOM 954 OH TYR A 130 6.175 2.438 -0.877 1.00 97.59 O
+ATOM 955 CZ TYR A 130 5.341 3.495 -1.060 1.00 97.59 C
+ATOM 956 N PRO A 131 0.116 8.759 -0.840 1.00 97.30 N
+ATOM 957 CA PRO A 131 -0.506 10.047 -1.109 1.00 97.30 C
+ATOM 958 C PRO A 131 0.539 11.065 -1.596 1.00 97.30 C
+ATOM 959 CB PRO A 131 -1.145 10.449 0.217 1.00 97.30 C
+ATOM 960 O PRO A 131 1.600 11.222 -1.000 1.00 97.30 O
+ATOM 961 CG PRO A 131 -0.204 9.834 1.255 1.00 97.30 C
+ATOM 962 CD PRO A 131 0.289 8.550 0.593 1.00 97.30 C
+ATOM 963 N VAL A 132 0.222 11.798 -2.668 1.00 96.81 N
+ATOM 964 CA VAL A 132 1.050 12.914 -3.184 1.00 96.81 C
+ATOM 965 C VAL A 132 0.378 14.270 -2.919 1.00 96.81 C
+ATOM 966 CB VAL A 132 1.374 12.695 -4.679 1.00 96.81 C
+ATOM 967 O VAL A 132 0.996 15.328 -3.028 1.00 96.81 O
+ATOM 968 CG1 VAL A 132 2.296 13.775 -5.265 1.00 96.81 C
+ATOM 969 CG2 VAL A 132 2.081 11.350 -4.904 1.00 96.81 C
+ATOM 970 N SER A 133 -0.902 14.247 -2.553 1.00 97.27 N
+ATOM 971 CA SER A 133 -1.684 15.384 -2.082 1.00 97.27 C
+ATOM 972 C SER A 133 -2.727 14.906 -1.075 1.00 97.27 C
+ATOM 973 CB SER A 133 -2.367 16.078 -3.271 1.00 97.27 C
+ATOM 974 O SER A 133 -2.875 13.706 -0.846 1.00 97.27 O
+ATOM 975 OG SER A 133 -3.466 15.337 -3.781 1.00 97.27 O
+ATOM 976 N ASP A 134 -3.532 15.828 -0.547 1.00 97.85 N
+ATOM 977 CA ASP A 134 -4.774 15.451 0.127 1.00 97.85 C
+ATOM 978 C ASP A 134 -5.661 14.666 -0.852 1.00 97.85 C
+ATOM 979 CB ASP A 134 -5.511 16.692 0.653 1.00 97.85 C
+ATOM 980 O ASP A 134 -5.862 15.101 -1.993 1.00 97.85 O
+ATOM 981 CG ASP A 134 -4.764 17.462 1.748 1.00 97.85 C
+ATOM 982 OD1 ASP A 134 -3.760 16.944 2.289 1.00 97.85 O
+ATOM 983 OD2 ASP A 134 -5.228 18.582 2.059 1.00 97.85 O
+ATOM 984 N VAL A 135 -6.160 13.504 -0.425 1.00 98.07 N
+ATOM 985 CA VAL A 135 -6.908 12.562 -1.274 1.00 98.07 C
+ATOM 986 C VAL A 135 -8.220 12.141 -0.627 1.00 98.07 C
+ATOM 987 CB VAL A 135 -6.091 11.312 -1.675 1.00 98.07 C
+ATOM 988 O VAL A 135 -8.335 12.030 0.594 1.00 98.07 O
+ATOM 989 CG1 VAL A 135 -5.014 11.631 -2.711 1.00 98.07 C
+ATOM 990 CG2 VAL A 135 -5.441 10.610 -0.483 1.00 98.07 C
+ATOM 991 N THR A 136 -9.223 11.870 -1.461 1.00 98.25 N
+ATOM 992 CA THR A 136 -10.474 11.218 -1.045 1.00 98.25 C
+ATOM 993 C THR A 136 -10.658 9.925 -1.824 1.00 98.25 C
+ATOM 994 CB THR A 136 -11.687 12.134 -1.231 1.00 98.25 C
+ATOM 995 O THR A 136 -10.713 9.961 -3.053 1.00 98.25 O
+ATOM 996 CG2 THR A 136 -12.981 11.516 -0.704 1.00 98.25 C
+ATOM 997 OG1 THR A 136 -11.481 13.335 -0.524 1.00 98.25 O
+ATOM 998 N ILE A 137 -10.770 8.794 -1.127 1.00 98.15 N
+ATOM 999 CA ILE A 137 -10.848 7.453 -1.721 1.00 98.15 C
+ATOM 1000 C ILE A 137 -12.115 6.751 -1.223 1.00 98.15 C
+ATOM 1001 CB ILE A 137 -9.566 6.638 -1.412 1.00 98.15 C
+ATOM 1002 O ILE A 137 -12.339 6.636 -0.019 1.00 98.15 O
+ATOM 1003 CG1 ILE A 137 -8.301 7.361 -1.938 1.00 98.15 C
+ATOM 1004 CG2 ILE A 137 -9.665 5.225 -2.021 1.00 98.15 C
+ATOM 1005 CD1 ILE A 137 -6.979 6.732 -1.486 1.00 98.15 C
+ATOM 1006 N GLU A 138 -12.942 6.256 -2.141 1.00 97.71 N
+ATOM 1007 CA GLU A 138 -13.987 5.281 -1.814 1.00 97.71 C
+ATOM 1008 C GLU A 138 -13.362 3.901 -1.649 1.00 97.71 C
+ATOM 1009 CB GLU A 138 -15.074 5.228 -2.894 1.00 97.71 C
+ATOM 1010 O GLU A 138 -12.675 3.424 -2.547 1.00 97.71 O
+ATOM 1011 CG GLU A 138 -16.048 6.406 -2.812 1.00 97.71 C
+ATOM 1012 CD GLU A 138 -17.186 6.332 -3.843 1.00 97.71 C
+ATOM 1013 OE1 GLU A 138 -18.056 7.229 -3.819 1.00 97.71 O
+ATOM 1014 OE2 GLU A 138 -17.132 5.539 -4.811 1.00 97.71 O
+ATOM 1015 N THR A 139 -13.601 3.255 -0.514 1.00 97.28 N
+ATOM 1016 CA THR A 139 -13.034 1.937 -0.204 1.00 97.28 C
+ATOM 1017 C THR A 139 -14.076 0.835 -0.396 1.00 97.28 C
+ATOM 1018 CB THR A 139 -12.429 1.934 1.206 1.00 97.28 C
+ATOM 1019 O THR A 139 -15.247 1.124 -0.642 1.00 97.28 O
+ATOM 1020 CG2 THR A 139 -11.402 3.054 1.384 1.00 97.28 C
+ATOM 1021 OG1 THR A 139 -13.421 2.119 2.185 1.00 97.28 O
+ATOM 1022 N HIS A 140 -13.661 -0.432 -0.277 1.00 96.39 N
+ATOM 1023 CA HIS A 140 -14.538 -1.603 -0.441 1.00 96.39 C
+ATOM 1024 C HIS A 140 -15.145 -1.709 -1.851 1.00 96.39 C
+ATOM 1025 CB HIS A 140 -15.606 -1.662 0.670 1.00 96.39 C
+ATOM 1026 O HIS A 140 -16.324 -2.018 -2.011 1.00 96.39 O
+ATOM 1027 CG HIS A 140 -15.077 -1.596 2.078 1.00 96.39 C
+ATOM 1028 CD2 HIS A 140 -15.161 -2.594 3.008 1.00 96.39 C
+ATOM 1029 ND1 HIS A 140 -14.502 -0.509 2.702 1.00 96.39 N
+ATOM 1030 CE1 HIS A 140 -14.233 -0.849 3.973 1.00 96.39 C
+ATOM 1031 NE2 HIS A 140 -14.637 -2.104 4.205 1.00 96.39 N
+ATOM 1032 N LYS A 141 -14.343 -1.427 -2.885 1.00 96.60 N
+ATOM 1033 CA LYS A 141 -14.799 -1.389 -4.283 1.00 96.60 C
+ATOM 1034 C LYS A 141 -14.374 -2.602 -5.115 1.00 96.60 C
+ATOM 1035 CB LYS A 141 -14.393 -0.053 -4.928 1.00 96.60 C
+ATOM 1036 O LYS A 141 -14.487 -2.563 -6.334 1.00 96.60 O
+ATOM 1037 CG LYS A 141 -14.998 1.193 -4.269 1.00 96.60 C
+ATOM 1038 CD LYS A 141 -16.530 1.125 -4.307 1.00 96.60 C
+ATOM 1039 CE LYS A 141 -17.134 2.518 -4.171 1.00 96.60 C
+ATOM 1040 NZ LYS A 141 -18.414 2.601 -4.901 1.00 96.60 N
+ATOM 1041 N GLU A 142 -13.924 -3.684 -4.479 1.00 96.32 N
+ATOM 1042 CA GLU A 142 -13.527 -4.922 -5.170 1.00 96.32 C
+ATOM 1043 C GLU A 142 -14.646 -5.481 -6.065 1.00 96.32 C
+ATOM 1044 CB GLU A 142 -13.081 -5.962 -4.127 1.00 96.32 C
+ATOM 1045 O GLU A 142 -14.396 -5.836 -7.216 1.00 96.32 O
+ATOM 1046 CG GLU A 142 -12.740 -7.315 -4.775 1.00 96.32 C
+ATOM 1047 CD GLU A 142 -11.996 -8.269 -3.833 1.00 96.32 C
+ATOM 1048 OE1 GLU A 142 -11.043 -8.932 -4.314 1.00 96.32 O
+ATOM 1049 OE2 GLU A 142 -12.308 -8.303 -2.623 1.00 96.32 O
+ATOM 1050 N GLU A 143 -15.886 -5.507 -5.571 1.00 94.50 N
+ATOM 1051 CA GLU A 143 -17.037 -5.992 -6.344 1.00 94.50 C
+ATOM 1052 C GLU A 143 -17.321 -5.120 -7.574 1.00 94.50 C
+ATOM 1053 CB GLU A 143 -18.293 -6.039 -5.459 1.00 94.50 C
+ATOM 1054 O GLU A 143 -17.719 -5.636 -8.608 1.00 94.50 O
+ATOM 1055 CG GLU A 143 -18.186 -7.036 -4.293 1.00 94.50 C
+ATOM 1056 CD GLU A 143 -19.479 -7.151 -3.462 1.00 94.50 C
+ATOM 1057 OE1 GLU A 143 -19.496 -7.995 -2.535 1.00 94.50 O
+ATOM 1058 OE2 GLU A 143 -20.454 -6.411 -3.736 1.00 94.50 O
+ATOM 1059 N GLU A 144 -17.087 -3.807 -7.491 1.00 94.46 N
+ATOM 1060 CA GLU A 144 -17.305 -2.878 -8.607 1.00 94.46 C
+ATOM 1061 C GLU A 144 -16.183 -2.972 -9.654 1.00 94.46 C
+ATOM 1062 CB GLU A 144 -17.495 -1.458 -8.031 1.00 94.46 C
+ATOM 1063 O GLU A 144 -16.438 -2.761 -10.833 1.00 94.46 O
+ATOM 1064 CG GLU A 144 -17.913 -0.390 -9.064 1.00 94.46 C
+ATOM 1065 CD GLU A 144 -18.100 1.020 -8.460 1.00 94.46 C
+ATOM 1066 OE1 GLU A 144 -18.119 2.007 -9.229 1.00 94.46 O
+ATOM 1067 OE2 GLU A 144 -18.266 1.162 -7.219 1.00 94.46 O
+ATOM 1068 N LEU A 145 -14.961 -3.332 -9.244 1.00 92.47 N
+ATOM 1069 CA LEU A 145 -13.836 -3.560 -10.158 1.00 92.47 C
+ATOM 1070 C LEU A 145 -13.966 -4.881 -10.934 1.00 92.47 C
+ATOM 1071 CB LEU A 145 -12.540 -3.538 -9.326 1.00 92.47 C
+ATOM 1072 O LEU A 145 -13.418 -5.020 -12.024 1.00 92.47 O
+ATOM 1073 CG LEU A 145 -11.241 -3.708 -10.137 1.00 92.47 C
+ATOM 1074 CD1 LEU A 145 -11.015 -2.586 -11.148 1.00 92.47 C
+ATOM 1075 CD2 LEU A 145 -10.056 -3.706 -9.173 1.00 92.47 C
+ATOM 1076 N THR A 146 -14.643 -5.869 -10.347 1.00 89.15 N
+ATOM 1077 CA THR A 146 -14.746 -7.238 -10.883 1.00 89.15 C
+ATOM 1078 C THR A 146 -16.092 -7.555 -11.542 1.00 89.15 C
+ATOM 1079 CB THR A 146 -14.414 -8.279 -9.802 1.00 89.15 C
+ATOM 1080 O THR A 146 -16.254 -8.661 -12.066 1.00 89.15 O
+ATOM 1081 CG2 THR A 146 -12.952 -8.206 -9.357 1.00 89.15 C
+ATOM 1082 OG1 THR A 146 -15.195 -8.107 -8.642 1.00 89.15 O
+ATOM 1083 N ALA A 147 -17.037 -6.611 -11.517 1.00 87.34 N
+ATOM 1084 CA ALA A 147 -18.352 -6.709 -12.156 1.00 87.34 C
+ATOM 1085 C ALA A 147 -18.301 -6.389 -13.658 1.00 87.34 C
+ATOM 1086 CB ALA A 147 -19.326 -5.786 -11.410 1.00 87.34 C
+ATOM 1087 O ALA A 147 -19.040 -7.071 -14.409 1.00 87.34 O
+ATOM 1088 OXT ALA A 147 -17.582 -5.437 -14.021 1.00 87.34 O
+TER 1089 ALA A 147
+ENDMDL
+END
\ No newline at end of file
--- /dev/null
+[{"predicted_aligned_error":[[0,1,4,4,6,7,9,14,15,16,16,15,14,15,18,17,20,18,19,19,21,21,21,24,25,25,24,26,27,26,27,28,30,29,29,29,29,29,29,29,29,30,30,30,30,30,30,30,29,31,30,31,31,31,31,30,30,30,29,30,30,30,30,30,30,31,30,30,31,31,30,31,30,31,30,31,31,30,31,31,30,31,30,30,31,30,30,28,28,31,31,31,30,29,31,30,30,31,31,31,31,31,30,31,30,31,31,30,30,31,30,30,30,31,30,31,30,30,31,30,31,31,30,31,30,31,30,31,30,31,31,31,30,31,30,30,31,30,30,30,30,31,29,30,31,29,30],[3,0,1,3,4,6,6,8,11,13,14,15,12,14,17,16,18,19,19,19,19,21,22,24,26,24,25,26,26,27,29,28,30,29,29,29,30,30,30,31,30,31,31,31,31,31,31,31,30,31,31,31,31,31,31,30,31,30,31,30,30,30,30,30,30,31,30,31,31,31,30,30,30,31,31,30,31,31,30,30,31,31,30,30,31,30,31,29,28,31,30,31,29,28,31,30,31,31,31,31,31,30,30,31,31,31,31,31,30,31,30,30,31,31,30,30,30,31,31,31,31,31,31,31,30,31,30,30,31,30,30,30,30,31,31,30,31,30,31,31,31,31,30,30,31,29,29],[6,3,0,1,3,5,5,6,8,10,13,13,12,14,17,16,18,19,20,21,19,21,22,23,26,24,24,27,26,27,28,28,30,29,29,30,30,30,30,30,29,30,30,31,31,31,31,31,30,31,31,31,31,31,31,31,31,30,30,30,30,31,30,30,30,31,31,31,31,31,30,31,31,31,31,31,31,31,31,30,31,31,31,30,31,30,31,30,28,31,30,31,29,28,31,30,31,31,31,31,31,30,30,31,30,31,30,31,30,31,30,30,31,31,30,30,30,30,31,31,31,31,31,31,30,31,30,30,31,31,31,31,31,31,31,30,31,30,31,31,31,31,30,30,31,30,30],[6,6,3,0,1,4,4,5,5,7,10,10,11,12,16,16,17,17,17,18,17,18,18,20,22,22,21,24,25,26,27,26,29,28,28,29,29,30,29,30,28,30,29,30,30,30,30,30,30,31,30,30,30,31,31,31,30,30,30,29,30,30,30,30,30,30,30,30,30,30,29,30,30,30,31,30,30,30,30,30,30,30,30,29,31,30,30,28,26,31,28,31,27,28,31,30,31,31,31,30,31,30,29,30,30,30,30,30,30,30,30,29,30,31,29,30,30,30,31,30,30,30,30,31,30,31,30,30,31,30,30,30,30,30,30,30,31,30,31,31,31,30,30,30,31,29,29],[6,6,7,3,0,1,3,4,5,5,7,9,10,10,13,14,17,16,17,18,16,18,18,21,22,21,21,24,24,26,27,26,28,27,27,28,30,30,29,30,27,29,28,30,29,30,30,30,30,31,30,30,30,30,31,31,30,30,30,29,30,30,29,30,30,30,30,30,30,30,29,30,29,30,30,30,30,30,30,30,30,29,30,29,31,30,30,28,26,31,27,30,26,28,31,30,30,30,30,30,30,30,29,30,29,30,30,30,30,30,30,29,30,31,29,30,30,30,31,30,30,30,30,30,30,30,29,29,31,30,30,30,30,30,30,30,30,29,30,30,30,30,29,30,31,29,29],[7,6,7,7,3,0,1,4,4,6,5,7,9,9,12,13,16,16,17,17,16,17,18,20,22,21,21,24,24,26,27,27,28,27,27,28,29,30,29,30,27,29,28,30,29,30,30,30,30,30,30,30,30,30,31,30,30,30,30,29,30,30,30,30,30,30,30,30,30,30,29,30,29,31,30,30,30,30,30,30,30,29,30,29,31,30,30,28,25,31,27,30,26,28,31,30,30,31,31,30,30,30,29,30,29,30,30,30,30,30,30,29,30,31,29,30,30,30,31,30,30,30,30,30,30,31,29,30,31,30,30,30,30,30,30,30,30,30,30,31,30,30,30,30,31,29,29],[8,5,6,7,7,3,0,1,5,5,5,5,7,8,11,13,15,16,17,17,15,17,18,19,21,20,21,23,24,26,27,26,28,27,26,28,29,29,29,30,28,29,28,30,29,29,30,30,30,31,30,30,30,31,30,30,30,31,30,29,30,30,30,30,30,30,30,30,30,30,29,30,29,31,30,30,30,30,31,30,30,29,30,29,31,30,30,29,26,31,28,30,27,29,31,30,30,31,31,31,31,30,30,31,30,30,30,30,30,30,30,29,30,31,30,30,30,30,31,30,31,30,30,30,30,31,29,30,31,30,30,31,30,31,30,30,31,30,30,30,31,30,29,30,31,29,30],[10,7,6,5,6,5,3,0,1,4,5,6,6,7,11,12,15,19,18,16,17,17,19,19,21,20,21,24,24,26,27,26,27,26,26,28,29,29,29,30,28,29,29,29,30,29,30,30,29,30,30,30,30,31,30,30,30,31,30,30,30,30,30,30,30,30,30,30,30,30,29,30,30,31,30,30,30,30,30,30,30,30,30,30,31,30,30,30,27,31,27,31,28,29,31,30,31,30,31,31,31,30,30,31,30,30,30,30,30,30,30,29,30,31,30,30,30,30,30,31,31,31,30,31,29,31,30,29,30,30,31,30,30,30,31,30,31,30,30,30,31,30,30,30,31,29,30],[13,9,7,5,5,6,6,3,0,2,4,6,5,6,9,10,12,12,16,15,17,16,17,18,20,20,21,23,23,25,27,26,27,26,26,27,29,29,29,29,27,29,29,30,29,30,30,30,30,30,30,30,30,31,30,30,31,31,30,30,30,31,30,30,30,30,30,30,30,30,29,30,30,30,30,30,30,30,31,30,30,30,30,30,31,30,30,29,27,31,28,31,28,29,30,30,31,30,31,31,31,31,30,31,30,31,30,30,30,30,29,29,31,31,30,31,31,31,30,31,31,31,30,31,29,31,30,28,30,30,30,31,30,31,31,30,31,31,30,31,31,30,30,31,31,29,30],[15,12,9,7,5,6,6,5,3,0,1,4,4,5,7,8,10,11,14,14,15,15,17,18,21,20,21,22,23,24,26,26,28,27,27,28,29,29,30,30,28,29,29,30,30,30,30,30,30,30,30,30,30,31,31,31,31,31,30,30,30,31,30,30,30,30,30,30,30,30,30,30,30,31,31,30,30,30,30,30,30,30,31,30,31,30,30,30,27,31,28,31,29,29,31,30,31,31,31,31,31,31,30,31,30,31,30,30,30,30,31,29,31,31,30,30,31,31,31,30,31,31,30,31,30,31,29,30,30,30,31,30,31,31,31,31,31,30,31,31,31,31,30,31,31,30,29],[19,15,12,10,8,6,6,7,6,3,0,2,5,5,7,7,10,12,14,15,17,14,17,18,20,20,20,23,22,23,25,24,26,24,24,26,29,28,29,29,27,29,29,29,29,30,30,29,30,30,30,30,31,31,30,31,30,31,30,30,31,31,30,30,31,30,30,30,31,30,30,30,30,30,30,30,30,30,31,30,30,30,30,30,31,30,30,30,28,31,28,31,28,30,30,31,31,31,31,31,30,31,30,31,30,30,30,30,30,30,30,29,31,31,30,31,31,30,30,31,31,31,31,31,29,31,30,29,30,31,30,30,30,31,30,31,30,31,30,31,31,30,30,31,31,30,30],[21,17,14,12,10,7,6,7,7,6,3,0,1,3,5,6,7,7,11,12,15,15,16,18,20,18,19,21,21,22,24,25,26,25,25,27,29,28,29,29,27,29,29,29,30,30,30,30,30,31,30,30,30,31,30,31,30,31,31,30,30,31,30,30,30,30,30,30,30,30,29,30,30,30,30,30,30,30,30,30,30,30,31,30,31,30,30,30,28,31,27,31,28,29,31,30,31,31,31,30,31,31,30,31,29,31,29,31,29,29,31,29,30,31,30,30,30,31,31,30,31,31,30,31,30,30,30,30,30,30,30,30,30,30,30,31,31,30,31,30,31,31,30,31,31,30,30],[21,17,15,15,12,10,8,6,6,7,7,3,0,1,5,5,6,7,9,12,12,13,15,17,18,18,18,20,20,21,23,22,25,23,22,26,28,28,29,28,27,28,27,28,28,29,28,29,29,30,30,30,30,31,30,31,30,31,30,30,30,31,30,30,30,30,30,30,30,30,28,29,30,30,30,29,30,30,30,29,30,30,30,29,31,30,30,29,27,31,27,30,28,29,31,30,30,30,31,30,30,30,29,30,29,30,29,30,29,29,30,28,31,31,30,30,30,30,30,30,31,30,30,30,29,30,29,29,30,30,30,30,30,30,30,30,30,30,30,30,31,30,30,31,30,30,30],[22,19,16,16,14,13,10,8,6,7,6,9,4,0,1,5,5,5,7,9,9,11,12,15,17,17,16,17,19,20,23,21,24,23,22,25,29,27,29,29,26,28,27,28,29,29,29,29,30,30,30,30,30,31,30,31,30,31,31,30,30,30,30,30,30,30,30,30,30,30,29,30,30,30,30,29,30,30,30,30,30,29,30,29,30,30,30,30,28,31,26,30,28,30,31,30,30,30,31,30,30,31,30,31,29,30,29,30,30,28,30,28,31,31,30,30,30,30,31,30,31,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,31,30,30,31,31,30,31],[26,23,21,22,20,17,14,14,9,7,7,6,7,3,0,1,4,5,6,8,8,10,12,16,20,17,16,18,19,20,21,20,23,23,21,26,27,28,28,28,27,28,27,29,28,30,29,28,30,29,30,30,30,31,30,30,30,30,30,30,30,30,30,30,30,30,30,29,29,29,28,29,30,30,30,28,29,30,30,30,29,30,30,29,30,30,30,30,28,30,26,30,28,29,30,31,30,30,31,30,30,31,30,30,29,30,29,30,29,28,30,28,30,31,30,30,30,30,30,30,30,30,30,30,29,30,29,29,30,29,30,30,30,30,29,30,30,30,30,30,30,31,30,30,30,30,30],[25,24,21,22,21,20,17,16,13,8,7,7,7,6,3,0,1,4,5,6,6,9,10,12,17,17,17,18,18,19,19,20,24,21,20,25,26,27,27,28,26,28,27,28,28,29,29,29,29,30,30,29,30,30,30,30,30,31,30,30,30,30,30,30,30,30,30,29,29,30,28,29,30,30,30,28,29,30,30,29,29,29,30,30,30,30,30,30,29,31,27,30,29,30,30,30,30,31,31,31,30,31,30,30,30,30,29,30,30,29,30,29,31,31,30,31,31,30,31,31,31,31,30,30,30,30,29,30,30,30,30,30,29,30,30,30,30,30,30,30,30,31,30,30,31,30,30],[26,23,21,22,22,20,17,17,15,10,9,6,6,6,4,2,0,1,3,4,6,6,9,11,15,15,15,17,18,19,18,20,22,21,20,25,27,25,26,28,25,28,26,28,27,28,29,29,29,30,30,30,30,31,30,30,30,31,30,30,30,30,30,30,30,30,30,30,30,30,29,30,30,30,30,29,30,31,30,30,30,29,31,30,31,30,30,30,28,30,28,30,30,29,30,30,30,30,30,30,30,31,30,30,30,31,30,30,30,29,31,29,30,31,30,30,30,31,31,30,30,30,30,30,30,30,29,29,30,30,30,30,30,30,30,30,30,30,30,31,30,30,30,30,31,30,30],[27,25,23,25,23,23,21,20,19,13,11,8,5,6,4,5,2,0,1,4,4,6,6,8,11,13,13,18,18,19,18,18,22,20,20,24,27,25,27,26,24,27,27,28,27,29,29,29,29,30,30,30,30,31,30,31,30,31,30,30,30,31,30,30,30,30,30,29,30,30,29,29,30,30,30,30,30,30,31,30,30,30,30,30,31,30,30,30,29,31,27,30,29,30,31,30,30,30,31,31,31,31,30,31,30,31,30,31,30,29,30,29,31,31,31,31,31,31,31,31,31,31,31,30,30,30,30,29,30,31,30,30,30,31,30,31,30,31,30,31,31,31,30,30,30,30,31],[25,23,22,23,21,20,18,18,18,14,13,11,8,6,5,4,4,1,0,1,3,4,5,6,9,11,13,14,16,18,18,19,21,20,20,24,26,25,27,27,25,27,26,28,27,28,28,29,29,30,30,29,29,30,30,30,30,31,30,30,30,31,30,30,30,30,30,30,30,29,28,30,30,30,30,30,30,30,30,29,30,29,31,30,30,30,30,30,28,30,28,30,30,30,30,30,30,30,30,30,30,30,30,30,30,31,30,30,30,29,30,30,30,31,30,30,31,31,31,30,31,30,30,30,29,30,29,29,29,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,31,30,30],[27,25,24,24,25,24,23,21,22,17,16,14,9,8,6,6,5,5,3,0,1,3,5,7,8,10,12,12,16,14,18,17,21,20,19,23,25,25,25,26,23,27,25,28,26,28,28,28,30,30,30,30,30,31,31,30,31,30,30,30,30,31,31,30,31,30,30,30,30,30,28,30,31,31,31,29,30,30,30,29,30,30,30,30,31,31,31,31,30,30,27,30,30,30,31,31,31,31,31,31,31,30,30,31,30,31,29,31,30,29,31,30,30,31,31,31,31,31,31,31,30,31,31,31,31,31,30,29,30,30,30,29,30,30,30,30,31,30,31,31,31,31,30,30,31,31,30],[26,25,25,26,25,24,23,22,22,20,19,17,14,12,7,7,6,5,5,3,0,1,5,6,8,8,10,11,16,17,17,21,22,20,21,24,26,26,26,25,23,27,26,28,27,29,29,30,30,30,30,30,30,31,30,31,30,31,30,30,30,31,30,31,31,30,30,30,31,30,29,30,30,30,30,30,31,31,31,30,31,31,31,30,31,31,30,31,29,30,29,31,30,30,31,31,31,31,31,31,30,31,30,31,30,30,30,30,30,29,30,30,30,31,31,31,31,31,30,31,31,31,31,30,30,30,30,30,31,30,30,30,30,30,30,31,30,31,30,31,31,31,30,30,31,31,31],[26,24,23,25,25,23,24,22,21,20,18,17,14,12,11,8,6,5,5,5,1,0,1,4,6,7,8,8,12,14,15,17,20,19,18,23,25,23,25,25,23,27,27,27,27,28,28,28,29,30,29,28,29,31,30,31,30,31,30,30,30,31,30,31,31,30,30,29,30,29,28,30,30,30,30,29,30,30,30,29,31,30,31,30,31,30,30,30,29,31,29,30,30,30,30,30,30,30,30,31,30,30,30,30,30,30,29,30,30,29,30,30,30,31,31,30,30,31,30,30,31,30,30,30,29,30,28,29,29,30,30,29,30,30,30,31,30,31,30,30,30,30,30,30,30,30,30],[28,26,26,26,24,24,23,22,22,20,19,17,16,14,14,10,6,6,5,4,4,1,0,1,4,6,8,7,10,12,13,15,18,17,16,22,24,23,24,23,23,25,25,27,26,28,28,28,29,30,29,29,29,30,30,31,30,31,30,30,30,31,31,31,31,30,30,29,30,29,28,30,30,30,30,29,30,30,30,29,31,30,31,30,31,30,30,30,30,30,29,30,30,31,30,30,30,31,31,31,30,31,30,30,30,30,30,30,30,29,30,30,30,31,31,30,30,31,30,30,31,30,31,30,30,30,30,29,29,30,30,30,30,30,30,31,30,31,30,31,31,30,30,30,31,31,31],[28,28,26,28,27,27,26,24,24,22,23,20,20,19,18,15,10,7,6,6,6,7,3,0,1,6,7,7,7,9,11,15,16,16,16,21,24,24,24,24,23,26,24,27,25,27,28,28,28,30,29,29,29,31,29,31,30,31,30,30,30,31,30,31,31,30,30,29,30,29,26,29,28,30,29,28,30,30,30,30,30,30,31,30,31,31,29,30,30,30,28,30,30,31,31,30,31,31,31,31,30,31,30,31,30,29,29,30,30,28,30,29,30,30,30,30,31,31,30,30,31,30,30,30,29,30,30,29,30,29,30,29,30,30,29,31,30,31,30,31,31,31,30,31,30,30,30],[28,28,27,29,29,28,27,27,27,24,25,21,21,20,21,19,13,10,8,7,7,7,5,2,0,1,7,6,6,8,8,12,14,14,14,19,22,22,23,22,21,23,22,25,24,27,27,27,27,29,28,29,29,30,29,30,30,31,30,30,30,30,30,30,31,30,29,28,29,29,27,29,30,30,30,28,30,30,30,30,30,30,30,30,31,30,29,30,30,30,28,30,30,30,30,30,30,30,31,31,30,30,30,30,29,30,29,30,29,28,30,29,31,31,30,30,30,30,30,30,30,30,30,30,30,30,30,29,30,30,30,29,29,30,30,30,30,30,29,30,30,30,30,30,31,30,30],[29,29,28,29,29,28,28,28,28,26,28,24,23,23,23,21,15,14,12,8,8,7,7,7,4,0,1,5,5,6,6,8,10,11,12,17,20,21,22,21,20,22,23,24,25,27,27,28,29,30,30,29,30,30,29,31,30,31,30,30,30,31,30,30,31,30,29,29,30,30,28,30,30,30,30,29,30,30,30,29,30,30,30,30,31,31,29,30,30,30,28,30,30,30,30,31,31,31,31,31,30,30,30,31,30,30,30,31,30,29,30,30,30,31,30,30,31,31,31,30,31,30,30,30,30,30,30,29,30,30,30,29,29,30,29,30,30,30,30,30,31,30,30,30,31,30,31],[30,30,29,30,29,29,29,29,28,27,28,25,24,26,23,23,18,19,14,11,8,7,7,6,7,4,0,1,5,6,6,7,9,11,12,15,18,20,20,21,20,22,23,24,25,26,27,28,29,30,29,29,29,30,30,30,30,31,30,30,30,31,30,30,30,30,28,30,30,29,28,30,30,30,30,29,30,30,30,30,31,30,30,30,31,30,29,31,30,30,28,30,30,30,30,30,31,31,31,30,30,30,30,30,29,30,30,30,30,29,30,30,30,31,30,29,30,31,30,30,30,30,30,30,30,30,30,29,30,30,29,29,29,29,29,30,30,30,30,30,31,31,31,31,31,30,31],[30,30,30,30,31,30,30,29,29,28,28,26,27,25,25,25,20,22,16,12,10,8,6,7,7,9,4,0,1,5,5,7,8,10,12,17,17,19,20,21,20,22,23,24,24,26,27,28,28,30,30,30,30,30,30,31,30,31,31,30,30,31,30,30,31,30,30,30,30,30,27,30,30,31,30,29,30,30,30,30,30,30,30,30,31,30,30,30,30,31,29,30,30,30,31,31,30,31,30,31,30,31,31,30,30,30,30,31,30,29,31,30,31,31,30,30,31,31,30,30,30,31,30,30,30,31,29,29,30,30,30,30,30,30,30,31,30,31,30,30,31,30,30,30,30,30,31],[29,29,28,29,29,28,27,26,27,26,26,24,24,24,23,23,19,20,17,15,12,10,8,7,7,6,6,2,0,1,4,6,7,9,9,14,17,18,18,19,20,21,24,24,23,25,27,28,28,30,29,27,30,30,29,31,30,31,30,30,30,31,30,30,30,30,29,29,29,29,28,29,30,29,30,29,29,30,30,28,30,29,30,30,30,30,29,30,29,30,28,29,30,30,30,30,29,30,30,30,30,30,31,30,30,30,29,30,30,30,30,30,31,30,30,30,30,30,30,30,31,30,30,29,29,30,28,28,29,30,30,28,30,30,29,30,30,31,29,30,30,30,30,30,30,30,30],[30,29,29,30,30,30,30,29,29,28,27,27,26,26,26,24,23,23,20,19,14,13,11,7,7,7,6,5,3,0,2,6,6,7,7,11,14,17,17,17,18,20,21,22,23,24,26,27,27,30,28,29,30,30,30,31,31,31,31,30,30,31,30,31,31,31,29,30,30,30,29,30,30,30,31,30,30,30,31,30,31,30,31,31,31,30,30,31,30,31,29,30,30,30,31,30,31,31,30,31,30,30,30,30,30,30,30,31,30,30,31,30,31,31,31,30,31,31,30,30,30,31,30,30,30,30,30,30,29,30,29,28,30,30,30,31,30,30,30,31,31,31,30,31,31,30,30],[28,29,28,29,29,29,28,27,28,27,25,25,25,25,24,24,21,22,19,17,15,14,12,11,8,8,7,6,5,2,0,1,4,7,7,8,11,14,15,15,16,19,19,21,21,23,26,27,29,30,29,29,31,31,30,31,30,31,31,31,31,31,31,31,31,31,30,30,30,30,29,30,31,31,31,30,31,31,31,30,31,31,31,31,31,31,30,30,30,31,29,31,30,31,31,31,31,31,31,31,30,31,31,31,31,31,30,31,31,31,31,31,31,31,31,31,31,31,31,31,31,31,31,30,31,30,31,30,30,31,31,31,31,31,30,31,30,31,30,31,31,31,31,31,31,31,31],[30,30,29,30,30,30,30,30,30,28,29,27,28,28,28,27,24,26,22,20,17,18,18,15,14,8,7,7,7,6,2,0,1,5,6,8,8,11,13,13,16,19,20,21,21,23,26,25,27,29,28,28,30,30,29,30,30,31,30,30,30,31,30,31,30,30,29,29,29,29,28,29,30,30,30,30,30,30,31,30,31,30,30,31,31,30,30,30,30,31,30,30,30,30,30,31,30,31,31,31,29,30,30,31,30,29,29,30,31,30,31,31,31,31,31,31,31,31,30,31,30,30,30,30,30,31,30,30,30,29,30,28,29,30,29,30,29,30,30,30,30,30,30,30,31,31,31],[30,30,30,30,30,30,30,29,30,30,29,29,28,28,27,27,24,26,22,21,19,19,18,17,16,12,9,7,7,6,6,3,0,2,4,6,7,8,9,11,16,19,20,20,21,22,25,25,28,29,28,28,30,30,29,30,30,31,31,30,30,31,31,31,30,30,29,30,30,29,28,29,30,30,31,29,30,30,31,29,31,30,31,30,31,30,30,30,30,31,30,30,31,30,30,31,31,31,31,30,29,30,30,30,30,29,29,31,30,29,31,31,31,31,31,30,31,31,30,30,30,30,31,29,30,30,30,29,30,30,29,30,29,30,29,30,29,30,30,31,30,31,30,31,31,31,31],[30,31,30,31,31,31,31,30,31,30,30,29,30,29,30,28,27,29,25,23,21,21,20,21,21,17,13,10,8,7,7,6,3,0,1,5,7,7,8,9,13,16,20,19,20,21,23,25,26,29,28,28,29,30,29,30,31,31,31,30,31,31,31,31,30,31,29,30,29,29,27,30,31,30,31,29,30,30,31,30,31,31,31,31,31,30,30,30,30,31,29,31,30,30,31,31,30,31,30,30,30,31,30,31,30,30,29,31,30,29,31,30,31,31,31,31,31,31,30,30,31,31,31,29,31,30,30,29,30,29,30,29,30,29,29,30,29,30,31,31,31,31,30,30,31,31,31],[30,30,30,31,31,30,30,30,31,30,30,29,30,29,29,28,27,30,26,27,24,23,23,22,21,17,15,12,10,7,8,7,7,4,0,1,6,7,8,9,12,15,17,18,21,20,23,24,27,29,26,27,29,30,29,30,31,31,31,30,30,30,30,30,29,30,28,29,28,28,27,29,30,30,30,29,29,30,31,29,30,29,30,30,31,30,30,31,31,30,30,31,31,30,30,31,31,31,31,31,29,30,30,30,30,29,29,31,29,29,31,30,31,31,31,31,31,31,30,30,30,31,31,29,31,30,30,28,30,29,29,28,29,29,29,30,30,30,30,31,31,31,31,31,31,31,31],[31,30,30,31,31,31,31,31,31,31,31,30,30,30,30,30,28,29,26,25,23,24,24,24,24,21,17,15,12,9,8,7,6,6,3,0,1,5,7,7,9,12,14,16,18,17,21,22,25,28,25,27,28,29,29,30,30,30,30,30,30,30,30,30,30,30,29,29,27,28,25,29,29,30,30,28,28,30,30,28,30,29,30,30,30,30,30,29,30,30,30,30,30,30,30,30,30,30,30,30,29,30,30,30,29,29,28,30,30,28,31,30,31,31,30,30,30,31,30,30,30,30,30,29,30,30,30,29,29,27,29,28,29,29,29,30,30,30,30,30,30,30,30,30,30,30,30],[31,31,30,31,31,31,31,31,31,30,31,30,31,31,31,30,30,30,27,26,25,25,25,25,25,21,19,20,15,12,10,8,8,8,8,3,0,2,7,6,9,9,10,13,16,16,18,20,25,27,25,28,29,30,28,30,30,30,30,30,30,30,30,30,30,30,28,28,26,26,25,29,29,29,30,26,27,30,30,27,29,29,30,30,30,30,30,30,30,30,30,30,30,29,30,30,30,30,30,30,29,29,29,30,30,28,28,30,28,28,30,30,31,30,30,30,31,30,30,29,30,31,30,28,30,31,30,29,29,28,29,28,29,29,29,30,29,30,30,30,30,31,30,30,30,31,30],[30,30,30,31,31,31,31,31,31,30,31,30,30,30,30,30,29,30,28,27,27,27,26,27,27,24,22,21,19,17,14,11,9,9,8,8,3,0,2,7,6,7,8,11,15,16,18,19,24,27,25,26,28,29,27,30,29,30,30,29,30,30,30,29,29,29,28,29,26,25,24,27,28,27,29,26,27,28,29,25,28,28,29,29,30,30,28,29,29,29,28,29,29,29,29,29,30,29,29,29,27,29,29,29,28,27,27,30,28,27,30,29,30,30,30,29,30,30,28,29,29,30,30,26,29,28,29,27,27,26,27,26,28,28,27,29,27,29,30,30,30,30,30,30,30,30,29],[31,31,31,31,31,31,31,31,31,31,31,31,31,31,31,30,29,30,27,28,26,26,26,28,29,25,24,24,20,20,16,15,11,9,7,8,8,3,0,2,8,6,7,9,11,12,14,15,19,24,22,26,25,26,27,28,29,29,30,28,29,29,27,29,28,29,26,27,24,24,22,26,28,27,28,27,25,28,29,27,28,29,29,30,29,28,29,30,29,29,28,29,29,28,29,30,26,29,29,28,27,28,27,28,27,28,24,28,28,26,29,29,30,29,30,29,29,30,29,28,28,28,29,28,28,29,26,27,27,25,27,25,25,25,26,28,28,28,29,28,29,29,30,30,29,30,30],[30,30,30,30,30,30,30,30,31,29,31,29,30,30,30,29,28,29,26,27,25,25,25,26,27,23,23,25,20,20,16,16,14,11,9,8,7,7,3,0,1,5,6,7,9,11,13,15,20,22,25,26,27,29,27,29,28,30,29,29,30,30,29,29,27,28,26,26,22,24,24,26,28,27,28,26,25,28,28,25,28,28,28,29,28,29,27,28,29,28,28,28,29,28,29,29,28,29,29,29,27,30,28,28,28,26,26,29,28,27,30,29,29,29,29,30,30,29,30,29,30,29,29,27,29,28,28,28,27,26,26,26,26,25,27,28,27,29,29,29,29,29,29,30,29,30,29],[31,30,30,31,31,30,30,31,31,30,31,30,30,30,30,30,28,30,28,27,27,27,27,29,29,25,25,27,23,22,21,21,17,13,11,11,9,7,7,3,0,2,7,6,8,10,12,13,18,23,21,23,24,25,24,28,27,29,29,29,29,29,28,26,27,27,25,26,21,22,22,25,27,25,27,25,23,27,29,25,28,28,28,29,28,29,27,29,29,28,28,28,28,29,28,29,28,28,27,28,26,28,26,26,26,24,24,28,28,26,29,28,29,29,29,30,29,29,27,28,29,28,28,24,27,26,28,24,26,25,24,24,24,24,24,26,24,28,27,29,28,29,30,29,29,30,30],[30,30,30,31,30,30,30,30,31,30,31,30,30,30,30,30,29,30,28,27,28,28,27,28,28,26,26,25,23,23,22,21,18,16,13,12,11,8,8,9,4,0,2,5,6,7,9,12,15,19,19,22,26,26,24,28,27,29,29,29,29,29,28,27,26,26,25,26,22,21,21,24,26,25,27,25,23,27,28,24,28,27,28,28,28,28,27,29,29,28,28,28,29,29,29,29,28,29,27,29,26,29,28,26,28,24,25,29,28,26,29,29,30,30,30,30,30,30,28,29,30,29,29,26,28,25,27,25,25,25,24,24,26,26,26,28,25,28,26,29,29,29,29,30,29,30,30],[31,30,30,31,31,31,31,31,31,31,31,30,31,31,31,30,30,30,30,28,29,28,28,29,29,28,27,27,24,23,23,22,20,19,15,16,14,10,9,8,6,3,0,2,6,7,9,11,13,16,19,20,23,26,25,28,28,29,29,29,29,29,28,27,26,27,24,25,21,20,21,22,27,25,28,25,22,26,29,26,27,28,28,29,29,29,27,30,30,29,28,28,29,29,29,29,29,28,27,29,26,28,28,25,27,24,24,28,28,26,29,29,30,30,29,29,30,30,28,28,29,28,29,24,28,25,28,26,26,24,24,23,26,25,25,26,24,28,27,29,28,29,30,29,29,30,29],[31,31,31,31,31,31,31,31,31,30,31,30,31,31,31,30,30,31,30,29,30,29,28,28,29,29,28,28,25,25,24,23,22,20,17,19,17,11,10,8,7,7,3,0,2,6,7,9,10,14,17,18,23,26,22,27,25,29,27,29,29,29,28,25,26,24,23,23,19,19,19,20,25,23,26,24,22,26,28,25,26,28,27,28,27,28,25,29,29,28,26,26,28,28,28,29,27,28,27,28,25,27,28,26,27,24,23,28,27,25,28,28,29,29,29,30,29,29,26,28,29,28,29,26,27,27,27,25,26,23,23,22,24,24,25,26,23,28,27,28,28,28,29,29,28,29,29],[31,30,30,31,31,31,30,31,31,30,31,31,31,31,31,30,30,30,30,29,30,29,29,30,29,29,29,28,26,26,25,24,23,22,19,19,19,14,11,9,9,8,8,3,0,1,5,7,8,11,13,18,20,24,22,25,26,27,27,28,28,28,27,25,25,25,22,21,18,16,18,19,25,21,25,23,20,26,26,25,26,27,26,28,26,28,27,29,29,28,26,26,28,29,28,28,28,27,26,27,22,26,26,22,25,22,22,27,26,25,28,28,29,29,28,29,29,28,25,27,27,26,29,22,27,23,27,25,25,21,20,21,22,22,21,23,20,27,25,28,27,29,29,29,28,29,29],[31,31,31,31,31,31,31,31,31,30,31,31,31,31,31,31,30,31,29,29,30,29,29,29,29,29,28,28,27,27,26,25,24,23,20,21,21,16,13,11,10,8,9,7,2,0,2,6,6,7,11,14,17,22,22,24,25,26,24,27,26,26,26,24,24,24,20,20,16,14,15,18,24,21,24,22,19,24,25,23,24,25,24,27,25,27,25,28,28,27,27,26,28,28,27,27,26,27,24,27,24,26,26,23,25,24,22,26,27,25,27,28,29,29,28,28,29,28,27,28,28,26,28,24,26,24,26,26,25,21,18,20,21,21,23,24,21,26,23,27,27,27,28,28,27,29,29],[31,31,31,31,31,31,31,31,31,31,31,31,31,31,31,31,31,31,31,30,30,30,30,30,30,30,29,30,28,27,26,27,25,26,22,24,24,20,18,15,13,11,10,9,8,3,0,2,5,7,8,11,12,18,18,23,22,26,24,26,25,25,22,23,22,21,17,16,14,12,14,16,21,19,24,21,17,22,24,23,21,24,24,26,24,26,25,27,26,26,25,24,28,27,25,26,23,25,23,25,21,24,23,21,23,21,21,25,25,22,25,26,27,27,26,27,26,25,25,25,24,24,25,22,24,23,24,24,23,18,14,17,17,17,19,21,21,25,24,26,26,25,27,26,26,27,27],[31,30,30,31,31,31,31,31,31,30,31,31,31,31,31,30,30,30,30,29,29,29,29,29,30,28,28,29,27,26,27,27,25,26,22,24,25,20,20,16,15,12,11,10,7,7,3,0,2,4,6,9,11,15,14,21,21,24,21,25,25,23,22,21,21,17,14,14,10,10,12,14,19,16,20,19,15,20,22,20,19,22,21,25,23,25,25,25,26,25,25,24,26,26,25,26,24,24,22,25,22,23,22,19,19,17,18,23,21,21,24,26,27,25,27,26,27,25,25,27,26,23,24,22,22,23,23,22,19,17,14,15,16,15,18,21,22,23,20,25,24,24,27,26,24,27,27],[30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,29,29,29,29,29,29,29,29,29,28,27,27,28,27,27,24,26,25,22,24,18,18,14,12,10,10,7,6,2,0,1,4,7,9,12,13,17,20,22,20,22,23,22,21,21,16,16,14,11,9,6,9,11,17,14,20,17,14,17,20,19,17,20,21,23,20,22,21,22,24,21,20,20,21,23,20,22,22,20,18,22,20,21,18,15,16,16,15,19,19,19,19,20,22,20,22,23,22,21,22,24,22,20,20,19,19,20,22,19,17,12,11,12,12,13,14,18,19,20,18,22,21,18,21,22,22,21,23],[30,30,30,30,30,30,30,30,30,30,30,30,30,30,31,30,30,30,29,29,28,28,28,29,29,28,28,28,27,26,26,27,26,26,24,27,26,23,23,21,19,17,14,13,9,9,7,6,3,0,2,4,6,8,10,14,14,18,16,19,19,18,15,14,11,11,10,7,9,4,7,10,12,11,15,12,12,13,18,15,13,20,13,19,16,19,20,23,24,20,21,18,21,22,21,21,21,19,16,20,13,16,11,12,11,10,12,15,17,18,16,21,21,18,23,21,22,20,18,22,22,16,19,14,15,15,20,16,11,13,9,9,7,7,10,10,12,17,14,20,20,19,20,20,19,21,21],[30,29,29,29,30,29,30,29,30,29,30,29,29,29,30,30,29,30,29,29,29,28,28,29,29,28,28,28,26,27,25,27,26,26,24,25,26,24,23,21,19,18,17,16,12,9,9,7,4,2,0,1,3,5,5,7,6,10,11,10,10,10,8,8,6,5,4,3,4,4,5,5,5,5,7,6,5,6,8,7,6,8,7,9,8,10,10,13,15,11,12,11,13,15,11,12,11,10,8,11,9,9,8,9,8,7,8,9,10,10,11,12,15,10,14,12,13,13,11,12,13,9,10,9,9,7,10,9,7,7,5,5,6,6,7,7,8,9,8,11,11,11,12,13,10,14,14],[29,29,29,29,29,29,29,29,29,29,29,30,29,28,29,29,28,29,28,28,28,27,26,27,27,28,28,26,26,25,25,25,25,24,23,24,23,22,21,20,18,18,17,16,13,10,7,7,5,3,1,0,1,1,2,3,3,4,5,6,7,6,4,4,3,3,2,2,2,2,2,3,3,3,4,4,3,4,4,4,3,5,4,5,4,5,5,7,7,4,6,5,7,7,7,7,5,5,5,4,4,4,3,4,3,3,4,4,5,5,5,6,7,6,6,7,6,6,6,7,6,5,5,5,4,4,5,4,4,3,2,3,2,2,2,3,4,4,4,5,6,6,5,7,6,6,6],[27,28,29,29,29,29,29,28,29,28,28,28,29,29,29,28,27,29,27,26,26,26,26,27,26,27,26,26,25,24,25,24,24,24,23,24,24,23,21,23,18,17,16,16,12,9,7,5,4,3,1,1,0,1,1,1,2,2,3,4,4,3,2,2,2,1,1,1,1,1,2,2,2,2,2,2,2,2,3,2,2,3,3,3,3,4,3,4,4,4,3,4,4,4,3,4,3,3,3,2,2,2,2,2,2,2,2,3,3,3,3,4,4,3,4,4,4,4,3,3,3,3,3,3,3,3,3,3,2,2,2,2,2,2,2,2,2,2,3,3,3,4,4,4,4,5,4],[28,29,28,28,29,28,28,28,28,27,28,28,28,27,28,28,27,28,27,27,27,27,27,28,27,27,26,25,26,26,25,24,24,25,22,22,23,21,18,21,16,17,16,17,13,11,9,5,5,3,2,1,1,0,1,1,1,2,2,3,3,2,2,2,2,1,1,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,3,3,3,3,3,3,3,3,3,3,3,2,2,2,2,2,2,2,2,2,2,2,2,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,2,2,2,2,2,2,2,1,2,1,2,1,1,1,2,2,2,2,3,3,3,3,3,3],[27,27,27,28,28,28,28,28,28,28,28,27,28,27,28,28,27,29,27,28,27,27,26,27,26,27,26,26,25,25,24,23,25,24,21,23,23,22,21,22,20,19,18,18,13,11,10,6,5,3,2,1,1,1,0,1,1,1,2,2,3,2,2,1,1,1,1,2,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,3,3,3,3,2,3,3,2,2,3,2,2,2,2,2,2,2,2,2,2,3,2,3,3,3,3,3,3,3,3,3,2,3,2,2,2,2,2,2,2,2,2,2,2,1,1,1,1,1,1,1,2,2,2,3,3,3,3,3,4],[28,28,28,28,28,28,28,27,27,27,27,28,28,27,27,27,26,28,26,26,26,26,26,26,25,27,26,25,26,25,25,25,24,24,23,24,23,21,19,21,18,17,16,17,13,12,10,7,5,3,2,2,1,1,1,0,1,1,1,2,2,2,2,1,1,1,1,2,2,2,2,2,2,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,3,2,3,2,3,3,2,2,2,2,2,1,1,1,2,2,2,2,2,2,3,3,2,3,3,2,3,3,3,3,2,3,2,2,2,2,2,2,2,2,2,2,1,2,1,1,1,1,1,1,1,2,2,2,3,3,3,3,3],[29,29,29,29,29,29,29,29,29,29,29,29,29,28,29,29,28,29,28,27,27,27,27,28,28,28,27,27,27,27,27,25,26,26,23,25,24,23,22,23,20,19,19,19,15,13,12,8,6,4,3,2,2,1,1,1,0,1,2,2,2,2,2,1,1,2,2,2,2,2,3,3,2,2,2,2,2,2,2,2,2,2,2,2,2,2,3,3,3,3,3,3,3,3,2,2,2,2,2,2,2,2,2,2,2,2,2,2,3,3,3,3,3,3,3,3,3,3,2,3,3,2,2,2,2,2,2,2,2,2,2,2,2,2,1,1,1,1,2,2,2,2,3,3,3,3,3],[27,27,28,28,29,28,28,28,28,28,27,28,28,28,28,28,27,27,27,26,26,27,26,27,26,27,26,26,26,25,25,25,25,25,23,25,24,23,22,22,20,19,18,18,15,13,11,8,6,5,4,3,2,2,1,1,1,0,1,1,2,2,2,1,2,2,2,2,2,3,3,3,2,2,2,2,2,2,2,3,2,3,2,2,2,2,2,3,3,3,3,3,3,3,2,2,2,2,2,2,2,2,2,2,2,2,2,2,3,3,3,3,3,3,3,3,3,3,3,3,3,2,2,2,2,2,2,2,2,2,2,3,2,2,2,2,1,1,1,2,2,2,3,3,3,3,4],[28,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,28,26,27,28,28,27,28,28,28,27,28,27,27,26,27,26,24,26,25,24,23,23,21,20,19,19,15,15,13,10,8,7,5,4,3,3,2,2,2,1,0,1,3,2,2,2,3,3,4,4,4,4,5,5,3,3,3,4,4,3,3,4,4,4,3,3,2,3,4,4,4,4,4,4,4,4,4,3,3,3,3,3,3,3,3,3,4,3,4,4,5,4,4,5,4,4,5,5,5,5,4,4,4,4,3,4,3,3,3,3,3,4,3,4,3,3,3,2,2,2,2,2,3,4,3,4,4,5,5],[28,28,28,29,29,29,29,29,29,29,29,28,29,29,29,28,28,28,28,27,27,27,27,27,27,28,27,27,27,27,26,26,27,25,24,26,25,25,24,24,22,21,20,20,17,16,14,11,9,7,6,6,5,5,4,3,2,1,1,0,1,2,3,3,3,4,5,5,6,5,5,6,4,3,3,4,4,4,4,5,5,5,4,5,3,3,4,5,5,5,5,4,5,5,4,4,3,3,3,3,4,4,4,5,5,4,5,4,5,5,4,5,4,4,5,5,5,5,5,5,6,4,4,4,3,4,3,4,4,5,4,5,5,4,3,3,3,3,2,3,4,5,4,5,4,5,5],[28,28,28,29,29,29,29,28,28,29,28,28,29,29,28,28,28,27,28,27,27,28,28,27,27,28,28,27,28,27,28,27,27,26,25,26,27,26,25,24,23,22,21,21,18,18,15,13,12,10,10,9,9,7,6,5,4,3,4,1,0,1,3,4,5,7,10,9,11,11,11,10,7,6,5,7,7,6,7,9,7,8,7,6,6,6,6,7,8,8,9,7,7,6,6,6,5,4,5,5,6,6,7,8,10,8,9,9,9,10,8,8,7,7,7,8,8,7,8,9,8,7,5,6,5,6,6,8,8,9,8,10,12,7,7,6,5,4,4,4,5,5,6,6,6,5,6],[29,29,29,29,29,29,29,29,29,29,29,29,30,29,29,29,29,29,28,28,27,28,27,28,28,28,28,28,28,28,27,27,27,27,25,26,26,26,25,24,22,22,20,20,18,17,14,12,9,10,7,6,6,4,4,3,2,3,2,2,1,0,1,3,2,4,5,6,7,7,8,8,6,5,5,7,5,5,6,7,5,7,5,5,5,6,7,8,10,10,10,9,9,10,8,7,6,7,8,7,7,6,7,8,7,6,8,8,8,10,10,9,9,8,9,8,9,9,7,7,8,7,7,7,7,7,8,9,6,6,7,7,7,5,5,4,4,5,4,5,7,5,5,7,7,7,8],[28,28,28,29,29,28,29,28,28,28,28,28,28,28,29,29,28,29,28,28,27,28,27,28,28,28,27,28,27,26,27,27,26,26,25,25,26,24,23,23,21,21,20,19,17,15,13,10,8,7,7,4,4,3,2,3,2,2,3,2,3,1,0,1,2,2,4,3,5,5,5,5,4,4,4,5,3,4,4,4,3,4,3,4,4,5,5,7,6,7,7,5,6,6,6,6,4,4,5,5,4,4,5,5,5,4,6,5,7,7,6,6,7,7,7,7,7,7,6,6,6,5,5,4,5,5,5,5,4,4,4,5,6,4,4,3,2,3,3,5,5,5,5,6,5,6,8],[27,28,28,28,28,28,29,28,28,28,28,28,28,28,28,29,28,28,28,26,27,27,27,27,26,28,27,26,27,26,27,26,26,25,24,25,25,24,24,23,20,21,20,20,16,15,13,10,7,5,4,3,3,2,2,2,1,2,2,2,3,1,1,0,1,1,2,2,3,3,4,3,3,3,3,3,2,3,3,3,2,3,2,3,3,4,3,4,5,4,6,5,5,5,5,4,3,3,4,3,3,3,3,3,4,4,4,4,5,5,5,6,5,6,6,5,5,5,5,5,5,4,4,4,3,4,3,3,3,3,3,4,3,2,3,2,2,3,3,3,3,4,4,4,4,5,5],[28,28,28,28,28,28,28,28,28,28,28,28,28,27,28,28,28,28,28,28,27,27,26,27,27,28,27,26,26,26,25,25,25,25,23,24,24,23,21,22,19,20,19,18,15,14,12,9,7,5,3,2,2,2,2,2,1,2,2,2,3,2,2,1,0,1,1,2,2,2,3,2,2,2,2,2,2,2,2,2,2,3,2,3,3,3,4,4,4,4,4,4,4,4,4,4,3,3,3,3,3,3,3,3,3,3,3,3,4,4,4,4,4,4,4,4,4,4,4,4,4,3,3,3,3,3,3,3,3,3,2,3,3,2,2,2,2,2,3,3,3,4,4,4,4,4,4],[27,27,28,28,29,29,29,28,28,29,28,28,28,29,28,28,28,28,28,26,26,27,27,26,27,27,26,26,26,26,26,25,26,25,22,26,25,25,23,20,20,20,17,18,16,13,10,7,5,4,2,2,1,1,1,1,1,2,2,3,3,2,2,1,1,0,1,1,1,2,2,2,2,1,2,2,2,1,2,2,2,2,2,2,2,3,3,3,4,3,3,3,4,4,3,3,3,3,2,2,3,2,2,2,3,3,3,3,3,3,3,4,4,4,4,4,4,4,4,4,3,3,3,3,2,2,2,3,2,2,2,2,2,2,2,2,2,2,2,3,3,3,4,4,4,4,4],[27,28,28,29,28,28,28,28,26,27,27,27,28,27,27,27,27,27,26,26,26,26,26,26,26,27,26,26,26,25,25,24,25,23,22,24,23,24,22,20,18,19,17,17,14,12,10,7,5,4,2,2,1,2,2,2,2,3,3,3,4,3,2,2,1,1,0,1,1,1,2,2,2,2,2,2,2,2,2,2,2,2,2,3,2,3,3,3,3,3,3,3,3,4,3,3,3,3,3,3,3,3,3,3,3,3,2,3,3,3,3,3,4,4,4,4,4,4,3,4,4,3,3,3,3,3,3,2,2,2,2,2,2,2,2,2,2,3,3,3,4,4,4,4,4,5,5],[27,27,28,29,29,29,28,28,28,28,28,28,29,29,28,28,27,28,27,26,26,26,26,27,27,27,26,26,26,24,25,25,25,24,22,25,25,24,23,21,20,19,17,18,13,11,9,6,5,4,2,1,1,1,2,2,2,3,3,4,3,3,2,2,2,1,1,0,1,1,1,1,2,2,2,2,2,2,2,2,2,2,2,3,3,3,3,3,3,3,3,3,3,4,3,3,4,3,3,3,3,3,3,3,2,2,2,3,3,3,3,3,3,3,4,3,4,4,3,4,4,3,3,3,3,2,3,2,2,2,2,2,2,2,2,2,2,3,3,3,3,4,4,4,4,5,5],[27,27,27,28,28,28,28,27,27,27,27,27,28,28,27,28,27,28,27,26,27,27,27,26,26,27,26,26,26,25,25,25,25,24,21,25,23,23,21,21,19,18,15,15,12,10,8,7,5,5,2,1,1,2,2,2,2,3,3,4,3,3,3,2,2,1,1,1,0,1,2,2,1,2,2,2,1,2,2,2,2,2,2,3,2,3,3,3,3,3,3,2,3,4,3,3,3,3,3,3,3,3,3,2,2,2,2,2,2,2,3,3,3,3,3,3,4,4,3,3,3,3,3,2,2,2,2,2,2,1,1,2,2,2,2,2,2,3,3,3,4,3,4,4,4,4,5],[27,27,28,28,28,28,29,26,26,28,26,27,27,27,27,28,27,28,27,27,25,25,25,24,23,25,25,24,24,24,25,23,24,23,21,22,23,23,21,21,18,17,15,15,12,10,9,7,5,4,3,2,2,3,2,3,3,4,4,5,4,5,3,3,3,3,2,2,1,0,1,2,2,2,2,2,2,2,3,3,3,4,3,4,3,4,3,4,4,3,3,3,3,4,4,4,4,3,3,3,3,4,4,4,3,3,2,3,3,3,3,3,4,3,4,4,4,4,3,4,5,3,4,3,3,3,3,2,2,2,2,2,2,3,3,3,3,4,4,4,4,4,5,5,4,5,5],[28,27,28,28,28,28,28,27,27,28,27,28,28,28,28,29,28,28,28,27,27,27,27,26,26,27,27,27,27,27,27,26,26,26,23,25,26,25,23,22,20,18,16,15,13,10,9,7,5,6,2,2,2,2,2,3,3,4,4,4,5,5,4,3,3,2,2,1,1,1,0,1,2,2,2,2,2,2,2,3,3,4,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,4,3,3,4,3,3,3,3,3,3,2,3,3,4,4,4,4,5,4,4,4,4,4,3,3,3,2,2,2,2,2,2,2,2,2,3,3,3,3,3,4,4,4,5,5,4,5,5],[27,26,27,28,28,28,28,27,28,27,28,27,28,28,28,28,28,28,27,26,25,26,26,26,26,27,26,27,27,25,26,25,24,24,21,25,24,23,22,22,18,18,16,15,13,11,9,7,5,4,2,2,2,2,2,2,2,2,2,3,3,3,3,2,2,2,2,2,1,1,1,0,1,1,1,1,2,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,3,3,3,2,2,2,2,2,2,2,3,2,2,3,3,3,3,2,3,3,2,2,2,2,2,2,2,1,1,2,2,2,2,2,2,2,2,2,2,3,3,3,3,3,3,4],[29,29,29,30,30,30,30,29,29,29,29,29,29,29,29,29,29,29,28,27,26,28,27,27,26,26,26,25,27,24,26,25,26,23,21,25,25,24,21,22,19,19,17,16,14,12,9,7,5,4,2,2,2,2,1,2,2,2,2,3,3,3,2,2,2,2,2,1,1,1,1,1,0,1,1,1,1,1,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,3,2,2,3,2,2,2,2,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,2,2,2,3,3,3,3,3],[27,27,27,28,28,28,28,27,27,27,27,26,27,27,27,27,26,28,26,25,25,25,25,25,24,25,24,25,25,24,25,23,24,23,21,22,24,22,21,21,19,18,17,18,14,12,11,7,5,4,2,2,2,2,2,2,2,2,2,3,3,2,2,2,2,2,2,1,1,2,1,1,1,0,1,1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,2,2,2,2,2,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,3,2,2,2,2,2,2,2,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,2,2,2,2,3,2,3,3],[28,29,29,29,30,29,29,28,29,29,29,29,30,30,29,29,28,28,28,27,27,27,27,27,27,27,27,27,26,25,27,25,26,25,22,25,25,23,22,24,21,20,18,17,15,12,10,7,5,4,3,2,2,2,2,2,2,2,2,3,3,3,2,2,2,2,2,2,2,2,2,1,1,1,0,1,1,1,1,1,1,1,1,2,2,2,2,2,2,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,3,2,2,3,3,2,2,2,1,2,1,1,1,1,1,2,2,2,2,2,2,2,2,2,2,3,3,3,3,3,4],[26,28,28,29,29,29,29,28,27,29,28,28,29,29,28,29,28,28,28,27,27,28,28,27,26,27,27,27,28,26,27,26,26,25,23,25,23,26,23,24,20,20,18,19,15,13,10,7,5,4,2,2,2,2,1,2,2,2,2,3,3,2,2,2,2,2,2,1,2,2,1,1,1,1,1,0,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,3,3,2,2,2,2,2,2,2,1,1,1,1,1,2,2,2,2,2,2,2,2,2,2,2,2,3,3,2,3,3],[27,26,26,27,27,27,27,26,27,26,27,26,27,27,28,28,26,28,27,25,26,27,26,27,27,26,26,26,26,26,26,25,26,26,22,25,25,24,22,22,21,19,18,17,15,12,9,7,5,5,2,2,2,2,2,2,2,2,2,3,3,2,2,2,2,2,2,1,2,2,2,1,1,1,1,1,0,1,1,1,1,1,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,3,3,3,2,2,3,3,2,2,2,2,1,1,2,1,1,2,2,2,2,2,2,2,2,2,2,2,2,3,3,3,3,3],[28,27,27,29,28,28,28,28,28,28,28,27,28,28,28,28,27,29,27,26,26,27,26,27,26,26,25,27,26,26,27,26,26,25,23,25,25,23,23,23,20,20,19,17,14,12,11,7,6,4,2,2,2,2,2,2,2,2,2,3,3,2,2,2,2,1,2,1,2,2,2,1,1,1,1,1,1,0,1,1,1,1,1,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,3,2,2,2,2,2,2,2,2,2,2,2,3,3,3,3,2,3,3,2,2,2,2,1,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,3,3,3,3,4],[29,28,29,29,29,29,28,28,28,29,27,28,28,28,29,29,29,29,28,27,27,28,27,26,27,28,27,26,27,26,27,25,27,26,23,24,24,25,23,24,21,21,19,18,16,14,12,8,6,4,3,2,2,2,2,2,2,2,2,3,3,3,2,2,2,2,2,2,2,2,2,2,1,1,1,1,1,1,0,1,1,1,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,3,2,2,2,2,2,3,2,2,3,3,3,3,3,3,3,3,3,3,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,3,3,3,3,3,4],[26,27,27,28,28,28,28,28,27,28,27,27,28,28,28,28,28,28,28,26,27,28,28,27,27,28,27,27,28,27,27,26,27,27,24,26,24,26,23,24,22,20,20,17,16,14,10,7,6,5,3,2,2,2,2,2,2,2,2,3,3,3,3,2,2,2,2,2,2,2,2,2,2,1,1,1,1,1,1,0,1,1,1,2,2,2,2,2,2,2,2,2,3,3,3,2,2,3,2,3,3,3,3,3,3,2,2,2,3,3,3,3,3,3,3,3,4,3,3,4,3,3,3,2,2,2,2,2,2,2,2,2,3,2,2,2,2,2,2,2,3,3,3,3,3,3,4],[28,28,28,29,29,28,29,28,28,28,28,28,29,28,28,29,28,29,28,26,28,28,28,27,27,28,27,26,28,27,27,27,27,26,23,25,25,24,23,23,22,20,19,18,15,13,10,7,7,5,3,3,3,3,3,3,3,3,3,4,4,3,3,2,2,2,2,2,2,2,2,2,2,2,1,1,1,1,1,1,0,1,1,2,2,2,2,3,3,2,3,3,3,3,3,3,2,3,3,3,3,3,3,3,3,3,3,3,4,3,3,4,4,4,4,4,4,4,4,4,4,4,3,3,3,2,2,3,3,2,3,3,3,3,3,3,3,2,3,3,3,3,4,4,4,5,5],[28,28,28,28,28,27,28,28,29,29,29,28,28,29,29,29,28,28,28,26,28,28,28,28,28,28,28,28,29,27,28,28,28,26,25,27,27,27,24,23,21,20,19,18,15,13,11,9,7,4,4,3,3,3,3,3,2,3,3,4,4,3,3,2,2,2,2,2,2,3,3,3,3,2,2,2,1,1,1,1,1,0,1,1,2,2,2,3,3,3,4,4,4,3,3,3,3,3,3,4,4,4,5,5,5,4,4,4,5,4,5,5,5,4,5,5,5,5,5,5,5,5,4,4,3,3,3,4,3,3,3,4,4,4,4,3,3,3,3,3,3,3,4,4,5,5,5],[28,27,28,28,28,28,28,27,28,28,27,28,29,29,28,28,27,29,28,25,27,28,27,26,26,28,26,27,27,26,27,27,26,26,24,26,26,25,25,23,22,20,19,19,15,13,12,10,8,5,4,3,3,3,3,3,2,2,2,3,4,3,3,2,2,2,3,3,3,3,3,3,2,2,2,2,2,1,1,2,1,1,0,1,1,2,2,2,3,3,3,3,3,3,3,2,2,2,3,3,3,3,4,3,3,3,3,3,4,4,4,4,3,3,4,4,4,4,4,4,4,3,3,3,2,2,2,3,3,3,3,3,4,3,3,3,3,3,2,2,3,3,3,4,3,4,4],[28,28,28,28,28,28,29,28,27,29,28,28,28,28,28,28,28,28,29,26,28,28,27,26,27,27,27,27,28,26,28,26,26,26,24,25,25,25,23,24,20,20,17,17,14,14,10,9,8,7,6,4,4,4,4,4,3,4,4,4,5,4,4,3,3,3,3,4,4,5,5,4,3,3,2,3,3,2,2,2,2,1,1,0,1,1,2,2,3,3,4,3,4,3,3,2,2,3,3,3,4,4,5,5,5,4,5,4,5,5,4,4,4,4,4,5,4,4,5,5,5,4,3,3,3,3,3,3,4,4,5,5,5,4,4,4,3,3,2,3,3,3,4,4,4,4,5],[28,29,29,29,29,30,29,28,29,29,29,29,30,29,29,29,28,30,28,26,27,27,27,28,27,28,27,28,27,27,28,27,26,27,24,25,27,24,24,24,22,20,20,18,16,14,13,10,8,5,5,4,3,4,3,3,2,3,2,3,4,3,3,2,3,3,3,3,4,3,4,3,3,2,2,2,2,2,2,2,2,2,1,1,0,1,1,1,2,2,3,3,3,2,2,2,2,2,2,3,3,3,4,3,4,4,3,4,4,4,4,4,3,3,4,4,4,3,3,4,4,3,3,3,2,3,2,3,3,3,4,3,4,3,3,3,3,3,2,2,3,2,3,4,3,4,4],[28,28,28,27,28,27,28,28,28,27,28,27,25,27,26,27,26,26,26,24,25,26,25,26,26,27,25,25,26,25,27,26,26,26,24,26,25,24,23,23,21,20,18,17,14,13,11,9,7,5,4,4,4,3,3,3,2,2,2,3,3,3,3,3,3,3,3,3,4,4,4,3,3,2,2,2,2,2,2,3,2,2,2,1,1,0,1,1,2,2,2,2,2,2,2,2,1,2,2,3,3,3,4,4,4,4,4,4,4,3,3,3,3,3,3,4,4,3,3,5,4,4,3,3,2,2,2,2,3,3,4,4,4,4,3,3,2,2,2,2,2,2,3,3,3,4,4],[27,27,27,27,28,27,28,27,28,28,27,28,28,28,29,28,28,27,28,25,26,26,26,26,26,27,26,26,27,25,28,26,26,25,23,26,28,25,24,24,21,21,19,19,16,14,12,9,8,6,6,4,4,4,3,3,3,3,3,3,3,3,3,3,3,3,4,3,4,4,4,3,3,3,2,2,2,2,2,3,3,3,2,2,1,1,0,1,2,2,2,2,2,2,2,2,2,3,3,3,3,4,5,5,4,4,3,4,3,4,3,3,3,3,4,4,4,4,4,4,4,4,3,3,2,3,2,3,3,3,4,4,5,4,3,3,3,3,2,2,3,2,3,3,3,4,4],[26,27,28,27,28,27,27,26,27,28,26,28,27,27,27,27,27,26,27,23,25,26,24,24,24,26,27,24,27,25,26,26,27,23,23,25,25,26,23,24,20,21,17,17,15,14,11,9,8,6,5,5,5,4,4,3,3,3,3,3,4,4,4,4,4,4,4,4,5,5,4,4,3,3,2,3,3,2,3,4,3,4,3,2,2,1,1,0,2,2,2,3,3,6,3,3,2,2,3,3,3,4,4,5,5,4,4,3,4,3,3,3,3,3,4,5,5,4,4,5,4,4,3,3,3,2,2,3,3,3,5,5,5,4,4,4,3,3,3,3,3,3,3,4,3,4,4],[28,26,26,27,28,27,27,26,26,26,25,26,26,27,27,27,26,26,26,22,25,26,24,25,26,26,25,25,26,24,26,24,26,24,20,25,23,26,23,23,20,20,17,17,14,13,11,9,7,7,6,5,5,5,4,4,4,4,3,4,4,4,4,4,5,4,5,4,4,3,3,3,2,2,2,2,3,3,3,4,4,3,3,3,2,2,1,1,0,1,1,1,2,2,2,1,2,2,2,3,3,4,5,6,4,3,3,3,3,2,3,2,2,3,3,3,4,3,3,5,4,4,3,2,2,2,2,2,2,2,4,3,5,6,4,4,3,3,2,2,3,2,3,4,3,3,4],[27,28,28,29,29,29,29,28,28,27,28,28,28,29,29,28,28,27,28,25,26,27,26,25,26,26,27,24,27,25,27,26,27,26,23,25,25,26,24,25,22,21,19,18,16,14,12,9,8,5,5,4,3,4,3,4,3,4,4,5,4,4,4,4,4,4,4,3,3,3,3,3,2,2,2,2,3,3,3,3,3,3,3,3,2,2,2,1,1,0,1,1,2,2,2,2,2,2,3,3,4,4,4,4,4,3,3,2,3,2,2,2,2,2,4,4,5,4,3,5,4,4,3,2,2,2,2,2,2,2,3,3,4,4,3,4,3,3,3,3,3,3,4,4,4,4,5],[27,28,28,28,28,28,28,27,27,27,26,27,28,28,28,27,26,26,26,24,25,25,25,25,25,26,26,25,27,25,26,26,26,25,24,26,26,26,24,25,20,21,19,18,17,16,13,10,9,5,6,4,4,5,4,5,4,5,4,5,5,6,6,5,5,5,5,4,4,4,3,3,2,3,2,2,3,3,3,3,4,4,3,3,3,3,2,2,2,1,0,1,2,2,2,2,2,3,3,3,4,5,6,5,4,4,3,2,3,2,2,2,2,2,3,3,4,4,3,4,5,4,3,2,2,2,2,2,2,3,4,4,5,5,4,4,4,4,3,3,3,3,4,5,4,5,6],[28,28,28,29,29,29,29,29,29,29,29,29,29,29,29,29,28,30,28,26,27,27,27,28,28,29,28,27,27,27,29,26,28,27,26,27,27,27,25,25,21,21,19,18,17,15,12,10,8,6,6,5,5,5,4,5,4,4,4,5,5,6,5,5,5,4,5,4,4,4,3,3,2,2,2,2,3,4,3,3,4,4,4,3,3,3,2,2,2,1,1,0,1,2,2,2,2,2,3,3,3,4,5,5,4,4,3,2,2,2,2,2,2,2,2,3,3,3,3,4,4,4,3,2,2,2,2,2,2,3,4,4,5,5,4,5,3,4,3,3,3,3,4,5,3,4,4],[27,28,27,28,28,28,28,27,27,27,26,27,28,28,28,27,26,27,27,23,25,26,25,25,26,27,27,25,26,25,27,25,26,26,23,25,25,25,23,25,20,19,18,17,14,12,11,9,7,6,5,4,4,5,4,4,4,4,5,6,5,6,5,5,5,5,5,4,4,3,3,3,3,3,2,3,3,3,3,4,4,4,4,4,3,3,3,2,2,2,2,1,0,1,2,2,2,2,3,3,3,5,5,5,4,4,3,3,2,2,2,2,2,3,3,3,4,3,3,4,4,4,3,3,2,2,2,2,3,3,4,4,5,5,4,4,4,4,3,3,3,3,3,4,3,3,4],[29,28,28,28,29,28,28,28,28,28,28,28,29,29,29,28,27,28,27,26,27,27,27,26,27,27,27,27,27,26,27,25,26,25,22,27,25,26,25,23,19,19,17,18,14,13,11,9,8,7,6,5,5,5,4,4,3,3,3,4,4,4,4,4,4,4,5,5,5,4,3,3,3,3,2,3,3,3,3,4,4,4,3,4,3,3,2,2,1,2,1,1,1,0,1,2,2,1,2,2,3,3,4,5,4,3,3,3,2,2,2,2,2,2,2,3,3,3,3,4,3,3,2,2,2,2,2,2,2,3,4,4,5,5,4,3,3,2,3,2,2,2,2,2,2,3,3],[28,29,29,28,29,29,29,27,28,28,27,28,28,28,28,29,27,29,28,25,25,27,25,25,25,26,26,26,26,25,26,25,26,26,22,25,26,24,24,22,20,19,17,17,14,13,12,9,8,7,6,5,5,4,4,4,3,3,3,4,4,4,4,4,4,4,5,5,5,5,5,5,3,3,3,3,3,3,4,4,4,4,3,3,2,2,2,2,2,2,2,2,1,1,0,1,2,1,2,2,3,3,4,5,4,4,4,3,3,3,3,2,2,3,3,3,3,4,3,4,4,3,2,2,2,2,2,3,3,4,4,5,5,5,4,3,3,3,2,2,2,2,2,3,3,4,4],[27,27,28,28,29,29,29,27,28,28,28,28,28,29,29,28,27,27,27,24,26,26,24,24,25,26,26,24,25,24,26,23,25,24,22,23,24,24,21,22,19,19,16,16,12,12,9,7,6,5,4,4,4,3,3,3,2,2,2,3,3,3,3,3,3,3,3,3,4,3,3,3,2,2,2,2,2,2,2,3,3,3,2,2,2,3,2,2,2,2,2,2,2,6,1,0,1,1,1,2,2,3,3,3,3,3,3,2,3,3,2,2,2,2,2,3,3,2,2,3,3,2,2,2,2,1,2,2,2,2,3,3,3,3,3,2,2,2,2,2,2,2,2,2,2,3,3],[28,28,28,28,28,28,28,28,28,27,28,28,28,29,28,28,27,28,27,28,26,27,26,27,27,26,26,26,27,26,27,26,26,25,22,26,25,26,23,23,20,18,15,14,13,12,10,9,7,6,4,3,3,3,3,2,2,2,3,3,4,3,3,3,3,3,3,3,3,3,3,3,2,2,2,2,3,3,3,3,3,3,3,3,2,2,2,1,1,2,2,1,2,1,1,1,0,1,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,3,2,2,3,2,2,2,1,1,1,2,2,2,2,3,2,3,3,3,2,2,2,2,2,2,2,2,2,2,3,3],[28,28,28,28,28,28,29,27,28,28,28,26,28,28,28,28,26,27,27,26,25,25,25,25,25,26,24,24,26,24,26,24,25,24,21,23,24,23,21,21,19,18,17,16,13,12,10,8,7,5,5,4,3,3,2,2,2,2,2,3,3,3,3,3,3,3,3,3,3,3,3,3,2,2,2,2,2,2,2,3,3,3,2,2,2,2,2,2,2,2,2,2,2,1,2,1,1,0,1,1,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,1,1,1,1,2,2,2,2,3,3,3,2,2,1,1,2,2,2,2,2,2,2,3,3],[27,27,27,28,28,28,28,27,28,28,27,26,28,27,28,27,26,28,26,26,24,25,25,25,25,25,24,25,26,25,26,25,24,25,21,24,25,22,21,22,19,18,18,17,14,14,12,10,8,6,5,4,3,3,2,2,2,2,2,3,3,3,3,3,3,3,3,3,4,3,4,3,2,2,2,2,3,2,2,4,3,3,3,2,2,2,2,2,2,2,2,2,2,2,2,1,1,1,0,1,1,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,1,1,1,1,2,2,2,3,3,3,3,3,2,2,1,1,1,2,2,2,2,2,2,3,4],[28,27,27,28,28,28,28,27,27,27,28,26,27,27,28,28,26,27,26,26,25,26,25,25,25,25,24,25,26,25,27,24,25,25,22,24,25,22,22,22,19,18,17,17,13,12,10,8,6,5,4,3,2,2,2,2,2,2,2,2,3,3,2,2,2,2,3,2,3,3,3,3,2,2,2,2,2,2,2,3,3,3,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,1,1,0,1,1,1,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,2,2,2,1,1,1,1,2,2,2,2,2,2,2,2,1,1,1,1,1,2,2,2,2,2,2,2,3],[27,26,26,27,27,28,27,28,29,28,28,27,28,28,28,28,27,29,28,27,26,27,27,27,28,28,26,26,27,27,26,26,27,27,23,26,26,24,22,23,20,19,17,17,14,13,11,9,7,4,3,2,2,2,2,2,2,2,2,2,3,3,2,2,2,2,2,3,2,2,3,3,2,2,2,3,2,2,2,3,3,3,2,2,2,2,2,3,3,3,3,2,2,2,2,2,2,1,1,1,0,1,1,1,1,2,2,2,2,3,2,2,2,2,2,2,2,2,2,2,2,1,1,2,2,2,2,2,2,2,2,2,2,2,2,1,1,1,1,2,2,2,2,2,2,3,3],[27,26,27,28,28,27,28,27,27,27,27,27,28,28,28,27,27,27,27,26,25,26,26,26,26,26,26,25,26,26,27,25,26,25,22,24,25,23,22,22,20,19,17,17,15,13,11,8,7,6,4,3,2,2,2,2,2,2,2,3,3,3,3,3,2,2,3,3,3,3,3,3,2,2,2,3,3,2,3,3,3,4,3,3,2,3,3,3,3,3,3,3,3,3,2,3,2,2,1,1,1,0,1,1,2,2,2,2,3,3,2,3,3,2,3,3,3,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,1,2,2,2,2,2,3,3,2,3,4],[27,27,27,27,28,28,28,27,27,28,28,28,28,27,28,28,27,28,28,28,27,27,27,27,27,27,27,26,26,27,26,26,26,26,23,24,24,23,23,23,21,20,17,17,16,12,11,8,8,5,4,3,2,2,2,2,2,2,3,3,3,3,3,3,3,3,3,3,3,3,3,4,3,3,4,4,3,3,4,5,4,5,3,4,4,4,4,5,5,5,5,4,5,5,3,4,3,2,2,2,1,1,0,1,1,2,2,3,3,3,4,4,4,4,4,3,4,3,3,3,3,2,2,2,3,3,4,3,3,2,2,2,2,2,2,2,2,2,2,3,2,3,4,3,3,4,4],[28,28,28,29,29,29,29,29,29,29,29,28,29,29,29,29,28,29,28,27,26,28,27,28,28,28,27,27,27,27,27,27,27,26,24,26,25,24,23,22,21,20,20,18,18,14,12,9,6,4,4,4,2,3,2,2,3,3,4,4,5,4,3,4,3,4,4,3,3,2,3,3,3,3,3,3,4,4,4,4,5,4,4,4,3,5,4,5,4,4,4,3,4,4,4,4,3,3,3,2,1,1,1,0,1,1,2,2,2,3,3,3,3,3,3,3,3,3,2,3,3,2,3,2,3,3,3,3,2,2,2,1,2,2,2,2,2,2,3,5,3,4,4,4,4,5,5],[27,27,28,28,28,28,28,28,28,29,28,28,28,28,28,28,28,27,28,27,27,27,27,26,27,27,27,25,27,26,26,26,25,25,22,24,24,24,22,21,19,18,17,17,15,13,12,8,8,5,4,3,2,2,2,2,2,3,3,4,4,4,3,3,3,3,3,2,2,2,2,2,2,2,2,3,3,3,3,3,4,4,4,4,3,4,3,3,3,3,3,2,3,3,3,3,3,2,2,2,2,2,1,1,0,1,1,2,2,2,2,3,3,3,3,3,3,3,2,3,3,2,2,2,2,2,2,2,2,1,2,2,2,2,1,2,2,2,2,3,3,3,4,4,3,4,5],[27,26,26,28,28,28,28,28,28,28,28,27,28,28,28,28,27,28,26,27,26,26,26,26,26,27,25,26,26,26,26,26,26,26,24,25,25,23,23,23,22,20,19,20,15,13,12,8,7,5,4,3,2,2,2,3,3,3,3,4,4,4,3,3,3,3,3,3,3,2,2,3,2,2,3,3,3,3,3,4,3,4,3,3,4,3,3,3,3,3,3,3,3,3,3,3,3,3,2,2,2,2,2,1,1,0,1,1,2,2,2,2,2,3,3,3,3,3,2,3,3,2,2,2,2,2,2,2,2,2,2,1,2,2,2,2,2,3,3,3,3,3,4,4,3,4,5],[26,26,26,26,26,26,26,26,25,27,26,27,26,27,26,26,27,26,27,26,26,27,27,26,26,27,26,26,27,26,26,25,25,25,23,24,24,24,23,21,21,19,17,18,14,12,11,8,6,5,3,3,2,2,2,2,2,3,3,4,4,4,3,3,3,3,3,2,2,2,2,2,2,2,2,2,2,3,3,3,3,4,3,3,3,3,3,3,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,1,1,0,1,1,2,2,2,2,2,2,2,3,2,2,2,3,2,2,2,2,2,2,1,1,1,1,1,1,2,2,2,2,2,2,3,3,3,3,3,3,4,4],[28,28,29,29,29,29,29,28,29,29,29,29,29,29,29,29,28,29,28,27,27,27,27,28,27,28,28,26,26,27,27,26,27,27,24,26,26,25,23,23,21,20,19,19,15,14,12,9,7,5,3,3,3,3,3,3,3,3,3,4,5,4,4,4,4,3,3,4,3,2,2,3,2,2,3,3,3,4,3,4,4,4,4,4,4,3,3,3,3,2,2,2,2,3,3,3,3,3,3,3,2,3,2,2,2,1,1,0,1,2,1,2,2,2,3,3,3,3,2,3,3,3,2,2,2,3,2,2,2,2,2,2,2,2,2,3,3,3,4,3,4,3,4,4,3,4,4],[26,26,26,26,27,26,27,26,26,27,26,26,27,27,27,26,27,26,25,25,24,25,25,25,26,25,26,24,26,26,24,25,24,24,22,24,24,24,22,23,22,20,18,17,15,13,11,9,7,5,3,3,2,3,3,3,3,3,4,4,5,4,4,4,3,4,3,3,3,3,3,3,3,3,3,3,3,3,4,4,4,5,4,4,3,4,3,3,3,3,2,2,2,2,2,3,2,3,3,3,2,3,3,2,2,2,1,1,0,1,1,2,2,2,3,3,3,3,2,3,3,3,3,2,2,2,2,2,2,2,2,2,2,3,2,3,2,3,3,3,3,3,4,4,4,4,5],[25,26,26,27,28,27,28,27,26,27,26,27,27,28,27,27,25,25,25,24,25,26,26,25,25,26,26,25,26,25,27,25,25,25,22,24,26,25,23,22,20,19,17,17,14,12,11,8,6,5,4,3,3,4,3,4,3,4,4,5,5,5,4,4,4,3,4,3,3,3,3,3,2,2,2,3,3,3,4,4,4,4,4,3,3,3,3,3,3,2,2,2,2,2,2,3,2,3,3,3,3,4,3,3,2,2,2,1,1,0,1,1,2,2,2,3,3,3,2,3,4,3,3,3,2,2,2,2,2,2,2,2,3,3,3,3,3,3,3,3,4,4,4,4,4,4,5],[29,29,29,29,29,28,29,28,28,29,28,28,29,29,29,29,27,29,27,26,27,27,26,28,27,27,27,27,27,26,27,26,26,26,23,26,26,24,23,23,20,19,18,18,15,13,11,9,7,5,4,4,4,5,4,4,3,4,4,5,6,6,5,5,4,4,4,4,3,3,3,3,2,3,3,3,3,4,3,4,5,4,4,4,4,4,3,3,3,2,2,2,2,2,2,3,3,2,3,3,3,3,4,4,3,3,2,2,2,1,0,1,1,1,1,2,2,2,2,3,3,3,2,3,2,2,2,2,2,2,3,3,4,4,4,4,4,4,4,3,4,3,3,3,3,4,4],[26,26,26,27,27,26,27,27,27,27,27,27,27,27,28,27,26,26,26,22,25,26,26,25,25,26,27,25,26,24,25,25,25,24,22,24,24,24,22,22,18,18,16,16,13,11,10,8,7,5,4,4,4,5,4,4,4,4,4,6,6,6,5,5,4,4,4,4,3,3,3,3,3,3,3,3,3,4,3,4,4,4,4,4,3,4,3,3,3,2,2,2,2,2,2,3,3,3,3,3,3,4,4,4,3,3,2,2,2,1,1,0,1,2,2,2,2,2,2,3,3,3,3,2,2,2,2,2,2,2,3,3,4,4,4,4,4,4,3,3,3,3,3,4,3,4,4],[28,28,28,28,28,28,29,28,28,28,28,29,28,28,29,28,28,29,27,25,27,26,26,26,26,27,27,26,27,25,26,25,26,25,23,25,25,24,23,24,20,20,17,17,14,13,11,8,7,5,5,4,4,4,4,4,3,3,3,4,4,4,4,4,4,4,4,4,4,3,3,3,3,2,2,3,4,3,3,4,4,4,4,3,3,3,2,2,2,2,2,2,2,2,1,2,2,2,2,2,2,3,3,3,3,2,2,2,2,2,1,1,0,1,1,2,2,1,2,2,2,2,2,2,2,2,2,2,2,2,3,3,4,4,3,3,3,2,2,2,2,2,2,2,2,3,3],[28,29,29,29,29,29,29,28,29,28,29,29,29,29,29,29,27,30,28,27,28,27,27,28,28,29,27,28,27,27,28,27,27,27,24,27,28,25,26,26,22,21,19,18,15,13,11,9,7,5,5,4,3,4,3,3,2,3,3,3,4,4,3,3,3,3,4,3,3,3,3,3,2,2,2,3,3,3,3,3,3,3,3,3,3,2,2,2,2,2,2,1,2,2,2,2,2,2,2,2,2,3,3,3,2,2,2,2,2,2,1,1,1,0,1,1,1,1,1,2,2,2,1,1,1,2,2,2,2,2,3,3,3,3,3,3,3,2,2,2,2,2,3,3,2,3,4],[28,28,28,28,29,28,28,27,27,27,26,27,28,28,28,28,28,27,27,26,26,27,27,26,26,27,27,26,28,27,27,26,27,25,23,25,25,24,22,21,20,18,16,16,13,12,11,8,8,6,5,4,4,4,4,4,3,4,3,4,4,4,4,4,4,4,4,4,4,4,4,4,3,3,3,3,4,4,3,4,4,4,4,3,3,3,3,3,2,3,2,2,2,2,2,2,2,2,2,2,2,3,3,3,3,2,2,2,2,2,2,2,1,1,0,1,1,1,1,1,2,2,2,2,2,2,2,2,2,3,3,3,4,4,3,3,3,3,2,3,2,2,3,3,3,3,5],[28,27,28,28,28,28,28,27,27,29,27,28,29,29,28,28,28,28,27,27,27,28,28,27,27,27,28,27,28,29,28,27,27,27,24,26,25,26,23,23,21,19,18,17,14,12,10,9,7,6,5,5,4,5,3,4,3,3,4,4,4,4,4,4,4,4,5,4,4,4,4,4,3,3,3,4,4,4,4,4,5,5,4,4,3,3,3,3,3,3,3,2,2,2,2,3,2,3,2,2,2,2,3,3,3,3,3,2,2,3,2,2,2,1,1,0,1,1,1,1,1,2,2,2,2,2,3,3,2,3,3,3,4,3,3,3,3,3,3,3,3,3,4,3,3,3,4],[29,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,27,27,28,27,27,26,27,27,27,27,27,27,26,26,26,23,25,25,24,22,22,20,19,17,16,14,12,11,8,7,6,5,4,4,4,4,3,3,3,3,3,4,4,3,4,4,4,4,4,4,4,4,4,3,3,3,4,4,4,4,4,4,4,4,4,4,3,3,4,3,3,3,3,3,2,3,3,2,2,2,2,2,2,3,3,3,3,3,2,2,3,2,2,2,1,1,1,0,1,1,1,1,1,1,2,2,2,2,3,2,3,3,3,3,3,3,3,2,2,3,3,2,3,3,3,2,3,4],[29,29,29,29,29,29,29,29,29,29,29,29,30,30,29,30,29,30,29,28,28,29,28,29,28,29,28,28,29,28,29,26,27,28,24,28,26,25,25,25,22,21,21,19,14,12,10,9,6,5,4,3,3,3,3,3,2,2,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,2,3,3,3,3,3,3,3,3,3,3,2,3,2,3,2,2,3,3,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,1,1,1,0,1,1,1,1,1,1,2,2,2,2,2,2,2,2,3,3,2,2,2,2,2,2,2,2,2,2,2,3,3],[27,27,27,28,28,28,28,27,28,28,28,29,29,29,29,29,28,29,28,27,27,28,27,28,27,28,28,28,27,28,28,27,28,28,25,27,27,25,26,24,22,20,19,18,15,13,11,8,7,5,4,3,3,3,2,3,2,2,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,2,2,3,3,3,3,3,3,3,3,3,3,3,2,3,3,2,2,2,2,2,2,2,2,2,1,2,1,2,2,2,2,2,2,2,2,2,2,2,1,1,1,1,1,1,0,1,1,1,1,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,3,3],[28,27,28,28,28,28,28,28,28,28,28,28,29,28,29,29,28,29,28,28,27,28,28,28,27,28,27,27,28,27,26,27,27,27,24,26,25,25,23,22,21,20,18,17,15,12,11,8,7,5,4,4,3,3,3,3,3,3,3,3,4,4,3,4,4,4,4,3,4,3,3,3,3,3,3,3,3,3,4,4,4,4,4,4,3,3,3,3,3,3,3,2,2,2,2,3,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,1,1,1,1,0,1,1,1,2,2,2,2,2,2,2,3,3,3,3,2,2,2,2,2,3,2,3,3,3,2,3,4],[28,28,28,28,29,29,29,28,29,28,28,28,29,29,28,29,27,28,28,27,27,27,27,27,26,27,26,27,26,27,26,26,26,25,23,24,24,23,22,21,20,19,18,17,14,12,11,8,7,5,5,4,4,3,3,3,2,3,3,3,3,3,3,3,3,3,4,4,4,3,4,4,3,3,3,3,4,3,4,4,4,4,4,3,3,3,3,4,3,3,3,3,3,2,2,3,2,2,2,2,1,2,2,2,2,2,2,2,2,3,2,2,2,2,1,1,1,1,1,1,0,1,1,1,2,2,3,3,2,3,3,3,3,3,2,2,2,2,2,2,2,3,3,3,2,3,4],[29,28,28,28,29,28,29,29,30,29,29,28,29,29,29,29,28,29,28,28,28,28,27,28,29,28,28,28,28,28,29,28,27,28,25,27,27,26,25,24,23,21,21,20,17,15,13,10,8,6,4,4,3,3,3,3,2,3,3,4,4,4,4,3,4,3,3,3,3,3,4,3,3,2,2,3,3,3,3,3,4,4,3,3,3,3,2,3,3,3,3,3,3,2,2,2,2,2,1,1,2,2,2,2,2,2,3,2,3,3,3,3,2,2,2,2,1,1,1,1,1,0,1,1,1,2,2,3,2,2,3,3,3,3,2,2,2,2,2,2,2,2,3,3,2,3,4],[28,28,28,29,29,29,29,28,29,29,28,28,29,29,29,28,28,29,28,26,26,27,27,27,26,27,26,27,27,27,27,26,26,27,24,27,27,24,24,23,21,21,19,19,14,13,10,7,6,4,3,3,3,3,2,2,2,2,2,3,3,3,3,3,3,3,3,2,2,2,3,2,2,2,2,2,2,2,2,2,3,3,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,1,1,1,1,1,2,2,2,2,2,1,2,2,2,2,1,1,1,2,1,1,1,1,1,1,0,1,1,1,1,2,1,2,2,2,2,2,2,2,2,2,1,2,2,2,2,2,2,3,3],[26,26,26,27,27,27,27,26,27,26,27,26,27,27,27,27,26,28,26,25,25,25,25,26,26,26,25,26,26,25,26,25,25,26,22,25,26,23,23,22,21,18,18,18,14,13,11,8,7,4,3,3,3,3,2,2,2,2,3,3,3,3,3,3,3,3,2,3,2,2,2,2,2,2,2,2,2,2,2,3,3,3,3,2,2,2,2,2,2,2,2,2,2,2,2,2,1,1,1,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,2,1,1,1,0,1,1,1,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,3],[29,29,29,29,30,29,30,29,30,29,29,29,29,29,30,29,27,29,28,27,27,27,27,27,27,28,27,26,27,25,27,24,26,25,22,24,26,24,22,25,19,20,18,16,13,12,9,6,6,3,3,2,2,2,2,2,2,2,2,3,3,3,3,2,2,2,2,2,2,2,2,2,1,1,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,2,2,2,1,1,1,1,1,1,2,2,2,2,2,2,1,2,2,2,2,1,1,2,2,2,1,1,2,2,1,1,1,0,1,1,1,1,1,2,2,2,2,2,2,1,2,2,2,2,2,2,2,2,3,3],[26,26,26,27,27,27,27,26,25,27,26,26,28,27,27,27,26,28,26,25,25,25,25,24,25,25,25,25,25,24,26,23,24,23,21,23,24,22,22,21,19,17,17,16,14,13,11,8,7,4,3,3,2,2,2,2,2,2,2,3,3,3,3,3,3,3,2,2,2,2,2,2,1,1,1,1,2,2,2,2,3,3,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,1,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,1,1,0,1,1,1,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,3,3],[28,28,28,29,29,28,28,28,28,28,28,27,28,28,29,28,28,28,27,26,26,27,26,26,26,25,25,25,26,25,25,25,25,24,21,24,24,25,23,21,19,20,17,17,15,13,10,8,6,5,3,3,2,2,2,2,2,2,3,3,4,3,3,3,3,2,3,2,2,2,2,2,1,1,1,2,2,2,2,3,3,3,2,3,2,2,2,2,2,2,2,1,2,2,2,2,1,1,1,2,2,2,2,2,2,2,2,2,2,2,1,2,2,2,2,2,2,2,2,2,2,2,2,1,1,1,0,1,1,1,2,2,2,2,2,2,2,2,2,2,2,2,2,3,2,3,3],[27,28,28,29,29,29,29,28,29,27,28,28,28,29,29,29,27,28,27,26,26,26,26,26,26,26,26,26,26,25,25,25,25,25,22,24,24,23,24,22,21,19,18,17,14,13,10,8,6,4,3,3,2,3,2,2,2,3,3,3,3,4,3,3,3,3,3,3,2,2,2,2,2,1,2,2,2,2,2,2,3,3,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,2,2,2,2,3,3,3,2,2,1,2,2,2,2,2,2,2,3,3,3,3,2,3,3,3,2,2,1,1,1,0,1,1,2,2,2,3,2,2,2,2,2,2,2,2,3,3,3,3,4],[26,26,26,27,27,27,27,26,26,26,26,25,27,26,26,27,25,28,26,26,25,25,24,25,25,25,25,25,25,24,24,24,25,23,21,23,24,22,22,21,20,19,18,18,15,13,11,8,6,4,3,2,2,2,2,2,2,3,3,3,4,4,3,3,2,2,2,2,2,2,2,2,1,1,2,2,2,2,2,2,3,4,3,3,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,2,2,2,2,2,2,2,2,3,3,2,2,3,3,2,2,2,1,1,1,1,0,1,1,1,2,2,2,2,2,2,2,2,3,2,3,3,3,3,4],[28,27,28,28,29,28,28,26,28,27,27,28,28,28,29,29,28,28,28,26,27,28,27,27,26,28,27,27,27,26,27,25,25,25,23,25,26,23,22,21,19,18,17,17,13,11,9,6,5,4,2,2,1,2,2,2,2,2,2,3,3,3,3,2,2,2,2,2,1,1,1,1,1,1,1,1,2,2,2,2,2,3,2,2,2,2,2,2,2,2,2,1,2,2,2,2,2,2,2,2,2,2,2,1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,2,2,2,2,1,1,1,1,1,1,0,1,1,1,1,1,2,2,2,2,2,2,2,3,3,2,3,3],[28,27,27,28,28,28,27,27,28,27,27,26,28,26,27,27,26,28,26,27,27,26,25,27,26,27,25,26,25,25,26,26,24,25,23,24,25,23,23,22,21,19,17,17,13,11,9,6,5,4,2,2,1,2,2,2,2,3,3,3,4,3,3,3,2,2,2,1,2,1,2,1,1,1,2,2,2,2,2,2,2,3,3,3,3,3,2,3,2,2,2,2,2,2,2,3,2,2,2,2,2,2,2,2,1,1,1,2,2,2,2,2,2,2,3,3,3,3,2,2,3,2,2,2,2,2,2,1,1,1,0,1,1,1,2,2,2,2,2,3,2,2,3,3,3,3,4],[26,26,26,26,27,27,27,27,27,28,28,28,27,28,28,28,28,28,28,28,27,27,27,26,26,27,26,26,26,25,26,26,26,25,23,24,24,24,24,23,21,20,17,18,15,12,11,8,7,5,3,2,2,2,2,2,2,3,3,3,4,4,3,3,2,2,2,2,2,2,2,2,2,2,2,2,2,2,3,3,3,3,3,3,3,3,3,3,3,3,3,2,3,3,3,3,2,2,2,2,2,3,2,2,2,1,2,2,2,2,2,3,3,3,3,3,3,3,2,3,3,3,2,2,2,2,2,2,1,1,1,0,1,3,2,2,2,2,2,3,3,3,3,4,3,4,4],[26,26,26,26,26,27,27,26,26,27,26,26,26,27,26,27,26,27,27,26,24,26,25,24,25,26,25,24,25,25,25,24,24,24,22,22,22,22,22,21,20,18,17,16,13,12,9,7,6,4,3,2,1,1,1,2,2,2,3,3,3,3,3,2,2,2,2,2,2,2,2,2,2,2,2,3,2,2,3,3,3,3,3,4,3,4,3,4,4,3,3,3,3,4,3,4,3,3,2,2,2,2,2,3,2,2,2,2,2,2,3,3,3,3,3,3,3,3,3,3,3,3,2,2,3,2,2,2,2,1,1,1,0,1,1,1,2,2,2,3,3,4,4,4,4,4,5],[26,27,28,28,27,27,28,26,26,26,27,27,27,27,27,28,26,28,26,27,26,26,25,25,24,26,26,26,24,26,25,24,24,23,21,23,24,23,20,21,18,17,16,16,13,11,10,6,5,4,2,2,1,1,1,1,2,2,2,3,3,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,3,2,2,3,2,3,2,3,3,3,3,3,3,3,3,3,3,3,3,2,2,2,2,1,1,1,1,2,2,2,2,3,3,3,3,3,3,3,3,3,2,3,2,2,2,2,2,2,2,2,2,2,1,1,1,0,1,1,1,2,2,2,2,3,3,3,3,3,4],[26,26,27,29,29,28,29,27,28,28,28,28,28,28,28,28,26,29,27,27,25,26,26,26,26,26,25,25,25,25,26,24,24,24,20,24,24,22,21,21,20,19,17,18,13,12,12,7,6,4,3,2,1,2,1,1,1,2,2,2,3,2,2,2,2,2,2,2,2,2,3,3,3,2,2,3,3,2,3,3,3,3,3,3,3,3,3,3,4,3,3,3,3,3,3,3,3,2,2,2,2,1,2,2,2,2,2,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,2,2,2,2,2,2,2,2,2,2,1,1,0,1,1,1,2,2,2,3,3,3,3,3,4],[27,27,28,28,28,28,28,28,28,28,28,27,27,27,27,28,26,28,27,27,25,26,26,26,26,26,25,25,25,25,26,25,25,25,22,24,23,21,21,21,18,18,16,16,13,11,10,7,6,4,3,2,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,3,2,2,2,2,2,2,2,3,3,3,3,2,3,3,2,2,2,2,1,1,1,1,1,1,1,2,2,2,2,2,2,3,2,2,3,3,3,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,1,1,0,1,1,1,2,2,2,2,2,2,3,3],[27,27,27,28,28,28,28,28,29,28,28,28,28,28,28,28,27,29,28,26,27,27,27,27,27,28,26,26,26,26,26,25,25,26,22,24,25,23,21,22,19,19,17,18,14,13,11,8,7,4,3,2,2,2,1,1,1,1,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,3,2,3,2,2,2,2,2,2,3,2,3,2,2,2,2,2,2,1,1,1,1,1,1,1,2,2,2,2,3,3,3,3,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,1,1,0,1,1,1,1,2,2,2,2,3,3],[28,27,27,27,27,27,28,27,27,28,27,27,28,28,28,28,26,27,27,26,26,27,26,27,26,27,26,25,26,25,26,25,25,25,23,24,25,22,21,22,19,18,17,18,14,12,10,8,6,5,3,3,2,2,2,1,1,2,1,2,2,2,2,2,2,2,2,2,3,3,3,3,2,2,2,2,2,2,2,3,3,2,2,2,2,2,2,2,2,2,3,2,2,2,2,2,2,1,1,1,1,2,2,2,2,2,2,2,2,3,2,3,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,1,1,0,1,1,2,2,2,2,2,3,3],[28,27,28,29,29,28,28,28,28,29,29,28,29,29,29,29,28,29,28,27,27,27,27,28,28,29,28,28,28,27,28,27,27,27,24,27,27,25,25,24,21,20,19,18,15,14,13,10,9,6,5,4,3,3,2,2,2,1,2,2,3,3,3,3,3,3,4,4,4,4,4,4,4,3,2,3,3,3,3,4,4,4,2,3,2,2,3,3,3,3,3,3,3,3,3,2,2,2,2,2,2,2,2,2,3,3,3,3,3,4,3,3,3,3,4,3,4,3,3,3,3,3,2,2,2,2,3,3,3,3,3,3,3,2,2,2,1,1,0,2,2,2,2,3,3,3,4],[27,27,28,27,28,27,28,28,28,28,28,28,28,28,29,29,27,27,27,26,26,27,27,27,27,27,26,27,27,26,27,26,26,26,23,27,26,25,24,23,21,20,18,19,15,14,12,10,7,6,5,4,4,3,3,3,2,2,3,3,3,3,3,3,3,3,3,3,4,4,4,3,3,3,2,3,3,3,3,3,3,4,3,3,2,2,3,3,3,3,3,4,3,3,2,2,2,2,2,2,2,3,3,3,3,3,3,3,4,4,3,4,3,3,3,3,3,3,3,3,3,3,3,2,2,2,3,3,3,3,3,4,4,3,3,2,2,1,1,0,1,2,2,2,3,3,4],[27,26,27,28,28,28,28,28,28,28,28,27,29,28,29,29,27,28,27,27,27,28,27,28,27,27,26,27,27,26,28,27,26,27,24,26,27,24,24,25,21,20,19,20,15,13,12,11,9,8,8,6,5,5,3,3,3,2,3,4,3,3,3,3,3,3,4,4,5,5,5,4,3,3,3,3,3,3,3,4,4,3,3,3,2,2,3,3,3,3,4,3,3,3,2,2,2,2,2,2,2,2,3,4,4,5,3,4,4,4,4,4,3,3,3,3,3,3,3,3,3,3,2,2,3,2,3,3,3,4,4,4,5,4,4,3,2,3,1,1,0,1,2,2,2,2,3],[27,28,28,28,28,28,29,28,28,29,29,29,29,29,30,29,29,29,29,26,28,28,28,27,28,29,29,27,28,28,28,28,28,28,26,27,28,25,25,24,23,21,21,21,16,15,15,12,8,8,6,4,5,4,3,3,3,3,3,3,3,3,3,3,4,4,4,6,5,5,4,5,4,3,3,3,4,3,3,4,4,4,3,3,3,3,3,2,4,4,4,4,3,3,2,2,4,2,2,2,3,3,3,4,4,4,4,3,4,4,4,3,2,2,3,3,3,2,3,3,3,3,2,2,2,3,3,3,3,4,4,4,5,4,4,3,3,2,2,2,1,0,1,1,1,2,2],[27,26,26,27,27,26,27,27,27,28,27,27,27,28,28,28,26,28,26,25,26,27,26,26,27,27,27,27,26,25,26,26,25,25,24,26,26,24,24,22,21,20,19,19,15,15,14,11,9,7,7,6,7,7,6,6,4,4,4,4,4,4,5,5,6,6,6,6,6,6,5,5,4,4,3,4,5,4,4,4,5,4,4,3,3,3,3,3,3,3,4,3,3,3,2,2,3,2,3,3,4,3,5,5,6,5,5,5,5,4,4,4,3,3,3,5,4,4,3,4,3,4,3,3,3,3,3,4,5,5,6,6,7,6,6,4,3,3,2,3,2,1,0,1,1,2,3],[27,27,27,27,27,27,28,27,27,28,28,27,28,28,28,28,26,28,27,24,27,27,27,27,28,28,27,28,27,26,27,27,26,27,25,27,26,25,25,23,22,22,21,23,18,16,17,14,11,10,10,8,7,7,6,4,4,4,4,4,4,5,5,5,6,7,6,8,7,6,6,7,5,4,4,5,6,5,5,5,6,5,4,4,3,4,4,3,4,3,4,3,3,3,3,3,3,3,3,3,3,3,4,5,4,4,4,4,4,4,4,4,3,3,3,3,3,3,3,3,3,3,3,3,3,4,4,4,4,5,5,6,6,6,5,4,4,3,3,3,3,1,1,0,1,2,2],[27,28,28,28,29,28,29,28,29,29,29,30,29,29,30,30,28,29,29,25,28,28,28,28,29,30,29,28,28,28,28,28,28,28,27,28,28,26,27,26,24,22,22,22,18,15,15,12,11,11,9,7,6,7,7,6,4,4,4,5,5,6,5,6,5,7,7,8,8,6,7,7,5,5,4,6,6,5,5,6,6,6,5,5,4,4,4,4,4,4,6,4,4,3,3,3,3,3,3,3,5,4,5,5,5,6,4,6,5,5,5,4,3,3,3,3,3,4,3,4,3,3,2,5,3,6,5,5,7,5,7,5,7,6,6,5,5,4,4,3,2,2,2,1,0,1,2],[27,27,28,29,29,28,28,27,28,28,28,28,29,28,29,29,28,29,28,27,27,28,27,27,28,28,28,28,27,28,28,28,27,28,26,27,28,25,26,26,24,22,22,22,19,17,18,14,13,10,9,7,8,8,8,8,5,5,5,6,7,7,7,9,7,7,8,8,8,7,8,8,7,7,5,7,7,7,7,7,7,7,7,7,5,6,6,5,6,7,6,6,5,6,3,5,5,3,4,4,4,5,6,8,6,7,5,5,6,6,5,5,5,4,5,5,5,4,4,5,5,4,3,4,3,5,5,5,6,7,7,6,7,7,6,6,5,4,5,4,3,3,4,2,1,0,1],[26,25,26,26,27,27,27,27,27,28,27,28,26,27,27,28,28,28,28,25,28,27,27,27,27,28,28,27,28,26,28,27,28,28,27,27,28,27,26,26,24,24,23,23,22,22,21,17,19,16,18,14,17,17,14,14,12,11,10,13,13,13,12,16,14,15,15,14,15,14,14,14,10,11,9,11,14,14,10,12,14,13,14,14,9,10,9,8,9,11,10,7,7,6,4,7,6,5,7,8,8,10,13,14,12,12,11,9,10,10,7,9,5,6,7,9,7,6,7,8,8,8,5,6,5,7,10,8,10,12,13,13,16,17,12,12,9,8,8,6,6,6,4,5,2,1,0]],"max_predicted_aligned_error":31.75}]
\ No newline at end of file
--- /dev/null
+<!DOCTYPE html>
+<html>
+<head>
+<title>SwingJS test Jalview</title><meta charset="utf-8" />
+<script src="swingjs/swingjs2.js"></script>
+<script>
+if (!self.SwingJS)alert('swingjs2.js was not found. It needs to be in swingjs folder in the same directory as ' + document.location.href)
+Info = {
+ code: null,
+ main: "jalview.bin.Jalview",
+ core: "NONE",
+ width: 850,
+ height: 550,
+ readyFunction: null,
+ serverURL: 'https://chemapps.stolaf.edu/jmol/jsmol/php/jsmol.php',
+ j2sPath: 'swingjs/j2s',
+ console:'sysoutdiv',
+ allowjavascript: true,
+ namespace: "jv"
+}
+</script>
+</head>
+<body>
+<div id="jv:jalviewSplash" style="position:absolute;right:10px;top:10px;">
+<img src="images/jv.gif">
+</div>
+<script>
+SwingJS.getApplet('testApplet', Info)
+getClassList = function(){J2S._saveFile('_j2sclasslist.txt', Clazz.ClassFilesLoaded.sort().join('\n'))}
+</script>
+<div style="position:absolute;left:10px;top:10px;width:640px;height:1200px;">
+<div id="sysoutdiv" contentEditable="true" style="border:1px solid green;width:100%;height:95%;overflow:auto"></div>
+This is System.out. <a href="javascript:testApplet._clearConsole()">clear it</a> <a href='javascript:J2S.getProfile()'>start/stop profiling</a><br>see <a href=___j2sflags.htm>___j2sflags.htm</a> for SwingJS URL command-line options<br><a href="javascript:getClassList()">get _j2sClassList.txt</a>
+</div>
+</body>
+</html>
serverURL: 'https://chemapps.stolaf.edu/jmol/jsmol/php/jsmol.php',
j2sPath: 'swingjs/j2s',
console:'sysoutdiv',
- allowjavascript: true
+ allowjavascript: true,
+ namespace: ""
}
</script>
</head>
--- /dev/null
+java -Xmx2g -Dfile.encoding=UTF-8 -Duser.country=GB -Duser.language=en -Duser.variant -cp ./tools/closure-compiler-v20230802.jar com.google.javascript.jscomp.CommandLineRunner --compilation_level ADVANCED --warning_level QUIET --charset UTF-8 --js='./build/jalviewjs/site/swingjs/**.js' --js='!**/DatabaseReaction.js' --js='!**/FileTime.js' --js='!**/ChoiceFormat.js' --js='!**/TableView.js' --js='!**/JSVApplet.js' --js='!**/NativeMDLReactionReader.js' --js='!**/AsyncCallback.js' --js='!**/_ES6/jsutil.js' --js='!**/org/jmol/inchi/InChIJS.js' --js='!**/j2s/swingjs/JSUtil2.js' --js='!**/j2s/core/*.js' --js='!**/js/core/*' --js_output_file ./coreall-advanced.z.js > errors.txt
+
+grep JSC_UNDEFINED_VARIABLE errors.txt | perl -n -e 'm/.* variable (\S+) is undeclared/ && print "var $1;\n";' > externs.txt
+
+java -Xmx2g -Dfile.encoding=UTF-8 -Duser.country=GB -Duser.language=en -Duser.variant -cp ./tools/closure-compiler-v20230802.jar com.google.javascript.jscomp.CommandLineRunner --compilation_level ADVANCED --warning_level QUIET --charset UTF-8 --js='./build/jalviewjs/site/swingjs/**.js' --js='!**/DatabaseReaction.js' --js='!**/FileTime.js' --js='!**/ChoiceFormat.js' --js='!**/TableView.js' --js='!**/JSVApplet.js' --js='!**/NativeMDLReactionReader.js' --js='!**/AsyncCallback.js' --js='!**/_ES6/jsutil.js' --js='!**/org/jmol/inchi/InChIJS.js' --js='!**/j2s/swingjs/JSUtil2.js' --js='!**/j2s/core/*.js' --js='!**/js/core/*' --js_output_file ./coreall-advanced.z.js --externs=./externs.txt
+
+java -Xmx2g -Dfile.encoding=UTF-8 -Duser.country=GB -Duser.language=en -Duser.variant -cp ./tools/closure-compiler-v20230802.jar com.google.javascript.jscomp.CommandLineRunner --compilation_level SIMPLE --warning_level QUIET --charset UTF-8 --js='./build/jalviewjs/site/swingjs/**.js' --js='!**/DatabaseReaction.js' --js='!**/FileTime.js' --js='!**/ChoiceFormat.js' --js='!**/TableView.js' --js='!**/JSVApplet.js' --js='!**/NativeMDLReactionReader.js' --js='!**/AsyncCallback.js' --js='!**/_ES6/jsutil.js' --js='!**/org/jmol/inchi/InChIJS.js' --js='!**/j2s/swingjs/JSUtil2.js' --js='!**/j2s/core/*.js' --js='!**/js/core/*' --js_output_file ./coreall-simple.z.js --externs=./externs.txt
+
+cat ./build/jalviewjs/site/swingjs/j2s/com/actelion/research/chem/io/NativeMDLReactionReader.js ./build/jalviewjs/site/swingjs/j2s/com/actelion/research/chem/reaction/DatabaseReaction.js ./build/jalviewjs/site/swingjs/j2s/java/nio/file/attribute/FileTime.js ./build/jalviewjs/site/swingjs/j2s/java/text/ChoiceFormat.js ./build/jalviewjs/site/swingjs/j2s/javax/swing/text/html/TableView.js ./build/jalviewjs/site/swingjs/j2s/jme/js/AsyncCallback.js ./build/jalviewjs/site/swingjs/j2s/jspecview/appletjs/JSVApplet.js > problems1.js
+
+cat ./build/jalviewjs/site/swingjs/j2s/resources/_ES6/jsutil.js ./build/jalviewjs/site/swingjs/j2s/_ES6/jsutil.js ./build/jalviewjs/site/swingjs/j2s/org/jmol/inchi/InChIJS.js ./build/jalviewjs/site/swingjs/j2s/swingjs/JSUtil2.js > problems2.js
+
+cat ./build/jalviewjs/site/swingjs/js/core/coretop2.js ./coreall-simple.z.js ./problems1.js ./problems2.js ./build/jalviewjs/site/swingjs/js/core/corebottom2.js > ./build/jalviewjs/site/swingjs/j2s/core/coreall.z.js
+
+
+--
+
+
+perl -p -i -e 's/colorPtToFFRGB\$javajs_util_T3d/colorPtToFFRGB\$javajs_util_T3/' $(grep -rl 'colorPtToFFRGB$javajs_util_T3d' ./build/jalviewjs/site/swingjs/j2s/)
serverURL: 'https://chemapps.stolaf.edu/jmol/jsmol/php/jsmol.php',
j2sPath: 'swingjs/j2s',
console:'sysoutdiv',
- allowjavascript: true
+ allowjavascript: true,
+ namespace: ""
}
</script>
</head>