Author: ekoneil
Date: Sat Jan 29 12:11:38 2005
New Revision: 149070

URL: http://svn.apache.org/viewcvs?view=rev&rev=149070
Log:
Data grid feature.

Add support for resource bundles in the data grid.  This allows a developer to 
provide a .properties file to override paths, resources, and strings used when 
rendering a grid.

Includes simple test.

Just a checkpoint; generalized solution with property overrides via JSP tags 
coming next.

BB: self
DRT: NetUI / datagrid pass


Added:
   
incubator/beehive/trunk/netui/src/tags-databinding/org/apache/beehive/netui/databinding/datagrid/exceptions/
   
incubator/beehive/trunk/netui/src/tags-databinding/org/apache/beehive/netui/databinding/datagrid/exceptions/DataGridExtensionException.java
   (contents, props changed)
   
incubator/beehive/trunk/netui/src/tags-databinding/org/apache/beehive/netui/databinding/datagrid/util/IDataGridMessageKeys.java
   (contents, props changed)
   
incubator/beehive/trunk/netui/test/webapps/drt/coreWeb/databinding/datagrid/misc/pagerMessageOverrides.jsp
   (contents, props changed)
Modified:
   
incubator/beehive/trunk/netui/src/tags-databinding/org/apache/beehive/netui/databinding/datagrid/model/DataGridModel.java
   
incubator/beehive/trunk/netui/src/tags-databinding/org/apache/beehive/netui/databinding/datagrid/rendering/cell/SortedCellDecorator.java
   
incubator/beehive/trunk/netui/src/tags-databinding/org/apache/beehive/netui/databinding/datagrid/rendering/pager/AbstractPagerRenderer.java
   
incubator/beehive/trunk/netui/src/tags-databinding/org/apache/beehive/netui/databinding/datagrid/rendering/pager/FirstPreviousNextLastPagerRenderer.java
   
incubator/beehive/trunk/netui/src/tags-databinding/org/apache/beehive/netui/databinding/datagrid/rendering/pager/PreviousNextPagerRenderer.java
   
incubator/beehive/trunk/netui/src/tags-databinding/org/apache/beehive/netui/tags/databinding/datagrid/DataGridUtil.java
   
incubator/beehive/trunk/netui/src/tags-databinding/org/apache/beehive/netui/tags/databinding/datagrid/Footer.java
   
incubator/beehive/trunk/netui/src/tags-databinding/org/apache/beehive/netui/tags/databinding/datagrid/Header.java
   
incubator/beehive/trunk/netui/src/util/org/apache/beehive/netui/util/netui.properties
   
incubator/beehive/trunk/netui/test/webapps/drt/testRecorder/config/testRecorder-tests.xml

Added: 
incubator/beehive/trunk/netui/src/tags-databinding/org/apache/beehive/netui/databinding/datagrid/exceptions/DataGridExtensionException.java
Url: 
http://svn.apache.org/viewcvs/incubator/beehive/trunk/netui/src/tags-databinding/org/apache/beehive/netui/databinding/datagrid/exceptions/DataGridExtensionException.java?view=auto&rev=149070
==============================================================================
--- (empty file)
+++ 
incubator/beehive/trunk/netui/src/tags-databinding/org/apache/beehive/netui/databinding/datagrid/exceptions/DataGridExtensionException.java
 Sat Jan 29 12:11:38 2005
@@ -0,0 +1,41 @@
+/*
+ * Copyright 2004 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.
+ *
+ * $Header:$
+ */
+package org.apache.beehive.netui.databinding.datagrid.exceptions;
+
+/**
+ * Exception thrown when an error occurs while extending the data grid.
+ */
+public class DataGridExtensionException
+    extends RuntimeException {
+
+    public DataGridExtensionException() {
+        super();
+    }
+
+    public DataGridExtensionException(String message) {
+        super(message);
+    }
+
+    public DataGridExtensionException(Throwable cause) {
+        super(cause);
+    }
+
+    public DataGridExtensionException(String message, Throwable cause) {
+        super(message, cause);
+    }
+}

Modified: 
incubator/beehive/trunk/netui/src/tags-databinding/org/apache/beehive/netui/databinding/datagrid/model/DataGridModel.java
Url: 
http://svn.apache.org/viewcvs/incubator/beehive/trunk/netui/src/tags-databinding/org/apache/beehive/netui/databinding/datagrid/model/DataGridModel.java?view=diff&rev=149070&p1=incubator/beehive/trunk/netui/src/tags-databinding/org/apache/beehive/netui/databinding/datagrid/model/DataGridModel.java&r1=149069&p2=incubator/beehive/trunk/netui/src/tags-databinding/org/apache/beehive/netui/databinding/datagrid/model/DataGridModel.java&r2=149070
==============================================================================
--- 
incubator/beehive/trunk/netui/src/tags-databinding/org/apache/beehive/netui/databinding/datagrid/model/DataGridModel.java
   (original)
+++ 
incubator/beehive/trunk/netui/src/tags-databinding/org/apache/beehive/netui/databinding/datagrid/model/DataGridModel.java
   Sat Jan 29 12:11:38 2005
@@ -19,8 +19,10 @@
 
 import java.util.ResourceBundle;
 import java.util.Map;
+import java.text.MessageFormat;
 import javax.servlet.jsp.JspContext;
 import javax.servlet.jsp.PageContext;
+import javax.servlet.http.HttpServletRequest;
 
 import org.apache.beehive.netui.databinding.datagrid.model.style.StylePolicy;
 import 
org.apache.beehive.netui.databinding.datagrid.model.sort.ISort.SortDirection;
@@ -29,6 +31,8 @@
 import 
org.apache.beehive.netui.databinding.datagrid.rendering.pager.IPagerRenderer;
 import 
org.apache.beehive.netui.databinding.datagrid.rendering.pager.PreviousNextPagerRenderer;
 import org.apache.beehive.netui.databinding.datagrid.util.PagedDataSet;
+import org.apache.beehive.netui.databinding.datagrid.util.IDataGridMessageKeys;
+import org.apache.beehive.netui.databinding.datagrid.util.JspUtil;
 import 
