[richfaces-svn-commits] JBoss Rich Faces SVN: r2128 - in trunk: samples/tabPanelDemo/src/main/webapp/pages and 2 other directories.

richfaces-svn-commits at lists.jboss.org richfaces-svn-commits at lists.jboss.org
Tue Aug 7 20:10:27 EDT 2007


Author: nbelaevski
Date: 2007-08-07 20:10:27 -0400 (Tue, 07 Aug 2007)
New Revision: 2128

Modified:
   trunk/framework/impl/src/main/java/org/richfaces/component/UISwitchablePanel.java
   trunk/samples/tabPanelDemo/src/main/webapp/pages/index.jsp
   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-560 fixed

Modified: trunk/framework/impl/src/main/java/org/richfaces/component/UISwitchablePanel.java
===================================================================
--- trunk/framework/impl/src/main/java/org/richfaces/component/UISwitchablePanel.java	2007-08-07 23:41:01 UTC (rev 2127)
+++ trunk/framework/impl/src/main/java/org/richfaces/component/UISwitchablePanel.java	2007-08-08 00:10:27 UTC (rev 2128)
@@ -117,6 +117,7 @@
 				if (valueBinding != null) {
 					valueBinding.setValue(facesContext, newValue);
 					setValue(null);
+					setLocalValueSet(false);
 				} else {
 					setValue(newValue);
 				}
@@ -235,23 +236,11 @@
         }
 	}
 	
-	protected Object getRenderedValue() {
-		if (renderedValue != null) {
-			return renderedValue;
-		}
-
-		return getValue();
-	}
-	
-	protected void setRenderedValue(Object renderedValue) {
-		this.renderedValue = renderedValue;
-	}
-	
 	public Object saveState(FacesContext context) {
 		Object[] states = new Object[2];
 		states[0] = super.saveState(context);
 		states[1] = switchType;
-		
+
 		return states;
 	}
 	
@@ -260,7 +249,5 @@
 		super.restoreState(context, states[0]);
 		
 		this.switchType = (String) states[1];
-
-		this.renderedValue = getValue();
 	}
 }

Modified: trunk/samples/tabPanelDemo/src/main/webapp/pages/index.jsp
===================================================================
--- trunk/samples/tabPanelDemo/src/main/webapp/pages/index.jsp	2007-08-07 23:41:01 UTC (rev 2127)
+++ trunk/samples/tabPanelDemo/src/main/webapp/pages/index.jsp	2007-08-08 00:10:27 UTC (rev 2128)
@@ -35,7 +35,7 @@
 			</h:form>
 			
 			<h:form>
-				<tabs:tabPanel valueChangeListener="#{bean.valueChanged}" headerSpacing="5px" immediate="false" tabClass="tabClass" activeTabClass="italic" width="100%" switchType="client" binding="#{bean.tabPanel}" value="#{bean.currentTab}" id="tab_panel" headerAlignment="left">
+				<tabs:tabPanel valueChangeListener="#{bean.valueChanged}" headerSpacing="5px" immediate="false" tabClass="tabClass" activeTabClass="italic" width="100%" switchType="client" binding="#{bean.tabPanel}" selectedTab="#{bean.currentTab}" id="tab_panel" headerAlignment="left">
 					<f:valueChangeListener type="org.richfaces.TabChangeListener"/>
 					
 					<tabs:tab onclick="alert('\\'Canon\\' tab clicked');" disabled="#{bean.disabledTabName == 'canon'}" name="canon" label="Canon" switchType="server">

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-07 23:41:01 UTC (rev 2127)
+++ trunk/ui/tabPanel/src/main/java/org/richfaces/component/UITabPanel.java	2007-08-08 00:10:27 UTC (rev 2128)
@@ -24,6 +24,8 @@
 import java.util.Iterator;
 
 import javax.faces.component.UIComponent;
+import javax.faces.context.FacesContext;
+import javax.faces.el.ValueBinding;
 
 /**
  * JSF component class
@@ -36,7 +38,7 @@
     }
 
     protected Iterator getSwitchedFacetsAndChildren() {
-        final Object renderedValue = getRenderedValue();
+    	final Object renderedValue = this.restoredRenderedValue;
 
         return new TabsIterator(this, new TabsIterator.FilterCondition() {
 
@@ -62,21 +64,93 @@
         return ((UITab) component).getName();
     }
 
+    public ValueBinding getValueBinding(String name) {
+    	if ("value".equals(name)) {
+    		ValueBinding binding = super.getValueBinding("selectedTab");
+    		if (binding == null) {
+    			binding = super.getValueBinding(name);
+    		}
+    		
+    		return binding;
+    	} else {
+        	return super.getValueBinding(name);
+    	}
+    }
+    
+    public Object getValue() {
+    	if (selectedTab != null) {
+    		return selectedTab;
+    	}
+
+    	//do not use VB for selectedTab here, because it'll be returned for "value" VB queue
+    	//see UITabPanel#getValueBinding(String) for more
+    	return super.getValue();
+    }
+    
+    public void setValue(Object value) {
+    	super.setValue(value);
+    }
+    
     /**
      * Get value for current selected tab. Possible classes - prefered {@link Integer} for tab number, or other Object for tab model value.
      *
      * @return selectedTab value from local variable or value bindings
      */
