package com.revolsys.ui.html.view;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import com.revolsys.record.io.format.xml.XmlWriter;
import com.revolsys.ui.html.decorator.Decorator;
import com.revolsys.ui.html.fields.Field;
import com.revolsys.ui.html.layout.ElementContainerLayout;
import com.revolsys.ui.html.layout.RawLayout;
public class ElementContainer extends Element {
private final List<ElementContainer> containers = new ArrayList<>();
private final List<Element> elements = new ArrayList<>();
private final List<Element> elementsExternal = Collections.unmodifiableList(this.elements);
private final Map<String, Field> fields = new HashMap<>();
private ElementContainerLayout layout = new RawLayout();
public ElementContainer() {
this(new RawLayout());
}
public ElementContainer(final Decorator decorator) {
setDecorator(decorator);
}
public ElementContainer(final Decorator decorator, final Element... elements) {
setDecorator(decorator);
add(elements);
}
public ElementContainer(final Element... elements) {
add(elements);
}
public ElementContainer(final ElementContainerLayout layout) {
this.layout = layout;
}
public ElementContainer add(final Element element) {
if (element != null) {
this.elements.add(element);
element.setContainer(this);
if (element instanceof Field) {
final Field field = (Field)element;
this.fields.put(field.getName(), field);
} else if (element instanceof ElementContainer) {
final ElementContainer container = (ElementContainer)element;
this.containers.add(container);
}
}
return this;
}
public void add(final Element... elements) {
for (final Element element : elements) {
add(element);
}
}
public ElementContainer add(final Element element, final Decorator decorator) {
if (element != null) {
element.setDecorator(decorator);
return add(element);
}
return this;
}
public void add(final int index, final Element element) {
this.elements.add(index, element);
}
public ElementContainer add(final String content) {
return add(new StringElement(content));
}
public List<Element> getElements() {
return this.elementsExternal;
}
public Field getField(final String name) {
Field field = this.fields.get(name);
if (field != null) {
return field;
}
for (final ElementContainer container : this.containers) {
field = container.getField(name);
if (field != null) {
return field;
}
}
return null;
}
public List<String> getFieldNames() {
final List<String> allFields = new ArrayList<>();
allFields.addAll(this.fields.keySet());
for (final ElementContainer container : this.containers) {
allFields.addAll(container.getFieldNames());
}
return allFields;
}
public Map<String, Field> getFields() {
final Map<String, Field> allFields = new HashMap<>();
allFields.putAll(this.fields);
for (final ElementContainer container : this.containers) {
allFields.putAll(container.getFields());
}
return allFields;
}
public <T> T getInitialValue(final Field field, final HttpServletRequest request) {
return (T)getContainer().getInitialValue(field, request);
}
/**
* @return Returns the layout.
*/
public ElementContainerLayout getLayout() {
return this.layout;
}
@Override
public void initialize(final HttpServletRequest request) {
for (final Element element : this.elements) {
element.initialize(request);
}
}
public boolean isEmpty() {
return this.elements.size() == 0;
}
@Override
public void serializeElement(final XmlWriter out) {
this.layout.serialize(out, this);
}
/**
* @param layout The layout to set.
*/
public void setLayout(final ElementContainerLayout layout) {
this.layout = layout;
}
public boolean validate() {
boolean valid = true;
for (final ElementContainer container : this.containers) {
valid &= container.validate();
}
return valid;
}
}