Updated layout and scrolling. Removed scrolling-specific layouts because that is now handled by new viewports. Modified ContainerView to work with viewports.
Project: http://git-wip-us.apache.org/repos/asf/flex-asjs/repo Commit: http://git-wip-us.apache.org/repos/asf/flex-asjs/commit/f62f49c7 Tree: http://git-wip-us.apache.org/repos/asf/flex-asjs/tree/f62f49c7 Diff: http://git-wip-us.apache.org/repos/asf/flex-asjs/diff/f62f49c7 Branch: refs/heads/develop Commit: f62f49c75f3853c6eae4feaaf47d7ecd02293e93 Parents: e0b037f Author: Peter Ent <[email protected]> Authored: Mon Jun 22 10:39:51 2015 -0400 Committer: Peter Ent <[email protected]> Committed: Mon Jun 22 10:39:51 2015 -0400 ---------------------------------------------------------------------- frameworks/projects/HTML/as/defaults.css | 10 +- frameworks/projects/HTML/as/src/HTMLClasses.as | 11 +- .../org/apache/flex/html/beads/ContainerView.as | 551 ++++++++++--------- .../src/org/apache/flex/html/beads/ListView.as | 127 +---- .../src/org/apache/flex/html/beads/PanelView.as | 61 +- .../flex/html/beads/PanelWithControlBarView.as | 103 ++-- .../flex/html/beads/ScrollingContainerView.as | 550 ++++++++++-------- .../flex/html/beads/layouts/HorizontalLayout.as | 45 +- .../beads/layouts/HorizontalScrollingLayout.as | 142 ----- .../flex/html/beads/layouts/VerticalLayout.as | 350 ++++++------ .../beads/layouts/VerticalScrollingLayout.as | 341 ------------ .../flex/html/beads/models/ViewportModel.as | 149 +++++ .../html/supportClasses/ContainerContentArea.as | 16 +- .../flex/html/supportClasses/DataGroup.as | 20 +- .../flex/html/supportClasses/ScrollBar.as | 3 +- .../html/supportClasses/ScrollingViewport.as | 367 ++++++++++++ .../html/supportClasses/UIItemRendererBase.as | 1 + .../apache/flex/html/supportClasses/Viewport.as | 132 +++++ .../org/apache/flex/html/beads/DataGridView.as | 11 + .../FlexibleFirstChildHorizontalLayout.as | 44 +- frameworks/projects/HTML/basic-manifest.xml | 5 +- 21 files changed, 1733 insertions(+), 1306 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/flex-asjs/blob/f62f49c7/frameworks/projects/HTML/as/defaults.css ---------------------------------------------------------------------- diff --git a/frameworks/projects/HTML/as/defaults.css b/frameworks/projects/HTML/as/defaults.css index 6bca6cd..7d57d1b 100644 --- a/frameworks/projects/HTML/as/defaults.css +++ b/frameworks/projects/HTML/as/defaults.css @@ -113,6 +113,9 @@ DataGrid IItemRenderer: ClassReference("org.apache.flex.html.supportClasses.StringItemRenderer"); background-color: #FFFFFF; + border-style: solid; + border-color: #222222; + border-width: 1px; } DateChooser { @@ -152,11 +155,14 @@ List IBeadModel: ClassReference("org.apache.flex.html.beads.models.ArraySelectionModel"); IBeadView: ClassReference("org.apache.flex.html.beads.ListView"); IBeadController: ClassReference("org.apache.flex.html.beads.controllers.ListSingleSelectionMouseController"); - IBeadLayout: ClassReference("org.apache.flex.html.beads.layouts.VerticalScrollingLayout"); + IBeadLayout: ClassReference("org.apache.flex.html.beads.layouts.VerticalLayout"); IDataGroup: ClassReference("org.apache.flex.html.supportClasses.DataGroup"); IDataProviderItemRendererMapper: ClassReference("org.apache.flex.html.beads.DataItemRendererFactoryForArrayData"); IItemRendererClassFactory: ClassReference("org.apache.flex.core.ItemRendererClassFactory"); IItemRenderer: ClassReference("org.apache.flex.html.supportClasses.StringItemRenderer"); + IViewport: ClassReference("org.apache.flex.html.supportClasses.ScrollingViewport"); + border-style: solid; + border-color: #222222; } Panel @@ -188,7 +194,7 @@ SimpleList IBeadModel: ClassReference("org.apache.flex.html.beads.models.ArraySelectionModel"); IBeadView: ClassReference("org.apache.flex.html.beads.ListView"); IBeadController: ClassReference("org.apache.flex.html.beads.controllers.ListSingleSelectionMouseController"); - IBeadLayout: ClassReference("org.apache.flex.html.beads.layouts.VerticalScrollingLayout"); + IBeadLayout: ClassReference("org.apache.flex.html.beads.layouts.VerticalLayout"); IDataGroup: ClassReference("org.apache.flex.html.supportClasses.DataGroup"); IDataProviderItemRendererMapper: ClassReference("org.apache.flex.html.beads.TextItemRendererFactoryForArrayData"); IItemRendererClassFactory: ClassReference("org.apache.flex.core.ItemRendererClassFactory"); http://git-wip-us.apache.org/repos/asf/flex-asjs/blob/f62f49c7/frameworks/projects/HTML/as/src/HTMLClasses.as ---------------------------------------------------------------------- diff --git a/frameworks/projects/HTML/as/src/HTMLClasses.as b/frameworks/projects/HTML/as/src/HTMLClasses.as index d508c82..d74defb 100644 --- a/frameworks/projects/HTML/as/src/HTMLClasses.as +++ b/frameworks/projects/HTML/as/src/HTMLClasses.as @@ -48,12 +48,12 @@ internal class HTMLClasses import org.apache.flex.html.beads.ImageButtonView; ImageButtonView; import org.apache.flex.html.beads.ImageAndTextButtonView; ImageAndTextButtonView; import org.apache.flex.html.beads.ImageView; ImageView; - import org.apache.flex.html.beads.ListView; ListView; + import org.apache.flex.html.beads.ListView; ListView; import org.apache.flex.html.beads.NumericStepperView; NumericStepperView; import org.apache.flex.html.beads.PanelView; PanelView; import org.apache.flex.html.beads.PanelWithControlBarView; PanelWithControlBarView; import org.apache.flex.html.beads.RadioButtonView; RadioButtonView; - import org.apache.flex.html.beads.ScrollBarView; ScrollBarView; + import org.apache.flex.html.beads.ScrollBarView; ScrollBarView; import org.apache.flex.html.beads.SimpleAlertView; SimpleAlertView; import org.apache.flex.html.beads.SingleLineBorderBead; SingleLineBorderBead; import org.apache.flex.html.beads.SliderView; SliderView; @@ -79,6 +79,7 @@ internal class HTMLClasses import org.apache.flex.html.beads.models.TitleBarModel; TitleBarModel; import org.apache.flex.html.beads.models.ToggleButtonModel; ToggleButtonModel; import org.apache.flex.html.beads.models.ValueToggleButtonModel; ValueToggleButtonModel; + import org.apache.flex.html.beads.models.ViewportModel; ViewportModel; import org.apache.flex.html.beads.controllers.AlertController; AlertController; import org.apache.flex.html.beads.controllers.ComboBoxController; ComboBoxController; import org.apache.flex.html.beads.controllers.DropDownListController; DropDownListController; @@ -89,14 +90,16 @@ internal class HTMLClasses import org.apache.flex.html.beads.controllers.SpinnerMouseController; SpinnerMouseController; import org.apache.flex.html.beads.controllers.VScrollBarMouseController; VScrollBarMouseController; import org.apache.flex.html.beads.layouts.ButtonBarLayout; ButtonBarLayout; - import org.apache.flex.html.beads.layouts.VerticalScrollingLayout; VerticalScrollingLayout; - import org.apache.flex.html.beads.layouts.HorizontalScrollingLayout; HorizontalScrollingLayout; + import org.apache.flex.html.beads.layouts.VerticalLayout; VerticalLayout; + import org.apache.flex.html.beads.layouts.HorizontalLayout; HorizontalLayout; import org.apache.flex.html.beads.layouts.BasicLayout; BasicLayout; import org.apache.flex.html.beads.layouts.VScrollBarLayout; VScrollBarLayout; import org.apache.flex.html.beads.layouts.TileLayout; TileLayout; import org.apache.flex.html.beads.TextItemRendererFactoryForArrayData; TextItemRendererFactoryForArrayData; import org.apache.flex.html.beads.DataItemRendererFactoryForArrayData; DataItemRendererFactoryForArrayData; import org.apache.flex.html.supportClasses.DataGroup; DataGroup; + import org.apache.flex.html.supportClasses.Viewport; Viewport; + import org.apache.flex.html.supportClasses.ScrollingViewport; ScrollingViewport; import org.apache.flex.events.CustomEvent; CustomEvent; import org.apache.flex.events.Event; Event; import org.apache.flex.events.MouseEvent; MouseEvent; http://git-wip-us.apache.org/repos/asf/flex-asjs/blob/f62f49c7/frameworks/projects/HTML/as/src/org/apache/flex/html/beads/ContainerView.as ---------------------------------------------------------------------- diff --git a/frameworks/projects/HTML/as/src/org/apache/flex/html/beads/ContainerView.as b/frameworks/projects/HTML/as/src/org/apache/flex/html/beads/ContainerView.as index cb43044..6470276 100644 --- a/frameworks/projects/HTML/as/src/org/apache/flex/html/beads/ContainerView.as +++ b/frameworks/projects/HTML/as/src/org/apache/flex/html/beads/ContainerView.as @@ -17,41 +17,36 @@ // //////////////////////////////////////////////////////////////////////////////// package org.apache.flex.html.beads -{ - import org.apache.flex.core.BeadViewBase; - import org.apache.flex.core.ContainerBase; - import org.apache.flex.core.IBead; - import org.apache.flex.core.IBeadLayout; - import org.apache.flex.core.IBeadView; - import org.apache.flex.core.ILayoutParent; - import org.apache.flex.core.IParentIUIBase; - import org.apache.flex.core.IStrand; - import org.apache.flex.core.IUIBase; +{ + import org.apache.flex.core.BeadViewBase; + import org.apache.flex.core.ContainerBase; + import org.apache.flex.core.IBead; + import org.apache.flex.core.IBeadLayout; + import org.apache.flex.core.IBeadView; + import org.apache.flex.core.IContainer; + import org.apache.flex.core.ILayoutParent; + import org.apache.flex.core.IParentIUIBase; + import org.apache.flex.core.IStrand; + import org.apache.flex.core.IUIBase; + import org.apache.flex.core.IViewport; + import org.apache.flex.core.IViewportModel; + import org.apache.flex.core.UIBase; import org.apache.flex.core.UIMetrics; - import org.apache.flex.core.UIBase; - import org.apache.flex.core.ValuesManager; - import org.apache.flex.events.Event; - import org.apache.flex.events.IEventDispatcher; - import org.apache.flex.html.supportClasses.Border; - import org.apache.flex.html.supportClasses.ContainerContentArea; - import org.apache.flex.html.supportClasses.ScrollBar; + import org.apache.flex.core.ValuesManager; + import org.apache.flex.events.Event; + import org.apache.flex.html.beads.models.ViewportModel; + import org.apache.flex.html.supportClasses.Border; + import org.apache.flex.html.supportClasses.ContainerContentArea; + import org.apache.flex.html.supportClasses.Viewport; import org.apache.flex.utils.BeadMetrics; - /** - * The ContainerView class is the default view for - * the org.apache.flex.core.ContainerBase classes. - * It lets you use some CSS styles to manage the border, background - * and padding around the content area. - * - * @langversion 3.0 - * @playerversion Flash 10.2 - * @playerversion AIR 2.6 - * @productversion FlexJS 0.0 - */ public class ContainerView extends BeadViewBase implements IBeadView, ILayoutParent { - /** - * Constructor. + /** + * The ContainerView class is the default view for + * the org.apache.flex.core.ContainerBase classes. + * It lets you use some CSS styles to manage the border, background + * and padding around the content area. * * @langversion 3.0 * @playerversion Flash 10.2 @@ -62,29 +57,41 @@ package org.apache.flex.html.beads { } - /** - * The actual parent that parents the children. - * - * @langversion 3.0 - * @playerversion Flash 10.2 - * @playerversion AIR 2.6 - * @productversion FlexJS 0.0 - */ + /** + * The actual parent that parents the children. + * + * @langversion 3.0 + * @playerversion Flash 10.2 + * @playerversion AIR 2.6 + * @productversion FlexJS 0.0 + */ protected var actualParent:UIBase; - - /** - * The layout. The layout may actually layout - * the children of the internal content area - * and not the pieces of the "chrome" like titlebars - * and borders. The ContainerView or its subclass will have some - * baked-in logic for handling the chrome. - * - * @langversion 3.0 - * @playerversion Flash 10.2 - * @playerversion AIR 2.6 - * @productversion FlexJS 0.0 - */ - protected var layout:IBeadLayout; + + /** + * @private + */ + private var viewportModel:IViewportModel; + + private var _viewport:IViewport; + + /** + * The Viewport used to manage the display of the content area. + * + * @langversion 3.0 + * @playerversion Flash 10.2 + * @playerversion AIR 2.6 + * @productversion FlexJS 0.0 + */ + public function get viewport():IViewport + { + return _viewport; + } + public function set viewport(value:IViewport):void + { + _viewport = value; + } + + private var _strand:IStrand; /** * @copy org.apache.flex.core.IBead#strand @@ -97,200 +104,207 @@ package org.apache.flex.html.beads override public function set strand(value:IStrand):void { super.strand = value; - - var host:UIBase = value as UIBase; - - if (host.isWidthSizedToContent() && host.isHeightSizedToContent()) - { - // if both dimensions are sized to content, then only draw the - // borders, etc, after a child is added. The children in an MXML - // document don't send this event until the last child is added. - host.addEventListener("childrenAdded", changeHandler); - host.addEventListener("layoutNeeded", changeHandler); - // listen for width and height changes as well in case the app - // switches away from content sizing via binding or other code - host.addEventListener("widthChanged", changeHandler); - host.addEventListener("heightChanged", changeHandler); - } - else - { - // otherwise, listen for size changes before drawing - // borders and laying out children. - host.addEventListener("widthChanged", changeHandler); - host.addEventListener("heightChanged", changeHandler); - host.addEventListener("sizeChanged", sizeChangeHandler); - // if we have fixed size in both dimensions, listen for children - // being added, but also force an initial display to get the - // background, border, etc. - if (!isNaN(host.explicitWidth) && !isNaN(host.explicitHeight)) { - host.addEventListener("childrenAdded", changeHandler); - displayBackgroundAndBorder(host); - } - } - checkActualParent(); - } - - private function checkActualParent():Boolean - { - var host:UIBase = UIBase(_strand); - if (contentAreaNeeded()) - { - if (actualParent == null || actualParent == host) - { - actualParent = new ContainerContentArea(); - actualParent.className = "ActualParent"; - host.addElement(actualParent, false); - ContainerBase(host).setActualParent(actualParent); - } - return true; - } - else - { - actualParent = host; - } - return false; - } - - private function sizeChangeHandler(event:Event):void - { - var host:UIBase = UIBase(_strand); - host.addEventListener("childrenAdded", changeHandler); - host.addEventListener("layoutNeeded", changeHandler); - host.addEventListener("itemsCreated", changeHandler); - changeHandler(event); - } - - private var inChangeHandler:Boolean = false; - - /** - * React if the size changed or content changed + + _strand = value; + + var host:UIBase = value as UIBase; + var metrics:UIMetrics = getMetrics(); + + checkActualParent(true); + + createViewport(metrics); + + viewport.updateContentAreaSize(); + + if (!host.isWidthSizedToContent() && !host.isHeightSizedToContent()) { + displayBackgroundAndBorder(host); + } + + host.addEventListener("childrenAdded", changeHandler); + host.addEventListener("layoutNeeded", changeHandler); + host.addEventListener("widthChanged", resizeHandler); + host.addEventListener("heightChanged", resizeHandler); + } + + /** + * Creates and initializes the Viewport. Subclasses can override this to + * reposition the Viewport, via the Viewport's model, to suit their needs. * * @langversion 3.0 * @playerversion Flash 10.2 * @playerversion AIR 2.6 * @productversion FlexJS 0.0 - */ - protected function changeHandler(event:Event):void - { - if (inChangeHandler) return; - - inChangeHandler = true; - - var host:UIBase = UIBase(_strand); - var originalHostWidth:Number = host.width; - var originalHostHeight:Number = host.height; - - if (layout == null) - { - layout = _strand.getBeadByType(IBeadLayout) as IBeadLayout; - if (layout == null) - { - var c:Class = ValuesManager.valuesImpl.getValue(host, "iBeadLayout"); - if (c) - { - layout = new c() as IBeadLayout; - _strand.addBead(layout); - } - } - } - - var metrics:UIMetrics = determineMetrics(); + */ + protected function createViewport(metrics:UIMetrics):void + { + viewportModel = new ViewportModel(); - if (checkActualParent()) - { - actualParent.x = metrics.left; - actualParent.y = metrics.top; - } - var pb:Number = metrics.bottom; - if (isNaN(pb)) - pb = 0; - var pr:Number = metrics.right; - if (isNaN(pr)) - pr = 0; + // the viewport takes the entire space as there is no default chrome. + // if chrome children get added the viewport will need to be adjusted + // accordingly. + viewportModel.viewportHeight = host.height; + viewportModel.viewportWidth = host.width; + viewportModel.viewportX = 0; + viewportModel.viewportY = 0; - var sizeChangedByLayout:Boolean; + // default the content area to match the viewport's size. later, the + // viewport will resize and position the contentArea if needed. + viewportModel.contentHeight = viewportModel.viewportHeight - metrics.top - metrics.bottom; + viewportModel.contentWidth = viewportModel.viewportWidth - metrics.left - metrics.right; + viewportModel.contentX = viewportModel.viewportX + metrics.left; + viewportModel.contentY = viewportModel.viewportY + metrics.top; - // if the width is dictated by the parent - if (!host.isWidthSizedToContent()) - { - if (actualParent != host) - { - // force the width of the internal content area as desired. - actualParent.setWidth(host.width); - } - // run the layout - sizeChangedByLayout = layout.layout(); - } - else - { - // if the height is dictated by the parent - if (!host.isHeightSizedToContent()) - { - if (actualParent != host) - { - // force the height - actualParent.setHeight(host.height); - } - } - sizeChangedByLayout = layout.layout(); - if (actualParent != host) - { - // actualParent.width should be the new width after layout. - // set the host's width. This should send a widthChanged event and - // have it blocked at the beginning of this method -//old host.setWidth(padding.paddingLeft + pr + actualParent.width); - host.setWidth(actualParent.width); - } - } - // and if the height is sized to content, set the height now as well. - if (host != actualParent) - { - if (host.isHeightSizedToContent()) { - host.setHeight(actualParent.height); + viewportModel.horizontalScrollPosition = 0; + viewportModel.verticalScrollPosition = 0; + viewportModel.contentArea = actualParent; + + if (viewport == null) { + viewport = _strand.getBeadByType(IViewport) as IViewport; + if (viewport == null) { + var c:Class = ValuesManager.valuesImpl.getValue(host, "iViewport"); + if (c) + { + viewport = new c() as IViewport; + _strand.addBead(viewport); + } + else { + viewport = new Viewport(); + _strand.addBead(viewport); + } } - else - actualParent.setHeight(host.height); - } - // if host and actualParent are the same, determine if the layout changed - // the size and if, dispatch events based on what changed - else if (sizeChangedByLayout) + viewport.model = viewportModel; + } + } + + /** + * Event handler invoked whenever the size or children are added. + * + * @langversion 3.0 + * @playerversion Flash 10.2 + * @playerversion AIR 2.6 + * @productversion FlexJS 0.0 + */ + protected function changeHandler(event:Event):void + { + var host:UIBase = UIBase(_strand); + + // add the layout to the viewport if not done so already + if (viewportModel.layout == null) { - if (originalHostWidth != host.width) - host.dispatchEvent(new Event("widthChanged")); - if (originalHostHeight != host.height) - host.dispatchEvent(new Event("heightChanged")); + viewportModel.layout = _strand.getBeadByType(IBeadLayout) as IBeadLayout; + if (viewportModel.layout == null) + { + var c:Class = ValuesManager.valuesImpl.getValue(host, "iBeadLayout"); + if (c) + { + viewportModel.layout = new c() as IBeadLayout; + _strand.addBead(viewportModel.layout); + } + } } + // Run the layout which will not only size and position the children + // of the contentArea (actualParent), but will also change the viewport + // model's content size properties. + if (viewport.runLayout()) + { + handleContentResize(); + } + + // update the contentArea so that it exposes all of the items as placed + // by the layout. + viewport.updateContentAreaSize(); + displayBackgroundAndBorder(host); - - inChangeHandler = false; } - protected function displayBackgroundAndBorder(host:UIBase) : void + protected function handleContentResize():void { - var backgroundColor:Object = ValuesManager.valuesImpl.getValue(host, "background-color"); - var backgroundImage:Object = ValuesManager.valuesImpl.getValue(host, "background-image"); - if (backgroundColor != null || backgroundImage != null) + var host:UIBase = UIBase(_strand); + + // If the host is being sized by its content, the change in the contentArea + // causes the host's size to change + if (host.isWidthSizedToContent() && host.isHeightSizedToContent()) { + host.setWidthAndHeight(viewportModel.contentWidth, viewportModel.contentHeight, true); + + viewportModel.viewportHeight = host.height; + viewportModel.viewportWidth = host.width; + } + + // if the width is fixed and the height is changing, then set up horizontal + // scrolling (if the viewport supports it). + else if (!host.isWidthSizedToContent() && host.isHeightSizedToContent()) { - if (host.getBeadByType(IBackgroundBead) == null) - host.addBead(new (ValuesManager.valuesImpl.getValue(host, "iBackgroundBead")) as IBead); + viewport.needsHorizontalScroller(); + + host.setHeight(viewportModel.contentHeight, false); + viewportModel.viewportHeight = host.height; + } - - var borderStyle:String; - var borderStyles:Object = ValuesManager.valuesImpl.getValue(host, "border"); - if (borderStyles is Array) + + // if the height is fixed and the width can change, then set up + // vertical scrolling (if the viewport supports it). + else if (host.isWidthSizedToContent() && !host.isHeightSizedToContent()) { - borderStyle = borderStyles[1]; + viewport.needsVerticalScroller(); + + host.setWidth(viewportModel.contentWidth+viewport.scrollerWidth(), false); + viewportModel.viewportWidth = host.width; } - if (borderStyle == null) + + // Otherwise the viewport needs to display some scrollers (or other elements + // allowing the rest of the contentArea to be visible) + else { + + viewport.needsScrollers(); + } + } + + /** + * @private + */ + private function resizeHandler(event:Event):void + { +// if (event.currentTarget == _strand) { +// return; +// } + + var host:UIBase = UIBase(_strand); + trace("host is now "+host.width + " x " +host.height); + + viewportModel.viewportHeight = host.height; + viewportModel.viewportWidth = host.width; + + if (!host.isWidthSizedToContent()) viewportModel.contentWidth = host.width; + if (!host.isHeightSizedToContent()) viewportModel.contentHeight = host.height; + + changeHandler(event); + + viewport.updateSize(); + } + + /** + * @private + */ + protected function checkActualParent(force:Boolean=false):Boolean + { + var host:UIBase = UIBase(_strand); + if (contentAreaNeeded() || force) { - borderStyle = ValuesManager.valuesImpl.getValue(host, "border-style") as String; + if (actualParent == null || actualParent == host) + { + actualParent = new ContainerContentArea(); + actualParent.className = "ActualParent"; + host.addElement(actualParent, false); + ContainerBase(host).setActualParent(actualParent); + } + return true; } - if (borderStyle != null && borderStyle != "none") + else { - if (host.getBeadByType(IBorderBead) == null) - host.addBead(new (ValuesManager.valuesImpl.getValue(host, "iBorderBead")) as IBead); + actualParent = host; } + return false; } /** @@ -303,38 +317,85 @@ package org.apache.flex.html.beads */ protected function contentAreaNeeded():Boolean { - var metrics:UIMetrics = determineMetrics(); + var metrics:UIMetrics = getMetrics(); return (!isNaN(metrics.left) && metrics.left > 0 || - !isNaN(metrics.top) && metrics.top > 0); + !isNaN(metrics.top) && metrics.top > 0); } - /** - * The parent of the children. - * - * @langversion 3.0 - * @playerversion Flash 10.2 - * @playerversion AIR 2.6 - * @productversion FlexJS 0.0 - */ + /** + * Returns the metrics (border, padding) of the strand. + * + * @langversion 3.0 + * @playerversion Flash 10.2 + * @playerversion AIR 2.6 + * @productversion FlexJS 0.0 + */ + public function getMetrics():UIMetrics + { + return BeadMetrics.getMetrics(_strand); + } + + /** + * The parent of the children. + * + * @langversion 3.0 + * @playerversion Flash 10.2 + * @playerversion AIR 2.6 + * @productversion FlexJS 0.0 + */ public function get contentView():IParentIUIBase { return actualParent; } - /** - * The host component, which can resize to different slots. - * - * @langversion 3.0 - * @playerversion Flash 10.2 - * @playerversion AIR 2.6 - * @productversion FlexJS 0.0 - */ + /** + * The host component, which can resize to different slots. + * + * @langversion 3.0 + * @playerversion Flash 10.2 + * @playerversion AIR 2.6 + * @productversion FlexJS 0.0 + */ public function get resizableView():IUIBase { return _strand as IUIBase; } + protected function displayBackgroundAndBorder(host:UIBase) : void + { + var backgroundColor:Object = ValuesManager.valuesImpl.getValue(host, "background-color"); + var backgroundImage:Object = ValuesManager.valuesImpl.getValue(host, "background-image"); + if (backgroundColor != null || backgroundImage != null) + { + if (host.getBeadByType(IBackgroundBead) == null) + var c:Class = ValuesManager.valuesImpl.getValue(host, "iBackgroundBead"); + if (c) { + host.addBead( new c() as IBead ); + } + } + + var borderStyle:String; + var borderStyles:Object = ValuesManager.valuesImpl.getValue(host, "border"); + if (borderStyles is Array) + { + borderStyle = borderStyles[1]; + } + if (borderStyle == null) + { + borderStyle = ValuesManager.valuesImpl.getValue(host, "border-style") as String; + } + if (borderStyle != null && borderStyle != "none") + { + if (host.getBeadByType(IBorderBead) == null) { + c = ValuesManager.valuesImpl.getValue(host, "iBorderBead"); + if (c) { + host.addBead( new c() as IBead ); + } + } + } + } + private var inGetViewHeight:Boolean; /** @@ -373,7 +434,7 @@ package org.apache.flex.html.beads if (inGetViewWidth) { //trace("ContainerView: no width set for " + host); - var metrics:UIMetrics = determineMetrics(); + var metrics:UIMetrics = getMetrics(); return host["$width"] + metrics.left + metrics.right; } inGetViewWidth = true; @@ -381,11 +442,5 @@ package org.apache.flex.html.beads inGetViewWidth = false; return vw; } - - protected function determineMetrics():UIMetrics - { - return BeadMetrics.getMetrics(_strand); - } - } -} +} \ No newline at end of file http://git-wip-us.apache.org/repos/asf/flex-asjs/blob/f62f49c7/frameworks/projects/HTML/as/src/org/apache/flex/html/beads/ListView.as ---------------------------------------------------------------------- diff --git a/frameworks/projects/HTML/as/src/org/apache/flex/html/beads/ListView.as b/frameworks/projects/HTML/as/src/org/apache/flex/html/beads/ListView.as index 86ea70d..886a9aa 100644 --- a/frameworks/projects/HTML/as/src/org/apache/flex/html/beads/ListView.as +++ b/frameworks/projects/HTML/as/src/org/apache/flex/html/beads/ListView.as @@ -19,11 +19,13 @@ package org.apache.flex.html.beads { import org.apache.flex.core.BeadViewBase; + import org.apache.flex.core.ContainerBase; import org.apache.flex.core.IBead; import org.apache.flex.core.IBeadLayout; import org.apache.flex.core.IBeadModel; import org.apache.flex.core.IBeadView; import org.apache.flex.core.ISelectableItemRenderer; + import org.apache.flex.core.IItemRenderer; import org.apache.flex.core.IItemRendererParent; import org.apache.flex.core.IScrollingLayoutParent; import org.apache.flex.core.IParent; @@ -54,7 +56,7 @@ package org.apache.flex.html.beads * @playerversion AIR 2.6 * @productversion FlexJS 0.0 */ - public class ListView extends Strand implements IBeadView, IStrand, IListView, IScrollingLayoutParent + public class ListView extends ContainerView implements IListView { public function ListView() { @@ -96,36 +98,6 @@ package org.apache.flex.html.beads _dataGroup = value; } - private var _vScrollBar:ScrollBar; - - /** - * The vertical org.apache.flex.html.ScrollBar, if needed. - * - * @langversion 3.0 - * @playerversion Flash 10.2 - * @playerversion AIR 2.6 - * @productversion FlexJS 0.0 - */ - public function get vScrollBar():ScrollBar - { - if (!_vScrollBar) - _vScrollBar = createScrollBar(); - return _vScrollBar; - } - - /** - * The horizontal org.apache.flex.html.ScrollBar, currently null. - * - * @langversion 3.0 - * @playerversion Flash 10.2 - * @playerversion AIR 2.6 - * @productversion FlexJS 0.0 - */ - public function get hScrollBar():ScrollBar - { - return null; - } - /** * The contentArea includes the dataGroup and scrollBars. * @@ -134,7 +106,7 @@ package org.apache.flex.html.beads * @playerversion AIR 2.6 * @productversion FlexJS 0.0 */ - public function get contentView():IParentIUIBase + override public function get contentView():IParentIUIBase { return _dataGroup as IParentIUIBase; } @@ -142,17 +114,15 @@ package org.apache.flex.html.beads /** * @private */ - public function get resizableView():IUIBase + override public function get resizableView():IUIBase { return _strand as IUIBase; } - - private var _layout:IBeadLayout; /** * @private */ - public function get host():IUIBase + override public function get host():IUIBase { return _strand as IUIBase; } @@ -167,35 +137,32 @@ package org.apache.flex.html.beads * @playerversion AIR 2.6 * @productversion FlexJS 0.0 */ - public function set strand(value:IStrand):void + override public function set strand(value:IStrand):void { _strand = value; - - for each (var bead:IBead in beads) - addBead(bead); + super.strand = value; - dispatchEvent(new org.apache.flex.events.Event("beadsAdded")); IEventDispatcher(_strand).addEventListener("widthChanged", handleSizeChange); IEventDispatcher(_strand).addEventListener("heightChanged",handleSizeChange); // this gets sent at least once after the beads are all in place. IEventDispatcher(_strand).addEventListener("layoutNeeded",handleSizeChange); - + IEventDispatcher(_strand).addEventListener("itemsCreated", changeHandler); + listModel = value.getBeadByType(ISelectionModel) as ISelectionModel; listModel.addEventListener("selectedIndexChanged", selectionChangeHandler); listModel.addEventListener("rollOverIndexChanged", rollOverIndexChangeHandler); listModel.addEventListener("dataProviderChanged", dataProviderChangeHandler); - - _border = new Border(); - _border.model = new (ValuesManager.valuesImpl.getValue(value, "iBorderModel")) as IBeadModel; - _strand.addBead(new (ValuesManager.valuesImpl.getValue(value, "iBorderBead")) as IBead); - IParent(_strand).addElement(_border); - + } + + override protected function checkActualParent(force:Boolean=false):Boolean + { if (_dataGroup == null) { - _dataGroup = new (ValuesManager.valuesImpl.getValue(value, "iDataGroup")) as IItemRendererParent; + _dataGroup = new (ValuesManager.valuesImpl.getValue(_strand, "iDataGroup")) as IItemRendererParent; + actualParent = _dataGroup as UIBase; + IParent(_strand).addElement(_dataGroup,false); } - IParent(_strand).addElement(_dataGroup); - + return true; } private var lastSelectedIndex:int = -1; @@ -206,6 +173,7 @@ package org.apache.flex.html.beads protected function dataProviderChangeHandler(event:Event):void { // override if needed + changeHandler(event); } /** @@ -245,46 +213,6 @@ package org.apache.flex.html.beads } lastRollOverIndex = IRollOverModel(listModel).rollOverIndex; } - - /** - * @private - */ - private function createScrollBar():ScrollBar - { - var vsb:ScrollBar; - vsb = new ScrollBar(); - var vsbm:ScrollBarModel = new ScrollBarModel(); - vsbm.maximum = 100; - vsbm.minimum = 0; - vsbm.pageSize = 10; - vsbm.pageStepSize = 10; - vsbm.snapInterval = 1; - vsbm.stepSize = 1; - vsbm.value = 0; - vsb.model = vsbm; - vsb.x = IUIBase(_strand).width - 16; - vsb.y = 0; - vsb.setWidthAndHeight(16, IUIBase(_strand).height, true); - IParent(_strand).addElement(vsb); - return vsb; - } - - /** - * Layout everything except the DataGroup, - * but size the DataGroup as needed - * - * @langversion 3.0 - * @playerversion Flash 10.2 - * @playerversion AIR 2.6 - * @productversion FlexJS 0.0 - */ - protected function layoutList():void - { - UIBase(_dataGroup).x = 0; - UIBase(_dataGroup).y = 0; - UIBase(_dataGroup).width = UIBase(_strand).width; - UIBase(_dataGroup).height = UIBase(_strand).height; - } /** * respond to a change in size or request to re-layout everything @@ -296,18 +224,7 @@ package org.apache.flex.html.beads */ protected function handleSizeChange(event:Event):void { - layoutList(); - - if (_layout == null) - { - _layout = _strand.getBeadByType(IBeadLayout) as IBeadLayout; - if (_layout == null) - { - _layout = new (ValuesManager.valuesImpl.getValue(_strand, "iBeadLayout")) as IBeadLayout; - _strand.addBead(_layout); - } - } - _layout.layout(); + _dataGroup.updateAllItemRenderers(); } /** @@ -318,7 +235,7 @@ package org.apache.flex.html.beads * @playerversion AIR 2.6 * @productversion FlexJS 0.0 */ - public function get viewHeight():Number + override public function get viewHeight():Number { // don't want to put $height in an interface return _strand["$height"]; @@ -332,7 +249,7 @@ package org.apache.flex.html.beads * @playerversion AIR 2.6 * @productversion FlexJS 0.0 */ - public function get viewWidth():Number + override public function get viewWidth():Number { // don't want to put $width in an interface return _strand["$width"]; http://git-wip-us.apache.org/repos/asf/flex-asjs/blob/f62f49c7/frameworks/projects/HTML/as/src/org/apache/flex/html/beads/PanelView.as ---------------------------------------------------------------------- diff --git a/frameworks/projects/HTML/as/src/org/apache/flex/html/beads/PanelView.as b/frameworks/projects/HTML/as/src/org/apache/flex/html/beads/PanelView.as index f7303e7..7004b6d 100644 --- a/frameworks/projects/HTML/as/src/org/apache/flex/html/beads/PanelView.as +++ b/frameworks/projects/HTML/as/src/org/apache/flex/html/beads/PanelView.as @@ -23,6 +23,7 @@ package org.apache.flex.html.beads import org.apache.flex.core.IBeadView; import org.apache.flex.core.IStrand; import org.apache.flex.core.IUIBase; + import org.apache.flex.core.IViewportModel; import org.apache.flex.core.UIBase; import org.apache.flex.core.UIMetrics; import org.apache.flex.events.Event; @@ -99,12 +100,57 @@ package org.apache.flex.html.beads // be picked up automatically by the TitleBar. titleBar.model = host.model; host.addElement(titleBar, false); - titleBar.addEventListener("heightChanged", changeHandler); + titleBar.addEventListener("heightChanged", titleBarHeightChanged); if (isNaN(host.explicitWidth) && isNaN(host.percentWidth)) titleBar.addEventListener("widthChanged", changeHandler); + + trace("TitleBar's height: "+titleBar.height); super.strand = value; - + + } + + private function setupViewport(metrics:UIMetrics):void + { + var host:UIBase = UIBase(_strand); + + titleBar.width = host.width; + + var model:IViewportModel = viewport.model; + model.viewportX = 0; + model.viewportY = titleBar.height; + model.viewportWidth = host.width; + model.viewportHeight = host.height - titleBar.height; + model.contentX = model.viewportX + metrics.left; + model.contentY = model.viewportY + metrics.top; + model.contentWidth = model.viewportWidth - metrics.left - metrics.right; + model.contentHeight = model.viewportHeight - metrics.top - metrics.bottom; + } + + override protected function createViewport(metrics:UIMetrics):void + { + super.createViewport(metrics); + setupViewport(metrics); + } + + override protected function handleContentResize():void + { + super.handleContentResize(); + + var host:UIBase = UIBase(_strand); + titleBar.width = host.width; + } + + override protected function changeHandler(event:Event):void + { + titleBar.width = UIBase(_strand).width; + super.changeHandler(event); + } + + private function titleBarHeightChanged(event:Event):void + { + var metrics:UIMetrics = this.getMetrics(); + setupViewport(metrics); } /** @@ -115,17 +161,6 @@ package org.apache.flex.html.beads { return true; } - - /** - * @private - */ - override protected function determineMetrics():UIMetrics - { - var metrics:UIMetrics = super.determineMetrics(); - titleBar.width = UIBase(_strand).width; - metrics.top += titleBar.height; - return metrics; - } } } http://git-wip-us.apache.org/repos/asf/flex-asjs/blob/f62f49c7/frameworks/projects/HTML/as/src/org/apache/flex/html/beads/PanelWithControlBarView.as ---------------------------------------------------------------------- diff --git a/frameworks/projects/HTML/as/src/org/apache/flex/html/beads/PanelWithControlBarView.as b/frameworks/projects/HTML/as/src/org/apache/flex/html/beads/PanelWithControlBarView.as index 69645fb..54e6482 100644 --- a/frameworks/projects/HTML/as/src/org/apache/flex/html/beads/PanelWithControlBarView.as +++ b/frameworks/projects/HTML/as/src/org/apache/flex/html/beads/PanelWithControlBarView.as @@ -25,6 +25,7 @@ package org.apache.flex.html.beads import org.apache.flex.core.ITitleBarModel; import org.apache.flex.core.IStrand; import org.apache.flex.core.IUIBase; + import org.apache.flex.core.IViewportModel; import org.apache.flex.core.UIBase; import org.apache.flex.core.UIMetrics; import org.apache.flex.events.Event; @@ -110,7 +111,7 @@ package org.apache.flex.html.beads // be picked up automatically by the TitleBar. titleBar.model = host.model; host.addElement(titleBar, false); - titleBar.addEventListener("heightChanged", changeHandler); + titleBar.addEventListener("heightChanged", chromeHeightChanged); if (isNaN(host.explicitWidth) && isNaN(host.percentWidth)) titleBar.addEventListener("widthChanged", changeHandler); @@ -126,7 +127,7 @@ package org.apache.flex.html.beads _controlBar.dispatchEvent(new Event("layoutNeeded")); host.addElement(controlBar, false); - controlBar.addEventListener("heightChanged", changeHandler); + controlBar.addEventListener("heightChanged", chromeHeightChanged); if (isNaN(host.explicitWidth) && isNaN(host.percentWidth)) controlBar.addEventListener("widthChanged", changeHandler); } @@ -134,66 +135,74 @@ package org.apache.flex.html.beads super.strand = value; } - /** - * Always returns true because Panel's content is separate from its chrome - * elements such as the title bar and optional control bar. - * - * @langversion 3.0 - * @playerversion Flash 10.2 - * @playerversion AIR 2.6 - * @productversion FlexJS 0.0 - */ - override protected function contentAreaNeeded():Boolean + private function setupViewport(metrics:UIMetrics):void { - return true; + var host:UIBase = UIBase(_strand); + + titleBar.width = host.width; + if (controlBar) { + controlBar.width = host.width; + controlBar.y = host.height - controlBar.height; + } + + var model:IViewportModel = viewport.model; + model.viewportX = 0; + model.viewportY = titleBar.height; + model.viewportWidth = host.width; + model.viewportHeight = host.height - titleBar.height; + if (controlBar) { + model.viewportHeight -= controlBar.height; + } + model.contentX = model.viewportX + metrics.left; + model.contentY = model.viewportY + metrics.top; + model.contentWidth = model.viewportWidth - metrics.left - metrics.right; + model.contentHeight = model.viewportHeight - metrics.top - metrics.bottom; } - /** - * @private - */ - override protected function determineMetrics():UIMetrics + override protected function createViewport(metrics:UIMetrics):void { - var metrics:UIMetrics = super.determineMetrics(); - titleBar.width = UIBase(_strand).width; - metrics.top += titleBar.height; + super.createViewport(metrics); + setupViewport(metrics); + } + + override protected function handleContentResize():void + { + super.handleContentResize(); - controlBar.width = UIBase(_strand).width; - metrics.bottom += controlBar.height; - - return metrics; + var host:UIBase = UIBase(_strand); + titleBar.width = host.width; + if (controlBar) { + controlBar.width = host.width; + controlBar.y = host.height - controlBar.height; + } } - /** - * @private - */ override protected function changeHandler(event:Event):void { + titleBar.width = UIBase(_strand).width; + controlBar.width = UIBase(_strand).width; + controlBar.y = UIBase(_strand).height - controlBar.height; super.changeHandler(event); - - controlBar.y = UIBase(_strand).height - controlBar.height; + } + + private function chromeHeightChanged(event:Event):void + { + var metrics:UIMetrics = this.getMetrics(); + setupViewport(metrics); } /** - * @private + * Always returns true because Panel's content is separate from its chrome + * elements such as the title bar and optional control bar. + * + * @langversion 3.0 + * @playerversion Flash 10.2 + * @playerversion AIR 2.6 + * @productversion FlexJS 0.0 */ - private function layoutChromeElements():void + override protected function contentAreaNeeded():Boolean { - var metrics:UIMetrics = determineMetrics(); - titleBar.x = 0; - titleBar.y = 0; - titleBar.width = UIBase(_strand).width; - - if (controlBar) { - controlBar.x = 0; - controlBar.y = UIBase(_strand).height - controlBar.height; - controlBar.width = UIBase(_strand).width; - } - - actualParent.x = metrics.left; - actualParent.y = titleBar.height + metrics.top; - actualParent.width = UIBase(_strand).width - metrics.left - metrics.right; - actualParent.height = UIBase(_strand).height - titleBar.height - metrics.top - metrics.bottom; - if (controlBar) actualParent.height -= controlBar.height; + return true; } } } http://git-wip-us.apache.org/repos/asf/flex-asjs/blob/f62f49c7/frameworks/projects/HTML/as/src/org/apache/flex/html/beads/ScrollingContainerView.as ---------------------------------------------------------------------- diff --git a/frameworks/projects/HTML/as/src/org/apache/flex/html/beads/ScrollingContainerView.as b/frameworks/projects/HTML/as/src/org/apache/flex/html/beads/ScrollingContainerView.as index a859b07..4c407f2 100644 --- a/frameworks/projects/HTML/as/src/org/apache/flex/html/beads/ScrollingContainerView.as +++ b/frameworks/projects/HTML/as/src/org/apache/flex/html/beads/ScrollingContainerView.as @@ -17,44 +17,35 @@ // //////////////////////////////////////////////////////////////////////////////// package org.apache.flex.html.beads -{ - +{ import org.apache.flex.core.BeadViewBase; import org.apache.flex.core.ContainerBase; import org.apache.flex.core.IBead; import org.apache.flex.core.IBeadLayout; import org.apache.flex.core.IBeadView; - import org.apache.flex.core.IParent; + import org.apache.flex.core.IContainer; + import org.apache.flex.core.ILayoutParent; import org.apache.flex.core.IParentIUIBase; - import org.apache.flex.core.IScrollingLayoutParent; import org.apache.flex.core.IStrand; import org.apache.flex.core.IUIBase; + import org.apache.flex.core.IViewportModel; import org.apache.flex.core.UIBase; import org.apache.flex.core.UIMetrics; import org.apache.flex.core.ValuesManager; import org.apache.flex.events.Event; - import org.apache.flex.html.Container; - import org.apache.flex.html.beads.models.ScrollBarModel; + import org.apache.flex.html.beads.models.ViewportModel; import org.apache.flex.html.supportClasses.Border; import org.apache.flex.html.supportClasses.ContainerContentArea; - import org.apache.flex.html.supportClasses.ScrollBar; + import org.apache.flex.html.supportClasses.Viewport; import org.apache.flex.utils.BeadMetrics; - /** - * The ContainerView class is the default view for - * the org.apache.flex.html.Container class. - * It lets you use some CSS styles to manage the border, background - * and padding around the content area. - * - * @langversion 3.0 - * @playerversion Flash 10.2 - * @playerversion AIR 2.6 - * @productversion FlexJS 0.0 - */ - public class ScrollingContainerView extends BeadViewBase implements IBeadView, IScrollingLayoutParent + public class ScrollingContainerView extends BeadViewBase implements IBeadView, ILayoutParent { - /** - * Constructor. + /** + * The ContainerView class is the default view for + * the org.apache.flex.core.ContainerBase classes. + * It lets you use some CSS styles to manage the border, background + * and padding around the content area. * * @langversion 3.0 * @playerversion Flash 10.2 @@ -63,40 +54,43 @@ package org.apache.flex.html.beads */ public function ScrollingContainerView() { - var vsbm:ScrollBarModel = new ScrollBarModel(); - vsbm.maximum = 0; - vsbm.minimum = 0; - vsbm.pageSize = 0; - vsbm.pageStepSize = 1; - vsbm.snapInterval = 1; - vsbm.stepSize = 1; - vsbm.value = 0; - _vScrollBarModel = vsbm; } - /** - * The actual parent that parents the children. - * - * @langversion 3.0 - * @playerversion Flash 10.2 - * @playerversion AIR 2.6 - * @productversion FlexJS 0.0 - */ + /** + * The actual parent that parents the children. + * + * @langversion 3.0 + * @playerversion Flash 10.2 + * @playerversion AIR 2.6 + * @productversion FlexJS 0.0 + */ protected var actualParent:UIBase; - - /** - * The layout. The layout may actually layout - * the children of the internal content area - * and not the pieces of the "chrome" like titlebars - * and borders. The ContainerView or its subclass will have some - * baked-in logic for handling the chrome. - * - * @langversion 3.0 - * @playerversion Flash 10.2 - * @playerversion AIR 2.6 - * @productversion FlexJS 0.0 - */ - protected var layout:IBeadLayout; + + /** + * @private + */ + private var viewportModel:IViewportModel; + + private var _viewport:Viewport; + + /** + * The Viewport used to manage the display of the content area. + * + * @langversion 3.0 + * @playerversion Flash 10.2 + * @playerversion AIR 2.6 + * @productversion FlexJS 0.0 + */ + public function get viewport():Viewport + { + return _viewport; + } + public function set viewport(value:Viewport):void + { + _viewport = value; + } + + private var _strand:IStrand; /** * @copy org.apache.flex.core.IBead#strand @@ -109,221 +103,260 @@ package org.apache.flex.html.beads override public function set strand(value:IStrand):void { super.strand = value; - var host:UIBase = value as UIBase; - actualParent = new ContainerContentArea(); - actualParent.className = "ActualParent"; - host.addElement(actualParent, false); - ContainerBase(host).setActualParent(actualParent); + _strand = value; - host.addEventListener("beadsAdded", changeHandler); - - if (host.isWidthSizedToContent() && host.isHeightSizedToContent()) - { - // if both dimensions are sized to content, then only draw the - // borders, etc, after a child is added. The children in an MXML - // document don't send this event until the last child is added. - host.addEventListener("childrenAdded", changeHandler); - host.addEventListener("layoutNeeded", changeHandler); - // listen for width and height changes as well in case the app - // switches away from content sizing via binding or other code - host.addEventListener("widthChanged", changeHandler); - host.addEventListener("heightChanged", changeHandler); - } - else - { - // otherwise, listen for size changes before drawing - // borders and laying out children. - host.addEventListener("widthChanged", changeHandler); - host.addEventListener("heightChanged", changeHandler); - host.addEventListener("sizeChanged", sizeChangeHandler); - // if we have fixed size in both dimensions, wait for children - // to be added then run a layout pass right then as the - // parent won't kick off any other event in the child - if (!isNaN(host.explicitWidth) && !isNaN(host.explicitHeight)) - { - if (host.numChildren == 0) - host.addEventListener("childrenAdded", changeHandler); - } - } + var host:UIBase = value as UIBase; + var metrics:UIMetrics = getMetrics(); - displayBackgroundAndBorder(host); - } - - private function sizeChangeHandler(event:Event):void - { - var host:UIBase = UIBase(_strand); - host.addEventListener("childrenAdded", changeHandler); - host.addEventListener("layoutNeeded", changeHandler); - host.addEventListener("itemsCreated", changeHandler); - } - - private var inChangeHandler:Boolean = false; - - private function changeHandler(event:Event):void - { - if (inChangeHandler) return; + checkActualParent(true); - inChangeHandler = true; + createViewport(metrics); - var host:UIBase = _strand as UIBase; - if (layout == null) - { - layout = host.getBeadByType(IBeadLayout) as IBeadLayout; - if (layout == null) - { - var c:Class = ValuesManager.valuesImpl.getValue(host, "iBeadLayout"); - if (c) - { - layout = new c() as IBeadLayout; - host.addBead(layout); - } - } - } - - var metrics:UIMetrics = BeadMetrics.getMetrics(host); + viewport.updateContentAreaSize(); - actualParent.x = metrics.left; - actualParent.y = metrics.top; - actualParent.width = host.width - metrics.left - metrics.right; - actualParent.height = host.height - metrics.top -metrics.bottom; - // note that adding a scrollbar will go against the host's right - // edge and be separated from the actualParent by padding-right - - layout.layout(); + if (!host.isWidthSizedToContent() && !host.isHeightSizedToContent()) { + displayBackgroundAndBorder(host); + } - inChangeHandler = false; + host.addEventListener("childrenAdded", changeHandler); + host.addEventListener("layoutNeeded", changeHandler); + host.addEventListener("widthChanged", resizeHandler); + host.addEventListener("heightChanged", resizeHandler); } - /** - * The parent of the children. + /** + * Creates and initializes the Viewport. Subclasses can override this to + * reposition the Viewport, via the Viewport's model, to suit their needs. * * @langversion 3.0 * @playerversion Flash 10.2 * @playerversion AIR 2.6 * @productversion FlexJS 0.0 - */ - public function get contentView():IParentIUIBase + */ + protected function createViewport(metrics:UIMetrics):void { - return actualParent; + viewportModel = new ViewportModel(); + + // the viewport takes the entire space as there is no default chrome. + // if chrome children get added the viewport will need to be adjusted + // accordingly. + viewportModel.viewportHeight = host.height; + viewportModel.viewportWidth = host.width; + viewportModel.viewportX = 0; + viewportModel.viewportY = 0; + + // default the content area to match the viewport's size. later, the + // viewport will resize and position the contentArea if needed. + viewportModel.contentHeight = viewportModel.viewportHeight - metrics.top - metrics.bottom; + viewportModel.contentWidth = viewportModel.viewportWidth - metrics.left - metrics.right; + viewportModel.contentX = viewportModel.viewportX + metrics.left; + viewportModel.contentY = viewportModel.viewportY + metrics.top; + + viewportModel.horizontalScrollPosition = 0; + viewportModel.verticalScrollPosition = 0; + viewportModel.contentArea = actualParent; + + if (viewport == null) { + viewport = _strand.getBeadByType(Viewport) as Viewport; + if (viewport == null) { + var c:Class = ValuesManager.valuesImpl.getValue(host, "iViewport"); + if (c) + { + viewport = new c() as Viewport; + _strand.addBead(viewport); + } + else { + viewport = new Viewport(); + _strand.addBead(viewport); + } + } + viewport.model = viewportModel; + } } - - /** - * The border. + + /** + * Event handler invoked whenever the size or children are added. * * @langversion 3.0 * @playerversion Flash 10.2 * @playerversion AIR 2.6 * @productversion FlexJS 0.0 */ - public function get border():Border + protected function changeHandler(event:Event):void { - return null; + var host:UIBase = UIBase(_strand); + + // add the layout to the viewport if not done so already + if (viewportModel.layout == null) + { + viewportModel.layout = _strand.getBeadByType(IBeadLayout) as IBeadLayout; + if (viewportModel.layout == null) + { + var c:Class = ValuesManager.valuesImpl.getValue(host, "iBeadLayout"); + if (c) + { + viewportModel.layout = new c() as IBeadLayout; + _strand.addBead(viewportModel.layout); + } + } + } + + // Run the layout which will not only size and position the children + // of the contentArea (actualParent), but will also change the viewport + // model's content size properties. + if (viewport.runLayout()) + { + handleContentResize(); + } + + // update the contentArea so that it exposes all of the items as placed + // by the layout. + viewport.updateContentAreaSize(); + + displayBackgroundAndBorder(host); } - /** - * The host component, which can resize to different slots. - * - * @langversion 3.0 - * @playerversion Flash 10.2 - * @playerversion AIR 2.6 - * @productversion FlexJS 0.0 - */ - public function get resizableView():IUIBase + protected function handleContentResize():void { - return _strand as IUIBase; + var host:UIBase = UIBase(_strand); + + // If the host is being sized by its content, the change in the contentArea + // causes the host's size to change + if (host.isWidthSizedToContent() && host.isHeightSizedToContent()) { + host.setWidthAndHeight(viewportModel.contentWidth, viewportModel.contentHeight, true); + + viewportModel.viewportHeight = host.height; + viewportModel.viewportWidth = host.width; + } + + // if the width is fixed and the height is changing, then set up horizontal + // scrolling (if the viewport supports it). + else if (!host.isWidthSizedToContent() && host.isHeightSizedToContent()) + { + viewport.needsHorizontalScroller(); + + host.setHeight(viewportModel.contentHeight, false); + viewportModel.viewportHeight = host.height; + + } + + // if the height is fixed and the width can change, then set up + // vertical scrolling (if the viewport supports it). + else if (host.isWidthSizedToContent() && !host.isHeightSizedToContent()) + { + viewport.needsVerticalScroller()(); + + host.setWidth(viewportModel.contentWidth+viewport.scrollerWidth(), false); + viewportModel.viewportWidth = host.width; + } + + // Otherwise the viewport needs to display some scrollers (or other elements + // allowing the rest of the contentArea to be visible) + else { + + viewport.needsScrollers(); + } } - private var _vScrollBarModel:ScrollBarModel; - private var _vScrollBar:ScrollBar; - - /** - * The vertical ScrollBar, if it exists. - * - * @langversion 3.0 - * @playerversion Flash 10.2 - * @playerversion AIR 2.6 - * @productversion FlexJS 0.0 - */ - public function get vScrollBar():ScrollBar + /** + * @private + */ + private function resizeHandler(event:Event):void { - if (!_vScrollBar) - _vScrollBar = createScrollBar(); - return _vScrollBar; + var host:UIBase = UIBase(_strand); + trace("host is now "+host.width + " x " +host.height); + + viewportModel.viewportHeight = host.height; + viewportModel.viewportWidth = host.width; + + if (!host.isWidthSizedToContent()) viewportModel.contentWidth = host.width; + if (!host.isHeightSizedToContent()) viewportModel.contentHeight = host.height; + + changeHandler(event); + + viewport.updateSize(); } - /** - * The horizontal ScrollBar, if it exists. - * - * @langversion 3.0 - * @playerversion Flash 10.2 - * @playerversion AIR 2.6 - * @productversion FlexJS 0.0 - */ - public function get hScrollBar():ScrollBar + /** + * @private + */ + protected function checkActualParent(force:Boolean=false):Boolean { - return null; + var host:UIBase = UIBase(_strand); + if (contentAreaNeeded() || force) + { + if (actualParent == null || actualParent == host) + { + actualParent = new ContainerContentArea(); + actualParent.className = "ActualParent"; + host.addElement(actualParent, false); + ContainerBase(host).setActualParent(actualParent); + } + return true; + } + else + { + actualParent = host; + } + return false; + } + + /** + * Returns true if container to create a separate ContainerContentArea. + * + * @langversion 3.0 + * @playerversion Flash 10.2 + * @playerversion AIR 2.6 + * @productversion FlexJS 0.0 + */ + protected function contentAreaNeeded():Boolean + { + var metrics:UIMetrics = getMetrics(); + + return (!isNaN(metrics.left) && metrics.left > 0 || + !isNaN(metrics.top) && metrics.top > 0); + } + + /** + * Returns the metrics (border, padding) of the strand. + * + * @langversion 3.0 + * @playerversion Flash 10.2 + * @playerversion AIR 2.6 + * @productversion FlexJS 0.0 + */ + public function getMetrics():UIMetrics + { + return BeadMetrics.getMetrics(_strand); + } + + /** + * The parent of the children. + * + * @langversion 3.0 + * @playerversion Flash 10.2 + * @playerversion AIR 2.6 + * @productversion FlexJS 0.0 + */ + public function get contentView():IParentIUIBase + { + return actualParent; } - - /** - * @private - */ - private function createScrollBar():ScrollBar - { - var vsb:ScrollBar; - vsb = new ScrollBar(); - vsb.model = _vScrollBarModel; - // pin to right side by default - vsb.x = IUIBase(_strand).width - 16; - vsb.y = 0; - vsb.setWidthAndHeight(16, IUIBase(_strand).height, true); - IParent(_strand).addElement(vsb, false); - return vsb; - } - - /** - * The position of the vertical scrollbar - * - * @langversion 3.0 - * @playerversion Flash 10.2 - * @playerversion AIR 2.6 - * @productversion FlexJS 0.0 - */ - public function get verticalScrollPosition():Number - { - return _vScrollBarModel.value; - } - - /** - * @private - */ - public function set verticalScrollPosition(value:Number):void - { - _vScrollBarModel.value = value; - } - - /** - * The maximum position of the vertical scrollbar - * - * @langversion 3.0 - * @playerversion Flash 10.2 - * @playerversion AIR 2.6 - * @productversion FlexJS 0.0 - */ - public function get maxVerticalScrollPosition():Number - { - return _vScrollBarModel.maximum - - _vScrollBarModel.pageSize; - } /** - * Sets up the border and background beads if necessary + * The host component, which can resize to different slots. * * @langversion 3.0 * @playerversion Flash 10.2 * @playerversion AIR 2.6 * @productversion FlexJS 0.0 */ + public function get resizableView():IUIBase + { + return _strand as IUIBase; + } + protected function displayBackgroundAndBorder(host:UIBase) : void { var backgroundColor:Object = ValuesManager.valuesImpl.getValue(host, "background-color"); @@ -331,7 +364,10 @@ package org.apache.flex.html.beads if (backgroundColor != null || backgroundImage != null) { if (host.getBeadByType(IBackgroundBead) == null) - host.addBead(new (ValuesManager.valuesImpl.getValue(host, "iBackgroundBead")) as IBead); + var c:Class = ValuesManager.valuesImpl.getValue(host, "iBackgroundBead"); + if (c) { + host.addBead( new c() as IBead ); + } } var borderStyle:String; @@ -346,10 +382,60 @@ package org.apache.flex.html.beads } if (borderStyle != null && borderStyle != "none") { - if (host.getBeadByType(IBorderBead) == null) - host.addBead(new (ValuesManager.valuesImpl.getValue(host, "iBorderBead")) as IBead); + if (host.getBeadByType(IBorderBead) == null) { + c = ValuesManager.valuesImpl.getValue(host, "iBorderBead"); + if (c) { + host.addBead( new c() as IBead ); + } + } } } - - } -} + + private var inGetViewHeight:Boolean; + + /** + * @copy org.apache.flex.core.IBeadView#viewHeight + * + * @langversion 3.0 + * @playerversion Flash 10.2 + * @playerversion AIR 2.6 + * @productversion FlexJS 0.0 + */ + override public function get viewHeight():Number + { + if (inGetViewHeight) + { + //trace("ContainerView: no height set for " + host); + return host["$height"]; + } + inGetViewHeight = true; + var vh:Number = contentView.height; + inGetViewHeight = false; + return vh; + } + + private var inGetViewWidth:Boolean; + + /** + * @copy org.apache.flex.core.IBeadView#viewWidth + * + * @langversion 3.0 + * @playerversion Flash 10.2 + * @playerversion AIR 2.6 + * @productversion FlexJS 0.0 + */ + override public function get viewWidth():Number + { + if (inGetViewWidth) + { + //trace("ContainerView: no width set for " + host); + var metrics:UIMetrics = getMetrics(); + return host["$width"] + metrics.left + metrics.right; + } + inGetViewWidth = true; + var vw:Number = contentView.width; + inGetViewWidth = false; + return vw; + } + } +} \ No newline at end of file http://git-wip-us.apache.org/repos/asf/flex-asjs/blob/f62f49c7/frameworks/projects/HTML/as/src/org/apache/flex/html/beads/layouts/HorizontalLayout.as ---------------------------------------------------------------------- diff --git a/frameworks/projects/HTML/as/src/org/apache/flex/html/beads/layouts/HorizontalLayout.as b/frameworks/projects/HTML/as/src/org/apache/flex/html/beads/layouts/HorizontalLayout.as index 9be7be0..2f02262 100644 --- a/frameworks/projects/HTML/as/src/org/apache/flex/html/beads/layouts/HorizontalLayout.as +++ b/frameworks/projects/HTML/as/src/org/apache/flex/html/beads/layouts/HorizontalLayout.as @@ -19,11 +19,14 @@ package org.apache.flex.html.beads.layouts { import org.apache.flex.core.IBeadLayout; + import org.apache.flex.core.IBeadModel; import org.apache.flex.core.ILayoutChild; import org.apache.flex.core.ILayoutParent; import org.apache.flex.core.IParentIUIBase; import org.apache.flex.core.IStrand; import org.apache.flex.core.IUIBase; + import org.apache.flex.core.IViewport; + import org.apache.flex.core.IViewportModel; import org.apache.flex.core.ValuesManager; import org.apache.flex.events.Event; import org.apache.flex.events.IEventDispatcher; @@ -71,6 +74,25 @@ package org.apache.flex.html.beads.layouts { host = value as ILayoutChild; } + + private var _viewportModel:IViewportModel; + + /** + * The data that describes the viewport used by this layout. + * + * @langversion 3.0 + * @playerversion Flash 10.2 + * @playerversion AIR 2.6 + * @productversion FlexJS 0.0 + */ + public function get viewportModel():IViewportModel + { + return _viewportModel; + } + public function set viewportModel(value:IViewportModel):void + { + _viewportModel = value; + } /** * @copy org.apache.flex.core.IBeadLayout#layout @@ -81,6 +103,10 @@ package org.apache.flex.html.beads.layouts var layoutParent:ILayoutParent = host.getBeadByType(ILayoutParent) as ILayoutParent; var contentView:IParentIUIBase = layoutParent.contentView; + // this layout will use and modify the IViewportMode + var viewport:IViewport = host.getBeadByType(IViewport) as IViewport; + viewportModel = viewport.model; + var n:int = contentView.numElements; var hostSizedToContent:Boolean = host.isHeightSizedToContent(); var ilc:ILayoutChild; @@ -232,7 +258,24 @@ package org.apache.flex.html.beads.layouts child.y = obj.marginTop; } } - return true; + + // Only return true if the contentView needs to be larger; that new + // size is stored in the model. + var sizeChanged:Boolean = false; + if (viewportModel != null) { + if (viewportModel.contentHeight < maxHeight) { + viewportModel.contentHeight = maxHeight; + sizeChanged = true; + } + if (viewportModel.contentWidth < xx) { + viewportModel.contentWidth = xx; + sizeChanged = true; + } + } + + host.dispatchEvent( new Event("layoutComplete") ); + + return sizeChanged; } private function setPositionAndHeight(child:IUIBase, top:Number, mt:Number, http://git-wip-us.apache.org/repos/asf/flex-asjs/blob/f62f49c7/frameworks/projects/HTML/as/src/org/apache/flex/html/beads/layouts/HorizontalScrollingLayout.as ---------------------------------------------------------------------- diff --git a/frameworks/projects/HTML/as/src/org/apache/flex/html/beads/layouts/HorizontalScrollingLayout.as b/frameworks/projects/HTML/as/src/org/apache/flex/html/beads/layouts/HorizontalScrollingLayout.as deleted file mode 100644 index 066d5f1..0000000 --- a/frameworks/projects/HTML/as/src/org/apache/flex/html/beads/layouts/HorizontalScrollingLayout.as +++ /dev/null @@ -1,142 +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.html.beads.layouts -{ - import org.apache.flex.core.IBeadLayout; - import org.apache.flex.core.IBorderModel; - import org.apache.flex.core.IParentIUIBase; - import org.apache.flex.core.IScrollingLayoutParent; - import org.apache.flex.core.IStrand; - import org.apache.flex.core.IUIBase; - import org.apache.flex.events.Event; - import org.apache.flex.events.IEventDispatcher; - import org.apache.flex.html.supportClasses.Border; - import org.apache.flex.html.supportClasses.ScrollBar; - - /** - * The HorizontalScrollingLayout class is a layout - * bead that displays a set of children horizontally in one row, - * separating them according to CSS layout rules for margin and - * vertical-align styles and lays out a horizontal ScrollBar - * below the children. - * - * @langversion 3.0 - * @playerversion Flash 10.2 - * @playerversion AIR 2.6 - * @productversion FlexJS 0.0 - */ - public class HorizontalScrollingLayout implements IBeadLayout - { - /** - * Constructor. - * - * @langversion 3.0 - * @playerversion Flash 10.2 - * @playerversion AIR 2.6 - * @productversion FlexJS 0.0 - */ - public function HorizontalScrollingLayout() - { - } - - private var hScrollBar:ScrollBar; - - private var _strand:IStrand; - - /** - * @copy org.apache.flex.core.IBead#strand - * - * @langversion 3.0 - * @playerversion Flash 10.2 - * @playerversion AIR 2.6 - * @productversion FlexJS 0.0 - */ - public function set strand(value:IStrand):void - { - _strand = value; - } - - /** - * @copy org.apache.flex.core.IBeadLayout#layout - * - * @langversion 3.0 - * @playerversion Flash 10.2 - * @playerversion AIR 2.6 - * @productversion FlexJS 0.0 - */ - public function layout():Boolean - { - var layoutParent:IScrollingLayoutParent = - _strand.getBeadByType(IScrollingLayoutParent) as IScrollingLayoutParent; - var contentView:IParentIUIBase = layoutParent.contentView; - var border:Border = layoutParent.border; - var borderModel:IBorderModel = border.model as IBorderModel; - - var ww:Number = layoutParent.resizableView.width; - var hh:Number = layoutParent.resizableView.height; - border.width = ww; - border.height = hh; - - contentView.width = ww - borderModel.offsets.left - borderModel.offsets.right; - contentView.height = hh - borderModel.offsets.top - borderModel.offsets.bottom; - contentView.x = borderModel.offsets.left; - contentView.y = borderModel.offsets.top; - - var n:int = contentView.numElements; - var xx:Number = 0; - for (var i:int = 0; i < n; i++) - { - var ir:IUIBase = contentView.getElementAt(i) as IUIBase; - if (ir == null || !ir.visible) continue; - ir.x = xx; - ir.height = contentView.height; - xx += ir.width; - } - /* - if (xx > dataGroup.width) - { - hScrollBar = listView.hScrollBar; - dataGroup.height -= hScrollBar.height; - IScrollBarModel(hScrollBar.model).maximum = xx; - IScrollBarModel(hScrollBar.model).pageSize = dataGroup.width; - IScrollBarModel(hScrollBar.model).pageStepSize = dataGroup.width; - hScrollBar.visible = true; - hScrollBar.width = dataGroup.width; - hScrollBar.x = dataGroup.x; - hScrollBar.y = dataGroup.height; - var xpos:Number = IScrollBarModel(hScrollBar.model).value; - dataGroup.scrollRect = new Rectangle(xpos, 0, xpos + dataGroup.width, dataGroup.height); - hScrollBar.addEventListener("scroll", scrollHandler); - } - else if (hScrollBar) - { - dataGroup.scrollRect = null; - hScrollBar.visible = false; - } - */ - return true; - } - - /*private function scrollHandler(event:Event):void - { - var xpos:Number = IScrollBarModel(hScrollBar.model).value; - dataGroup.scrollRect = new Rectangle(xpos, 0, xpos + dataGroup.width, dataGroup.height); - }*/ - } -}
