Author: hlship
Date: Thu Feb 15 08:30:18 2007
New Revision: 507989

URL: http://svn.apache.org/viewvc?view=rev&rev=507989
Log:
Provide control over the Grid's pager position: top, bottom, both or none.

Added:
    
tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/StringToEnumCoercion.java
    
tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/corelib/data/
    
tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/corelib/data/GridPagerPosition.java
    
tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/StringToEnumCoercionTest.java
Modified:
    
tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/TapestryMessages.java
    
tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/corelib/components/Grid.java
    
tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/corelib/components/GridPager.java
    
tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/services/TapestryModule.java
    
tapestry/tapestry5/tapestry-core/trunk/src/main/resources/org/apache/tapestry/TapestryStrings.properties
    
tapestry/tapestry5/tapestry-core/trunk/src/main/resources/org/apache/tapestry/corelib/components/Grid.html
    
tapestry/tapestry5/tapestry-core/trunk/src/main/resources/org/apache/tapestry/default.css
    tapestry/tapestry5/tapestry-core/trunk/src/site/apt/guide/validation.apt

Added: 
tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/StringToEnumCoercion.java
URL: 
http://svn.apache.org/viewvc/tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/StringToEnumCoercion.java?view=auto&rev=507989
==============================================================================
--- 
tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/StringToEnumCoercion.java
 (added)
+++ 
tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/StringToEnumCoercion.java
 Thu Feb 15 08:30:18 2007
@@ -0,0 +1,67 @@
+// Copyright 2007 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.tapestry;
+
+import static 
org.apache.tapestry.ioc.internal.util.CollectionFactory.newCaseInsensitiveMap;
+
+import java.util.Map;
+
+import org.apache.tapestry.ioc.internal.util.InternalUtils;
+import org.apache.tapestry.ioc.services.Coercion;
+
+/**
+ * A [EMAIL PROTECTED] Coercion} for converting strings into an instance of a 
particular enumerated type. The
+ * [EMAIL PROTECTED] Enum#name() name} is used as the key to identify the enum 
instance, in a case-insensitive
+ * fashion.
+ * 
+ * @param <T>
+ *            the type of enumeration
+ */
+public final class StringToEnumCoercion<T extends Enum> implements 
Coercion<String, T>
+{
+    private final Class<T> _enumClass;
+
+    private final Map<String, T> _stringToEnum = newCaseInsensitiveMap();
+
+    public StringToEnumCoercion(Class<T> enumClass)
+    {
+        this(enumClass, enumClass.getEnumConstants());
+    }
+
+    public StringToEnumCoercion(Class<T> enumClass, T... values)
+    {
+        _enumClass = enumClass;
+
+        for (T value : values)
+            _stringToEnum.put(value.name(), value);
+    }
+
+    public T coerce(String input)
+    {
+        if (InternalUtils.isBlank(input))
+            return null;
+
+        T result = _stringToEnum.get(input);
+
+        if (result == null)
+            throw new RuntimeException(TapestryMessages.missingEnumValue(
+                    input,
+                    _enumClass,
+                    _stringToEnum.keySet()));
+
+        return result;
+    }
+
+}

Modified: 
tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/TapestryMessages.java
URL: 
http://svn.apache.org/viewvc/tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/TapestryMessages.java?view=diff&rev=507989&r1=507988&r2=507989
==============================================================================
--- 
tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/TapestryMessages.java
 (original)
+++ 
tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/TapestryMessages.java
 Thu Feb 15 08:30:18 2007
@@ -33,4 +33,9 @@
     {
         return MESSAGES.format("missing-value", value, 
InternalUtils.joinSorted(values));
     }
+
+    static String missingEnumValue(String value, Class enumClass, 
Collection<String> values)
+    {
+        return MESSAGES.format("missing-enum-value", value, 
enumClass.getName(), InternalUtils.joinSorted(values));
+    }
 }

Modified: 
tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/corelib/components/Grid.java
URL: 
http://svn.apache.org/viewvc/tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/corelib/components/Grid.java?view=diff&rev=507989&r1=507988&r2=507989
==============================================================================
--- 
tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/corelib/components/Grid.java
 (original)
