[richfaces-svn-commits] JBoss Rich Faces SVN: r5621 - in branches/3.1.x/ui/panelbar/src/main: resources/org/richfaces/renderkit/html/scripts and 1 other directories.

richfaces-svn-commits at lists.jboss.org richfaces-svn-commits at lists.jboss.org
Fri Jan 25 05:58:24 EST 2008


Author: akushunin
Date: 2008-01-25 05:58:24 -0500 (Fri, 25 Jan 2008)
New Revision: 5621

Modified:
   branches/3.1.x/ui/panelbar/src/main/java/org/richfaces/renderkit/html/PanelBarRendererBase.java
   branches/3.1.x/ui/panelbar/src/main/resources/org/richfaces/renderkit/html/scripts/panelbar.js
   branches/3.1.x/ui/panelbar/src/main/templates/panelBar.jspx
Log:
http://jira.jboss.com/jira/browse/RF-1916

Modified: branches/3.1.x/ui/panelbar/src/main/java/org/richfaces/renderkit/html/PanelBarRendererBase.java
===================================================================
--- branches/3.1.x/ui/panelbar/src/main/java/org/richfaces/renderkit/html/PanelBarRendererBase.java	2008-01-25 10:21:14 UTC (rev 5620)
+++ branches/3.1.x/ui/panelbar/src/main/java/org/richfaces/renderkit/html/PanelBarRendererBase.java	2008-01-25 10:58:24 UTC (rev 5621)
@@ -22,22 +22,30 @@
 package org.richfaces.renderkit.html;
 
 import java.io.IOException;
+import java.util.ArrayList;
+import java.util.HashMap;
 import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
 
 import javax.faces.component.UIComponent;
 import javax.faces.context.FacesContext;
+import javax.faces.context.ResponseWriter;
 import javax.faces.el.ValueBinding;
 
 import org.ajax4jsf.javascript.AjaxScript;
 import org.ajax4jsf.javascript.ImageCacheScript;
+import org.ajax4jsf.javascript.JSFunction;
+import org.ajax4jsf.javascript.JSFunctionDefinition;
+import org.ajax4jsf.javascript.JSReference;
 import org.ajax4jsf.javascript.PrototypeScript;
 import org.ajax4jsf.renderkit.HeaderResourcesRendererBase;
+import org.ajax4jsf.renderkit.RendererUtils.HTML;
 import org.ajax4jsf.resource.InternetResource;
 import org.richfaces.component.UIPanelBar;
 import org.richfaces.component.UIPanelBarItem;
 import org.richfaces.event.SwitchablePanelSwitchEvent;
+import org.richfaces.renderkit.ScriptOptions;
 
 public abstract class PanelBarRendererBase extends HeaderResourcesRendererBase {
 
@@ -118,4 +126,88 @@
 		}*/
 	}
 	
+	protected List getScriptPanelBarItems(FacesContext context,UIPanelBar panelBar){
+		List items = new ArrayList();
+		JSReference id_ref = new JSReference("id");
+		
+		List children = panelBar.getChildren();
+		for (Iterator iterator = children.iterator(); iterator.hasNext();) {
+			UIComponent child = (UIComponent) iterator.next();
+
+			if(child instanceof UIPanelBarItem){
+			
+				Map item = new HashMap();
+				UIPanelBarItem panelBarItem = (UIPanelBarItem) child;
+				item.put(id_ref, panelBarItem.getClientId(context));
+		
+				Object enterScript = panelBarItem.getAttributes().get("onenter");
+				Object leaveScript = panelBarItem.getAttributes().get("onleave");
+				
+				if (enterScript != null && !enterScript.equals("")) {
+					JSFunctionDefinition onenter = new JSFunctionDefinition();
+					onenter.addParameter("event");
+					onenter.addToBody(enterScript);
+					item.put("onenter", onenter);
+				} else {
+					item.put("onenter", "");
+				}
+				
+				if (leaveScript != null && !leaveScript.equals("")) {
+					JSFunctionDefinition onleave = new JSFunctionDefinition();
+					onleave.addParameter("event");
+					onleave.addToBody(leaveScript);
+					item.put("onleave", onleave);
+				} else {
+					item.put("onleave", "");
+				}
+				
+				items.add(item);
+			}
+		}
+				
+		return items;
+	}
+	
+	public void encodeScript(FacesContext context, UIComponent component) throws IOException{
+		
+		if(component instanceof UIPanelBar){
+			UIPanelBar panelBar = (UIPanelBar)component;
+			
+			List items = getScriptPanelBarItems(context, panelBar);
+				
+			ScriptOptions options = new ScriptOptions(component);
+			
+			
+			Object changeScript = panelBar.getAttributes().get("onitemchange");
+			
+			if (changeScript != null && !changeScript.equals("")) {
+				JSFunctionDefinition function =  new JSFunctionDefinition();
+				function.addParameter("event");
+				function.addToBody(changeScript);
+				options.addOption("onitemchange",function);
+			} else {
+				options.addOption("onitemchange","");
+			}
+					
+			options.addOption("onclick", panelBar.getAttributes().get("onclick"));
+			options.addOption("mouseover", panelBar.getAttributes().get("onmouseover"));
+			options.addOption("mouseout", panelBar.getAttributes().get("onmouseout"));
+			options.addOption("mousemove", panelBar.getAttributes().get("onmousemove"));
+			options.addOption("items", items);
+			
+					
+			StringBuffer script = new StringBuffer();
+			JSFunction function = new JSFunction("new Richfaces.PanelBar");
+			function.addParameter(panelBar.getClientId(context));
+			function.addParameter(options);
+			function.appendScript(script);
+			
+			ResponseWriter writer = context.getResponseWriter();
+			writer.startElement(HTML.SCRIPT_ELEM, panelBar);
+			writer.writeAttribute(HTML.TYPE_ATTR, "text/javascript", null);
+			String outerScript = script.append(";").toString(); 
+			writer.write(outerScript);
+			writer.endElement(HTML.SCRIPT_ELEM);
+		}
+	}
 }

