拓扑编辑器的编写

编辑器需要有新增节点的拖拽功能,编辑器的增减。下面贴出本人编写的一个基于birdeye的编辑器:

package cn.hnisi.ravis.editor
{
	import flash.display.DisplayObject;
	import flash.display.DisplayObjectContainer;
	import flash.events.Event;
	import flash.events.KeyboardEvent;
	import flash.events.MouseEvent;
	import flash.filters.GlowFilter;
	import flash.geom.Point;
	import flash.geom.Rectangle;
	import flash.ui.Keyboard;
	import flash.utils.Dictionary;
	
	import mx.controls.Alert;
	import mx.core.UIComponent;
	import mx.effects.Glow;
	import mx.events.ChildExistenceChangedEvent;
	import mx.events.DragEvent;
	import mx.events.SandboxMouseEvent;
	import mx.graphics.SolidColor;
	import mx.graphics.SolidColorStroke;
	import mx.managers.DragManager;
	import mx.utils.ObjectUtil;
	
	import org.un.cava.birdeye.ravis.components.renderers.BaseRenderer;
	import org.un.cava.birdeye.ravis.graphLayout.data.IGraph;
	import org.un.cava.birdeye.ravis.graphLayout.data.Node;
	import org.un.cava.birdeye.ravis.graphLayout.visual.IVisualEdge;
	import org.un.cava.birdeye.ravis.graphLayout.visual.IVisualNode;
	import org.un.cava.birdeye.ravis.graphLayout.visual.VisualGraph;
	import org.un.cava.birdeye.ravis.graphLayout.visual.edgeRenderers.BaseEdgeRenderer;
	import org.un.cava.birdeye.ravis.graphLayout.visual.events.VisualNodeEvent;
	
	import spark.components.Group;
	import spark.filters.GlowFilter;
	
	import ws.tink.spark.graphics.SolidColorDash;
	import ws.tink.spark.primatives.Rect;
	
	[Event(name="rendererDoubleClick", type="flash.events.MouseEvent")]
	[Event(name="edgeDoubleClick", type="cn.hnisi.ravis.editor.VisualGraphEditorEvent")]
	public class VisualGraphEditor extends VisualGraph
	{
		internal static var rendererProperties:Array=null;
		
		private var _selection:Vector.<BaseRenderer>;
		private var adorners:Dictionary;
		
		public var grid:Grid;
		public var adornersGroup:Group;
		
		private var marquee:Rect;
		private var startX:Number;
		private var startY:Number;
		
		internal var lastX:Number;
		internal var lastY:Number;
		
		private var _rendererAdded:Boolean;
		private var rect:Rectangle;
		private var currentRenderer:UIComponent;
		
		private var seleEdge:BaseEdgeRenderer;
		
		public function VisualGraphEditor()
		{
			super();
			
			_selection = new Vector.<BaseRenderer>();
			addEventListener(KeyboardEvent.KEY_DOWN,onKeyDown);
			newNodesDefaultVisible = true;
			
			adorners = new Dictionary();
	
			this.addEventListener(DragEvent.DRAG_ENTER, this.dragEnterHandler);
			this.addEventListener(DragEvent.DRAG_OVER, this.dragOverHandler);
			this.addEventListener(DragEvent.DRAG_DROP, this.dragDropHandler);
			this.addEventListener(MouseEvent.MOUSE_DOWN,onAdornerGroupMouseDown);
			this.doubleClickEnabled = true;
			this.addEventListener(MouseEvent.DOUBLE_CLICK,onAdornerGroupDoubleClick);
//			this.addEventListener(MouseEvent.MOUSE_MOVE,onMouseMove);
		}
		
		protected function onMouseMove(event:MouseEvent):void
		{
			var renderer:BaseRenderer = GetRenderer(event.target);
			updateToolTipRenderer(renderer);
		}
		
		private function updateToolTipRenderer(renderer:BaseRenderer):void
		{
			/*if(renderer){
				if(!toolTipRenderer){
					toolTipRenderer = new ToolTipRenderer();
				}
				toolTipRenderer.adornerObject = renderer;
				this.adornersGroup.addElement(toolTipRenderer);
				toolTipRenderer.visible = true;
			}else{
				if(toolTipRenderer){
//					this.adornersGroup.removeElement(toolTipRenderer);
					toolTipRenderer.visible = false;
				}
//				toolTipRenderer = null;
			}*/
			return;
		}
		
		override public function set graph(g:IGraph):void{
			clearAllAdorners();
			super.graph = g;
		}
		
		internal function dragEnterHandler(event:DragEvent):void
		{
			if (event.dragSource.hasFormat(Palette.DATA_FORMAT)) 
			{
				DragManager.acceptDragDrop(this);
			}
		}
		
		internal function dragOverHandler(event:DragEvent):void
		{
			/*if (this.allowDropping) 
			{
				this.trackCurrentSubgraph(arg1);
			}
			return;*/
		}
		
		internal function dragDropHandler(event:DragEvent):void
		{
			if (event.dragSource.hasFormat(Palette.DATA_FORMAT)) 
			{
				var object:Object=event.dragSource.dataForFormat(Palette.DATA_FORMAT);
				var hDistance:Number=object.hDistance;
				var vDistance:Number=object.vDistance;
				
				var dragInitiator:BaseRenderer=event.dragInitiator as BaseRenderer;
				var data:Object = dragInitiator.data.data;
				var clonedData:Object = ObjectUtil.clone(data);
				var id:String = ""
//					+Math.floor(10000*Math.random());
//				if(data is XML){
//					var dataXml:XML = data as XML;
//					if(dataXml.@id != undefined){
//						dataXml.@id = id;
//					}
//				}
				var ivisualNode:IVisualNode = addRenderer(id,clonedData);
				XML(ivisualNode.data).@id = ""+ivisualNode.id;
				var baseRenderer:UIComponent = ivisualNode.view;
				baseRenderer.parent.setChildIndex(baseRenderer,0);
				ivisualNode.viewX = this.mouseX - hDistance;
				ivisualNode.viewY = this.mouseY - vDistance;
				ivisualNode.refresh();
				var filter:flash.filters.GlowFilter = new flash.filters.GlowFilter(0xE9AB96,1,10,10);
				ivisualNode.view.filters = [filter];
				
			}
		}
		
		protected function onChildRemove(event:ChildExistenceChangedEvent):void
		{
			updateAdorner(event.relatedObject as UIComponent);
		}
		
		
		protected function onChildAdd(event:ChildExistenceChangedEvent):void
		{
			clearAllAdorners();
			setSelected(event.relatedObject as BaseRenderer,true);
			updateAdorner(event.relatedObject as UIComponent);
		}
		
		/**
		 * 清空选择项。 
		 * 
		 */
		public function clearSelection(renderer:BaseRenderer):void{
			var index:int = this._selection.indexOf(renderer);
			if( index != -1){
				this._selection.splice(index,1);
			}
		}
		
		/**
		 * 清空选择项。 
		 * 
		 */
		public function clearAll():void{
			this._selection.splice(0,this._selection.length);
		}
		
		/**
		 * 清空选择项。 
		 * 
		 */
		public function clearAllAdorners():void{
			var length:int = this._selection.length;
			while(length>=0){
				var baseRender:BaseRenderer = this._selection.pop();
				updateAdorner(baseRender);
				length--;
			}
		}
		
		/**
		 * 选中全部。 
		 * 
		 */
		public function selectAll():void{
			clearAll();
			var length:int = nodeLayer.numChildren;
			for(var i:int = length-1; i>= 0; i--){
				var renderer:UIComponent = nodeLayer.getChildAt(i) as UIComponent;
				if(renderer is BaseRenderer){
					setSelected(renderer as BaseRenderer,true);
				}
			}
		}
		
		/**
		 * 获得选中的节点。 
		 * @return 
		 * 
		 */
		public function getSelection():Vector.<BaseRenderer>{
			return this._selection;
		}
		
		/**
		 * 获得选中的节点。 
		 * @return 
		 * 
		 */
		public function setSelected(renderer:BaseRenderer,selected:Boolean = true):void{
			if(selected){
				if(this._selection.indexOf(renderer) == -1){
					this._selection.push(renderer);
				}
			}else{
				var index:int = this._selection.indexOf(renderer);
				if( index != -1){
					this._selection.splice(index,1);
				}
			}
		}
		
		/**
		 * 获得选中的节点。 
		 * @return 
		 * 
		 */
		public function isSelected(renderer:BaseRenderer):Boolean{
			var index:int = this._selection.indexOf(renderer);
			if( index != -1){
				return true;
			}else{
				return false;
			}
		}
		
		/**
		 * 映射到节点。 
		 * @param ui
		 * @return 
		 * 
		 */
		public function renderToNode(ui:UIComponent):IVisualNode{
			return lookupNode(ui);
		}
		
		/**
		 * 映射到连线。 
		 * @param ui
		 * @return 
		 * 
		 */
		public function renderToEdge(ui:UIComponent):IVisualEdge{
			return lookupEdge(ui);
		}
		
		/**
		 * 删除渲染器。 
		 * @param renderer
		 * 
		 */
		public function deleteRenderer(renderer:UIComponent):void
		{
			var ivisualNode:IVisualNode = lookupNode(renderer);
			if(ivisualNode && ivisualNode.view is BaseRenderer){
				setSelected(ivisualNode.view as BaseRenderer,false);
			}
			
			if(ivisualNode){
				removeNode(ivisualNode);
			}
		}
		
		public function deleteEdge(renderer:UIComponent):void{
			var iVisualEdge:IVisualEdge = lookupEdge(renderer);
			
			if(iVisualEdge){
				removeVEdge(iVisualEdge);
			}
		}

		/**
		 * 添加渲染器。 
		 * @param sid
		 * @param o
		 * 
		 */
		public function addRenderer(sid:String = "",o:Object = null):IVisualNode
		{
			var currentRoot:IVisualNode = this.currentRootVNode;
			var ivisualNode:IVisualNode = createNode(sid,o);
			this.currentRootVNode = currentRoot;
			return ivisualNode;
		}
		
		/**
		 * 获取最上面的渲染器。 
		 * @param object
		 * @return 
		 * 
		 */
		public function getBaseRender(object:Object):BaseRenderer
		{
			while (object is DisplayObject) 
			{
				if (object is BaseRenderer) 
				{
					return BaseRenderer(object);
				}
				object = object.parent;
			}
			return null;	
		}
		
		public function getRenderders():Array{
			var array:Array = [];
			for(var i:int = nodeLayer.numChildren-1;i>=0;i--){
				array.push(nodeLayer.getChildAt(i));
			}
			
			for(var j:int = edgeLayer.numChildren-1;j>=0;j--){
				array.push(edgeLayer.getChildAt(j));
			}
			
			/*for(i = 0;i<edgeLabelLayer.numChildren;i++){
				array.push(edgeLabelLayer.getChildAt(i));
			}*/
			
			return array;
		}
		
		internal function updateAdorner(renderer:UIComponent):void
		{
			var adorner:Adorner=this.getAdorner(renderer);
			if (this.isSelected(renderer as BaseRenderer)) 
			{
				if (adorner == null) 
				{
					adorner = this.createAdorner(renderer);
					this.adorners[renderer] = adorner;
					this.adornersGroup.addElement(adorner);
				}
			}
			else if (adorner != null) 
			{
				this.adornersGroup.removeElement(adorner);
				this.adorners[renderer] = null;
			}
			return;
		}
		
		internal function createAdorner(renderer:UIComponent):Adorner
		{
			if (renderer is BaseRenderer) 
			{
				return new BaseRendererAdorner(renderer);
			}
			throw new ArgumentError("参数有误");
		}
		
		public function getAdorner(renderer:UIComponent):Adorner
		{
			return Adorner(this.adorners[renderer]);
		}
		
		override protected function dragBegin(event:MouseEvent):void{
			super.dragBegin(event);
			/*this.startX = this.adornersGroup.mouseX;
			this.startY = this.adornersGroup.mouseY;*/
		}
		
		override protected function dragEnd(event:MouseEvent):void {
			super.dragEnd(event);
			if(!event.ctrlKey){
				return;
			}
			if(this.getSelection().length ==1){
				return;
			}
			/*var hitRenderer:BaseRenderer = event.currentTarget as BaseRenderer;
			var snapPoint:Point;
			var mousePoint:Point;
			var startPoint:Point = new Point (this.startX,this.startY);
			startPoint = this.snapPoint(startPoint, this);
			this.lastX = startPoint.x;
			this.lastY = startPoint.y;
			
			var mX:Number = this.mouseX;
			var mY:Number = this.mouseY;
			mousePoint = new Point(mX,mY);
			
			var i:int=0;
			while (i < this.getSelection().length) 
			{
				var renderer:BaseRenderer = getSelection()[i] as BaseRenderer;
				if(renderer != hitRenderer){
					this.translate(renderer, new flash.geom.Point(mousePoint.x - this.lastX, mousePoint.y - this.lastY));
				}
				
				i++;
			}*/
		}
		
		override protected function handleDrag(event:MouseEvent):void{
			super.handleDrag(event);
			/*var hitRenderer:BaseRenderer = event.currentTarget as BaseRenderer;
			var snapPoint:Point;
			var mousePoint:Point;
			var startPoint:Point = new Point (this.startX,this.startY);
			startPoint = this.snapPoint(startPoint, this);
			this.lastX = startPoint.x;
			this.lastY = startPoint.y;
			
			var mX:Number = this.mouseX;
			var mY:Number = this.mouseY;
			mousePoint = new Point(mX,mY);
			
			var length:int=0;
			while (length < this.getSelection().length) 
			{
				var renderer:BaseRenderer = getSelection()[length] as BaseRenderer;
				if(renderer != hitRenderer){
					this.translate(renderer, new flash.geom.Point(mousePoint.x - this.lastX, mousePoint.y - this.lastY));
				}
				
				length++;
			}*/
		}
		
		private  function getBaseEdgeRenderer(object:Object):BaseEdgeRenderer
		{
			while(object){
				if (object is BaseEdgeRenderer) 
				{
					return object as BaseEdgeRenderer;
				}
				object = object.parent;
			}
			return null;
		}

		
		/**
		 * 双击 
		 * @param event
		 * 
		 */
		protected function onAdornerGroupDoubleClick(event:MouseEvent):void
		{
			var baseEdgeRenderer:BaseEdgeRenderer = getBaseEdgeRenderer(event.target);
			if(baseEdgeRenderer){
				dispatchEvent(new VisualGraphEditorEvent(VisualGraphEditorEvent.EDGE_DOUBLE_CLICK,baseEdgeRenderer));
			}
		}
		
		
		/**
		 * 单击。 
		 * @param event
		 * 
		 */
		protected function onAdornerGroupMouseDown(event:MouseEvent):void
		{
			this.setFocus();
			
			var baseEdgeRenderer:BaseEdgeRenderer = getBaseEdgeRenderer(event.target);
			if(baseEdgeRenderer){
				seleEdge = baseEdgeRenderer;
				return;
			}
			
			if(!event.ctrlKey){
				return;
			}
			
			this.startX = this.adornersGroup.mouseX;
			this.startY = this.adornersGroup.mouseY;
			var displayObject:DisplayObject = systemManager.getSandboxRoot();
			displayObject.addEventListener(MouseEvent.MOUSE_UP, this.mouseUpHandler, true);
			displayObject.addEventListener(MouseEvent.MOUSE_MOVE, this.mouseDragHandler, true);
			displayObject.addEventListener(SandboxMouseEvent.MOUSE_UP_SOMEWHERE, this.mouseUpHandler, true);
			displayObject.addEventListener(SandboxMouseEvent.MOUSE_MOVE_SOMEWHERE, this.mouseDragHandler, true);
			systemManager.deployMouseShields(true);
		}
		
		protected function mouseDragHandler(event:Event):void
		{
			var lastX:Number = this.adornersGroup.mouseX;
			var lastY:Number = this.adornersGroup.mouseY;
			
			if (this.marquee == null) 
			{
				this.marquee = new Rect();
				this.marquee.maxWidth = Number.MAX_VALUE;
				this.marquee.maxHeight = Number.MAX_VALUE;
				this.marquee.stroke = new SolidColorDash(5,5,0,1,1);
//				this.marquee.fill = new SolidColor(0x0478DF,0.4);
				this.adornersGroup.addElement(this.marquee);
			}
			
			var start:Point = this.adornersGroup.globalToLocal(this.adornersGroup.localToGlobal(new flash.geom.Point(this.startX, this.startY)));
			var end:Point = this.adornersGroup.globalToLocal(this.adornersGroup.localToGlobal(new flash.geom.Point(lastX, lastY)));
			this.marquee.left = Math.min(start.x, end.x);
			this.marquee.top = Math.min(start.y, end.y);
			this.marquee.width = Math.abs(start.x - end.x);
			this.marquee.height = Math.abs(start.y - end.y);
		}
		
		protected function mouseUpHandler(event:Event):void
		{
			var rectangle:Rectangle=null;
			var length:int;
			var renderer:UIComponent;
			if (this.marquee != null) 
			{
				rectangle = new Rectangle(Number(this.marquee.left), Number(this.marquee.top), this.marquee.width, this.marquee.height);
				this.adornersGroup.removeElement(this.marquee);
				this.marquee = null;
				
				length = 0;
				while (length < this.nodeLayer.numChildren) 
				{
					renderer = this.nodeLayer.getChildAt(length) as UIComponent;
					if (renderer) 
					{
						var renderRect:Rectangle = renderer.getBounds(this.adornersGroup);
						if(rectangle.intersects(renderRect)){
							this.setSelected(renderer as BaseRenderer, true);
							updateAdorner(renderer);
						}else{
							this.setSelected(renderer as BaseRenderer, false);
							updateAdorner(renderer);
						}
					}
					++length;
				}
			}
			
			var displayObject:DisplayObject=systemManager.getSandboxRoot();
			displayObject.removeEventListener(MouseEvent.MOUSE_UP, this.mouseUpHandler, true);
			displayObject.removeEventListener(MouseEvent.MOUSE_MOVE, this.mouseDragHandler, true);
			displayObject.removeEventListener(SandboxMouseEvent.MOUSE_UP_SOMEWHERE, this.mouseUpHandler, true);
			displayObject.removeEventListener(SandboxMouseEvent.MOUSE_MOVE_SOMEWHERE, this.mouseDragHandler, true);
			systemManager.deployMouseShields(false);
		}
		
		public static function GetRenderer(object:Object):BaseRenderer
		{
			while (object is DisplayObject) 
			{
				if (object is BaseRenderer) 
				{
					return BaseRenderer(object);
				}
				object = object.parent;
			}
			return null;
		}
		
		override protected function backgroundDragBegin(event:MouseEvent):void{
			if(event.ctrlKey){
				
			}else{
				super.backgroundDragBegin(event);
				clearAllAdorners();
				clearAll();
			}
		}
		
		override protected function createVNodeComponent(vn:IVisualNode):UIComponent {
			var mycomponent:UIComponent = super.createVNodeComponent(vn);
//			mycomponent.doubleClickEnabled = false;
//			mycomponent.removeEventListener(MouseEvent.DOUBLE_CLICK, nodeDoubleClick,false);
			return mycomponent;
		}
		
		override protected function nodeDoubleClick(e:MouseEvent):void {
			var baseRender:BaseRenderer = e.currentTarget as BaseRenderer;
			var visualNodeEvent:VisualNodeEvent = new VisualNodeEvent(VisualNodeEvent.DOUBLE_CLICK);
			visualNodeEvent.baseRenderer = baseRender;
			dispatchEvent(visualNodeEvent);
		}
		
		override  protected function nodeMouseDown(e:MouseEvent):void {
			super.nodeMouseDown(e);
			var renderer:BaseRenderer;
			if(e.currentTarget is BaseRenderer){
				renderer = e.currentTarget as BaseRenderer;
			}
			
			if(!renderer){
				return;
			}
			renderer.useHandCursor = false;
			if(e.ctrlKey){
				if(isSelected(renderer)){
					setSelected(renderer,false);
				}else{
					setSelected(renderer,true);
				}	
			}else{
				if(isSelected(renderer)){
					
				}else{
					clearAllAdorners();
					setSelected(renderer,true);
				}
			}
			
			updateAdorner(renderer);
			this.setFocus();
			
			this.startX = this.mouseX;
			this.startY = this.mouseY;
			
			if (e.ctrlKey || e.shiftKey) 
			{
				return;
			}
		}
		
		function snapPoint(point:Point, displayObjectContainer:DisplayObjectContainer):Point
		{
			if(displayObjectContainer!= this){
				point = this.globalToLocal(displayObjectContainer.localToGlobal(point));
			}
			
			if(displayObjectContainer!= this){
				point = displayObjectContainer.globalToLocal(this.localToGlobal(point));
			}
			return point;
		}
		
		internal function translate(baseRenderer:BaseRenderer, point:Point):void
		{
			setX(baseRenderer, getX(baseRenderer) + point.x);
			setY(baseRenderer, getY(baseRenderer) + point.y);
			return;
		}
		
		
		protected override function createChildren():void
		{
			grid = new Grid();
			grid.percentWidth = 100;
			grid.percentHeight = 100;
			addChild(grid);
			
			super.createChildren();
			super.nodeLayer.addEventListener(ChildExistenceChangedEvent.CHILD_REMOVE,onChildRemove);
			super.nodeLayer.addEventListener(ChildExistenceChangedEvent.CHILD_ADD,onChildAdd);
			
			adornersGroup = new Group();
			adornersGroup.id = "adornersGroup";
			adornersGroup.percentWidth = 100;
			adornersGroup.percentHeight = 100;
			addChild(adornersGroup);
		}
				
		public function getRendererByIndex(index:int):UIComponent{
			return super.nodeLayer.getChildAt(index) as UIComponent;
		}
		
		public static function getVisualGraphEditor(object:Object):VisualGraphEditor
		{
			if (object == null || (object is VisualGraphEditor) )
			{
				return object as VisualGraphEditor;
			}
			return getVisualGraphEditor(object.parent);
		}
		
		protected function onKeyDown(event:KeyboardEvent):void
		{
			var length:int;
			switch(event.keyCode)
			{
				case Keyboard.DELETE:
				{
					if(this.seleEdge){
						deleteEdge(seleEdge);
					}
					
					if(getSelection().length == 0){
						return;
					}
					length = getSelection().length;
					var renderer:BaseRenderer;
					
					while(length > 0){
						renderer = getSelection()[length -1];
						if(renderer){
							setSelected(renderer,false);
							deleteRenderer(renderer);
						}
						length --;
					}
					break;
				}
					
				case Keyboard.J:
				{
					if(event.ctrlKey && !event.shiftKey){
						if(getSelection().length < 2){
							return;
						}
						 length = 0;
						while(length +1 < getSelection().length){
							var baseRender0:BaseRenderer = getSelection()[length];
							var baseRender1:BaseRenderer = getSelection()[length+1];
							var ivNode0:IVisualNode = renderToNode(baseRender0);
							var ivNode1:IVisualNode = renderToNode(baseRender1);
							if(!ivNode1 || !ivNode0){
								return;
							}
							linkNodes(ivNode0,ivNode1);
							length++;
						}
					}else if(event.ctrlKey && event.shiftKey){
						if(getSelection().length < 2){
							return;
						}
						
						length = 0;
						while(length +1 < getSelection().length){
							var baseRender0:BaseRenderer = getSelection()[length];
							var baseRender1:BaseRenderer = getSelection()[length+1];
							var ivNode0:IVisualNode = renderToNode(baseRender0);
							var ivNode1:IVisualNode = renderToNode(baseRender1);
							if(!ivNode1 || !ivNode0){
								return;
							}
							unlinkNodes(ivNode0,ivNode1);
							length++;
						}
					}
					break;
				}
					
				default:
				{
					break;
				}
			}
		}
		
		static function cloneInternal(arg1:BaseRenderer, arg2:BaseRenderer):BaseRenderer
		{
			var loc1:BaseRenderer=cloneRendererStatic(arg1);
			arg2.addElement(loc1);
			cloneChildrenStatic(arg1, loc1, null);
			setX(loc1, 0);
			setY(loc1, 0);
			return loc1;
		}
		
		internal static function cloneChildrenStatic(arg1:BaseRenderer, arg2:BaseRenderer, arg3:Function):void
		{
			/*var loc2:*=0;
			var loc3:*=null;
			var loc4:*=null;
			var loc1:*;
			if ((loc1 = arg1 as com.ibm.ilog.elixir.diagram.Subgraph) != null) 
			{
			loc2 = 0;
			while (loc2 < loc1.graph.numElements) 
			{
			if ((loc3 = loc1.graph.getElementAt(loc2) as com.ibm.ilog.elixir.diagram.Renderer) != null) 
			{
			loc4 = cloneRendererStatic(loc3, arg3);
			com.ibm.ilog.elixir.diagram.Subgraph(arg2).graph.addElement(loc4);
			cloneChildrenStatic(loc3, loc4, arg3);
			}
			++loc2;
			}
			}*/
			return;
		}
		
		public static function cloneRendererStatic(arg1:BaseRenderer, arg2:Function=null, arg3:flash.utils.Dictionary=null, arg4:__AS3__.vec.Vector=null):BaseRenderer
		{
			var loc1:*=null;
			var loc2:*=null;
			var loc3:*=null;
			var loc4:*=null;
			try 
			{
				if ((loc1 = flash.utils.getDefinitionByName(flash.utils.getQualifiedClassName(arg1)) as Class) != null) 
				{
					loc2 = BaseRenderer(new loc1());
					cloneProperties(arg1, loc2, arg2);
					if (arg2 != null) 
					{
						arg2(arg1, loc2, !(arg3 == null));
					}
					if (arg3 != null) 
					{
						arg3[arg1] = loc2;
					}
					/*if (arg1 is com.ibm.ilog.elixir.diagram.Link) 
					{
					loc3 = com.ibm.ilog.elixir.diagram.Link(arg1);
					if (arg4 != null) 
					{
					arg4.push(loc3);
					}
					loc4 = com.ibm.ilog.elixir.diagram.Link(loc2);
					if (loc3.fallbackStartPoint) 
					{
					loc4.fallbackStartPoint = new flash.geom.Point(loc3.fallbackStartPoint.x, loc3.fallbackStartPoint.y);
					}
					if (loc3.fallbackEndPoint) 
					{
					loc4.fallbackEndPoint = new flash.geom.Point(loc3.fallbackEndPoint.x, loc3.fallbackEndPoint.y);
					}
					}*/
					return loc2;
				}
			}
			catch (err:Error)
			{
			};
			return null;
		}
		
		internal static function cloneProperties(renderer:BaseRenderer, cloneRenderer:BaseRenderer, arg3:Function):void
		{
			var propertyName:*=null;
			var loc5:*=null;
			var loc6:*=null;
			var loc7:*=null;
			if (!(renderer == null) && !(cloneRenderer == null)) 
			{
				setX(cloneRenderer, getX(renderer));
				setY(cloneRenderer, getY(renderer));
				
				cloneRenderer.explicitWidth = renderer.explicitWidth;
				cloneRenderer.explicitHeight = renderer.explicitHeight;
				cloneRenderer.percentWidth = renderer.percentWidth;
				cloneRenderer.percentHeight = renderer.percentHeight;
				cloneRenderer.explicitMinWidth = renderer.explicitMinWidth;
				cloneRenderer.explicitMinHeight = renderer.explicitMinHeight;
				cloneRenderer.explicitMaxWidth = renderer.explicitMaxWidth;
				cloneRenderer.explicitMaxHeight = renderer.explicitMaxHeight;
			}
			if (rendererProperties == null) 
			{
				rendererProperties = new Array();
				var propertyLength:int=0;
				var classInfo:Object = ObjectUtil.getClassInfo(new BaseRenderer())["properties"];
				for each (loc5 in classInfo) 
				{
					rendererProperties.push(loc5.localName);
				}
			}
			var includeReadOnly:Boolean;
			(includeReadOnly = new Object())["includeReadOnly"] = false;
			var loc2:*;
			var loc3:*=(loc2 = mx.utils.ObjectUtil.getClassInfo(renderer, rendererProperties, includeReadOnly))["properties"];
			propertyLength = 0;
			classInfo = loc3;
			for each (propertyName in classInfo) 
			{
			};
			return;
		}
		
		static function getX(baseRenderer:BaseRenderer):Number
		{
			var loc1:Number=NaN;
			if (baseRenderer.left is Number) 
			{
				loc1 = Number(baseRenderer.left);
				if (!isNaN(loc1)) 
				{
					return loc1;
				}
			}
			return baseRenderer.x;
		}
		
		static function setX(baseRenderer:BaseRenderer, positionX:Number):void
		{
			if (baseRenderer.left is Number && !isNaN(Number(baseRenderer.left))) 
			{
				baseRenderer.left = positionX;
			}
			else 
			{
				baseRenderer.x = positionX;
			}
			return;
		}
		
		static function getY(baseRenderer:BaseRenderer):Number
		{
			var loc1:Number=NaN;
			if (baseRenderer.top is Number) 
			{
				loc1 = Number(baseRenderer.top);
				if (!isNaN(loc1)) 
				{
					return loc1;
				}
			}
			return baseRenderer.y;
		}
		
		static function setY(baseRenderer:BaseRenderer, positionY:Number):void
		{
			if (baseRenderer.top is Number && !isNaN(Number(baseRenderer.top))) 
			{
				baseRenderer.top = positionY;
			}
			else 
			{
				baseRenderer.y = positionY;
			}
			return;
		}
	}
}


 

