You are viewing a plain text version of this content. The canonical link for it is here.
Posted to users@tapestry.apache.org by 小司 <mo...@gmail.com> on 2007/09/01 01:53:32 UTC

Re: [T5] SelectObject component added to the Wiki

I got it. Thanks Davor Hrg,I will try your advice .I will keep in touch with
tapestry5,

2007/9/1, Davor Hrg <hr...@gmail.com>:
>
> If you like digging into tapestry I suggest you start
> by removing beanutils dependancy and adding:
>     @Inject
>     private PropertyAccess propertyAccess;
>
> into SelectObject.java
> after that use propertyAccess instead of beanutils...
> ....
>
> I'm currently building a version that doesn't need
> SelectObject component, but uses normal select component.
> The code is more complicated than it should be, so I suppose
> I might post an enhancement ticket for the Select component.
>
>
>
> ...
> if you like to start with working code ...
> here's the changed version that works for me ...
>
>
>
>
> -------------------------------------------------------------------------------------------------------------------------------------------
> package test.tapestry;
>
>
> import java.lang.reflect.InvocationTargetException;
> import java.util.ArrayList;
> import java.util.List;
>
> import org.apache.tapestry.OptionGroupModel;
> import org.apache.tapestry.OptionModel;
> import org.apache.tapestry.internal.OptionModelImpl;
> import org.apache.tapestry.ioc.services.PropertyAccess;
> import org.apache.tapestry.ioc.services.PropertyAdapter;
> import org.apache.tapestry.util.AbstractSelectModel;
>
> /**
> * @author jued
> *
> * @param <T>
> */
> public class GenericSelectionModel<T> extends AbstractSelectModel {
>
>         private String labelField;
>
>         private List<T> list;
>
>         private final PropertyAccess adapter;
>
>         public GenericSelectionModel(List<T> list, String labelField,
> PropertyAccess adapter) {
>                 this.labelField = labelField;
>                 this.list = list;
>                 this.adapter = adapter;
>         }
>
>         public List<OptionGroupModel> getOptionGroups() {
>                 return null;
>         }
>
>         public List<OptionModel> getOptions() {
>                 List<OptionModel> optionModelList = new
> ArrayList<OptionModel>();
>                 for (T obj : list) {
>                         if (labelField == null) {
>                                 optionModelList.add(new
> OptionModelImpl(obj
> + "", false, obj, new String[0]));
>                         } else {
>                                 optionModelList.add(new OptionModelImpl(
>                                                 adapter.get(obj,
> labelField)+"", false, obj, new String[0]));
>                         }
>                 }
>                 return optionModelList;
>         }
> }
>
> -------------------------------------------------------------------------------------------------------------------------------------------
>
>
>
> -------------------------------------------------------------------------------------------------------------------------------------------
> package test.tapestry;
>
> import java.lang.reflect.InvocationTargetException;
> import java.util.List;
>
> import org.apache.tapestry.ValueEncoder;
> import org.apache.tapestry.ioc.services.PropertyAccess;
> import org.apache.tapestry.ioc.services.PropertyAdapter;
>
> public class GenericValueEncoder<T> implements ValueEncoder<T> {
>
>         private List<T> list;
>         private final PropertyAccess access;
>         private final String fieldName;
>
>         public GenericValueEncoder(List<T> list, String fieldName,
> PropertyAccess propertyAccess) {
>                 this.list = list;
>                 this.fieldName = fieldName;
>                 this.access = propertyAccess;
>         }
>
>         public String toClient(T obj) {
>                 if (fieldName == null) {
>                         return obj + "";
>                 } else {
>                         return access.get(obj,fieldName)+"";
>                 }
>         }
>
>         public T toValue(String string) {
>                 for (T obj : list) {
>                         if (fieldName == null) {
>                                 if ((obj + "").equals(string)) {
>                                         return obj;
>                                 }
>                         } else {
>                                 if (access.get(obj,
> fieldName).equals(string)) {
>                                         return obj;
>                                 }
>                         }
>                 }
>                 return null;
>         }
> }
>
> -------------------------------------------------------------------------------------------------------------------------------------------
>
>
>
>
> -------------------------------------------------------------------------------------------------------------------------------------------
> package test.tapestry.components;
>
> import java.util.List;
> import java.util.Locale;
>
> import org.apache.tapestry.Binding;
> import org.apache.tapestry.ComponentResources;
> import org.apache.tapestry.FieldValidator;
> import org.apache.tapestry.MarkupWriter;
> import org.apache.tapestry.OptionModel;
> import org.apache.tapestry.SelectModel;
> import org.apache.tapestry.SelectModelVisitor;
> import org.apache.tapestry.ValidationException;
> import org.apache.tapestry.ValidationTracker;
> import org.apache.tapestry.ValueEncoder;
> import org.apache.tapestry.annotations.BeforeRenderTemplate;
> import org.apache.tapestry.annotations.Environmental;
> import org.apache.tapestry.annotations.Inject;
> import org.apache.tapestry.annotations.Parameter;
> import org.apache.tapestry.corelib.base.AbstractField;
> import org.apache.tapestry.internal.util.SelectModelRenderer;
> import org.apache.tapestry.ioc.services.PropertyAccess;
> import org.apache.tapestry.services.FieldValidatorDefaultSource;
> import org.apache.tapestry.services.FormSupport;
> import org.apache.tapestry.services.Request;
> import org.apache.tapestry.services.ValueEncoderFactory;
> import org.apache.tapestry.services.ValueEncoderSource;
> import org.apache.tapestry.util.EnumSelectModel;
>
> import test.tapestry.GenericSelectionModel;
> import test.tapestry.GenericValueEncoder;
>
> /**
> * Select an item from a list of values, using an [X]HTML &lt;select&gt;
> element on the client side.
> * An validation decorations will go around the entire &lt;select&gt;
> element.
> * <p>
> * A core part of this component is the {@link ValueEncoder} (the encoder
> parameter) that is used to
> * convert between server-side values and client-side strings. In many
> cases, a {@link ValueEncoder}
> * can be generated automatically from the type of the value parameter. The
> * {@link ValueEncoderSource} service provides an encoder in these
> situations; it can be overriden
> * by binding the encoder parameter, or extended by contributing a {@link
> ValueEncoderFactory} into
> * the service's configuration.
> */
> public final class SelectObject extends AbstractField
> {
>     private class Renderer extends SelectModelRenderer
>     {
>
>         public Renderer(MarkupWriter writer)
>         {
>             super(writer, _encoder);
>         }
>
>         @Override
>         protected boolean isOptionSelected(OptionModel optionModel)
>         {
>             Object value = optionModel.getValue();
>
>             return value == _value || (value != null && value.equals
> (_value));
>         }
>     }
>
>     @Inject
>     private FieldValidatorDefaultSource _fieldValidatorDefaultSource;
>
>     @Inject
>     private Locale _locale;
>
>     @Inject
>     private PropertyAccess propertyAccess;
>
>     @Parameter(required = true)
>     private List<Object> _list;
>
>     @Parameter
>     private String _labelField = null;
>
>     // Maybe this should default to property "<componentId>Model"?
>     /**
>      * The model used to identify the option groups and options to be
> presented to the user. This
>      * can be generated automatically for Enum types.
>      */
> //    @Parameter(required = true)
> //    private SelectModel _model;
>
>     private GenericSelectionModel<Object> _model;
>
>     /**
>      * Allows a specific implementation of {@link ValueEncoder} to be
> supplied. This is used to
>      * create client-side string values for the different options.
>      *
>      * @see ValueEncoderSource
>      */
> //    @Parameter
> //    private ValueEncoder _encoder;
>
>     private GenericValueEncoder<Object> _encoder;
>
>     @Inject
>     private Request _request;
>
>     @Inject
>     private ComponentResources _resources;
>
>     @Environmental
>     private ValidationTracker _tracker;
>
>     /** Performs input validation on the value supplied by the user in the
> form submission. */
>     @Parameter(defaultPrefix = "validate")
>     @SuppressWarnings("unchecked")
>     private FieldValidator<Object> _validate = NOOP_VALIDATOR;
>
>     /** The value to read or update. */
>     @Parameter(required = true, principal = true)
>     private Object _value;
>
>     @Inject
>     private ValueEncoderSource _valueEncoderSource;
>
>     @Override
>     protected void processSubmission(FormSupport formSupport, String
> elementName)
>     {
>         _encoder = new GenericValueEncoder<Object>(_list, _labelField,
> propertyAccess);
>
>         String primaryKey = _request.getParameter(elementName);
>
>         Object selectedValue = _encoder.toValue(primaryKey);
>
>         try
>         {
>             _validate.validate(selectedValue);
>
>             _value = selectedValue;
>         }
>         catch (ValidationException ex)
>         {
>             _tracker.recordError(this, ex.getMessage());
>             return;
>         }
>     }
>
>     void afterRender(MarkupWriter writer)
>     {
>         writer.end();
>     }
>
>     void beginRender(MarkupWriter writer)
>     {
>         writer.element("select", "name", getElementName(), "id",
> getClientId());
>         _encoder = new GenericValueEncoder<Object>(_list, _labelField,
> propertyAccess);
>         _model = new GenericSelectionModel<Object>(_list, _labelField,
> propertyAccess);
>         // Disabled, informals via mixins
>     }
>
>     @SuppressWarnings("unchecked")
>     ValueEncoder defaultEncoder()
>     {
>         return _valueEncoderSource.createEncoder("value", _resources);
>     }
>
>     @SuppressWarnings("unchecked")
>     SelectModel defaultModel()
>     {
>         Class valueType = _resources.getBoundType("value");
>
>         if (valueType == null) return null;
>
>         if (Enum.class.isAssignableFrom(valueType))
>             return new EnumSelectModel(valueType,
> _resources.getContainerMessages());
>
>         return null;
>     }
>
>     /**
>      * Computes a default value for the "validate" parameter using
>      * {@link FieldValidatorDefaultSource}.
>      */
>     FieldValidator defaultValidate()
>     {
>         Class type = _resources.getBoundType("value");
>
>         if (type == null) return null;
>
>         return _fieldValidatorDefaultSource.createDefaultValidator(
>                 this,
>                 _resources.getId(),
>                 _resources.getContainerMessages(),
>                 _locale,
>                 type,
>                 _resources.getAnnotationProvider("value"));
>     }
>
>     Binding defaultValue()
>     {
>         return createDefaultParameterBinding("value");
>     }
>
>     @BeforeRenderTemplate
>     void options(MarkupWriter writer)
>     {
>         SelectModelVisitor renderer = new Renderer(writer);
>
>         _model.visit(renderer);
>     }
>
>     // For testing.
>
>     void setModel(GenericSelectionModel model)
>     {
>         _model = model;
>     }
>
>     void setValue(Object value)
>     {
>         _value = value;
>     }
>
>     void setValueEncoder(GenericValueEncoder encoder)
>     {
>         _encoder = encoder;
>     }
> }
>
> -------------------------------------------------------------------------------------------------------------------------------------------
>
>
>
>
>
>
>
>
>
> On 8/29/07, Marcelo lotif <ml...@gmail.com> wrote:
> >
> > Hi Davor,
> > Can you send it to me?
> >
> > 2007/8/29, Davor Hrg <hr...@gmail.com>:
> > >
> > > thnx,
> > > very nice example,
> > >
> > > I've liked it and modified it to use Tapestry builtin service:
> > > PropertyAccess
> > > instead of beanutils. If you like I can update the wiki..
> > >
> > > Davor Hrg
> > >
> > > On 8/28/07, Marcelo lotif <ml...@gmail.com> wrote:
> > > >
> > > > http://wiki.apache.org/tapestry/Tapestry5SelectObject
> > > >
> > > > --
> > > > Atenciosamente,
> > > > Marcelo Lotif
> > > >
> > >
> >
> >
> >
> > --
> > Atenciosamente,
> > Marcelo Lotif
> >
>



-- 
得与失都是生活