This is an automated email from the ASF dual-hosted git repository. yishayw pushed a commit to branch divided in repository https://gitbox.apache.org/repos/asf/royale-asjs.git
The following commit(s) were added to refs/heads/divided by this push: new a41b0c1 Flex DividedBox compiles in Royale. a41b0c1 is described below commit a41b0c133ccebacfe372ece00634189e9e56034a Author: Yishay Weiss <yishayj...@hotmail.com> AuthorDate: Thu Aug 5 15:56:33 2021 +0300 Flex DividedBox compiles in Royale. Now we need to see how operational it is. Reference #1137 --- .../MXRoyale/src/main/royale/mx/containers/Box.as | 8 +- .../src/main/royale/mx/containers/DividedBox.as | 670 ++++++++++++++++++--- .../src/main/royale/mx/containers/VDividedBox.as | 2 + .../mx/containers/dividedBoxClasses/BoxDivider.as | 421 +++++++++++++ 4 files changed, 1005 insertions(+), 96 deletions(-) diff --git a/frameworks/projects/MXRoyale/src/main/royale/mx/containers/Box.as b/frameworks/projects/MXRoyale/src/main/royale/mx/containers/Box.as index e9e945b..89015a8 100644 --- a/frameworks/projects/MXRoyale/src/main/royale/mx/containers/Box.as +++ b/frameworks/projects/MXRoyale/src/main/royale/mx/containers/Box.as @@ -23,6 +23,9 @@ package mx.containers import org.apache.royale.events.Event; import org.apache.royale.html.beads.layouts.HorizontalLayout; import org.apache.royale.html.beads.layouts.VerticalLayout; + import mx.core.mx_internal; + + use namespace mx_internal; /* import flash.events.Event; @@ -31,9 +34,6 @@ import mx.containers.beads.BoxLayout; import mx.core.Container; /* import mx.core.IUIComponent; -import mx.core.mx_internal; - -use namespace mx_internal; */ @@ -310,7 +310,7 @@ public class Box extends Container /** * @private */ - protected function isVertical():Boolean + mx_internal function isVertical():Boolean { return _direction == BoxDirection.VERTICAL; } diff --git a/frameworks/projects/MXRoyale/src/main/royale/mx/containers/DividedBox.as b/frameworks/projects/MXRoyale/src/main/royale/mx/containers/DividedBox.as index 3eb7a01..dd18b62 100644 --- a/frameworks/projects/MXRoyale/src/main/royale/mx/containers/DividedBox.as +++ b/frameworks/projects/MXRoyale/src/main/royale/mx/containers/DividedBox.as @@ -20,30 +20,33 @@ package mx.containers { /* -import flash.display.DisplayObject; -import flash.events.Event; -import flash.events.MouseEvent; import flash.geom.Point; -import mx.core.EdgeMetrics; import mx.core.IFlexDisplayObject; import mx.core.IFlexModuleFactory; import mx.core.IInvalidating; */ +import mx.events.MouseEvent; +import mx.core.IChildList; +import org.apache.royale.events.Event; +import mx.core.UIComponent; +import mx.core.EdgeMetrics; +import org.apache.royale.geom.Point; import org.apache.royale.core.ValuesManager; -import org.apache.royale.html.supportClasses.IDividedContainerGripper; +import org.apache.royale.core.IUIBase; import mx.containers.beads.BoxLayout; import mx.containers.beads.DividedBoxLayout; import mx.core.IUIComponent; import mx.core.UIComponent; import mx.core.mx_internal; import mx.events.ChildExistenceChangedEvent; +import mx.events.DividerEvent; +import mx.containers.dividedBoxClasses.BoxDivider; +use namespace mx_internal; /* import mx.core.mx_internal; -import mx.events.ChildExistenceChangedEvent; -import mx.events.DividerEvent; import mx.managers.CursorManager; import mx.managers.CursorManagerPriority; import mx.styles.IStyleManager2; @@ -227,10 +230,10 @@ public class DividedBox extends Box childRemoveHandler); } - override protected function createLayout():void - { - _layout = new DividedBoxLayout(); - } + override protected function createLayout():void + { + _layout = new DividedBoxLayout(); + } //-------------------------------------------------------------------------- // @@ -247,7 +250,7 @@ public class DividedBox extends Box /** * @private */ - protected var activeDivider:IDividedContainerGripper; + mx_internal var activeDivider:BoxDivider; /** * @private @@ -310,10 +313,10 @@ public class DividedBox extends Box */ private var layoutStyleChanged:Boolean = false; - /** - * @private - */ - private var _resizeToContent:Boolean = false; + /** + * @private + */ + private var _resizeToContent:Boolean = false; /** * @private @@ -367,6 +370,53 @@ public class DividedBox extends Box } } + //---------------------------------- + // $numChildren + //---------------------------------- + + /** + * @private + * This property allows access to the Player's native implementation + * of the numChildren property, which can be useful since components + * can override numChildren and thereby hide the native implementation. + * Note that this "base property" is final and cannot be overridden, + * so you can count on it to reflect what is happening at the player level. + */ + COMPILE::JS + mx_internal final function get $sprite_numChildren():int + { + return super.numChildren; + } + + //---------------------------------- + // numChildren + //---------------------------------- + + /** + * @private + * Storage for the numChildren property. + */ + mx_internal var _numChildren:int = 0; + + //---------------------------------- + // firstChildIndex + //---------------------------------- + + /** + * @private + * Storage for the firstChildIndex property. + */ + private var _firstChildIndex:int = 0; + + /** + * @private + * The index of the first content child, + * when dealing with both content and non-content children. + */ + mx_internal function get firstChildIndex():int + { + return _firstChildIndex; + } //---------------------------------- // dividerClass //---------------------------------- @@ -381,7 +431,7 @@ public class DividedBox extends Box * @playerversion AIR 1.1 * @productversion Flex 3 */ -// protected var dividerClass:Class = IDividedContainerGripper; + protected var dividerClass:Class; //---------------------------------- // liveDragging @@ -431,6 +481,59 @@ public class DividedBox extends Box return 0; } + //---------------------------------- + // rawChildren + //---------------------------------- + + /** + * @private + * The single IChildList object that's always returned + * from the rawChildren property, below. + */ + private var _rawChildren:DividedBoxChildrenList; + + /** + * A container typically contains child components, which can be enumerated + * using the <code>Container.getChildAt()</code> method and + * <code>Container.numChildren</code> property. In addition, the container + * may contain style elements and skins, such as the border and background. + * Flash Player and AIR do not draw any distinction between child components + * and skins. They are all accessible using the player's + * <code>getChildAt()</code> method and + * <code>numChildren</code> property. + * However, the Container class overrides the <code>getChildAt()</code> method + * and <code>numChildren</code> property (and several other methods) + * to create the illusion that + * the container's children are the only child components. + * + * <p>If you need to access all of the children of the container (both the + * content children and the skins), then use the methods and properties + * on the <code>rawChildren</code> property instead of the regular Container methods. + * For example, use the <code>Container.rawChildren.getChildAt())</code> method. + * However, if a container creates a ContentPane Sprite object for its children, + * the <code>rawChildren</code> property value only counts the ContentPane, not the + * container's children. + * It is not always possible to determine when a container will have a ContentPane.</p> + * + * <p><b>Note:</b>If you call the <code>addChild</code> or + * <code>addChildAt</code> method of the <code>rawChildren</code> object, + * set <code>tabFocusEnabled = false</code> on the component that you have added. + * Doing so prevents users from tabbing to the visual-only component + * that you have added.</p> + * + * @langversion 3.0 + * @playerversion Flash 9 + * @playerversion AIR 1.1 + * @productversion Flex 3 + */ + public function get rawChildren():IChildList + { + if (!_rawChildren) + _rawChildren = new DividedBoxChildrenList(this); + + return _rawChildren; + } + //---------------------------------- // resizeToContent //---------------------------------- @@ -598,7 +701,7 @@ public class DividedBox extends Box if (!dividerLayer) return; - var vm:EdgeMetrics = viewMetrics; + var vm:EdgeMetrics = viewMetricsAndPadding; dividerLayer.x = vm.left; dividerLayer.y = vm.top; @@ -654,14 +757,14 @@ public class DividedBox extends Box * @playerversion AIR 1.1 * @productversion Flex 3 */ - public function getDividerAt(i:int):IDividedContainerGripper + public function getDividerAt(i:int):BoxDivider { if (dividerLayer) { // Check whether this is a valid divider index. if (i < 0 || i >= dividerLayer.numChildren) return null; else - return IDividedContainerGripper(dividerLayer.getChildAt(i)); + return BoxDivider(dividerLayer.getChildAt(i)); } else { return null; @@ -721,7 +824,7 @@ public class DividedBox extends Box /** * @private */ - private function createDivider(i:int):IDividedContainerGripper + private function createDivider(i:int):BoxDivider { // Create separate layer for holding divider objects. if (!dividerLayer) @@ -729,21 +832,18 @@ public class DividedBox extends Box dividerLayer = UIComponent(rawChildren.addChild(new UIComponent())); } - var divider:IDividedContainerGripper = new f() as IDividedContainerGripper; - var c:Class = ValuesManager.valuesImpl.getValue(this, IDividedContainerGripper) as Class; - if (c) + var divider:BoxDivider = BoxDivider(new dividerClass()); + dividerLayer.addChild(divider); + + // if we are creating the active divider bring the divider layer + // to the top most so that users can see the divider line over + // the other children + if (i == PROXY_DIVIDER_INDEX) { - COMPILE::JS - { - var f:Function = c as Function; - divider = new f() as IDividedContainerGripper; - } - if (result) - { - dividerLayer.addBead(result); - } + rawChildren.setChildIndex(dividerLayer, + rawChildren.numChildren-1); } - dividerLayer.addBead(divider); + // if we are creating the active divider bring the divider layer // to the top most so that users can see the divider line over @@ -754,7 +854,7 @@ public class DividedBox extends Box rawChildren.numChildren-1); } - // Tell IDividedContainerGripper to use DividedBox's styles, + // Tell UIComponent to use DividedBox's styles, // unless we are sliding the divider; in that case, // use the styles of the divider we are sliding. //var basedOn:IFlexDisplayObject = (i == PROXY_DIVIDER_INDEX) ? @@ -777,32 +877,38 @@ public class DividedBox extends Box prevChild:IUIComponent, nextChild:IUIComponent):void { - The mouse-over thickness of the divider is normally determined - by the dividerAffordance style, and the visible thickness is - normally determined by the dividerThickness style, assuming that - the relationship thickness <= affordance <= gap applies. But if - one of the other five orderings applies, here is a table of what - happens: - - divider divider horizontalGap/ dividerWidth/ visible width/ - Thickness Affordance verticalGap dividerHeight visible height - - 4 6 8 6 4 - 4 8 6 6 4 - 6 4 8 6 6 - 6 8 4 4 4 - 8 4 6 6 6 - 8 6 4 4 4 - - var divider:IDividedContainerGripper = IDividedContainerGripper(getDividerAt(i)); - - var vm:EdgeMetrics = viewMetrics; - - var verticalGap:Number = getStyle("verticalGap"); + //The mouse-over thickness of the divider is normally determined + //by the dividerAffordance style, and the visible thickness is + //normally determined by the dividerThickness style, assuming that + //the relationship thickness <= affordance <= gap applies. But if + //one of the other five orderings applies, here is a table of what + //happens: + // + //divider divider horizontalGap/ dividerWidth/ visible width/ + //Thickness Affordance verticalGap dividerHeight visible height + // + //4 6 8 6 4 + //4 8 6 6 4 + //6 4 8 6 6 + //6 8 4 4 4 + //8 4 6 6 6 + //8 6 4 4 4 + + var divider:UIComponent = UIComponent(getDividerAt(i)); + + var vm:EdgeMetrics = viewMetricsAndPadding; + + //Thickness Affordance verticalGap dividerHeight visible height + // + //4 6 8 6 4 + //var verticalGap:Number = getStyle("verticalGap"); + var verticalGap:Number = 8; var horizontalGap:Number = getStyle("horizontalGap"); - var thickness:Number = divider.getStyle("dividerThickness"); - var affordance:Number = divider.getStyle("dividerAffordance"); + //var thickness:Number = divider.getStyle("dividerThickness"); + var thickness:Number = 4; + //var affordance:Number = divider.getStyle("dividerAffordance"); + var affordance:Number = 6; if (isVertical()) { @@ -820,7 +926,8 @@ public class DividedBox extends Box if (dividerHeight > verticalGap) dividerHeight = verticalGap; - divider.setActualSize(unscaledWidth - vm.left - vm.right, dividerHeight); + //divider.setActualSize(unscaledWidth - vm.left - vm.right, dividerHeight); + divider.setWidthAndHeight(unscaledWidth - vm.left - vm.right, dividerHeight); divider.move(vm.left, Math.round((prevChild.y + prevChild.height + @@ -855,37 +962,37 @@ public class DividedBox extends Box /** * @private */ -// mx_internal function changeCursor(divider:IDividedContainerGripper):void -// { -// if (cursorID == CursorManager.NO_CURSOR) -// { -// // If a cursor skin has been set for the specified IDividedContainerGripper, -// // use it. Otherwise, use the cursor skin for the DividedBox. -// var cursorClass:Class = isVertical() ? -// getStyle("verticalDividerCursor") as Class : -// getStyle("horizontalDividerCursor") as Class; + mx_internal function changeCursor(divider:UIComponent):void + { + //if (cursorID == CursorManager.NO_CURSOR) + //{ + //// If a cursor skin has been set for the specified UIComponent, + //// use it. Otherwise, use the cursor skin for the DividedBox. + //var cursorClass:Class = isVertical() ? + //getStyle("verticalDividerCursor") as Class : + //getStyle("horizontalDividerCursor") as Class; // -// cursorID = cursorManager.setCursor(cursorClass, -// CursorManagerPriority.HIGH, 0, 0); -// } -// } + //cursorID = cursorManager.setCursor(cursorClass, + //CursorManagerPriority.HIGH, 0, 0); + //} + } /** * @private */ -// mx_internal function restoreCursor():void -// { + mx_internal function restoreCursor():void + { // if (cursorID != CursorManager.NO_CURSOR) // { // cursorManager.removeCursor(cursorID); // cursorID = CursorManager.NO_CURSOR; // } -// } + } /** * @private */ - mx_internal function getDividerIndex(divider:IDividedContainerGripper):int + mx_internal function getDividerIndex(divider:UIComponent):int { var n:int = numChildren; for (var i:int = 0; i < n - 1; i++) @@ -909,7 +1016,7 @@ public class DividedBox extends Box /** * @private */ - mx_internal function startDividerDrag(divider:IDividedContainerGripper, + mx_internal function startDividerDrag(divider:BoxDivider, trigger:MouseEvent):void { // Make sure the user is not currently dragging. @@ -929,11 +1036,11 @@ public class DividedBox extends Box { activeDivider = createDivider(PROXY_DIVIDER_INDEX); activeDivider.visible = false; - activeDivider.state = DividerState.DOWN; + activeDivider.state = "down"; activeDivider.setActualSize(divider.width, divider.height); activeDivider.move(divider.x, divider.y); activeDivider.visible = true; - divider.state = DividerState.UP; + divider.state = "up"; } if (isVertical()) @@ -949,8 +1056,8 @@ public class DividedBox extends Box computeMinAndMaxDelta(); - systemManager.getSandboxRoot().addEventListener(MouseEvent.MOUSE_MOVE, mouseMoveHandler, true); - systemManager.deployMouseShields(true); + topMostEventDispatcher.addEventListener(MouseEvent.MOUSE_MOVE, mouseMoveHandler, true); + //systemManager.deployMouseShields(true); } /** @@ -1044,7 +1151,7 @@ public class DividedBox extends Box * @param trigger May be null if the event is not a MouseEvent but * a mouse event from another sandbox. */ - mx_internal function stopDividerDrag(divider:IDividedContainerGripper, + mx_internal function stopDividerDrag(divider:BoxDivider, trigger:MouseEvent):void { if (trigger) @@ -1059,7 +1166,7 @@ public class DividedBox extends Box if (!liveDragging) { if (dragDelta == 0) - getDividerAt(activeDividerIndex).state = DividerState.OVER; + getDividerAt(activeDividerIndex).state = "over"; if (activeDivider) dividerLayer.removeChild(activeDivider); @@ -1072,8 +1179,8 @@ public class DividedBox extends Box } resetDividerTracking(); - systemManager.getSandboxRoot().removeEventListener(MouseEvent.MOUSE_MOVE, mouseMoveHandler, true); - systemManager.deployMouseShields(false); + topMostEventDispatcher.removeEventListener(MouseEvent.MOUSE_MOVE, mouseMoveHandler, true); + //systemManager.deployMouseShields(false); } /** @@ -1258,8 +1365,8 @@ public class DividedBox extends Box child.percentWidth = childSize; // Force a re-measure. - if (child is IInvalidating) - IInvalidating(child).invalidateSize(); + //if (child is IInvalidating) + //IInvalidating(child).invalidateSize(); } // assert(amt == 0) @@ -1295,8 +1402,8 @@ public class DividedBox extends Box child.percentWidth = childSize; // Force a re-measure. - if (child is IInvalidating) - IInvalidating(child).invalidateSize(); + //if (child is IInvalidating) + //IInvalidating(child).invalidateSize(); } } @@ -1340,7 +1447,7 @@ public class DividedBox extends Box */ private function childAddHandler(event:ChildExistenceChangedEvent):void { - var child:DisplayObject = event.relatedObject; + var child:UIComponent = event.relatedObject; child.addEventListener("includeInLayoutChanged", child_includeInLayoutChangedHandler); @@ -1366,7 +1473,7 @@ public class DividedBox extends Box */ private function childRemoveHandler(event:ChildExistenceChangedEvent):void { - var child:DisplayObject = event.relatedObject; + var child:UIComponent = event.relatedObject; child.removeEventListener("includeInLayoutChanged", child_includeInLayoutChangedHandler); @@ -1412,6 +1519,186 @@ public class DividedBox extends Box invalidateSize(); } + //-------------------------------------------------------------------------- + // + // Methods: Support for rawChildren access + // + //-------------------------------------------------------------------------- + + /** + * @private + * This class overrides addChild() to deal with only content children, + * so in order to implement the rawChildren property we need + * a parallel method that deals with all children. + */ + mx_internal function rawChildren_addChild(child:IUIComponent):IUIComponent + { + // This method is only used to implement rawChildren.addChild(), + // so the child being added is assumed to be a non-content child. + // (You would use just addChild() to add a content child.) + // If there are no content children, the new child is placed + // in the pre-content partition. + // If there are content children, the new child is placed + // in the post-content partition. + if (_numChildren == 0) + _firstChildIndex++; + + super.addingChild(child); + $uibase_addChild(child); + super.childAdded(child); + + dispatchEvent(new Event("childrenChanged")); + + return child; + } + + /** + * @private + * This class overrides addChildAt() to deal with only content children, + * so in order to implement the rawChildren property we need + * a parallel method that deals with all children. + */ + mx_internal function rawChildren_addChildAt(child:IUIComponent, + index:int):IUIComponent + { + if (_firstChildIndex < index && + index < _firstChildIndex + _numChildren + 1) + { + _numChildren++; + } + else if (index <= _firstChildIndex) + { + _firstChildIndex++; + } + + super.addingChild(child); + $uibase_addChildAt(child, index); + super.childAdded(child); + + dispatchEvent(new Event("childrenChanged")); + + return child; + } + + /** + * @private + * This class overrides removeChild() to deal with only content children, + * so in order to implement the rawChildren property we need + * a parallel method that deals with all children. + */ + mx_internal function rawChildren_removeChild( + child:IUIComponent):IUIComponent + { + var index:int = rawChildren_getChildIndex(child); + return rawChildren_removeChildAt(index); + } + + /** + * @private + * This class overrides removeChildAt() to deal with only content children, + * so in order to implement the rawChildren property we need + * a parallel method that deals with all children. + */ + mx_internal function rawChildren_removeChildAt(index:int):IUIComponent + { + var child:IUIComponent = super.getChildAt(index); + + super.removingChild(child); + $uibase_removeChildAt(index); + super.childRemoved(child); + + if (_firstChildIndex < index && + index < _firstChildIndex + _numChildren) + { + _numChildren--; + } + else if (_numChildren == 0 || index < _firstChildIndex) + { + _firstChildIndex--; + } + + invalidateSize(); + invalidateDisplayList(); + + dispatchEvent(new Event("childrenChanged")); + + return child; + } + + /** + * @private + * This class overrides getChildAt() to deal with only content children, + * so in order to implement the rawChildren property we need + * a parallel method that deals with all children. + */ + mx_internal function rawChildren_getChildAt(index:int):IUIComponent + { + return super.getChildAt(index); + } + + /** + * @private + * This class overrides getChildByName() to deal with only content children, + * so in order to implement the rawChildren property we need + * a parallel method that deals with all children. + */ + mx_internal function rawChildren_getChildByName(name:String):IUIComponent + { + return super.getChildByName(name); + } + + /** + * @private + * This class overrides getChildIndex() to deal with only content children, + * so in order to implement the rawChildren property we need + * a parallel method that deals with all children. + */ + mx_internal function rawChildren_getChildIndex(child:IUIComponent):int + { + return super.getChildIndex(child); + } + + /** + * @private + * This class overrides setChildIndex() to deal with only content children, + * so in order to implement the rawChildren property we need + * a parallel method that deals with all children. + */ + mx_internal function rawChildren_setChildIndex(child:IUIComponent, + newIndex:int):void + { + var oldIndex:int = super.getChildIndex(child); + + super.setChildIndex(child, newIndex); + + // Is this a piece of chrome that was previously before + // the content children and is now after them in the list? + if (oldIndex < _firstChildIndex && newIndex >= _firstChildIndex) + { + _firstChildIndex--; + } + + // Is this a piece of chrome that was previously after + // the content children and is now before them in the list? + else if (oldIndex >= _firstChildIndex && newIndex <= _firstChildIndex) + { + _firstChildIndex++ + } + + dispatchEvent(new Event("childrenChanged")); + } + + + /** + * @private + * This class overrides contains() to deal with only content children, + * so in order to implement the rawChildren property we need + * a parallel method that deals with all children. + */ + mx_internal function rawChildren_contains(child:IUIBase):Boolean + { + return super.contains(child); + } } } @@ -1499,6 +1786,205 @@ class ChildSizeInfo * @private */ public var size:Number; + + + } +import mx.core.IUIComponent; +import org.apache.royale.core.IUIBase; +import org.apache.royale.geom.Point; + +import mx.containers.DividedBox; +import mx.core.IChildList; +import mx.core.mx_internal; +use namespace mx_internal; +/** + * @private + * Helper class for the rawChildren property of the Container class. + * For descriptions of the properties and methods, + * see the IChildList interface. + * + * @see mx.core.Container + */ +class DividedBoxChildrenList implements IChildList +{ +// include "../core/Version.as"; + + //-------------------------------------------------------------------------- + // + // Notes + // + //-------------------------------------------------------------------------- + + /* + + Although at the level of a Flash DisplayObjectContainer, all + children are equal, in a Flex Container some children are "more + equal than others". (George Orwell, "Animal Farm") + + In particular, Flex distinguishes between content children and + non-content (or "chrome") children. Content children are the kind + that can be specified in MXML. If you put several controls + into a VBox, those are its content children. Non-content children + are the other ones that you get automatically, such as a + background/border, scrollbars, the titlebar of a Panel, + AccordionHeaders, etc. + + Most application developers are uninterested in non-content children, + so Container overrides APIs such as numChildren and getChildAt() + to deal only with content children. For example, Container, keeps + its own _numChildren counter. + + However, developers of custom containers need to be able to deal + with both content and non-content children, so they require similar + APIs that operate on all children. + + For the public API, it would be ugly to have double APIs on Container + such as getChildAt() and all_getChildAt(). Instead, Container has + a public rawChildren property which lets you access APIs which + operate on all the children, in the same way that the + DisplayObjectContainer APIs do. For example, getChildAt(0) returns + the first content child, while rawChildren.getChildAt(0) returns + the first child (either content or non-content). + + This ContainerRawChildrenList class implements the rawChildren + property. Note that it simply calls a second set of parallel + mx_internal APIs in Container. (They're named, for example, + _getChildAt() instead of all_getChildAt()). + + Many of the all-children APIs in Container such as _getChildAt() + simply call super.getChildAt() in order to get the implementation + in DisplayObjectContainer. It would be nice if we could eliminate + _getChildAt() in Container and simply implement the all-children + version in this class by calling the DisplayObjectContainer method. + But once Container overrides getChildAt(), there is no way + to call the supermethod through an instance. + + */ + + //-------------------------------------------------------------------------- + // + // Constructor + // + //-------------------------------------------------------------------------- + + /** + * @private + * Constructor. + */ + public function DividedBoxChildrenList(owner:DividedBox) + { + super(); + + this.owner = owner; + } + + //-------------------------------------------------------------------------- + // + // Variables + // + //-------------------------------------------------------------------------- + + /** + * @private + */ + private var owner:DividedBox; + + //-------------------------------------------------------------------------- + // + // Properties + // + //-------------------------------------------------------------------------- + + //---------------------------------- + // numChildren + //---------------------------------- + + /** + * @private + */ + public function get numChildren():int + { + return owner.$sprite_numChildren; + } + + //-------------------------------------------------------------------------- + // + // Methods + // + //-------------------------------------------------------------------------- + + /** + * @private + */ + public function addChild(child:IUIComponent):IUIComponent + { + return owner.rawChildren_addChild(child); + } + + /** + * @private + */ + public function addChildAt(child:IUIComponent, index:int):IUIComponent + { + return owner.rawChildren_addChildAt(child, index); + } + + /** + * @private + */ + public function removeChild(child:IUIComponent):IUIComponent + { + return owner.rawChildren_removeChild(child); + } + + /** + * @private + */ + public function removeChildAt(index:int):IUIComponent + { + return owner.rawChildren_removeChildAt(index); + } + + /** + * @private + */ + public function getChildAt(index:int):IUIComponent + { + return owner.rawChildren_getChildAt(index); + } + + /** + * @private + */ + public function getChildByName(name:String):IUIComponent + { + return owner.rawChildren_getChildByName(name); + } + + /** + * @private + */ + public function getChildIndex(child:IUIComponent):int + { + return owner.rawChildren_getChildIndex(child); + } + + /** + * @private + */ + public function setChildIndex(child:IUIComponent, newIndex:int):void + { + owner.rawChildren_setChildIndex(child, newIndex); + } + + /** + * @private + */ + public function contains(child:IUIBase):Boolean + { + return owner.rawChildren_contains(child); + } +} diff --git a/frameworks/projects/MXRoyale/src/main/royale/mx/containers/VDividedBox.as b/frameworks/projects/MXRoyale/src/main/royale/mx/containers/VDividedBox.as index 5620de8..5515253 100644 --- a/frameworks/projects/MXRoyale/src/main/royale/mx/containers/VDividedBox.as +++ b/frameworks/projects/MXRoyale/src/main/royale/mx/containers/VDividedBox.as @@ -88,6 +88,8 @@ public class VDividedBox extends DividedBox { super(); typeNames = "VDividedBox"; + + super.direction = BoxDirection.VERTICAL; } //-------------------------------------------------------------------------- diff --git a/frameworks/projects/MXRoyale/src/main/royale/mx/containers/dividedBoxClasses/BoxDivider.as b/frameworks/projects/MXRoyale/src/main/royale/mx/containers/dividedBoxClasses/BoxDivider.as new file mode 100644 index 0000000..d558191 --- /dev/null +++ b/frameworks/projects/MXRoyale/src/main/royale/mx/containers/dividedBoxClasses/BoxDivider.as @@ -0,0 +1,421 @@ +//////////////////////////////////////////////////////////////////////////////// +// +// 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 mx.containers.dividedBoxClasses +{ + +import mx.events.MouseEvent; +import org.apache.royale.events.IEventDispatcher; + +import mx.containers.DividedBox; +//import mx.containers.DividerState; +//import mx.core.ILayoutDirectionElement; +import mx.core.UIComponent; +import mx.core.mx_internal; + +use namespace mx_internal; + +//-------------------------------------- +// Styles +//-------------------------------------- + +//include "../../styles/metadata/GapStyles.as" + +/** + * @copy mx.containers.DividedBox#style:dividerAffordance + * + * @langversion 3.0 + * @playerversion Flash 9 + * @playerversion AIR 1.1 + * @productversion Flex 3 + */ +//[Style(name="dividerAffordance", type="Number", format="Length", inherit="no")] + +/** + * @copy mx.containers.DividedBox#style:dividerAlpha + * + * @langversion 3.0 + * @playerversion Flash 9 + * @playerversion AIR 1.1 + * @productversion Flex 3 + */ +//[Style(name="dividerAlpha", type="Number", inherit="no")] + +/** + * @copy mx.containers.DividedBox#style:dividerColor + * + * @langversion 3.0 + * @playerversion Flash 9 + * @playerversion AIR 1.1 + * @productversion Flex 3 + */ +//[Style(name="dividerColor", type="uint", format="Color", inherit="yes")] + +/** + * @copy mx.containers.DividedBox#style:dividerThickness + * + * @langversion 3.0 + * @playerversion Flash 9 + * @playerversion AIR 1.1 + * @productversion Flex 3 + */ +//[Style(name="dividerThickness", type="Number", format="Length", inherit="no")] + +//-------------------------------------- +// Other metadata +//-------------------------------------- + +/** + * The BoxDivider class represents the divider between children of a DividedBox container. + * + * @see mx.containers.DividedBox + * + * @langversion 3.0 + * @playerversion Flash 9 + * @playerversion AIR 1.1 + * @productversion Flex 3 + */ +public class BoxDivider extends UIComponent +{ + //include "../../core/Version.as"; + + //-------------------------------------------------------------------------- + // + // Constructor + // + //-------------------------------------------------------------------------- + + /** + * Constructor. + * + * @langversion 3.0 + * @playerversion Flash 9 + * @playerversion AIR 1.1 + * @productversion Flex 3 + */ + public function BoxDivider() + { + super(); + + // Register for player events. + addEventListener(MouseEvent.MOUSE_OVER, mouseOverHandler); + addEventListener(MouseEvent.MOUSE_OUT, mouseOutHandler); + addEventListener(MouseEvent.MOUSE_DOWN, mouseDownHandler); + } + + //-------------------------------------------------------------------------- + // + // Variables + // + //-------------------------------------------------------------------------- + + /** + * @private + */ + private var knob:UIComponent; + + /** + * @private + */ + private var isMouseOver:Boolean = false; + + //-------------------------------------------------------------------------- + // + // Properties + // + //-------------------------------------------------------------------------- + + /** + * @private + */ + override public function set x(value:Number):void + { + var oldValue:Number = x; + super.x = value; + + if (!DividedBox(owner).isVertical()) + { + DividedBox(owner).moveDivider( + DividedBox(owner).getDividerIndex(this), value - oldValue); + } + } + + /** + * @private + */ + override public function set y(value:Number):void + { + var oldValue:Number = y; + super.y = value; + + if (DividedBox(owner).isVertical()) + { + DividedBox(owner).moveDivider( + DividedBox(owner).getDividerIndex(this), value - oldValue); + } + } + + //---------------------------------- + // state + //---------------------------------- + + /** + * @private + * Storage for the state property. + */ + private var _state:String = "up"; + + /** + * @private + */ + mx_internal function get state():String + { + return _state; + } + + /** + * @private + */ + mx_internal function set state(value:String):void + { + _state = value; + + invalidateDisplayList(); + } + + //-------------------------------------------------------------------------- + // + // Overridden methods + // + //-------------------------------------------------------------------------- + + /** + * @private + */ + override protected function updateDisplayList(unscaledWidth:Number, + unscaledHeight:Number):void + { + // The mouse-over thickness of the divider is normally determined + // by the dividerAffordance style, and the visible thickness is + // normally determined by the dividerThickness style, assuming that + // the relationship thickness <= affordance <= gap applies. But if + // one of the other five orderings applies, here is a table of what + // happens: + // + // divider divider horizontalGap/ dividerWidth/ visible width/ + // Thickness Affordance verticalGap dividerHeight visible height + // + // 4 6 8 6 4 + // 4 8 6 6 4 + // 6 4 8 6 6 + // 6 8 4 4 4 + // 8 4 6 6 6 + // 8 6 4 4 4 + + if (isNaN(width) || isNaN(height)) + return; + + if (!parent) + return; + + super.updateDisplayList(unscaledWidth, unscaledHeight); + + graphics.clear(); + + graphics.beginFill(0x000000, 0); + graphics.drawRect(0, 0, width, height); + graphics.endFill(); + + var color:Number; + var alpha:Number = 1.0; + + var thickness:Number = getStyle("dividerThickness"); + + //var gap:Number = DividedBox(owner).isVertical() ? + //DividedBox(owner).getStyle("verticalGap") : + //DividedBox(owner).getStyle("horizontalGap"); + + var gap:Number = 8; + + if (state != "down") + { + // Draw knob, if there is enough room + //if (gap >= 6) + if (gap >= 66) + { + if (!knob) + { + var knobClass:Class = Class(getStyle("dividerSkin")); + if (knobClass) + knob = new knobClass(); + if (knob) + { + //if (knob is ILayoutDirectionElement) + //ILayoutDirectionElement(knob).layoutDirection = null; + addChild(knob); + } + } + + if (knob) + { + if (DividedBox(owner).isVertical()) + { + knob.scaleX = 1.0; + knob.rotation = 0; + } + else + { + // Rotate the knob + knob.scaleX = -1.0; + knob.rotation = -90; + } + + knob.x = Math.round((width - knob.width) / 2); + knob.y = Math.round((height - knob.height) / 2); + } + } + return; + } + + //color = getStyle("dividerColor"); + color = 0xcccccc; + //alpha = getStyle("dividerAlpha"); + alpha = 0.5; + graphics.beginFill(color, alpha); + + if (DividedBox(owner).isVertical()) + { + var visibleHeight:Number = thickness; + + if (visibleHeight > gap) + visibleHeight = gap; + + var y:Number = (height - visibleHeight) / 2; + graphics.drawRect(0, y, width, visibleHeight); + } + else + { + var visibleWidth:Number = thickness; + + if (visibleWidth > gap) + visibleWidth = gap; + + var x:Number = (width - visibleWidth) / 2; + graphics.drawRect(x, 0, visibleWidth, height); + } + + graphics.endFill(); + } + + /** + * @private + */ + override public function styleChanged(styleProp:String):void + { + super.styleChanged(styleProp); + + if (!styleProp || + styleProp == "dividerSkin" || + styleProp == "styleName") + { + if (knob) + { + removeChild(knob); + knob = null; + } + } + } + + //-------------------------------------------------------------------------- + // + // Event handlers + // + //-------------------------------------------------------------------------- + + /** + * @private + */ + private function mouseOverHandler(event:MouseEvent):void + { + if (event.buttonDown) + return; + + isMouseOver = true; + if (!DividedBox(owner).activeDivider) + { + state = "over"; + DividedBox(owner).changeCursor(this); + } + } + + /** + * @private + */ + private function mouseOutHandler(event:MouseEvent):void + { + isMouseOver = false; + if (!DividedBox(owner).activeDivider) + { + state = "up"; + if (parent) + DividedBox(owner).restoreCursor(); + } + } + + /** + * @private + */ + private function mouseDownHandler(event:MouseEvent):void + { + // Don't set down state here. If we're doing a live drag we don't + // want to show the proxy. If we're not doing a live drag, our + // parent will create a drag proxy and set the state to "down". + // state = "down"; + DividedBox(owner).changeCursor(this); + DividedBox(owner).startDividerDrag(this, event); + + //var sbRoot:DisplayObject = systemManager.getSandboxRoot(); + var sbRoot:IEventDispatcher = topMostEventDispatcher; + sbRoot.addEventListener(MouseEvent.MOUSE_UP, mouseUpHandler, true); + //sbRoot.addEventListener(SandboxMouseEvent.MOUSE_UP_SOMEWHERE, mouseUpHandler); + } + + /** + * @private + * + * @param event MouseEvent or SandboxMouseEvent. + */ + private function mouseUpHandler(event:Event):void + { + // If a mouseOut was the last mouse event that occurred + // make sure to restore the system cursor. + if (!isMouseOver) + DividedBox(owner).restoreCursor(); + + state = "over"; + DividedBox(owner).stopDividerDrag(this, event as MouseEvent); + + //var sbRoot:DisplayObject = systemManager.getSandboxRoot(); + var sbRoot:IEventDispatcher = topMostEventDispatcher; + sbRoot.removeEventListener(MouseEvent.MOUSE_UP, mouseUpHandler, true); + //sbRoot.removeEventListener(SandboxMouseEvent.MOUSE_UP_SOMEWHERE, mouseUpHandler); + } +} + +}