package cn.hnisi.ravis.editor
{
	import flash.events.Event;
	
	public class VisualGraphEditorEvent extends Event
	{
		public static const EDGE_DOUBLE_CLICK:String = "edgeDoubleClick";
		public var item:Object;
		
		public function VisualGraphEditorEvent(type:String,item:Object,bubbles:Boolean=false, cancelable:Boolean=false)
		{
			super(type, bubbles, cancelable);
			this.item = item;
		}
	}
}


 

package cn.hnisi.ravis.editor
{
	import flash.display.Bitmap;
	import flash.display.DisplayObject;
	import flash.events.MouseEvent;
	import flash.geom.Point;
	
	import mx.core.DragSource;
	import mx.core.UIComponent;
	import mx.graphics.ImageSnapshot;
	import mx.managers.DragManager;
	
	import org.un.cava.birdeye.ravis.components.renderers.BaseRenderer;
	import org.un.cava.birdeye.ravis.components.renderers.nodes.BaseNodeRenderer;
	
	import spark.components.Group;
	import spark.components.Image;
	
	public class Palette extends Group
	{
		/**
		 * 定义一个用于拖拽格式的常量:bpmDragDataFormat。 
		 */
		public static const DATA_FORMAT:String = "bpmDragDataFormat";
		private var _draggedRenderer:BaseRenderer;
		
		public function Palette()
		{
			super();
			
			this.addEventListener(MouseEvent.MOUSE_DOWN,onMouseDown);
			this.addEventListener(MouseEvent.MOUSE_MOVE,onMouseMove);
		}
		
		/**
		 * 移动处理函数。 
		 * @param event
		 * 
		 */
		protected function onMouseMove(event:MouseEvent):void
		{
			// TODO Auto-generated method stub
			
		}
		
		/**
		 * 鼠标按下处理函数,为拖拽做准备。 
		 * @param event
		 * 
		 */
		protected function onMouseDown(event:MouseEvent):void
		{
			this._draggedRenderer = getBaseRender(event.target);
			
			if (this._draggedRenderer) 
			{
				//--------------------------
				// 先获得拖拽事件源,再生成图像作为拖拽代理;
				//--------------------------
				var dragSrc:UIComponent = this._draggedRenderer as UIComponent;
				
				//--------------------------
				// 确定好目标偏移量
				//--------------------------
				var hDistance:Number=0;
				var vDistance:Number=0;
				var node:BaseNodeRenderer = BaseNodeRenderer(this._draggedRenderer);
				hDistance=mouseX - node.x;
				vDistance=mouseY - node.y;
				
				var dragSource:DragSource = new DragSource();
				var object:Object={};
				object.hDistance=hDistance;
				object.vDistance=vDistance;
				dragSource.addData(object, Palette.DATA_FORMAT);
				
				var cloneRenderer:BaseRenderer = VisualGraphEditor.cloneRendererStatic(node);
				object.cloneRenderer = cloneRenderer;
				//生成拖拽图片
				var image:Image=new Image();
				image.source=new Bitmap(ImageSnapshot.captureBitmapData(this._draggedRenderer as UIComponent));
				//--------------------------
				// 拖拽开始
				//--------------------------
				var point:Point = new Point(mouseX,mouseY);
				point = localToGlobal(point);
//				DragManager.doDrag(node, dragSource, event,cloneRenderer,node.x,node.y,1);
				DragManager.doDrag(node, dragSource, event,image);
			}
		}
		
		private function getBaseRender(object:Object):BaseRenderer
		{
			while (object is DisplayObject) 
			{
				if (object is BaseRenderer) 
				{
					return BaseRenderer(object);
				}
				object = object.parent;
			}
			return null;	
		}
	}
}


 

