blob: 043b82d3b2c66b9f7ecfd3d9b161cd0ebd39f0e7 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2006 Sybase, Inc. and others.
*
* All rights reserved. This program and the accompanying materials
* are 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:
* Sybase, Inc. - initial API and implementation
*******************************************************************************/
package org.eclipse.jst.pagedesigner.jsf.ui.converter.jsfhtml;
import java.util.List;
import org.eclipse.jst.jsf.core.internal.tld.IJSFConstants;
import org.eclipse.jst.pagedesigner.IHTMLConstants;
import org.eclipse.jst.pagedesigner.converter.ConverterUtil;
import org.w3c.dom.Element;
import org.w3c.dom.Text;
/**
* @author mengbo
* @version 1.5
*/
public class TableBasedSelectTagConverter extends SelectTagConverter
{
private String _inputType;
/**
* @param host
* @param inputType
*/
public TableBasedSelectTagConverter(Element host, String inputType)
{
super(host);
this._inputType = inputType;
}
/* (non-Javadoc)
* @see org.eclipse.jst.pagedesigner.converter.AbstractTagConverter#doConvertRefresh()
*/
protected Element doConvertRefresh()
{
Element hostEle = getHostElement();
// Render a "table" element.
Element tableEle = createElement(IHTMLConstants.TAG_TABLE);
// If the "styleClass" is specified, render the value of the "styleClass"
// attribute as the value of the "class" attribute on the "table" element.
ConverterUtil.copyAttribute(hostEle, IJSFConstants.ATTR_STYLECLASS, tableEle, IHTMLConstants.ATTR_CLASS);
// If the "style", "border" attributes are specified, pass them thru.
ConverterUtil.copyAttribute(hostEle, IJSFConstants.ATTR_STYLE, tableEle, IHTMLConstants.ATTR_STYLE);
ConverterUtil.copyAttribute(hostEle, IJSFConstants.ATTR_BORDER, tableEle, IHTMLConstants.ATTR_BORDER);
// If the "layout" attribute is specified, and its value is "pageDirection",
// render the children elements vertically, otherwise horizontally, in the table.
boolean horizontal = true;
if ("pageDirection".equalsIgnoreCase(hostEle.getAttribute(IJSFConstants.ATTR_LAYOUT)))
{
horizontal = false;
}
Element itemContainer;
if (horizontal)
{
itemContainer = createElement(IHTMLConstants.TAG_TR);
tableEle.appendChild(itemContainer);
}
else
{
itemContainer = tableEle;
}
// XXX: If any of the children are an instance of SelectItemGroup, render them as a
// nested table.
// but at design time, we don't know anything about SelectItemGroup. so will not
// rendering nested table.
List selectitems = this.getSelectItems(hostEle);
// for designer, if there is no item, we still want to render one
if (this.isDesignerMode() && selectitems.isEmpty())
{
SelectItemModel item = getDefault(hostEle);
selectitems.add(item);
}
boolean isDisabled = Boolean.TRUE.toString()
.equalsIgnoreCase(hostEle.getAttribute(IJSFConstants.ATTR_DISABLED));
boolean isReadonly = Boolean.TRUE.toString()
.equalsIgnoreCase(hostEle.getAttribute(IJSFConstants.ATTR_READONLY));
for (int i = 0, size = selectitems.size(); i < size; i++)
{
SelectItemModel item = (SelectItemModel) selectitems.get(i);
// Each of the children are ultimately rendererd as follows.
// Render a "label" element. Inside of the "label", render an "input" element
// of "type" "checkbox" for each child component.
Element labelEle = createElement(IHTMLConstants.TAG_LABEL);
Element inputEle = createElement(IHTMLConstants.TAG_INPUT);
inputEle.setAttribute(IHTMLConstants.ATTR_TYPE, getInputType());
if (isDisabled || item.isDisabled())
{
inputEle.setAttribute(IHTMLConstants.ATTR_DISABLED, "disabled");
}
if (isReadonly)
{
inputEle.setAttribute(IHTMLConstants.ATTR_READONLY, "readonly");
}
// As an exception to the general
// rules about how to handle the "id" attribute, render it as an attribute on
// the outer "table" element, the value of which is the clientId of the component
// per the rules at the beginning of this specification.The "id" attribute must
// not be output on each "input" element.
if (item.getId() != null)
{
labelEle.setAttribute(IHTMLConstants.ATTR_ID, item.getId());
}
// The value of the current SelectItem
// is rendered as the value of the "value" attribute. If the value of the enclosing
// UISelectMany matches the current value, render "checked" as the value of the
// "checked" attribute. If the current SelectItem.isDisabled() returns true,
// render "disabled" as the value of the "disabled" attribute.
if (item.getValue() != null)
{
inputEle.setAttribute(IHTMLConstants.ATTR_VALUE, item.getValue());
}
// XXX: checked and disabled is not handled.
// Close out the "input" element and render the return value from
// SelectItem.getLabel(). Close out the "label" element and any other nested elements.
Text label = createText(item.getDisplayString());
labelEle.appendChild(inputEle);
labelEle.appendChild(label);
if (horizontal)
{
Element td = createElement(IHTMLConstants.TAG_TD);
td.appendChild(labelEle);
itemContainer.appendChild(td);
}
else
{
Element tr = createElement(IHTMLConstants.TAG_TR);
Element td = createElement(IHTMLConstants.TAG_TD);
tr.appendChild(td);
td.appendChild(labelEle);
itemContainer.appendChild(tr);
}
}
return (tableEle);
}
/**
* @return the input type
*/
protected String getInputType()
{
return _inputType;
}
/* (non-Javadoc)
* @see org.eclipse.jst.pagedesigner.converter.AbstractTagConverter#needBorderDecorator()
*/
public boolean needBorderDecorator()
{
return true;
}
}