编辑器需要有新增节点的拖拽功能,编辑器的增减。下面贴出本人编写的一个基于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);
});*/
}