[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