/***********************************************
 **** 版权声明处 **
 ****  为了方便阅读和维护,请严格遵守相关代码规范,谢谢   ****
 *******************************************/
package  cn.hnisi.ravis.editor
{
	import spark.components.Button;
	
	/*******************************************
	 **** @author huangjixin,@date 2012-7-4, @time 下午4:59:43 **
	 **** 请一句话表述该类主要作用  **
	 *******************************************/
	public class Handle extends Button
	{
		//_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/
		// private 类私有静态变量和静态常量声明处。(全部大写,使用下划线进行分割)
		// 例如:private static const EXAMPLE:String = "example";
		//_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/
		
		//_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/
		// public 类公有静态变量和静态常量声明处。(全部大写,使用下划线进行分割)
		// 例如:public static const EXAMPLE:String = "example";
		//_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/
		
		
		//_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/
		// private 私有变量声明处,请以“_”开头定义变量
		// 例如:private var _example:String;
		//_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/
		
		
		//_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/
		// public 公有变量声明处
		//_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/
		
		
		//_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/
		// 构造函数,初始化相关工作可以放在里面
		//_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/
		public function Handle()
		{
			super();
		}//构造函数结束
		
		
		//_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/
		// getter和setter函数
		//_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/
		
		
		//_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/
		// 相关事件响应函数和逻辑函数存放处
		//_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/
		
		
		//_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/
		// override 覆盖函数
		//_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/
	}//类结束
}//包结束


 

/***********************************************
 **** 版权声明处 **
 ****  为了方便阅读和维护,请严格遵守相关代码规范,谢谢   ****
 *******************************************/
package cn.hnisi.ravis.editor
{
	import flash.display.Graphics;
	
	import spark.components.Group;

	/*******************************************
	 **** huangjixin,2012-5-17,上午11:34:51 **
	 **** 数据表格  **
	 *******************************************/
	
	/**
	 * 数据表格
	 * @author huangjixin
	 * 
	 */
	public class Grid extends Group
	{
		//_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/
		// private 类私有静态变量和静态常量声明处。(全部大写,使用下划线进行分割)
		// 例如:private static const EXAMPLE:String = "example";
		//_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/
		
		//_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/
		// public 类公有静态变量和静态常量声明处。(全部大写,使用下划线进行分割)
		// 例如:public static const EXAMPLE:String = "example";
		//_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/
		
		
		//_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/
		// private 私有变量声明处,请以“_”开头定义变量
		// 例如:private var _example:String;
		//_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/
		private var _showGrid:Boolean = true;
		
		//_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/
		// public 公有变量声明处
		//_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/
		
		
		//_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/
		// 构造函数,初始化相关工作可以放在里面
		//_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/
		public function Grid()
		{
			super();
			
		}//构造函数结束
		
		
		//_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/
		// getter和setter函数
		//_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/
		
		/**
		 *	是否显示表格 
		 * @return 
		 * 
		 */
		public function get showGrid():Boolean
		{
			return _showGrid;
		}
		
		public function set showGrid(value:Boolean):void
		{
			_showGrid = value;
			invalidateDisplayList();
		}
		//_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/
		// 相关事件响应函数和逻辑函数存放处
		//_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/
		private function drawBackGroudGridLines(width:Number, height:Number, gridWidth:Number, gridHeight:Number, g:Graphics):void
		{
			var widthSize:int=width / gridWidth;
			var heightSize:int=height / gridHeight;
			
			for (var i:int=0; i < widthSize+1; i++)
			{
				g.moveTo(i * gridWidth, 0);
				g.lineTo(i * gridWidth, height);
			}
			
			for (var j:int=0; j < heightSize+1; j++)
			{
				g.moveTo(0, j * gridHeight);
				g.lineTo(width, j * gridHeight);
			}
			
			for (var m:int=0; m < widthSize; m+=5)
			{
				g.moveTo(m * gridWidth, 0);
				g.lineTo(m * gridWidth, height);
			}
			
			for (var n:int=0; n < heightSize; n+=5)
			{
				g.moveTo(0, n * gridHeight);
				g.lineTo(width, n * gridHeight);
			}
		}
		
		//_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/
		// override 覆盖函数
		//_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/
		override protected function updateDisplayList(unscaledWidth:Number, unscaledHeight:Number):void{
			super.updateDisplayList(unscaledWidth,unscaledHeight);
			var g:Graphics = graphics;
			if (showGrid)
			{
				g.clear();
				g.lineStyle(1, 0x000000, 0.1);
				drawBackGroudGridLines(width, height, 10, 10, g);
			}
			else
			{
				g.clear();
			}
		} 

	}//类结束
}//包结束


 