Modified: branches/3.1.x/ui/panelbar/src/main/resources/org/richfaces/renderkit/html/scripts/panelbar.js
===================================================================
--- branches/3.1.x/ui/panelbar/src/main/resources/org/richfaces/renderkit/html/scripts/panelbar.js	2008-01-25 10:21:14 UTC (rev 5620)
+++ branches/3.1.x/ui/panelbar/src/main/resources/org/richfaces/renderkit/html/scripts/panelbar.js	2008-01-25 10:58:24 UTC (rev 5621)
@@ -5,9 +5,9 @@
 Richfaces.PanelBar.prototype = {
 
 
-	initialize: function(panelId, onclick) {
+	initialize: function(panelId, options) {
 
-		this.FF = (RichFaces.navigatorType() == "FF")?true:false;
+		this.FF = (RichFaces.navigatorType() == RichFaces.FF)?true:false;
 		this.isIE = ((navigator.userAgent.toLowerCase().indexOf("msie")!=-1) || (navigator.userAgent.toLowerCase().indexOf("explorer")!=-1))?true:false;
 		this.panel=$(panelId); //+"_p"
 
@@ -19,8 +19,11 @@
 		this.STEP=0;
 		this.slides=new Array();
 		this.ch=this.panel.clientHeight;
-
-        this.onclick = onclick;
+		this.options = options;
+        this.onitemchange = options.onitemchange;
+        this.onclick = options.onclick;
+        this.items = options.items;
+        
         this._attachBehaviors();
 
 		this.input=$(panelId+"_panelBarInput");
@@ -29,6 +32,23 @@
 
 		Event.observe(window,'load',this.handleOnLoad.bindAsEventListener(this));
 
+		this.mouseover = options.mouseover;
+		this.mouseout = options.mouseout;
+		this.mousemove = options.mousemove;		
+		
+			
+		if (this.mouseover && this.mouseover != ""){
+			Event.observe(this.panel,'mouseover',new Function("event",this.mouseover));
+		}
+		
+		if (this.mouseout && this.mouseout != ""){
+			Event.observe(this.panel,'mouseout',new Function("event",this.mouseout));
+		}
+		
+		if (this.mousemove && this.mousemove != ""){
+			Event.observe(this.panel,'mousemove',new Function("event", this.mousemove));
+		}	
+		
         this.showSlide(this.slides[this.defaultIndex]);
 
         this.contentHight = -1;
@@ -84,17 +104,28 @@
 		this.current=slide;
 //		this.input.value=this.current.index;
 		this.input.value=this.current.item.id;
-
+		this.firstLoad = false;
 	},
 
 	_attachBehaviors: function() {
-		var rows=this._getDirectChildrenByTag(this.panel,'DIV');
+		var rows=this._getItems(this.panel);
 		for(var i=0; i<rows.length; i++) {
 			var subrows=this._getDirectChildrenByTag(rows[i],'DIV');
 			this.slides.push(new Richfaces.PanelBar.Slide(this,rows[i],subrows[0],subrows[1],subrows[2],i,this.onclick)); //ndex
 		}
 	},
 
+ 	_getItems: function( e ) {
+            var kids = new Array();
+            var itemsLength = this.items.length;
+            for (var item = e.firstChild, index = 0; item && index < itemsLength; item = item.nextSibling) {
+                  if (this.items[index].id == item.id) {
+                        index++;
+                        kids.push(item);
+                  }
+            }
+            return kids;
+      },
 
 	_getDirectChildrenByTag: function( e, tagName ) {
 
@@ -115,9 +146,45 @@
 			if (this.slides[i].item.id==value) return i;
 		}
 		return 0;
+	},
+	
+	invokeEvent: function(eventName, event, leaveElement,enterElement, element, eventFunction, data) {
+		var result;
+		if (eventFunction) {
+			
+			var eventObj;
+
+			if (event)
+			{
+				eventObj = event;
+			}
+			else if( document.createEventObject ) 
+			{
+				eventObj = document.createEventObject();
+			}
+			else if( document.createEvent )
+			{
+				eventObj = document.createEvent('Events');
+				eventObj.initEvent( eventName, true, false );
 	}
 
+			eventObj.rich = {component:this};
+			eventObj.rich.enterElement = leaveElement;
+			eventObj.rich.leaveElement = enterElement; 
+			
+			try
+			{
+				result = eventFunction.call(element, eventObj);
+			}
+			catch (e) { LOG.warn("Exception: "+e.Message + "\n[on"+eventName + "]"); }
 
+		}
+		
+		if (result!=false) result = true;
+		
+		return result;
+	}	
+
 }
 
 Richfaces.PanelBar.Slide = Class.create();
