[richfaces-svn-commits] JBoss Rich Faces SVN: r2592 - in trunk/ui/tabPanel: src/main/java/org/richfaces/component and 2 other directories.

richfaces-svn-commits at lists.jboss.org richfaces-svn-commits at lists.jboss.org
Wed Aug 29 19:59:15 EDT 2007


Author: nbelaevski
Date: 2007-08-29 19:59:15 -0400 (Wed, 29 Aug 2007)
New Revision: 2592

Added:
   trunk/ui/tabPanel/src/test/java/org/richfaces/renderkit/TabsIteratorHelperTest.java
Removed:
   trunk/ui/tabPanel/src/main/java/org/richfaces/component/TabsIterator.java
Modified:
   trunk/ui/tabPanel/
   trunk/ui/tabPanel/src/main/java/org/richfaces/component/UITabPanel.java
   trunk/ui/tabPanel/src/main/java/org/richfaces/renderkit/TabPanelRendererBase.java
Log:
http://jira.jboss.com/jira/browse/RF-750


Property changes on: trunk/ui/tabPanel
___________________________________________________________________
Name: svn:ignore
   - target
.settings
.classpath
.project

   + target
.settings
.classpath
.project
.clover


Deleted: trunk/ui/tabPanel/src/main/java/org/richfaces/component/TabsIterator.java
===================================================================
--- trunk/ui/tabPanel/src/main/java/org/richfaces/component/TabsIterator.java	2007-08-29 18:02:10 UTC (rev 2591)
+++ trunk/ui/tabPanel/src/main/java/org/richfaces/component/TabsIterator.java	2007-08-29 23:59:15 UTC (rev 2592)
@@ -1,117 +0,0 @@
-/**
- * License Agreement.
- *
- *  JBoss RichFaces - 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.component;
-
-import java.util.Iterator;
-import java.util.NoSuchElementException;
-
-/**
- * "sublist" iterator for iterate over child components instantiate from {@link UITab}
- *
- * @author shura (latest modification by $Author$)
- * @version $Revision$ $Date$
- */
-class TabsIterator implements Iterator {
-
-    static interface FilterCondition {
-        public boolean isSuitable(UITab tab);
-    }
-
-    private FilterCondition filterCondition;
-
-    /**
-     *
-     */
-    private final UITabPanel tabsIterator;
-
-    /**
-     * Original component iterator for children
-     */
-    private Iterator _childs;
-
-    /**
-     * Next UITab in children.
-     */
-    private Object _next = null;
-
-    public TabsIterator(UITabPanel tabPanel, FilterCondition filterCondition) {
-        super();
-
-        this.filterCondition = filterCondition;
-
-        tabsIterator = tabPanel;
-        _childs = tabsIterator.getChildren().iterator();
-        _next = getNextTab();
-    }
-
-    /**
-     * @param tabPanel TODO
-     */
-    public TabsIterator(UITabPanel tabPanel) {
-        this(tabPanel, null);
-    }
-
-    /* (non-Javadoc)
-      * @see java.util.Iterator#hasNext()
-      */
-    public boolean hasNext() {
-        return _next != null;
-    }
-
-    /* (non-Javadoc)
-      * @see java.util.Iterator#next()
-      */
-    public Object next() {
-        if (null == _next) {
-            throw new NoSuchElementException();
-        }
-        Object next = _next;
-        _next = getNextTab();
-        return next;
-    }
-
-    /* (non-Javadoc)
-      * @see java.util.Iterator#remove()
-      */
-    public void remove() {
-        throw new UnsupportedOperationException("tabs Iterator not support remove operation");
-
-    }
-
-    /**
-     * Find next {@link UITab} components in children
-     * @return next tab
-     */
-    private Object getNextTab() {
-        while (_childs.hasNext()) {
-            Object element = _childs.next();
-            if (element instanceof UITab) {
-                UITab tab = (UITab) element;
-                if (filterCondition == null || filterCondition.isSuitable(tab))
-                {
-                    return tab;
-                }
-            }
-        }
-        return null;
-    }
-}
\ No newline at end of file

