Newer
Older
AnchorGarden_M / src / main / java / jaist / css / covis / cls / ClassStamp.java
package jaist.css.covis.cls;

import jaist.css.covis.CoVisBuffer;
import jaist.css.covis.Selectable;

import java.awt.BasicStroke;
import java.awt.Color;
import java.util.ArrayList;
import java.util.Hashtable;
import java.util.List;
import java.util.TreeMap;

import edu.umd.cs.piccolo.PNode;
import edu.umd.cs.piccolo.nodes.PPath;
import edu.umd.cs.piccolo.nodes.PText;
import edu.umd.cs.piccolo.util.PDimension;

public class ClassStamp extends PPath implements Layoutable, Selectable, Move {
	public static BasicStroke roundrectStroke = new BasicStroke(4f,BasicStroke.CAP_ROUND, BasicStroke.JOIN_ROUND, 90.0f);

	private static final long serialVersionUID = -2274392520995258292L;
	public static Object[] possibilities = {"Object", "Oval", "Rect", "String", "int", "char"};
	public Covis_Type cv_type;
	PNode cv_class_for_tooltip;
	PText tooltip_classname;
	public static ClassStamp selectedType;
	public static ArrayList<ClassStamp> stamps;
	static{
		stamps = new ArrayList<ClassStamp>();
	}
	private boolean isSelected;

	PPath handle;
	PText caption;
	public static float top = 27;
	public CoVisBuffer buffer;
	public ClassStamp(Covis_Type co, CoVisBuffer buf){
		cv_type = co;
		buffer = buf;

		setPathToRectangle(0,top,200,100);
		setPaint(new Color(230,230,200));
		setStrokePaint(Color.gray);
		setStroke(new BasicStroke(1));

		addChild(cv_type);
		layout(0);

		//		addAttribute("moveTargetY", this);
		addAttribute("info", "ClassStamp "+this.toString());
		addAttribute("selectable", this);
		addAttribute("moveTargetY", this);
		addAttribute("dragLayout", this);


		handle = new PPath(this.getPathReference());
		handle.addAttribute("moveTargetY", this);
		handle.addAttribute("dragLayout", this);
		handle.setTransparency(0.0f);
		handle.setPaint(Color.pink);
		handle.setStrokePaint(Color.red);
		handle.setStroke(roundrectStroke);
		handle.setPickable(true);
		handle.moveToFront();
		handle.addAttribute("info", "ClassStamp handle");
		handle.addAttribute("selectable", this);
		handle.addAttribute("exclusiveSelectable", stamps);
		addChild(handle);

		caption = new PText(cv_type.getClsName());
		caption.scale(2);
		caption.setOffset(10,-2);
		caption.addAttribute("moveTargetY", this);
		caption.addAttribute("dragLayout", this);
		addChild(caption);

		stamps.add(this);

		addAttribute("popupMenu", new ClassStampMenu(this, buffer));
		cv_type.addAttribute("popupMenu", new ClassStampMenu(this, buffer));
		handle.addAttribute("popupMenu", new ClassStampMenu(this, buffer));
		caption.addAttribute("popupMenu", new ClassStampMenu(this, buffer));
	}
	public String toString(){
		return cv_type.getClsName();
	}

	public void layout(int dur){
		layoutExceptOne(null, dur);
	}

	public void layoutExceptOne(PNode operationNode, int dur) {
		List<PNode> col = getChildrenReference();
		TreeMap<Double,PNode> map = new TreeMap<Double, PNode>();
		for(PNode p: col) map.put(p.getYOffset(), p);

		double offsetx = 10;
		double endx = 10;
		double offsety = 10;
		double endy = 10;
		double maxx = 0, maxy = 0; 
		for(PNode p : map.values()){
			//			p.setOffset(offsetx, offsety);
			double px = p.getFullBounds().width;
			double py = p.getFullBounds().height;
			if (maxx < offsetx + endx + px) maxx = offsetx + endx + px;
			if (maxy < offsety + endy + py) maxy = offsety + endy + py;
			if (operationNode != p) p.animateToPositionScaleRotation(offsetx, offsety+top, 1, 0, dur);
			offsety += py;
			offsety += 10;
		}
		animateToBounds(0, top, maxx, maxy, dur);
	}

	public ArrayList<Selectable> getAllChildren() {
		return null;
	}

	public boolean isSelected() {
		return isSelected;
	}

	public void setSelected(boolean f, ArrayList<Selectable> list) {
		isSelected = f;


		if (f) {
			handle.setTransparency(0.8f);
			//			Informer.playSound("Default.wav");
			Informer.playSound("Pop.wav");
		} else {
			handle.setTransparency(0.0f);
		}
		if (f && list != null && !list.contains(this)) list.add(this);
		if (!f && list != null && list.contains(this)) list.remove(this);
		if (f) selectedType = this; else {
			if (selectedType == this) {
				selectedType = null;
			}
		}
	}

	public PNode theNode() {
		return this;
	}

	public void toFront() {
		getParent().addChild(this);
	}

	public void toggleSelected(ArrayList<Selectable> list) {
		setSelected(!isSelected, list);
	}

	public void removeLabel(Hashtable<PNode, PNode> trash) {
		if (trash != null) trash.put(this, getParent());
		removeFromParent();
	}
	public PNode getToolTipNode(){
		if (cv_class_for_tooltip == null) {
			cv_class_for_tooltip = cv_type.createToolTip();
			cv_class_for_tooltip.setScale(0.5f);
		}
		return cv_class_for_tooltip;
	}

	public PNode getToolTipNode_forVariable() {
		if (tooltip_classname == null) {
			tooltip_classname = new PText("Click to add variable\nof '"+cv_type.getClsName()+"'");
			tooltip_classname.setScale(1.5f);
		}
		return tooltip_classname;
	}
	public void move(PDimension d){
		translate(d.getWidth(), d.getHeight()); //履歴に関係ない動作
	}
}