SWT Jface Eclipse Java

/*******************************************************************************
 * 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();
  }
}