indeed - thx (fixed) On Mon, Nov 23, 2009 at 4:47 PM, Ulrich Stärk <[email protected]> wrote: > shouldn't it be @since 5.1.0.6? > > Uli > > Am 22.11.2009 15:10 schrieb [email protected]: >> >> Author: drobiazko >> Date: Sun Nov 22 14:10:08 2009 >> New Revision: 883081 >> >> URL: http://svn.apache.org/viewvc?rev=883081&view=rev >> Log: >> TAP5-138: Add Zone parameter to Select component >> >> Added: >> >> tapestry/tapestry5/branches/5.1.0.x-dev/tapestry-core/src/test/app1/SelectZoneDemo.tml >> >> tapestry/tapestry5/branches/5.1.0.x-dev/tapestry-core/src/test/java/org/apache/tapestry5/integration/app1/data/CarMaker.java >> (with props) >> >> tapestry/tapestry5/branches/5.1.0.x-dev/tapestry-core/src/test/java/org/apache/tapestry5/integration/app1/pages/SelectZoneDemo.java >> (with props) >> Modified: >> >> tapestry/tapestry5/branches/5.1.0.x-dev/tapestry-core/src/main/java/org/apache/tapestry5/EventConstants.java >> >> tapestry/tapestry5/branches/5.1.0.x-dev/tapestry-core/src/main/java/org/apache/tapestry5/corelib/components/Select.java >> >> tapestry/tapestry5/branches/5.1.0.x-dev/tapestry-core/src/main/java/org/apache/tapestry5/corelib/components/Select.xdoc >> >> tapestry/tapestry5/branches/5.1.0.x-dev/tapestry-core/src/main/resources/org/apache/tapestry5/tapestry.js >> >> tapestry/tapestry5/branches/5.1.0.x-dev/tapestry-core/src/test/java/org/apache/tapestry5/integration/IntegrationTests.java >> >> tapestry/tapestry5/branches/5.1.0.x-dev/tapestry-core/src/test/java/org/apache/tapestry5/integration/app1/pages/Index.java >> >> Modified: >> tapestry/tapestry5/branches/5.1.0.x-dev/tapestry-core/src/main/java/org/apache/tapestry5/EventConstants.java >> URL: >> http://svn.apache.org/viewvc/tapestry/tapestry5/branches/5.1.0.x-dev/tapestry-core/src/main/java/org/apache/tapestry5/EventConstants.java?rev=883081&r1=883080&r2=883081&view=diff >> >> ============================================================================== >> --- >> tapestry/tapestry5/branches/5.1.0.x-dev/tapestry-core/src/main/java/org/apache/tapestry5/EventConstants.java >> (original) >> +++ >> tapestry/tapestry5/branches/5.1.0.x-dev/tapestry-core/src/main/java/org/apache/tapestry5/EventConstants.java >> Sun Nov 22 14:10:08 2009 >> @@ -149,4 +149,13 @@ >> * @SINCE 5.1.0.4 >> */ >> public static final String PROVIDE_COMPLETIONS = "providecompletions"; >> + + /** >> + * Event triggered by {...@link >> org.apache.tapestry5.corelib.components.Select} component to inform its >> + * container that Select's value has changed. >> + * >> + * @since 5.2.0.0 >> + */ >> + public static final String VALUE_CHANGED = "valuechanged"; >> + } >> >> Modified: >> tapestry/tapestry5/branches/5.1.0.x-dev/tapestry-core/src/main/java/org/apache/tapestry5/corelib/components/Select.java >> URL: >> http://svn.apache.org/viewvc/tapestry/tapestry5/branches/5.1.0.x-dev/tapestry-core/src/main/java/org/apache/tapestry5/corelib/components/Select.java?rev=883081&r1=883080&r2=883081&view=diff >> >> ============================================================================== >> --- >> tapestry/tapestry5/branches/5.1.0.x-dev/tapestry-core/src/main/java/org/apache/tapestry5/corelib/components/Select.java >> (original) >> +++ >> tapestry/tapestry5/branches/5.1.0.x-dev/tapestry-core/src/main/java/org/apache/tapestry5/corelib/components/Select.java >> Sun Nov 22 14:10:08 2009 >> @@ -18,14 +18,22 @@ >> import org.apache.tapestry5.annotations.*; >> import org.apache.tapestry5.corelib.base.AbstractField; >> import org.apache.tapestry5.corelib.data.BlankOption; >> +import org.apache.tapestry5.corelib.internal.ComponentActionSink; >> +import org.apache.tapestry5.corelib.internal.HiddenFieldPositioner; >> import org.apache.tapestry5.corelib.mixins.RenderDisabled; >> import org.apache.tapestry5.internal.TapestryInternalUtils; >> +import org.apache.tapestry5.internal.services.PageRenderQueue; >> +import org.apache.tapestry5.internal.util.Holder; >> import org.apache.tapestry5.internal.util.SelectModelRenderer; >> import org.apache.tapestry5.ioc.Messages; >> import org.apache.tapestry5.ioc.annotations.Inject; >> +import org.apache.tapestry5.ioc.internal.util.IdAllocator; >> import org.apache.tapestry5.ioc.internal.util.InternalUtils; >> +import org.apache.tapestry5.json.JSONArray; >> +import org.apache.tapestry5.json.JSONObject; >> import org.apache.tapestry5.services.*; >> import org.apache.tapestry5.util.EnumSelectModel; >> +import org.slf4j.Logger; >> import java.util.Locale; >> @@ -39,9 +47,12 @@ >> * can be overriden by binding the encoder parameter, or extended by >> contributing a {...@link ValueEncoderFactory} into the >> * service's configuration. >> */ >> -...@events(EventConstants.VALIDATE) >> +...@events({EventConstants.VALIDATE, EventConstants.VALUE_CHANGED + " when >> 'zone' parameter is bound"}) >> public class Select extends AbstractField >> { >> + public static final String FORM_COMPONENTID_PARAMETER = >> "t:formcomponentid"; >> + public static final String CHANGE_EVENT = "change"; >> + >> private class Renderer extends SelectModelRenderer >> { >> @@ -116,9 +127,47 @@ >> */ >> @Parameter(required = true, principal = true, autoconnect = true) >> private Object value; >> + + /** >> + * Binding the zone parameter will cause any change of Select's value >> to be handled as an Ajax request that updates the >> + * indicated zone. The component will trigger the event {...@link >> EventConstants#VALUE_CHANGED} to inform its >> + * container that Select's value has changed. >> + * + * @since 5.2.0.0 >> + */ >> + �...@parameter(defaultPrefix = BindingConstants.LITERAL) >> + private String zone; >> + >> + �...@inject >> + private FieldValidationSupport fieldValidationSupport; + + >> �...@environmental >> + private FormSupport formSupport; >> + >> + �...@inject >> + private Environment environment; >> + >> + �...@inject >> + private RenderSupport renderSupport; >> + >> + �...@inject >> + private ComponentResources componentResources; >> + >> + �...@inject >> + private HiddenFieldLocationRules rules; >> @Inject >> - private FieldValidationSupport fieldValidationSupport; >> + private Logger logger; >> + >> + �...@inject >> + private ClientDataEncoder clientDataEncoder; >> + >> + �...@inject >> + private ComponentSource componentSource; >> + >> + �...@inject >> + private PageRenderQueue pageRenderQueue; >> + >> @SuppressWarnings("unused") >> @Mixin >> @@ -139,9 +188,7 @@ >> tracker.recordInput(this, submittedValue); >> - Object selectedValue = InternalUtils.isBlank(submittedValue) >> - ? null : >> - encoder.toValue(submittedValue); >> + Object selectedValue = toValue(submittedValue); >> try >> { >> @@ -169,7 +216,86 @@ >> resources.renderInformalParameters(writer); >> // Disabled is via a mixin >> + + if (this.zone != null) + { >> + final Link link = >> this.resources.createEventLink(CHANGE_EVENT); >> + >> + link.addParameter(FORM_COMPONENTID_PARAMETER, >> this.formSupport.getFormComponentId()); >> + >> + final JSONArray spec = new JSONArray(); >> + spec.put("change"); >> + spec.put(getClientId()); >> + spec.put(this.zone); >> + spec.put(link.toAbsoluteURI()); >> + >> + this.renderSupport.addInit("updateZoneOnEvent", spec); >> + } >> + >> } >> + + Object onChange() + { >> + final String formId = >> this.request.getParameter(FORM_COMPONENTID_PARAMETER); >> + >> + final String changedValue = >> this.request.getParameter("t:selectvalue"); >> + >> + final Object newValue = toValue(changedValue); >> + >> + final Holder<Object> holder = Holder.create(); >> + >> + final ComponentEventCallback callback = new >> ComponentEventCallback() + { >> + public boolean handleResult(final Object result) + >> { >> + >> + holder.put(result); >> + >> + Select.this.value = newValue; >> + >> + return true; >> + } >> + }; >> + >> + >> this.componentResources.triggerEvent(EventConstants.VALUE_CHANGED, new >> Object[] { newValue }, callback); >> + >> + final PartialMarkupRendererFilter filter = new >> PartialMarkupRendererFilter() + { >> + public void renderMarkup(MarkupWriter writer, JSONObject >> reply, PartialMarkupRenderer renderer) + { >> + >> + HiddenFieldPositioner hiddenFieldPositioner = new >> HiddenFieldPositioner(writer, Select.this.rules); >> + >> + final ComponentActionSink actionSink = new >> ComponentActionSink(Select.this.logger, Select.this.clientDataEncoder); >> + >> + final Form form = (Form) >> Select.this.componentSource.getComponent(formId); >> + >> + FormSupport formSupport = >> form.createRenderTimeFormSupport(form.getClientId(), actionSink, new >> IdAllocator()); >> + >> + Select.this.environment.push(FormSupport.class, >> formSupport); >> + Select.this.environment.push(ValidationTracker.class, new >> ValidationTrackerImpl()); >> + >> + renderer.renderMarkup(writer, reply); >> + >> + Select.this.environment.pop(ValidationTracker.class); >> + Select.this.environment.pop(FormSupport.class); >> + >> + hiddenFieldPositioner.getElement().attributes("type", >> "hidden", "name", Form.FORM_DATA, + "value", >> actionSink.getClientData()); >> + >> + } >> + }; >> + >> + this.pageRenderQueue.addPartialMarkupRendererFilter(filter); >> + >> + return holder.get(); >> + } >> + >> + protected Object toValue(final String submittedValue) + { >> + return InternalUtils.isBlank(submittedValue) ? null : >> this.encoder.toValue(submittedValue); >> + } >> + >> @SuppressWarnings("unchecked") >> ValueEncoder defaultEncoder() >> >> Modified: >> tapestry/tapestry5/branches/5.1.0.x-dev/tapestry-core/src/main/java/org/apache/tapestry5/corelib/components/Select.xdoc >> URL: >> http://svn.apache.org/viewvc/tapestry/tapestry5/branches/5.1.0.x-dev/tapestry-core/src/main/java/org/apache/tapestry5/corelib/components/Select.xdoc?rev=883081&r1=883080&r2=883081&view=diff >> >> ============================================================================== >> --- >> tapestry/tapestry5/branches/5.1.0.x-dev/tapestry-core/src/main/java/org/apache/tapestry5/corelib/components/Select.xdoc >> (original) >> +++ >> tapestry/tapestry5/branches/5.1.0.x-dev/tapestry-core/src/main/java/org/apache/tapestry5/corelib/components/Select.xdoc >> Sun Nov 22 14:10:08 2009 >> @@ -171,5 +171,119 @@ >> </section> >> + <section name="Chaining of Select components"> >> + There is often a requirement for chaining Select >> components. When a value of a Select component is changed + >> another Select should become visible. Let's consider the following example: >> you create an online shop for a car seller. >> + A make is modeled as enumeration CarMaker. + >> >> + <subsection name="CarMaker.java"> >> + <source><![CDATA[ >> +public enum CarMaker >> +{ >> + MERCEDES, AUDI, BMW; >> +}]]></source> + </subsection> >> + >> + <subsection name="SelectZoneDemo.tml"> >> + The Select component 'carMaker' of the >> page SelectZoneDemo shows all available car makers. + >> When a user selects a car maker, another Select component for >> selecting available models of the make should appear. >> + This can be accomplished by the parameter >> <em>zone</em> of the Select component 'carMaker'. When <em>zone</em> >> parameter is bound + every change of the >> Select's value causes an ajax request. In this case the Select component >> publishes the event <em>valuechanged</em> which can + >> be used to provide the <em>model</em> for the second Select >> component. >> + <source><![CDATA[ >> +<html >> xmlns:t="http://tapestry.apache.org/schema/tapestry_5_1_0.xsd"> >> + <t:form> >> + <p> >> + <t:errors /> >> + </p> >> + <p> >> + <t:select t:id="carMaker" validate="required" >> blankOption="always" >> + model="makeModel" zone="modelZone" >> encoder="makeEncoder" /> >> + </p> >> + + <t:zone t:id="modelZone"> >> + <t:if test="carMaker"> >> + <t:delegate to="modelBlock" /> >> + </t:if> >> + </t:zone> >> + + <t:block id="modelBlock"> >> + <p> >> + <t:select t:id="carModel" model="availableModels" >> validate="required"/> >> + </p> >> + </t:block> >> + + <p> >> + <t:submit value="literal:Submit" /> >> + </p> >> + </t:form> >> + >> +</html>]]></source> >> + </subsection> >> + + <subsection name="SelectZoneDemo.java"> >> + The event handler method for the event >> <em>valuechanged</em> is used to provide the available car models of the >> currently selected car maker. >> + The new Select's value is passed as context. + >> <source><![CDATA[ >> +public class SelectZoneDemo >> +{ >> + + @Inject >> + private Messages messages; >> + + @Property >> + @Persist >> + private CarMaker carMaker; >> + + @Property >> + @Persist >> + private String carModel; >> + + @Inject >> + @Property >> + private Block modelBlock; >> + + @Property >> + @Persist >> + private List<String> availableModels; >> + + public Object onValueChanged(final CarMaker maker) + { >> + availableModels = findAvailableModels(maker); >> + + return this.modelBlock; >> + } >> + + public List<String> findAvailableModels(final CarMaker maker) + >> { >> + switch (maker) + { >> + case AUDI: >> + return Arrays.asList("A4", "A6", "A8"); >> + case BMW: >> + return Arrays.asList("3 Series", "5 Series", "7 Series"); >> + case MERCEDES: >> + return Arrays.asList("C-Class", "E-Class", "S-Class"); >> + default: >> + return Arrays.asList(); >> + } >> + } >> + + public SelectModel getMakeModel() >> + { >> + return new EnumSelectModel(CarMaker.class, this.messages); >> + } >> + + public ValueEncoder<CarMaker> getMakeEncoder() + { >> + return new EnumValueEncoder<CarMaker>(CarMaker.class); >> + } >> + >> +}]]></source> >> + >> + </subsection> >> + + </section> >> + >> </body> >> </document> >> \ No newline at end of file >> >> Modified: >> tapestry/tapestry5/branches/5.1.0.x-dev/tapestry-core/src/main/resources/org/apache/tapestry5/tapestry.js >> URL: >> http://svn.apache.org/viewvc/tapestry/tapestry5/branches/5.1.0.x-dev/tapestry-core/src/main/resources/org/apache/tapestry5/tapestry.js?rev=883081&r1=883080&r2=883081&view=diff >> >> ============================================================================== >> --- >> tapestry/tapestry5/branches/5.1.0.x-dev/tapestry-core/src/main/resources/org/apache/tapestry5/tapestry.js >> (original) >> +++ >> tapestry/tapestry5/branches/5.1.0.x-dev/tapestry-core/src/main/resources/org/apache/tapestry5/tapestry.js >> Sun Nov 22 14:10:08 2009 >> @@ -763,6 +763,11 @@ >> */ >> linkZone : function(element, zoneId, url) >> { >> + Tapestry.Initializer.updateZoneOnEvent("click", element, zoneId, >> url); >> + }, >> + + updateZoneOnEvent : function(eventName, element, zoneId, url) >> + { >> element = $(element); >> // Update the element with the id of zone div. This may be >> changed dynamically on the client >> @@ -799,17 +804,24 @@ >> return; >> } >> - // Otherwise, assume it's just an ordinary link. >> + // Otherwise, assume it's just an ordinary link or input field. >> - element.observe("click", function(event) >> + element.observe(eventName, function(event) >> { >> Event.stop(event); >> var zoneObject = Tapestry.findZoneManager(element); >> if (!zoneObject) return; >> + + var newUrl = url; >> + >> + if(element.tagName == "SELECT" && element.value) >> + { >> + newUrl+='&t:selectvalue='+element.value; >> + } >> - zoneObject.updateFromURL(url); >> + zoneObject.updateFromURL(newUrl); >> }); >> }, >> >> Added: >> tapestry/tapestry5/branches/5.1.0.x-dev/tapestry-core/src/test/app1/SelectZoneDemo.tml >> URL: >> http://svn.apache.org/viewvc/tapestry/tapestry5/branches/5.1.0.x-dev/tapestry-core/src/test/app1/SelectZoneDemo.tml?rev=883081&view=auto >> >> ============================================================================== >> --- >> tapestry/tapestry5/branches/5.1.0.x-dev/tapestry-core/src/test/app1/SelectZoneDemo.tml >> (added) >> +++ >> tapestry/tapestry5/branches/5.1.0.x-dev/tapestry-core/src/test/app1/SelectZoneDemo.tml >> Sun Nov 22 14:10:08 2009 >> @@ -0,0 +1,30 @@ >> +<t:border xmlns:t="http://tapestry.apache.org/schema/tapestry_5_1_0.xsd"> >> + <p>Car Maker: ${carMaker}</p> >> + <p>Car Model: ${carModel}</p> >> + <t:form> >> + <p> >> + <t:errors /> >> + </p> >> + <p> >> + <t:select t:id="carMaker" validate="required" >> blankOption="always" >> + model="makeModel" zone="modelZone" >> encoder="makeEncoder" /> >> + </p> >> + >> + <t:zone t:id="modelZone"> >> + <t:if test="carMaker"> >> + <t:delegate to="modelBlock" /> >> + </t:if> >> + </t:zone> >> + >> + <t:block id="modelBlock"> >> + <p id="carModelContainer"> >> + <t:select t:id="carModel" >> model="availableModels" validate="required" blankOption="always" /> >> + </p> >> + </t:block> >> + >> + <p> >> + <t:submit value="literal:Submit" /> >> + </p> >> + </t:form> >> + >> +</t:border> >> \ No newline at end of file >> >> Modified: >> tapestry/tapestry5/branches/5.1.0.x-dev/tapestry-core/src/test/java/org/apache/tapestry5/integration/IntegrationTests.java >> URL: >> http://svn.apache.org/viewvc/tapestry/tapestry5/branches/5.1.0.x-dev/tapestry-core/src/test/java/org/apache/tapestry5/integration/IntegrationTests.java?rev=883081&r1=883080&r2=883081&view=diff >> >> ============================================================================== >> --- >> tapestry/tapestry5/branches/5.1.0.x-dev/tapestry-core/src/test/java/org/apache/tapestry5/integration/IntegrationTests.java >> (original) >> +++ >> tapestry/tapestry5/branches/5.1.0.x-dev/tapestry-core/src/test/java/org/apache/tapestry5/integration/IntegrationTests.java >> Sun Nov 22 14:10:08 2009 >> @@ -2291,6 +2291,16 @@ >> waitForCondition(condition, PAGE_LOAD_TIMEOUT); >> } >> + + private void waitForElementToDisappear(String elementId) >> + { >> + >> + String condition = >> String.format("selenium.browserbot.getCurrentWindow().$(\"%s\").hide()", >> + elementId); >> + >> + waitForCondition(condition, PAGE_LOAD_TIMEOUT); >> + } >> + >> private void waitForCSSSelectedElementToAppear(String cssRule) >> { >> @@ -2963,4 +2973,48 @@ >> assertText("eventfired", "true"); >> } >> + + /** >> + * TAP5-138 >> + */ >> + �...@test >> + public void select_zone() >> + { >> + start("Select Zone Demo"); >> + + type("carMaker", "BMW"); >> + + waitForElementToAppear("carModelContainer"); >> + + click(SUBMIT); >> + + String condition = >> String.format("selenium.browserbot.getCurrentWindow().$$(\"%s\")", >> "t-error-popup"); >> + >> + waitForCondition(condition, PAGE_LOAD_TIMEOUT); >> + + assertText(String.format("//d...@class='%s']/span", >> "t-error-popup"), "You must provide a value for Car Model."); >> + + type("carModel", "7 Series"); >> + + clickAndWait(SUBMIT); >> + + assertTextPresent("Car Maker: BMW"); >> + + assertTextPresent("Car Model: 7 Series"); >> + + waitForElementToDisappear("carModelContainer"); >> + + type("carMaker", "MERCEDES"); >> + + waitForElementToAppear("carModelContainer"); >> + + type("carModel", "E-Class"); >> + + clickAndWait(SUBMIT); >> + + assertTextPresent("Car Maker: MERCEDES"); >> + + assertTextPresent("Car Model: E-Class"); >> + } >> + >> } >> \ No newline at end of file >> >> Added: >> tapestry/tapestry5/branches/5.1.0.x-dev/tapestry-core/src/test/java/org/apache/tapestry5/integration/app1/data/CarMaker.java >> URL: >> http://svn.apache.org/viewvc/tapestry/tapestry5/branches/5.1.0.x-dev/tapestry-core/src/test/java/org/apache/tapestry5/integration/app1/data/CarMaker.java?rev=883081&view=auto >> >> ============================================================================== >> --- >> tapestry/tapestry5/branches/5.1.0.x-dev/tapestry-core/src/test/java/org/apache/tapestry5/integration/app1/data/CarMaker.java >> (added) >> +++ >> tapestry/tapestry5/branches/5.1.0.x-dev/tapestry-core/src/test/java/org/apache/tapestry5/integration/app1/data/CarMaker.java >> Sun Nov 22 14:10:08 2009 >> @@ -0,0 +1,19 @@ >> +// Copyright 2009 The Apache Software Foundation >> +// >> +// Licensed under the Apache License, Version 2.0 (the "License"); >> +// you may not use this file except in compliance with the License. >> +// You may obtain a copy of the License at >> +// >> +// http://www.apache.org/licenses/LICENSE-2.0 >> +// >> +// Unless required by applicable law or agreed to in writing, software >> +// distributed under the License is distributed on an "AS IS" BASIS, >> +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or >> implied. >> +// See the License for the specific language governing permissions and >> +// limitations under the License. >> +package org.apache.tapestry5.integration.app1.data; >> + >> +public enum CarMaker >> +{ >> + MERCEDES, AUDI, BMW; >> +} >> >> Propchange: >> tapestry/tapestry5/branches/5.1.0.x-dev/tapestry-core/src/test/java/org/apache/tapestry5/integration/app1/data/CarMaker.java >> >> ------------------------------------------------------------------------------ >> svn:eol-style = native >> >> Propchange: >> tapestry/tapestry5/branches/5.1.0.x-dev/tapestry-core/src/test/java/org/apache/tapestry5/integration/app1/data/CarMaker.java >> >> ------------------------------------------------------------------------------ >> svn:mime-type = text/plain >> >> Modified: >> tapestry/tapestry5/branches/5.1.0.x-dev/tapestry-core/src/test/java/org/apache/tapestry5/integration/app1/pages/Index.java >> URL: >> http://svn.apache.org/viewvc/tapestry/tapestry5/branches/5.1.0.x-dev/tapestry-core/src/test/java/org/apache/tapestry5/integration/app1/pages/Index.java?rev=883081&r1=883080&r2=883081&view=diff >> >> ============================================================================== >> --- >> tapestry/tapestry5/branches/5.1.0.x-dev/tapestry-core/src/test/java/org/apache/tapestry5/integration/app1/pages/Index.java >> (original) >> +++ >> tapestry/tapestry5/branches/5.1.0.x-dev/tapestry-core/src/test/java/org/apache/tapestry5/integration/app1/pages/Index.java >> Sun Nov 22 14:10:08 2009 >> @@ -352,7 +352,10 @@ >> new Item("SubmitWithContext", "Submit With Context", >> "Providing a context for Submit component"), >> - new Item("ImageSubmitDemo", "Submit with an Image >> Demo", "Make sure that submit with the image parameter set triggers the >> 'selected' event.") >> + new Item("ImageSubmitDemo", "Submit with an Image Demo", >> "Make sure that submit with the image parameter set triggers the 'selected' >> event."), >> + + new Item("SelectZoneDemo", "Select Zone Demo", >> "Use a Select component to update a zone.") >> + >> ); >> >> Added: >> tapestry/tapestry5/branches/5.1.0.x-dev/tapestry-core/src/test/java/org/apache/tapestry5/integration/app1/pages/SelectZoneDemo.java >> URL: >> http://svn.apache.org/viewvc/tapestry/tapestry5/branches/5.1.0.x-dev/tapestry-core/src/test/java/org/apache/tapestry5/integration/app1/pages/SelectZoneDemo.java?rev=883081&view=auto >> >> ============================================================================== >> --- >> tapestry/tapestry5/branches/5.1.0.x-dev/tapestry-core/src/test/java/org/apache/tapestry5/integration/app1/pages/SelectZoneDemo.java >> (added) >> +++ >> tapestry/tapestry5/branches/5.1.0.x-dev/tapestry-core/src/test/java/org/apache/tapestry5/integration/app1/pages/SelectZoneDemo.java >> Sun Nov 22 14:10:08 2009 >> @@ -0,0 +1,84 @@ >> +// Copyright 2009 The Apache Software Foundation >> +// >> +// Licensed under the Apache License, Version 2.0 (the "License"); >> +// you may not use this file except in compliance with the License. >> +// You may obtain a copy of the License at >> +// >> +// http://www.apache.org/licenses/LICENSE-2.0 >> +// >> +// Unless required by applicable law or agreed to in writing, software >> +// distributed under the License is distributed on an "AS IS" BASIS, >> +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or >> implied. >> +// See the License for the specific language governing permissions and >> +// limitations under the License. >> +package org.apache.tapestry5.integration.app1.pages; >> + >> +import java.util.Arrays; >> +import java.util.List; >> + >> +import org.apache.tapestry5.Block; >> +import org.apache.tapestry5.SelectModel; >> +import org.apache.tapestry5.ValueEncoder; >> +import org.apache.tapestry5.annotations.Persist; >> +import org.apache.tapestry5.annotations.Property; >> +import org.apache.tapestry5.integration.app1.data.CarMaker; >> +import org.apache.tapestry5.ioc.Messages; >> +import org.apache.tapestry5.ioc.annotations.Inject; >> +import org.apache.tapestry5.util.EnumSelectModel; >> +import org.apache.tapestry5.util.EnumValueEncoder; >> + >> +public class SelectZoneDemo >> +{ >> + >> + �...@inject >> + private Messages messages; >> + >> + �...@property >> + �...@persist >> + private CarMaker carMaker; >> + >> + �...@property >> + �...@persist >> + private String carModel; >> + >> + �...@inject >> + �...@property >> + private Block modelBlock; >> + >> + �...@property >> + �...@persist >> + private List<String> availableModels; >> + >> + public Object onValueChanged(final CarMaker maker) >> + { >> + availableModels = findAvailableModels(maker); >> + >> + return this.modelBlock; >> + } >> + >> + public List<String> findAvailableModels(final CarMaker maker) >> + { >> + switch (maker) >> + { >> + case AUDI: >> + return Arrays.asList("A4", "A6", "A8"); >> + case BMW: >> + return Arrays.asList("3 Series", "5 Series", "7 Series"); >> + case MERCEDES: >> + return Arrays.asList("C-Class", "E-Class", "S-Class"); >> + default: >> + return Arrays.asList(); >> + } >> + } >> + >> + public SelectModel getMakeModel() >> + { >> + return new EnumSelectModel(CarMaker.class, this.messages); >> + } >> + >> + public ValueEncoder<CarMaker> getMakeEncoder() >> + { >> + return new EnumValueEncoder<CarMaker>(CarMaker.class); >> + } >> + >> +} >> >> Propchange: >> tapestry/tapestry5/branches/5.1.0.x-dev/tapestry-core/src/test/java/org/apache/tapestry5/integration/app1/pages/SelectZoneDemo.java >> >> ------------------------------------------------------------------------------ >> svn:eol-style = native >> >> Propchange: >> tapestry/tapestry5/branches/5.1.0.x-dev/tapestry-core/src/test/java/org/apache/tapestry5/integration/app1/pages/SelectZoneDemo.java >> >> ------------------------------------------------------------------------------ >> svn:mime-type = text/plain >> >> > > --------------------------------------------------------------------- > To unsubscribe, e-mail: [email protected] > For additional commands, e-mail: [email protected] > >
-- Andreas Andreou - [email protected] - http://blog.andyhot.gr Tapestry / Tacos developer Open Source / JEE Consulting --------------------------------------------------------------------- To unsubscribe, e-mail: [email protected] For additional commands, e-mail: [email protected]
