/******************************************************************************* * Copyright (c) 2007 Exadel, Inc. and Red Hat, Inc. * Distributed under license by Red Hat, Inc. All rights reserved. * This program is made available under the terms of the * Eclipse Public License v1.0 which accompanies this distribution, * and is available at http://www.eclipse.org/legal/epl-v10.html * * Contributors: * Exadel, Inc. and Red Hat, Inc. - initial API and implementation ******************************************************************************/ package org.jboss.tools.jsf.vpe.richfaces.template; import java.util.ArrayList; import java.util.HashMap; import java.util.Map; import java.util.StringTokenizer; import org.jboss.tools.jsf.vpe.richfaces.ComponentUtil; import org.jboss.tools.vpe.editor.context.VpePageContext; import org.jboss.tools.vpe.editor.template.VpeAbstractTemplate; import org.jboss.tools.vpe.editor.template.VpeChildrenInfo; import org.jboss.tools.vpe.editor.template.VpeCreationData; import org.jboss.tools.vpe.editor.util.HTML; import org.mozilla.interfaces.nsIDOMDocument; import org.mozilla.interfaces.nsIDOMElement; import org.w3c.dom.Element; import org.w3c.dom.Node; import org.w3c.dom.NodeList; /** * This template defines the toggling methods * but doesn't implements VpeToggableTemplate * because of external toggle control. */ public class RichFacesTogglePanelTemplate extends VpeAbstractTemplate { private static Map toggleMap = new HashMap(); private Map states = null; public VpeCreationData create(VpePageContext pageContext, Node sourceNode, nsIDOMDocument visualDocument) { Element sourceElement = (Element)sourceNode; nsIDOMElement div = visualDocument.createElement(HTML.TAG_DIV); VpeCreationData creationData = new VpeCreationData(div); states = getStates(sourceElement); String state = getActiveState(sourceElement); Node bodyFacet = null; if(state!=null) { bodyFacet = ComponentUtil.getFacet(sourceElement, state, true); } else { ArrayList<Node> facets = ComponentUtil.getFacets(sourceElement, true); if(!facets.isEmpty()) { bodyFacet = facets.get(0); } } if(bodyFacet!=null) { VpeChildrenInfo bodyInfo = new VpeChildrenInfo(div); bodyInfo.addSourceChild(bodyFacet); creationData.addChildrenInfo(bodyInfo); } return creationData; } private Map getStates (Element sourceElement) { NodeList children = sourceElement.getChildNodes(); HashMap states = new HashMap(); for (int i = 0; children != null && i < children.getLength(); i++) { Node child = children.item(i); if (child instanceof Element && child.getNodeName().endsWith(":facet")) { //$NON-NLS-1$ Element facet = (Element)child; if (facet.hasAttribute("name")) { //$NON-NLS-1$ String name = facet.getAttribute("name"); //$NON-NLS-1$ states.put(name, facet); } } } return states; } private String getInitialState(Element sourceElement) { String initialState = sourceElement.hasAttribute("initialState") ? sourceElement.getAttribute("initialState") : null; //$NON-NLS-1$ //$NON-NLS-2$ if(sourceElement.hasAttribute("stateOrder")) { //$NON-NLS-1$ String stateOrder = sourceElement.getAttribute("stateOrder"); //$NON-NLS-1$ StringTokenizer st = new StringTokenizer(stateOrder.trim(), ",", false); //$NON-NLS-1$ String firstState = null; while(st.hasMoreElements()) { String state = st.nextToken().trim(); if (null == firstState) firstState = state; if (null != initialState) { if (initialState.equals(state) && states != null && states.containsKey(state)) return initialState; } else { if (states != null && states.containsKey(state)) return state; } } } else { if (null != initialState) { if (states != null && states.containsKey(initialState)) return initialState; } } return (states == null || states.keySet().isEmpty() ? null : (String)states.keySet().iterator().next()); } private String getActiveState(Element sourceElement) { String activeStateStr; if(!sourceElement.hasAttribute("stateOrder")) return null; //$NON-NLS-1$ activeStateStr = (String)toggleMap.get(sourceElement); if (activeStateStr == null) { activeStateStr = getInitialState(sourceElement); } return activeStateStr; } private String getNextState(Element sourceElement, String toggleId) { if(!sourceElement.hasAttribute("stateOrder")) return null; //$NON-NLS-1$ String stateOrder = sourceElement.getAttribute("stateOrder"); //$NON-NLS-1$ String activeState = getActiveState(sourceElement); StringTokenizer st = new StringTokenizer(stateOrder.trim(), ",", false); //$NON-NLS-1$ String firstState = null; while (st.hasMoreElements()) { String state = st.nextToken(); if (null == firstState) { firstState = state; } if (null != toggleId && toggleId.trim().length() != 0) { if(toggleId.equals(state)) { return state; } } else if (null != activeState) { if (activeState.equals(state)) { break; } } } // Stop searching with the next state (or first if the state was last in the chain) String newActiveState = null; if (st.hasMoreElements()) { newActiveState = st.nextToken(); } if (null == newActiveState || newActiveState.trim().length() == 0) { newActiveState = firstState; } return newActiveState; } public void toggle(Node sourceNode, String toggleId) { Element sourceElement = (Element)(sourceNode instanceof Element ? sourceNode : sourceNode.getParentNode()); if (null == toggleId || toggleId.trim().length() == 0) { toggleId = getNextState(sourceElement, null); } else { toggleId = getNextState(sourceElement, toggleId); } if (toggleId == null) return; toggleMap.put(sourceNode, toggleId); } public void stopToggling(Node sourceNode) { toggleMap.remove(sourceNode); } }