You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@royale.apache.org by pe...@apache.org on 2018/01/21 13:38:00 UTC

[royale-asjs] branch develop updated: Revived DataGridLayout and DataGridPercentageLayout. Moved DataGrid’s layout into the layout beads. Moved some hard-coded settings for DataGrid and TreeGrid into defaults.css for better flexibility. DataGridPercentageView is now obsolete.

This is an automated email from the ASF dual-hosted git repository.

pent pushed a commit to branch develop
in repository https://gitbox.apache.org/repos/asf/royale-asjs.git


The following commit(s) were added to refs/heads/develop by this push:
     new e80f343  Revived DataGridLayout and DataGridPercentageLayout. Moved DataGrid’s layout into the layout beads. Moved some hard-coded settings for DataGrid and TreeGrid into defaults.css for better flexibility. DataGridPercentageView is now obsolete.
e80f343 is described below

commit e80f343bbd20bca7d50e58f2b1db1ab97fa877c1
Author: Peter Ent <pe...@apache.org>
AuthorDate: Sun Jan 21 08:40:03 2018 -0500

    Revived DataGridLayout and DataGridPercentageLayout. Moved DataGrid’s layout into the layout beads. Moved some hard-coded settings for DataGrid and TreeGrid into defaults.css for better flexibility. DataGridPercentageView is now obsolete.
---
 .../projects/Basic/src/main/resources/defaults.css |  15 +-
 .../projects/Basic/src/main/royale/BasicClasses.as |   2 +
 .../org/apache/royale/html/beads/DataGridView.as   |  56 +-----
 .../org/apache/royale/html/beads/TreeGridView.as   |  16 +-
 .../royale/html/beads/layouts/DataGridLayout.as    | 201 ++++++++-------------
 .../html/beads/layouts/DataGridPercentageLayout.as | 180 ++++--------------
 .../royale/html/beads/layouts/TreeGridLayout.as    |  37 ++--
 7 files changed, 146 insertions(+), 361 deletions(-)

diff --git a/frameworks/projects/Basic/src/main/resources/defaults.css b/frameworks/projects/Basic/src/main/resources/defaults.css
index 92a325f..69f37ec 100644
--- a/frameworks/projects/Basic/src/main/resources/defaults.css
+++ b/frameworks/projects/Basic/src/main/resources/defaults.css
@@ -171,7 +171,7 @@ DataGrid
 	IDataGridPresentationModel: ClassReference("org.apache.royale.html.beads.models.DataGridPresentationModel");
 	IBeadView: ClassReference("org.apache.royale.html.beads.DataGridView");
 	IBeadModel: ClassReference("org.apache.royale.html.beads.models.DataGridModel");
-	IBeadLayout: ClassReference("org.apache.royale.html.beads.layouts.VerticalFlexLayout");
+	IBeadLayout: ClassReference("org.apache.royale.html.beads.layouts.DataGridLayout");
 	
 	background-color: #FFFFFF;
 	border: 1px solid #222222;
@@ -188,13 +188,16 @@ DataGridButtonBar
 	IItemRenderer: ClassReference("org.apache.royale.html.supportClasses.TextButtonItemRenderer");
 	
 	border-style: none;
