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.
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 @@
20191105122130
20191107021431
Binary file modified sources/net.sf.j2s.core/dist/swingjs/ver/3.2.4/SwingJS-site.zip
Binary file not shown.
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 @@
20191105122130
20191107021431
Binary file modified sources/net.sf.j2s.java.core/dist/SwingJS-site.zip
Binary file not shown.
53 changes: 53 additions & 0 deletions sources/net.sf.j2s.java.core/doc/Differences.txt
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,17 @@ be done in UTF-8. This means:
- 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

<!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
Expand Down Expand Up @@ -499,6 +510,48 @@ It's a simple modification:
}


@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

Expand Down
34 changes: 31 additions & 3 deletions sources/net.sf.j2s.java.core/src/javax/swing/JFileChooser.java
Original file line number Diff line number Diff line change
Expand Up @@ -780,7 +780,31 @@ public int showDialog(Component parent, String approveButtonText) {
removePropertyChangeListener((PropertyChangeListener) parent);
addPropertyChangeListener((PropertyChangeListener) parent);
}
@SuppressWarnings("unused") Runnable r = new Runnable() {
String format = (isMultiSelectionEnabled() ? "java.util.Array" : "java.io.File");
@SuppressWarnings("unused") Runnable r =

(isMultiSelectionEnabled() ?

new Runnable() {

@Override
public void run() {
/**
* @j2sNative
*
* this.b$['javax.swing.JFileChooser'].selectedFiles = arguments[0] || null;
* this.b$['javax.swing.JFileChooser'].selectedFile = arguments[0][0] || null;
*
*
*/
firePropertyChange("SelectedFiles", null, selectedFiles);
}

}

:

new Runnable() {

@Override
public void run() {
Expand All @@ -794,8 +818,12 @@ public void run() {
firePropertyChange("SelectedFile", null, selectedFile);
}

};
JSUtil.J2S.getFileFromDialog(/**@j2sNative function(file){r.run$(file)}||*/ null, "java.io.File");
}

);
JSUtil.J2S.getFileFromDialog(/**@j2sNative function(file){r.run$(file)}||*/ null,
format);

return JDialog.ASYNCHRONOUS_INTEGER;
case SAVE_DIALOG:
if (selectedFile != null)
Expand Down
66 changes: 58 additions & 8 deletions sources/net.sf.j2s.java.core/src/swingjs/JSDnD.java
Original file line number Diff line number Diff line change
Expand Up @@ -53,7 +53,7 @@ public static void drop(JComponent jc, Object html5DataTransfer, String name, by
if (target != null) {
offset = jc.getLocationOnScreen();
// if (name == null)
target.drop(JSDnD.createDropEvent(target, t, name, data, x, y));
target.drop(createDropEvent(target, t, name, data, x, y));
return;
}
Component top = jc.getTopLevelAncestor();
Expand All @@ -67,7 +67,32 @@ public static void drop(JComponent jc, Object html5DataTransfer, String name, by
//- offset.y
, t, name, data));
}

public static void drop(JComponent jc, Object html5DataTransfer, Object[][] data, int x, int y) {
if (html5DataTransfer == null)
return;
JSTransferable t = new JSTransferable(html5DataTransfer);
DropTarget target = jc.getDropTarget();
System.out.println("JSDnD[] drop for " + jc.getUIClassID() + " target " + target);
Point offset;
if (target != null) {
offset = jc.getLocationOnScreen();
// if (name == null)
target.drop(createDropEvent(target, t, data, x, y));
return;
}
Component top = jc.getTopLevelAncestor();
offset = top.getLocationOnScreen();

System.out.println("JSDnD drop for " + jc.getUIClassID() + " offset " + x + " " + y + " -"+ offset);

top.dispatchEvent(new JSDropMouseEvent(jc, MouseEvent.MOUSE_RELEASED, x
//- offset.x
, y
//- offset.y
, t, null, null));
}

