package fi.otavanopisto.muikku.facelets; import java.io.IOException; import java.util.ArrayList; import java.util.Collections; import java.util.List; import javax.faces.component.FacesComponent; import javax.faces.component.UIComponent; import javax.faces.component.UIComponentBase; import javax.faces.context.FacesContext; import javax.faces.context.ResponseWriter; import fi.otavanopisto.muikku.widgets.WidgetSpaceSizingStrategy; @FacesComponent ("fi.otavanopisto.muikku.facelet.WidgetSpaceSet") public class WidgetSpaceSetComponent extends UIComponentBase { private final static int GRID_SIZE = 24; @Override public boolean getRendersChildren() { return true; } @Override public void encodeBegin(FacesContext context) throws IOException { int spaceLeft = GRID_SIZE; ResponseWriter writer = context.getResponseWriter(); String styleClass = (String) getAttributes().get("styleClass"); String parentStyleClass = (String) getAttributes().get("parentStyleClass"); List<WidgetSpaceComponent> widgetSpaces = getWidgetSpaces(); List<WidgetSpaceComponent> maximizeWidgetSpaces = new ArrayList<>(); writer.startElement("div", this); writer.writeAttribute("class", parentStyleClass, "class"); for (WidgetSpaceComponent widgetSpace : widgetSpaces) { List<WidgetComponent> widgets = getWidgetComponents(widgetSpace); widgetSpace.setEmpty(widgets.size() == 0); if (widgetSpace.getStyleClass() == null) widgetSpace.setStyleClass(styleClass); if (widgetSpace.getSizing() != WidgetSpaceSizingStrategy.MAXIMIZE) { int size = 0; for (UIComponent widgetComponent : widgets) { if (widgetComponent instanceof WidgetComponent) { WidgetComponent widget = (WidgetComponent) widgetComponent; if (widget.isRendered()) { switch (widgetSpace.getSizing()) { case MINIMIZE: if (widget.getSize() > size) { size = widget.getSize(); } break; case SUM: size += widget.getSize(); break; default: break; } } } } widgetSpace.setSize(size); spaceLeft -= size; } else { maximizeWidgetSpaces.add(widgetSpace); } } for (WidgetSpaceComponent widgetSpace : maximizeWidgetSpaces) { widgetSpace.setSize(spaceLeft / maximizeWidgetSpaces.size()); } super.encodeBegin(context); } @Override public void encodeEnd(FacesContext context) throws IOException { ResponseWriter writer = context.getResponseWriter(); writer.endElement("div"); super.encodeEnd(context); } private List<WidgetComponent> getWidgetComponents(WidgetSpaceComponent widgetSpace) { List<WidgetComponent> result = new ArrayList<>(); List<UIComponent> widgets = widgetSpace.getChildren(); for (UIComponent widgetComponent : widgets) { if (widgetComponent instanceof WidgetComponent) { WidgetComponent widget = (WidgetComponent) widgetComponent; if (widget.isRendered()) { result.add(widget); } } } return Collections.unmodifiableList(result); } private List<WidgetSpaceComponent> getWidgetSpaces() { List<WidgetSpaceComponent> result = new ArrayList<>(); for (UIComponent widgetSpaceComponent : getChildren()) { if (widgetSpaceComponent instanceof WidgetSpaceComponent) { result.add((WidgetSpaceComponent) widgetSpaceComponent); } } return Collections.unmodifiableList(result); } @Override public String getFamily() { return getClass().getPackage().toString(); } }