org.apache.beehive.netui.databinding.datagrid.services.DataGridStateService;
 import org.apache.beehive.netui.tags.rendering.AbstractRenderAppender;
 import org.apache.beehive.netui.util.Bundle;
@@ -57,6 +61,7 @@
     private DataGridStateService _dgss = null;
 
     private JspContext _jspContext = null;
+    private HttpServletRequest _request = null;
 
     public DataGridModel(JspContext jspContext, String name, PagedDataSet 
dataSet) {
         super();
@@ -65,6 +70,8 @@
         _jspContext = jspContext;
         _dataSet = dataSet;
         _dgss = DataGridStateService.getInstance(jspContext);
+
+        _request = JspUtil.getRequest(_jspContext);
     }
 
     public String getName() {
@@ -127,6 +134,11 @@
         _cssPolicy = cssPolicy;
     }
 
+    public String getResourcePath() {
+        /* todo: not sure that this is right in all cases -- probably need to 
provide the ability to override the path from the JSP */
+        return _request.getContextPath() + "/" + 
getMessage(IDataGridMessageKeys.DATAGRID_RESOURCE_PATH);
+    }
+
     public String getResourceBundlePath() {
         return _resourceBundlePath;
     }
@@ -134,7 +146,8 @@
     public void setResourceBundlePath(String resourceBundlePath) {
         _resourceBundlePath = resourceBundlePath;
     }
