blob: 60541634bcd579c3cc2ec0264a6485b926521ea7 [file] [log] [blame]
////////////////////////////////////////////////////////////////////////////////
//
// 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.royale.jewel.beads.layouts
{
import org.apache.royale.core.LayoutBase;
import org.apache.royale.core.IBeadLayout;
import org.apache.royale.core.IBorderPaddingMarginValuesImpl;
import org.apache.royale.core.ILayoutChild;
import org.apache.royale.core.ILayoutHost;
import org.apache.royale.core.ILayoutView;
import org.apache.royale.core.IParentIUIBase;
import org.apache.royale.core.IUIBase;
import org.apache.royale.core.layout.EdgeData;
import org.apache.royale.core.ValuesManager;
COMPILE::JS
{
import org.apache.royale.utils.cssclasslist.addStyles;
import org.apache.royale.core.WrappedHTMLElement;
}
/**
* The VerticalLayoutWithPaddingAndGap class is a simple layout
* bead similar to VerticalLayout, but it adds support for
* padding and gap values.
*
* @langversion 3.0
* @playerversion Flash 10.2
* @playerversion AIR 2.6
* @productversion Royale 0.0
*/
public class VerticalLayoutWithPaddingAndGap extends LayoutBase implements IBeadLayout
{
/**
* Constructor.
*
* @langversion 3.0
* @playerversion Flash 10.2
* @playerversion AIR 2.6
* @productversion Royale 0.0
*/
public function VerticalLayoutWithPaddingAndGap()
{
super();
}
/**
* @private
*/
private var _paddingTop:Number = 0;
/**
* The top padding value.
*
* @langversion 3.0
* @playerversion Flash 10.2
* @playerversion AIR 2.6
* @productversion Royale 0.0
*/
public function get paddingTop():Number
{
return _paddingTop;
}
/**
* @private
*/
public function set paddingTop(value:Number):void
{
_paddingTop = value;
}
/**
* @private
*/
private var _paddingRight:Number = 0;
/**
* The right padding value.
*
* @langversion 3.0
* @playerversion Flash 10.2
* @playerversion AIR 2.6
* @productversion Royale 0.0
*/
public function get paddingRight():Number
{
return _paddingRight;
}
/**
* @private
*/
public function set paddingRight(value:Number):void
{
_paddingRight = value;
}
/**
* @private
*/
private var _paddingBottom:Number = 0;
/**
* The top padding value.
*
* @langversion 3.0
* @playerversion Flash 10.2
* @playerversion AIR 2.6
* @productversion Royale 0.0
*/
public function get paddingBottom():Number
{
return _paddingBottom;
}
/**
* @private
*/
public function set paddingBottom(value:Number):void
{
_paddingBottom = value;
}
/**
* @private
*/
private var _paddingLeft:Number = 0;
/**
* The left padding value.
*
* @langversion 3.0
* @playerversion Flash 10.2
* @playerversion AIR 2.6
* @productversion Royale 0.0
*/
public function get paddingLeft():Number
{
return _paddingLeft;
}
/**
* @private
*/
public function set paddingLeft(value:Number):void
{
_paddingLeft = value;
}
/**
* @private
*/
private var _gap:Number = 0;
/**
* The gap between items.
*
* @langversion 3.0
* @playerversion Flash 10.2
* @playerversion AIR 2.6
* @productversion Royale 0.0
*/
public function get gap():Number
{
return _gap;
}
/**
* @private
*/
public function set gap(value:Number):void
{
_gap = value;
}
/**
* Layout children vertically
*
* @langversion 3.0
* @playerversion Flash 10.2
* @playerversion AIR 2.6
* @productversion Royale 0.0
* @royaleignorecoercion org.apache.royale.core.ILayoutHost
* @royaleignorecoercion org.apache.royale.core.WrappedHTMLElement
*/
override public function layout():Boolean
{
COMPILE::SWF
{
var contentView:ILayoutView = layoutView;
var n:Number = contentView.numElements;
if (n == 0) return false;
var maxWidth:Number = 0;
var maxHeight:Number = 0;
var hostWidthSizedToContent:Boolean = host.isWidthSizedToContent();
var hostHeightSizedToContent:Boolean = host.isHeightSizedToContent();
var hostWidth:Number = hostWidthSizedToContent ? 0 : contentView.width;
var hostHeight:Number = hostHeightSizedToContent ? 0 : contentView.height;
var ilc:ILayoutChild;
var data:Object;
var canAdjust:Boolean = false;
var paddingMetrics:EdgeData = new EdgeData();
paddingMetrics.left = _paddingLeft;
paddingMetrics.top = _paddingTop;
paddingMetrics.right = _paddingRight;
paddingMetrics.bottom = _paddingBottom;
var borderMetrics:EdgeData = (ValuesManager.valuesImpl as IBorderPaddingMarginValuesImpl).getBorderMetrics(host);
// adjust the host's usable size by the metrics. If hostSizedToContent, then the
// resulting adjusted value may be less than zero.
hostWidth -= paddingMetrics.left + paddingMetrics.right + borderMetrics.left + borderMetrics.right;
hostHeight -= paddingMetrics.top + paddingMetrics.bottom + borderMetrics.top + borderMetrics.bottom;
var xpos:Number = borderMetrics.left + paddingMetrics.left;
var ypos:Number = borderMetrics.top + paddingMetrics.top;
// First pass determines the data about the child.
for(var i:int=0; i < n; i++)
{
var child:IUIBase = contentView.getElementAt(i) as IUIBase;
if (child == null || !child.visible) continue;
var positions:Object = childPositions(child);
ilc = child as ILayoutChild;
var childXpos:Number = xpos; // default x position
if (!hostWidthSizedToContent) {
var childWidth:Number = child.width;
if (ilc != null && !isNaN(ilc.percentWidth)) {
childWidth = hostWidth * ilc.percentWidth/100.0;
ilc.setWidth(childWidth);
}
// the following code center-aligns the child, but since HTML does not
// do this normally, this code is commented. (Use VerticalFlexLayout for
// horizontally centered elements in a vertical column).
// childXpos = hostWidth/2 - (childWidth + ml + mr)/2;
}
if (ilc) {
ilc.setX(childXpos);
ilc.setY(ypos);
if (!hostHeightSizedToContent && !isNaN(ilc.percentHeight)) {
var newHeight:Number = hostHeight * ilc.percentHeight / 100;
ilc.setHeight(newHeight);
}
} else {
child.x = childXpos;
child.y = ypos;
}
ypos += child.height + _gap;
}
return true;
}
COMPILE::JS
{
var contentView:IParentIUIBase = layoutView as IParentIUIBase;
addStyles (contentView, "layout vertical");
var children:Array = contentView.internalChildren();
var i:int;
var n:int = children.length;
for (i = 0; i < n; i++)
{
var child:WrappedHTMLElement = children[i];
if(i == 0)
{
child.style.marginTop = _paddingTop + 'px';
}
else
{
child.style.marginTop = _gap + 'px';
}
child.style.marginRight = _paddingRight + 'px';
if(i === (n - 1))
{
child.style.marginBottom = _paddingBottom + 'px';
}
else
{
child.style.marginBottom = '0px';
}
child.style.marginLeft = _paddingLeft + 'px';
child.royale_wrapper.dispatchEvent('sizeChanged');
}
return true;
}
}
}
}