git-svn-id: https://svn.code.sf.net/p/jode/code/trunk@164 379699f6-c40d-0410-875b-85095c16579estable
parent
a6bc1392d1
commit
10db6a2447
@ -0,0 +1,128 @@ |
|||||||
|
package jode; |
||||||
|
import java.applet.*; |
||||||
|
import java.awt.*; |
||||||
|
import java.io.*; |
||||||
|
|
||||||
|
public class JodeAppletOneZero extends Applet implements Runnable { |
||||||
|
|
||||||
|
TextField classpathField; |
||||||
|
TextField classField; |
||||||
|
TextArea sourcecodeArea; |
||||||
|
TextArea errorArea; |
||||||
|
|
||||||
|
Thread decompileThread; |
||||||
|
|
||||||
|
public JodeAppletOneZero() { |
||||||
|
buildComponents(this); |
||||||
|
} |
||||||
|
|
||||||
|
public void init() { |
||||||
|
String cp = getParameter("classpath"); |
||||||
|
if (cp != null) |
||||||
|
setClasspath(cp); |
||||||
|
String cls = getParameter("class"); |
||||||
|
if (cls != null) |
||||||
|
setClass(cls); |
||||||
|
} |
||||||
|
|
||||||
|
private void buildComponents(Container frame) { |
||||||
|
classpathField = new TextField(50); |
||||||
|
classField = new TextField(50); |
||||||
|
sourcecodeArea = new TextArea(20, 80); |
||||||
|
errorArea = new TextArea(3, 80); |
||||||
|
|
||||||
|
sourcecodeArea.setEditable(false); |
||||||
|
errorArea.setEditable(false); |
||||||
|
|
||||||
|
GridBagLayout gbl = new GridBagLayout(); |
||||||
|
frame.setLayout(gbl); |
||||||
|
GridBagConstraints labelConstr = new GridBagConstraints(); |
||||||
|
GridBagConstraints textConstr = new GridBagConstraints(); |
||||||
|
GridBagConstraints areaConstr = new GridBagConstraints(); |
||||||
|
labelConstr.fill = GridBagConstraints.NONE; |
||||||
|
textConstr.fill = GridBagConstraints.HORIZONTAL; |
||||||
|
areaConstr.fill = GridBagConstraints.BOTH; |
||||||
|
textConstr.gridwidth = GridBagConstraints.REMAINDER; |
||||||
|
textConstr.weightx = 1.0; |
||||||
|
areaConstr.gridwidth = GridBagConstraints.REMAINDER; |
||||||
|
areaConstr.weightx = 1.0; |
||||||
|
areaConstr.weighty = 1.0; |
||||||
|
|
||||||
|
Label label = new Label("class path: "); |
||||||
|
gbl.setConstraints(label, labelConstr); |
||||||
|
frame.add(label); |
||||||
|
gbl.setConstraints(classpathField, textConstr); |
||||||
|
frame.add(classpathField); |
||||||
|
label = new Label("class name: "); |
||||||
|
gbl.setConstraints(label, labelConstr); |
||||||
|
frame.add(label); |
||||||
|
gbl.setConstraints(classField, textConstr); |
||||||
|
frame.add(classField); |
||||||
|
gbl.setConstraints(sourcecodeArea, areaConstr); |
||||||
|
frame.add(sourcecodeArea); |
||||||
|
areaConstr.gridheight = GridBagConstraints.REMAINDER; |
||||||
|
areaConstr.weighty = 0.0; |
||||||
|
gbl.setConstraints(errorArea, areaConstr); |
||||||
|
frame.add(errorArea); |
||||||
|
|
||||||
|
Decompiler.err = new PrintStream(new AreaOutputStream(errorArea)); |
||||||
|
} |
||||||
|
|
||||||
|
public void setClasspath(String cp) { |
||||||
|
classpathField.setText(cp); |
||||||
|
} |
||||||
|
public void setClass(String cls) { |
||||||
|
classField.setText(cls); |
||||||
|
} |
||||||
|
|
||||||
|
public boolean action(Event e, Object arg) { |
||||||
|
if (e.target == classField) { |
||||||
|
if (decompileThread == null) { |
||||||
|
decompileThread = new Thread(this); |
||||||
|
sourcecodeArea.setText("Please wait, while decompiling...\n"); |
||||||
|
decompileThread.start(); |
||||||
|
} else |
||||||
|
sourcecodeArea |
||||||
|
.appendText("Be a little bit more patient, please.\n"); |
||||||
|
} |
||||||
|
return true; |
||||||
|
} |
||||||
|
|
||||||
|
public class AreaOutputStream extends OutputStream { |
||||||
|
private TextArea area; |
||||||
|
|
||||||
|
public AreaOutputStream(TextArea a) { |
||||||
|
area = a; |
||||||
|
} |
||||||
|
|
||||||
|
public void write(int b) throws IOException { |
||||||
|
area.appendText(String.valueOf((byte)b)); |
||||||
|
} |
||||||
|
|
||||||
|
public void write(byte[] b, int off, int len) throws IOException { |
||||||
|
area.appendText(new String(b, off, len)); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
public void run() { |
||||||
|
errorArea.setText(""); |
||||||
|
String cp = classpathField.getText(); |
||||||
|
cp = cp.replace(':', jode.bytecode.SearchPath.protocolSeparator); |
||||||
|
cp = cp.replace(',', File.pathSeparatorChar); |
||||||
|
JodeEnvironment env = new JodeEnvironment(cp); |
||||||
|
ByteArrayOutputStream out = new ByteArrayOutputStream(); |
||||||
|
try { |
||||||
|
TabbedPrintWriter writer = new TabbedPrintWriter(out, " "); |
||||||
|
env.doClass(classField.getText(), writer); |
||||||
|
sourcecodeArea.setText(out.toString()); |
||||||
|
} catch (Throwable t) { |
||||||
|
sourcecodeArea.setText("Didn't succeed.\n" |
||||||
|
+"Check the below area for more info."); |
||||||
|
t.printStackTrace(Decompiler.err); |
||||||
|
} finally { |
||||||
|
synchronized(this) { |
||||||
|
decompileThread = null; |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,22 @@ |
|||||||
|
<html> |
||||||
|
<head> |
||||||
|
<title>Jode Test Applet</title> |
||||||
|
</head> |
||||||
|
|
||||||
|
<body> |
||||||
|
Press enter in the class name field to decompile this applet. You may |
||||||
|
change the class path and name to point to an class file of your |
||||||
|
choice. But note that most browsers doesn't allow loading files from |
||||||
|
a different server.<br> |
||||||
|
|
||||||
|
You can download <a href="jode/jode-applet.html">HTML-file</a> and |
||||||
|
this <a href="jode_cls.zip">archive, if you want to test it yourself. |
||||||
|
You should use the appletviewer in this case. |
||||||
|
|
||||||
|
<applet code="jode/JodeAppletOneZero.class" codebase="./" width=640 height=400> |
||||||
|
<param name=classpath |
||||||
|
value="http://nirwana/~jochen/"> |
||||||
|
<param name=class value="jode.JodeAppletOneZero"> |
||||||
|
</applet> |
||||||
|
</body> |
||||||
|
</html> |
@ -0,0 +1,125 @@ |
|||||||
|
package jode; |
||||||
|
import java.applet.*; |
||||||
|
import java.awt.*; |
||||||
|
import java.awt.event.*; |
||||||
|
import java.io.*; |
||||||
|
|
||||||
|
public class JodeWindow |
||||||
|
implements ActionListener, Runnable |
||||||
|
{ |
||||||
|
TextField classpathField; |
||||||
|
TextField classField; |
||||||
|
TextArea sourcecodeArea; |
||||||
|
TextArea errorArea; |
||||||
|
|
||||||
|
Thread decompileThread; |
||||||
|
|
||||||
|
public JodeWindow(Container frame) { |
||||||
|
buildComponents(frame); |
||||||
|
} |
||||||
|
|
||||||
|
private void buildComponents(Container frame) { |
||||||
|
classpathField = new TextField(50); |
||||||
|
classField = new TextField(50); |
||||||
|
sourcecodeArea = new TextArea(20, 80); |
||||||
|
errorArea = new TextArea(3, 80); |
||||||
|
|
||||||
|
sourcecodeArea.setEditable(false); |
||||||
|
errorArea.setEditable(false); |
||||||
|
|
||||||
|
frame.setLayout(new GridBagLayout()); |
||||||
|
GridBagConstraints labelConstr = new GridBagConstraints(); |
||||||
|
GridBagConstraints textConstr = new GridBagConstraints(); |
||||||
|
GridBagConstraints areaConstr = new GridBagConstraints(); |
||||||
|
labelConstr.fill = GridBagConstraints.NONE; |
||||||
|
textConstr.fill = GridBagConstraints.HORIZONTAL; |
||||||
|
areaConstr.fill = GridBagConstraints.BOTH; |
||||||
|
textConstr.gridwidth = GridBagConstraints.REMAINDER; |
||||||
|
textConstr.weightx = 1.0; |
||||||
|
areaConstr.gridwidth = GridBagConstraints.REMAINDER; |
||||||
|
areaConstr.weightx = 1.0; |
||||||
|
areaConstr.weighty = 1.0; |
||||||
|
|
||||||
|
frame.add(new Label("class path: "), labelConstr); |
||||||
|
frame.add(classpathField, textConstr); |
||||||
|
frame.add(new Label("class name: "), labelConstr); |
||||||
|
frame.add(classField, textConstr); |
||||||
|
frame.add(sourcecodeArea, areaConstr); |
||||||
|
areaConstr.gridheight = GridBagConstraints.REMAINDER; |
||||||
|
areaConstr.weighty = 0.0; |
||||||
|
frame.add(errorArea, areaConstr); |
||||||
|
|
||||||
|
classField.addActionListener(this); |
||||||
|
|
||||||
|
String cp = System.getProperty("java.class.path"); |
||||||
|
if (cp != null) |
||||||
|
classpathField.setText(cp); |
||||||
|
String cls = "jode.JodeWindow"; |
||||||
|
classField.setText(cls); |
||||||
|
|
||||||
|
Decompiler.err = new PrintStream(new AreaOutputStream(errorArea)); |
||||||
|
} |
||||||
|
|
||||||
|
public void setClasspath(String cp) { |
||||||
|
classpathField.setText(cp); |
||||||
|
} |
||||||
|
public void setClass(String cls) { |
||||||
|
classField.setText(cls); |
||||||
|
} |
||||||
|
|
||||||
|
public synchronized void actionPerformed(ActionEvent e) { |
||||||
|
if (decompileThread == null) { |
||||||
|
decompileThread = new Thread(this); |
||||||
|
sourcecodeArea.setText("Please wait, while decompiling...\n"); |
||||||
|
decompileThread.start(); |
||||||
|
} else |
||||||
|
sourcecodeArea.append("Be a little bit more patient, please.\n"); |
||||||
|
} |
||||||
|
|
||||||
|
public class AreaOutputStream extends OutputStream { |
||||||
|
private TextArea area; |
||||||
|
|
||||||
|
public AreaOutputStream(TextArea a) { |
||||||
|
area = a; |
||||||
|
} |
||||||
|
|
||||||
|
public void write(int b) throws IOException { |
||||||
|
area.append(String.valueOf((byte)b)); |
||||||
|
} |
||||||
|
|
||||||
|
public void write(byte[] b, int off, int len) throws IOException { |
||||||
|
area.append(new String(b, off, len)); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
public void run() { |
||||||
|
JodeEnvironment env = new JodeEnvironment(classpathField.getText()); |
||||||
|
ByteArrayOutputStream out = new ByteArrayOutputStream(); |
||||||
|
errorArea.setText(""); |
||||||
|
try { |
||||||
|
TabbedPrintWriter writer = new TabbedPrintWriter(out, " "); |
||||||
|
env.doClass(classField.getText(), writer); |
||||||
|
sourcecodeArea.setText(out.toString()); |
||||||
|
} catch (Throwable t) { |
||||||
|
sourcecodeArea.setText("Didn't succeed.\n" |
||||||
|
+"Check the below area for more info."); |
||||||
|
t.printStackTrace(); |
||||||
|
} finally { |
||||||
|
synchronized(this) { |
||||||
|
decompileThread = null; |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
public static void main(String argv[]) { |
||||||
|
Frame frame = new Frame(Decompiler.copyright); |
||||||
|
new JodeWindow(frame); |
||||||
|
frame.addWindowListener(new WindowAdapter() { |
||||||
|
public void windowClosing(WindowEvent e) { |
||||||
|
System.exit(0); |
||||||
|
} |
||||||
|
}); |
||||||
|
frame.pack(); |
||||||
|
frame.show(); |
||||||
|
} |
||||||
|
} |
Loading…
Reference in new issue