Modified: trunk/ui/tabPanel/src/main/java/org/richfaces/component/UITabPanel.java
===================================================================
--- trunk/ui/tabPanel/src/main/java/org/richfaces/component/UITabPanel.java	2007-08-29 18:02:10 UTC (rev 2591)
+++ trunk/ui/tabPanel/src/main/java/org/richfaces/component/UITabPanel.java	2007-08-29 23:59:15 UTC (rev 2592)
@@ -26,6 +26,10 @@
 import javax.faces.component.UIComponent;
 import javax.faces.context.FacesContext;
 
+import org.apache.commons.collections.CollectionUtils;
+import org.apache.commons.collections.Predicate;
+import org.apache.commons.collections.iterators.FilterIterator;
+
 /**
  * JSF component class
  */
@@ -39,20 +43,15 @@
     protected Iterator getSwitchedFacetsAndChildren() {
     	final Object renderedValue = this.restoredRenderedValue;
 
-        return new TabsIterator(this, new TabsIterator.FilterCondition() {
+    	return new FilterIterator(getRenderedTabs(), new Predicate() {
 
-            public boolean isSuitable(UITab tab) {
-                if (CLIENT_METHOD.equals(tab.getSwitchTypeOrDefault())) {
-
-                    return true;
-                }
-
-                Object name = tab.getName();
-
-                return name != null && name.equals(renderedValue);
-            }
-
-        });
+    		public boolean evaluate(Object object) {
+    			UITab tab = (UITab) object;
+    			return !tab.isDisabled() && (CLIENT_METHOD.equals(tab.getSwitchTypeOrDefault())) ||
+    						(renderedValue != null && renderedValue.equals(tab.getName()));
+    		}
+        	
+        });    	
     }
 
     public Object convertSwitchValue(UIComponent component, Object object) {
@@ -120,14 +119,32 @@
     	this.restoredRenderedValue = getRenderedValue();
     }
     
+    private static final Predicate RENDERED_TAB_PREDICATE = new Predicate() {
+
+		public boolean evaluate(Object object) {
+			if (object instanceof UITab) {
+				UITab tab = (UITab) object;
+				
+				return tab.isRendered();
+			}
+			
+			return false;
+		}
+    	
+    };
+    
     /**
-     * Create iterator for all tabs in this component ( in future, can be added special attribute for tabs collection.
+     * Create iterator for all rendered tabs in this component
      * {@link Iterator#next()} method will return tab model - {@link Tab}
      *
      * @return Iterator
      */
