/*******************************************************************************
* All Right Reserved. Copyright (c) 1998, 2004 Jackwind Li Guojie
*
* Created on 2004-7-4 19:32:27 by JACK $Id$
*
******************************************************************************/
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
import org.eclipse.draw2d.AbstractBorder;
import org.eclipse.draw2d.ChopboxAnchor;
import org.eclipse.draw2d.ColorConstants;
import org.eclipse.draw2d.Figure;
import org.eclipse.draw2d.Graphics;
import org.eclipse.draw2d.IFigure;
import org.eclipse.draw2d.Label;
import org.eclipse.draw2d.LightweightSystem;
import org.eclipse.draw2d.LineBorder;
import org.eclipse.draw2d.MouseListener;
import org.eclipse.draw2d.PolygonDecoration;
import org.eclipse.draw2d.PolylineConnection;
import org.eclipse.draw2d.ToolbarLayout;
import org.eclipse.draw2d.XYLayout;
import org.eclipse.draw2d.geometry.Insets;
import org.eclipse.draw2d.geometry.PointList;
import org.eclipse.draw2d.geometry.Rectangle;
import org.eclipse.jface.action.Action;
import org.eclipse.jface.dialogs.Dialog;
import org.eclipse.jface.dialogs.InputDialog;
import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.jface.resource.ImageRegistry;
import org.eclipse.jface.window.ApplicationWindow;
import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.layout.FillLayout;
import org.eclipse.swt.widgets.Canvas;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Text;
class ClassFigure extends Figure {
ImageRegistry registry = new ImageRegistry();
// image keys.
String KEY_CLASS = "class";
String KEY_METHOD_PUBLIC = "method_public";
String KEY_METHOD_DEFAULT = "method_default";
String KEY_METHOD_PROTECTED = "method_protected";
String KEY_METHOD_PRIVATE = "method_private";
String KEY_FIELD_PUBLIC = "field_public";
String KEY_FIELD_DEFAULT = "field_default";
String KEY_FIELD_PROTECTED = "field_protected";
String KEY_FIELD_PRIVATE = "field_private";
String[] keys =
{
KEY_CLASS,
KEY_METHOD_PUBLIC,
KEY_METHOD_DEFAULT,
KEY_METHOD_PROTECTED,
KEY_METHOD_PRIVATE,
KEY_FIELD_PUBLIC,
KEY_FIELD_DEFAULT,
KEY_FIELD_PROTECTED,
KEY_FIELD_PRIVATE };
public Box fieldBox = new Box();
public Box methodBox = new Box();
public ClassFigure(Class cls) {
setLayoutManager(new ToolbarLayout());
setBorder(new LineBorder(ColorConstants.black));
setBackgroundColor(ColorConstants.yellow);
setOpaque(true);
for (int i = 0; i < keys.length; i++)
registry.put(
keys[i],
ImageDescriptor.createFromFile(
null,
"icons/java/" + keys[i] + ".gif"));
Label title = new Label(cls.getName(), registry.get(KEY_CLASS));
add(title);
add(fieldBox);
add(methodBox);
// fields.
Field[] fields = cls.getDeclaredFields();
for (int i = 0; i < fields.length; i++) {
Field field = fields[i];
Image image = null;
if (Modifier.isPublic(field.getModifiers())) {
image = registry.get(KEY_FIELD_PUBLIC);
} else if (Modifier.isProtected(field.getModifiers())) {
image = registry.get(KEY_FIELD_PROTECTED);
} else if (Modifier.isPrivate(field.getModifiers())) {
image = registry.get(KEY_FIELD_PRIVATE);
} else {
image = registry.get(KEY_FIELD_DEFAULT);
}
fieldBox.add(new Label(fields[i].getName(), image));
}
// fields.
Method[] methods = cls.getDeclaredMethods();
for (int i = 0; i < methods.length; i++) {
Method method = methods[i];
Image image = null;
if (Modifier.isPublic(method.getModifiers())) {
image = registry.get(KEY_METHOD_PUBLIC);
} else if (Modifier.isProtected(method.getModifiers())) {
image = registry.get(KEY_METHOD_PROTECTED);
} else if (Modifier.isPrivate(method.getModifiers())) {
image = registry.get(KEY_METHOD_PRIVATE);
} else {
image = registry.get(KEY_METHOD_DEFAULT);
}
methodBox.add(new Label(methods[i].getName(), image));
}
}
}
class Box extends Figure {
public Box() {
setBorder(new BoxBorder());
ToolbarLayout toolbarLayout = new ToolbarLayout();
toolbarLayout.setStretchMinorAxis(false);
setLayoutManager(toolbarLayout);
}
private class BoxBorder extends AbstractBorder {
/*
* (non-Javadoc)
*
* @see org.eclipse.draw2d.Border#getInsets(org.eclipse.draw2d.IFigure)
*/
public Insets getInsets(IFigure figure) {
return new Insets(1, 0, 0, 0);
}
/*
* (non-Javadoc)
*
* @see org.eclipse.draw2d.Border#paint(org.eclipse.draw2d.IFigure,
* org.eclipse.draw2d.Graphics,
* org.eclipse.draw2d.geometry.Insets)
*/
public void paint(IFigure figure, Graphics graphics, Insets insets) {
Rectangle rect = getPaintRectangle(figure, insets);
graphics.drawLine(rect.getTopLeft(), rect.getTopRight());
}
}
}
/**
*
*/
public class ClassAnalyzer extends ApplicationWindow {
Text className;
Canvas canvas;
Figure contents;
XYLayout xyLayout;
/**
* @param parentShell
*/
public ClassAnalyzer(Shell parentShell) {
super(parentShell);
addToolBar(SWT.NULL);
}
private void showClass(Class cls) {
if (cls == null)
return;
// removes all existing items.
contents.removeAll();
// draws super class.
Label sup = null;
if (cls.getSuperclass() != null) {
final Class superClass = cls.getSuperclass();
sup = new Label(superClass.getName());
sup.setBorder(new LineBorder());
sup.setBackgroundColor(ColorConstants.lightGreen);
sup.setOpaque(true);
sup.addMouseListener(new MouseListener() {
public void mousePressed(org.eclipse.draw2d.MouseEvent me) {
}
public void mouseReleased(org.eclipse.draw2d.MouseEvent me) {
}
public void mouseDoubleClicked(
org.eclipse.draw2d.MouseEvent me) {
showClass(superClass);
}
});
}
if (sup != null) {
contents.add(sup);
xyLayout.setConstraint(sup, new Rectangle(20, 20, -1, -1));
}
ClassFigure classFigure = new ClassFigure(cls);
contents.add(classFigure);
if (sup == null)
xyLayout.setConstraint(classFigure, new Rectangle(20, 20, -1, -1));
else
xyLayout.setConstraint(
classFigure,
new Rectangle(20, sup.getBounds().height + 40, -1, -1));
// adds connection.
if (sup != null) {
PolylineConnection connection = new PolylineConnection();
ChopboxAnchor source = new ChopboxAnchor(classFigure);
ChopboxAnchor target = new ChopboxAnchor(sup);
connection.setSourceAnchor(source);
connection.setTargetAnchor(target);
PolygonDecoration decoration = new PolygonDecoration();
PointList list = new PointList();
list.addPoint(-2, -2);
list.addPoint(0, 0);
list.addPoint(-2, 2);
decoration.setTemplate(list);
connection.setTargetDecoration(decoration);
contents.add(connection);
}
// resizes the shell.
getShell().setSize(
contents.getPreferredSize().width + 30,
contents.getPreferredSize().height + 80);
}
/*
* (non-Javadoc)
*
* @see org.eclipse.jface.window.Window#createContents(org.eclipse.swt.widgets.Composite)
*/
protected Control createContents(Composite parent) {
Composite composite = new Composite(parent, SWT.NULL);
composite.setLayout(new FillLayout());
canvas = new Canvas(composite, SWT.NULL);
canvas.setBackground(getShell().getDisplay().getSystemColor(SWT.COLOR_WHITE));
LightweightSystem lws = new LightweightSystem(canvas);
contents = new Figure();
xyLayout = new XYLayout();
contents.setLayoutManager(xyLayout);
lws.setContents(contents);
showClass(this.getClass());
// Creates tool bar items.
getToolBarManager().add(new Action("Set class ...") {
public void run() {
InputDialog dialog =
new InputDialog(
getShell(),
"",
"Please enter the class name",
"",
null);
if (dialog.open() != Dialog.OK)
return;
contents.removeAll();
Class cls = null;
try {
cls = Class.forName(dialog.getValue());
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
if (cls != null) {
showClass(cls);
}
}
});
getToolBarManager().update(true);
return composite;
}
public static void main(String[] args) {
ClassAnalyzer window = new ClassAnalyzer(null);
window.setBlockOnOpen(true);
window.open();
Display.getCurrent().dispose();
}
}
|