Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Binary file modified sources/net.sf.j2s.core/dist/swingjs/SwingJS-site.zip
Binary file not shown.
1 change: 1 addition & 0 deletions sources/net.sf.j2s.core/dist/swingjs/_j2sclasslist.txt
Original file line number Diff line number Diff line change
Expand Up @@ -172,6 +172,7 @@ javajs/util/JSThread.js
javajs/util/Lst.js
javajs/util/PT.js
javajs/util/SB.js
javax/net/ssl/HttpsUrlConnection.js
javax/swing/AbstractAction.js
javax/swing/AbstractButton.js
javax/swing/AbstractListModel.js
Expand Down
2 changes: 1 addition & 1 deletion sources/net.sf.j2s.core/dist/swingjs/timestamp
Original file line number Diff line number Diff line change
@@ -1 +1 @@
20190516132838
20190606154615
Binary file modified sources/net.sf.j2s.core/dist/swingjs/ver/3.2.4/SwingJS-site.zip
Binary file not shown.
Original file line number Diff line number Diff line change
Expand Up @@ -172,6 +172,7 @@ javajs/util/JSThread.js
javajs/util/Lst.js
javajs/util/PT.js
javajs/util/SB.js
javax/net/ssl/HttpsUrlConnection.js
javax/swing/AbstractAction.js
javax/swing/AbstractButton.js
javax/swing/AbstractListModel.js
Expand Down
2 changes: 1 addition & 1 deletion sources/net.sf.j2s.core/dist/swingjs/ver/3.2.4/timestamp
Original file line number Diff line number Diff line change
@@ -1 +1 @@
20190516132838
20190606154615
33 changes: 33 additions & 0 deletions sources/net.sf.j2s.core/doc/howItWorks.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
Java2Script: How It Works


