TWaverFlexSerializeDemo


<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="horizontal"
xmlns:tw="http://www.servasoftware.com/2009/twaver/flex"
xmlns:demo="demo.*"
paddingBottom="0" paddingLeft="0" paddingRight="0" paddingTop="0"
backgroundColor="#FFFFFF" backgroundAlpha="0"
creationComplete="init();">
<mx:Script>
<![CDATA[
import demo.DemoImages;
import demo.DemoUtils;
import demo.FlexNode;

import mx.core.*;
import mx.events.PropertyChangeEvent;
import mx.rpc.http.HTTPService;

import twaver.*;
import twaver.controls.TreeData;
import twaver.network.*;
import twaver.network.interaction.InteractionEvent;

private const URL:String = "http://localhost:8400/TWaverSerializeDemo/InvokeServlet";

private var box:ElementBox = new ElementBox();
private var serializer:SerializeAdapter;

private function init():void {
tree.dataBox = box;
network.elementBox = box;
table.dataBox = box;
this.initDnD();
this.initToolbar();
this.initNetwork();
this.initSerializeSetting();
}

private function initToolbar():void{
DemoUtils.createDragAndDropButtonBar(toolbar, [
DemoUtils.createCreateElementButtonInfo(twaver.Node, DemoImages.routerIcon, DemoImages.routerImage, "images/element/routerImage.png"),
DemoUtils.createCreateElementButtonInfo(twaver.Group, DemoImages.group_icon, DemoImages.group_image),
DemoUtils.createCreateElementButtonInfo(twaver.SubNetwork, DemoImages.subnetwork_icon, DemoImages.subnetwork_image),
DemoUtils.createCreateElementButtonInfo(twaver.Dummy, DemoImages.dummy_icon, DemoImages.dummy_icon)
]);

DemoUtils.createButtonBar(toolbar,[
DemoUtils.createButtonInfo("Default Edit interaction", DemoImages.select, function():void{network.setEditInteractionHandlers();}),
DemoUtils.createButtonInfo("Create Link interaction", DemoImages.link_icon, function():void{network.setCreateLinkInteractionHandlers();}),
DemoUtils.createButtonInfo("Create Link Subnetwork interaction", DemoImages.linksubnetwork_icon, function():void{network.setCreateLinkInteractionHandlers(LinkSubNetwork);}),
DemoUtils.createButtonInfo("Create ShapeLink interaction", DemoImages.shapelink_icon, function():void{network.setCreateShapeLinkInteractionHandlers();}),
DemoUtils.createButtonInfo("Create ShapeNode interaction", DemoImages.shapenode_icon, function():void{network.setCreateShapeNodeInteractionHandlers();}),
DemoUtils.createButtonInfo("Create Shape Subnetwork interaction", DemoImages.shapesubnetwork_icon, function():void{network.setCreateShapeNodeInteractionHandlers(ShapeSubNetwork);})
],true);

DemoUtils.addExportButton(toolbar, network);
DemoUtils.addInteractionComboBox(toolbar, network);

DemoUtils.addButton(toolbar, "Load", null, function():void {
loadCurrentSubnetwork();
});
DemoUtils.addButton(toolbar, "Save", null, function():void {
saveCurrentSubnetwork();
});

DemoUtils.initNetworkContextMenu(network);
}

private function initDnD():void{
DemoUtils.initNetworkDragAndDropListener(network);
DemoUtils.initTreeDragAndDropListener(tree, network);
tree.branchFunction = function(treeData:TreeData):Boolean{
if(treeData.data is Group || treeData.data is SubNetwork || treeData.data is IDummy){
return true;
}
return treeData.children.length > 0;
};
box.addDataPropertyChangeListener(function(evt:PropertyChangeEvent):void{
if(evt.property == "parent" && evt.source.parent is Group){
Group(evt.source.parent).expanded = true;
}
});
}

private function initNetwork():void {
network.toolTipFunction = function(element:IElement):String{
if(element is FlexNode){
var node:FlexNode = element as FlexNode;
return "customProperty:"+ node.customProperty
+ "\n"+FlexNode.CUSTOM_CLIENT+":" + node.getClient(FlexNode.CUSTOM_CLIENT);
}
if(element.toolTip != null){
return element.toolTip;
}
return element.toString();
};

network.addInteractionListener(function(e:InteractionEvent):void {
if (e.kind == InteractionEvent.ENTER_SUBNETWORK) {
if (network.currentSubNetwork.getClient("LOADED") != "true") {
loadCurrentSubnetwork();
network.currentSubNetwork.setClient("LOADED", "true");
}
}
});
}

private function initSerializeSetting():void {
//註冊自定義類
SerializeAdapterSetting.registerGlobalClass("CNode", FlexNode);
//註冊自定義屬性
SerializeAdapterSetting.registerGlobalProperty("customProperty", Consts.TYPE_STRING, true);
//註冊自定義Client屬性
SerializeAdapterSetting.registerGlobalClient(FlexNode.CUSTOM_CLIENT, Consts.TYPE_STRING);
//註冊序列化方法
SerializeAdapterSetting.registerGlobalXMLSerializeFunction(FlexNode,
function(serializer:SerializeAdapter, instance:Object, newInstance:Object):void{
serializer.serializeProperty(instance, "customProperty", newInstance);
});

var setting:SerializeAdapterSetting = new SerializeAdapterSetting();
setting.idFunction = function(data:IData):Object{
if(data is FlexNode){
return (data as FlexNode).getClient(FlexNode.CLIENT_ID);
}
return data.id;
};
this.serializer = new SerializeAdapter(box, setting);
serializer.filterFunction = function(data:IData):Boolean {
return Utils.getSubNetwork(data as IElement) == network.currentSubNetwork;
};
}

private function saveCurrentSubnetwork():void{
var service:HTTPService = new HTTPService();
service.resultFormat = "e4x";
service.url = URL;
service.addEventListener("fault", function(e:*):void{
trace(e);
});
var params:Object = new Object();
params.action = "save";
if(network.currentSubNetwork != null){
params.currentSubNetwork = network.currentSubNetwork.id.toString();
}
params.topoXml = encodeURIComponent(serializer.serialize());
service.send(params);
}

private function loadCurrentSubnetwork():void{
var service:HTTPService = new HTTPService();
service.resultFormat = "e4x";
service.url = URL;
service.addEventListener("result", function(e:*):void{
if(e.result != null){
serializer.deserialize(e.result, network.currentSubNetwork);
}
});
service.addEventListener("fault", function(e:*):void{
trace(e);
});
var params:Object = new Object();
if(network.currentSubNetwork != null){
params.currentSubNetwork = network.currentSubNetwork.id.toString();
}
service.send(params);
}
]]>
</mx:Script>
<mx:HDividedBox width="100%" height="100%">
<tw:Tree id="tree" width="200" height="100%"/>
<mx:VDividedBox width="100%" height="100%">
<mx:Canvas width="100%" height="100%">
<tw:Network id="network" width="100%" height="100%"/>
<mx:HBox id="toolbar" left="4" top="4">
</mx:HBox>
</mx:Canvas>
<tw:Table id="table" width="100%" height="200" editable="true" sortableColumns="false">
<tw:columns>
<demo:DataColumn/>
<tw:TableColumn style="{Styles.TREE_LABEL}" headerText="tree label"/>
<tw:TableColumn style="{Styles.NETWORK_LABEL}" headerText="network label"/>
</tw:columns>
</tw:Table>
</mx:VDividedBox>
</mx:HDividedBox>
</mx:Application>

