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.VpeCreationData; import org.jboss.tools.vpe.editor.util.HTML; import org.jboss.tools.vpe.editor.util.VpeStyleUtil; import org.mozilla.interfaces.nsIDOMDocument; import org.mozilla.interfaces.nsIDOMElement; import org.mozilla.interfaces.nsIDOMNode; import org.w3c.dom.Element; import org.w3c.dom.Node; /** * The template for the <rich:fileUpload/>. * * @author Eugene Stherbin */ public class RichFacesFileUploadTemplate extends VpeAbstractTemplate { /** The Constant DEFAULT_CONTROL_LABEL_VALUE. */ private static final String DEFAULT_CONTROL_LABEL_VALUE = "Add..."; //$NON-NLS-1$ /** The Constant DEFAULT_LIST_HEIGHT. */ private static final String DEFAULT_LIST_HEIGHT = "210px"; //$NON-NLS-1$ /** The Constant DEFAULT_LIST_WIDTH. */ private static final String DEFAULT_LIST_WIDTH = "400px"; //$NON-NLS-1$ /** The Constant FILE_UPLOAD_FILE_UPLOAD_CSS. */ private static final String FILE_UPLOAD_FILE_UPLOAD_CSS = "fileUpload/fileUpload.css"; //$NON-NLS-1$ /** The Constant RICH_FACES_FILE_UPLOAD_EXT. */ private static final String RICH_FACES_FILE_UPLOAD_EXT = "richFacesFileUpload"; //$NON-NLS-1$ /** The add control label. */ private String addControlLabel; /** The default style classes. */ /** The list height. */ private String listHeight; /** The list width. */ private String listWidth; private String uploadControlLabel; private String clearAllControlLabel; /** * The Constructor. */ public RichFacesFileUploadTemplate() { super(); } /** * Create. * * @param visualDocument the visual document * @param sourceNode the source node * @param pageContext the page context * * @return the vpe creation data */ public VpeCreationData create(VpePageContext pageContext, Node sourceNode, nsIDOMDocument visualDocument) { final Element source = (Element) sourceNode; final StyleClasses styleClasses = new StyleClasses(source); prepareData(source); VpeCreationData data = null; ComponentUtil.setCSSLink(pageContext, FILE_UPLOAD_FILE_UPLOAD_CSS, RICH_FACES_FILE_UPLOAD_EXT); final nsIDOMElement rootDiv = visualDocument.createElement(HTML.TAG_DIV); rootDiv.setAttribute(HTML.ATTR_CLASS, "rich-fileupload-list-decor"); //$NON-NLS-1$ rootDiv.setAttribute(HTML.ATTR_STYLE, VpeStyleUtil.PARAMETER_WIDTH + VpeStyleUtil.COLON_STRING + this.listWidth); final nsIDOMElement table = visualDocument.createElement(HTML.TAG_TABLE); table.setAttribute(HTML.ATTR_CLASS, "rich-fileupload-toolbar-decor"); //$NON-NLS-1$ final nsIDOMElement tr = visualDocument.createElement(HTML.TAG_TR); final nsIDOMElement td = visualDocument.createElement(HTML.TAG_TD); final nsIDOMElement buttonBorderDiv = visualDocument.createElement(HTML.TAG_DIV); buttonBorderDiv.setAttribute(HTML.ATTR_CLASS, "rich-fileupload-button-border"); //$NON-NLS-1$ buttonBorderDiv.setAttribute(HTML.ATTR_STYLE, "float: left;"); //$NON-NLS-1$ final nsIDOMElement fileuploadButtonDiv = visualDocument.createElement(HTML.TAG_DIV); fileuploadButtonDiv.setAttribute(HTML.ATTR_CLASS, styleClasses.getAddButtonClass()); fileuploadButtonDiv.setAttribute(HTML.ATTR_STYLE, "position: relative;"); //$NON-NLS-1$ final nsIDOMElement labelDiv = visualDocument.createElement(HTML.TAG_DIV); labelDiv.setAttribute(HTML.ATTR_CLASS, styleClasses.getAddButtonClassDiv2()); labelDiv.appendChild(visualDocument.createTextNode(this.addControlLabel)); fileuploadButtonDiv.appendChild(labelDiv); rootDiv.appendChild(table); rootDiv.appendChild(createPanelDiv(pageContext, source, visualDocument, styleClasses)); table.appendChild(tr); tr.appendChild(td); td.appendChild(buttonBorderDiv); buttonBorderDiv.appendChild(fileuploadButtonDiv); td.appendChild(createControl(pageContext, sourceNode, visualDocument, styleClasses.getUploadButtonClass(), styleClasses.getUploadButtonClass2(), uploadControlLabel, false, styleClasses)); td.appendChild(createControl(pageContext, sourceNode, visualDocument, styleClasses.getCleanButtonClass(), styleClasses.getCleanButtonClass2(), clearAllControlLabel, true , styleClasses)); data = new VpeCreationData(rootDiv); return data; } /** * Creates the control. * * @param pageContext the page context * @param sourceNode the source node * @param visualDocument the visual document * @param secondCssClass the second css class * @param thirdCssClass the third css class * @param text the text * @param isClearButton the is clear button * @param styleClasses the style classes * * @return the ns idom node */ private nsIDOMNode createControl(VpePageContext pageContext, Node sourceNode, nsIDOMDocument visualDocument, String secondCssClass, String thirdCssClass,String text,boolean isClearButton, StyleClasses styleClasses) { final nsIDOMElement firstDiv = visualDocument.createElement(HTML.TAG_DIV); final nsIDOMElement secondDiv = visualDocument.createElement(HTML.TAG_DIV); final nsIDOMElement thirdDiv = visualDocument.createElement(HTML.TAG_DIV); firstDiv.setAttribute(HTML.ATTR_CLASS, "rich-fileupload-button-border"); //$NON-NLS-1$ firstDiv.setAttribute(HTML.ATTR_STYLE,"float: "+(isClearButton ? "right;" : "left;")); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ secondDiv.setAttribute(HTML.ATTR_CLASS, secondCssClass); thirdDiv.setAttribute(HTML.ATTR_CLASS, thirdCssClass); firstDiv.appendChild(secondDiv); secondDiv.appendChild(thirdDiv); if (isClearButton) { thirdDiv.appendChild(visualDocument.createTextNode(text)); }else{ final nsIDOMElement bDiv = visualDocument.createElement(HTML.TAG_B); thirdDiv.appendChild(bDiv); bDiv.appendChild(visualDocument.createTextNode(text)); } return firstDiv; } /** * Creates the panel div. * * @param visualDocument the visual document * @param pageContext the page context * @param source the source * * @return the ns IDOM element */ private nsIDOMElement createPanelDiv(VpePageContext pageContext, Element source, nsIDOMDocument visualDocument, StyleClasses styleClasses) { final nsIDOMElement div = visualDocument.createElement(HTML.TAG_DIV); div.setAttribute(HTML.ATTR_CLASS, styleClasses.getUploadListClass()); div.setAttribute(HTML.ATTR_STYLE, VpeStyleUtil.PARAMETER_WIDTH + VpeStyleUtil.COLON_STRING + "100%" + VpeStyleUtil.SEMICOLON_STRING //$NON-NLS-1$ + VpeStyleUtil.PARAMETER_HEIGHT + VpeStyleUtil.COLON_STRING + this.listHeight); return div; } /** * Checks if is recreate at attr change. * * @param sourceElement the source element * @param visualDocument the visual document * @param value the value * @param visualNode the visual node * @param data the data * @param pageContext the page context * @param name the name * * @return true, if is recreate at attr change */ @Override public boolean recreateAtAttrChange(VpePageContext pageContext, Element sourceElement, nsIDOMDocument visualDocument, nsIDOMElement visualNode, Object data, String name, String value) { return true; } /** * Prepare data. * * @param sourceElement the source element */ private void prepareData(Element sourceElement) { try { listHeight = String.valueOf(ComponentUtil.parseWidthHeightValue(sourceElement.getAttribute("listHeight"))); //$NON-NLS-1$ } catch (NumberFormatException e) { listHeight = DEFAULT_LIST_HEIGHT; } try { listWidth = String.valueOf(ComponentUtil.parseWidthHeightValue(sourceElement.getAttribute("listWidth"))); //$NON-NLS-1$ } catch (NumberFormatException e) { listWidth = DEFAULT_LIST_WIDTH; } String addControlLabelAttrName = "addControlLabel"; //$NON-NLS-1$ addControlLabel = sourceElement.hasAttribute(addControlLabelAttrName) ? sourceElement.getAttribute(addControlLabelAttrName) : DEFAULT_CONTROL_LABEL_VALUE; this.uploadControlLabel = ComponentUtil.getAttribute(sourceElement, "uploadControlLabel"); //$NON-NLS-1$ if (ComponentUtil.isBlank(this.uploadControlLabel)) { this.uploadControlLabel = "Upload"; //$NON-NLS-1$ } this.clearAllControlLabel = ComponentUtil.getAttribute(sourceElement, "clearAllControlLabel"); //$NON-NLS-1$ if(ComponentUtil.isBlank(this.clearAllControlLabel)){ this.clearAllControlLabel = "Clear All"; //$NON-NLS-1$ } } /** * Stores all style-class related variables. * * @author yradtsevich */ class StyleClasses { private static final String ATTR_STOP_BUTTON_CLASS = "stopButtonClass"; //$NON-NLS-1$ private static final String ATTR_FILE_ENTRY_CONTROL_CLASS = "fileEntryControlClass"; //$NON-NLS-1$ private static final String ATTR_FILE_ENTRY_CLASS = "fileEntryClass"; //$NON-NLS-1$ private static final String ATTR_CLEAN_BUTTON_CLASS = "cleanButtonClass"; //$NON-NLS-1$ private static final String ATTR_UPLOAD_BUTTON_CLASS = "uploadButtonClass"; //$NON-NLS-1$ private static final String ATTR_UPLOAD_LIST_CLASS = "uploadListClass"; //$NON-NLS-1$ private static final String ATTR_ADD_BUTTON_CLASS = "addButtonClass"; //$NON-NLS-1$ private static final String POSTFIX_ENABLED = ""; //$NON-NLS-1$ private static final String POSTFIX_DISABLED = "Disabled"; //$NON-NLS-1$ private String addButtonClass = "rich-fileupload-button rich-fileupload-font"; //$NON-NLS-1$ private String uploadButtonClass = "rich-fileupload-button rich-fileupload-font"; //$NON-NLS-1$ private String cleanButtonClass = "rich-fileupload-button rich-fileupload-font"; //$NON-NLS-1$ private String addButtonClassDiv2 = " rich-fileupload-button-content rich-fileupload-font rich-fileupload-ico rich-fileupload-ico-add"; //$NON-NLS-1$ private String uploadButtonClass2 = "rich-fileupload-button-content rich-fileupload-font rich-fileupload-ico rich-fileupload-ico-start"; //$NON-NLS-1$ private String cleanButtonClass2 = "rich-fileupload-button-content rich-fileupload-font rich-fileupload-ico rich-fileupload-ico-clear"; //$NON-NLS-1$ private String uploadListClass = "rich-fileupload-list-overflow"; //$NON-NLS-1$ public StyleClasses(final Element sourceElement) { final boolean disabled = RichFaces.VALUE_TRUE .equalsIgnoreCase(sourceElement.getAttribute(RichFaces.ATTR_DISABLED)); final String styleAttrPostfix = disabled ? POSTFIX_DISABLED : POSTFIX_ENABLED; final String addButtonClass = sourceElement.getAttribute( ATTR_ADD_BUTTON_CLASS + styleAttrPostfix); if (ComponentUtil.isNotBlank(addButtonClass)) { this.addButtonClass += HTML.VALUE_CLASS_DELIMITER + addButtonClass; this.addButtonClassDiv2 += HTML.VALUE_CLASS_DELIMITER + addButtonClass; } final String uploadButtonClass = sourceElement.getAttribute( ATTR_UPLOAD_BUTTON_CLASS + styleAttrPostfix); if (ComponentUtil.isNotBlank(uploadButtonClass)) { this.uploadButtonClass += HTML.VALUE_CLASS_DELIMITER + uploadButtonClass; this.uploadButtonClass2 += HTML.VALUE_CLASS_DELIMITER + uploadButtonClass; } final String cleanButtonClass = sourceElement.getAttribute( ATTR_CLEAN_BUTTON_CLASS + styleAttrPostfix); if (ComponentUtil.isNotBlank(cleanButtonClass)) { this.cleanButtonClass += HTML.VALUE_CLASS_DELIMITER + cleanButtonClass; this.cleanButtonClass2 += HTML.VALUE_CLASS_DELIMITER + cleanButtonClass; } final String uploadListClass = sourceElement.getAttribute( ATTR_UPLOAD_LIST_CLASS + styleAttrPostfix); if (ComponentUtil.isNotBlank(uploadListClass)) { this.uploadListClass += HTML.VALUE_CLASS_DELIMITER + uploadListClass; } } public String getAddButtonClass() { return addButtonClass; } public String getUploadButtonClass() { return uploadButtonClass; } public String getCleanButtonClass() { return cleanButtonClass; } public String getAddButtonClassDiv2() { return addButtonClassDiv2; } public String getCleanButtonClass2() { return cleanButtonClass2; } public String getUploadButtonClass2() { return uploadButtonClass2; } public String getUploadListClass() { return uploadListClass; } } }