[richfaces-svn-commits] JBoss Rich Faces SVN: r2299 - in trunk: framework/impl/src/main/java/org/richfaces/model and 18 other directories.

richfaces-svn-commits at lists.jboss.org richfaces-svn-commits at lists.jboss.org
Thu Aug 16 12:08:29 EDT 2007


Author: maksimkaszynski
Date: 2007-08-16 12:08:29 -0400 (Thu, 16 Aug 2007)
New Revision: 2299

Added:
   trunk/framework/api/src/main/java/org/richfaces/model/ScrollableTableDataModel.java
   trunk/framework/api/src/main/java/org/richfaces/model/ScrollableTableDataRange.java
   trunk/samples/scrollableDataTableDemo/
   trunk/ui/scrollableDataTable/src/main/config/component/scrollable-data-table.xml
   trunk/ui/scrollableDataTable/src/main/java/org/richfaces/component/UIScrollableDataTable.java
   trunk/ui/scrollableDataTable/src/main/java/org/richfaces/renderkit/html/ScrollableDataTableBaseRenderer.java
   trunk/ui/scrollableDataTable/src/main/java/org/richfaces/renderkit/html/ScrollableDataTableHeaderRendererBase.java
   trunk/ui/scrollableDataTable/src/main/java/org/richfaces/renderkit/html/ScrollableDataTableOptions.java
   trunk/ui/scrollableDataTable/src/main/java/org/richfaces/renderkit/html/ScrollableDataTableRendererState.java
   trunk/ui/scrollableDataTable/src/main/java/org/richfaces/renderkit/html/ScrollableDataTableScrollData.java
   trunk/ui/scrollableDataTable/src/main/java/org/richfaces/renderkit/html/ScrollableDataTableUtils.java
   trunk/ui/scrollableDataTable/src/main/java/org/richfaces/renderkit/html/iconimages/ScrollableDataTableIconBasic.java
   trunk/ui/scrollableDataTable/src/main/java/org/richfaces/renderkit/html/iconimages/ScrollableDataTableIconSortAsc.java
   trunk/ui/scrollableDataTable/src/main/java/org/richfaces/renderkit/html/iconimages/ScrollableDataTableIconSortDesc.java
   trunk/ui/scrollableDataTable/src/main/java/org/richfaces/renderkit/html/iconimages/ScrollableDataTableIconSplit.java
   trunk/ui/scrollableDataTable/src/main/resources/org/richfaces/renderkit/html/css/scrollable-data-table.xcss
   trunk/ui/scrollableDataTable/src/main/templates/org/richfaces/scrollable-data-table-cell.jspx
   trunk/ui/scrollableDataTable/src/main/templates/org/richfaces/scrollable-data-table-footer-cell.jspx
   trunk/ui/scrollableDataTable/src/main/templates/org/richfaces/scrollable-data-table-header-cell.jspx
   trunk/ui/scrollableDataTable/src/main/templates/org/richfaces/scrollable-data-table-header-itself.jspx
   trunk/ui/scrollableDataTable/src/main/templates/org/richfaces/scrollable-data-table.jspx
   trunk/ui/scrollableDataTable/src/test/java/org/richfaces/renderkit/html/ScrollableDataTableRendererTest.java
Removed:
   trunk/framework/api/src/main/java/org/richfaces/model/GridDataModel.java
   trunk/framework/api/src/main/java/org/richfaces/model/ScrollableGridRange.java
   trunk/samples/scrollable-grid-demo/
   trunk/ui/scrollableDataTable/src/main/config/component/scrollable-grid.xml
   trunk/ui/scrollableDataTable/src/main/java/org/richfaces/component/UIScrollableGrid.java
   trunk/ui/scrollableDataTable/src/main/java/org/richfaces/renderkit/html/GridHeaderRendererBase.java
   trunk/ui/scrollableDataTable/src/main/java/org/richfaces/renderkit/html/GridRendererState.java
   trunk/ui/scrollableDataTable/src/main/java/org/richfaces/renderkit/html/GridUtils.java
   trunk/ui/scrollableDataTable/src/main/java/org/richfaces/renderkit/html/ScrollableGridBaseRenderer.java
   trunk/ui/scrollableDataTable/src/main/java/org/richfaces/renderkit/html/ScrollableGridOptions.java
   trunk/ui/scrollableDataTable/src/main/java/org/richfaces/renderkit/html/iconimages/ScrollableGridIconBasic.java
   trunk/ui/scrollableDataTable/src/main/java/org/richfaces/renderkit/html/iconimages/ScrollableGridIconSortAsc.java
   trunk/ui/scrollableDataTable/src/main/java/org/richfaces/renderkit/html/iconimages/ScrollableGridIconSortDesc.java
   trunk/ui/scrollableDataTable/src/main/java/org/richfaces/renderkit/html/iconimages/ScrollableGridIconSplit.java
   trunk/ui/scrollableDataTable/src/main/resources/org/richfaces/renderkit/html/css/grid.xcss
   trunk/ui/scrollableDataTable/src/main/templates/org/richfaces/scrollable-grid-cell.jspx
   trunk/ui/scrollableDataTable/src/main/templates/org/richfaces/scrollable-grid-footer-cell.jspx
   trunk/ui/scrollableDataTable/src/main/templates/org/richfaces/scrollable-grid-header-cell.jspx
   trunk/ui/scrollableDataTable/src/main/templates/org/richfaces/scrollable-grid-header-itself.jspx
   trunk/ui/scrollableDataTable/src/main/templates/org/richfaces/scrollable-grid.jspx
   trunk/ui/scrollableDataTable/src/test/java/org/richfaces/component/html/HtmlScrollableGridComponentTest.java
   trunk/ui/scrollableDataTable/src/test/java/org/richfaces/renderkit/html/ScrollableGridRendererTest.java
   trunk/ui/scrollableDataTable/src/test/java/org/richfaces/taglib/ScrollableGridTagTest.java
Modified:
   trunk/framework/impl/src/main/java/org/richfaces/model/DataModelCache.java
   trunk/framework/impl/src/main/java/org/richfaces/model/impl/ArrayDataModel.java
   trunk/framework/impl/src/main/java/org/richfaces/model/impl/ListDataModel.java
   trunk/framework/impl/src/main/java/org/richfaces/model/impl/SimpleGridDataModel.java
   trunk/samples/scrollableDataTableDemo/pom.xml
   trunk/samples/scrollableDataTableDemo/src/main/java/org/richfaces/demo/datagrid/bean/ChannelDataModel2.java
   trunk/samples/scrollableDataTableDemo/src/main/webapp/WEB-INF/web.xml
   trunk/samples/scrollableDataTableDemo/src/main/webapp/pages/columns.xhtml
   trunk/samples/scrollableDataTableDemo/src/main/webapp/pages/grid1.xhtml
   trunk/samples/scrollableDataTableDemo/src/main/webapp/pages/grid2.xhtml
   trunk/samples/scrollableDataTableDemo/src/main/webapp/pages/grid3.xhtml
   trunk/samples/scrollableDataTableDemo/src/main/webapp/pages/scrollable-grid.xhtml
   trunk/samples/scrollableDataTableDemo/src/main/webapp/pages/test.xhtml
   trunk/ui/scrollableDataTable/generatescript.xml
   trunk/ui/scrollableDataTable/pom.xml
   trunk/ui/scrollableDataTable/src/main/java/org/richfaces/event/sort/MultiColumnSortListener.java
   trunk/ui/scrollableDataTable/src/main/java/org/richfaces/event/sort/SingleColumnSortListener.java
   trunk/ui/scrollableDataTable/src/main/java/org/richfaces/renderkit/html/AjaxFunctionBuilder.java
   trunk/ui/scrollableDataTable/src/main/java/org/richfaces/renderkit/html/ColumnIterator.java
   trunk/ui/scrollableDataTable/src/main/java/org/richfaces/renderkit/html/ColumnVisitor.java
   trunk/ui/scrollableDataTable/src/main/java/org/richfaces/renderkit/html/ColumnWalker.java
   trunk/ui/scrollableDataTable/src/main/java/org/richfaces/renderkit/html/ContextualColumnVisitor.java
   trunk/ui/scrollableDataTable/src/main/java/org/richfaces/renderkit/html/ExtendedColumnVisitor.java
   trunk/ui/scrollableDataTable/src/main/java/org/richfaces/renderkit/html/SelectionRendererContributor.java
   trunk/ui/scrollableDataTable/src/main/java/org/richfaces/renderkit/html/SortIconRenderer.java
   trunk/ui/scrollableDataTable/src/main/javascript/ClientUI/controls/grid/GridBody.js
   trunk/ui/scrollableDataTable/src/main/javascript/ClientUI/controls/grid/GridHeader.js
   trunk/ui/scrollableDataTable/src/main/javascript/ClientUI/controls/grid/Selection.js
   trunk/ui/scrollableDataTable/src/test/java/org/richfaces/renderkit/html/SelectionRendererContributorTest.java
Log:
RF-605

Deleted: trunk/framework/api/src/main/java/org/richfaces/model/GridDataModel.java
===================================================================
--- trunk/framework/api/src/main/java/org/richfaces/model/GridDataModel.java	2007-08-16 15:23:03 UTC (rev 2298)
+++ trunk/framework/api/src/main/java/org/richfaces/model/GridDataModel.java	2007-08-16 16:08:29 UTC (rev 2299)
@@ -1,207 +0,0 @@
-/**
- * 
- */
-package org.richfaces.model;
-
-import java.io.IOException;
-import java.io.Serializable;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-import javax.faces.context.FacesContext;
-
-import org.ajax4jsf.model.DataVisitor;
-import org.ajax4jsf.model.ExtendedDataModel;
-import org.ajax4jsf.model.Range;
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
-
-/**
- * Base class for data models
- * Subclasses must implement {@link #loadData(int, int, SortOrder)}
- * For certain features (like selection and sorting) to work correctly together,
- * both {@link #getId(Object)} and {@link #getObjectById(Object)}
- * methods need to be overriden
- * 
- * @author Maksim Kaszynski
- *
- */
-public abstract class GridDataModel extends ExtendedDataModel {
-	
-	/**
-	 * Simple implementation - index-based row key
-	 * @author Maksim Kaszynski
-	 *
-	 */
-	private static class SimpleRowKey implements Serializable{
-
-		private static final long serialVersionUID = 1L;
-		private int i;
-
-		public SimpleRowKey(int i) {
-			super();
-			this.i = i;
-		}
-		
-		public int intValue() {
-			return i;
-		}
-		
-		public String toString() {
-			return String.valueOf(i);
-		}
-	}
-
-	
-	private static final Log log = LogFactory.getLog(GridDataModel.class);
-	
-	private Object rowKey;
-
-	private Map mapping;
-	
-	private SortOrder lastSortOrder;
-	
-	/**
-	 * Load range of data items from the source.
-	 * Starting from startRow, and up to but excluding endRow
-	 * @param startRow
-	 * @param endRow
-	 * @param sortOrder
-	 * @return list of ordered data
-	 */
-	public abstract List loadData(int startRow, int endRow, SortOrder sortOrder);
-
-	
-	/**
-	 * Load data range, and iterate over it
-	 */
-	public void walk(FacesContext context, DataVisitor visitor, Range range,
-			Object argument) throws IOException {
-		
-		if (log.isTraceEnabled()) {
-			log.trace("Starting walk");
-		}
-		
-		ScrollableGridRange sequenceRange = (ScrollableGridRange) range;
-		
-		int startIndex = sequenceRange.getFirst();
-		int last = sequenceRange.getLast();
-		
-		lastSortOrder = sequenceRange.getSortOrder();
-		
-		List objects = loadData(startIndex, last, lastSortOrder);
-		
-		mapping = new HashMap();
-		
-		for (int i = 0; i < objects.size(); i++,startIndex++) {
-			Object data = objects.get(i);
-			Object key = getId(data);
-			
-			if (key == null) {
-				key = new SimpleRowKey(startIndex);
-			}
-			
-			mapping.put(key, data);
-			
-			visitor.process(context, key, argument);
-			
-		}
-
-		if (log.isTraceEnabled()) {
-			log.trace("Ending walk");
-		}
-		
-	}
-	
-	
-	/**
-	 * This method is the reverse of {@link #getId(Object)}
-	 * If you override this method, you need to override {@link #getId(Object)} as well
-	 * @param id
-	 * @return
-	 */
-	public Object getObjectById(Object id) {
-		
-		if (id instanceof SimpleRowKey) {
-			int i = ((SimpleRowKey) id).intValue();
-			
-			List l = loadData(i, i + 1, lastSortOrder);
-			
-			return l.get(0);
-			
-		}
-		
-		return null;
-	}
-	
-	/**
-	 * Implementations may override it to provide domain-specific searches
-	 * Id should be serializable
-	 * Default implementation returns <code>null</code> anyway
-	 * If you override this method, you need to override {@link #getObjectById(Object)} as well
-	 * @param o
-	 * @return
-	 */
-	public Object getId(Object o) {
-		return null;
-	}
-	
-	
-	public Object getRowData() {
-		
-		if (mapping != null && mapping.containsKey(rowKey)) {
-			return mapping.get(rowKey);	
-		} else {
-			return loadAndMap(rowKey);
-		}
-
-	}
-	
-	/**
-	 * Row indexes navigation is no longer supported
-	 */
-	public int getRowIndex() {
-		throw new UnsupportedOperationException("getRowIndex");
-	}
-	
-	/**
-	 * Quite simple implementation - data will be cached, so the call will be cheap
-	 */
-	public boolean isRowAvailable() {
-		return getRowData() != null;
-	}
-
-	/**
-	 * Row indexes navigation is no longer supported
-	 */
-	public void setRowIndex(int arg0) {
-		throw new UnsupportedOperationException("setRowIndex");
-	}
-
-	public Object getRowKey() {
-		return rowKey;
-	}
-
-	public void setRowKey(Object key) {
-		rowKey = key;
-	}
-
-	private Object loadAndMap(Object id) {
-		
-		if (log.isTraceEnabled()) {
-			log.trace("loadAndMap " + id);
-		}
-		
-		Object o = getObjectById(id);
-		if (o != null) {
-			if (mapping == null) {
-				mapping = new HashMap();
-			}
-			mapping.put(id, o);
-		}
-		return o;
-	}
-
-
-}

Deleted: trunk/framework/api/src/main/java/org/richfaces/model/ScrollableGridRange.java
===================================================================
--- trunk/framework/api/src/main/java/org/richfaces/model/ScrollableGridRange.java	2007-08-16 15:23:03 UTC (rev 2298)
+++ trunk/framework/api/src/main/java/org/richfaces/model/ScrollableGridRange.java	2007-08-16 16:08:29 UTC (rev 2299)
@@ -1,92 +0,0 @@
-/*
- *  Copyright
- *      Copyright (c) Exadel,Inc. 2006
- *      All rights reserved.
- *  
- *  History
- *      $Source: /cvs-master/intralinks-jsf-comps/components/data-view-grid/src/component/com/exadel/jsf/model/ScrollableGridRange.java,v $
- *      $Revision: 1.7 $ 
- */
-
-package org.richfaces.model;
-
-import java.io.Serializable;
-
-import org.ajax4jsf.model.Range;
-
-/**
- * Iteration range for Scrollable Grid
- * @author Maksim Kaszynski
- * @modified by Anton Belevich
- */
-public class ScrollableGridRange implements Range, Serializable{
-	
-	private static final long serialVersionUID = -6675002421400464892L;
-	
-	private int first = 0;
-	private int last = 0;
-	private SortOrder sortOrder;
-	
-	public ScrollableGridRange(int first, int last, SortOrder sortOrder) {
-		super();
-		this.first = first;
-		this.last = last;
-		this.sortOrder = sortOrder;
-	}
-
-	/**
-	 * @return the bufferSize
-	 */
-	public int getLast() {
-		return last;
-	}
-	/**
-	 * @param bufferSize the bufferSize to set
-	 */
-	public void setLast(int lastRow) {
-		this.last = lastRow;
-	}
-	/**
-	 * @return the first
-	 */
-	public int getFirst() {
-		return first;
-	}
-	/**
-	 * @param first the first to set
-	 */
-	public void setFirst(int first) {
-		this.first = first;
-	}
-
-	public SortOrder getSortOrder() {
-		return sortOrder;
-	}
-
-	public void setSortOrder(SortOrder sortOrder) {
-		this.sortOrder = sortOrder;
-	}
-	
-	public boolean equals(Object obj) {
-	
-		if(!(obj instanceof ScrollableGridRange)){
-			return super.equals(obj);
-		}
-		
-		ScrollableGridRange ref = (ScrollableGridRange)obj;
-		
-		boolean ret = (this.first == ref.first)&&(this.last == ref.last );
-		
-		if(this.sortOrder != null){
-			ret = ret && this.sortOrder.equals(ref.sortOrder);  
-		} else {
-			ret = (ret && (ref.sortOrder == null));
-		}
-				
-		return ret;
-	}
-	
-	public int hashCode() {
-		return super.hashCode();
-	}
-}

Added: trunk/framework/api/src/main/java/org/richfaces/model/ScrollableTableDataModel.java
===================================================================
--- trunk/framework/api/src/main/java/org/richfaces/model/ScrollableTableDataModel.java	                        (rev 0)
+++ trunk/framework/api/src/main/java/org/richfaces/model/ScrollableTableDataModel.java	2007-08-16 16:08:29 UTC (rev 2299)
@@ -0,0 +1,207 @@
+/**
+ * 
+ */
+package org.richfaces.model;
+
+import java.io.IOException;
+import java.io.Serializable;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import javax.faces.context.FacesContext;
+
+import org.ajax4jsf.model.DataVisitor;
+import org.ajax4jsf.model.ExtendedDataModel;
+import org.ajax4jsf.model.Range;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+
+/**
+ * Base class for data models
+ * Subclasses must implement {@link #loadData(int, int, SortOrder)}
+ * For certain features (like selection and sorting) to work correctly together,
+ * both {@link #getId(Object)} and {@link #getObjectById(Object)}
+ * methods need to be overriden
+ * 
+ * @author Maksim Kaszynski
+ *
+ */
+public abstract class ScrollableTableDataModel extends ExtendedDataModel {
+	
+	/**
+	 * Simple implementation - index-based row key
+	 * @author Maksim Kaszynski
+	 *
+	 */
+	private static class SimpleRowKey implements Serializable{
+
+		private static final long serialVersionUID = 1L;
+		private int i;
+
+		public SimpleRowKey(int i) {
+			super();
+			this.i = i;
+		}
+		
+		public int intValue() {
+			return i;
+		}
+		
+		public String toString() {
+			return String.valueOf(i);
+		}
+	}
+
+	
+	private static final Log log = LogFactory.getLog(ScrollableTableDataModel.class);
+	
+	private Object rowKey;
+
+	private Map mapping;
+	
+	private SortOrder lastSortOrder;
+	
+	/**
+	 * Load range of data items from the source.
+	 * Starting from startRow, and up to but excluding endRow
+	 * @param startRow
+	 * @param endRow
+	 * @param sortOrder
+	 * @return list of ordered data
+	 */
+	public abstract List loadData(int startRow, int endRow, SortOrder sortOrder);
+
+	
+	/**
+	 * Load data range, and iterate over it
+	 */
+	public void walk(FacesContext context, DataVisitor visitor, Range range,
+			Object argument) throws IOException {
+		
+		if (log.isTraceEnabled()) {
+			log.trace("Starting walk");
+		}
+		
+		ScrollableTableDataRange sequenceRange = (ScrollableTableDataRange) range;
+		
+		int startIndex = sequenceRange.getFirst();
+		int last = sequenceRange.getLast();
+		
+		lastSortOrder = sequenceRange.getSortOrder();
+		
+		List objects = loadData(startIndex, last, lastSortOrder);
+		
+		mapping = new HashMap();
+		
+		for (int i = 0; i < objects.size(); i++,startIndex++) {
+			Object data = objects.get(i);
+			Object key = getId(data);
+			
+			if (key == null) {
+				key = new SimpleRowKey(startIndex);
+			}
+			
+			mapping.put(key, data);
+			
+			visitor.process(context, key, argument);
+			
+		}
+
+		if (log.isTraceEnabled()) {
+			log.trace("Ending walk");
+		}
+		
+	}
+	
+	
+	/**
+	 * This method is the reverse of {@link #getId(Object)}
+	 * If you override this method, you need to override {@link #getId(Object)} as well
+	 * @param id
+	 * @return
+	 */
+	public Object getObjectById(Object id) {
+		
+		if (id instanceof SimpleRowKey) {
+			int i = ((SimpleRowKey) id).intValue();
+			
+			List l = loadData(i, i + 1, lastSortOrder);
+			
+			return l.get(0);
+			
+		}
+		
+		return null;
+	}
+	
+	/**
+	 * Implementations may override it to provide domain-specific searches
+	 * Id should be serializable
+	 * Default implementation returns <code>null</code> anyway
+	 * If you override this method, you need to override {@link #getObjectById(Object)} as well
+	 * @param o
+	 * @return
+	 */
+	public Object getId(Object o) {
+		return null;
+	}
+	
+	
+	public Object getRowData() {
+		
+		if (mapping != null && mapping.containsKey(rowKey)) {
+			return mapping.get(rowKey);	
+		} else {
+			return loadAndMap(rowKey);
+		}
+
+	}
+	
+	/**
+	 * Row indexes navigation is no longer supported
+	 */
+	public int getRowIndex() {
+		throw new UnsupportedOperationException("getRowIndex");
+	}
+	
+	/**
+	 * Quite simple implementation - data will be cached, so the call will be cheap
+	 */
+	public boolean isRowAvailable() {
+		return getRowData() != null;
+	}
+
+	/**
+	 * Row indexes navigation is no longer supported
+	 */
+	public void setRowIndex(int arg0) {
+		throw new UnsupportedOperationException("setRowIndex");
+	}
+
+	public Object getRowKey() {
+		return rowKey;
+	}
+
+	public void setRowKey(Object key) {
+		rowKey = key;
+	}
+
+	private Object loadAndMap(Object id) {
+		
+		if (log.isTraceEnabled()) {
+			log.trace("loadAndMap " + id);
+		}
+		
+		Object o = getObjectById(id);
+		if (o != null) {
+			if (mapping == null) {
+				mapping = new HashMap();
+			}
+			mapping.put(id, o);
+		}
+		return o;
+	}
+
+
+}

Added: trunk/framework/api/src/main/java/org/richfaces/model/ScrollableTableDataRange.java
===================================================================
--- trunk/framework/api/src/main/java/org/richfaces/model/ScrollableTableDataRange.java	                        (rev 0)
+++ trunk/framework/api/src/main/java/org/richfaces/model/ScrollableTableDataRange.java	2007-08-16 16:08:29 UTC (rev 2299)
@@ -0,0 +1,92 @@
+/*
+ *  Copyright
+ *      Copyright (c) Exadel,Inc. 2006
+ *      All rights reserved.
+ *  
+ *  History
+ *      $Source: /cvs-master/intralinks-jsf-comps/components/data-view-grid/src/component/com/exadel/jsf/model/ScrollableTableDataRange.java,v $
+ *      $Revision: 1.7 $ 
+ */
+
+package org.richfaces.model;
+
+import java.io.Serializable;
+
+import org.ajax4jsf.model.Range;
+
+/**
+ * Iteration range for Scrollable Grid
+ * @author Maksim Kaszynski
+ * @modified by Anton Belevich
+ */
+public class ScrollableTableDataRange implements Range, Serializable{
+	
+	private static final long serialVersionUID = -6675002421400464892L;
+	
+	private int first = 0;
+	private int last = 0;
+	private SortOrder sortOrder;
+	
+	public ScrollableTableDataRange(int first, int last, SortOrder sortOrder) {
+		super();
+		this.first = first;
+		this.last = last;
+		this.sortOrder = sortOrder;
+	}
+
+	/**
+	 * @return the bufferSize
+	 */
+	public int getLast() {
+		return last;
+	}
+	/**
+	 * @param bufferSize the bufferSize to set
+	 */
+	public void setLast(int lastRow) {
+		this.last = lastRow;
+	}
+	/**
+	 * @return the first
+	 */
+	public int getFirst() {
+		return first;
+	}
+	/**
+	 * @param first the first to set
+	 */
+	public void setFirst(int first) {
+		this.first = first;
+	}
+
+	public SortOrder getSortOrder() {
+		return sortOrder;
+	}
+
+	public void setSortOrder(SortOrder sortOrder) {
+		this.sortOrder = sortOrder;
+	}
+	
+	public boolean equals(Object obj) {
+	
+		if(!(obj instanceof ScrollableTableDataRange)){
+			return super.equals(obj);
+		}
+		
+		ScrollableTableDataRange ref = (ScrollableTableDataRange)obj;
+		
+		boolean ret = (this.first == ref.first)&&(this.last == ref.last );
+		
+		if(this.sortOrder != null){
+			ret = ret && this.sortOrder.equals(ref.sortOrder);  
+		} else {
+			ret = (ret && (ref.sortOrder == null));
+		}
+				
+		return ret;
+	}
+	
+	public int hashCode() {
+		return super.hashCode();
+	}
+}

Modified: trunk/framework/impl/src/main/java/org/richfaces/model/DataModelCache.java
===================================================================
--- trunk/framework/impl/src/main/java/org/richfaces/model/DataModelCache.java	2007-08-16 15:23:03 UTC (rev 2298)
+++ trunk/framework/impl/src/main/java/org/richfaces/model/DataModelCache.java	2007-08-16 16:08:29 UTC (rev 2299)
@@ -23,7 +23,7 @@
  * @author Maksim Kaszynski
  *
  */