package cn.hnisi.ravis.editor
{
	import cn.hnisi.ravis.editor.skin.BaseRendererAdornerSkin;
	
	import flash.display.DisplayObject;
	import flash.display.DisplayObjectContainer;
	import flash.display.Graphics;
	import flash.events.Event;
	import flash.events.MouseEvent;
	import flash.geom.Point;
	import flash.geom.Rectangle;
	
	import mx.core.UIComponent;
	import mx.events.SandboxMouseEvent;
	
	import org.un.cava.birdeye.ravis.components.renderers.BaseRenderer;
	import org.un.cava.birdeye.ravis.graphLayout.visual.IVisualEdge;
	import org.un.cava.birdeye.ravis.graphLayout.visual.IVisualNode;
	import org.un.cava.birdeye.ravis.graphLayout.visual.VisualNode;
	
	import spark.components.Group;
	
	public class BaseRendererAdorner extends Adorner
	{
		[SkinPart(required="false")]
		public var addArrowBtn:UIComponent;
		[SkinPart(required="false")]
		public var deleteBtn:UIComponent;
		[SkinPart(required="false")]
		public var detailBtn:UIComponent;
		
		private var startX:Number;  
		private var startY:Number; 

		private var adornerGroup:Group;
		
		private var _data:Object;
		public function BaseRendererAdorner(adornedObject:UIComponent)
		{
			super(adornedObject);
			setStyle("skinClass",BaseRendererAdornerSkin);
		}
		

		protected function onAddArrowBtnMouseDown(event:MouseEvent):void
		{
			event.stopPropagation();
			
			var adornerGroup:Group = getAdornerGroup(event.target);
			if(!adornerGroup){
				return;
			}
			this.adornerGroup = adornerGroup;
			this.startX = adornerGroup.mouseX;  
			this.startY = adornerGroup.mouseY; 

			var rectangle:Rectangle=null;
			if (parent != null) 
			{
				var displayObject:DisplayObject = systemManager.getSandboxRoot();  
				displayObject.addEventListener(MouseEvent.MOUSE_UP, this.mouseUpHandler, true);  
				displayObject.addEventListener(MouseEvent.MOUSE_MOVE, this.mouseDragHandler, true);  
				displayObject.addEventListener(SandboxMouseEvent.MOUSE_UP_SOMEWHERE, this.mouseUpHandler, true);  
				displayObject.addEventListener(SandboxMouseEvent.MOUSE_MOVE_SOMEWHERE, this.mouseDragHandler, true);  
				systemManager.deployMouseShields(true); 

			}
		}
		
		
		protected function ondeleteBtnMouseDown(event:MouseEvent):void
		{
			var vgeditor:VisualGraphEditor = getVisualGraphEditor(this);
			vgeditor.deleteRenderer(this.adornedObject);
		}	
		
		public function getAdornerGroup(object:Object):Group
		{
			if (object == null || (object.hasOwnProperty("id")&&object["id"] == "adornersGroup")) 
			{
				return object as Group;
			}
			return getAdornerGroup(object.parent);
		}
		
		public function getHitrenderer(object:Object):BaseRenderer
		{
			if(object is UIComponent){
				var array:Array = (object as UIComponent).stage.getObjectsUnderPoint(new Point((object as UIComponent).stage.mouseX,(object as UIComponent).stage.mouseY));
				for (var i:int = array.length-1; i >= 0; i--) 
				{
					var obj:Object = array[i];
					var renderer:BaseRenderer = getRenderer(obj);
					if(renderer){
						return renderer as BaseRenderer;
					}
				}
			}
			return null;
		}
		
		public function getRenderer(object:Object):BaseRenderer
		{
			if (object == null || (object is BaseRenderer) )
			{
				return object as BaseRenderer;
			}
			return getRenderer(object.parent);
		}
		
		public function getVisualGraphEditor(object:Object):VisualGraphEditor
		{
			if (object == null || (object is VisualGraphEditor) )
			{
				return object as VisualGraphEditor;
			}
			return getVisualGraphEditor(object.parent);
		}
		
		protected function mouseDragHandler(event:Event):void  
		{
			if(this.adornerGroup){
				var g:Graphics = this.adornerGroup.graphics;
				g.clear();
				g.lineStyle(1,0);
				g.moveTo(this.startX,this.startY);
				g.lineTo(this.adornerGroup.mouseX,this.adornerGroup.mouseY);
			}
		}  

		protected function mouseUpHandler(event:Event):void  
		{  
			var g:Graphics = this.adornerGroup.graphics;
			g.clear();
			this.adornerGroup = null;
			var renderer:BaseRenderer = getHitrenderer(event.target);
			var vgEditor:VisualGraphEditor = getVisualGraphEditor(event.target);
			if(vgEditor){
				if(renderer){
					if(renderer != this.adornedObject){
						if(vgEditor.contains(renderer)){
							if(this.adornedObject is BaseRenderer){
								var vnode1:IVisualNode = (this.adornedObject as BaseRenderer).data as IVisualNode;
								var vnode2:IVisualNode = renderer.data as IVisualNode;
								var iVisualEdge:IVisualEdge = vgEditor.linkNodes(vnode1,vnode2);
								var vnodeXml1:XML;
								if(vnode1.data is XML){
									vnodeXml1 = vnode1.data as XML;
								}
								var vnodeXml2:XML;
								if(vnode2.data is XML){
									vnodeXml2 = vnode2.data as XML;
								}
								if(!vnodeXml1 || !vnodeXml2){
									return;
								}
								var xmlString:String = "<Edge fromID=\""+vnodeXml1.@id+"\" toID=\""+vnodeXml2.@id+"\" color=\"0x00ff00\""+"/>";
								var xml:XML =  new XML(xmlString);
								iVisualEdge.data = xml;
							}
						}
					}
					
				}
			}
			var displayObject:DisplayObject=systemManager.getSandboxRoot();  
			displayObject.removeEventListener(MouseEvent.MOUSE_UP, this.mouseUpHandler, true);  
			displayObject.removeEventListener(MouseEvent.MOUSE_MOVE, this.mouseDragHandler, true);  
			displayObject.removeEventListener(SandboxMouseEvent.MOUSE_UP_SOMEWHERE, this.mouseUpHandler, true);  
			displayObject.removeEventListener(SandboxMouseEvent.MOUSE_MOVE_SOMEWHERE, this.mouseDragHandler, true);  
			systemManager.deployMouseShields(false);  
			 
		}  

		
		protected function ondetailBtnMouseDown(event:MouseEvent):void
		{
			event.stopPropagation();
			BaseRendererAdornerSkin(this.skin).data = BaseRenderer(this.adornedObject).data.data;
		}
		
		override protected function partAdded(partName:String, instance:Object):void{
			super.partAdded(partName, instance);
			if(instance == addArrowBtn){
				addArrowBtn.addEventListener(MouseEvent.MOUSE_DOWN,onAddArrowBtnMouseDown);
			}
			if(instance == deleteBtn){
				deleteBtn.addEventListener(MouseEvent.MOUSE_DOWN,ondeleteBtnMouseDown);
			}
			if(instance == detailBtn){
				detailBtn.addEventListener(MouseEvent.MOUSE_DOWN,ondetailBtnMouseDown);
			}
		}
		
		
		override protected function partRemoved(partName:String, instance:Object):void{
			super.partAdded(partName, instance);
			if(instance == addArrowBtn){
				addArrowBtn.removeEventListener(MouseEvent.MOUSE_DOWN,onAddArrowBtnMouseDown);
			}
			if(instance == deleteBtn){
				deleteBtn.removeEventListener(MouseEvent.MOUSE_DOWN,ondeleteBtnMouseDown);
			}
			if(instance == detailBtn){
				detailBtn.removeEventListener(MouseEvent.MOUSE_DOWN,ondetailBtnMouseDown);
			}
		}
	}
}


 

package cn.hnisi.ravis.editor
{
	import mx.core.UIComponent;
	
	import spark.components.Group;

	public class AdornerPlayer
	{
		private var adornerGroup:Group;
		
		public function AdornerPlayer()
		{
		}
		
		public function play(renderer:UIComponent):void
		{
			
		}
	}
}


 

package cn.hnisi.ravis.editor
{
	import flash.display.DisplayObject;
	import flash.events.Event;
	import flash.geom.Rectangle;
	
	import mx.core.UIComponent;
	import mx.events.FlexEvent;
	
	import spark.components.supportClasses.SkinnableComponent;

	public class Adorner extends SkinnableComponent
	{
		private var _adornedObject:UIComponent;
		
		public function Adorner(adornedObject:UIComponent)
		{
			this._adornedObject = adornedObject;
			adornedObject.addEventListener(mx.events.FlexEvent.UPDATE_COMPLETE, this.updateCompleteHandler);
			this.addEventListener(flash.events.Event.ADDED, this.addedHandler);
			this.addEventListener(flash.events.Event.REMOVED, this.removedHandler)
		}
		
		public function get adornedObject():UIComponent
		{
			return this._adornedObject;
		}
		
		protected function removedHandler(event:Event):void
		{
			if (event.target == this) 
			{
				this.cleanup();
			}
		}
		
		protected function addedHandler(event:Event):void
		{
			if (event.target == this) 
			{
				invalidateProperties();
			}
		}
		
		protected function updateCompleteHandler(event:FlexEvent):void
		{
			invalidateProperties();
		}
		
		protected function getAdornerRectangle(arg1:DisplayObject):Rectangle
		{
			return this._adornedObject.getBounds(arg1);
		}
		
		protected function cleanup():void
		{
			this.removeEventListener(flash.events.Event.ADDED, this.addedHandler);
			this.removeEventListener(flash.events.Event.REMOVED, this.removedHandler);
			this.adornedObject.removeEventListener(mx.events.FlexEvent.UPDATE_COMPLETE, this.updateCompleteHandler);
			return;
		}
		
		protected override function commitProperties():void
		{
			var rectangle:Rectangle=null;
			super.commitProperties();
			if (parent != null) 
			{
				rectangle = this.getAdornerRectangle(parent);
				this.left = rectangle.x;
				this.top = rectangle.y;
				this.width = rectangle.width;
				this.height = rectangle.height;
			}
			return;
		}
	}
}


 

<?xml version="1.0" encoding="utf-8"?>
<s:Skin xmlns:fx="http://ns.adobe.com/mxml/2009" 
		xmlns:s="library://ns.adobe.com/flex/spark" 
		xmlns:mx="library://ns.adobe.com/flex/mx" xmlns:editor="cn.hnisi.ravis.editor.*">
	<!-- host component -->
	<fx:Metadata>
		[HostComponent("cn.hnisi.ravis.editor.BaseRendererAdorner")]
	</fx:Metadata>
	<fx:Script>
		<![CDATA[
			private var _data:Object;

			[Bindable]
			public function get data():Object
			{
				return _data;
			}

			public function set data(value:Object):void
			{
				_data = value;
				
				/* if(_data){
					ciIdLabel.text = "CI_ID:"+data.@ciId;
					ciCodeLabel.text = "资产编号:"+data.@ciCode;
					nameLabel.text = "资产名称:"+data.@name;
						PNLabel.text = "批次号:"+data.@PN;
						PROVIDERLabel.text = "供应商:"+data.@PROVIDER;
						BRANDLabel.text = "品牌:"+data.@BRAND;
						PRICELabel.text = "单价:"+data.@PRICE;
						STORAGE_DATELabel.text = "入库日期:"+data.@STORAGE_DATE;
						CI_DESCLabel.text = "资产描述:"+data.@CI_DESC;
				} */
			}

		]]>
	</fx:Script>
	<s:Rect top="0" left="0" bottom="0" right="0">
		<!--<s:stroke>
			<s:SolidColorStroke color="blue" alpha="0.5"/>
		</s:stroke>-->
	</s:Rect>
	<!--<editor:Handle id="topLeftHandle"
					left="-4" top="-4"
					skinClass="cn.hnisi.ravis.editor.skin.HandleSkin"/>
	<editor:Handle id="topRightHandle"
					right="-4" top="-4" 
					rotation="90"
					skinClass="cn.hnisi.ravis.editor.skin.HandleSkin"/>
	<editor:Handle id="bottomLeftHandle"
					left="-4" bottom="-4" 
					rotation="-90"
					skinClass="cn.hnisi.ravis.editor.skin.HandleSkin"/>
	<editor:Handle id="bottomRightHandle" 
					rotation="180"
					right="-4" bottom="-4"
					skinClass="cn.hnisi.ravis.editor.skin.HandleSkin"/>-->
	<!--<s:Button id="addArrowBtn" width="16" height="16" right="-20" top="4"/>-->
	<s:Group  id="addArrowBtn" width="20" height="20"  right="-24" top="0" toolTip="连线">
		<s:Rect top="0" bottom="0" left="0" right="0" radiusX="2" radiusY="2">
			<s:fill>
				<s:RadialGradient>
					<s:GradientEntry color="0xffffff"/>
				</s:RadialGradient>
			</s:fill>
			<s:stroke>
				<s:SolidColorStroke color="0" alpha="0.5"/>
			</s:stroke>
		</s:Rect>
		<s:Image source="@Embed(source='resources/arrow.png')" horizontalCenter="0" verticalCenter="0"/>
	</s:Group>
	<s:Group  id="deleteBtn" width="20" height="20"  right="-24" top="24" toolTip="删除节点">
		<s:Rect top="0" bottom="0" left="0" right="0"  radiusX="2" radiusY="2">
			<s:fill>
				<s:RadialGradient>
					<s:GradientEntry color="0xffffff"/>
				</s:RadialGradient>
			</s:fill>
			<s:stroke>
				<s:SolidColorStroke color="0"  alpha="0.5"/>
			</s:stroke>
		</s:Rect>
		<s:Image source="@Embed(source='resources/delete.png')" horizontalCenter="0" verticalCenter="0"/>
	</s:Group>
	<!--<s:Group  id="detailBtn" width="20" height="20"  right="-24" top="48" toolTip="查看详细信息"
			  click="{detailGroup.visible = !detailGroup.visible;detailGroup.right = -28-detailGroup.width}">
		<s:Rect top="0" bottom="0" left="0" right="0"  radiusX="2" radiusY="2">
			<s:fill>
				<s:RadialGradient>
					<s:GradientEntry color="0xffffff"/>
				</s:RadialGradient>
			</s:fill>
			<s:stroke>
				<s:SolidColorStroke color="0"  alpha="0.5"/>
			</s:stroke>
		</s:Rect>
		<s:Image source="@Embed(source='resources/detail.png')" horizontalCenter="0" verticalCenter="0"/>
	</s:Group>-->
	<!--<s:Group id="detailGroup" minWidth="100" minHeight="100" visible="false">
		<s:Rect top="0" bottom="0" left="0" right="0"  radiusX="2" radiusY="2">
			<s:stroke>
				<s:SolidColorStroke color="#C28A30">
				</s:SolidColorStroke>
			</s:stroke>
			<s:fill>
				<s:LinearGradient rotation="90">
					<s:GradientEntry color="#FFF480"/>
					<s:GradientEntry color="#FFD96C"/>
					<s:GradientEntry color="#FFF480"/>
				</s:LinearGradient>
			</s:fill>
		</s:Rect>
		<s:VGroup top="10" left="10" right="10" bottom="10">
			<s:Label id="ciIdLabel"/>
			<s:Label id="ciCodeLabel"/>
			<s:Label id="nameLabel"/>
			<s:Label id="PNLabel"/>
			<s:Label id="PROVIDERLabel"/>
			<s:Label id="BRANDLabel"/>
			<s:Label id="PRICELabel"/>
			<s:Label id="STORAGE_DATELabel"/>
			<s:Label id="CI_DESCLabel"/>
		</s:VGroup>
	</s:Group>-->