+++ 
tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/corelib/components/Grid.java
 Thu Feb 15 08:30:18 2007
@@ -24,6 +24,7 @@
 import org.apache.tapestry.annotations.SupportsInformalParameters;
 import org.apache.tapestry.beaneditor.BeanModel;
 import org.apache.tapestry.beaneditor.PropertyModel;
+import org.apache.tapestry.corelib.data.GridPagerPosition;
 import org.apache.tapestry.grid.GridDataSource;
 import org.apache.tapestry.grid.GridModelProvider;
 import org.apache.tapestry.internal.bindings.AbstractBinding;
@@ -44,6 +45,10 @@
     @Parameter
     private int _rowsPerPage = 25;
 
+    /** Literal strings will be coerced into a position value. */
+    @Parameter(defaultPrefix = "literal")
+    private GridPagerPosition _pagerPosition = GridPagerPosition.BOTTOM;
+
     @Persist
     private int _currentPage = 1;
 
@@ -89,11 +94,18 @@
             "row=row" })
     private GridRows _rows;
 
-    @SuppressWarnings("unused")
     @Component(parameters =
     { "source=dataSource", "rowsPerPage=rowsPerPage", 
"currentPage=currentPage" })
     private GridPager _pager;
 
+    @SuppressWarnings("unused")
+    @Component(parameters = "to=pagerTop")
+    private Delegate _pagerTop;
+
+    @SuppressWarnings("unused")
+    @Component(parameters = "to=pagerBottom")
+    private Delegate _pagerBottom;
+
     Binding defaultModel()
     {
         final ComponentResources containerResources = 
_resources.getContainerResources();
@@ -240,4 +252,13 @@
         _sortColumnId = sortColumnId;
     }
 
+    public Object getPagerTop()
+    {
+        return _pagerPosition.isMatchTop() ? _pager : null;
+    }
+
+    public Object getPagerBottom()
+    {
+        return _pagerPosition.isMatchBottom() ? _pager : null;
+    }
 }

Modified: 
tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/corelib/components/GridPager.java
URL: 
http://svn.apache.org/viewvc/tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/corelib/components/GridPager.java?view=diff&rev=507989&r1=507988&r2=507989
==============================================================================
--- 
tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/corelib/components/GridPager.java
 (original)
+++ 
tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/corelib/components/GridPager.java
 Thu Feb 15 08:30:18 2007
@@ -35,7 +35,7 @@
     private int _currentPage;
 
     /** Number of pages before and after the current page in the range. */
-    private int _range = 3;
+    private int _range = 5;
 
     private int _lastIndex;
 

Added: 
tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/corelib/data/GridPagerPosition.java
URL: 
http://svn.apache.org/viewvc/tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/corelib/data/GridPagerPosition.java?view=auto&rev=507989
==============================================================================
--- 
tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/corelib/data/GridPagerPosition.java
 (added)
+++ 
tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/corelib/data/GridPagerPosition.java
 Thu Feb 15 08:30:18 2007
@@ -0,0 +1,56 @@
+// Copyright 2007 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.tapestry.corelib.data;
+
+import org.apache.tapestry.corelib.components.Grid;
+
+/**
+ * Used by the [EMAIL PROTECTED] Grid} component to control where the pager 
portion of the Grid should be
+ * displayed.
+ */
+public enum GridPagerPosition {
+    /** Position the pager above the Grid's table. */
+    TOP(true, false),
+
+    /** Position the pager below the Grid's table (this is the default). */
+    BOTTOM(false, true),
+
+    /** Show the pager above and below the Grid's table. */
+    BOTH(true, true),
+
+    /** Don't show a pager (the application will need to supply its own 
navigation mechanism). */
+    NONE(false, false);
+
+    private final boolean _matchTop;
+
+    private final boolean _matchBottom;
+
+    private GridPagerPosition(boolean matchTop, boolean matchBottom)
+    {
+        _matchTop = matchTop;
+        _matchBottom = matchBottom;
+    }
+
+    public boolean isMatchBottom()
+    {
+        return _matchBottom;
+    }
+
+    public boolean isMatchTop()
+    {
+        return _matchTop;
+    }
+
+}

