/*******************************************************************************
* 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 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.mozilla.interfaces.nsIDOMText;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
/**
* Template for Rich Faces DataTableScroller
*/
public class RichFacesDataTableScrollerTemplate extends VpeAbstractTemplate {
private static final String COMPONENT_NAME = "richFacesDataTableScroller"; //$NON-NLS-1$
private static final String STYLE_PATH = "dataTableScroller/dataTableScroller.css"; //$NON-NLS-1$
private static final String RIGHT_DOUBLE_SCROLL_SYMBOL = "\u00BB\u00BB"; //$NON-NLS-1$
private static final String RIGHT_SINGLE_SCROLL_SYMBOL = "\u00BB"; //$NON-NLS-1$
private static final String LEFT_DOUBLE_SCROLL_SYMBOL = "\u00AB\u00AB"; //$NON-NLS-1$
private static final String LEFT_SINGLE_SCROLL_SYMBOL = "\u00AB"; //$NON-NLS-1$
/*
* Default cells number in datascroller.
*/
private static final int DEFAULT_CELLS_NUMBER = 10;
/*
* Default active datascroller page number.
*/
private static final int DEFAULT_PAGE_NUMBER = 1;
private static final String CSS_RICH_DATASCR = "rich-datascr"; //$NON-NLS-1$
private static final String CSS_RICH_DATASCROLLER_TABLE = "rich-dtascroller-table"; //$NON-NLS-1$
private static final String CSS_RICH_DATASCR_BUTTON = "rich-datascr-button"; //$NON-NLS-1$
private static final String CSS_RICH_DATASCR_CTRLS_SEPARATOR = "rich-datascr-ctrls-separator"; //$NON-NLS-1$
private static final String CSS_RICH_DATASCR_ACT = "rich-datascr-act"; //$NON-NLS-1$
private static final String CSS_RICH_DATASCR_INACT = "rich-datascr-inact"; //$NON-NLS-1$
private static final String CSS_RICH_DATASCR_BUTTON_DSBLD = "rich-datascr-button-dsbld"; //$NON-NLS-1$
private static final String ATTR_BOUNDARY_CONTROLS = "boundaryControls"; //$NON-NLS-1$
private static final String ATTR_FAST_CONTROLS = "fastControls"; //$NON-NLS-1$
private static final String ATTR_MAX_PAGES = "maxPages"; //$NON-NLS-1$
private static final String ATTR_PAGE = "page"; //$NON-NLS-1$
private static final String ATTR_STEP_CONTROLS = "stepControls"; //$NON-NLS-1$
private static final String ATTR_INACTIVE_STYLE = "inactiveStyle"; //$NON-NLS-1$
private static final String ATTR_INACTIVE_STYLE_CLASS = "inactiveStyleClass"; //$NON-NLS-1$
private static final String ATTR_SELECTED_STYLE = "selectedStyle"; //$NON-NLS-1$
private static final String ATTR_SELECTED_STYLE_CLASS = "selectedStyleClass"; //$NON-NLS-1$
private static final String ATTR_TABLE_STYLE = "tableStyle"; //$NON-NLS-1$
private static final String ATTR_TABLE_STYLE_CLASS = "tableStyleClass"; //$NON-NLS-1$
private static final String ATTR_VALUE_SHOW = "show"; //$NON-NLS-1$
private static final String FACET_FIRST = "first"; //$NON-NLS-1$
private static final String FACET_LAST = "last"; //$NON-NLS-1$
private static final String FACET_FAST_FORWARD = "fastforward"; //$NON-NLS-1$
private static final String FACET_FAST_REWIND = "fastrewind"; //$NON-NLS-1$
private static final String FACET_NEXT = "next"; //$NON-NLS-1$
private static final String FACET_PREVIOUS = "previous"; //$NON-NLS-1$
private boolean showBoundaryControls;
private boolean showFastControls;
private int maxPages;
private int page;
private boolean showStepControls;
private String inactiveStyle;
private String inactiveStyleClass;
private String selectedStyle;
private String selectedStyleClass;
private String tableStyle;
private String tableStyleClass;
private String style;
private String styleClass;
/**
*
* Constructor.
*/
public RichFacesDataTableScrollerTemplate() {
super();
}
/**
* Creates a node of the visual tree on the node of the source tree. This
* visual node should not have the parent node This visual node can have
* child nodes.
*
* @param pageContext
* Contains the information on edited page.
* @param sourceNode
* The current node of the source tree.
* @param visualDocument
* The document of the visual tree.
* @return The information on the created node of the visual tree.
*/
public VpeCreationData create(VpePageContext pageContext, Node sourceNode,
nsIDOMDocument visualDocument) {
readAttributes(sourceNode);
Element sourceElement = (Element) sourceNode;
ComponentUtil.setCSSLink(pageContext, STYLE_PATH,
COMPONENT_NAME);
nsIDOMElement div = visualDocument.createElement(HTML.TAG_DIV);
VpeCreationData creationData = new VpeCreationData(div);
/*
* Adding fake children info to avoid creating pseudo element.
*/
creationData.addChildrenInfo(new VpeChildrenInfo(div));
String align = HTML.VALUE_ALIGN_CENTER;
if (sourceElement.hasAttribute(RichFaces.ATTR_ALIGN)) {
align = sourceElement.getAttribute(RichFaces.ATTR_ALIGN);
}
div.setAttribute(HTML.ATTR_ALIGN, align);
div.setAttribute(HTML.ATTR_CLASS, styleClass);
if (ComponentUtil.isNotBlank(style)) {
div.setAttribute(HTML.ATTR_STYLE, style);
}
nsIDOMElement table = visualDocument.createElement(HTML.TAG_TABLE);
nsIDOMElement tbody = visualDocument.createElement(HTML.TAG_TBODY);
nsIDOMElement tr = visualDocument.createElement(HTML.TAG_TR);
tbody.appendChild(tr);
table.appendChild(tbody);
div.appendChild(table);
table.setAttribute(HTML.ATTR_CLASS, tableStyleClass);
if (ComponentUtil.isNotBlank(tableStyle)) {
table.setAttribute(HTML.ATTR_STYLE, tableStyle);
}
table.setAttribute(HTML.ATTR_CELLSPACING, "1"); //$NON-NLS-1$
table.setAttribute(HTML.ATTR_CELLPADDING, "0"); //$NON-NLS-1$
table.setAttribute(HTML.ATTR_BORDER, "0"); //$NON-NLS-1$
/*
* Create left side controls
*/
Object object = null;
Element facetElement = null;
if (showBoundaryControls) {
object = LEFT_DOUBLE_SCROLL_SYMBOL;
facetElement = ComponentUtil.getFacetElement(sourceElement, FACET_FIRST);
if (null != facetElement) {
object = facetElement;
}
createCell(visualDocument, creationData, tr, object,
CSS_RICH_DATASCR_BUTTON + Constants.WHITE_SPACE
+ CSS_RICH_DATASCR_BUTTON_DSBLD, Constants.EMPTY);
}
if (showFastControls) {
object = LEFT_SINGLE_SCROLL_SYMBOL;
facetElement = ComponentUtil.getFacetElement(sourceElement, FACET_FAST_REWIND);
if (null != facetElement) {
object = facetElement;
}
createCell(visualDocument, creationData, tr, object,
CSS_RICH_DATASCR_BUTTON + Constants.WHITE_SPACE
+ CSS_RICH_DATASCR_BUTTON_DSBLD, Constants.EMPTY);
}
if (showStepControls) {
object = Constants.EMPTY;
facetElement = ComponentUtil.getFacetElement(sourceElement, FACET_PREVIOUS);
if (null != facetElement) {
object = facetElement;
}
createCell(visualDocument, creationData, tr, object,
CSS_RICH_DATASCR_BUTTON + Constants.WHITE_SPACE
+ CSS_RICH_DATASCR_BUTTON_DSBLD, Constants.EMPTY);
}
/*
* Create page numbers controls
*/
for (int i = 1; i <= maxPages; i++) {
createCell(visualDocument, creationData, tr, String.valueOf(i),
(i == 1 ? selectedStyleClass : inactiveStyleClass),
(i == 1 ? selectedStyle : inactiveStyle));
}
/*
* Create right side controls
*/
if (showStepControls) {
object = Constants.EMPTY;
facetElement = ComponentUtil.getFacetElement(sourceElement, FACET_NEXT);
if (null != facetElement) {
object = facetElement;
}
createCell(visualDocument, creationData, tr, object,
CSS_RICH_DATASCR_BUTTON, Constants.EMPTY);
}
if (showFastControls) {
object = RIGHT_SINGLE_SCROLL_SYMBOL;
facetElement = ComponentUtil.getFacetElement(sourceElement, FACET_FAST_FORWARD);
if (null != facetElement) {
object = facetElement;
}
createCell(visualDocument, creationData, tr, object,
CSS_RICH_DATASCR_BUTTON, Constants.EMPTY);
}
if (showBoundaryControls) {
object = RIGHT_DOUBLE_SCROLL_SYMBOL;
facetElement = ComponentUtil.getFacetElement(sourceElement, FACET_LAST);
if (null != facetElement) {
object = facetElement;
}
createCell(visualDocument, creationData, tr, object,
CSS_RICH_DATASCR_BUTTON, Constants.EMPTY);
}
return creationData;
}
private void createCell(nsIDOMDocument visualDocument,
VpeCreationData creationData, nsIDOMElement tr, Object element,
String styleClass, String style) {
nsIDOMElement td = visualDocument.createElement(HTML.TAG_TD);
td.setAttribute(HTML.ATTR_ALIGN, HTML.VALUE_ALIGN_CENTER);
if (ComponentUtil.isNotBlank(styleClass)) {
td.setAttribute(HTML.ATTR_CLASS, styleClass);
}
if (ComponentUtil.isNotBlank(style)) {
td.setAttribute(HTML.ATTR_STYLE, style);
}
if (element instanceof String) {
nsIDOMText cellText = visualDocument.createTextNode((String)element);
td.appendChild(cellText);
} else if (element instanceof Element) {
VpeChildrenInfo facetInfo = new VpeChildrenInfo(td);
facetInfo.addSourceChild((Element) element);
creationData.addChildrenInfo(facetInfo);
}
tr.appendChild(td);
}
/**
* Read attributes from the source element.
*
* @param sourceNode
* the source node
*/
private void readAttributes(Node sourceNode) {
Element sourceElement = (Element) sourceNode;
showBoundaryControls = (!sourceElement
.hasAttribute(ATTR_BOUNDARY_CONTROLS) || ATTR_VALUE_SHOW
.equalsIgnoreCase(sourceElement
.getAttribute(ATTR_BOUNDARY_CONTROLS)));
showFastControls = (!sourceElement.hasAttribute(ATTR_FAST_CONTROLS) || ATTR_VALUE_SHOW
.equalsIgnoreCase(sourceElement
.getAttribute(ATTR_FAST_CONTROLS)));
maxPages = ComponentUtil.parseNumberAttribute(sourceElement,
ATTR_MAX_PAGES, DEFAULT_CELLS_NUMBER);
page = ComponentUtil.parseNumberAttribute(sourceElement, ATTR_PAGE, DEFAULT_PAGE_NUMBER);
showStepControls = (!sourceElement.hasAttribute(ATTR_STEP_CONTROLS) || ATTR_VALUE_SHOW
.equalsIgnoreCase(sourceElement
.getAttribute(ATTR_STEP_CONTROLS)));
inactiveStyle = sourceElement.getAttribute(ATTR_INACTIVE_STYLE);
inactiveStyleClass = CSS_RICH_DATASCR_INACT;
if (sourceElement.hasAttribute(ATTR_INACTIVE_STYLE_CLASS)) {
inactiveStyleClass += Constants.WHITE_SPACE + sourceElement.getAttribute(ATTR_INACTIVE_STYLE_CLASS);
}
selectedStyle = sourceElement.getAttribute(ATTR_SELECTED_STYLE);
selectedStyleClass = CSS_RICH_DATASCR_ACT;
if (sourceElement.hasAttribute(ATTR_SELECTED_STYLE_CLASS)) {
selectedStyleClass += Constants.WHITE_SPACE + sourceElement.getAttribute(ATTR_SELECTED_STYLE_CLASS);
}
tableStyle = sourceElement.getAttribute(ATTR_TABLE_STYLE);
tableStyleClass = CSS_RICH_DATASCROLLER_TABLE;
if (sourceElement.hasAttribute(ATTR_TABLE_STYLE_CLASS)) {
tableStyleClass += Constants.WHITE_SPACE + sourceElement.getAttribute(ATTR_TABLE_STYLE_CLASS);
}
style = sourceElement.getAttribute(HTML.ATTR_STYLE);
styleClass = CSS_RICH_DATASCR;
if (sourceElement.hasAttribute(RichFaces.ATTR_STYLE_CLASS)) {
styleClass += Constants.WHITE_SPACE + sourceElement.getAttribute(RichFaces.ATTR_STYLE_CLASS);
}
}
public boolean recreateAtAttrChange(VpePageContext pageContext,
Element sourceElement, nsIDOMDocument visualDocument,
nsIDOMElement visualNode, Object data, String name, String value) {
return true;
}
}