package org.aplikator.server.descriptor;
import java.util.ArrayList;
import java.util.List;
import org.aplikator.client.shared.descriptor.PanelDTO;
import org.aplikator.client.shared.descriptor.WidgetDTO;
import org.aplikator.server.data.Context;
public class Panel extends WidgetDescriptorBase {
private List<Widget> children = new ArrayList<Widget>();
private boolean frame = false;
private boolean horizontal = false;
public Panel(boolean horizontal) {
this.horizontal = horizontal;
setSize(12);
}
@Override
public WidgetDTO getWidgetDescriptor(Context ctx) {
PanelDTO desc = new PanelDTO(horizontal);
desc.setFrame(frame);
desc.setSize(getSize());
desc.setEnabled(isEnabled());
desc.setLocalizedName(getLocalizedName(ctx));
adjustChildrenSizes();
for (Widget child : children) {
desc.addChild(child.getWidgetDescriptor(ctx));
}
return desc;
}
private void adjustChildrenSizes() {
if (horizontal) {
List<Widget> unsized = new ArrayList<Widget>();
int remainingSize = 12;
for (Widget child : children) {
if (child.getSize() > 0) {
remainingSize -= child.getSize();
} else {
unsized.add(child);
}
}
if (remainingSize < unsized.size()) {
throw new IllegalStateException("Too many unsized widgets: " + unsized.size() + "(maximum:" + remainingSize + "), widget:" + this.toString());
} else {
if (unsized.size() == 0 || remainingSize == 0)
return;
int splitSize = remainingSize / unsized.size();
for (Widget unsizedChild : unsized) {
unsizedChild.setSize(splitSize);
}
}
} else {
for (Widget child : children) {
if (child.getSize() == 0) {
child.setSize(12);
}
}
}
}
public static Panel row() {
return new Panel(true);
}
public static Panel column() {
return new Panel(false);
}
public static Panel row(Object... children) {
Panel retval = row();
return retval.add(children);
}
public static Panel column(Object... children) {
Panel retval = column();
return retval.add(children);
}
public Panel add(Widget child) {
if (child != null) {
/*if (horizontal && !(child instanceof Panel)) {
Panel subpanel = column();
subpanel.setSize(child.getSize());
child.setSize(12);
subpanel.add(child);
children.add(subpanel);
} else {*/
children.add(child);
//}
}
return this;
}
public Panel add(Property<?> property) {
return add(property.widget());
}
private Panel add(Object... children) {
for (Object o : children) {
if (o instanceof Widget) {
add((Widget) o);
} else if (o instanceof Property) {
add((Property<?>) o);
}
}
return this;
}
public void registerProperties(Form form) {
for (Widget child : children) {
child.registerProperties(form);
}
}
public boolean isFrame() {
return frame;
}
public Panel setFrame(boolean frame) {
this.frame = frame;
return this;
}
@Override
public Widget cloneWithReference(Reference<? extends Entity> referencingProperty) {
Panel retval;
try {
retval = (Panel) super.clone();
} catch (CloneNotSupportedException e) {
throw new UnsupportedOperationException(e);
}
retval.children = new ArrayList<Widget>(children.size());
for (Widget child : children) {
retval.children.add(child.cloneWithReference(referencingProperty));
}
return retval;
}
@Override
public String toString() {
return "Panel{" + "horizontal=" + horizontal + ", size=" + getSize() + ", frame=" + frame + ", children=" + children + '}';
}
}