Modified: 
tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/services/TapestryModule.java
URL: 
http://svn.apache.org/viewvc/tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/services/TapestryModule.java?view=diff&rev=507989&r1=507988&r2=507989
==============================================================================
--- 
tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/services/TapestryModule.java
 (original)
+++ 
tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/services/TapestryModule.java
 Thu Feb 15 08:30:18 2007
@@ -30,6 +30,7 @@
 import org.apache.tapestry.MarkupWriter;
 import org.apache.tapestry.SelectModel;
 import org.apache.tapestry.StreamResponse;
+import org.apache.tapestry.StringToEnumCoercion;
 import org.apache.tapestry.Translator;
 import org.apache.tapestry.Validator;
 import org.apache.tapestry.annotations.AfterRender;
@@ -45,6 +46,7 @@
 import org.apache.tapestry.annotations.PageLoaded;
 import org.apache.tapestry.annotations.SetupRender;
 import org.apache.tapestry.beaneditor.Validate;
+import org.apache.tapestry.corelib.data.GridPagerPosition;
 import org.apache.tapestry.dom.DefaultMarkupModel;
 import org.apache.tapestry.dom.Document;
 import org.apache.tapestry.grid.GridDataSource;
@@ -1194,6 +1196,7 @@
      * <li>String to [EMAIL PROTECTED] SelectModel}
      * <li>List to [EMAIL PROTECTED] GridDataSource}
      * <li>null to [EMAIL PROTECTED] GridDataSource}
+     * <li>String to [EMAIL PROTECTED] GridPagerPosition}
      * </ul>
      */
     @Contribute("tapestry.ioc.TypeCoercer")
@@ -1225,6 +1228,11 @@
             }
         });
 
