You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@flex.apache.org by pe...@apache.org on 2014/03/19 22:09:48 UTC

git commit: [flex-asjs] [refs/heads/develop] - Changes to the SDK, mostly on the JavaScript side, to connect display parent chain using get_parent(). Included changes to enable pop-ups via UIUtils class. Added format bead support to JavaScript side of SD

Repository: flex-asjs
Updated Branches:
  refs/heads/develop 2d0d52a97 -> 02420b9a3


Changes to the SDK, mostly on the JavaScript side, to connect display parent chain using get_parent(). Included changes to enable pop-ups via UIUtils class. Added format bead support to JavaScript side of SDK.


Project: http://git-wip-us.apache.org/repos/asf/flex-asjs/repo
Commit: http://git-wip-us.apache.org/repos/asf/flex-asjs/commit/02420b9a
Tree: http://git-wip-us.apache.org/repos/asf/flex-asjs/tree/02420b9a
Diff: http://git-wip-us.apache.org/repos/asf/flex-asjs/diff/02420b9a

Branch: refs/heads/develop
Commit: 02420b9a37e27ea79f9264f78f309651c14333f5
Parents: 2d0d52a
Author: Peter Ent <pe...@apache.org>
Authored: Wed Mar 19 17:09:35 2014 -0400
Committer: Peter Ent <pe...@apache.org>
Committed: Wed Mar 19 17:09:35 2014 -0400

----------------------------------------------------------------------
 .../src/org/apache/flex/core/PopUpManager.as    | 94 --------------------
 .../apache/flex/utils/MXMLDataInterpreter.as    |  6 +-
 .../src/org/apache/flex/utils/UIUtils.as        | 43 +++++++++
 .../src/org/apache/flex/core/IFormatBead.js     | 71 +++++++++++++++
 .../FlexJS/src/org/apache/flex/core/IParent.js  | 67 ++++++++++++++
 .../src/org/apache/flex/core/IPopUpHost.js      | 43 +++++++++
 .../FlexJS/src/org/apache/flex/core/ListBase.js |  1 +
 .../FlexJS/src/org/apache/flex/core/UIBase.js   | 12 +++
 .../FlexJS/src/org/apache/flex/core/ViewBase.js |  6 +-
 .../apache/flex/html/staticControls/Label.js    |  1 +
 .../apache/flex/html/staticControls/Panel.js    |  1 +
 .../supportClasses/NonVirtualDataGroup.js       |  8 +-
 .../apache/flex/utils/MXMLDataInterpreter.js    |  9 +-
 .../FlexJS/src/org/apache/flex/utils/UIUtils.js | 40 ++++++++-
 14 files changed, 299 insertions(+), 103 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/flex-asjs/blob/02420b9a/frameworks/as/projects/FlexJSUI/src/org/apache/flex/core/PopUpManager.as
