?? treemaker.java
字號:
package net.csksoft.PrettyTree;
/*
* 2006 csk
* www.csksoft.net
* csk@live.com
*/
import java.io.*;
import java.util.*;
import org.eclipse.swt.widgets.*;
import org.eclipse.swt.graphics.*;
import org.eclipse.swt.*;
import XTiger.parsersys.Absyn.*;
import XTiger.parsersys.Symbol.Symbol;
public class TreeMaker {
public final static int DEFAULT_FONT_SIZE = 8;
public final static String DEFAULT_FONT_NAME = "Verdana";
protected int m_fon_size = DEFAULT_FONT_SIZE;
protected String m_fon_name = DEFAULT_FONT_NAME;
public boolean isforeign_disp = false;
public Image treeImg;
protected Font stdFont;
protected TreeNodeUnit finalNode = null;
//protected GC m_render
public static Display main_Disp = null;
public TreeMaker()
{
InitEnv();
}
public TreeMaker(int font_size,String font_name)
{
this.m_fon_size = font_size;
this.m_fon_name = font_name;
InitEnv();
}
protected void InitEnv()
{
InitDisp();
stdFont = new Font(main_Disp,this.m_fon_name,this.m_fon_size,SWT.NORMAL);
}
public Point getTextExtent(String text)
{
if (!IsDispInited()) InitDisp();
Point ans;
Image tmpImg = new Image(main_Disp,1,1);
GC tmpGC = new GC(tmpImg);
tmpGC.setFont(stdFont);
ans = tmpGC.textExtent(text);
tmpGC.dispose();
tmpImg.dispose();
return ans;
}
public void InitDisp()
{
if (!IsDispInited())
{
if (Display.getCurrent()!=null)
{
main_Disp = Display.getCurrent();
isforeign_disp = true;
}
else
{
main_Disp = new Display();
isforeign_disp = false;
}
}
}
public static boolean IsDispInited()
{
if (main_Disp == null)
{
return false;
}
return true;
}
public void DisposeDisp()
{
if (IsDispInited())
{
// if (!isforeign_disp)
// {
// main_Disp.dispose();
// main_Disp = null;
// }
}
}
public void dispose()
{
stdFont.dispose();
//if (treeGC!=null)treeGC.dispose();
DisposeDisp();
if (finalNode!=null) finalNode.Dispose();
}
public static void main (String [] args)
{
Exp root = new NilExp(2);
TreeMaker tm = new TreeMaker();
tm.render(root);
ImageData imageData = tm.finalNode.memImg.getImageData();
ImageLoader imageLoader = new ImageLoader();
imageLoader.data = new ImageData[1];
imageLoader.data[0] = imageData;
imageLoader.save("C:\\ss.bmp", SWT.IMAGE_BMP );
tm.dispose();
}
public boolean renderToFile(Exp starter,String filePath,int Format)
{
if (!render( starter))
{
return false;
}
ImageData imageData = finalNode.memImg.getImageData();
ImageLoader imageLoader = new ImageLoader();
imageLoader.data = new ImageData[1];
imageLoader.data[0] = imageData;
int formats = SWT.IMAGE_BMP;
switch (Format)
{
case 0:
formats = SWT.IMAGE_BMP;
break;
case 1:
formats = SWT.IMAGE_JPEG;
break;
case 2:
formats = SWT.IMAGE_PNG;
break;
default:
formats = SWT.IMAGE_BMP;
}
imageLoader.save(filePath, formats );
return true;
}
protected boolean render(Exp starter)
{
if (starter instanceof Exp)
{
TreeNodeUnit final_tree = prExp(starter);
this.treeImg = final_tree.memImg;
//final_tree.renderUnit.drawString("PrettyTree By CSK,www.csksoft.net", 2, 2);
finalNode = final_tree;
return true;
}
else
{
return false;
}
}
TreeNodeUnit prVar(SimpleVar v) {
TreeNodeUnit tmp = new TreeNodeUnit(this);
tmp.Render("SimpleVar:"+v.name.toString(),v.pos , 0, 2);
return tmp;
}
TreeNodeUnit prVar(FieldVar v) {
ArrayList<TreeNodeUnit> arrNode= new ArrayList<TreeNodeUnit>();
arrNode.add(prVar(v.var));
TreeNodeUnit tmp = new TreeNodeUnit(this);
tmp.Render("FieldVar:"+v.field.toString(),v.pos , 1, 2);
tmp.Merge(arrNode);
arrNode.clear();
return tmp;
}
TreeNodeUnit prVar(SubscriptVar v) {
ArrayList<TreeNodeUnit> arrNode= new ArrayList<TreeNodeUnit>();
arrNode.add(prVar(v.var));
arrNode.add(prExp(v.index));
TreeNodeUnit tmp = new TreeNodeUnit(this);
tmp.Render("SubscriptVar",v.pos , 2, 2);
tmp.Merge(arrNode);
arrNode.clear();
return tmp;
}
/* Print A_var types. Indent d spaces. */
TreeNodeUnit prVar(Var v) {
TreeNodeUnit tmp = null;
if (v instanceof SimpleVar) tmp = prVar((SimpleVar) v);
else if (v instanceof FieldVar) tmp = prVar((FieldVar) v);
else if (v instanceof SubscriptVar) tmp = prVar((SubscriptVar) v);
else
{
//throw new Error("Print.prVar");
}
return tmp;
}
TreeNodeUnit prExp(OpExp e) {
// sayln("OpExp(");
// indent(d+1);
String title = "OpExp:";
switch(e.oper) {
case OpExp.PLUS: title+= "PLUS"; break;
case OpExp.MINUS: title+= "MINUS"; break;
case OpExp.MUL: title+= "MUL"; break;
case OpExp.DIV: title+= "DIV"; break;
case OpExp.EQ: title+= "EQ"; break;
case OpExp.NE: title+= "NE"; break;
case OpExp.LT: title+= "LT"; break;
case OpExp.LE: title+= "LE"; break;
case OpExp.GT: title+= "GT"; break;
case OpExp.GE: title+= "GE"; break;
default:
/* throw new Error("Print.prExp.OpExp"); */
}
ArrayList<TreeNodeUnit> arrNode= new ArrayList<TreeNodeUnit>();
arrNode.add(prExp(e.left));
arrNode.add(prExp(e.right));
TreeNodeUnit tmp = new TreeNodeUnit(this);
tmp.Render(title,e.pos , 2, 1);
tmp.Merge(arrNode);
arrNode.clear();
return tmp;
}
TreeNodeUnit prExp(VarExp e) {
ArrayList<TreeNodeUnit> arrNode= new ArrayList<TreeNodeUnit>();
arrNode.add(prVar(e.var));
TreeNodeUnit tmp = new TreeNodeUnit(this);
tmp.Render("varExp",e.pos , 1, 1);
tmp.Merge(arrNode);
arrNode.clear();
return tmp;
}
TreeNodeUnit prExp(NilExp e) {
TreeNodeUnit tmp = new TreeNodeUnit(this);
tmp.Render("Nil",e.pos , 0, 1);
return tmp;
}
TreeNodeUnit prExp(IntExp e) {
TreeNodeUnit tmp = new TreeNodeUnit(this);
tmp.Render("Int:"+e.value,e.pos , 0, 1);
return tmp;
}
TreeNodeUnit prExp(StringExp e) {
TreeNodeUnit tmp = new TreeNodeUnit(this);
tmp.Render("Str:\""+e.value+"\"",e.pos , 0, 1);
return tmp;
}
TreeNodeUnit prExp(CallExp e) {
ArrayList<TreeNodeUnit> arrNode= new ArrayList<TreeNodeUnit>();
arrNode.add(prExplist(e.args));
TreeNodeUnit tmp = new TreeNodeUnit(this);
tmp.Render("Call Func:"+e.func.toString(),e.pos , 1, 1);
tmp.Merge(arrNode);
arrNode.clear();
return tmp;
}
TreeNodeUnit prExp(RecordExp e) {
ArrayList<TreeNodeUnit> arrNode= new ArrayList<TreeNodeUnit>();
arrNode.add(prFieldExpList(e.fields));
TreeNodeUnit tmp = new TreeNodeUnit(this);
tmp.Render("RecordExp:"+e.typ.toString(),e.pos , 1, 1);
tmp.Merge(arrNode);
arrNode.clear();
return tmp;
}
TreeNodeUnit prExp(SeqExp e) {
ArrayList<TreeNodeUnit> arrNode= new ArrayList<TreeNodeUnit>();
arrNode.add(prExplist(e.list));
TreeNodeUnit tmp = new TreeNodeUnit(this);
tmp.Render("SeqExp",e.pos , 1, 1);
tmp.Merge(arrNode);
arrNode.clear();
return tmp;
}
TreeNodeUnit prExp(AssignExp e) {
ArrayList<TreeNodeUnit> arrNode= new ArrayList<TreeNodeUnit>();
arrNode.add(prVar(e.var));
arrNode.add(prExp(e.exp));
TreeNodeUnit tmp = new TreeNodeUnit(this);
tmp.Render("AssignExp",e.pos , 2, 1);
tmp.Merge(arrNode);
arrNode.clear();
return tmp;
}
TreeNodeUnit prExp(IfExp e) {
ArrayList<TreeNodeUnit> arrNode= new ArrayList<TreeNodeUnit>();
if (e.elseclause!=null) { /* else is optional */
arrNode.add(prExp(e.test));
arrNode.add(prExp(e.thenclause));
arrNode.add(prExp(e.elseclause));
}
else
{
arrNode.add(prExp(e.test));
arrNode.add(prExp(e.thenclause));
}
TreeNodeUnit tmp = new TreeNodeUnit(this);
tmp.Render("IfExp",e.pos , e.elseclause!=null?3:2, 1);
tmp.Merge(arrNode);
arrNode.clear();
return tmp;
}
TreeNodeUnit prExp(WhileExp e) {
ArrayList<TreeNodeUnit> arrNode= new ArrayList<TreeNodeUnit>();
arrNode.add(prExp(e.test));
arrNode.add(prExp(e.body));
TreeNodeUnit tmp = new TreeNodeUnit(this);
tmp.Render("WhileExp",e.pos , 2, 1);
tmp.Merge(arrNode);
arrNode.clear();
return tmp;
}
TreeNodeUnit prExp(ForExp e) {
ArrayList<TreeNodeUnit> arrNode= new ArrayList<TreeNodeUnit>();
arrNode.add(prDec(e.var));
arrNode.add(prExp(e.hi));
arrNode.add(prExp(e.body));
TreeNodeUnit tmp = new TreeNodeUnit(this);
tmp.Render("ForExp",e.pos , 3, 1);
tmp.Merge(arrNode);
arrNode.clear();
return tmp;
}
TreeNodeUnit prExp(BreakExp e) {
TreeNodeUnit tmp = new TreeNodeUnit(this);
tmp.Render("BreakExp",e.pos , 0, 1);
return tmp;
}
TreeNodeUnit prExp(LetExp e) {
ArrayList<TreeNodeUnit> arrNode= new ArrayList<TreeNodeUnit>();
arrNode.add(prDecList(e.decs));
arrNode.add(prExp(e.body));
TreeNodeUnit tmp = new TreeNodeUnit(this);
tmp.Render("LetExp",e.pos , 2, 1);
tmp.Merge(arrNode);
arrNode.clear();
return tmp;
}
TreeNodeUnit prExp(ArrayExp e) {
ArrayList<TreeNodeUnit> arrNode= new ArrayList<TreeNodeUnit>();
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -