[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