package demo
{
import mx.containers.HBox;
import mx.controls.TextInput;
import mx.core.UIComponent;

import twaver.IData;
import twaver.IElement;
import twaver.Utils;
import twaver.controls.Table;

public class DataRenderer extends HBox
{
public static const size:Number = 18;
private var image:UIComponent = new UIComponent();
private var textInput:TextInput = new TextInput();

public function DataRenderer()
{
textInput.percentWidth = 100;
this.addChild(image);
this.addChild(textInput);
this.horizontalScrollPolicy = "off";
this.verticalScrollPolicy = "off";
this.textInput.mouseEnabled = false;
this.textInput.mouseChildren = false;
this.textInput.setStyle("borderStyle", "none");
this.textInput.setStyle("backgroundAlpha", 0);
this.setStyle("paddingLeft", 3);
this.setStyle("paddingRight", 3);
this.setStyle("horizontalGap", 2);
}

override public function set data(value:Object):void {
super.data = value;
var d:IData = null;
if(this.data is IData){
d = this.data as IData;
}
else if(this.data && this.owner is Table){
d = Table(this.owner).dataBox.getDataByID(this.data.id);
}
image.graphics.clear();
if(d != null){
this.textInput.text = d.name;
var color:* = null;
if(d is IElement){
var element:IElement = IElement(d);
if(element.alarmState.highestNativeAlarmSeverity != null){
color = element.alarmState.highestNativeAlarmSeverity.color;
}
}
Utils.drawImage(image.graphics, d.icon, 0, 0, size, size, color);
image.width = size;
image.height = size;
}else{
this.textInput.text = label;
image.width = 0;
image.height = 0;
}

}
}
}