-    public String getString(String key) {
+
+    public String getMessage(String key) {
         if(_resourceBundlePath == null)
             return Bundle.getString(key);
         else {
@@ -145,32 +158,32 @@
         }
     }
 
-    public String getString(String key, Object[] args) {
+    public String getMessage(String key, Object[] args) {
         if(_resourceBundlePath == null)
             return Bundle.getString(key, args);
         else {
             if(_resourceBundle == null)
                 _resourceBundle = 
ResourceBundle.getBundle(_resourceBundlePath);
 
-            return _resourceBundle.getString(key);
+            /* todo: consider caching these MessageFormat objects given the 
message key */
+            MessageFormat format = new 
MessageFormat(_resourceBundle.getString(key));
+            return format.format(args).toString();
         }
     }
 
-    public String getSortImagePath(String contextPath, SortDirection 
sortDirection) {
+    public String getSortImagePath(SortDirection sortDirection) {
         if(sortDirection == SortDirection.ASCENDING)
-            return contextPath + "/resources/images/sortdown.gif";
+            return getMessage(IDataGridMessageKeys.SORT_ASC_IMAGE_PATH);
         else if(sortDirection == SortDirection.DESCENDING)
-            return contextPath + "/resources/images/sortup.gif";
+            return getMessage(IDataGridMessageKeys.SORT_DESC_IMAGE_PATH);
         else {
             assert sortDirection == SortDirection.NONE : "Encountered an 
invalid sort direction.";
-            /* todo: need to flag on whether this is sort up or down and set 
the image accordingly */
-            return getDefaultSortImagePath(contextPath);
+            return getDefaultSortImagePath();
         }
     }
 
-    public String getDefaultSortImagePath(String contextPath) {
-        /* todo: need to allow external configuration of this image path */
-        return contextPath + "/resources/images/sortable.gif";
+    public String getDefaultSortImagePath() {
+        return getMessage(IDataGridMessageKeys.SORT_NONE_IMAGE_PATH);
     }
 
     public void renderPager(AbstractRenderAppender appender) {

Modified: 
incubator/beehive/trunk/netui/src/tags-databinding/org/apache/beehive/netui/databinding/datagrid/rendering/cell/SortedCellDecorator.java
Url: 
http://svn.apache.org/viewcvs/incubator/beehive/trunk/netui/src/tags-databinding/org/apache/beehive/netui/databinding/datagrid/rendering/cell/SortedCellDecorator.java?view=diff&rev=149070&p1=incubator/beehive/trunk/netui/src/tags-databinding/org/apache/beehive/netui/databinding/datagrid/rendering/cell/SortedCellDecorator.java&r1=149069&p2=incubator/beehive/trunk/netui/src/tags-databinding/org/apache/beehive/netui/databinding/datagrid/rendering/cell/SortedCellDecorator.java&r2=149070
==============================================================================
--- 
incubator/beehive/trunk/netui/src/tags-databinding/org/apache/beehive/netui/databinding/datagrid/rendering/cell/SortedCellDecorator.java
    (original)
+++ 
incubator/beehive/trunk/netui/src/tags-databinding/org/apache/beehive/netui/databinding/datagrid/rendering/cell/SortedCellDecorator.java
    Sat Jan 29 12:11:38 2005
@@ -87,9 +87,9 @@
 
         /* build icon for existing sort */
         if(sortModel.isSorted(cellModel.getSortExpression()))
-            imgTag.src = dgm.getSortImagePath(request.getContextPath(), 
sortDirection);
+            imgTag.src = dgm.getResourcePath() + 
dgm.getSortImagePath(sortDirection);
         else
-            imgTag.src = dgm.getDefaultSortImagePath(request.getContextPath());
+            imgTag.src = dgm.getResourcePath() + dgm.getDefaultSortImagePath();
 
         imgTag.registerAttribute(AbstractHtmlState.ATTR_GENERAL, 
HtmlConstants.BORDER, "false");
 

Modified: 
incubator/beehive/trunk/netui/src/tags-databinding/org/apache/beehive/netui/databinding/datagrid/rendering/pager/AbstractPagerRenderer.java
Url: 
http://svn.apache.org/viewcvs/incubator/beehive/trunk/netui/src/tags-databinding/org/apache/beehive/netui/databinding/datagrid/rendering/pager/AbstractPagerRenderer.java?view=diff&rev=149070&p1=incubator/beehive/trunk/netui/src/tags-databinding/org/apache/beehive/netui/databinding/datagrid/rendering/pager/AbstractPagerRenderer.java&r1=149069&p2=incubator/beehive/trunk/netui/src/tags-databinding/org/apache/beehive/netui/databinding/datagrid/rendering/pager/AbstractPagerRenderer.java&r2=149070
==============================================================================
--- 
incubator/beehive/trunk/netui/src/tags-databinding/org/apache/beehive/netui/databinding/datagrid/rendering/pager/AbstractPagerRenderer.java
 (original)
+++ 
incubator/beehive/trunk/netui/src/tags-databinding/org/apache/beehive/netui/databinding/datagrid/rendering/pager/AbstractPagerRenderer.java
 Sat Jan 29 12:11:38 2005
@@ -25,6 +25,7 @@
 import org.apache.beehive.netui.databinding.datagrid.model.PagerModel;
 import org.apache.beehive.netui.databinding.datagrid.model.DataGridModel;
 import org.apache.beehive.netui.databinding.datagrid.util.JspUtil;
+import org.apache.beehive.netui.databinding.datagrid.util.IDataGridMessageKeys;
 import 
org.apache.beehive.netui.databinding.datagrid.rendering.cell.CellDecoratorException;
 import org.apache.beehive.netui.pageflow.internal.InternalUtils;
 import org.apache.beehive.netui.util.logging.Logger;
@@ -77,55 +78,55 @@
     protected abstract String internalRender();
 
     protected String noDataRender() {
-        return _gridModel.getString("Tags_DataGrid_noData");
+        return _gridModel.getMessage(IDataGridMessageKeys.DATAGRID_MSG_NODATA);
     }
 
     protected String buildLiveFirstLink() {
         StringBuilder builder = new StringBuilder();
         AbstractRenderAppender appender = new 
StringBuilderRenderAppender(builder);
 
-        buildAnchor(appender, _gridModel.getQueryParamsForFirstPage(), 
"Tags_DataGrid_pageNameFirst");
+        buildAnchor(appender, _gridModel.getQueryParamsForFirstPage(), 
IDataGridMessageKeys.PAGER_MSG_FIRST);
 
         return builder.toString();
     }
 
     protected String buildDeadFirstLink() {
-        return _gridModel.getString("Tags_DataGrid_pageNameFirst");
+        return _gridModel.getMessage(IDataGridMessageKeys.PAGER_MSG_FIRST);
     }
 
     protected String buildLivePreviousLink() {
         StringBuilder builder = new StringBuilder();
         AbstractRenderAppender appender = new 
StringBuilderRenderAppender(builder);
 
-        buildAnchor(appender, _gridModel.getQueryParamsForPreviousPage(), 
"Tags_DataGrid_pageNamePrevious");
+        buildAnchor(appender, _gridModel.getQueryParamsForPreviousPage(), 
IDataGridMessageKeys.PAGER_MSG_PREVIOUS);
 
         return builder.toString();
     }
 
     protected String buildDeadPreviousLink() {
-        return _gridModel.getString("Tags_DataGrid_pageNamePrevious");
+        return _gridModel.getMessage(IDataGridMessageKeys.PAGER_MSG_PREVIOUS);
     }
 
     protected String buildLiveNextPageLink() {
         StringBuilder builder = new StringBuilder();
         AbstractRenderAppender appender = new 
StringBuilderRenderAppender(builder);
-        buildAnchor(appender, _gridModel.getQueryParamsForNextPage(), 
"Tags_DataGrid_pageNameNext");
+        buildAnchor(appender, _gridModel.getQueryParamsForNextPage(), 
IDataGridMessageKeys.PAGER_MSG_NEXT);
         return builder.toString();
     }
 
     protected String buildDeadNextLink() {
-        return _gridModel.getString("Tags_DataGrid_pageNameNext");
+        return _gridModel.getMessage(IDataGridMessageKeys.PAGER_MSG_NEXT);
     }
 
     protected String buildLiveLastLink() {
         StringBuilder builder = new StringBuilder();
         AbstractRenderAppender appender = new 
StringBuilderRenderAppender(builder);
-        buildAnchor(appender, _gridModel.getQueryParamsForLastPage(), 
"Tags_DataGrid_pageNameLast");
+        buildAnchor(appender, _gridModel.getQueryParamsForLastPage(), 
IDataGridMessageKeys.PAGER_MSG_LAST);
         return builder.toString();
     }
 
     protected String buildDeadLastLink() {
-        return _gridModel.getString("Tags_DataGrid_pageNameLast");
+        return _gridModel.getMessage(IDataGridMessageKeys.PAGER_MSG_LAST);
     }
 
     protected final void buildAnchor(AbstractRenderAppender appender, Map 
queryParams, String labelKey) {
@@ -135,7 +136,7 @@
 
         _anchorState.href = buildPageUri(queryParams);
         _anchorTag.doStartTag(appender, _anchorState);
-        appender.append(_gridModel.getString(labelKey));
+        appender.append(_gridModel.getMessage(labelKey));
         _anchorTag.doEndTag(appender);
         _anchorState.clear();
     }

Modified: 
incubator/beehive/trunk/netui/src/tags-databinding/org/apache/beehive/netui/databinding/datagrid/rendering/pager/FirstPreviousNextLastPagerRenderer.java
Url: 
http://svn.apache.org/viewcvs/incubator/beehive/trunk/netui/src/tags-databinding/org/apache/beehive/netui/databinding/datagrid/rendering/pager/FirstPreviousNextLastPagerRenderer.java?view=diff&rev=149070&p1=incubator/beehive/trunk/netui/src/tags-databinding/org/apache/beehive/netui/databinding/datagrid/rendering/pager/FirstPreviousNextLastPagerRenderer.java&r1=149069&p2=incubator/beehive/trunk/netui/src/tags-databinding/org/apache/beehive/netui/databinding/datagrid/rendering/pager/FirstPreviousNextLastPagerRenderer.java&r2=149070
==============================================================================
--- 
incubator/beehive/trunk/netui/src/tags-databinding/org/apache/beehive/netui/databinding/datagrid/rendering/pager/FirstPreviousNextLastPagerRenderer.java
    (original)
+++ 
incubator/beehive/trunk/netui/src/tags-databinding/org/apache/beehive/netui/databinding/datagrid/rendering/pager/FirstPreviousNextLastPagerRenderer.java
    Sat Jan 29 12:11:38 2005
@@ -19,6 +19,7 @@
 
 import org.apache.beehive.netui.databinding.datagrid.model.PagerModel;
 import org.apache.beehive.netui.databinding.datagrid.model.DataGridModel;
+import org.apache.beehive.netui.databinding.datagrid.util.IDataGridMessageKeys;
 
 /**
  * 
@@ -37,8 +38,9 @@
         int lastPage = pagerModel.getLastPage();
 
         /* Page # of #  First / Previous   Next / Last */
-        buf.append(getDataGridModel().getString("Tags_DataGrid_pageOfPages",
+        
buf.append(getDataGridModel().getMessage(IDataGridMessageKeys.PAGER_FMT_BANNER,
             new Integer[]{currentPage + 1, pagerModel.getLastPage() + 1}));
+        
         buf.append("  ");
         if(currentPage > pagerModel.getFirstPage())
             buf.append(buildLiveFirstLink());

Modified: 
incubator/beehive/trunk/netui/src/tags-databinding/org/apache/beehive/netui/databinding/datagrid/rendering/pager/PreviousNextPagerRenderer.java
Url: 
http://svn.apache.org/viewcvs/incubator/beehive/trunk/netui/src/tags-databinding/org/apache/beehive/netui/databinding/datagrid/rendering/pager/PreviousNextPagerRenderer.java?view=diff&rev=149070&p1=incubator/beehive/trunk/netui/src/tags-databinding/org/apache/beehive/netui/databinding/datagrid/rendering/pager/PreviousNextPagerRenderer.java&r1=149069&p2=incubator/beehive/trunk/netui/src/tags-databinding/org/apache/beehive/netui/databinding/datagrid/rendering/pager/PreviousNextPagerRenderer.java&r2=149070
==============================================================================
--- 
incubator/beehive/trunk/netui/src/tags-databinding/org/apache/beehive/netui/databinding/datagrid/rendering/pager/PreviousNextPagerRenderer.java
     (original)
+++ 
incubator/beehive/trunk/netui/src/tags-databinding/org/apache/beehive/netui/databinding/datagrid/rendering/pager/PreviousNextPagerRenderer.java
     Sat Jan 29 12:11:38 2005
@@ -19,6 +19,7 @@
 
 import org.apache.beehive.netui.databinding.datagrid.model.PagerModel;
 import org.apache.beehive.netui.databinding.datagrid.model.DataGridModel;
+import org.apache.beehive.netui.databinding.datagrid.util.IDataGridMessageKeys;
 
 public class PreviousNextPagerRenderer
     extends AbstractPagerRenderer {
@@ -33,7 +34,7 @@
         int currentPage = pagerModel.getPage();
         int lastPage = pagerModel.getLastPage();
 
-        buf.append(getDataGridModel().getString("Tags_DataGrid_pageOfPages",
+        
buf.append(getDataGridModel().getMessage(IDataGridMessageKeys.PAGER_FMT_BANNER,
             new Integer[]{currentPage + 1, pagerModel.getLastPage() + 1}));
         buf.append("  ");
         if(pagerModel.getPreviousPage() >= 0)

Added: 
incubator/beehive/trunk/netui/src/tags-databinding/org/apache/beehive/netui/databinding/datagrid/util/IDataGridMessageKeys.java
Url: 
http://svn.apache.org/viewcvs/incubator/beehive/trunk/netui/src/tags-databinding/org/apache/beehive/netui/databinding/datagrid/util/IDataGridMessageKeys.java?view=auto&rev=149070
==============================================================================
--- (empty file)
+++ 
incubator/beehive/trunk/netui/src/tags-databinding/org/apache/beehive/netui/databinding/datagrid/util/IDataGridMessageKeys.java
     Sat Jan 29 12:11:38 2005
@@ -0,0 +1,44 @@
+/*
+ * Copyright 2004 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.
+ *
+ * $Header:$
+ */
+package org.apache.beehive.netui.databinding.datagrid.util;
+
+/**
+ *
+ */
+public interface IDataGridMessageKeys {
+
+    String DATAGRID_MSG_NODATA = "datagrid.msg.nodata";
+
+    String DATAGRID_RESOURCE_PATH = "datagrid.resource.path";
+
+    String SORT_ASC_IMAGE_PATH = "sort.asc.img";
+
+    String SORT_DESC_IMAGE_PATH = "sort.desc.img";
+
+    String SORT_NONE_IMAGE_PATH = "sort.none.img";
+
+    String PAGER_MSG_FIRST = "pager.msg.first";
+
+    String PAGER_MSG_NEXT = "pager.msg.next";
+
+    String PAGER_MSG_PREVIOUS = "pager.msg.previous";
+
+    String PAGER_MSG_LAST = "pager.msg.last";
+
+    String PAGER_FMT_BANNER = "pager.fmt.banner";
+}

Modified: 
incubator/beehive/trunk/netui/src/tags-databinding/org/apache/beehive/netui/tags/databinding/datagrid/DataGridUtil.java
Url: 
http://svn.apache.org/viewcvs/incubator/beehive/trunk/netui/src/tags-databinding/org/apache/beehive/netui/tags/databinding/datagrid/DataGridUtil.java?view=diff&rev=149070&p1=incubator/beehive/trunk/netui/src/tags-databinding/org/apache/beehive/netui/tags/databinding/datagrid/DataGridUtil.java&r1=149069&p2=incubator/beehive/trunk/netui/src/tags-databinding/org/apache/beehive/netui/tags/databinding/datagrid/DataGridUtil.java&r2=149070
==============================================================================
--- 
incubator/beehive/trunk/netui/src/tags-databinding/org/apache/beehive/netui/tags/databinding/datagrid/DataGridUtil.java
     (original)
+++ 
incubator/beehive/trunk/netui/src/tags-databinding/org/apache/beehive/netui/tags/databinding/datagrid/DataGridUtil.java
     Sat Jan 29 12:11:38 2005
@@ -21,12 +21,16 @@
 
 import org.apache.beehive.netui.databinding.datagrid.model.DataGridModel;
 import org.apache.beehive.netui.databinding.datagrid.model.CellModel;
+import 
org.apache.beehive.netui.databinding.datagrid.exceptions.DataGridExtensionException;
+import org.apache.beehive.netui.util.logging.Logger;
 
 /**
  *
  */
 public class DataGridUtil {
 
+    private static final Logger LOGGER = 
Logger.getInstance(DataGridUtil.class);
+
     /*
      * todo: in order to support nested grids, there needs to be a stack of
      *       model objects in the PageContext.
@@ -65,5 +69,31 @@
     public static final void removeCellModel(JspContext jspContext) {
         assert jspContext.getAttribute(CELL_MODEL_KEY) != null : "Did not find 
a ColumnModel under the key " + CELL_MODEL_KEY;
         jspContext.removeAttribute(CELL_MODEL_KEY);
+    }
+
+    /**
+     * Package protected method that helps instantiate a class used to extend 
the
+     * data grid.
+     *
+     * @param className the name of a class to instantiate
+     * @return an instance of the given class
+     * @throws DataGridExtensionException when an error occurs creating an 
instance of the class
+     */
+    static final Object instantiateClass(String className) {
+        try {
+            Class clazz = Class.forName(className, true, 
Thread.currentThread().getContextClassLoader());
+            Object obj = clazz.newInstance();
+            return obj;
+        } catch(Exception e) {
+            assert e instanceof IllegalAccessException ||
+                   e instanceof InstantiationException ||
+                   e instanceof ClassNotFoundException : "Caught exception of 
unexpected type " + e.getClass().getName();
+
+            String msg = "Unable to extend data grid.  Can't instantiate 
extension class.  Cause: " + e.getMessage();
+            if(LOGGER.isErrorEnabled())
+                LOGGER.error(msg, e);
+
+            throw new DataGridExtensionException(msg, e);
+        }
     }
 }

Modified: 
incubator/beehive/trunk/netui/src/tags-databinding/org/apache/beehive/netui/tags/databinding/datagrid/Footer.java
Url: 
http://svn.apache.org/viewcvs/incubator/beehive/trunk/netui/src/tags-databinding/org/apache/beehive/netui/tags/databinding/datagrid/Footer.java?view=diff&rev=149070&p1=incubator/beehive/trunk/netui/src/tags-databinding/org/apache/beehive/netui/tags/databinding/datagrid/Footer.java&r1=149069&p2=incubator/beehive/trunk/netui/src/tags-databinding/org/apache/beehive/netui/tags/databinding/datagrid/Footer.java&r2=149070
==============================================================================
--- 
incubator/beehive/trunk/netui/src/tags-databinding/org/apache/beehive/netui/tags/databinding/datagrid/Footer.java
   (original)
+++ 
incubator/beehive/trunk/netui/src/tags-databinding/org/apache/beehive/netui/tags/databinding/datagrid/Footer.java
   Sat Jan 29 12:11:38 2005
@@ -253,17 +253,22 @@
                 TrTag.State trState = new TrTag.State();
                 trState.styleClass = stylePolicy.getFooterRowClass();
 
-                //if(_tfootTag.styleClass == null)
-                //    _tfootTag.styleClass = stylePolicy.getTableFootClass();
+                /*
+                    if(_tfootTag.styleClass == null)
+                        _tfootTag.styleClass = stylePolicy.getTableFootClass();
+                    tableRenderer.openTableFoot(_tfootTag, appender);
+                 */
 
-                //tableRenderer.openTableFoot(_tfootTag, appender);
                 tableRenderer.openFooterRow(trState, appender);
 
                 fragment.invoke(sw);
                 appender.append(sw.toString());
 
                 tableRenderer.closeFooterRow(appender);
-                //tableRenderer.closeTableFoot(appender);
+
+                /*
+                    tableRenderer.closeTableFoot(appender);
+                 */
             }
         }
     }

Modified: 
incubator/beehive/trunk/netui/src/tags-databinding/org/apache/beehive/netui/tags/databinding/datagrid/Header.java
Url: 
http://svn.apache.org/viewcvs/incubator/beehive/trunk/netui/src/tags-databinding/org/apache/beehive/netui/tags/databinding/datagrid/Header.java?view=diff&rev=149070&p1=incubator/beehive/trunk/netui/src/tags-databinding/org/apache/beehive/netui/tags/databinding/datagrid/Header.java&r1=149069&p2=incubator/beehive/trunk/netui/src/tags-databinding/org/apache/beehive/netui/tags/databinding/datagrid/Header.java&r2=149070
==============================================================================
--- 
incubator/beehive/trunk/netui/src/tags-databinding/org/apache/beehive/netui/tags/databinding/datagrid/Header.java
   (original)
+++ 
incubator/beehive/trunk/netui/src/tags-databinding/org/apache/beehive/netui/tags/databinding/datagrid/Header.java
   Sat Jan 29 12:11:38 2005
@@ -24,13 +24,16 @@
 import javax.servlet.jsp.JspContext;
 
 import org.apache.beehive.netui.tags.AbstractSimpleTag;
+import org.apache.beehive.netui.tags.html.HtmlConstants;
 import org.apache.beehive.netui.tags.rendering.THeadTag;
 import org.apache.beehive.netui.tags.rendering.TrTag;
 import org.apache.beehive.netui.tags.rendering.AbstractRenderAppender;
 import org.apache.beehive.netui.tags.rendering.StringBuilderRenderAppender;
+import org.apache.beehive.netui.tags.rendering.AbstractHtmlState;
 import org.apache.beehive.netui.databinding.datagrid.model.DataGridModel;
 import org.apache.beehive.netui.databinding.datagrid.model.style.StylePolicy;
 import 
org.apache.beehive.netui.databinding.datagrid.rendering.table.TableRenderer;
+import org.apache.beehive.netui.util.logging.Logger;
 
 /**
  * @netui:tag name="header" description="Render an HTML table head tag" 
body-content="scriptless"
@@ -39,10 +42,198 @@
 public class Header
     extends AbstractSimpleTag {
 
+    private THeadTag.State _theadTag = new THeadTag.State();
+
     public String getTagName() {
         return "Header";
     }
 
+    /**
+     * Sets the onClick javascript event.
+     *
+     * @param onClick - the onClick event.
+     * @jsptagref.attributedescription The onClick JavaScript event.
+     * @jsptagref.databindable false
+     * @jsptagref.attributesyntaxvalue <i>string_onClick</i>
+     * @netui:attribute required="false" rtexprvalue="true" description="The 
onClick JavaScript event."
+     * @netui.tldx:attribute 
propertyclass="workshop.jspdesigner.properties.EventPropertyClass" 
category="event"
+     */
+    public void setOnClick(String onClick) {
+        _theadTag.registerAttribute(AbstractHtmlState.ATTR_JAVASCRIPT, 
HtmlConstants.ONCLICK, onClick);
+    }
+
+    /**
+     * Sets the onDblClick javascript event.
+     *
+     * @param onDblClick - the onDblClick event.
+     * @jsptagref.attributedescription The onDblClick JavaScript event.
+     * @jsptagref.databindable false
+     * @jsptagref.attributesyntaxvalue <i>string_onDblClick</i>
+     * @netui:attribute required="false" rtexprvalue="true" description="The 
onDblClick JavaScript event."
+     * @netui.tldx:attribute 
propertyclass="workshop.jspdesigner.properties.EventPropertyClass" 
category="event"
+     */
+    public void setOnDblClick(String onDblClick) {
+        _theadTag.registerAttribute(AbstractHtmlState.ATTR_JAVASCRIPT, 
HtmlConstants.ONDBLCLICK, onDblClick);
+    }
+
+    /**
+     * Sets the onKeyDown javascript event.
+     *
+     * @param onKeyDown - the onKeyDown event.
+     * @jsptagref.attributedescription The onKeyDown JavaScript event.
+     * @jsptagref.databindable false
+     * @jsptagref.attributesyntaxvalue <i>string_onKeyDown</i>
+     * @netui:attribute required="false" rtexprvalue="true" description="The 
onKeyDown JavaScript event."
+     * @netui.tldx:attribute 
propertyclass="workshop.jspdesigner.properties.EventPropertyClass" 
category="event"
+     */
+    public void setOnKeyDown(String onKeyDown) {
+        _theadTag.registerAttribute(AbstractHtmlState.ATTR_JAVASCRIPT, 
HtmlConstants.ONKEYDOWN, onKeyDown);
+    }
+
+    /**
+     * Sets the onKeyUp javascript event.
+     *
+     * @param onKeyUp - the onKeyUp event.
+     * @jsptagref.attributedescription The onKeyUp JavaScript event.
+     * @jsptagref.databindable false
+     * @jsptagref.attributesyntaxvalue <i>string_onKeyUp</i>
+     * @netui:attribute required="false" rtexprvalue="true" description="The 
onKeyUp JavaScript event."
+     * @netui.tldx:attribute 
propertyclass="workshop.jspdesigner.properties.EventPropertyClass" 
category="event"
+     */
+    public void setOnKeyUp(String onKeyUp) {
+        _theadTag.registerAttribute(AbstractHtmlState.ATTR_JAVASCRIPT, 
HtmlConstants.ONKEYUP, onKeyUp);
+    }
+
+    /**
+     * Sets the onKeyPress javascript event.
+     *
+     * @param onKeyPress - the onKeyPress event.
+     * @jsptagref.attributedescription The onKeyPress JavaScript event.
+     * @jsptagref.databindable false
+     * @jsptagref.attributesyntaxvalue <i>string_onKeyPress</i>
+     * @netui:attribute required="false" rtexprvalue="true" description="The 
onKeyPress JavaScript event."
+     * @netui.tldx:attribute 
propertyclass="workshop.jspdesigner.properties.EventPropertyClass" 
category="event"
+     */
+    public void setOnKeyPress(String onKeyPress) {
+        _theadTag.registerAttribute(AbstractHtmlState.ATTR_JAVASCRIPT, 
HtmlConstants.ONKEYPRESS, onKeyPress);
+    }
+
+    /**
+     * Sets the onMouseDown javascript event.
+     *
+     * @param onMouseDown - the onMouseDown event.
+     * @jsptagref.attributedescription The onMouseDown JavaScript event.
+     * @jsptagref.databindable false
+     * @jsptagref.attributesyntaxvalue <i>string_onMouseDown</i>
+     * @netui:attribute required="false" rtexprvalue="true" description="The 
onMouseDown JavaScript event."
+     * @netui.tldx:attribute 
propertyclass="workshop.jspdesigner.properties.EventPropertyClass" 
category="event"
+     */
+    public void setOnMouseDown(String onMouseDown) {
+        _theadTag.registerAttribute(AbstractHtmlState.ATTR_JAVASCRIPT, 
HtmlConstants.ONMOUSEDOWN, onMouseDown);
+    }
+
+    /**
+     * Sets the onMouseUp javascript event.
+     *
+     * @param onMouseUp - the onMouseUp event.
+     * @jsptagref.attributedescription The onMouseUp JavaScript event.
+     * @jsptagref.databindable false
+     * @jsptagref.attributesyntaxvalue <i>string_onMouseUp</i>
+     * @netui:attribute required="false" rtexprvalue="true" description="The 
onMouseUp JavaScript event."
+     * @netui.tldx:attribute 
propertyclass="workshop.jspdesigner.properties.EventPropertyClass" 
category="event"
+     */
+    public void setOnMouseUp(String onMouseUp) {
+        _theadTag.registerAttribute(AbstractHtmlState.ATTR_JAVASCRIPT, 
HtmlConstants.ONMOUSEUP, onMouseUp);
+    }
+
+    /**
+     * Sets the onMouseMove javascript event.
+     *
+     * @param onMouseMove - the onMouseMove event.
+     * @jsptagref.attributedescription The onMouseMove JavaScript event.
+     * @jsptagref.databindable false
+     * @jsptagref.attributesyntaxvalue <i>string_onMouseMove</i>
+     * @netui:attribute required="false" rtexprvalue="true" description="The 
onMouseMove JavaScript event."
+     * @netui.tldx:attribute 
propertyclass="workshop.jspdesigner.properties.EventPropertyClass" 
category="event"
+     */
+    public void setOnMouseMove(String onMouseMove) {
+        _theadTag.registerAttribute(AbstractHtmlState.ATTR_JAVASCRIPT, 
HtmlConstants.ONMOUSEMOVE, onMouseMove);
+    }
+
+    /**
+     * Sets the onMouseOut javascript event.
+     *
+     * @param onMouseOut - the onMouseOut event.
+     * @jsptagref.attributedescription The onMouseOut JavaScript event.
+     * @jsptagref.databindable false
+     * @jsptagref.attributesyntaxvalue <i>string_onMouseOut</i>
+     * @netui:attribute required="false" rtexprvalue="true" description="The 
onMouseOut JavaScript event."
+     * @netui.tldx:attribute 
propertyclass="workshop.jspdesigner.properties.EventPropertyClass" 
category="event"
+     */
+    public void setOnMouseOut(String onMouseOut) {
+        _theadTag.registerAttribute(AbstractHtmlState.ATTR_JAVASCRIPT, 
HtmlConstants.ONMOUSEOUT, onMouseOut);
+    }
+
+    /**
+     * Sets the onMouseOver javascript event.
+     *
+     * @param onMouseOver - the onMouseOver event.
+     * @jsptagref.attributedescription The onMouseOver JavaScript event.
+     * @jsptagref.databindable false
+     * @jsptagref.attributesyntaxvalue <i>string_onMouseOver</i>
+     * @netui:attribute required="false" rtexprvalue="true" description="The 
onMouseOver JavaScript event."
+     * @netui.tldx:attribute 
propertyclass="workshop.jspdesigner.properties.EventPropertyClass" 
category="event"
+     */
+    public void setOnMouseOver(String onMouseOver) {
+        _theadTag.registerAttribute(AbstractHtmlState.ATTR_JAVASCRIPT, 
HtmlConstants.ONMOUSEOVER, onMouseOver);
+    }
+
+    /**
+     * Sets the style of the rendered html tag.
+     *
+     * @param style - the html style.
+     * @jsptagref.attributedescription The style.
+     * @jsptagref.databindable false
+     * @jsptagref.attributesyntaxvalue <i>string_style</i>
+     * @netui:attribute required="false"  rtexprvalue="true" description="The 
style."
+     * @netui.tldx:attribute 
propertyclass="workshop.jspdesigner.properties.JspStyleProperty" 
category="format"
+     */
+    public void setStyle(String style) {
+        if("".equals(style)) return;
+
+        _theadTag.style = style;
+    }
+
+    /**
+     * Sets the style class of the rendered html tag.
+     *
+     * @param styleClass - the html style class.
+     * @jsptagref.attributedescription The style class.
+     * @jsptagref.databindable false
+     * @jsptagref.attributesyntaxvalue <i>string_style_class</i>
+     * @netui:attribute required="false"  rtexprvalue="true" description="The 
style class."
+     * @netui.tldx:attribute category="Format"
+     */
+    public void setStyleClass(String styleClass) {
+        if("".equals(styleClass)) return;
+
+        _theadTag.styleClass = styleClass;
+    }
+
+    /**
+     * Sets the value of the title attribute.
+     *
+     * @param title
+     * @jsptagref.attributedescription The title.
+     * @jsptagref.databindable false
+     * @jsptagref.attributesyntaxvalue <i>string_title</i>
+     * @netui:attribute required="false" rtexprvalue="true" description="The 
title. "
+     * @netui.tldx:attribute category="misc"
+     */
+    public void setTitle(String title) {
+        _theadTag.registerAttribute(AbstractHtmlState.ATTR_GENERAL, 
HtmlConstants.TITLE, title);
+    }
+
     public void doTag()
         throws JspException, IOException {
 
@@ -62,9 +253,8 @@
             TableRenderer tableRenderer = dataGridModel.getTableRenderer();
             assert tableRenderer != null;
 
-            THeadTag.State theadState = new THeadTag.State();
-            theadState.styleClass = stylePolicy.getTableHeadClass();
-            tableRenderer.openTableHead(theadState, appender);
+            _theadTag.styleClass = (_theadTag.styleClass != null ? 
_theadTag.styleClass : stylePolicy.getTableHeadClass());
+            tableRenderer.openTableHead(_theadTag, appender);
 
             TrTag.State trState = new TrTag.State();
             trState.styleClass = stylePolicy.getHeaderRowClass();
@@ -78,6 +268,7 @@
             }
 
             tableRenderer.closeHeaderRow(appender);
+
             tableRenderer.closeTableHead(appender);
 
             getJspContext().getOut().write(content.toString());

Modified: 
incubator/beehive/trunk/netui/src/util/org/apache/beehive/netui/util/netui.properties
Url: 
http://svn.apache.org/viewcvs/incubator/beehive/trunk/netui/src/util/org/apache/beehive/netui/util/netui.properties?view=diff&rev=149070&p1=incubator/beehive/trunk/netui/src/util/org/apache/beehive/netui/util/netui.properties&r1=149069&p2=incubator/beehive/trunk/netui/src/util/org/apache/beehive/netui/util/netui.properties&r2=149070
==============================================================================
--- 
incubator/beehive/trunk/netui/src/util/org/apache/beehive/netui/util/netui.properties
       (original)
+++ 
incubator/beehive/trunk/netui/src/util/org/apache/beehive/netui/util/netui.properties
       Sat Jan 29 12:11:38 2005
@@ -634,16 +634,9 @@
 Tags_Repeater_nullIterator=The data structure from which to create an iterator 
is null.
 Tags_RepeaterItem_invalidChoiceTags=The RepeaterItem choice feature requires 
at least one Choice tag and exactly one ChoiceMethod tag to be present in the 
RepeaterItem's body.
 Tags_RepeaterItem_invalidChoiceMethod=The RepeaterItem's choice feature 
requires exactly one ChoiceMethod tag.
-Tags_StructuredBaseTag_startTagError=An exception occurred when rendering the 
startTag of the tag \"{0}\" because: {1}
-Tags_StructuredBaseTag_endTagError=An exception occurred when rendering the 
endTag of the tag \"{0}\" because: {1}
-Tags_StructuredBaseTag_invalidParent=A tag of type \"{0}\" must be nested 
within a tag of type \"{1}\"
-
-Tags_DataGrid_noData=No data to display
-Tags_DataGrid_pageNameFirst=First
-Tags_DataGrid_pageNamePrevious=Previous
-Tags_DataGrid_pageNameNext=Next
-Tags_DataGrid_pageNameLast=Last
-Tags_DataGrid_pageOfPages=Page {0} of {1}
+Tags_RepeaterComponent_startTagError=An exception occurred when rendering the 
startTag of the tag \"{0}\" because: {1}
+Tags_RepeaterComponent_endTagError=An exception occurred when rendering the 
endTag of the tag \"{0}\" because: {1}
+Tags_RepeaterComponent_invalidParent=A tag of type \"{0}\" must be nested 
within a tag of type \"{1}\"
 
 #
 # NetUI Utility Strings
@@ -660,3 +653,21 @@
 TypeUtils_javaSqlDateConvertError=Caught an error converting a String to a 
java.sql.Date: {0}
 TypeUtils_javaSqlTimestampConvertError=Caught an error converting a String to 
a java.sql.Timestamp: {0}
 TypeUtils_javaSqlTimeConvertError=Caught an error converting a String to a 
java.sql.Time: {0}
+
+#
+# DataGrid strings.  These message keys violate the default key pattern
+# because they are exposed to the developer and are expected to be overridden
+# in a developer's webapp to customize the look / feel / messages of the grid
+#
+datagrid.resource.path=resources/images
+datagrid.msg.nodata=No data to display
+
+sort.asc.img=/sortdown.gif
+sort.desc.img=/sortup.gif
+sort.none.img=/sortable.gif
+
+pager.msg.first=First
+pager.msg.previous=Previous
+pager.msg.next=Next
+pager.msg.last=Last
+pager.fmt.banner=Page {0} of {1}
\ No newline at end of file

Added: 
incubator/beehive/trunk/netui/test/webapps/drt/coreWeb/databinding/datagrid/misc/pagerMessageOverrides.jsp
Url: 
http://svn.apache.org/viewcvs/incubator/beehive/trunk/netui/test/webapps/drt/coreWeb/databinding/datagrid/misc/pagerMessageOverrides.jsp?view=auto&rev=149070
==============================================================================
--- (empty file)
+++ 
incubator/beehive/trunk/netui/test/webapps/drt/coreWeb/databinding/datagrid/misc/pagerMessageOverrides.jsp
  Sat Jan 29 12:11:38 2005
@@ -0,0 +1,33 @@
+<%@ page language="java" contentType="text/html;charset=UTF-8"%>
+<%@ taglib uri="beehive-netui-tags-html.tld" prefix="netui"%>
+<%@ taglib uri="beehive-netui-tags-databinding.tld" prefix="netui-data"%>
+<%@ taglib uri="beehive-netui-tags-template.tld" prefix="netui-template"%>
+<%@ taglib prefix="datagrid" 
tagdir="/WEB-INF/tags/org/apache/beehive/netui/test/databinding/tagfiles" %>
+<netui-template:template templatePage="../site/template.jsp">
+    <netui-template:setAttribute name="title" value="Basic Data Grid"/>
+    <netui-template:section name="body">
+    <p>
+    <datagrid:portfolioXmlBean/>
+    <br/>
+    <netui-data:dataGrid dataSource="pageScope.stocks" name="portfolio" 
resourceBundlePath="databinding.datagrid.resources.simple-test">
+        <netui-data:configurePager pageSize="2"/>
+        <netui-data:header>
+            <netui-data:headerCell headerText="Symbol"/>
+            <netui-data:headerCell headerText="Price"/>
+            <netui-data:headerCell headerText="Web"/>
+        </netui-data:header>
+        <netui-data:rows>
+            <netui-data:spanCell value="${container.item.symbol}"/>
+            <netui-data:spanCell value="${container.item.price}"/>
+            <netui-data:anchorCell value="${container.item.name}" 
href="${container.item.web}">
+                <netui:parameter name="rowid" value="${container.index}"/>
+                <netui:parameter name="symbol" 
value="${container.item.symbol}"/>
+            </netui-data:anchorCell>
+        </netui-data:rows>
+    </netui-data:dataGrid>
+    <br/>
+    <netui:anchor href="index.jsp">Reset</netui:anchor>
+    <br/>
+    </p>
+    </netui-template:section>
+</netui-template:template>
\ No newline at end of file

Modified: 
incubator/beehive/trunk/netui/test/webapps/drt/testRecorder/config/testRecorder-tests.xml
Url: 
http://svn.apache.org/viewcvs/incubator/beehive/trunk/netui/test/webapps/drt/testRecorder/config/testRecorder-tests.xml?view=diff&rev=149070&p1=incubator/beehive/trunk/netui/test/webapps/drt/testRecorder/config/testRecorder-tests.xml&r1=149069&p2=incubator/beehive/trunk/netui/test/webapps/drt/testRecorder/config/testRecorder-tests.xml&r2=149070
==============================================================================
--- 
incubator/beehive/trunk/netui/test/webapps/drt/testRecorder/config/testRecorder-tests.xml
   (original)
+++ 
incubator/beehive/trunk/netui/test/webapps/drt/testRecorder/config/testRecorder-tests.xml
   Sat Jan 29 12:11:38 2005
@@ -2840,6 +2840,21 @@
          </features>
       </test>
       <test>
+         <name>DataGridPagerOverride</name>
+         <description>DataGridPagerOverride</description>
+         <webapp>coreWeb</webapp>
+         <categories>
+            <category>bvt</category>
+            <category>bvt.struts11</category>
+            <category>databinding</category>
+            <category>datagrid</category>
+         </categories>
+         <features>
+            <feature>Databinding</feature>
+            <feature>Data Grid</feature>
+         </features>
+      </test>
+      <test>
          <name>DataGridPagerStickyParam</name>
          <description>DataGridStickyParam</description>
          <webapp>coreWeb</webapp>

Reply via email to