-public class DataModelCache extends GridDataModel {
+public class DataModelCache extends ScrollableTableDataModel {
 
 	private static Log log = LogFactory.getLog(DataModelCache.class);
 	
@@ -64,25 +64,25 @@
 	
 	private DataRange dataRange;
 	
-	private GridDataModel gridDataModel;
+	private ScrollableTableDataModel scrollableTableDataModel;
 
 	private int rowCount = Integer.MIN_VALUE;
 	
-	public DataModelCache(GridDataModel gridDataModel) {
+	public DataModelCache(ScrollableTableDataModel scrollableTableDataModel) {
 		super();
-		this.gridDataModel = gridDataModel;
+		this.scrollableTableDataModel = scrollableTableDataModel;
 		
 		if (log.isTraceEnabled()) {
-			log.trace("initializing with " + gridDataModel);
+			log.trace("initializing with " + scrollableTableDataModel);
 		}
 	}
 
 	public void addDataModelListener(DataModelListener listener) {
-		gridDataModel.addDataModelListener(listener);
+		scrollableTableDataModel.addDataModelListener(listener);
 	}
 
 	public DataModelListener[] getDataModelListeners() {
-		return gridDataModel.getDataModelListeners();
+		return scrollableTableDataModel.getDataModelListeners();
 	}
 
 	public Object getObjectById(Object id) {
@@ -100,7 +100,7 @@
 				log.debug("Cache miss " + id + " falling back to original model");
 			}
 			
-			cached = gridDataModel.getObjectById(id);
+			cached = scrollableTableDataModel.getObjectById(id);
 			secondaryMapping.put(id, cached);
 
 		}
@@ -114,7 +114,7 @@
 
 	public int getRowCount() {
 		if (rowCount == Integer.MIN_VALUE) {
-			rowCount = gridDataModel.getRowCount();
+			rowCount = scrollableTableDataModel.getRowCount();
 		}
 		return rowCount;
 	}
@@ -129,19 +129,19 @@
 	}
 
 	public int getRowIndex() {
-		return gridDataModel.getRowIndex();
+		return scrollableTableDataModel.getRowIndex();
 	}
 
 	public Object getRowKey() {
-		return gridDataModel.getRowKey();
+		return scrollableTableDataModel.getRowKey();
 	}
 
 	public SerializableDataModel getSerializableModel(Range range) {
-		return gridDataModel.getSerializableModel(range);
+		return scrollableTableDataModel.getSerializableModel(range);
 	}
 
 	public Object getWrappedData() {
-		return gridDataModel.getWrappedData();
+		return scrollableTableDataModel.getWrappedData();
 	}
 
 	public boolean isRowAvailable() {
@@ -150,31 +150,31 @@
 
 	public List loadData(int startRow, int endRow, SortOrder sortOrder) {
 		if (dataRange == null || !dataRange.match(startRow, endRow, sortOrder)) {
-			List data = gridDataModel.loadData(startRow, endRow, sortOrder);
+			List data = scrollableTableDataModel.loadData(startRow, endRow, sortOrder);
 			dataRange = new DataRange(startRow, endRow, sortOrder, data);
 		}
 		return dataRange.loadedData;
 	}
 
 	public void removeDataModelListener(DataModelListener listener) {
-		gridDataModel.removeDataModelListener(listener);
+		scrollableTableDataModel.removeDataModelListener(listener);
 	}
 
 	public void setRowIndex(int arg0) {
-		gridDataModel.setRowIndex(arg0);
+		scrollableTableDataModel.setRowIndex(arg0);
 	}
 
 	public void setRowKey(Object key) {
-		gridDataModel.setRowKey(key);
+		scrollableTableDataModel.setRowKey(key);
 		super.setRowKey(key);
 	}
 
 	public void setWrappedData(Object arg0) {
-		gridDataModel.setWrappedData(arg0);
+		scrollableTableDataModel.setWrappedData(arg0);
 	}
 	
 	public Object getId(Object o) {
-		return gridDataModel.getId(o);
+		return scrollableTableDataModel.getId(o);
 	}
 	
 	public void walk(FacesContext context, DataVisitor visitor, Range range,

Modified: trunk/framework/impl/src/main/java/org/richfaces/model/impl/ArrayDataModel.java
===================================================================
--- trunk/framework/impl/src/main/java/org/richfaces/model/impl/ArrayDataModel.java	2007-08-16 15:23:03 UTC (rev 2298)
+++ trunk/framework/impl/src/main/java/org/richfaces/model/impl/ArrayDataModel.java	2007-08-16 16:08:29 UTC (rev 2299)
@@ -30,7 +30,7 @@
 	
 
 	/* (non-Javadoc)
-	 * @see org.richfaces.model.GridDataModel#loadData(int, int, org.richfaces.model.SortOrder)
+	 * @see org.richfaces.model.ScrollableTableDataModel#loadData(int, int, org.richfaces.model.SortOrder)
 	 */
 	public List loadData(int startRow, int endRow, SortOrder sortOrder) {
 		

Modified: trunk/framework/impl/src/main/java/org/richfaces/model/impl/ListDataModel.java
===================================================================
--- trunk/framework/impl/src/main/java/org/richfaces/model/impl/ListDataModel.java	2007-08-16 15:23:03 UTC (rev 2298)
+++ trunk/framework/impl/src/main/java/org/richfaces/model/impl/ListDataModel.java	2007-08-16 16:08:29 UTC (rev 2299)
@@ -30,7 +30,7 @@
 	
 
 	/* (non-Javadoc)
-	 * @see org.richfaces.model.GridDataModel#loadData(int, int, org.richfaces.model.SortOrder)
+	 * @see org.richfaces.model.ScrollableTableDataModel#loadData(int, int, org.richfaces.model.SortOrder)
 	 */
 	public List loadData(int startRow, int endRow, SortOrder sortOrder) {
 		

Modified: trunk/framework/impl/src/main/java/org/richfaces/model/impl/SimpleGridDataModel.java
===================================================================
--- trunk/framework/impl/src/main/java/org/richfaces/model/impl/SimpleGridDataModel.java	2007-08-16 15:23:03 UTC (rev 2298)
+++ trunk/framework/impl/src/main/java/org/richfaces/model/impl/SimpleGridDataModel.java	2007-08-16 16:08:29 UTC (rev 2299)
@@ -2,10 +2,10 @@
 
 import java.util.Comparator;
 
-import org.richfaces.model.GridDataModel;
+import org.richfaces.model.ScrollableTableDataModel;
 import org.richfaces.model.SortOrder;
 
-public abstract class SimpleGridDataModel extends GridDataModel {
+public abstract class SimpleGridDataModel extends ScrollableTableDataModel {
 
 	protected Comparator createComparator(SortOrder sortOrder) {
 		return new PropertyResolverComparator(sortOrder);

Copied: trunk/samples/scrollableDataTableDemo (from rev 2291, trunk/samples/scrollable-grid-demo)

Modified: trunk/samples/scrollableDataTableDemo/pom.xml
===================================================================
--- trunk/samples/scrollable-grid-demo/pom.xml	2007-08-16 12:54:25 UTC (rev 2291)
+++ trunk/samples/scrollableDataTableDemo/pom.xml	2007-08-16 16:08:29 UTC (rev 2299)
@@ -7,15 +7,15 @@
 		<version>3.1.0-SNAPSHOT</version>
 	</parent>
 	<modelVersion>4.0.0</modelVersion>
-	<artifactId>scrollable-grid-demo</artifactId>
+	<artifactId>scrollableDataTableDemo</artifactId>
 	<groupId>org.richfaces.samples</groupId>
 	<version>3.1.0-SNAPSHOT</version>
 	<packaging>war</packaging>
-	<name>scrollable-grid-demo Maven Webapp</name>
+	<name>scrollableDataTable Maven Webapp</name>
 	<dependencies>
 		<dependency>
 			<groupId>org.richfaces.ui</groupId>
-			<artifactId>scrollable-grid</artifactId>
+			<artifactId>scrollableDataTable</artifactId>
 			<version>3.1.0-SNAPSHOT</version>
 		</dependency>
 		<dependency>

Modified: trunk/samples/scrollableDataTableDemo/src/main/java/org/richfaces/demo/datagrid/bean/ChannelDataModel2.java
===================================================================
--- trunk/samples/scrollable-grid-demo/src/main/java/org/richfaces/demo/datagrid/bean/ChannelDataModel2.java	2007-08-16 12:54:25 UTC (rev 2291)
+++ trunk/samples/scrollableDataTableDemo/src/main/java/org/richfaces/demo/datagrid/bean/ChannelDataModel2.java	2007-08-16 16:08:29 UTC (rev 2299)
@@ -10,14 +10,14 @@
 import org.richfaces.demo.datagrid.model.Channel;
 import org.richfaces.demo.datagrid.model.Issue;
 import org.richfaces.demo.datagrid.model.Key;
-import org.richfaces.model.GridDataModel;
+import org.richfaces.model.ScrollableTableDataModel;
 import org.richfaces.model.SortOrder;
 
 /**
  * @author Maksim Kaszynski
  *
  */
-public class ChannelDataModel2 extends GridDataModel {
+public class ChannelDataModel2 extends ScrollableTableDataModel {
 
 	private final Log log = LogFactory.getLog(ChannelDataModel2.class);
 	

Modified: trunk/samples/scrollableDataTableDemo/src/main/webapp/WEB-INF/web.xml
===================================================================
--- trunk/samples/scrollable-grid-demo/src/main/webapp/WEB-INF/web.xml	2007-08-16 12:54:25 UTC (rev 2291)
+++ trunk/samples/scrollableDataTableDemo/src/main/webapp/WEB-INF/web.xml	2007-08-16 16:08:29 UTC (rev 2299)
@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <web-app version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
- <display-name>Archetype Created Web Application</display-name>
+ <display-name>scrollableDataTableDemo</display-name>
  <context-param>
   <param-name>org.ajax4jsf.COMPRESS_SCRIPT</param-name>
   <param-value>false</param-value>

Modified: trunk/samples/scrollableDataTableDemo/src/main/webapp/pages/columns.xhtml
===================================================================
--- trunk/samples/scrollable-grid-demo/src/main/webapp/pages/columns.xhtml	2007-08-16 12:54:25 UTC (rev 2291)
+++ trunk/samples/scrollableDataTableDemo/src/main/webapp/pages/columns.xhtml	2007-08-16 16:08:29 UTC (rev 2299)
@@ -3,7 +3,7 @@
 	xmlns:f="http://java.sun.com/jsf/core"
 	xmlns:h="http://java.sun.com/jsf/html"
 	xmlns:ui="http://java.sun.com/jsf/facelets"
-	xmlns:sg="http://labs.jboss.com/jbossrichfaces/ui/scrollable-grid"
+	xmlns:sg="http://labs.jboss.com/jbossrichfaces/ui/scrollableDataTable"
 	xmlns:dt="http://labs.jboss.com/jbossrichfaces/ui/dataTable">
 
 	<ui:composition>

Modified: trunk/samples/scrollableDataTableDemo/src/main/webapp/pages/grid1.xhtml
===================================================================
--- trunk/samples/scrollable-grid-demo/src/main/webapp/pages/grid1.xhtml	2007-08-16 12:54:25 UTC (rev 2291)
+++ trunk/samples/scrollableDataTableDemo/src/main/webapp/pages/grid1.xhtml	2007-08-16 16:08:29 UTC (rev 2299)
@@ -3,14 +3,14 @@
 	xmlns:f="http://java.sun.com/jsf/core"
 	xmlns:h="http://java.sun.com/jsf/html"
 	xmlns:ui="http://java.sun.com/jsf/facelets"
-	xmlns:sg="http://labs.jboss.com/jbossrichfaces/ui/scrollable-grid">
+	xmlns:sg="http://labs.jboss.com/jbossrichfaces/ui/scrollableDataTable">
 
 	<ui:composition>
-		<sg:scrollable-grid value="#{modelBuilder.model1}" var="issues"
+		<sg:scrollableDataTable value="#{modelBuilder.model1}" var="issues"
 			frozenColCount="3" first="0" rows="40" width="100%" height="500px">
 			<ui:include src="columns.xhtml">
 				<ui:param name="issues" value="#{issues}" />
 			</ui:include>
-		</sg:scrollable-grid>
+		</sg:scrollableDataTable>
 	</ui:composition>
 </jsp:root>

Modified: trunk/samples/scrollableDataTableDemo/src/main/webapp/pages/grid2.xhtml
===================================================================
--- trunk/samples/scrollable-grid-demo/src/main/webapp/pages/grid2.xhtml	2007-08-16 12:54:25 UTC (rev 2291)
+++ trunk/samples/scrollableDataTableDemo/src/main/webapp/pages/grid2.xhtml	2007-08-16 16:08:29 UTC (rev 2299)
@@ -3,14 +3,14 @@
 	xmlns:f="http://java.sun.com/jsf/core"
 	xmlns:h="http://java.sun.com/jsf/html"
 	xmlns:ui="http://java.sun.com/jsf/facelets"
-	xmlns:sg="http://labs.jboss.com/jbossrichfaces/ui/scrollable-grid">
+	xmlns:sg="http://labs.jboss.com/jbossrichfaces/ui/scrollableDataTable">
 
 	<ui:composition>
-		<sg:scrollable-grid value="#{modelBuilder.model2}" var="issues"
+		<sg:scrollableDataTable value="#{modelBuilder.model2}" var="issues"
 			frozenColCount="3" first="0" rows="40" width="100%" height="500px">
 			<ui:include src="columns.xhtml">
 				<ui:param name="issues" value="#{issues}" />
 			</ui:include>
-		</sg:scrollable-grid>
+		</sg:scrollableDataTable>
 	</ui:composition>
 </jsp:root>

Modified: trunk/samples/scrollableDataTableDemo/src/main/webapp/pages/grid3.xhtml
===================================================================
--- trunk/samples/scrollable-grid-demo/src/main/webapp/pages/grid3.xhtml	2007-08-16 12:54:25 UTC (rev 2291)
+++ trunk/samples/scrollableDataTableDemo/src/main/webapp/pages/grid3.xhtml	2007-08-16 16:08:29 UTC (rev 2299)
@@ -3,14 +3,14 @@
 	xmlns:f="http://java.sun.com/jsf/core"
 	xmlns:h="http://java.sun.com/jsf/html"
 	xmlns:ui="http://java.sun.com/jsf/facelets"
-	xmlns:sg="http://labs.jboss.com/jbossrichfaces/ui/scrollable-grid">
+	xmlns:sg="http://labs.jboss.com/jbossrichfaces/ui/scrollableDataTable">
 
 	<ui:composition>
-		<sg:scrollable-grid value="#{modelBuilder.model3}" var="issues"
+		<sg:scrollableDataTable value="#{modelBuilder.model3}" var="issues"
 			frozenColCount="3" first="0" rows="40" width="100%" height="500px">
 			<ui:include src="columns.xhtml">
 				<ui:param name="issues" value="#{issues}" />
 			</ui:include>
-		</sg:scrollable-grid>
+		</sg:scrollableDataTable>
 	</ui:composition>
 </jsp:root>

Modified: trunk/samples/scrollableDataTableDemo/src/main/webapp/pages/scrollable-grid.xhtml
===================================================================
--- trunk/samples/scrollable-grid-demo/src/main/webapp/pages/scrollable-grid.xhtml	2007-08-16 12:54:25 UTC (rev 2291)
+++ trunk/samples/scrollableDataTableDemo/src/main/webapp/pages/scrollable-grid.xhtml	2007-08-16 16:08:29 UTC (rev 2299)
@@ -4,7 +4,7 @@
 	  xmlns:c="http://java.sun.com/jstl/core"
       xmlns:h="http://java.sun.com/jsf/html"
       xmlns:ui="http://java.sun.com/jsf/facelets"
-      xmlns:sg="http://labs.jboss.com/jbossrichfaces/ui/scrollable-grid"
+      xmlns:sg="http://labs.jboss.com/jbossrichfaces/ui/scrollableDataTable"
       xmlns:a4j="https://ajax4jsf.dev.java.net/ajax"
       xmlns:dt="http://labs.jboss.com/jbossrichfaces/ui/dataTable"
       
@@ -22,7 +22,7 @@
 				line-height:normal;
     		}
     		
-    		.rich-sgrid-row {
+    		.rich-sdt-row {
     			height: 30px;
     		}
     		
@@ -40,7 +40,7 @@
 		
 		<c:set var="renderFooter" value="#{true}"/>
 		
-	     <sg:scrollable-grid value="#{dataModel2}" 
+	     <sg:scrollableDataTable value="#{dataModel2}" 
 	     					 var="issues" 
 	     					 frozenColCount="3" 
 	     					 first="0"
@@ -182,7 +182,7 @@
      			</f:facet>
 				</c:if>     			
      		</dt:column>
-     	</sg:scrollable-grid>
+     	</sg:scrollableDataTable>
      	<h:commandButton value="submit"></h:commandButton>
    	   	<h:messages showDetail="true"/>
      </h:form>

Modified: trunk/samples/scrollableDataTableDemo/src/main/webapp/pages/test.xhtml
===================================================================
--- trunk/samples/scrollable-grid-demo/src/main/webapp/pages/test.xhtml	2007-08-16 12:54:25 UTC (rev 2291)
+++ trunk/samples/scrollableDataTableDemo/src/main/webapp/pages/test.xhtml	2007-08-16 16:08:29 UTC (rev 2299)
@@ -3,7 +3,7 @@
 	xmlns:f="http://java.sun.com/jsf/core"
 	xmlns:h="http://java.sun.com/jsf/html"
 	xmlns:ui="http://java.sun.com/jsf/facelets"
-	xmlns:sg="http://labs.jboss.com/jbossrichfaces/ui/scrollable-grid"
+	xmlns:sg="http://labs.jboss.com/jbossrichfaces/ui/scrollableDataTable"
 	xmlns:a4j="http://richfaces.org/a4j">
 <body>
 <f:view>

Modified: trunk/ui/scrollableDataTable/generatescript.xml
===================================================================
--- trunk/ui/scrollableDataTable/generatescript.xml	2007-08-16 15:23:03 UTC (rev 2298)
+++ trunk/ui/scrollableDataTable/generatescript.xml	2007-08-16 16:08:29 UTC (rev 2299)
@@ -17,7 +17,7 @@
 		
 	<target name="merge-scripts-eclipse-3.3">
 				<property name="script-path" value="org/richfaces/renderkit/html/scripts"></property>
-				<property name="gen-script-name" value="scrollable-grid.js"></property>	
+				<property name="gen-script-name" value="scrollable-data-table.js"></property>	
 				<property name="gen-script-full-name" value="${target-dir}/${script-path}/${gen-script-name}"></property>
 				<concat append="false" binary="false"  destfile="${gen-script-full-name}">
 					<filelist dir="${resources-dir}">
@@ -51,7 +51,7 @@
 	
 		<target name="merge-scripts">
 			<property name="script-path" value="org/richfaces/renderkit/html/scripts"></property>
-			<property name="gen-script-name" value="scrollable-grid.js"></property>	
+			<property name="gen-script-name" value="scrollable-data-table.js"></property>	
 			<property name="gen-script-full-name" value="${target-dir}/${script-path}/${gen-script-name}"></property>
 			<concat append="false" binary="false"  destfile="${gen-script-full-name}">
 				<filelist dir="${resources-dir}">

Modified: trunk/ui/scrollableDataTable/pom.xml
===================================================================
--- trunk/ui/scrollableDataTable/pom.xml	2007-08-16 15:23:03 UTC (rev 2298)
+++ trunk/ui/scrollableDataTable/pom.xml	2007-08-16 16:08:29 UTC (rev 2299)
@@ -6,9 +6,9 @@
   </parent>
   <modelVersion>4.0.0</modelVersion>
   <groupId>org.richfaces.ui</groupId>
-  <artifactId>scrollable-grid</artifactId>
+  <artifactId>scrollableDataTable</artifactId>
     <version>3.1.0-SNAPSHOT</version>
-  <name>Scrollable Grid</name>
+  <name>Scrollable Data Table</name>
   <build>
     <plugins>
       <plugin>

Added: trunk/ui/scrollableDataTable/src/main/config/component/scrollable-data-table.xml
===================================================================
--- trunk/ui/scrollableDataTable/src/main/config/component/scrollable-data-table.xml	                        (rev 0)
+++ trunk/ui/scrollableDataTable/src/main/config/component/scrollable-data-table.xml	2007-08-16 16:08:29 UTC (rev 2299)
@@ -0,0 +1,148 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE components PUBLIC "-//AJAX4JSF//CDK Generator config/EN"  "https://ajax4jsf.dev.java.net/nonav/dtds/component-config.dtd" >
+<components>
+	<component>
+		<name>org.richfaces.component.ScrollableDataTable</name>
+		<family>org.richfaces.component.ScrollableDataTable</family>
+	    <classname>
+            org.richfaces.component.html.HtmlScrollableDataTable
+        </classname>
+        <superclass>org.richfaces.component.UIScrollableDataTable</superclass>
+<!-- 
+        <test>
+			<classname>org.richfaces.component.html.HtmlScrollableGridTest</classname>
+			<superclassname>org.ajax4jsf.tests.AbstractAjax4JsfTestCase</superclassname>
+		</test>
+-->
+   		<description>
+   			<![CDATA[ Scrollable Data Table  ]]>
+   		</description>
+
+		<renderer generate="true" override="true">
+			<name>org.richfaces.renderkit.html.ScrollableDataTableRenderer</name> 
+			<template>org/richfaces/scrollable-data-table.jspx</template>
+		</renderer>
+		<tag>
+			<name>scrollableDataTable</name>
+			<classname>org.richfaces.taglib.ScrollableDataTableTag</classname>
+			<superclass>
+				org.ajax4jsf.webapp.taglib.HtmlComponentTagBase
+			</superclass>
+			<!-- 
+			<test>
+				<classname>org.richfaces.taglib.ScrollableDataTableTagTest</classname>
+				<superclassname>org.ajax4jsf.tests.AbstractAjax4JsfTestCase</superclassname>
+			</test>
+			 -->
+		</tag>
+		
+		<property>
+			<name>frozenColCount</name>
+			<classname>int</classname>
+			<description></description>
+			<defaultvalue>0</defaultvalue>
+		</property>		
+		
+		<property>
+			<name>height</name>
+			<classname>java.lang.String</classname>
+			<description>grid height</description>
+			<defaultvalue>"500px"</defaultvalue>
+		</property>		
+		
+		<property>
+			<name>width</name>
+			<classname>java.lang.String</classname>
+			<description>grid width</description>
+			<defaultvalue>"700px"</defaultvalue>
+		</property>	
+		<property>
+			<name>rows</name>
+			<classname>int</classname>
+			<defaultvalue>40</defaultvalue>
+		</property>	
+		
+		<property>
+			<name>selectedClass</name>
+			<classname>java.lang.String</classname>
+		</property>	
+			
+		<property>
+			<name>activeClass</name>
+			<classname>java.lang.String</classname>
+		</property>		
+		
+		<property>
+			<name>columnClasses</name>
+			<classname>java.lang.String</classname>
+		</property>	
+			
+		<property>
+			<name>rowClasses</name>
+			<classname>java.lang.String</classname>
+		</property>		
+		
+		<property>
+			<name>footerClass</name>
+			<classname>java.lang.String</classname>
+		</property>	
+			
+		<property>
+			<name>captionClass</name>
+			<classname>java.lang.String</classname>
+		</property>		
+		
+		<property>
+			<name>headerClass</name>
+			<classname>java.lang.String</classname>
+		</property>	
+			
+		<property>
+			<name>styleClass</name>
+			<classname>java.lang.String</classname>
+		</property>		
+		
+		<property>
+			<name>onselectionchange</name>
+			<classname>java.lang.String</classname>
+		</property>		
+
+		<property attachedstate="true" hidden="true">
+			<name>sortOrder</name>
+			<classname>org.richfaces.model.SortOrder</classname>
+		</property>
+		<property attachedstate="true" hidden="true">
+			<name>selection</name>
+			<classname>org.richfaces.model.selection.Selection</classname>
+		</property>
+		
+		<property>
+			<name>hideWhenScrolling</name>
+			<classname>boolean</classname>
+			<defaultvalue>false</defaultvalue>
+		</property>
+		&ui_component_attributes;
+	</component>
+	
+	<renderer generate="true"> 
+		<template>org/richfaces/scrollable-data-table-cell.jspx</template>
+	</renderer>
+
+	<renderer generate="true"> 
+		<template>org/richfaces/scrollable-data-table-header-cell.jspx</template>
+	</renderer>
+	
+	<renderer generate="true"> 
+		<template>org/richfaces/scrollable-data-table-footer-cell.jspx</template>
+	</renderer>
+
+	<renderer generate="true"> 
+		<template>org/richfaces/scrollable-data-table-header-itself.jspx</template>
+	</renderer>
+	
+	<converter generate="false">
+		<classname>org.richfaces.convert.selection.ClientSelectionConverter</classname>
+		<forclass>org.richfaces.model.selection.ClientSelection</forclass>
+	</converter>
+	
+</components>		
\ No newline at end of file

Deleted: trunk/ui/scrollableDataTable/src/main/config/component/scrollable-grid.xml
===================================================================
--- trunk/ui/scrollableDataTable/src/main/config/component/scrollable-grid.xml	2007-08-16 15:23:03 UTC (rev 2298)
+++ trunk/ui/scrollableDataTable/src/main/config/component/scrollable-grid.xml	2007-08-16 16:08:29 UTC (rev 2299)
@@ -1,148 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE components PUBLIC "-//AJAX4JSF//CDK Generator config/EN"  "https://ajax4jsf.dev.java.net/nonav/dtds/component-config.dtd" >
-<components>
-	<component>
-		<name>org.richfaces.component.ScrollableGrid</name>
-		<family>org.richfaces.component.ScrollableGrid</family>
-	    <classname>
-            org.richfaces.component.html.HtmlScrollableGrid
-        </classname>
-        <superclass>org.richfaces.component.UIScrollableGrid</superclass>
-<!-- 
-        <test>
-			<classname>org.richfaces.component.html.HtmlScrollableGridTest</classname>
-			<superclassname>org.ajax4jsf.tests.AbstractAjax4JsfTestCase</superclassname>
-		</test>
--->
-   		<description>
-   			<![CDATA[ Scrollable Data Table  ]]>
-   		</description>
-
-		<renderer generate="true" override="true">
-			<name>org.richfaces.renderkit.html.ScrollableGridRenderer</name> 
-			<template>org/richfaces/scrollable-grid.jspx</template>
-		</renderer>
-		<tag>
-			<name>scrollableDataTable</name>
-			<classname>org.richfaces.taglib.ScrollableGridTag</classname>
-			<superclass>
-				org.ajax4jsf.webapp.taglib.HtmlComponentTagBase
-			</superclass>
-			<!-- 
-			<test>
-				<classname>org.richfaces.taglib.ScrollableGridTagTest</classname>
-				<superclassname>org.ajax4jsf.tests.AbstractAjax4JsfTestCase</superclassname>
-			</test>
-			 -->
-		</tag>
-		
-		<property>
-			<name>frozenColCount</name>
-			<classname>int</classname>
-			<description></description>
-			<defaultvalue>0</defaultvalue>
-		</property>		
-		
-		<property>
-			<name>height</name>
-			<classname>java.lang.String</classname>
-			<description>grid height</description>
-			<defaultvalue>"500px"</defaultvalue>
-		</property>		
-		
-		<property>
-			<name>width</name>
-			<classname>java.lang.String</classname>
-			<description>grid width</description>
-			<defaultvalue>"700px"</defaultvalue>
-		</property>	
-		<property>
-			<name>rows</name>
-			<classname>int</classname>
-			<defaultvalue>40</defaultvalue>
-		</property>	
-		
-		<property>
-			<name>selectedClass</name>
-			<classname>java.lang.String</classname>
-		</property>	
-			
-		<property>
-			<name>activeClass</name>
-			<classname>java.lang.String</classname>
-		</property>		
-		
-		<property>
-			<name>columnClasses</name>
-			<classname>java.lang.String</classname>
-		</property>	
-			
-		<property>
-			<name>rowClasses</name>
-			<classname>java.lang.String</classname>
-		</property>		
-		
-		<property>
-			<name>footerClass</name>
-			<classname>java.lang.String</classname>
-		</property>	
-			
-		<property>
-			<name>captionClass</name>
-			<classname>java.lang.String</classname>
-		</property>		
-		
-		<property>
-			<name>headerClass</name>
-			<classname>java.lang.String</classname>
-		</property>	
-			
-		<property>
-			<name>styleClass</name>
-			<classname>java.lang.String</classname>
-		</property>		
-		
-		<property>
-			<name>onselectionchange</name>
-			<classname>java.lang.String</classname>
-		</property>		
-
-		<property attachedstate="true" hidden="true">
-			<name>sortOrder</name>
-			<classname>org.richfaces.model.SortOrder</classname>
-		</property>
-		<property attachedstate="true" hidden="true">
-			<name>selection</name>
-			<classname>org.richfaces.model.selection.Selection</classname>
-		</property>
-		
-		<property>
-			<name>hideWhenScrolling</name>
-			<classname>boolean</classname>
-			<defaultvalue>false</defaultvalue>
-		</property>
-		&ui_component_attributes;
-	</component>
-	
-	<renderer generate="true"> 
-		<template>org/richfaces/scrollable-grid-cell.jspx</template>
-	</renderer>
-
-	<renderer generate="true"> 
-		<template>org/richfaces/scrollable-grid-header-cell.jspx</template>
-	</renderer>
-	
-	<renderer generate="true"> 
-		<template>org/richfaces/scrollable-grid-footer-cell.jspx</template>
-	</renderer>
-
-	<renderer generate="true"> 
-		<template>org/richfaces/scrollable-grid-header-itself.jspx</template>
-	</renderer>
-	
-	<converter generate="false">
-		<classname>org.richfaces.convert.selection.ClientSelectionConverter</classname>
-		<forclass>org.richfaces.model.selection.ClientSelection</forclass>
-	</converter>
-	
-</components>		
\ No newline at end of file

Added: trunk/ui/scrollableDataTable/src/main/java/org/richfaces/component/UIScrollableDataTable.java
===================================================================
--- trunk/ui/scrollableDataTable/src/main/java/org/richfaces/component/UIScrollableDataTable.java	                        (rev 0)
+++ trunk/ui/scrollableDataTable/src/main/java/org/richfaces/component/UIScrollableDataTable.java	2007-08-16 16:08:29 UTC (rev 2299)
@@ -0,0 +1,402 @@
+/**
+ * 
+ */
+package org.richfaces.component;
+
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.Iterator;
+import java.util.List;
+
+import javax.faces.component.UIComponent;
+import javax.faces.context.FacesContext;
+import javax.faces.event.AbortProcessingException;
+import javax.faces.event.FacesEvent;
+import javax.faces.event.PhaseId;
+
+import org.ajax4jsf.component.AjaxComponent;
+import org.ajax4jsf.component.UIDataAdaptor;
+import org.ajax4jsf.context.AjaxContext;
+import org.ajax4jsf.event.AjaxEvent;
+import org.ajax4jsf.model.DataComponentState;
+import org.ajax4jsf.model.DataVisitor;
+import org.ajax4jsf.model.ExtendedDataModel;
+import org.ajax4jsf.model.Range;
+import org.apache.commons.collections.iterators.IteratorChain;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.richfaces.event.AttributeHolder;
+import org.richfaces.event.ScrollableGridViewEvent;
+import org.richfaces.event.sort.MultiColumnSortListener;
+import org.richfaces.event.sort.SingleColumnSortListener;
+import org.richfaces.event.sort.SortEvent;
+import org.richfaces.event.sort.SortListener;
+import org.richfaces.model.DataModelCache;
+import org.richfaces.model.ScrollableTableDataModel;
+import org.richfaces.model.ScrollableTableDataRange;
+import org.richfaces.model.SortOrder;
+import org.richfaces.model.impl.ArrayDataModel;
+import org.richfaces.model.impl.ListDataModel;
+
+
+/**
+ * @author Anton Belevich
+ *
+ */
+
+public abstract class UIScrollableDataTable extends UIDataAdaptor implements AjaxComponent, Sortable, Selectable, ScriptExportable{
+	
+	
+	public static final String COMPONENT_TYPE = "org.richfaces.component.ScrollableDataTable";
+	public static final String SORT_SINGLE = "single";
+	public static final String SORT_MULTI = "multi";
+
+	private final static Log log = LogFactory.getLog(UIScrollableDataTable.class);
+	
+	/**
+	 * Flag set on each phase to determine what range of data to walk
+	 * true means - locally saved ranges (for data pending update)
+	 * false means - use range that comes from component state
+	 */
+	private boolean useSavedRanges = true;
+	
+	/**
+	 * hold list of ranges previously accessed until updates are fully done for them
+	 */
+	private List ranges;
+	
+	private Collection responseData = new ArrayList();
+	
+	private int reqRowsCount = -1;
+	
+	private String scrollPos;
+	
+	private SortListener sortListener;
+	
+	public abstract SortOrder getSortOrder();
+	
+	public abstract void setSortOrder(SortOrder sortOrder) ;
+	
+	public Collection getResponseData() {
+		return responseData;
+	}
+
+	public void setResponseData(Collection responseData) {
+		this.responseData = responseData;
+	}
+	
+	protected DataComponentState createComponentState() {
+	
+		return new DataComponentState(){
+		
+			public Range getRange() {
+				
+				int curentRow = getFirst();
+
+				if(reqRowsCount == -1 ){
+					reqRowsCount = getRows();
+				}
+				
+				int rows = reqRowsCount;
+				
+				int rowsCount = getExtendedDataModel().getRowCount();
+				
+				if(rows > 0){
+				
+					rows += curentRow;
+					
+					if(rows >=0){
+						rows = Math.min(rows, rowsCount);
+					}
+					
+				} else if(rowsCount >=0 ){
+					rows = rowsCount;
+					
+				} else {
+					rows = -1;
+				}
+				
+				return new ScrollableTableDataRange(curentRow,rows, getSortOrder());
+			}
+		};
+	}
+	
+	
+	public void processDecodes(FacesContext faces) {
+		
+		useSavedRanges = false;
+		
+		if (log.isTraceEnabled()) {
+			log.trace("UIScrollableDataTable.processDecodes(faces)");
+		}
+		super.processDecodes(faces);
+	}
+	
+	public void processValidators(FacesContext faces) {
+		useSavedRanges = true;
+		if (log.isTraceEnabled()) {
+			log.trace("UIScrollableDataTable.processValidators(faces)");
+		}
+		super.processValidators(faces);
+	}
+	
+	public void processUpdates(FacesContext faces) {
+		useSavedRanges = true;
+		
+		if (log.isTraceEnabled()) {
+			log.trace("UIScrollableDataTable.processUpdates(faces)");
+		}
+		
+		super.processUpdates(faces);
+		ranges = null;
+	}
+	
+	public void encodeBegin(FacesContext context) throws IOException {
+		
+		if (log.isTraceEnabled()) {
+			log.trace("UIScrollableDataTable.encodeBegin(context)");
+		}
+		
+		useSavedRanges = false;
+		super.encodeBegin(context);
+	}
+	
+	protected ExtendedDataModel createDataModel() {
+		
+		Object value = getValue();
+		
+		ScrollableTableDataModel model = null;
+		
+		if (value instanceof ScrollableTableDataModel) {
+			
+			if (log.isDebugEnabled()) {
+				log.debug("Found instanceof " + value.getClass() + " will use it unwrapped");
+			}
+			model = (ScrollableTableDataModel) value;
+		
+		} else	if (value instanceof List) {
+		
+			if (log.isDebugEnabled()) {
+				log.debug("Found instanceof " + value.getClass() + " - will wrap it into " + ListDataModel.class);
+			}
+
+			model = new ListDataModel((List) value);
+		
+		}else if (value instanceof Object[]) {
+		
+			if (log.isDebugEnabled()) {
+				log.debug("Found instanceof " + value.getClass() + " - will wrap it into " + ArrayDataModel.class);
+			}
+
+			model = new ArrayDataModel((Object[]) value);
+		
+		} else if (value == null) {
+			if (log.isDebugEnabled()) {
+				log.debug("Found null value - will wrap it into empty " + ListDataModel.class);
+			}
+			
+			model = new ListDataModel(Collections.EMPTY_LIST);
+		} else {
+			
+			if (log.isDebugEnabled()) {
+				log.debug("Found instanceof " + value.getClass() + " - will wrap it into singleton " + ListDataModel.class);
+			}
+			
+			model = new ListDataModel(Collections.singletonList(value));
+		}
+		
+		if (isCacheable()) {
+			
+			if (log.isDebugEnabled()) {
+				log.debug("Initializing cache of type " + DataModelCache.class);
+			}
+
+			model = new DataModelCache(model);
+		}
+		
+		return model;		
+	}
+	
+		
+	public Object saveState(FacesContext context) {
+		
+		Object values[] = new Object[4];
+		values[0] = super.saveState(context);
+		values[1] = ranges;
+		values[2] = scrollPos;
+		values[3] = saveAttachedState(context, sortListener);
+		
+		return (Object)values;
+	
+	}
+	
+	public void restoreState(FacesContext context, Object state) {
+		Object values[] = (Object[])state;
+		super.restoreState(context, values[0]);
+		ranges = ((List)values[1]);
+		scrollPos = (String)values[2]; 
+		sortListener = (SortListener) restoreAttachedState(context, values[3]);
+	}
+
+	protected Iterator dataChildren() {
+		
+		IteratorChain chain = new IteratorChain();
+		chain.addIterator(getFacets().values().iterator());
+		for (Iterator i = getChildren().iterator(); i.hasNext(); ) {
+			UIComponent kid = (UIComponent)i.next();
+			if (kid instanceof Column) {
+				chain.addIterator(kid.getChildren().iterator());
+			}
+		}
+		
+		return chain;
+	}
+	
+	protected Iterator fixedChildren() {
+	
+		IteratorChain chain = new IteratorChain(getFacets().values().iterator());
+		for (Iterator i = getChildren().iterator(); i.hasNext(); ) {
+			UIComponent kid = (UIComponent)i.next();
+			if (kid instanceof Column) {
+				chain.addIterator(kid.getFacets().values().iterator());
+			}
+		}
+		
+		return chain;
+	}
+	
+	public void broadcast(FacesEvent event) throws AbortProcessingException {
+		
+		super.broadcast(event);
+		
+		if (event instanceof AttributeHolder) {
+			((AttributeHolder) event).applyAttributes(this);
+		}
+
+		if(event instanceof AjaxEvent){
+			AjaxContext.getCurrentInstance().addComponentToAjaxRender(this);
+		}else if(event instanceof SortEvent){
+			processSortingChange(event);
+		//	new AjaxEvent(this).queue();
+		}else if(event instanceof ScrollableGridViewEvent){
+		//	new AjaxEvent(this).queue();
+			processScrolling(event);
+		}
+		
+	}
+	
+	protected boolean broadcastLocal(FacesEvent event) {
+		return super.broadcastLocal(event) || event instanceof SortEvent || event instanceof ScrollableGridViewEvent;
+	}
+	
+	public void queueEvent(FacesEvent event) {
+		
+		if(event instanceof AjaxEvent){
+			event.setPhaseId(PhaseId.APPLY_REQUEST_VALUES);
+		}else if(event instanceof SortEvent){
+			new AjaxEvent(this).queue();
+			event.setPhaseId(PhaseId.APPLY_REQUEST_VALUES);
+		}else if(event instanceof ScrollableGridViewEvent){
+			event.setPhaseId(PhaseId.APPLY_REQUEST_VALUES);
+			new AjaxEvent(this).queue();
+		}
+		super.queueEvent(event);
+	}
+	
+	public void processScrolling(FacesEvent event){
+		ScrollableGridViewEvent e = (ScrollableGridViewEvent)event;
+		
+		setFirst(e.getFirst());
+		reqRowsCount = e.getRows();
+		
+		getFacesContext().renderResponse();
+	}
+	
+	public void processSortingChange(FacesEvent event){
+		
+		SortEvent e = (SortEvent)event;
+		
+		getSortListener().processSort(e);
+	
+		setFirst(e.getFirst());
+		reqRowsCount = e.getRows();
+		
+		
+		resetDataModel();
+		
+		getFacesContext().renderResponse();
+	}
+	
+	public void walk(FacesContext faces, DataVisitor visitor, Object argument) throws IOException {
+		
+		Range visitedRange = getComponentState().getRange();
+	
+		if(ranges == null){
+			ranges = new ArrayList();
+		}
+		
+		if(!ranges.contains(visitedRange)){
+			ranges.add(visitedRange);
+		}
+				
+		if(useSavedRanges){
+			
+			for (Iterator iter = ranges.iterator(); iter.hasNext();) {
+				ScrollableTableDataRange range = (ScrollableTableDataRange) iter.next();
+				
+				if (log.isDebugEnabled()) {
+					log.debug("Range is: " + range.getFirst() + " - " + range.getLast() + " sortOrder: " + range.getSortOrder() );
+				}
+				
+				
+				getExtendedDataModel().walk(faces, visitor,range, argument);
+			}
+			
+		}else{
+			super.walk(faces, visitor, argument);
+		}
+	}
+	
+	
+	public void encodeEnd(FacesContext context) throws IOException {
+		super.encodeEnd(context);
+	}
+	
+	public boolean isCacheable() {
+		return true;
+	}
+
+	public String getScrollPos() {
+		return scrollPos;
+	}
+
+	public void setScrollPos(String scrollPos) {
+		this.scrollPos = scrollPos;
+	}
+
+	public SortListener getSortListener() {
+		if (sortListener != null) {
+			return sortListener;
+		}
+		
+		if (SORT_MULTI.equals(getSortMode())) {
+		
+			return MultiColumnSortListener.INSTANCE;
+	
+		} else {
+		
+			return SingleColumnSortListener.INSTANCE;
+		
+		}
+	}
+
+	public void setSortListener(SortListener sortListener) {
+		this.sortListener = sortListener;
+	}
+	
+	public abstract String getSortMode();
+	public abstract void setSortMode(String mode);
+	
+}

Deleted: trunk/ui/scrollableDataTable/src/main/java/org/richfaces/component/UIScrollableGrid.java
===================================================================
--- trunk/ui/scrollableDataTable/src/main/java/org/richfaces/component/UIScrollableGrid.java	2007-08-16 15:23:03 UTC (rev 2298)
+++ trunk/ui/scrollableDataTable/src/main/java/org/richfaces/component/UIScrollableGrid.java	2007-08-16 16:08:29 UTC (rev 2299)
@@ -1,402 +0,0 @@
-/**
- * 
- */
-package org.richfaces.component;
-
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.Iterator;
-import java.util.List;
-
-import javax.faces.component.UIComponent;
-import javax.faces.context.FacesContext;
-import javax.faces.event.AbortProcessingException;
-import javax.faces.event.FacesEvent;
-import javax.faces.event.PhaseId;
-
-import org.ajax4jsf.component.AjaxComponent;
-import org.ajax4jsf.component.UIDataAdaptor;
-import org.ajax4jsf.context.AjaxContext;
-import org.ajax4jsf.event.AjaxEvent;
-import org.ajax4jsf.model.DataComponentState;
-import org.ajax4jsf.model.DataVisitor;
-import org.ajax4jsf.model.ExtendedDataModel;
-import org.ajax4jsf.model.Range;
-import org.apache.commons.collections.iterators.IteratorChain;
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
-import org.richfaces.event.AttributeHolder;
-import org.richfaces.event.ScrollableGridViewEvent;
-import org.richfaces.event.sort.MultiColumnSortListener;
-import org.richfaces.event.sort.SingleColumnSortListener;
-import org.richfaces.event.sort.SortEvent;
-import org.richfaces.event.sort.SortListener;
-import org.richfaces.model.DataModelCache;
-import org.richfaces.model.GridDataModel;
-import org.richfaces.model.ScrollableGridRange;
-import org.richfaces.model.SortOrder;
-import org.richfaces.model.impl.ArrayDataModel;
-import org.richfaces.model.impl.ListDataModel;
-
-
-/**
- * @author Anton Belevich
- *
- */
-
-public abstract class UIScrollableGrid extends UIDataAdaptor implements AjaxComponent, Sortable, Selectable, ScriptExportable{
-	
-	
-	public static final String COMPONENT_TYPE = "org.richfaces.component.ScrollableGrid";
-	public static final String SORT_SINGLE = "single";
-	public static final String SORT_MULTI = "multi";
-
-	private final static Log log = LogFactory.getLog(UIScrollableGrid.class);
-	
-	/**
-	 * Flag set on each phase to determine what range of data to walk
-	 * true means - locally saved ranges (for data pending update)
-	 * false means - use range that comes from component state
-	 */
-	private boolean useSavedRanges = true;
-	
-	/**
-	 * hold list of ranges previously accessed until updates are fully done for them
-	 */
-	private List ranges;
-	
-	private Collection responseData = new ArrayList();
-	
-	private int reqRowsCount = -1;
-	
-	private String scrollPos;
-	
-	private SortListener sortListener;
-	
-	public abstract SortOrder getSortOrder();
-	
-	public abstract void setSortOrder(SortOrder sortOrder) ;
-	
-	public Collection getResponseData() {
-		return responseData;
-	}
-
-	public void setResponseData(Collection responseData) {
-		this.responseData = responseData;
-	}
-	
-	protected DataComponentState createComponentState() {
-	
-		return new DataComponentState(){
-		
-			public Range getRange() {
-				
-				int curentRow = getFirst();
-
-				if(reqRowsCount == -1 ){
-					reqRowsCount = getRows();
-				}
-				
-				int rows = reqRowsCount;
-				
-				int rowsCount = getExtendedDataModel().getRowCount();
-				
-				if(rows > 0){
-				
-					rows += curentRow;
-					
-					if(rows >=0){
-						rows = Math.min(rows, rowsCount);
-					}
-					
-				} else if(rowsCount >=0 ){
-					rows = rowsCount;
-					
-				} else {
-					rows = -1;
-				}
-				
-				return new ScrollableGridRange(curentRow,rows, getSortOrder());
-			}
-		};
-	}
-	
-	
-	public void processDecodes(FacesContext faces) {
-		
-		useSavedRanges = false;
-		
-		if (log.isTraceEnabled()) {
-			log.trace("UIScrollableGrid.processDecodes(faces)");
-		}
-		super.processDecodes(faces);
-	}
-	
-	public void processValidators(FacesContext faces) {
-		useSavedRanges = true;
-		if (log.isTraceEnabled()) {
-			log.trace("UIScrollableGrid.processValidators(faces)");
-		}
-		super.processValidators(faces);
-	}
-	
-	public void processUpdates(FacesContext faces) {
-		useSavedRanges = true;
-		
-		if (log.isTraceEnabled()) {
-			log.trace("UIScrollableGrid.processUpdates(faces)");
-		}
-		
-		super.processUpdates(faces);
-		ranges = null;
-	}
-	
-	public void encodeBegin(FacesContext context) throws IOException {
-		
-		if (log.isTraceEnabled()) {
-			log.trace("UIScrollableGrid.encodeBegin(context)");
-		}
-		
-		useSavedRanges = false;
-		super.encodeBegin(context);
-	}
-	
-	protected ExtendedDataModel createDataModel() {
-		
-		Object value = getValue();
-		
-		GridDataModel model = null;
-		
-		if (value instanceof GridDataModel) {
-			
-			if (log.isDebugEnabled()) {
-				log.debug("Found instanceof " + value.getClass() + " will use it unwrapped");
-			}
-			model = (GridDataModel) value;
-		
-		} else	if (value instanceof List) {
-		
-			if (log.isDebugEnabled()) {
-				log.debug("Found instanceof " + value.getClass() + " - will wrap it into " + ListDataModel.class);
-			}
-
-			model = new ListDataModel((List) value);
-		
-		}else if (value instanceof Object[]) {
-		
-			if (log.isDebugEnabled()) {
-				log.debug("Found instanceof " + value.getClass() + " - will wrap it into " + ArrayDataModel.class);
-			}
-
-			model = new ArrayDataModel((Object[]) value);
-		
-		} else if (value == null) {
-			if (log.isDebugEnabled()) {
-				log.debug("Found null value - will wrap it into empty " + ListDataModel.class);
-			}
-			
-			model = new ListDataModel(Collections.EMPTY_LIST);
-		} else {
-			
-			if (log.isDebugEnabled()) {
-				log.debug("Found instanceof " + value.getClass() + " - will wrap it into singleton " + ListDataModel.class);
-			}
-			
-			model = new ListDataModel(Collections.singletonList(value));
-		}
-		
-		if (isCacheable()) {
-			
-			if (log.isDebugEnabled()) {
-				log.debug("Initializing cache of type " + DataModelCache.class);
-			}
-
-			model = new DataModelCache(model);
-		}
-		
-		return model;		
-	}
-	
-		
-	public Object saveState(FacesContext context) {
-		
-		Object values[] = new Object[4];
-		values[0] = super.saveState(context);
-		values[1] = ranges;
-		values[2] = scrollPos;
-		values[3] = saveAttachedState(context, sortListener);
-		
-		return (Object)values;
-	
-	}
-	
-	public void restoreState(FacesContext context, Object state) {
-		Object values[] = (Object[])state;
-		super.restoreState(context, values[0]);
-		ranges = ((List)values[1]);
-		scrollPos = (String)values[2]; 
-		sortListener = (SortListener) restoreAttachedState(context, values[3]);
-	}
-
-	protected Iterator dataChildren() {
-		
-		IteratorChain chain = new IteratorChain();
-		chain.addIterator(getFacets().values().iterator());
-		for (Iterator i = getChildren().iterator(); i.hasNext(); ) {
-			UIComponent kid = (UIComponent)i.next();
-			if (kid instanceof Column) {
-				chain.addIterator(kid.getChildren().iterator());
-			}
-		}
-		
-		return chain;
-	}
-	
-	protected Iterator fixedChildren() {
-	
-		IteratorChain chain = new IteratorChain(getFacets().values().iterator());
-		for (Iterator i = getChildren().iterator(); i.hasNext(); ) {
-			UIComponent kid = (UIComponent)i.next();
-			if (kid instanceof Column) {
-				chain.addIterator(kid.getFacets().values().iterator());
-			}
-		}
-		
-		return chain;
-	}
-	
-	public void broadcast(FacesEvent event) throws AbortProcessingException {
-		
-		super.broadcast(event);
-		
-		if (event instanceof AttributeHolder) {
-			((AttributeHolder) event).applyAttributes(this);
-		}
-
-		if(event instanceof AjaxEvent){
-			AjaxContext.getCurrentInstance().addComponentToAjaxRender(this);
-		}else if(event instanceof SortEvent){
-			processSortingChange(event);
-		//	new AjaxEvent(this).queue();
-		}else if(event instanceof ScrollableGridViewEvent){
-		//	new AjaxEvent(this).queue();
-			processScrolling(event);
-		}
-		
-	}
-	
-	protected boolean broadcastLocal(FacesEvent event) {
-		return super.broadcastLocal(event) || event instanceof SortEvent || event instanceof ScrollableGridViewEvent;
-	}
-	
-	public void queueEvent(FacesEvent event) {
-		
-		if(event instanceof AjaxEvent){
-			event.setPhaseId(PhaseId.APPLY_REQUEST_VALUES);
-		}else if(event instanceof SortEvent){
-			new AjaxEvent(this).queue();
-			event.setPhaseId(PhaseId.APPLY_REQUEST_VALUES);
-		}else if(event instanceof ScrollableGridViewEvent){
-			event.setPhaseId(PhaseId.APPLY_REQUEST_VALUES);
-			new AjaxEvent(this).queue();
-		}
-		super.queueEvent(event);
-	}
-	
-	public void processScrolling(FacesEvent event){
-		ScrollableGridViewEvent e = (ScrollableGridViewEvent)event;
-		
-		setFirst(e.getFirst());
-		reqRowsCount = e.getRows();
-		
-		getFacesContext().renderResponse();
-	}
-	
-	public void processSortingChange(FacesEvent event){
-		
-		SortEvent e = (SortEvent)event;
-		
-		getSortListener().processSort(e);
-	
-		setFirst(e.getFirst());
-		reqRowsCount = e.getRows();
-		
-		
-		resetDataModel();
-		
-		getFacesContext().renderResponse();
-	}
-	
-	public void walk(FacesContext faces, DataVisitor visitor, Object argument) throws IOException {
-		
-		Range visitedRange = getComponentState().getRange();
-	
-		if(ranges == null){
-			ranges = new ArrayList();
-		}
-		
-		if(!ranges.contains(visitedRange)){
-			ranges.add(visitedRange);
-		}
-				
-		if(useSavedRanges){
-			
-			for (Iterator iter = ranges.iterator(); iter.hasNext();) {
-				ScrollableGridRange range = (ScrollableGridRange) iter.next();
-				
-				if (log.isDebugEnabled()) {
-					log.debug("Range is: " + range.getFirst() + " - " + range.getLast() + " sortOrder: " + range.getSortOrder() );
-				}
-				
-				
-				getExtendedDataModel().walk(faces, visitor,range, argument);
-			}
-			
-		}else{
-			super.walk(faces, visitor, argument);
-		}
-	}
-	
-	
-	public void encodeEnd(FacesContext context) throws IOException {
-		super.encodeEnd(context);
-	}
-	
-	public boolean isCacheable() {
-		return true;
-	}
-
-	public String getScrollPos() {
-		return scrollPos;
-	}
-
-	public void setScrollPos(String scrollPos) {
-		this.scrollPos = scrollPos;
-	}
-
-	public SortListener getSortListener() {
-		if (sortListener != null) {
-			return sortListener;
-		}
-		
-		if (SORT_MULTI.equals(getSortMode())) {
-		
-			return MultiColumnSortListener.INSTANCE;
-	
-		} else {
-		
-			return SingleColumnSortListener.INSTANCE;
-		
-		}
-	}
-
-	public void setSortListener(SortListener sortListener) {
-		this.sortListener = sortListener;
-	}
-	
-	public abstract String getSortMode();
-	public abstract void setSortMode(String mode);
-	
-}

Modified: trunk/ui/scrollableDataTable/src/main/java/org/richfaces/event/sort/MultiColumnSortListener.java
===================================================================
--- trunk/ui/scrollableDataTable/src/main/java/org/richfaces/event/sort/MultiColumnSortListener.java	2007-08-16 15:23:03 UTC (rev 2298)
+++ trunk/ui/scrollableDataTable/src/main/java/org/richfaces/event/sort/MultiColumnSortListener.java	2007-08-16 16:08:29 UTC (rev 2299)
@@ -12,7 +12,7 @@
 import javax.faces.context.FacesContext;
 
 import org.richfaces.component.Column;
-import org.richfaces.component.UIScrollableGrid;
+import org.richfaces.component.UIScrollableDataTable;
 import org.richfaces.model.SortField;
 import org.richfaces.model.SortOrder;
 
@@ -31,7 +31,7 @@
 	 * @see org.richfaces.event.sort.SortListener#processSort(org.richfaces.event.sort.SortEvent)
 	 */
 	public void processSort(SortEvent e) {
-		UIScrollableGrid grid = (UIScrollableGrid) e.getComponent();
+		UIScrollableDataTable grid = (UIScrollableDataTable) e.getComponent();
 		int columnIndex = e.getSortColumn();
 
 		UIComponent column = 

Modified: trunk/ui/scrollableDataTable/src/main/java/org/richfaces/event/sort/SingleColumnSortListener.java
===================================================================
--- trunk/ui/scrollableDataTable/src/main/java/org/richfaces/event/sort/SingleColumnSortListener.java	2007-08-16 15:23:03 UTC (rev 2298)
+++ trunk/ui/scrollableDataTable/src/main/java/org/richfaces/event/sort/SingleColumnSortListener.java	2007-08-16 16:08:29 UTC (rev 2299)
@@ -8,7 +8,7 @@
 import javax.faces.context.FacesContext;
 
 import org.richfaces.component.Column;
-import org.richfaces.component.UIScrollableGrid;
+import org.richfaces.component.UIScrollableDataTable;
 import org.richfaces.model.SortField;
 import org.richfaces.model.SortOrder;
 
@@ -27,7 +27,7 @@
 	 * @see org.richfaces.event.sort.SortListener#processSort(org.richfaces.event.sort.SortEvent)
 	 */
 	public void processSort(SortEvent e) {
-		UIScrollableGrid grid = (UIScrollableGrid) e.getComponent();
+		UIScrollableDataTable grid = (UIScrollableDataTable) e.getComponent();
 		int columnIndex = e.getSortColumn();
 		UIComponent column = 
 			(UIComponent) grid.getChildren().get(columnIndex);

Modified: trunk/ui/scrollableDataTable/src/main/java/org/richfaces/renderkit/html/AjaxFunctionBuilder.java
===================================================================
--- trunk/ui/scrollableDataTable/src/main/java/org/richfaces/renderkit/html/AjaxFunctionBuilder.java	2007-08-16 15:23:03 UTC (rev 2298)
+++ trunk/ui/scrollableDataTable/src/main/java/org/richfaces/renderkit/html/AjaxFunctionBuilder.java	2007-08-16 16:08:29 UTC (rev 2299)
@@ -8,7 +8,7 @@
 import org.ajax4jsf.javascript.JSFunction;
 import org.ajax4jsf.javascript.JSFunctionDefinition;
 import org.ajax4jsf.javascript.JSReference;
-import org.richfaces.component.UIScrollableGrid;
+import org.richfaces.component.UIScrollableDataTable;
 
 
 public class AjaxFunctionBuilder {
@@ -28,16 +28,16 @@
 		return function;
 	}	
 		
-	public static JSFunctionDefinition getOnComplete(FacesContext context, UIScrollableGrid grid, int type) {
+	public static JSFunctionDefinition getOnComplete(FacesContext context, UIScrollableDataTable grid, int type) {
 		
 		JSFunction function = null;
 		
 		switch (type) {
 			case SCROLL:
-				function = createFunction(ScrollableGridBaseRenderer.getJavaScriptVarName(context, grid) + ".onScrollComplete");
+				function = createFunction(ScrollableDataTableBaseRenderer.getJavaScriptVarName(context, grid) + ".onScrollComplete");
 				break;
 			case SORT: 				
-				function = createFunction(ScrollableGridBaseRenderer.getJavaScriptVarName(context, grid) + ".onSortComplete");
+				function = createFunction(ScrollableDataTableBaseRenderer.getJavaScriptVarName(context, grid) + ".onSortComplete");
 				break;
 		}	
 

Modified: trunk/ui/scrollableDataTable/src/main/java/org/richfaces/renderkit/html/ColumnIterator.java
===================================================================
--- trunk/ui/scrollableDataTable/src/main/java/org/richfaces/renderkit/html/ColumnIterator.java	2007-08-16 15:23:03 UTC (rev 2298)
+++ trunk/ui/scrollableDataTable/src/main/java/org/richfaces/renderkit/html/ColumnIterator.java	2007-08-16 16:08:29 UTC (rev 2299)
@@ -7,7 +7,7 @@
 import java.util.List;
 
 import org.richfaces.component.Column;
-import org.richfaces.component.UIScrollableGrid;
+import org.richfaces.component.UIScrollableDataTable;
 
 /**
  * @author Maksim Kaszynski
@@ -16,8 +16,8 @@
 public class ColumnIterator implements Iterator {
 
 	
-	public static ColumnIterator frozen(UIScrollableGrid grid, GridRendererState state) {
-		return new ColumnIterator(0, GridUtils.getFrozenColumnsCount(grid), grid, state) {
+	public static ColumnIterator frozen(UIScrollableDataTable grid, ScrollableDataTableRendererState state) {
+		return new ColumnIterator(0, ScrollableDataTableUtils.getFrozenColumnsCount(grid), grid, state) {
 			public Object next() {
 				this.state.setFrozenPart(true);
 				return super.next();
@@ -25,8 +25,8 @@
 		};
 	}
 	
-	public static ColumnIterator normal(UIScrollableGrid grid, GridRendererState state) {
-		return new ColumnIterator(GridUtils.getFrozenColumnsCount(grid), grid.getChildCount(), grid, state) {
+	public static ColumnIterator normal(UIScrollableDataTable grid, ScrollableDataTableRendererState state) {
+		return new ColumnIterator(ScrollableDataTableUtils.getFrozenColumnsCount(grid), grid.getChildCount(), grid, state) {
 			public Object next() {
 				this.state.setFrozenPart(false);
 				return super.next();
@@ -34,17 +34,17 @@
 		};
 	}
 	
-	public static ColumnIterator all(UIScrollableGrid grid, GridRendererState state) {
+	public static ColumnIterator all(UIScrollableDataTable grid, ScrollableDataTableRendererState state) {
 		return new ColumnIterator(0, grid.getChildCount(), grid, state);
 	}
 	
-	GridRendererState state;
+	ScrollableDataTableRendererState state;
 	private int index = 0;
 	private int start;
 	private int end;
 	private List kids;
 	
-	private ColumnIterator(int start, int end, UIScrollableGrid grid, GridRendererState state) {
+	private ColumnIterator(int start, int end, UIScrollableDataTable grid, ScrollableDataTableRendererState state) {
 		this.start = start; 
 		this.end = end;
 		this.state = state;

Modified: trunk/ui/scrollableDataTable/src/main/java/org/richfaces/renderkit/html/ColumnVisitor.java
===================================================================
--- trunk/ui/scrollableDataTable/src/main/java/org/richfaces/renderkit/html/ColumnVisitor.java	2007-08-16 15:23:03 UTC (rev 2298)
+++ trunk/ui/scrollableDataTable/src/main/java/org/richfaces/renderkit/html/ColumnVisitor.java	2007-08-16 16:08:29 UTC (rev 2299)
@@ -15,5 +15,5 @@
  */
 public interface ColumnVisitor {
 	
-	public int  visit(FacesContext context, UIComponent column, ResponseWriter writer, GridRendererState state) throws IOException;
+	public int  visit(FacesContext context, UIComponent column, ResponseWriter writer, ScrollableDataTableRendererState state) throws IOException;
 }

Modified: trunk/ui/scrollableDataTable/src/main/java/org/richfaces/renderkit/html/ColumnWalker.java
===================================================================
--- trunk/ui/scrollableDataTable/src/main/java/org/richfaces/renderkit/html/ColumnWalker.java	2007-08-16 15:23:03 UTC (rev 2298)
+++ trunk/ui/scrollableDataTable/src/main/java/org/richfaces/renderkit/html/ColumnWalker.java	2007-08-16 16:08:29 UTC (rev 2299)
@@ -11,7 +11,7 @@
 import javax.faces.context.ResponseWriter;
 
 import org.richfaces.component.Column;
-import org.richfaces.component.UIScrollableGrid;
+import org.richfaces.component.UIScrollableDataTable;
 
 /**
  * @author Anton Belevich
@@ -20,7 +20,7 @@
 public class ColumnWalker{
 	
 	static int iterateOverColumns(FacesContext context, UIComponent component, ColumnVisitor visitor, 
-								   ResponseWriter writer, GridRendererState state) throws IOException{
+								   ResponseWriter writer, ScrollableDataTableRendererState state) throws IOException{
 		
 		int columnsCount = 0;
 		
@@ -40,7 +40,7 @@
 		}
 		try {
 			
-			if(component instanceof UIScrollableGrid){
+			if(component instanceof UIScrollableDataTable){
 				for (Iterator iter = component.getChildren().iterator(); iter.hasNext(); ) {
 					UIComponent kid = (UIComponent) iter.next();
 					if (kid.isRendered()) {

Modified: trunk/ui/scrollableDataTable/src/main/java/org/richfaces/renderkit/html/ContextualColumnVisitor.java
===================================================================
--- trunk/ui/scrollableDataTable/src/main/java/org/richfaces/renderkit/html/ContextualColumnVisitor.java	2007-08-16 15:23:03 UTC (rev 2298)
+++ trunk/ui/scrollableDataTable/src/main/java/org/richfaces/renderkit/html/ContextualColumnVisitor.java	2007-08-16 16:08:29 UTC (rev 2299)
@@ -12,6 +12,6 @@
  *
  */
 public interface ContextualColumnVisitor extends ColumnVisitor {
-	public void setUp(FacesContext context, GridRendererState state) throws IOException;
-	public void tearDown(FacesContext context, GridRendererState state) throws IOException;
+	public void setUp(FacesContext context, ScrollableDataTableRendererState state) throws IOException;
+	public void tearDown(FacesContext context, ScrollableDataTableRendererState state) throws IOException;
 }

Modified: trunk/ui/scrollableDataTable/src/main/java/org/richfaces/renderkit/html/ExtendedColumnVisitor.java
===================================================================
--- trunk/ui/scrollableDataTable/src/main/java/org/richfaces/renderkit/html/ExtendedColumnVisitor.java	2007-08-16 15:23:03 UTC (rev 2298)
+++ trunk/ui/scrollableDataTable/src/main/java/org/richfaces/renderkit/html/ExtendedColumnVisitor.java	2007-08-16 16:08:29 UTC (rev 2299)
@@ -16,10 +16,10 @@
 public abstract class ExtendedColumnVisitor implements ColumnVisitor {
 
 	/* (non-Javadoc)
-	 * @see org.richfaces.renderkit.html.ColumnVisitor#visit(javax.faces.context.FacesContext, org.richfaces.component.UIScrollableGridColumn, javax.faces.context.ResponseWriter, org.richfaces.renderkit.html.GridRendererState)
+	 * @see org.richfaces.renderkit.html.ColumnVisitor#visit(javax.faces.context.FacesContext, org.richfaces.component.UIScrollableGridColumn, javax.faces.context.ResponseWriter, org.richfaces.renderkit.html.ScrollableDataTableRendererState)
 	 */
 	public int visit(FacesContext context, UIComponent column,
-			ResponseWriter writer, GridRendererState state) throws IOException {
+			ResponseWriter writer, ScrollableDataTableRendererState state) throws IOException {
 		
 		if(state.isFrozenColumn()){
 			int i = state.getFrozenColumnCount();
@@ -34,5 +34,5 @@
 		return 1;
 	};
 	
-	 abstract public void renderContent(FacesContext context, UIComponent column,ResponseWriter writer, GridRendererState state) throws IOException;
+	 abstract public void renderContent(FacesContext context, UIComponent column,ResponseWriter writer, ScrollableDataTableRendererState state) throws IOException;
 }

Deleted: trunk/ui/scrollableDataTable/src/main/java/org/richfaces/renderkit/html/GridHeaderRendererBase.java
===================================================================
--- trunk/ui/scrollableDataTable/src/main/java/org/richfaces/renderkit/html/GridHeaderRendererBase.java	2007-08-16 15:23:03 UTC (rev 2298)
+++ trunk/ui/scrollableDataTable/src/main/java/org/richfaces/renderkit/html/GridHeaderRendererBase.java	2007-08-16 16:08:29 UTC (rev 2299)
@@ -1,16 +0,0 @@
-/**
- * 
- */
-package org.richfaces.renderkit.html;
-
-import org.ajax4jsf.renderkit.HeaderResourcesRendererBase;
-
-/**
- * @author Maksim Kaszynski
- *
- */
-public abstract class GridHeaderRendererBase extends HeaderResourcesRendererBase {
-
-	
-	
-}

Deleted: trunk/ui/scrollableDataTable/src/main/java/org/richfaces/renderkit/html/GridRendererState.java
===================================================================
--- trunk/ui/scrollableDataTable/src/main/java/org/richfaces/renderkit/html/GridRendererState.java	2007-08-16 15:23:03 UTC (rev 2298)
+++ trunk/ui/scrollableDataTable/src/main/java/org/richfaces/renderkit/html/GridRendererState.java	2007-08-16 16:08:29 UTC (rev 2299)
@@ -1,432 +0,0 @@
-/**
- * 
- */
-package org.richfaces.renderkit.html;
-
-import java.io.Serializable;
-import java.util.Collection;
-import java.util.HashSet;
-import java.util.Map;
-
-import javax.faces.FacesException;
-import javax.faces.component.NamingContainer;
-import javax.faces.context.FacesContext;
-import javax.faces.context.ResponseWriter;
-
-import org.ajax4jsf.context.AjaxContext;
-import org.ajax4jsf.renderkit.AjaxRendererUtils;
-import org.richfaces.component.UIScrollableGrid;
-
-/**
- * bean to store current {@link com.exadel.vcp.components.datagrid.UIDataGrid } information
- * in request map. For nested grids, it support push/pop state saving.
- * In {@link javax.faces.render.Renderer#encodeBegin(javax.faces.context.FacesContext, javax.faces.component.UIComponent)} method
- * must be created instance of this bean , or, if it already exist in request map - push information.
- * at the end of encodeEnd call, bean must be pop information or removed.
- * @author shura
- *
- */
-public class GridRendererState implements Serializable {
-	
-	public static final String DATA_GRID_RENDERER_STATE = GridRendererState.class.getName();
-	
-	private boolean fake;
-	
-	private HashSet ids = new HashSet();
-	
-	private String rowClasses[];
-	
-	private int rowClassesSize;
-	
-	private String columnClasses[];
-	
-	private int columnClassesSize;
-	
-	private int _rowIndex = 0;
-	
-	private int _cellIndex = 0;
-	
-	private int _columns = 0;
-	
-	private Collection collection;
-	
-	private Integer sepOffset;
-	
-	private String _cell_id_prefix;
-	
-	private int sumWidth = 0;
-	
-	private boolean header = false;
-	
-	private String _column_type;
-	
-	private int _frozenColumnCount = -1;
-	
-	private AjaxContext ajaxContext;
-	
-	private String part;
-	
-	private boolean _frozenPart = false;
-	
-	private ResponseWriter writer;
-	
-	private UIScrollableGrid _grid;
-	
-	private String clientId;
-	
-	private String _cachedClientId;
-	
-	private GridRendererState _previousState = null;
-	
-	private Object rowKey;
-
-	private static final long serialVersionUID = 2129605586975025578L;
-
-	
-	/**
-	 * Get current grid state from JSF context
-	 * @param context
-	 * @return current data grid state, or null if not saved.
-	 */
-	public static GridRendererState getRendererState(FacesContext context) throws FacesException {
-		if(null == context){
-			throw new NullPointerException("Context for grid state is null");
-		}
-		GridRendererState state = (GridRendererState) context.getExternalContext().getRequestMap().get(DATA_GRID_RENDERER_STATE);
-//		if( null == state){
-//			throw new FacesException("State for current grid not stored in context");
-//		}
-		return state;
-	}
-
-	/**
-	 * Create new state for current grid. If state exist, store previsius in field of created.
-	 * @param context
-	 * @param grid
-	 * @return new state for grid.
-	 */
-	public static GridRendererState createState(FacesContext context, UIScrollableGrid grid){
-		if(null == context){
-			throw new NullPointerException("Context for grid state is null");
-		}
-		GridRendererState oldState = getRendererState(context);
-		GridRendererState state = new GridRendererState(context,oldState,grid);
-		state.setColumnClasses(grid.getAttributes().get("columnClasses"));
-		state.setRowClasses(grid.getAttributes().get("rowClasses"));
-		context.getExternalContext().getRequestMap().put(DATA_GRID_RENDERER_STATE,state);
-		return state;
-	}
-	
-	/**
-	 * Restore previsius state for gred, or clear request parameter.
-	 * @param context
-	 */
-	public static void restoreState(FacesContext context) {
-		if (null == context) {
-			throw new NullPointerException("Context for grid state is null");
-		}
-		GridRendererState state = getRendererState(context);
-		if (null == state) {
-			throw new FacesException(
-					"State for current grid not saved in context");
-		}
-		GridRendererState previsiosState = state.getPreviousState();
-		if (null != previsiosState) {
-			context.getExternalContext().getRequestMap().put(DATA_GRID_RENDERER_STATE,
-					previsiosState);
-		} else {
-			context.getExternalContext().getRequestMap().remove(DATA_GRID_RENDERER_STATE);
-		}
-	}
-	/**
-	 * Create state for current grid ( and store previsios state in field ).
-	 * @param previsiosState
-	 */
-	public GridRendererState(FacesContext context, GridRendererState previsiosState, UIScrollableGrid grid) {
-		super();
-		_grid = grid;
-		_cachedClientId = grid.getClientId(context);
-		clientId = _cachedClientId;
-		_previousState = previsiosState;
-		if(AjaxRendererUtils.isAjaxRequest(context)){
-		}
-		
-		Map attrs = grid.getAttributes();
-	}
-
-	public  String getCurrentCellId(FacesContext context){
-		return getGrid().getClientId(context)+NamingContainer.SEPARATOR_CHAR+"row"+getRowIndex()+
-		NamingContainer.SEPARATOR_CHAR+"col"+getCellIndex();
-	}
-	
-	/**
-	 * @return Returns the cellIndex.
-	 */
-	public int getCellIndex() {
-		return _cellIndex;
-	}
-
-	/**
-	 * @param cellIndex The cellIndex to set.
-	 */
-	public void setCellIndex(int cellIndex) {
-		_cellIndex = cellIndex;
-	}
-	
-	/**
-	 * Increment cells counter 
-	 * @return next cell number.
-	 */
-	
-	public int nextCell(){
-		return ++_cellIndex;
-	}
-
-
-	/**
-	 * @return Returns the columns.
-	 */
-	public int getColumns() {
-		return _columns;
-	}
-
-	/**
-	 * @param columns The columns to set.
-	 */
-	public void setColumns(int columns) {
-		_columns = columns;
-	}
-
-	/**
-	 * @return Returns the grid.
-	 */
-	public UIScrollableGrid getGrid() {
-		return _grid;
-	}
-
-	/**
-	 * @param grid The grid to set.
-	 */
-	public void setGrid(UIScrollableGrid grid) {
-		_grid = grid;
-	}
-
-	/**
-	 * @return Returns the previsiosState.
-	 */
-	public GridRendererState getPreviousState() {
-		return _previousState;
-	}
-
-	/**
-	 * @param previsiosState The previsiosState to set.
-	 */
-	public void setPreviousState(GridRendererState previsiosState) {
-		_previousState = previsiosState;
-	}
-
-	/**
-	 * @return Returns the rowIndex.
-	 */
-	public int getRowIndex() {
-		if(_rowIndex >= _grid.getRows()){
-			_rowIndex = 0;
-		}	
-		return _rowIndex;
-	}
-	
-	/**
-	 * Increment current row counter.
-	 * @return new row number.
-	 */
-	public int nextRow(){
-		_rowIndex = _rowIndex + 1; 	
-		return _rowIndex;
-	}
-
-	/**
-	 * @param rowIndex The rowIndex to set.
-	 */
-	public void setRowIndex(int rowIndex) {
-		_rowIndex = rowIndex;
-	}
-
-
-	/**
-	 * @return the _cachedClientId
-	 */
-	public String getCachedClientId() {
-		return _cachedClientId;
-	}
-
-	
-	private StringBuffer buffer = new StringBuffer();
-	
-	/**
-	 * @return the buffer
-	 */
-	public StringBuffer getBuffer() {
-		buffer.setLength(0);
-		return buffer;
-	}
-	
-	/**
-	 * @return the rowKey
-	 */
-	public Object getRowKey() {
-		return rowKey;
-	}
-
-	/**
-	 * @param rowKey the rowKey to set
-	 */
-	public void setRowKey(Object rowKey) {
-		this.rowKey = rowKey;
-	}
-
-	public boolean isFrozenColumn() {
-		return _frozenColumnCount <= 0 ? false:true;
-	}
-
-	public void setFrozenColumnCount(int columnCount) {
-		_frozenColumnCount = columnCount;
-	}
-	
-	public int getFrozenColumnCount() {
-		return _frozenColumnCount;
-	}
-
-	public boolean isFrozenPart() {
-		return _frozenPart;
-	}
-
-	public void setFrozenPart(boolean part) {
-		_frozenPart = part;
-	}
-
-	public String getCellIdPrefix() {
-		return _cell_id_prefix;
-	}
-
-	public void setCellIdPrefix(String _id_prefix) {
-		this._cell_id_prefix = _id_prefix;
-	}
-	
-	public String getColumnType() {
-		return _column_type;
-	}
-
-	public void setColumType(String _column_type) {
-		this._column_type = _column_type;
-	}
-
-	public AjaxContext getAjaxContext() {
-		return ajaxContext;
-	}
-
-	public void setAjaxContext(AjaxContext ajaxContext) {
-		this.ajaxContext = ajaxContext;
-	}
-
-	public ResponseWriter getWriter() {
-		return writer;
-	}
-
-	public void setWriter(ResponseWriter writer) {
-		this.writer = writer;
-	}
-	
-	public String getClientId(){
-		return clientId;
-	}
-	
-	public void setClientId(String clientId){
-		this.clientId = clientId;
-	}
-
-	public boolean isHeader() {
-		return header;
-	}
-
-	public void setHeader(boolean header) {
-		this.header = header;
-	}
-
-	public String getPart() {
-		return part;
-	}
-
-	public void setPart(String part) {
-		this.part = part;
-	}
-
-	public int getSumWidth() {
-		return sumWidth;
-	}
-
-	public void setSumWidth(int sumWidth) {
-		this.sumWidth = sumWidth;
-	}
-
-	public Integer getSepOffset() {
-		return sepOffset;
-	}
-
-	public void setSepOffset(Integer sepOffset) {
-		this.sepOffset = sepOffset;
-	}
-
-	public Collection getCollection() {
-		return collection;
-	}
-
-	public void setCollection(Collection collection) {
-		this.collection = collection;
-	}
-
-	public boolean isFake() {
-		return fake;
-	}
-
-	public void setFake(boolean fake) {
-		this.fake = fake;
-	}
-
-	public String getColumnClass(int index) {
-		if(columnClasses != null) {
-			return columnClasses[index % columnClassesSize];
-		} else {
-			return "";
-		}
-	}
-
-	public void setColumnClasses(Object columnClasses) {
-		if(columnClasses != null) {
-			this.columnClasses = ((String)columnClasses).split(",");
-			columnClassesSize = this.columnClasses.length;
-		}
-	}	
-	
-	public String getRowClass(int index) {
-		if(rowClasses != null) {
-			return rowClasses[index % rowClassesSize];
-		} else {
-			return "";
-		}
-	}
-
-	public void setRowClasses(Object rowClasses) {
-		if(rowClasses != null) {
-			this.rowClasses = ((String)rowClasses).split(",");
-			rowClassesSize = this.rowClasses.length;
-		}
-	}
-
-	public HashSet getIds() {
-		return ids;
-	}
-
-	public void addId(String id) {
-		ids.add(id);
-	}	
-}

Deleted: trunk/ui/scrollableDataTable/src/main/java/org/richfaces/renderkit/html/GridUtils.java
===================================================================
--- trunk/ui/scrollableDataTable/src/main/java/org/richfaces/renderkit/html/GridUtils.java	2007-08-16 15:23:03 UTC (rev 2298)
+++ trunk/ui/scrollableDataTable/src/main/java/org/richfaces/renderkit/html/GridUtils.java	2007-08-16 16:08:29 UTC (rev 2299)
@@ -1,37 +0,0 @@
-/**
- * 
- */
-package org.richfaces.renderkit.html;
-
-import javax.faces.component.UIComponent;
-
-import org.richfaces.component.UIScrollableGrid;
-
-/**
- * @author Maksim Kaszynski
- *
- */
-public class GridUtils {
-	
-	public static final String FROZEN_COL_COUNT_ATTR = "frozenColCount";
-	public static final String CLIENT_ROW_KEY = "clientIndex";
-	
-	public static int getFrozenColumnsCount(UIScrollableGrid grid) {
-		return getIntOr0(grid, FROZEN_COL_COUNT_ATTR);
-	}
-	
-	public static int getClientRowIndex(UIScrollableGrid grid) {
-		return getIntOr0(grid, CLIENT_ROW_KEY);
-	}
-	
-	public static int getIntOr0(UIComponent grid, String attribute) {
-		Object value = grid.getAttributes().get(attribute);
-		int i = 0;
-		if (value instanceof Number) {
-			i = ((Number) value).intValue();
-		}
-		
-		return i;
-	}
-	
-}

Added: trunk/ui/scrollableDataTable/src/main/java/org/richfaces/renderkit/html/ScrollableDataTableBaseRenderer.java
===================================================================
--- trunk/ui/scrollableDataTable/src/main/java/org/richfaces/renderkit/html/ScrollableDataTableBaseRenderer.java	                        (rev 0)
+++ trunk/ui/scrollableDataTable/src/main/java/org/richfaces/renderkit/html/ScrollableDataTableBaseRenderer.java	2007-08-16 16:08:29 UTC (rev 2299)
@@ -0,0 +1,805 @@
+package org.richfaces.renderkit.html;
+
+import java.io.IOException;
+import java.util.Collection;
+import java.util.Iterator;
+import java.util.Map;
+
+import javax.faces.component.UIComponent;
+import javax.faces.context.ExternalContext;
+import javax.faces.context.FacesContext;
+import javax.faces.context.ResponseWriter;
+
+import org.ajax4jsf.context.AjaxContext;
+import org.ajax4jsf.javascript.JSFunction;
+import org.ajax4jsf.model.DataVisitor;
+import org.ajax4jsf.renderkit.AjaxRendererUtils;
+import org.ajax4jsf.renderkit.ComponentVariables;
+import org.ajax4jsf.renderkit.ComponentsVariableResolver;
+import org.ajax4jsf.renderkit.RendererBase;
+import org.ajax4jsf.renderkit.RendererUtils.HTML;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.richfaces.component.Column;
+import org.richfaces.component.UIScrollableDataTable;
+import org.richfaces.event.scroll.ScrollEvent;
+import org.richfaces.event.sort.SortEvent;
+import org.richfaces.model.SortField;
+import org.richfaces.model.SortOrder;
+import org.richfaces.renderkit.CompositeRenderer;
+import org.richfaces.renderkit.RendererContributor;
+import org.richfaces.utils.TemplateLoader;
+
+
+
+/**
+ * @author Anton Belevich
+ *
+ */
+
+public abstract class ScrollableDataTableBaseRenderer extends CompositeRenderer {
+	
+	public final String PARTIAL_UPDATE= "partialUpdate";
+	public final String UPDATE_HEADER = "updateHeader";
+	
+	public final String  FOOTER_PART = "footer";
+	
+	public final String  HEADER_PART = "header";
+	
+	private final String COLUMN_FROZEN_TYPE = "frozen"; 
+	
+	private final String COLUMN_NORMAL_TYPE = "normal";
+	
+	private RendererBase cellTemplate = null;
+	
+	private RendererBase headerCellTemplate = null;
+	
+	private RendererBase footerCellTemplate = null;
+	
+	private RendererBase headerItselfTemplate = null;
+
+	private final Log log = LogFactory.getLog(ScrollableDataTableBaseRenderer.class);
+	
+	private final ColumnVisitor columnsWidthCounter = new ColumnVisitor(){
+
+		public int visit(FacesContext context, UIComponent column, ResponseWriter writer, ScrollableDataTableRendererState state) throws IOException {
+			
+			int prevWidth = 0;
+			int width = 0;
+			
+			
+			String widthPx = (String)column.getAttributes().get("width");
+			prevWidth = state.getSumWidth();
+			
+			if(widthPx.endsWith("px")){
+				width = prevWidth + Integer.parseInt(widthPx.substring(0, widthPx.indexOf("px"))); 
+			}
+
+			state.setSumWidth(width);
+			return 1;
+		}
+	};
+	
+	private final ColumnVisitor colsRenderer = new ExtendedColumnVisitor(){
+
+		public void renderContent(FacesContext context, UIComponent column, ResponseWriter writer, ScrollableDataTableRendererState state) throws IOException {
+			writer.startElement("col", column);
+			getUtils().writeAttribute(writer, "width", column.getAttributes().get("width"));
+			getUtils().writeAttribute(writer, "style", column.getAttributes().get("style"));
+			int cell_index =  state.getCellIndex();
+			Object columnClass = state.getColumnClass(cell_index);
+			if(columnClass!=null) getUtils().writeAttribute(writer, "class", columnClass);
+			
+			writer.endElement("col");	
+		}
+	};
+	
+	private final ColumnVisitor headerCellRenderer = new ExtendedColumnVisitor(){
+
+		public void renderContent(FacesContext context, UIComponent column, ResponseWriter writer, ScrollableDataTableRendererState state) throws IOException {
+			
+			
+			int cell_index = state.getCellIndex();
+			String client_id = state.getClientId();
+			state.addId(column.getId());			
+			headerCellTemplate = getHeaderCellTemplate();
+			
+			ComponentVariables variables = 
+				ComponentsVariableResolver.getVariables(headerCellTemplate, column);
+			String widthPx = (String)column.getAttributes().get("width");
+			int width = Integer.parseInt(widthPx.substring(0, widthPx.indexOf("px")));
+			
+			
+			int sepOffset = 0;
+			
+			if(state.isFrozenColumn()){
+				sepOffset = state.getSepOffset().intValue() + width;
+			}else{
+				sepOffset = state.getSepOffset().intValue() + width + 1;
+				state.setSepOffset(new Integer(sepOffset));
+			}	
+			
+			variables.setVariable("client_id", client_id);
+			variables.setVariable("cell_index", new Integer(cell_index));
+			variables.setVariable("sepOffset", new Integer(sepOffset));
+						
+			headerCellTemplate.encodeBegin(context, column);
+			headerRenderer.visit(context, column, writer, state);
+			headerCellTemplate.encodeEnd(context, column);
+		}
+	};
+	
+	private final ColumnVisitor headerRenderer = new ColumnVisitor() {
+		
+		public int visit(FacesContext context, UIComponent column,
+				ResponseWriter writer, ScrollableDataTableRendererState state)
+				throws IOException {
+			
+			ComponentVariables variables = 
+				ComponentsVariableResolver.getVariables(getHeaderItselfTemplate(), column); 
+			
+			int cell_index = state.getCellIndex();
+			String client_id = state.getClientId();
+			Boolean sorting = getColumnSorting(state.getGrid(), cell_index);
+			
+			if (sorting != null) {
+				if (sorting.booleanValue()) {
+					variables.setVariable("sortAscending", Boolean.TRUE);
+				} else {
+					variables.setVariable("sortDescending", Boolean.TRUE);
+				}
+			}
+			variables.setVariable("client_id", client_id);
+			variables.setVariable("cell_index", new Integer(cell_index));
+			
+			getHeaderItselfTemplate().encodeBegin(context, column);
+			
+			UIComponent header = column.getFacet(HEADER_PART);
+			
+			if(header != null){
+				renderChild(context, header);
+			}
+			getHeaderItselfTemplate().encodeEnd(context, column);
+			
+			return 0;
+		}
+		
+		
+		private Boolean getColumnSorting(UIScrollableDataTable grid, int columnIndex) {
+
+			Boolean sorting = null; 
+
+			UIComponent column = 
+				(UIComponent) grid.getChildren().get(columnIndex);
+			
+			//TODO: replace with getName?
+			String name = column.getId();
+			
+			SortOrder sortOrder = grid.getSortOrder();
+			
+			if (sortOrder != null) {
+				SortField[] sortFields = sortOrder.getFields();
+				
+				if (sortFields != null) {
+					for (int i = 0; i < sortFields.length && sorting == null; i++) {
+						SortField sortField = sortFields[i];
+						
+						if ((name != null && name.equals(sortField.getName())) 
+								|| columnIndex == sortField.getIndex()) {
+							sorting = sortField.getAscending();
+						}
+					}
+				}
+			}
+			
+			return sorting;
+		}
+		
+	};
+	
+	private final ColumnVisitor footerCellRenderer = new ExtendedColumnVisitor(){
+
+		public void renderContent(FacesContext context, UIComponent column, ResponseWriter writer, ScrollableDataTableRendererState state) throws IOException {
+			
+			int cell_index = state.getCellIndex();
+			String client_id = state.getClientId();
+			
+			footerCellTemplate = getFooterCellTemplate();
+			
+			ComponentVariables variables = ComponentsVariableResolver.getVariables(footerCellTemplate, column);
+			variables.setVariable("client_id", client_id);
+			variables.setVariable("cell_index", new Integer(cell_index));
+			
+			
+			UIComponent component = column.getFacet(FOOTER_PART);
+			if(component != null){
+				footerCellTemplate.encodeBegin(context, column);
+				renderChild(context, component);
+				footerCellTemplate.encodeEnd(context, column);
+			} 	
+		}
+	};
+	
+	private final ColumnVisitor cellRenderer = new ExtendedColumnVisitor(){
+
+		public void renderContent(FacesContext context, UIComponent column, ResponseWriter writer, ScrollableDataTableRendererState state) throws IOException {
+			
+			String cell_id = state.getRowIndex()+ "_" + state.getCellIndex();
+			if (log.isTraceEnabled()) {
+				log.trace("cell_index: "  + cell_id);
+			}
+			
+			String client_id = state.getClientId();
+			int cell_index =  state.getCellIndex();
+			cellTemplate = getCellTemplate();
+			
+			ComponentVariables variables = ComponentsVariableResolver.getVariables(cellTemplate, column);
+			variables.setVariable("cell_id",cell_id);
+			variables.setVariable("client_id", client_id);
+			variables.setVariable("cell_index", new Integer(cell_index));
+			variables.setVariable("columnClass", state.getColumnClass(cell_index));
+					
+			cellTemplate.encodeBegin(context, column);
+			if(!state.isFake()) {
+				renderChildren(context, column);
+			}
+			cellTemplate.encodeEnd(context, column);
+		}
+		
+	};
+	
+	
+	private final DataVisitor rowsRenderer = new DataVisitor(){
+
+		public void process(FacesContext context, Object rowKey, Object argument) throws IOException {
+			
+			ScrollableDataTableRendererState state = (ScrollableDataTableRendererState)argument;
+			UIScrollableDataTable  grid = state.getGrid();
+			
+			grid.setRowKey(rowKey);
+						
+			if(grid.isRowAvailable() || state.isFake()){
+				String row_id;
+				
+				int index = state.getRowIndex();
+				
+				//state.setRowIndex(index);
+				
+				String baseClientId = grid.getBaseClientId(context);
+				
+				if(state.isFrozenPart()){
+					row_id = baseClientId + ":f:" + index;
+				}else{
+					row_id = baseClientId + ":n:" + index;
+				}
+				
+				ResponseWriter writer = context.getResponseWriter();
+				writer.startElement(HTML.TR_ELEMENT, grid);
+				state.setFrozenColumnCount(ScrollableDataTableUtils.getFrozenColumnsCount(grid));
+				getUtils().writeAttribute(writer, "id",row_id);
+				getUtils().writeAttribute(writer, "class","dr-sdt-rb rich-sdt-row" + state.getRowClass(index));
+				
+				if (log.isDebugEnabled()) {
+					log.debug("rowIndex : " + index);
+				}
+				
+				ColumnWalker.iterateOverColumns(context, grid, cellRenderer, writer, state);
+				if(!state.isFrozenPart()){
+					writer.startElement("td", grid);
+					getUtils().writeAttribute(writer, "class","dr-sdt-bc rich-sdt-row" + state.getColumnClass(state.getCellIndex()));
+					writer.endElement("td");
+				}
+				writer.endElement(HTML.TR_ELEMENT);
+				state.nextRow();
+				state.setCellIndex(0);
+				
+			}	
+		}
+	};
+		
+	private final DataVisitor ajaxRowsRenderer = new DataVisitor(){
+
+		
+		public void process(FacesContext context, Object rowKey, Object argument) throws IOException {
+			
+			int columnsCount = 0;
+			
+			boolean frozenTRRendered = false;
+			
+			boolean normalTRRendered = false;
+			
+			ScrollableDataTableRendererState state = (ScrollableDataTableRendererState)argument;
+			AjaxContext ajaxContext = state.getAjaxContext();
+			ajaxContext.getResponseData();
+			
+			UIScrollableDataTable  grid = state.getGrid();
+			Collection collection = grid.getResponseData();
+
+			grid.setRowKey(rowKey);
+			ResponseWriter writer = context.getResponseWriter();
+			state.setFrozenColumnCount(ScrollableDataTableUtils.getFrozenColumnsCount(grid));
+			
+			String row_id = null;
+			
+			
+			for (Iterator iter = grid.getChildren().iterator(); iter.hasNext(); ) {
+				UIComponent kid = (UIComponent) iter.next();
+				
+				if (kid.isRendered()) {
+					
+					if (kid instanceof Column){
+						String baseClientId = grid.getBaseClientId(context);
+						
+						if(state.isFrozenColumn() && !frozenTRRendered){
+							
+							state.setFrozenPart(true);
+							frozenTRRendered = true;
+							
+							row_id = baseClientId + ":f:" +  state.getRowIndex();
+							writer.startElement("tr", grid);
+							getUtils().writeAttribute(writer, "class","dr-sdt-rb rich-sdt-row" + state.getRowClass(state.getRowIndex()));
+							getUtils().writeAttribute(writer,"id",row_id);
+							collection.add(row_id);
+																							
+						}else if(!state.isFrozenColumn() && !normalTRRendered){
+							
+							if(frozenTRRendered){
+								writer.endElement("tr");
+							}
+							
+							state.setFrozenPart(false);
+							row_id = baseClientId + ":n:" +  state.getRowIndex();
+							
+							writer.startElement("tr", grid);
+							getUtils().writeAttribute(writer,"id",row_id);
+							getUtils().writeAttribute(writer, "class","dr-sdt-rb rich-sdt-row" + state.getRowClass(state.getRowIndex()));
+							normalTRRendered = true;
+							collection.add(row_id);
+									
+						}
+
+						columnsCount += cellRenderer.visit(context, kid, writer, state);
+//						columnsCount += cellRenderer.visit(context, column, writer, state);
+
+
+						
+						
+						state.nextCell();
+					
+					}
+				
+				}
+			
+			}
+			
+//			if(!state.isFrozenPart()){
+//				writer.startElement("td", grid);
+//				getUtils().writeAttribute(writer, "class","dr-sdt-bc " + state.getColumnClass(state.getCellIndex()));
+//				writer.endElement("td");
+//			}
+
+			writer.endElement("tr");
+			state.setCellIndex(0);
+			state.nextRow();	
+		}
+	};
+
+	
+	public ScrollableDataTableBaseRenderer() {
+		addContributor(new SelectionRendererContributor());
+	}
+
+	public static String getJavaScriptVarName(FacesContext context, UIScrollableDataTable grid) {
+		
+		String name = grid.getScriptVar();
+		if (name == null) {
+			String id = grid.getBaseClientId(context);
+			name = "Richfaces_ScrollableGrid_" + id.replaceAll("[^A-Za-z0-9_]", "_");
+		}
+		
+		return "window." + name;
+	}
+	
+	public String createClientScrollableGrid(FacesContext context, UIScrollableDataTable grid) {
+		
+		ScrollableDataTableOptions  options = new ScrollableDataTableOptions(grid);
+		
+		
+		mergeScriptOptions(options, context, grid);
+		
+		JSFunction function = new JSFunction("new ClientUI.controls.grid.ScrollableGrid");
+		function.addParameter(options);
+		return function.toScript();
+	}
+	
+	protected String getScriptContributions(FacesContext context, UIScrollableDataTable grid) {
+		return super.getScriptContributions(getJavaScriptVarName(context, grid), context, grid);
+	}
+	
+	public boolean getRendersChildren() {
+		return true;
+	}
+	
+	public void renderGridBody(FacesContext context, UIScrollableDataTable grid, boolean isFrozen) throws IOException{
+		
+		final ScrollableDataTableRendererState state = ScrollableDataTableRendererState.getRendererState(context);
+		
+		if(isFrozen){
+			state.setColumType(COLUMN_FROZEN_TYPE);
+		}else{
+			state.setColumType(COLUMN_NORMAL_TYPE);
+		}
+		
+		if (log.isTraceEnabled()) {
+			log.trace("ScrollableDataTableBaseRenderer.renderGridBody(context, grid, isFrozen)");
+		}
+		
+		state.setFrozenColumnCount(ScrollableDataTableUtils.getFrozenColumnsCount(grid));
+		state.setFrozenPart(isFrozen);
+		state.setClientId(grid.getClientId(context));
+		
+		grid.walk(context, rowsRenderer, state);
+			
+		int fakeRowsCount = grid.getRows() - grid.getRowCount();
+		state.setFake(true);
+		for (int i = 0; i < fakeRowsCount; i++) {
+			rowsRenderer.process(context, null, state);	
+		}
+		
+		state.setFake(false);
+		grid.setRowKey(null);
+	}
+	
+	public void renderHeaders(FacesContext context, UIScrollableDataTable grid, boolean isFrozen)throws IOException{
+
+		ResponseWriter writer = context.getResponseWriter();
+		final ScrollableDataTableRendererState state = ScrollableDataTableRendererState.getRendererState(context);
+		
+		if(isFrozen){
+			state.setColumType(COLUMN_FROZEN_TYPE);
+		}else{
+			state.setColumType(COLUMN_NORMAL_TYPE);
+		}
+		
+		state.setClientId(grid.getClientId(context));
+		state.setPart(HEADER_PART);
+		state.setFrozenColumnCount(ScrollableDataTableUtils.getFrozenColumnsCount(grid));
+		state.setFrozenPart(isFrozen);
+		state.setClientId(grid.getClientId(context));
+		state.setSepOffset(new Integer(0));
+		
+		ColumnWalker.iterateOverColumns(context, grid, headerCellRenderer, writer, state);
+	}
+	
+	public void renderCols(FacesContext context, UIScrollableDataTable grid, boolean isFrozen) throws IOException{
+	
+		ResponseWriter writer = context.getResponseWriter();
+		final ScrollableDataTableRendererState state = ScrollableDataTableRendererState.getRendererState(context);
+		
+		if(isFrozen){
+			state.setColumType(COLUMN_FROZEN_TYPE);
+		}else{
+			state.setColumType(COLUMN_NORMAL_TYPE);
+		}
+		
+		state.setClientId(grid.getClientId(context));
+		state.setFrozenColumnCount(ScrollableDataTableUtils.getFrozenColumnsCount(grid));
+		state.setFrozenPart(isFrozen);
+		ColumnWalker.iterateOverColumns(context, grid, colsRenderer, writer, state);
+	}
+	
+	
+	public void renderFooters(FacesContext context, UIScrollableDataTable grid, boolean isFrozen) throws IOException{
+			
+		ResponseWriter writer = context.getResponseWriter();
+		final ScrollableDataTableRendererState state = ScrollableDataTableRendererState.getRendererState(context);
+		
+		if(isFrozen){
+			state.setColumType(COLUMN_FROZEN_TYPE);
+		}else{
+			state.setColumType(COLUMN_NORMAL_TYPE);
+		}
+
+		state.setClientId(grid.getClientId(context));
+		state.setFrozenColumnCount(ScrollableDataTableUtils.getFrozenColumnsCount(grid));
+		state.setFrozenPart(isFrozen);
+		int colsCount = ColumnWalker.iterateOverColumns(context, grid, footerCellRenderer, writer, state);
+		int rowsCount = grid.getRowCount();
+		
+		ComponentVariables variables = ComponentsVariableResolver.getVariables(this, grid);
+		variables.setVariable("rows_count", new Integer(rowsCount));
+		variables.setVariable("columns_count", new Integer(colsCount));
+		
+	}
+	
+	public void setUpState(FacesContext context, UIScrollableDataTable grid) {
+		ScrollableDataTableRendererState.createState(context, grid);
+	}
+			
+	public void tearDownState(FacesContext context, UIScrollableDataTable grid){
+		ScrollableDataTableRendererState.restoreState(context);
+	}
+	
+	
+	public String getRowsAjaxUpdate(FacesContext context, UIScrollableDataTable grid){
+		
+		JSFunction function = AjaxRendererUtils.buildAjaxFunction(grid, context);
+		Map options = AjaxRendererUtils.buildEventOptions(context, grid);
+		options.put("oncomplete", AjaxFunctionBuilder.getOnComplete(context, grid, AjaxFunctionBuilder.SCROLL));
+		Map parametersMap = (Map)options.get("parameters");
+		parametersMap.put(grid.getBaseClientId(context) + ":scroll", "");
+		function.addParameter(options);
+		String completeFunction = function.toScript()+"; return false;";
+		
+		return completeFunction;
+		
+	}
+
+	
+	protected void doDecode(FacesContext context, UIComponent component) {
+		
+		super.doDecode(context, component);
+
+		component.getAttributes().remove(PARTIAL_UPDATE);
+		component.getAttributes().remove(UPDATE_HEADER);
+		
+
+		AjaxContext ajaxContext = AjaxContext.getCurrentInstance(context);
+		
+		if(component instanceof UIScrollableDataTable){
+		
+			UIScrollableDataTable grid = (UIScrollableDataTable)component;
+			ExternalContext externalContext = context.getExternalContext();
+			String clientId = grid.getClientId(context);
+			boolean sorted = false;	
+			Map parameters = externalContext.getRequestParameterMap();
+			
+			String s_id = clientId + ":si";
+			if(parameters.containsKey(s_id)){
+				String options = (String)parameters.get(s_id);
+				grid.setScrollPos(options);
+			}
+					
+			
+			if(parameters.containsKey(clientId + ":sortColumn") &&
+			   parameters.containsKey(clientId + ":sortStartRow") && 
+			   parameters.containsKey(clientId + ":sortIndex") && 
+			   parameters.containsKey(clientId + ":sortOrder")){ 
+				
+				int sortColumn = Integer.parseInt((String)parameters.get(clientId + ":sortColumn"));
+				int sortDataIndex = Integer.parseInt((String)parameters.get(clientId + ":sortIndex"));
+				Integer sortStartRow = Integer.valueOf((String)parameters.get(clientId + ":sortStartRow"));
+				
+				Column column = (Column)grid.getChildren().get(sortColumn);
+				
+				if(column.isSortable()){
+			
+					sorted = true;
+					SortEvent sortEvent = new SortEvent(grid,sortColumn, grid.getRows(), sortDataIndex);
+					
+					sortEvent.setAttribute(ScrollableDataTableUtils.CLIENT_ROW_KEY,sortStartRow);
+					
+					if (ajaxContext.isAjaxRequest()) {
+						sortEvent.setAttribute(PARTIAL_UPDATE, Boolean.TRUE);
+						sortEvent.setAttribute(UPDATE_HEADER, Boolean.TRUE);
+					}
+					
+					
+					sortEvent.queue();
+				}	
+			}
+			
+			
+			if(parameters.containsKey(clientId + ":scroll") && !sorted){
+					
+					String submitedState = (String)parameters.get(clientId + "_state_input");
+					boolean isEmpty = true;
+					
+					
+					String [] values = submitedState.split(",");
+					for (int i = 0; i < values.length; i++) {
+						isEmpty = isEmpty && values[i].equals(""); 
+					}
+					
+					int rows = 0;
+					int first = 0;
+					
+					if(!isEmpty){
+						rows = Integer.parseInt(values[0]);
+						first = Integer.parseInt(values[1]);
+						ScrollEvent scrollEvent = new ScrollEvent(grid,rows,first);
+
+						scrollEvent.setAttribute(ScrollableDataTableUtils.CLIENT_ROW_KEY,Integer.valueOf(values[2]));						
+						
+						if (ajaxContext.isAjaxRequest()) {
+							scrollEvent.setAttribute(PARTIAL_UPDATE, Boolean.TRUE);
+						}
+
+						scrollEvent.queue();
+						
+					}						
+			}
+			
+			
+		}
+		
+		
+	}
+	
+	public void renderAjaxChildren(FacesContext context, UIComponent component)throws IOException{
+		
+		UIScrollableDataTable grid = (UIScrollableDataTable)component;
+		
+		
+		
+		ScrollableDataTableRendererState state = ScrollableDataTableRendererState.createState(context, grid);
+				
+		AjaxContext ajaxContext = AjaxContext.getCurrentInstance(context);
+		String client_id = grid.getClientId(context);
+		
+		state.setClientId(client_id);
+		state.setAjaxContext(ajaxContext);
+		state.setRowIndex(ScrollableDataTableUtils.getClientRowIndex(grid));
+		
+		if (log.isDebugEnabled()) {
+			log.debug("ScrollableDataTableBaseRenderer.renderAjaxChildren()");
+		}
+		
+		grid.getResponseData().clear();
+		
+		ResponseWriter writer = context.getResponseWriter();
+		writer.startElement("table", grid);
+		writer.startElement("tbody", grid);
+		
+		grid.walk(context, ajaxRowsRenderer, state);
+		
+		writer.endElement("tbody");
+		writer.endElement("table");
+		
+		ScrollableDataTableRendererState.restoreState(context);
+		grid.setRowKey(null);
+		
+		ajaxContext.setResponseData(grid.getResponseData());
+		
+		ajaxContext.getAjaxRenderedAreas().remove(grid.getClientId(context));
+		ScrollableDataTableScrollData options = createOptions(grid);
+		ajaxContext.getResponseDataMap().put("options", options);
+		
+		//Then call contributors to write additional HTML content
+		contributorsEncodeHere(context, grid);
+	
+		if (shouldUpdateHeader(component)) {
+			ColumnWalker.iterateOverColumns(context, component, headerRenderer, writer, new ScrollableDataTableRendererState(context, null, grid));
+		}
+		
+	
+	}
+	
+	private ScrollableDataTableScrollData createOptions(UIScrollableDataTable grid){
+		
+		int index = grid.getFirst();
+		int startRow = ScrollableDataTableUtils.getClientRowIndex(grid);
+		int count = grid.getRows();
+		
+		ScrollableDataTableScrollData options = new ScrollableDataTableScrollData(index, startRow, count);
+				
+		return options;
+	}
+	
+	private boolean onlyPartialUpdateNeeded(UIComponent grid) {
+		Boolean b = (Boolean) grid.getAttributes().get(PARTIAL_UPDATE);
+		return b != null && b.booleanValue() && AjaxContext.getCurrentInstance().isAjaxRequest();
+	}
+
+	private boolean shouldUpdateHeader(UIComponent grid) {
+		Boolean b = (Boolean) grid.getAttributes().get(UPDATE_HEADER);
+		return b != null && b.booleanValue() && AjaxContext.getCurrentInstance().isAjaxRequest();
+	}
+	
+	public void encodeChildren(FacesContext context, UIComponent component
+								 )	throws IOException {
+		
+		if(onlyPartialUpdateNeeded(component)){
+			renderAjaxChildren(context, component);
+		}else{
+			super.encodeChildren(context, component);
+		}
+		
+	}
+	
+	public void encodeBegin(FacesContext context, UIComponent component) throws IOException {
+		
+		if(component instanceof UIScrollableDataTable){
+			UIScrollableDataTable grid = (UIScrollableDataTable)component;
+			setUpState(context, grid);
+		}
+		
+		if(!onlyPartialUpdateNeeded(component)){
+			super.encodeBegin(context, component);
+		}
+	}
+	
+	public void encodeEnd(FacesContext context, UIComponent component) throws IOException {
+		
+		if(component instanceof UIScrollableDataTable){
+			
+			if(!onlyPartialUpdateNeeded(component)){
+				super.encodeEnd(context, component);
+			}	
+		}
+	}
+	
+	public void setUpColumnsWidth(FacesContext context, UIScrollableDataTable grid) throws IOException{
+		ScrollableDataTableRendererState state = ScrollableDataTableRendererState.getRendererState(context);
+		state.setFrozenColumnCount(ScrollableDataTableUtils.getFrozenColumnsCount(grid));
+		ColumnWalker.iterateOverColumns(context, grid, columnsWidthCounter, null, state);		
+		ComponentVariables variables = ComponentsVariableResolver.getVariables(this, grid);
+		int sumWidth = state.getSumWidth() + 200;
+		variables.setVariable("sumWidth", new Integer(sumWidth));
+	}
+
+	private	RendererBase getCellTemplate() {
+		if (cellTemplate == null) {
+			cellTemplate = TemplateLoader.loadTemplate("org.richfaces.renderkit.html.ScrollableDataTableCellRenderer");
+		}
+		return cellTemplate;
+	}
+	
+	private	RendererBase getHeaderCellTemplate() {
+		
+		if (headerCellTemplate == null) {
+			headerCellTemplate = TemplateLoader.loadTemplate("org.richfaces.renderkit.html.ScrollableDataTableHeaderCellRenderer");
+		}
+		return headerCellTemplate;
+	}
+	
+	private	RendererBase getFooterCellTemplate() {
+		
+		if (footerCellTemplate == null) {
+			footerCellTemplate = TemplateLoader.loadTemplate("org.richfaces.renderkit.html.ScrollableDataTableFooterCellRenderer");
+		}
+		return footerCellTemplate;
+	}
+	
+	
+	
+	private RendererBase getHeaderItselfTemplate() {
+		
+		if (headerItselfTemplate == null) {
+			headerItselfTemplate = TemplateLoader.loadTemplate("org.richfaces.renderkit.html.ScrollableDataTableHeaderItselfRenderer");
+		}
+		
+		return headerItselfTemplate;
+	}
+
+
+	public void renderHiddenScrollInput(FacesContext context, UIScrollableDataTable grid) throws IOException{
+		
+		ResponseWriter writer = context.getResponseWriter();
+		String id = grid.getClientId(context) + ":si";
+		writer.startElement("input", grid);
+
+		getUtils().writeAttribute(writer, "type", "hidden");
+		getUtils().writeAttribute(writer, "name", id);
+		getUtils().writeAttribute(writer, "id", id);
+		getUtils().writeAttribute(writer, "value", grid.getScrollPos());
+		
+		writer.endElement("input");
+		
+	}
+	
+	public void contributorsEncodeHere(FacesContext context, UIScrollableDataTable grid) throws IOException {
+		RendererContributor [] contribs = getContributors();
+		
+		if (contribs != null) {
+			for (int i = 0; i < contribs.length; i++) {
+				RendererContributor rendererContributor = contribs[i];
+				
+				if (rendererContributor instanceof HTMLEncodingContributor) {
+					((HTMLEncodingContributor) rendererContributor).encode(context, grid);
+				}
+			}
+		}
+	}
+	
+}

Added: trunk/ui/scrollableDataTable/src/main/java/org/richfaces/renderkit/html/ScrollableDataTableHeaderRendererBase.java
===================================================================
--- trunk/ui/scrollableDataTable/src/main/java/org/richfaces/renderkit/html/ScrollableDataTableHeaderRendererBase.java	                        (rev 0)
+++ trunk/ui/scrollableDataTable/src/main/java/org/richfaces/renderkit/html/ScrollableDataTableHeaderRendererBase.java	2007-08-16 16:08:29 UTC (rev 2299)
@@ -0,0 +1,16 @@
+/**
+ * 
+ */
+package org.richfaces.renderkit.html;
+
+import org.ajax4jsf.renderkit.HeaderResourcesRendererBase;
+
+/**
+ * @author Maksim Kaszynski
+ *
+ */
+public abstract class ScrollableDataTableHeaderRendererBase extends HeaderResourcesRendererBase {
+
+	
+	
+}

Added: trunk/ui/scrollableDataTable/src/main/java/org/richfaces/renderkit/html/ScrollableDataTableOptions.java
===================================================================
--- trunk/ui/scrollableDataTable/src/main/java/org/richfaces/renderkit/html/ScrollableDataTableOptions.java	                        (rev 0)
+++ trunk/ui/scrollableDataTable/src/main/java/org/richfaces/renderkit/html/ScrollableDataTableOptions.java	2007-08-16 16:08:29 UTC (rev 2299)
@@ -0,0 +1,97 @@
+/**
+ * License Agreement.
+ *
+ *  JBoss RichFaces 3.0 - Ajax4jsf Component Library
+ *
+ * Copyright (C) 2007  Exadel, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License version 2.1 as published by the Free Software Foundation.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301  USA
+ */
+
+package org.richfaces.renderkit.html;
+
+import java.util.Map;
+
+import javax.faces.component.UIComponent;
+import javax.faces.context.FacesContext;
+
+import org.ajax4jsf.javascript.JSFunction;
+import org.ajax4jsf.javascript.JSFunctionDefinition;
+import org.ajax4jsf.javascript.JSReference;
+import org.ajax4jsf.renderkit.AjaxRendererUtils;
+import org.richfaces.component.UIScrollableDataTable;
+import org.richfaces.renderkit.ScriptOptions;
+
+public class ScrollableDataTableOptions extends ScriptOptions {
+
+	public ScrollableDataTableOptions(UIScrollableDataTable grid) {
+		super(grid);
+		FacesContext context = FacesContext.getCurrentInstance();
+		
+		String id = grid.getBaseClientId(context);
+		
+		addOption("client_id", id);
+		
+		if(grid.getFacets().containsKey("splash")){
+			UIComponent splash = grid.getFacet("splash");
+			String splash_id = splash.getClientId(context);
+			addOption("splash_id", splash_id);
+		}
+		
+		int columnCount = grid.getChildCount();
+		
+		addOption("columnsCount", new Integer(columnCount));
+		addOption("rowsCount", new Integer(grid.getRows()));
+		addEventHandler("onselectionchange");
+		addOption("ids", ScrollableDataTableRendererState.getRendererState(context).getIds());
+		addOption("hideWhenScrolling");
+		
+		
+		JSFunctionDefinition functionDefinition = new JSFunctionDefinition();
+		
+		JSReference sortEvent = new JSReference("event");
+		functionDefinition.addParameter(sortEvent);
+		functionDefinition.addToBody(onSortAjaxUpdate(context, grid));
+		
+		addOption("onSortAjaxUpdate", functionDefinition);	
+		
+	}
+	
+	public String onSortAjaxUpdate(FacesContext context, UIScrollableDataTable grid){
+		
+		JSReference sortColumn = new JSReference("event.column");
+		JSReference sortOrder = new JSReference("event.order");
+		JSReference sortStartRow = new JSReference("event.startRow");
+		JSReference sortIndex = new JSReference("event.index");
+		
+		Map options = AjaxRendererUtils.buildEventOptions(context, grid);
+		
+		Map parametersMap = (Map)options.get("parameters");
+		String id = grid.getClientId(context);
+		parametersMap.put(id + ":sortColumn", sortColumn);
+		parametersMap.put(id + ":sortOrder", sortOrder);
+		parametersMap.put(id + ":sortStartRow", sortStartRow);
+		parametersMap.put(id + ":sortIndex", sortIndex);
+		options.put("parameters", parametersMap);
+		
+		JSFunction function = AjaxRendererUtils.buildAjaxFunction(grid, context);
+		options.put("oncomplete", AjaxFunctionBuilder.getOnComplete(context, grid, AjaxFunctionBuilder.SORT));
+		function.addParameter(options);
+		String completeFunction = function.toScript() + "; return false;";
+		
+		return completeFunction;
+	}
+
+	
+}
\ No newline at end of file

Added: trunk/ui/scrollableDataTable/src/main/java/org/richfaces/renderkit/html/ScrollableDataTableRendererState.java
===================================================================
--- trunk/ui/scrollableDataTable/src/main/java/org/richfaces/renderkit/html/ScrollableDataTableRendererState.java	                        (rev 0)
+++ trunk/ui/scrollableDataTable/src/main/java/org/richfaces/renderkit/html/ScrollableDataTableRendererState.java	2007-08-16 16:08:29 UTC (rev 2299)
@@ -0,0 +1,432 @@
+/**
+ * 
+ */
+package org.richfaces.renderkit.html;
+
+import java.io.Serializable;
+import java.util.Collection;
+import java.util.HashSet;
+import java.util.Map;
+
+import javax.faces.FacesException;
+import javax.faces.component.NamingContainer;
+import javax.faces.context.FacesContext;
+import javax.faces.context.ResponseWriter;
+
+import org.ajax4jsf.context.AjaxContext;
+import org.ajax4jsf.renderkit.AjaxRendererUtils;
+import org.richfaces.component.UIScrollableDataTable;
+
+/**
+ * bean to store current {@link com.exadel.vcp.components.datagrid.UIDataGrid } information
+ * in request map. For nested grids, it support push/pop state saving.
+ * In {@link javax.faces.render.Renderer#encodeBegin(javax.faces.context.FacesContext, javax.faces.component.UIComponent)} method
+ * must be created instance of this bean , or, if it already exist in request map - push information.
+ * at the end of encodeEnd call, bean must be pop information or removed.
+ * @author shura
+ *
+ */
+public class ScrollableDataTableRendererState implements Serializable {
+	
+	public static final String DATA_GRID_RENDERER_STATE = ScrollableDataTableRendererState.class.getName();
+	
+	private boolean fake;
+	
+	private HashSet ids = new HashSet();
+	
+	private String rowClasses[];
+	
+	private int rowClassesSize;
+	
+	private String columnClasses[];
+	
+	private int columnClassesSize;
+	
+	private int _rowIndex = 0;
+	
+	private int _cellIndex = 0;
+	
+	private int _columns = 0;
+	
+	private Collection collection;
+	
+	private Integer sepOffset;
+	
+	private String _cell_id_prefix;
+	
+	private int sumWidth = 0;
+	
+	private boolean header = false;
+	
+	private String _column_type;
+	
+	private int _frozenColumnCount = -1;
+	
+	private AjaxContext ajaxContext;
+	
+	private String part;
+	
+	private boolean _frozenPart = false;
+	
+	private ResponseWriter writer;
+	
+	private UIScrollableDataTable _grid;
+	
+	private String clientId;
+	
+	private String _cachedClientId;
+	
+	private ScrollableDataTableRendererState _previousState = null;
+	
+	private Object rowKey;
+
+	private static final long serialVersionUID = 2129605586975025578L;
+
+	
+	/**
+	 * Get current grid state from JSF context
+	 * @param context
+	 * @return current data grid state, or null if not saved.
+	 */
+	public static ScrollableDataTableRendererState getRendererState(FacesContext context) throws FacesException {
+		if(null == context){
+			throw new NullPointerException("Context for grid state is null");
+		}
+		ScrollableDataTableRendererState state = (ScrollableDataTableRendererState) context.getExternalContext().getRequestMap().get(DATA_GRID_RENDERER_STATE);
+//		if( null == state){
+//			throw new FacesException("State for current grid not stored in context");
+//		}
+		return state;
+	}
+
+	/**
+	 * Create new state for current grid. If state exist, store previsius in field of created.
+	 * @param context
+	 * @param grid
+	 * @return new state for grid.
+	 */
+	public static ScrollableDataTableRendererState createState(FacesContext context, UIScrollableDataTable grid){
+		if(null == context){
+			throw new NullPointerException("Context for grid state is null");
+		}
+		ScrollableDataTableRendererState oldState = getRendererState(context);
+		ScrollableDataTableRendererState state = new ScrollableDataTableRendererState(context,oldState,grid);
+		state.setColumnClasses(grid.getAttributes().get("columnClasses"));
+		state.setRowClasses(grid.getAttributes().get("rowClasses"));
+		context.getExternalContext().getRequestMap().put(DATA_GRID_RENDERER_STATE,state);
+		return state;
+	}
+	
+	/**
+	 * Restore previsius state for gred, or clear request parameter.
+	 * @param context
+	 */
+	public static void restoreState(FacesContext context) {
+		if (null == context) {
+			throw new NullPointerException("Context for grid state is null");
+		}
+		ScrollableDataTableRendererState state = getRendererState(context);
+		if (null == state) {
+			throw new FacesException(
+					"State for current grid not saved in context");
+		}
+		ScrollableDataTableRendererState previsiosState = state.getPreviousState();
+		if (null != previsiosState) {
+			context.getExternalContext().getRequestMap().put(DATA_GRID_RENDERER_STATE,
+					previsiosState);
+		} else {
+			context.getExternalContext().getRequestMap().remove(DATA_GRID_RENDERER_STATE);
+		}
+	}
+	/**
+	 * Create state for current grid ( and store previsios state in field ).
+	 * @param previsiosState
+	 */
+	public ScrollableDataTableRendererState(FacesContext context, ScrollableDataTableRendererState previsiosState, UIScrollableDataTable grid) {
+		super();
+		_grid = grid;
+		_cachedClientId = grid.getClientId(context);
+		clientId = _cachedClientId;
+		_previousState = previsiosState;
+		if(AjaxRendererUtils.isAjaxRequest(context)){
+		}
+		
+		Map attrs = grid.getAttributes();
+	}
+
+	public  String getCurrentCellId(FacesContext context){
+		return getGrid().getClientId(context)+NamingContainer.SEPARATOR_CHAR+"row"+getRowIndex()+
+		NamingContainer.SEPARATOR_CHAR+"col"+getCellIndex();
+	}
+	
+	/**
+	 * @return Returns the cellIndex.
+	 */
+	public int getCellIndex() {
+		return _cellIndex;
+	}
+
+	/**
+	 * @param cellIndex The cellIndex to set.
+	 */
+	public void setCellIndex(int cellIndex) {
+		_cellIndex = cellIndex;
+	}
+	
+	/**
+	 * Increment cells counter 
+	 * @return next cell number.
+	 */
+	
+	public int nextCell(){
+		return ++_cellIndex;
+	}
+
+
+	/**
+	 * @return Returns the columns.
+	 */
+	public int getColumns() {
+		return _columns;
+	}
+
+	/**
+	 * @param columns The columns to set.
+	 */
+	public void setColumns(int columns) {
+		_columns = columns;
+	}
+
+	/**
+	 * @return Returns the grid.
+	 */
+	public UIScrollableDataTable getGrid() {
+		return _grid;
+	}
+
+	/**
+	 * @param grid The grid to set.
+	 */
+	public void setGrid(UIScrollableDataTable grid) {
+		_grid = grid;
+	}
+
+	/**
+	 * @return Returns the previsiosState.
+	 */
+	public ScrollableDataTableRendererState getPreviousState() {
+		return _previousState;
+	}
+
+	/**
+	 * @param previsiosState The previsiosState to set.
+	 */
+	public void setPreviousState(ScrollableDataTableRendererState previsiosState) {
+		_previousState = previsiosState;
+	}
+
+	/**
+	 * @return Returns the rowIndex.
+	 */
+	public int getRowIndex() {
+		if(_rowIndex >= _grid.getRows()){
+			_rowIndex = 0;
+		}	
+		return _rowIndex;
+	}
+	
+	/**
+	 * Increment current row counter.
+	 * @return new row number.
+	 */
+	public int nextRow(){
+		_rowIndex = _rowIndex + 1; 	
+		return _rowIndex;
+	}
+
+	/**
+	 * @param rowIndex The rowIndex to set.
+	 */
+	public void setRowIndex(int rowIndex) {
+		_rowIndex = rowIndex;
+	}
+
+
+	/**
+	 * @return the _cachedClientId
+	 */
+	public String getCachedClientId() {
+		return _cachedClientId;
+	}
+
+	
+	private StringBuffer buffer = new StringBuffer();
+	
+	/**
+	 * @return the buffer
+	 */
+	public StringBuffer getBuffer() {
+		buffer.setLength(0);
+		return buffer;
+	}
+	
+	/**
+	 * @return the rowKey
+	 */
+	public Object getRowKey() {
+		return rowKey;
+	}
+
+	/**
+	 * @param rowKey the rowKey to set
+	 */
+	public void setRowKey(Object rowKey) {
+		this.rowKey = rowKey;
+	}
+
+	public boolean isFrozenColumn() {
+		return _frozenColumnCount <= 0 ? false:true;
+	}
+
+	public void setFrozenColumnCount(int columnCount) {
+		_frozenColumnCount = columnCount;
+	}
+	
+	public int getFrozenColumnCount() {
+		return _frozenColumnCount;
+	}
+
+	public boolean isFrozenPart() {
+		return _frozenPart;
+	}
+
+	public void setFrozenPart(boolean part) {
+		_frozenPart = part;
+	}
+
+	public String getCellIdPrefix() {
+		return _cell_id_prefix;
+	}
+
+	public void setCellIdPrefix(String _id_prefix) {
+		this._cell_id_prefix = _id_prefix;
+	}
+	
+	public String getColumnType() {
+		return _column_type;
+	}
+
+	public void setColumType(String _column_type) {
+		this._column_type = _column_type;
+	}
+
+	public AjaxContext getAjaxContext() {
+		return ajaxContext;
+	}
+
+	public void setAjaxContext(AjaxContext ajaxContext) {
+		this.ajaxContext = ajaxContext;
+	}
+
+	public ResponseWriter getWriter() {
+		return writer;
+	}
+
+	public void setWriter(ResponseWriter writer) {
+		this.writer = writer;
+	}
+	
+	public String getClientId(){
+		return clientId;
+	}
+	
+	public void setClientId(String clientId){
+		this.clientId = clientId;
+	}
+
+	public boolean isHeader() {
+		return header;
+	}
+
+	public void setHeader(boolean header) {
+		this.header = header;
+	}
+
+	public String getPart() {
+		return part;
+	}
+
+	public void setPart(String part) {
+		this.part = part;
+	}
+
+	public int getSumWidth() {
+		return sumWidth;
+	}
+
+	public void setSumWidth(int sumWidth) {
+		this.sumWidth = sumWidth;
+	}
+
+	public Integer getSepOffset() {
+		return sepOffset;
+	}
+
+	public void setSepOffset(Integer sepOffset) {
+		this.sepOffset = sepOffset;
+	}
+
+	public Collection getCollection() {
+		return collection;
+	}
+
+	public void setCollection(Collection collection) {
+		this.collection = collection;
+	}
+
+	public boolean isFake() {
+		return fake;
+	}
+
+	public void setFake(boolean fake) {
+		this.fake = fake;
+	}
+
+	public String getColumnClass(int index) {
+		if(columnClasses != null) {
+			return columnClasses[index % columnClassesSize];
+		} else {
+			return "";
+		}
+	}
+
+	public void setColumnClasses(Object columnClasses) {
+		if(columnClasses != null) {
+			this.columnClasses = ((String)columnClasses).split(",");
+			columnClassesSize = this.columnClasses.length;
+		}
+	}	
+	
+	public String getRowClass(int index) {
+		if(rowClasses != null) {
+			return rowClasses[index % rowClassesSize];
+		} else {
+			return "";
+		}
+	}
+
+	public void setRowClasses(Object rowClasses) {
+		if(rowClasses != null) {
+			this.rowClasses = ((String)rowClasses).split(",");
+			rowClassesSize = this.rowClasses.length;
+		}
+	}
+
+	public HashSet getIds() {
+		return ids;
+	}
+
+	public void addId(String id) {
+		ids.add(id);
+	}	
+}

Added: trunk/ui/scrollableDataTable/src/main/java/org/richfaces/renderkit/html/ScrollableDataTableScrollData.java
===================================================================
--- trunk/ui/scrollableDataTable/src/main/java/org/richfaces/renderkit/html/ScrollableDataTableScrollData.java	                        (rev 0)
+++ trunk/ui/scrollableDataTable/src/main/java/org/richfaces/renderkit/html/ScrollableDataTableScrollData.java	2007-08-16 16:08:29 UTC (rev 2299)
@@ -0,0 +1,52 @@
+/**
+ * 
+ */
+package org.richfaces.renderkit.html;
+
+/**
+ * @author Anton Belevich
+ * Class for storing response options  
+ */
+public class ScrollableDataTableScrollData {
+	
+	private int index;
+	
+	private int startRow;
+	
+	private int count;
+
+	
+	
+	public ScrollableDataTableScrollData(int index, int startRow, int count) {
+		
+		this.index = index;
+		
+		this.startRow = startRow;
+		
+		this.count = count;
+	}
+
+	public int getCount() {
+		return count;
+	}
+
+	public void setCount(int count) {
+		this.count = count;
+	}
+
+	public int getIndex() {
+		return index;
+	}
+
+	public void setIndex(int index) {
+		this.index = index;
+	}
+
+	public int getStartRow() {
+		return startRow;
+	}
+
+	public void setStartRow(int startRow) {
+		this.startRow = startRow;
+	}
+}

Added: trunk/ui/scrollableDataTable/src/main/java/org/richfaces/renderkit/html/ScrollableDataTableUtils.java
===================================================================
--- trunk/ui/scrollableDataTable/src/main/java/org/richfaces/renderkit/html/ScrollableDataTableUtils.java	                        (rev 0)
+++ trunk/ui/scrollableDataTable/src/main/java/org/richfaces/renderkit/html/ScrollableDataTableUtils.java	2007-08-16 16:08:29 UTC (rev 2299)
@@ -0,0 +1,37 @@
+/**
+ * 
+ */
+package org.richfaces.renderkit.html;
+
+import javax.faces.component.UIComponent;
+
+import org.richfaces.component.UIScrollableDataTable;
+
+/**
+ * @author Maksim Kaszynski
+ *
+ */
+public class ScrollableDataTableUtils {
+	
+	public static final String FROZEN_COL_COUNT_ATTR = "frozenColCount";
+	public static final String CLIENT_ROW_KEY = "clientIndex";
+	
+	public static int getFrozenColumnsCount(UIScrollableDataTable grid) {
+		return getIntOr0(grid, FROZEN_COL_COUNT_ATTR);
+	}
+	
+	public static int getClientRowIndex(UIScrollableDataTable grid) {
+		return getIntOr0(grid, CLIENT_ROW_KEY);
+	}
+	
+	public static int getIntOr0(UIComponent grid, String attribute) {
+		Object value = grid.getAttributes().get(attribute);
+		int i = 0;
+		if (value instanceof Number) {
+			i = ((Number) value).intValue();
+		}
+		
+		return i;
+	}
+	
+}

Deleted: trunk/ui/scrollableDataTable/src/main/java/org/richfaces/renderkit/html/ScrollableGridBaseRenderer.java
===================================================================
--- trunk/ui/scrollableDataTable/src/main/java/org/richfaces/renderkit/html/ScrollableGridBaseRenderer.java	2007-08-16 15:23:03 UTC (rev 2298)
+++ trunk/ui/scrollableDataTable/src/main/java/org/richfaces/renderkit/html/ScrollableGridBaseRenderer.java	2007-08-16 16:08:29 UTC (rev 2299)
@@ -1,806 +0,0 @@
-package org.richfaces.renderkit.html;
-
-import java.io.IOException;
-import java.util.Collection;
-import java.util.Iterator;
-import java.util.Map;
-
-import javax.faces.component.UIComponent;
-import javax.faces.context.ExternalContext;
-import javax.faces.context.FacesContext;
-import javax.faces.context.ResponseWriter;
-
-import org.ajax4jsf.context.AjaxContext;
-import org.ajax4jsf.javascript.JSFunction;
-import org.ajax4jsf.model.DataVisitor;
-import org.ajax4jsf.renderkit.AjaxRendererUtils;
-import org.ajax4jsf.renderkit.ComponentVariables;
-import org.ajax4jsf.renderkit.ComponentsVariableResolver;
-import org.ajax4jsf.renderkit.RendererBase;
-import org.ajax4jsf.renderkit.RendererUtils.HTML;
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
-import org.richfaces.component.Column;
-import org.richfaces.component.UIScrollableGrid;
-import org.richfaces.event.scroll.ScrollEvent;
-import org.richfaces.event.sort.SortEvent;
-import org.richfaces.model.SortField;
-import org.richfaces.model.SortOrder;
-import org.richfaces.renderkit.CompositeRenderer;
-import org.richfaces.renderkit.RendererContributor;
-import org.richfaces.renderkit.html.response.GridScrollSettings;
-import org.richfaces.utils.TemplateLoader;
-
-
-
-/**
- * @author Anton Belevich
- *
- */
-
-public abstract class ScrollableGridBaseRenderer extends CompositeRenderer {
-	
-	public final String PARTIAL_UPDATE= "partialUpdate";
-	public final String UPDATE_HEADER = "updateHeader";
-	
-	public final String  FOOTER_PART = "footer";
-	
-	public final String  HEADER_PART = "header";
-	
-	private final String COLUMN_FROZEN_TYPE = "frozen"; 
-	
-	private final String COLUMN_NORMAL_TYPE = "normal";
-	
-	private RendererBase cellTemplate = null;
-	
-	private RendererBase headerCellTemplate = null;
-	
-	private RendererBase footerCellTemplate = null;
-	
-	private RendererBase headerItselfTemplate = null;
-
-	private final Log log = LogFactory.getLog(ScrollableGridBaseRenderer.class);
-	
-	private final ColumnVisitor columnsWidthCounter = new ColumnVisitor(){
-
-		public int visit(FacesContext context, UIComponent column, ResponseWriter writer, GridRendererState state) throws IOException {
-			
-			int prevWidth = 0;
-			int width = 0;
-			
-			
-			String widthPx = (String)column.getAttributes().get("width");
-			prevWidth = state.getSumWidth();
-			
-			if(widthPx.endsWith("px")){
-				width = prevWidth + Integer.parseInt(widthPx.substring(0, widthPx.indexOf("px"))); 
-			}
-
-			state.setSumWidth(width);
-			return 1;
-		}
-	};
-	
-	private final ColumnVisitor colsRenderer = new ExtendedColumnVisitor(){
-
-		public void renderContent(FacesContext context, UIComponent column, ResponseWriter writer, GridRendererState state) throws IOException {
-			writer.startElement("col", column);
-			getUtils().writeAttribute(writer, "width", column.getAttributes().get("width"));
-			getUtils().writeAttribute(writer, "style", column.getAttributes().get("style"));
-			int cell_index =  state.getCellIndex();
-			Object columnClass = state.getColumnClass(cell_index);
-			if(columnClass!=null) getUtils().writeAttribute(writer, "class", columnClass);
-			
-			writer.endElement("col");	
-		}
-	};
-	
-	private final ColumnVisitor headerCellRenderer = new ExtendedColumnVisitor(){
-
-		public void renderContent(FacesContext context, UIComponent column, ResponseWriter writer, GridRendererState state) throws IOException {
-			
-			
-			int cell_index = state.getCellIndex();
-			String client_id = state.getClientId();
-			state.addId(column.getId());			
-			headerCellTemplate = getHeaderCellTemplate();
-			
-			ComponentVariables variables = 
-				ComponentsVariableResolver.getVariables(headerCellTemplate, column);
-			String widthPx = (String)column.getAttributes().get("width");
-			int width = Integer.parseInt(widthPx.substring(0, widthPx.indexOf("px")));
-			
-			
-			int sepOffset = 0;
-			
-			if(state.isFrozenColumn()){
-				sepOffset = state.getSepOffset().intValue() + width;
-			}else{
-				sepOffset = state.getSepOffset().intValue() + width + 1;
-				state.setSepOffset(new Integer(sepOffset));
-			}	
-			
-			variables.setVariable("client_id", client_id);
-			variables.setVariable("cell_index", new Integer(cell_index));
-			variables.setVariable("sepOffset", new Integer(sepOffset));
-						
-			headerCellTemplate.encodeBegin(context, column);
-			headerRenderer.visit(context, column, writer, state);
-			headerCellTemplate.encodeEnd(context, column);
-		}
-	};
-	
-	private final ColumnVisitor headerRenderer = new ColumnVisitor() {
-		
-		public int visit(FacesContext context, UIComponent column,
-				ResponseWriter writer, GridRendererState state)
-				throws IOException {
-			
-			ComponentVariables variables = 
-				ComponentsVariableResolver.getVariables(getHeaderItselfTemplate(), column); 
-			
-			int cell_index = state.getCellIndex();
-			String client_id = state.getClientId();
-			Boolean sorting = getColumnSorting(state.getGrid(), cell_index);
-			
-			if (sorting != null) {
-				if (sorting.booleanValue()) {
-					variables.setVariable("sortAscending", Boolean.TRUE);
-				} else {
-					variables.setVariable("sortDescending", Boolean.TRUE);
-				}
-			}
-			variables.setVariable("client_id", client_id);
-			variables.setVariable("cell_index", new Integer(cell_index));
-			
-			getHeaderItselfTemplate().encodeBegin(context, column);
-			
-			UIComponent header = column.getFacet(HEADER_PART);
-			
-			if(header != null){
-				renderChild(context, header);
-			}
-			getHeaderItselfTemplate().encodeEnd(context, column);
-			
-			return 0;
-		}
-		
-		
-		private Boolean getColumnSorting(UIScrollableGrid grid, int columnIndex) {
-
-			Boolean sorting = null; 
-
-			UIComponent column = 
-				(UIComponent) grid.getChildren().get(columnIndex);
-			
-			//TODO: replace with getName?
-			String name = column.getId();
-			
-			SortOrder sortOrder = grid.getSortOrder();
-			
-			if (sortOrder != null) {
-				SortField[] sortFields = sortOrder.getFields();
-				
-				if (sortFields != null) {
-					for (int i = 0; i < sortFields.length && sorting == null; i++) {
-						SortField sortField = sortFields[i];
-						
-						if ((name != null && name.equals(sortField.getName())) 
-								|| columnIndex == sortField.getIndex()) {
-							sorting = sortField.getAscending();
-						}
-					}
-				}
-			}
-			
-			return sorting;
-		}
-		
-	};
-	
-	private final ColumnVisitor footerCellRenderer = new ExtendedColumnVisitor(){
-
-		public void renderContent(FacesContext context, UIComponent column, ResponseWriter writer, GridRendererState state) throws IOException {
-			
-			int cell_index = state.getCellIndex();
-			String client_id = state.getClientId();
-			
-			footerCellTemplate = getFooterCellTemplate();
-			
-			ComponentVariables variables = ComponentsVariableResolver.getVariables(footerCellTemplate, column);
-			variables.setVariable("client_id", client_id);
-			variables.setVariable("cell_index", new Integer(cell_index));
-			
-			
-			UIComponent component = column.getFacet(FOOTER_PART);
-			if(component != null){
-				footerCellTemplate.encodeBegin(context, column);
-				renderChild(context, component);
-				footerCellTemplate.encodeEnd(context, column);
-			} 	
-		}
-	};
-	
-	private final ColumnVisitor cellRenderer = new ExtendedColumnVisitor(){
-
-		public void renderContent(FacesContext context, UIComponent column, ResponseWriter writer, GridRendererState state) throws IOException {
-			
-			String cell_id = state.getRowIndex()+ "_" + state.getCellIndex();
-			if (log.isTraceEnabled()) {
-				log.trace("cell_index: "  + cell_id);
-			}
-			
-			String client_id = state.getClientId();
-			int cell_index =  state.getCellIndex();
-			cellTemplate = getCellTemplate();
-			
-			ComponentVariables variables = ComponentsVariableResolver.getVariables(cellTemplate, column);
-			variables.setVariable("cell_id",cell_id);
-			variables.setVariable("client_id", client_id);
-			variables.setVariable("cell_index", new Integer(cell_index));
-			variables.setVariable("columnClass", state.getColumnClass(cell_index));
-					
-			cellTemplate.encodeBegin(context, column);
-			if(!state.isFake()) {
-				renderChildren(context, column);
-			}
-			cellTemplate.encodeEnd(context, column);
-		}
-		
-	};
-	
-	
-	private final DataVisitor rowsRenderer = new DataVisitor(){
-
-		public void process(FacesContext context, Object rowKey, Object argument) throws IOException {
-			
-			GridRendererState state = (GridRendererState)argument;
-			UIScrollableGrid  grid = state.getGrid();
-			
-			grid.setRowKey(rowKey);
-						
-			if(grid.isRowAvailable() || state.isFake()){
-				String row_id;
-				
-				int index = state.getRowIndex();
-				
-				//state.setRowIndex(index);
-				
-				String baseClientId = grid.getBaseClientId(context);
-				
-				if(state.isFrozenPart()){
-					row_id = baseClientId + ":f:" + index;
-				}else{
-					row_id = baseClientId + ":n:" + index;
-				}
-				
-				ResponseWriter writer = context.getResponseWriter();
-				writer.startElement(HTML.TR_ELEMENT, grid);
-				state.setFrozenColumnCount(GridUtils.getFrozenColumnsCount(grid));
-				getUtils().writeAttribute(writer, "id",row_id);
-				getUtils().writeAttribute(writer, "class","dr-sgrid-rb rich-sgrid-row" + state.getRowClass(index));
-				
-				if (log.isDebugEnabled()) {
-					log.debug("rowIndex : " + index);
-				}
-				
-				ColumnWalker.iterateOverColumns(context, grid, cellRenderer, writer, state);
-				if(!state.isFrozenPart()){
-					writer.startElement("td", grid);
-					getUtils().writeAttribute(writer, "class","dr-sgrid-bc rich-sgrid-row" + state.getColumnClass(state.getCellIndex()));
-					writer.endElement("td");
-				}
-				writer.endElement(HTML.TR_ELEMENT);
-				state.nextRow();
-				state.setCellIndex(0);
-				
-			}	
-		}
-	};
-		
-	private final DataVisitor ajaxRowsRenderer = new DataVisitor(){
-
-		
-		public void process(FacesContext context, Object rowKey, Object argument) throws IOException {
-			
-			int columnsCount = 0;
-			
-			boolean frozenTRRendered = false;
-			
-			boolean normalTRRendered = false;
-			
-			GridRendererState state = (GridRendererState)argument;
-			AjaxContext ajaxContext = state.getAjaxContext();
-			ajaxContext.getResponseData();
-			
-			UIScrollableGrid  grid = state.getGrid();
-			Collection collection = grid.getResponseData();
-
-			grid.setRowKey(rowKey);
-			ResponseWriter writer = context.getResponseWriter();
-			state.setFrozenColumnCount(GridUtils.getFrozenColumnsCount(grid));
-			
-			String row_id = null;
-			
-			
-			for (Iterator iter = grid.getChildren().iterator(); iter.hasNext(); ) {
-				UIComponent kid = (UIComponent) iter.next();
-				
-				if (kid.isRendered()) {
-					
-					if (kid instanceof Column){
-						String baseClientId = grid.getBaseClientId(context);
-						
-						if(state.isFrozenColumn() && !frozenTRRendered){
-							
-							state.setFrozenPart(true);
-							frozenTRRendered = true;
-							
-							row_id = baseClientId + ":f:" +  state.getRowIndex();
-							writer.startElement("tr", grid);
-							getUtils().writeAttribute(writer, "class","dr-sgrid-rb rich-sgrid-row" + state.getRowClass(state.getRowIndex()));
-							getUtils().writeAttribute(writer,"id",row_id);
-							collection.add(row_id);
-																							
-						}else if(!state.isFrozenColumn() && !normalTRRendered){
-							
-							if(frozenTRRendered){
-								writer.endElement("tr");
-							}
-							
-							state.setFrozenPart(false);
-							row_id = baseClientId + ":n:" +  state.getRowIndex();
-							
-							writer.startElement("tr", grid);
-							getUtils().writeAttribute(writer,"id",row_id);
-							getUtils().writeAttribute(writer, "class","dr-sgrid-rb rich-sgrid-row" + state.getRowClass(state.getRowIndex()));
-							normalTRRendered = true;
-							collection.add(row_id);
-									
-						}
-
-						columnsCount += cellRenderer.visit(context, kid, writer, state);
-//						columnsCount += cellRenderer.visit(context, column, writer, state);
-
-
-						
-						
-						state.nextCell();
-					
-					}
-				
-				}
-			
-			}
-			
-//			if(!state.isFrozenPart()){
-//				writer.startElement("td", grid);
-//				getUtils().writeAttribute(writer, "class","dr-sgrid-bc " + state.getColumnClass(state.getCellIndex()));
-//				writer.endElement("td");
-//			}
-
-			writer.endElement("tr");
-			state.setCellIndex(0);
-			state.nextRow();	
-		}
-	};
-
-	
-	public ScrollableGridBaseRenderer() {
-		addContributor(new SelectionRendererContributor());
-	}
-
-	public static String getJavaScriptVarName(FacesContext context, UIScrollableGrid grid) {
-		
-		String name = grid.getScriptVar();
-		if (name == null) {
-			String id = grid.getBaseClientId(context);
-			name = "Richfaces_ScrollableGrid_" + id.replaceAll("[^A-Za-z0-9_]", "_");
-		}
-		
-		return "window." + name;
-	}
-	
-	public String createClientScrollableGrid(FacesContext context, UIScrollableGrid grid) {
-		
-		ScrollableGridOptions  options = new ScrollableGridOptions(grid);
-		
-		
-		mergeScriptOptions(options, context, grid);
-		
-		JSFunction function = new JSFunction("new ClientUI.controls.grid.ScrollableGrid");
-		function.addParameter(options);
-		return function.toScript();
-	}
-	
-	protected String getScriptContributions(FacesContext context, UIScrollableGrid grid) {
-		return super.getScriptContributions(getJavaScriptVarName(context, grid), context, grid);
-	}
-	
-	public boolean getRendersChildren() {
-		return true;
-	}
-	
-	public void renderGridBody(FacesContext context, UIScrollableGrid grid, boolean isFrozen) throws IOException{
-		
-		final GridRendererState state = GridRendererState.getRendererState(context);
-		
-		if(isFrozen){
-			state.setColumType(COLUMN_FROZEN_TYPE);
-		}else{
-			state.setColumType(COLUMN_NORMAL_TYPE);
-		}
-		
-		if (log.isTraceEnabled()) {
-			log.trace("ScrollableGridBaseRenderer.renderGridBody(context, grid, isFrozen)");
-		}
-		
-		state.setFrozenColumnCount(GridUtils.getFrozenColumnsCount(grid));
-		state.setFrozenPart(isFrozen);
-		state.setClientId(grid.getClientId(context));
-		
-		grid.walk(context, rowsRenderer, state);
-			
-		int fakeRowsCount = grid.getRows() - grid.getRowCount();
-		state.setFake(true);
-		for (int i = 0; i < fakeRowsCount; i++) {
-			rowsRenderer.process(context, null, state);	
-		}
-		
-		state.setFake(false);
-		grid.setRowKey(null);
-	}
-	
-	public void renderHeaders(FacesContext context, UIScrollableGrid grid, boolean isFrozen)throws IOException{
-
-		ResponseWriter writer = context.getResponseWriter();
-		final GridRendererState state = GridRendererState.getRendererState(context);
-		
-		if(isFrozen){
-			state.setColumType(COLUMN_FROZEN_TYPE);
-		}else{
-			state.setColumType(COLUMN_NORMAL_TYPE);
-		}
-		
-		state.setClientId(grid.getClientId(context));
-		state.setPart(HEADER_PART);
-		state.setFrozenColumnCount(GridUtils.getFrozenColumnsCount(grid));
-		state.setFrozenPart(isFrozen);
-		state.setClientId(grid.getClientId(context));
-		state.setSepOffset(new Integer(0));
-		
-		ColumnWalker.iterateOverColumns(context, grid, headerCellRenderer, writer, state);
-	}
-	
-	public void renderCols(FacesContext context, UIScrollableGrid grid, boolean isFrozen) throws IOException{
-	
-		ResponseWriter writer = context.getResponseWriter();
-		final GridRendererState state = GridRendererState.getRendererState(context);
-		
-		if(isFrozen){
-			state.setColumType(COLUMN_FROZEN_TYPE);
-		}else{
-			state.setColumType(COLUMN_NORMAL_TYPE);
-		}
-		
-		state.setClientId(grid.getClientId(context));
-		state.setFrozenColumnCount(GridUtils.getFrozenColumnsCount(grid));
-		state.setFrozenPart(isFrozen);
-		ColumnWalker.iterateOverColumns(context, grid, colsRenderer, writer, state);
-	}
-	
-	
-	public void renderFooters(FacesContext context, UIScrollableGrid grid, boolean isFrozen) throws IOException{
-			
-		ResponseWriter writer = context.getResponseWriter();
-		final GridRendererState state = GridRendererState.getRendererState(context);
-		
-		if(isFrozen){
-			state.setColumType(COLUMN_FROZEN_TYPE);
-		}else{
-			state.setColumType(COLUMN_NORMAL_TYPE);
-		}
-
-		state.setClientId(grid.getClientId(context));
-		state.setFrozenColumnCount(GridUtils.getFrozenColumnsCount(grid));
-		state.setFrozenPart(isFrozen);
-		int colsCount = ColumnWalker.iterateOverColumns(context, grid, footerCellRenderer, writer, state);
-		int rowsCount = grid.getRowCount();
-		
-		ComponentVariables variables = ComponentsVariableResolver.getVariables(this, grid);
-		variables.setVariable("rows_count", new Integer(rowsCount));
-		variables.setVariable("columns_count", new Integer(colsCount));
-		
-	}
-	
-	public void setUpState(FacesContext context, UIScrollableGrid grid) {
-		GridRendererState.createState(context, grid);
-	}
-			
-	public void tearDownState(FacesContext context, UIScrollableGrid grid){
-		GridRendererState.restoreState(context);
-	}
-	
-	
-	public String getRowsAjaxUpdate(FacesContext context, UIScrollableGrid grid){
-		
-		JSFunction function = AjaxRendererUtils.buildAjaxFunction(grid, context);
-		Map options = AjaxRendererUtils.buildEventOptions(context, grid);
-		options.put("oncomplete", AjaxFunctionBuilder.getOnComplete(context, grid, AjaxFunctionBuilder.SCROLL));
-		Map parametersMap = (Map)options.get("parameters");
-		parametersMap.put(grid.getBaseClientId(context) + ":scroll", "");
-		function.addParameter(options);
-		String completeFunction = function.toScript()+"; return false;";
-		
-		return completeFunction;
-		
-	}
-
-	
-	protected void doDecode(FacesContext context, UIComponent component) {
-		
-		super.doDecode(context, component);
-
-		component.getAttributes().remove(PARTIAL_UPDATE);
-		component.getAttributes().remove(UPDATE_HEADER);
-		
-
-		AjaxContext ajaxContext = AjaxContext.getCurrentInstance(context);
-		
-		if(component instanceof UIScrollableGrid){
-		
-			UIScrollableGrid grid = (UIScrollableGrid)component;
-			ExternalContext externalContext = context.getExternalContext();
-			String clientId = grid.getClientId(context);
-			boolean sorted = false;	
-			Map parameters = externalContext.getRequestParameterMap();
-			
-			String s_id = clientId + ":si";
-			if(parameters.containsKey(s_id)){
-				String options = (String)parameters.get(s_id);
-				grid.setScrollPos(options);
-			}
-					
-			
-			if(parameters.containsKey(clientId + ":sortColumn") &&
-			   parameters.containsKey(clientId + ":sortStartRow") && 
-			   parameters.containsKey(clientId + ":sortIndex") && 
-			   parameters.containsKey(clientId + ":sortOrder")){ 
-				
-				int sortColumn = Integer.parseInt((String)parameters.get(clientId + ":sortColumn"));
-				int sortDataIndex = Integer.parseInt((String)parameters.get(clientId + ":sortIndex"));
-				Integer sortStartRow = Integer.valueOf((String)parameters.get(clientId + ":sortStartRow"));
-				
-				Column column = (Column)grid.getChildren().get(sortColumn);
-				
-				if(column.isSortable()){
-			
-					sorted = true;
-					SortEvent sortEvent = new SortEvent(grid,sortColumn, grid.getRows(), sortDataIndex);
-					
-					sortEvent.setAttribute(GridUtils.CLIENT_ROW_KEY,sortStartRow);
-					
-					if (ajaxContext.isAjaxRequest()) {
-						sortEvent.setAttribute(PARTIAL_UPDATE, Boolean.TRUE);
-						sortEvent.setAttribute(UPDATE_HEADER, Boolean.TRUE);
-					}
-					
-					
-					sortEvent.queue();
-				}	
-			}
-			
-			
-			if(parameters.containsKey(clientId + ":scroll") && !sorted){
-					
-					String submitedState = (String)parameters.get(clientId + "_state_input");
-					boolean isEmpty = true;
-					
-					
-					String [] values = submitedState.split(",");
-					for (int i = 0; i < values.length; i++) {
-						isEmpty = isEmpty && values[i].equals(""); 
-					}
-					
-					int rows = 0;
-					int first = 0;
-					
-					if(!isEmpty){
-						rows = Integer.parseInt(values[0]);
-						first = Integer.parseInt(values[1]);
-						ScrollEvent scrollEvent = new ScrollEvent(grid,rows,first);
-
-						scrollEvent.setAttribute(GridUtils.CLIENT_ROW_KEY,Integer.valueOf(values[2]));						
-						
-						if (ajaxContext.isAjaxRequest()) {
-							scrollEvent.setAttribute(PARTIAL_UPDATE, Boolean.TRUE);
-						}
-
-						scrollEvent.queue();
-						
-					}						
-			}
-			
-			
-		}
-		
-		
-	}
-	
-	public void renderAjaxChildren(FacesContext context, UIComponent component)throws IOException{
-		
-		UIScrollableGrid grid = (UIScrollableGrid)component;
-		
-		
-		
-		GridRendererState state = GridRendererState.createState(context, grid);
-				
-		AjaxContext ajaxContext = AjaxContext.getCurrentInstance(context);
-		String client_id = grid.getClientId(context);
-		
-		state.setClientId(client_id);
-		state.setAjaxContext(ajaxContext);
-		state.setRowIndex(GridUtils.getClientRowIndex(grid));
-		
-		if (log.isDebugEnabled()) {
-			log.debug("ScrollableGridBaseRenderer.renderAjaxChildren()");
-		}
-		
-		grid.getResponseData().clear();
-		
-		ResponseWriter writer = context.getResponseWriter();
-		writer.startElement("table", grid);
-		writer.startElement("tbody", grid);
-		
-		grid.walk(context, ajaxRowsRenderer, state);
-		
-		writer.endElement("tbody");
-		writer.endElement("table");
-		
-		GridRendererState.restoreState(context);
-		grid.setRowKey(null);
-		
-		ajaxContext.setResponseData(grid.getResponseData());
-		
-		ajaxContext.getAjaxRenderedAreas().remove(grid.getClientId(context));
-		GridScrollSettings options = createOptions(grid);
-		ajaxContext.getResponseDataMap().put("options", options);
-		
-		//Then call contributors to write additional HTML content
-		contributorsEncodeHere(context, grid);
-	
-		if (shouldUpdateHeader(component)) {
-			ColumnWalker.iterateOverColumns(context, component, headerRenderer, writer, new GridRendererState(context, null, grid));
-		}
-		
-	
-	}
-	
-	private GridScrollSettings createOptions(UIScrollableGrid grid){
-		
-		int index = grid.getFirst();
-		int startRow = GridUtils.getClientRowIndex(grid);
-		int count = grid.getRows();
-		
-		GridScrollSettings options = new GridScrollSettings(index, startRow, count);
-				
-		return options;
-	}
-	
-	private boolean onlyPartialUpdateNeeded(UIComponent grid) {
-		Boolean b = (Boolean) grid.getAttributes().get(PARTIAL_UPDATE);
-		return b != null && b.booleanValue() && AjaxContext.getCurrentInstance().isAjaxRequest();
-	}
-
-	private boolean shouldUpdateHeader(UIComponent grid) {
-		Boolean b = (Boolean) grid.getAttributes().get(UPDATE_HEADER);
-		return b != null && b.booleanValue() && AjaxContext.getCurrentInstance().isAjaxRequest();
-	}
-	
-	public void encodeChildren(FacesContext context, UIComponent component
-								 )	throws IOException {
-		
-		if(onlyPartialUpdateNeeded(component)){
-			renderAjaxChildren(context, component);
-		}else{
-			super.encodeChildren(context, component);
-		}
-		
-	}
-	
-	public void encodeBegin(FacesContext context, UIComponent component) throws IOException {
-		
-		if(component instanceof UIScrollableGrid){
-			UIScrollableGrid grid = (UIScrollableGrid)component;
-			setUpState(context, grid);
-		}
-		
-		if(!onlyPartialUpdateNeeded(component)){
-			super.encodeBegin(context, component);
-		}
-	}
-	
-	public void encodeEnd(FacesContext context, UIComponent component) throws IOException {
-		
-		if(component instanceof UIScrollableGrid){
-			
-			if(!onlyPartialUpdateNeeded(component)){
-				super.encodeEnd(context, component);
-			}	
-		}
-	}
-	
-	public void setUpColumnsWidth(FacesContext context, UIScrollableGrid grid) throws IOException{
-		GridRendererState state = GridRendererState.getRendererState(context);
-		state.setFrozenColumnCount(GridUtils.getFrozenColumnsCount(grid));
-		ColumnWalker.iterateOverColumns(context, grid, columnsWidthCounter, null, state);		
-		ComponentVariables variables = ComponentsVariableResolver.getVariables(this, grid);
-		int sumWidth = state.getSumWidth() + 200;
-		variables.setVariable("sumWidth", new Integer(sumWidth));
-	}
-
-	private	RendererBase getCellTemplate() {
-		if (cellTemplate == null) {
-			cellTemplate = TemplateLoader.loadTemplate("org.richfaces.renderkit.html.ScrollableGridCellRenderer");
-		}
-		return cellTemplate;
-	}
-	
-	private	RendererBase getHeaderCellTemplate() {
-		
-		if (headerCellTemplate == null) {
-			headerCellTemplate = TemplateLoader.loadTemplate("org.richfaces.renderkit.html.ScrollableGridHeaderCellRenderer");
-		}
-		return headerCellTemplate;
-	}
-	
-	private	RendererBase getFooterCellTemplate() {
-		
-		if (footerCellTemplate == null) {
-			footerCellTemplate = TemplateLoader.loadTemplate("org.richfaces.renderkit.html.ScrollableGridFooterCellRenderer");
-		}
-		return footerCellTemplate;
-	}
-	
-	
-	
-	private RendererBase getHeaderItselfTemplate() {
-		
-		if (headerItselfTemplate == null) {
-			headerItselfTemplate = TemplateLoader.loadTemplate("org.richfaces.renderkit.html.ScrollableGridHeaderItselfRenderer");
-		}
-		
-		return headerItselfTemplate;
-	}
-
-
-	public void renderHiddenScrollInput(FacesContext context, UIScrollableGrid grid) throws IOException{
-		
-		ResponseWriter writer = context.getResponseWriter();
-		String id = grid.getClientId(context) + ":si";
-		writer.startElement("input", grid);
-
-		getUtils().writeAttribute(writer, "type", "hidden");
-		getUtils().writeAttribute(writer, "name", id);
-		getUtils().writeAttribute(writer, "id", id);
-		getUtils().writeAttribute(writer, "value", grid.getScrollPos());
-		
-		writer.endElement("input");
-		
-	}
-	
-	public void contributorsEncodeHere(FacesContext context, UIScrollableGrid grid) throws IOException {
-		RendererContributor [] contribs = getContributors();
-		
-		if (contribs != null) {
-			for (int i = 0; i < contribs.length; i++) {
-				RendererContributor rendererContributor = contribs[i];
-				
-				if (rendererContributor instanceof HTMLEncodingContributor) {
-					((HTMLEncodingContributor) rendererContributor).encode(context, grid);
-				}
-			}
-		}
-	}
-	
-}

Deleted: trunk/ui/scrollableDataTable/src/main/java/org/richfaces/renderkit/html/ScrollableGridOptions.java
===================================================================
--- trunk/ui/scrollableDataTable/src/main/java/org/richfaces/renderkit/html/ScrollableGridOptions.java	2007-08-16 15:23:03 UTC (rev 2298)
+++ trunk/ui/scrollableDataTable/src/main/java/org/richfaces/renderkit/html/ScrollableGridOptions.java	2007-08-16 16:08:29 UTC (rev 2299)
@@ -1,97 +0,0 @@
-/**
- * License Agreement.
- *
- *  JBoss RichFaces 3.0 - Ajax4jsf Component Library
- *
- * Copyright (C) 2007  Exadel, Inc.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License version 2.1 as published by the Free Software Foundation.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301  USA
- */
-
-package org.richfaces.renderkit.html;
-
-import java.util.Map;
-
-import javax.faces.component.UIComponent;
-import javax.faces.context.FacesContext;
-
-import org.ajax4jsf.javascript.JSFunction;
-import org.ajax4jsf.javascript.JSFunctionDefinition;
-import org.ajax4jsf.javascript.JSReference;
-import org.ajax4jsf.renderkit.AjaxRendererUtils;
-import org.richfaces.component.UIScrollableGrid;
-import org.richfaces.renderkit.ScriptOptions;
-
-public class ScrollableGridOptions extends ScriptOptions {
-
-	public ScrollableGridOptions(UIScrollableGrid grid) {
-		super(grid);
-		FacesContext context = FacesContext.getCurrentInstance();
-		
-		String id = grid.getBaseClientId(context);
-		
-		addOption("client_id", id);
-		
-		if(grid.getFacets().containsKey("splash")){
-			UIComponent splash = grid.getFacet("splash");
-			String splash_id = splash.getClientId(context);
-			addOption("splash_id", splash_id);
-		}
-		
-		int columnCount = grid.getChildCount();
-		
-		addOption("columnsCount", new Integer(columnCount));
-		addOption("rowsCount", new Integer(grid.getRows()));
-		addEventHandler("onselectionchange");
-		addOption("ids", GridRendererState.getRendererState(context).getIds());
-		addOption("hideWhenScrolling");
-		
-		
-		JSFunctionDefinition functionDefinition = new JSFunctionDefinition();
-		
-		JSReference sortEvent = new JSReference("event");
-		functionDefinition.addParameter(sortEvent);
-		functionDefinition.addToBody(onSortAjaxUpdate(context, grid));
-		
-		addOption("onSortAjaxUpdate", functionDefinition);	
-		
-	}
-	
-	public String onSortAjaxUpdate(FacesContext context, UIScrollableGrid grid){
-		
-		JSReference sortColumn = new JSReference("event.column");
-		JSReference sortOrder = new JSReference("event.order");
-		JSReference sortStartRow = new JSReference("event.startRow");
-		JSReference sortIndex = new JSReference("event.index");
-		
-		Map options = AjaxRendererUtils.buildEventOptions(context, grid);
-		
-		Map parametersMap = (Map)options.get("parameters");
-		String id = grid.getClientId(context);
-		parametersMap.put(id + ":sortColumn", sortColumn);
-		parametersMap.put(id + ":sortOrder", sortOrder);
-		parametersMap.put(id + ":sortStartRow", sortStartRow);
-		parametersMap.put(id + ":sortIndex", sortIndex);
-		options.put("parameters", parametersMap);
-		
-		JSFunction function = AjaxRendererUtils.buildAjaxFunction(grid, context);
-		options.put("oncomplete", AjaxFunctionBuilder.getOnComplete(context, grid, AjaxFunctionBuilder.SORT));
-		function.addParameter(options);
-		String completeFunction = function.toScript() + "; return false;";
-		
-		return completeFunction;
-	}
-
-	
-}
\ No newline at end of file

Modified: trunk/ui/scrollableDataTable/src/main/java/org/richfaces/renderkit/html/SelectionRendererContributor.java
===================================================================
--- trunk/ui/scrollableDataTable/src/main/java/org/richfaces/renderkit/html/SelectionRendererContributor.java	2007-08-16 15:23:03 UTC (rev 2298)
+++ trunk/ui/scrollableDataTable/src/main/java/org/richfaces/renderkit/html/SelectionRendererContributor.java	2007-08-16 16:08:29 UTC (rev 2299)
@@ -17,7 +17,7 @@
 import org.ajax4jsf.context.AjaxContext;
 import org.ajax4jsf.model.DataVisitor;
 import org.ajax4jsf.renderkit.RendererUtils.HTML;
-import org.richfaces.component.UIScrollableGrid;
+import org.richfaces.component.UIScrollableDataTable;
 import org.richfaces.model.selection.ClientSelection;
 import org.richfaces.model.selection.Selection;
 import org.richfaces.model.selection.SimpleSelection;
@@ -35,7 +35,7 @@
 	public static final String CLIENT_SELECTION = "clientSelection";
 	
 	public static final String getSelectionInputName(FacesContext context,
-			UIScrollableGrid grid) {
+			UIScrollableDataTable grid) {
 		String id = grid.getBaseClientId(context) + ":s";
 		
 		return id;
@@ -44,7 +44,7 @@
 	public void decode(FacesContext context, UIComponent component,
 			CompositeRenderer compositeRenderer) {
 		
-		UIScrollableGrid grid = (UIScrollableGrid) component;
+		UIScrollableDataTable grid = (UIScrollableDataTable) component;
 		
 		ExternalContext externalContext = context.getExternalContext();
 		Map requestParamMap = externalContext.getRequestParameterMap();
@@ -70,10 +70,10 @@
 		
 		
 		
-		final GridRendererState state = 
-			GridRendererState.createState(context, grid);
+		final ScrollableDataTableRendererState state = 
+			ScrollableDataTableRendererState.createState(context, grid);
 		
-		state.setRowIndex(GridUtils.getClientRowIndex(grid));
+		state.setRowIndex(ScrollableDataTableUtils.getClientRowIndex(grid));
 		
 		final SimpleSelection simpleSelection = grid.getSelection() == null ? new SimpleSelection()
 				: (SimpleSelection) grid.getSelection();
@@ -113,7 +113,7 @@
 		
 		grid.setSelection(simpleSelection);
 		
-		GridRendererState.restoreState(context);
+		ScrollableDataTableRendererState.restoreState(context);
 	}
 
 	/*
@@ -122,7 +122,7 @@
 	 * @see org.richfaces.renderkit.RendererContributor#getAcceptableClass()
 	 */
 	public Class getAcceptableClass() {
-		return UIScrollableGrid.class;
+		return UIScrollableDataTable.class;
 	}
 
 	/*
@@ -158,7 +158,7 @@
 			UIComponent component) {
 		ScriptOptions scriptOptions = new ScriptOptions(component);
 		scriptOptions.addOption("selectionInput", getSelectionInputName(
-				context, (UIScrollableGrid) component));
+				context, (UIScrollableDataTable) component));
 		scriptOptions.addOption("selectedClass");
 		scriptOptions.addOption("activeClass");
 		return scriptOptions;
@@ -168,7 +168,7 @@
 	public void encode(FacesContext context, UIComponent component)
 			throws IOException {
 		
-		UIScrollableGrid grid = (UIScrollableGrid) component;
+		UIScrollableDataTable grid = (UIScrollableDataTable) component;
 		
 		encodeSelection(context, grid);
 		writeSelection(context, grid);
@@ -188,10 +188,10 @@
 	}
 	
 
-	private void encodeSelection(FacesContext context, UIScrollableGrid grid) throws IOException {
-		final GridRendererState state = GridRendererState.createState(context, grid);
+	private void encodeSelection(FacesContext context, UIScrollableDataTable grid) throws IOException {
+		final ScrollableDataTableRendererState state = ScrollableDataTableRendererState.createState(context, grid);
 		
-		state.setRowIndex(GridUtils.getClientRowIndex(grid));
+		state.setRowIndex(ScrollableDataTableUtils.getClientRowIndex(grid));
 		
 		final Selection gridSelection = 
 			grid.getSelection() == null ? 
@@ -219,7 +219,7 @@
 		state);
 		
 		
-		GridRendererState.restoreState(context);
+		ScrollableDataTableRendererState.restoreState(context);
 		
 		grid.getAttributes().put(CLIENT_SELECTION, clientSelection);
 	}
@@ -231,7 +231,7 @@
 	 * @param grid
 	 * @throws IOException
 	 */
-	public void writeSelection(FacesContext context, UIScrollableGrid grid) 
+	public void writeSelection(FacesContext context, UIScrollableDataTable grid) 
 		throws IOException {
 		
 		Application application = context.getApplication();

Modified: trunk/ui/scrollableDataTable/src/main/java/org/richfaces/renderkit/html/SortIconRenderer.java
===================================================================
--- trunk/ui/scrollableDataTable/src/main/java/org/richfaces/renderkit/html/SortIconRenderer.java	2007-08-16 15:23:03 UTC (rev 2298)
+++ trunk/ui/scrollableDataTable/src/main/java/org/richfaces/renderkit/html/SortIconRenderer.java	2007-08-16 16:08:29 UTC (rev 2299)
@@ -20,11 +20,11 @@
 	
 	
 	public void renderAscIcon(FacesContext context, UIComponent component) throws IOException{
-		renderFacetOrIcon(context, component, "ascIcon", "dr-sgrid-sort-asc");
+		renderFacetOrIcon(context, component, "ascIcon", "dr-sdt-sort-asc");
 	}
 
 	public void renderDescIcon(FacesContext context, UIComponent component) throws IOException{
-		renderFacetOrIcon(context, component, "descIcon", "dr-sgrid-sort-desc");
+		renderFacetOrIcon(context, component, "descIcon", "dr-sdt-sort-desc");
 	}
 	
 	private void renderFacetOrIcon(FacesContext context, UIComponent component, String facetName, String clazz) throws IOException{

Added: trunk/ui/scrollableDataTable/src/main/java/org/richfaces/renderkit/html/iconimages/ScrollableDataTableIconBasic.java
===================================================================
--- trunk/ui/scrollableDataTable/src/main/java/org/richfaces/renderkit/html/iconimages/ScrollableDataTableIconBasic.java	                        (rev 0)
+++ trunk/ui/scrollableDataTable/src/main/java/org/richfaces/renderkit/html/iconimages/ScrollableDataTableIconBasic.java	2007-08-16 16:08:29 UTC (rev 2299)
@@ -0,0 +1,63 @@
+package org.richfaces.renderkit.html.iconimages;
+
+import java.awt.Color;
+import java.awt.Dimension;
+import java.util.Date;
+
+import javax.faces.context.FacesContext;
+
+import org.ajax4jsf.resource.GifRenderer;
+import org.ajax4jsf.resource.InternetResourceBuilder;
+import org.ajax4jsf.resource.Java2Dresource;
+import org.ajax4jsf.resource.ResourceContext;
+import org.ajax4jsf.util.HtmlColor;
+import org.richfaces.skin.Skin;
+import org.richfaces.skin.SkinFactory;
+
+public abstract class ScrollableDataTableIconBasic extends Java2Dresource {
+	
+	public ScrollableDataTableIconBasic() {
+		setRenderer(new GifRenderer());
+		setLastModified(new Date(InternetResourceBuilder.getInstance().getStartTime()));
+	}
+	
+	public abstract Dimension calculateDimensions();
+	
+	public Dimension getDimensions(FacesContext facesContext, Object data) {
+		return calculateDimensions();
+	}
+	protected Dimension getDimensions(ResourceContext resourceContext) {
+		return calculateDimensions();
+	}
+	
+	protected Object getDataToStore(FacesContext context, Object data) {
+		Skin skin = SkinFactory.getInstance().getSkin(context);
+		Skin defaultSkin = SkinFactory.getInstance().getDefaultSkin(context);
+		
+		Object [] stored = new Object[2];
+		
+		Color col = null;
+		
+		if (data!=null){
+			col = HtmlColor.decode(data.toString());
+		} else {
+			String skinParameter = "headerTextColor";
+			String headerTextColor = (String) skin.getParameter(context, skinParameter);
+			if (null == headerTextColor || "".equals(headerTextColor))
+				headerTextColor = (String) defaultSkin.getParameter(context, skinParameter);
+			col = HtmlColor.decode(headerTextColor);
+		}
+		
+		stored[0] = col;
+		
+		String skinParameter = "headerBackgroundColor";
+		String headerBackgroundColor = (String) skin.getParameter(context, skinParameter);
+		if (null == headerBackgroundColor || "".equals(headerBackgroundColor))
+			headerBackgroundColor = (String) defaultSkin.getParameter(context, skinParameter);
+		col = HtmlColor.decode(headerBackgroundColor);
+		
+		stored[1] = col;
+		
+		return stored;
+	}
+}

Added: trunk/ui/scrollableDataTable/src/main/java/org/richfaces/renderkit/html/iconimages/ScrollableDataTableIconSortAsc.java
===================================================================
--- trunk/ui/scrollableDataTable/src/main/java/org/richfaces/renderkit/html/iconimages/ScrollableDataTableIconSortAsc.java	                        (rev 0)
+++ trunk/ui/scrollableDataTable/src/main/java/org/richfaces/renderkit/html/iconimages/ScrollableDataTableIconSortAsc.java	2007-08-16 16:08:29 UTC (rev 2299)
@@ -0,0 +1,33 @@
+package org.richfaces.renderkit.html.iconimages;
+
+import java.awt.Color;
+import java.awt.Dimension;
+import java.awt.Graphics2D;
+import java.awt.RenderingHints;
+import java.awt.geom.GeneralPath;
+
+import org.ajax4jsf.resource.ResourceContext;
+
+public class ScrollableDataTableIconSortAsc extends ScrollableDataTableIconBasic {
+	
+	public Dimension calculateDimensions() {
+		return new Dimension(13, 4);
+	}
+	
+	protected void paint(ResourceContext context, Graphics2D g2d) {
+		g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
+		g2d.setRenderingHint(RenderingHints.KEY_COLOR_RENDERING, RenderingHints.VALUE_COLOR_RENDER_QUALITY);
+		g2d.setRenderingHint(RenderingHints.KEY_DITHERING, RenderingHints.VALUE_DITHER_ENABLE);
+		GeneralPath path = new GeneralPath();
+
+		path.moveTo(1,4);
+		path.lineTo(4,0);
+		path.lineTo(8,4);
+		path.closePath();
+		Object [] data = (Object[]) restoreData(context);
+		Color col = (Color)data[0];
+		
+		g2d.setColor(col);
+		g2d.fill(path);
+	}
+}

Added: trunk/ui/scrollableDataTable/src/main/java/org/richfaces/renderkit/html/iconimages/ScrollableDataTableIconSortDesc.java
===================================================================
--- trunk/ui/scrollableDataTable/src/main/java/org/richfaces/renderkit/html/iconimages/ScrollableDataTableIconSortDesc.java	                        (rev 0)
+++ trunk/ui/scrollableDataTable/src/main/java/org/richfaces/renderkit/html/iconimages/ScrollableDataTableIconSortDesc.java	2007-08-16 16:08:29 UTC (rev 2299)
@@ -0,0 +1,33 @@
+package org.richfaces.renderkit.html.iconimages;
+
+import java.awt.Color;
+import java.awt.Dimension;
+import java.awt.Graphics2D;
+import java.awt.RenderingHints;
+import java.awt.geom.GeneralPath;
+
+import org.ajax4jsf.resource.ResourceContext;
+
+public class ScrollableDataTableIconSortDesc extends ScrollableDataTableIconBasic {
+
+	public Dimension calculateDimensions() {
+		return new Dimension(13, 4);
+	}
+	
+	protected void paint(ResourceContext context, Graphics2D g2d) {
+		g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
+		g2d.setRenderingHint(RenderingHints.KEY_COLOR_RENDERING, RenderingHints.VALUE_COLOR_RENDER_QUALITY);
+		g2d.setRenderingHint(RenderingHints.KEY_DITHERING, RenderingHints.VALUE_DITHER_ENABLE);
+		GeneralPath path = new GeneralPath();
+		
+		path.moveTo(1,0);
+		path.lineTo(4,4);
+		path.lineTo(8,0);
+		path.closePath();
+		Object [] data = (Object[]) restoreData(context);
+		Color col = (Color)data[0];
+		
+		g2d.setColor(col);
+		g2d.fill(path);
+	}
+}

Added: trunk/ui/scrollableDataTable/src/main/java/org/richfaces/renderkit/html/iconimages/ScrollableDataTableIconSplit.java
===================================================================
--- trunk/ui/scrollableDataTable/src/main/java/org/richfaces/renderkit/html/iconimages/ScrollableDataTableIconSplit.java	                        (rev 0)
+++ trunk/ui/scrollableDataTable/src/main/java/org/richfaces/renderkit/html/iconimages/ScrollableDataTableIconSplit.java	2007-08-16 16:08:29 UTC (rev 2299)
@@ -0,0 +1,31 @@
+package org.richfaces.renderkit.html.iconimages;
+
+import java.awt.Color;
+import java.awt.Dimension;
+import java.awt.Graphics2D;
+import java.awt.RenderingHints;
+
+import org.ajax4jsf.resource.ResourceContext;
+
+public class ScrollableDataTableIconSplit extends ScrollableDataTableIconBasic {
+
+	public Dimension calculateDimensions() {
+		return new Dimension(2, 13);
+	}
+	
+	protected void paint(ResourceContext context, Graphics2D g2d) {
+		g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
+		g2d.setRenderingHint(RenderingHints.KEY_COLOR_RENDERING, RenderingHints.VALUE_COLOR_RENDER_QUALITY);
+		g2d.setRenderingHint(RenderingHints.KEY_DITHERING, RenderingHints.VALUE_DITHER_ENABLE);
+		
+		Object [] data = (Object[]) restoreData(context);
+		Color col1 = (Color)data[0];
+		Color col2 = (Color)data[1];
+		
+		g2d.setColor(col2);
+		g2d.drawLine(0, 0, 0, 12);
+		g2d.setColor(col1);
+		g2d.drawLine(1, 0, 1, 12);
+	}
+	
+}

Deleted: trunk/ui/scrollableDataTable/src/main/java/org/richfaces/renderkit/html/iconimages/ScrollableGridIconBasic.java
===================================================================
--- trunk/ui/scrollableDataTable/src/main/java/org/richfaces/renderkit/html/iconimages/ScrollableGridIconBasic.java	2007-08-16 15:23:03 UTC (rev 2298)
+++ trunk/ui/scrollableDataTable/src/main/java/org/richfaces/renderkit/html/iconimages/ScrollableGridIconBasic.java	2007-08-16 16:08:29 UTC (rev 2299)
@@ -1,63 +0,0 @@
-package org.richfaces.renderkit.html.iconimages;
-
-import java.awt.Color;
-import java.awt.Dimension;
-import java.util.Date;
-
-import javax.faces.context.FacesContext;
-
-import org.ajax4jsf.resource.GifRenderer;
-import org.ajax4jsf.resource.InternetResourceBuilder;
-import org.ajax4jsf.resource.Java2Dresource;
-import org.ajax4jsf.resource.ResourceContext;
-import org.ajax4jsf.util.HtmlColor;
-import org.richfaces.skin.Skin;
-import org.richfaces.skin.SkinFactory;
-
-public abstract class ScrollableGridIconBasic extends Java2Dresource {
-	
-	public ScrollableGridIconBasic() {
-		setRenderer(new GifRenderer());
-		setLastModified(new Date(InternetResourceBuilder.getInstance().getStartTime()));
-	}
-	
-	public abstract Dimension calculateDimensions();
-	
-	public Dimension getDimensions(FacesContext facesContext, Object data) {
-		return calculateDimensions();
-	}
-	protected Dimension getDimensions(ResourceContext resourceContext) {
-		return calculateDimensions();
-	}
-	
-	protected Object getDataToStore(FacesContext context, Object data) {
-		Skin skin = SkinFactory.getInstance().getSkin(context);
-		Skin defaultSkin = SkinFactory.getInstance().getDefaultSkin(context);
-		
-		Object [] stored = new Object[2];
-		
-		Color col = null;
-		
-		if (data!=null){
-			col = HtmlColor.decode(data.toString());
-		} else {
-			String skinParameter = "headerTextColor";
-			String headerTextColor = (String) skin.getParameter(context, skinParameter);
-			if (null == headerTextColor || "".equals(headerTextColor))
-				headerTextColor = (String) defaultSkin.getParameter(context, skinParameter);
-			col = HtmlColor.decode(headerTextColor);
-		}
-		
-		stored[0] = col;
-		
-		String skinParameter = "headerBackgroundColor";
-		String headerBackgroundColor = (String) skin.getParameter(context, skinParameter);
-		if (null == headerBackgroundColor || "".equals(headerBackgroundColor))
-			headerBackgroundColor = (String) defaultSkin.getParameter(context, skinParameter);
-		col = HtmlColor.decode(headerBackgroundColor);
-		
-		stored[1] = col;
-		
-		return stored;
-	}
-}

Deleted: trunk/ui/scrollableDataTable/src/main/java/org/richfaces/renderkit/html/iconimages/ScrollableGridIconSortAsc.java
===================================================================
--- trunk/ui/scrollableDataTable/src/main/java/org/richfaces/renderkit/html/iconimages/ScrollableGridIconSortAsc.java	2007-08-16 15:23:03 UTC (rev 2298)
+++ trunk/ui/scrollableDataTable/src/main/java/org/richfaces/renderkit/html/iconimages/ScrollableGridIconSortAsc.java	2007-08-16 16:08:29 UTC (rev 2299)
@@ -1,33 +0,0 @@
-package org.richfaces.renderkit.html.iconimages;
-
-import java.awt.Color;
-import java.awt.Dimension;
-import java.awt.Graphics2D;
-import java.awt.RenderingHints;
-import java.awt.geom.GeneralPath;
-
-import org.ajax4jsf.resource.ResourceContext;
-
-public class ScrollableGridIconSortAsc extends ScrollableGridIconBasic {
-	
-	public Dimension calculateDimensions() {
-		return new Dimension(13, 4);
-	}
-	
-	protected void paint(ResourceContext context, Graphics2D g2d) {
-		g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
-		g2d.setRenderingHint(RenderingHints.KEY_COLOR_RENDERING, RenderingHints.VALUE_COLOR_RENDER_QUALITY);
-		g2d.setRenderingHint(RenderingHints.KEY_DITHERING, RenderingHints.VALUE_DITHER_ENABLE);
-		GeneralPath path = new GeneralPath();
-
-		path.moveTo(1,4);
-		path.lineTo(4,0);
-		path.lineTo(8,4);
-		path.closePath();
-		Object [] data = (Object[]) restoreData(context);
-		Color col = (Color)data[0];
-		
-		g2d.setColor(col);
-		g2d.fill(path);
-	}
-}

Deleted: trunk/ui/scrollableDataTable/src/main/java/org/richfaces/renderkit/html/iconimages/ScrollableGridIconSortDesc.java
===================================================================
--- trunk/ui/scrollableDataTable/src/main/java/org/richfaces/renderkit/html/iconimages/ScrollableGridIconSortDesc.java	2007-08-16 15:23:03 UTC (rev 2298)
+++ trunk/ui/scrollableDataTable/src/main/java/org/richfaces/renderkit/html/iconimages/ScrollableGridIconSortDesc.java	2007-08-16 16:08:29 UTC (rev 2299)
@@ -1,33 +0,0 @@
-package org.richfaces.renderkit.html.iconimages;
-
-import java.awt.Color;
-import java.awt.Dimension;
-import java.awt.Graphics2D;
-import java.awt.RenderingHints;
-import java.awt.geom.GeneralPath;
-
-import org.ajax4jsf.resource.ResourceContext;
-
-public class ScrollableGridIconSortDesc extends ScrollableGridIconBasic {
-
-	public Dimension calculateDimensions() {
-		return new Dimension(13, 4);
-	}
-	
-	protected void paint(ResourceContext context, Graphics2D g2d) {
-		g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
-		g2d.setRenderingHint(RenderingHints.KEY_COLOR_RENDERING, RenderingHints.VALUE_COLOR_RENDER_QUALITY);
-		g2d.setRenderingHint(RenderingHints.KEY_DITHERING, RenderingHints.VALUE_DITHER_ENABLE);
-		GeneralPath path = new GeneralPath();
-		
-		path.moveTo(1,0);
-		path.lineTo(4,4);
-		path.lineTo(8,0);
-		path.closePath();
-		Object [] data = (Object[]) restoreData(context);
-		Color col = (Color)data[0];
-		
-		g2d.setColor(col);
-		g2d.fill(path);
-	}
-}

Deleted: trunk/ui/scrollableDataTable/src/main/java/org/richfaces/renderkit/html/iconimages/ScrollableGridIconSplit.java
===================================================================
--- trunk/ui/scrollableDataTable/src/main/java/org/richfaces/renderkit/html/iconimages/ScrollableGridIconSplit.java	2007-08-16 15:23:03 UTC (rev 2298)
+++ trunk/ui/scrollableDataTable/src/main/java/org/richfaces/renderkit/html/iconimages/ScrollableGridIconSplit.java	2007-08-16 16:08:29 UTC (rev 2299)
@@ -1,31 +0,0 @@
-package org.richfaces.renderkit.html.iconimages;
-
-import java.awt.Color;
-import java.awt.Dimension;
-import java.awt.Graphics2D;
-import java.awt.RenderingHints;
-
-import org.ajax4jsf.resource.ResourceContext;
-
-public class ScrollableGridIconSplit extends ScrollableGridIconBasic {
-
-	public Dimension calculateDimensions() {
-		return new Dimension(2, 13);
-	}
-	
-	protected void paint(ResourceContext context, Graphics2D g2d) {
-		g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
-		g2d.setRenderingHint(RenderingHints.KEY_COLOR_RENDERING, RenderingHints.VALUE_COLOR_RENDER_QUALITY);
-		g2d.setRenderingHint(RenderingHints.KEY_DITHERING, RenderingHints.VALUE_DITHER_ENABLE);
-		
-		Object [] data = (Object[]) restoreData(context);
-		Color col1 = (Color)data[0];
-		Color col2 = (Color)data[1];
-		
-		g2d.setColor(col2);
-		g2d.drawLine(0, 0, 0, 12);
-		g2d.setColor(col1);
-		g2d.drawLine(1, 0, 1, 12);
-	}
-	
-}

Modified: trunk/ui/scrollableDataTable/src/main/javascript/ClientUI/controls/grid/GridBody.js
===================================================================
--- trunk/ui/scrollableDataTable/src/main/javascript/ClientUI/controls/grid/GridBody.js	2007-08-16 15:23:03 UTC (rev 2298)
+++ trunk/ui/scrollableDataTable/src/main/javascript/ClientUI/controls/grid/GridBody.js	2007-08-16 16:08:29 UTC (rev 2299)
@@ -721,7 +721,7 @@
 			tbl = this.templNormal.getElement().rows[row].cells;
 		}
 		
-		var cell = document.getElementsByClassName("dr-sgrid-bcbody", tbl[index]);
+		var cell = document.getElementsByClassName("dr-sdt-bcbody", tbl[index]);
 		return (cell && cell.length && cell.length>0) ? cell[0].innerHTML : "";
 	},
 	ensureVisible: function (index) {

Modified: trunk/ui/scrollableDataTable/src/main/javascript/ClientUI/controls/grid/GridHeader.js
===================================================================
--- trunk/ui/scrollableDataTable/src/main/javascript/ClientUI/controls/grid/GridHeader.js	2007-08-16 15:23:03 UTC (rev 2298)
+++ trunk/ui/scrollableDataTable/src/main/javascript/ClientUI/controls/grid/GridHeader.js	2007-08-16 16:08:29 UTC (rev 2299)
@@ -16,7 +16,7 @@
 	CLASSDEF: {
 		name: 'ClientUI.controls.grid.GridHeader',
 		parent: ClientUI.common.box.Box,
-		sepStyleClass: "dr-sgrid-hsep"
+		sepStyleClass: "dr-sdt-hsep"
 	}
 	
 });
@@ -397,7 +397,7 @@
 	},
 	OnCellMouseDown: function(event) {
 		var el = Event.element(event);
-		while(el && !Element.hasClassName(el, "dr-sgrid-hc")) {
+		while(el && !Element.hasClassName(el, "dr-sdt-hc")) {
 			el = el.parentNode;
 		}
 		

Modified: trunk/ui/scrollableDataTable/src/main/javascript/ClientUI/controls/grid/Selection.js
===================================================================
--- trunk/ui/scrollableDataTable/src/main/javascript/ClientUI/controls/grid/Selection.js	2007-08-16 15:23:03 UTC (rev 2298)
+++ trunk/ui/scrollableDataTable/src/main/javascript/ClientUI/controls/grid/Selection.js	2007-08-16 16:08:29 UTC (rev 2299)
@@ -269,10 +269,10 @@
 			while(j <= this.selection.ranges[i].indexes[1]) {
 				var fElement = $(this.prefix + ":f:" + j);
 				var nElement = $(this.prefix + ":n:" + j);
-				Element.addClassName(fElement, "dr-sgrid-row-selected");
-				Element.addClassName(nElement, "dr-sgrid-row-selected");
-				Element.addClassName(fElement, "rich-sgrid-row-selected");
-				Element.addClassName(nElement, "rich-sgrid-row-selected");
+				Element.addClassName(fElement, "dr-sdt-row-selected");
+				Element.addClassName(nElement, "dr-sdt-row-selected");
+				Element.addClassName(fElement, "rich-sdt-row-selected");
+				Element.addClassName(nElement, "rich-sdt-row-selected");
 				Element.addClassName(fElement, this.selectedClass);
 				Element.addClassName(nElement, this.selectedClass);
 				j++;
@@ -482,10 +482,10 @@
 		this.selection.addId(rowIndex);
 		var fElement = $(this.prefix + ":f:" + rowIndex);
 		var nElement = $(this.prefix + ":n:" + rowIndex);
-		Element.addClassName(fElement, "dr-sgrid-row-selected");
-		Element.addClassName(nElement, "dr-sgrid-row-selected");
-		Element.addClassName(fElement, "rich-sgrid-row-selected");
-		Element.addClassName(nElement, "rich-sgrid-row-selected");
+		Element.addClassName(fElement, "dr-sdt-row-selected");
+		Element.addClassName(nElement, "dr-sdt-row-selected");
+		Element.addClassName(fElement, "rich-sdt-row-selected");
+		Element.addClassName(nElement, "rich-sdt-row-selected");
 		Element.addClassName(fElement, this.selectedClass);
 		Element.addClassName(nElement, this.selectedClass);
 	},
@@ -494,10 +494,10 @@
 		this.selection.removeId(rowIndex);
 		var fElement = $(this.prefix + ":f:" + rowIndex);
 		var nElement = $(this.prefix + ":n:" + rowIndex);
-		Element.removeClassName(fElement, "dr-sgrid-row-selected");
-		Element.removeClassName(nElement, "dr-sgrid-row-selected");
-		Element.removeClassName(fElement, "rich-sgrid-row-selected");
-		Element.removeClassName(nElement, "rich-sgrid-row-selected");
+		Element.removeClassName(fElement, "dr-sdt-row-selected");
+		Element.removeClassName(nElement, "dr-sdt-row-selected");
+		Element.removeClassName(fElement, "rich-sdt-row-selected");
+		Element.removeClassName(nElement, "rich-sdt-row-selected");
 		Element.removeClassName(fElement, this.selectedClass);
 		Element.removeClassName(nElement, this.selectedClass);
 	},
@@ -507,19 +507,19 @@
 		if(this.activeRow != null) {
 			fElement = $(this.prefix + ":f:" + this.activeRow);
 			nElement = $(this.prefix + ":n:" + this.activeRow);
-		Element.removeClassName(fElement, "dr-sgrid-row-active");
-		Element.removeClassName(nElement, "dr-sgrid-row-active");
-		Element.removeClassName(fElement, "rich-sgrid-row-active");
-		Element.removeClassName(nElement, "rich-sgrid-row-active");
+		Element.removeClassName(fElement, "dr-sdt-row-active");
+		Element.removeClassName(nElement, "dr-sdt-row-active");
+		Element.removeClassName(fElement, "rich-sdt-row-active");
+		Element.removeClassName(nElement, "rich-sdt-row-active");
 		Element.removeClassName(fElement, this.activeClass);
 		Element.removeClassName(nElement, this.activeClass);
 		}
 		fElement = $(this.prefix + ":f:" + rowIndex);
 		nElement = $(this.prefix + ":n:" + rowIndex);
-		Element.addClassName(fElement, "dr-sgrid-row-active");
-		Element.addClassName(nElement, "dr-sgrid-row-active");
-		Element.addClassName(fElement, "rich-sgrid-row-active");
-		Element.addClassName(nElement, "rich-sgrid-row-active");
+		Element.addClassName(fElement, "dr-sdt-row-active");
+		Element.addClassName(nElement, "dr-sdt-row-active");
+		Element.addClassName(fElement, "rich-sdt-row-active");
+		Element.addClassName(nElement, "rich-sdt-row-active");
 		Element.addClassName(fElement, this.activeClass);
 		Element.addClassName(nElement, this.activeClass);
 		this.activeRow = rowIndex;

Deleted: trunk/ui/scrollableDataTable/src/main/resources/org/richfaces/renderkit/html/css/grid.xcss
===================================================================
--- trunk/ui/scrollableDataTable/src/main/resources/org/richfaces/renderkit/html/css/grid.xcss	2007-08-16 15:23:03 UTC (rev 2298)
+++ trunk/ui/scrollableDataTable/src/main/resources/org/richfaces/renderkit/html/css/grid.xcss	2007-08-16 16:08:29 UTC (rev 2299)
@@ -1,325 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<f:template
-    xmlns:f="http://jsf.exadel.com/template"
-    xmlns:u="http://jsf.exadel.com/template/util"
-    xmlns="http://www.w3.org/1999/xhtml">
-
-	<f:verbatim>
-	
-		.dr-sgrid-sort-asc, .dr-sgrid-sort-desc {
-			width: 16px;
-			height: 6px;
-			background-position: 50% 50%;
-			background-repeat: no-repeat;
-		}
-		
-		.dr-sgrid-sort-icon {
-			position:absolute;
-			visibility: hidden;
-		}
-		
-		.dr-sgrid {
-			padding: 0px 0px;
-			margin: 0px;
-			z-index:0;
-			border-style: solid;
-		}
-		
-		/**
-		 * ---------------------------------------------
-		 *	Grid Header declaration
-		 * ---------------------------------------------
-		 */
-		
-		/**
-		 * Header row
-		 */
-		.dr-sgrid-hr {
-			z-index:2;
-		}
-			
-		/**
-		 * Header cell
-		 */
-		.dr-sgrid-hc {
-			-o-text-overflow: ellipsis;
-			text-overflow: ellipsis;
-			overflow: hidden;
-			font-weight: normal;
-			cursor: default;
-			box-sizing: border-box;
-			-moz-box-sizing: border-box;
-			-moz-outline: none;
-			-moz-user-focus: normal;
-			padding: 0px 0px;
-			white-space: nowrap;	
-			border-bottom-style: solid;
-			border-right-style: solid;
-		}
-		
-		.dr-sgrid-hc .sort-asc, .dr-sgrid-hc .sort-desc {
-			background-position: right;
-			background-repeat: no-repeat;
-			width: 16px !important;;
-			position: absolute;
-		}
-		
-		
-		/**
-		 * Header cells separator
-		 */
-		.dr-sgrid-hsep {
-		/*	background-image: url(grid-split.gif);*/
-			background-position: center;
-			background-repeat: repeat-y;
-			cursor: e-resize;	
-			font-size: 1px;
-			top: 15%;
-			width: 6px;
-			height: 70%;
-		    overflow: hidden;
-			position: absolute;
-			display: block;
-			white-space: nowrap;
-			z-index: 60;
-		}
-		.dr-sgrid-hsplit {
-			width:1px;
-			border-right: 1px dashed;
-			cursor: col-resize;
-			z-index: 100;
-		}
-		
-		/**
-		 * Header cell body
-		 */
-		.dr-sgrid-hcbody {
-			cursor: default;
-			padding: 3px 5px;
-			white-space: nowrap;
-		 	position: relative;
-			display: block;
-			overflow: hidden;	
-			width: 100%;
-			font-weight: normal;
-		}
-		
-		.dr-sgrid-fb{
-			z-index: 50;
-		}
-		.dr-sgrid-nb {
-			z-index: 20;
-		}
-		
-		/**
-		 * ---------------------------------------------
-		 * Grid Footer declaration
-		 * ---------------------------------------------
-		 */
-		 
-		/**
-		 * Footer row
-		 */
-		.dr-sgrid-fr {
-			font-weight: normal;
-			height: 22px;
-			border-top: 1px solid #cbc7b8; /* //TODO Which skin parameter must be here? */
-		}
-		
-		/**
-		 * Footer cell
-		 */
-		.dr-sgrid-fc {
-			-o-text-overflow: ellipsis;
-			text-overflow: ellipsis;	
-			overflow: hidden;
-			font-weight: normal;
-			cursor: default;
-			box-sizing: border-box;
-			-moz-box-sizing: border-box;
-			-moz-outline: none;
-			-moz-user-focus: normal;
-			border-right: 1px solid;
-			height:21px !important;
-			padding: 0px 0px;
-			white-space: nowrap;
-		}
-		
-		/**
-		 * Footer cell body
-		 */
-		.dr-sgrid-fcbody {
-			cursor: default;
-			font-weight: normal;
-			padding: 3px 5px;
-			white-space: nowrap;
-			position: relative;
-			display: block;
-			overflow: hidden;
-		}
-		
-		.dr-sgrid-fcbody1{
-			cursor: default;
-			font-weight: normal;
-			padding: 0px 0px;
-			white-space: nowrap;
-			position: relative;
-			display: block;
-			overflow: hidden;
-			width: 100%;
-		}
-		
-		/**
-		 * ---------------------------------------------
-		 * Body styles
-		 * ---------------------------------------------
-		 */
-		 
-		/**
-		 * Body cell declaration
-		 * dr-sgrid-bc - reqired
-		 * dr-sgrid-bcDef - default, used if no custom styles defined in body template
-		 */
-		.dr-sgrid-bc {
-			box-sizing: border-box;
-			-moz-box-sizing: border-box;
-			-moz-outline: none;
-			-moz-user-focus: normal;
-			cursor: default;
-			border-right: 1px solid;
-			border-bottom: 1px solid;
-		}
-		
-		/**
-		 * Body row style
-		 */
-		.dr-sgrid-ho {
-			position: absolute;
-			height: 10px;
-			width: 10px;
-		}
-		
-		.dr-sgrid-rb {
-			font-weight: normal;
-			white-space: nowrap;
-			box-sizing: border-box;
-			-moz-box-sizing: border-box;
-		}
-		
-		.dr-sgrid-row-active {
-			background-color: #C6D6EA; /* //TODO Which skin parameter must be here? */
-		}
-		
-		.dr-sgrid-bcbody {
-			cursor: default;
-			font-weight: normal;
-			white-space: nowrap;	
-			padding: 0px 0px;
-		 	position: relative;
-			display: block;
-			overflow: hidden;
-			-o-text-overflow: ellipsis;
-			text-overflow: ellipsis;
-			-moz-box-sizing: border-box;
-			-moz-outline: none;	
-			width: 100%;
-			height: 20px;
-		}
-		
-		/** 
-		 * Helper classes for grid template
-		*/
-		.dr-sgrid-substrate {
-			z-index: 48;
-		 	filter:Alpha(opacity=0);
-		 	position:absolute;
-		 	top:0px;
-		 	left:0px;
-		 	display:block;
-		}
-		
-		.dr-sgrid-tmplbox {
-		 	display: block;
-		        float:left;
-		}
-		
-		.dr-sgrid-inlinebox {
-		 	position: relative;
-			display: block;
-			overflow: hidden;	
-		}
-	</f:verbatim>
-	
-	<u:selector name=".dr-sgrid">
-	    <u:style name="background-color" skin="tableBackgroundColor" />
-	    <u:style name="border-color" skin="tableBorderColor" />
-	    <u:style name="border-width" skin="tableBorderWidth" />
-	</u:selector>
-	<u:selector name=".dr-sgrid-hr">
-	    <u:style name="background-color" skin="headerBackgroundColor" />
-	</u:selector>
-	<u:selector name=".dr-sgrid-hc">
-	    <u:style name="color" skin="headerTextColor" />
-	    <u:style name="font-family" skin="generalFamilyFont" />
-	    <u:style name="font-size" skin="generalSizeFont" />
-	    <u:style name="border-bottom-width" skin="tableBorderWidth" />
-	    <u:style name="border-bottom-color" skin="tableBorderColor" />
-	    <u:style name="border-right-width" skin="tableBorderWidth" />
-	    <u:style name="border-right-color" skin="tableBorderColor" />
-	</u:selector>
-	<u:selector name=".dr-sgrid-hsplit">
-	    <u:style name="border-right-color" skin="tipBorderColor" />
-	</u:selector>
-	<u:selector name=".dr-sgrid-hcbody">
-	    <u:style name="font-family" skin="generalFamilyFont" />
-	    <u:style name="font-size" skin="generalSizeFont" />
-	</u:selector>
-	<u:selector name=".dr-sgrid-fr">
-	    <u:style name="background-color" skin="tableSubfooterBackgroundColor" />
-	    <u:style name="font-family" skin="generalFamilyFont" />
-	    <u:style name="font-size" skin="generalSizeFont" />
-	</u:selector>
-	<u:selector name=".dr-sgrid-fc">
-	    <u:style name="border-right-color" skin="tableBorderColor" />
-	    <u:style name="font-family" skin="generalFamilyFont" />
-	    <u:style name="font-size" skin="generalSizeFont" />
-	</u:selector>
-	<u:selector name=".dr-sgrid-fcbody">
-	    <u:style name="font-family" skin="generalFamilyFont" />
-	    <u:style name="font-size" skin="generalSizeFont" />
-	</u:selector>
-	<u:selector name=".dr-sgrid-fcbody1">
-	    <u:style name="font-family" skin="generalFamilyFont" />
-	    <u:style name="font-size" skin="generalSizeFont" />
-	</u:selector>
-	<u:selector name=".dr-sgrid-bc">
-	    <u:style name="border-right-color" skin="tableBorderColor" />
-	    <u:style name="border-bottom-color" skin="tableBorderColor" />
-	</u:selector>
-	<u:selector name=".dr-sgrid-rb">
-	    <u:style name="font-family" skin="generalFamilyFont" />
-	    <u:style name="font-size" skin="generalSizeFont" />
-	</u:selector>
-	<u:selector name=".dr-sgrid-row-selected">
-	    <u:style name="background-color" skin="additionalBackgroundColor" />
-	</u:selector>
-	<u:selector name=".dr-sgrid-bcbody">
-	    <u:style name="font-family" skin="generalFamilyFont" />
-	    <u:style name="font-size" skin="generalSizeFont" />
-	</u:selector>
-	<u:selector name=".dr-sgrid-sort-asc">
-		<u:style name="background-image">
-			<f:resource f:key="org.richfaces.renderkit.html.iconimages.ScrollableGridIconSortAsc"/>
-		</u:style>
-	</u:selector>
-	<u:selector name=".dr-sgrid-sort-desc">
-		<u:style name="background-image">
-			<f:resource f:key="org.richfaces.renderkit.html.iconimages.ScrollableGridIconSortDesc"/>
-		</u:style>
-	</u:selector>
-	<u:selector name=".dr-sgrid-hsep">
-		<u:style name="background-image">
-			<f:resource f:key="org.richfaces.renderkit.html.iconimages.ScrollableGridIconSplit"/>
-		</u:style>
-	</u:selector>
-</f:template>

Added: trunk/ui/scrollableDataTable/src/main/resources/org/richfaces/renderkit/html/css/scrollable-data-table.xcss
===================================================================
--- trunk/ui/scrollableDataTable/src/main/resources/org/richfaces/renderkit/html/css/scrollable-data-table.xcss	                        (rev 0)
+++ trunk/ui/scrollableDataTable/src/main/resources/org/richfaces/renderkit/html/css/scrollable-data-table.xcss	2007-08-16 16:08:29 UTC (rev 2299)
@@ -0,0 +1,325 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<f:template
+    xmlns:f="http://jsf.exadel.com/template"
+    xmlns:u="http://jsf.exadel.com/template/util"
+    xmlns="http://www.w3.org/1999/xhtml">
+
+	<f:verbatim>
+	
+		.dr-sdt-sort-asc, .dr-sdt-sort-desc {
+			width: 16px;
+			height: 6px;
+			background-position: 50% 50%;
+			background-repeat: no-repeat;
+		}
+		
+		.dr-sdt-sort-icon {
+			position:absolute;
+			visibility: hidden;
+		}
+		
+		.dr-sdt {
+			padding: 0px 0px;
+			margin: 0px;
+			z-index:0;
+			border-style: solid;
+		}
+		
+		/**
+		 * ---------------------------------------------
+		 *	Grid Header declaration
+		 * ---------------------------------------------
+		 */
+		
+		/**
+		 * Header row
+		 */
+		.dr-sdt-hr {
+			z-index:2;
+		}
+			
+		/**
+		 * Header cell
+		 */
+		.dr-sdt-hc {
+			-o-text-overflow: ellipsis;
+			text-overflow: ellipsis;
+			overflow: hidden;
+			font-weight: normal;
+			cursor: default;
+			box-sizing: border-box;
+			-moz-box-sizing: border-box;
+			-moz-outline: none;
+			-moz-user-focus: normal;
+			padding: 0px 0px;
+			white-space: nowrap;	
+			border-bottom-style: solid;
+			border-right-style: solid;
+		}
+		
+		.dr-sdt-hc .sort-asc, .dr-sdt-hc .sort-desc {
+			background-position: right;
+			background-repeat: no-repeat;
+			width: 16px !important;;
+			position: absolute;
+		}
+		
+		
+		/**
+		 * Header cells separator
+		 */
+		.dr-sdt-hsep {
+		/*	background-image: url(grid-split.gif);*/
+			background-position: center;
+			background-repeat: repeat-y;
+			cursor: e-resize;	
+			font-size: 1px;
+			top: 15%;
+			width: 6px;
+			height: 70%;
+		    overflow: hidden;
+			position: absolute;
+			display: block;
+			white-space: nowrap;
+			z-index: 60;
+		}
+		.dr-sdt-hsplit {
+			width:1px;
+			border-right: 1px dashed;
+			cursor: col-resize;
+			z-index: 100;
+		}
+		
+		/**
+		 * Header cell body
+		 */
+		.dr-sdt-hcbody {
+			cursor: default;
+			padding: 3px 5px;
+			white-space: nowrap;
+		 	position: relative;
+			display: block;
+			overflow: hidden;	
+			width: 100%;
+			font-weight: normal;
+		}
+		
+		.dr-sdt-fb{
+			z-index: 50;
+		}
+		.dr-sdt-nb {
+			z-index: 20;
+		}
+		
+		/**
+		 * ---------------------------------------------
+		 * Grid Footer declaration
+		 * ---------------------------------------------
+		 */
+		 
+		/**
+		 * Footer row
+		 */
+		.dr-sdt-fr {
+			font-weight: normal;
+			height: 22px;
+			border-top: 1px solid #cbc7b8; /* //TODO Which skin parameter must be here? */
+		}
+		
+		/**
+		 * Footer cell
+		 */
+		.dr-sdt-fc {
+			-o-text-overflow: ellipsis;
+			text-overflow: ellipsis;	
+			overflow: hidden;
+			font-weight: normal;
+			cursor: default;
+			box-sizing: border-box;
+			-moz-box-sizing: border-box;
+			-moz-outline: none;
+			-moz-user-focus: normal;
+			border-right: 1px solid;
+			height:21px !important;
+			padding: 0px 0px;
+			white-space: nowrap;
+		}
+		
+		/**
+		 * Footer cell body
+		 */
+		.dr-sdt-fcbody {
+			cursor: default;
+			font-weight: normal;
+			padding: 3px 5px;
+			white-space: nowrap;
+			position: relative;
+			display: block;
+			overflow: hidden;
+		}
+		
+		.dr-sdt-fcbody1{
+			cursor: default;
+			font-weight: normal;
+			padding: 0px 0px;
+			white-space: nowrap;
+			position: relative;
+			display: block;
+			overflow: hidden;
+			width: 100%;
+		}
+		
+		/**
+		 * ---------------------------------------------
+		 * Body styles
+		 * ---------------------------------------------
+		 */
+		 
+		/**
+		 * Body cell declaration
+		 * dr-sdt-bc - reqired
+		 * dr-sdt-bcDef - default, used if no custom styles defined in body template
+		 */
+		.dr-sdt-bc {
+			box-sizing: border-box;
+			-moz-box-sizing: border-box;
+			-moz-outline: none;
+			-moz-user-focus: normal;
+			cursor: default;
+			border-right: 1px solid;
+			border-bottom: 1px solid;
+		}
+		
+		/**
+		 * Body row style
+		 */
+		.dr-sdt-ho {
+			position: absolute;
+			height: 10px;
+			width: 10px;
+		}
+		
+		.dr-sdt-rb {
+			font-weight: normal;
+			white-space: nowrap;
+			box-sizing: border-box;
+			-moz-box-sizing: border-box;
+		}
+		
+		.dr-sdt-row-active {
+			background-color: #C6D6EA; /* //TODO Which skin parameter must be here? */
+		}
+		
+		.dr-sdt-bcbody {
+			cursor: default;
+			font-weight: normal;
+			white-space: nowrap;	
+			padding: 0px 0px;
+		 	position: relative;
+			display: block;
+			overflow: hidden;
+			-o-text-overflow: ellipsis;
+			text-overflow: ellipsis;
+			-moz-box-sizing: border-box;
+			-moz-outline: none;	
+			width: 100%;
+			height: 20px;
+		}
+		
+		/** 
+		 * Helper classes for grid template
+		*/
+		.dr-sdt-substrate {
+			z-index: 48;
+		 	filter:Alpha(opacity=0);
+		 	position:absolute;
+		 	top:0px;
+		 	left:0px;
+		 	display:block;
+		}
+		
+		.dr-sdt-tmplbox {
+		 	display: block;
+		        float:left;
+		}
+		
+		.dr-sdt-inlinebox {
+		 	position: relative;
+			display: block;
+			overflow: hidden;	
+		}
+	</f:verbatim>
+	
+	<u:selector name=".dr-sdt">
+	    <u:style name="background-color" skin="tableBackgroundColor" />
+	    <u:style name="border-color" skin="tableBorderColor" />
+	    <u:style name="border-width" skin="tableBorderWidth" />
+	</u:selector>
+	<u:selector name=".dr-sdt-hr">
+	    <u:style name="background-color" skin="headerBackgroundColor" />
+	</u:selector>
+	<u:selector name=".dr-sdt-hc">
+	    <u:style name="color" skin="headerTextColor" />
+	    <u:style name="font-family" skin="generalFamilyFont" />
+	    <u:style name="font-size" skin="generalSizeFont" />
+	    <u:style name="border-bottom-width" skin="tableBorderWidth" />
+	    <u:style name="border-bottom-color" skin="tableBorderColor" />
+	    <u:style name="border-right-width" skin="tableBorderWidth" />
+	    <u:style name="border-right-color" skin="tableBorderColor" />
+	</u:selector>
+	<u:selector name=".dr-sdt-hsplit">
+	    <u:style name="border-right-color" skin="tipBorderColor" />
+	</u:selector>
+	<u:selector name=".dr-sdt-hcbody">
+	    <u:style name="font-family" skin="generalFamilyFont" />
+	    <u:style name="font-size" skin="generalSizeFont" />
+	</u:selector>
+	<u:selector name=".dr-sdt-fr">
+	    <u:style name="background-color" skin="tableSubfooterBackgroundColor" />
+	    <u:style name="font-family" skin="generalFamilyFont" />
+	    <u:style name="font-size" skin="generalSizeFont" />
+	</u:selector>
+	<u:selector name=".dr-sdt-fc">
+	    <u:style name="border-right-color" skin="tableBorderColor" />
+	    <u:style name="font-family" skin="generalFamilyFont" />
+	    <u:style name="font-size" skin="generalSizeFont" />
+	</u:selector>
+	<u:selector name=".dr-sdt-fcbody">
+	    <u:style name="font-family" skin="generalFamilyFont" />
+	    <u:style name="font-size" skin="generalSizeFont" />
+	</u:selector>
+	<u:selector name=".dr-sdt-fcbody1">
+	    <u:style name="font-family" skin="generalFamilyFont" />
+	    <u:style name="font-size" skin="generalSizeFont" />
+	</u:selector>
+	<u:selector name=".dr-sdt-bc">
+	    <u:style name="border-right-color" skin="tableBorderColor" />
+	    <u:style name="border-bottom-color" skin="tableBorderColor" />
+	</u:selector>
+	<u:selector name=".dr-sdt-rb">
+	    <u:style name="font-family" skin="generalFamilyFont" />
+	    <u:style name="font-size" skin="generalSizeFont" />
+	</u:selector>
+	<u:selector name=".dr-sdt-row-selected">
+	    <u:style name="background-color" skin="additionalBackgroundColor" />
+	</u:selector>
+	<u:selector name=".dr-sdt-bcbody">
+	    <u:style name="font-family" skin="generalFamilyFont" />
+	    <u:style name="font-size" skin="generalSizeFont" />
+	</u:selector>
+	<u:selector name=".dr-sdt-sort-asc">
+		<u:style name="background-image">
+			<f:resource f:key="org.richfaces.renderkit.html.iconimages.ScrollableDataTableIconSortAsc"/>
+		</u:style>
+	</u:selector>
+	<u:selector name=".dr-sdt-sort-desc">
+		<u:style name="background-image">
+			<f:resource f:key="org.richfaces.renderkit.html.iconimages.ScrollableDataTableIconSortDesc"/>
+		</u:style>
+	</u:selector>
+	<u:selector name=".dr-sdt-hsep">
+		<u:style name="background-image">
+			<f:resource f:key="org.richfaces.renderkit.html.iconimages.ScrollableDataTableIconSplit"/>
+		</u:style>
+	</u:selector>
+</f:template>

Added: trunk/ui/scrollableDataTable/src/main/templates/org/richfaces/scrollable-data-table-cell.jspx
===================================================================
--- trunk/ui/scrollableDataTable/src/main/templates/org/richfaces/scrollable-data-table-cell.jspx	                        (rev 0)
+++ trunk/ui/scrollableDataTable/src/main/templates/org/richfaces/scrollable-data-table-cell.jspx	2007-08-16 16:08:29 UTC (rev 2299)
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<f:root 
+	xmlns:f="http://ajax4jsf.org/cdk/template" 
+	xmlns:c=" http://java.sun.com/jsf/core" 
+	xmlns:ui=" http://ajax4jsf.org/cdk/ui"
+	xmlns:u=" http://ajax4jsf.org/cdk/u"
+	xmlns:x=" http://ajax4jsf.org/cdk/x"
+	xmlns:h=" http://ajax4jsf.org/cdk/headers"
+	xmlns:vcp="http://ajax4jsf.org/cdk/vcp"	
+	class="org.richfaces.renderkit.html.ScrollableDataTableCellRenderer"
+	component="javax.faces.component.UIComponent" 
+	>
+	
+	<td class="dr-sdt-bc rich-sdt-column-cell #{component.attributes['styleClass']}" id="#{client_id}:c_#{cell_id}">
+		<div id="#{client_id}:bc_#{cell_id}" class="dr-sdt-bcbody  #{component.attributes['cellClass']}" style="#{component.attributes['cellStyle']}">
+			<vcp:body/>
+		</div>
+	</td>
+
+</f:root>
\ No newline at end of file

Added: trunk/ui/scrollableDataTable/src/main/templates/org/richfaces/scrollable-data-table-footer-cell.jspx
===================================================================
--- trunk/ui/scrollableDataTable/src/main/templates/org/richfaces/scrollable-data-table-footer-cell.jspx	                        (rev 0)
+++ trunk/ui/scrollableDataTable/src/main/templates/org/richfaces/scrollable-data-table-footer-cell.jspx	2007-08-16 16:08:29 UTC (rev 2299)
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<f:root 
+	xmlns:f="http://ajax4jsf.org/cdk/template" 
+	xmlns:c=" http://java.sun.com/jsf/core" 
+	xmlns:ui=" http://ajax4jsf.org/cdk/ui"
+	xmlns:u=" http://ajax4jsf.org/cdk/u"
+	xmlns:x=" http://ajax4jsf.org/cdk/x"
+	xmlns:h=" http://ajax4jsf.org/cdk/headers"
+	xmlns:vcp="http://ajax4jsf.org/cdk/vcp"	
+	class="org.richfaces.renderkit.html.ScrollableDataTableFooterCellRenderer"
+	component="javax.faces.component.UIComponent" 
+	>
+	
+	<th class="dr-sdt-fc rich-sdt-footer-cell #{component.attributes['footerClass']}">
+		<span id="#{client_id}:fc_#{cell_index}" class="dr-sdt-fcbody1">
+			<span class="dr-sdt-fcbody">
+				<vcp:body/>
+			</span>
+		</span>
+	</th>
+	
+</f:root>	
\ No newline at end of file

Added: trunk/ui/scrollableDataTable/src/main/templates/org/richfaces/scrollable-data-table-header-cell.jspx
===================================================================
--- trunk/ui/scrollableDataTable/src/main/templates/org/richfaces/scrollable-data-table-header-cell.jspx	                        (rev 0)
+++ trunk/ui/scrollableDataTable/src/main/templates/org/richfaces/scrollable-data-table-header-cell.jspx	2007-08-16 16:08:29 UTC (rev 2299)
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<f:root 
+	xmlns:f="http://ajax4jsf.org/cdk/template" 
+	xmlns:c=" http://java.sun.com/jsf/core" 
+	xmlns:ui=" http://ajax4jsf.org/cdk/ui"
+	xmlns:u=" http://ajax4jsf.org/cdk/u"
+	xmlns:x=" http://ajax4jsf.org/cdk/x"
+	xmlns:h=" http://ajax4jsf.org/cdk/headers"
+	xmlns:vcp="http://ajax4jsf.org/cdk/vcp"
+	
+	class="org.richfaces.renderkit.html.ScrollableDataTableHeaderCellRenderer"
+	component="javax.faces.component.UIComponent" 
+	>
+
+	<th class="dr-sdt-hc rich-sdt-header-cell" id="#{client_id}:hc_#{cell_index}" columnIndex="#{cell_index}" sortable="#{component.attributes['sortable']}">
+		
+		<vcp:body/>
+		
+		<jsp:scriptlet>
+			
+			int offset = ((Integer)variables.getVariable("sepOffset")).intValue() - 3;
+			
+		</jsp:scriptlet>
+		<span column="#{cell_index}" id="#{client_id}:hsep_#{cell_index}" style="left: #{offset}px;" class="dr-sdt-hsep rich-sdt-hsep" />
+	</th>
+
+</f:root>	
\ No newline at end of file

Added: trunk/ui/scrollableDataTable/src/main/templates/org/richfaces/scrollable-data-table-header-itself.jspx
===================================================================
--- trunk/ui/scrollableDataTable/src/main/templates/org/richfaces/scrollable-data-table-header-itself.jspx	                        (rev 0)
+++ trunk/ui/scrollableDataTable/src/main/templates/org/richfaces/scrollable-data-table-header-itself.jspx	2007-08-16 16:08:29 UTC (rev 2299)
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<f:root 
+	xmlns:f="http://ajax4jsf.org/cdk/template" 
+	xmlns:c=" http://java.sun.com/jsf/core" 
+	xmlns:ui=" http://ajax4jsf.org/cdk/ui"
+	xmlns:u=" http://ajax4jsf.org/cdk/u"
+	xmlns:x=" http://ajax4jsf.org/cdk/x"
+	xmlns:h=" http://ajax4jsf.org/cdk/headers"
+	xmlns:vcp="http://ajax4jsf.org/cdk/vcp"
+	baseclass="org.richfaces.renderkit.html.SortIconRenderer"
+	class="org.richfaces.renderkit.html.ScrollableDataTableHeaderItselfRenderer"
+	component="javax.faces.component.UIComponent" 
+	>
+
+<div id="#{client_id}:hcb_#{cell_index}" class="dr-sdt-hcbody #{component.attributes['headerClass']}">
+	<vcp:body/>
+
+	<div align="right" id="#{client_id}:hs_#{cell_index}" class="dr-sdt-sort-icon">
+			<c:if test="#{sortAscending}">
+				<f:call name="renderAscIcon"/>
+			</c:if>
+			<c:if test="#{sortDescending}">
+				<f:call name="renderDescIcon"/>
+			</c:if>
+	</div>
+	
+</div>
+<ajax:update>#{client_id}:hcb_#{cell_index}</ajax:update>
+
+</f:root>
\ No newline at end of file

Added: trunk/ui/scrollableDataTable/src/main/templates/org/richfaces/scrollable-data-table.jspx
===================================================================
--- trunk/ui/scrollableDataTable/src/main/templates/org/richfaces/scrollable-data-table.jspx	                        (rev 0)
+++ trunk/ui/scrollableDataTable/src/main/templates/org/richfaces/scrollable-data-table.jspx	2007-08-16 16:08:29 UTC (rev 2299)
@@ -0,0 +1,240 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<f:root 
+	xmlns:f="http://ajax4jsf.org/cdk/template" 
+	xmlns:c=" http://java.sun.com/jsf/core" 
+	xmlns:ui=" http://ajax4jsf.org/cdk/ui"
+	xmlns:u=" http://ajax4jsf.org/cdk/u"
+	xmlns:x=" http://ajax4jsf.org/cdk/x"
+	xmlns:h=" http://ajax4jsf.org/cdk/headers"
+	xmlns:vcp="http://ajax4jsf.org/cdk/vcp"	
+	class="org.richfaces.renderkit.html.ScrollableDataTableRenderer"
+	baseclass="org.richfaces.renderkit.html.ScrollableDataTableBaseRenderer"
+	component="org.richfaces.component.UIScrollableDataTable" 
+	>	
+	<jsp:directive.page import="javax.faces.component.UIComponent,javax.faces.component.UIColumn, java.util.List, java.util.Iterator, org.richfaces.component.Column"/>
+	<h:styles>
+		/org/richfaces/renderkit/html/css/scrollable-data-table.xcss
+	</h:styles>
+	
+	<h:scripts>
+		new org.ajax4jsf.javascript.PrototypeScript(),
+		new org.ajax4jsf.javascript.AjaxScript(),
+		/org/richfaces/renderkit/html/scripts/extend/extend.js,
+		/org/richfaces/renderkit/html/scripts/scrollable-data-table.js
+	</h:scripts>
+
+	<f:clientId var="clientId" />
+
+	<f:call name="setUpColumnsWidth"/>	
+	
+	<jsp:scriptlet>
+     	<![CDATA[
+			List children = component.getChildren();
+			String hStyle, fStyle;
+			boolean footer = false;
+			boolean header = false;
+	
+			for (Iterator iterator = children.iterator(); iterator.hasNext();) {
+				UIComponent column = (UIComponent) iterator.next();
+				if(column instanceof UIColumn){
+					UIComponent hFacet = ((UIColumn) column).getHeader(); 
+					UIComponent fFacet = ((UIColumn) column).getFooter();
+					if(hFacet != null){
+						if(!header)
+							header = true;
+					}
+					if(fFacet != null){
+						if(!footer)
+							footer = true;
+					}
+				}
+			}
+			
+			if(header){
+				hStyle = "";
+			}else{
+				hStyle = "display: none";
+			}
+			if(footer){
+				fStyle = "";
+			}else{;
+				fStyle = "display: none";
+			}
+			
+			variables.setVariable("fStyle", fStyle);
+			variables.setVariable("hStyle", hStyle);
+		]]>
+	</jsp:scriptlet>
+	
+	
+	<div id="#{clientId}" style="width: #{component.attributes['width']};height: #{component.attributes['height']};" class="dr-sdt  #{component.attributes['styleClass']}" >
+		<div id="#{clientId}:cs" class="dr-sdt-hsplit" />
+		<div id="#{clientId}_GridHeaderTemplate" class="dr-sdt-inlinebox" style="#{hStyle}; width: #{component.attributes['width']};">
+			<iframe id="#{clientId}:hs" class="dr-sdt-substrate" src="" scrolling="no" frameborder="0" > <br/> </iframe>
+			<div style="display: block; left: 0px; top: 0px; width: #{sumWidth}px;">			
+					<span class="dr-sdt-tmplbox dr-sdt-fb" id="#{clientId}:header:FrozenBox">
+						<table cellpadding="0" cellspacing="0" style="border-collapse:collapse; table-layout:fixed">
+							
+							<jsp:scriptlet>
+								<![CDATA[
+									renderCols(context, component, true);
+								]]>
+							</jsp:scriptlet>					
+							
+							<thead>
+								<tr class="dr-sdt-hr #{component.attributes['headerClass']}">
+									<jsp:scriptlet>
+				                   		<![CDATA[
+											renderHeaders(context, component, true);
+										]]>
+									</jsp:scriptlet>
+								</tr>
+							</thead>
+						</table>					
+					</span>
+			
+					<span class="dr-sdt-tmplbox dr-sdt-nb" id="#{clientId}:header:NormalBox">
+						<table cellpadding="0" cellspacing="0" style="border-collapse:collapse; table-layout:fixed">
+							
+							<jsp:scriptlet>
+								<![CDATA[
+									renderCols(context, component, false);
+								]]>
+							</jsp:scriptlet>					
+							<col width="1"/>
+							<thead>
+								<tr class="dr-sdt-hr  #{component.attributes['headerClass']}">
+									<jsp:scriptlet>
+				                   		<![CDATA[
+											renderHeaders(context, component, false);
+										]]>
+									</jsp:scriptlet>
+									<th></th>
+								</tr>
+							</thead>
+						</table>
+				</span>	
+			</div>			
+		</div>
+		
+		
+		
+		<div id="#{clientId}_GridBodyTemplate" class="dr-sdt-inlinebox" style="overflow: auto; width: #{component.attributes['width']}; height: #{component.attributes['height']};">
+			<div id="#{clientId}:scb" style="position: absolute; z-index: 0;">
+				<div id="#{clientId}:sb" style="position: absolute;" ><br/> </div>
+			</div>
+			<div id="#{clientId}:bc" style="display: block; width:  #{sumWidth}px;">
+				<span class="dr-sdt-tmplbox dr-sdt-fb" id="#{clientId}:body:FrozenBox">
+					<table id="#{clientId}:f" cellpadding="0" cellspacing="0" style="border-collapse:collapse; table-layout:fixed">
+						
+						<jsp:scriptlet>
+							<![CDATA[
+								renderCols(context, component, true);
+							]]>
+						</jsp:scriptlet>					
+						<tbody>
+							<jsp:scriptlet>
+				                <![CDATA[
+									renderGridBody(context, component, true);	
+								]]>
+							</jsp:scriptlet>
+						</tbody>
+					</table>
+					<span class="dr-sdt-ho" id="#{clientId}:fho" ><br/></span>
+				</span>
+				<span class="dr-sdt-tmplbox dr-sdt-nb" id="#{clientId}:body:NormalBox">
+					<table id="#{clientId}:n" cellpadding="0" cellspacing="0" style="border-collapse:collapse; table-layout:fixed">
+						
+						<jsp:scriptlet>
+							<![CDATA[
+								renderCols(context, component, false);
+							]]>
+						</jsp:scriptlet>					
+						<col width="1"/>												
+						<tbody>
+							<jsp:scriptlet>
+			                	<![CDATA[
+									renderGridBody(context, component, false);	
+								]]>
+							</jsp:scriptlet>
+						</tbody>
+					</table>
+					<span class="dr-sdt-ho" id="#{clientId}:nho" ><br/></span>
+				</span>		
+			</div>			
+		</div>
+		
+		<div id="#{clientId}_GridFooterTemplate" class="dr-sdt-inlinebox" style="#{fStyle}; width: #{component.attributes['width']};">
+			<iframe id="#{clientId}:fs" class="dr-sdt-substrate" src="" scrolling="no" frameborder="0" >  <br/></iframe>
+			<div style="display: block; width: width: #{sumWidth}px;">
+				<span class="dr-sdt-tmplbox dr-sdt-fb" id="#{clientId}:footer:FrozenBox">
+					<table cellpadding="0" cellspacing="0" style="border-collapse:collapse; table-layout:fixed">
+						
+						<jsp:scriptlet>
+							<![CDATA[
+								renderCols(context, component, true);
+							]]>
+						</jsp:scriptlet>					
+						<tfoot>
+							<tr class="dr-sdt-fr #{component.attributes['footerClass']}">	
+								<jsp:scriptlet>
+				        	        <![CDATA[
+										renderFooters(context, component,true);	
+									]]>
+								</jsp:scriptlet>
+							</tr>
+						</tfoot>
+					</table>			
+				</span>
+				
+				<span class="dr-sdt-tmplbox dr-sdt-nb" id="#{clientId}:footer:NormalBox">
+					<table cellpadding="0" cellspacing="0" style="border-collapse:collapse; table-layout:fixed">
+						
+						<jsp:scriptlet>
+							<![CDATA[
+								renderCols(context, component, false);
+							]]>
+						</jsp:scriptlet>					
+						<col width="1"/>												
+						<tfoot>
+							<tr class="dr-sdt-fr #{component.attributes['footerClass']}">
+								<jsp:scriptlet>
+				        	        <![CDATA[
+										renderFooters(context, component,false);	
+									]]>
+								</jsp:scriptlet>
+								<th></th>
+							</tr>
+						</tfoot>
+					</table>
+				</span>			
+			</div>
+		</div>			
+	
+		<input type="hidden" name="#{clientId}_hc" id="#{clientId}_hc"/>
+		<input type="hidden" name="#{clientId}_state_input" id="#{clientId}_state_input"/>
+		<input type="hidden" name="#{clientId}_options_input" id="#{clientId}_options_input"/>
+		<input type="hidden" name="#{clienId}_rows_input" id="#{clientId}_rows_input" value="#{rows_count}"/>
+		<input type="button" name="#{clientId}_submit_input" id="#{clientId}_submit_input" onclick="#{this:getRowsAjaxUpdate(context,component)}" style="display:none"/>
+		<jsp:scriptlet>
+		   <![CDATA[
+				renderHiddenScrollInput(context, component);	
+			]]>
+		</jsp:scriptlet>
+		
+		<f:call name="contributorsEncodeHere"/>
+		
+	</div>	
+	<script id="#{clientId}_grid_create_scripts" type="text/javascript">
+		//<![CDATA[
+		
+		#{this:getJavaScriptVarName(context, component)} = #{this:createClientScrollableGrid(context, component)};
+		#{this:getScriptContributions(context, component)};
+
+//		]]>
+	</script>
+	<f:call name="tearDownState"/>
+</f:root>	
+	
+	
+	
\ No newline at end of file

Deleted: trunk/ui/scrollableDataTable/src/main/templates/org/richfaces/scrollable-grid-cell.jspx
===================================================================
--- trunk/ui/scrollableDataTable/src/main/templates/org/richfaces/scrollable-grid-cell.jspx	2007-08-16 15:23:03 UTC (rev 2298)
+++ trunk/ui/scrollableDataTable/src/main/templates/org/richfaces/scrollable-grid-cell.jspx	2007-08-16 16:08:29 UTC (rev 2299)
@@ -1,20 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<f:root 
-	xmlns:f="http://ajax4jsf.org/cdk/template" 
-	xmlns:c=" http://java.sun.com/jsf/core" 
-	xmlns:ui=" http://ajax4jsf.org/cdk/ui"
-	xmlns:u=" http://ajax4jsf.org/cdk/u"
-	xmlns:x=" http://ajax4jsf.org/cdk/x"
-	xmlns:h=" http://ajax4jsf.org/cdk/headers"
-	xmlns:vcp="http://ajax4jsf.org/cdk/vcp"	
-	class="org.richfaces.renderkit.html.ScrollableGridCellRenderer"
-	component="javax.faces.component.UIComponent" 
-	>
-	
-	<td class="dr-sgrid-bc rich-sgrid-column-cell #{component.attributes['styleClass']}" id="#{client_id}:c_#{cell_id}">
-		<div id="#{client_id}:bc_#{cell_id}" class="dr-sgrid-bcbody  #{component.attributes['cellClass']}" style="#{component.attributes['cellStyle']}">
-			<vcp:body/>
-		</div>
-	</td>
-
-</f:root>
\ No newline at end of file

Deleted: trunk/ui/scrollableDataTable/src/main/templates/org/richfaces/scrollable-grid-footer-cell.jspx
===================================================================
--- trunk/ui/scrollableDataTable/src/main/templates/org/richfaces/scrollable-grid-footer-cell.jspx	2007-08-16 15:23:03 UTC (rev 2298)
+++ trunk/ui/scrollableDataTable/src/main/templates/org/richfaces/scrollable-grid-footer-cell.jspx	2007-08-16 16:08:29 UTC (rev 2299)
@@ -1,22 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<f:root 
-	xmlns:f="http://ajax4jsf.org/cdk/template" 
-	xmlns:c=" http://java.sun.com/jsf/core" 
-	xmlns:ui=" http://ajax4jsf.org/cdk/ui"
-	xmlns:u=" http://ajax4jsf.org/cdk/u"
-	xmlns:x=" http://ajax4jsf.org/cdk/x"
-	xmlns:h=" http://ajax4jsf.org/cdk/headers"
-	xmlns:vcp="http://ajax4jsf.org/cdk/vcp"	
-	class="org.richfaces.renderkit.html.ScrollableGridFooterCellRenderer"
-	component="javax.faces.component.UIComponent" 
-	>
-	
-	<th class="dr-sgrid-fc rich-sgrid-footer-cell #{component.attributes['footerClass']}">
-		<span id="#{client_id}:fc_#{cell_index}" class="dr-sgrid-fcbody1">
-			<span class="dr-sgrid-fcbody">
-				<vcp:body/>
-			</span>
-		</span>
-	</th>
-	
-</f:root>	
\ No newline at end of file

Deleted: trunk/ui/scrollableDataTable/src/main/templates/org/richfaces/scrollable-grid-header-cell.jspx
===================================================================
--- trunk/ui/scrollableDataTable/src/main/templates/org/richfaces/scrollable-grid-header-cell.jspx	2007-08-16 15:23:03 UTC (rev 2298)
+++ trunk/ui/scrollableDataTable/src/main/templates/org/richfaces/scrollable-grid-header-cell.jspx	2007-08-16 16:08:29 UTC (rev 2299)
@@ -1,27 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<f:root 
-	xmlns:f="http://ajax4jsf.org/cdk/template" 
-	xmlns:c=" http://java.sun.com/jsf/core" 
-	xmlns:ui=" http://ajax4jsf.org/cdk/ui"
-	xmlns:u=" http://ajax4jsf.org/cdk/u"
-	xmlns:x=" http://ajax4jsf.org/cdk/x"
-	xmlns:h=" http://ajax4jsf.org/cdk/headers"
-	xmlns:vcp="http://ajax4jsf.org/cdk/vcp"
-	
-	class="org.richfaces.renderkit.html.ScrollableGridHeaderCellRenderer"
-	component="javax.faces.component.UIComponent" 
-	>
-
-	<th class="dr-sgrid-hc rich-sgrid-header-cell" id="#{client_id}:hc_#{cell_index}" columnIndex="#{cell_index}" sortable="#{component.attributes['sortable']}">
-		
-		<vcp:body/>
-		
-		<jsp:scriptlet>
-			
-			int offset = ((Integer)variables.getVariable("sepOffset")).intValue() - 3;
-			
-		</jsp:scriptlet>
-		<span column="#{cell_index}" id="#{client_id}:hsep_#{cell_index}" style="left: #{offset}px;" class="dr-sgrid-hsep rich-sgrid-hsep" />
-	</th>
-
-</f:root>	
\ No newline at end of file

Deleted: trunk/ui/scrollableDataTable/src/main/templates/org/richfaces/scrollable-grid-header-itself.jspx
===================================================================
--- trunk/ui/scrollableDataTable/src/main/templates/org/richfaces/scrollable-grid-header-itself.jspx	2007-08-16 15:23:03 UTC (rev 2298)
+++ trunk/ui/scrollableDataTable/src/main/templates/org/richfaces/scrollable-grid-header-itself.jspx	2007-08-16 16:08:29 UTC (rev 2299)
@@ -1,30 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<f:root 
-	xmlns:f="http://ajax4jsf.org/cdk/template" 
-	xmlns:c=" http://java.sun.com/jsf/core" 
-	xmlns:ui=" http://ajax4jsf.org/cdk/ui"
-	xmlns:u=" http://ajax4jsf.org/cdk/u"
-	xmlns:x=" http://ajax4jsf.org/cdk/x"
-	xmlns:h=" http://ajax4jsf.org/cdk/headers"
-	xmlns:vcp="http://ajax4jsf.org/cdk/vcp"
-	baseclass="org.richfaces.renderkit.html.SortIconRenderer"
-	class="org.richfaces.renderkit.html.ScrollableGridHeaderItselfRenderer"
-	component="javax.faces.component.UIComponent" 
-	>
-
-<div id="#{client_id}:hcb_#{cell_index}" class="dr-sgrid-hcbody #{component.attributes['headerClass']}">
-	<vcp:body/>
-
-	<div align="right" id="#{client_id}:hs_#{cell_index}" class="dr-sgrid-sort-icon">
-			<c:if test="#{sortAscending}">
-				<f:call name="renderAscIcon"/>
-			</c:if>
-			<c:if test="#{sortDescending}">
-				<f:call name="renderDescIcon"/>
-			</c:if>
-	</div>
-	
-</div>
-<ajax:update>#{client_id}:hcb_#{cell_index}</ajax:update>
-
-</f:root>
\ No newline at end of file

Deleted: trunk/ui/scrollableDataTable/src/main/templates/org/richfaces/scrollable-grid.jspx
===================================================================
--- trunk/ui/scrollableDataTable/src/main/templates/org/richfaces/scrollable-grid.jspx	2007-08-16 15:23:03 UTC (rev 2298)
+++ trunk/ui/scrollableDataTable/src/main/templates/org/richfaces/scrollable-grid.jspx	2007-08-16 16:08:29 UTC (rev 2299)
@@ -1,240 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<f:root 
-	xmlns:f="http://ajax4jsf.org/cdk/template" 
-	xmlns:c=" http://java.sun.com/jsf/core" 
-	xmlns:ui=" http://ajax4jsf.org/cdk/ui"
-	xmlns:u=" http://ajax4jsf.org/cdk/u"
-	xmlns:x=" http://ajax4jsf.org/cdk/x"
-	xmlns:h=" http://ajax4jsf.org/cdk/headers"
-	xmlns:vcp="http://ajax4jsf.org/cdk/vcp"	
-	class="org.richfaces.renderkit.html.ScrollableGridRenderer"
-	baseclass="org.richfaces.renderkit.html.ScrollableGridBaseRenderer"
-	component="org.richfaces.component.UIScrollableGrid" 
-	>	
-	<jsp:directive.page import="javax.faces.component.UIComponent,javax.faces.component.UIColumn, java.util.List, java.util.Iterator, org.richfaces.component.Column"/>
-	<h:styles>
-		/org/richfaces/renderkit/html/css/grid.xcss
-	</h:styles>
-	
-	<h:scripts>
-		new org.ajax4jsf.javascript.PrototypeScript(),
-		new org.ajax4jsf.javascript.AjaxScript(),
-		/org/richfaces/renderkit/html/scripts/extend/extend.js,
-		/org/richfaces/renderkit/html/scripts/scrollable-grid.js
-	</h:scripts>
-
-	<f:clientId var="clientId" />
-
-	<f:call name="setUpColumnsWidth"/>	
-	
-	<jsp:scriptlet>
-     	<![CDATA[
-			List children = component.getChildren();
-			String hStyle, fStyle;
-			boolean footer = false;
-			boolean header = false;
-	
-			for (Iterator iterator = children.iterator(); iterator.hasNext();) {
-				UIComponent column = (UIComponent) iterator.next();
-				if(column instanceof UIColumn){
-					UIComponent hFacet = ((UIColumn) column).getHeader(); 
-					UIComponent fFacet = ((UIColumn) column).getFooter();
-					if(hFacet != null){
-						if(!header)
-							header = true;
-					}
-					if(fFacet != null){
-						if(!footer)
-							footer = true;
-					}
-				}
-			}
-			
-			if(header){
-				hStyle = "";
-			}else{
-				hStyle = "display: none";
-			}
-			if(footer){
-				fStyle = "";
-			}else{;
-				fStyle = "display: none";
-			}
-			
-			variables.setVariable("fStyle", fStyle);
-			variables.setVariable("hStyle", hStyle);
-		]]>
-	</jsp:scriptlet>
-	
-	
-	<div id="#{clientId}" style="width: #{component.attributes['width']};height: #{component.attributes['height']};" class="dr-sgrid  #{component.attributes['styleClass']}" >
-		<div id="#{clientId}:cs" class="dr-sgrid-hsplit" />
-		<div id="#{clientId}_GridHeaderTemplate" class="dr-sgrid-inlinebox" style="#{hStyle}; width: #{component.attributes['width']};">
-			<iframe id="#{clientId}:hs" class="dr-sgrid-substrate" src="" scrolling="no" frameborder="0" > <br/> </iframe>
-			<div style="display: block; left: 0px; top: 0px; width: #{sumWidth}px;">			
-					<span class="dr-sgrid-tmplbox dr-sgrid-fb" id="#{clientId}:header:FrozenBox">
-						<table cellpadding="0" cellspacing="0" style="border-collapse:collapse; table-layout:fixed">
-							
-							<jsp:scriptlet>
-								<![CDATA[
-									renderCols(context, component, true);
-								]]>
-							</jsp:scriptlet>					
-							
-							<thead>
-								<tr class="dr-sgrid-hr #{component.attributes['headerClass']}">
-									<jsp:scriptlet>
-				                   		<![CDATA[
-											renderHeaders(context, component, true);
-										]]>
-									</jsp:scriptlet>
-								</tr>
-							</thead>
-						</table>					
-					</span>
-			
-					<span class="dr-sgrid-tmplbox dr-sgrid-nb" id="#{clientId}:header:NormalBox">
-						<table cellpadding="0" cellspacing="0" style="border-collapse:collapse; table-layout:fixed">
-							
-							<jsp:scriptlet>
-								<![CDATA[
-									renderCols(context, component, false);
-								]]>
-							</jsp:scriptlet>					
-							<col width="1"/>
-							<thead>
-								<tr class="dr-sgrid-hr  #{component.attributes['headerClass']}">
-									<jsp:scriptlet>
-				                   		<![CDATA[
-											renderHeaders(context, component, false);
-										]]>
-									</jsp:scriptlet>
-									<th></th>
-								</tr>
-							</thead>
-						</table>
-				</span>	
-			</div>			
-		</div>
-		
-		
-		
-		<div id="#{clientId}_GridBodyTemplate" class="dr-sgrid-inlinebox" style="overflow: auto; width: #{component.attributes['width']}; height: #{component.attributes['height']};">
-			<div id="#{clientId}:scb" style="position: absolute; z-index: 0;">
-				<div id="#{clientId}:sb" style="position: absolute;" ><br/> </div>
-			</div>
-			<div id="#{clientId}:bc" style="display: block; width:  #{sumWidth}px;">
-				<span class="dr-sgrid-tmplbox dr-sgrid-fb" id="#{clientId}:body:FrozenBox">
-					<table id="#{clientId}:f" cellpadding="0" cellspacing="0" style="border-collapse:collapse; table-layout:fixed">
-						
-						<jsp:scriptlet>
-							<![CDATA[
-								renderCols(context, component, true);
-							]]>
-						</jsp:scriptlet>					
-						<tbody>
-							<jsp:scriptlet>
-				                <![CDATA[
-									renderGridBody(context, component, true);	
-								]]>
-							</jsp:scriptlet>
-						</tbody>
-					</table>
-					<span class="dr-sgrid-ho" id="#{clientId}:fho" ><br/></span>
-				</span>
-				<span class="dr-sgrid-tmplbox dr-sgrid-nb" id="#{clientId}:body:NormalBox">
-					<table id="#{clientId}:n" cellpadding="0" cellspacing="0" style="border-collapse:collapse; table-layout:fixed">
-						
-						<jsp:scriptlet>
-							<![CDATA[
-								renderCols(context, component, false);
-							]]>
-						</jsp:scriptlet>					
-						<col width="1"/>												
-						<tbody>
-							<jsp:scriptlet>
-			                	<![CDATA[
-									renderGridBody(context, component, false);	
-								]]>
-							</jsp:scriptlet>
-						</tbody>
-					</table>
-					<span class="dr-sgrid-ho" id="#{clientId}:nho" ><br/></span>
-				</span>		
-			</div>			
-		</div>
-		
-		<div id="#{clientId}_GridFooterTemplate" class="dr-sgrid-inlinebox" style="#{fStyle}; width: #{component.attributes['width']};">
-			<iframe id="#{clientId}:fs" class="dr-sgrid-substrate" src="" scrolling="no" frameborder="0" >  <br/></iframe>
-			<div style="display: block; width: width: #{sumWidth}px;">
-				<span class="dr-sgrid-tmplbox dr-sgrid-fb" id="#{clientId}:footer:FrozenBox">
-					<table cellpadding="0" cellspacing="0" style="border-collapse:collapse; table-layout:fixed">
-						
-						<jsp:scriptlet>
-							<![CDATA[
-								renderCols(context, component, true);
-							]]>
-						</jsp:scriptlet>					
-						<tfoot>
-							<tr class="dr-sgrid-fr #{component.attributes['footerClass']}">	
-								<jsp:scriptlet>
-				        	        <![CDATA[
-										renderFooters(context, component,true);	
-									]]>
-								</jsp:scriptlet>
-							</tr>
-						</tfoot>
-					</table>			
-				</span>
-				
-				<span class="dr-sgrid-tmplbox dr-sgrid-nb" id="#{clientId}:footer:NormalBox">
-					<table cellpadding="0" cellspacing="0" style="border-collapse:collapse; table-layout:fixed">
-						
-						<jsp:scriptlet>
-							<![CDATA[
-								renderCols(context, component, false);
-							]]>
-						</jsp:scriptlet>					
-						<col width="1"/>												
-						<tfoot>
-							<tr class="dr-sgrid-fr #{component.attributes['footerClass']}">
-								<jsp:scriptlet>
-				        	        <![CDATA[
-										renderFooters(context, component,false);	
-									]]>
-								</jsp:scriptlet>
-								<th></th>
-							</tr>
-						</tfoot>
-					</table>
-				</span>			
-			</div>
-		</div>			
-	
-		<input type="hidden" name="#{clientId}_hc" id="#{clientId}_hc"/>
-		<input type="hidden" name="#{clientId}_state_input" id="#{clientId}_state_input"/>
-		<input type="hidden" name="#{clientId}_options_input" id="#{clientId}_options_input"/>
-		<input type="hidden" name="#{clienId}_rows_input" id="#{clientId}_rows_input" value="#{rows_count}"/>
-		<input type="button" name="#{clientId}_submit_input" id="#{clientId}_submit_input" onclick="#{this:getRowsAjaxUpdate(context,component)}" style="display:none"/>
-		<jsp:scriptlet>
-		   <![CDATA[
-				renderHiddenScrollInput(context, component);	
-			]]>
-		</jsp:scriptlet>
-		
-		<f:call name="contributorsEncodeHere"/>
-		
-	</div>	
-	<script id="#{clientId}_grid_create_scripts" type="text/javascript">
-		//<![CDATA[
-		
-		#{this:getJavaScriptVarName(context, component)} = #{this:createClientScrollableGrid(context, component)};
-		#{this:getScriptContributions(context, component)};
-
-//		]]>
-	</script>
-	<f:call name="tearDownState"/>
-</f:root>	
-	
-	
-	
\ No newline at end of file

Deleted: trunk/ui/scrollableDataTable/src/test/java/org/richfaces/component/html/HtmlScrollableGridComponentTest.java
===================================================================
--- trunk/ui/scrollableDataTable/src/test/java/org/richfaces/component/html/HtmlScrollableGridComponentTest.java	2007-08-16 15:23:03 UTC (rev 2298)
+++ trunk/ui/scrollableDataTable/src/test/java/org/richfaces/component/html/HtmlScrollableGridComponentTest.java	2007-08-16 16:08:29 UTC (rev 2299)
@@ -1,270 +0,0 @@
-/**
- * GENERATED FILE - DO NOT EDIT
- *
- */
-
-package org.richfaces.component.html;
-
-import java.lang.String ;
-import org.ajax4jsf.tests.AbstractAjax4JsfTestCase ;
-import org.richfaces.model.SortField;
-import org.richfaces.model.SortOrder ;
-import java.lang.Object ;
-import org.richfaces.model.selection.Selection ;
-import org.richfaces.model.selection.SimpleSelection;
-
-import com.gargoylesoftware.htmlunit.Page;
-import javax.faces.component.UIForm;
-import javax.faces.component.html.HtmlForm;
-import com.gargoylesoftware.htmlunit.html.HtmlPage;
-import com.gargoylesoftware.htmlunit.html.HtmlElement;
-import javax.faces.context.FacesContext;
-import javax.faces.el.ValueBinding;
-import javax.faces.component.UIViewRoot;
-
-import org.ajax4jsf.tests.MockValueBinding;
-
-//import org.richfaces.component.html.HtmlScrollableGrid;
-
-public class HtmlScrollableGridComponentTest extends org.ajax4jsf.tests.AbstractAjax4JsfTestCase {
-
-//  public static final String COMPONENT_TYPE = "org.richfaces.component.ScrollableGrid";
-
-
- 	 	   	 	    	 	   	 	 private boolean _bypassUpdatesSet = false;	
-	 	    	 	 private boolean _limitToListSet = false;	
-	 	    	 	 private boolean _timeoutSet = false;	
-	 	   	 	    	 	  	 	      	 	  	 	   	 	   	 	  	 	  	 	  	 	   	 	  	 	  	 	 private boolean _ajaxSingleSet = false;	
-	 	  	 	  	 	 private boolean _frozenColCountSet = false;	
-	 	      	 	  	 	 private boolean _requestDelaySet = false;	
-	 	  	 	  	 	   	 	 private boolean _ignoreDupResponsesSet = false;	
-	 	    
-  private HtmlScrollableGrid component;
-  private UIForm form;
-//  private FacesContext context;
-
-  /**
-   *  Constructor to init default renderers 
-   */ 
-  public HtmlScrollableGridComponentTest (String name){
-  	super(name);
-  }
-
-	/*
-	* setup the tets
-	*/
-	public void setUp() throws Exception {
-		super.setUp();
-		component = new HtmlScrollableGrid();
-		form = new HtmlForm();
-		form.setId("form");
-		facesContext.getViewRoot().getChildren().add(form);
-		
-		component.setId("component");
-			component.setOnselectionchange("onselectionchange" );
-	 				component.setWidth("width" );
-	 					component.setFocus("focus" );
-	 				component.setBypassUpdates(true );
-	 					component.setLimitToList(true );
-	 					component.setTimeout(20 );
-	 				component.setColumnClasses("columnClasses" );
-//	 					component.setSelection("selection" ); 
-	 			component.setHeaderClass("headerClass" );
-	 							component.setRowClasses("rowClasses" );
-	 			component.setOncomplete("oncomplete" );
-//	 				component.setSortOrder("sortOrder" );
-	 				component.setFooterClass("footerClass" );
-	 			component.setReRender("reRender" );
-	 			component.setActiveClass("activeClass" );
-	 			component.setStyleClass("styleClass" );
-	 				component.setHeight("height" );
-	 			component.setCaptionClass("captionClass" );
-	 			component.setAjaxSingle(true );
-	 			component.setSelectedClass("selectedClass" );
-	 			component.setFrozenColCount(20 );
-	 							component.setStatus("status" );
-	 			component.setRequestDelay(20 );
-	 			component.setEventsQueue("eventsQueue" );
-	 			component.setData("data" );
-	 				component.setIgnoreDupResponses(true );
-	 			
-		form.getChildren().add(component);
-		
-	}
-
-	/*
-	* setup the tets
-	*/
-	public void tearDown() throws Exception{
-		super.tearDown();
-		component = null;
-		form = null;
-	}
-
-	public void testComponent() throws Exception {
-	  				assertEquals("org.richfaces.renderkit.html.ScrollableGridRenderer", component.getRendererType());
-	  	
-
-	}
-	public void testContext(){
-		
-		Object state = component.saveState(facesContext);
-		testRestoreState(state);
-	}
-
-	public void testGetters() {
-		HtmlScrollableGrid component = new HtmlScrollableGrid();
-		
-			component.setValueBinding("onselectionchange", new MockValueBinding("onselectionchange", java.lang.String.class));
-		assertEquals("onselectionchange", component.getOnselectionchange());
-		component.setOnselectionchange("onselectionchange_onselectionchange" );
-		assertEquals("onselectionchange_onselectionchange", component.getOnselectionchange());
-	 				component.setValueBinding("width", new MockValueBinding("width", java.lang.String.class));
-		assertEquals("width", component.getWidth());
-		component.setWidth("width_width" );
-		assertEquals("width_width", component.getWidth());
-	 					component.setValueBinding("focus", new MockValueBinding("focus", java.lang.String.class));
-		assertEquals("focus", component.getFocus());
-		component.setFocus("focus_focus" );
-		assertEquals("focus_focus", component.getFocus());
-	 				component.setValueBinding("bypassUpdates", new MockValueBinding(new Boolean(true), java.lang.Boolean.class));
-		assertEquals(true, component.isBypassUpdates());
-		component.setBypassUpdates(false );
-		assertEquals(false, component.isBypassUpdates());
-	 					component.setValueBinding("limitToList", new MockValueBinding(new Boolean(true), java.lang.Boolean.class));
-		assertEquals(true, component.isLimitToList());
-		component.setLimitToList(false );
-		assertEquals(false, component.isLimitToList());
-	 					component.setValueBinding("timeout", new MockValueBinding(new Integer(20), java.lang.Integer.class));
-		assertEquals(20, component.getTimeout());
-		component.setTimeout(15 );
-		assertEquals(15, component.getTimeout());
-	 				component.setValueBinding("columnClasses", new MockValueBinding("columnClasses", java.lang.String.class));
-		assertEquals("columnClasses", component.getColumnClasses());
-		component.setColumnClasses("columnClasses_columnClasses" );
-		assertEquals("columnClasses_columnClasses", component.getColumnClasses());
-	 					component.setValueBinding("selection", new MockValueBinding("selection", org.richfaces.model.selection.Selection.class));
-	 				
-	 	SimpleSelection selection = new SimpleSelection();
-	 	selection.addKey("key");
-	 	component.setSelection(selection);	
-		assertEquals(selection, component.getSelection());
-			
-	 			component.setValueBinding("headerClass", new MockValueBinding("headerClass", java.lang.String.class));
-		assertEquals("headerClass", component.getHeaderClass());
-		component.setHeaderClass("headerClass_headerClass" );
-		assertEquals("headerClass_headerClass", component.getHeaderClass());
-	 							component.setValueBinding("rowClasses", new MockValueBinding("rowClasses", java.lang.String.class));
-		assertEquals("rowClasses", component.getRowClasses());
-		component.setRowClasses("rowClasses_rowClasses" );
-		assertEquals("rowClasses_rowClasses", component.getRowClasses());
-	 			component.setValueBinding("oncomplete", new MockValueBinding("oncomplete", java.lang.String.class));
-		assertEquals("oncomplete", component.getOncomplete());
-		component.setOncomplete("oncomplete_oncomplete" );
-		assertEquals("oncomplete_oncomplete", component.getOncomplete());
-	 				component.setValueBinding("sortOrder", new MockValueBinding("sortOrder", org.richfaces.model.SortOrder.class));
-	 	SortOrder sortOrder = new SortOrder();
-	 	sortOrder.setFields(new SortField[] {new SortField(null, 2, Boolean.TRUE)});
-	 	component.setSortOrder(sortOrder);
-		assertEquals(sortOrder, component.getSortOrder());
-		component.setValueBinding("footerClass", new MockValueBinding("footerClass", java.lang.String.class));
-		assertEquals("footerClass", component.getFooterClass());
-		component.setFooterClass("footerClass_footerClass" );
-		assertEquals("footerClass_footerClass", component.getFooterClass());
-	 			component.setValueBinding("reRender", new MockValueBinding("reRender", java.lang.Object.class));
-		assertEquals("reRender", component.getReRender());
-		component.setReRender("reRender_reRender" );
-		assertEquals("reRender_reRender", component.getReRender());
-	 			component.setValueBinding("activeClass", new MockValueBinding("activeClass", java.lang.String.class));
-		assertEquals("activeClass", component.getActiveClass());
-		component.setActiveClass("activeClass_activeClass" );
-		assertEquals("activeClass_activeClass", component.getActiveClass());
-	 			component.setValueBinding("styleClass", new MockValueBinding("styleClass", java.lang.String.class));
-		assertEquals("styleClass", component.getStyleClass());
-		component.setStyleClass("styleClass_styleClass" );
-		assertEquals("styleClass_styleClass", component.getStyleClass());
-	 				component.setValueBinding("height", new MockValueBinding("height", java.lang.String.class));
-		assertEquals("height", component.getHeight());
-		component.setHeight("height_height" );
-		assertEquals("height_height", component.getHeight());
-	 			component.setValueBinding("captionClass", new MockValueBinding("captionClass", java.lang.String.class));
-		assertEquals("captionClass", component.getCaptionClass());
-		component.setCaptionClass("captionClass_captionClass" );
-		assertEquals("captionClass_captionClass", component.getCaptionClass());
-	 			component.setValueBinding("ajaxSingle", new MockValueBinding(new Boolean(true), java.lang.Boolean.class));
-		assertEquals(true, component.isAjaxSingle());
-		component.setAjaxSingle(false );
-		assertEquals(false, component.isAjaxSingle());
-	 			component.setValueBinding("selectedClass", new MockValueBinding("selectedClass", java.lang.String.class));
-		assertEquals("selectedClass", component.getSelectedClass());
-		component.setSelectedClass("selectedClass_selectedClass" );
-		assertEquals("selectedClass_selectedClass", component.getSelectedClass());
-	 			component.setValueBinding("frozenColCount", new MockValueBinding(new Integer(20), java.lang.Integer.class));
-		assertEquals(20, component.getFrozenColCount());
-		component.setFrozenColCount(15 );
-		assertEquals(15, component.getFrozenColCount());
-	 							component.setValueBinding("status", new MockValueBinding("status", java.lang.String.class));
-		assertEquals("status", component.getStatus());
-		component.setStatus("status_status" );
-		assertEquals("status_status", component.getStatus());
-	 			component.setValueBinding("requestDelay", new MockValueBinding(new Integer(20), java.lang.Integer.class));
-		assertEquals(20, component.getRequestDelay());
-		component.setRequestDelay(15 );
-		assertEquals(15, component.getRequestDelay());
-	 			component.setValueBinding("eventsQueue", new MockValueBinding("eventsQueue", java.lang.String.class));
-		assertEquals("eventsQueue", component.getEventsQueue());
-		component.setEventsQueue("eventsQueue_eventsQueue" );
-		assertEquals("eventsQueue_eventsQueue", component.getEventsQueue());
-	 			component.setValueBinding("data", new MockValueBinding("data", java.lang.Object.class));
-		assertEquals("data", component.getData());
-		component.setData("data_data" );
-		assertEquals("data_data", component.getData());
-	 				component.setValueBinding("ignoreDupResponses", new MockValueBinding(new Boolean(true), java.lang.Boolean.class));
-		assertEquals(true, component.isIgnoreDupResponses());
-		component.setIgnoreDupResponses(false );
-		assertEquals(false, component.isIgnoreDupResponses());
-	 	
-
-	}
-	
-	private void testRestoreState(Object state){
-		HtmlScrollableGrid restoredComponent = new HtmlScrollableGrid();
-		restoredComponent.restoreState(facesContext, state);
-		
-			assertEquals(component.getOnselectionchange(), restoredComponent.getOnselectionchange());
-	 				assertEquals(component.getWidth(), restoredComponent.getWidth());
-	 					assertEquals(component.getFocus(), restoredComponent.getFocus());
-	 				assertEquals(component.isBypassUpdates(), restoredComponent.isBypassUpdates());
-	 					assertEquals(component.isLimitToList(), restoredComponent.isLimitToList());
-	 					assertEquals(component.getTimeout(), restoredComponent.getTimeout());
-	 				assertEquals(component.getColumnClasses(), restoredComponent.getColumnClasses());
-	 					assertEquals(component.getSelection(), restoredComponent.getSelection());
-	 			assertEquals(component.getHeaderClass(), restoredComponent.getHeaderClass());
-	 							assertEquals(component.getRowClasses(), restoredComponent.getRowClasses());
-	 			assertEquals(component.getOncomplete(), restoredComponent.getOncomplete());
-	 				assertEquals(component.getSortOrder(), restoredComponent.getSortOrder());
-	 				assertEquals(component.getFooterClass(), restoredComponent.getFooterClass());
-	 			assertEquals(component.getReRender(), restoredComponent.getReRender());
-	 			assertEquals(component.getActiveClass(), restoredComponent.getActiveClass());
-	 			assertEquals(component.getStyleClass(), restoredComponent.getStyleClass());
-	 				assertEquals(component.getHeight(), restoredComponent.getHeight());
-	 			assertEquals(component.getCaptionClass(), restoredComponent.getCaptionClass());
-	 			assertEquals(component.isAjaxSingle(), restoredComponent.isAjaxSingle());
-	 			assertEquals(component.getSelectedClass(), restoredComponent.getSelectedClass());
-	 			assertEquals(component.getFrozenColCount(), restoredComponent.getFrozenColCount());
-	 							assertEquals(component.getStatus(), restoredComponent.getStatus());
-	 			assertEquals(component.getRequestDelay(), restoredComponent.getRequestDelay());
-	 			assertEquals(component.getEventsQueue(), restoredComponent.getEventsQueue());
-	 			assertEquals(component.getData(), restoredComponent.getData());
-	 				assertEquals(component.isIgnoreDupResponses(), restoredComponent.isIgnoreDupResponses());
-	 	
-	}
-	
-	private void assertEquals(double d1, double d2) {
-		assertEquals(d1, d2, 0);
-	}
-	
-	private void assertEquals(float d1, float d2) {
-		assertEquals(d1, d2, 0);
-	}
-}

Added: trunk/ui/scrollableDataTable/src/test/java/org/richfaces/renderkit/html/ScrollableDataTableRendererTest.java
===================================================================
--- trunk/ui/scrollableDataTable/src/test/java/org/richfaces/renderkit/html/ScrollableDataTableRendererTest.java	                        (rev 0)
+++ trunk/ui/scrollableDataTable/src/test/java/org/richfaces/renderkit/html/ScrollableDataTableRendererTest.java	2007-08-16 16:08:29 UTC (rev 2299)
@@ -0,0 +1,238 @@
+package org.richfaces.renderkit.html;
+
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Set;
+
+import javax.faces.component.UIColumn;
+import javax.faces.component.UIOutput;
+import javax.faces.component.html.HtmlOutputText;
+
+import org.ajax4jsf.javascript.AjaxScript;
+import org.ajax4jsf.javascript.PrototypeScript;
+import org.ajax4jsf.tests.AbstractAjax4JsfTestCase;
+import org.apache.commons.lang.StringUtils;
+
+import com.gargoylesoftware.htmlunit.html.HtmlElement;
+import com.gargoylesoftware.htmlunit.html.HtmlPage;
+import com.gargoylesoftware.htmlunit.html.HtmlScript;
+
+import org.richfaces.component.UIScrollableDataTable;
+/**
+ * @author Anton Belevich
+ *
+ */
+public class ScrollableDataTableRendererTest extends AbstractAjax4JsfTestCase{
+
+	UIScrollableDataTable grid;
+	int columns = 7;
+	private static Set javaScripts = new HashSet();
+	
+	static {
+		javaScripts.add(AjaxScript.class.getName());
+		javaScripts.add(PrototypeScript.class.getName());
+		
+		javaScripts.add("org/richfaces/renderkit/html/scripts/scrollable-data-table.js");
+		javaScripts.add("org/richfaces/renderkit/html/scripts/extend/extend.js");
+	}
+	
+	public ScrollableDataTableRendererTest(String arg0) {
+		super(arg0);
+	}
+	
+	public void setUp() throws Exception {
+		
+		super.setUp();
+
+		// create grid 
+		grid = (UIScrollableDataTable)application.createComponent("org.richfaces.component.ScrollableDataTable");
+		grid.setId("grid");
+		grid.getAttributes().put("frozenColCount", new Integer(3));
+	
+		// add columns
+		for (int i = 0; i < columns; i++) {
+			
+			UIColumn column = (UIColumn) createComponent(
+					"org.richfaces.Column",
+					"org.richfaces.component.Column",
+						null, null, null);
+			
+			
+			UIOutput outputText = (UIOutput) createComponent(
+	                HtmlOutputText.COMPONENT_TYPE, HtmlOutputText.class.getName(),
+	                null, null, null);
+			
+			column.getFacets().put("header", outputText);
+			column.getFacets().put("footer", outputText);
+			column.getChildren().add(outputText);
+			
+			grid.getChildren().add(column);
+			grid.setFirst(0);
+			grid.setRows(40);
+		}
+		
+		facesContext.getViewRoot().getChildren().add(grid);
+	}
+	 
+	public void tearDown() throws Exception {
+		super.tearDown();
+		grid = null;
+	} 
+	
+	public void testRenderStyle() throws Exception {
+        HtmlPage page = renderView();
+        assertNotNull(page);
+        List links = page.getDocumentElement().getHtmlElementsByTagName("link");
+        assertNotNull(links);
+        HtmlElement link = (HtmlElement)links.get(0);
+        assertTrue(link.getAttributeValue("href").contains("css/scrollable-data-table.xcss"));
+    }
+	
+	public void testRenderScripts() throws Exception {
+		HtmlPage page = renderView();
+		assertNotNull(page);
+		List scripts = page.getDocumentElement().getHtmlElementsByTagName("script");
+		for (Iterator it = scripts.iterator(); it.hasNext();) {
+            HtmlScript item = (HtmlScript) it.next();
+            String srcAttr = item.getSrcAttribute();
+            
+            if (StringUtils.isNotBlank(srcAttr)) {
+                boolean found = false;
+                for (Iterator srcIt = javaScripts.iterator(); srcIt.hasNext();)
+                {
+                    String src = (String) srcIt.next();
+                    found = srcAttr.contains(src);
+                    if (found) {
+                        break;
+                    }
+                }
+                assertTrue(found);
+            }
+        }
+	}
+
+	
+	public void testRenderingFrozenNormalColumns()throws Exception{
+		
+		HtmlPage page = renderView();
+		assertNotNull(page);
+		
+		
+		HtmlElement div = page.getHtmlElementById(grid.getClientId(facesContext));
+		assertNotNull(div);
+		assertEquals("div", div.getNodeName());
+		
+		String classAttr = div.getAttributeValue("class");
+	    assertTrue(classAttr.contains("dr-sdt"));
+	    Iterator childIter= div.getChildElementsIterator();
+		
+	    String id = grid.getId();
+		
+	    HtmlElement input = page.getHtmlElementById(id+"_hc");
+	    assertNotNull(input);
+	    input = null;
+	    input = page.getHtmlElementById(id + "_state_input");
+	    assertNotNull(input);
+	    input = null;
+	    input = page.getHtmlElementById(id + "_options_input");
+	    assertNotNull(input);
+	    input = null;
+	    input = page.getHtmlElementById(id + "_rows_input");
+	    assertNotNull(input);
+	    input = null;
+	    input = page.getHtmlElementById(id + "_submit_input");
+	    assertNotNull(input);
+	    input = null;
+	    
+		for (; childIter.hasNext();) {
+			
+			HtmlElement elem = (HtmlElement) childIter.next();
+			assertNotNull(elem);
+			
+			boolean res = (elem.getNodeName().equals("div") || elem.getNodeName().equals("input"));
+			assertTrue(res);
+			
+			if(elem.getNodeName().equals("div")){
+			
+				String elemClassAttr = elem.getAttributeValue("class");
+				res = false;
+				if(elemClassAttr.contains("dr-sdt-inlinebox")){
+					res = true;
+				}else if(elemClassAttr.contains("dr-sdt-hsplit")){
+					res = true;
+				}
+				assertTrue(res);
+				
+				if(!elemClassAttr.contains("dr-sdt-hsplit")){
+					
+					boolean templates = elem.getId().equals(grid.getId()+ "_GridBodyTemplate") || elem.getId().equals(grid.getId()+ "_GridFooterTemplate") || elem.getId().equals(grid.getId()+ "_GridHeaderTemplate");
+					assertTrue(templates);
+								
+					Iterator divIter = elem.getChildElementsIterator();
+					HtmlElement inDiv = (HtmlElement) divIter.next();
+					assertNotNull(inDiv);
+					boolean test = false;
+					if(inDiv.getNodeName().equals("div")){
+						test = true;
+					}else if(inDiv.getNodeName().equals("iframe")){
+						test = true;
+					}
+					
+					assertTrue(test);
+				
+					Iterator spanIter  = inDiv.getChildElementsIterator();
+
+					for (;spanIter.hasNext();) {
+				
+						HtmlElement element = (HtmlElement) spanIter.next();
+						assertNotNull(element);
+						res = false;
+						if(element.getNodeName().equals("span")){
+							res = true;
+							
+						}else if(element.getNodeName().equals("div")){
+							 String divId = element.getAttributeValue("id");
+							 assertEquals(id + ":sb", divId);
+							 res = true;
+						} else if (element.getNodeName().equals("br")) {
+							res = true;
+						}
+						
+						if(!res) {
+							System.out
+									.println("ScrollableDataTableRendererTest.testRenderingFrozenNormalColumns()");
+						}
+						
+						assertTrue(res);
+						elemClassAttr = element.getAttributeValue("class");
+						assertNotNull(elemClassAttr);
+					
+						if(element.getId().contains("FrozenBox")){
+							assertTrue(elemClassAttr.contains("dr-sdt-tmplbox dr-sdt-fb"));
+						}else if(element.getId().contains("NormalBox")){
+							assertTrue(elemClassAttr.contains("dr-sdt-tmplbox dr-sdt-nb"));
+						}
+					
+				
+						for (int i = 0; i < columns; i++) {
+						
+							HtmlElement hcell = page.getHtmlElementById(id + ":hc_" + i);
+							assertNotNull(hcell);
+							elemClassAttr = hcell.getAttributeValue("class");
+							assertTrue(elemClassAttr.contains("dr-sdt-hc rich-sdt-header-cell"));
+						
+							for (int j = 0; j < grid.getRows(); j++) {
+								HtmlElement bcell = page.getHtmlElementById(id + ":c_" + j + "_" + i);
+								assertNotNull(bcell);
+								elemClassAttr = bcell.getAttributeValue("class");
+								assertTrue(elemClassAttr.contains("dr-sdt-bc rich-sdt-column-cell"));
+							
+							}
+						}
+					}
+				}
+			}
+		}
+	}
+}

Deleted: trunk/ui/scrollableDataTable/src/test/java/org/richfaces/renderkit/html/ScrollableGridRendererTest.java
===================================================================
--- trunk/ui/scrollableDataTable/src/test/java/org/richfaces/renderkit/html/ScrollableGridRendererTest.java	2007-08-16 15:23:03 UTC (rev 2298)
+++ trunk/ui/scrollableDataTable/src/test/java/org/richfaces/renderkit/html/ScrollableGridRendererTest.java	2007-08-16 16:08:29 UTC (rev 2299)
@@ -1,236 +0,0 @@
-package org.richfaces.renderkit.html;
-
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Set;
-
-import javax.faces.component.UIColumn;
-import javax.faces.component.UIOutput;
-import javax.faces.component.html.HtmlOutputText;
-
-import org.ajax4jsf.javascript.AjaxScript;
-import org.ajax4jsf.javascript.PrototypeScript;
-import org.ajax4jsf.tests.AbstractAjax4JsfTestCase;
-import org.apache.commons.lang.StringUtils;
-
-import com.gargoylesoftware.htmlunit.html.HtmlElement;
-import com.gargoylesoftware.htmlunit.html.HtmlPage;
-import com.gargoylesoftware.htmlunit.html.HtmlScript;
-
-import org.richfaces.component.UIScrollableGrid;
-/**
- * @author Anton Belevich
- *
- */
-public class ScrollableGridRendererTest extends AbstractAjax4JsfTestCase{
-
-	UIScrollableGrid grid;
-	int columns = 7;
-	private static Set javaScripts = new HashSet();
-	
-	static {
-		javaScripts.add(AjaxScript.class.getName());
-		javaScripts.add(PrototypeScript.class.getName());
-		javaScripts.add("org/richfaces/renderkit/html/scripts/scrollable-grid.js");
-	}
-	
-	public ScrollableGridRendererTest(String arg0) {
-		super(arg0);
-	}
-	
-	public void setUp() throws Exception {
-		
-		super.setUp();
-
-		// create grid 
-		grid = (UIScrollableGrid)application.createComponent("org.richfaces.component.ScrollableGrid");
-		grid.setId("grid");
-		grid.getAttributes().put("frozenColCount", new Integer(3));
-	
-		// add columns
-		for (int i = 0; i < columns; i++) {
-			
-			UIColumn column = (UIColumn) createComponent(
-					"org.richfaces.Column",
-					"org.richfaces.component.Column",
-						null, null, null);
-			
-			
-			UIOutput outputText = (UIOutput) createComponent(
-	                HtmlOutputText.COMPONENT_TYPE, HtmlOutputText.class.getName(),
-	                null, null, null);
-			
-			column.getFacets().put("header", outputText);
-			column.getFacets().put("footer", outputText);
-			column.getChildren().add(outputText);
-			
-			grid.getChildren().add(column);
-			grid.setFirst(0);
-			grid.setRows(40);
-		}
-		
-		facesContext.getViewRoot().getChildren().add(grid);
-	}
-	 
-	public void tearDown() throws Exception {
-		super.tearDown();
-		grid = null;
-	} 
-	
-	public void testRenderStyle() throws Exception {
-        HtmlPage page = renderView();
-        assertNotNull(page);
-        List links = page.getDocumentElement().getHtmlElementsByTagName("link");
-        assertNotNull(links);
-        HtmlElement link = (HtmlElement)links.get(0);
-        assertTrue(link.getAttributeValue("href").contains("css/grid.xcss"));
-    }
-	
-	public void testRenderScripts() throws Exception {
-		HtmlPage page = renderView();
-		assertNotNull(page);
-		List scripts = page.getDocumentElement().getHtmlElementsByTagName("script");
-		for (Iterator it = scripts.iterator(); it.hasNext();) {
-            HtmlScript item = (HtmlScript) it.next();
-            String srcAttr = item.getSrcAttribute();
-            
-            if (StringUtils.isNotBlank(srcAttr)) {
-                boolean found = false;
-                for (Iterator srcIt = javaScripts.iterator(); srcIt.hasNext();)
-                {
-                    String src = (String) srcIt.next();
-                    found = srcAttr.contains(src);
-                    if (found) {
-                        break;
-                    }
-                }
-                assertTrue(found);
-            }
-        }
-	}
-
-	
-	public void testRenderingFrozenNormalColumns()throws Exception{
-		
-		HtmlPage page = renderView();
-		assertNotNull(page);
-		
-		
-		HtmlElement div = page.getHtmlElementById(grid.getClientId(facesContext));
-		assertNotNull(div);
-		assertEquals("div", div.getNodeName());
-		
-		String classAttr = div.getAttributeValue("class");
-	    assertTrue(classAttr.contains("dr-sgrid"));
-	    Iterator childIter= div.getChildElementsIterator();
-		
-	    String id = grid.getId();
-		
-	    HtmlElement input = page.getHtmlElementById(id+"_hc");
-	    assertNotNull(input);
-	    input = null;
-	    input = page.getHtmlElementById(id + "_state_input");
-	    assertNotNull(input);
-	    input = null;
-	    input = page.getHtmlElementById(id + "_options_input");
-	    assertNotNull(input);
-	    input = null;
-	    input = page.getHtmlElementById(id + "_rows_input");
-	    assertNotNull(input);
-	    input = null;
-	    input = page.getHtmlElementById(id + "_submit_input");
-	    assertNotNull(input);
-	    input = null;
-	    
-		for (; childIter.hasNext();) {
-			
-			HtmlElement elem = (HtmlElement) childIter.next();
-			assertNotNull(elem);
-			
-			boolean res = (elem.getNodeName().equals("div") || elem.getNodeName().equals("input"));
-			assertTrue(res);
-			
-			if(elem.getNodeName().equals("div")){
-			
-				String elemClassAttr = elem.getAttributeValue("class");
-				res = false;
-				if(elemClassAttr.contains("dr-sgrid-inlinebox")){
-					res = true;
-				}else if(elemClassAttr.contains("dr-sgrid-hsplit")){
-					res = true;
-				}
-				assertTrue(res);
-				
-				if(!elemClassAttr.contains("dr-sgrid-hsplit")){
-					
-					boolean templates = elem.getId().equals(grid.getId()+ "_GridBodyTemplate") || elem.getId().equals(grid.getId()+ "_GridFooterTemplate") || elem.getId().equals(grid.getId()+ "_GridHeaderTemplate");
-					assertTrue(templates);
-								
-					Iterator divIter = elem.getChildElementsIterator();
-					HtmlElement inDiv = (HtmlElement) divIter.next();
-					assertNotNull(inDiv);
-					boolean test = false;
-					if(inDiv.getNodeName().equals("div")){
-						test = true;
-					}else if(inDiv.getNodeName().equals("iframe")){
-						test = true;
-					}
-					
-					assertTrue(test);
-				
-					Iterator spanIter  = inDiv.getChildElementsIterator();
-
-					for (;spanIter.hasNext();) {
-				
-						HtmlElement element = (HtmlElement) spanIter.next();
-						assertNotNull(element);
-						res = false;
-						if(element.getNodeName().equals("span")){
-							res = true;
-							
-						}else if(element.getNodeName().equals("div")){
-							 String divId = element.getAttributeValue("id");
-							 assertEquals(id + ":sb", divId);
-							 res = true;
-						} else if (element.getNodeName().equals("br")) {
-							res = true;
-						}
-						
-						if(!res) {
-							System.out
-									.println("ScrollableGridRendererTest.testRenderingFrozenNormalColumns()");
-						}
-						
-						assertTrue(res);
-						elemClassAttr = element.getAttributeValue("class");
-						assertNotNull(elemClassAttr);
-					
-						if(element.getId().contains("FrozenBox")){
-							assertTrue(elemClassAttr.contains("dr-sgrid-tmplbox dr-sgrid-fb"));
-						}else if(element.getId().contains("NormalBox")){
-							assertTrue(elemClassAttr.contains("dr-sgrid-tmplbox dr-sgrid-nb"));
-						}
-					
-				
-						for (int i = 0; i < columns; i++) {
-						
-							HtmlElement hcell = page.getHtmlElementById(id + ":hc_" + i);
-							assertNotNull(hcell);
-							elemClassAttr = hcell.getAttributeValue("class");
-							assertTrue(elemClassAttr.contains("dr-sgrid-hc rich-sgrid-header-cell"));
-						
-							for (int j = 0; j < grid.getRows(); j++) {
-								HtmlElement bcell = page.getHtmlElementById(id + ":c_" + j + "_" + i);
-								assertNotNull(bcell);
-								elemClassAttr = bcell.getAttributeValue("class");
-								assertTrue(elemClassAttr.contains("dr-sgrid-bc rich-sgrid-column-cell"));
-							
-							}
-						}
-					}
-				}
-			}
-		}
-	}
-}

Modified: trunk/ui/scrollableDataTable/src/test/java/org/richfaces/renderkit/html/SelectionRendererContributorTest.java
===================================================================
--- trunk/ui/scrollableDataTable/src/test/java/org/richfaces/renderkit/html/SelectionRendererContributorTest.java	2007-08-16 15:23:03 UTC (rev 2298)
+++ trunk/ui/scrollableDataTable/src/test/java/org/richfaces/renderkit/html/SelectionRendererContributorTest.java	2007-08-16 16:08:29 UTC (rev 2299)
@@ -10,10 +10,10 @@
 
 import org.ajax4jsf.tests.AbstractAjax4JsfTestCase;
 import org.apache.shale.test.mock.MockExternalContext;
-import org.richfaces.component.UIScrollableGrid;
+import org.richfaces.component.UIScrollableDataTable;
 import org.richfaces.model.selection.ClientSelection;
 import org.richfaces.model.selection.SelectionRange;
-import org.richfaces.renderkit.html.ScrollableGridBaseRenderer;
+import org.richfaces.renderkit.html.ScrollableDataTableBaseRenderer;
 import org.richfaces.renderkit.html.SelectionRendererContributor;
 
 /**
@@ -22,9 +22,9 @@
  */
 public class SelectionRendererContributorTest extends AbstractAjax4JsfTestCase {
 
-	private UIScrollableGrid component;
+	private UIScrollableDataTable component;
 	private SelectionRendererContributor contributor;
-	private ScrollableGridBaseRenderer renderer;
+	private ScrollableDataTableBaseRenderer renderer;
 
 	public SelectionRendererContributorTest(String name) {
 		super(name);
@@ -35,13 +35,13 @@
 	 */
 	public void setUp() throws Exception {
 		super.setUp();
-		component = (UIScrollableGrid) application.createComponent(UIScrollableGrid.COMPONENT_TYPE);
+		component = (UIScrollableDataTable) application.createComponent(UIScrollableDataTable.COMPONENT_TYPE);
 		component.setValue(new ArrayList());
 		facesContext.getViewRoot().getChildren().add(component);
 		contributor = new SelectionRendererContributor();
-		renderer = new ScrollableGridBaseRenderer(){
+		renderer = new ScrollableDataTableBaseRenderer(){
 			protected Class getComponentClass() {
-			return UIScrollableGrid.class;
+			return UIScrollableDataTable.class;
 		}};
 	}
 
@@ -61,7 +61,7 @@
 		MockExternalContext mockExternalContext = 
 			(MockExternalContext) facesContext.getExternalContext();
 		String name = 
-			SelectionRendererContributor.getSelectionInputName(facesContext, (UIScrollableGrid) component);
+			SelectionRendererContributor.getSelectionInputName(facesContext, (UIScrollableDataTable) component);
 		
 		String value = "";
 		

Deleted: trunk/ui/scrollableDataTable/src/test/java/org/richfaces/taglib/ScrollableGridTagTest.java
===================================================================
--- trunk/ui/scrollableDataTable/src/test/java/org/richfaces/taglib/ScrollableGridTagTest.java	2007-08-16 15:23:03 UTC (rev 2298)
+++ trunk/ui/scrollableDataTable/src/test/java/org/richfaces/taglib/ScrollableGridTagTest.java	2007-08-16 16:08:29 UTC (rev 2299)
@@ -1,153 +0,0 @@
-/**
- * GENERATED FILE - DO NOT EDIT
- *
- */
-package org.richfaces.taglib;
-
-import javax.faces.application.Application;
-import javax.faces.el.ValueBinding;
-import javax.faces.webapp.UIComponentTag;
-import javax.servlet.jsp.JspException;
-import javax.servlet.jsp.tagext.Tag;
-
-import org.richfaces.component.html.HtmlScrollableGrid;
-
-
-
-/**
- * @author shura (latest modification by $Author: alexsmirnov $)
- * @version $Revision: 1.1.2.2 $ $Date: 2007/01/03 21:05:14 $
- *
- */
-public class ScrollableGridTagTest extends org.ajax4jsf.tests.AbstractAjax4JsfTestCase {
-
-
-	private ScrollableGridTag tag;
-
-  /**
-   *  Constructor to init default renderers 
-   */ 
-  public ScrollableGridTagTest (String name){
-  	super(name);
-  }
-
-
-	public void setUp() throws Exception {
-		super.setUp();
-		tag = new ScrollableGridTag();
-		tag.setParent(new UIComponentTag(){
-
-			public String getComponentType() {
-				// TODO Auto-generated method stub
-				return null;
-			}
-
-			public String getRendererType() {
-				// TODO Auto-generated method stub
-				return null;
-			}
-			
-			public int doStartTag() throws JspException {
-				// TODO Auto-generated method stub
-				return Tag.EVAL_BODY_INCLUDE;
-			}
-			
-			public int doEndTag() throws JspException {
-				// TODO Auto-generated method stub
-				return Tag.EVAL_BODY_INCLUDE;
-			}
-			
-		});
-		
-	}
-
-	public void tearDown() throws Exception {
-		super.tearDown();
-		tag = null;
-	}
-	
-	
-	public void testSetPropertiesUIComponent() {
-		HtmlScrollableGrid component = new HtmlScrollableGrid();
-	// create binding		
-		Application application = null;
-		ValueBinding binding = null;
-
-	
-		tag.setProperties(component);
-
-/*
-		 		 		 			setStringProperty(component, "onselectionchange",this._onselectionchange);
-		 	 		 		 		 			// TODO - setup properties for other cases.
-			// name footer with type javax.faces.component.UIComponent
-		 	 		 		 		 			setStringProperty(component, "width",this._width);
-		 	 		 		 		 			setStringProperty(component, "stateVar",this._stateVar);
-		 	 		 		 		 			setStringProperty(component, "rowKeyVar",this._rowKeyVar);
-		 	 		 		 		 			setStringProperty(component, "focus",this._focus);
-		 	 		 		 		 		 			// Simple type - boolean
-			setBooleanProperty(component, "bypassUpdates",this._bypassUpdates); 
-		 	 		 		 		 			// TODO - handle object
-			setStringProperty(component, "rowKey",this._rowKey);
-		 	 		 		 		 		 			// Simple type - boolean
-			setBooleanProperty(component, "limitToList",this._limitToList); 
-		 	 		 		 		 			setStringProperty(component, "var",this._var);
-		 	 		 		 		 			// Simple type - int
-			setIntegerProperty(component, "rows",this._rows); 
-		 	 		 		 		 			// Simple type - int
-			setIntegerProperty(component, "timeout",this._timeout); 
-		 	 		 		 		 		 			setStringProperty(component, "columnClasses",this._columnClasses);
-		 	 		 		 		 			// TODO - setup properties for other cases.
-			// name header with type javax.faces.component.UIComponent
-		 	 		 		 		 			// Simple type - int
-			setIntegerProperty(component, "first",this._first); 
-		 	 		 		 		 			// TODO - setup properties for other cases.
-			// name selection with type org.richfaces.model.selection.Selection
-		 	 		 		 		 			setStringProperty(component, "headerClass",this._headerClass);
-		 	 		 		 		 		 		 			// TODO - setup properties for other cases.
-			// name responseData with type java.util.Collection
-		 	 		 		 		 		 			setStringProperty(component, "rowClasses",this._rowClasses);
-		 	 		 		 		 			setStringProperty(component, "oncomplete",this._oncomplete);
-		 	 		 		 		 			// TODO - setup properties for other cases.
-			// name componentState with type org.ajax4jsf.ajax.repeat.DataComponentState
-		 	 		 		 		 			// TODO - setup properties for other cases.
-			// name sortOrder with type org.richfaces.model.SortOrder
-		 	 		 		 		 		 			setStringProperty(component, "footerClass",this._footerClass);
-		 	 		 		 		 			// TODO - handle object
-			setStringProperty(component, "reRender",this._reRender);
-		 	 		 		 		 			setStringProperty(component, "activeClass",this._activeClass);
-		 	 		 		 		 		 			// TODO - setup properties for other cases.
-			// name ajaxKeys with type java.util.Set
-		 	 		 		 		 			setStringProperty(component, "height",this._height);
-		 	 		 		 		 			setStringProperty(component, "captionClass",this._captionClass);
-		 	 		 		 		 			// Simple type - boolean
-			setBooleanProperty(component, "ajaxSingle",this._ajaxSingle); 
-		 	 		 		 		 			setStringProperty(component, "selectedClass",this._selectedClass);
-		 	 		 		 		 			// Simple type - int
-			setIntegerProperty(component, "frozenColCount",this._frozenColCount); 
-		 	 		 		 		 			// Simple type - int
-			setIntegerProperty(component, "rowIndex",this._rowIndex); 
-		 	 		 		 		 		 			// TODO - setup properties for other cases.
-			// name ranges with type java.util.List
-		 	 		 		 		 			// Simple type - int
-			setIntegerProperty(component, "reqRowsCount",this._reqRowsCount); 
-		 	 		 		 		 			setStringProperty(component, "status",this._status);
-		 	 		 		 		 			// Simple type - int
-			setIntegerProperty(component, "requestDelay",this._requestDelay); 
-		 	 		 		 		 			setStringProperty(component, "eventsQueue",this._eventsQueue);
-		 	 		 		 		 			// TODO - handle object
-			setStringProperty(component, "data",this._data);
-		 	 		 		 		 		 			// Simple type - boolean
-			setBooleanProperty(component, "ignoreDupResponses",this._ignoreDupResponses); 
-		 	 		 	*/	
-	}
-	
-	public void testGetRendererType(){
-		assertNotNull(tag.getRendererType());
-	}
-	
-	public void testGetComponentType(){
-		assertNotNull(tag.getComponentType());
-	}
-	
-	
-}




More information about the richfaces-svn-commits mailing list