-    public abstract Object getSelectedTab();
+    public Object getSelectedTab() {
+		return selectedTab;
+    }
 
     /**
      * Set currently selected tab.
      *
      * @param tab
      */
-    public abstract void setSelectedTab(Object tab);
+    public void setSelectedTab(Object tab) {
+    	this.selectedTab = tab;
+    }
 
+    public Object getRenderedValue() {
+    	if (renderedValue != null) {
+    		return renderedValue;
+    	}
 
+    	return getValue();
+    }
+    
+    public void setRenderedValue(Object renderedValue) {
+		this.renderedValue = renderedValue;
+	}
+    
+    private Object selectedTab;
+    private Object renderedValue;
+    
+    public void setLocalValueSet(boolean localValueSet) {
+    	//dumb hack to know that we've just update "value" vb
+    	if (!localValueSet) {
+    		this.selectedTab = null;
+    	}
+    	super.setLocalValueSet(localValueSet);
+    }
+    
+    private transient Object restoredRenderedValue;
+    
+    public Object saveState(FacesContext context) {
+    	Object[] state = new Object[3];
+    	state[0] = super.saveState(context);
+    	state[1] = selectedTab;
+    	state[2] = renderedValue;
+    	
+    	return state;
+    }
+
+    public void restoreState(FacesContext context, Object state) {
+    	Object[] states = (Object[]) state;
+    	super.restoreState(context, states[0]);
+    	this.selectedTab = states[1];
+    	this.renderedValue = states[2];
+    	this.restoredRenderedValue = getRenderedValue();
+    }
+    
     /**
      * Create iterator for all tabs in this component ( in future, can be added special attribute for tabs collection.
      * {@link Iterator#next()} method will return tab model - {@link Tab}

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-07 23:41:01 UTC (rev 2127)
+++ trunk/ui/tabPanel/src/main/java/org/richfaces/renderkit/TabPanelRendererBase.java	2007-08-08 00:10:27 UTC (rev 2128)
@@ -209,20 +209,29 @@
     	//return null;
     }
 */    
+    private Object checkValue(Object value) {
+    	if (value instanceof String) {
+			String s = (String) value;
+			
+			if (s.length() == 0) {
+				return null;
+			} else {
+				return s;
+			}
+		}
+
+    	return value;
+    }
+    
     public void encodeTabs(FacesContext context, UITabPanel tabPanel) throws IOException {
         ComponentVariables componentVariables = ComponentsVariableResolver.getVariables(this, tabPanel);
 
-        Object value = tabPanel.getValue();
-        if (value instanceof String) {
-            if (((String) value).length() == 0) {
-                value = null;
-            }
+        Object checkedValue = checkValue(tabPanel.getSelectedTab());
+        if (checkedValue == null) {
+        	checkedValue = checkValue(tabPanel.getValue());
         }
-        if (value == null ||
-        		tabPanel.getSelectedTab() != null) {
-            value = tabPanel.getSelectedTab();
-        }
-        boolean useFirstRenderedTab = value == null;
+
+        boolean useFirstRenderedTab = checkedValue == null;
         UITabPanel pane = tabPanel;
         UITab firstRenderedTab = null;
         UITab activeTab = null;
@@ -238,13 +247,13 @@
 
                 if (useFirstRenderedTab) {
                     activeTab = firstRenderedTab;
-                } else if (value.equals(tab.getName())) {
+                } else if (checkedValue.equals(tab.getName())) {
                     activeTab = tab;
                 }
 
             } else {
                 if (!useFirstRenderedTab) {
-                    if (value.equals(tab.getName())) {
+                    if (checkedValue.equals(tab.getName())) {
                         if (firstRenderedTab != null) {
                             activeTab = firstRenderedTab;
                         } else {
@@ -258,7 +267,11 @@
         if (activeTab == null) {
             throw new IllegalStateException("No active tabs!");
         } else {
-            tabPanel.setValue(activeTab.getName());
+        	if (useFirstRenderedTab) {
+        		tabPanel.setRenderedValue(activeTab.getName());
+        	} else {
+        		tabPanel.setRenderedValue(null);
+        	}
         }
 
         ArrayList tabs = new ArrayList();




More information about the richfaces-svn-commits mailing list