+	height: 40px;
+	min-height: 40px;
+	flex-grow: 0;
 }
 
 DataGridColumnList {
 	IBeadModel: ClassReference("org.apache.royale.html.beads.models.DataGridModel");
 	IBeadView:  ClassReference("org.apache.royale.html.beads.ListView");			
 	IBeadController: ClassReference("org.apache.royale.html.beads.controllers.ListSingleSelectionMouseController");
-	IBeadLayout: ClassReference("org.apache.royale.html.beads.layouts.VerticalFlexLayout");
+	IBeadLayout: ClassReference("org.apache.royale.html.beads.layouts.VerticalLayout");
 	IDataProviderItemRendererMapper: ClassReference("org.apache.royale.html.beads.DataItemRendererFactoryForArrayData");
 	IItemRendererClassFactory: ClassReference("org.apache.royale.core.ItemRendererClassFactory");
 	IItemRenderer: ClassReference("org.apache.royale.html.supportClasses.StringItemRenderer");
@@ -206,9 +209,10 @@ DataGridColumnList {
 
 .opt_org-apache.royale-html-DataGrid_ListArea {
 	background-color: #FFFFFF;
-	IBeadLayout: ClassReference("org.apache.royale.html.beads.layouts.HorizontalFlexLayout");
+	IBeadLayout: ClassReference("org.apache.royale.html.beads.layouts.HorizontalLayout");
 	IViewport: ClassReference("org.apache.royale.html.supportClasses.ScrollingViewport");
 	IViewportModel: ClassReference("org.apache.royale.html.beads.models.ViewportModel");
+	flex-grow: 1;
 }
 
 .DynamicDataGrid {
@@ -216,7 +220,7 @@ DataGridColumnList {
 	IDataGridPresentationModel: ClassReference("org.apache.royale.html.beads.models.DataGridPresentationModel");
 	IBeadView: ClassReference("org.apache.royale.html.beads.DataGridView");
 	IBeadModel: ClassReference("org.apache.royale.html.beads.models.DataGridCollectionViewModel");
-	IBeadLayout: ClassReference("org.apache.royale.html.beads.layouts.VerticalFlexLayout");
+	IBeadLayout: ClassReference("org.apache.royale.html.beads.layouts.DataGridLayout");
 	ColumnClassName: "DynamicDataGridColumnList";
 	
 	background-color: #FFFFFF;
@@ -227,7 +231,7 @@ DataGridColumnList {
 	IBeadModel: ClassReference("org.apache.royale.html.beads.models.DataGridCollectionViewModel");
 	IBeadView:  ClassReference("org.apache.royale.html.beads.ListView");			
 	IBeadController: ClassReference("org.apache.royale.html.beads.controllers.ListSingleSelectionMouseController");
-	IBeadLayout: ClassReference("org.apache.royale.html.beads.layouts.VerticalFlexLayout");
+	IBeadLayout: ClassReference("org.apache.royale.html.beads.layouts.VerticalLayout");
 	IDataProviderItemRendererMapper: ClassReference("org.apache.royale.html.beads.DataItemRendererFactoryForCollectionView");
 	IItemRendererClassFactory: ClassReference("org.apache.royale.core.ItemRendererClassFactory");
 	IItemRenderer: ClassReference("org.apache.royale.html.supportClasses.StringItemRenderer");
@@ -474,6 +478,7 @@ TreeGrid .TreeGridColumn {
 	IViewport: ClassReference("org.apache.royale.html.supportClasses.ScrollingViewport");
 	IViewportModel: ClassReference("org.apache.royale.html.beads.models.ViewportModel");
 	position: absolute;
+	flex-grow: 1;
 }
 
 NumericStepper
diff --git a/frameworks/projects/Basic/src/main/royale/BasicClasses.as b/frameworks/projects/Basic/src/main/royale/BasicClasses.as
index c462a1e..b8d4ea3 100644
--- a/frameworks/projects/Basic/src/main/royale/BasicClasses.as
+++ b/frameworks/projects/Basic/src/main/royale/BasicClasses.as
@@ -182,6 +182,8 @@ internal class BasicClasses
 	import org.apache.royale.html.beads.DataGridView; DataGridView;
 	import org.apache.royale.html.beads.IDataGridView; IDataGridView;
 	import org.apache.royale.html.beads.DataGridPercentageView; DataGridPercentageView;
+	import org.apache.royale.html.beads.layouts.DataGridLayout; DataGridLayout;
+	import org.apache.royale.html.beads.layouts.DataGridPercentageLayout; DataGridPercentageLayout;
 	import org.apache.royale.html.beads.DateChooserView; DateChooserView;
 	import org.apache.royale.html.beads.DateFieldView; DateFieldView;
 	import org.apache.royale.html.beads.DecrementButtonView; DecrementButtonView;
diff --git a/frameworks/projects/Basic/src/main/royale/org/apache/royale/html/beads/DataGridView.as b/frameworks/projects/Basic/src/main/royale/org/apache/royale/html/beads/DataGridView.as
index 6cc2bbe..0e17879 100644
--- a/frameworks/projects/Basic/src/main/royale/org/apache/royale/html/beads/DataGridView.as
+++ b/frameworks/projects/Basic/src/main/royale/org/apache/royale/html/beads/DataGridView.as
@@ -32,15 +32,9 @@ package org.apache.royale.html.beads
 	import org.apache.royale.html.DataGrid;
 	import org.apache.royale.html.DataGridButtonBar;
 	import org.apache.royale.html.beads.layouts.ButtonBarLayout;
-	import org.apache.royale.html.beads.models.ButtonBarModel;
-	import org.apache.royale.html.supportClasses.DataGridColumn;
 	import org.apache.royale.html.supportClasses.DataGridColumnList;
+	import org.apache.royale.html.supportClasses.IDataGridColumn;
 	import org.apache.royale.html.supportClasses.Viewport;
-	import org.apache.royale.utils.loadBeadFromValuesManager;
-
-	COMPILE::SWF {
-		import org.apache.royale.core.SimpleCSSStylesWithFlex;
-	}
 
 		/**
 		 *  The DataGridView class is the visual bead for the org.apache.royale.html.DataGrid.
@@ -116,7 +110,7 @@ package org.apache.royale.html.beads
 				IEventDispatcher(sharedModel).addEventListener("selectedIndexChanged", handleSelectedIndexChanged);
 
 				_header = new DataGridButtonBar();
-				_header.height = 30;
+				// header's height is set in CSS
 				_header.percentWidth = 100;
 				_header.dataProvider = sharedModel.columns;
 				_header.labelField = "label";
@@ -126,52 +120,9 @@ package org.apache.royale.html.beads
 				_listArea.percentWidth = 100;
 				_listArea.className = "opt_org-apache.royale-html-DataGrid_ListArea";
 
-				COMPILE::SWF {
-					_header.style = new SimpleCSSStylesWithFlex();
-					_header.style.flexGrow = 0;
-
-					_listArea.style = new SimpleCSSStylesWithFlex();
-					_listArea.style.flexGrow = 1;
-				}
-				COMPILE::JS {
-					_header.element.style["flex-grow"] = "0";
-					_header.element.style["min-height"] = "30px";
-					_listArea.element.style["flex-grow"] = "1";
-				}
-
 				createLists();
 
-				//var columnLabels:Array = [];
-				var buttonWidths:Array = [];
-
-				var marginBorderOffset:int = 0;
-				COMPILE::SWF {
-					marginBorderOffset = 1;
-				}
-
-				for(var i:int=0; i < sharedModel.columns.length; i++) {
-					var dgc:DataGridColumn = sharedModel.columns[i] as DataGridColumn;
-					//columnLabels.push(dgc.label);
-					var colWidth:Number = dgc.columnWidth - marginBorderOffset;
-					buttonWidths.push(colWidth);
-
-					var list:DataGridColumnList = _lists[i] as DataGridColumnList;
-					if (!isNaN(colWidth)) {
-						list.width = Number(colWidth - marginBorderOffset);
-					} else {
-						COMPILE::SWF {
-							list.style = new SimpleCSSStylesWithFlex();
-							list.style.flexGrow = 1;
-						}
-							COMPILE::JS {
-								list.element.style["flex-grow"] = "1";
-							}
-					}
-				}
-
 				var bblayout:ButtonBarLayout = new ButtonBarLayout();
-				_header.buttonWidths = buttonWidths;
-				_header.widthType = ButtonBarModel.PIXEL_WIDTHS;
 				_header.addBead(bblayout as IBead);
 				_header.addBead(new Viewport() as IBead);
 				host.addElement(_header as IChild);
@@ -200,7 +151,6 @@ package org.apache.royale.html.beads
 			 */
 			private function handleDataProviderChanged(event:Event):void
 			{
-
 				host.dispatchEvent(new Event("layoutNeeded"));
 			}
 
@@ -258,7 +208,7 @@ package org.apache.royale.html.beads
 
 				for (var i:int=0; i < sharedModel.columns.length; i++)
 				{
-					var dataGridColumn:DataGridColumn = sharedModel.columns[i] as DataGridColumn;
+					var dataGridColumn:IDataGridColumn = sharedModel.columns[i] as IDataGridColumn;
 					var useClassName:String = columnClassName;
 					if (dataGridColumn.className != null) useClassName = dataGridColumn.className;
 
diff --git a/frameworks/projects/Basic/src/main/royale/org/apache/royale/html/beads/TreeGridView.as b/frameworks/projects/Basic/src/main/royale/org/apache/royale/html/beads/TreeGridView.as
index b2bc41f..79d83bd 100644
--- a/frameworks/projects/Basic/src/main/royale/org/apache/royale/html/beads/TreeGridView.as
+++ b/frameworks/projects/Basic/src/main/royale/org/apache/royale/html/beads/TreeGridView.as
@@ -45,10 +45,6 @@ package org.apache.royale.html.beads
 	import org.apache.royale.html.supportClasses.TreeGridColumn;
 	import org.apache.royale.html.supportClasses.Viewport;
 	
-	COMPILE::SWF {
-		import org.apache.royale.core.SimpleCSSStylesWithFlex;
-	}
-	
 	/**
 	 * The TreeGridView class is responsible for creating the sub-components of the TreeGrid:
 	 * the ButtonBar header, the Tree (first column), and Lists (rest of the columns), as well
@@ -130,7 +126,6 @@ package org.apache.royale.html.beads
 				_strand.addBead(layout);
 			}
 
-			
 			IEventDispatcher(_strand).addEventListener("beadsAdded", finishSetup);
 		}
 		
@@ -153,7 +148,7 @@ package org.apache.royale.html.beads
 			IEventDispatcher(sharedModel).addEventListener("selectedIndexChanged", handleSelectedIndexChanged);
 			
 			_header = new DataGridButtonBar();
-			_header.height = 30;
+			// header's height is set in CSS
 			_header.percentWidth = 100;
 			_header.dataProvider = sharedModel.columns;
 			_header.labelField = "label";
@@ -180,14 +175,6 @@ package org.apache.royale.html.beads
 				var list:UIBase = _lists[i] as UIBase;
 				if (!isNaN(colWidth)) {
 					list.width = Number(colWidth - marginBorderOffset);
-				} else {
-					COMPILE::SWF {
-						list.style = new SimpleCSSStylesWithFlex();
-						list.style.flexGrow = 1;
-					}
-					COMPILE::JS {
-						list.element.style["flex-grow"] = "1";
-					}
 				}
 			}
 				
@@ -223,7 +210,6 @@ package org.apache.royale.html.beads
 		 */
 		private function handleDataProviderChanged(event:Event):void
 		{
-			
 			host.dispatchEvent(new Event("layoutNeeded"));
 		}
 		
diff --git a/frameworks/projects/Basic/src/main/royale/org/apache/royale/html/beads/layouts/DataGridLayout.as b/frameworks/projects/Basic/src/main/royale/org/apache/royale/html/beads/layouts/DataGridLayout.as
index 4087f50..a420bcd 100644
--- a/frameworks/projects/Basic/src/main/royale/org/apache/royale/html/beads/layouts/DataGridLayout.as
+++ b/frameworks/projects/Basic/src/main/royale/org/apache/royale/html/beads/layouts/DataGridLayout.as
@@ -20,19 +20,19 @@ package org.apache.royale.html.beads.layouts
 {	
     import org.apache.royale.core.IBead;
     import org.apache.royale.core.IBeadLayout;
-	import org.apache.royale.core.IBeadModel;
-	import org.apache.royale.core.IBeadView;
-	import org.apache.royale.core.IDataGridModel;
-	import org.apache.royale.core.IStrand;
-	import org.apache.royale.core.IUIBase;
-	import org.apache.royale.core.UIBase;
-	import org.apache.royale.events.Event;
-	import org.apache.royale.events.IEventDispatcher;
-	import org.apache.royale.html.ButtonBar;
-	import org.apache.royale.html.beads.DataGridView;
-	import org.apache.royale.html.beads.layouts.BasicLayout;
-	import org.apache.royale.html.supportClasses.DataGridColumnList;
-	import org.apache.royale.html.supportClasses.DataGridColumn;
+    import org.apache.royale.core.IBeadView;
+    import org.apache.royale.core.IDataGridModel;
+    import org.apache.royale.core.IStrand;
+    import org.apache.royale.core.IUIBase;
+    import org.apache.royale.core.UIBase;
+    import org.apache.royale.events.Event;
+    import org.apache.royale.events.IEventDispatcher;
+    import org.apache.royale.geom.Rectangle;
+    import org.apache.royale.html.beads.DataGridView;
+    import org.apache.royale.html.beads.IDataGridView;
+    import org.apache.royale.html.beads.models.ButtonBarModel;
+    import org.apache.royale.html.supportClasses.IDataGridColumn;
+    import org.apache.royale.utils.CSSContainerUtils;
 	
 	/**
 	 * DataGridLayout is a class that handles the size and positioning of the
@@ -44,7 +44,7 @@ package org.apache.royale.html.beads.layouts
 	 *  @playerversion AIR 2.6
 	 *  @productversion Royale 0.0
 	 */
-	public class DataGridLayout implements IDataGridLayout
+	public class DataGridLayout implements IBeadLayout
 	{
 		/**
 		 *  constructor
@@ -72,145 +72,86 @@ package org.apache.royale.html.beads.layouts
 		{
 			_strand = value;
 			
-            var host:UIBase = value as UIBase;
-            
-			var view:DataGridView = host.view as DataGridView;
-			header = view.header;
-			listArea = view.listArea;
-            
-            var anylayout:IBead = listArea.getBeadByType(IBeadLayout);
-            if (anylayout != null) {
-                listArea.removeBead(anylayout);
-            }
-			listArea.addBead(new BasicLayout());
-            
-            host.addEventListener("widthChanged", handleSizeChanges);
-            host.addEventListener("heightChanged", handleSizeChanges);
-            host.addEventListener("sizeChanged", handleSizeChanges);
-            host.addEventListener("layoutNeeded", handleSizeChanges);
-
+			(_strand as IEventDispatcher).addEventListener("widthChanged", handleSizeChanges);
+			(_strand as IEventDispatcher).addEventListener("heightChanged", handleSizeChanges);
+			(_strand as IEventDispatcher).addEventListener("sizeChanged", handleSizeChanges);
+			(_strand as IEventDispatcher).addEventListener("layoutNeeded", handleLayoutNeeded);
 		}
 		
-		private var _header:UIBase;
-		
-		/**
-		 * The element that is the header for the DataGrid
-		 *  
-		 *  @langversion 3.0
-		 *  @playerversion Flash 10.2
-		 *  @playerversion AIR 2.6
-		 *  @productversion Royale 0.0
-		 */
-		public function get header():IUIBase
+		private function get host():IUIBase
 		{
-			return _header;
+			return _strand as IUIBase;
 		}
-		public function set header(value:IUIBase):void
+		private function get uiHost():UIBase
 		{
-			_header = UIBase(value);
+			return _strand as UIBase;
 		}
 		
-		private var _columns:Array;
-		
-		/**
-		 * The array of column elements.
-		 *  
-		 *  @langversion 3.0
-		 *  @playerversion Flash 10.2
-		 *  @playerversion AIR 2.6
-		 *  @productversion Royale 0.0
-		 */
-		public function get columns():Array
-		{
-			return _columns;
-		}
-		public function set columns(value:Array):void
+		private function handleSizeChanges(event:Event):void
 		{
-			_columns = value;
+			layout();
 		}
 		
-		private var _listArea:IUIBase;
-		
-		public function get listArea():IUIBase
-		{
-			return _listArea;
-		}
-		public function set listArea(value:IUIBase):void
+		private function handleLayoutNeeded(event:Event):void
 		{
-			_listArea = value;
+			layout();
 		}
 		
-        /**
-         * @copy org.apache.royale.core.IBeadLayout#layout
-         */
+		/**
+		 * @copy org.apache.royale.core.IBeadLayout#layout
+		 */
 		public function layout():Boolean
-		{						
-			if (columns == null || columns.length == 0) {
-				return false;
-			}
-			var host:UIBase = _strand as UIBase;
+		{
+			var header:IUIBase = (uiHost.view as IDataGridView).header;
+			var listArea:IUIBase = (uiHost.view as IDataGridView).listArea;
 			
-			var useWidth:Number = host.width;
-			var useHeight:Number = host.height;
-
-			if (host.height > 0) {
-				useHeight = host.height - _header.height;
-			}
+			var displayedColumns:Array = (uiHost.view as IDataGridView).columnLists;
+			var model:IDataGridModel = uiHost.model as IDataGridModel;
+			
+			var borderMetrics:Rectangle = CSSContainerUtils.getBorderMetrics(_strand);			
+			var useWidth:Number = uiHost.width - (borderMetrics.left + borderMetrics.right);
+			var useHeight:Number = uiHost.height - (borderMetrics.top + borderMetrics.bottom);
 			
-			var thisisnothing:Number = -1234;
-
-			_listArea.x = 0;
-			_listArea.y = 26;
-			_listArea.width = useWidth;
-			_listArea.height = useHeight;
-
-			var sharedModel:IDataGridModel = host.model as IDataGridModel;
-			var buttonWidths:Array = [];
-
-			if (_columns != null && _columns.length > 0) {
-				var xpos:Number = 0;
-				var listWidth:Number = host.width / _columns.length;
-				for (var i:int=0; i < _columns.length; i++) {
-					var list:DataGridColumnList = _columns[i] as DataGridColumnList;
-					list.x = xpos;
-					list.y = 0;
-
-					var dataGridColumn:DataGridColumn = sharedModel.columns[i] as DataGridColumn;
-					var colWidth:Number = dataGridColumn.columnWidth;
-					if (!isNaN(colWidth)) list.width = colWidth;
-					else list.width = listWidth;
-
-					xpos += list.width;
-					
-					buttonWidths.push(list.width);
+			var xpos:Number = 0;
+			var defaultColumnWidth:Number = (useWidth) / model.columns.length;
+			var columnWidths:Array = [];
+			
+			for(var i:int=0; i < displayedColumns.length; i++) {
+				var columnDef:IDataGridColumn = model.columns[i] as IDataGridColumn;
+				var columnList:UIBase = displayedColumns[i] as UIBase;
+				
+				// probably do not need to set (x,y), but if the Container's layout requires it, they will be set.
+				columnList.x = xpos;
+				columnList.y = 0;
+				
+				var columnWidth:Number = defaultColumnWidth;
+				if (!isNaN(columnDef.columnWidth)) {
+					columnWidth = (columnDef.columnWidth / uiHost.width) * useWidth;
 				}
+				
+				columnList.width = columnWidth;
+				columnWidths.push(columnWidth);
+				
+				xpos += columnList.width;
 			}
 			
-			var bar:ButtonBar = header as ButtonBar;
-			var barLayout:ButtonBarLayout = bar.getBeadByType(ButtonBarLayout) as ButtonBarLayout;
-			barLayout.buttonWidths = buttonWidths;
-			bar.dispatchEvent(new Event("layoutNeeded"));
+			var bbmodel:ButtonBarModel = header.getBeadByType(ButtonBarModel) as ButtonBarModel;
+			bbmodel.buttonWidths = columnWidths;
 			
-			_header.x = 0;
-			_header.y = 0;
-			_header.width = useWidth;
-			_header.height = 25;
-			_header.dispatchEvent(new Event("layoutNeeded"));
+			header.x = borderMetrics.left;
+			header.y = borderMetrics.top;
+			header.width = useWidth;
+			// header's height is set in CSS
 			
-			return true;
-		}
-		
-		/**
-		 * @private
-		 */
-		private function handleSizeChanges(event:Event):void
-		{
-			var view:DataGridView = UIBase(_strand).view as DataGridView;
-			if (view == null) return;
+			listArea.x = borderMetrics.left;
+			listArea.y = header.height + header.y;
+			listArea.width = useWidth;
+			listArea.height = useHeight - header.height;
 			
-			columns = view.columnLists;
+			header.dispatchEvent(new Event("layoutNeeded"));
+			listArea.dispatchEvent(new Event("layoutNeeded"));
 			
-			layout();
+			return true;
 		}
 	}
 }
diff --git a/frameworks/projects/Basic/src/main/royale/org/apache/royale/html/beads/layouts/DataGridPercentageLayout.as b/frameworks/projects/Basic/src/main/royale/org/apache/royale/html/beads/layouts/DataGridPercentageLayout.as
index 040b872..8a83fce 100644
--- a/frameworks/projects/Basic/src/main/royale/org/apache/royale/html/beads/layouts/DataGridPercentageLayout.as
+++ b/frameworks/projects/Basic/src/main/royale/org/apache/royale/html/beads/layouts/DataGridPercentageLayout.as
@@ -18,19 +18,15 @@
 ////////////////////////////////////////////////////////////////////////////////
 package org.apache.royale.html.beads.layouts
 {	
-	import org.apache.royale.core.IBead;
-	import org.apache.royale.core.IBeadLayout;
-	import org.apache.royale.core.IBeadView;
 	import org.apache.royale.core.IDataGridModel;
 	import org.apache.royale.core.IStrand;
 	import org.apache.royale.core.IUIBase;
 	import org.apache.royale.core.UIBase;
 	import org.apache.royale.events.Event;
-	import org.apache.royale.events.IEventDispatcher;
 	import org.apache.royale.html.ButtonBar;
-	import org.apache.royale.html.beads.DataGridView;
-	import org.apache.royale.html.beads.layouts.HorizontalLayout;
-	import org.apache.royale.html.supportClasses.DataGridColumn;
+	import org.apache.royale.html.beads.IDataGridView;
+	import org.apache.royale.html.beads.models.ButtonBarModel;
+	import org.apache.royale.html.supportClasses.IDataGridColumn;
 	
 	/**
 	 * DataGridPercentageLayout is a class that handles the size and positioning of the
@@ -43,7 +39,7 @@ package org.apache.royale.html.beads.layouts
 	 *  @playerversion AIR 2.6
 	 *  @productversion Royale 0.0
 	 */
-	public class DataGridPercentageLayout implements IDataGridLayout
+	public class DataGridPercentageLayout extends DataGridLayout
 	{
 		/**
 		 *  constructor
@@ -55,6 +51,7 @@ package org.apache.royale.html.beads.layouts
 		 */
 		public function DataGridPercentageLayout()
 		{
+			super();
 		}
 		
 		private var _strand:IStrand;
@@ -67,158 +64,53 @@ package org.apache.royale.html.beads.layouts
 		 *  @playerversion AIR 2.6
 		 *  @productversion Royale 0.0
 		 */
-		public function set strand(value:IStrand):void
+		override public function set strand(value:IStrand):void
 		{
 			_strand = value;
-			
-			var host:UIBase = value as UIBase;
-			
-			var view:DataGridView = host.view as DataGridView;
-			
-			header = view.header;
-			listArea = view.listArea;
-			
-			var anylayout:IBead = listArea.getBeadByType(IBeadLayout);
-			if (anylayout != null) {
-				listArea.removeBead(anylayout);
-			}
-			listArea.addBead(new HorizontalLayout());
-			
-			host.addEventListener("widthChanged", handleSizeChanges);
-			host.addEventListener("heightChanged", handleSizeChanges);
-			host.addEventListener("sizeChanged", handleSizeChanges);
-			host.addEventListener("layoutNeeded", handleSizeChanges);
-		}
-		
-		private var _header:UIBase;
-		
-		/**
-		 * The element that is the header for the DataGrid
-		 *  
-		 *  @langversion 3.0
-		 *  @playerversion Flash 10.2
-		 *  @playerversion AIR 2.6
-		 *  @productversion Royale 0.0
-		 */
-		public function get header():IUIBase
-		{
-			return _header;
-		}
-		public function set header(value:IUIBase):void
-		{
-			_header = UIBase(value);
-		}
-		
-		private var _columns:Array;
-		
-		/**
-		 * The array of column elements.
-		 *  
-		 *  @langversion 3.0
-		 *  @playerversion Flash 10.2
-		 *  @playerversion AIR 2.6
-		 *  @productversion Royale 0.0
-		 */
-		public function get columns():Array
-		{
-			return _columns;
-		}
-		public function set columns(value:Array):void
-		{
-			_columns = value;
-		}
-		
-		private var _listArea:IUIBase;
-		
-		public function get listArea():IUIBase
-		{
-			return _listArea;
-		}
-		public function set listArea(value:IUIBase):void
-		{
-			_listArea = value;
+			super.strand = value;
 		}
 		
         /**
          * @copy org.apache.royale.core.IBeadLayout#layout
          */
-		public function layout():Boolean
+		override public function layout():Boolean
 		{			
-			if (columns == null || columns.length == 0) {
-				return false;
-			}
+			// call the super function to get the basics laid out even
+			// though the columns and header will not be right.
+			if (!super.layout()) return false;
 			
 			var host:UIBase = _strand as UIBase;
-			
-			var sw:Number = host.width;
-			var sh:Number = host.height;
-			
-			var columnHeight:Number = Math.floor(sh - header.height);
-			var columnWidth:Number  = Math.floor(sw / columns.length);
-			
-			var xpos:Number = 0;
-			var ypos:Number = 26;
-			
-			_header.x = 0;
-			_header.y = 0;
-			_header.width = sw;
-			_header.height = 25;
-			
-			if (sh > 0) {
-				sh = sh - _header.height;
-			}
-			
-			// TODO: change the layout so that the model's DataGridColumn.columnWidth
-			// isn't used blindly, but is considered in the overall width. In other words,
-			// right now the width could exceed the strand's width.
-			var model:IDataGridModel = host.model as IDataGridModel;
-			
-			var buttonWidths:Array = new Array();
-						
-			for(var i:int=0; i < columns.length; i++) {
-				var column:UIBase = columns[i] as UIBase;
-				column.percentHeight = 100;
-
-				var dgc:DataGridColumn = model.columns[i];
-				if (!isNaN(dgc.columnWidth)) {
-					column.percentWidth = dgc.columnWidth;
-					columnWidth = sw * (dgc.columnWidth/100.0);
-				}
-				else column.explicitWidth = columnWidth;
+			var header:IUIBase = (host.view as IDataGridView).header;
+			var sharedModel:IDataGridModel = host.model as IDataGridModel;
+			var columnLists:Array = (host.view as IDataGridView).columnLists;
+			var columnListCount:int = sharedModel.columns.length;
+			var buttonWidths:Array = [];
+			
+			for (var i:int = 0; i < columnListCount; i++)
+			{
+				var dgc:IDataGridColumn = sharedModel.columns[i] as IDataGridColumn;
+				var colWidth:Number = dgc.columnWidth;
+				buttonWidths.push(colWidth);
 				
-				buttonWidths.push(columnWidth);
+				var list:UIBase = columnLists[i] as UIBase;
+				if (!isNaN(dgc.columnWidth))
+				{
+					list.width = NaN;
+					list.percentWidth = Number(colWidth);
+				}
 			}
 			
-			_listArea.x = 0;
-			_listArea.y = 26;
-			_listArea.width = sw;
-			_listArea.height = sh;
-			_listArea.dispatchEvent(new Event("layoutNeeded"));
-			
-			var bar:ButtonBar = header as ButtonBar;
-			var barLayout:ButtonBarLayout = bar.getBeadByType(ButtonBarLayout) as ButtonBarLayout;
-			barLayout.buttonWidths = buttonWidths;
+			// list area needs a layout refresh because its contents were changed from
+			// fixed size to percent size.
+			var listArea:IUIBase = (host.view as IDataGridView).listArea;
+			listArea.dispatchEvent(new Event("layoutNeeded"));
 			
-			_header.x = 0;
-			_header.y = 0;
-			_header.width = sw;
-			_header.height = 25;
-			_header.dispatchEvent(new Event("layoutNeeded"));
+			var dgButtonBar:ButtonBar = header as ButtonBar;
+			dgButtonBar.buttonWidths = buttonWidths;
+			dgButtonBar.widthType = ButtonBarModel.PERCENT_WIDTHS;
+			dgButtonBar.dispatchEvent(new Event("layoutNeeded"));
 			
 			return true;
 		}
-		
-		/**
-		 * @private
-		 */
-		private function handleSizeChanges(event:Event):void
-		{
-			var view:DataGridView = UIBase(_strand).view as DataGridView;
-			if (view == null) return;
-			
-			columns = view.columnLists;
-			
-			layout();
-		}
 	}
 }
diff --git a/frameworks/projects/Basic/src/main/royale/org/apache/royale/html/beads/layouts/TreeGridLayout.as b/frameworks/projects/Basic/src/main/royale/org/apache/royale/html/beads/layouts/TreeGridLayout.as
index b7f2b3b..5a56813 100644
--- a/frameworks/projects/Basic/src/main/royale/org/apache/royale/html/beads/layouts/TreeGridLayout.as
+++ b/frameworks/projects/Basic/src/main/royale/org/apache/royale/html/beads/layouts/TreeGridLayout.as
@@ -24,12 +24,14 @@ package org.apache.royale.html.beads.layouts
 	import org.apache.royale.core.UIBase;
 	import org.apache.royale.events.Event;
 	import org.apache.royale.events.IEventDispatcher;
+	import org.apache.royale.geom.Rectangle;
 	import org.apache.royale.html.ButtonBar;
 	import org.apache.royale.html.beads.TreeGridView;
 	import org.apache.royale.html.beads.models.ButtonBarModel;
 	import org.apache.royale.html.beads.models.TreeGridModel;
 	import org.apache.royale.html.supportClasses.IDataGridColumn;
 	import org.apache.royale.html.supportClasses.TreeGridColumn;
+	import org.apache.royale.utils.CSSContainerUtils;
 	
 	/**
 	 * The TreeGridLayout class provides the sizing and positioning for the sub-components
@@ -111,15 +113,19 @@ package org.apache.royale.html.beads.layouts
 			var contentArea:UIBase = (uiHost.view as TreeGridView).listArea;
 			var displayedColumns:Array = (uiHost.view as TreeGridView).columnLists;
 			
+			var borderMetrics:Rectangle = CSSContainerUtils.getBorderMetrics(_strand);
+			var useWidth:Number = uiHost.width - (borderMetrics.left + borderMetrics.right);
+			var useHeight:Number = uiHost.height - (borderMetrics.top + borderMetrics.bottom);
+			
 			// size and position the header
-			header.x = 0;
-			header.y = 0;
-			header.width = uiHost.width;
-			header.height = 30;
+			header.x = borderMetrics.left;
+			header.y = borderMetrics.top;
+			header.width = useWidth;
+			// header's height is set in CSS
 			
 			// size and position the elements that make up the content
 			var xpos:Number = 0;
-			var defaultColumnWidth:Number = (contentArea.width) / model.columns.length;
+			var defaultColumnWidth:Number = (useWidth) / model.columns.length;
 			var columnWidths:Array = [];
 			
 			COMPILE::JS {
@@ -129,15 +135,18 @@ package org.apache.royale.html.beads.layouts
 			for(var i:int=0; i < displayedColumns.length; i++) {
 				var columnDef:IDataGridColumn = model.columns[i] as IDataGridColumn;
 				var columnList:UIBase = displayedColumns[i] as UIBase;
+				
+				// probably do not need to set (x,y), but if the Container's layout requires it, they will be set.
 				columnList.x = xpos;
 				columnList.y = 0;
-				if (isNaN(columnDef.columnWidth)) {
-					columnList.width = defaultColumnWidth;
-				} else {
-					columnList.width = columnDef.columnWidth;
+				
+				var columnWidth:Number = defaultColumnWidth;
+				if (!isNaN(columnDef.columnWidth)) {
+					columnWidth = (columnDef.columnWidth / uiHost.width) * useWidth;
 				}
 				
-				columnWidths.push(columnList.width);
+				columnList.width = columnWidth;
+				columnWidths.push(columnWidth);
 				
 				xpos += columnList.width;
 			}
@@ -147,10 +156,10 @@ package org.apache.royale.html.beads.layouts
 			header.dispatchEvent(new Event("layoutNeeded"));
 			
 			// size and position the contentArea
-			contentArea.x = 0;
-			contentArea.y = header.height; 
-			contentArea.width = uiHost.width;
-			contentArea.height = uiHost.height - header.height;
+			contentArea.x = borderMetrics.left;
+			contentArea.y = header.height + header.y; 
+			contentArea.width = useWidth;
+			contentArea.height = useHeight - header.height;
 			
 			return true;
 		}

-- 
To stop receiving notification emails like this one, please contact
['"commits@royale.apache.org" <co...@royale.apache.org>'].