JBoss Rich Faces SVN: r4654 - in trunk/sandbox/samples/columnsDemo/src/main: webapp and 2 other directories.
by richfaces-svn-commits@lists.jboss.org
Author: andrei_exadel
Date: 2007-12-10 09:37:16 -0500 (Mon, 10 Dec 2007)
New Revision: 4654
Added:
trunk/sandbox/samples/columnsDemo/src/main/java/org/richfaces/sandbox/samples/Facet.java
trunk/sandbox/samples/columnsDemo/src/main/webapp/pages/index.xhtml
Removed:
trunk/sandbox/samples/columnsDemo/src/main/webapp/pages/index.xhtml
Modified:
trunk/sandbox/samples/columnsDemo/src/main/java/org/richfaces/sandbox/samples/Bean.java
trunk/sandbox/samples/columnsDemo/src/main/webapp/WEB-INF/faces-config.xml
trunk/sandbox/samples/columnsDemo/src/main/webapp/WEB-INF/web.xml
trunk/sandbox/samples/columnsDemo/src/main/webapp/index.jsp
trunk/sandbox/samples/columnsDemo/src/main/webapp/pages/index.jsp
Log:
RF-1394
Modified: trunk/sandbox/samples/columnsDemo/src/main/java/org/richfaces/sandbox/samples/Bean.java
===================================================================
--- trunk/sandbox/samples/columnsDemo/src/main/java/org/richfaces/sandbox/samples/Bean.java 2007-12-10 14:36:13 UTC (rev 4653)
+++ trunk/sandbox/samples/columnsDemo/src/main/java/org/richfaces/sandbox/samples/Bean.java 2007-12-10 14:37:16 UTC (rev 4654)
@@ -22,28 +22,197 @@
package org.richfaces.sandbox.samples;
import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.Iterator;
import java.util.List;
+import java.util.Map;
/**
* @author k
- *
+ *
*/
public class Bean {
+
+ private List model = new ArrayList();
+
+ private List columns = new ArrayList();
+
+ private Integer columnsCount = 3;
+
+ private Integer rowCount = 3;
+
+ private String columnsCountStr;
+
+ private String rowCountStr;
+
+ private String str;
+
+ private boolean changed = false;
+
+
+ public String xhtml() {
- private List<String> model = new ArrayList<String>();
+ return "xhtml";
+ }
+
+ public String jsp() {
- public Bean() {
- for (int i = 0; i < 1000; i++) {
- model.add(Integer.toString(i));
- }
+ return "jsp";
+ }
+
+ public String action() {
+
+ return null;
+ }
+
+ public Bean() {
+ init();
+ }
+
+ private Integer getInteger (String str) {
+ Integer i = new Integer(0);
+ try {
+ i = Integer.parseInt(str);
+ }catch (Exception e) {
+ // TODO: handle exception
}
+ return i;
+ }
+
+ private void init () {
+
+ model = new ArrayList();
+ columns = new ArrayList();
+
+ if (columnsCountStr != null) {
+ columnsCount = getInteger(columnsCountStr);
+ }
+ if (rowCountStr != null) {
+ rowCount = getInteger(rowCountStr);
+ }
+
+ initColumns();
+
+ for (int i = 0; i < rowCount; i++) {
+// Map map = new HashMap();
+// initMap(map,i);
+ model.add(initArray(i));
+ }
+
+ }
+
+ private void initColumns () {
+ String header;
+ String footer;
+ for (int i = 0; i < columnsCount; i++) {
+ header = "Header" + Integer.toString(i);
+ footer = "Footer" + Integer.toString(i);
+ Facet facet = new Facet(header,footer);
+ columns.add(facet);
+
+ }
+ }
+
+ private String [] initArray(int row) {
+ String [] arr = new String [columns.size()];
+ for (int i = 0; i < arr.length; i++) {
+ arr[i] = Integer.toString(row+i);
+ }
+ return arr;
+ }
+
+ private void initMap(Map map, int row) {
+// Iterator it = columns.iterator();
+// while (it.hasNext()) {
+// String column = (String) it.next();
+// map.put(column, column + row);
+// }
+ }
- public List<String> getModel() {
- return model;
+ /**
+ * @return the model
+ */
+ public List getModel() {
+ if (changed) {
+ init();
+ changed = false;
}
+ return model;
+ }
- public void setModel(List<String> model) {
- this.model = model;
+ /**
+ * @param model the model to set
+ */
+ public void setModel(List model) {
+ this.model = model;
+ }
+
+ /**
+ * @return the columns
+ */
+ public List getColumns() {
+ if (changed) {
+ init();
+ changed = false;
}
-
+ return columns;
+ }
+
+ /**
+ * @param columns the columns to set
+ */
+ public void setColumns(List columns) {
+ this.columns = columns;
+ }
+
+ /**
+ * @return the columnsCountStr
+ */
+ public String getColumnsCountStr() {
+ return columnsCount.toString();
+ }
+
+ /**
+ * @param columnsCountStr the columnsCountStr to set
+ */
+ public void setColumnsCountStr(String columnsCountStr) {
+ if (!columnsCountStr.equals(this.columnsCountStr)) {
+ changed = true;
+ }
+ this.columnsCountStr = columnsCountStr;
+ }
+
+ /**
+ * @return the rowCountStr
+ */
+ public String getRowCountStr() {
+ return rowCount.toString();
+ }
+
+ /**
+ * @param rowCountStr the rowCountStr to set
+ */
+ public void setRowCountStr(String rowCountStr) {
+ if (!rowCountStr.equals(this.rowCountStr)) {
+ changed = true;
+ }
+ this.rowCountStr = rowCountStr;
+ }
+
+ /**
+ * @return the str
+ */
+ public String getStr() {
+ return str;
+ }
+
+ /**
+ * @param str the str to set
+ */
+ public void setStr(String str) {
+ this.str = str;
+ }
+
+
+
}
\ No newline at end of file
Added: trunk/sandbox/samples/columnsDemo/src/main/java/org/richfaces/sandbox/samples/Facet.java
===================================================================
--- trunk/sandbox/samples/columnsDemo/src/main/java/org/richfaces/sandbox/samples/Facet.java (rev 0)
+++ trunk/sandbox/samples/columnsDemo/src/main/java/org/richfaces/sandbox/samples/Facet.java 2007-12-10 14:37:16 UTC (rev 4654)
@@ -0,0 +1,53 @@
+/*
+ * Facet.java Date created: 10.12.2007
+ * Last modified by: $Author$
+ * $Revision$ $Date$
+ */
+
+package org.richfaces.sandbox.samples;
+
+/**
+ * TODO Class description goes here.
+ * @author "Andrey Markavtsov"
+ *
+ */
+public class Facet {
+ private String header;
+ private String footer;
+
+ /**
+ * TODO Description goes here.
+ * @param header
+ * @param footer
+ */
+ public Facet(String header, String footer) {
+ super();
+ this.header = header;
+ this.footer = footer;
+ }
+ /**
+ * @return the header
+ */
+ public String getHeader() {
+ return header;
+ }
+ /**
+ * @param header the header to set
+ */
+ public void setHeader(String header) {
+ this.header = header;
+ }
+ /**
+ * @return the footer
+ */
+ public String getFooter() {
+ return footer;
+ }
+ /**
+ * @param footer the footer to set
+ */
+ public void setFooter(String footer) {
+ this.footer = footer;
+ }
+
+}
Modified: trunk/sandbox/samples/columnsDemo/src/main/webapp/WEB-INF/faces-config.xml
===================================================================
--- trunk/sandbox/samples/columnsDemo/src/main/webapp/WEB-INF/faces-config.xml 2007-12-10 14:36:13 UTC (rev 4653)
+++ trunk/sandbox/samples/columnsDemo/src/main/webapp/WEB-INF/faces-config.xml 2007-12-10 14:37:16 UTC (rev 4654)
@@ -5,6 +5,17 @@
<managed-bean>
<managed-bean-name>bean</managed-bean-name>
<managed-bean-class>org.richfaces.sandbox.samples.Bean</managed-bean-class>
- <managed-bean-scope>request</managed-bean-scope>
- </managed-bean>
+ <managed-bean-scope>application</managed-bean-scope>
+ </managed-bean>
+ <navigation-rule>
+ <display-name>xhtml</display-name>
+ <navigation-case>
+ <from-outcome>xhtml</from-outcome>
+ <to-view-id>/faces/pages/index.xhtml</to-view-id>
+ </navigation-case>
+ <navigation-case>
+ <from-outcome>jsp</from-outcome>
+ <to-view-id>/faces/pages/index.jsp</to-view-id>
+ </navigation-case>
+ </navigation-rule>
</faces-config>
Modified: trunk/sandbox/samples/columnsDemo/src/main/webapp/WEB-INF/web.xml
===================================================================
--- trunk/sandbox/samples/columnsDemo/src/main/webapp/WEB-INF/web.xml 2007-12-10 14:36:13 UTC (rev 4653)
+++ trunk/sandbox/samples/columnsDemo/src/main/webapp/WEB-INF/web.xml 2007-12-10 14:37:16 UTC (rev 4654)
@@ -10,6 +10,23 @@
<param-name>javax.faces.STATE_SAVING_METHOD</param-name>
<param-value>server</param-value>
</context-param>
+ <!-- Use Documents Saved as *.xhtml -->
+ <context-param>
+ <param-name>javax.faces.DEFAULT_SUFFIX</param-name>
+ <param-value>.jsp</param-value>
+ </context-param>
+
+ <!-- Facelets pages will use the .xhtml extension -->
+ <context-param>
+ <param-name>facelets.VIEW_MAPPINGS</param-name>
+ <param-value>*xhtml</param-value>
+ </context-param>
+
+ <context-param>
+ <param-name>org.ajax4jsf.VIEW_HANDLERS</param-name>
+ <param-value>com.sun.facelets.FaceletViewHandler</param-value>
+ </context-param>
+
<!--
-->
<filter>
@@ -23,21 +40,21 @@
<dispatcher>REQUEST</dispatcher>
<dispatcher>FORWARD</dispatcher>
<dispatcher>INCLUDE</dispatcher>
- <dispatcher>ERROR</dispatcher>
+ <dispatcher>ERROR</dispatcher>
</filter-mapping>
- <servlet>
- <servlet-name>Faces Servlet</servlet-name>
- <servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
- <load-on-startup>1</load-on-startup>
- </servlet>
- <servlet-mapping>
- <servlet-name>Faces Servlet</servlet-name>
- <url-pattern>/faces/*</url-pattern>
- </servlet-mapping>
- <servlet-mapping>
- <servlet-name>Faces Servlet</servlet-name>
- <url-pattern>*.jsf</url-pattern>
- </servlet-mapping>
+ <!-- Faces Servlet -->
+ <servlet>
+ <servlet-name>Faces Servlet</servlet-name>
+ <servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
+ </servlet>
+
+ <!-- Use prefix mapping for Facelets pages, e.g. http://localhost:8080/webapp/faces/mypage.xhtml -->
+ <servlet-mapping>
+ <servlet-name>Faces Servlet</servlet-name>
+ <url-pattern>/faces/*</url-pattern>
+ </servlet-mapping>
+
+
<login-config>
<auth-method>BASIC</auth-method>
</login-config>
Modified: trunk/sandbox/samples/columnsDemo/src/main/webapp/index.jsp
===================================================================
--- trunk/sandbox/samples/columnsDemo/src/main/webapp/index.jsp 2007-12-10 14:36:13 UTC (rev 4653)
+++ trunk/sandbox/samples/columnsDemo/src/main/webapp/index.jsp 2007-12-10 14:37:16 UTC (rev 4654)
@@ -5,7 +5,8 @@
<head></head>
<body>
- <jsp:forward page="/pages/index.jsf" />
+ <a href="faces/pages/index.jsp">JSP</a><br/>
+ <a href="faces/pages/index.xhtml">XHTML</a>
</body>
</html>
\ No newline at end of file
Modified: trunk/sandbox/samples/columnsDemo/src/main/webapp/pages/index.jsp
===================================================================
--- trunk/sandbox/samples/columnsDemo/src/main/webapp/pages/index.jsp 2007-12-10 14:36:13 UTC (rev 4653)
+++ trunk/sandbox/samples/columnsDemo/src/main/webapp/pages/index.jsp 2007-12-10 14:37:16 UTC (rev 4654)
@@ -1,24 +1,44 @@
+<%@ taglib uri="http://richfaces.org/a4j" prefix="a4j"%>
<%@ taglib uri="http://java.sun.com/jsf/html" prefix="h" %>
<%@ taglib uri="http://java.sun.com/jsf/core" prefix="f"%>
<%@ taglib uri="http://labs.jboss.com/jbossrichfaces/ui/dataTable" prefix="dt"%>
+<%@ taglib prefix="columns" uri="http://labs.jboss.com/jbossrichfaces/ui/ui/columns" %>
+
+
+
<html>
<head>
<title></title>
</head>
<body>
- <f:view>
- <dt:dataTable id="table" value="#{bean.model}" var="issues"
- first="0" rows="40" width="100%">
- <dt:column width="200px">
- <f:facet name="header">
- <h:outputText value="header"></h:outputText>
- </f:facet>
- <h:outputText value="#{issues}"></h:outputText>
- <f:facet name="footer">
- <h:outputText value="footer"></h:outputText>
- </f:facet>
- </dt:column>
- </dt:dataTable>
+ <f:view>
+ <h:form>
+
+ Columns: <h:inputText value="#{bean.columnsCountStr}"></h:inputText> <br/>
+ Rows: <h:inputText value="#{bean.rowCountStr}"></h:inputText> <br/>
+
+
+ <a4j:commandButton value="Submit" action="#{bean.jsp}" reRender="tb"></a4j:commandButton>
+
+ <br/>
+
+
+ <dt:dataTable value="#{bean.model}" var="var" id="tb">
+ <columns:columns value="#{bean.columns}" var="col" index="counter"
+ style="color: Green;">
+ <f:facet name="header">
+ <h:outputText value="#{col.header}"></h:outputText>
+ </f:facet>
+ <f:facet name="footer">
+ <h:outputText value="#{col.footer}"></h:outputText>
+ </f:facet>
+ <h:outputText value="#{var[counter]}"></h:outputText>
+ <h:inputText value="#{var[counter]}"></h:inputText>
+ </columns:columns>
+ </dt:dataTable>
+
+
+ </h:form>
</f:view>
</body>
</html>
Deleted: trunk/sandbox/samples/columnsDemo/src/main/webapp/pages/index.xhtml
===================================================================
--- trunk/sandbox/samples/columnsDemo/src/main/webapp/pages/index.xhtml 2007-12-10 14:36:13 UTC (rev 4653)
+++ trunk/sandbox/samples/columnsDemo/src/main/webapp/pages/index.xhtml 2007-12-10 14:37:16 UTC (rev 4654)
@@ -1,12 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml"
- xmlns:f="http://java.sun.com/jsf/core"
- xmlns:h="http://java.sun.com/jsf/html"
- xmlns:ui="http://java.sun.com/jsf/facelets"
- xmlns:a4j="https://ajax4jsf.dev.java.net/ajax"
- xmlns:c="http://java.sun.com/jsp/jstl/core"
- >
- <f:view>
-
- </f:view>
-</html>
\ No newline at end of file
Added: trunk/sandbox/samples/columnsDemo/src/main/webapp/pages/index.xhtml
===================================================================
--- trunk/sandbox/samples/columnsDemo/src/main/webapp/pages/index.xhtml (rev 0)
+++ trunk/sandbox/samples/columnsDemo/src/main/webapp/pages/index.xhtml 2007-12-10 14:37:16 UTC (rev 4654)
@@ -0,0 +1,42 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml"
+ xmlns:f="http://java.sun.com/jsf/core"
+ xmlns:h="http://java.sun.com/jsf/html"
+ xmlns:ui="http://java.sun.com/jsf/facelets"
+ xmlns:a4j="http://richfaces.org/a4j"
+ xmlns:jstl="http://java.sun.com/jstl/core"
+ xmlns:dt="http://labs.jboss.com/jbossrichfaces/ui/dataTable"
+ xmlns:columns="http://labs.jboss.com/jbossrichfaces/ui/ui/columns">
+ <f:view>
+ XHTML
+ <h:form>
+
+
+ Columns: <h:inputText value="#{bean.columnsCountStr}"></h:inputText> <br/>
+ Rows: <h:inputText value="#{bean.rowCountStr}"></h:inputText> <br/>
+
+
+ <a4j:commandButton value="Submit" action="#{bean.xhtml}" reRender="tb"></a4j:commandButton>
+
+ <br/>
+
+
+ <dt:dataTable value="#{bean.model}" var="var" id="tb">
+ <columns:columns value="#{bean.columns}" var="col" index="counter"
+ style="color: Green;">
+ <f:facet name="header">
+ <h:outputText value="#{col.header}"></h:outputText>
+ </f:facet>
+ <f:facet name="footer">
+ <h:outputText value="#{col.footer}"></h:outputText>
+ </f:facet>
+ <h:outputText value="#{var[counter]}"></h:outputText>
+ <h:inputText value="#{var[counter]}"></h:inputText>
+ </columns:columns>
+ </dt:dataTable>
+
+ </h:form>
+
+ </f:view>
+
+</html>
\ No newline at end of file
16 years, 10 months
JBoss Rich Faces SVN: r4653 - branches/3.1.x/ui/modal-panel/src/main/resources/org/richfaces/renderkit/html/scripts.
by richfaces-svn-commits@lists.jboss.org
Author: nbelaevski
Date: 2007-12-10 09:36:13 -0500 (Mon, 10 Dec 2007)
New Revision: 4653
Modified:
branches/3.1.x/ui/modal-panel/src/main/resources/org/richfaces/renderkit/html/scripts/modalPanel.js
Log:
http://jira.jboss.com/jira/browse/RF-1567
Modified: branches/3.1.x/ui/modal-panel/src/main/resources/org/richfaces/renderkit/html/scripts/modalPanel.js
===================================================================
--- branches/3.1.x/ui/modal-panel/src/main/resources/org/richfaces/renderkit/html/scripts/modalPanel.js 2007-12-10 14:36:07 UTC (rev 4652)
+++ branches/3.1.x/ui/modal-panel/src/main/resources/org/richfaces/renderkit/html/scripts/modalPanel.js 2007-12-10 14:36:13 UTC (rev 4653)
@@ -18,6 +18,7 @@
document.body.appendChild(garbageBin);
}
+ Event.unloadElementsCache(element);
// move the element to the garbage bin
garbageBin.appendChild(element);
garbageBin.innerHTML = '';
@@ -107,7 +108,7 @@
this.markerId = $(id);
- this.id = id + "Container";
+ this.id = $(id + "Container");
this.options = options;
@@ -182,8 +183,8 @@
this.eventFirstOnfocus = this.firstOnfocus.bindAsEventListener(this);
this.eventLastOnfocus = this.lastOnfocus.bindAsEventListener(this);
- this.firstHref = this.id + "FirstHref";
- this.lastHref = this.id + "LastHref";
+ this.firstHref = id + "FirstHref";
+ this.lastHref = id + "LastHref";
this.selectBehavior = options.selectBehavior;
},
@@ -206,7 +207,7 @@
this.borders = null;
if (this.floatedToBody) {
- var element = $(this.id);
+ var element = this.id;
var parent = element.parentNode;
if (parent) {
parent.removeChild(element);
@@ -244,10 +245,9 @@
}
var children = document.body.childNodes;
- var element = $(this.id);
for (var k = 0; k < children.length; k++) {
var child = children[k];
- if (child != element && child.getElementsByTagName) {
+ if (child != this.id && child.getElementsByTagName) {
var selects = child.getElementsByTagName("SELECT");
@@ -422,7 +422,7 @@
show: function(event, opts) {
this.preventFocus();
- var element = $(this.id);
+ var element = this.id;
if (!this.floatedToBody) {
this.parent = element.parentNode;
document.body.insertBefore(this.parent.removeChild(element), null);
@@ -441,12 +441,12 @@
var eIframe;
if (ModalPanel.disableSelects && !this.iframe) {
+ this.iframe = this.id.id + "IFrame";
+
new Insertion.Top(eCdiv,
- "<iframe src=\"javascript:''\" frameborder=\"0\" scrolling=\"no\" id=\"" + this.id + "IFrame\"" +
+ "<iframe src=\"javascript:''\" frameborder=\"0\" scrolling=\"no\" id=\"" + this.iframe + "\" " +
"style=\"position: absolute; width: 1px; height: 1px; background-color: white; overflow-y: hidden; z-index: 1;\">" +
"</iframe>");
-
- this.iframe = this.id + "IFrame";
eIframe = $(this.iframe);
@@ -665,7 +665,7 @@
eCdiv.style.removeExpression("top");
}
- var element = $(this.id);
+ var element = this.id;
Element.hide(element);
if (this.floatedToBody && this.parent) {
@@ -838,8 +838,8 @@
if (e && target) {
var input = document.createElement("input");
input.type = "hidden";
- input.id = this.id + "OpenedState";
- input.name = this.id + "OpenedState";
+ input.id = this.id.id + "OpenedState";
+ input.name = this.id.id + "OpenedState";
input.value = this.shown ? "true" : "false";
target.appendChild(input);
@@ -848,8 +848,8 @@
for (var i = 0; i < keys.length; i++) {
input = document.createElement("input");
input.type = "hidden";
- input.id = this.id + "StateOption_" + keys[i];
- input.name = this.id + "StateOption_" + keys[i];
+ input.id = this.id.id + "StateOption_" + keys[i];
+ input.name = this.id.id + "StateOption_" + keys[i];
input.value = this.userOptions[keys[i]];
target.appendChild(input);
16 years, 10 months
JBoss Rich Faces SVN: r4652 - in branches/3.1.x/framework/impl/src/main/javascript: prototype and 1 other directory.
by richfaces-svn-commits@lists.jboss.org
Author: nbelaevski
Date: 2007-12-10 09:36:07 -0500 (Mon, 10 Dec 2007)
New Revision: 4652
Modified:
branches/3.1.x/framework/impl/src/main/javascript/ajaxjsf/JSFAJAX.js
branches/3.1.x/framework/impl/src/main/javascript/prototype/patches.js
Log:
http://jira.jboss.com/jira/browse/RF-1567
Modified: branches/3.1.x/framework/impl/src/main/javascript/ajaxjsf/JSFAJAX.js
===================================================================
--- branches/3.1.x/framework/impl/src/main/javascript/ajaxjsf/JSFAJAX.js 2007-12-10 14:28:48 UTC (rev 4651)
+++ branches/3.1.x/framework/impl/src/main/javascript/ajaxjsf/JSFAJAX.js 2007-12-10 14:36:07 UTC (rev 4652)
@@ -333,6 +333,12 @@
LOG.debug("Replace content of node by replaceChild()");
anchor.replaceChild(importednode,oldnode);
}
+
+ // Remove unload prototype events for a removed elements.
+ if ((typeof Event != "undefined") && (typeof Event.unloadElementsCache == "function")) {
+ Event.unloadElementsCache(oldnode);
+ }
+
// re-execute all script fragments in imported subtree...
// TODO - opera 8 run scripts at replace content stage.
if(!A4J.AJAX._scriptEvaluated){
@@ -847,9 +853,10 @@
window.document.documentElement.appendChild(node);
}
}
- if (typeof Event != "undefined" && typeof Event.unloadElementsCache == "function") {
- Event.unloadElementsCache();
- }
+ //TODO - unloading cached observers?
+ //if (typeof Event != "undefined" && typeof Event.unloadElementsCache == "function") {
+ //Event.unloadElementsCache();
+ //}
} else {
LOG.error("Error parsing response",Sarissa.getParseErrorText(oDomDoc));
}
@@ -884,11 +891,6 @@
*/
A4J.AJAX.finishRequest = function(request){
var options = request.options;
- // Remove unload prototype events for a removed elements.
- if ((typeof Event != "undefined") && (typeof Event.unloadElementsCache == "function")) {
- Event.unloadElementsCache();
- }
-
// we can set listener for complete request - for example,
// it can shedule next request for update page.
var oncomplete = request.getElementById('org.ajax4jsf.oncomplete');
Modified: branches/3.1.x/framework/impl/src/main/javascript/prototype/patches.js
===================================================================
--- branches/3.1.x/framework/impl/src/main/javascript/prototype/patches.js 2007-12-10 14:28:48 UTC (rev 4651)
+++ branches/3.1.x/framework/impl/src/main/javascript/prototype/patches.js 2007-12-10 14:36:07 UTC (rev 4652)
@@ -62,19 +62,32 @@
}
};
-Event.unloadElementsCache = function() {
- if (!Event.observers) return;
- //refer to window.unload handling conditions in prototype script
- if (!Prototype.Browser.IE) return;
+Event.unloadElementsCache = function(oldNode) {
+ //refer to window.unload handling conditions in prototype script
+ if (!window.attachEvent) return;
+
+ if (!oldNode) return;
- var observers = Event.observers;
- for (var i = observers.length - 1; i >= 0; i--) {
- var observer = observers[i];
- var elt = observer[0];
-
- if (Element.isUninitialized(elt)) {
- Event.stopObserving.apply(Event, observer);
- observers.splice(i, 1);
+ if (oldNode) {
+ if (oldNode._eventID) {
+ var cache = Event.cache[oldNode._eventID];
+
+ for (var eventName in cache) {
+ cache[eventName] = null;
+ }
+
+ delete Event.cache[oldNode._eventID];
}
+
+ var firstNode = oldNode.firstChild;
+ if (firstNode) {
+ Event.unloadElementsCache(firstNode);
+
+ var nextNode = firstNode.nextSibling;
+ while (nextNode) {
+ Event.unloadElementsCache(nextNode);
+ nextNode = nextNode.nextSibling;
+ }
+ }
}
};
\ No newline at end of file
16 years, 10 months
JBoss Rich Faces SVN: r4651 - in trunk/sandbox/ui/columns/src/main: java/org/richfaces and 5 other directories.
by richfaces-svn-commits@lists.jboss.org
Author: andrei_exadel
Date: 2007-12-10 09:28:48 -0500 (Mon, 10 Dec 2007)
New Revision: 4651
Added:
trunk/sandbox/ui/columns/src/main/java/org/richfaces/iterator/
trunk/sandbox/ui/columns/src/main/java/org/richfaces/iterator/ForEachIterator.java
trunk/sandbox/ui/columns/src/main/java/org/richfaces/iterator/SimpleForEachIterator.java
trunk/sandbox/ui/columns/src/main/java/org/richfaces/tag/
trunk/sandbox/ui/columns/src/main/java/org/richfaces/tag/AbstractColumnsTag.java
trunk/sandbox/ui/columns/src/main/java/org/richfaces/taglib/
trunk/sandbox/ui/columns/src/main/java/org/richfaces/taglib/html/
trunk/sandbox/ui/columns/src/main/java/org/richfaces/taglib/html/facelets/
trunk/sandbox/ui/columns/src/main/java/org/richfaces/taglib/html/facelets/ColumnsHandler.java
Modified:
trunk/sandbox/ui/columns/src/main/config/component/columns.xml
Log:
RF-1201
Modified: trunk/sandbox/ui/columns/src/main/config/component/columns.xml
===================================================================
--- trunk/sandbox/ui/columns/src/main/config/component/columns.xml 2007-12-10 14:21:32 UTC (rev 4650)
+++ trunk/sandbox/ui/columns/src/main/config/component/columns.xml 2007-12-10 14:28:48 UTC (rev 4651)
@@ -2,7 +2,7 @@
<!DOCTYPE components PUBLIC "-//AJAX4JSF//CDK Generator config/EN" "https://ajax4jsf.dev.java.net/nonav/dtds/component-config.dtd" >
<components>
<component>
- <name>org.richfaces.Columns</name>
+ <name>org.richfaces.Column</name>
<family>org.richfaces.Column</family>
<classname>org.richfaces.component.html.HtmlColumns</classname>
<superclass>org.richfaces.component.UIColumns</superclass>
@@ -11,18 +11,49 @@
]]>
</description>
<renderer>
- <name>org.richfaces.ColumnRenderer</name>
+ <name>org.richfaces.renderkit.CellRenderer</name>
</renderer>
<tag>
<name>columns</name>
<classname>org.richfaces.taglib.ColumnsTag</classname>
<superclass>
- org.ajax4jsf.webapp.taglib.HtmlComponentTagBase
+ org.richfaces.tag.AbstractColumnsTag
</superclass>
<test/>
</tag>
- &ui_component_attributes;
+ <taghandler generate="false">
+ <classname>org.richfaces.taglib.html.facelets.ColumnsHandler</classname>
+ </taghandler>
+ &ui_data_attributes;
&html_universal_attributes;
+ <property>
+ <name>value</name>
+ <classname>java.lang.Object</classname>
+ <description>
+ The current value for this component
+ </description>
+ </property>
+ <property>
+ <name>var</name>
+ <classname>java.lang.Object</classname>
+ <description>
+ The current value for this component
+ </description>
+ </property>
+ <property>
+ <name>index</name>
+ <classname>java.lang.Object</classname>
+ <description>
+ The current counter
+ </description>
+ </property>
+ <property>
+ <name>end</name>
+ <classname>java.lang.Object</classname>
+ <description>
+ Count of columns
+ </description>
+ </property>
<property disabled="true">
<name>header</name>
</property>
@@ -62,7 +93,6 @@
</description>
<defaultvalue>"100px"</defaultvalue>
</property>
-
<property>
<name>sortable</name>
<classname>boolean</classname>
@@ -75,6 +105,8 @@
<name>sortExpression</name>
<classname>java.lang.String</classname>
<description>Attribute defines a bean property which is used for sorting of a column</description>
- </property>
+ </property>
</component>
+
+
</components>
Added: trunk/sandbox/ui/columns/src/main/java/org/richfaces/iterator/ForEachIterator.java
===================================================================
--- trunk/sandbox/ui/columns/src/main/java/org/richfaces/iterator/ForEachIterator.java (rev 0)
+++ trunk/sandbox/ui/columns/src/main/java/org/richfaces/iterator/ForEachIterator.java 2007-12-10 14:28:48 UTC (rev 4651)
@@ -0,0 +1,20 @@
+/*
+ * ForEachIterator.java Date created: 07.12.2007
+ * Last modified by: $Author$
+ * $Revision$ $Date$
+ */
+
+package org.richfaces.iterator;
+
+import javax.servlet.jsp.JspTagException;
+
+/**
+ * TODO Class description goes here.
+ * @author "Andrey Markavtsov"
+ *
+ */
+public interface ForEachIterator {
+ public boolean hasNext() throws JspTagException;
+
+ public Object next() throws JspTagException;
+}
Added: trunk/sandbox/ui/columns/src/main/java/org/richfaces/iterator/SimpleForEachIterator.java
===================================================================
--- trunk/sandbox/ui/columns/src/main/java/org/richfaces/iterator/SimpleForEachIterator.java (rev 0)
+++ trunk/sandbox/ui/columns/src/main/java/org/richfaces/iterator/SimpleForEachIterator.java 2007-12-10 14:28:48 UTC (rev 4651)
@@ -0,0 +1,242 @@
+/*
+ * ForEachIterator.java Date created: 06.12.2007
+ * Last modified by: $Author$
+ * $Revision$ $Date$
+ */
+
+package org.richfaces.iterator;
+
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.Enumeration;
+import java.util.Iterator;
+import java.util.Map;
+import java.util.StringTokenizer;
+
+import javax.servlet.jsp.JspTagException;
+
+/**
+ * TODO Class description goes here.
+ *
+ * @author "Andrey Markavtsov"
+ *
+ */
+public class SimpleForEachIterator implements ForEachIterator {
+
+ private Iterator i;
+
+ public static ForEachIterator supportedTypeForEachIterator(Object o)
+ throws JspTagException {
+
+ /*
+ * This is, of necessity, just a big, simple chain, matching in order.
+ * Since we are passed on Object because of all the various types we
+ * support, we cannot rely on the language's mechanism for resolving
+ * overloaded methods. (Method overloading resolves via early binding,
+ * so the type of the 'o' reference, not the type of the eventual value
+ * that 'o' references, is all that's available.)
+ *
+ * Currently, we 'match' on the object we have through an if/else chain
+ * that picks the first interface (or class match) found for an Object.
+ */
+
+ ForEachIterator items;
+
+ if (o instanceof Object[])
+ items = toForEachIterator((Object[]) o);
+ else if (o instanceof boolean[])
+ items = toForEachIterator((boolean[]) o);
+ else if (o instanceof byte[])
+ items = toForEachIterator((byte[]) o);
+ else if (o instanceof char[])
+ items = toForEachIterator((char[]) o);
+ else if (o instanceof short[])
+ items = toForEachIterator((short[]) o);
+ else if (o instanceof int[])
+ items = toForEachIterator((int[]) o);
+ else if (o instanceof long[])
+ items = toForEachIterator((long[]) o);
+ else if (o instanceof float[])
+ items = toForEachIterator((float[]) o);
+ else if (o instanceof double[])
+ items = toForEachIterator((double[]) o);
+ else if (o instanceof Collection)
+ items = toForEachIterator((Collection) o);
+ else if (o instanceof Iterator)
+ items = toForEachIterator((Iterator) o);
+ else if (o instanceof Enumeration)
+ items = toForEachIterator((Enumeration) o);
+ else if (o instanceof Map)
+ items = toForEachIterator((Map) o);
+ /*
+ * else if (o instanceof ResultSet) items =
+ * toForEachIterator((ResultSet) o);
+ */
+ else if (o instanceof String)
+ items = toForEachIterator((String) o);
+ else
+ items = toForEachIterator(o);
+
+ return (items);
+ }
+
+
+ /*
+ * Creates a ForEachIterator of Integers from 'begin' to 'end'
+ * in support of cases where our tag handler isn't passed an
+ * explicit collection over which to iterate.
+ */
+ public static ForEachIterator beginEndForEachIterator(int end) {
+ /*
+ * To plug into existing support, we need to keep 'begin', 'end',
+ * and 'step' as they are. So we'll simply create an Integer[]
+ * from 0 to 'end', inclusive, and let the existing implementation
+ * handle the subsetting and stepping operations. (Other than
+ * localizing the cost of creating this Integer[] to the start
+ * of the operation instead of spreading it out over the lifetime
+ * of the iteration, this implementation isn't worse than one that
+ * created new Integers() as needed from next(). Such an adapter
+ * to ForEachIterator could easily be written but, like I said,
+ * wouldn't provide much benefit.)
+ */
+ Integer[] ia = new Integer[end+1];
+ for (int i = 0; i < end; i++)
+ ia[i] = new Integer(i);
+ return new SimpleForEachIterator(Arrays.asList(ia).iterator());
+ }
+
+
+ // *********************************************************************
+ // Private conversion methods to handle the various types we support
+
+ // catch-all method whose invocation currently signals a 'matching error'
+ protected static ForEachIterator toForEachIterator(Object o)
+ throws JspTagException {
+ throw new JspTagException("FOREACH_BAD_ITEMS");
+ }
+
+ // returns an iterator over an Object array (via List)
+ protected static ForEachIterator toForEachIterator(Object[] a) {
+ return new SimpleForEachIterator(Arrays.asList(a).iterator());
+ }
+
+ // returns an iterator over a boolean[] array, wrapping items in Boolean
+ protected static ForEachIterator toForEachIterator(boolean[] a) {
+ Boolean[] wrapped = new Boolean[a.length];
+ for (int i = 0; i < a.length; i++)
+ wrapped[i] = new Boolean(a[i]);
+ return new SimpleForEachIterator(Arrays.asList(wrapped).iterator());
+ }
+
+ // returns an iterator over a byte[] array, wrapping items in Byte
+ protected static ForEachIterator toForEachIterator(byte[] a) {
+ Byte[] wrapped = new Byte[a.length];
+ for (int i = 0; i < a.length; i++)
+ wrapped[i] = new Byte(a[i]);
+ return new SimpleForEachIterator(Arrays.asList(wrapped).iterator());
+ }
+
+ // returns an iterator over a char[] array, wrapping items in Character
+ protected static ForEachIterator toForEachIterator(char[] a) {
+ Character[] wrapped = new Character[a.length];
+ for (int i = 0; i < a.length; i++)
+ wrapped[i] = new Character(a[i]);
+ return new SimpleForEachIterator(Arrays.asList(wrapped).iterator());
+ }
+
+ // returns an iterator over a short[] array, wrapping items in Short
+ protected static ForEachIterator toForEachIterator(short[] a) {
+ Short[] wrapped = new Short[a.length];
+ for (int i = 0; i < a.length; i++)
+ wrapped[i] = new Short(a[i]);
+ return new SimpleForEachIterator(Arrays.asList(wrapped).iterator());
+ }
+
+ // returns an iterator over an int[] array, wrapping items in Integer
+ protected static ForEachIterator toForEachIterator(int[] a) {
+ Integer[] wrapped = new Integer[a.length];
+ for (int i = 0; i < a.length; i++)
+ wrapped[i] = new Integer(a[i]);
+ return new SimpleForEachIterator(Arrays.asList(wrapped).iterator());
+ }
+
+ // returns an iterator over a long[] array, wrapping items in Long
+ protected static ForEachIterator toForEachIterator(long[] a) {
+ Long[] wrapped = new Long[a.length];
+ for (int i = 0; i < a.length; i++)
+ wrapped[i] = new Long(a[i]);
+ return new SimpleForEachIterator(Arrays.asList(wrapped).iterator());
+ }
+
+ // returns an iterator over a float[] array, wrapping items in Float
+ protected static ForEachIterator toForEachIterator(float[] a) {
+ Float[] wrapped = new Float[a.length];
+ for (int i = 0; i < a.length; i++)
+ wrapped[i] = new Float(a[i]);
+ return new SimpleForEachIterator(Arrays.asList(wrapped).iterator());
+ }
+
+ // returns an iterator over a double[] array, wrapping items in Double
+ protected static ForEachIterator toForEachIterator(double[] a) {
+ Double[] wrapped = new Double[a.length];
+ for (int i = 0; i < a.length; i++)
+ wrapped[i] = new Double(a[i]);
+ return new SimpleForEachIterator(Arrays.asList(wrapped).iterator());
+ }
+
+ // retrieves an iterator from a Collection
+ protected static ForEachIterator toForEachIterator(Collection c) {
+ return new SimpleForEachIterator(c.iterator());
+ }
+
+ // simply passes an Iterator through...
+ protected static ForEachIterator toForEachIterator(Iterator i) {
+ return new SimpleForEachIterator(i);
+ }
+
+ // converts an Enumeration to an Iterator via a local adapter
+ protected static ForEachIterator toForEachIterator(Enumeration e) {
+
+ // local adapter
+ class EnumerationAdapter implements ForEachIterator {
+ private Enumeration e;
+
+ public EnumerationAdapter(Enumeration e) {
+ this.e = e;
+ }
+
+ public boolean hasNext() {
+ return e.hasMoreElements();
+ }
+
+ public Object next() {
+ return e.nextElement();
+ }
+ }
+
+ return new EnumerationAdapter(e);
+ }
+
+ // retrieves an iterator over the Map.Entry items in a Map
+ protected static ForEachIterator toForEachIterator(Map m) {
+ return new SimpleForEachIterator(m.entrySet().iterator());
+ }
+
+ protected static ForEachIterator toForEachIterator(String s) {
+ StringTokenizer st = new StringTokenizer(s, ",");
+ return toForEachIterator(st); // convert from Enumeration
+ }
+
+ public SimpleForEachIterator(Iterator i) {
+ this.i = i;
+ }
+
+ public boolean hasNext() {
+ return i.hasNext();
+ }
+
+ public Object next() {
+ return i.next();
+ }
+
+}
Added: trunk/sandbox/ui/columns/src/main/java/org/richfaces/tag/AbstractColumnsTag.java
===================================================================
--- trunk/sandbox/ui/columns/src/main/java/org/richfaces/tag/AbstractColumnsTag.java (rev 0)
+++ trunk/sandbox/ui/columns/src/main/java/org/richfaces/tag/AbstractColumnsTag.java 2007-12-10 14:28:48 UTC (rev 4651)
@@ -0,0 +1,1394 @@
+/*
+ * AbstractColumnsTag.java Date created: 26.11.2007
+ * Last modified by: $Author$
+ * $Revision$ $Date$
+ */
+
+package org.richfaces.tag;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Enumeration;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.StringTokenizer;
+
+import javax.el.ELContext;
+import javax.el.ELException;
+import javax.el.ValueExpression;
+import javax.el.VariableMapper;
+import javax.faces.component.UIComponent;
+import javax.faces.context.FacesContext;
+import javax.faces.webapp.UIComponentClassicTagBase;
+import javax.faces.webapp.UIComponentTag;
+import javax.servlet.jsp.JspException;
+import javax.servlet.jsp.JspTagException;
+import javax.servlet.jsp.PageContext;
+import javax.servlet.jsp.tagext.BodyContent;
+import javax.servlet.jsp.tagext.IterationTag;
+
+import org.richfaces.iterator.ForEachIterator;
+import org.richfaces.iterator.SimpleForEachIterator;
+
+
+/**
+ * Class provides implementation for columns tag
+ *
+ * @author "Andrey Markavtsov"
+ *
+ */
+public abstract class AbstractColumnsTag extends UIComponentClassicTagBase
+ implements IterationTag {
+
+ /** Column component type */
+ private static final String _componentType = "org.richfaces.Column";
+
+ /** Current column counter */
+ private Integer index = -1;
+
+ /** Data table */
+ private UIComponent dataTable;
+
+ /** Previous created column */
+ private UIComponent previous;
+
+ /**
+ * <p>
+ * The {@link UIComponent} that is being encoded by this tag, if any.
+ * </p>
+ */
+ private UIComponent component = null;
+
+ /** Flag indicates if columns are already created */
+ private boolean created = false;
+
+ /** Iterator for columns's tag value attribute */
+ protected ForEachIterator items; // our 'digested' items
+
+ /** Value attribute value */
+ protected Object rawItems; // our 'raw' items
+
+ /** End attribute - defines count of column if value attr hasn't been defined*/
+ private ValueExpression end;
+
+ /** Index attr - defines page variable for current column counter */
+ private ValueExpression _index;
+
+ /** Var attr - defines page variable for current item */
+ private String indexId;
+
+ /** Integer value of end attr. */
+ private Integer _end;
+
+ /** String value of var attr */
+ private String itemId = null;
+
+ /** Expression for var item */
+ private IteratedExpression iteratedExpression;
+
+ /**
+ * <p>
+ * The <code>Lst</code> of {@link UIComponent} ids created or located by
+ * nested {@link UIComponentTag}s while processing the current request.
+ * </p>
+ */
+ // public List<String> createdComponents = null;
+ /**
+ * Caches the nearest enclosing {@link UIComponentRichClassicTagBase} of
+ * this tag. This is used for duplicate id detection.
+ */
+ private UIComponentClassicTagBase parentTag = null;
+
+ /**
+ * <p>
+ * Return the {@link UIComponent} instance that is associated with this tag
+ * instance. This method is designed to be used by tags nested within this
+ * tag, and only returns useful results between the execution of
+ * <code>doStartTag()</code> and <code>doEndTag()</code> on this tag
+ * instance.
+ * </p>
+ */
+ public UIComponent getComponentInstance() {
+
+ return (this.component);
+
+ }
+
+ /**
+ * <p>
+ * The request scope attribute under which a component tag stack for the
+ * current request will be maintained.
+ * </p>
+ */
+ private static final String COMPONENT_TAG_STACK_ATTR = "javax.faces.webapp.COMPONENT_TAG_STACK";
+
+ /**
+ * <p>
+ * The value binding expression (if any) used to wire up this component to a
+ * {@link UIComponent} property of a JavaBean class.
+ * </p>
+ */
+ private ValueExpression binding = null;
+
+ /**
+ * <p>
+ * An override for the rendered attribute associated with our
+ * {@link UIComponent}.
+ * </p>
+ */
+ private ValueExpression rendered = null;
+
+ /**
+ * style CSS style(s) is/are to be applied when this component is rendered
+ */
+ private ValueExpression _style;
+
+ /**
+ * CSS style(s) is/are to be applied when this component is rendered Setter
+ * for style
+ *
+ * @param style -
+ * new value
+ */
+ public void setStyle(ValueExpression __style) {
+ this._style = __style;
+ }
+
+ /**
+ * breakBefore if "true" next column begins from the first row
+ */
+ private ValueExpression _breakBefore;
+
+ /**
+ * if "true" next column begins from the first row Setter for breakBefore
+ *
+ * @param breakBefore -
+ * new value
+ */
+ public void setBreakBefore(ValueExpression __breakBefore) {
+ this._breakBefore = __breakBefore;
+ }
+
+ /**
+ * colspan Corresponds to the HTML colspan attribute
+ */
+ private ValueExpression _colspan;
+
+ /**
+ * Corresponds to the HTML colspan attribute Setter for colspan
+ *
+ * @param colspan -
+ * new value
+ */
+ public void setColspan(ValueExpression __colspan) {
+ this._colspan = __colspan;
+ }
+
+ /**
+ * dir Direction indication for text that does not inherit directionality.
+ * Valid values are "LTR" (left-to-right) and "RTL" (right-to-left)
+ */
+ private ValueExpression _dir;
+
+ /**
+ * Direction indication for text that does not inherit directionality. Valid
+ * values are "LTR" (left-to-right) and "RTL" (right-to-left) Setter for dir
+ *
+ * @param dir -
+ * new value
+ */
+ public void setDir(ValueExpression __dir) {
+ this._dir = __dir;
+ }
+
+ /**
+ * first A zero-relative row number of the first row to display
+ */
+ private ValueExpression _first;
+
+ /**
+ * A zero-relative row number of the first row to display Setter for first
+ *
+ * @param first -
+ * new value
+ */
+ public void setFirst(ValueExpression __first) {
+ this._first = __first;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see javax.faces.webapp.UIComponentClassicTagBase#createComponent(javax.faces.context.FacesContext,
+ * java.lang.String)
+ */
+ @Override
+ protected UIComponent createComponent(FacesContext context, String newId)
+ throws JspException {
+ // TODO Auto-generated method stub
+ return context.getApplication().createComponent(_componentType);
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see javax.faces.webapp.UIComponentTagBase#getComponentType()
+ */
+ @Override
+ public String getComponentType() {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see javax.faces.webapp.UIComponentTagBase#getRendererType()
+ */
+ @Override
+ public String getRendererType() {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+ /**
+ * footerClass Space-separated list of CSS style class(es) that are be
+ * applied to any footer generated for this table
+ */
+ private ValueExpression _footerClass;
+
+ /**
+ * Space-separated list of CSS style class(es) that are be applied to any
+ * footer generated for this table Setter for footerClass
+ *
+ * @param footerClass -
+ * new value
+ */
+ public void setFooterClass(ValueExpression __footerClass) {
+ this._footerClass = __footerClass;
+ }
+
+ /**
+ * headerClass Space-separated list of CSS style class(es) that are be
+ * applied to any header generated for this table
+ */
+ private ValueExpression _headerClass;
+
+ /**
+ * Space-separated list of CSS style class(es) that are be applied to any
+ * header generated for this table Setter for headerClass
+ *
+ * @param headerClass -
+ * new value
+ */
+ public void setHeaderClass(ValueExpression __headerClass) {
+ this._headerClass = __headerClass;
+ }
+
+ /**
+ * lang Code describing the language used in the generated markup for this
+ * component
+ */
+ private ValueExpression _lang;
+
+ /**
+ * Code describing the language used in the generated markup for this
+ * component Setter for lang
+ *
+ * @param lang -
+ * new value
+ */
+ public void setLang(ValueExpression __lang) {
+ this._lang = __lang;
+ }
+
+ /**
+ * rows A number of rows to display, or zero for all remaining rows in the
+ * table
+ */
+ private ValueExpression _rows;
+
+ /**
+ * A number of rows to display, or zero for all remaining rows in the table
+ * Setter for rows
+ *
+ * @param rows -
+ * new value
+ */
+ public void setRows(ValueExpression __rows) {
+ this._rows = __rows;
+ }
+
+ /**
+ * rowspan Corresponds to the HTML rowspan attribute
+ */
+ private ValueExpression _rowspan;
+
+ /**
+ * Corresponds to the HTML rowspan attribute Setter for rowspan
+ *
+ * @param rowspan -
+ * new value
+ */
+ public void setRowspan(ValueExpression __rowspan) {
+ this._rowspan = __rowspan;
+ }
+
+ /**
+ * sortExpression Attribute defines a bean property which is used for
+ * sorting of a column
+ */
+ private ValueExpression _sortExpression;
+
+ /**
+ * Attribute defines a bean property which is used for sorting of a column
+ * Setter for sortExpression
+ *
+ * @param sortExpression -
+ * new value
+ */
+ public void setSortExpression(ValueExpression __sortExpression) {
+ this._sortExpression = __sortExpression;
+ }
+
+ /**
+ * sortable Boolean attribute. If "true" it's possible to sort the column
+ * content after click on the header. Default value is "true"
+ */
+ private ValueExpression _sortable;
+
+ /**
+ * Boolean attribute. If "true" it's possible to sort the column content
+ * after click on the header. Default value is "true" Setter for sortable
+ *
+ * @param sortable -
+ * new value
+ */
+ public void setSortable(ValueExpression __sortable) {
+ this._sortable = __sortable;
+ }
+
+ /**
+ * styleClass Corresponds to the HTML class attribute
+ */
+ private ValueExpression _styleClass;
+
+ /**
+ * Corresponds to the HTML class attribute Setter for styleClass
+ *
+ * @param styleClass -
+ * new value
+ */
+ public void setStyleClass(ValueExpression __styleClass) {
+ this._styleClass = __styleClass;
+ }
+
+ /**
+ * title Advisory title information about markup elements generated for this
+ * component
+ */
+ private ValueExpression _title;
+
+ /**
+ * Advisory title information about markup elements generated for this
+ * component Setter for title
+ *
+ * @param title -
+ * new value
+ */
+ public void setTitle(ValueExpression __title) {
+ this._title = __title;
+ }
+
+ /**
+ * value The current value for this component
+ */
+ private ValueExpression _value;
+
+ /**
+ * The current value for this component Setter for value
+ *
+ * @param value -
+ * new value
+ */
+ public void setValue(ValueExpression __value) {
+ this._value = __value;
+ }
+
+ /**
+ * var A request-scope attribute via which the data object for the current
+ * row will be used when iterating
+ */
+ private ValueExpression _var;
+
+ /**
+ * A request-scope attribute via which the data object for the current row
+ * will be used when iterating Setter for var
+ *
+ * @param var -
+ * new value
+ */
+ public void setVar(ValueExpression __var) {
+ this._var = __var;
+ }
+
+ /*
+ * width Attribute defines width of column. Default value is "100px".
+ */
+ private ValueExpression _width;
+
+ /**
+ * Attribute defines width of column. Default value is "100px". Setter for
+ * width
+ *
+ * @param width -
+ * new value
+ */
+ public void setWidth(ValueExpression __width) {
+ this._width = __width;
+ }
+
+ /**
+ * Default constructor for AbstractColumnsTag class
+ */
+ public AbstractColumnsTag() {
+ super();
+ }
+
+ /**
+ * <p>
+ * Set an override for the rendered attribute.
+ * </p>
+ *
+ * @param rendered
+ * The new value for rendered attribute
+ */
+ public void setRendered(ValueExpression rendered) {
+ this.rendered = rendered;
+ }
+
+ /**
+ * <p>
+ * Set the value expression for our component.
+ * </p>
+ *
+ * @param binding
+ * The new value expression
+ *
+ * @throws JspException
+ * if an error occurs
+ */
+ public void setBinding(ValueExpression binding) throws JspException {
+ this.binding = binding;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see javax.servlet.jsp.tagext.BodyTagSupport#doAfterBody()
+ */
+ @Override
+ public int doAfterBody() throws JspException {
+
+ if (hasNext()) {
+ loop();
+ } else
+ return EVAL_BODY_INCLUDE;
+
+ exposeVariables();
+
+ return EVAL_BODY_AGAIN;
+ }
+
+ /* (non-Javadoc)
+ * @see javax.faces.webapp.UIComponentClassicTagBase#addFacet(java.lang.String)
+ */
+ protected void addFacet(String name) {
+ super.addFacet(name);
+
+ // add created component in facet in childrenList to reduce duplicated Id exp.
+ if (this.component != null && this.component.getFacets() != null) {
+ Map<String, UIComponent> facets = this.component.getFacets();
+ Iterator<UIComponent> it = facets.values().iterator();
+ while (it.hasNext()) {
+ super.addChild(it.next());
+ }
+ }
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see javax.servlet.jsp.tagext.BodyTagSupport#doInitBody()
+ */
+ @Override
+ public void doInitBody() throws JspException {
+ // TODO Auto-generated method stub
+ super.doInitBody();
+
+ }
+
+ /**
+ * Removes any attributes that this LoopTagSupport set.
+ *
+ * <p>
+ * These attributes are intended to support scripting variables with NESTED
+ * scope, so we don't want to pollute attribute space by leaving them lying
+ * around.
+ */
+ public void doFinally() {
+ /*
+ * Make sure to un-expose variables, restoring them to their prior
+ * values, if applicable.
+ */
+ unExposeVariables();
+ }
+
+ /**
+ * Removes page attributes that we have exposed and, if applicable, restores
+ * them to their prior values (and scopes).
+ */
+ private void unExposeVariables() {
+ // "nested" variables are now simply removed
+ if (itemId != null) {
+ pageContext.removeAttribute(itemId, PageContext.PAGE_SCOPE);
+ VariableMapper vm = pageContext.getELContext().getVariableMapper();
+ if (vm != null)
+ vm.setVariable(itemId, null);
+ }
+ if (indexId != null) {
+ pageContext.removeAttribute(indexId, PageContext.PAGE_SCOPE);
+ VariableMapper vm = pageContext.getELContext().getVariableMapper();
+ if (vm != null)
+ vm.setVariable(indexId, null);
+ }
+ }
+
+ /**
+ * Method is invoking by each iteration of body again rendering
+ * @throws JspTagException
+ */
+ private void loop() throws JspTagException {
+ if (!atFirst()) {
+ popUIComponentClassicTagBase();
+ }
+ UIComponent component = createColumn();
+ pushUIComponentClassicTagBase(this);
+ dataTable.getChildren().add(component);
+
+ next();
+ }
+
+ /**
+ * Creates column instance
+ * @return
+ */
+ private UIComponent createColumn() {
+ UIComponent component = getFacesContext().getApplication()
+ .createComponent(_componentType);
+ component.setId(getFacesContext().getViewRoot().createUniqueId());
+
+ initColumnByThis(component);
+
+ this.component = component;
+ this.parentTag = getParentUIComponentClassicTagBase(pageContext);
+ this.previous = component;
+
+ return component;
+ }
+
+ /**
+ * Inits column component by columns tag attrs
+ * @param column
+ */
+ void initColumnByThis (UIComponent column) {
+ column.setValueExpression("style",_style);
+ column.setValueExpression("styleClass",_styleClass);
+ column.setValueExpression("colspan",_colspan);
+ column.setValueExpression("rowspan",_rowspan);
+ column.setValueExpression("breakBefore",_breakBefore);
+ column.setValueExpression("headerClass",_headerClass);
+ column.setValueExpression("footerClass",_footerClass);
+ column.setValueExpression("width",_width);
+ column.setValueExpression("sortable",_sortable);
+ column.setValueExpression("sortExpression",_sortExpression);
+ column.setValueExpression("rendered",rendered);
+ }
+
+
+ /**
+ * Returns true if this is the first loop of columns tag
+ * @return
+ */
+ private boolean atFirst() {
+ return (index == -1);
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see javax.servlet.jsp.tagext.BodyTagSupport#doStartTag()
+ */
+ @Override
+ public int doStartTag() throws JspException {
+
+ prepare();
+
+ if (created) {
+ dataTable.getChildren().clear();
+ created = false;
+ }
+
+ // get the item we're interested in
+ if (!hasNext()) {
+ return SKIP_BODY;
+ }
+
+ loop();
+
+ exposeVariables();
+
+ return EVAL_BODY_INCLUDE;
+ }
+
+ /**
+ * Method prepares all we need for starting of tag rendering
+ * @throws JspTagException
+ */
+ private void prepare() throws JspTagException {
+ dataTable = getParentUIComponentClassicTagBase(pageContext)
+ .getComponentInstance();
+ created = (dataTable.getChildCount() > 0);
+
+ initVariables();
+
+ // produce the right sort of ForEachIterator
+ if (_value != null) {
+ // If this is a deferred expression, make a note and get
+ // the 'items' instance.
+ if (_value instanceof ValueExpression) {
+ rawItems = _value.getValue(pageContext.getELContext());
+ }
+ // extract an iterator over the 'items' we've got
+ items = SimpleForEachIterator
+ .supportedTypeForEachIterator(rawItems);
+ } else {
+ // no 'items', so use 'begin' and 'end'
+ items = SimpleForEachIterator.beginEndForEachIterator(_end);
+ }
+
+ /*
+ * ResultSet no more supported in <c:forEach> // step must be 1 when
+ * ResultSet is passed in if (rawItems instanceof ResultSet && step !=
+ * 1) throw new JspTagException(
+ * Resources.getMessage("FOREACH_STEP_NO_RESULTSET"));
+ */
+
+ }
+
+ /**
+ * Extracts integer value from end attr
+ */
+ private void initEnd() {
+ if (end != null) {
+ if (end instanceof ValueExpression)
+ try {
+ String t = (String) end.getValue(getELContext());
+ _end = Integer.parseInt(t);
+ if (_end < 0) {
+ _end = 0; // If end is negative set up zero
+ }
+ } catch (Exception e) {
+ _end = 0;
+ }
+ } else {
+ _end = 0;
+ }
+ }
+
+ /**
+ * Extracts string value from var attr
+ */
+ private void initVar() {
+ if (_var != null) {
+ try {
+ itemId = (String) _var.getValue(getELContext());
+ } catch (ClassCastException e) {
+ itemId = null;
+ }
+
+ }
+ }
+ /**
+ * Extracts string value from index attr
+ */
+ private void initIndex() {
+ if (_index != null) {
+ try {
+ indexId = (String) _index.getValue(getELContext());
+ } catch (ClassCastException e) {
+ indexId = null;
+ }
+
+ }
+ }
+
+ /**
+ * Extracts tags attributes values
+ */
+ private void initVariables() {
+ initEnd();
+ initIndex();
+ initVar();
+ }
+
+ /**
+ * Return true if we didn't complete column's count
+ * @return
+ * @throws JspTagException
+ */
+ private boolean hasNext() throws JspTagException {
+ return items.hasNext();
+ }
+
+ /**
+ * Iterate to next column
+ * @return
+ * @throws JspTagException
+ */
+ private Object next() throws JspTagException {
+ Object o = items.next();
+ index++;
+ return o;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see javax.servlet.jsp.tagext.BodyTagSupport#getBodyContent()
+ */
+ @Override
+ public BodyContent getBodyContent() {
+ // TODO Auto-generated method stub
+ return super.getBodyContent();
+ }
+
+ /* (non-Javadoc)
+ * @see javax.faces.webapp.UIComponentClassicTagBase#setProperties(javax.faces.component.UIComponent)
+ */
+ protected void setProperties(UIComponent component) {
+
+ }
+
+ /* (non-Javadoc)
+ * @see javax.faces.webapp.UIComponentClassicTagBase#hasBinding()
+ */
+ protected boolean hasBinding() {
+ return false;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see javax.faces.webapp.UIComponentClassicTagBase#doEndTag()
+ */
+ @Override
+ public int doEndTag() throws JspException {
+ if (!atFirst()) {
+ popUIComponentClassicTagBase();
+ }
+ return EVAL_PAGE;
+ }
+
+ /**
+ * Sets page request variables
+ * @throws JspTagException
+ */
+ private void exposeVariables() throws JspTagException {
+
+ /*
+ * We need to support null items returned from next(); we do this simply
+ * by passing such non-items through to the scoped variable as
+ * effectively 'null' (that is, by calling removeAttribute()).
+ *
+ * Also, just to be defensive, we handle the case of a null 'status'
+ * object as well.
+ *
+ * We call getCurrent() and getLoopStatus() (instead of just using
+ * 'item' and 'status') to bridge to subclasses correctly. A subclass
+ * can override getCurrent() or getLoopStatus() but still depend on our
+ * doStartTag() and doAfterBody(), which call this method
+ * (exposeVariables()), to expose 'item' and 'status' correctly.
+ */
+
+ // Set up var variable
+
+ if (itemId != null) {
+ if (index == null)
+ pageContext.removeAttribute(itemId, PageContext.PAGE_SCOPE);
+ else if (_value != null) {
+ VariableMapper vm = pageContext.getELContext()
+ .getVariableMapper();
+ if (vm != null) {
+ ValueExpression ve = getVarExpression(_value);
+ vm.setVariable(itemId, ve);
+ }
+ } else
+ pageContext.setAttribute(itemId, index);
+ }
+
+ // Set up index variable
+
+ if (indexId != null) {
+ if (index == null)
+ pageContext.removeAttribute(indexId, PageContext.PAGE_SCOPE);
+ else {
+ IteratedIndexExpression indexExpression = new IteratedIndexExpression(
+ index);
+ VariableMapper vm = pageContext.getELContext()
+ .getVariableMapper();
+ if (vm != null) {
+ vm.setVariable(indexId, indexExpression);
+ }
+ pageContext.setAttribute(indexId, index);
+ }
+ }
+
+ }
+
+ /**
+ * Return expression for page variables
+ * @param expr
+ * @return
+ */
+ private ValueExpression getVarExpression(ValueExpression expr) {
+ Object o = expr.getValue(pageContext.getELContext());
+ if (o.getClass().isArray() || o instanceof List) {
+ return new IndexedValueExpression(_value, index);
+ }
+
+ if (o instanceof Collection || o instanceof Iterator
+ || o instanceof Enumeration || o instanceof Map
+ || o instanceof String) {
+
+ if (iteratedExpression == null) {
+ iteratedExpression = new IteratedExpression(_value, getDelims());
+ }
+ return new IteratedValueExpression(iteratedExpression, index);
+ }
+
+ throw new ELException("FOREACH_BAD_ITEMS");
+ }
+
+ /*
+ * Get the delimiter for string tokens. Used only for constructing the
+ * deferred expression for it.
+ */
+ protected String getDelims() {
+ return ",";
+ }
+
+ /**
+ * <p>
+ * Pop the top {@link UIComponentTag} instance off of our component tag
+ * stack, deleting the stack if this was the last entry.
+ * </p>
+ */
+ private void popUIComponentClassicTagBase() {
+ FacesContext context = FacesContext.getCurrentInstance();
+ Map<String, Object> requestMap = context.getExternalContext()
+ .getRequestMap();
+ List list = (List) requestMap.get(COMPONENT_TAG_STACK_ATTR);
+ if (list != null) {
+ list.remove(list.size() - 1);
+ if (list.size() < 1) {
+ requestMap.remove(COMPONENT_TAG_STACK_ATTR);
+ }
+ }
+
+ }
+
+ /**
+ * <p>
+ * Push the specified {@link UIComponentTag} instance onto our component tag
+ * stack, creating a stack if necessary.
+ * </p>
+ */
+ private void pushUIComponentClassicTagBase(UIComponentClassicTagBase tag) {
+ FacesContext context = FacesContext.getCurrentInstance();
+ Map<String, Object> requestMap = context.getExternalContext()
+ .getRequestMap();
+ List<UIComponentClassicTagBase> list = TypedCollections
+ .dynamicallyCastList((List) requestMap
+ .get(COMPONENT_TAG_STACK_ATTR),
+ UIComponentClassicTagBase.class);
+ if (list == null) {
+ // noinspection CollectionWithoutInitialCapacity
+ list = new ArrayList<UIComponentClassicTagBase>();
+ requestMap.put(COMPONENT_TAG_STACK_ATTR, list);
+ }
+ list.add(tag);
+
+ }
+
+ /**
+ * @return the end
+ */
+ public ValueExpression getEnd() {
+ return end;
+ }
+
+ /**
+ * @param end
+ * the end to set
+ */
+ public void setEnd(ValueExpression end) {
+ this.end = end;
+ }
+
+ /**
+ * @return the index
+ */
+ public ValueExpression getIndex() {
+ return _index;
+ }
+
+ /**
+ * @param index
+ * the index to set
+ */
+ public void setIndex(ValueExpression index) {
+ this._index = index;
+ }
+
+}
+
+class TypedCollections {
+
+ /**
+ * Dynamically check that the members of the collection are all instances of
+ * the given type (or null).
+ */
+ private static boolean checkCollectionMembers(Collection<?> c, Class<?> type) {
+ for (Object element : c) {
+ if (element != null && !type.isInstance(element)) {
+ return false;
+ }
+ }
+ return true;
+ }
+
+ /**
+ * Dynamically check that the members of the collection are all instances of
+ * the given type (or null), and that the collection itself is of the given
+ * collection type.
+ *
+ * @param <E>
+ * the collection's element type
+ * @param c
+ * the collection to cast
+ * @param type
+ * the class of the collection's element type.
+ * @return the dynamically-type checked collection.
+ * @throws java.lang.ClassCastException
+ */
+ @SuppressWarnings("unchecked")
+ static <E, TypedC extends Collection<E>> TypedC dynamicallyCastCollection(
+ Collection<?> c, Class<E> type, Class<TypedC> collectionType) {
+ if (c == null)
+ return null;
+ if (!collectionType.isInstance(c))
+ throw new ClassCastException(c.getClass().getName());
+ assert checkCollectionMembers(c, type) : "The collection contains members with a type other than "
+ + type.getName();
+
+ return collectionType.cast(c);
+ }
+
+ /**
+ * Dynamically check that the members of the list are all instances of the
+ * given type (or null).
+ *
+ * @param <E>
+ * the list's element type
+ * @param list
+ * the list to cast
+ * @param type
+ * the class of the list's element type.
+ * @return the dynamically-type checked list.
+ * @throws java.lang.ClassCastException
+ */
+ @SuppressWarnings("unchecked")
+ static <E> List<E> dynamicallyCastList(List<?> list, Class<E> type) {
+ return dynamicallyCastCollection(list, type, List.class);
+ }
+
+ /**
+ * Dynamically check that the members of the set are all instances of the
+ * given type (or null).
+ *
+ * @param <E>
+ * the set's element type
+ * @param set
+ * the set to cast
+ * @param type
+ * the class of the set's element type.
+ * @return the dynamically-type checked set.
+ * @throws java.lang.ClassCastException
+ */
+ @SuppressWarnings("unchecked")
+ static <E> Set<E> dynamicallyCastSet(Set<?> set, Class<E> type) {
+ return dynamicallyCastCollection(set, type, Set.class);
+ }
+
+ /**
+ * Dynamically check that the keys and values in the map are all instances
+ * of the correct types (or null).
+ *
+ * @param <K>
+ * the map's key type
+ * @param <V>
+ * the map's value type
+ * @param map
+ * the map to cast
+ * @param keyType
+ * the class of the map's key type.
+ * @param keyType
+ * the class of the map's key type.
+ * @return the dynamically-type checked map.
+ * @throws java.lang.ClassCastException
+ */
+ @SuppressWarnings("unchecked")
+ static <K, V> Map<K, V> dynamicallyCastMap(Map<?, ?> map, Class<K> keyType,
+ Class<V> valueType) {
+ if (map == null) {
+ return null;
+ }
+ assert checkCollectionMembers(map.keySet(), keyType) : "The map contains keys with a type other than "
+ + keyType.getName();
+ assert checkCollectionMembers(map.values(), valueType) : "The map contains values with a type other than "
+ + valueType.getName();
+
+ return (Map<K, V>) map;
+ }
+}
+
+/**
+ * @author Kin-man Chung
+ * @version $Id: IteratedExpression.java,v 1.3 2005/12/08 01:20:43 kchung Exp $
+ */
+final class IteratedExpression {
+
+ private static final long serialVersionUID = 1L;
+ protected final ValueExpression orig;
+ protected final String delims;
+
+ private Object base;
+ private int index;
+ private Iterator iter;
+
+ public IteratedExpression(ValueExpression orig, String delims) {
+ this.orig = orig;
+ this.delims = delims;
+ }
+
+ /**
+ * Evaluates the stored ValueExpression and return the indexed item.
+ *
+ * @param context
+ * The ELContext used to evaluate the ValueExpression
+ * @param i
+ * The index of the item to be retrieved
+ */
+ public Object getItem(ELContext context, int i) {
+
+ if (base == null) {
+ base = orig.getValue(context);
+ if (base == null) {
+ return null;
+ }
+ iter = toIterator(base);
+ index = 0;
+ }
+ if (index > i) {
+ // Restart from index 0
+ iter = toIterator(base);
+ index = 0;
+ }
+ while (iter.hasNext()) {
+ Object item = iter.next();
+ if (index++ == i) {
+ return item;
+ }
+ }
+ return null;
+ }
+
+ public ValueExpression getValueExpression() {
+ return orig;
+ }
+
+ private Iterator toIterator(final Object obj) {
+
+ Iterator iter;
+ if (obj instanceof String) {
+ iter = toIterator(new StringTokenizer((String) obj, delims));
+ } else if (obj instanceof Iterator) {
+ iter = (Iterator) obj;
+ } else if (obj instanceof Collection) {
+ iter = toIterator(((Collection) obj).iterator());
+ } else if (obj instanceof Enumeration) {
+ iter = toIterator((Enumeration) obj);
+ } else if (obj instanceof Map) {
+ iter = ((Map) obj).entrySet().iterator();
+ } else {
+ throw new ELException("Bad items");
+ }
+ return iter;
+ }
+
+ private Iterator toIterator(final Enumeration obj) {
+ return new Iterator() {
+ public boolean hasNext() {
+ return obj.hasMoreElements();
+ }
+
+ public Object next() {
+ return obj.nextElement();
+ }
+
+ public void remove() {
+ }
+ };
+ }
+}
+
+/**
+ * @author Kin-man Chung
+ * @version $Id: IteratedValueExpression.java,v 1.2 2005/12/08 01:20:43 kchung
+ * Exp $
+ */
+final class IteratedValueExpression extends ValueExpression {
+
+ private static final long serialVersionUID = 1L;
+ protected final int i;
+ protected final IteratedExpression iteratedExpression;
+
+ public IteratedValueExpression(IteratedExpression iteratedExpr, int i) {
+ this.i = i;
+ this.iteratedExpression = iteratedExpr;
+ }
+
+ public Object getValue(ELContext context) {
+ return iteratedExpression.getItem(context, i);
+ }
+
+ public void setValue(ELContext context, Object value) {
+ }
+
+ public boolean isReadOnly(ELContext context) {
+ return true;
+ }
+
+ public Class getType(ELContext context) {
+ return null;
+ }
+
+ public Class getExpectedType() {
+ return Object.class;
+ }
+
+ public String getExpressionString() {
+ return iteratedExpression.getValueExpression().getExpressionString();
+ }
+
+ public boolean equals(Object obj) {
+ return iteratedExpression.getValueExpression().equals(obj);
+ }
+
+ public int hashCode() {
+ return iteratedExpression.getValueExpression().hashCode();
+ }
+
+ public boolean isLiteralText() {
+ return false;
+ }
+}
+
+/**
+ * @author Andrey Markavtsov
+ * @version $Id: IteratedIndexExpression.java,v 1.2 2007/12/06 01:20:43
+ *
+ */
+final class IteratedIndexExpression extends ValueExpression {
+
+ private static final long serialVersionUID = 1L;
+ protected final Integer i;
+
+ public IteratedIndexExpression(int i) {
+ this.i = i;
+ }
+
+ public Object getValue(ELContext context) {
+ return i;
+ }
+
+ public void setValue(ELContext context, Object value) {
+ }
+
+ public boolean isReadOnly(ELContext context) {
+ return true;
+ }
+
+ public Class getType(ELContext context) {
+ return null;
+ }
+
+ public Class getExpectedType() {
+ return Object.class;
+ }
+
+ public String getExpressionString() {
+ return i.toString();
+ }
+
+ public boolean equals(Object obj) {
+ return i.equals(obj);
+ }
+
+ public int hashCode() {
+ return i.hashCode();
+ }
+
+ public boolean isLiteralText() {
+ return false;
+ }
+}
+
+/**
+ * @author Jacob Hookom
+ * @version $Id: IndexedValueExpression.java,v 1.3 2005/08/24 04:38:52 jhook Exp $
+ */
+final class IndexedValueExpression extends ValueExpression {
+
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+
+ private final Integer i;
+
+ private final ValueExpression orig;
+
+ /**
+ *
+ */
+ public IndexedValueExpression(ValueExpression orig, int i) {
+ this.i = new Integer(i);
+ this.orig = orig;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see javax.el.ValueExpression#getValue(javax.el.ELContext)
+ */
+ public Object getValue(ELContext context) {
+ Object base = this.orig.getValue(context);
+ if (base != null) {
+ context.setPropertyResolved(false);
+ return context.getELResolver().getValue(context, base, i);
+ }
+ return null;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see javax.el.ValueExpression#setValue(javax.el.ELContext,
+ * java.lang.Object)
+ */
+ public void setValue(ELContext context, Object value) {
+ Object base = this.orig.getValue(context);
+ if (base != null) {
+ context.setPropertyResolved(false);
+ context.getELResolver().setValue(context, base, i, value);
+ }
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see javax.el.ValueExpression#isReadOnly(javax.el.ELContext)
+ */
+ public boolean isReadOnly(ELContext context) {
+ Object base = this.orig.getValue(context);
+ if (base != null) {
+ context.setPropertyResolved(false);
+ return context.getELResolver().isReadOnly(context, base, i);
+ }
+ return true;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see javax.el.ValueExpression#getType(javax.el.ELContext)
+ */
+ public Class getType(ELContext context) {
+ Object base = this.orig.getValue(context);
+ if (base != null) {
+ context.setPropertyResolved(false);
+ return context.getELResolver().getType(context, base, i);
+ }
+ return null;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see javax.el.ValueExpression#getExpectedType()
+ */
+ public Class getExpectedType() {
+ return Object.class;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see javax.el.Expression#getExpressionString()
+ */
+ public String getExpressionString() {
+ return this.orig.getExpressionString();
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see javax.el.Expression#equals(java.lang.Object)
+ */
+ public boolean equals(Object obj) {
+ return this.orig.equals(obj);
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see javax.el.Expression#hashCode()
+ */
+ public int hashCode() {
+ return this.orig.hashCode();
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see javax.el.Expression#isLiteralText()
+ */
+ public boolean isLiteralText() {
+ return false;
+ }
+
+}
Added: trunk/sandbox/ui/columns/src/main/java/org/richfaces/taglib/html/facelets/ColumnsHandler.java
===================================================================
--- trunk/sandbox/ui/columns/src/main/java/org/richfaces/taglib/html/facelets/ColumnsHandler.java (rev 0)
+++ trunk/sandbox/ui/columns/src/main/java/org/richfaces/taglib/html/facelets/ColumnsHandler.java 2007-12-10 14:28:48 UTC (rev 4651)
@@ -0,0 +1,765 @@
+/*
+ * ColumnsHandler.java Date created: 07.12.2007
+ * Last modified by: $Author$
+ * $Revision$ $Date$
+ */
+
+package org.richfaces.taglib.html.facelets;
+
+import java.io.IOException;
+import java.util.Collection;
+import java.util.Enumeration;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.StringTokenizer;
+
+import javax.el.ELContext;
+import javax.el.ELException;
+import javax.el.ValueExpression;
+import javax.el.VariableMapper;
+import javax.faces.FacesException;
+import javax.faces.component.UIComponent;
+import javax.servlet.jsp.JspTagException;
+
+import org.richfaces.iterator.ForEachIterator;
+import org.richfaces.iterator.SimpleForEachIterator;
+
+import com.sun.facelets.FaceletContext;
+import com.sun.facelets.tag.TagAttribute;
+import com.sun.facelets.tag.jsf.ComponentConfig;
+import com.sun.facelets.tag.jsf.ComponentHandler;
+
+
+/**
+ * TODO Class description goes here.
+ *
+ * @author "Andrey Markavtsov"
+ *
+ */
+public class ColumnsHandler extends ComponentHandler {
+
+ /** value attribute */
+ private TagAttribute value;
+
+ /** end attribute */
+ private TagAttribute end;
+
+ /** var attribute */
+ private TagAttribute var;
+
+ /** index attribute */
+ private TagAttribute index;
+
+ /** colspan attribute */
+ private TagAttribute colspan;
+
+ /** rowspan attribute */
+ private TagAttribute rowspan;
+
+ /** breakBefore attribute */
+ private TagAttribute breakBefore;
+
+ /** headerClass attribute */
+ private TagAttribute headerClass;
+
+ /** footerClass attribute */
+ private TagAttribute footerClass;
+
+ /** width attribute */
+ private TagAttribute width;
+
+ /** sortable attribute */
+ private TagAttribute sortable;
+
+ /** sortExpression attribute */
+ private TagAttribute sortExpression;
+
+ /** style attribute */
+ private TagAttribute style;
+
+ /** styleClass attribute */
+ private TagAttribute styleClass;
+
+ /** rendered attribute */
+ private TagAttribute rendered;
+
+ /** Iterator for columns's tag value attribute */
+ protected ForEachIterator items; // our 'digested' items
+
+ /** Value attribute value */
+ protected Object rawItems; // our 'raw' items
+
+ /** Var attr - defines page variable for current item */
+ private String _indexId;
+
+ /** Integer value of end attr. */
+ private Integer _end;
+
+ /** String value of var attr */
+ private String _itemId = null;
+
+ /** Current column counter */
+ private Integer _index = 0;
+
+ /** Prepared flag */
+ private boolean prepared = false;
+
+ /** Variables counter */
+ private int vCounter;
+
+ /** Expression for var item */
+ private IteratedExpression iteratedExpression;
+
+ /**
+ * TODO Description goes here.
+ *
+ * @param config
+ */
+ public ColumnsHandler(ComponentConfig config) {
+ super(config);
+ this.breakBefore = getAttribute("breakBefore");
+ this.value = getAttribute("value");
+ this.var = getAttribute("var");
+ this.index = getAttribute("index");
+ this.rowspan = getAttribute("rowspan");
+ this.colspan = getAttribute("colspan");
+ this.headerClass = getAttribute("headerClass");
+ this.footerClass = getAttribute("footerClass");
+ this.width = getAttribute("width");
+ this.sortable = getAttribute("sortable");
+ this.sortExpression = getAttribute("sortExpression");
+ this.style = getAttribute("style");
+ this.styleClass = getAttribute("styleClass");
+
+ // TODO Auto-generated constructor stub
+ }
+
+ /**
+ * Extracts tags attributes values
+ */
+ private void initVariables(FaceletContext ctx) {
+ initEnd(ctx);
+ initIndex(ctx);
+ initVar(ctx);
+ }
+
+ /**
+ * Method prepares all we need for starting of tag rendering
+ *
+ * @throws JspTagException
+ */
+ private void prepare(FaceletContext ctx) {
+
+ initVariables(ctx);
+
+ try {
+
+ // produce the right sort of ForEachIterator
+ if (value != null) {
+ // If this is a deferred expression, make a note and get
+ // the 'items' instance.
+
+ rawItems = value.getObject(ctx);
+
+ // extract an iterator over the 'items' we've got
+ items = SimpleForEachIterator
+ .supportedTypeForEachIterator(rawItems);
+ } else {
+ // no 'items', so use 'begin' and 'end'
+ items = SimpleForEachIterator.beginEndForEachIterator(_end);
+ }
+ } catch (Exception e) {
+ // TODO: handle exception
+ }
+
+ if (hasNext()) {
+ exposeVariables(ctx, 0);
+ next(ctx);
+ }
+
+ }
+
+ /**
+ * Return true if we didn't complete column's count
+ *
+ * @return
+ * @throws JspTagException
+ */
+ private boolean hasNext() {
+ try {
+ return items.hasNext();
+ } catch (Exception e) {
+ return false;
+ }
+
+ }
+
+ /**
+ * Iterate to next column
+ *
+ * @return
+ * @throws JspTagException
+ */
+ private Object next(FaceletContext ctx) {
+ try {
+ Object o = items.next();
+ _index++;
+ return o;
+ } catch (Exception e) {
+ return null;
+ }
+ }
+
+ /**
+ * Extracts integer value from end attr
+ */
+ private void initEnd(FaceletContext ctx) {
+ if (end != null) {
+ try {
+ _end = (Integer) end.getObject(ctx);
+ if (_end < 0) {
+ _end = 0; // If end is negative set up zero
+ }
+ } catch (Exception e) {
+ _end = 0;
+ }
+ } else {
+ _end = 0;
+ }
+ }
+
+ /**
+ * Extracts string value from var attr
+ */
+ private void initVar(FaceletContext ctx) {
+ if (var != null) {
+ try {
+ _itemId = (String) var.getObject(ctx);
+ } catch (ClassCastException e) {
+ _itemId = null;
+ }
+
+ }
+ }
+
+ /**
+ * Extracts string value from index attr
+ */
+ private void initIndex(FaceletContext ctx) {
+ if (index != null) {
+ try {
+ _indexId = (String) index.getObject(ctx);
+ } catch (ClassCastException e) {
+ _indexId = null;
+ }
+
+ }
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see com.sun.facelets.tag.jsf.ComponentHandler#applyNextHandler(com.sun.facelets.FaceletContext,
+ * javax.faces.component.UIComponent)
+ */
+ @Override
+ protected void applyNextHandler(FaceletContext ctx, UIComponent c)
+ throws IOException, FacesException, ELException {
+ // TODO Auto-generated method stub
+ super.applyNextHandler(ctx, c);
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see com.sun.facelets.tag.jsf.ComponentHandler#onComponentCreated(com.sun.facelets.FaceletContext,
+ * javax.faces.component.UIComponent,
+ * javax.faces.component.UIComponent)
+ */
+ @Override
+ protected void onComponentCreated(FaceletContext ctx, UIComponent c,
+ UIComponent parent) {
+ // prepare if did not
+ if (!prepared) {
+ prepare(ctx);
+ prepared = true;
+ }
+
+ // for each
+ try {
+ if (hasNext()) {
+ next(ctx);
+ initColumn(ctx, c);
+ super.apply(ctx, parent);
+ } else {
+ vCounter = 1;
+ }
+ } catch (Exception e) {
+ // TODO: handle exception
+ }
+ }
+
+ /**
+ * Sets page request variables
+ *
+ * @throws JspTagException
+ */
+ private void exposeVariables(FaceletContext ctx, int k) {
+
+
+ VariableMapper vm = ctx.getVariableMapper();
+
+ if (_itemId != null) {
+ if (vm != null) {
+ ValueExpression srcVE = value.getValueExpression(ctx,
+ Object.class);
+ ValueExpression ve = getVarExpression(ctx, srcVE, k);
+ vm.setVariable(_itemId, ve);
+ }
+
+ }
+
+ // Set up index variable
+
+ if (_indexId != null) {
+ if (vm != null) {
+ ValueExpression ve = new IteratedIndexExpression(k);
+ vm.setVariable(_indexId, ve);
+ }
+
+ }
+
+ }
+
+ /**
+ * Return expression for page variables
+ *
+ * @param expr
+ * @return
+ */
+ private ValueExpression getVarExpression(FaceletContext ctx,
+ ValueExpression expr, int k) {
+ Object o = expr.getValue(ctx.getFacesContext().getELContext());
+ if (o.getClass().isArray() || o instanceof List) {
+ return new IndexedValueExpression(expr, k);
+ }
+
+ if (o instanceof Collection || o instanceof Iterator
+ || o instanceof Enumeration || o instanceof Map
+ || o instanceof String) {
+
+ if (iteratedExpression == null) {
+ iteratedExpression = new IteratedExpression(expr, ",");
+ }
+ return new IteratedValueExpression(iteratedExpression, k);
+ }
+
+ throw new ELException("FOREACH_BAD_ITEMS");
+ }
+
+ /**
+ * Returns true if this is the first loop of columns tag
+ *
+ * @return
+ */
+ private boolean atFirst() {
+ return (_index == 0);
+ }
+
+ /**
+ * Release iteration variables
+ */
+ private void release() {
+ this.items = null;
+ this._index = 0;
+ this.prepared = false;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see com.sun.facelets.tag.jsf.ComponentHandler#onComponentPopulated(com.sun.facelets.FaceletContext,
+ * javax.faces.component.UIComponent,
+ * javax.faces.component.UIComponent)
+ */
+ @Override
+ protected void onComponentPopulated(FaceletContext ctx, UIComponent c,
+ UIComponent parent) {
+
+ // remove created component if columns count is zero
+ if (atFirst()) {
+ c.setRendered(false);
+ }
+
+ if (vCounter == _index || atFirst()) {
+ release();
+ return;
+ }
+
+ exposeVariables(ctx, vCounter);
+ vCounter++;
+
+
+ }
+
+ /**
+ * Inits created column by this tag attributes
+ *
+ * @param ctx
+ * @param column
+ */
+ private void initColumn(FaceletContext ctx, UIComponent column) {
+ setColumnAttribute(width, column, ctx);
+ setColumnAttribute(colspan, column, ctx);
+ setColumnAttribute(rowspan, column, ctx);
+ setColumnAttribute(style, column, ctx);
+ setColumnAttribute(styleClass, column, ctx);
+ setColumnAttribute(breakBefore, column, ctx);
+ setColumnAttribute(headerClass, column, ctx);
+ setColumnAttribute(footerClass, column, ctx);
+ setColumnAttribute(sortable, column, ctx);
+ setColumnAttribute(sortExpression, column, ctx);
+ setColumnAttribute(rendered, column, ctx);
+
+ }
+
+ /**
+ * Sets attribute to column
+ *
+ * @param attr
+ * @param column
+ * @param ctx
+ */
+ private void setColumnAttribute(TagAttribute attr, UIComponent column,
+ FaceletContext ctx) {
+ if (attr != null) {
+ if (attr.isLiteral()) {
+ column.setValueExpression(attr.getLocalName(), attr
+ .getValueExpression(ctx, String.class));
+ } else {
+ column.setValueExpression(attr.getLocalName(), attr
+ .getValueExpression(ctx, ValueExpression.class));
+ }
+ }
+ }
+
+}
+
+/**
+ * @author Kin-man Chung
+ * @version $Id: IteratedExpression.java,v 1.3 2005/12/08 01:20:43 kchung Exp $
+ */
+final class IteratedExpression {
+
+ private static final long serialVersionUID = 1L;
+ protected final ValueExpression orig;
+ protected final String delims;
+
+ private Object base;
+ private int index;
+ private Iterator iter;
+
+ public IteratedExpression(ValueExpression orig, String delims) {
+ this.orig = orig;
+ this.delims = delims;
+ }
+
+ /**
+ * Evaluates the stored ValueExpression and return the indexed item.
+ *
+ * @param context
+ * The ELContext used to evaluate the ValueExpression
+ * @param i
+ * The index of the item to be retrieved
+ */
+ public Object getItem(ELContext context, int i) {
+
+ if (base == null) {
+ base = orig.getValue(context);
+ if (base == null) {
+ return null;
+ }
+ iter = toIterator(base);
+ index = 0;
+ }
+ if (index > i) {
+ // Restart from index 0
+ iter = toIterator(base);
+ index = 0;
+ }
+ while (iter.hasNext()) {
+ Object item = iter.next();
+ if (index++ == i) {
+ return item;
+ }
+ }
+ return null;
+ }
+
+ public ValueExpression getValueExpression() {
+ return orig;
+ }
+
+ private Iterator toIterator(final Object obj) {
+
+ Iterator iter;
+ if (obj instanceof String) {
+ iter = toIterator(new StringTokenizer((String) obj, delims));
+ } else if (obj instanceof Iterator) {
+ iter = (Iterator) obj;
+ } else if (obj instanceof Collection) {
+ iter = toIterator(((Collection) obj).iterator());
+ } else if (obj instanceof Enumeration) {
+ iter = toIterator((Enumeration) obj);
+ } else if (obj instanceof Map) {
+ iter = ((Map) obj).entrySet().iterator();
+ } else {
+ throw new ELException("Bad items");
+ }
+ return iter;
+ }
+
+ private Iterator toIterator(final Enumeration obj) {
+ return new Iterator() {
+ public boolean hasNext() {
+ return obj.hasMoreElements();
+ }
+
+ public Object next() {
+ return obj.nextElement();
+ }
+
+ public void remove() {
+ }
+ };
+ }
+}
+
+/**
+ * @author Kin-man Chung
+ * @version $Id: IteratedValueExpression.java,v 1.2 2005/12/08 01:20:43 kchung
+ * Exp $
+ */
+final class IteratedValueExpression extends ValueExpression {
+
+ private static final long serialVersionUID = 1L;
+ protected final int i;
+ protected final IteratedExpression iteratedExpression;
+
+ public IteratedValueExpression(IteratedExpression iteratedExpr, int i) {
+ this.i = i;
+ this.iteratedExpression = iteratedExpr;
+ }
+
+ public Object getValue(ELContext context) {
+ return iteratedExpression.getItem(context, i);
+ }
+
+ public void setValue(ELContext context, Object value) {
+ }
+
+ public boolean isReadOnly(ELContext context) {
+ return true;
+ }
+
+ public Class getType(ELContext context) {
+ return null;
+ }
+
+ public Class getExpectedType() {
+ return Object.class;
+ }
+
+ public String getExpressionString() {
+ return iteratedExpression.getValueExpression().getExpressionString();
+ }
+
+ public boolean equals(Object obj) {
+ return iteratedExpression.getValueExpression().equals(obj);
+ }
+
+ public int hashCode() {
+ return iteratedExpression.getValueExpression().hashCode();
+ }
+
+ public boolean isLiteralText() {
+ return false;
+ }
+}
+
+/**
+ * @author Andrey Markavtsov
+ * @version $Id: IteratedIndexExpression.java,v 1.2 2007/12/06 01:20:43
+ *
+ */
+final class IteratedIndexExpression extends ValueExpression {
+
+ private static final long serialVersionUID = 1L;
+ protected final Integer i;
+
+ public IteratedIndexExpression(int i) {
+ this.i = i;
+ }
+
+ public Object getValue(ELContext context) {
+ return i;
+ }
+
+ public void setValue(ELContext context, Object value) {
+ }
+
+ public boolean isReadOnly(ELContext context) {
+ return true;
+ }
+
+ public Class getType(ELContext context) {
+ return null;
+ }
+
+ public Class getExpectedType() {
+ return Object.class;
+ }
+
+ public String getExpressionString() {
+ return i.toString();
+ }
+
+ public boolean equals(Object obj) {
+ return i.equals(obj);
+ }
+
+ public int hashCode() {
+ return i.hashCode();
+ }
+
+ public boolean isLiteralText() {
+ return false;
+ }
+}
+
+/**
+ * @author Jacob Hookom
+ * @version $Id: IndexedValueExpression.java,v 1.3 2005/08/24 04:38:52 jhook Exp $
+ */
+final class IndexedValueExpression extends ValueExpression {
+
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+
+ private final Integer i;
+
+ private final ValueExpression orig;
+
+ /**
+ *
+ */
+ public IndexedValueExpression(ValueExpression orig, int i) {
+ this.i = new Integer(i);
+ this.orig = orig;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see javax.el.ValueExpression#getValue(javax.el.ELContext)
+ */
+ public Object getValue(ELContext context) {
+ Object base = this.orig.getValue(context);
+ if (base != null) {
+ context.setPropertyResolved(false);
+ return context.getELResolver().getValue(context, base, i);
+ }
+ return null;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see javax.el.ValueExpression#setValue(javax.el.ELContext,
+ * java.lang.Object)
+ */
+ public void setValue(ELContext context, Object value) {
+ Object base = this.orig.getValue(context);
+ if (base != null) {
+ context.setPropertyResolved(false);
+ context.getELResolver().setValue(context, base, i, value);
+ }
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see javax.el.ValueExpression#isReadOnly(javax.el.ELContext)
+ */
+ public boolean isReadOnly(ELContext context) {
+ Object base = this.orig.getValue(context);
+ if (base != null) {
+ context.setPropertyResolved(false);
+ return context.getELResolver().isReadOnly(context, base, i);
+ }
+ return true;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see javax.el.ValueExpression#getType(javax.el.ELContext)
+ */
+ public Class getType(ELContext context) {
+ Object base = this.orig.getValue(context);
+ if (base != null) {
+ context.setPropertyResolved(false);
+ return context.getELResolver().getType(context, base, i);
+ }
+ return null;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see javax.el.ValueExpression#getExpectedType()
+ */
+ public Class getExpectedType() {
+ return Object.class;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see javax.el.Expression#getExpressionString()
+ */
+ public String getExpressionString() {
+ return this.orig.getExpressionString();
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see javax.el.Expression#equals(java.lang.Object)
+ */
+ public boolean equals(Object obj) {
+ return this.orig.equals(obj);
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see javax.el.Expression#hashCode()
+ */
+ public int hashCode() {
+ return this.orig.hashCode();
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see javax.el.Expression#isLiteralText()
+ */
+ public boolean isLiteralText() {
+ return false;
+ }
+
+}
16 years, 10 months
JBoss Rich Faces SVN: r4650 - in branches/3.1.x/samples/richfaces-demo/src/main: java/org/richfaces/demo/listShuttle and 5 other directories.
by richfaces-svn-commits@lists.jboss.org
Author: ilya_shaikovsky
Date: 2007-12-10 09:21:32 -0500 (Mon, 10 Dec 2007)
New Revision: 4650
Added:
branches/3.1.x/samples/richfaces-demo/src/main/java/org/richfaces/demo/listShuttle/
branches/3.1.x/samples/richfaces-demo/src/main/java/org/richfaces/demo/listShuttle/ToolBar.java
branches/3.1.x/samples/richfaces-demo/src/main/java/org/richfaces/demo/listShuttle/ToolBarItem.java
branches/3.1.x/samples/richfaces-demo/src/main/webapp/richfaces/listShuttle.xhtml
branches/3.1.x/samples/richfaces-demo/src/main/webapp/richfaces/listShuttle/
branches/3.1.x/samples/richfaces-demo/src/main/webapp/richfaces/listShuttle/examples/
branches/3.1.x/samples/richfaces-demo/src/main/webapp/richfaces/listShuttle/examples/toolBarCustomization.xhtml
branches/3.1.x/samples/richfaces-demo/src/main/webapp/richfaces/listShuttle/listShuttle.xhtml
Modified:
branches/3.1.x/samples/richfaces-demo/src/main/resources/org/richfaces/demo/common/components.properties
branches/3.1.x/samples/richfaces-demo/src/main/webapp/WEB-INF/faces-config.xml
Log:
List Shuttle sample added.
Added: branches/3.1.x/samples/richfaces-demo/src/main/java/org/richfaces/demo/listShuttle/ToolBar.java
===================================================================
--- branches/3.1.x/samples/richfaces-demo/src/main/java/org/richfaces/demo/listShuttle/ToolBar.java (rev 0)
+++ branches/3.1.x/samples/richfaces-demo/src/main/java/org/richfaces/demo/listShuttle/ToolBar.java 2007-12-10 14:21:32 UTC (rev 4650)
@@ -0,0 +1,38 @@
+package org.richfaces.demo.listShuttle;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class ToolBar {
+ private List<ToolBarItem> items = new ArrayList<ToolBarItem>();
+ private List<ToolBarItem> freeItems = new ArrayList<ToolBarItem>();
+ public ToolBar() {
+ ToolBarItem item = new ToolBarItem();
+ item.setType("label");
+ item.setLabel("New");
+ items.add(item);
+ item = new ToolBarItem();
+ item.setType("label");
+ item.setLabel("Save");
+ items.add(item);
+ item = new ToolBarItem();
+ item.setType("label");
+ item.setLabel("Close");
+ items.add(item);
+ }
+
+ public List<ToolBarItem> getItems() {
+ return items;
+ }
+ public void setItems(List<ToolBarItem> items) {
+ this.items = items;
+ }
+
+ public List<ToolBarItem> getFreeItems() {
+ return freeItems;
+ }
+
+ public void setFreeItems(List<ToolBarItem> freeItems) {
+ this.freeItems = freeItems;
+ }
+}
Added: branches/3.1.x/samples/richfaces-demo/src/main/java/org/richfaces/demo/listShuttle/ToolBarItem.java
===================================================================
--- branches/3.1.x/samples/richfaces-demo/src/main/java/org/richfaces/demo/listShuttle/ToolBarItem.java (rev 0)
+++ branches/3.1.x/samples/richfaces-demo/src/main/java/org/richfaces/demo/listShuttle/ToolBarItem.java 2007-12-10 14:21:32 UTC (rev 4650)
@@ -0,0 +1,25 @@
+package org.richfaces.demo.listShuttle;
+
+public class ToolBarItem {
+private String type;
+private String label;
+private String icon;
+public String getType() {
+ return type;
+}
+public void setType(String type) {
+ this.type = type;
+}
+public String getLabel() {
+ return label;
+}
+public void setLabel(String label) {
+ this.label = label;
+}
+public String getIcon() {
+ return icon;
+}
+public void setIcon(String icon) {
+ this.icon = icon;
+}
+}
Modified: branches/3.1.x/samples/richfaces-demo/src/main/resources/org/richfaces/demo/common/components.properties
===================================================================
--- branches/3.1.x/samples/richfaces-demo/src/main/resources/org/richfaces/demo/common/components.properties 2007-12-10 13:30:12 UTC (rev 4649)
+++ branches/3.1.x/samples/richfaces-demo/src/main/resources/org/richfaces/demo/common/components.properties 2007-12-10 14:21:32 UTC (rev 4650)
@@ -70,4 +70,5 @@
effect= richMisc, Effect, /images/ico_common.gif, /images/cn_Effect.gif, RichFacesComponentsLibrary.html#effect, jbossrichfaces/freezone/docs/tlddoc/rich/effect.html, jbossrichfaces/freezone/docs/apidoc/org/richfaces/component/UIEffect.html, /richfaces/effect.jsf
contextMenu= richMenu, Context Menu, /images/ico_dropDownMenu.gif, /images/cn_contextMenu.gif, RichFacesComponentsLibrary.html\#contextMenu, jbossrichfaces/freezone/docs/tlddoc/rich/contextMenu.html, jbossrichfaces/freezone/docs/apidoc/org/richfaces/component/UIContextMenu.html, /richfaces/contextMenu.jsf
componentControl= richMisc, Component Control, /images/ico_common.gif, /images/cn_componentControl.gif, RichFacesComponentsLibrary.html\#componentControl, jbossrichfaces/freezone/docs/tlddoc/rich/componentControl.html, jbossrichfaces/freezone/docs/apidoc/org/richfaces/component/UIcomponentControl.html, /richfaces/componentControl.jsf
-orderingList= richSelect, Ordering List, /images/ico_DataTable.gif, /images/cn_orderingList.gif, RichFacesComponentsLibrary.html\#orderingList, jbossrichfaces/freezone/docs/tlddoc/rich/orderingList.html, jbossrichfaces/freezone/docs/apidoc/org/richfaces/component/UIorderingList.html, /richfaces/orderingList.jsf
\ No newline at end of file
+orderingList= richSelect, Ordering List, /images/ico_DataTable.gif, /images/cn_orderingList.gif, RichFacesComponentsLibrary.html\#orderingList, jbossrichfaces/freezone/docs/tlddoc/rich/orderingList.html, jbossrichfaces/freezone/docs/apidoc/org/richfaces/component/UIorderingList.html, /richfaces/orderingList.jsf
+listShuttle= richSelect, List Shuttle, /images/ico_DataTable.gif, /images/cn_listShuttle.gif, RichFacesComponentsLibrary.html\#listShuttle, jbossrichfaces/freezone/docs/tlddoc/rich/listShuttle.html, jbossrichfaces/freezone/docs/apidoc/org/richfaces/component/UIlistShuttle.html, /richfaces/listShuttle.jsf
\ No newline at end of file
Modified: branches/3.1.x/samples/richfaces-demo/src/main/webapp/WEB-INF/faces-config.xml
===================================================================
--- branches/3.1.x/samples/richfaces-demo/src/main/webapp/WEB-INF/faces-config.xml 2007-12-10 13:30:12 UTC (rev 4649)
+++ branches/3.1.x/samples/richfaces-demo/src/main/webapp/WEB-INF/faces-config.xml 2007-12-10 14:21:32 UTC (rev 4650)
@@ -158,18 +158,18 @@
<property-class>java.lang.String</property-class>
<value>Paint 2D</value>
</managed-property>
- </managed-bean>
- <managed-bean>
- <managed-bean-name>treeDemoStateAdvisor</managed-bean-name>
- <managed-bean-class>org.richfaces.treemodeladaptor.TreeDemoStateAdvisor</managed-bean-class>
- <managed-bean-scope>application</managed-bean-scope>
- </managed-bean>
- <managed-bean>
- <managed-bean-name>fileSystemBean</managed-bean-name>
- <managed-bean-class>org.richfaces.treemodeladaptor.FileSystemBean</managed-bean-class>
- <managed-bean-scope>application</managed-bean-scope>
- </managed-bean>
+ </managed-bean>
<managed-bean>
+ <managed-bean-name>treeDemoStateAdvisor</managed-bean-name>
+ <managed-bean-class>org.richfaces.treemodeladaptor.TreeDemoStateAdvisor</managed-bean-class>
+ <managed-bean-scope>application</managed-bean-scope>
+ </managed-bean>
+ <managed-bean>
+ <managed-bean-name>fileSystemBean</managed-bean-name>
+ <managed-bean-class>org.richfaces.treemodeladaptor.FileSystemBean</managed-bean-class>
+ <managed-bean-scope>application</managed-bean-scope>
+ </managed-bean>
+ <managed-bean>
<managed-bean-name>simpleTreeBean</managed-bean-name>
<managed-bean-class>org.richfaces.demo.tree.SimpleTreeBean</managed-bean-class>
<managed-bean-scope>session</managed-bean-scope>
@@ -259,6 +259,11 @@
<value>true</value>
</managed-property>
</managed-bean>
+ <managed-bean>
+ <managed-bean-name>toolBar</managed-bean-name>
+ <managed-bean-class>org.richfaces.demo.listShuttle.ToolBar</managed-bean-class>
+ <managed-bean-scope>session</managed-bean-scope>
+ </managed-bean>
<navigation-rule>
<from-view-id>/richfaces/include/examples/wstep1.xhtml</from-view-id>
<navigation-case>
@@ -283,8 +288,8 @@
<from-outcome>previous</from-outcome>
<to-view-id>/richfaces/include/examples/wstep2.xhtml</to-view-id>
</navigation-case>
- </navigation-rule>
- <lifecycle>
- <phase-listener>org.richfaces.treemodeladaptor.PostbackPhaseListener</phase-listener>
- </lifecycle>
+ </navigation-rule>
+ <lifecycle>
+ <phase-listener>org.richfaces.treemodeladaptor.PostbackPhaseListener</phase-listener>
+ </lifecycle>
</faces-config>
Added: branches/3.1.x/samples/richfaces-demo/src/main/webapp/richfaces/listShuttle/examples/toolBarCustomization.xhtml
===================================================================
--- branches/3.1.x/samples/richfaces-demo/src/main/webapp/richfaces/listShuttle/examples/toolBarCustomization.xhtml (rev 0)
+++ branches/3.1.x/samples/richfaces-demo/src/main/webapp/richfaces/listShuttle/examples/toolBarCustomization.xhtml 2007-12-10 14:21:32 UTC (rev 4650)
@@ -0,0 +1,30 @@
+<ui:composition xmlns="http://www.w3.org/1999/xhtml"
+ xmlns:ui="http://java.sun.com/jsf/facelets"
+ xmlns:h="http://java.sun.com/jsf/html"
+ xmlns:f="http://java.sun.com/jsf/core"
+ xmlns:a4j="http://richfaces.org/a4j"
+ xmlns:rich="http://richfaces.org/rich"
+ xmlns:c="http://java.sun.com/jstl/core">
+ <h:form>
+ <rich:toolBar id="toolBar">
+ <c:forEach items="#{toolBar.items}" var="item">
+ <h:outputLink value="#">
+ <h:outputText value="#{item.label}"></h:outputText>
+ </h:outputLink>
+ </c:forEach>
+ </rich:toolBar>
+
+ <rich:spacer height="20"></rich:spacer>
+
+ <rich:listShuttle sourceValue="#{toolBar.freeItems}" targetValue="#{toolBar.items}" var="items" listHeight="300px">
+ <rich:column>
+ <h:outputText value="#{items.label}"></h:outputText>
+ </rich:column>
+ </rich:listShuttle>
+
+ <rich:spacer height="20"></rich:spacer>
+
+ <h:commandButton value="Update Toolbar" reRender="toolBar"/>
+
+ </h:form>
+</ui:composition>
\ No newline at end of file
Added: branches/3.1.x/samples/richfaces-demo/src/main/webapp/richfaces/listShuttle/listShuttle.xhtml
===================================================================
--- branches/3.1.x/samples/richfaces-demo/src/main/webapp/richfaces/listShuttle/listShuttle.xhtml (rev 0)
+++ branches/3.1.x/samples/richfaces-demo/src/main/webapp/richfaces/listShuttle/listShuttle.xhtml 2007-12-10 14:21:32 UTC (rev 4650)
@@ -0,0 +1,44 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml"
+ xmlns:ui="http://java.sun.com/jsf/facelets"
+ xmlns:h="http://java.sun.com/jsf/html"
+ xmlns:f="http://java.sun.com/jsf/core"
+ xmlns:a4j="http://richfaces.org/a4j"
+ xmlns:rich="http://richfaces.org/rich">
+ <ui:composition template="/templates/component-sample.xhtml">
+ <ui:define name="sample">
+ <p>
+ <b>listShuttle</b> component allows to select items using two lists with move controls and reorder items in result list.
+ </p>
+ <p>
+ List Shuttle could contain several columns in list representation. And it
+ also has strong keyboard support out of the box.
+ </p>
+ <p><b>Example.</b>Customize simple application toolbar using List Shuttle </p>
+ <div class="sample-container">
+ <ui:include src="/richfaces/listShuttle/examples/toolBarCustomization.xhtml"/>
+ <ui:include src="/templates/include/sourceview.xhtml">
+ <ui:param name="sourcepath" value="/richfaces/listShuttle/examples/toolBarCustomization.xhtml"/>
+ </ui:include>
+
+ </div>
+ <p>
+ In this example you may select items and their order within the toolBar
+ </p>
+
+ <p>
+ Content definition for this component - analogous to any Iteration component.
+ So, all you need is define collection in List Shuttle <b>sourceValue</b> attribute
+ and iterate the collection in nested columns through <b>var</b> attribute.
+ </p>
+ <p>
+ Result items will be stored under the collection defined in <b>targetValue</b> attribute.
+ </p>
+ <p>
+ In order to set initially selected rows or to process submitted selection -
+ use <b>sourceSelection</b> and <b>targetSelection</b> attributes.
+ </p>
+ </ui:define>
+
+ </ui:composition>
+</html>
Added: branches/3.1.x/samples/richfaces-demo/src/main/webapp/richfaces/listShuttle.xhtml
===================================================================
--- branches/3.1.x/samples/richfaces-demo/src/main/webapp/richfaces/listShuttle.xhtml (rev 0)
+++ branches/3.1.x/samples/richfaces-demo/src/main/webapp/richfaces/listShuttle.xhtml 2007-12-10 14:21:32 UTC (rev 4650)
@@ -0,0 +1,20 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml"
+ xmlns:ui="http://java.sun.com/jsf/facelets"
+ xmlns:h="http://java.sun.com/jsf/html"
+ xmlns:f="http://java.sun.com/jsf/core"
+ xmlns:rich="http://richfaces.org/rich">
+<ui:composition template="/templates/main.xhtml">
+ <ui:define name="title">RichFaces - Open Source Rich JSF Components - Ordering List Component</ui:define>
+ <ui:define name="body">
+ <rich:tabPanel switchType="server" styleClass="top_tab" contentClass="content_tab" headerClass="header_tabs_class" inactiveTabClass="inactive_tab" activeTabClass="active_tab">
+ <rich:tab label="Usage">
+ <ui:include src="/richfaces/listShuttle/listShuttle.xhtml"/>
+ </rich:tab>
+ <ui:include src="/templates/include/tagInfo.xhtml">
+ <ui:param name="path" value="rich/listShuttle"/>
+ </ui:include>
+ </rich:tabPanel>
+ </ui:define>
+</ui:composition>
+</html>
16 years, 10 months
JBoss Rich Faces SVN: r4649 - branches/3.1.x/docs/userguide/en/src/main/docbook/included.
by richfaces-svn-commits@lists.jboss.org
Author: artdaw
Date: 2007-12-10 08:30:12 -0500 (Mon, 10 Dec 2007)
New Revision: 4649
Modified:
branches/3.1.x/docs/userguide/en/src/main/docbook/included/contextMenu.xml
Log:
http://jira.jboss.com/jira/browse/RF-1298 - review component
Modified: branches/3.1.x/docs/userguide/en/src/main/docbook/included/contextMenu.xml
===================================================================
--- branches/3.1.x/docs/userguide/en/src/main/docbook/included/contextMenu.xml 2007-12-10 13:25:06 UTC (rev 4648)
+++ branches/3.1.x/docs/userguide/en/src/main/docbook/included/contextMenu.xml 2007-12-10 13:30:12 UTC (rev 4649)
@@ -171,9 +171,9 @@
</emphasis> component doesn't provide its own form, use it between
<h:form> and </h:form> tags.</note>
- <para><emphasis><property><link linkend="menuGroup"><rich:menuGroup></link></property></emphasis>,
- <emphasis><property><link linkend="menuItem"><rich:menuItem></link></property></emphasis>
- and <emphasis><property><link linkend="menuSeparator"><rich:menuSeparator></link></property></emphasis>
+ <para><property><link linkend="menuGroup"><rich:menuGroup></link></property>,
+ <property><link linkend="menuItem"><rich:menuItem></link></property>
+ and <property><link linkend="menuSeparator"><rich:menuSeparator></link></property>
components is used as nested elements for <emphasis role="bold"><property><rich:contextMenu></property></emphasis>.
</para>
16 years, 10 months
JBoss Rich Faces SVN: r4648 - branches/3.1.x/docs/userguide/en/src/main/docbook/included.
by richfaces-svn-commits@lists.jboss.org
Author: artdaw
Date: 2007-12-10 08:25:06 -0500 (Mon, 10 Dec 2007)
New Revision: 4648
Modified:
branches/3.1.x/docs/userguide/en/src/main/docbook/included/contextMenu.xml
Log:
http://jira.jboss.com/jira/browse/RF-1298 - review component
Modified: branches/3.1.x/docs/userguide/en/src/main/docbook/included/contextMenu.xml
===================================================================
--- branches/3.1.x/docs/userguide/en/src/main/docbook/included/contextMenu.xml 2007-12-10 13:13:35 UTC (rev 4647)
+++ branches/3.1.x/docs/userguide/en/src/main/docbook/included/contextMenu.xml 2007-12-10 13:25:06 UTC (rev 4648)
@@ -64,7 +64,6 @@
HtmlContextMenu myContextMenu = new HtmlContextMenu();
...]]></programlisting>
</section>
-
<section>
<title>Details of Usage</title>
<para>
@@ -132,7 +131,7 @@
that triggers the menu's appearance (<property>oncontextmenu</property> by default).
</para>
<para>The <emphasis role="bold">
- <property><rich:contexMenu></property>
+ <property><rich:contextMenu></property>
</emphasis>
<emphasis>
<property>"submitMode"</property>
@@ -168,14 +167,14 @@
The behavior is fully defined by the components nested inside items.</para>
<note><title>Note:</title> As the <emphasis role="bold">
- <property><rich:contexMenu></property>
+ <property><rich:contextMenu></property>
</emphasis> component doesn't provide its own form, use it between
<h:form> and </h:form> tags.</note>
<para><emphasis><property><link linkend="menuGroup"><rich:menuGroup></link></property></emphasis>,
<emphasis><property><link linkend="menuItem"><rich:menuItem></link></property></emphasis>
and <emphasis><property><link linkend="menuSeparator"><rich:menuSeparator></link></property></emphasis>
- components is used as nested elements for <emphasis role="bold"><property><rich:contexMenu></property></emphasis>.
+ components is used as nested elements for <emphasis role="bold"><property><rich:contextMenu></property></emphasis>.
</para>
<!-- Will be done for latest version -->
16 years, 10 months
JBoss Rich Faces SVN: r4647 - branches/3.1.x/docs/userguide/en/src/main/resources/images.
by richfaces-svn-commits@lists.jboss.org
Author: artdaw
Date: 2007-12-10 08:13:35 -0500 (Mon, 10 Dec 2007)
New Revision: 4647
Added:
branches/3.1.x/docs/userguide/en/src/main/resources/images/contextMenu_attached.png
Log:
http://jira.jboss.com/jira/browse/RF-1298 - screenshot for 'attached' attribute
Added: branches/3.1.x/docs/userguide/en/src/main/resources/images/contextMenu_attached.png
===================================================================
(Binary files differ)
Property changes on: branches/3.1.x/docs/userguide/en/src/main/resources/images/contextMenu_attached.png
___________________________________________________________________
Name: svn:mime-type
+ application/octet-stream
16 years, 10 months
JBoss Rich Faces SVN: r4646 - branches/3.1.x/docs/userguide/en/src/main/docbook/included.
by richfaces-svn-commits@lists.jboss.org
Author: artdaw
Date: 2007-12-10 08:12:21 -0500 (Mon, 10 Dec 2007)
New Revision: 4646
Modified:
branches/3.1.x/docs/userguide/en/src/main/docbook/included/contextMenu.xml
Log:
http://jira.jboss.com/jira/browse/RF-1298 - add 'attached', 'event' attributes, add examples and screenshot
Modified: branches/3.1.x/docs/userguide/en/src/main/docbook/included/contextMenu.xml
===================================================================
--- branches/3.1.x/docs/userguide/en/src/main/docbook/included/contextMenu.xml 2007-12-10 12:01:41 UTC (rev 4645)
+++ branches/3.1.x/docs/userguide/en/src/main/docbook/included/contextMenu.xml 2007-12-10 13:12:21 UTC (rev 4646)
@@ -46,9 +46,12 @@
<emphasis role="bold">Example:</emphasis>
</para>
<programlisting role="XML"><![CDATA[...
-<rich:contextMenu value="Menu1">
- <!--Nested menu components-->
-</rich:contextMenu>
+<h:panelGroup id="MyGroup">
+ <!-- Panel Content-->
+ <rich:contextMenu id="Menu1">
+ <!--Nested menu components-->
+ </rich:contextMenu>
+</h:panelGroup>
...]]></programlisting>
</section>
<section>
@@ -64,20 +67,75 @@
<section>
<title>Details of Usage</title>
- <para>All attributes except <emphasis>
- <property>"value"</property>
- </emphasis> are optional. The <emphasis>
- <property>"value"</property>
- </emphasis> attribute defines text to be represented. For the same purpose you can also
- use the <emphasis>
- <property>"label"</property>
- </emphasis> facet.</para>
-
+ <para>
+ <emphasis role="bold">
+ <property><rich:contexMenu></property>
+ </emphasis> is a support-like component. It is possible to define it as a child to some component
+ and specify some events that trigger the menu.
+ </para>
+ <para>
+ The <emphasis><property>"attached"</property></emphasis> attribute defines the state of the component.
+ If the value of the <emphasis><property>"attached"</property></emphasis> attribute is true,
+ component is attached to parent component.
+ </para>
+ <para>
+ <emphasis role="bold">Example:</emphasis>
+ </para>
+ <programlisting role="XML"><![CDATA[...
+<rich:dataTable id="table" value="#{bean.model}" var="row" rows="5">
+ <rich:column>
+ <f:facet name="header">
+ <h:outputText value="Packages" />
+ </f:facet>
+ <h:outputText value="#{row.first}" />
+ <rich:contextMenu id="Menu1" attached="true">
+ <rich:menuItem value="Edit package" action="#{bean.create}" />
+ <rich:menuItem value="Delete package" action="#{bean.edit}" />
+ </rich:contextMenu>
+ </rich:column>
+</rich:dataTable>
+...]]></programlisting>
+ <para>
+ If the value of the <emphasis><property>"attached"</property></emphasis> attribute is false,
+ component activates by JavaScript API or with assistance of <emphasis role="bold"><property><rich:componentControl></property></emphasis>.
+ </para>
+ <para>
+ <emphasis role="bold">Example:</emphasis>
+ </para>
+ <programlisting role="XML"><![CDATA[...
+<rich:dataTable id="table" value="#{bean.model}" var="row" rows="5">
+ <rich:column id="c1">
+ <f:facet name="header">
+ <h:outputText value="Packages" />
+ </f:facet>
+ <h:outputText value="#{row.first}" />
+ <rich:componentControl event="oncontextmenu" attachTo="c1" for=":f:m" operation="doShow">
+ <f:param name="param" value="#{row.first}" />
+ </rich:componentControl>
+ </rich:column>
+</rich:dataTable>
+<rich:contextMenu id="Menu1" attached="false">
+ <rich:menuItem value="Edit package" action="#{bean.edit}" />
+ <rich:menuItem value="Delete package" action="#{bean.delete}" />
+ </rich:contextMenu>
+ ...]]></programlisting>
+ <figure>
+ <title>Using the <emphasis><property>"attached"</property></emphasis> attribute</title>
+ <mediaobject>
+ <imageobject>
+ <imagedata fileref="images/contextMenu_attached.png" scalefit="1"/>
+ </imageobject>
+ </mediaobject>
+ </figure>
+ <para>
+ The <emphasis><property>"event"</property></emphasis> attribute defines the event on the parent element
+ that triggers the menu's appearance (<property>oncontextmenu</property> by default).
+ </para>
<para>The <emphasis role="bold">
<property><rich:contexMenu></property>
</emphasis>
<emphasis>
- <property>"submitMode"</property>
+ <property>"submitMode"</property>
</emphasis> attribute can be set to three possible parameters:</para>
<itemizedlist>
@@ -103,10 +161,10 @@
</itemizedlist>
<para>The <emphasis>
- <property>"action"</property>
+ <property>"action"</property>
</emphasis> and <emphasis>
- <property>"actionListener"</property>
- </emphasis> item's attributes are ignored. Menu items don't fire any submits themselves.
+ <property>"actionListener"</property>
+ </emphasis> item's attributes are ignored. Menu items don't fire any submits themselves.
The behavior is fully defined by the components nested inside items.</para>
<note><title>Note:</title> As the <emphasis role="bold">
@@ -114,15 +172,11 @@
</emphasis> component doesn't provide its own form, use it between
<h:form> and </h:form> tags.</note>
- <para><emphasis role="bold">
- <property><rich:menuGroup></property>
- </emphasis>, <emphasis role="bold">
- <property><rich:menuItem></property>
- </emphasis> and <emphasis role="bold">
- <property><rich:menuSeparator></property>
- </emphasis> components is used as nested elements for <emphasis role="bold">
- <property><rich:contexMenu></property>
- </emphasis>.</para>
+ <para><emphasis><property><link linkend="menuGroup"><rich:menuGroup></link></property></emphasis>,
+ <emphasis><property><link linkend="menuItem"><rich:menuItem></link></property></emphasis>
+ and <emphasis><property><link linkend="menuSeparator"><rich:menuSeparator></link></property></emphasis>
+ components is used as nested elements for <emphasis role="bold"><property><rich:contexMenu></property></emphasis>.
+ </para>
<!-- Will be done for latest version -->
<!--para> It's possible to define the direction for list appear in the <emphasis>
16 years, 10 months
JBoss Rich Faces SVN: r4645 - trunk/ui/calendar/src/main/java/org/richfaces/component.
by richfaces-svn-commits@lists.jboss.org
Author: akushunin
Date: 2007-12-10 07:01:41 -0500 (Mon, 10 Dec 2007)
New Revision: 4645
Modified:
trunk/ui/calendar/src/main/java/org/richfaces/component/UICalendar.java
Log:
RF-1471
Modified: trunk/ui/calendar/src/main/java/org/richfaces/component/UICalendar.java
===================================================================
--- trunk/ui/calendar/src/main/java/org/richfaces/component/UICalendar.java 2007-12-10 11:05:30 UTC (rev 4644)
+++ trunk/ui/calendar/src/main/java/org/richfaces/component/UICalendar.java 2007-12-10 12:01:41 UTC (rev 4645)
@@ -30,10 +30,12 @@
import java.util.TimeZone;
import javax.faces.FacesException;
+import javax.faces.application.Application;
import javax.faces.application.FacesMessage;
import javax.faces.component.UIInput;
import javax.faces.component.UIViewRoot;
import javax.faces.context.FacesContext;
+import javax.faces.convert.Converter;
import javax.faces.convert.ConverterException;
import javax.faces.convert.DateTimeConverter;
import javax.faces.el.MethodBinding;
@@ -55,7 +57,6 @@
import java.text.DateFormat;
-
// import org.richfaces.renderkit.html.BaseGradient.Data;
/**
@@ -158,7 +159,7 @@
public abstract int getVerticalOffset();
public abstract void setVerticalOffset(int verticalOffset);
-
+
public abstract int getHorizontalOffset();
public abstract void setHorizontalOffset(int horizontalOffset);
@@ -170,36 +171,35 @@
public abstract String getIsDayEnabled();
public abstract void setIsDayEnabled(String isDayEnabled);
-
+
public abstract String getCellHeight();
public abstract void setCellHeight(String cellHeight);
-
+
public abstract String getCellWidth();
public abstract void setCellWidth(String cellWidth);
-
+
public abstract boolean isShowWeekDaysBar();
-
+
public abstract void setShowWeekDaysBar(boolean showWeekDaysBar);
-
+
public abstract boolean isShowWeeksBar();
-
+
public abstract void setShowWeeksBar(boolean showWeeksBar);
-
+
public abstract boolean isShowScrollerBar();
-
+
public abstract void setShowScrollerBar(boolean showScrollerBar);
-
+
public abstract String getTodayControlMode();
-
+
public abstract void setTodayControlMode(String todayControlMode);
-
+
public abstract boolean isShowApplyButton();
-
+
public abstract void setShowApplyButton(boolean showApplyButton);
-
-
+
// TODO onclick add users onclick
// currentDate processing -------------------------------------------------
@@ -235,25 +235,26 @@
if (context == null) {
throw new NullPointerException();
}
- //RF-1073
+ // RF-1073
try {
ValueBinding vb = getValueBinding("currentDate");
if (vb != null) {
- if(vb.getType(context).equals(String.class)){
+ if (vb.getType(context).equals(String.class)) {
DateTimeConverter convert = new DateTimeConverter();
convert.setLocale(getLocale());
convert.setPattern(getDatePattern());
- vb.setValue(context,convert.getAsString(context, this, currentDate));
+ vb.setValue(context, convert.getAsString(context, this,
+ currentDate));
return;
- }else if(vb.getType(context).equals(Calendar.class)){
+ } else if (vb.getType(context).equals(Calendar.class)) {
Calendar c = Calendar.getInstance();
c.setTime((Date) currentDate);
vb.setValue(context, c);
return;
- }else{
+ } else {
vb.setValue(context, currentDate);
return;
- }
+ }
} else {
setCurrentDate(currentDate);
}
@@ -310,8 +311,18 @@
if (date instanceof Calendar) {
return ((Calendar) date).getTime();
} else {
+ FacesContext context = FacesContext
+ .getCurrentInstance();
+ Application application = context.getApplication();
+ Converter converter = application.createConverter(date
+ .getClass());
+ if (null != converter) {
+ return getAsDate(converter.getAsString(context,
+ this, date));
+ } else {
+ throw new FacesException("Wrong attibute type or there is no converter for custom attibute type");
+ }
- throw new FacesException("Wrong attibute type");
}
}
}
16 years, 10 months