[richfaces-svn-commits] JBoss Rich Faces SVN: r341 - in trunk/richfaces/datascroller/src: test/java/org/richfaces/component and 1 other directory.

richfaces-svn-commits at lists.jboss.org richfaces-svn-commits at lists.jboss.org
Tue Apr 10 09:52:19 EDT 2007


Author: A.Skokov
Date: 2007-04-10 09:52:19 -0400 (Tue, 10 Apr 2007)
New Revision: 341

Modified:
   trunk/richfaces/datascroller/src/main/java/org/richfaces/component/UIDatascroller.java
   trunk/richfaces/datascroller/src/test/java/org/richfaces/component/DatascrollerComponentTest.java
Log:
small refactoring, test updated

Modified: trunk/richfaces/datascroller/src/main/java/org/richfaces/component/UIDatascroller.java
===================================================================
--- trunk/richfaces/datascroller/src/main/java/org/richfaces/component/UIDatascroller.java	2007-04-10 13:45:41 UTC (rev 340)
+++ trunk/richfaces/datascroller/src/main/java/org/richfaces/component/UIDatascroller.java	2007-04-10 13:52:19 UTC (rev 341)
@@ -21,46 +21,46 @@
 
 package org.richfaces.component;
 
-import java.util.Iterator;
+import org.richfaces.event.DataScrollerAdapter;
 import org.richfaces.event.DataScrollerEvent;
 import org.richfaces.event.DataScrollerListener;
 import org.richfaces.event.DataScrollerSource;
-import org.richfaces.event.DataScrollerAdapter;
-import javax.faces.event.*;
-import javax.faces.el.MethodBinding;
 
 import javax.faces.FacesException;
 import javax.faces.component.UIComponent;
 import javax.faces.component.UIComponentBase;
 import javax.faces.component.UIData;
-import javax.faces.component.html.HtmlPanelGroup;
 import javax.faces.context.FacesContext;
+import javax.faces.el.MethodBinding;
+import javax.faces.event.AbortProcessingException;
+import javax.faces.event.FacesEvent;
 
 
 /**
  * JSF component class
- *
  */