</s:Skin>


 

<?xml version="1.0" encoding="utf-8"?>
<s:Skin xmlns:fx="http://ns.adobe.com/mxml/2009" 
		xmlns:s="library://ns.adobe.com/flex/spark" 
		xmlns:mx="library://ns.adobe.com/flex/mx">
	<!-- host component -->
	<fx:Metadata>
		[HostComponent("cn.hnisi.ravis.editor.Handle")]
	</fx:Metadata>
	<s:states>
		<s:State name="up" />
		<s:State name="over" />
		<s:State name="down" />
		<s:State name="disabled" />
	</s:states>
	<s:Group id="base1" left="0" right="0" top="0" bottom="0">
		<s:Rect id="fill1" left="0" right="0" top="0" bottom="0" alpha="0">
			<s:stroke>
				<s:LinearGradientStroke rotation="90" weight="1">
					<s:GradientEntry alpha="0.5625" color="0x000000"/>
					<s:GradientEntry alpha="0.75" color="0x000000"/>
				</s:LinearGradientStroke>
			</s:stroke>
			<s:fill>
				<s:LinearGradient>
					<s:GradientEntry color="0xffffff"/>
				</s:LinearGradient>
			</s:fill>
		</s:Rect>
		<s:Rect left="0" right="0" top="0" bottom="0" minWidth="8" minHeight="8">
			<s:fill>
				<s:LinearGradient>
					<s:GradientEntry color="0xffffff"/>
				</s:LinearGradient>
			</s:fill>
			<s:stroke>
				<s:SolidColorStroke color="blue"  weight="1" alpha="0.5" alpha.over="0.7" alpha.down="1"/>
			</s:stroke>
		</s:Rect><!--alpha="0.5" alpha.over="0.7" alpha.down="1"-->
		<!--<s:Path id="path" data="M 0 0 L 10 0 M 0 0 L 0 10 ">
			<s:stroke>
				<s:SolidColorStroke color="0" alpha="0.3" alpha.over="0.5" alpha.down="0.8" weight="2"/>
			</s:stroke>
		</s:Path>-->
	</s:Group>
</s:Skin>


 

