/*******************************************************************************
* Copyright (c) 2007-2009 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
*
* Contributor:
* 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.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.nsIDOMText;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
/**
* Template for rich:editor.
*
* @author yradtsevich
*
*/
public class RichFacesEditorTemplate extends VpeAbstractTemplate {
public VpeCreationData create(VpePageContext pageContext, Node sourceNode, nsIDOMDocument visualDocument) {
RichFacesEditorTemplateHelper editorTemplateHelper =
new RichFacesEditorTemplateHelper(
pageContext, (Element) sourceNode, visualDocument
);
nsIDOMElement mainElement = editorTemplateHelper.create();
VpeCreationData creationData = new VpeCreationData(mainElement);
return creationData;
}
}
/**
* Creates visual nodes for rich:editor.
*
* @author yradtsevich
*
*/
class RichFacesEditorTemplateHelper {
private static final String STYLE_PATH = "editor/editor.css"; //$NON-NLS-1$
private final VpePageContext pageContext;
private final Element sourceElement;
private final nsIDOMDocument visualDocument;
public RichFacesEditorTemplateHelper(VpePageContext pageContext,
Element sourceNode, nsIDOMDocument visualDocument) {
this.pageContext = pageContext;
this.sourceElement = sourceNode;
this.visualDocument = visualDocument;
}
public nsIDOMElement create() {
ComponentUtil.setCSSLink(pageContext, STYLE_PATH, "editor"); //$NON-NLS-1$
// create nodes
nsIDOMElement mainSpan = visualDocument.createElement(HTML.TAG_SPAN); {
String styleClass = "richfacesSimpleSkin"; //$NON-NLS-1$
if (sourceElement.hasAttribute(RichFaces.ATTR_STYLE_CLASS)) {
styleClass += " " + sourceElement.getAttribute(RichFaces.ATTR_STYLE_CLASS); //$NON-NLS-1$
}
mainSpan.setAttribute(HTML.ATTR_CLASS, styleClass);
// Yahor Radtsevich: Fix of JBIDE-3653: inFlasher doesn't shows for rich:editor component
// (style "display: table;" has been added)
String style = "display: table;"; //$NON-NLS-1$
if (sourceElement.hasAttribute(RichFaces.ATTR_STYLE)) {
style += sourceElement.getAttribute(RichFaces.ATTR_STYLE);
}
mainSpan.setAttribute(HTML.ATTR_STYLE, style);
}
nsIDOMElement mainTable = createMainTable();
nsIDOMElement textContainer = createTextContainer();
nsIDOMElement toolbar = createToolbar();
// nest created nodes
mainSpan.appendChild(mainTable); {
mainTable.appendChild(textContainer);
mainTable.appendChild(toolbar);
}
return mainSpan;
}
/**
* Creates {@code
* <table cellspacing="0" cellpadding="0" class="mceLayout" style="width: ???px; height: ???px;"/>
* }
* @return created element
*/
private nsIDOMElement createMainTable() {
// evaluate width and height
String style = "width: 183px; height: 100px;"; //$NON-NLS-1$
if (sourceElement.hasAttribute(RichFaces.ATTR_WIDTH)) {
String width = sourceElement.getAttribute(RichFaces.ATTR_WIDTH);
width = VpeStyleUtil.addPxIfNecessary(width);
style = VpeStyleUtil.setParameterInStyle(style, HTML.STYLE_PARAMETER_WIDTH, width);
}
if (sourceElement.hasAttribute(RichFaces.ATTR_HEIGHT)) {
String height = sourceElement.getAttribute(RichFaces.ATTR_HEIGHT);
height = VpeStyleUtil.addPxIfNecessary(height);
style = VpeStyleUtil.setParameterInStyle(style, HTML.STYLE_PARAMETER_HEIGHT, height);
}
nsIDOMElement mainTable = visualDocument.createElement(HTML.TAG_TABLE); {
mainTable.setAttribute(HTML.ATTR_CELLSPACING, "0"); //$NON-NLS-1$
mainTable.setAttribute(HTML.ATTR_CELLPADDING, "0"); //$NON-NLS-1$
mainTable.setAttribute(HTML.ATTR_CLASS, "mceLayout"); //$NON-NLS-1$
mainTable.setAttribute(HTML.ATTR_STYLE, style);
}
return mainTable;
}
/**
* Creates {@code
* <tr style="height: 100%;">
* <td>
* <div class="mceIframeContainer" style="height: 100%;">
* <table border="0" style="width: 100%; height: 100%;">
* <tr><td> </td></tr>
* </table>
* </div>
* </td>
* </tr>
* }
*
* @return created element
*/
private nsIDOMElement createTextContainer() {
// create nodes
nsIDOMElement outerTR = visualDocument.createElement(HTML.TAG_TR); {
outerTR.setAttribute(HTML.ATTR_STYLE, "height: 100%;"); //$NON-NLS-1$
}
nsIDOMElement outerTD = visualDocument.createElement(HTML.TAG_TD);
nsIDOMElement div = visualDocument.createElement(HTML.TAG_DIV); {
div.setAttribute(HTML.ATTR_CLASS, "mceIframeContainer"); //$NON-NLS-1$
div.setAttribute(HTML.ATTR_STYLE, "height: 100%;"); //$NON-NLS-1$
}
nsIDOMElement table = visualDocument.createElement(HTML.TAG_TABLE); {
table.setAttribute(HTML.ATTR_BORDER, "0"); //$NON-NLS-1$
table.setAttribute(HTML.ATTR_STYLE, "width: 100%; height: 100%;"); //$NON-NLS-1$
}
nsIDOMElement innerTR = visualDocument.createElement(HTML.TAG_TR);
nsIDOMElement innerTD = visualDocument.createElement(HTML.TAG_TD);
nsIDOMText text = visualDocument.createTextNode(" "); //$NON-NLS-1$
// nest created nodes
outerTR.appendChild(outerTD); {
outerTD.appendChild(div); {
div.appendChild(table); {
table.appendChild(innerTR); {
innerTR.appendChild(innerTD); {
innerTD.appendChild(text);
}
}
}
}
}
return outerTR;
}
/**
* Creates {@code
* <tr>
* <td class="mceToolbar" >
* <table cellspacing="0" cellpadding="0" class="mceToolbarTable">
* <tr>
* <td>
* <div class="mce_panel"/>
* </td>
* </tr>
* </table>
* </td>
* </tr>
* }
*
* @return created element
*/
private nsIDOMElement createToolbar() {
// create nodes
nsIDOMElement outerTR = visualDocument.createElement(HTML.TAG_TR);
nsIDOMElement outerTD = visualDocument.createElement(HTML.TAG_TD); {
outerTD.setAttribute(HTML.ATTR_CLASS, "mceToolbar"); //$NON-NLS-1$
}
nsIDOMElement table = visualDocument.createElement(HTML.TAG_TABLE); {
table.setAttribute(HTML.ATTR_CELLSPACING, "0"); //$NON-NLS-1$
table.setAttribute(HTML.ATTR_CELLPADDING, "0"); //$NON-NLS-1$
table.setAttribute(HTML.ATTR_CLASS, "mceToolbarTable"); //$NON-NLS-1$
}
nsIDOMElement innerTR = visualDocument.createElement(HTML.TAG_TR);
nsIDOMElement innerTD = visualDocument.createElement(HTML.TAG_TD);
nsIDOMElement div = visualDocument.createElement(HTML.TAG_DIV); {
div.setAttribute(HTML.ATTR_CLASS, "mce_panel"); //$NON-NLS-1$
}
// nest created nodes
outerTR.appendChild(outerTD); {
outerTD.appendChild(table); {
table.appendChild(innerTR); {
innerTR.appendChild(innerTD); {
innerTD.appendChild(div);
}
}
}
}
return outerTR;
}
}