Author: dbiatenia
Date: 2007-07-23 10:19:27 -0400 (Mon, 23 Jul 2007)
New Revision: 1784
Modified:
trunk/ui/tooltip/src/main/config/component/toolTip.xml
trunk/ui/tooltip/src/main/java/org/richfaces/component/UIToolTip.java
trunk/ui/tooltip/src/main/java/org/richfaces/renderkit/html/ToolTipRenderer.java
trunk/ui/tooltip/src/main/resources/org/richfaces/renderkit/html/scripts/tooltip.js
trunk/ui/tooltip/src/main/templates/org/richfaces/htmltooltip.jspx
Log:
Modified: trunk/ui/tooltip/src/main/config/component/toolTip.xml
===================================================================
--- trunk/ui/tooltip/src/main/config/component/toolTip.xml 2007-07-23 14:19:02 UTC (rev
1783)
+++ trunk/ui/tooltip/src/main/config/component/toolTip.xml 2007-07-23 14:19:27 UTC (rev
1784)
@@ -4,8 +4,6 @@
<!DOCTYPE components PUBLIC "-//EXADEL//Generator config/EN"
"http://exadel.com/dtds/component-config.dtd" >
-->
-
-
<components>
<component>
<name>org.richfaces.component.ToolTip</name>
@@ -18,10 +16,15 @@
<superclassname>org.ajax4jsf.tests.AbstractAjax4JsfTestCase</superclassname>
</test>
- <renderer generate="true" override="true">
+ <!--renderer generate="true" override="true">
<name>org.richfaces.renderkit.html.ToolTipRenderer</name>
<template>org/richfaces/htmltooltip.jspx</template>
+ </renderer-->
+ <renderer override="true">
+ <name>org.richfaces.renderkit.html.ToolTipRenderer</name>
+ <classname>org.richfaces.renderkit.html.ToolTipRenderer</classname>
</renderer>
+
<tag>
<name>toolTip</name>
<classname>org.richfaces.taglib.HtmlToolTipTag</classname>
@@ -33,6 +36,13 @@
</tag>
<property>
+ <name>layout</name>
+ <classname>java.lang.String</classname>
+ <description>Allowed values: "inline" or "block".
Block/inline mode flag. Tooltip will contain div/span elements
accordingly.</description>
+ <defaultvalue><![CDATA["inline"]]></defaultvalue>
+ </property>
+
+ <property>
<name>oncomplete</name>
<classname>java.lang.String</classname>
<description></description>
@@ -148,4 +158,14 @@
<defaultvalue><![CDATA[""]]></defaultvalue>
</property>
</component>
-</components>
+ <renderer generate="true">
+ <template>org/richfaces/htmltooltipblock.jspx</template>
+ </renderer>
+ <!--renderer generate="true" override="true">
+ <name>org.richfaces.renderkit.html.ToolTipRenderer</name>
+ <template>org/richfaces/htmltooltip.jspx</template>
+ </renderer-->
+ <renderer generate="true">
+ <template>org/richfaces/htmltooltip.jspx</template>
+ </renderer>
+</components>
\ No newline at end of file
Modified: trunk/ui/tooltip/src/main/java/org/richfaces/component/UIToolTip.java
===================================================================
--- trunk/ui/tooltip/src/main/java/org/richfaces/component/UIToolTip.java 2007-07-23
14:19:02 UTC (rev 1783)
+++ trunk/ui/tooltip/src/main/java/org/richfaces/component/UIToolTip.java 2007-07-23
14:19:27 UTC (rev 1784)
@@ -1,9 +1,19 @@
package org.richfaces.component;
+import java.io.IOException;
+import java.util.Set;
+
import javax.faces.component.UIComponentBase;
+import javax.faces.context.FacesContext;
+import javax.faces.event.AbortProcessingException;
+import javax.faces.event.FacesEvent;
-public abstract class UIToolTip extends UIComponentBase{
+import org.ajax4jsf.context.AjaxContext;
+import org.ajax4jsf.event.AjaxEvent;
+import org.richfaces.renderkit.html.ToolTipRenderer;
+public abstract class UIToolTip extends UIComponentBase implements
org.ajax4jsf.component.AjaxChildrenEncoder{
+
public static final String COMPONENT_TYPE = "org.richfaces.toolTip";
public static final String CONTENT_FACET_NAME = "defaultContent";
@@ -11,6 +21,10 @@
public abstract void setValue(String value);
+ public abstract String getLayout();
+
+ public abstract void setLayout(String layout);
+
public abstract String getEvent();
public abstract void setEvent(String event);
@@ -47,17 +61,17 @@
public abstract void setStyleClass(String styleClass);
- public abstract String getOnactivate();
+ public abstract String getOncomplete();
- public abstract void setOnactivate(String onactivate);
+ public abstract void setOncomplete(String oncomplete);
public abstract String getOnshow();
public abstract void setOnshow(String onshow);
- public abstract String getOndeactivate();
+ public abstract String getOnhide();
- public abstract void setOndeactivate(String ondeactivate);
+ public abstract void setOnhide(String onhide);
public abstract String getOnclick();
@@ -79,9 +93,37 @@
public abstract void setOnmouseover(String onmouseover);
- public abstract String getOncomplete();
- public abstract void setOncomplete(String oncomplete);
+ public String getUsedElementType(){
+ return getLayout().equals("block") ? "div" : "span";
+ }
+
+ public void broadcast(FacesEvent event) throws AbortProcessingException {
- public abstract String getOnhide();
- public abstract void setOnhide(String onhide);
+ super.broadcast(event);
+
+ if (event instanceof AjaxEvent) {
+ FacesContext facesContext = FacesContext.getCurrentInstance();
+ AjaxContext ajaxContext = AjaxContext.getCurrentInstance(facesContext);
+ ajaxContext.getAjaxAreasToRender().add(this.getClientId(facesContext) +
"content");
+ ajaxContext.addRegionsFromComponent(this);
+ }
+ }
+
+ public void encodeAjaxChild(FacesContext context, String path, Set ids,
+ Set renderedAreas) throws IOException {
+
+ if(ids.contains(this.getClientId(context) + "content")){
+ AjaxContext ajaxContext = AjaxContext.getCurrentInstance(context);
+ ToolTipRenderer r = (ToolTipRenderer)getRenderer(context);
+ r.encodeTooltipText(context, this);
+ ajaxContext.getAjaxRenderedAreas().add(this.getClientId(context) +
"content");
+ } else {
+ // todo
+// AjaxContext ajaxContext = AjaxContext.getCurrentInstance(context);
+// ajaxContext.e
+
+ }
+
+ }
+
}
Modified:
trunk/ui/tooltip/src/main/java/org/richfaces/renderkit/html/ToolTipRenderer.java
===================================================================
---
trunk/ui/tooltip/src/main/java/org/richfaces/renderkit/html/ToolTipRenderer.java 2007-07-23
14:19:02 UTC (rev 1783)
+++
trunk/ui/tooltip/src/main/java/org/richfaces/renderkit/html/ToolTipRenderer.java 2007-07-23
14:19:27 UTC (rev 1784)
@@ -3,22 +3,143 @@
import java.io.IOException;
import java.util.Map;
+import javax.faces.FacesException;
import javax.faces.component.UIComponent;
import javax.faces.context.FacesContext;
import javax.faces.context.ResponseWriter;
-
+/*
+import org.ajax4jsf.framework.ajax.AjaxEvent;
+import org.ajax4jsf.framework.renderer.AjaxComponentRendererBase;
+import org.ajax4jsf.framework.renderer.AjaxRendererUtils;
+import org.ajax4jsf.framework.resource.InternetResource;
+import org.ajax4jsf.framework.skin.Skin;
+import org.ajax4jsf.framework.util.javascript.JSFunction;
+import org.ajax4jsf.framework.util.javascript.JSFunctionDefinition;
+import org.ajax4jsf.framework.util.javascript.JSReference;
+*/
import org.ajax4jsf.event.AjaxEvent;
import org.ajax4jsf.javascript.JSFunction;
import org.ajax4jsf.javascript.JSFunctionDefinition;
import org.ajax4jsf.javascript.JSReference;
import org.ajax4jsf.renderkit.AjaxComponentRendererBase;
import org.ajax4jsf.renderkit.AjaxRendererUtils;
+import org.ajax4jsf.resource.InternetResource;
import org.richfaces.component.UIToolTip;
import org.richfaces.skin.Skin;
public class ToolTipRenderer extends AjaxComponentRendererBase{
+ //
+ // Declarations
+ //
+ private final InternetResource[] styles = {
+ getResource("/org/richfaces/renderkit/html/css/tooltip.xcss")
+ };
+
+private InternetResource[] stylesAll = null;
+
+protected InternetResource[] getStyles() {
+ synchronized (this) {
+ if (stylesAll == null) {
+ InternetResource[] rsrcs = super.getStyles();
+ boolean ignoreSuper = rsrcs == null || rsrcs.length == 0;
+ boolean ignoreThis = styles == null || styles.length == 0;
+
+ if (ignoreSuper) {
+ if (ignoreThis) {
+ stylesAll = new InternetResource[0];
+ } else {
+ stylesAll = styles;
+ }
+ } else {
+ if (ignoreThis) {
+ stylesAll = rsrcs;
+ } else {
+ java.util.Set rsrcsSet = new java.util.LinkedHashSet();
+
+ for (int i = 0; i < rsrcs.length; i++ ) {
+ rsrcsSet.add(rsrcs[i]);
+ }
+
+ for (int i = 0; i < styles.length; i++ ) {
+ rsrcsSet.add(styles[i]);
+ }
+
+ stylesAll = (InternetResource[]) rsrcsSet.toArray(new
InternetResource[rsrcsSet.size()]);
+ }
+ }
+ }
+ }
+ return stylesAll;
+}
+ private final InternetResource[] scripts = {
+ new org.ajax4jsf.javascript.PrototypeScript()
+ ,
+ new org.ajax4jsf.javascript.AjaxScript()
+ ,
+ getResource("/org/richfaces/renderkit/html/scripts/utils.js")
+ ,
+ getResource("/org/richfaces/renderkit/html/scripts/tooltip.js")
+ };
+
+private InternetResource[] scriptsAll = null;
+
+protected InternetResource[] getScripts() {
+ synchronized (this) {
+ if (scriptsAll == null) {
+ InternetResource[] rsrcs = super.getScripts();
+ boolean ignoreSuper = rsrcs == null || rsrcs.length == 0;
+ boolean ignoreThis = scripts == null || scripts.length == 0;
+
+ if (ignoreSuper) {
+ if (ignoreThis) {
+ scriptsAll = new InternetResource[0];
+ } else {
+ scriptsAll = scripts;
+ }
+ } else {
+ if (ignoreThis) {
+ scriptsAll = rsrcs;
+ } else {
+ java.util.Set rsrcsSet = new java.util.LinkedHashSet();
+
+ for (int i = 0; i < rsrcs.length; i++ ) {
+ rsrcsSet.add(rsrcs[i]);
+ }
+
+ for (int i = 0; i < scripts.length; i++ ) {
+ rsrcsSet.add(scripts[i]);
+ }
+
+ scriptsAll = (InternetResource[]) rsrcsSet.toArray(new
InternetResource[rsrcsSet.size()]);
+ }
+ }
+ }
+ }
+
+ return scriptsAll;
+}
+ //
+ //
+ //
+
+
+ private String convertToString(Object obj ) {
+ return ( obj == null ? "" : obj.toString() );
+ }
+ private String convertToString(boolean b ) {
+ return String.valueOf(b);
+ }
+ private String convertToString(int b ) {
+ return b!=Integer.MIN_VALUE?String.valueOf(b):"";
+ }
+ private String convertToString(long b ) {
+ return b!=Long.MIN_VALUE?String.valueOf(b):"";
+ }
+
+
+
protected Class getComponentClass() {
return org.richfaces.component.UIToolTip.class;
}
@@ -36,6 +157,7 @@
}
+
public void insertValue(FacesContext context, UIComponent component) throws IOException
{
Object value = component.getAttributes().get("value");
if (value!=null){
@@ -57,6 +179,10 @@
String showNewToolTip = ";" + getJsVarName(context, component) +
".displayDiv();";
+ String fireOnComplete = null;
+ if(((UIToolTip)component).getOncomplete() != null){
+
+ }
//enable ajaxSingle mode, i.e. we do not need to submit all form controls to get
tooltip content
eventOptions.put("control", JSReference.THIS);
@@ -141,12 +267,87 @@
public void encodeTooltipText(FacesContext context, UIToolTip component) throws
IOException {
ResponseWriter responseWriter = context.getResponseWriter();
- responseWriter.startElement("span", component);
+ responseWriter.startElement(component.getUsedElementType(), component);
responseWriter.writeAttribute("id", component.getClientId(context) +
"content", null);
responseWriter.write(component.getValue() != null ? component.getValue() :
"");
super.renderChildren(context, component);
- responseWriter.endElement("span");
+ responseWriter.endElement(component.getUsedElementType());
}
+
+ protected void doEncodeBegin(ResponseWriter writer, FacesContext context,
+ UIComponent component) throws IOException {
+
+ UIToolTip toolTip = (UIToolTip)component;
+ Class rendererClass = null;
+ try{
+ if("block".equals(toolTip.getLayout())){
+ rendererClass =
Class.forName("org.richfaces.renderkit.html.HtmlToolTipRendererBlock");
+ } else if("inline".equals(toolTip.getLayout())){
+ rendererClass =
Class.forName("org.richfaces.renderkit.html.HtmlToolTipRenderer");
+ } else {
+ throw new FacesException("Only \"block\" or \"inline\"
values can be established to attribute \"layout\".");
+ }
+ ToolTipRenderer renderer = (ToolTipRenderer)rendererClass.newInstance();
+ renderer.doEncodeBegin(writer, context, component);
+
+ } catch(Exception e){
+ throw new FacesException(e.getMessage(), e);
+ }
+ }
+
+
+ protected void doEncodeChildren(ResponseWriter writer,
+ FacesContext context, UIComponent component) throws IOException {
+
+ UIToolTip toolTip = (UIToolTip)component;
+ Class rendererClass = null;
+ try{
+ if("block".equals(toolTip.getLayout())){
+ rendererClass =
Class.forName("org.richfaces.renderkit.html.HtmlToolTipRendererBlock");
+ } else {
+ rendererClass =
Class.forName("org.richfaces.renderkit.html.HtmlToolTipRenderer");
+ }
+
+ ToolTipRenderer renderer = null;
+
+ renderer = (ToolTipRenderer)rendererClass.newInstance();
+
+ renderer.doEncodeChildren(writer, context, component);
+ } catch(Exception e){
+ throw new FacesException(e.getMessage(), e);
+ }
+
+
+ }
+
+
+ protected void doEncodeEnd(ResponseWriter writer, FacesContext context,
+ UIComponent component) throws IOException {
+
+ UIToolTip toolTip = (UIToolTip)component;
+ Class rendererClass = null;
+ try{
+ if("block".equals(toolTip.getLayout())){
+ rendererClass =
Class.forName("org.richfaces.renderkit.html.HtmlToolTipRendererBlock");
+ } else {
+ rendererClass =
Class.forName("org.richfaces.renderkit.html.HtmlToolTipRenderer");
+ }
+ ToolTipRenderer renderer = (ToolTipRenderer)rendererClass.newInstance();
+ renderer.doEncodeEnd(writer, context, component);
+ } catch (Exception e) {
+ throw new FacesException(e.getMessage(), e);
+ }
+ }
+
+
+ /* (non-Javadoc)
+ * @see javax.faces.render.Renderer#getRendersChildren()
+ */
+ public boolean getRendersChildren() {
+ return true;
+ }
+
+
}
Modified:
trunk/ui/tooltip/src/main/resources/org/richfaces/renderkit/html/scripts/tooltip.js
===================================================================
---
trunk/ui/tooltip/src/main/resources/org/richfaces/renderkit/html/scripts/tooltip.js 2007-07-23
14:19:02 UTC (rev 1783)
+++
trunk/ui/tooltip/src/main/resources/org/richfaces/renderkit/html/scripts/tooltip.js 2007-07-23
14:19:27 UTC (rev 1784)
@@ -104,6 +104,11 @@
doShow: function(e){
+
+ if(this.onshow){
+ eval(this.onshow);
+ }
+
this.isMouseOvered = true;
if (e.target)
this.hintParentElement = e.target;
@@ -120,6 +125,9 @@
eval(this.ajaxExecuteString);
}
this.displayDiv(e);
+ if(this.mode != 'ajax' && this.oncomplete){
+ eval(this.oncomplete);
+ }
},
doHide: function(e){
@@ -137,7 +145,9 @@
this.hintParentElement = null;
this.isMouseOvered = false;
}
-
+ if(this.onhide){
+ eval(this.onhide);
+ }
},
doEnable: function(){
@@ -148,15 +158,33 @@
},
setToolTipPosition: function(e){
+
var windowDim = this.windowSize();
var cursorX = e.clientX + document.body.scrollLeft;
var cursorY = e.clientY + document.body.scrollTop;
- this.toolTipH = this.toolTip.getHeight();
- this.toolTipW = this.toolTip.getWidth();
+ if(this.toolTip.style.display != 'none'){
+ this.toolTipH = this.toolTip.getHeight();
+ this.toolTipW = this.toolTip.getWidth();
+ }
+
+ var offsets = Position.cumulativeOffset(this.parent);
+ cursorX -= offsets[0];
+ cursorY -= offsets[1];
+
+ cursorX += this.parent.offsetLeft;
+ cursorY += this.parent.offsetTop;
+
+ this.toolTip.style.top = cursorY;
+ this.toolTip.style.left = cursorX;
+
+
if(this.direction == "top-left"){
+ this.toolTip.style.top = cursorY - this.verticalOffset - this.toolTipH;
+ this.toolTip.style.left = cursorX - this.horizontalOffset - this.toolTipW;
+ /*
if(cursorY - this.verticalOffset - this.toolTipH < 0){
this.toolTip.style.top = cursorY + this.verticalOffset - this.toolTipH;
} else {
@@ -167,8 +195,11 @@
} else {
this.toolTip.style.left = cursorX - this.horizontalOffset - this.toolTipW;
}
-
+ */
} else if(this.direction == "bottom-left"){
+ this.toolTip.style.top = cursorY + this.verticalOffset;
+ this.toolTip.style.left = cursorX - this.horizontalOffset - this.toolTipW;
+ /*
if(cursorY + this.verticalOffset + this.toolTipH > windowDim[1]){
this.toolTip.style.top = cursorY - this.verticalOffset - this.toolTipH;
} else {
@@ -179,7 +210,11 @@
} else {
this.toolTip.style.left = cursorX - this.horizontalOffset - this.toolTipW;
}
+ */
} else if(this.direction == "top-right"){
+ this.toolTip.style.top = cursorY - this.verticalOffset - this.toolTipH;
+ this.toolTip.style.left = cursorX + this.horizontalOffset;
+ /*
if(cursorY - this.verticalOffset - this.toolTipH < 0){
this.toolTip.style.top = cursorY + this.verticalOffset;
} else {
@@ -190,9 +225,12 @@
} else {
this.toolTip.style.left = cursorX + this.horizontalOffset;
}
-
+ */
} else {
// bottom-right is default
+ this.toolTip.style.top = cursorY + this.verticalOffset;
+ this.toolTip.style.left = cursorX + this.horizontalOffset;
+ /*
if(cursorY + this.verticalOffset - this.toolTip.clientHeight > windowDim[1]){
this.toolTip.style.top = cursorY - this.verticalOffset - this.toolTipH;
} else {
@@ -203,7 +241,9 @@
} else {
this.toolTip.style.left = cursorX + this.horizontalOffset;
}
+ */
}
+
},
windowSize: function() {
Modified: trunk/ui/tooltip/src/main/templates/org/richfaces/htmltooltip.jspx
===================================================================
--- trunk/ui/tooltip/src/main/templates/org/richfaces/htmltooltip.jspx 2007-07-23 14:19:02
UTC (rev 1783)
+++ trunk/ui/tooltip/src/main/templates/org/richfaces/htmltooltip.jspx 2007-07-23 14:19:27
UTC (rev 1784)
@@ -11,31 +11,33 @@
baseclass="org.richfaces.renderkit.html.ToolTipRenderer"
component="org.richfaces.component.UIToolTip" >
- <h:styles>
+ <!-- h:styles>
/org/richfaces/renderkit/html/css/tooltip.xcss
</h:styles>
<h:scripts>
- new org.ajax4jsf.javascript.PrototypeScript(),
- new org.ajax4jsf.javascript.AjaxScript(),
+ new org.ajax4jsf.framework.resource.PrototypeScript(),
+ new org.ajax4jsf.framework.ajax.AjaxScript(),
/org/richfaces/renderkit/html/scripts/utils.js,
/org/richfaces/renderkit/html/scripts/tooltip.js
- </h:scripts>
+ </h:scripts-->
<f:clientid var="clientId"/>
+ <span id="#{clientId}" style="position: absolute; display :
none;z-index:99; #{component.attributes['style']}"
class="dr-rich-tool-tip rich-tool-tip
#{component.attributes['styleClass']}">
+ <f:call name="utils.encodePassThru" />
+ <span id="#{clientId}defaultContent"
style="display:none">
+ <u:insertFacet name="defaultContent" />
+ </span>
+ <vcp:body>
+ <f:call name="encodeTooltipText"/>
+ </vcp:body>
+ <f:clientid var="clientId"/>
+ <span id="#{clientId}script" style="display:none">
+ <f:call name="insertScript"/>
+ </span>
+ </span>
+
- <div id="#{clientId}" style="position: absolute; display :
none;z-index:99; #{component.attributes['style']}"
class="dr-rich-tool-tip rich-tool-tip
#{component.attributes['styleClass']}">
- <f:call name="utils.encodePassThru" />
- <span id="#{clientId}defaultContent"
style="display:none">
- <u:insertFacet name="defaultContent" />
- </span>
- <vcp:body>
- <f:call name="encodeTooltipText"/>
- </vcp:body>
- <f:clientid var="clientId"/>
- <span id="#{clientId}script" style="display:none">
- <f:call name="insertScript"/>
- </span>
-
- </div>
+
+
<!-- f:call name="utils.encodeEndFormIfNessesary"/-->
</f:root>