----------------------------------------------------------------------
diff --git a/frameworks/as/projects/FlexJSUI/src/org/apache/flex/core/PopUpManager.as b/frameworks/as/projects/FlexJSUI/src/org/apache/flex/core/PopUpManager.as
deleted file mode 100644
index ad24f41..0000000
--- a/frameworks/as/projects/FlexJSUI/src/org/apache/flex/core/PopUpManager.as
+++ /dev/null
@@ -1,94 +0,0 @@
-////////////////////////////////////////////////////////////////////////////////
-//
-//  Licensed to the Apache Software Foundation (ASF) under one or more
-//  contributor license agreements.  See the NOTICE file distributed with
-//  this work for additional information regarding copyright ownership.
-//  The ASF licenses this file to You under the Apache License, Version 2.0
-//  (the "License"); you may not use this file except in compliance with
-//  the License.  You may obtain a copy of the License at
-//
-//      http://www.apache.org/licenses/LICENSE-2.0
-//
-//  Unless required by applicable law or agreed to in writing, software
-//  distributed under the License is distributed on an "AS IS" BASIS,
-//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-//  See the License for the specific language governing permissions and
-//  limitations under the License.
-//
-////////////////////////////////////////////////////////////////////////////////
-package org.apache.flex.core
-{
-    import flash.display.DisplayObject;
-    import flash.display.DisplayObjectContainer;
-    import flash.events.Event;
-
-    /**
-     *  The PopUpManager ensures that children that implement the
-     *  IPopUp interface are layered over the other children.  Unlike
-     *  the Flex SDK, where the PopUpManager had APIs that you had to
-     *  use to add popups to the display list, this PopUpManager
-     *  monitors the children in a container.  It assumes that no
-     *  other container will obscure the container it is monitoring.
-     *  A more sophisticated PopUpManager could handle such a 
-     *  scenario, but most folks don't have overlapping top-level
-     *  "windows" in their user interfaces any more so a simpler
-     *  implementation will suffice for most applications.
-     *  
-     *  @langversion 3.0
-     *  @playerversion Flash 10.2
-     *  @playerversion AIR 2.6
-     *  @productversion FlexJS 0.0
-     */
-	public class PopUpManager implements IDocument
-	{
-        /**
-         *  Constructor.
-         *  
-         *  @langversion 3.0
-         *  @playerversion Flash 10.2
-         *  @playerversion AIR 2.6
-         *  @productversion FlexJS 0.0
-         */
-        public function PopUpManager()
-		{
-		}
-
-        private var document:DisplayObjectContainer;
-        
-        /**
-         *  @copy org.apache.flex.core.IDocument#setDocument()
-         *  
-         *  @langversion 3.0
-         *  @playerversion Flash 10.2
-         *  @playerversion AIR 2.6
-         *  @productversion FlexJS 0.0
-         */
-        public function setDocument(document:Object, id:String = null):void
-        {
-            this.document = document as DisplayObjectContainer;
-            this.document.addEventListener(Event.ADDED, addedHandler);
-        }
-        
-        private function addedHandler(event:Event):void
-        {
-            if (event.target != document)
-                return;
-
-            var n:int = document.numChildren;
-            var lastPopUp:int = n - 1;
-            
-            for (var i:int = n - 1; i >= 0; i--)
-            {
-                var child:DisplayObject = document.getChildAt(n);
-                if (child is IPopUp)
-                {
-                    if (i < lastPopUp)
-                    {
-                        document.setChildIndex(child, lastPopUp);
-                        lastPopUp--;
-                    }
-                }
-            }
-        }
-	}
-}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/flex-asjs/blob/02420b9a/frameworks/as/projects/FlexJSUI/src/org/apache/flex/utils/MXMLDataInterpreter.as
----------------------------------------------------------------------
diff --git a/frameworks/as/projects/FlexJSUI/src/org/apache/flex/utils/MXMLDataInterpreter.as b/frameworks/as/projects/FlexJSUI/src/org/apache/flex/utils/MXMLDataInterpreter.as
index 577690d..ec96f89 100644
--- a/frameworks/as/projects/FlexJSUI/src/org/apache/flex/utils/MXMLDataInterpreter.as
+++ b/frameworks/as/projects/FlexJSUI/src/org/apache/flex/utils/MXMLDataInterpreter.as
@@ -365,9 +365,9 @@ public class MXMLDataInterpreter
                 bead.strand = host as IStrand;
             }
 			
-			if (l>0) {
-				IEventDispatcher(host).dispatchEvent(new Event("beadsAdded"));
-			}
+//			if (l>0) {
+//				IEventDispatcher(host).dispatchEvent(new Event("beadsAdded"));
+//			}
         }
         m = data[i++]; // num styles
         for (j = 0; j < m; j++)

