import javax.faces.component.UIComponent; import org.primefaces.component.layout.LayoutUnit; import java.util.Map; import java.util.Arrays; import java.util.Collection; import java.util.Collections; import org.primefaces.util.Constants; import org.primefaces.event.CloseEvent; import org.primefaces.event.ResizeEvent; import org.primefaces.event.ToggleEvent; import org.primefaces.model.Visibility; import javax.faces.event.AjaxBehaviorEvent; import javax.faces.event.FacesEvent; public final static String UNIT_CLASS = "ui-layout-unit ui-widget ui-widget-content ui-corner-all"; public final static String UNIT_HEADER_CLASS = "ui-layout-unit-header ui-widget-header ui-corner-all"; public final static String UNIT_CONTENT_CLASS = "ui-layout-unit-content ui-widget-content"; public final static String UNIT_FOOTER_CLASS = "ui-layout-unit-footer ui-widget-header ui-corner-all"; public final static String UNIT_HEADER_TITLE_CLASS = "ui-layout-unit-header-title"; public final static String UNIT_FOOTER_TITLE_CLASS = "ui-layout-unit-footer-title"; public final static String UNIT_HEADER_ICON_CLASS = "ui-layout-unit-header-icon ui-state-default ui-corner-all"; private static final Collection<String> EVENT_NAMES = Collections.unmodifiableCollection(Arrays.asList("toggle","close", "resize")); protected LayoutUnit getLayoutUnitByPosition(String name) { for(UIComponent child : getChildren()) { if(child instanceof LayoutUnit) { LayoutUnit layoutUnit = (LayoutUnit) child; if(layoutUnit.getPosition().equalsIgnoreCase(name)) return layoutUnit; } } return null; } public boolean isNested() { return this.getParent() instanceof LayoutUnit; } public boolean isElementLayout() { return !isNested() && !isFullPage(); } @Override public Collection<String> getEventNames() { return EVENT_NAMES; } @Override public void processDecodes(FacesContext context) { if(isSelfRequest(context)) { this.decode(context); } else { super.processDecodes(context); } } @Override public void processValidators(FacesContext context) { if(!isSelfRequest(context)) { super.processValidators(context); } } @Override public void processUpdates(FacesContext context) { if(!isSelfRequest(context)) { super.processUpdates(context); } } private boolean isSelfRequest(FacesContext context) { return this.getClientId(context).equals(context.getExternalContext().getRequestParameterMap().get(Constants.RequestParams.PARTIAL_SOURCE_PARAM)); } @Override public void queueEvent(FacesEvent event) { FacesContext context = getFacesContext(); Map<String,String> params = context.getExternalContext().getRequestParameterMap(); String eventName = params.get(Constants.RequestParams.PARTIAL_BEHAVIOR_EVENT_PARAM); String clientId = this.getClientId(context); if(isSelfRequest(context)) { AjaxBehaviorEvent behaviorEvent = (AjaxBehaviorEvent) event; FacesEvent wrapperEvent = null; if(eventName.equals("toggle")) { boolean collapsed = Boolean.valueOf(params.get(clientId + "_collapsed")); LayoutUnit unit = getLayoutUnitByPosition(params.get(clientId + "_unit")); Visibility visibility = collapsed ? Visibility.HIDDEN : Visibility.VISIBLE; unit.setCollapsed(collapsed); wrapperEvent = new ToggleEvent(unit, behaviorEvent.getBehavior(), visibility); } else if(eventName.equals("close")) { LayoutUnit unit = getLayoutUnitByPosition(params.get(clientId + "_unit")); unit.setVisible(false); wrapperEvent = new CloseEvent(unit, behaviorEvent.getBehavior()); } else if(eventName.equals("resize")) { LayoutUnit unit = getLayoutUnitByPosition(params.get(clientId + "_unit")); String position = unit.getPosition(); int width = Integer.valueOf(params.get(clientId + "_width")); int height = Integer.valueOf(params.get(clientId + "_height")); if(position.equals("west") || position.equals("east")) { unit.setSize(String.valueOf(width)); } else if(position.equals("north") || position.equals("south")) { unit.setSize(String.valueOf(height)); } wrapperEvent = new ResizeEvent(unit, behaviorEvent.getBehavior(), width, height); } wrapperEvent.setPhaseId(behaviorEvent.getPhaseId()); super.queueEvent(wrapperEvent); } else { super.queueEvent(event); } }