package org.eclipse.osbp.utils.vaadin.bpmn;

public class BpmnNode {
	public enum BpmnShape {
		STARTEVENT, MESSAGE_STARTEVENT, ENDEVENT, ERROR_ENDEVENT, TASK, USERTASK, SCRIPTTASK, SERVICETASK, RECEIVETASK, SENDTASK, PARALLEL_GATEWAY, EXCLUSIVE_GATEWAY, INCLUSIVE_GATEWAY, CALL_ACTIVITY, SEQ_FLOW
	}

	private String id;
	private String name;
	private int x;
	private int y;
	private int width;
	private int height;
	private String source;
	private String target;
	private BpmnShape shape;

	public String getId() {
		return id;
	}

	public void setId(String id) {
		this.id = id;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public int getX() {
		return x;
	}

	public void setX(int x) {
		this.x = x;
	}

	public int getY() {
		return y;
	}

	public void setY(int y) {
		this.y = y;
	}

	public int getWidth() {
		return width;
	}

	public void setWidth(int width) {
		this.width = width;
	}

	public int getHeight() {
		return height;
	}

	public void setHeight(int height) {
		this.height = height;
	}

	public String getSource() {
		return source;
	}

	public void setSource(String source) {
		this.source = source;
	}

	public String getTarget() {
		return target;
	}

	public void setTarget(String target) {
		this.target = target;
	}

	public BpmnShape getShape() {
		return shape;
	}

	public void setShape(BpmnShape shape) {
		this.shape = shape;
	}
}