<?xml version="1.0" encoding="utf-8"?>
<s:Application xmlns:fx="http://ns.adobe.com/mxml/2009" 
			   xmlns:s="library://ns.adobe.com/flex/spark" 
			   xmlns:mx="library://ns.adobe.com/flex/mx" minWidth="955" minHeight="600"
			   xmlns:editor="cn.hnisi.ravis.editor.*" xmlns:node="cn.hnisi.node.*"
			   creationComplete="initData()" xmlns:serialization="serialization.*" xmlns:nodes="org.un.cava.birdeye.ravis.components.renderers.nodes.*" xmlns:layout="org.un.cava.birdeye.ravis.graphLayout.layout.*" xmlns:vgraphControls="org.un.cava.birdeye.ravis.components.ui.controls.vgraphControls.*">
	<fx:Declarations>
		<fx:XML id="xmldata">
			<Graph>
				<Node id="1" name="0" desc="This is a description" nodeColor="0x333333" nodeSize="32" nodeClass="earth" nodeIcon="center" x="10" y="10" />
				<Node id="2" name="A" desc="This is a description" nodeColor="0x8F8FFF" nodeSize="12" nodeClass="tree" nodeIcon="pc" x="10" y="15" />
				<Node id="3" name="B" desc="This is a description" nodeColor="0xF00000" nodeSize="36" nodeClass="tree" nodeIcon="pc" x="10" y="20" />
				<Node id="4" name="C" desc="This is a description" nodeColor="0x00FF00" nodeSize="10" nodeClass="tree" nodeIcon="pc" x="10" y="25" />
				<Node id="5" name="D" desc="This is a description" nodeColor="0xFFA500" nodeSize="14" nodeClass="tree" nodeIcon="pc" x="10" y="30" />
				<Node id="6" name="E" desc="This is a description" nodeColor="0x191970" nodeSize="10" nodeClass="tree" nodeIcon="pc" x="10" y="35" />
				<Node id="7" name="F" desc="This is a description" nodeColor="0x4682b4" nodeSize="18" nodeClass="tree" nodeIcon="pc" x="10" y="40" />
				
				<Node id="8" name="A.1" desc="This is a description" nodeColor="0x8F8FFF" nodeSize="21" nodeClass="leaf" nodeIcon="10" x="20" y="20" />
				<Node id="9" name="A.2" desc="This is a description" nodeColor="0x8F8FFF" nodeSize="15" nodeClass="leaf" nodeIcon="11" x="20" y="25" />
				<Node id="10" name="A.3" desc="This is a description" nodeColor="0x8F8FFF" nodeSize="32" nodeClass="leaf" nodeIcon="12" x="20" y="30" />
				<Node id="11" name="A.4" desc="This is a description" nodeColor="0x8F8FFF" nodeSize="16" nodeClass="leaf" nodeIcon="13" x="20" y="35" />
				<Node id="12" name="A.5" desc="This is a description" nodeColor="0x8F8FFF" nodeSize="12" nodeClass="leaf" nodeIcon="14" x="20" y="40" />
				<Node id="13" name="A.6" desc="This is a description" nodeColor="0x8F8FFF" nodeSize="10" nodeClass="leaf" nodeIcon="15" x="20" y="45" />
				
				<Node id="14" name="B.1" desc="This is a description" nodeColor="0xF00000" nodeSize="27" nodeClass="leaf" nodeIcon="16" x="30" y="30" />
				<Node id="15" name="B.2" desc="This is a description" nodeColor="0xF00000" nodeSize="10" nodeClass="leaf" nodeIcon="17" x="30" y="35" />
				<Node id="16" name="B.3" desc="This is a description" nodeColor="0xF00000" nodeSize="13" nodeClass="leaf" nodeIcon="18" x="30" y="40" />
				<Node id="17" name="B.4" desc="This is a description" nodeColor="0xF00000" nodeSize="10" nodeClass="leaf" nodeIcon="19" x="30" y="45" />
				<Node id="18" name="B.5" desc="This is a description" nodeColor="0xF00000" nodeSize="10" nodeClass="leaf" nodeIcon="20" x="30" y="50" />
				<Node id="19" name="B.6" desc="This is a description" nodeColor="0xF00000" nodeSize="10" nodeClass="leaf" nodeIcon="21" x="30" y="55" />
				
				<Node id="20" name="C.1" desc="This is a description" nodeColor="0x00FF00" nodeSize="10" nodeClass="leaf" nodeIcon="22" x="40" y="40" />
				<Node id="21" name="C.2" desc="This is a description" nodeColor="0x00FF00" nodeSize="15" nodeClass="leaf" nodeIcon="23" x="40" y="45" />
				<Node id="22" name="C.3" desc="This is a description" nodeColor="0x00FF00" nodeSize="10" nodeClass="leaf" nodeIcon="24" x="40" y="50" />
				<Node id="23" name="C.4" desc="This is a description" nodeColor="0x00FF00" nodeSize="10" nodeClass="leaf" nodeIcon="25" x="40" y="55" />
				<Node id="24" name="C.5" desc="This is a description" nodeColor="0x00FF00" nodeSize="20" nodeClass="leaf" nodeIcon="26" x="40" y="60" />
				<Node id="25" name="C.6" desc="This is a description" nodeColor="0x00FF00" nodeSize="10" nodeClass="leaf" nodeIcon="27" x="40" y="65" />
				
				<Node id="26" name="D.1" desc="This is a description" nodeColor="0xFFA500" nodeSize="30" nodeClass="leaf" nodeIcon="28" x="50" y="50" />
				<Node id="27" name="D.2" desc="This is a description" nodeColor="0xFFA500" nodeSize="10" nodeClass="leaf" nodeIcon="29" x="50" y="55" />
				<Node id="28" name="D.3" desc="This is a description" nodeColor="0xFFA500" nodeSize="12" nodeClass="leaf" nodeIcon="30" x="50" y="60" />
				<Node id="29" name="D.4" desc="This is a description" nodeColor="0xFFA500" nodeSize="10" nodeClass="leaf" nodeIcon="31" x="50" y="65" />
				<Node id="30" name="D.5" desc="This is a description" nodeColor="0xFFA500" nodeSize="10" nodeClass="leaf" nodeIcon="32" x="50" y="70" />
				<Node id="31" name="D.6" desc="This is a description" nodeColor="0xFFA500" nodeSize="15" nodeClass="leaf" nodeIcon="33" x="50" y="75" />
				
				<Node id="32" name="E.1" desc="This is a description" nodeColor="0x191970" nodeSize="26" nodeClass="leaf" nodeIcon="34" x="60" y="60" />
				<Node id="33" name="E.2" desc="This is a description" nodeColor="0x191970" nodeSize="10" nodeClass="leaf" nodeIcon="35" x="60" y="65" />
				<Node id="34" name="E.3" desc="This is a description" nodeColor="0x191970" nodeSize="16" nodeClass="leaf" nodeIcon="36" x="60" y="70" />
				<Node id="35" name="E.4" desc="This is a description" nodeColor="0x191970" nodeSize="10" nodeClass="leaf" nodeIcon="37" x="60" y="75" />
				<Node id="36" name="E.5" desc="This is a description" nodeColor="0x191970" nodeSize="10" nodeClass="leaf" nodeIcon="38" x="60" y="80" />
				<Node id="37" name="E.6" desc="This is a description" nodeColor="0x191970" nodeSize="14" nodeClass="leaf" nodeIcon="39" x="60" y="85" />
				
				<Node id="38" name="F.1" desc="This is a description" nodeColor="0x4682b4" nodeSize="5" nodeClass="leaf" nodeIcon="40" x="70" y="70" />
				<Node id="39" name="F.2" desc="This is a description" nodeColor="0x4682b4" nodeSize="12" nodeClass="leaf" nodeIcon="41" x="70" y="75" />
				<Node id="40" name="F.3" desc="This is a description" nodeColor="0x4682b4" nodeSize="10" nodeClass="leaf" nodeIcon="42" x="70" y="80" />
				<Node id="41" name="F.4" desc="This is a description" nodeColor="0x4682b4" nodeSize="22" nodeClass="leaf" nodeIcon="43" x="70" y="85" />
				<Node id="42" name="F.5" desc="This is a description" nodeColor="0x4682b4" nodeSize="8" nodeClass="leaf" nodeIcon="44" x="70" y="90" />
				<Node id="43" name="F.6" desc="This is a description" nodeColor="0x4682b4" nodeSize="10" nodeClass="leaf" nodeIcon="45" x="70" y="95" />
				
				<Edge fromID="1" toID="2" edgeLabel="No Change" flow="50" color="0x556b2f" edgeClass="sun" edgeIcon="NoChange" />
				<Edge fromID="1" toID="3" edgeLabel="Bad" flow="400" color="0xcd5c5c" edgeClass="sun" edgeIcon="Bad" />
				<Edge fromID="1" toID="4" edgeLabel="Good" flow="80" color="0xb22222" edgeClass="sun" edgeIcon="Good" />
				<Edge fromID="1" toID="5" edgeLabel="Good" flow="100" color="0x607b8b" edgeClass="sun" edgeIcon="Good" />
				<Edge fromID="1" toID="6" edgeLabel="No Change" flow="120" color="0x333333" edgeClass="sun" edgeIcon="NoChange" />
				<Edge fromID="1" toID="7" edgeLabel="Bad" flow="150" color="0x6b8e23" edgeClass="sun" edgeIcon="Bad" />
				
				<Edge fromID="2" toID="8" edgeLabel="Good" flow="100" edgeClass="rain" edgeIcon="Good" />
				<Edge fromID="2" toID="9" edgeLabel="Bad" flow="400" edgeClass="rain" edgeIcon="Bad" />
				<Edge fromID="2" toID="10" edgeLabel="No Change" flow="800" edgeClass="rain" edgeIcon="NoChange" />
				<Edge fromID="2" toID="11" edgeLabel="Good" flow="100" edgeClass="rain" edgeIcon="Good" />
				<Edge fromID="2" toID="12" edgeLabel="Bad" flow="120" edgeClass="rain" edgeIcon="Bad" />
				<Edge fromID="2" toID="13" edgeLabel="No Change" flow="150" edgeClass="rain" edgeIcon="NoChange" />
				
				<Edge fromID="3" toID="14" edgeLabel="Good" flow="1" edgeClass="rain" edgeIcon="Good" />
				<Edge fromID="3" toID="15" edgeLabel="No Change" flow="40" edgeClass="rain" edgeIcon="NoChange" />
				<Edge fromID="3" toID="16" edgeLabel="Bad" flow="80" edgeClass="rain" edgeIcon="Bad" />
				<Edge fromID="3" toID="17" edgeLabel="Good" flow="100" edgeClass="rain" edgeIcon="Good" />
				<Edge fromID="3" toID="18" edgeLabel="Good" flow="120" edgeClass="rain" edgeIcon="Good" />
				<Edge fromID="3" toID="19" edgeLabel="Bad" flow="15" edgeClass="rain" edgeIcon="Bad" />
				
				<Edge fromID="4" toID="20" edgeLabel="Bad" flow="1" edgeClass="rain" edgeIcon="Bad" />
				<Edge fromID="4" toID="21" edgeLabel="Good" flow="40" edgeClass="rain" edgeIcon="Good" />
				<Edge fromID="4" toID="22" edgeLabel="No Change" flow="8" edgeClass="rain" edgeIcon="NoChange" />
				<Edge fromID="4" toID="23" edgeLabel="Good" flow="100" edgeClass="rain" edgeIcon="Good" />
				<Edge fromID="4" toID="24" edgeLabel="Good" flow="120" edgeClass="rain" edgeIcon="Good" />
				<Edge fromID="4" toID="25" edgeLabel="Bad" flow="150" edgeClass="rain" edgeIcon="Bad" />
				
				<Edge fromID="5" toID="26" edgeLabel="Bad" flow="1" edgeClass="rain" edgeIcon="Bad" />
				<Edge fromID="5" toID="27" edgeLabel="Good" flow="400" edgeClass="rain" edgeIcon="Good" />
				<Edge fromID="5" toID="28" edgeLabel="No Change" flow="8" edgeClass="rain" edgeIcon="NoChange" />
				<Edge fromID="5" toID="29" edgeLabel="Good" flow="100" edgeClass="rain" edgeIcon="Good" />
				<Edge fromID="5" toID="30" edgeLabel="Bad" flow="120" edgeClass="rain" edgeIcon="Bad" />
				<Edge fromID="5" toID="31" edgeLabel="No Change" flow="150" edgeClass="rain" edgeIcon="NoChange" />
				
				<Edge fromID="6" toID="32" edgeLabel="No Change" flow="1" edgeClass="rain" edgeIcon="NoChange" />
				<Edge fromID="6" toID="33" edgeLabel="Good" flow="40" edgeClass="rain" edgeIcon="Good" />
				<Edge fromID="6" toID="34" edgeLabel="Bad" flow="800" edgeClass="rain" edgeIcon="Bad" />
				<Edge fromID="6" toID="35" edgeLabel="Good" flow="100" edgeClass="rain" edgeIcon="Good" />
				<Edge fromID="6" toID="36" edgeLabel="Good" flow="12" edgeClass="rain" edgeIcon="Good" />
				<Edge fromID="6" toID="37" edgeLabel="No Change" flow="150" edgeClass="rain" edgeIcon="NoChange" />
				
				<Edge fromID="7" toID="38" edgeLabel="Bad" flow="100" edgeClass="rain" edgeIcon="Bad" />
				<Edge fromID="7" toID="39" edgeLabel="Good" flow="40" edgeClass="rain" edgeIcon="Good" />
				<Edge fromID="7" toID="40" edgeLabel="No Change" flow="80" edgeClass="rain" edgeIcon="NoChange" />
				<Edge fromID="7" toID="41" edgeLabel="Good" flow="1000" edgeClass="rain" edgeIcon="Good" />
				<Edge fromID="7" toID="42" edgeLabel="Good" flow="120" edgeClass="rain" edgeIcon="Good" />
				<Edge fromID="7" toID="43" edgeLabel="Bad" flow="150" edgeClass="rain" edgeIcon="Bad" />
				
			</Graph>
		</fx:XML>
		<serialization:UndoManager id="undoManager" editor="{vgraph}"/>
	</fx:Declarations>
	<fx:Script source="itsmApp_Script.as"/>
	<fx:Script>
		<![CDATA[
			import cn.hnisi.ravis.editor.VisualGraphEditorEvent;
			
		]]>
	</fx:Script>
	<mx:HDividedBox id="mainPanel" width="100%" height="100%" 
					hasFocusableChildren="true" focusEnabled="true" top="2" bottom="2" left="2" right="2">
		<s:Panel id="palettePanel" 
				 title="配置类型"
				 width="200" height="100%"
				 hasFocusableChildren="true" focusEnabled="true" dropShadowVisible="false">
			<mx:Accordion minWidth="0" width="100%" height="100%" 
						  creationPolicy="all"
						  openDuration="250">
				<mx:VBox label="主机设备"
					width="100%" height="100%" horizontalAlign="center" >
								<s:List width="100%" height="100%"
										doubleClickEnabled="true"
										doubleClick="addBtn_clickHandler(event)"
										borderVisible="false"
										itemRenderer="NodeItemRenderer">
									<s:dataProvider>
										<s:ArrayList>
											<fx:String><![CDATA[
												<Node name="PC服务器" ciId="0" desc="PC服务器"  nodeColor="0x333333" nodeSize="32" nodeClass="earth" nodeIcon="SERVER" x="10" y="10" />
											]]></fx:String>
											<fx:String><![CDATA[
												<Node name="存储设备" ciId="0" desc="存储设备"  nodeColor="0x333333" nodeSize="32" nodeClass="earth" nodeIcon="STORAGE_DEVICE" x="10" y="10" />
											]]></fx:String>
											<fx:String><![CDATA[
												<Node name="小型机" ciId="0" desc="小型机"  nodeColor="0x333333" nodeSize="32" nodeClass="earth" nodeIcon="MINIPC" x="10" y="10" />
											]]></fx:String>
										</s:ArrayList>
									</s:dataProvider>
								</s:List>
				</mx:VBox>
				<mx:VBox label="网络设备"
					width="100%" height="100%" horizontalAlign="center">
								<s:List width="100%" height="100%"
										doubleClickEnabled="true"
										doubleClick="addBtn_clickHandler(event)"
										borderVisible="false" itemRenderer="NodeItemRenderer">
									<s:dataProvider>
										<s:ArrayList>
											<fx:String><![CDATA[
												<Node name="路由器" ciId="0" desc="路由器"  nodeColor="0x333333" nodeSize="32" nodeClass="earth" nodeIcon="ROUTER" x="10" y="10" />
											]]></fx:String>
											<fx:String><![CDATA[
												<Node name="无线接入设备" ciId="0" desc="无线接入设备"  nodeColor="0x333333" nodeSize="32" nodeClass="earth" nodeIcon="WIRELESS" x="10" y="10" />
											]]></fx:String>
										</s:ArrayList>
									</s:dataProvider>
								</s:List>
				</mx:VBox>
				<mx:VBox label="安全设备"
					width="100%" height="100%" horizontalAlign="center" >
								<s:List width="100%" height="100%"
										doubleClickEnabled="true"
										doubleClick="addBtn_clickHandler(event)"
										borderVisible="false" itemRenderer="NodeItemRenderer">
									<s:dataProvider>
										<s:ArrayList>
											<fx:String><![CDATA[
												<Node name="防火墙" ciId="0" desc="防火墙"  nodeColor="0x333333" nodeSize="32" nodeClass="earth" nodeIcon="FIRE_WALL" x="10" y="10" />
											]]></fx:String>
											<fx:String><![CDATA[
												<Node name="网关" ciId="0" desc="网关"  nodeColor="0x333333" nodeSize="32" nodeClass="earth" nodeIcon="GATEWAY" x="10" y="10" />
											]]></fx:String>
										</s:ArrayList>
									</s:dataProvider>
								</s:List>
				</mx:VBox>
				<mx:VBox label="桌面终端设备"
					width="100%" height="100%" horizontalAlign="center" >
								<s:List width="100%" height="100%"
										doubleClickEnabled="true"
										doubleClick="addBtn_clickHandler(event)"
										borderVisible="false" itemRenderer="NodeItemRenderer">
									<s:dataProvider>
										<s:ArrayList>
											<fx:String><![CDATA[
												<Node name="笔记本电脑" ciId="0" desc="笔记本电脑"  nodeColor="0x333333" nodeSize="32" nodeClass="earth" nodeIcon="NOTE_BOOK" x="10" y="10" />
											]]></fx:String>
											<fx:String><![CDATA[
												<Node name="台式机" ciId="0" desc="台式机"  nodeColor="0x333333" nodeSize="32" nodeClass="earth" nodeIcon="COMPUTER" x="10" y="10" />
											]]></fx:String>
											<fx:String><![CDATA[
												<Node name="显示器" ciId="0" desc="显示器"  nodeColor="0x333333" nodeSize="32" nodeClass="earth" nodeIcon="LED" x="10" y="10" />
											]]></fx:String>
											<fx:String><![CDATA[
												<Node name="传真机" ciId="0" desc="传真机"  nodeColor="0x333333" nodeSize="32" nodeClass="earth" nodeIcon="FAX" x="10" y="10" />
											]]></fx:String>
											<fx:String><![CDATA[
												<Node name="打印机" ciId="0" desc="打印机"  nodeColor="0x333333" nodeSize="32" nodeClass="earth" nodeIcon="PRINTER" x="10" y="10" />
											]]></fx:String>
											<fx:String><![CDATA[
												<Node name="扫描仪" ciId="0" desc="扫描仪"  nodeColor="0x333333" nodeSize="32" nodeClass="earth" nodeIcon="SCANNER" x="10" y="10" />
											]]></fx:String>
										</s:ArrayList>
									</s:dataProvider>
								</s:List>
				</mx:VBox>
				<mx:VBox label="软件"
					width="100%" height="100%" horizontalAlign="center" >
								<s:List width="100%" height="100%"
										doubleClickEnabled="true"
										doubleClick="addBtn_clickHandler(event)"
										borderVisible="false" itemRenderer="NodeItemRenderer">
									<s:dataProvider>
										<s:ArrayList>
											<fx:String><![CDATA[
												<Node name="操作系统" ciId="0" desc="操作系统"  nodeColor="0x333333" nodeSize="32" nodeClass="earth" nodeIcon="OPERATION_SYSTEM" x="10" y="10" />
											]]></fx:String>
											
											<fx:String><![CDATA[
												<Node name="数据库" ciId="0" desc="数据库"  nodeColor="0x333333" nodeSize="32" nodeClass="earth" nodeIcon="DATABASE" x="10" y="10" />
											]]></fx:String>
											
											<fx:String><![CDATA[
												<Node name="安全软件" ciId="0" desc="安全软件"  nodeColor="0x333333" nodeSize="32" nodeClass="earth" nodeIcon="SECURITY_SOFT" x="10" y="10" />
											]]></fx:String>
											<fx:String><![CDATA[
												<Node name="中间件" ciId="0" desc="中间件"  nodeColor="0x333333" nodeSize="32" nodeClass="earth" nodeIcon="MIDDLE_WARE" x="10" y="10" />
											]]></fx:String>
											<fx:String><![CDATA[
												<Node name="应用软件" ciId="0" desc="应用软件"  nodeColor="0x333333" nodeSize="32" nodeClass="earth" nodeIcon="APPS" x="10" y="10" />
											]]></fx:String>
											<fx:String><![CDATA[
												<Node name="应用系统" ciId="0" desc="应用系统"  nodeColor="0x333333" nodeSize="32" nodeClass="earth" nodeIcon="APPLICATION_SYSTEM" x="10" y="10" />
											]]></fx:String>
										</s:ArrayList>
									</s:dataProvider>
								</s:List>
				</mx:VBox>
			</mx:Accordion>
		</s:Panel>
		<s:VGroup width="100%" height="100%">
			<s:HGroup width="100%" clipAndEnableScrolling="true" hasFocusableChildren="true">
				<s:HGroup gap="5" paddingLeft="2" paddingBottom="4" paddingTop="4" 
						  hasFocusableChildren="true" width="95%" clipAndEnableScrolling="true">
					<s:Button id="connectBtn" toolTip="连接节点"
							  icon="@Embed(source='resources/connect.png')"
							  width="36" height="24"
							  click="connectBtn_clickHandler(event)"/>
					<s:Button id="disconnectBtn" toolTip="断开节点"
							  icon="@Embed(source='resources/disconnect.png')"
							  width="36" height="24"
							  click="disconnectBtn_clickHandler(event)"/>
					<s:Button id="deleteBtn" toolTip="删除节点" 
							  icon="@Embed(source='resources/delete.png')"
							  width="36" height="24"
							  click="deleteBtn_clickHandler(event)"/>
					<s:Button id="deleteAllBtn" toolTip="删除所有节点"
							  icon="@Embed(source='resources/deleteAll.png')"
							  width="36" height="24"
							  click="deleteAllBtn_clickHandler(event)"/>
					<s:Spacer width="6"/>
					<s:Button id="layoutBtn" toolTip="布局"
							  icon="@Embed(source='resources/layout.png')"
							  width="36" height="24"
							  click="layoutBtn_clickHandler(event)"/>
					<s:Button id="setStartRootBtn" toolTip="设置为开始节点"
							  icon="@Embed(source='resources/first.png')"
							  width="36" height="24"
							  click="setStartRootBtn_clickHandler(event)"/>
					<!--<s:Button id="addBtn" label="添加节点" click="addBtn_clickHandler(event)"/>-->
					<s:Spacer width="6"/>
					<s:Button id="refreshBtn" toolTip="刷新"
							  icon="@Embed(source='resources/refresh.png')"
							  width="36" height="24"
							  click="refreshBtn_clickHandler(event)"/>
					<s:Button id="sourceBtn" toolTip="查看源码"
							  icon="@Embed(source='resources/source.png')"
							  width="36" height="24"
							  click="sourceBtn_clickHandler(event)"/>
					<s:Button id="exportBtn" toolTip="导出"
							  icon="@Embed(source='resources/export.png')"
							  width="36" height="24"
							  click="exportBtn_clickHandler(event)"/>
					<s:Button id="importBtn" toolTip="导入" 
							  icon="@Embed(source='resources/import.png')"
							  width="36" height="24"
							  click="importBtn_clickHandler(event)"/>
					<s:Button id="saveBtn" toolTip="保存" 
							  icon="@Embed(source='resources/save.png')"
							  width="36" height="24"
							  click="saveBtn_clickHandler(event)"/>
					<s:Button id="newBtn" toolTip="新建" 
							  icon="@Embed(source='resources/new.png')"
							  width="36" height="24"
							  click="newBtn_clickHandler(event)"/>
					<s:Button id="connectDeviceBtn" toolTip="关联配置项"
							  icon="@Embed(source='resources/device.png')"
							  width="36" height="24"
							  click="connectDeviceBtn_clickHandler(event)"/>
					<s:Spacer width="6"/>
					<s:Button id="showgridBtn" toolTip="显示表格"
							  icon="@Embed(source='resources/showgrid.png')"
							  width="36" height="24"
							  click="showgridBtn_clickHandler(event)"/>
					<!--<s:Button id="fullScreenBtn" toolTip="全屏"
							  icon="@Embed(source='resources/fullScreen.png')"
							  width="36" height="24"
							  click="fullScreenBtn_clickHandler(event)"/>
					<s:Button id="normalScreenBtn" toolTip="退出全屏"
							  icon="@Embed(source='resources/exitScreen.png')"
							  width="36" height="24"
							  click="normalScreenBtn_clickHandler(event)"/>-->
				</s:HGroup>
			</s:HGroup>
			<s:Panel width="100%" height="100%" hasFocusableChildren="true">
				<editor:VisualGraphEditor id="vgraph" width="100%" height="100%" 
										  backgroundColor="0xffffff"
										  itemRenderer="org.un.cava.birdeye.ravis.components.renderers.nodes.IconNodeRenderer"
										  displayEdgeLabels="true"
										  visibilityLimitActive="false"
										  edgeLabelRenderer="org.un.cava.birdeye.ravis.components.renderers.edgeLabels.BaseEdgeLabelRenderer"
										  edgeRendererFactory="org.un.cava.birdeye.ravis.graphLayout.visual.edgeRenderers.DirectedArrowEdgeRenderer"
										  edgeDoubleClick="vgraph_edgeDoubleClickHandler(event)"
										  nodeClick="vgraph_nodeClickHandler(event)"
										  nodeDoubleClick="vgraph_rendererDoubleClickHandler(event)">
				</editor:VisualGraphEditor>
				<vgraphControls:BirdEyeZoom id="birdEyeZoom" vgraph="{vgraph}" right="0"/>
			</s:Panel>
		</s:VGroup>
		
	</mx:HDividedBox>