http://git-wip-us.apache.org/repos/asf/flex-asjs/blob/02420b9a/frameworks/as/projects/FlexJSUI/src/org/apache/flex/utils/UIUtils.as
----------------------------------------------------------------------
diff --git a/frameworks/as/projects/FlexJSUI/src/org/apache/flex/utils/UIUtils.as b/frameworks/as/projects/FlexJSUI/src/org/apache/flex/utils/UIUtils.as
index a812b60..e05e2b6 100644
--- a/frameworks/as/projects/FlexJSUI/src/org/apache/flex/utils/UIUtils.as
+++ b/frameworks/as/projects/FlexJSUI/src/org/apache/flex/utils/UIUtils.as
@@ -18,6 +18,7 @@
 ////////////////////////////////////////////////////////////////////////////////
 package org.apache.flex.utils
 {
+	import org.apache.flex.core.IPopUpHost;
 	import org.apache.flex.core.UIBase;
 
 	/**
@@ -42,6 +43,9 @@ package org.apache.flex.utils
 		/**
 		 *  Centers the given item relative to another item. Typically the item being centered is
 		 *  a child or sibling of the second item. 
+		 * 
+		 *  @param item The component item being centered.
+		 *  @param relativeTo The component used as reference for the centering.
 		 *  
 		 *  @langversion 3.0
 		 *  @playerversion Flash 10.2
@@ -56,5 +60,44 @@ package org.apache.flex.utils
 			item.x = xpos;
 			item.y = ypos;
 		}
+		
+		/**
+		 *  Given a component starting point, this function walks up the parent chain
+		 *  looking for a component that implements the IPopUpHost interface. The function
+		 *  either returns that component or null if no IPopUpHost can be found. 
+		 * 
+		 *  @param start A component to start the search.
+		 *  @return A component that implements IPopUpHost or null.
+		 *  
+		 *  @langversion 3.0
+		 *  @playerversion Flash 10.2
+		 *  @playerversion AIR 2.6
+		 *  @productversion FlexJS 0.0
+		 */
+		public static function findPopUpHost(start:UIBase):IPopUpHost
+		{
+			while( start != null && !(start is IPopUpHost) ) {
+				start = start.parent as UIBase;
+			}
+			
+			return start as IPopUpHost;
+		}
+		
+		/**
+		 *  Removes the given component from the IPopUpHost. 
+		 * 
+		 *  @param start A component to start the search.
+		 *  @return A component that implements IPopUpHost or null.
+		 *  
+		 *  @langversion 3.0
+		 *  @playerversion Flash 10.2
+		 *  @playerversion AIR 2.6
+		 *  @productversion FlexJS 0.0
+		 */
+		public static function removePopUp(popUp:UIBase):void
+		{
+			var host:IPopUpHost = popUp.parent as IPopUpHost;
+			host.removeElement(popUp);
+		}
 	}
 }
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/flex-asjs/blob/02420b9a/frameworks/js/FlexJS/src/org/apache/flex/core/IFormatBead.js
----------------------------------------------------------------------
diff --git a/frameworks/js/FlexJS/src/org/apache/flex/core/IFormatBead.js b/frameworks/js/FlexJS/src/org/apache/flex/core/IFormatBead.js
new file mode 100644
index 0000000..a7daf3c
--- /dev/null
+++ b/frameworks/js/FlexJS/src/org/apache/flex/core/IFormatBead.js
@@ -0,0 +1,71 @@
+/**
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/**
+ * @fileoverview
+ * @suppress {checkTypes}
+ */
+
+goog.provide('org.apache.flex.core.IFormatBead');
+
+
+
+/**
+ * @interface
+ * @extends {org.apache.flex.core.IBead}
+ * @extends {org.apache.flex.events.IEventDispatcher}
+ */
+org.apache.flex.core.IFormatBead = function() {
+};
+
+
+/**
+ * @return {string}
+ */
+org.apache.flex.core.IFormatBead.prototype.get_propertyName = function() {};
+
+
+/**
+ * @param {string} value
+ */
+org.apache.flex.core.IFormatBead.prototype.set_propertyName = function(value) {};
+
+
+/**
+ * @return {string}
+ */
+org.apache.flex.core.IFormatBead.prototype.get_eventName = function() {};
+
+
+/**
+ * @param {string} value
+ */
+org.apache.flex.core.IFormatBead.prototype.set_eventName = function(value) {};
+
+
+/**
+ * @return {string}
+ */
+org.apache.flex.core.IFormatBead.prototype.get_formattedString = function() {};
+
+
+/**
+ * Metadata
+ *
+ * @type {Object.<string, Array.<Object>>}
+ */
+org.apache.flex.core.IFormatBead.prototype.FLEXJS_CLASS_INFO = {
+    names: [{ name: 'IFormatBead', qName: 'org.apache.flex.core.IFormatBead'}],
+    interfaces: [org.apache.flex.core.IBead, org.apache.flex.events.IEventDispatcher]
+};

