/*******************************************************************************
* Copyright (c) 2007-2009 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 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.Constants;
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;
public class RichFacesPageTemplate extends VpeAbstractTemplate {
private static final String CSS_BASIC_STYLE_PATH = "page/page-basic.css"; //$NON-NLS-1$
private static final String CSS_SIMPLE_THEME_STYLE_PATH = "page/page-theme_simple.css"; //$NON-NLS-1$
private static final String COMPONENT_NAME = "richFacesPage"; //$NON-NLS-1$
private static final String FACET_NAME_SUBHEADER = "subheader"; //$NON-NLS-1$
private static final String FACET_NAME_SIDEBAR = "sidebar"; //$NON-NLS-1$
private static final String CSS_PAGE = "rich-page"; //$NON-NLS-1$
private static final String CSS_PAGE_HEADER = "rich-page-header"; //$NON-NLS-1$
private static final String CSS_PAGE_HEADER_CONTENT = "rich-page-header-content"; //$NON-NLS-1$
private static final String CSS_PAGE_SUBHEADER = "rich-page-subheader"; //$NON-NLS-1$
private static final String CSS_PAGE_CONTENT = "rich-page-content"; //$NON-NLS-1$
private static final String CSS_PAGE_SIDEBAR = "rich-page-sidebar"; //$NON-NLS-1$
private static final String CSS_PAGE_MAIN = "rich-page-main"; //$NON-NLS-1$
private static final String CSS_PAGE_BODY = "rich-page-body"; //$NON-NLS-1$
private static final String CSS_PAGE_FOOTER = "rich-page-footer"; //$NON-NLS-1$
private static final String CSS_PAGE_FOOTER_CONTENT = "rich-page-footer-content"; //$NON-NLS-1$
private static final String STYLE_SIDEBAR_LEFT = "float: left;"; //$NON-NLS-1$
private static final String STYLE_PAGE_MAIN_RIGHT = "float: right;margin-left: -30em;"; //$NON-NLS-1$
private static final String STYLE_SIDEBAR_RIGHT = "float: right;"; //$NON-NLS-1$
private static final String STYLE_PAGE_MAIN_LEFT = "float: left;margin-right: -30em;"; //$NON-NLS-1$
/**
* Constructor
*/
public RichFacesPageTemplate() {
super();
}
public VpeCreationData create(VpePageContext pageContext, Node sourceNode,
nsIDOMDocument visualDocument) {
VpeCreationData creationData = null;
Element sourceElement = (Element)sourceNode;
/*
* Adding default css file for rich:page component
*/
ComponentUtil.setCSSLink(pageContext, CSS_BASIC_STYLE_PATH, COMPONENT_NAME);
/*
* Read rich:page's attributes
*/
Attributes attrs = new Attributes(sourceElement);
/*
* Create divs' structure.
*/
nsIDOMElement pageDiv = visualDocument.createElement(HTML.TAG_DIV);
nsIDOMElement pageContentDiv = visualDocument.createElement(HTML.TAG_DIV);
nsIDOMElement pageMainDiv = visualDocument.createElement(HTML.TAG_DIV);
nsIDOMElement pageBodyDiv = visualDocument.createElement(HTML.TAG_DIV);
nsIDOMElement pageHeaderDiv;
nsIDOMElement pageHeaderContentDiv;
nsIDOMElement pageSubHeaderDiv;
nsIDOMElement pageSidebarDiv;
nsIDOMElement pageFooterDiv;
nsIDOMElement pageFooterContentDiv;
creationData = new VpeCreationData(pageDiv);
/*
* Add basic style classes and attributes.
*/
String styleClass = CSS_PAGE;
if (ComponentUtil.isNotBlank(attrs.getStyleClass())) {
styleClass += Constants.WHITE_SPACE + attrs.getStyleClass();
}
pageDiv.setAttribute(HTML.ATTR_CLASS, styleClass);
String style = Constants.EMPTY;
/*
* Page's width in 'em' does not affect its size in VPE,
* so width should be set in 'px' to come into effect.
*/
if (ComponentUtil.isNotBlank(attrs.getWidth())) {
style += Constants.WHITE_SPACE + "; width: " + attrs.getWidth() + "px;"; //$NON-NLS-1$ //$NON-NLS-2$
}
if (ComponentUtil.isNotBlank(attrs.getStyle())) {
style += Constants.WHITE_SPACE + attrs.getStyle();
}
pageDiv.setAttribute(HTML.ATTR_STYLE, style);
if (ComponentUtil.isNotBlank(attrs.getDir())) {
pageDiv.setAttribute(HTML.ATTR_DIR, attrs.getDir());
}
pageContentDiv.setAttribute(HTML.ATTR_CLASS, CSS_PAGE_CONTENT);
pageMainDiv.setAttribute(HTML.ATTR_CLASS, CSS_PAGE_MAIN);
String bodyClass = CSS_PAGE_BODY;
if (ComponentUtil.isNotBlank(attrs.getBodyClass())) {
bodyClass += Constants.WHITE_SPACE + attrs.getBodyClass();
}
pageBodyDiv.setAttribute(HTML.ATTR_CLASS, bodyClass);
/*
* 1)
* Encode page header facet,
* add header divs and classes
*/
Element headerFacet = ComponentUtil.getFacet(sourceElement, RichFaces.NAME_FACET_HEADER);
if(headerFacet != null) {
pageHeaderDiv = visualDocument.createElement(HTML.TAG_DIV);
pageHeaderContentDiv = visualDocument.createElement(HTML.TAG_DIV);
String headerClass = CSS_PAGE_HEADER;
if (ComponentUtil.isNotBlank(attrs.getHeaderClass())) {
headerClass += Constants.WHITE_SPACE + attrs.getHeaderClass();
}
pageHeaderDiv.setAttribute(HTML.ATTR_CLASS, headerClass);
pageHeaderContentDiv.setAttribute(HTML.ATTR_CLASS, CSS_PAGE_HEADER_CONTENT);
pageHeaderDiv.appendChild(pageHeaderContentDiv);
pageDiv.appendChild(pageHeaderDiv);
VpeChildrenInfo headerInfo = new VpeChildrenInfo(pageHeaderContentDiv);
headerInfo.addSourceChild(headerFacet);
creationData.addChildrenInfo(headerInfo);
}
/*
* 2)
* Encode page subheader facet,
* add subheader divs and classes
*/
Element subHeaderFacet = ComponentUtil.getFacet(sourceElement, FACET_NAME_SUBHEADER);
if(subHeaderFacet != null) {
pageSubHeaderDiv = visualDocument.createElement(HTML.TAG_DIV);
String subheaderClass = CSS_PAGE_SUBHEADER;
if (ComponentUtil.isNotBlank(attrs.getSubHeaderClass())) {
subheaderClass += Constants.WHITE_SPACE + attrs.getSubHeaderClass();
}
pageSubHeaderDiv.setAttribute(HTML.ATTR_CLASS, subheaderClass);
pageDiv.appendChild(pageSubHeaderDiv);
VpeChildrenInfo subHeaderInfo = new VpeChildrenInfo(pageSubHeaderDiv);
subHeaderInfo.addSourceChild(subHeaderFacet);
creationData.addChildrenInfo(subHeaderInfo);
}
/*
* 3)
* Nesting page content div.
*/
pageDiv.appendChild(pageContentDiv);
/*
* 4)
* Encode page sidebar facet,
* add sidebar divs and classes
*/
Element sidebarFacet = ComponentUtil.getFacet(sourceElement, FACET_NAME_SIDEBAR);
if(sidebarFacet != null) {
pageSidebarDiv = visualDocument.createElement(HTML.TAG_DIV);
String sidebarClass = CSS_PAGE_SIDEBAR;
if (ComponentUtil.isNotBlank(attrs.getSidebarClass())) {
sidebarClass += Constants.WHITE_SPACE + attrs.getSidebarClass();
}
pageSidebarDiv.setAttribute(HTML.ATTR_CLASS, sidebarClass);
pageContentDiv.appendChild(pageSidebarDiv);
/*
* Processing attributes for sidebar style, width and position.
*/
String sidebarStyle = Constants.EMPTY;
String pageMainDivStyle = Constants.EMPTY;
String pageBodyStyle = Constants.EMPTY;
double widthDouble = ComponentUtil.parseWidth(attrs.getSidebarWidth());
if (widthDouble != -1) {
sidebarStyle += Constants.WHITE_SPACE + "; width: " + widthDouble + "em;"; //$NON-NLS-1$ //$NON-NLS-2$
}
/*
* If sidebar position 'right' is specified explicitly
* add 'float: right' style to the sidebar,
* otherwise default 'left' position will be used.
*/
if (ComponentUtil.isNotBlank(attrs.getSidebarPosition())
&& RichFaces.VALUE_RIGHT.equalsIgnoreCase(attrs
.getSidebarPosition())) {
sidebarStyle += Constants.WHITE_SPACE + STYLE_SIDEBAR_RIGHT;
pageMainDivStyle += Constants.WHITE_SPACE + STYLE_PAGE_MAIN_LEFT;
if (widthDouble != -1) {
pageBodyStyle += Constants.WHITE_SPACE + ";margin-right: " + widthDouble + "em;"; //$NON-NLS-1$ //$NON-NLS-2$
}
} else {
sidebarStyle += Constants.WHITE_SPACE + STYLE_SIDEBAR_LEFT;
pageMainDivStyle += Constants.WHITE_SPACE + STYLE_PAGE_MAIN_RIGHT;
if (widthDouble != -1) {
pageBodyStyle += Constants.WHITE_SPACE + ";margin-left: " + widthDouble + "em;"; //$NON-NLS-1$ //$NON-NLS-2$
}
}
pageSidebarDiv.setAttribute(HTML.ATTR_STYLE, sidebarStyle);
pageMainDiv.setAttribute(HTML.ATTR_STYLE, pageMainDivStyle);
pageBodyDiv.setAttribute(HTML.ATTR_STYLE, pageBodyStyle);
VpeChildrenInfo sidebarInfo = new VpeChildrenInfo(pageSidebarDiv);
sidebarInfo.addSourceChild(sidebarFacet);
creationData.addChildrenInfo(sidebarInfo);
}
/*
* 5)
* Nesting page's main and body divs.
* Encode all children into page body div.
*/
pageContentDiv.appendChild(pageMainDiv);
pageMainDiv.appendChild(pageBodyDiv);
VpeChildrenInfo pageBodyDivInfo = new VpeChildrenInfo(pageBodyDiv);
for (Node child : ComponentUtil.getChildren(sourceElement, true)) {
pageBodyDivInfo.addSourceChild(child);
}
creationData.addChildrenInfo(pageBodyDivInfo);
/*
* 6)
* Encode page footer facet,
* add footer divs and classes
*/
Element footerFacet = ComponentUtil.getFacet(sourceElement, RichFaces.NAME_FACET_FOOTER);
if(footerFacet != null) {
pageFooterDiv = visualDocument.createElement(HTML.TAG_DIV);
pageFooterContentDiv = visualDocument.createElement(HTML.TAG_DIV);
String footerClass = CSS_PAGE_FOOTER;
if (ComponentUtil.isNotBlank(attrs.getFooterClass())) {
footerClass += Constants.WHITE_SPACE + attrs.getFooterClass();
}
pageFooterDiv.setAttribute(HTML.ATTR_CLASS, footerClass);
pageFooterContentDiv.setAttribute(HTML.ATTR_CLASS, CSS_PAGE_FOOTER_CONTENT);
pageFooterDiv.appendChild(pageFooterContentDiv);
pageDiv.appendChild(pageFooterDiv);
VpeChildrenInfo footerInfo = new VpeChildrenInfo(pageFooterContentDiv);
footerInfo.addSourceChild(footerFacet);
creationData.addChildrenInfo(footerInfo);
}
return creationData;
}
class Attributes {
/*
* rich:page attributes for groups
*/
private final String BODY_CLASS = "bodyClass"; //$NON-NLS-1$
private final String CONTENT_CLASS = "contentClass"; //$NON-NLS-1$
private final String FOOTER_CLASS = "footerClass"; //$NON-NLS-1$
private final String HEADER_CLASS = "headerClass"; //$NON-NLS-1$
private final String SUBHEADER_CLASS = "subheaderClass"; //$NON-NLS-1$
private final String LANG = "lang"; //$NON-NLS-1$
private final String MARKUP_TYPE = "markupType"; //$NON-NLS-1$
private final String NAMESPACE = "namespace"; //$NON-NLS-1$
private final String PAGE_TITLE = "pageTitle"; //$NON-NLS-1$
private final String SIDEBAR_CLASS = "sidebarClass"; //$NON-NLS-1$
private final String SIDEBAR_POSITION = "sidebarPosition"; //$NON-NLS-1$
private final String SIDEBAR_WIDTH = "sidebarWidth"; //$NON-NLS-1$
private final String THEME = "theme"; //$NON-NLS-1$
private String bodyClass;
private String contentClass;
private String footerClass;
private String headerClass;
private String subheaderClass;
private String dir;
private String lang;
private String markupType;
private String namespace;
private String pageTitle;
private String sidebarClass;
private String sidebarPosition;
private String sidebarWidth;
private String style;
private String styleClass;
private String theme;
private String width;
public Attributes(final Element sourceElement) {
bodyClass = sourceElement.getAttribute(BODY_CLASS);
contentClass = sourceElement.getAttribute(CONTENT_CLASS);
footerClass = sourceElement.getAttribute(FOOTER_CLASS);
headerClass = sourceElement.getAttribute(HEADER_CLASS);
subheaderClass = sourceElement.getAttribute(SUBHEADER_CLASS);
dir = sourceElement.getAttribute(HTML.ATTR_DIR);
lang = sourceElement.getAttribute(LANG);
markupType = sourceElement.getAttribute(MARKUP_TYPE);
namespace = sourceElement.getAttribute(NAMESPACE);
pageTitle = sourceElement.getAttribute(PAGE_TITLE);
sidebarClass = sourceElement.getAttribute(SIDEBAR_CLASS);
sidebarPosition = sourceElement.getAttribute(SIDEBAR_POSITION);
sidebarWidth = sourceElement.getAttribute(SIDEBAR_WIDTH);
style = sourceElement.getAttribute(HTML.ATTR_STYLE);
styleClass = sourceElement.getAttribute(RichFaces.ATTR_STYLE_CLASS);
theme = sourceElement.getAttribute(THEME);
width = sourceElement.getAttribute(HTML.ATTR_WIDTH);
}
public String getLang() {
return lang;
}
public void setLang(String lang) {
this.lang = lang;
}
public String getBodyClass() {
return bodyClass;
}
public String getContentClass() {
return contentClass;
}
public String getFooterClass() {
return footerClass;
}
public String getHeaderClass() {
return headerClass;
}
public String getSubHeaderClass() {
return subheaderClass;
}
public String getDir() {
return dir;
}
public String getMarkupType() {
return markupType;
}
public String getNamespace() {
return namespace;
}
public String getPageTitle() {
return pageTitle;
}
public String getSidebarClass() {
return sidebarClass;
}
public String getSidebarPosition() {
return sidebarPosition;
}
public String getSidebarWidth() {
return sidebarWidth;
}
public String getStyle() {
return style;
}
public String getStyleClass() {
return styleClass;
}
public String getTheme() {
return theme;
}
public String getWidth() {
return width;
}
}
}