git-svn-id: https://svn.code.sf.net/p/jode/code/trunk@291 379699f6-c40d-0410-875b-85095c16579estable
parent
0ad9df04f0
commit
17405ed7ad
@ -0,0 +1,170 @@ |
|||||||
|
package jode.swingui; |
||||||
|
import jode.Decompiler; |
||||||
|
import jode.JodeEnvironment; |
||||||
|
import jode.decompiler.TabbedPrintWriter; |
||||||
|
import com.sun.java.swing.*; |
||||||
|
import com.sun.java.swing.event.*; |
||||||
|
import com.sun.java.swing.tree.*; |
||||||
|
import java.awt.*; |
||||||
|
import java.awt.event.*; |
||||||
|
import java.io.*; |
||||||
|
|
||||||
|
public class MainWindow |
||||||
|
implements ActionListener, Runnable, TreeSelectionListener { |
||||||
|
JTree classTree; |
||||||
|
PackagesTreeModel classModel; |
||||||
|
TextArea sourcecodeArea, errorArea; |
||||||
|
String classpath, lastClassName; |
||||||
|
Thread decompileThread; |
||||||
|
|
||||||
|
public MainWindow(Container frame) { |
||||||
|
frame.setLayout(new GridBagLayout()); |
||||||
|
GridBagConstraints c = new GridBagConstraints(); |
||||||
|
c.gridx = 0; |
||||||
|
c.gridy = 0; |
||||||
|
c.gridwidth = 1; |
||||||
|
c.gridheight = 2; |
||||||
|
c.weightx = 0.5; |
||||||
|
c.weighty = 1.0; |
||||||
|
c.fill = c.BOTH; |
||||||
|
classModel = new PackagesTreeModel(); |
||||||
|
classTree = new JTree(classModel); |
||||||
|
classTree.setRootVisible(false); |
||||||
|
DefaultTreeSelectionModel selModel = new DefaultTreeSelectionModel(); |
||||||
|
selModel.setSelectionMode(selModel.SINGLE_TREE_SELECTION); |
||||||
|
classTree.setSelectionModel(selModel); |
||||||
|
classTree.addTreeSelectionListener(this); |
||||||
|
JScrollPane sp = new JScrollPane(); |
||||||
|
sp.getViewport().add(classTree); |
||||||
|
frame.add(sp, c); |
||||||
|
c.gridx = 1; |
||||||
|
c.gridy = 0; |
||||||
|
c.gridwidth = 1; |
||||||
|
c.gridheight = 1; |
||||||
|
c.weightx = 1.0; |
||||||
|
c.weighty = 1.0; |
||||||
|
c.fill = c.BOTH; |
||||||
|
sourcecodeArea = new TextArea(20, 80); |
||||||
|
frame.add(sourcecodeArea, c); |
||||||
|
c.gridx = 1; |
||||||
|
c.gridy = 1; |
||||||
|
c.gridwidth = 1; |
||||||
|
c.gridheight = 1; |
||||||
|
c.weightx = 1.0; |
||||||
|
c.weighty = 0.0; |
||||||
|
c.fill = c.BOTH; |
||||||
|
errorArea = new TextArea(3, 80); |
||||||
|
frame.add(errorArea, c); |
||||||
|
Decompiler.err = new PrintStream(new AreaOutputStream(errorArea)); |
||||||
|
} |
||||||
|
|
||||||
|
public void setClasspath(String classpath) { |
||||||
|
this.classpath = classpath; |
||||||
|
} |
||||||
|
|
||||||
|
public synchronized void valueChanged(TreeSelectionEvent e) { |
||||||
|
if (decompileThread != null) |
||||||
|
return; |
||||||
|
TreePath path = e.getNewLeadSelectionPath(); |
||||||
|
if (path == null) |
||||||
|
return; |
||||||
|
Object node = path.getLastPathComponent(); |
||||||
|
if (node != null && classModel.isLeaf(node)) { |
||||||
|
lastClassName = classModel.getFullName(node); |
||||||
|
decompileThread = new Thread(this); |
||||||
|
sourcecodeArea.setText("Please wait, while decompiling...\n"); |
||||||
|
decompileThread.start(); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
public synchronized void actionPerformed(ActionEvent e) { |
||||||
|
if (e.getSource() == classTree && decompileThread == null) { |
||||||
|
// startButton.setEnabled(false);
|
||||||
|
decompileThread = new Thread(this); |
||||||
|
sourcecodeArea.setText("Please wait, while decompiling...\n"); |
||||||
|
decompileThread.start(); |
||||||
|
// } else if (e.getSource() == saveButton) {
|
||||||
|
// if (frame == null)
|
||||||
|
// frame = new Frame(); //XXX
|
||||||
|
// FileDialog fd = new FileDialog(frame,
|
||||||
|
// "Save decompiled code",
|
||||||
|
// FileDialog.SAVE);
|
||||||
|
// fd.setFile(lastClassName.substring
|
||||||
|
// (lastClassName.lastIndexOf('.')+1).concat(".java"));
|
||||||
|
// fd.show();
|
||||||
|
// String fileName = fd.getFile();
|
||||||
|
// if (fileName == null)
|
||||||
|
// return;
|
||||||
|
// try {
|
||||||
|
// File f = new File(new File(fd.getDirectory()), fileName);
|
||||||
|
// FileWriter out = new FileWriter(f);
|
||||||
|
// out.write(sourcecodeArea.getText());
|
||||||
|
// out.close();
|
||||||
|
// } catch (IOException ex) {
|
||||||
|
// errorArea.setText("");
|
||||||
|
// Decompiler.err.println("Couldn't write to file "
|
||||||
|
// + fileName + ": ");
|
||||||
|
// ex.printStackTrace(Decompiler.err);
|
||||||
|
// }
|
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
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() { |
||||||
|
// Decompiler.isVerbose = verboseCheck.getState();
|
||||||
|
// Decompiler.prettyLocals = prettyCheck.getState();
|
||||||
|
errorArea.setText(""); |
||||||
|
// saveButton.setEnabled(false);
|
||||||
|
|
||||||
|
String cp = classpath; |
||||||
|
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(lastClassName, writer); |
||||||
|
sourcecodeArea.setText(out.toString()); |
||||||
|
// saveButton.setEnabled(true);
|
||||||
|
} catch (Throwable t) { |
||||||
|
sourcecodeArea.setText("Didn't succeed.\n" |
||||||
|
+"Check the below area for more info."); |
||||||
|
t.printStackTrace(); |
||||||
|
} finally { |
||||||
|
synchronized(this) { |
||||||
|
decompileThread = null; |
||||||
|
// startButton.setEnabled(true);
|
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
public static void main(String[] params) { |
||||||
|
JFrame frame = new JFrame(Decompiler.copyright); |
||||||
|
String cp = System.getProperty("java.class.path"); |
||||||
|
if (cp != null) |
||||||
|
jode.bytecode.ClassInfo.setClassPath(cp); |
||||||
|
|
||||||
|
MainWindow win = new MainWindow(frame.getContentPane()); |
||||||
|
if (cp != null) |
||||||
|
win.setClasspath(cp.replace(File.pathSeparatorChar, ',')); |
||||||
|
|
||||||
|
frame.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE); |
||||||
|
frame.pack(); |
||||||
|
frame.show(); |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,97 @@ |
|||||||
|
package jode.swingui; |
||||||
|
import jode.bytecode.ClassInfo; |
||||||
|
import com.sun.java.swing.tree.TreeModel; |
||||||
|
import com.sun.java.swing.tree.TreePath; |
||||||
|
import com.sun.java.swing.event.TreeModelListener; |
||||||
|
import java.util.*; |
||||||
|
|
||||||
|
public class PackagesTreeModel implements TreeModel { |
||||||
|
Hashtable cachedChildrens = new Hashtable(); |
||||||
|
|
||||||
|
class TreeElement { |
||||||
|
String fullName; |
||||||
|
String name; |
||||||
|
|
||||||
|
public TreeElement(String prefix, String name) { |
||||||
|
this.fullName = prefix+name; |
||||||
|
this.name = name; |
||||||
|
} |
||||||
|
|
||||||
|
public String getFullName() { |
||||||
|
return fullName; |
||||||
|
} |
||||||
|
|
||||||
|
public String toString() { |
||||||
|
return name; |
||||||
|
} |
||||||
|
|
||||||
|
public boolean equals(Object o) { |
||||||
|
return (o instanceof TreeElement) |
||||||
|
&& fullName == ((TreeElement)o).fullName; |
||||||
|
} |
||||||
|
|
||||||
|
public int hashCode() { |
||||||
|
return fullName.hashCode(); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
TreeElement root = new TreeElement("",""); |
||||||
|
|
||||||
|
public TreeElement[] getChildrens(TreeElement parent) { |
||||||
|
TreeElement[] result = |
||||||
|
(TreeElement[]) cachedChildrens.get(parent); |
||||||
|
if (result == null) { |
||||||
|
Vector v = new Vector(); |
||||||
|
String prefix = parent == root ? "" : parent.getFullName() + "."; |
||||||
|
Enumeration enum = |
||||||
|
ClassInfo.getClassesAndPackages(parent.getFullName()); |
||||||
|
while (enum.hasMoreElements()) { |
||||||
|
v.addElement(new TreeElement(prefix, (String)enum.nextElement())); |
||||||
|
} |
||||||
|
result = new TreeElement[v.size()]; |
||||||
|
v.copyInto(result); |
||||||
|
cachedChildrens.put(parent, result); |
||||||
|
} |
||||||
|
return result; |
||||||
|
} |
||||||
|
|
||||||
|
public void addTreeModelListener(TreeModelListener l) { |
||||||
|
// we never change
|
||||||
|
} |
||||||
|
public void removeTreeModelListener(TreeModelListener l) { |
||||||
|
// we never change
|
||||||
|
} |
||||||
|
public void valueForPathChanged(TreePath path, Object newValue) { |
||||||
|
// we don't allow values
|
||||||
|
} |
||||||
|
|
||||||
|
public Object getChild(Object parent, int index) { |
||||||
|
return getChildrens((TreeElement) parent)[index]; |
||||||
|
} |
||||||
|
|
||||||
|
public int getChildCount(Object parent) { |
||||||
|
return getChildrens((TreeElement) parent).length; |
||||||
|
} |
||||||
|
|
||||||
|
public int getIndexOfChild(Object parent, Object child) { |
||||||
|
TreeElement[] childrens = getChildrens((TreeElement) parent); |
||||||
|
for (int i=0; i< childrens.length; i++) { |
||||||
|
if (childrens[i] == child) |
||||||
|
return i; |
||||||
|
} |
||||||
|
throw new NoSuchElementException |
||||||
|
(((TreeElement)parent).getFullName() + "." + child); |
||||||
|
} |
||||||
|
|
||||||
|
public Object getRoot() { |
||||||
|
return root; |
||||||
|
} |
||||||
|
|
||||||
|
public boolean isLeaf(Object node) { |
||||||
|
return !ClassInfo.isPackage(((TreeElement) node).getFullName()); |
||||||
|
} |
||||||
|
|
||||||
|
public String getFullName(Object node) { |
||||||
|
return ((TreeElement) node).getFullName(); |
||||||
|
} |
||||||
|
} |
Loading…
Reference in new issue