+        add(
+                configuration,
+                String.class,
+                GridPagerPosition.class,
+                new 
StringToEnumCoercion<GridPagerPosition>(GridPagerPosition.class));
     }
 
     private static <S, T> void add(Configuration<CoercionTuple> configuration, 
Class<S> sourceType,

Modified: 
tapestry/tapestry5/tapestry-core/trunk/src/main/resources/org/apache/tapestry/TapestryStrings.properties
URL: 
http://svn.apache.org/viewvc/tapestry/tapestry5/tapestry-core/trunk/src/main/resources/org/apache/tapestry/TapestryStrings.properties?view=diff&rev=507989&r1=507988&r2=507989
==============================================================================
--- 
tapestry/tapestry5/tapestry-core/trunk/src/main/resources/org/apache/tapestry/TapestryStrings.properties
 (original)
+++ 
tapestry/tapestry5/tapestry-core/trunk/src/main/resources/org/apache/tapestry/TapestryStrings.properties
 Thu Feb 15 08:30:18 2007
@@ -13,4 +13,5 @@
 # limitations under the License.
 
 duplicate-key=Key %s may not be added with value %s, as an existing value, %s, 
is already present.
-missing-value=Key for value %s not found. Available values: %s
\ No newline at end of file
+missing-value=Key for value %s not found. Available values: %s
+missing-enum-value=Input '%s' does not identify a value from enumerated type 
%s. Available values: %s.
\ No newline at end of file

Modified: 
tapestry/tapestry5/tapestry-core/trunk/src/main/resources/org/apache/tapestry/corelib/components/Grid.html
URL: 
http://svn.apache.org/viewvc/tapestry/tapestry5/tapestry-core/trunk/src/main/resources/org/apache/tapestry/corelib/components/Grid.html?view=diff&rev=507989&r1=507988&r2=507989
==============================================================================
--- 
tapestry/tapestry5/tapestry-core/trunk/src/main/resources/org/apache/tapestry/corelib/components/Grid.html
 (original)
+++ 
tapestry/tapestry5/tapestry-core/trunk/src/main/resources/org/apache/tapestry/corelib/components/Grid.html
 Thu Feb 15 08:30:18 2007
@@ -1,4 +1,7 @@
 <div class="t-data-grid" 
xmlns:t="http://tapestry.apache.org/schema/tapestry_5_0_0.xsd";>
+       
+       <t:comp id="pagerTop"/>
+       
        <table class="t-data-grid" cellspacing="0">
                <thead t:id="columns"/>
                <tbody>
@@ -6,7 +9,11 @@
                </tbody>
        </table>
 
-       <t:comp id="pager"/>
+       <t:comp id="pagerBottom"/>
+       
+       <t:block>
+               <t:comp id="pager"/>
+       </t:block>      
 
        <t:block id="empty"> There is no data to display. </t:block>
 

Modified: 
tapestry/tapestry5/tapestry-core/trunk/src/main/resources/org/apache/tapestry/default.css
URL: 
http://svn.apache.org/viewvc/tapestry/tapestry5/tapestry-core/trunk/src/main/resources/org/apache/tapestry/default.css?view=diff&rev=507989&r1=507988&r2=507989
==============================================================================
--- 
tapestry/tapestry5/tapestry-core/trunk/src/main/resources/org/apache/tapestry/default.css
 (original)
+++ 
tapestry/tapestry5/tapestry-core/trunk/src/main/resources/org/apache/tapestry/default.css
 Thu Feb 15 08:30:18 2007
@@ -188,7 +188,7 @@
 
 DIV.t-data-grid-pager
 {
-  margin-top: 8px;
+  margin: 8px 0px;
 }
 
 DIV.t-data-grid-pager A, DIV.t-data-grid-pager SPAN.current

Modified: 
tapestry/tapestry5/tapestry-core/trunk/src/site/apt/guide/validation.apt
URL: 
http://svn.apache.org/viewvc/tapestry/tapestry5/tapestry-core/trunk/src/site/apt/guide/validation.apt?view=diff&rev=507989&r1=507988&r2=507989
==============================================================================
--- tapestry/tapestry5/tapestry-core/trunk/src/site/apt/guide/validation.apt 
(original)
+++ tapestry/tapestry5/tapestry-core/trunk/src/site/apt/guide/validation.apt 
Thu Feb 15 08:30:18 2007
@@ -166,7 +166,7 @@
             <input t:type="TextField" t:id="userName" 
t:validate="required,minlength=3" size="30"/>
             <br/>
             <label t:type="Label" for="password"/>:
-            <input t:id="password" t:validate="required,minlength=3" 
size="30"/>
+            <input t:type="PasswordField" t:id="password" 
t:validate="required,minlength=3" size="30"/>
             <br/>
             <input type="submit" value="Login"/>
         </form>

Added: 
tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/StringToEnumCoercionTest.java
URL: 
http://svn.apache.org/viewvc/tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/StringToEnumCoercionTest.java?view=auto&rev=507989
==============================================================================
--- 
tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/StringToEnumCoercionTest.java
 (added)
+++ 
tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/StringToEnumCoercionTest.java
 Thu Feb 15 08:30:18 2007
@@ -0,0 +1,58 @@
+// Copyright 2007 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.tapestry;
+
+import junit.framework.AssertionFailedError;
+
+import org.testng.Assert;
+import org.testng.annotations.Test;
+
+public class StringToEnumCoercionTest extends Assert
+{
+    @Test
+    public void value_found()
+    {
+        StringToEnumCoercion<Stooge> coercion = new 
StringToEnumCoercion<Stooge>(Stooge.class);
+
+        assertSame(coercion.coerce("moe"), Stooge.MOE);
+        assertSame(coercion.coerce("curly_joe"), Stooge.CURLY_JOE);
+    }
+
+    @Test
+    public void blank_is_null()
+    {
+        StringToEnumCoercion<Stooge> coercion = new 
StringToEnumCoercion<Stooge>(Stooge.class);
+
+        assertNull(coercion.coerce(""));
+    }
+
+    @Test
+    public void value_not_found()
+    {
+        StringToEnumCoercion<Stooge> coercion = new 
StringToEnumCoercion<Stooge>(Stooge.class);
+
+        try
+        {
+            coercion.coerce("shemp");
+            throw new AssertionFailedError("unreachable");
+        }
+        catch (RuntimeException ex)
+        {
+            assertEquals(
+                    ex.getMessage(),
+                    "Input \'shemp\' does not identify a value from enumerated 
type org.apache.tapestry.Stooge. Available values: CURLY_JOE, LARRY, MOE.");
+        }
+    }
+}


Reply via email to