@SuppressWarnings("serial")
public static class JSDropMouseEvent extends MouseEvent implements ActiveEvent {

Expand Down Expand Up @@ -111,9 +136,9 @@ public void dispatch() {
try {
DropTarget target = ((Component) getSource()).getDropTarget();
if (name == null)
target.drop(JSDnD.createDropEvent(target, transferable, null, null, getX(), getY()));
target.drop(createDropEvent(target, transferable, null, null, getX(), getY()));
else
target.drop(JSDnD.createDropEvent(target, transferable, name, getBData(), getX(), getY()));
target.drop(createDropEvent(target, transferable, name, getBData(), getX(), getY()));
} catch (Throwable e) {
System.out.println("JSDnD Error creating Drop event " + e);
}
Expand All @@ -139,6 +164,12 @@ public String paramString() {

}

static DropTargetDropEvent createDropEvent(DropTarget target, Transferable t, Object[][] data, int x, int y) {
DropTargetContext context = new DropTargetContext(target);
context.addNotify(new JSDropTargetContextPeer(target, t, data));
return new DropTargetDropEvent(context, new Point(x, y), DnDConstants.ACTION_MOVE, DnDConstants.ACTION_LINK | DnDConstants.ACTION_COPY_OR_MOVE);
}

static DropTargetDropEvent createDropEvent(DropTarget target, Transferable t, String name, byte[] data, int x, int y) {
DropTargetContext context = new DropTargetContext(target);
context.addNotify(new JSDropTargetContextPeer(target, t, name, data));
Expand All @@ -152,6 +183,11 @@ public JSDropTargetContextPeer (DropTarget target, Transferable t, String name,
transferable = (name == null ? t : new FileTransferable(name, data));
}

public JSDropTargetContextPeer(DropTarget target, Transferable t, Object[][] data) {
this.target = target;
transferable = new FileTransferable(data);
}

private Transferable transferable;
private DropTarget target;

Expand Down Expand Up @@ -274,12 +310,26 @@ private static String fixType(String s) {

static public class FileTransferable extends JSTransferable {

private File file;
private List<File> files;

public FileTransferable(String name, byte[] data) {
super(null);
file = new File(name);
files = new ArrayList<File>();
addFile(name, data);
}

private void addFile(String name, byte[] data) {
File file = new File(name);
file.秘bytes = data;
files.add(file);
}

public FileTransferable(Object[][] data) {
super(null);
files = new ArrayList<File>();
for (int i = 0; i < data.length; i++) {
addFile((String) data[i][0],(byte[]) data[i][1]);
}
}

@Override
Expand All @@ -296,9 +346,9 @@ public boolean isDataFlavorSupported(DataFlavor flavor) {

@Override
public Object getTransferData(DataFlavor flavor) throws UnsupportedFlavorException, IOException {
List<File> list = new ArrayList<File>();
list.add(file);
return list;
Object o = files;
files = null;
return o;
}

}
Expand Down
10 changes: 6 additions & 4 deletions sources/net.sf.j2s.java.core/src/test/Test_Applet_DropFile.java
Original file line number Diff line number Diff line change
Expand Up @@ -85,6 +85,8 @@ public void drop(DropTargetDropEvent dtde) {

try {
Transferable tr = dtde.getTransferable();
JTextArea target = (JTextArea) ((DropTarget) dtde.getSource()).getComponent();
target.setText("");
DataFlavor[] flavors = tr.getTransferDataFlavors();
for (int i = 0; i < flavors.length; i++) {
if (flavors[i].isFlavorJavaFileListType()) {
Expand All @@ -93,17 +95,17 @@ public void drop(DropTargetDropEvent dtde) {
for (int j = 0; j < list.size(); j++) {
File file = (File) list.get(j);
byte[] data = getDroppedFileBytes(file);
fileName.setText(file.getName() + " - " + data.length + " " + dtde.getLocation());
JTextArea target = (JTextArea) ((DropTarget) dtde.getSource()).getComponent();
target.setText(new String(data));
String s = ">>>>>>>>>"+ file.getName() + " - " + data.length + " " + dtde.getLocation() + "\n";
fileName.setText(s);
target.append(s);
target.append(new String(data));
System.out.println("prefsize " + target.getPreferredSize());
}
dtde.dropComplete(true);
return;
} else if (flavors[i].isFlavorTextType()) {
dtde.acceptDrop(DnDConstants.ACTION_COPY_OR_MOVE);
String data = (String) tr.getTransferData(flavors[i]);
JTextArea target = (JTextArea) ((DropTarget) dtde.getSource()).getComponent();
target.setText(data);
dtde.dropComplete(true);
}
Expand Down
23 changes: 22 additions & 1 deletion sources/net.sf.j2s.java.core/src/test/Test_Dialog.java
Original file line number Diff line number Diff line change
Expand Up @@ -64,11 +64,19 @@ public void propertyChange(PropertyChangeEvent event) {
break;
case "javax.swing.JFileChooser":
switch (name) {
case "SelectedFiles":
File[] files = (File[]) val;
long[] len = new long[files.length];
for (int i = 0; i < files.length; i++) {
len[i] = files[i].length();
}
onDialogReturn(files.length + " files read sizes=" + len);
return;
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));
onDialogReturn("fileName is '" + file.getName() + " size=" + array.length);
return;
}
break;
Expand Down Expand Up @@ -170,6 +178,19 @@ public void actionPerformed(ActionEvent e) {
});
p.add(b);

b = new JButton("FilesOpenDialog");
b.addActionListener(new ActionListener() {

@Override
public void actionPerformed(ActionEvent e) {
JFileChooser fc = new JFileChooser();
fc.setMultiSelectionEnabled(true);
onDialogReturn(fc.showOpenDialog(Test_Dialog.this));
}

});
p.add(b);

b = colorButton = new JButton("ColorDialog");
b.addActionListener(new ActionListener() {

Expand Down
30 changes: 30 additions & 0 deletions sources/net.sf.j2s.java.core/src/test/Test_Dialog2.java
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,8 @@ public class Test_Dialog2 extends JFrame {

JLabel status;

private File[] a = new File[0];

private JButton colorButton;

public Test_Dialog2() {
Expand Down Expand Up @@ -158,6 +160,34 @@ public void run() {
});
p.add(b);

b = new JButton("FilesOpenDialog");
b.addActionListener(new ActionListener() {

@Override
public void actionPerformed(ActionEvent e) {
AsyncFileChooser fc = new AsyncFileChooser();
fc.setMultiSelectionEnabled(true);
fc.showOpenDialog(Test_Dialog2.this, new Runnable() {

@Override
public void run() {
System.out.println(fc.getSelectedFile());
File[] files = fc.getSelectedFiles();
String s = "";
for (int i = 0; i < files.length; i++) {
System.out.println("FileChooser returned " + files[i].length() + " bytes for files[" + i
+ "] = " + files[i]);
s += files[i].getName() + " " + files[i].length() + ",";
}
status.setText(s);
}

}, null);
}

});
p.add(b);

b = new JButton("FileSaveDialog");
b.addActionListener(new ActionListener() {

Expand Down
40 changes: 40 additions & 0 deletions sources/net.sf.j2s.java.core/src/test/async/Async.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
package test.async;

import java.awt.Component;
import java.awt.Container;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;

import javax.swing.Icon;
import javax.swing.JOptionPane;
import javax.swing.plaf.UIResource;

/**
* A class to manage asynchronous aspects of SwingJS
*
* @author Bob Hanson hansonr_at_stolaf.edu
*
*/
public class Async {

public static boolean isJS() {
return (/** @j2sNative 1 ? true : */false);
}

/**
* No sleep in JavaScript
* @param ms
*/
public static void javaSleep(int ms) {
if (!isJS()) {
try {
Thread.sleep(ms);
} catch (InterruptedException e) {
}
}

}

}
Loading