You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@tapestry.apache.org by bd...@apache.org on 2008/01/22 21:41:58 UTC

svn commit: r614315 - in /tapestry/tapestry4/trunk/tapestry-framework/src: java/org/apache/tapestry/form/Radio.java java/org/apache/tapestry/form/RadioGroup.java test/org/apache/tapestry/form/TestRadio.java

Author: bdotte
Date: Tue Jan 22 12:41:56 2008
New Revision: 614315

URL: http://svn.apache.org/viewvc?rev=614315&view=rev
Log:
Fixes TAPESTRY-1529. Make Radio extend from AbstractFormComponent instead of AbstractComponent so it can be used with FieldLabel.

Added:
    tapestry/tapestry4/trunk/tapestry-framework/src/test/org/apache/tapestry/form/TestRadio.java
Modified:
    tapestry/tapestry4/trunk/tapestry-framework/src/java/org/apache/tapestry/form/Radio.java
    tapestry/tapestry4/trunk/tapestry-framework/src/java/org/apache/tapestry/form/RadioGroup.java

Modified: tapestry/tapestry4/trunk/tapestry-framework/src/java/org/apache/tapestry/form/Radio.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry4/trunk/tapestry-framework/src/java/org/apache/tapestry/form/Radio.java?rev=614315&r1=614314&r2=614315&view=diff
==============================================================================
--- tapestry/tapestry4/trunk/tapestry-framework/src/java/org/apache/tapestry/form/Radio.java (original)
+++ tapestry/tapestry4/trunk/tapestry-framework/src/java/org/apache/tapestry/form/Radio.java Tue Jan 22 12:41:56 2008
@@ -15,7 +15,6 @@
 package org.apache.tapestry.form;
 
 import org.apache.hivemind.ApplicationRuntimeException;
-import org.apache.tapestry.AbstractComponent;
 import org.apache.tapestry.IMarkupWriter;
 import org.apache.tapestry.IRequestCycle;
 import org.apache.tapestry.Tapestry;
@@ -36,7 +35,7 @@
  * 
  **/
 
-public abstract class Radio extends AbstractComponent
+public abstract class Radio extends AbstractFormComponent
 {
     /**
      *  Renders the form element, or responds when the form containing the element
@@ -45,35 +44,18 @@
      *
      **/
 
-    protected void renderComponent(IMarkupWriter writer, IRequestCycle cycle)
+    protected void renderFormComponent(IMarkupWriter writer, IRequestCycle cycle)
     {
+	    RadioGroup group = RadioGroup.get(cycle);
 
-        RadioGroup group = RadioGroup.get(cycle);
-        
-        if (group == null)
+	    if (group == null)
             throw new ApplicationRuntimeException(
                 Tapestry.getMessage("Radio.must-be-contained-by-group"),
                 this,
                 null,
                 null);
-
-        // The group determines rewinding from the form.
-
-        boolean rewinding = group.isRewinding();
-
-        int option = group.getNextOptionId();
-
-        if (rewinding)
-        {
-            // If not disabled and this is the selected button within the radio group,
-            // then update set the selection from the group to the value for this
-            // radio button.  This will update the selected parameter of the RadioGroup.
-
-            if (!isDisabled() && !group.isDisabled() && group.isSelected(option))
-                group.updateSelection(getValue());
-            
-            return;
-        }
+	    
+	    int option = group.getNextOptionId();
         
         setClientId(group.getName()+option);
         
@@ -102,9 +84,31 @@
 
         renderInformalParameters(writer, cycle);
 
+	    writer.closeTag();
     }
 
-    public abstract boolean isDisabled();
+	protected void rewindFormComponent(IMarkupWriter writer, IRequestCycle cycle)
+	{
+		RadioGroup group = RadioGroup.get(cycle);
+
+        if (group == null)
+            throw new ApplicationRuntimeException(
+                Tapestry.getMessage("Radio.must-be-contained-by-group"),
+                this,
+                null,
+                null);
+
+        int option = group.getNextOptionId();
+
+		// If not disabled and this is the selected button within the radio group,
+		// then update set the selection from the group to the value for this
+		// radio button.  This will update the selected parameter of the RadioGroup.
+
+		if (!isDisabled() && !group.isDisabled() && group.isSelected(option))
+			group.updateSelection(getValue());
+	}
+
+	public abstract boolean isDisabled();
 
     public abstract Object getValue();
 }

