/** * */ package org.javabuilders.gtk.handler.type; import java.util.Arrays; import java.util.List; import java.util.Map; import java.util.Set; import org.gnome.gtk.Container; import org.gnome.gtk.Widget; import org.javabuilders.BuildException; import org.javabuilders.BuildProcess; import org.javabuilders.BuilderConfig; import org.javabuilders.Node; import org.javabuilders.TypeDefinition; import org.javabuilders.gtk.GtkConstants; import org.javabuilders.handler.ITypeHandlerFinishProcessor; /** * Container type handler * @author Jacek Furmankiewicz */ public class ContainerFinishProcessor implements ITypeHandlerFinishProcessor { /* (non-Javadoc) * @see org.javabuilders.IApplicable#getApplicableClass() */ public Class<Container> getApplicableClass() { return Container.class; } /* (non-Javadoc) * @see org.javabuilders.handler.ITypeHandlerFinishProcessor#finish(org.javabuilders.BuilderConfig, org.javabuilders.BuildProcess, org.javabuilders.Node, java.lang.String, java.util.Map) */ public void finish(BuilderConfig config, BuildProcess process, Node current, String key, Map<String, Object> typeDefinition) throws BuildException { //did the subclass already handle this layout? boolean handled = false; TypeDefinition def = config.getTypeDefinition(current.getMainObject().getClass()); if (def != null && def.getFinishProcessor() != null) { handled = true; } if (current.getCustomProperties().containsKey(GtkConstants.INTERNAL_LAYOUT_HANDLED)) { handled = true; } //descendants can indicate they took care of everything, so parent container will skip its logic if (!handled) { Container c = (Container) current.getMainObject(); Set<Node> widgetNodes = current.getContentNodes(Widget.class); List<Widget> widgets = Arrays.asList(c.getChildren()); for(Node node : widgetNodes) { Widget w = (Widget) node.getMainObject(); if (!w.equals(c) && !widgets.contains(w) && w.getParent() == null) { c.add(w); } } } } }