import org.primefaces.component.tabview.Tab; import org.primefaces.event.TabChangeEvent; import org.primefaces.event.TabCloseEvent; import javax.el.ValueExpression; import java.util.Iterator; import java.util.Map; import java.util.HashMap; import java.util.Arrays; import java.util.Collection; import java.util.Collections; import javax.faces.FacesException; import javax.faces.component.ContextCallback; import javax.faces.component.UIComponent; import javax.faces.event.FacesEvent; import javax.faces.event.AjaxBehaviorEvent; import org.primefaces.util.ComponentUtils; import org.primefaces.util.Constants; import javax.faces.component.visit.VisitCallback; import javax.faces.component.visit.VisitContext; import javax.faces.component.visit.VisitHint; import javax.faces.component.visit.VisitResult; import javax.faces.context.FacesContext; public static final String CONTAINER_CLASS = "ui-tabs ui-widget ui-widget-content ui-corner-all ui-hidden-container"; public static final String NAVIGATOR_CLASS = "ui-tabs-nav ui-helper-reset ui-helper-clearfix ui-widget-header ui-corner-all"; public static final String INACTIVE_TAB_HEADER_CLASS = "ui-state-default"; public static final String ACTIVE_TAB_HEADER_CLASS = "ui-state-default ui-tabs-selected ui-state-active"; public static final String PANELS_CLASS = "ui-tabs-panels"; public static final String ACTIVE_TAB_CONTENT_CLASS = "ui-tabs-panel ui-widget-content ui-corner-bottom"; public static final String INACTIVE_TAB_CONTENT_CLASS = "ui-tabs-panel ui-widget-content ui-corner-bottom ui-helper-hidden"; public static final String NAVIGATOR_SCROLLER_CLASS = "ui-tabs-navscroller"; public static final String NAVIGATOR_LEFT_CLASS = "ui-tabs-navscroller-btn ui-tabs-navscroller-btn-left ui-state-default ui-corner-right"; public static final String NAVIGATOR_RIGHT_CLASS = "ui-tabs-navscroller-btn ui-tabs-navscroller-btn-right ui-state-default ui-corner-left"; public static final String NAVIGATOR_LEFT_ICON_CLASS = "ui-icon ui-icon-carat-1-w"; public static final String NAVIGATOR_RIGHT_ICON_CLASS = "ui-icon ui-icon-carat-1-e"; public static final String SCROLLABLE_TABS_CLASS = "ui-tabs-scrollable"; public static final String MOBILE_CONTAINER_CLASS = "ui-tabs ui-widget ui-widget-content ui-corner-all"; public static final String MOBILE_NAVBAR_CLASS = "ui-navbar"; public static final String MOBILE_NAVIGATOR_CLASS = "ui-tabs-nav ui-helper-reset ui-helper-clearfix ui-widget-header ui-corner-all"; public static final String MOBILE_INACTIVE_TAB_HEADER_CLASS = "ui-tabs-header"; public static final String MOBILE_ACTIVE_TAB_HEADER_CLASS = "ui-tabs-header ui-tabs-active"; public static final String MOBILE_INACTIVE_TAB_HEADER_TITLE_CLASS = "ui-link ui-btn ui-tabs-anchor"; public static final String MOBILE_ACTIVE_TAB_HEADER_TITLE_CLASS = "ui-link ui-btn ui-tabs-anchor ui-btn-active"; public static final String MOBILE_TAB_CONTENT_CLASS = "ui-content"; private static final Collection<String> EVENT_NAMES = Collections.unmodifiableCollection(Arrays.asList("tabChange","tabClose")); @Override public Collection<String> getEventNames() { return EVENT_NAMES; } public boolean isContentLoadRequest(FacesContext context) { return context.getExternalContext().getRequestParameterMap().containsKey(this.getClientId(context) + "_contentLoad"); } private boolean isRequestSource(FacesContext context) { return this.getClientId(context).equals(context.getExternalContext().getRequestParameterMap().get(Constants.RequestParams.PARTIAL_SOURCE_PARAM)); } public Tab findTab(String tabClientId) { for(UIComponent component : getChildren()) { if(component.getClientId().equals(tabClientId)) return (Tab) component; } return null; } @Override public void queueEvent(FacesEvent event) { FacesContext context = getFacesContext(); if(isRequestSource(context) && event instanceof AjaxBehaviorEvent) { Map<String,String> params = context.getExternalContext().getRequestParameterMap(); String eventName = params.get(Constants.RequestParams.PARTIAL_BEHAVIOR_EVENT_PARAM); String clientId = this.getClientId(context); AjaxBehaviorEvent behaviorEvent = (AjaxBehaviorEvent) event; if(eventName.equals("tabChange")) { String tabClientId = params.get(clientId + "_newTab"); TabChangeEvent changeEvent = new TabChangeEvent(this, behaviorEvent.getBehavior(), findTab(tabClientId)); if(this.getVar() != null) { int tabindex = Integer.parseInt(params.get(clientId + "_tabindex")); setIndex(tabindex); changeEvent.setData(this.getIndexData()); changeEvent.setTab((Tab) getChildren().get(0)); setIndex(-1); } changeEvent.setPhaseId(behaviorEvent.getPhaseId()); super.queueEvent(changeEvent); } else if(eventName.equals("tabClose")) { String tabClientId = params.get(clientId + "_closeTab"); TabCloseEvent closeEvent = new TabCloseEvent(this, behaviorEvent.getBehavior(), findTab(tabClientId)); if(this.getVar() != null) { int tabindex = Integer.parseInt(params.get(clientId + "_tabindex")); setIndex(tabindex); closeEvent.setData(this.getIndexData()); closeEvent.setTab((Tab) getChildren().get(0)); setIndex(-1); } closeEvent.setPhaseId(behaviorEvent.getPhaseId()); super.queueEvent(closeEvent); } } else { super.queueEvent(event); } } protected void resetActiveIndex() { getStateHelper().remove(PropertyKeys.activeIndex); } public boolean isRTL() { return this.getDir().equalsIgnoreCase("rtl"); } @Override public void processUpdates(FacesContext context) { if(!isRendered()) { return; } super.processUpdates(context); ValueExpression expr = this.getValueExpression("activeIndex"); if(expr != null) { expr.setValue(getFacesContext().getELContext(), getActiveIndex()); resetActiveIndex(); } }