blob: 4b058d6b4b38c8ff0f971f3d82e291f2a9136b6f [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 VerticalLayout class is a simple layout
* bead. It takes the set of children and lays them out
* vertically in one column, separating them according to
* CSS layout rules for margin and horizontal-align styles.
*
* @langversion 3.0
* @playerversion Flash 10.2
* @playerversion AIR 2.6
* @productversion Royale 0.9.3
*/
public class VerticalLayout extends LayoutBase implements IBeadLayout
{
/**
* Constructor.
*
* @langversion 3.0
* @playerversion Flash 10.2
* @playerversion AIR 2.6
* @productversion Royale 0.9.3
*/
public function VerticalLayout()
{
super();
}
/**
* 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 = host.width;
var hostHeight:Number = host.height;
var ilc:ILayoutChild;
var data:Object;
var canAdjust:Boolean = false;
var paddingMetrics:EdgeData = (ValuesManager.valuesImpl as IBorderPaddingMarginValuesImpl).getPaddingMetrics(host);
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);
var margins:Object = childMargins(child, hostWidth, hostHeight);
ilc = child as ILayoutChild;
ypos += margins.top;
var childXpos:Number = xpos + margins.left; // default x position
var childWidth:Number = child.width;
if (ilc != null && !isNaN(ilc.percentWidth)) {
childWidth = hostWidth * ilc.percentWidth/100.0;
ilc.setWidth(childWidth);
}
else if (ilc.isWidthSizedToContent() && !margins.auto)
{
childWidth = hostWidth;
ilc.setWidth(childWidth);
}
if (margins.auto)
childXpos = (hostWidth - childWidth) / 2;
if (ilc) {
ilc.setX(childXpos);
ilc.setY(ypos);
if (!isNaN(ilc.percentHeight)) {
var newHeight:Number = hostHeight * ilc.percentHeight / 100;
ilc.setHeight(newHeight);
}
} else {
child.x = childXpos;
child.y = ypos;
}
ypos += child.height + margins.bottom;
}
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] as WrappedHTMLElement;
if (child == null) continue;
child.royale_wrapper.dispatchEvent('sizeChanged');
}
/**
* This Layout uses the following CSS rules
*
* .layout.vertical {
* vertical-align: top;
* }
* .layout.vertical > * {
* display: block !important;
* }
*/
return true;
}
}
}
}