@@ -131,6 +198,9 @@
 		this.header=header;
 		this.header_act=header_act;
 		this.content=content;
+		this.onclick = onclick;
+	
+//		this.item.style.overflow="hidden";
 //		this.header.style.overflowX="hidden";
 //		this.header.style.overflowY="visible";
 //		this.header.style.cursor="pointer";
@@ -152,8 +222,8 @@
 			}
         }
 
-        if (onclick && onclick != ""){
-            this.onclickFunction = new Function("return " + onclick + ";").bindAsEventListener(this);
+        if (this.onclick && this.onclick != ""){
+            this.onclickFunction = new Function("event",this.onclick);
         }
 	},
 
@@ -175,17 +245,35 @@
 		this.header.style.display="";
 	},
 
-	headerOnClick: function() {
+	headerOnClick: function(event) {
         if (this.onclickFunction){
-            var result = this.onclickFunction();
-            if (result != undefined && !result) {
-                return;
+        	var result = this.onclickFunction(event);
+        	if (result == false) {
+        		return false;
             }
         }
 
         if (this.content.style.display=="block") return;
 		//this.header.style.display="none";
 		//this.header_act.style.display="";
+		
+		var enterElement = this.item;
+		var leaveElement = this.slidePanel.current.item;
+		var enterItem = this.slidePanel.items[this.index];
+		var leaveItem;
+		var items = this.slidePanel.items;
+		
+		for (var i = 0; i < items.length; i++) {
+			if (this.slidePanel.items[i].id == leaveElement.id) {	  
+			 	leaveItem = this.slidePanel.items[i];
+			}	
+		}	
+		
+			
+		if(!this.slidePanel.invokeEvent("onenter",event,leaveElement, enterElement,enterElement,enterItem.onenter)) return false;
+		if(!this.slidePanel.invokeEvent("onleave",event,leaveElement, enterElement,leaveElement,leaveItem.onleave)) return false;
+		if(!this.slidePanel.invokeEvent("onchangeitem",event,leaveElement, enterElement,this.slidePanel.panel,this.slidePanel.onitemchange)) return false;
+
 		this.slidePanel.showSlide(this);
 		this.slidePanel.panel.style.maxHeight="";
 		this.slidePanel.panel.style.minHeight="";

Modified: branches/3.1.x/ui/panelbar/src/main/templates/panelBar.jspx
===================================================================
--- branches/3.1.x/ui/panelbar/src/main/templates/panelBar.jspx	2008-01-25 10:21:14 UTC (rev 5620)
+++ branches/3.1.x/ui/panelbar/src/main/templates/panelBar.jspx	2008-01-25 10:58:24 UTC (rev 5621)
@@ -20,7 +20,7 @@
 		<f:clientid var="clientId" />
 		<input type="hidden" name="#{clientId}" id="#{clientId}_panelBarInput"
 			value="#{this:expanded(context, component)}"/>
-		<script type="text/javascript">new Richfaces.PanelBar("#{clientId}", "#{component.attributes['onclick']}");</script>
+		<f:call name="encodeScript"/>	
 	</div>
 
 </f:root>




More information about the richfaces-svn-commits mailing list