Here's one I wrote using Tapestry 3.0: OrderField.jwc: <?xml version="1.0"?> <!DOCTYPE component-specification PUBLIC "-//Apache Software Foundation//Tapestry Specification 3.0//EN" "http://jakarta.apache.org/tapestry/dtd/Tapestry_3_0.dtd"> <component-specification class="OrderField" allow-body="no" allow-informal-parameters="no"> <parameter name="model" type="org.apache.tapestry.form.IPropertySelectionModel" required="yes" direction="in"></parameter> <parameter name="list" type="java.util.List" required="yes" direction="form"></parameter> <parameter name="tableClass" type="java.lang.String" required="no" direction="in"></parameter> <parameter name="buttonClass" type="java.lang.String" required="no" direction="in"></parameter> <parameter name="upLabel" type="java.lang.String" required="no" direction="in" default-value="getMessage('label.up')"></parameter> <parameter name="downLabel" type="java.lang.String" required="no" direction="in" default-value="getMessage('label.down')"></parameter> <property-specification name="name" type="java.lang.String"></property-specification> <property-specification name="form" type="org.apache.tapestry.IForm"></property-specification> <property-specification name="indexList" type="java.util.List"></property-specification> <property-specification name="index" type="java.lang.Integer"></property-specification> <private-asset name="script" resource-path="OrderField.js"></private-asset> </component-specification>
OrderField.js:
function selectAll(element, selected) {
for (var i = 0; i < element.length; ++i) {
element.options[i].selected = selected
}
}
function shift(element, i) {
var oldIndex = element.selectedIndex
var newIndex = oldIndex + i
if ((newIndex >= 0) && (newIndex < element.length)) {
var oldOption = element.options[oldIndex]
var newOption = element.options[newIndex]
var text = oldOption.text
var value = oldOption.value
oldOption.text = newOption.text
oldOption.value = newOption.value
newOption.text = text
newOption.value = value
newOption.selected = true
oldOption.selected = false
}
}
OrderField.html:
<span jwcid="$content$">
<table jwcid="@Any" element="table" class="ognl:tableClass">
<tr valign="top">
<td>
<select jwcid="@Any" name="ognl:name" element="select"
size="ognl:model.optionCount" multiple="multiple">
<span jwcid="@Foreach" source="ognl:indexList"
value="ognl:index">
<option jwcid="@Any" element="option"
value="ognl:model.value[index]"><span jwcid="@Insert"
value="ognl:model.label[index]"></span></option>
</span>
</select>
</td>
<td valign="middle">
<button jwcid="@Any" name="ognl:'up'+name"
value="ognl:upLabel"
onclick="ognl:'shift(this.form.'+name+',-1);this.disabled=(this.form.'+name+'.selectedIndex
== 0);this.form.down'+name+'.disabled=false'" class="ognl:buttonClass"
type="button"><span jwcid="@Insert"
value="ognl:upLabel">Up</span></button><br/>
<br/>
<button jwcid="@Any" name="ognl:'down'+name"
value="ognl:downLabel"
onclick="ognl:'shift(this.form.'+name+',+1);this.disabled=(this.form.'+name+'.selectedIndex
== (this.form.'+name+'.length -
1));this.form.up'+name+'.disabled=false'" class="ognl:buttonClass"
type="button"><span jwcid="@Insert"
value="ognl:downLabel">Down</span></button><br/>
</td>
</tr>
</table>
</span>
OrderField.properties:
label.down = \u2193
label.up = \u2191
OrderField.java:
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import org.apache.tapestry.ApplicationRuntimeException;
import org.apache.tapestry.BaseComponent;
import org.apache.tapestry.IForm;
import org.apache.tapestry.IMarkupWriter;
import org.apache.tapestry.IRequestCycle;
import org.apache.tapestry.form.Form;
import org.apache.tapestry.form.FormEventType;
import org.apache.tapestry.form.IFormComponent;
import org.apache.tapestry.form.IPropertySelectionModel;
import org.apache.tapestry.html.Body;
import org.apache.tapestry.valid.IValidationDelegate;
public abstract class OrderField extends BaseComponent implements
IFormComponent
{
public abstract void setForm(IForm form);
public abstract List<Object> getIndexList();
public abstract void setIndexList(List list);
public abstract IPropertySelectionModel getModel();
public abstract List<Object> getList();
public abstract void setList(List list);
/**
* @see
org.apache.tapestry.AbstractComponent#renderComponent(org.apache.tapestry.IMarkupWriter,
org.apache.tapestry.IRequestCycle)
*/
protected void renderComponent(IMarkupWriter writer, IRequestCycle
requestCycle)
{
IForm form = Form.get(getPage().getRequestCycle());
if (form == null)
{
throw new ApplicationRuntimeException("Palette component
must be wrapped by a Form.", this, null, null);
}
setForm(form);
IValidationDelegate delegate = form.getDelegate();
if (delegate != null)
{
delegate.setFormComponent(this);
}
setName(form.getElementId(this));
IPropertySelectionModel model = this.getModel();
if (form.isRewinding())
{
String[] parameters =
requestCycle.getRequestContext().getParameters(this.getName());
if (parameters != null)
{
this.setList(new ArrayList(parameters.length));
for (int i = 0; i < parameters.length; ++i)
{
this.getList().add(model.translateValue(parameters[i]));
}
}
else
{
this.setList(Collections.EMPTY_LIST);
}
}
else if (!requestCycle.isRewinding())
{
this.setIndexList(new
ArrayList(this.getModel().getOptionCount()));
for (int i = 0; i < model.getOptionCount(); ++i)
{
this.getIndexList().add(i);
}
form.addEventHandler(FormEventType.SUBMIT, "function () {
selectAll(document." + form.getName() + "." + this.getName() + ",true);
return true }");
Body.get(requestCycle).addExternalScript(this.getAsset("script").getResourceLocation());
}
super.renderComponent(writer, requestCycle);
}
/**
* @see org.apache.tapestry.form.IFormComponent#getDisplayName()
*/
public String getDisplayName()
{
return null;
}
/**
* @see org.apache.tapestry.form.IFormComponent#isDisabled()
*/
public boolean isDisabled()
{
return false;
}
}
Paul
phillip rhodes wrote:
> I need to provide a means to specify the order of items in a list. The
> palate component provides this, but all I need are the up/down buttons.
>
> Let me know if you have seen a component around town that provides this
> functionality.
>
> Thanks.
>
>
>
>
> Phillip Rhodeshttp://www.jsso.org Open source Java Identity and Authorization
> Serviceshttp://www.rhoderunner.com Open Source Java Ecommerce Suite
>
smime.p7s
Description: S/MIME Cryptographic Signature