-    public Iterator getTabs() {
-        return new TabsIterator(this);
+    public Iterator getRenderedTabs() {
+    	if (getChildCount() > 0) {
+            return new FilterIterator(getChildren().iterator(), RENDERED_TAB_PREDICATE);
+    	} else {
+    		return CollectionUtils.EMPTY_COLLECTION.iterator();
+    	}
     }
 
     /**

Modified: trunk/ui/tabPanel/src/main/java/org/richfaces/renderkit/TabPanelRendererBase.java
===================================================================
--- trunk/ui/tabPanel/src/main/java/org/richfaces/renderkit/TabPanelRendererBase.java	2007-08-29 18:02:10 UTC (rev 2591)
+++ trunk/ui/tabPanel/src/main/java/org/richfaces/renderkit/TabPanelRendererBase.java	2007-08-29 23:59:15 UTC (rev 2592)
@@ -42,6 +42,7 @@
 import org.richfaces.component.UITab;
 import org.richfaces.component.UITabPanel;
 import org.richfaces.component.util.HtmlUtil;
+import org.richfaces.component.util.MessageUtil;
 import org.richfaces.event.SwitchablePanelSwitchEvent;
 
 
@@ -69,11 +70,11 @@
 
         UITab eventTab = null;
 
-        for (Iterator tabsIterator = panel.getTabs();
+        for (Iterator tabsIterator = panel.getRenderedTabs();
              tabsIterator.hasNext() && eventTab == null;) {
 
             UITab tab = (UITab) tabsIterator.next();
-            if (!tab.isRendered() || tab.isDisabled()) {
+            if (tab.isDisabled()) {
                 continue;
             }
 
@@ -185,31 +186,6 @@
         return getUtils().getValueAsString(context, tabPanel);
     }
 
-    public String getTabsCount(FacesContext context, UITabPanel tabPanel){
-    	int count = 0;
-    	String ret = "1";
-    	for (Iterator iter = tabPanel.getTabs(); iter.hasNext();){
-    		iter.next();
-    		count++;
-    	}
-    	//center tabs group
-    	ret = String.valueOf(count*2 - 1);
-    	return ret;
-    }
-/*    
-    public void writeColgroups(FacesContext context, UITabPanel tabPanel) throws IOException{
-    	StringBuffer buff = new StringBuffer();
-    	if("left".equals(tabPanel.getHeaderAlignment())){
-    		buff.append("<colgroup/>").append("<colgroup span=\"" + getTabsCount(context, tabPanel) + "\"/>").append("<colgroup width=\"100%\"/>");
-    	} else if("center".equals(tabPanel.getHeaderAlignment())){
-    		buff.append("<colgroup width=\"33%\"/>").append("<colgroup width=\"34%\" span=\"" + getTabsCount(context, tabPanel) + "\"/>").append("<colgroup width=\"33%\"/>");
-    	} else {
-    		buff.append("<colgroup width=\"100%\"/>").append("<colgroup span=\"" + getTabsCount(context, tabPanel) + "\"/>").append("<colgroup/>");
-    	}
-    	context.getResponseWriter().write(buff.toString());
-    	//return null;
-    }
-*/    
     private Object checkValue(Object value) {
     	if (value instanceof String) {
 			String s = (String) value;
@@ -224,75 +200,127 @@
     	return value;
     }
     
+    protected static class TabsIteratorHelper {
+    	private Iterator tabs;
+    	
+    	private UITab namedTab = null;
+    	private UITab firstApplicableTab = null;
+    	private boolean fallback;
+    	
+		public TabsIteratorHelper(Iterator tabs, Object name) {
+			super();
+			this.tabs = tabs;
+			
+			if (name != null) {
+				//findTabByName
+				while (tabs.hasNext()) {
+					UITab tab = nextTab();
+					if (name.equals(tab.getName())) {
+						this.namedTab = tab;
+						break;
+					}
+				}
+			}
+			
+			if (namedTab == null) {
+				if (name != null) {
+	            	//tried but failed
+					fallback = true;
+				}
+				
+				this.namedTab = findAnyTab();
+			} else if (namedTab.isDisabled()) {
+	        	UITab tab = findAnyTab();
+	        	if (this.namedTab != tab && tab != null && !tab.isDisabled()) {
+	            	fallback = true;
+	            	this.namedTab = tab;
+	        	} else {
+	        		//use disabled tab found by name
+	        	}
+			}
+		}
+		
+		private UITab nextTab() {
+			UITab tab = (UITab) tabs.next();
+			
+			if (firstApplicableTab == null) {
+				firstApplicableTab = tab;
+			} else if (firstApplicableTab.isDisabled() && !tab.isDisabled()) {
+				//more appropriate
+				firstApplicableTab = tab;
+			}
+			
+			return tab;
+		}
+		
+		public UITab getTab() {
+			return this.namedTab;
+		}
+		
+		public boolean isFallback() {
+			return fallback;
+		}
+		
+		private UITab findAnyTab() {
+			while ((firstApplicableTab == null || firstApplicableTab.isDisabled()) && tabs.hasNext()) {
+				nextTab();
+			}
+
+			return firstApplicableTab;
+		}
+    }
+    
     public void encodeTabs(FacesContext context, UITabPanel tabPanel) throws IOException {
         ComponentVariables componentVariables = ComponentsVariableResolver.getVariables(this, tabPanel);
 
         tabPanel.setRenderedValue(null);
         Object checkedValue = checkValue(tabPanel.getValue());
 
-        boolean useFirstRenderedTab = checkedValue == null;
         UITabPanel pane = tabPanel;
-        UITab firstRenderedTab = null;
         UITab activeTab = null;
 
-        for (Iterator iter = pane.getTabs(); iter.hasNext() && activeTab == null;)
-        {
-            UITab tab = (UITab) iter.next();
+        TabsIteratorHelper helper = new TabsIteratorHelper(pane.getRenderedTabs(), checkedValue);
+        activeTab = helper.getTab();
 
-            if (tab.isRendered() && !tab.isDisabled()) {
-                if (firstRenderedTab == null) {
-                    firstRenderedTab = tab;
-                }
+        if (activeTab == null) {
+        	Object label = MessageUtil.getLabel(context, tabPanel);
+        	String message = label + ": tab panel has no enabled or rendered tabs!";
+        	context.getExternalContext().log(message);
+        	return ;
+        }
 
-                if (useFirstRenderedTab) {
-                    activeTab = firstRenderedTab;
-                } else if (checkedValue.equals(tab.getName())) {
-                    activeTab = tab;
-                }
+        if (helper.isFallback()) {
+        	Object label = MessageUtil.getLabel(context, tabPanel);
+        	String message = label + ": tab panel [@selectedTab=" + checkedValue + 
+        			"] has no enabled or rendered tab with such name. Tab: " + activeTab.getName() + 
+        			" will be used instead!";
+        	context.getExternalContext().log(message);
 
-            } else {
-                if (!useFirstRenderedTab) {
-                    if (checkedValue.equals(tab.getName())) {
-                        if (firstRenderedTab != null) {
-                            activeTab = firstRenderedTab;
-                        } else {
-                            useFirstRenderedTab = true;
-                        }
-                    }
-                }
-            }
-        }
+        	tabPanel.setRenderedValue(activeTab.getName());
+    	} else {
+    		tabPanel.setRenderedValue(null);
+    	}
+        
+        helper = null;
 
-        if (activeTab == null) {
-            throw new IllegalStateException("No active tabs!");
-        } else {
-        	if (useFirstRenderedTab) {
-        		tabPanel.setRenderedValue(activeTab.getName());
-        	} else {
-        		tabPanel.setRenderedValue(null);
-        	}
-        }
-
         ArrayList tabs = new ArrayList();
         boolean clientSide = UISwitchablePanel.CLIENT_METHOD.equals(pane.getSwitchType());
 
         TabInfoCollector tabInfoCollector = getTabInfoCollector();
 
-        for (Iterator iter = pane.getTabs(); iter.hasNext();) {
+        for (Iterator iter = pane.getRenderedTabs(); iter.hasNext();) {
             UITab tab = (UITab) iter.next();
             boolean active = activeTab == tab;
             tab.setActive(active);
 
-            if (tab.isRendered()) {
-                if (!clientSide) {
-                    clientSide = UISwitchablePanel.CLIENT_METHOD.equals(tab.getSwitchTypeOrDefault());
-                }
+            if (!clientSide) {
+                clientSide = UISwitchablePanel.CLIENT_METHOD.equals(tab.getSwitchTypeOrDefault());
+            }
 
-                tab.encodeTab(context, active);
+            tab.encodeTab(context, active);
 
-                if (!tab.isDisabled()) {
-                    tabs.add(tabInfoCollector.collectTabInfo(context, tab));
-                }
+            if (!tab.isDisabled()) {
+                tabs.add(tabInfoCollector.collectTabInfo(context, tab));
             }
         }
 

Added: trunk/ui/tabPanel/src/test/java/org/richfaces/renderkit/TabsIteratorHelperTest.java
===================================================================
--- trunk/ui/tabPanel/src/test/java/org/richfaces/renderkit/TabsIteratorHelperTest.java	                        (rev 0)
+++ trunk/ui/tabPanel/src/test/java/org/richfaces/renderkit/TabsIteratorHelperTest.java	2007-08-29 23:59:15 UTC (rev 2592)
@@ -0,0 +1,119 @@
+/**
+ * License Agreement.
+ *
+ *  JBoss RichFaces - 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;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.ajax4jsf.tests.AbstractAjax4JsfTestCase;
+import org.richfaces.component.UITab;
+import org.richfaces.renderkit.TabPanelRendererBase.TabsIteratorHelper;
+
+public class TabsIteratorHelperTest extends AbstractAjax4JsfTestCase {
+
+	public TabsIteratorHelperTest(String name) {
+		super(name);
+	}
+
+	private List tabsList;
+	
+	public void setUp() throws Exception {
+		super.setUp();
+		
+		tabsList = new ArrayList();
+		
+		for (int i = 0; i < 3; i++) {
+			UITab tab = (UITab) application.createComponent(UITab.COMPONENT_TYPE);
+			tab.setName("tab" + i);
+			tabsList.add(tab);
+		}
+	}
+
+	public void tearDown() throws Exception {
+		super.tearDown();
+		tabsList = null;
+	}
+
+	public void testFindByName() throws Exception {
+		TabsIteratorHelper helper = new TabsIteratorHelper(tabsList.iterator(), "tab2");
+		assertSame(tabsList.get(2), helper.getTab());
+		assertFalse(helper.isFallback());
+	}
+	
+	public void testFindByName1() throws Exception {
+		TabsIteratorHelper helper = new TabsIteratorHelper(tabsList.iterator(), "taba");
+		assertSame(tabsList.get(0), helper.getTab());
+		assertTrue(helper.isFallback());
+	}
+
+	public void testFindAnyTabDefault() throws Exception {
+		TabsIteratorHelper helper = new TabsIteratorHelper(tabsList.iterator(), null);
+		assertSame(tabsList.get(0), helper.getTab());
+		assertFalse(helper.isFallback());
+	}
+
+	public void testFindAnyTab() throws Exception {
+		((UITab) tabsList.get(0)).setDisabled(true);
+		((UITab) tabsList.get(1)).setDisabled(true);
+
+		TabsIteratorHelper helper = new TabsIteratorHelper(tabsList.iterator(), "taba");
+		assertSame(tabsList.get(2), helper.getTab());
+		assertTrue(helper.isFallback());
+	}
+
+	public void testFindAnyTabUnnamed() throws Exception {
+		((UITab) tabsList.get(0)).setDisabled(true);
+
+		TabsIteratorHelper helper = new TabsIteratorHelper(tabsList.iterator(), null);
+		assertSame(tabsList.get(1), helper.getTab());
+		assertFalse(helper.isFallback());
+	}
+
+	public void testFindAnyTabAllDisabled() throws Exception {
+		((UITab) tabsList.get(0)).setDisabled(true);
+		((UITab) tabsList.get(1)).setDisabled(true);
+		((UITab) tabsList.get(2)).setDisabled(true);
+
+		TabsIteratorHelper helper = new TabsIteratorHelper(tabsList.iterator(), null);
+		assertSame(tabsList.get(0), helper.getTab());
+		assertFalse(helper.isFallback());
+	}
+
+	public void testFindTabByNameDisabled() throws Exception {
+		((UITab) tabsList.get(0)).setDisabled(true);
+		((UITab) tabsList.get(1)).setDisabled(true);
+		((UITab) tabsList.get(2)).setDisabled(true);
+
+		TabsIteratorHelper helper = new TabsIteratorHelper(tabsList.iterator(), "tab1");
+		assertSame(tabsList.get(1), helper.getTab());
+		assertFalse(helper.isFallback());
+	}
+
+	public void testFindTabByNameBeforeDisabled() throws Exception {
+		((UITab) tabsList.get(0)).setDisabled(true);
+		((UITab) tabsList.get(2)).setDisabled(true);
+
+		TabsIteratorHelper helper = new TabsIteratorHelper(tabsList.iterator(), "tab2");
+		assertSame(tabsList.get(1), helper.getTab());
+		assertTrue(helper.isFallback());
+	}
+}




More information about the richfaces-svn-commits mailing list