<?xml version="1.0" encoding="utf-8"?>
<mx:Canvas xmlns:mx="http://www.adobe.com/2006/mxml" mouseDown="StartDrag(event);" mouseUp="DragStop();" dragOver="dragEnterHandler(event);" dragEnter="dragEnterHandler(event);" dragDrop="addCompononet(event);" >
<mx:Canvas id="thisComponentContainer" width="100%" height="100%"/>
<mx:Canvas id="clickInterceptor" width="100%" height="100%" backgroundColor="#000000" backgroundAlpha="0"/>
<mx:Canvas id="childrenContainer" left="{leftMargin}" right="{rightMargin}" top="{topMargin}" bottom="{bottomMargin}"/>
<mx:Script source="componentsDeclarations.as"/>
<mx:Script>
<![CDATA[
import flash.events.MouseEvent;
import mx.collections.ArrayCollection;
import mx.events.DragEvent;
import mx.events.FlexEvent;
import mx.core.UIComponent;
import flash.utils.getDefinitionByName;
import mx.core.DragSource;
import mx.managers.DragManager;
import mx.managers.PopUpManager;
import mx.utils.*;
public var thisComponent:UIComponent;
public var thisClassName:String;
public var isRoot:Boolean = false;
public var isDisplayObject:Boolean = true;
public var childrenArray:Array = new Array();
public var parentObject:Object;
public var thisIndex:String;
private var SelectedBorderColor:uint = 0x00FFFF;
private var DefaultBorderColor:uint = 0xFFFFFF;
private var _width:String = new String();
private var _height:String = new String();
private var _x:String = new String();
private var _y:String = new String();
private var _left:String = new String();
private var _right:String = new String();
private var _top:String = new String();
private var _bottom:String = new String();
private var _horizontalCenter:String = new String();
private var _verticalCenter:String = new String();
[Bindable]
public var leftMargin:int = new int(0);
[Bindable]
public var rightMargin:int = new int(0);
[Bindable]
public var topMargin:int = new int(0);
[Bindable]
public var bottomMargin:int = new int(0);
private var alwaysHighlight:Boolean = false;
public var nodeText:String = new String();
[Bindable]
public var commonArray:ArrayCollection;
[Bindable]
public var styleArray:ArrayCollection;
[Bindable]
public var layoutArray:ArrayCollection;
[Bindable]
public var propertiesArray:ArrayCollection;
[Bindable]
public var eventsArray:ArrayCollection;
private var acceptChildren:Boolean = false;
public function InitComp(componentClassName:String, _properties:XMLList, highlight:String, resetDefaults:Boolean, parentObj:Object, skipOutlineRebuild:Boolean, layoutMargins:String, _acceptChildren:String):void {
try {
parentObject = parentObj;
if (_acceptChildren == "true") {
acceptChildren = true;
}
if (highlight == "true") {
alwaysHighlight = true;
this.clickInterceptor.setStyle("borderStyle", "solid");
this.clickInterceptor.setStyle("borderColor", DefaultBorderColor);
}
var layoutMarginsArray:Array = layoutMargins.split(";");
leftMargin = Number(layoutMarginsArray[0]);
rightMargin = Number(layoutMarginsArray[1]);
topMargin = Number(layoutMarginsArray[2]);
bottomMargin = Number(layoutMarginsArray[3]);
this.parentApplication.selectedClassName = thisClassName = componentClassName;
var ClassReference:Class = getDefinitionByName(componentClassName) as Class;
thisComponent = new ClassReference();
thisComponentContainer.addChild(thisComponent);
parentObject.childrenArray.push(this);
if (!skipOutlineRebuild) {
this.parentApplication.BuildOutline();
}
thisComponent.setStyle("left", 0);
thisComponent.setStyle("right", 0);
thisComponent.setStyle("top", 0);
thisComponent.setStyle("bottom", 0);
var marginsArray:Array = layoutMargins.split(";");
leftMargin = marginsArray[0];
rightMargin = marginsArray[1];
topMargin = marginsArray[2];
bottomMargin = marginsArray[3];
for (var _node:Object in _properties) {
var _nodeName:String = _properties[_node].name();
var name:String;
var value:String;
switch (_nodeName) {
case "common":
commonArray = new ArrayCollection();
var _commonAttr:XMLList = _properties[_node].attributes();
for (var ic:int = 0; ic < _commonAttr.length(); ic++) {
name = _commonAttr[ic].name();
if (resetDefaults) {
value = "";
} else {
value = _properties[_node].@[_commonAttr[ic].name()];
}
commonArray.addItem( { name:name, value:value } );
if (value != "") {
SetCommon(name, value);
}
}
break;
case "style":
styleArray = new ArrayCollection();
var _styleAttr:XMLList = _properties[_node].attributes();
for (var iis:int = 0; iis < _styleAttr.length(); iis++) {
name = _styleAttr[iis].name();
if (resetDefaults) {
value = "";
} else {
value = _properties[_node].@[_styleAttr[iis].name()];
}
styleArray.addItem( { name:name, value:value } );
if (value != "") {
SetStyle(name, value);
}
}
break;
case "layout":
layoutArray = new ArrayCollection();
var _layoutAttr:XMLList = _properties[_node].attributes();
for (var il:int = 0; il < _layoutAttr.length(); il++) {
name = _layoutAttr[il].name();
value = _properties[_node].@[_layoutAttr[il].name()];
layoutArray.addItem( { name:name, value:value } );
checkConstraints(name, value);
//name = _layoutAttr[il].name();
//if (resetDefaults) {
//value = "";
//} else {
//value = _properties[_node].@[_layoutAttr[il].name()];
//}
//layoutArray.addItem( { name:name, value:value } );
//if (value != "") {
//checkConstraints(name, value);
//}
}
break;
case "properties":
propertiesArray = new ArrayCollection();
var _propAttr:XMLList = _properties[_node].attributes();
for (var ip:int = 0; ip < _propAttr.length(); ip++) {
name = _propAttr[ip].name();
if (resetDefaults) {
value = "";
} else {
value = _properties[_node].@[_propAttr[ip].name()];
}
propertiesArray.addItem({name:name, value:value});
}
break;
case "events":
eventsArray = new ArrayCollection();
var _eventsAttr:XMLList = _properties[_node].attributes();
for (var iv:int = 0; iv < _eventsAttr.length(); iv++) {
name = _eventsAttr[iv].name();
if (resetDefaults) {
value = "";
} else {
value = _properties[_node].@[_eventsAttr[iv].name()];
}
eventsArray.addItem({name:name, value:value});
}
break;
case "children":
// @todo: parse default children here
break;
}
}
if (!resetDefaults) {
_x = "0";
_y = "0";
}
} catch (e:Error) {
var Message:message = message(PopUpManager.createPopUp(this, message, true));
Message.setStyle("borderAlpha", 0.8);
Message.title_text = "Error";
Message.message_text = "\n" + e.message;
}
}
private function StartDrag(event:MouseEvent):void {
if (event.target.parent == this) {
Select();
checkConstraints("width", _width);
checkConstraints("height", _height);
this.startDrag();
}
}
private function DragStop():void {
this.stopDrag();
UpdateCoordAfterDragOrSelect();
}
public function UpdateCoordAfterDragOrSelect():void {
var coord:Point = this.parentApplication.localToGlobal(new Point(this.x, this.y));
var __pwidth:int = this.parent.width;
var __pheight:int = this.parent.height;
var __width:int = this.width;
var __height:int = this.height;
if (_x != "") {
checkConstraints("x", (coord.x + 1).toString());
} else {
if (_horizontalCenter == "") {
if (_left != "") {
checkConstraints("left", (coord.x + 1).toString());
}
if (_right != "") {
checkConstraints("right", (__pwidth - __width - coord.x + 1).toString());
}
} else {
checkConstraints("horizontalCenter", (- __pwidth/2 + __width/2 + coord.x).toString());
}
}
if (_y != "") {
checkConstraints("y", (coord.y + 1).toString());
} else {
if (_verticalCenter == "") {
if (_top != "") {
checkConstraints("top", (coord.y + 1).toString());
}
if (_bottom != "") {
checkConstraints("bottom", (__pheight - __height - coord.y + 1).toString());
}
} else {
checkConstraints("verticalCenter", (- __pheight/2 + __height/2 + coord.y).toString());
}
}
layoutArray.refresh();
}
public function Select():void {
var previouslySelected:Object = this.parentApplication.selectedComponent;
if (previouslySelected != this) {
if (this.parentApplication.selectedComponent != null && this.parentApplication.selectedComponent != undefined) {
this.parentApplication.selectedComponent.Deselect();
}
this.parentApplication.selectedComponent = this;
this.parentApplication.selectedClassName = thisClassName;
this.clickInterceptor.setStyle("borderStyle", "solid");
this.clickInterceptor.setStyle("borderColor", SelectedBorderColor);
UpdateCoordAfterDragOrSelect();
}
}
public function Deselect():void {
if (alwaysHighlight) {
this.clickInterceptor.setStyle("borderColor", DefaultBorderColor);
} else {
this.clickInterceptor.setStyle("borderStyle", "none");
}
}
public function SetCommon(name:String, value:String):void {
if (name != "enabled" && value.indexOf("{") < 0 && value.indexOf("}") < 0 && value.indexOf("[") < 0 && value.indexOf("]") < 0) {
try {
thisComponent[name] = value;
} catch (e:Error) {
try {
thisComponent.setStyle(name, value);
thisComponent.validateNow();
} catch (ee:Error) {
var Message:message = message(PopUpManager.createPopUp(this, message, true));
Message.setStyle("borderAlpha", 0.8);
Message.title_text = "Error";
Message.message_text = "\n" + e.message + "\n\n" + ee.message;
value = "";
}
}
}
callLater(RawSet, [name, value]);
}
public function SetStyle(name:String, value:String):void {
if (name != "icon" && value.indexOf("{") < 0 && value.indexOf("}") < 0 && value.indexOf("[") < 0 && value.indexOf("]") < 0) {
try {
thisComponent[name] = value;
} catch (e:Error) {
try {
thisComponent.setStyle(name, value);
thisComponent.validateNow();
} catch (ee:Error) {
var Message:message = message(PopUpManager.createPopUp(this, message, true));
Message.setStyle("borderAlpha", 0.8);
Message.title_text = "Error";
Message.message_text = "\n" + e.message + "\n\n" + ee.message;
value = "";
}
}
}
callLater(RawSet, [name, value]);
}
public function checkConstraints(name:String, value:String):void {
value = StringUtil.trim(value);
if (this["_" + name] != value) {
var __coord:Point = this.parentApplication.localToGlobal(new Point(this.x, this.y));
var __x:String = (__coord.x + 1).toString();
var __y:String = (__coord.y + 1).toString();
var __width:String = this.width.toString();
var __height:String = this.height.toString();
switch (name) {
case "x":
if (value != "" ) {
if (_horizontalCenter != "") {
SetCoordPropValue("horizontalCenter", "");
}
if (_left != "") {
SetCoordPropValue("left", "");
}
if (_right != "") {
SetCoordPropValue("right", "");
}
if (_width.indexOf("%") < 0) {
SetCoordPropValue("width", __width);
}
} else {
SetCoordPropValue("left", __x);
}
SetCoordPropValue("x", value);
break;
case "y":
if (value != "" ) {
if (_verticalCenter != "") {
SetCoordPropValue("verticalCenter", "");
}
if (_top != "") {
SetCoordPropValue("top", "");
}
if (_bottom != "") {
SetCoordPropValue("bottom", "");
}
if (_height.indexOf("%") < 0) {
SetCoordPropValue("height", __height);
}
} else {
SetCoordPropValue("top", __y);
}
SetCoordPropValue("y", value);
break;
case "left":
if (value != "") {
if (_x != "") {
SetCoordPropValue("x", "");
}
if (_right != "") {
SetCoordPropValue("width", "");
}
if (_horizontalCenter != "") {
SetCoordPropValue("horizontalCenter", "");
}
} else {
if (_right != "") {
SetCoordPropValue("width", __width);
} else {
SetCoordPropValue("x", __x);
}
}
SetCoordPropValue("left", value);
break;
case "right":
if (value != "") {
if (_x != "") {
SetCoordPropValue("x", "");
}
if (_left != "") {
SetCoordPropValue("width", "");
}
if (_horizontalCenter != "") {
SetCoordPropValue("horizontalCenter", "");
}
} else {
if (_left != "") {
SetCoordPropValue("width", __width);
} else {
SetCoordPropValue("x", __x);
}
}
SetCoordPropValue("right", value);
break;
case "top":
if (value != "" ) {
if (_y != "") {
SetCoordPropValue("y", "");
}
if (_bottom != "") {
SetCoordPropValue("height", "");
}
if (_verticalCenter != "") {
SetCoordPropValue("verticalCenter", "");
}
} else {
if (_bottom != "") {
SetCoordPropValue("height", __height);
} else {
SetCoordPropValue("y", __y);
}
}
SetCoordPropValue("top", value);
break;
case "bottom":
if (value != "" ) {
if (_y != "") {
SetCoordPropValue("y", "");
}
if (_top != "") {
SetCoordPropValue("height", "");
}
if (_verticalCenter != "") {
SetCoordPropValue("verticalCenter", "");
}
} else {
if (_top != "") {
SetCoordPropValue("height", __height);
} else {
SetCoordPropValue("y", __y);
}
}
SetCoordPropValue("bottom", value);
break;
case "width":
if (value != "" ) {
if (_left != "" && _right != "") {
SetCoordPropValue("right", "");
}
}
SetCoordPropValue("width", value);
break;
case "height":
if (value != "" ) {
if (_top != "" && _bottom != "") {
SetCoordPropValue("bottom", "");
}
}
SetCoordPropValue("height", value);
break;
case "horizontalCenter":
if (value != "" ) {
if (_x != "") {
SetCoordPropValue("x", "");
}
if (_left != "") {
SetCoordPropValue("left", "");
}
if (_right != "") {
SetCoordPropValue("right", "");
}
SetCoordPropValue("horizontalCenter", value);
SetCoordPropValue("width", __width);
} else {
SetCoordPropValue("x", __x);
}
break;
case "verticalCenter":
if (value != "" ) {
if (_y != "") {
SetCoordPropValue("y", "");
}
if (_top != "") {
SetCoordPropValue("top", "");
}
if (_bottom != "") {
SetCoordPropValue("bottom", "");
}
SetCoordPropValue("verticalCenter", value);
SetCoordPropValue("height", __height);
} else {
SetCoordPropValue("y", __y);
}
break;
}
}
layoutArray.refresh();
}
private function SetCoordPropValue(name:String, value:String):void {
this["_" + name] = value;
if (value == null) {
value = "";
}
switch (name) {
case "x":
case "y":
if (value != "" && !isNaN(Number(value))) {
try {
this[name] = Number(value) - 1;
} catch (e1:Error) {
}
} else {
try {
this[name] = "";
} catch (e2:Error) {
}
}
break;
case "left":
case "right":
case "top":
case "bottom":
if (value != "" && !isNaN(Number(value))) {
try {
this.setStyle(name, Number(value) - 1);
} catch (e3:Error) {
}
} else {
try {
this.setStyle(name, "");
} catch (e4:Error) {
}
}
break;
case "width":
case "height":
if (value != "" && !isNaN(Number(value))) {
try {
this[name] = Number(value);
} catch (e5:Error) {
}
} else {
try {
if (value.indexOf("%") > 0) {
var _value:Number;
if (parentObject != this.parentApplication) {
_value = (parentObject[name] + 1) * Number(value.substr(0, value.length - 1)) / 100;
} else {
_value = (this.parent[name] + 1) * Number(value.substr(0, value.length - 1)) / 100;
}
this[name] = _value;
}
} catch (e6:Error) {
this[name] = "";
}
}
break;
case "horizontalCenter":
case "verticalCenter":
if (value != "" && !isNaN(Number(value))) {
try {
this.setStyle(name, Number(value));
} catch (e7:Error) {
}
} else {
try {
this.setStyle(name, "");
} catch (e8:Error) {
}
}
break;
}
for (var i:int = 0; i < layoutArray.length; i++) {
if (layoutArray[i]['name'] == name) {
layoutArray[i]['value'] = value;
break;
}
}
}
public function RawSet(name:String, value:String):void {
var keepSearch:Boolean = true;
var keepSearch2:Boolean = true;
for (var ic:int = 0; ic < commonArray.length; ic++) {
if (commonArray[ic]['name'] == name) {
commonArray[ic]['value'] = value;
keepSearch = false;
commonArray.refresh();
UpdateCommon();
break;
}
}
if (keepSearch) {
for (var ist:int = 0; ist < styleArray.length; ist++) {
if (styleArray[ist]['name'] == name) {
styleArray[ist]['value'] = value;
keepSearch = false;
styleArray.refresh();
UpdateCommon();
break;
}
}
if (keepSearch) {
for (var il:int = 0; il < layoutArray.length; il++) {
if (layoutArray[il]['name'] == name) {
layoutArray[il]['value'] = value;
keepSearch = false;
layoutArray.refresh();
//SetCoordPropValue(name, value);
checkConstraints(name, value);
break;
}
}
}
}
for (var ip:int = 0; ip < propertiesArray.length; ip++) {
if (propertiesArray[ip]['name'] == name) {
propertiesArray[ip]['value'] = value;
keepSearch2 = false;
propertiesArray.refresh();
break;
}
}
if (keepSearch2) {
for (var ie:int = 0; ie < eventsArray.length; ie++) {
if (eventsArray[ie]['name'] == name) {
eventsArray[ie]['value'] = value;
keepSearch2 = false;
eventsArray.refresh();
break;
}
}
}
if (keepSearch && keepSearch2) {
propertiesArray.addItem({name:name, value:value});
}
function UpdateCommon():void {
if (value != "" && value != null && name != "enabled" && name != "icon" && value.indexOf("{") < 0 && value.indexOf("}") < 0 && value.indexOf("[") < 0 && value.indexOf("]") < 0) {
try {
thisComponent[name] = value;
} catch (e:Error) {
try {
thisComponent.setStyle(name, value);
} catch (ee:Error) {
}
}
}
}
}
private function dragEnterHandler(event:DragEvent):void {
if (this.parentApplication.ComponentsTree.selectedItem.@className != undefined && acceptChildren) {
DragManager.acceptDragDrop(Canvas(event.currentTarget));
}
}
private function addCompononet(event:DragEvent):void {
var _className:String = this.parentApplication.ComponentsTree.selectedItem.@className;
var _properties:XMLList = this.parentApplication.ComponentsData.node.node.(@className == _className).children();
var _highlight:String = this.parentApplication.ComponentsTree.selectedItem.@highlight;
var _layoutMargins:String = this.parentApplication.ComponentsTree.selectedItem.@layoutMargins;
var _acceptChildren:String = this.parentApplication.ComponentsTree.selectedItem.@acceptChildren;
var This:Object = this;
var comp:componentClass = new componentClass();
this.childrenContainer.addChild(comp);
callLater(UpdateCoord);
function UpdateCoord():void {
comp.InitComp(_className, _properties, _highlight, false, This, false, _layoutMargins, _acceptChildren);
comp.x = This.childrenContainer.mouseX;
comp.y = This.childrenContainer.mouseY;
comp.Select();
}
}
public function synchronizePropsAndEventsWithCommon():void {
var name:String;
var value:String;
var keepSearch:Boolean;
var i:int;
var ie:int;
var ip:int;
for (i = 0; i < commonArray.length; i++) {
name = commonArray[i]['name'];
value = commonArray[i]['value'];
if (value != "") {
keepSearch = true;
} else {
keepSearch = false;
}
if (keepSearch) {
for (ip = 0; ip < propertiesArray.length; ip++) {
if (propertiesArray[ip]['name'] == name) {
propertiesArray[ip]['value'] = value;
keepSearch = false;
break;
}
}
}
if (keepSearch) {
for (ie = 0; ie < eventsArray.length; ie++) {
if (eventsArray[ie]['name'] == name) {
eventsArray[ie]['value'] = value;
break;
}
}
}
}
for (i = 0; i < styleArray.length; i++) {
name = styleArray[i]['name'];
value = styleArray[i]['value'];
if (value != "") {
keepSearch = true;
} else {
keepSearch = false;
}
if (keepSearch) {
for (ip = 0; ip < propertiesArray.length; ip++) {
if (propertiesArray[ip]['name'] == name) {
propertiesArray[ip]['value'] = value;
keepSearch = false;
break;
}
}
}
if (keepSearch) {
for (ie = 0; ie < eventsArray.length; ie++) {
if (eventsArray[ie]['name'] == name) {
eventsArray[ie]['value'] = value;
break;
}
}
}
}
for (i = 0; i < layoutArray.length; i++) {
name = layoutArray[i]['name'];
value = layoutArray[i]['value'];
if (value != "") {
keepSearch = true;
} else {
keepSearch = false;
}
if (keepSearch) {
for (ip = 0; ip < propertiesArray.length; ip++) {
if (propertiesArray[ip]['name'] == name) {
propertiesArray[ip]['value'] = value;
keepSearch = false;
break;
}
}
}
if (keepSearch) {
for (ie = 0; ie < eventsArray.length; ie++) {
if (eventsArray[ie]['name'] == name) {
eventsArray[ie]['value'] = value;
break;
}
}
}
}
propertiesArray.refresh();
eventsArray.refresh();
}
]]>
</mx:Script>
</mx:Canvas>