http://git-wip-us.apache.org/repos/asf/flex-asjs/blob/02420b9a/frameworks/js/FlexJS/src/org/apache/flex/core/IParent.js
----------------------------------------------------------------------
diff --git a/frameworks/js/FlexJS/src/org/apache/flex/core/IParent.js b/frameworks/js/FlexJS/src/org/apache/flex/core/IParent.js
new file mode 100644
index 0000000..1ff763a
--- /dev/null
+++ b/frameworks/js/FlexJS/src/org/apache/flex/core/IParent.js
@@ -0,0 +1,67 @@
+/**
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/**
+ * org.apache.flex.core.IParent
+ *
+ * @fileoverview
+ *
+ * @suppress {checkTypes}
+ */
+
+goog.provide('org.apache.flex.core.IParent');
+
+
+
+/**
+ * @interface
+ */
+org.apache.flex.core.IParent = function() {
+};
+
+
+/**
+ * @param {Object} c
+ */
+org.apache.flex.core.IParent.prototype.addElement = function(c) {};
+
+
+/**
+ * @param {Object} c
+ * @param {number} index
+ */
+org.apache.flex.core.IParent.prototype.addElementAt = function(c, index) {};
+
+
+/**
+ * @return {number}
+ * @param {Object} c
+ */
+org.apache.flex.core.IParent.prototype.getElementIndex = function(c) {};
+
+
+/**
+ * @param {Object} c
+ */
+org.apache.flex.core.IParent.prototype.removeElement = function(c) {};
+
+
+/**
+ * Metadata
+ *
+ * @type {Object.<string, Array.<Object>>}
+ */
+org.apache.flex.core.IParent.prototype.FLEXJS_CLASS_INFO = {
+    names: [{ name: 'IParent', qName: 'org.apache.flex.core.IParent'}]
+};

http://git-wip-us.apache.org/repos/asf/flex-asjs/blob/02420b9a/frameworks/js/FlexJS/src/org/apache/flex/core/IPopUpHost.js
----------------------------------------------------------------------
diff --git a/frameworks/js/FlexJS/src/org/apache/flex/core/IPopUpHost.js b/frameworks/js/FlexJS/src/org/apache/flex/core/IPopUpHost.js
new file mode 100644
index 0000000..9d2d502
--- /dev/null
+++ b/frameworks/js/FlexJS/src/org/apache/flex/core/IPopUpHost.js
@@ -0,0 +1,43 @@
+/**
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/**
+ * org.apache.flex.core.IPopUpHost
+ *
+ * @fileoverview
+ *
+ * @suppress {checkTypes}
+ */
+
+goog.provide('org.apache.flex.core.IPopUpHost');
+
+
+
+/**
+ * @interface
+ * @extends {org.apache.flex.core.IParent}
+ */
+org.apache.flex.core.IPopUpHost = function() {
+};
+
+
+/**
+ * Metadata
+ *
+ * @type {Object.<string, Array.<Object>>}
+ */
+org.apache.flex.core.IPopUpHost.prototype.FLEXJS_CLASS_INFO = {
+    names: [{ name: 'IPopUpHost', qName: 'org.apache.flex.core.IPopUpHost'}],
+    interfaces: [org.apache.flex.core.IParent]
+};

http://git-wip-us.apache.org/repos/asf/flex-asjs/blob/02420b9a/frameworks/js/FlexJS/src/org/apache/flex/core/ListBase.js
----------------------------------------------------------------------
diff --git a/frameworks/js/FlexJS/src/org/apache/flex/core/ListBase.js b/frameworks/js/FlexJS/src/org/apache/flex/core/ListBase.js
index 13030fd..fe315ca 100644
--- a/frameworks/js/FlexJS/src/org/apache/flex/core/ListBase.js
+++ b/frameworks/js/FlexJS/src/org/apache/flex/core/ListBase.js
@@ -65,6 +65,7 @@ org.apache.flex.core.ListBase.prototype.createElement = function() {
   this.element.style.borderWidth = '1px';
   this.element.style.borderColor = '#333333';
   this.positioner = this.element;
+  this.element.flexjs_wrapper = this;
 
   return this.element;
 };

