//
// Copyright (c) 2015, Brian Frank and Andy Frank
// Licensed under the Academic Free License version 3.0
//
// History:
// 5 Jun 2015 Andy Frank Creation
//
using dom
**
** FlowBox lays out its children in a one-directional flow.
**
** See also: [docDomkit]`docDomkit::Layout#flowBox`
**
@Js class FlowBox : Box
{
new make() : super()
{
this.style.addClass("domkit-FlowBox")
}
** How to align children inside container. Valid values
** are 'left', 'center', 'right'.
Align halign := Align.left
{
set { &halign=it; style->textAlign=it.toStr }
}
** Gaps to insert between child elements. If 'gaps.length' is less
** than the number of children, then 'gaps' will be cycled to
** apply to all children.
Str[] gaps := Str[,]
{
set { &gaps=it; applyStyle }
}
protected override Void onAdd(Elem c) { applyStyle }
protected override Void onRemove(Elem c) { applyStyle }
private Void applyStyle()
{
kids := children
text := kids.any |kid| { kid is TextField }
Float? lastGap
kids.each |kid,i|
{
// add gap
gap := 0f
if (gaps.size > 0)
{
s := gaps[i % gaps.size]
gap = CssDim(s).val.toFloat
if (gap > 0f && i < kids.size-1) kid.style["margin-right"] = s
}
// check width
if (kid.style.effective("width") == "100%") kid.style->width = "auto"
// add join classes
// TODO FIXIT: more optimized way than toggling classes on each add/remove?
if (kids.size > 1 && (gap == -1f || lastGap == -1f))
{
if (i == 0 || lastGap >= 0f)
kid.style.addClass("group-left")
else if (i < kids.size-1 && gap == -1f)
kid.style.removeClass("group-right").addClass("group-middle")
else
kid.style.addClass("group-right")
}
lastGap = gap
}
}
}