Modified: tapestry/tapestry4/trunk/tapestry-framework/src/java/org/apache/tapestry/form/RadioGroup.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry4/trunk/tapestry-framework/src/java/org/apache/tapestry/form/RadioGroup.java?rev=614315&r1=614314&r2=614315&view=diff
==============================================================================
--- tapestry/tapestry4/trunk/tapestry-framework/src/java/org/apache/tapestry/form/RadioGroup.java (original)
+++ tapestry/tapestry4/trunk/tapestry-framework/src/java/org/apache/tapestry/form/RadioGroup.java Tue Jan 22 12:41:56 2008
@@ -38,18 +38,18 @@
      * that its wrapped {@link Radio}components can identify thier state.
      */
 
-    private static final String ATTRIBUTE_NAME = "org.apache.tapestry.active.RadioGroup";
+    static final String ATTRIBUTE_NAME = "org.apache.tapestry.active.RadioGroup";
     
     // Cached copy of the value from the selectedBinding
-    private Object _selection;
+    Object _selection;
 
     // The value from the HTTP request indicating which
     // Radio was selected by the user.
-    private int _selectedOption;
+    int _selectedOption;
 
-    private boolean _rewinding;
+    boolean _rewinding;
 
-    private boolean _rendering;
+    boolean _rendering;
 
     private int _nextOptionId;
 

Added: tapestry/tapestry4/trunk/tapestry-framework/src/test/org/apache/tapestry/form/TestRadio.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry4/trunk/tapestry-framework/src/test/org/apache/tapestry/form/TestRadio.java?rev=614315&view=auto
==============================================================================
--- tapestry/tapestry4/trunk/tapestry-framework/src/test/org/apache/tapestry/form/TestRadio.java (added)
+++ tapestry/tapestry4/trunk/tapestry-framework/src/test/org/apache/tapestry/form/TestRadio.java Tue Jan 22 12:41:56 2008
@@ -0,0 +1,107 @@
+package org.apache.tapestry.form;
+
+import org.apache.tapestry.IBinding;
+import org.apache.tapestry.IForm;
+import org.apache.tapestry.IMarkupWriter;
+import org.apache.tapestry.IRequestCycle;
+import static org.easymock.EasyMock.expect;
+import static org.easymock.EasyMock.expectLastCall;
+import org.testng.annotations.Test;
+
+@Test
+public class TestRadio extends BaseFormComponentTestCase
+{
+	private Radio radio;
+	private RadioGroup group;
+
+	private IMarkupWriter writer;
+	private IRequestCycle cycle;
+
+	public void testRenderSelected()
+	{
+		setupComponent(0, false);
+
+		replay();
+
+		radio.render(writer, cycle);
+
+		verify();
+
+		assertBuffer("<input type=\"radio\" name=\"group\" id=\"group0\" checked=\"checked\" value=\"0\" />");
+	}
+
+	public void testRenderUnselected()
+	{
+		setupComponent(1, false);
+
+		replay();
+
+		radio.render(writer, cycle);
+
+		verify();
+
+		assertBuffer("<input type=\"radio\" name=\"group\" id=\"group0\" value=\"0\" />");
+	}
+
+	public void testRewindSelected()
+	{
+		setupComponent(0, true);
+
+		IBinding binding = newMock(IBinding.class);
+        group.setBinding("selected", binding);
+		binding.setObject(0);
+		expectLastCall();
+
+		replay();
+
+		radio.render(writer, cycle);
+
+		verify();
+	}
+
+	public void testRewindUnselected()
+	{
+		setupComponent(1, true);
+
+		replay();
+
+		radio.render(writer, cycle);
+
+		verify();
+	}
+
+	private void setupComponent(int selection, boolean rewinding)
+	{
+		group = newInstance(RadioGroup.class);
+		group.setName("group");
+		group._rendering = true;
+		group._rewinding = rewinding;
+		group._selection = selection;
+		group._selectedOption = selection;
+		radio = newInstance(Radio.class,
+						          "value", 0);
+
+		writer = newBufferWriter();
+		cycle = newCycle();
+		IForm form = newMock(IForm.class);
+		MockDelegate delegate = new MockDelegate();
+
+		expect(cycle.getAttribute(RadioGroup.ATTRIBUTE_NAME)).andReturn(group);
+
+		expect(cycle.renderStackPush(radio)).andReturn(radio);
+
+		trainGetForm(cycle, form);
+		trainWasPrerendered(form, writer, radio, false);
+		trainGetDelegate(form, delegate);
+
+		trainGetElementId(form, radio, "id");
+		trainIsRewinding(form, rewinding);
+		if (!rewinding)
+		{
+			trainIsRewinding(cycle, rewinding);
+			form.setFormFieldUpdating(true);
+		}
+
+		expect(cycle.renderStackPop()).andReturn(radio);
+	}
+}