http://git-wip-us.apache.org/repos/asf/flex-asjs/blob/02420b9a/frameworks/js/FlexJS/src/org/apache/flex/core/UIBase.js
----------------------------------------------------------------------
diff --git a/frameworks/js/FlexJS/src/org/apache/flex/core/UIBase.js b/frameworks/js/FlexJS/src/org/apache/flex/core/UIBase.js
index d331fe2..35681fd 100644
--- a/frameworks/js/FlexJS/src/org/apache/flex/core/UIBase.js
+++ b/frameworks/js/FlexJS/src/org/apache/flex/core/UIBase.js
@@ -78,6 +78,8 @@ org.apache.flex.core.UIBase.prototype.createElement = function() {
   if (this.positioner == null)
     this.positioner = this.element;
 
+  this.element['flexjs_wrapper'] = this;
+
   return this.element;
 };
 
@@ -140,6 +142,16 @@ org.apache.flex.core.UIBase.prototype.removeElement = function(c) {
 
 
 /**
+ * @return {Object} The parent of this object.
+ */
+org.apache.flex.core.UIBase.prototype.get_parent = function() {
+  var p = this.element.parentNode;
+  var wrapper = p['flexjs_wrapper'];
+  return wrapper;
+};
+
+
+/**
  */
 org.apache.flex.core.UIBase.prototype.addedToParent = function() {
 

http://git-wip-us.apache.org/repos/asf/flex-asjs/blob/02420b9a/frameworks/js/FlexJS/src/org/apache/flex/core/ViewBase.js
----------------------------------------------------------------------
diff --git a/frameworks/js/FlexJS/src/org/apache/flex/core/ViewBase.js b/frameworks/js/FlexJS/src/org/apache/flex/core/ViewBase.js
index f1ac3b0..5e47265 100644
--- a/frameworks/js/FlexJS/src/org/apache/flex/core/ViewBase.js
+++ b/frameworks/js/FlexJS/src/org/apache/flex/core/ViewBase.js
@@ -14,6 +14,7 @@
 
 goog.provide('org.apache.flex.core.ViewBase');
 
+goog.require('org.apache.flex.core.IPopUpHost');
 goog.require('org.apache.flex.core.UIBase');
 goog.require('org.apache.flex.core.ValuesManager');
 goog.require('org.apache.flex.events.Event');
@@ -24,6 +25,7 @@ goog.require('org.apache.flex.utils.MXMLDataInterpreter');
 
 /**
  * @constructor
+ * @implements {org.apache.flex.core.IPopUpHost}
  * @extends {org.apache.flex.core.UIBase}
  */
 org.apache.flex.core.ViewBase = function() {
@@ -58,7 +60,8 @@ goog.inherits(org.apache.flex.core.ViewBase, org.apache.flex.core.UIBase);
  */
 org.apache.flex.core.ViewBase.prototype.FLEXJS_CLASS_INFO =
     { names: [{ name: 'ViewBase',
-                qName: 'org.apache.flex.core.ViewBase' }] };
+                qName: 'org.apache.flex.core.ViewBase' }],
+      interfaces: [org.apache.flex.core.IPopUpHost] };
 
 
 /**
@@ -88,6 +91,7 @@ org.apache.flex.core.ViewBase.prototype.MXMLDescriptor = null;
 org.apache.flex.core.ViewBase.prototype.addedToParent = function() {
 
   //goog.base(this,'addedToParent');
+  this.element.flexjs_wrapper = this;
   if (org.apache.flex.core.ValuesManager.valuesImpl.init) {
     org.apache.flex.core.ValuesManager.valuesImpl.init(this);
   }

http://git-wip-us.apache.org/repos/asf/flex-asjs/blob/02420b9a/frameworks/js/FlexJS/src/org/apache/flex/html/staticControls/Label.js
----------------------------------------------------------------------
diff --git a/frameworks/js/FlexJS/src/org/apache/flex/html/staticControls/Label.js b/frameworks/js/FlexJS/src/org/apache/flex/html/staticControls/Label.js
index 076235a..ec25864 100644
--- a/frameworks/js/FlexJS/src/org/apache/flex/html/staticControls/Label.js
+++ b/frameworks/js/FlexJS/src/org/apache/flex/html/staticControls/Label.js
@@ -27,6 +27,7 @@ org.apache.flex.html.staticControls.Label = function() {
 
   this.element = document.createElement('div');
   this.positioner = this.element;
+  this.element.flexjs_wrapper = this;
 };
 goog.inherits(org.apache.flex.html.staticControls.Label,
     org.apache.flex.core.UIBase);

http://git-wip-us.apache.org/repos/asf/flex-asjs/blob/02420b9a/frameworks/js/FlexJS/src/org/apache/flex/html/staticControls/Panel.js
----------------------------------------------------------------------
diff --git a/frameworks/js/FlexJS/src/org/apache/flex/html/staticControls/Panel.js b/frameworks/js/FlexJS/src/org/apache/flex/html/staticControls/Panel.js
index a5af58b..88a22b5 100644
--- a/frameworks/js/FlexJS/src/org/apache/flex/html/staticControls/Panel.js
+++ b/frameworks/js/FlexJS/src/org/apache/flex/html/staticControls/Panel.js
@@ -120,6 +120,7 @@ org.apache.flex.html.staticControls.Panel.prototype.createElement =
   this.element.className = 'Panel';
 
   this.contentArea = document.createElement('div');
+  this.contentArea.flexjs_wrapper = this;
   this.element.appendChild(this.contentArea);
 
   this.panelView = new org.apache.flex.html.staticControls.beads.PanelView();

http://git-wip-us.apache.org/repos/asf/flex-asjs/blob/02420b9a/frameworks/js/FlexJS/src/org/apache/flex/html/staticControls/supportClasses/NonVirtualDataGroup.js
----------------------------------------------------------------------
diff --git a/frameworks/js/FlexJS/src/org/apache/flex/html/staticControls/supportClasses/NonVirtualDataGroup.js b/frameworks/js/FlexJS/src/org/apache/flex/html/staticControls/supportClasses/NonVirtualDataGroup.js
index ab6a850..2b64d93 100644
--- a/frameworks/js/FlexJS/src/org/apache/flex/html/staticControls/supportClasses/NonVirtualDataGroup.js
+++ b/frameworks/js/FlexJS/src/org/apache/flex/html/staticControls/supportClasses/NonVirtualDataGroup.js
@@ -15,6 +15,8 @@
 goog.provide('org.apache.flex.html.staticControls.supportClasses.NonVirtualDataGroup');
 
 goog.require('org.apache.flex.core.UIBase');
+goog.require('org.apache.flex.utils.Language');
+goog.require('org.apache.flex.html.staticControls.supportClasses.DataItemRenderer');
 
 
 
@@ -61,6 +63,7 @@ org.apache.flex.html.staticControls.supportClasses.NonVirtualDataGroup.
   this.element.style.overflow = 'auto';
   this.element.style.display = 'inline-block';
   this.element.style.position = 'inherit';
+  this.element.flexjs_wrapper = this;
   this.set_className('NonVirtualDataGroup');
 
   this.positioner = this.element;
@@ -77,8 +80,9 @@ org.apache.flex.html.staticControls.supportClasses.NonVirtualDataGroup.
     prototype.addElement = function(value) {
   goog.base(this, 'addElement', value);
 
-  value.set_index(this.renderers.length);
-  value.set_itemRendererParent(this);
+  var itemRenderer = org.apache.flex.utils.Language.as(value,org.apache.flex.html.staticControls.supportClasses.DataItemRenderer);
+  itemRenderer.set_index(this.renderers.length);
+  itemRenderer.set_itemRendererParent(this);
   this.renderers.push(value);
 };
 

http://git-wip-us.apache.org/repos/asf/flex-asjs/blob/02420b9a/frameworks/js/FlexJS/src/org/apache/flex/utils/MXMLDataInterpreter.js
----------------------------------------------------------------------
diff --git a/frameworks/js/FlexJS/src/org/apache/flex/utils/MXMLDataInterpreter.js b/frameworks/js/FlexJS/src/org/apache/flex/utils/MXMLDataInterpreter.js
index 9bfd00d..4b9f273 100644
--- a/frameworks/js/FlexJS/src/org/apache/flex/utils/MXMLDataInterpreter.js
+++ b/frameworks/js/FlexJS/src/org/apache/flex/utils/MXMLDataInterpreter.js
@@ -102,7 +102,7 @@ org.apache.flex.utils.MXMLDataInterpreter.generateMXMLObject =
 org.apache.flex.utils.MXMLDataInterpreter.generateMXMLArray =
     function(document, parent, data, opt_recursive) {
   var bead, beadOffset, beads, children, Cls, comp, comps, generateMXMLArray,
-      generateMXMLObject, i, id, j, k, l, m, n, name, self, simple, value;
+      generateMXMLObject, i, id, j, k, l, m, n, name, self, simple, value, dispatchBeadsAdded;
 
   if (opt_recursive === undefined) {
     opt_recursive = true;
@@ -122,6 +122,7 @@ org.apache.flex.utils.MXMLDataInterpreter.generateMXMLArray =
     comp = new Cls();
 
     id = null;
+    dispatchBeadsAdded = false;
 
     m = data[i++]; // num props
     if (m > 0 && data[0] === 'model') {
@@ -209,6 +210,7 @@ org.apache.flex.utils.MXMLDataInterpreter.generateMXMLArray =
       for (k = 0; k < l; k++) {
         bead = beads[k];
         comp.addBead(bead);
+        dispatchBeadsAdded = true;
       }
     }
 
@@ -254,6 +256,7 @@ org.apache.flex.utils.MXMLDataInterpreter.generateMXMLArray =
 
     if (parent) {
       parent.addElement(comp);
+      dispatchBeadsAdded = true;
     }
 
     children = data[i++];
@@ -286,6 +289,10 @@ org.apache.flex.utils.MXMLDataInterpreter.generateMXMLArray =
     }
 
     comps.push(comp);
+
+    if (dispatchBeadsAdded) {
+      comp.dispatchEvent('beadsAdded');
+    }
   }
 
   return comps;

http://git-wip-us.apache.org/repos/asf/flex-asjs/blob/02420b9a/frameworks/js/FlexJS/src/org/apache/flex/utils/UIUtils.js
----------------------------------------------------------------------
diff --git a/frameworks/js/FlexJS/src/org/apache/flex/utils/UIUtils.js b/frameworks/js/FlexJS/src/org/apache/flex/utils/UIUtils.js
index edf18bc..9e2e9fc 100644
--- a/frameworks/js/FlexJS/src/org/apache/flex/utils/UIUtils.js
+++ b/frameworks/js/FlexJS/src/org/apache/flex/utils/UIUtils.js
@@ -14,6 +14,9 @@
 
 goog.provide('org.apache.flex.utils.UIUtils');
 
+goog.require('org.apache.flex.core.IPopUpHost');
+goog.require('org.apache.flex.utils.Language');
+
 
 
 /**
@@ -41,8 +44,41 @@ org.apache.flex.utils.UIUtils.prototype.FLEXJS_CLASS_INFO =
 org.apache.flex.utils.UIUtils.center =
     function(item, relativeTo) {
 
-  var xpos = (relativeTo.get_width() - item.get_width()) / 2;
-  var ypos = (relativeTo.get_height() - item.get_height()) / 2;
+  var rw = relativeTo.get_width();
+  if (isNaN(rw)) rw = window.innerWidth;
+  var rh = relativeTo.get_height();
+  if (isNaN(rh)) rh = window.innerHeight;
+
+  var xpos = (rw - item.get_width()) / 2;
+  var ypos = (rh - item.get_height()) / 2;
   item.set_x(xpos);
   item.set_y(ypos);
 };
+
+
+/**
+ * @expose
+ * @param {Object} start A component to start the search.
+ * @return {Object} A component that implements IPopUpHost.
+ */
+org.apache.flex.utils.UIUtils.findPopUpHost =
+    function(start) {
+
+  while (start != null && !org.apache.flex.utils.Language.is(start, org.apache.flex.core.IPopUpHost)) {
+    start = start.get_parent();
+  }
+
+  return start;
+};
+
+
+/**
+ * @expose
+ * @param {Object} popUp An IPopUpHost component looking to be removed.
+ */
+org.apache.flex.utils.UIUtils.removePopUp =
+    function(popUp) {
+
+  var p = popUp.get_parent();
+  p.removeElement(popUp);
+};