package com.primeton.etl.flex.common.config
{
import mx.collections.ArrayCollection;
import mx.controls.Alert;
import mx.messaging.Channel;
import mx.messaging.ChannelSet;
import mx.messaging.channels.AMFChannel;
import mx.rpc.events.FaultEvent;
import mx.rpc.events.ResultEvent;
import mx.rpc.remoting.RemoteObject;
import mx.utils.ObjectProxy;
public class ServiceFactory
{
private static var channel:Channel;
public static function getService(serviceName:String,host:String,root:String ):RemoteObject
{
if(channel == null)
{
channel = new AMFChannel("my-amf", "http://"+host+"/"+root+"/messagebroker/amf");
}
var service:RemoteObject = new RemoteObject();
var cs:ChannelSet = new ChannelSet();
cs.addChannel(channel);
service.channelSet = cs;
service.destination = serviceName;
service.addEventListener(FaultEvent.FAULT,showError);
return service;
}
private static function showError(e:FaultEvent):void {
Alert.show(String(e.fault.message), "错误");
}
}
}
// 动态读取配置文件
package com.primeton.etl.flex.common.config
{
import com.primeton.etl.flex.common.remotecaller.RemoteCaller;
import com.primeton.etl.flex.common.services.BusinessCaller;
import com.primeton.etl.flex.common.utils.URLRequestUtil;
import flash.events.Event;
import flash.net.URLLoader;
import flash.system.System;
import mx.controls.Alert;
public class DesignerResourceManager
{
public var urlConfig:XML = new XML();
public var isLoaded:Boolean = false;
private static var _instance:DesignerResourceManager;
public function DesignerResourceManager(access:Privace){
if(access)
if(_instance == null)
_instance = this;
}
public static function get instance():DesignerResourceManager{
if(_instance == null) _instance = new DesignerResourceManager(new Privace);
return _instance;
}
//解析加载远程调用配置文件
public function initResource(fun:Function):void{
new URLRequestUtil().useURLRequest("remoteConfig.xml",handleRemoteResult);
function handleRemoteResult(event:Event):void{
var loader:URLLoader = URLLoader(event.target);
var remoteConfig:XML = XML(loader.data);
BusinessCaller.init(remoteConfig);//加载文件
fun();
}
}
}
}
class Privace{}
//具体调用remote 的使用
package com.primeton.etl.flex.common.services
{
import com.primeton.etl.flex.common.config.ServiceFactory;
import com.primeton.etl.flex.common.remotecaller.RemoteCaller;
import mx.controls.Alert;
import mx.messaging.ChannelSet;
import mx.messaging.channels.AMFChannel;
import mx.rpc.events.FaultEvent;
import mx.rpc.events.ResultEvent;
import mx.rpc.http.Operation;
import mx.rpc.remoting.RemoteObject;
public class BusinessCaller
{ public static var cs:ChannelSet = null;
public static var channel:AMFChannel = null;
protected static var remoteConfig:XML;
protected var remoteObject:RemoteObject;
public static function get instance():BusinessCaller{
return new BusinessCaller();
}
public function getJobNodeAnalyseResult(param:Array, fun:Function=null,fault:Function=null):void{
var optNode:XML = remoteConfig.business[0].operator.(@name=="buildXml")[0];
var userGroupService:RemoteObject = ServiceFactory.getService('service',remoteConfig.server.name+":"+remoteConfig.server.port,remoteConfig.context_root);
var url:String = optNode.url;
userGroupService.getOperation(url).addEventListener(ResultEvent.RESULT,fun);
//userGroupService.getOperation(url).addEventListener(FaultEvent.FAULT,fault);
userGroupService.getOperation(url).send();
}
public function getEveryNodeAnalyseResult(param:Array, fun:Function=null,fault:Function=null):void{
var optNode:XML = remoteConfig.business[0].operator.(@name=="getXml")[0];
var userGroupService:RemoteObject = ServiceFactory.getService('service',remoteConfig.server.name+":"+remoteConfig.server.port,remoteConfig.context_root);
var url:String = optNode.url;
userGroupService.getOperation(url).addEventListener(ResultEvent.RESULT,fun);
//userGroupService.getOperation(url).addEventListener(FaultEvent.FAULT,fault);
userGroupService.getOperation(url).send();
}
public static function init(config:XML):void{
remoteConfig = config;
}
}
}
//mxml.具体要根据自己的情况
<?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"
xmlns:common="com.primeton.common.*"
height="100%" initialize="application1_initializeHandler(event)" creationComplete="init()" >
<fx:Style source="DIGovernorFinal.css"/>
<fx:Script>
<![CDATA[
import com.primeton.common.FirstWindow;
import com.primeton.etl.flex.common.config.DesignerResourceManager;
import com.primeton.etl.flex.common.config.FlashVariableLoader;
import com.primeton.etl.flex.common.services.BusinessCaller;
import com.primeton.etl.flex.modle.line.ILine;
import com.primeton.etl.flex.modle.lineRenderer.SimpleLineRenderer;
import com.primeton.etl.flex.modle.main.TopoManager;
import com.primeton.etl.flex.modle.node.INode;
import com.primeton.etl.flex.modle.nodeRenderer.LineRender;
import com.primeton.etl.flex.modle.nodeRenderer.SimpleNodeRenderer;
import flash.utils.flash_proxy;
import flash.utils.getTimer;
import mx.charts.renderers.LineRenderer;
import mx.collections.ArrayCollection;
import mx.collections.ArrayList;
import mx.collections.XMLListCollection;
import mx.containers.Panel;
import mx.controls.Alert;
import mx.core.Container;
import mx.core.DragSource;
import mx.core.IFlexDisplayObject;
import mx.core.UIComponent;
import mx.events.DragEvent;
import mx.events.FlexEvent;
import mx.events.ItemClickEvent;
import mx.managers.DragManager;
import mx.managers.PopUpManager;
import mx.rpc.events.FaultEvent;
import mx.rpc.events.ResultEvent;
import mx.rpc.remoting.RemoteObject;
import mx.utils.ObjectUtil;
[Bindable]
private var job_node_datas:ArrayCollection = new ArrayCollection();
[Bindable]
private var manager:TopoManager;
[Bindable]
private var array:ArrayList;
[Bindable]
private var data:ArrayCollection;
[Bindable]
private var str:XML;
private var nodeXml:XML;
private var lable:Panel=new Panel;;
private var time:Timer;
private var isDragging:Boolean=false;//判断是否在拖动中的标志
private var lineFromPoint:Point;
private var firstStart:int;
private var pageSize:int;
//private var pageNo:int;
private var fromNode:INode;
private var curLine:SimpleLineRenderer;
public var firstWindow:FirstWindow = new FirstWindow();
public var linetWindow:LineRender = new LineRender();
private function init():void{
manager=new TopoManager();
manager.drawSpace=drawSpace;
manager.createFromXML(nodeXml);
//FlashVariableLoader.loaderParameters(loaderInfo);
//DesignerResourceManager.instance.initResource(loadConfigComplete);
manager.status=TopoManager.S_NORMAL;
drawSpace.doubleClickEnabled=true;
//Alert.show(drawSpace.getChildren()[0].toString());
for each(var child:Object in drawSpace.getChildren()){
if( child is SimpleLineRenderer){
(child as DisplayObject).addEventListener(MouseEvent.MOUSE_OVER,createLineWindow,false,0,true);
(child as DisplayObject).addEventListener(MouseEvent.MOUSE_OUT,removeLineWindow,false,0,true);
}else{
(child as DisplayObject).addEventListener(MouseEvent.MOUSE_DOWN, innerStartDragging,false,0,true);
(child as DisplayObject).addEventListener(MouseEvent.MOUSE_UP, innerStopDragging,false,0,true);
(child as DisplayObject).addEventListener(MouseEvent.DOUBLE_CLICK, doubleInnerStartDragging,false,0,true);
(child as DisplayObject).removeEventListener(MouseEvent.MOUSE_DOWN,addLine);
}
}
}
private function noderesult(evt:ResultEvent):void{
nodeXml=new XML(evt.result.toString());
}
private function nodefault(evt:FaultEvent):void{
Alert.show("调用失败!");
}
//此方法调用后台数据
public function loadConfigComplete():void{
BusinessCaller.instance.getJobNodeAnalyseResult([],handleJobNodeAnalyse);
//Alert.show("wwwww");
}
private function handleJobNodeAnalyse(event:ResultEvent):void{
nodeXml=new XML(event.result.toString());
}
//使用组件对象打开弹出式窗口的最大好处是可以重用组件并保持所以的状态值.
private function createWindow(e:MouseEvent):void
{
firstWindow.addEventListener("pop",getWindowData);
PopUpManager.addPopUp(firstWindow, this, false);
PopUpManager.centerPopUp(firstWindow);
windowInnerStartDragging(e);
}
private function getWindowData(e:Event):void
{
createNodeforward(e);
}
private function createLineWindow(e:MouseEvent):void
{
lable.x=this.mouseX+5;
lable.y=this.mouseY+5;
lable.title="wode";
PopUpManager.addPopUp(lable,this,false);
}
//Timer监听函数
public function mov(ti:TimerEvent):void{
if(lable.x!=this.mouseX+5||lable.y!=this.mouseY+5)
lable.move(this.mouseX+5,this.mouseY+5);
}
public function removeLineWindow(e:MouseEvent):void{
PopUpManager.removePopUp(lable);
}
private function getLineWindowData(e:Event):void
{
createNodeforward(e);
//Alert.show(firstWindow.logs);
//Alert.show(firstWindow.labelPosition.selectedItem.toString());
//Alert.show("color:" + firstWindow.labelColor.selectedColor);
}
private function dragEnterHandler(event:DragEvent):void {
if (event.dragSource.hasFormat('itemSource')) {
var dropTarget:Canvas=Canvas(event.currentTarget);
// Accept the drop.
DragManager.acceptDragDrop(dropTarget);
}
}
//添加node
private function dragDropHandler(event:DragEvent):void {
var data:Object = event.dragSource.dataForFormat('itemSource');
var dragItem:SimpleNodeRenderer=new SimpleNodeRenderer();
var tData:XML=<node id="undifine" name="unknow" desc="unknow" x="200" y="600" imgUrl=""/>;
tData.@id=getTimer();
tData.@x=Canvas(event.currentTarget).mouseX;
tData.@y=Canvas(event.currentTarget).mouseY;
manager.createNode(tData,dragItem);
}
// 按下鼠标按键时会调用此函数。
private function innerStartDragging(event:MouseEvent):void
{
var parent:Container=(event.currentTarget as UIComponent).parent as Container;
parent.removeChild(event.currentTarget as UIComponent);
parent.addChild(event.currentTarget as UIComponent);
event.currentTarget.startDrag();
BusinessCaller.instance.getJobNodeAnalyseResult([],handleEveryNodeAnalyse,null);
}
private function handleEveryNodeAnalyse(event:ResultEvent):void{
str=new XML(event.result.toString());
}
private function doubleInnerStartDragging(e:MouseEvent):void
{
//Alert.show(e.currentTarget.data.message);很重要
BusinessCaller.instance.getJobNodeAnalyseResult([],handleEveryNodeAnalyse,null);
createWindow(e);
}
//双击事件打开串口对应的数据抓取
private function windowInnerStartDragging(e:MouseEvent):void
{
var id:String=e.currentTarget.data.id;
Alert.show(id);
BusinessCaller.instance.getEveryNodeAnalyseResult([],windowresult,null);
}
private function windowresult(evt:ResultEvent):void{
str=new XML(evt.result.toString());
firstWindow.setData(str);
}
private function lineresult(evt:ResultEvent):void{
var strs :XML=new XML(evt.result.toString());
linetWindow.setData(strs);
}
private function linefault(evt:FaultEvent):void{
Alert.show("调用失败!");
}
// 松开鼠标按键时会调用此函数。
private function innerStopDragging(event:MouseEvent):void
{
manager.updateLineRendererForNodeUI(event.currentTarget as UIComponent);
event.currentTarget.stopDrag();
}
//临时画线
private function doDrawLine(event:MouseEvent):void
{
var x:int =Canvas(event.currentTarget).mouseX;
var y:int =Canvas(event.currentTarget).mouseY;
var lineToPoint:Point=new Point(x,y);
curLine.freeDraw(lineFromPoint,lineToPoint);
}
//添加一条线
private function addLine(event:MouseEvent):void{
if(curLine!=null){
curLine.parent.removeChild(curLine);
curLine=null;
}
fromNode=manager.getNodeByUI(event.currentTarget as UIComponent);
if(fromNode){
for each(var child:Object in drawSpace.getChildren()){
if(child!=event.currentTarget){
(child as DisplayObject).addEventListener(MouseEvent.MOUSE_UP,completeDrawLine);
}
}
curLine=new SimpleLineRenderer();
drawSpace.addChildAt(curLine,0);
var parent:Canvas=((event.currentTarget as UIComponent).parent) as Canvas;
var x:int =parent.mouseX;
var y:int =parent.mouseY;
lineFromPoint=new Point(x,y);
curLine.freeDraw(lineFromPoint,lineFromPoint);
drawSpace.addEventListener(MouseEvent.MOUSE_MOVE,doDrawLine,false,0,true);
drawSpace.addEventListener(MouseEvent.MOUSE_UP,stopDrawLineAndRemove,false,0,true);
}
}
//完成画线,正式添加一条边
private function completeDrawLine(event:MouseEvent):void{
var toNode:INode=manager.getNodeByUI(event.currentTarget as UIComponent);
var tData:XML=<line id="" fromNode="" toNode=""/>;
tData.@id=getTimer();
tData.@fromNode=fromNode.data.@id;
tData.@toNode=toNode.data.@id;
//dragItem.data=data;
var newLine:ILine=manager.createLine(tData,curLine);
newLine.viewRenderer.draw(newLine);
removeDrawLineListner();
}
//停止画线
private function stopDrawLineAndRemove(event:MouseEvent):void{
curLine.parent.removeChild(curLine);
removeDrawLineListner();
}
//停止画线监听
private function removeDrawLineListner():void{
drawSpace.removeEventListener(MouseEvent.MOUSE_MOVE,doDrawLine);
drawSpace.removeEventListener(MouseEvent.MOUSE_UP,stopDrawLineAndRemove);
for each(var child:Object in drawSpace.getChildren()){
(child as DisplayObject).removeEventListener(MouseEvent.MOUSE_UP,completeDrawLine);
}
curLine=null;
}
private function createNodeforward(event:Event):void{
var javaeyeUrl:URLRequest = new URLRequest("createNode.html");
navigateToURL(javaeyeUrl);
}
private function forwardJianKong(event:MouseEvent):void{
var javaeyeUrl:URLRequest = new URLRequest("workPieChart.html");
navigateToURL(javaeyeUrl);
}
protected function test_clickHandler():void
{ firstStart=0;
pageSize=pageBar.pageSize;
pageBar.localFunction=fun;
}
public function fun(pageNo:int):void
{
this.firstStart=(pageNo - 1) * pageBar.pageSize;
pageSize=pageBar.pageSize;
//remote.destination = "service";
// remote.endpoint="messagebroker/amf";
//调用J2EE端类中的方法
//remote.getFenYeXmls(firstStart, pageSize);
//监听调用成功事件
//remote.addEventListener(ResultEvent.RESULT,fenYeResult);
//监听失败事件
//remote.addEventListener(FaultEvent.FAULT,fenYeFailResult);
//commonQuery.commonQuery(firstStart, pagesize, commonQueryData,accountInfo);
}
private function fenYeResult(evt:ResultEvent):void{
var strs :XML=new XML(evt.result.toString());
str=strs;
}
private function fenYeFailResult(evt:FaultEvent):void{
//Alert.show("调用失败!");
}
public function clickEvent(o:Object):void{
//Alert.show(o.consOrgName);
var javaeyeUrl:URLRequest = new URLRequest("MyMenu.html");
navigateToURL(javaeyeUrl);
}
protected function Re_resultHandler(event:ResultEvent):void
{
Alert.show("eee");
nodeXml = event.target.buildXml.lastResult as XML;
Alert.show(nodeXml);
}
private function windowStartGetData():void
{
pageSize=pageBar.totalClum=30;
}
protected function application1_initializeHandler(event:FlexEvent):void
{
// TODO Auto-generated method stub
test_clickHandler();//初始化分页总记录数
time=new Timer(100);//初始化分页总记录数
windowStartGetData();//初始化分页总记录数
time.addEventListener(TimerEvent.TIMER,mov);
//初始化拓扑图数据的方法
DesignerResourceManager.instance.initResource(loadConfigComplete);
}
]]>
</fx:Script>
<fx:Declarations>
</fx:Declarations>
<s:BorderContainer width="100%" height="100%">
<s:layout>
<s:VerticalLayout/>
</s:layout>
<s:VGroup x="0" y="0" width="100%" height="8%">
<s:Group width="100%" height="100%" >
<mx:LinkButton x="51" y="10" label="首页" />
<mx:LinkButton x="252" y="10" label="监控图" paddingLeft="0" paddingRight="0" click="forwardJianKong(event)"/>
<mx:LinkButton x="454" y="10" label="页面"/>
</s:Group>
</s:VGroup>
<s:HGroup width="100%" height="85%">
<s:VGroup width="50%" height="100%">
<s:Group width="100%" height="10%">
<s:layout>
<s:BasicLayout/>
</s:layout>
<s:Label x="38" y="10" fontSize="14" text="节点图标"/>
<s:Image id="msg" x="106" y="10" width="20" height="20"
source="assets/monitor/readylogimage.png"/>
<s:Label x="244" y="10" fontSize="14" text="数据中心图标"/>
<s:Image id="msg2" x="339" y="10" width="20" height="20"
source="assets/monitor/totalnode.png"/>
</s:Group>
<mx:Canvas id="drawSpace" width="100%" height="90%" borderVisible="false"
dragDrop="dragDropHandler(event);"
dragEnter="dragEnterHandler(event);" fontStyle="italic"
horizontalScrollPolicy="off" verticalScrollPolicy="off">
</mx:Canvas>
</s:VGroup>
<s:VGroup width="45%" height="100%">
<mx:AdvancedDataGrid id="adg1" borderStyle="none" designViewDataType="flat" sortExpertMode="true" sortableColumns="true" width="100%" height="40%">
<mx:dataProvider>
<mx:HierarchicalData id="hd" source="{str.node}"/>
</mx:dataProvider>
<mx:groupedColumns>
<mx:AdvancedDataGridColumnGroup headerText="节点统计" >
<mx:AdvancedDataGridColumn id="xuhao" headerText="序号 " dataField="@id">
<mx:itemRenderer>
<fx:Component>
<mx:LinkButton label="{data.@id}" color="red" textDecoration="none" click="outerDocument.clickEvent(data)"/>
</fx:Component>
</mx:itemRenderer>
</mx:AdvancedDataGridColumn>
<mx:AdvancedDataGridColumn headerText="节点名称" dataField="@name" />
<mx:AdvancedDataGridColumn headerText="信息共享单位" dataField="@unit_id"/>
<mx:AdvancedDataGridColumn headerText="创建日期" dataField="@createTime"/>
<mx:AdvancedDataGridColumn headerText="创建人员" dataField="@user"/>
</mx:AdvancedDataGridColumnGroup>
</mx:groupedColumns>
</mx:AdvancedDataGrid>
<common:PagingBar width="100%" height="5%" id="pageBar"/>
<common:Total id="total" width="100%" height="55%" gap="0" paddingTop="10"/>
</s:VGroup>
</s:HGroup>
</s:BorderContainer>
</s:Application>
//上面的类
package com.primeton.etl.flex.common.utils
{
import flash.events.Event;
import flash.net.*;
public class URLRequestUtil
{
public var request:URLRequest = null;
public function URLRequestUtil(){
request = new URLRequest();
}
public function useURLRequest(url:String,handlResult:Function,param:URLVariables=null):void{
// request.contentType = "text/html";
request.data = param;
// request.method = URLRequestMethod.POST;
request.url = url;
var loader:URLLoader = new URLLoader();
try{
loader.dataFormat = URLLoaderDataFormat.TEXT;
loader.addEventListener(Event.COMPLETE,handlResult);
loader.load(request);
}catch (error:ArgumentError){
trace("An ArgumentError has occurred.");
}catch (error:SecurityError){
trace("A SecurityError has occurred.");
}
}
}
}