</s:Application>


 

// ActionScript file
import cn.hnisi.ravis.editor.VisualGraphEditor;
import cn.hnisi.ravis.editor.VisualGraphEditorEvent;

import com.itsm.common.Global;
import com.itsm.configuration.controller.TopoProviderEvent;
import com.itsm.configuration.model.TopoProviderRemoteProxy;
import com.itsm.configuration.model.vo.ConfigurationItem;
import com.itsm.configuration.view.ConnectDeviceTitleWin;
import com.itsm.configuration.view.EdgeEditorTitleWin;

import flash.display.StageDisplayState;
import flash.events.Event;
import flash.events.IOErrorEvent;
import flash.events.MouseEvent;
import flash.events.TimerEvent;
import flash.filters.GlowFilter;
import flash.net.FileFilter;
import flash.net.FileReference;
import flash.utils.Timer;

import mx.containers.VBox;
import mx.controls.Alert;
import mx.core.ClassFactory;
import mx.core.FlexGlobals;
import mx.core.UIComponent;
import mx.managers.PopUpManager;
import mx.utils.ObjectUtil;

import org.osmf.events.TimeEvent;
import org.un.cava.birdeye.ravis.components.renderers.BaseRenderer;
import org.un.cava.birdeye.ravis.components.renderers.edgeLabels.BaseEdgeLabelRenderer;
import org.un.cava.birdeye.ravis.components.renderers.nodes.RotatedRectNodeRenderer;
import org.un.cava.birdeye.ravis.graphLayout.data.Graph;
import org.un.cava.birdeye.ravis.graphLayout.data.IGraph;
import org.un.cava.birdeye.ravis.graphLayout.layout.CircularLayouter;
import org.un.cava.birdeye.ravis.graphLayout.layout.ConcentricRadialLayouter;
import org.un.cava.birdeye.ravis.graphLayout.layout.DirectPlacementLayouter;
import org.un.cava.birdeye.ravis.graphLayout.layout.ForceDirectedLayouter;
import org.un.cava.birdeye.ravis.graphLayout.layout.HierarchicalLayouter;
import org.un.cava.birdeye.ravis.graphLayout.layout.ILayoutAlgorithm;
import org.un.cava.birdeye.ravis.graphLayout.visual.IEdgeRenderer;
import org.un.cava.birdeye.ravis.graphLayout.visual.IVisualEdge;
import org.un.cava.birdeye.ravis.graphLayout.visual.IVisualNode;
import org.un.cava.birdeye.ravis.graphLayout.visual.VisualGraph;
import org.un.cava.birdeye.ravis.graphLayout.visual.edgeRenderers.BaseEdgeRenderer;
import org.un.cava.birdeye.ravis.graphLayout.visual.edgeRenderers.DirectedArrowEdgeRenderer;
import org.un.cava.birdeye.ravis.graphLayout.visual.edgeRenderers.FlowEdgeRenderer;
import org.un.cava.birdeye.ravis.graphLayout.visual.events.VisualNodeEvent;

import serialization.XMLSerializer;

import spark.components.List;

private var graph:IGraph;
// active layouter
private var layouter:ILayoutAlgorithm;
// edge renderer
private var selectedEdgeRenderer:IEdgeRenderer;
// root node to start with
private var startRoot:IVisualNode;
// this is used to display the number of visible items
private var itemCount:int = 0;
// important to ensure we are done with the main initialisation
private var initDone:Boolean = false;
private var file:FileReference;
private var currentFileName:String;

/**
 * event handler for HTTPService, does all the remaining required
 * initialisation
 * */

private var topoRemoteProxy:TopoProviderRemoteProxy;

private function initData():void {
	var url:String = "";
	var endPoint:String = "";
	url = FlexGlobals.topLevelApplication.url;
	
	var array:Array = url.split("/");
	if(array && array.length>1){
		//		endPoint = array[0]+ "//" + array[1]+ array[2];
		endPoint = array[0]+ "//" + array[1]+ array[2] + "/" + array[3]; //发布web文件夹下面
		
		url = array[0]+ "//" + array[1]+ array[2] + "/" + array[3]+ "/" + array[4];
		Global.getInstance().url = url;
		//确定端点;
		//Global.getInstance().endPoint = 'messagebroker/amf';
		Global.getInstance().endPoint = endPoint + "/"+'messagebroker/amf';
		
		topoRemoteProxy = new TopoProviderRemoteProxy();
		topoRemoteProxy.getGraphLayout();
		topoRemoteProxy.addEventListener(TopoProviderEvent.GET_GRAPH_LAYOUT_RESULT,getGraphLayoutResult);
		topoRemoteProxy.addEventListener(TopoProviderEvent.GET_GRAPH_LAYOUT_FAULT,getGraphLayoutFault);
	}
	
	///
	birdEyeZoom.labelEle.text = "放大VS缩小";
}

function getGraphLayoutFault(event:TopoProviderEvent):void
{
	var idString:String = "1";
	var xml:XML = xmldata;
	//	/* create and init a graph object with the XML data */
	graph = new Graph("XMLAsDocsGraph",false,xml);
	
	/* set the graph in the VGraph object, this automatically
	* initializes the VGraph items; 
	* note: vgraph is the id of the mxml specified VisualGraph component */
	vgraph.graph = graph;
	
	/* set the default layouter type */
	layouter = new DirectPlacementLayouter(vgraph);
	layouter.disableAnimation = false;
	//layouter = new CircularLayouter(vgraph);
	vgraph.layouter = layouter;
	layouter.autoFitEnabled = true;
	
	startRoot = graph.nodeByStringId(idString).vnode;
	vgraph.displayEdgeLabels = true;
	/* the following kicks it off .... */
	vgraph.currentRootVNode = startRoot;
	vgraph.draw();
}

function getGraphLayoutResult(event:TopoProviderEvent):void{
//	Alert.show(event.object.toString());
	
	var xml:XML = new XML(event.object.toString());
	var xmllist:XMLList = xml.Node;
	var idString:String = "";
	if(xmllist!=undefined && xmllist.length()>0){
		idString = xmllist[0].@id;
	}else{
//		Alert.show(xml.toString(),"XML有误");
//		createVMLayer();
//		palette.mouseChildren = false;
//		return;
//		xml = xmldata;
	}
	
//	/* create and init a graph object with the XML data */
	graph = new Graph("XMLAsDocsGraph",false,xml);
	
	/* set the graph in the VGraph object, this automatically
	* initializes the VGraph items; 
	* note: vgraph is the id of the mxml specified VisualGraph component */
	vgraph.graph = graph;
	
	/* set the default layouter type */
	layouter = new DirectPlacementLayouter(vgraph);
	layouter.disableAnimation = false;
	//layouter = new CircularLayouter(vgraph);
	vgraph.layouter = layouter;
	layouter.autoFitEnabled = false;
	vgraph.displayEdgeLabels = true;
	if(idString != ""){
		startRoot = graph.nodeByStringId(idString).vnode;
		vgraph.currentRootVNode = startRoot;
	}
	vgraph.draw();
	var timer:Timer = new Timer(100,1);
	timer.start();
	timer.addEventListener(TimerEvent.TIMER,function onTimer(event:TimerEvent):void{
		vgraph.draw();
	});
}

private function createVMLayer():void
{
	var ui:UIComponent = new UIComponent();
	ui.graphics.beginFill(0);
	ui.graphics.drawRect(0,0,this.width,this.height);
	ui.graphics.endFill();
	this.vgraph.parent.addChild(ui);
	ui.mouseEnabled = false;
}

/**
 * 刷新。 
 * @param event
 * 
 */
protected function newBtn_clickHandler(event:MouseEvent):void
{
	deleteAllBtn_clickHandler();
	var xml:XML = new XML(<Graph/>);
	graph = new Graph("XMLAsDocsGraph",false,xmldata);
	vgraph.graph = graph;
	
	layouter = new DirectPlacementLayouter(vgraph);
	layouter.disableAnimation = false;
	vgraph.layouter = layouter;
	layouter.autoFitEnabled = false;
	
	vgraph.draw();
}

/**
 * 刷新。 
 * @param event
 * 
 */
protected function refreshBtn_clickHandler(event:MouseEvent):void
{
	topoRemoteProxy.getGraphLayout();
}

/**
 * 关联两个节点。 
 * @param event
 * 
 */
protected function connectBtn_clickHandler(event:MouseEvent):void
{
	if(vgraph.getSelection().length < 2){
		return;
	}
	var length:int = 0;
	while(length +1 < vgraph.getSelection().length){
		var baseRender0:BaseRenderer = vgraph.getSelection()[length];
		var baseRender1:BaseRenderer = vgraph.getSelection()[length+1];
		var ivNode0:IVisualNode = vgraph.renderToNode(baseRender0);
		var ivNode1:IVisualNode = vgraph.renderToNode(baseRender1);
		if(!ivNode1 || !ivNode0){
			return;
		}
		var iVisualEdge:IVisualEdge = vgraph.linkNodes(ivNode0,ivNode1);
		var xmlString:String = "<Edge fromID=\""+ivNode0.id+"\" toID=\""+ivNode1.id+"\" />";
		var xml:XML =  new XML(xmlString);
		iVisualEdge.data = xml;
		length++;
	}
}

