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]

Reply via email to