-//xxxx nick -> alex - extend UIComponentBase and 
+//xxxx nick -> alex - extend UIComponentBase and
 //create event listener & event classes to define PageSwitchEvent
 public abstract class UIDatascroller extends UIComponentBase implements DataScrollerSource {
-	
-	public static final String COMPONENT_TYPE = "org.richfaces.Datascroller";
-	public static final String COMPONENT_FAMILY = "org.richfaces.Datascroller";
 
-	public static final String FIRST_FACET_NAME = "first";
+    public static final String COMPONENT_TYPE = "org.richfaces.Datascroller";
+    public static final String COMPONENT_FAMILY = "org.richfaces.Datascroller";
 
-	public static final String LAST_FACET_NAME = "last";
+    public static final String FIRST_FACET_NAME = "first";
 
-	public static final String NEXT_FACET_NAME = "next";
+    public static final String LAST_FACET_NAME = "last";
 
-	public static final String PREVIOUS_FACET_NAME = "previous";
+    public static final String NEXT_FACET_NAME = "next";
 
-	public static final String FAST_FORWARD_FACET_NAME = "fastforward";
+    public static final String PREVIOUS_FACET_NAME = "previous";
 
-	public static final String FAST_REWIND_FACET_NAME = "fastrewind";
-	
-	
+    public static final String FAST_FORWARD_FACET_NAME = "fastforward";
+
+    public static final String FAST_REWIND_FACET_NAME = "fastrewind";
+
+    private transient UIData _UIData;
+    private transient boolean allowCache;
+
     public void addScrollerListener(DataScrollerListener listener) {
         addFacesListener(listener);
     }
@@ -75,471 +75,405 @@
 
     public void broadcast(FacesEvent event) throws AbortProcessingException {
         super.broadcast(event);
-        if (event instanceof DataScrollerEvent){
+        if (event instanceof DataScrollerEvent) {
 
-            if(getScrollerListeners().length < 1){               
+            if (getScrollerListeners().length < 1) {
                 addScrollerListener(new DataScrollerAdapter(getScrollerListener()));
                 event.queue();
             }
         }
-
     }
 
+    public abstract MethodBinding getScrollerListener();
 
-	
-     public abstract MethodBinding getScrollerListener();
-     public abstract void setScrollerListener(MethodBinding scrollerListener);
-	 public abstract void setFor(String  f);
-	 public abstract String getFor();
-	 public abstract int getFastStep();
-	 public abstract void setFastStep(int FastStep);
-	 public abstract boolean isRenderIfSinglePage();
-	 public abstract void setRenderIfSinglePage(boolean renderIfSinglePage);
-	 public abstract int getMaxPages();
-	 public abstract void setMaxPages(int maxPages);
-	 public abstract boolean isRenderCurrentAsText();
-	 public abstract void setRenderCurrentAsText(boolean renderCurrentAsText);
-	 public abstract String getSelectedStyleClass();
-	 public abstract void setSelectedStyleClass(String  selectedStyleClass);
-	 public abstract String getSelectedStyle();
-	 public abstract void setSelectedStyle(String  selectedStyle);
-	 public abstract String getEventsQueue();
-	 public abstract void setEventsQueue(String  eventsQueue);
-	 public abstract boolean isAjaxSingle();
-	 public abstract void setAjaxSingle(boolean ajaxSingle);
-	 public abstract int getRequestDelay();
-	 public abstract void setRequestDelay(int requestDelay);
-	 //public abstract boolean isImmediate();
-	 //public abstract void setImmediate(boolean immediate);
-	 public abstract String getTableStyleClass();
-	 public abstract void setTableStyleClass(String  tableStyleClass);
-	 public abstract String getStyleClass();
-	 public abstract String getStyle();
-	 public abstract void setStyleClass(String styleClass);
-	 public abstract void setStyle(String styleClass);
-     public abstract String getHandleValue();
-     public abstract void setHandleValue(String handleValue);
+    public abstract void setScrollerListener(MethodBinding scrollerListener);
 
+    public abstract void setFor(String f);
 
-	//TODO nick -> alex - it's better not to cache reference here - the component can be encoded
-	//with different "for" values. we can cache it, but than we should set it on phase start and 
-	//reset it to null on phase end:
-	//public processUpdates(...) {
-	//	try { allowCache = true; ... } finally { allowCache = false; _UIData = null; }
-	//}	
-	
+    public abstract String getFor();
 
-     public void processUpdates(FacesContext context){
-         try {
-        	         	                   
-         } catch (RuntimeException e) {
-             context.renderResponse();
-             throw e;
-         } finally 
-           { allowCache = false; _UIData = null; }
+    public abstract int getFastStep();
 
-     }
+    public abstract void setFastStep(int FastStep);
 
-     public void processValidators(FacesContext context){
-         try {
-        	         	                   
-         } catch (RuntimeException e) {
-             context.renderResponse();
-             throw e;
-         }finally 
-          { allowCache = false; _UIData = null; }
-         
-    	 
-     }
-     
-     public void processDecodes(FacesContext context){
-         try {        	 
-             decode(context);   
-             
-         } catch (RuntimeException e) {
-             context.renderResponse();
-             throw e;
+    public abstract boolean isRenderIfSinglePage();
 
-         }finally 
-          { allowCache = false; _UIData = null; }
+    public abstract void setRenderIfSinglePage(boolean renderIfSinglePage);
 
-     }
-     
-     
-	private transient UIData _UIData;
-	private transient boolean allowCache;
+    public abstract int getMaxPages();
 
+    public abstract void setMaxPages(int maxPages);
+
+    public abstract boolean isRenderCurrentAsText();
+
+    public abstract void setRenderCurrentAsText(boolean renderCurrentAsText);
+
+    public abstract String getSelectedStyleClass();
+
+    public abstract void setSelectedStyleClass(String selectedStyleClass);
+
+    public abstract String getSelectedStyle();
+
+    public abstract void setSelectedStyle(String selectedStyle);
+
+    public abstract String getEventsQueue();
+
+    public abstract void setEventsQueue(String eventsQueue);
+
+    public abstract boolean isAjaxSingle();
+
+    public abstract void setAjaxSingle(boolean ajaxSingle);
+
+    public abstract int getRequestDelay();
+
+    public abstract void setRequestDelay(int requestDelay);
+
+    public abstract String getTableStyleClass();
+
+    public abstract void setTableStyleClass(String tableStyleClass);
+
+    public abstract String getStyleClass();
+
+    public abstract String getStyle();
+
+    public abstract void setStyleClass(String styleClass);
+
+    public abstract void setStyle(String styleClass);
+
+    public abstract String getHandleValue();
+
+    public abstract void setHandleValue(String handleValue);
+
+    //TODO nick -> alex - it's better not to cache reference here - the component can be encoded
+    //with different "for" values. we can cache it, but than we should set it on phase start and
+    //reset it to null on phase end:
+    //public processUpdates(...) {
+    //	try { allowCache = true; ... } finally { allowCache = false; _UIData = null; }
+    //}
+
+    public void processUpdates(FacesContext context) {
+        try {
+
+        } catch (RuntimeException e) {
+            context.renderResponse();
+            throw e;
+        } finally {
+            allowCache = false;
+            _UIData = null;
+        }
+    }
+
+    public void processValidators(FacesContext context) {
+        try {
+
+        } catch (RuntimeException e) {
+            context.renderResponse();
+            throw e;
+        } finally {
+            allowCache = false;
+            _UIData = null;
+        }
+    }
+
+    public void processDecodes(FacesContext context) {
+        try {
+            decode(context);
+
+        } catch (RuntimeException e) {
+            context.renderResponse();
+            throw e;
+        } finally {
+            allowCache = false;
+            _UIData = null;
+        }
+    }
+
 //	private UIData getUIData() {
 //		if (_UIData == null) {
 //			_UIData = getDataTable();
 //		}
 //		return _UIData;
 //	}
-	
-	private UIData getUIData() {
-		if (!allowCache) {			
-			_UIData = getDataTable();
-			allowCache=true;
-		}
-		return _UIData;
-	}
-	
 
-	/**
-	 * Finds the dataTable which id is mapped to the "for" property
-	 * 
-	 * @return the dataTable component
-	 */
-	protected UIData getDataTable() {
-		String forAttribute = getFor();
-		UIComponent forComp;		
-		if (forAttribute == null) {
-			forComp=this;
-			  while((forComp = forComp.getParent())!= null) {
-					if (forComp instanceof UIData) {
-						setFor(forComp.getId());
-						return (UIData) forComp;				
-					}
-				  }
-				  throw new FacesException("could not dataTable for  datascroller "+ this.getId());			
-		}
-		else {
-			forComp = findComponent(forAttribute);
-		}
-		if (forComp == null) {
-			throw new IllegalArgumentException("could not dataTable with id '"
-					+ forAttribute + "'");
-		}
-		else if (!(forComp instanceof UIData)) {
-			throw new IllegalArgumentException("component with id '" + forAttribute
-					+ "' must be of type " + UIData.class.getName() + ", not type "
-					+ forComp.getClass().getName());
-		}
-		return (UIData) forComp;
-	}
+    private UIData getUIData() {
+        if (!allowCache) {
+            _UIData = getDataTable();
+            allowCache = true;
+        }
+        return _UIData;
+    }
 
-	/**
-	 * Gets the index of the current page
-	 * 
-	 * @return the page index
-	 */
-	public int getPageIndex() {
-		UIData uiData = getUIData();
-		//xxxx nick -> alex - suppose this.getRows() would be better here
-		int rows = getRows();
-		if (0 == rows) {
-			throw new FacesException("Missing 'rows' attribute on component '"
-					+ uiData.getId() + "'");
-		}
 
-		int pageIndex;
-		if (rows > 0) {
-			//xxxx nick -> alex - suppose this.getFirst() would be better here
-			pageIndex = getFirstRow() / rows + 1;
-		}
-		else {
-			//TODO nick -> nick - is it valid if under 0?
-			pageIndex = 0;
-		}
-		if (getFirstRow() % rows > 0) {
-			pageIndex++;
-		}
-		return pageIndex;
-	}
+    /**
+     * Finds the dataTable which id is mapped to the "for" property
+     *
+     * @return the dataTable component
+     */
+    protected UIData getDataTable() {
+        String forAttribute = getFor();
+        UIComponent forComp;
+        if (forAttribute == null) {
+            forComp = this;
+            while ((forComp = forComp.getParent()) != null) {
+                if (forComp instanceof UIData) {
+                    setFor(forComp.getId());
+                    return (UIData) forComp;
+                }
+            }
+            throw new FacesException("could not dataTable for  datascroller " + this.getId());
+        } else {
+            forComp = findComponent(forAttribute);
+        }
+        if (forComp == null) {
+            throw new IllegalArgumentException("could not dataTable with id '"
+                    + forAttribute + "'");
+        } else if (!(forComp instanceof UIData)) {
+            throw new IllegalArgumentException("component with id '" + forAttribute
+                    + "' must be of type " + UIData.class.getName() + ", not type "
+                    + forComp.getClass().getName());
+        }
+        return (UIData) forComp;
+    }
 
-	/**
-	 * Sets the page number according to the parameter recived from the
-	 * commandLink
-	 * 
-	 * @param facetName
-	 */
-	public void setPage(String facetName) {
+    /**
+     * Gets the index of the current page
+     *
+     * @return the page index
+     */
+    public int getPageIndex() {
+        UIData uiData = getUIData();
+        //xxxx nick -> alex - suppose this.getRows() would be better here
+        int rows = getRows();
+        if (0 == rows) {
+            throw new FacesException("Missing 'rows' attribute on component '"
+                    + uiData.getId() + "'");
+        }
 
-		UIData dataTable = getUIData();
+        int pageIndex;
+        if (rows > 0) {
+            //xxxx nick -> alex - suppose this.getFirst() would be better here
+            pageIndex = getFirstRow() / rows + 1;
+        } else {
+            //TODO nick -> nick - is it valid if under 0?
+            pageIndex = 0;
+        }
+        if (getFirstRow() % rows > 0) {
+            pageIndex++;
+        }
+        return pageIndex;
+    }
 
-		// check if facet is selected
-		if (FIRST_FACET_NAME.equals(facetName)) {
-			dataTable.setFirst(0);
-		}
-		else if (PREVIOUS_FACET_NAME.equals(facetName)) {
-			int previous = dataTable.getFirst() - getRows();
-			if (previous >= 0) dataTable.setFirst(previous);
-		}
-		else if (NEXT_FACET_NAME.equals(facetName)) {
-			int rows = getRows();
-			int next = dataTable.getFirst() + rows;			
-			if (next < getRowCount()) dataTable.setFirst(next);
-			//if (rows>0){
-			//	 if (((next+rows)/rows)>getMaxPages()){
-			//		next=getMaxPages()*rows-rows;;
-			//	 }
-			//}						
-		}
-		else if (FAST_FORWARD_FACET_NAME.equals(facetName)) {
-			int fastStep = getFastStep();			
-			int rows = getRows();
-			if (fastStep <= 0) fastStep = 1;
-			int next = dataTable.getFirst() + rows * fastStep;
-			int rowcount = getRowCount();
-			if (next >= rowcount)
-				next = (rowcount - 1) - ((rowcount - 1) % rows);
-			//if (rows>0){
-			// if (((next+rows)/rows)>getMaxPages()){
-			//	next=getMaxPages()*rows-rows;;
-			//}
-			//}
-			dataTable.setFirst(next);
-		}
-		else if (FAST_REWIND_FACET_NAME.equals(facetName)) {
-			int fastStep = getFastStep();
-			if (fastStep <= 0) fastStep = 1;
-			int previous = dataTable.getFirst() - getRows() * fastStep;
-			if (previous < 0) previous = 0;
-			dataTable.setFirst(previous);
-		}
-		else if (LAST_FACET_NAME.equals(facetName)) {
-			int rowcount = getRowCount();
-			int rows = getRows();
-			int delta = rowcount % rows;
-			int first = delta > 0 && delta < rows ? rowcount - delta : rowcount
-					- rows;
-			if (first >= 0) {
-				//if (rows>0){ 
-				//if (((first+rows)/rows)>getMaxPages()){
-				//	first=getMaxPages()*rows-rows;
-				//} 
-				//}
-				dataTable.setFirst(first);
-			}
-			else {
-				dataTable.setFirst(0);
-			}
-		}
-		// the paginator is selected
-		else {
-			int pageindex = Integer.parseInt(facetName);
-			int pageCount = getPageCount();
-			if (pageindex > pageCount) {
-				pageindex = pageCount;
-			}
-			else if (pageindex <= 0) {
-				pageindex = 1;
-			}
-			dataTable.setFirst(getRows() * (pageindex - 1));			
-		}
+    /**
+     * Sets the page number according to the parameter recived from the
+     * commandLink
+     *
+     * @param facetName
+     */
+    public void setPage(String facetName) {
 
-	}
+        UIData dataTable = getUIData();
 
-	/**
-	 * Sets the page index
-	 * 
-	 * @param page number
-	 */
-	public void setPageIndex(int page) {
-		UIData uiData = getUIData();
-		int rows = getRows();
-		if (0 == rows) {
-			throw new FacesException("Missing 'rows' attribute on component '"
-					+ uiData.getId() + "'");
-		}
-		if (page>0){
-		 uiData.setFirst(page * rows);
-	    }
-	}
+        // check if facet is selected
+        if (FIRST_FACET_NAME.equals(facetName)) {
+            dataTable.setFirst(0);
+        } else if (PREVIOUS_FACET_NAME.equals(facetName)) {
+            int previous = dataTable.getFirst() - getRows();
+            if (previous >= 0) dataTable.setFirst(previous);
+        } else if (NEXT_FACET_NAME.equals(facetName)) {
+            int rows = getRows();
+            int next = dataTable.getFirst() + rows;
+            if (next < getRowCount()) dataTable.setFirst(next);
+            //if (rows>0){
+            //	 if (((next+rows)/rows)>getMaxPages()){
+            //		next=getMaxPages()*rows-rows;;
+            //	 }
+            //}
+        } else if (FAST_FORWARD_FACET_NAME.equals(facetName)) {
+            int fastStep = getFastStep();
+            int rows = getRows();
+            if (fastStep <= 0) fastStep = 1;
+            int next = dataTable.getFirst() + rows * fastStep;
+            int rowcount = getRowCount();
+            if (next >= rowcount)
+                next = (rowcount - 1) - ((rowcount - 1) % rows);
+            //if (rows>0){
+            // if (((next+rows)/rows)>getMaxPages()){
+            //	next=getMaxPages()*rows-rows;;
+            //}
+            //}
+            dataTable.setFirst(next);
+        } else if (FAST_REWIND_FACET_NAME.equals(facetName)) {
+            int fastStep = getFastStep();
+            if (fastStep <= 0) fastStep = 1;
+            int previous = dataTable.getFirst() - getRows() * fastStep;
+            if (previous < 0) previous = 0;
+            dataTable.setFirst(previous);
+        } else if (LAST_FACET_NAME.equals(facetName)) {
+            int rowcount = getRowCount();
+            int rows = getRows();
+            int delta = rowcount % rows;
+            int first = delta > 0 && delta < rows ? rowcount - delta : rowcount
+                    - rows;
+            if (first >= 0) {
+                //if (rows>0){
+                //if (((first+rows)/rows)>getMaxPages()){
+                //	first=getMaxPages()*rows-rows;
+                //}
+                //}
+                dataTable.setFirst(first);
+            } else {
+                dataTable.setFirst(0);
+            }
+        }
+        // the paginator is selected
+        else {
+            int pageindex = Integer.parseInt(facetName);
+            int pageCount = getPageCount();
+            if (pageindex > pageCount) {
+                pageindex = pageCount;
+            } else if (pageindex <= 0) {
+                pageindex = 1;
+            }
+            dataTable.setFirst(getRows() * (pageindex - 1));
+        }
 
-	/**
-	 * @return the page count of the uidata
-	 */
-	public int getPageCount() {
-		//UIData uiData = getUIData();
-		int rows = getRows();
-		int pageCount;
-		if (rows > 0) {
-			pageCount = rows <= 0 ? 1 : getRowCount() / rows;
-			if (getRowCount() % rows > 0) {
-				pageCount++;
-			}
-			if (pageCount==0){
-				pageCount=1;
-			}
-		}
-		else {
-			rows = 1;
-			pageCount = 1;
-		}
-		return pageCount;
-	}
+    }
 
-	/**
-	 * @return int
-	 */
-	public int getRowCount() {
-		//xxx nick -> alex - scrollable models can return -1 here
-		//let's implement "dychotomic" discovery
-		// setPage(1)... if isPageAvailable() setPage(2) then 4, 8, etc. 
-		// setPage() { setRowIndex(pageIdx * rows); }
-		// isPageAvailable() { return isRowAvailable() }	
-		//return getUIData().getRowCount();
-		return BinarySearch(getUIData());
-	}
+    /**
+     * Sets the page index
+     *
+     * @param page number
+     */
+    public void setPageIndex(int page) {
+        UIData uiData = getUIData();
+        int rows = getRows();
+        if (0 == rows) {
+            throw new FacesException("Missing 'rows' attribute on component '"
+                    + uiData.getId() + "'");
+        }
+        if (page > 0) {
+            uiData.setFirst(page * rows);
+        }
+    }
 
-	
-	private int BinarySearch(UIData Data)
-	{
-	  int n=1;	
-	  int k=2;
-	  for (;;){
-	   Data.setRowIndex(k-1);	
-	   if (Data.isRowAvailable()){		  
-		  n=k;
-		  k=k*2;
-	   }
-	   else{
-		  break;
-	   }
-	  }
-	  
-	  
-	   while (n < k) {			  			   	            	            
-		        int kk = (int)Math.round((n + k)/ 2)+1;
-	            Data.setRowIndex(kk-1);
-	            if (Data.isRowAvailable()){
-	            	n = kk;
-	            }
-	            else{
-	                k=kk-1;	
-	            }	
-	   }
-		  
-		  
-	   Data.setRowIndex(k-1);	  
-	   if (Data.isRowAvailable()){
-		  return k; 
-	   }
-	   else{
-		   return 0;
-	   }
-	}
+    /**
+     * @return the page count of the uidata
+     */
+    public int getPageCount() {
+        //UIData uiData = getUIData();
+        int rows = getRows();
+        int pageCount;
+        if (rows > 0) {
+            pageCount = rows <= 0 ? 1 : getRowCount() / rows;
+            if (getRowCount() % rows > 0) {
+                pageCount++;
+            }
+            if (pageCount == 0) {
+                pageCount = 1;
+            }
+        } else {
+            rows = 1;
+            pageCount = 1;
+        }
+        return pageCount;
+    }
 
-	
-	
-	/**
-	 * @return int
-	 */
-	public int getRows() {
-		int row=0;
-		row=getUIData().getRows();
-		if (row==0){
-		  //if (getRowCount()>=2){
-		  //	  row=2;
-		  //	  
-		  //}
-		  //else{
-			  row=getRowCount();
-			  
-		  //}
-			  
-		}
-		
-		return row;
-		//return getUIData().getRowCount();
-		
-	}
+    /**
+     * @return int
+     */
+    public int getRowCount() {
+        //xxx nick -> alex - scrollable models can return -1 here
+        //let's implement "dychotomic" discovery
+        // setPage(1)... if isPageAvailable() setPage(2) then 4, 8, etc.
+        // setPage() { setRowIndex(pageIdx * rows); }
+        // isPageAvailable() { return isRowAvailable() }
+        //return getUIData().getRowCount();
+        return new BinarySearch().search(getUIData());
+    }
 
-	// facet getter methods
-	public UIComponent getFirst() {
-		return (UIComponent) getFacet(FIRST_FACET_NAME);
-	}
+    /**
+     * @return int
+     */
+    public int getRows() {
+        int row = 0;
+        row = getUIData().getRows();
+        if (row == 0) {
+            row = getRowCount();
+        }
 
-	public UIComponent getLast() {
-		return (UIComponent) getFacet(LAST_FACET_NAME);
-	}
+        return row;
+    }
 
-	public UIComponent getNext() {
-		return (UIComponent) getFacet(NEXT_FACET_NAME);
-	}
+    // facet getter methods
+    public UIComponent getFirst() {
+        return getFacet(FIRST_FACET_NAME);
+    }
 
-	public UIComponent getFastForward() {
-		return (UIComponent) getFacet(FAST_FORWARD_FACET_NAME);
-	}
+    public UIComponent getLast() {
+        return getFacet(LAST_FACET_NAME);
+    }
 
-	public UIComponent getFastRewind() {
-		return (UIComponent) getFacet(FAST_REWIND_FACET_NAME);
-	}
+    public UIComponent getNext() {
+        return getFacet(NEXT_FACET_NAME);
+    }
 
-	public UIComponent getPrevious() {
-		return (UIComponent) getFacet(PREVIOUS_FACET_NAME);
-	}
+    public UIComponent getFastForward() {
+        return getFacet(FAST_FORWARD_FACET_NAME);
+    }
 
-	/**
-	 * @return int
-	 */
-	public int getFirstRow() {
-		return getUIData().getFirst();
-	}
+    public UIComponent getFastRewind() {
+        return getFacet(FAST_REWIND_FACET_NAME);
+    }
 
-	public void setFirstRow(int rows) {
-		 getUIData().setFirst(rows);
-	}
+    public UIComponent getPrevious() {
+        return getFacet(PREVIOUS_FACET_NAME);
+    }
 
-	
-	
-	
-	
-	
-	
-/*
-	public Object saveState(FacesContext context) {
-		Object values[] = new Object[17];
-		values[0] = super.saveState(context);
-		values[1] = _for;
-		values[2] = tableStyleClass;
-		values[3] = tableStyle;
-		values[4] = selectedStyleClass;
-		values[5] = selectedStyle;
-		values[6] = styleClass;
-		values[7] = style;
-		values[8] = maxPages;
-		values[9] = renderIfSinglePage;
-		values[10] = fastStep;
-		values[11] = immediate;
-		values[12] = ignoreDupResponses;
-		values[13] = eventsQueue;
-		values[14] = requestDelay;
-		values[15] = ajaxSingle;
-		values[16] = renderCurrentAsText;
-		return values;
-	}
+    /**
+     * @return int
+     */
+    public int getFirstRow() {
+        return getUIData().getFirst();
+    }
 
-	public void restoreState(FacesContext context, Object state) {
-		Object values[] = (Object[]) state;
-		super.restoreState(context, values[0]);
-		_for = (String) values[1];
-		tableStyleClass = (String) values[2];
-		tableStyle = (String) values[3];
-		selectedStyleClass = (String) values[4];
-		selectedStyle = (String) values[5];
-		styleClass = (String) values[6];
-		style = (String) values[7];
-		maxPages = (Integer) values[8];
-		renderIfSinglePage = (Boolean) values[9];
-		fastStep = (Integer) values[10];
-		immediate = (Boolean) values[11];
-		ignoreDupResponses = (Boolean) values[12];
-		eventsQueue = (String) values[13];
-		requestDelay = (Integer) values[14];
-		ajaxSingle = (Boolean) values[15];
-		renderCurrentAsText = (Boolean) values[16];
-	}
-*/
+    public void setFirstRow(int rows) {
+        getUIData().setFirst(rows);
+    }
 
-	public String getFamily() {
-		return COMPONENT_FAMILY;
-	}
+    public String getFamily() {
+        return COMPONENT_FAMILY;
+    }
 
-	//public String getRendererType() {
-	//	return RENDERER_TYPE;
-	//}
+    static class BinarySearch {
+        public int search(UIData data) {
+            int n = 1;
+            int k = 2;
+            for (; ;) {
+                data.setRowIndex(k - 1);
+                if (data.isRowAvailable()) {
+                    n = k;
+                    k = k * 2;
+                } else {
+                    break;
+                }
+            }
 
+            while (n < k) {
+                int kk = Math.round((n + k) / 2) + 1;
+                data.setRowIndex(kk - 1);
+                if (data.isRowAvailable()) {
+                    n = kk;
+                } else {
+                    k = kk - 1;
+                }
+            }
 
+            data.setRowIndex(k - 1);
+            if (data.isRowAvailable()) {
+                return k;
+            } else {
+                return 0;
+            }
+        }
+    }
 }

Modified: trunk/richfaces/datascroller/src/test/java/org/richfaces/component/DatascrollerComponentTest.java
===================================================================
--- trunk/richfaces/datascroller/src/test/java/org/richfaces/component/DatascrollerComponentTest.java	2007-04-10 13:45:41 UTC (rev 340)
+++ trunk/richfaces/datascroller/src/test/java/org/richfaces/component/DatascrollerComponentTest.java	2007-04-10 13:52:19 UTC (rev 341)
@@ -77,12 +77,12 @@
         form.setId("form");
         facesContext.getViewRoot().getChildren().add(form);
 
-        data = (UIData)application.createComponent(HtmlDataTable.COMPONENT_TYPE);
+        data = (UIData) application.createComponent(HtmlDataTable.COMPONENT_TYPE);
         data.setId("data");
         data.setRows(5);
         form.getChildren().add(data);
 
-        scroller = (UIDatascroller)application.createComponent("org.richfaces.Datascroller");
+        scroller = (UIDatascroller) application.createComponent("org.richfaces.Datascroller");
         scroller.setId("dataScroller");
         scroller.setFor(data.getId());
 
@@ -194,7 +194,8 @@
 
             if (StringUtils.isNotBlank(srcAttr)) {
                 boolean found = false;
-                for (Iterator srcIt = javaScripts.iterator(); srcIt.hasNext();) {
+                for (Iterator srcIt = javaScripts.iterator(); srcIt.hasNext();)
+                {
                     String src = (String) srcIt.next();
 
                     found = srcAttr.contains(src);
@@ -207,4 +208,96 @@
             }
         }
     }
+
+    /**
+     * Test binary search
+     *
+     * @throws Exception
+     */
+    public void testBinarySearch() throws Exception {
+        class MockData extends UIData {
+            private int rowIndex;
+            private int minRow;
+            private int maxRow;
+
+            public int getMaxRow() {
+                return maxRow;
+            }
+
+            public void setMaxRow(int maxRow) {
+                this.maxRow = maxRow;
+            }
+
+            public int getMinRow() {
+                return minRow;
+            }
+
+            public void setMinRow(int minRow) {
+                this.minRow = minRow;
+            }
+
+            public boolean isRowAvailable() {
+                return rowIndex >= getMinRow() && rowIndex < getMaxRow();
+            }
+
+            public void setRowIndex(int rowIndex) {
+                this.rowIndex = rowIndex;
+            }
+        }
+
+        MockData data;
+        UIDatascroller.BinarySearch bs = new UIDatascroller.BinarySearch();
+
+        data = new MockData();
+        data.setMaxRow(1);
+        assertEquals(1, bs.search(data));
+
+        data = new MockData();
+        data.setMaxRow(2);
+        assertEquals(2, bs.search(data));
+
+        data = new MockData();
+        data.setMaxRow(3);
+        assertEquals(3, bs.search(data));
+
+        data = new MockData();
+        data.setMaxRow(4);
+        assertEquals(4, bs.search(data));
+
+        data = new MockData();
+        data.setMaxRow(5);
+        assertEquals(5, bs.search(data));
+
+        data = new MockData();
+        data.setMaxRow(6);
+        assertEquals(6, bs.search(data));
+
+        data = new MockData();
+        data.setMaxRow(7);
+        assertEquals(7, bs.search(data));
+
+        data = new MockData();
+        data.setMaxRow(8);
+        assertEquals(8, bs.search(data));
+
+        data = new MockData();
+        data.setMaxRow(9);
+        assertEquals(9, bs.search(data));
+
+        data = new MockData();
+        data.setMaxRow(10);
+        assertEquals(10, bs.search(data));
+
+        data = new MockData();
+        data.setMaxRow(11);
+        assertEquals(11, bs.search(data));
+
+        data = new MockData();
+        data.setMaxRow(12);
+        assertEquals(12, bs.search(data));
+
+        data = new MockData();
+        data.setMaxRow(13);
+        assertEquals(13, bs.search(data));
+    }
 }




More information about the richfaces-svn-commits mailing list