[code="java"]
package demo{

import flash.display.BitmapData;
import flash.display.DisplayObject;
import flash.events.ContextMenuEvent;
import flash.events.Event;
import flash.events.MouseEvent;
import flash.geom.Point;
import flash.net.FileFilter;
import flash.net.FileReference;
import flash.ui.ContextMenu;
import flash.ui.ContextMenuItem;
import flash.utils.ByteArray;
import flash.utils.describeType;

import mx.collections.ArrayCollection;
import mx.containers.Box;
import mx.controls.Alert;
import mx.controls.Button;
import mx.controls.ButtonBar;
import mx.controls.ComboBox;
import mx.controls.Image;
import mx.controls.Spacer;
import mx.controls.ToggleButtonBar;
import mx.core.Container;
import mx.core.DragSource;
import mx.core.UIComponent;
import mx.effects.AnimateProperty;
import mx.effects.CompositeEffect;
import mx.effects.Parallel;
import mx.events.DragEvent;
import mx.events.EffectEvent;
import mx.events.ItemClickEvent;
import mx.events.ListEvent;
import mx.graphics.codec.PNGEncoder;
import mx.managers.DragManager;
import mx.printing.FlexPrintJob;
import mx.printing.FlexPrintJobScaleType;

import twaver.Alarm;
import twaver.AlarmSeverity;
import twaver.Collection;
import twaver.Consts;
import twaver.ElementBox;
import twaver.Group;
import twaver.IAlarm;
import twaver.ICollection;
import twaver.IData;
import twaver.IElement;
import twaver.Node;
import twaver.Styles;
import twaver.Utils;
import twaver.XMLSerializer;
import twaver.controls.Tree;
import twaver.controls.TreeData;
import twaver.network.Network;
import twaver.network.Overview;
import twaver.network.interaction.*;

public class DemoUtils{

public static const DEFAULT_BUTTON_HEIGHT:int = 20;
public static const DEFAULT_BUTTON_WIDTH:int = 28;

public static var FLEX_SDK_VERSION:String;
public static var FLASH_PLAYER_VERSION:String;

public static var statesXML:XML = null;
public static var demoTree:Tree = null;


public static function createColor(r:int, g:int, b:int):int{
return (r<<16)+(g<<8)+b;
}

public static function addButton(container:Container, name:String, icon:Class, f:Function,
label:Boolean=false, maxWidth:Number = -1, space:Number = -1, height:int = -1):Button{
var button:Button = new Button();
if(f != null){
button.addEventListener(MouseEvent.CLICK, function(e:MouseEvent):void{
if(f.length == 0){
f();
}else{
try{
f(e);
}catch(error:Error){
trace(error);
f();
}
}
});
}
if(icon != null){
button.setStyle("icon", icon);
}
if(name != null){
if(label || (icon==null)){
button.label = name;
}
button.toolTip = name;
}
if(maxWidth > 0){
button.maxWidth = maxWidth;
}
if(space > 0){
var spacer:Spacer = new Spacer();
spacer.width = space;
container.addChild(spacer);
}
if(height<0){
button.height = DEFAULT_BUTTON_HEIGHT;
}else if(height>0){
button.height = height;
}
if(icon && !label){
button.width = DEFAULT_BUTTON_WIDTH;
}
if(container != null){
container.addChild(button);
}
return button;
}

public static function initTreeToolbar(toolbar:Box, tree:Tree):void{
createButtonBar(toolbar, [
createButtonInfo("Reset Order", DemoImages.reset, function():void{
tree.compareFunction = null;
}),
createButtonInfo( "Ascend Order", DemoImages.ascend, function():void{
tree.compareFunction = function(d1:IData, d2:IData):int{
if(d1.name > d2.name){
return 1;
}else if(d1.name == d2.name){
return 0;
}else{
return -1;
}
};
}),
createButtonInfo("Descend Order", DemoImages.descend, function():void{
tree.compareFunction = function(d1:IData, d2:IData):int{
if(d1.name < d2.name){
return 1;
}else if(d1.name == d2.name){
return 0;
}else{
return -1;
}
};
})
], true);


createButtonBar(toolbar, [
createButtonInfo("Move Selection To Top", DemoImages.top, function():void{
tree.moveSelectionToTop();
}),
createButtonInfo( "Move Selection Up", DemoImages.up, function():void{
tree.moveSelectionUp();
}),
createButtonInfo("Move Selection Down", DemoImages.down, function():void{
tree.moveSelectionDown();
}),
createButtonInfo("Move Selection To Bottom", DemoImages.bottom, function():void{
tree.moveSelectionToBottom();
})
]);

createButtonBar(toolbar, [
createButtonInfo("Expand", DemoImages.expand, function():void{
if(tree.selectionModel.count == 1){
tree.expandData(tree.selectionModel.lastData, true);
}else{
tree.expandChildrenOf(tree.rootTreeData, true);
}
}),
createButtonInfo("Collapse", DemoImages.collapse, function():void{
if(tree.selectionModel.count == 1){
tree.collapse(tree.selectionModel.lastData, true);
}else{
tree.expandChildrenOf(tree.rootTreeData, false);
}
})]);
}

public static function initNetworkContextMenu(network:Network):void{
network.contextMenu = new ContextMenu();
network.contextMenu.hideBuiltInItems();

var handler:Function = function(e:ContextMenuEvent):void{
var i:int = 0;
var element:IElement = null;
var severity:AlarmSeverity = Utils.randomNonClearedSeverity();
var item:ContextMenuItem = ContextMenuItem(e.target);
if(item.caption == "Remove Selection"){
network.removeSelection();
}
else if(item.caption == "Random Inner Color"){
for(i=0; i<network.selectionModel.selection.count; i++){
element = network.selectionModel.selection.getItemAt(i);
if(element.getStyle(Styles.INNER_COLOR) == null){
element.setStyle(Styles.INNER_COLOR, Utils.randomColor());
}else{
element.setStyle(Styles.INNER_COLOR, null);
}
}
}
else if(item.caption == "Random Outer Color"){
for(i=0; i<network.selectionModel.selection.count; i++){
element = network.selectionModel.selection.getItemAt(i);
if(element.getStyle(Styles.OUTER_COLOR) == null){
element.setStyle(Styles.OUTER_COLOR, Utils.randomColor());
}else{
element.setStyle(Styles.OUTER_COLOR, null);
}
}
}
else{
for(i=0; i<network.selectionModel.selection.count; i++){
element = network.selectionModel.selection.getItemAt(i);
if(item.caption == "Add New Alarm"){
element.alarmState.increaseNewAlarm(severity);
}
else if(item.caption == "Add Acked Alarm"){
element.alarmState.increaseAcknowledgedAlarm(severity);
}
else{
element.alarmState.clear();
}
}
}
};

network.contextMenu.addEventListener(ContextMenuEvent.MENU_SELECT, function(e:ContextMenuEvent):void{
var p:Point = new Point(e.mouseTarget.mouseX / network.zoom, e.mouseTarget.mouseY / network.zoom);
var datas:ICollection = network.getElementsByLocalPoint(p);
if (datas.count > 0) {
network.selectionModel.setSelection(datas.getItemAt(0));
}else{
network.selectionModel.clearSelection();
}

var flexVersion:ContextMenuItem = new ContextMenuItem(DemoUtils.FLEX_SDK_VERSION, false, false);
var playerVersion:ContextMenuItem = new ContextMenuItem(DemoUtils.FLASH_PLAYER_VERSION, false, false);

if(network.selectionModel.count == 0){
network.contextMenu.customItems = [flexVersion, playerVersion];
}else{
var item1:ContextMenuItem = new ContextMenuItem("Add New Alarm", true);
item1.addEventListener(ContextMenuEvent.MENU_ITEM_SELECT, handler);
var item2:ContextMenuItem = new ContextMenuItem("Add Acked Alarm");
item2.addEventListener(ContextMenuEvent.MENU_ITEM_SELECT, handler);
var item3:ContextMenuItem = new ContextMenuItem("Clear Alarm");
item3.addEventListener(ContextMenuEvent.MENU_ITEM_SELECT, handler);

var item4:ContextMenuItem = new ContextMenuItem("Random Inner Color", true);
item4.addEventListener(ContextMenuEvent.MENU_ITEM_SELECT, handler);
var item5:ContextMenuItem = new ContextMenuItem("Random Outer Color");
item5.addEventListener(ContextMenuEvent.MENU_ITEM_SELECT, handler);

var item6:ContextMenuItem = new ContextMenuItem("Remove Selection", true);
item6.addEventListener(ContextMenuEvent.MENU_ITEM_SELECT, handler);

network.contextMenu.customItems = [flexVersion, playerVersion, item1, item2, item3, item4, item5, item6];
}
});
}

public static function createDragAndDropButtonBar(toolbar:Box, buttonInfos:Array, showLabel:Boolean = false, perWidth:int = -1, height:int = -1, format:String = "twaverformat"):ButtonBar{
var buttonBar:ButtonBar = createButtonBar(toolbar, buttonInfos, false, showLabel, perWidth, height);
buttonBar.addEventListener(MouseEvent.MOUSE_DOWN, function(e:MouseEvent):void{
if(e.target is Button){
var button:Button = e.target as Button;
var ds:DragSource = new DragSource();
ds.addData(button, format);
var dragImage:Image = null;
var w:Number = 0, h:Number = 0;
if(buttonBar.dataProvider is ArrayCollection){
var index:int = buttonBar.getChildIndex(button);
var item:* = (buttonBar.dataProvider as ArrayCollection).getItemAt(index);
if(item){
ds.addData(item, "data");
dragImage = item.dragImage as Image;
w = item.dragImageWidth;
h = item.dragImageHeight;
}
}
DragManager.doDrag(button, ds, e, dragImage, -e.localX+w/2, -e.localY+h/2);
}
});
return buttonBar;
}

public static function createButtonBar(toolbar:Box, buttonInfos:Array, isToggleButtonBar:Boolean = false, showLabel:Boolean = false, perWidth:int = -1, height:int = -1):ButtonBar{
var buttonBar:ButtonBar = isToggleButtonBar ? new ToggleButtonBar() : new ButtonBar();
buttonBar.addEventListener(ItemClickEvent.ITEM_CLICK, function(e:ItemClickEvent):void{
var button:* = e.item;
if(button.click is Function){
if((button.click as Function).length>0){
try{
button.click(e);
}catch(error:Error){
button.click();
}
}else{
button.click();
}
}
});
buttonBar.dataProvider = buttonInfos;
if(perWidth<0){
perWidth = DEFAULT_BUTTON_WIDTH;
}
if(height<0){
height = DEFAULT_BUTTON_HEIGHT;
}
if(!showLabel){
buttonBar.width = buttonInfos.length*perWidth;
}
buttonBar.height = height;
toolbar.addChild(buttonBar);
return buttonBar;
}

public static function createButtonInfo(name:String, icon:Class, click:Function):*{
return {
label:name,
icon:icon,
click:click
};
}

public static function createCreateElementButtonInfo(elementClass:Class, iconClass:Class, imageClass:Class=null, imageUrl:String=null, click:Function = null):*{
if(elementClass == null){
throw new ArgumentError("elementClass can't be null");
}
var label:* = (elementClass as Class).toString();
var result:* = {
label:label,
icon:iconClass,
click:click,
elementClass:elementClass,
type:"createElementButton",
imageUrl:imageUrl
};
imageClass = (imageClass == null ? iconClass : imageClass);
if(imageClass){
var dragImage:Image = new Image();
dragImage.mouseChildren = false;
dragImage.mouseEnabled = false;
dragImage.source = imageClass;
var bitmapData:BitmapData = new dragImage.source().bitmapData;
result.dragImageWidth = bitmapData.width;
result.dragImageHeight = bitmapData.height;
result.dragImage = dragImage;
}
return result;
}

public static function createNodeByButtonInfo(data:*):IElement{
if(data.elementClass is Class){
var node:IElement = new data.elementClass();
node.name = data.label;
if(data.imageUrl && node is Node){
(node as Node).image = data.imageUrl;
}
return node;
}
return null;
}

public static function initTreeDragAndDropListener(tree:Tree, network:Network = null, dropedFunction:Function = null):void{
tree.addEventListener(DragEvent.DRAG_ENTER,function(evt:DragEvent):void{
if(evt.dragSource.hasFormat("twaverformat")){
evt.preventDefault();
DragManager.acceptDragDrop(tree);
}
});
tree.addEventListener(DragEvent.DRAG_OVER,function(evt:DragEvent):void{
if(evt.dragSource.hasFormat("twaverformat")){
evt.preventDefault();
DragManager.acceptDragDrop(tree);
}
});
tree.addEventListener(DragEvent.DRAG_DROP,function (evt:DragEvent):void{
var data:Object = evt.dragSource.dataForFormat("data");
var dragImage:DisplayObject;
var element:IElement;
if(data){
element = DemoUtils.createNodeByButtonInfo(data);
dragImage = data.dragImage;
}else {
return;
}
var index:int = tree.calculateDropIndex(evt);
var treeData:TreeData = tree.getTreeDataByIndex(index);
if(element is Node && treeData != null && treeData.data is Group){
Node(element).centerLocation = Group(treeData.data).centerLocation;
}
tree.dataBox.add(element);
// set parent
if(treeData != null && treeData.data != null){
element.parent = treeData.data;
}else{
if(network !=null){
element.parent = network.currentSubNetwork;
}
}

if(dropedFunction!=null){
dropedFunction(element);
}
});
}

public static function initNetworkDragAndDropListener(network:Network, dropedFunction:Function = null):void{
network.addEventListener(DragEvent.DRAG_ENTER,function(evt:DragEvent):void{
if(evt.dragSource.hasFormat("twaverformat")){
DragManager.acceptDragDrop(network);
}
});
network.addEventListener(DragEvent.DRAG_DROP,function (evt:DragEvent):void{
var centerLocation:Point = network.getLogicalPoint(evt);
var element:IElement;
var data:Object = evt.dragSource.dataForFormat("data");
var dragImage:DisplayObject;
if(data){
element = DemoUtils.createNodeByButtonInfo(data);
dragImage = data.dragImage;
}else {
return;
}
if(element is Node){
Node(element).centerLocation = centerLocation;
}

// set parent
var group:Group = null;
if(element is Node && dragImage){
Node(element).centerLocation = centerLocation;
var list:ICollection = network.getElementsByDisplayObject(dragImage);
for(var i:int=0; i<list.count; i++){
group = list.getItemAt(i) as Group;
if(group != null){
break;
}
}
}
if(group != null){
element.parent = group;
}

if(dropedFunction != null){
if(dropedFunction.length == 0){
dropedFunction();
}else if(dropedFunction.length==1){
dropedFunction(element);
}else if(dropedFunction.length >1){
dropedFunction(element, evt);
}
}

network.addElementByInteraction(element);
});
}


public static function initNetworkToolbar(toolbar:Box, network:Network, interaction:String = null, showLabel:Boolean = false, perWidth:int = -1, height:int = -1):void{
toolbar.setStyle("horizontalGap", 4);
if(perWidth<0){
perWidth = DEFAULT_BUTTON_WIDTH;
}
if(height<0){
height = DEFAULT_BUTTON_HEIGHT;
}

addButton(toolbar, "Default interaction", DemoImages.select, network.setDefaultInteractionHandlers);

createButtonBar(toolbar, [
createButtonInfo("Zoom In", DemoImages.zoomIn, function():void{network.zoomIn(true);}),
createButtonInfo("Zoom Out", DemoImages.zoomOut, function():void{network.zoomOut(true);}),
createButtonInfo("Zoom Reset", DemoImages.zoomReset, function():void{network.zoomReset(true);}),
createButtonInfo("Zoom Overview", DemoImages.zoomOverview, function():void{network.zoomOverview(true);})
], false, showLabel, perWidth, height);

createButtonBar(toolbar, [
createButtonInfo("Export Image", DemoImages.export, function():void{
var fr:Object = new FileReference();
if(fr.hasOwnProperty("save")){
var bitmapData:BitmapData = network.exportAsBitmapData();
var encoder:PNGEncoder = new PNGEncoder();
var data:ByteArray = encoder.encode(bitmapData);
fr.save(data, 'network.png');
}else{
Alert.show("install Flash Player 10 to run this feature", "Not Supported");
}
}),
createButtonInfo("Save XML", DemoImages.save, function():void{
var fr:Object = new FileReference();
if(fr.hasOwnProperty("save")){
var serializer:XMLSerializer = new XMLSerializer(network.elementBox);
fr.save(serializer.serialize(), 'network.xml');
}else{
Alert.show("install Flash Player 10 to run this feature", "Not Supported");
}
}),
createButtonInfo("Open XML", DemoImages.open, function():void {
var fr:FileReference = new FileReference();
if (fr.hasOwnProperty("browse")) {
fr.addEventListener(Event.SELECT, function(e:Event):void {
fr.load();
});
fr.addEventListener(Event.COMPLETE, function(ex:Event):void {
var xmlText:String = fr.data.readUTFBytes(fr.data.length);
var serializer:XMLSerializer = new XMLSerializer(network.elementBox);
serializer.deserialize(xmlText,network.currentSubNetwork);
});
var fileFilter:FileFilter = new FileFilter("XML: (*.xml)", "*.xml");
fr.browse([fileFilter]);
} else {
Alert.show("install Flash Player 10 to run this feature", "Not Supported");
}
}),
createButtonInfo("Print...", DemoImages.print, function():void{
var printJob:FlexPrintJob = new FlexPrintJob();
if (printJob.start()){
var bitmapData:BitmapData = network.exportAsBitmapData();
var component:UIComponent = new UIComponent();
component.graphics.beginBitmapFill(bitmapData);
component.graphics.drawRect(0, 0, bitmapData.width, bitmapData.height);
component.graphics.endFill();
component.width = bitmapData.width;
component.height = bitmapData.height;
network.addChild(component);
try{
printJob.printAsBitmap = true;
printJob.addObject(component, FlexPrintJobScaleType.SHOW_ALL);
}
catch (error:*){
Alert.show(error, "Print Error");
}
printJob.send();
network.removeChild(component);
}
})

], false, showLabel, perWidth, height);

var comboBox:ComboBox = addInteractionComboBox(toolbar, network, interaction, height);
}

public static function addPrintButton(toolbar:Box, network:Network):Button{
return addButton(toolbar, "Print...", DemoImages.print, function():void{
var printJob:FlexPrintJob = new FlexPrintJob();
if (printJob.start()){
var bitmapData:BitmapData = network.exportAsBitmapData();
var component:UIComponent = new UIComponent();
component.graphics.beginBitmapFill(bitmapData);
component.graphics.drawRect(0, 0, bitmapData.width, bitmapData.height);
component.graphics.endFill();
component.width = bitmapData.width;
component.height = bitmapData.height;
network.addChild(component);
try{
printJob.printAsBitmap = true;
printJob.addObject(component, FlexPrintJobScaleType.SHOW_ALL);
}
catch (error:*){
Alert.show(error, "Print Error");
}
printJob.send();
network.removeChild(component);
}
});
}

public static function addExportButton(toolbar:Box, network:Network):void{
addButton(toolbar, "Export Image", DemoImages.export, function():void{
var fr:Object = new FileReference();
if(fr.hasOwnProperty("save")){
var bitmapData:BitmapData = network.exportAsBitmapData();
var encoder:PNGEncoder = new PNGEncoder();
var data:ByteArray = encoder.encode(bitmapData);
fr.save(data, 'network.png');
}else{
Alert.show("install Flash Player 10 to run this feature", "Not Supported");
}
});
addButton(toolbar, "Save XML", DemoImages.save, function():void{
var fr:Object = new FileReference();
if(fr.hasOwnProperty("save")){
var serializer:XMLSerializer = new XMLSerializer(network.elementBox);
fr.save(serializer.serialize(), 'network.xml');
}else{
Alert.show("install Flash Player 10 to run this feature", "Not Supported");
}
});
addButton(toolbar, "Open XML", DemoImages.open, function():void{
var fr:* = new FileReference();
if (fr.hasOwnProperty("browse")) {
fr.addEventListener(Event.SELECT, function(e:Event):void {
fr.load();
});
fr.addEventListener(Event.COMPLETE, function(ex:Event):void {
var xmlText:String = fr.data.readUTFBytes(fr.data.length);
var serializer:XMLSerializer = new XMLSerializer(network.elementBox);
serializer.deserialize(xmlText,network.currentSubNetwork);
});
var fileFilter:FileFilter = new FileFilter("XML: (*.xml)", "*.xml");
fr.browse([fileFilter]);
} else {
Alert.show("install Flash Player 10 to run this feature", "Not Supported");
}
});
}

public static function addInteractionComboBox(toolbar:Box, network:Network, interaction:String = null, height:int = -1):ComboBox{
var comboBox:ComboBox = new ComboBox();
toolbar.addChild(comboBox);
comboBox.dataProvider = ["Default-Live", "Default-Lazy", "Edit-Live", "Edit-Lazy", "FishEye", "Magnify", "Pan", "None"];
comboBox.addEventListener(ListEvent.CHANGE, function(e:Event = null):void{
var type:String = String(comboBox.selectedItem);
if(type == "Default-Live"){
network.setDefaultInteractionHandlers();
}
else if(type == "Default-Lazy"){
network.setDefaultInteractionHandlers(true);
}
else if(type == "Edit-Live"){
network.setEditInteractionHandlers();
}
else if(type == "Edit-Lazy"){
network.setEditInteractionHandlers(true);
}
else if(type == "FishEye"){
network.interactionHandlers = new Collection([
new SelectInteractionHandler(network),
new EditInteractionHandler(network),
new MoveInteractionHandler(network),
new DefaultInteractionHandler(network),
new MapFilterInteractionHandler(network),
]);
}
else if(type == "Magnify"){
network.interactionHandlers = new Collection([
new SelectInteractionHandler(network),
new EditInteractionHandler(network),
new MoveInteractionHandler(network),
new DefaultInteractionHandler(network),
new MapFilterInteractionHandler(network, Consts.MAP_FILTER_MAGNIFY),
]);
}
else if(type == "Pan"){
network.setPanInteractionHandlers();
}
else if(type == "None"){
network.interactionHandlers = null;
}
});
if(interaction != null){
comboBox.selectedItem = interaction;
comboBox.dispatchEvent(new ListEvent("change"));
}
if(height<=0){
height = DemoUtils.DEFAULT_BUTTON_HEIGHT;
}
comboBox.height = height;
return comboBox;
}

public static function randomAlarm(alarmID:Object = null, elementID:Object = null, nonClearedSeverity:Boolean = false):IAlarm{
var alarm:IAlarm = new Alarm(alarmID, elementID);
alarm.acked = Utils.randomBoolean();
alarm.cleared = Utils.randomBoolean();
alarm.alarmSeverity = nonClearedSeverity ? Utils.randomNonClearedSeverity() : Utils.randomSeverity();
alarm.setClient("raisedTime", new Date());
return alarm;
}

public static function getConstsByPrefix(prefix:String):Array{
var name:String;
var array:Array = new Array();
var classInfo:XML = describeType(Consts);
for each (var v:XML in classInfo..constant){
name = String(v.@name);
if(name.indexOf(prefix) == 0){
array.splice(array.length, 0, name);
}
}
array.sort();
for(var i:int=0; i<array.length; i++){
name = array[i];
array[i] = Consts[name];
}
return array;
}

private static function addAnimateProperty(effect:CompositeEffect, property:String, toValue:Number, isStyle:Boolean = true):AnimateProperty{
var animateProperty:AnimateProperty = new AnimateProperty();
animateProperty.isStyle = isStyle;
animateProperty.property = property;
animateProperty.toValue = toValue;
effect.addChild(animateProperty);
return animateProperty;
}

public static function addOverview(network:Network):void{
var show:Parallel = new Parallel();
show.duration = 250;
addAnimateProperty(show, "alpha", 1, false);
addAnimateProperty(show, "width", 100, false);
addAnimateProperty(show, "height", 100, false);

var hide:Parallel = new Parallel();
hide.duration = 250;
addAnimateProperty(hide, "alpha", 0, false);
addAnimateProperty(hide, "width", 0, false);
addAnimateProperty(hide, "height", 0, false);

var overview:Overview = new Overview();
overview.visible = false;
overview.width = 0;
overview.height = 0;
overview.backgroundColor = 0xFFFFFF;
overview.backgroundAlpha = 1;
overview.setStyle("right", 17);
overview.setStyle("bottom", 17);
overview.setStyle("showEffect", show);
overview.setStyle("hideEffect", hide);

var toggler:Button = new Button();
toggler.width = 17;
toggler.height = 17;
toggler.setStyle("right", 0);
toggler.setStyle("bottom", 0);
toggler.setStyle("icon", DemoImages.show);
toggler.addEventListener(MouseEvent.CLICK, function(e:*):void{
if(toggler.getStyle("icon") == DemoImages.show){
toggler.setStyle("icon", DemoImages.hide);
overview.network = network;
overview.visible = true;
}else{
toggler.setStyle("icon", DemoImages.show);
overview.visible = false
}
});
hide.addEventListener(EffectEvent.EFFECT_END, function(e:*):void{
overview.network = null;
});
network.parent.addChild(overview);
network.parent.addChild(toggler);
}

}

}
package demo
{
import mx.core.ClassFactory;

import twaver.controls.TableColumn;

public class DataColumn extends TableColumn
{
public function DataColumn(columnName:String=null)
{
super(columnName);
this.itemRenderer = new ClassFactory(DataRenderer);
this.editable = false;
this.dataField = "id";
this.headerText = "element";
}

}
}
package demo
{
import twaver.Node;

public class FlexNode extends Node
{
public static const CUSTOM_CLIENT:String = "CUSTOM_CLIENT";
public static const CLIENT_ID:String = "CLIENT_ID";

private var _customProperty:String;

public function FlexNode(id:Object=null) {
super(id);
}

public function get customProperty():String {
return this._customProperty;
}

public function set customProperty(value:String):void {
var oldValue:String = this._customProperty;
this._customProperty = value;
this.dispatchPropertyChangeEvent("customProperty", oldValue, value);
}
}
}
package demo{

import flash.display.BitmapData;
import flash.display.DisplayObject;
import flash.events.ContextMenuEvent;
import flash.events.Event;
import flash.events.MouseEvent;
import flash.geom.Point;
import flash.net.FileFilter;
import flash.net.FileReference;
import flash.ui.ContextMenu;
import flash.ui.ContextMenuItem;
import flash.utils.ByteArray;
import flash.utils.describeType;

import mx.collections.ArrayCollection;
import mx.containers.Box;
import mx.controls.Alert;
import mx.controls.Button;
import mx.controls.ButtonBar;
import mx.controls.ComboBox;
import mx.controls.Image;
import mx.controls.Spacer;
import mx.controls.ToggleButtonBar;
import mx.core.Container;
import mx.core.DragSource;
import mx.core.UIComponent;
import mx.effects.AnimateProperty;
import mx.effects.CompositeEffect;
import mx.effects.Parallel;
import mx.events.DragEvent;
import mx.events.EffectEvent;
import mx.events.ItemClickEvent;
import mx.events.ListEvent;
import mx.graphics.codec.PNGEncoder;
import mx.managers.DragManager;
import mx.printing.FlexPrintJob;
import mx.printing.FlexPrintJobScaleType;

import twaver.Alarm;
import twaver.AlarmSeverity;
import twaver.Collection;
import twaver.Consts;
import twaver.ElementBox;
import twaver.Group;
import twaver.IAlarm;
import twaver.ICollection;
import twaver.IData;
import twaver.IElement;
import twaver.Node;
import twaver.Styles;
import twaver.Utils;
import twaver.XMLSerializer;
import twaver.controls.Tree;
import twaver.controls.TreeData;
import twaver.network.Network;
import twaver.network.Overview;
import twaver.network.interaction.*;

public class DemoUtils{

public static const DEFAULT_BUTTON_HEIGHT:int = 20;
public static const DEFAULT_BUTTON_WIDTH:int = 28;

public static var FLEX_SDK_VERSION:String;
public static var FLASH_PLAYER_VERSION:String;

public static var statesXML:XML = null;
public static var demoTree:Tree = null;


public static function createColor(r:int, g:int, b:int):int{
return (r<<16)+(g<<8)+b;
}

public static function addButton(container:Container, name:String, icon:Class, f:Function,
label:Boolean=false, maxWidth:Number = -1, space:Number = -1, height:int = -1):Button{
var button:Button = new Button();
if(f != null){
button.addEventListener(MouseEvent.CLICK, function(e:MouseEvent):void{
if(f.length == 0){
f();
}else{
try{
f(e);
}catch(error:Error){
trace(error);
f();
}
}
});
}
if(icon != null){
button.setStyle("icon", icon);
}
if(name != null){
if(label || (icon==null)){
button.label = name;
}
button.toolTip = name;
}
if(maxWidth > 0){
button.maxWidth = maxWidth;
}
if(space > 0){
var spacer:Spacer = new Spacer();
spacer.width = space;
container.addChild(spacer);
}
if(height<0){
button.height = DEFAULT_BUTTON_HEIGHT;
}else if(height>0){
button.height = height;
}
if(icon && !label){
button.width = DEFAULT_BUTTON_WIDTH;
}
if(container != null){
container.addChild(button);
}
return button;
}

public static function initTreeToolbar(toolbar:Box, tree:Tree):void{
createButtonBar(toolbar, [
createButtonInfo("Reset Order", DemoImages.reset, function():void{
tree.compareFunction = null;
}),
createButtonInfo( "Ascend Order", DemoImages.ascend, function():void{
tree.compareFunction = function(d1:IData, d2:IData):int{
if(d1.name > d2.name){
return 1;
}else if(d1.name == d2.name){
return 0;
}else{
return -1;
}
};
}),
createButtonInfo("Descend Order", DemoImages.descend, function():void{
tree.compareFunction = function(d1:IData, d2:IData):int{
if(d1.name < d2.name){
return 1;
}else if(d1.name == d2.name){
return 0;
}else{
return -1;
}
};
})
], true);


createButtonBar(toolbar, [
createButtonInfo("Move Selection To Top", DemoImages.top, function():void{
tree.moveSelectionToTop();
}),
createButtonInfo( "Move Selection Up", DemoImages.up, function():void{
tree.moveSelectionUp();
}),
createButtonInfo("Move Selection Down", DemoImages.down, function():void{
tree.moveSelectionDown();
}),
createButtonInfo("Move Selection To Bottom", DemoImages.bottom, function():void{
tree.moveSelectionToBottom();
})
]);

createButtonBar(toolbar, [
createButtonInfo("Expand", DemoImages.expand, function():void{
if(tree.selectionModel.count == 1){
tree.expandData(tree.selectionModel.lastData, true);
}else{
tree.expandChildrenOf(tree.rootTreeData, true);
}
}),
createButtonInfo("Collapse", DemoImages.collapse, function():void{
if(tree.selectionModel.count == 1){
tree.collapse(tree.selectionModel.lastData, true);
}else{
tree.expandChildrenOf(tree.rootTreeData, false);
}
})]);
}

public static function initNetworkContextMenu(network:Network):void{
network.contextMenu = new ContextMenu();
network.contextMenu.hideBuiltInItems();

var handler:Function = function(e:ContextMenuEvent):void{
var i:int = 0;
var element:IElement = null;
var severity:AlarmSeverity = Utils.randomNonClearedSeverity();
var item:ContextMenuItem = ContextMenuItem(e.target);
if(item.caption == "Remove Selection"){
network.removeSelection();
}
else if(item.caption == "Random Inner Color"){
for(i=0; i<network.selectionModel.selection.count; i++){
element = network.selectionModel.selection.getItemAt(i);
if(element.getStyle(Styles.INNER_COLOR) == null){
element.setStyle(Styles.INNER_COLOR, Utils.randomColor());
}else{
element.setStyle(Styles.INNER_COLOR, null);
}
}
}
else if(item.caption == "Random Outer Color"){
for(i=0; i<network.selectionModel.selection.count; i++){
element = network.selectionModel.selection.getItemAt(i);
if(element.getStyle(Styles.OUTER_COLOR) == null){
element.setStyle(Styles.OUTER_COLOR, Utils.randomColor());
}else{
element.setStyle(Styles.OUTER_COLOR, null);
}
}
}
else{
for(i=0; i<network.selectionModel.selection.count; i++){
element = network.selectionModel.selection.getItemAt(i);
if(item.caption == "Add New Alarm"){
element.alarmState.increaseNewAlarm(severity);
}
else if(item.caption == "Add Acked Alarm"){
element.alarmState.increaseAcknowledgedAlarm(severity);
}
else{
element.alarmState.clear();
}
}
}
};

network.contextMenu.addEventListener(ContextMenuEvent.MENU_SELECT, function(e:ContextMenuEvent):void{
var p:Point = new Point(e.mouseTarget.mouseX / network.zoom, e.mouseTarget.mouseY / network.zoom);
var datas:ICollection = network.getElementsByLocalPoint(p);
if (datas.count > 0) {
network.selectionModel.setSelection(datas.getItemAt(0));
}else{
network.selectionModel.clearSelection();
}

var flexVersion:ContextMenuItem = new ContextMenuItem(DemoUtils.FLEX_SDK_VERSION, false, false);
var playerVersion:ContextMenuItem = new ContextMenuItem(DemoUtils.FLASH_PLAYER_VERSION, false, false);

if(network.selectionModel.count == 0){
network.contextMenu.customItems = [flexVersion, playerVersion];
}else{
var item1:ContextMenuItem = new ContextMenuItem("Add New Alarm", true);
item1.addEventListener(ContextMenuEvent.MENU_ITEM_SELECT, handler);
var item2:ContextMenuItem = new ContextMenuItem("Add Acked Alarm");
item2.addEventListener(ContextMenuEvent.MENU_ITEM_SELECT, handler);
var item3:ContextMenuItem = new ContextMenuItem("Clear Alarm");
item3.addEventListener(ContextMenuEvent.MENU_ITEM_SELECT, handler);

var item4:ContextMenuItem = new ContextMenuItem("Random Inner Color", true);
item4.addEventListener(ContextMenuEvent.MENU_ITEM_SELECT, handler);
var item5:ContextMenuItem = new ContextMenuItem("Random Outer Color");
item5.addEventListener(ContextMenuEvent.MENU_ITEM_SELECT, handler);

var item6:ContextMenuItem = new ContextMenuItem("Remove Selection", true);
item6.addEventListener(ContextMenuEvent.MENU_ITEM_SELECT, handler);

network.contextMenu.customItems = [flexVersion, playerVersion, item1, item2, item3, item4, item5, item6];
}
});
}

public static function createDragAndDropButtonBar(toolbar:Box, buttonInfos:Array, showLabel:Boolean = false, perWidth:int = -1, height:int = -1, format:String = "twaverformat"):ButtonBar{
var buttonBar:ButtonBar = createButtonBar(toolbar, buttonInfos, false, showLabel, perWidth, height);
buttonBar.addEventListener(MouseEvent.MOUSE_DOWN, function(e:MouseEvent):void{
if(e.target is Button){
var button:Button = e.target as Button;
var ds:DragSource = new DragSource();
ds.addData(button, format);
var dragImage:Image = null;
var w:Number = 0, h:Number = 0;
if(buttonBar.dataProvider is ArrayCollection){
var index:int = buttonBar.getChildIndex(button);
var item:* = (buttonBar.dataProvider as ArrayCollection).getItemAt(index);
if(item){
ds.addData(item, "data");
dragImage = item.dragImage as Image;
w = item.dragImageWidth;
h = item.dragImageHeight;
}
}
DragManager.doDrag(button, ds, e, dragImage, -e.localX+w/2, -e.localY+h/2);
}
});
return buttonBar;
}

public static function createButtonBar(toolbar:Box, buttonInfos:Array, isToggleButtonBar:Boolean = false, showLabel:Boolean = false, perWidth:int = -1, height:int = -1):ButtonBar{
var buttonBar:ButtonBar = isToggleButtonBar ? new ToggleButtonBar() : new ButtonBar();
buttonBar.addEventListener(ItemClickEvent.ITEM_CLICK, function(e:ItemClickEvent):void{
var button:* = e.item;
if(button.click is Function){
if((button.click as Function).length>0){
try{
button.click(e);
}catch(error:Error){
button.click();
}
}else{
button.click();
}
}
});
buttonBar.dataProvider = buttonInfos;
if(perWidth<0){
perWidth = DEFAULT_BUTTON_WIDTH;
}
if(height<0){
height = DEFAULT_BUTTON_HEIGHT;
}
if(!showLabel){
buttonBar.width = buttonInfos.length*perWidth;
}
buttonBar.height = height;
toolbar.addChild(buttonBar);
return buttonBar;
}

public static function createButtonInfo(name:String, icon:Class, click:Function):*{
return {
label:name,
icon:icon,
click:click
};
}

public static function createCreateElementButtonInfo(elementClass:Class, iconClass:Class, imageClass:Class=null, imageUrl:String=null, click:Function = null):*{
if(elementClass == null){
throw new ArgumentError("elementClass can't be null");
}
var label:* = (elementClass as Class).toString();
var result:* = {
label:label,
icon:iconClass,
click:click,
elementClass:elementClass,
type:"createElementButton",
imageUrl:imageUrl
};
imageClass = (imageClass == null ? iconClass : imageClass);
if(imageClass){
var dragImage:Image = new Image();
dragImage.mouseChildren = false;
dragImage.mouseEnabled = false;
dragImage.source = imageClass;
var bitmapData:BitmapData = new dragImage.source().bitmapData;
result.dragImageWidth = bitmapData.width;
result.dragImageHeight = bitmapData.height;
result.dragImage = dragImage;
}
return result;
}

public static function createNodeByButtonInfo(data:*):IElement{
if(data.elementClass is Class){
var node:IElement = new data.elementClass();
node.name = data.label;
if(data.imageUrl && node is Node){
(node as Node).image = data.imageUrl;
}
return node;
}
return null;
}

public static function initTreeDragAndDropListener(tree:Tree, network:Network = null, dropedFunction:Function = null):void{
tree.addEventListener(DragEvent.DRAG_ENTER,function(evt:DragEvent):void{
if(evt.dragSource.hasFormat("twaverformat")){
evt.preventDefault();
DragManager.acceptDragDrop(tree);
}
});
tree.addEventListener(DragEvent.DRAG_OVER,function(evt:DragEvent):void{
if(evt.dragSource.hasFormat("twaverformat")){
evt.preventDefault();
DragManager.acceptDragDrop(tree);
}
});
tree.addEventListener(DragEvent.DRAG_DROP,function (evt:DragEvent):void{
var data:Object = evt.dragSource.dataForFormat("data");
var dragImage:DisplayObject;
var element:IElement;
if(data){
element = DemoUtils.createNodeByButtonInfo(data);
dragImage = data.dragImage;
}else {
return;
}
var index:int = tree.calculateDropIndex(evt);
var treeData:TreeData = tree.getTreeDataByIndex(index);
if(element is Node && treeData != null && treeData.data is Group){
Node(element).centerLocation = Group(treeData.data).centerLocation;
}
tree.dataBox.add(element);
// set parent
if(treeData != null && treeData.data != null){
element.parent = treeData.data;
}else{
if(network !=null){
element.parent = network.currentSubNetwork;
}
}

if(dropedFunction!=null){
dropedFunction(element);
}
});
}

public static function initNetworkDragAndDropListener(network:Network, dropedFunction:Function = null):void{
network.addEventListener(DragEvent.DRAG_ENTER,function(evt:DragEvent):void{
if(evt.dragSource.hasFormat("twaverformat")){
DragManager.acceptDragDrop(network);
}
});
network.addEventListener(DragEvent.DRAG_DROP,function (evt:DragEvent):void{
var centerLocation:Point = network.getLogicalPoint(evt);
var element:IElement;
var data:Object = evt.dragSource.dataForFormat("data");
var dragImage:DisplayObject;
if(data){
element = DemoUtils.createNodeByButtonInfo(data);
dragImage = data.dragImage;
}else {
return;
}
if(element is Node){
Node(element).centerLocation = centerLocation;
}

// set parent
var group:Group = null;
if(element is Node && dragImage){
Node(element).centerLocation = centerLocation;
var list:ICollection = network.getElementsByDisplayObject(dragImage);
for(var i:int=0; i<list.count; i++){
group = list.getItemAt(i) as Group;
if(group != null){
break;
}
}
}
if(group != null){
element.parent = group;
}

if(dropedFunction != null){
if(dropedFunction.length == 0){
dropedFunction();
}else if(dropedFunction.length==1){
dropedFunction(element);
}else if(dropedFunction.length >1){
dropedFunction(element, evt);
}
}

network.addElementByInteraction(element);
});
}


public static function initNetworkToolbar(toolbar:Box, network:Network, interaction:String = null, showLabel:Boolean = false, perWidth:int = -1, height:int = -1):void{
toolbar.setStyle("horizontalGap", 4);
if(perWidth<0){
perWidth = DEFAULT_BUTTON_WIDTH;
}
if(height<0){
height = DEFAULT_BUTTON_HEIGHT;
}

addButton(toolbar, "Default interaction", DemoImages.select, network.setDefaultInteractionHandlers);

createButtonBar(toolbar, [
createButtonInfo("Zoom In", DemoImages.zoomIn, function():void{network.zoomIn(true);}),
createButtonInfo("Zoom Out", DemoImages.zoomOut, function():void{network.zoomOut(true);}),
createButtonInfo("Zoom Reset", DemoImages.zoomReset, function():void{network.zoomReset(true);}),
createButtonInfo("Zoom Overview", DemoImages.zoomOverview, function():void{network.zoomOverview(true);})
], false, showLabel, perWidth, height);

createButtonBar(toolbar, [
createButtonInfo("Export Image", DemoImages.export, function():void{
var fr:Object = new FileReference();
if(fr.hasOwnProperty("save")){
var bitmapData:BitmapData = network.exportAsBitmapData();
var encoder:PNGEncoder = new PNGEncoder();
var data:ByteArray = encoder.encode(bitmapData);
fr.save(data, 'network.png');
}else{
Alert.show("install Flash Player 10 to run this feature", "Not Supported");
}
}),
createButtonInfo("Save XML", DemoImages.save, function():void{
var fr:Object = new FileReference();
if(fr.hasOwnProperty("save")){
var serializer:XMLSerializer = new XMLSerializer(network.elementBox);
fr.save(serializer.serialize(), 'network.xml');
}else{
Alert.show("install Flash Player 10 to run this feature", "Not Supported");
}
}),
createButtonInfo("Open XML", DemoImages.open, function():void {
var fr:FileReference = new FileReference();
if (fr.hasOwnProperty("browse")) {
fr.addEventListener(Event.SELECT, function(e:Event):void {
fr.load();
});
fr.addEventListener(Event.COMPLETE, function(ex:Event):void {
var xmlText:String = fr.data.readUTFBytes(fr.data.length);
var serializer:XMLSerializer = new XMLSerializer(network.elementBox);
serializer.deserialize(xmlText,network.currentSubNetwork);
});
var fileFilter:FileFilter = new FileFilter("XML: (*.xml)", "*.xml");
fr.browse([fileFilter]);
} else {
Alert.show("install Flash Player 10 to run this feature", "Not Supported");
}
}),
createButtonInfo("Print...", DemoImages.print, function():void{
var printJob:FlexPrintJob = new FlexPrintJob();
if (printJob.start()){
var bitmapData:BitmapData = network.exportAsBitmapData();
var component:UIComponent = new UIComponent();
component.graphics.beginBitmapFill(bitmapData);
component.graphics.drawRect(0, 0, bitmapData.width, bitmapData.height);
component.graphics.endFill();
component.width = bitmapData.width;
component.height = bitmapData.height;
network.addChild(component);
try{
printJob.printAsBitmap = true;
printJob.addObject(component, FlexPrintJobScaleType.SHOW_ALL);
}
catch (error:*){
Alert.show(error, "Print Error");
}
printJob.send();
network.removeChild(component);
}
})

], false, showLabel, perWidth, height);

var comboBox:ComboBox = addInteractionComboBox(toolbar, network, interaction, height);
}

public static function addPrintButton(toolbar:Box, network:Network):Button{
return addButton(toolbar, "Print...", DemoImages.print, function():void{
var printJob:FlexPrintJob = new FlexPrintJob();
if (printJob.start()){
var bitmapData:BitmapData = network.exportAsBitmapData();
var component:UIComponent = new UIComponent();
component.graphics.beginBitmapFill(bitmapData);
component.graphics.drawRect(0, 0, bitmapData.width, bitmapData.height);
component.graphics.endFill();
component.width = bitmapData.width;
component.height = bitmapData.height;
network.addChild(component);
try{
printJob.printAsBitmap = true;
printJob.addObject(component, FlexPrintJobScaleType.SHOW_ALL);
}
catch (error:*){
Alert.show(error, "Print Error");
}
printJob.send();
network.removeChild(component);
}
});
}

public static function addExportButton(toolbar:Box, network:Network):void{
addButton(toolbar, "Export Image", DemoImages.export, function():void{
var fr:Object = new FileReference();
if(fr.hasOwnProperty("save")){
var bitmapData:BitmapData = network.exportAsBitmapData();
var encoder:PNGEncoder = new PNGEncoder();
var data:ByteArray = encoder.encode(bitmapData);
fr.save(data, 'network.png');
}else{
Alert.show("install Flash Player 10 to run this feature", "Not Supported");
}
});
addButton(toolbar, "Save XML", DemoImages.save, function():void{
var fr:Object = new FileReference();
if(fr.hasOwnProperty("save")){
var serializer:XMLSerializer = new XMLSerializer(network.elementBox);
fr.save(serializer.serialize(), 'network.xml');
}else{
Alert.show("install Flash Player 10 to run this feature", "Not Supported");
}
});
addButton(toolbar, "Open XML", DemoImages.open, function():void{
var fr:* = new FileReference();
if (fr.hasOwnProperty("browse")) {
fr.addEventListener(Event.SELECT, function(e:Event):void {
fr.load();
});
fr.addEventListener(Event.COMPLETE, function(ex:Event):void {
var xmlText:String = fr.data.readUTFBytes(fr.data.length);
var serializer:XMLSerializer = new XMLSerializer(network.elementBox);
serializer.deserialize(xmlText,network.currentSubNetwork);
});
var fileFilter:FileFilter = new FileFilter("XML: (*.xml)", "*.xml");
fr.browse([fileFilter]);
} else {
Alert.show("install Flash Player 10 to run this feature", "Not Supported");
}
});
}

public static function addInteractionComboBox(toolbar:Box, network:Network, interaction:String = null, height:int = -1):ComboBox{
var comboBox:ComboBox = new ComboBox();
toolbar.addChild(comboBox);
comboBox.dataProvider = ["Default-Live", "Default-Lazy", "Edit-Live", "Edit-Lazy", "FishEye", "Magnify", "Pan", "None"];
comboBox.addEventListener(ListEvent.CHANGE, function(e:Event = null):void{
var type:String = String(comboBox.selectedItem);
if(type == "Default-Live"){
network.setDefaultInteractionHandlers();
}
else if(type == "Default-Lazy"){
network.setDefaultInteractionHandlers(true);
}
else if(type == "Edit-Live"){
network.setEditInteractionHandlers();
}
else if(type == "Edit-Lazy"){
network.setEditInteractionHandlers(true);
}
else if(type == "FishEye"){
network.interactionHandlers = new Collection([
new SelectInteractionHandler(network),
new EditInteractionHandler(network),
new MoveInteractionHandler(network),
new DefaultInteractionHandler(network),
new MapFilterInteractionHandler(network),
]);
}
else if(type == "Magnify"){
network.interactionHandlers = new Collection([
new SelectInteractionHandler(network),
new EditInteractionHandler(network),
new MoveInteractionHandler(network),
new DefaultInteractionHandler(network),
new MapFilterInteractionHandler(network, Consts.MAP_FILTER_MAGNIFY),
]);
}
else if(type == "Pan"){
network.setPanInteractionHandlers();
}
else if(type == "None"){
network.interactionHandlers = null;
}
});
if(interaction != null){
comboBox.selectedItem = interaction;
comboBox.dispatchEvent(new ListEvent("change"));
}
if(height<=0){
height = DemoUtils.DEFAULT_BUTTON_HEIGHT;
}
comboBox.height = height;
return comboBox;
}

public static function randomAlarm(alarmID:Object = null, elementID:Object = null, nonClearedSeverity:Boolean = false):IAlarm{
var alarm:IAlarm = new Alarm(alarmID, elementID);
alarm.acked = Utils.randomBoolean();
alarm.cleared = Utils.randomBoolean();
alarm.alarmSeverity = nonClearedSeverity ? Utils.randomNonClearedSeverity() : Utils.randomSeverity();
alarm.setClient("raisedTime", new Date());
return alarm;
}

public static function getConstsByPrefix(prefix:String):Array{
var name:String;
var array:Array = new Array();
var classInfo:XML = describeType(Consts);
for each (var v:XML in classInfo..constant){
name = String(v.@name);
if(name.indexOf(prefix) == 0){
array.splice(array.length, 0, name);
}
}
array.sort();
for(var i:int=0; i<array.length; i++){
name = array[i];
array[i] = Consts[name];
}
return array;
}

private static function addAnimateProperty(effect:CompositeEffect, property:String, toValue:Number, isStyle:Boolean = true):AnimateProperty{
var animateProperty:AnimateProperty = new AnimateProperty();
animateProperty.isStyle = isStyle;
animateProperty.property = property;
animateProperty.toValue = toValue;
effect.addChild(animateProperty);
return animateProperty;
}

public static function addOverview(network:Network):void{
var show:Parallel = new Parallel();
show.duration = 250;
addAnimateProperty(show, "alpha", 1, false);
addAnimateProperty(show, "width", 100, false);
addAnimateProperty(show, "height", 100, false);

var hide:Parallel = new Parallel();
hide.duration = 250;
addAnimateProperty(hide, "alpha", 0, false);
addAnimateProperty(hide, "width", 0, false);
addAnimateProperty(hide, "height", 0, false);

var overview:Overview = new Overview();
overview.visible = false;
overview.width = 0;
overview.height = 0;
overview.backgroundColor = 0xFFFFFF;
overview.backgroundAlpha = 1;
overview.setStyle("right", 17);
overview.setStyle("bottom", 17);
overview.setStyle("showEffect", show);
overview.setStyle("hideEffect", hide);

var toggler:Button = new Button();
toggler.width = 17;
toggler.height = 17;
toggler.setStyle("right", 0);
toggler.setStyle("bottom", 0);
toggler.setStyle("icon", DemoImages.show);
toggler.addEventListener(MouseEvent.CLICK, function(e:*):void{
if(toggler.getStyle("icon") == DemoImages.show){
toggler.setStyle("icon", DemoImages.hide);
overview.network = network;
overview.visible = true;
}else{
toggler.setStyle("icon", DemoImages.show);
overview.visible = false
}
});
hide.addEventListener(EffectEvent.EFFECT_END, function(e:*):void{
overview.network = null;
});
network.parent.addChild(overview);
network.parent.addChild(toggler);
}

}

}


[/code]
發佈了31 篇原創文章 · 獲贊 1 · 訪問量 1022
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章