/*******************************************************************************
* 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.List;
import java.util.Map;
import org.jboss.tools.jsf.vpe.richfaces.ComponentUtil;
import org.jboss.tools.vpe.editor.VpeVisualDomBuilder;
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.jboss.tools.vpe.editor.util.ResourceUtil;
import org.jboss.tools.vpe.editor.util.SourceDomUtil;
import org.jboss.tools.vpe.editor.util.VisualDomUtil;
import org.mozilla.interfaces.nsIDOMDocument;
import org.mozilla.interfaces.nsIDOMElement;
import org.w3c.dom.Attr;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
public class RichFacesTabTemplate extends VpeAbstractTemplate {
public static final String TAB_HEADER_ATTR = "tabheaderattr"; //$NON-NLS-1$
public static final String YES = "yes"; //$NON-NLS-1$
public static final String DISABLED_ELEMENT_STYLE = "none"; //$NON-NLS-1$
public static final String TAB_BODY_ATTR = "tabbodyattr"; //$NON-NLS-1$
private final static String SPACER_FILE_PATH = "common/spacer.gif"; //$NON-NLS-1$
private final static String BORDER_FILE_PATH = "tabPanel/border.gif"; //$NON-NLS-1$
private final static String VPE_USER_TOGGLE_ID = "vpe-user-toggle-id"; //$NON-NLS-1$
private static final String DISABLED = "disabled"; //$NON-NLS-1$
private static final String LABEL_WIDTH = "labelWidth"; //$NON-NLS-1$
private static final String CSS_HEADER = "rich-tab-header"; //$NON-NLS-1$
private static final String CSS_LABEL = "rich-tab-label"; //$NON-NLS-1$
private static final String CSS_ACTIVE = "rich-tab-active"; //$NON-NLS-1$
private static final String CSS_INACTIVE = "rich-tab-inactive"; //$NON-NLS-1$
private static final String CSS_DISABLED = "rich-tab-disabled"; //$NON-NLS-1$
private static final String ZERO = "0"; //$NON-NLS-1$
private static final String ONE = "1"; //$NON-NLS-1$
private static final String TEN = "10"; //$NON-NLS-1$
private static final String SPACE = " "; //$NON-NLS-1$
private static final String EMPTY = ""; //$NON-NLS-1$
private static final String HUNDRED_PERCENTS = "100%"; //$NON-NLS-1$
private static final String HEIGHT_STYLE_NAME = "height: "; //$NON-NLS-1$
private static final String WIDTH_STYLE_NAME = "width: "; //$NON-NLS-1$
private static final String STYLE_SEMICOLUMN = "; "; //$NON-NLS-1$
private static final String PX = "px"; //$NON-NLS-1$
private static final String BODY_TABLE_STYLE = "position: relative; z-index: 1;"; //$NON-NLS-1$
private static final String HEADER_TABLE_STYLE = "height : 100%; position : relative; z-index : 2;"; //$NON-NLS-1$
private static final String HEADER_TD_STYLE = "height: 100%; vertical-align: bottom;"; //$NON-NLS-1$
private static final String TRUE = "true"; //$NON-NLS-1$
/**
* Encode body of tab
* @param creationData
* @param sourceElement
* @param visualDocument
* @param parentTr
* @param active
* @param contentClass
* @param contentStyle
* @return the tab body
*/
public static VpeCreationData encodeBody(
VpePageContext pageContext,
VpeCreationData creationData,
Element sourceElement,
nsIDOMDocument visualDocument,
nsIDOMElement parentTr,
boolean active,
String contentClass,
String contentStyle) {
nsIDOMElement td = visualDocument.createElement(HTML.TAG_TD);
if(creationData==null) {
creationData = new VpeCreationData(td);
} else {
parentTr.appendChild(td);
}
if(!active) {
return creationData;
}
td.setAttribute(HTML.ATTR_HEIGHT, HUNDRED_PERCENTS);
nsIDOMElement table = visualDocument.createElement(HTML.TAG_TABLE);
td.appendChild(table);
table.setAttribute(HTML.ATTR_BORDER, ZERO);
table.setAttribute(HTML.ATTR_CELLPADDING, TEN);
table.setAttribute(HTML.ATTR_CELLSPACING, ZERO);
table.setAttribute(HTML.ATTR_WIDTH, HUNDRED_PERCENTS);
table.setAttribute(HTML.ATTR_CLASS,RichFacesTabPanelTemplate.CSS_CONTENT_POSITION);
table.setAttribute(HTML.ATTR_STYLE, BODY_TABLE_STYLE);
nsIDOMElement tr = visualDocument.createElement(HTML.TAG_TR);
table.appendChild(tr);
td = visualDocument.createElement(HTML.TAG_TD);
tr.appendChild(td);
td.setAttribute(HTML.ATTR_CLASS,
ComponentUtil.getAttribute(sourceElement, RichFaces.ATTR_STYLE_CLASS)
+ SPACE + contentClass);
td.setAttribute(HTML.ATTR_STYLE,
ComponentUtil.getAttribute(sourceElement, HTML.ATTR_STYLE)
+ STYLE_SEMICOLUMN + contentStyle);
Map<String, List<Node>> labelFacetChildren = null;
Element labelFacet = SourceDomUtil.getFacetByName(pageContext,
sourceElement, RichFaces.NAME_FACET_LABEL);
if (null != labelFacet) {
labelFacetChildren = VisualDomUtil.findFacetElements(labelFacet, pageContext);
}
/*
* https://jira.jboss.org/jira/browse/JBIDE-3373
* If there are some odd HTML elements from facet
* add them to the panel body first.
*/
boolean labelHtmlElementsPresents = ((labelFacetChildren != null) && (labelFacetChildren
.get(VisualDomUtil.FACET_HTML_TAGS).size() > 0));
VpeChildrenInfo bodyInfo = new VpeChildrenInfo(td);
if (labelHtmlElementsPresents) {
for (Node node : labelFacetChildren.get(VisualDomUtil.FACET_HTML_TAGS)) {
bodyInfo.addSourceChild(node);
}
}
/*
* Add the rest tab's content
*/
List<Node> children = ComponentUtil.getChildren(sourceElement, true);
for (Node child : children) {
bodyInfo.addSourceChild(child);
}
creationData.addChildrenInfo(bodyInfo);
return creationData;
}
public VpeCreationData create(VpePageContext pageContext, Node sourceNode, nsIDOMDocument visualDocument) {
nsIDOMElement table = visualDocument.createElement(HTML.TAG_DIV);
VpeCreationData creationData = new VpeCreationData(table);
nsIDOMElement headerTable = visualDocument.createElement(HTML.TAG_TABLE);
headerTable.setAttribute(HTML.ATTR_BORDER, ZERO);
headerTable.setAttribute(HTML.ATTR_CELLPADDING, ZERO);
headerTable.setAttribute(HTML.ATTR_CELLSPACING, ZERO);
headerTable.setAttribute(TAB_HEADER_ATTR, YES);
headerTable.setAttribute(HTML.ATTR_STYLE,
HTML.STYLE_PARAMETER_DISPLAY
+ ":" + DISABLED_ELEMENT_STYLE + STYLE_SEMICOLUMN); //$NON-NLS-1$
headerTable.appendChild(encodeHeader(pageContext, creationData,
(Element) sourceNode, visualDocument, table, false, EMPTY,
EMPTY, EMPTY, EMPTY, EMPTY));
nsIDOMElement bodyTable = visualDocument.createElement(HTML.TAG_TABLE);
bodyTable.setAttribute(HTML.ATTR_BORDER, ZERO);
bodyTable.setAttribute(HTML.ATTR_CELLPADDING, ZERO);
bodyTable.setAttribute(HTML.ATTR_CELLSPACING, ZERO);
bodyTable.setAttribute(TAB_BODY_ATTR, YES);
table.appendChild(headerTable);
table.appendChild(bodyTable);
encodeBody(pageContext, creationData, (Element)sourceNode, visualDocument, bodyTable, true, EMPTY, EMPTY);
return creationData;
}
/**
* Encode Header of tab
* @param sourceElement
* @param visualDocument
* @param parentTr
* @param active
* @param activeTabClass
* @param inactiveTabClass
* @param disabledTabClass
*/
public static nsIDOMElement encodeHeader(
VpePageContext pageContext,
VpeCreationData creationData,
Element sourceElement,
nsIDOMDocument visualDocument,
nsIDOMElement parentTr,
boolean active,
String headerClass,
String activeTabClass,
String inactiveTabClass,
String disabledTabClass,
String toggleId) {
nsIDOMElement headerTd = visualDocument.createElement(HTML.TAG_TD);
parentTr.appendChild(headerTd);
headerTd.setAttribute(HTML.ATTR_STYLE, HEADER_TD_STYLE);
String styleClass = RichFacesTabPanelTemplate.CSS_CELL_DISABLED
+ SPACE + CSS_DISABLED;
if(!TRUE.equalsIgnoreCase(sourceElement.getAttribute(DISABLED))) {
if(active) {
styleClass = RichFacesTabPanelTemplate.CSS_CELL_ACTIVE;
} else {
styleClass = RichFacesTabPanelTemplate.CSS_CELL_INACTIVE;
}
}
headerTd.setAttribute(HTML.ATTR_CLASS, styleClass);
headerTd.setAttribute(VPE_USER_TOGGLE_ID, toggleId);
nsIDOMElement table = visualDocument.createElement(HTML.TAG_TABLE);
headerTd.appendChild(table);
table.setAttribute(HTML.ATTR_BORDER, ZERO);
table.setAttribute(HTML.ATTR_CELLPADDING, ZERO);
table.setAttribute(HTML.ATTR_CELLSPACING, ZERO);
table.setAttribute(HTML.ATTR_STYLE, HEADER_TABLE_STYLE);
table.setAttribute(VPE_USER_TOGGLE_ID, toggleId);
nsIDOMElement mainTr = visualDocument.createElement(HTML.TAG_TR);
table.appendChild(mainTr);
encodeSpacer(mainTr, visualDocument);
nsIDOMElement mainTd = visualDocument.createElement(HTML.TAG_TD);
mainTr.appendChild(mainTd);
mainTd.setAttribute(VPE_USER_TOGGLE_ID, toggleId);
table = visualDocument.createElement(HTML.TAG_TABLE);
mainTd.appendChild(table);
String labelWidth = ComponentUtil.getAttribute(sourceElement, LABEL_WIDTH);
String tableStyle = HEIGHT_STYLE_NAME + HUNDRED_PERCENTS + STYLE_SEMICOLUMN;
if ((null != labelWidth) && (!EMPTY.equalsIgnoreCase(labelWidth))) {
int val = -1;
try {
val = Integer.parseInt(labelWidth);
} catch (NumberFormatException e) {
/*
* Ignore
*/
}
if (val > 0) {
labelWidth = val + PX;
}
} else {
labelWidth = HUNDRED_PERCENTS;
}
tableStyle += WIDTH_STYLE_NAME + labelWidth + STYLE_SEMICOLUMN;
table.setAttribute(HTML.ATTR_STYLE, tableStyle);
table.setAttribute(HTML.ATTR_BORDER, ZERO);
table.setAttribute(HTML.ATTR_CELLPADDING, ZERO);
table.setAttribute(HTML.ATTR_CELLSPACING, ZERO);
table.setAttribute(VPE_USER_TOGGLE_ID, toggleId);
nsIDOMElement tr = visualDocument.createElement(HTML.TAG_TR);
table.appendChild(tr);
mainTd = visualDocument.createElement(HTML.TAG_TD);
tr.appendChild(mainTd);
styleClass = CSS_HEADER
+ SPACE + CSS_LABEL
+ SPACE + CSS_DISABLED
+ SPACE + disabledTabClass;
if(!TRUE.equalsIgnoreCase(sourceElement.getAttribute(DISABLED))) {
if(active) {
styleClass = CSS_HEADER
+ SPACE + CSS_LABEL
+ SPACE + CSS_ACTIVE
+ SPACE + activeTabClass;
} else {
styleClass = CSS_HEADER
+ SPACE + CSS_LABEL
+ SPACE + CSS_INACTIVE
+ SPACE + inactiveTabClass;
}
}
String tabStyleClass = ComponentUtil.getAttribute(sourceElement, RichFaces.ATTR_STYLE_CLASS);
styleClass += SPACE + headerClass + SPACE + tabStyleClass;
mainTd.setAttribute(HTML.ATTR_CLASS, styleClass);
mainTd.setAttribute(VPE_USER_TOGGLE_ID, toggleId);
/*
* https://jira.jboss.org/jira/browse/JBIDE-3373
* Encode the Label Facet
* Find elements from the f:facet
*/
Element labelFacet = SourceDomUtil.getFacetByName(pageContext,
sourceElement, RichFaces.NAME_FACET_LABEL);
if (null != labelFacet) {
/*
* By adding attribute VPE-FACET to this visual node
* we force JsfFacet to be rendered inside it
* without creating an additional and superfluous visual tag.
*/
mainTd.setAttribute(VpeVisualDomBuilder.VPE_FACET, RichFaces.NAME_FACET_LABEL);
VpeChildrenInfo labelInfo = new VpeChildrenInfo(mainTd);
labelInfo.addSourceChild(labelFacet);
creationData.addChildrenInfo(labelInfo);
} else if (sourceElement.hasAttribute(RichFaces.ATTR_LABEL)) {
Attr labelAttr = sourceElement.getAttributeNode(RichFaces.ATTR_LABEL);
if (null != labelAttr) {
String bundleValue = ResourceUtil.getBundleValue(pageContext, labelAttr.getValue());
mainTd.appendChild(visualDocument.createTextNode(bundleValue));
}
} else {
char space = 160;
mainTd.appendChild(visualDocument.createTextNode(EMPTY + space));
}
encodeSpacer(mainTr, visualDocument);
return headerTd;
}
/*
* Add <td class="dr-tbpnl-tbbrdr rich-tabhdr-side-border"><img src="#{spacer}" width="1" height="1" alt="" border="0" /></td>
*/
private static void encodeSpacer(nsIDOMElement parentTr, nsIDOMDocument visualDocument) {
nsIDOMElement td = visualDocument.createElement(HTML.TAG_TD);
parentTr.appendChild(td);
td.setAttribute(HTML.ATTR_CLASS,
RichFacesTabPanelTemplate.CSS_SIDE_CELL
+ SPACE +
RichFacesTabPanelTemplate.CSS_SIDE_BORDER);
String style = ComponentUtil.getBackgoundImgStyle(BORDER_FILE_PATH);
td.setAttribute(HTML.ATTR_STYLE, style);
nsIDOMElement img = visualDocument.createElement(HTML.TAG_IMG);
td.appendChild(img);
ComponentUtil.setImg(img, SPACER_FILE_PATH);
img.setAttribute(HTML.ATTR_WIDTH, ONE);
img.setAttribute(HTML.ATTR_HEIGHT, ONE);
img.setAttribute(HTML.ATTR_BORDER, ZERO);
}
}