/**
 * 断开节点。 
 * @param event
 * 
 */
protected function disconnectBtn_clickHandler(event:MouseEvent):void
{
	if(vgraph.getSelection().length < 2){
		return;
	}
	var baseRender0:BaseRenderer = vgraph.getSelection()[0];
	var baseRender1:BaseRenderer = vgraph.getSelection()[1];
	var ivNode0:IVisualNode = vgraph.renderToNode(baseRender0);
	var ivNode1:IVisualNode = vgraph.renderToNode(baseRender1);
	
	vgraph.unlinkNodes(ivNode0,ivNode1);
}

/**
 * 布局节点 
 * @param event
 * 
 */
protected function layoutBtn_clickHandler(event:MouseEvent):void
{
	layouter = new ConcentricRadialLayouter(vgraph);
	layouter.disableAnimation = false;
	//layouter = new CircularLayouter(vgraph);
	vgraph.layouter = layouter;
	layouter.autoFitEnabled = true;
	
	if(vgraph.layouter){
		vgraph.layouter.layoutPass();
	}
}

protected function sourceBtn_clickHandler(event:MouseEvent):void
{
	var xmlSerializer:XMLSerializer = new XMLSerializer();
	
	var xml:XML = xmlSerializer.serialize(vgraph,"Graph");
	Alert.show(xml.toString());
}

protected function deleteBtn_clickHandler(event:MouseEvent):void
{
	if(vgraph.getSelection().length == 0){
		return;
	}
	var length:int = vgraph.getSelection().length;
	var renderer:BaseRenderer;
	
	while(length > 0){
		renderer = vgraph.getSelection()[length -1];
		if(renderer){
			vgraph.setSelected(renderer,false);
			vgraph.deleteRenderer(renderer);
		}
		length --;
	}
}

protected function deleteAllBtn_clickHandler(event:MouseEvent = null):void
{
	vgraph.selectAll();
	if(vgraph.getSelection().length == 0){
		return;
	}
	var length:int = vgraph.getSelection().length;
	var renderer:BaseRenderer;
	
	while(length > 0){
		renderer = vgraph.getSelection()[length -1];
		if(renderer){
			vgraph.setSelected(renderer,false);
			vgraph.deleteRenderer(renderer);
		}
		length --;
	}
}

protected function addBtn_clickHandler(event:MouseEvent):void
{
	var list:List = event.currentTarget as List;
	var item:Object = list.selectedItem;

	var data:Object = new XML(item);
	
	var clonedData:Object = ObjectUtil.clone(data);
	var id:String = "";
	var ivisualNode:IVisualNode = vgraph.addRenderer(id,clonedData);
	XML(ivisualNode.data).@id = ""+ivisualNode.id;
	var firstRenderer:UIComponent = vgraph.getRendererByIndex(0);
	if(firstRenderer){
		ivisualNode.viewX = firstRenderer.x + firstRenderer.width/2;
		if(ivisualNode.viewX >= vgraph.width){
			ivisualNode.viewX = 40;
		}
		ivisualNode.viewY = firstRenderer.y + firstRenderer.height/2;
		if(ivisualNode.viewY >= vgraph.height){
			ivisualNode.viewY = 40;
		}
	}
	ivisualNode.refresh();
	ivisualNode.view.parent.setChildIndex(ivisualNode.view,0);
	var filter:GlowFilter = new GlowFilter(0xE9AB96,1,10,10);
	ivisualNode.view.filters = [filter];
}


protected function vgraph_nodeClickHandler(event:VisualNodeEvent):void
{
	trace(event.node.id);
}

protected function exportBtn_clickHandler(event:MouseEvent):void
{
	saveXML();
}

// -----------------------------------------
// Save and Load the contents of the diagram
// -----------------------------------------
private function saveXML() : void 
{
	file = new FileReference();
	var xml:XML = new XMLSerializer().serialize(vgraph, "Graph");
	var fileName:String = currentFileName;
	if(fileName == null)
		fileName = "itsm.xml";
	file.addEventListener(flash.events.Event.COMPLETE, fileSaved);
	file.addEventListener(flash.events.IOErrorEvent.IO_ERROR, ioError);
	file.save(xml, fileName);
}

private function fileSaved(event:flash.events.Event) : void 
{
	if(file != null){
		currentFileName = file.name;
		file = null;
	}
}

private function ioError(event:IOErrorEvent) : void 
{
	Alert.show("导出出错");
}

private function loadXML() : void 
{
	doLoadXML();
	/* if(isModified){
	Alert.show(resourceManager.getString("bpmeditor", "bpmeditor.diagramModified.text"),
	resourceManager.getString("bpmeditor", "bpmeditor.diagramModified.title"),
	Alert.YES|Alert.NO, this, loadAlertCloseHandler, null, Alert.NO);
	} else {
	doLoadXML();
	} */
}

/* private function loadAlertCloseHandler(event:CloseEvent) : void 
{
if(event.detail == Alert.YES)
doLoadXML();
} */

private function doLoadXML(): void
{
	file = new FileReference();
	file.addEventListener(flash.events.Event.SELECT, fileSelectedForLoad);
	file.browse([new FileFilter("itsm文件", "*.xml;")]);
}

private function fileSelectedForLoad(event:flash.events.Event) : void 
{
	if(file != null){
		file.addEventListener(flash.events.Event.COMPLETE, fileLoaded);
		file.addEventListener(flash.events.IOErrorEvent.IO_ERROR, ioError);
		file.load();
	}
}

private function fileLoaded(event:flash.events.Event) : void 
{
	if(file != null){
		try {
			var xml:XML = new XML(file.data.toString());
			if(xml.localName() != "Graph"){
				Alert.show("文件有误");
				return;
			}
			//						
			new XMLSerializer().deserialize(vgraph, xml);
			//						currentFileName = file.name;
		} catch(err:Error){
			Alert.show(err.message);
		}
		file = null;
	}
}  

protected function importBtn_clickHandler(event:MouseEvent):void
{
	loadXML();
}

protected function setStartRootBtn_clickHandler(event:MouseEvent):void
{
	if(vgraph.getSelection().length == 0){
		return;
	}
	
	var baseRenderer:BaseRenderer = vgraph.getSelection()[0];
	var inode:IVisualNode = baseRenderer.data as IVisualNode;
	startRoot = inode;
	vgraph.currentRootVNode = startRoot;
	vgraph.draw();
}

protected function saveBtn_clickHandler(event:MouseEvent):void
{
	var xmlSerializer:XMLSerializer = new XMLSerializer();
	var xml:XML = xmlSerializer.serialize(vgraph,"Graph");
	topoRemoteProxy.saveGraphLayout(xml.toString());
	topoRemoteProxy.addEventListener(TopoProviderEvent.SAVE_GRAPH_LAYOUT_RESULT,onSaveGraphLayoutResult);
	topoRemoteProxy.addEventListener(TopoProviderEvent.SAVE_GRAPH_LAYOUT_FAULT,onSaveGraphLayoutFault);
}

protected function onSaveGraphLayoutResult(event:TopoProviderEvent):void
{
	Alert.show("保存成功");
}

protected function onSaveGraphLayoutFault(event:TopoProviderEvent):void
{
	Alert.show(event.object.rootCause.message.toString(),"保存失败");
}

/**
 * 关联具体设备信息。 
 * @param event
 * 
 */
protected function connectDeviceBtn_clickHandler(event:MouseEvent):void
{
	if(vgraph.getSelection().length !=1){
		return;
	}
	
	var xmlSerializer:XMLSerializer = new XMLSerializer();
	var xml:XML = xmlSerializer.serialize(vgraph,"Graph");
	var baseRenderer:BaseRenderer = vgraph.getSelection()[0];
	
	var titleWin:ConnectDeviceTitleWin = PopUpManager.createPopUp(this,ConnectDeviceTitleWin,true) as ConnectDeviceTitleWin;
	titleWin.xml = xml;
	titleWin.item = baseRenderer.data.data;
	PopUpManager.centerPopUp(titleWin);
	titleWin.saveBtn.addEventListener(MouseEvent.CLICK,function saveBtnTitleWinClick(event:MouseEvent):void{
		var baseRenderer:BaseRenderer = vgraph.getSelection()[0];
		var item:ConfigurationItem = titleWin.item as ConfigurationItem;
		baseRenderer.lb.label = item.CI_NAME;
		baseRenderer.toolTip = item.CI_NAME;
		if(baseRenderer.data is IVisualNode){
			var ivnode:IVisualNode = baseRenderer.data as IVisualNode;
			ivnode.view.filters= [];
			var xml:XML;
			if(ivnode && ivnode.data is XML){
				xml = ivnode.data as XML;
				xml.@ciId = item.CI_ID;
				xml.@ciCode = item.CI_CODE != null ? item.CI_CODE :"";
				xml.@name = item.CI_NAME != null ? item.CI_NAME :"";
				xml.@PN = item.PN != null ? item.PN :"";
				xml.@PROVIDER = item.PROVIDER != null ? item.PROVIDER :"";
				xml.@BRAND = item.BRAND != null ? item.BRAND :"";
				xml.@PRICE = item.PRICE;
				xml.@STORAGE_DATE = item.STORAGE_DATE != null ? item.STORAGE_DATE :"";
				xml.@CI_DESC = item.CI_DESC != null ? item.CI_DESC :"";
			}
		}
		PopUpManager.removePopUp(titleWin);	
	});
}

/**
 * 显示表格 
 * @param event
 * 
 */
protected function showgridBtn_clickHandler(event:MouseEvent):void
{
	vgraph.grid.showGrid = !vgraph.grid.showGrid;
}

/**
 * 全屏。 
 * @param event
 * 
 */
protected function fullScreenBtn_clickHandler(event:MouseEvent):void
{
	this.stage.displayState=StageDisplayState.FULL_SCREEN_INTERACTIVE;
}

/**
 * 全屏。 
 * @param event
 * 
 */
protected function normalScreenBtn_clickHandler(event:MouseEvent):void
{
	this.stage.displayState=StageDisplayState.NORMAL;
}

/**
 * 双击节点。 
 * @param event
 * 
 */
protected function vgraph_rendererDoubleClickHandler(event:VisualNodeEvent):void
{
	var baseRenderer:BaseRenderer = event.baseRenderer;
	if(baseRenderer){
		var xmlSerializer:XMLSerializer = new XMLSerializer();
		var xml:XML = xmlSerializer.serialize(vgraph,"Graph");
		
		var titleWin:ConnectDeviceTitleWin = PopUpManager.createPopUp(this,ConnectDeviceTitleWin,true) as ConnectDeviceTitleWin;
		titleWin.xml = xml;
		titleWin.item = baseRenderer.data.data;
		PopUpManager.centerPopUp(titleWin);
		titleWin.saveBtn.addEventListener(MouseEvent.CLICK,function saveBtnTitleWinClick(event:MouseEvent):void{
			var item:ConfigurationItem = titleWin.item as ConfigurationItem;
			baseRenderer.lb.label = item.CI_NAME;
			baseRenderer.toolTip = item.CI_NAME;
			if(baseRenderer.data is IVisualNode){
				var ivnode:IVisualNode = baseRenderer.data as IVisualNode;
				ivnode.view.filters= [];
				var xml:XML;
				if(ivnode && ivnode.data is XML){
					xml = ivnode.data as XML;
					xml.@ciId = item.CI_ID;
					xml.@ciCode = item.CI_CODE;
					xml.@desc = item.CI_DESC;
					xml.@name = item.CI_NAME;
				}
			}
			PopUpManager.removePopUp(titleWin);	
		});
	}
}

protected function vgraph_edgeDoubleClickHandler(event:VisualGraphEditorEvent):void
{
	/*var baseEdgeRenderer:BaseEdgeRenderer = event.item as BaseEdgeRenderer;
	
	var titleWin:EdgeEditorTitleWin = PopUpManager.createPopUp(this,EdgeEditorTitleWin,true) as EdgeEditorTitleWin;
	titleWin.item = baseEdgeRenderer.data.data;
	PopUpManager.centerPopUp(titleWin);
	titleWin.saveBtn.addEventListener(MouseEvent.CLICK,function saveBtnTitleWinClick(event:MouseEvent):void{
		baseEdgeRenderer.data.data = titleWin.item;
		baseEdgeRenderer.render(true);
		var item:ConfigurationItem = titleWin.item as ConfigurationItem;
		baseEdgeRenderer.l.label = item.CI_NAME;
		baseRenderer.toolTip = item.CI_NAME;
		if(baseRenderer.data is IVisualNode){
			var ivnode:IVisualNode = baseRenderer.data as IVisualNode;
			ivnode.view.filters= [];
			var xml:XML;
			if(ivnode && ivnode.data is XML){
				xml = ivnode.data as XML;
				xml.@ciId = item.CI_ID;
				xml.@ciCode = item.CI_CODE;
				xml.@desc = item.CI_DESC;
				xml.@name = item.CI_NAME;
			}
		}
		PopUpManager.removePopUp(titleWin);	
	});*/
}


 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值