A compiler converts code in one computer language to another. Typically this is from a higher-level language to a lower-level "machine code" language. In the case of the Java compiler, this is from written Java code (*.java) to "Java byte code" (*.class). In the case of of java2script, this is from Java to JavaScript. There are two basic requirements of a compiler: reading and writing. The reading process involves converting the written Java code to an <i>abstract syntax tree</i> [https://en.wikipedia.org/wiki/Abstract_syntax_tree]. The writing process involves scanning that tree, creating one or more output files from the original input file.

java2script is technically a "CompilationParticipant". [https://help.eclipse.org/neon/index.jsp?topic=%2Forg.eclipse.jdt.doc.isv%2Freference%2Fapi%2Forg%2Feclipse%2Fjdt%2Fcore%2Fcompiler%2FCompilationParticipant.html] It gets a notification that a certain set of files has been changed by the user or otherwise need compiling, just after the Java compiler has completed its work, it gets that same file list. It creates an instance of the Eclipse abstract syntax tree parser, org.eclipse.jdt.core.dom.ASTParser and initializes it with just a few statements (these from net.sf.j2s.core.Java2ScriptCompiler.java):

astParser.setSource(createdUnit);
astParser.setResolveBindings(true);
CompilationUnit root = (CompilationUnit) astParser.createAST(null);


Its primarily work is via a subclass of "ASTVisitor" [https://help.eclipse.org/luna/index.jsp?topic=%2Forg.eclipse.jdt.doc.isv%2Freference%2Fapi%2Forg%2Feclipse%2Fjdt%2Fcore%2Fdom%2FASTVisitor.html]

Java2ScriptVisitor visitor = new Java2ScriptVisitor().setProject(project, testing);
root.accept(visitor);


So this is pretty straightforward. All the output that is ultimately saved in *.js files is created in that last call to ASTVisitor.accept(ASTVisitor). This call initiates a full scan of the abstract syntax tree in the form of calls to a series of heavily overloaded visit(...) methods, such as:


public boolean visit(DoStatement node)
public boolean visit(SingleVariableDeclaration node)


etc.

If ever there is a need to fix something that the java2script compiler is doing wrong or to adapt to new Java syntax, as for Java 11, look in net.sf.j2s.core.Java2ScriptVisitor. There is great documentation on all of these org.eclipse.jdt.core.dom.ASTNode subclasses.

Bob Hanson 2019.06.07.



Original file line number Diff line number Diff line change
Expand Up @@ -349,12 +349,10 @@ private String getProperty(String key) {
return val;
}

private void outputJavaScript(Java2ScriptVisitor visitor,
// DependencyASTVisitor dvisitor, CompilationUnit fRoot,
String j2sPath) {
private void outputJavaScript(Java2ScriptVisitor visitor, String j2sPath) {

// fragments[0] is package]
List<String> elements = visitor.getElementList();// dvisitor.getDependencyScript(visitor.getBuffer());
List<String> elements = visitor.getElementList();

// BH all compression is deprecated --- use Google Closure Compiler

Expand All @@ -376,10 +374,6 @@ private void createJSFile(String j2sPath, String packageName, String elementName
throw new RuntimeException("Failed to create folder " + j2sPath); //$NON-NLS-1$
}
}
// InnerHotspotServer.addCompiledItem(packageName + "." +
// elementName);
} else {
// InnerHotspotServer.addCompiledItem(elementName);
}
writeToFile(new File(j2sPath, elementName + ".js"), js);
}
Expand Down
1 change: 1 addition & 0 deletions sources/net.sf.j2s.java.core/_j2sclasslist.txt
Original file line number Diff line number Diff line change
Expand Up @@ -172,6 +172,7 @@ javajs/util/JSThread.js
javajs/util/Lst.js
javajs/util/PT.js
javajs/util/SB.js
javax/net/ssl/HttpsUrlConnection.js
javax/swing/AbstractAction.js
javax/swing/AbstractButton.js
javax/swing/AbstractListModel.js
Expand Down
Binary file modified sources/net.sf.j2s.java.core/dist/SwingJS-site.zip
Binary file not shown.
1 change: 1 addition & 0 deletions sources/net.sf.j2s.java.core/dist/_j2sclasslist.txt
Original file line number Diff line number Diff line change
Expand Up @@ -172,6 +172,7 @@ javajs/util/JSThread.js
javajs/util/Lst.js
javajs/util/PT.js
javajs/util/SB.js
javax/net/ssl/HttpsUrlConnection.js
javax/swing/AbstractAction.js
javax/swing/AbstractButton.js
javax/swing/AbstractListModel.js
Expand Down
Original file line number Diff line number Diff line change
@@ -1,12 +1,34 @@
package javajs.api.js;

/**
* methods in JSmol JavaScript accessed in Jmol
* methods in j2s JavaScript accessed in Jmol
*/
public interface J2SObjectInterface {

Object doAjax(String url, String postOut, Object bytesOrStringOut, Object info);

Object doAjax(Object url, String postOut, Object bytesOrStringOut, boolean isBinary);

void applyFunc(Object func, Object data);

Object newGrayScaleImage(Object context, Object image, int width, int height, int[] grayBuffer);

void showInfo(JSAppletObject html5Applet, boolean show);

void clearConsole(JSAppletObject html5Applet);

boolean isBinaryUrl(String filename);

void saveImage(JSAppletObject html5Applet, String type, String fileName);

void repaint(JSAppletObject html5Applet, boolean asNewThread);

void setCanvasImage(Object canvas, int width, int height);

Object getHiddenCanvas(JSAppletObject html5Applet, String string, int w, int h);

Object loadFileAsynchronously(Object fileLoadThread, JSAppletObject html5Applet, String fileName, Object appData);

void resizeApplet(Object html5Applet, int[] dims);

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
package javajs.api.js;

public interface JSAppletObject {

}
5 changes: 2 additions & 3 deletions sources/net.sf.j2s.java.core/src/swingjs/JSAppletViewer.java
Original file line number Diff line number Diff line change
Expand Up @@ -506,8 +506,7 @@ public int run1(int mode) {
Object args = params.get("args");
if (args instanceof String)
args = PT.split((String) args, " ");
((JSDummyApplet) applet).runMain(main, (String[]) args);
JSUtil.readyCallback(appletName, fullName, applet, this);
((JSDummyApplet) applet).runMain(this, (String[]) args);
break;
case APPLET_QUIT:
break;
Expand Down Expand Up @@ -535,7 +534,7 @@ private void runLoader() {
throw new InstantiationException("\"code\" or \"main\" must be specified.");
}
if (code == null)
code = "swingjs.JSApplet";
code = "swingjs.JSDummyApplet";
else if (code.indexOf(".") < 0)
code = "_." + code;
top = applet = (JApplet) JSUtil.getInstance(code);
Expand Down
14 changes: 10 additions & 4 deletions sources/net.sf.j2s.java.core/src/swingjs/JSDummyApplet.java
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,8 @@
*/
public class JSDummyApplet extends JApplet {

public Class<?> runMain(String className, String[] args) {
public Class<?> runMain(JSAppletViewer v, String[] args) {
String className = v.main;
Class<?> theClass = null;
try {
theClass = Class.forName(className);
Expand All @@ -24,11 +25,16 @@ public Class<?> runMain(String className, String[] args) {
/**
* @j2sNative
*
* setTimeout(function(){theClass.$clazz$.main$SA.call(null, args || []);},1);
* setTimeout(function(){
* theClass.$clazz$.main$SA.call(null, args || []);
*/
JSUtil.readyCallback(v.appletName, v.fullName, v.applet, v);
/**
* @j2sNative
*
* },1);
*
*/
{
}
return theClass;
}
}
4 changes: 4 additions & 0 deletions sources/net.sf.j2s.java.core/src/swingjs/JSUtil.java
Original file line number Diff line number Diff line change
Expand Up @@ -281,6 +281,10 @@ public static String loadStaticResource(String file) {
return s;
}

public static boolean isClassLoaded(String className) {
return (/** @j2sNative Clazz._isClassDefined(className) || */false);
}

static String processCSS(String css, String path) {
if (path != null && css.indexOf("images/") >= 0) {
path = path.substring(0, path.lastIndexOf("/") + 1) + "images/";
Expand Down
11 changes: 10 additions & 1 deletion sources/net.sf.j2s.java.core/src/swingjs/plaf/JSFrameUI.java
Original file line number Diff line number Diff line change
@@ -1,8 +1,11 @@
package swingjs.plaf;

import java.awt.Color;
import java.awt.Component;
import java.awt.Desktop;
import java.awt.Dimension;
import java.awt.Insets;
import java.awt.JSComponent;
import java.awt.Rectangle;
import java.awt.Toolkit;
import java.awt.event.ComponentEvent;
Expand Down Expand Up @@ -184,7 +187,13 @@ public DOMNode updateDOMNode() {

@Override
protected boolean isFrameIndependent() {
return (!isInternalFrame || embeddingNode == null || !doEmbed);
JSComponent c = frame.parent;
if (isInternalFrame && (c == null || c != null
&& c.getUIClassID() != "DesktopPaneUI"))
return false;
boolean is = (isInternalFrame ? c == null
|| c.getWidth() == 0 : !doEmbed);
return is;
}


Expand Down
8 changes: 8 additions & 0 deletions sources/net.sf.j2s.java.core/src/test/Test_Class.java
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,14 @@
@SuppressWarnings("rawtypes")
class Test_Class extends Test_ {

private void test(String s) {

}

private void test(Integer i) {

}

int test1 = 0;

static String s = "test";
Expand Down
63 changes: 58 additions & 5 deletions sources/net.sf.j2s.java.core/srcjs/js/j2sApplet.js
Original file line number Diff line number Diff line change
Expand Up @@ -1847,9 +1847,18 @@ if (ev.keyCode == 9 && ev.target["data-focuscomponent"]) {
ev.preventDefault();
}

var newid = (J2S._mouseOwner && J2S._mouseOwner.isDragging ? 506 : 503);
// MouseEvent.MOUSE_DRAGGED : MouseEvent.MOUSE_MOVED

var isTouch = (ev.type == "touchmove");
if (isTouch && J2S._gestureUpdate(who, ev))
return false;
if (isTouch) {
if (J2S._gestureUpdate(who, ev))
return false;
if (newid == 506) {
ev.button = ev.originalEvent.button = 0;
ev.buttons = ev.originalEvent.buttons = 1;
}
}
var xym = getXY(who, ev, id);
if (!xym)
return false;
Expand All @@ -1863,9 +1872,7 @@ if (ev.keyCode == 9 && ev.target["data-focuscomponent"]) {
var ui = ev.target["data-ui"];
var target = ev.target["data-component"];

who.applet._processEvent(J2S._mouseOwner && J2S._mouseOwner.isDragging ? 506 : 503, xym, ev,
who._frameViewer); // MouseEvent.MOUSE_DRAGGED :
// MouseEvent.MOUSE_MOVED
who.applet._processEvent(newid, xym, ev, who._frameViewer);
return !!(ui || target);
}

Expand Down Expand Up @@ -2996,4 +3003,50 @@ if (ev.keyCode == 9 && ev.target["data-focuscomponent"]) {
return path;
}

J2S._newGrayScaleImage = function(context, image, width, height, grayBuffer) {
var c;
image || (image = Jmol.$(context.canvas.applet, "image")[0]);
if (image == null) {
var appId = context.canvas.applet._id;
var id = appId + "_imagediv";
c = document.createElement("canvas");
c.id = id;
c.style.width = width + "px";
c.style.height = height + "px";
c.width = width;
c.height = height;

var layer = document.getElementById(appId + "_contentLayer");
image = new Image();
image.canvas = c;
image.appId = appId;
image.id = appId + "_image";
image.layer = layer;
image.w = width;
image.h = height;
image.onload = function(e) {
try {
URL.revokeObjectURL(image.src);
} catch (e) {}
};
var div = document.createElement("div");
image.div = div;
div.style.position="absolute";
layer.appendChild(div);
div.appendChild(image);
}
c = image.canvas.getContext("2d");
var imageData = c.getImageData(0, 0, width, height);
var buf = imageData.data;
var ng = grayBuffer.length;
var pt = 0;
for (var i = 0; i < ng; i++) {
buf[pt++] = buf[pt++] = buf[pt++] = grayBuffer[i];
buf[pt++] = 0xFF;
}
c.putImageData(imageData, 0, 0);
image.canvas.toBlob(function(blob){image.src = URL.createObjectURL(blob)});
return image;
}

})(J2S);
13 changes: 7 additions & 6 deletions sources/net.sf.j2s.java.core/srcjs/js/j2sClazz.js
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@

// TODO: still a lot of references to window[...]

// BH 2019.05.21 changes Clazz.isClassDefined to Clazz._isClassDefined for compression
// BH 2019.05.13 fixes for Math.getExponent, Math.IEEERemainder, Array.equals(Object)
// BH 2019.02.16 fixes typo in Integer.parseInt(s,radix)
// BH 2019.02.07 fixes radix|10 should be radix||10
Expand Down Expand Up @@ -938,8 +939,8 @@ var checkDeclared = function(name, type) {
_declared[name] = type;
}

/* not clear that this needs to be public */
Clazz.isClassDefined = function(clazzName) {
/* public */
Clazz._isClassDefined = function(clazzName) {
if (!clazzName)
return false; /* consider null or empty name as non-defined class */
if (Clazz.allClasses[clazzName])
Expand Down Expand Up @@ -2210,8 +2211,8 @@ _Loader.requireLoaderByBase = function (base) {
var isClassdefined;
var definedClasses;

if (self.Clazz && Clazz.isClassDefined) {
isClassDefined = Clazz.isClassDefined;
if (self.Clazz && Clazz._isClassDefined) {
isClassDefined = Clazz._isClassDefined;
} else {
definedClasses = {};
isClassDefined = function (clazzName) {
Expand Down Expand Up @@ -2504,7 +2505,7 @@ Clazz._4Name = function(clazzName, applet, state, asClazz, initialize, isQuiet)
return getArrayClass(clazzName);
if (clazzName.indexOf(".") < 0)
clazzName = "java.lang." + clazzName;
var isok = Clazz.isClassDefined(clazzName);
var isok = Clazz._isClassDefined(clazzName);
if (isok && asClazz) {
var cl1 = Clazz.allClasses[clazzName];
cl1.$clinit$ && cl1.$clinit$();
Expand All @@ -2516,7 +2517,7 @@ Clazz._4Name = function(clazzName, applet, state, asClazz, initialize, isQuiet)
// BH we allow Java's java.swing.JTable.$BooleanRenderer as a stand-in for java.swing.JTable.BooleanRenderer
// when the static nested class is created using declareType
name2 = clazzName.replace(/\$/g,".");
if (Clazz.isClassDefined(name2)) {
if (Clazz._isClassDefined(name2)) {
clazzName = name2;
} else {
name2 = null;
Expand Down
Loading