JBoss Rich Faces SVN: r19666 - sandbox/trunk/ui/fileupload/api/src/main/java/org/richfaces/event.
by richfaces-svn-commits@lists.jboss.org
Author: konstantin.mishin
Date: 2010-10-25 12:11:35 -0400 (Mon, 25 Oct 2010)
New Revision: 19666
Modified:
sandbox/trunk/ui/fileupload/api/src/main/java/org/richfaces/event/UploadEvent.java
Log:
RF-9497
Modified: sandbox/trunk/ui/fileupload/api/src/main/java/org/richfaces/event/UploadEvent.java
===================================================================
--- sandbox/trunk/ui/fileupload/api/src/main/java/org/richfaces/event/UploadEvent.java 2010-10-25 11:22:38 UTC (rev 19665)
+++ sandbox/trunk/ui/fileupload/api/src/main/java/org/richfaces/event/UploadEvent.java 2010-10-25 16:11:35 UTC (rev 19666)
@@ -39,11 +39,11 @@
}
public boolean isAppropriateListener(FacesListener listener) {
- return false;
+ return listener instanceof FileUploadListener;
}
public void processListener(FacesListener listener) {
-
+ ((FileUploadListener) listener).processUpload(this);
}
/**
13 years, 11 months
JBoss Rich Faces SVN: r19665 - in trunk/ui/output/ui: src/test/java/org/richfaces/renderkit/html and 5 other directories.
by richfaces-svn-commits@lists.jboss.org
Author: Alex.Kolonitsky
Date: 2010-10-25 07:22:38 -0400 (Mon, 25 Oct 2010)
New Revision: 19665
Added:
trunk/ui/output/ui/src/test/java/org/richfaces/renderkit/html/IgnoreScriptsContent.java
trunk/ui/output/ui/src/test/java/org/richfaces/renderkit/html/PanelMenuRendererTest.java
trunk/ui/output/ui/src/test/java/org/richfaces/renderkit/html/RendererTestBase.java
trunk/ui/output/ui/src/test/resources/org/
trunk/ui/output/ui/src/test/resources/org/richfaces/
trunk/ui/output/ui/src/test/resources/org/richfaces/renderkit/
trunk/ui/output/ui/src/test/resources/org/richfaces/renderkit/html/
trunk/ui/output/ui/src/test/resources/org/richfaces/renderkit/html/panelMenu.xhtml
trunk/ui/output/ui/src/test/resources/org/richfaces/renderkit/html/panelMenu.xmlunit.xml
Modified:
trunk/ui/output/ui/pom.xml
Log:
BaseRenderer with xml unit
Modified: trunk/ui/output/ui/pom.xml
===================================================================
--- trunk/ui/output/ui/pom.xml 2010-10-25 11:12:37 UTC (rev 19664)
+++ trunk/ui/output/ui/pom.xml 2010-10-25 11:22:38 UTC (rev 19665)
@@ -68,6 +68,12 @@
<groupId>org.richfaces.ui.output</groupId>
<artifactId>richfaces-ui-output-api</artifactId>
</dependency>
+ <dependency>
+ <groupId>xmlunit</groupId>
+ <artifactId>xmlunit</artifactId>
+ <version>1.2</version>
+ <scope>test</scope>
+ </dependency>
</dependencies>
<scm>
Added: trunk/ui/output/ui/src/test/java/org/richfaces/renderkit/html/IgnoreScriptsContent.java
===================================================================
--- trunk/ui/output/ui/src/test/java/org/richfaces/renderkit/html/IgnoreScriptsContent.java (rev 0)
+++ trunk/ui/output/ui/src/test/java/org/richfaces/renderkit/html/IgnoreScriptsContent.java 2010-10-25 11:22:38 UTC (rev 19665)
@@ -0,0 +1,60 @@
+/**
+ * License Agreement.
+ *
+ * Rich Faces - Natural Ajax for Java Server Faces (JSF)
+ *
+ * Copyright (C) 2007 Exadel, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License version 2.1 as published by the Free Software Foundation.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+package org.richfaces.renderkit.html;
+
+import org.custommonkey.xmlunit.Difference;
+import org.custommonkey.xmlunit.DifferenceConstants;
+import org.custommonkey.xmlunit.DifferenceListener;
+import org.custommonkey.xmlunit.IgnoreTextAndAttributeValuesDifferenceListener;
+import org.w3c.dom.Node;
+
+import java.util.Arrays;
+
+/**
+ * @author akolonitsky
+ * @since Oct 22, 2010
+ */
+public class IgnoreScriptsContent implements DifferenceListener {
+ private static final int[] IGNORE = new int[] {
+ DifferenceConstants.HAS_DOCTYPE_DECLARATION_ID,
+ DifferenceConstants.DOCTYPE_NAME_ID,
+ DifferenceConstants.DOCTYPE_PUBLIC_ID_ID,
+ DifferenceConstants.DOCTYPE_SYSTEM_ID_ID
+ };
+
+ static {
+ Arrays.sort(IGNORE);
+ }
+
+ public int differenceFound(Difference difference) {
+ if (DifferenceConstants.TEXT_VALUE_ID == difference.getId()
+ && !"script".equalsIgnoreCase(difference.getTestNodeDetail().getNode().getLocalName())) {
+
+ return RETURN_IGNORE_DIFFERENCE_NODES_SIMILAR;
+ }
+ return RETURN_ACCEPT_DIFFERENCE;
+ }
+
+ public void skippedComparison(Node node, Node node1) {
+
+ }
+}
Added: trunk/ui/output/ui/src/test/java/org/richfaces/renderkit/html/PanelMenuRendererTest.java
===================================================================
--- trunk/ui/output/ui/src/test/java/org/richfaces/renderkit/html/PanelMenuRendererTest.java (rev 0)
+++ trunk/ui/output/ui/src/test/java/org/richfaces/renderkit/html/PanelMenuRendererTest.java 2010-10-25 11:22:38 UTC (rev 19665)
@@ -0,0 +1,47 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright ${year}, Red Hat, Inc. and individual contributors
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+
+
+package org.richfaces.renderkit.html;
+
+import org.junit.Ignore;
+import org.junit.Test;
+import org.xml.sax.SAXException;
+
+import java.io.IOException;
+
+ /**
+ * @author akolonitsky
+ * @since 2010-10-25
+ */
+public class PanelMenuRendererTest extends RendererTestBase {
+
+ @Test
+ @Ignore
+ public void testDoEncode() throws IOException, SAXException {
+ doTest("panelMenu", "panelMenu");
+ }
+
+}
+
+
+
Added: trunk/ui/output/ui/src/test/java/org/richfaces/renderkit/html/RendererTestBase.java
===================================================================
--- trunk/ui/output/ui/src/test/java/org/richfaces/renderkit/html/RendererTestBase.java (rev 0)
+++ trunk/ui/output/ui/src/test/java/org/richfaces/renderkit/html/RendererTestBase.java 2010-10-25 11:22:38 UTC (rev 19665)
@@ -0,0 +1,92 @@
+/**
+ * License Agreement.
+ *
+ * Rich Faces - Natural Ajax for Java Server Faces (JSF)
+ *
+ * Copyright (C) 2007 Exadel, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License version 2.1 as published by the Free Software Foundation.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+package org.richfaces.renderkit.html;
+
+import com.gargoylesoftware.htmlunit.html.HtmlElement;
+import com.gargoylesoftware.htmlunit.html.HtmlPage;
+import org.custommonkey.xmlunit.Diff;
+import org.custommonkey.xmlunit.XMLUnit;
+import org.jboss.test.faces.htmlunit.HtmlUnitEnvironment;
+import org.junit.After;
+import org.junit.Assert;
+import org.junit.Before;
+import org.xml.sax.SAXException;
+
+import java.io.File;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.io.StringReader;
+import java.net.URISyntaxException;
+
+import static org.junit.Assert.assertNotNull;
+
+/**
+ * @author akolonitsky
+ * @since Oct 22, 2010
+ */
+public abstract class RendererTestBase {
+
+ static {
+ XMLUnit.setNormalizeWhitespace(true);
+ XMLUnit.setIgnoreDiffBetweenTextAndCDATA(true);
+ XMLUnit.setIgnoreWhitespace(true);
+ XMLUnit.setIgnoreComments(true);
+
+ }
+
+ protected HtmlUnitEnvironment environment;
+
+ @Before
+ public void setUp() throws URISyntaxException {
+ environment = new HtmlUnitEnvironment();
+ environment.withWebRoot(new File(this.getClass().getResource(".").toURI()));
+ environment.start();
+ }
+
+ @After
+ public void tearDown() {
+ environment.release();
+ environment = null;
+ }
+
+ protected void doTest(String pageName, String pageElementToTest) throws IOException, SAXException {
+ HtmlPage page = environment.getPage('/' + pageName + ".jsf");
+ HtmlElement panel = page.getElementById(pageElementToTest);
+ assertNotNull(panel);
+
+ checkXmlStructure(pageName, panel.asXml());
+ }
+
+ protected void checkXmlStructure(String pageName, String pageCode) throws SAXException, IOException {
+ InputStream expectedPageCode = this.getClass().getResourceAsStream(pageName + ".xmlunit.xml");
+ if (expectedPageCode == null) {
+ return;
+ }
+
+ Diff xmlDiff = new Diff(new StringReader(pageCode), new InputStreamReader(expectedPageCode));
+ xmlDiff.overrideDifferenceListener(new IgnoreScriptsContent());
+ Assert.assertTrue("XML was not similar:" + xmlDiff.toString(), xmlDiff.similar());
+ }
+
+}
+
Added: trunk/ui/output/ui/src/test/resources/org/richfaces/renderkit/html/panelMenu.xhtml
===================================================================
--- trunk/ui/output/ui/src/test/resources/org/richfaces/renderkit/html/panelMenu.xhtml (rev 0)
+++ trunk/ui/output/ui/src/test/resources/org/richfaces/renderkit/html/panelMenu.xhtml 2010-10-25 11:22:38 UTC (rev 19665)
@@ -0,0 +1,47 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<!--
+ JBoss, Home of Professional Open Source
+ Copyright ${year}, Red Hat, Inc. and individual contributors
+ by the @authors tag. See the copyright.txt in the distribution for a
+ full listing of individual contributors.
+
+ This is free software; you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as
+ published by the Free Software Foundation; either version 2.1 of
+ the License, or (at your option) any later version.
+
+ This software is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with this software; if not, write to the Free
+ Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+-->
+
+
+<!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:fn="http://java.sun.com/jsp/jstl/functions"
+ xmlns:h="http://java.sun.com/jsf/html"
+ xmlns:f="http://java.sun.com/jsf/core"
+ xmlns:ui="http://java.sun.com/jsf/facelets"
+ xmlns:pn="http://richfaces.org/output"
+ xmlns:rich="http://richfaces.org/rich">
+
+ <h:head>
+ <title>Richfaces PanelMenu Test</title>
+ </h:head>
+
+<h:body>
+ <h:form id="f" style="border:blue solid thin;">
+ <pn:panelMenu id="panelMenu">
+ <!-- TODO -->
+ </pn:panelMenu>
+ </h:form>
+</h:body>
+</html>
+
+
Added: trunk/ui/output/ui/src/test/resources/org/richfaces/renderkit/html/panelMenu.xmlunit.xml
===================================================================
--- trunk/ui/output/ui/src/test/resources/org/richfaces/renderkit/html/panelMenu.xmlunit.xml (rev 0)
+++ trunk/ui/output/ui/src/test/resources/org/richfaces/renderkit/html/panelMenu.xmlunit.xml 2010-10-25 11:22:38 UTC (rev 19665)
@@ -0,0 +1,5 @@
+<div id="panelMenu" class="rf-panelMenu">
+ <script type="text/javascript">
+ // Text between <script> ... </script> don't compared
+ </script>
+</div>
13 years, 11 months
JBoss Rich Faces SVN: r19664 - modules/tests/metamer/trunk/application/src/main/webapp/components/richInplaceInput.
by richfaces-svn-commits@lists.jboss.org
Author: ppitonak(a)redhat.com
Date: 2010-10-25 07:12:37 -0400 (Mon, 25 Oct 2010)
New Revision: 19664
Modified:
modules/tests/metamer/trunk/application/src/main/webapp/components/richInplaceInput/simple.xhtml
Log:
https://jira.jboss.org/browse/RFPL-757
* fixed because some attributes were renamed
Modified: modules/tests/metamer/trunk/application/src/main/webapp/components/richInplaceInput/simple.xhtml
===================================================================
--- modules/tests/metamer/trunk/application/src/main/webapp/components/richInplaceInput/simple.xhtml 2010-10-25 09:41:01 UTC (rev 19663)
+++ modules/tests/metamer/trunk/application/src/main/webapp/components/richInplaceInput/simple.xhtml 2010-10-25 11:12:37 UTC (rev 19664)
@@ -49,23 +49,24 @@
inputWidth="#{richInplaceInputBean.attributes['inputWidth'].value}"
localValue="#{richInplaceInputBean.attributes['localValue'].value}"
localValueSet="#{richInplaceInputBean.attributes['localValueSet'].value}"
- onInputBlur="#{richInplaceInputBean.attributes['onInputBlur'].value}"
- onInputClick="#{richInplaceInputBean.attributes['onInputClick'].value}"
- onInputDblClick="#{richInplaceInputBean.attributes['onInputDblClick'].value}"
- onInputFocus="#{richInplaceInputBean.attributes['onInputFocus'].value}"
- onInputKeydown="#{richInplaceInputBean.attributes['onInputKeydown'].value}"
- onInputKeypress="#{richInplaceInputBean.attributes['onInputKeypress'].value}"
- onInputKeyup="#{richInplaceInputBean.attributes['onInputKeyup'].value}"
- onInputMousedown="#{richInplaceInputBean.attributes['onInputMousedown'].value}"
- onInputMousemove="#{richInplaceInputBean.attributes['onInputMousemove'].value}"
- onInputMouseout="#{richInplaceInputBean.attributes['onInputMouseout'].value}"
- onInputMouseover="#{richInplaceInputBean.attributes['onInputMouseover'].value}"
- onInputMouseup="#{richInplaceInputBean.attributes['onInputMouseup'].value}"
onblur="#{richInplaceInputBean.attributes['onblur'].value}"
- onchange="#{richInplaceInputBean.attributes['onchange'].value}"
onclick="#{richInplaceInputBean.attributes['onclick'].value}"
ondblclick="#{richInplaceInputBean.attributes['ondblclick'].value}"
onfocus="#{richInplaceInputBean.attributes['onfocus'].value}"
+ oninputblur="#{richInplaceInputBean.attributes['oninputblur'].value}"
+ oninputchangechange="#{richInplaceInputBean.attributes['oninputchange'].value}"
+ oninputclick="#{richInplaceInputBean.attributes['oninputclick'].value}"
+ oninputdblClick="#{richInplaceInputBean.attributes['oninputdblClick'].value}"
+ oninputfocus="#{richInplaceInputBean.attributes['oninputfocus'].value}"
+ oninputkeydown="#{richInplaceInputBean.attributes['oninputkeydown'].value}"
+ oninputkeypress="#{richInplaceInputBean.attributes['oninputkeypress'].value}"
+ oninputkeyup="#{richInplaceInputBean.attributes['oninputkeyup'].value}"
+ oninputmousedown="#{richInplaceInputBean.attributes['oninputmousedown'].value}"
+ oninputmousemove="#{richInplaceInputBean.attributes['oninputmousemove'].value}"
+ oninputmouseout="#{richInplaceInputBean.attributes['oninputmouseout'].value}"
+ oninputmouseover="#{richInplaceInputBean.attributes['oninputmouseover'].value}"
+ oninputmouseup="#{richInplaceInputBean.attributes['oninputmouseup'].value}"
+ oninputselect="#{richInplaceInputBean.attributes['oninputselect'].value}"
onkeydown="#{richInplaceInputBean.attributes['onkeydown'].value}"
onkeypress="#{richInplaceInputBean.attributes['onkeypress'].value}"
onkeyup="#{richInplaceInputBean.attributes['onkeyup'].value}"
@@ -74,7 +75,6 @@
onmouseout="#{richInplaceInputBean.attributes['onmouseout'].value}"
onmouseover="#{richInplaceInputBean.attributes['onmouseover'].value}"
onmouseup="#{richInplaceInputBean.attributes['onmouseup'].value}"
- onselect="#{richInplaceInputBean.attributes['onselect'].value}"
rendered="#{richInplaceInputBean.attributes['rendered'].value}"
required="#{richInplaceInputBean.attributes['required'].value}"
requiredMessage="#{richInplaceInputBean.attributes['requiredMessage'].value}"
@@ -90,7 +90,7 @@
valueChangeListeners="#{richInplaceInputBean.attributes['valueChangeListeners'].value}"
>
- <a4j:ajax event="change" render="output"/>
+ <a4j:ajax event="inputchange" render="output"/>
</rich:inplaceInput>
13 years, 11 months
JBoss Rich Faces SVN: r19663 - in modules/tests/metamer/trunk/application/src/main: webapp/components/richColumn and 1 other directory.
by richfaces-svn-commits@lists.jboss.org
Author: ppitonak(a)redhat.com
Date: 2010-10-25 05:41:01 -0400 (Mon, 25 Oct 2010)
New Revision: 19663
Modified:
modules/tests/metamer/trunk/application/src/main/java/org/richfaces/tests/metamer/bean/RichColumnBean.java
modules/tests/metamer/trunk/application/src/main/webapp/components/richColumn/simple.xhtml
Log:
https://jira.jboss.org/browse/RFPL-729
* new version of attribute retrieving
* xhtml cleaned
Modified: modules/tests/metamer/trunk/application/src/main/java/org/richfaces/tests/metamer/bean/RichColumnBean.java
===================================================================
--- modules/tests/metamer/trunk/application/src/main/java/org/richfaces/tests/metamer/bean/RichColumnBean.java 2010-10-25 09:02:13 UTC (rev 19662)
+++ modules/tests/metamer/trunk/application/src/main/java/org/richfaces/tests/metamer/bean/RichColumnBean.java 2010-10-25 09:41:01 UTC (rev 19663)
@@ -54,10 +54,10 @@
logger = LoggerFactory.getLogger(getClass());
logger.debug("initializing bean " + getClass().getName());
- attributes = Attributes.getUIComponentAttributes(UIColumn.class, getClass());
+ attributes = Attributes.getUIComponentAttributes(UIColumn.class, getClass(), false);
+ attributes.setAttribute("colspan", 1);
attributes.setAttribute("rendered", true);
- attributes.setAttribute("colspan", 1);
-
+ attributes.setAttribute("rowspan", 1);
}
public Attributes getAttributes() {
Modified: modules/tests/metamer/trunk/application/src/main/webapp/components/richColumn/simple.xhtml
===================================================================
--- modules/tests/metamer/trunk/application/src/main/webapp/components/richColumn/simple.xhtml 2010-10-25 09:02:13 UTC (rev 19662)
+++ modules/tests/metamer/trunk/application/src/main/webapp/components/richColumn/simple.xhtml 2010-10-25 09:41:01 UTC (rev 19663)
@@ -51,16 +51,11 @@
<rich:column id="columnState"
breakRowBefore="#{richColumnBean.attributes['breakRowBefore'].value}"
colspan="#{richColumnBean.attributes['colspan'].value}"
- columnSpan="#{richColumnBean.attributes['columnSpan'].value}"
comparator="#{richColumnBean.attributes['comparator'].value}"
filter="#{richColumnBean.attributes['filter'].value}"
- filterField="#{richColumnBean.attributes['filterField'].value}"
filterValue="#{richColumnBean.attributes['filterValue'].value}"
- footer="#{richColumnBean.attributes['footer'].value}"
- header="#{richColumnBean.attributes['header'].value}"
rendered="#{richColumnBean.attributes['rendered'].value}"
rowspan="#{richColumnBean.attributes['rowspan'].value}"
- sortField="#{richColumnBean.attributes['sortField'].value}"
sortOrder="#{richColumnBean.attributes['sortOrder'].value}"
>
<f:facet name="header">
13 years, 11 months
JBoss Rich Faces SVN: r19662 - in modules/tests/metamer/trunk/application/src/main/webapp: templates and 1 other directory.
by richfaces-svn-commits@lists.jboss.org
Author: ppitonak(a)redhat.com
Date: 2010-10-25 05:02:13 -0400 (Mon, 25 Oct 2010)
New Revision: 19662
Added:
modules/tests/metamer/trunk/application/src/main/webapp/resources/script/detect-browser.js
Removed:
modules/tests/metamer/trunk/application/src/main/webapp/resources/script/jquery-v1.2.6.js
modules/tests/metamer/trunk/application/src/main/webapp/resources/script/jquery.browser-v2.3.js
Modified:
modules/tests/metamer/trunk/application/src/main/webapp/templates/footer.xhtml
Log:
https://jira.jboss.org/browse/RFPL-799
* new implementation of browser detection
Added: modules/tests/metamer/trunk/application/src/main/webapp/resources/script/detect-browser.js
===================================================================
--- modules/tests/metamer/trunk/application/src/main/webapp/resources/script/detect-browser.js (rev 0)
+++ modules/tests/metamer/trunk/application/src/main/webapp/resources/script/detect-browser.js 2010-10-25 09:02:13 UTC (rev 19662)
@@ -0,0 +1,32 @@
+(function($) {
+ var userAgent = navigator.userAgent.toLowerCase();
+
+ jQuery.browser = {
+ chrome: /chrome/.test( userAgent ),
+ safari: /webkit/.test( userAgent ) && !/chrome/.test( userAgent ),
+ webkit: /webkit/.test( userAgent ),
+ opera: /opera/.test( userAgent ),
+ konqueror: /konqueror/.test( userAgent ),
+ msie: /msie/.test( userAgent ) && !/opera/.test( userAgent ),
+ mozilla: /mozilla/.test( userAgent ) && !/(compatible|webkit)/.test( userAgent ),
+ version: typeof window.opera != "undefined" ? opera.version() : (userAgent.match( /.+(?:rv|it|ra|ie|me)[\/: ]([\d.]+)/ ) || [])[1],
+ os : navigator.platform
+ };
+
+ if (jQuery.browser.chrome) {
+ jQuery.browser.name = "Chrome";
+ } else if (jQuery.browser.safari) {
+ jQuery.browser.name = "Safari";
+ } else if (jQuery.browser.opera) {
+ jQuery.browser.name = "Opera";
+ } else if (jQuery.browser.msie) {
+ jQuery.browser.name = "Internet Explorer";
+ } else if (jQuery.browser.mozilla) {
+ jQuery.browser.name = "Firefox";
+ } else if (jQuery.browser.konqueror) {
+ jQuery.browser.name = "Konqueror";
+ } else {
+ jQuery.browser.name = "Unknown browser";
+ }
+
+})(jQuery);
\ No newline at end of file
Deleted: modules/tests/metamer/trunk/application/src/main/webapp/resources/script/jquery-v1.2.6.js
===================================================================
--- modules/tests/metamer/trunk/application/src/main/webapp/resources/script/jquery-v1.2.6.js 2010-10-25 06:24:28 UTC (rev 19661)
+++ modules/tests/metamer/trunk/application/src/main/webapp/resources/script/jquery-v1.2.6.js 2010-10-25 09:02:13 UTC (rev 19662)
@@ -1,3551 +0,0 @@
-(function(){
-/*
- * jQuery 1.2.6 - New Wave Javascript
- *
- * Copyright (c) 2008 John Resig (jquery.com)
- * Dual licensed under the MIT (MIT-LICENSE.txt)
- * and GPL (GPL-LICENSE.txt) licenses.
- *
- * $Date: 2008-05-24 14:22:17 -0400 (Sat, 24 May 2008) $
- * $Rev: 5685 $
- */
-
-// Map over jQuery in case of overwrite
-var _jQuery = window.jQuery,
-// Map over the $ in case of overwrite
- _$ = window.$;
-
-var jQuery = window.jQuery = window.$ = function( selector, context ) {
- // The jQuery object is actually just the init constructor 'enhanced'
- return new jQuery.fn.init( selector, context );
-};
-
-// A simple way to check for HTML strings or ID strings
-// (both of which we optimize for)
-var quickExpr = /^[^<]*(<(.|\s)+>)[^>]*$|^#(\w+)$/,
-
-// Is it a simple selector
- isSimple = /^.[^:#\[\.]*$/,
-
-// Will speed up references to undefined, and allows munging its name.
- undefined;
-
-jQuery.fn = jQuery.prototype = {
- init: function( selector, context ) {
- // Make sure that a selection was provided
- selector = selector || document;
-
- // Handle $(DOMElement)
- if ( selector.nodeType ) {
- this[0] = selector;
- this.length = 1;
- return this;
- }
- // Handle HTML strings
- if ( typeof selector == "string" ) {
- // Are we dealing with HTML string or an ID?
- var match = quickExpr.exec( selector );
-
- // Verify a match, and that no context was specified for #id
- if ( match && (match[1] || !context) ) {
-
- // HANDLE: $(html) -> $(array)
- if ( match[1] )
- selector = jQuery.clean( [ match[1] ], context );
-
- // HANDLE: $("#id")
- else {
- var elem = document.getElementById( match[3] );
-
- // Make sure an element was located
- if ( elem ){
- // Handle the case where IE and Opera return items
- // by name instead of ID
- if ( elem.id != match[3] )
- return jQuery().find( selector );
-
- // Otherwise, we inject the element directly into the jQuery object
- return jQuery( elem );
- }
- selector = [];
- }
-
- // HANDLE: $(expr, [context])
- // (which is just equivalent to: $(content).find(expr)
- } else
- return jQuery( context ).find( selector );
-
- // HANDLE: $(function)
- // Shortcut for document ready
- } else if ( jQuery.isFunction( selector ) )
- return jQuery( document )[ jQuery.fn.ready ? "ready" : "load" ]( selector );
-
- return this.setArray(jQuery.makeArray(selector));
- },
-
- // The current version of jQuery being used
- jquery: "1.2.6",
-
- // The number of elements contained in the matched element set
- size: function() {
- return this.length;
- },
-
- // The number of elements contained in the matched element set
- length: 0,
-
- // Get the Nth element in the matched element set OR
- // Get the whole matched element set as a clean array
- get: function( num ) {
- return num == undefined ?
-
- // Return a 'clean' array
- jQuery.makeArray( this ) :
-
- // Return just the object
- this[ num ];
- },
-
- // Take an array of elements and push it onto the stack
- // (returning the new matched element set)
- pushStack: function( elems ) {
- // Build a new jQuery matched element set
- var ret = jQuery( elems );
-
- // Add the old object onto the stack (as a reference)
- ret.prevObject = this;
-
- // Return the newly-formed element set
- return ret;
- },
-
- // Force the current matched set of elements to become
- // the specified array of elements (destroying the stack in the process)
- // You should use pushStack() in order to do this, but maintain the stack
- setArray: function( elems ) {
- // Resetting the length to 0, then using the native Array push
- // is a super-fast way to populate an object with array-like properties
- this.length = 0;
- Array.prototype.push.apply( this, elems );
-
- return this;
- },
-
- // Execute a callback for every element in the matched set.
- // (You can seed the arguments with an array of args, but this is
- // only used internally.)
- each: function( callback, args ) {
- return jQuery.each( this, callback, args );
- },
-
- // Determine the position of an element within
- // the matched set of elements
- index: function( elem ) {
- var ret = -1;
-
- // Locate the position of the desired element
- return jQuery.inArray(
- // If it receives a jQuery object, the first element is used
- elem && elem.jquery ? elem[0] : elem
- , this );
- },
-
- attr: function( name, value, type ) {
- var options = name;
-
- // Look for the case where we're accessing a style value
- if ( name.constructor == String )
- if ( value === undefined )
- return this[0] && jQuery[ type || "attr" ]( this[0], name );
-
- else {
- options = {};
- options[ name ] = value;
- }
-
- // Check to see if we're setting style values
- return this.each(function(i){
- // Set all the styles
- for ( name in options )
- jQuery.attr(
- type ?
- this.style :
- this,
- name, jQuery.prop( this, options[ name ], type, i, name )
- );
- });
- },
-
- css: function( key, value ) {
- // ignore negative width and height values
- if ( (key == 'width' || key == 'height') && parseFloat(value) < 0 )
- value = undefined;
- return this.attr( key, value, "curCSS" );
- },
-
- text: function( text ) {
- if ( typeof text != "object" && text != null )
- return this.empty().append( (this[0] && this[0].ownerDocument || document).createTextNode( text ) );
-
- var ret = "";
-
- jQuery.each( text || this, function(){
- jQuery.each( this.childNodes, function(){
- if ( this.nodeType != 8 )
- ret += this.nodeType != 1 ?
- this.nodeValue :
- jQuery.fn.text( [ this ] );
- });
- });
-
- return ret;
- },
-
- wrapAll: function( html ) {
- if ( this[0] )
- // The elements to wrap the target around
- jQuery( html, this[0].ownerDocument )
- .clone()
- .insertBefore( this[0] )
- .map(function(){
- var elem = this;
-
- while ( elem.firstChild )
- elem = elem.firstChild;
-
- return elem;
- })
- .append(this);
-
- return this;
- },
-
- wrapInner: function( html ) {
- return this.each(function(){
- jQuery( this ).contents().wrapAll( html );
- });
- },
-
- wrap: function( html ) {
- return this.each(function(){
- jQuery( this ).wrapAll( html );
- });
- },
-
- append: function() {
- return this.domManip(arguments, true, false, function(elem){
- if (this.nodeType == 1)
- this.appendChild( elem );
- });
- },
-
- prepend: function() {
- return this.domManip(arguments, true, true, function(elem){
- if (this.nodeType == 1)
- this.insertBefore( elem, this.firstChild );
- });
- },
-
- before: function() {
- return this.domManip(arguments, false, false, function(elem){
- this.parentNode.insertBefore( elem, this );
- });
- },
-
- after: function() {
- return this.domManip(arguments, false, true, function(elem){
- this.parentNode.insertBefore( elem, this.nextSibling );
- });
- },
-
- end: function() {
- return this.prevObject || jQuery( [] );
- },
-
- find: function( selector ) {
- var elems = jQuery.map(this, function(elem){
- return jQuery.find( selector, elem );
- });
-
- return this.pushStack( /[^+>] [^+>]/.test( selector ) || selector.indexOf("..") > -1 ?
- jQuery.unique( elems ) :
- elems );
- },
-
- clone: function( events ) {
- // Do the clone
- var ret = this.map(function(){
- if ( jQuery.browser.msie && !jQuery.isXMLDoc(this) ) {
- // IE copies events bound via attachEvent when
- // using cloneNode. Calling detachEvent on the
- // clone will also remove the events from the orignal
- // In order to get around this, we use innerHTML.
- // Unfortunately, this means some modifications to
- // attributes in IE that are actually only stored
- // as properties will not be copied (such as the
- // the name attribute on an input).
- var clone = this.cloneNode(true),
- container = document.createElement("div");
- container.appendChild(clone);
- return jQuery.clean([container.innerHTML])[0];
- } else
- return this.cloneNode(true);
- });
-
- // Need to set the expando to null on the cloned set if it exists
- // removeData doesn't work here, IE removes it from the original as well
- // this is primarily for IE but the data expando shouldn't be copied over in any browser
- var clone = ret.find("*").andSelf().each(function(){
- if ( this[ expando ] != undefined )
- this[ expando ] = null;
- });
-
- // Copy the events from the original to the clone
- if ( events === true )
- this.find("*").andSelf().each(function(i){
- if (this.nodeType == 3)
- return;
- var events = jQuery.data( this, "events" );
-
- for ( var type in events )
- for ( var handler in events[ type ] )
- jQuery.event.add( clone[ i ], type, events[ type ][ handler ], events[ type ][ handler ].data );
- });
-
- // Return the cloned set
- return ret;
- },
-
- filter: function( selector ) {
- return this.pushStack(
- jQuery.isFunction( selector ) &&
- jQuery.grep(this, function(elem, i){
- return selector.call( elem, i );
- }) ||
-
- jQuery.multiFilter( selector, this ) );
- },
-
- not: function( selector ) {
- if ( selector.constructor == String )
- // test special case where just one selector is passed in
- if ( isSimple.test( selector ) )
- return this.pushStack( jQuery.multiFilter( selector, this, true ) );
- else
- selector = jQuery.multiFilter( selector, this );
-
- var isArrayLike = selector.length && selector[selector.length - 1] !== undefined && !selector.nodeType;
- return this.filter(function() {
- return isArrayLike ? jQuery.inArray( this, selector ) < 0 : this != selector;
- });
- },
-
- add: function( selector ) {
- return this.pushStack( jQuery.unique( jQuery.merge(
- this.get(),
- typeof selector == 'string' ?
- jQuery( selector ) :
- jQuery.makeArray( selector )
- )));
- },
-
- is: function( selector ) {
- return !!selector && jQuery.multiFilter( selector, this ).length > 0;
- },
-
- hasClass: function( selector ) {
- return this.is( "." + selector );
- },
-
- val: function( value ) {
- if ( value == undefined ) {
-
- if ( this.length ) {
- var elem = this[0];
-
- // We need to handle select boxes special
- if ( jQuery.nodeName( elem, "select" ) ) {
- var index = elem.selectedIndex,
- values = [],
- options = elem.options,
- one = elem.type == "select-one";
-
- // Nothing was selected
- if ( index < 0 )
- return null;
-
- // Loop through all the selected options
- for ( var i = one ? index : 0, max = one ? index + 1 : options.length; i < max; i++ ) {
- var option = options[ i ];
-
- if ( option.selected ) {
- // Get the specifc value for the option
- value = jQuery.browser.msie && !option.attributes.value.specified ? option.text : option.value;
-
- // We don't need an array for one selects
- if ( one )
- return value;
-
- // Multi-Selects return an array
- values.push( value );
- }
- }
-
- return values;
-
- // Everything else, we just grab the value
- } else
- return (this[0].value || "").replace(/\r/g, "");
-
- }
-
- return undefined;
- }
-
- if( value.constructor == Number )
- value += '';
-
- return this.each(function(){
- if ( this.nodeType != 1 )
- return;
-
- if ( value.constructor == Array && /radio|checkbox/.test( this.type ) )
- this.checked = (jQuery.inArray(this.value, value) >= 0 ||
- jQuery.inArray(this.name, value) >= 0);
-
- else if ( jQuery.nodeName( this, "select" ) ) {
- var values = jQuery.makeArray(value);
-
- jQuery( "option", this ).each(function(){
- this.selected = (jQuery.inArray( this.value, values ) >= 0 ||
- jQuery.inArray( this.text, values ) >= 0);
- });
-
- if ( !values.length )
- this.selectedIndex = -1;
-
- } else
- this.value = value;
- });
- },
-
- html: function( value ) {
- return value == undefined ?
- (this[0] ?
- this[0].innerHTML :
- null) :
- this.empty().append( value );
- },
-
- replaceWith: function( value ) {
- return this.after( value ).remove();
- },
-
- eq: function( i ) {
- return this.slice( i, i + 1 );
- },
-
- slice: function() {
- return this.pushStack( Array.prototype.slice.apply( this, arguments ) );
- },
-
- map: function( callback ) {
- return this.pushStack( jQuery.map(this, function(elem, i){
- return callback.call( elem, i, elem );
- }));
- },
-
- andSelf: function() {
- return this.add( this.prevObject );
- },
-
- data: function( key, value ){
- var parts = key.split(".");
- parts[1] = parts[1] ? "." + parts[1] : "";
-
- if ( value === undefined ) {
- var data = this.triggerHandler("getData" + parts[1] + "!", [parts[0]]);
-
- if ( data === undefined && this.length )
- data = jQuery.data( this[0], key );
-
- return data === undefined && parts[1] ?
- this.data( parts[0] ) :
- data;
- } else
- return this.trigger("setData" + parts[1] + "!", [parts[0], value]).each(function(){
- jQuery.data( this, key, value );
- });
- },
-
- removeData: function( key ){
- return this.each(function(){
- jQuery.removeData( this, key );
- });
- },
-
- domManip: function( args, table, reverse, callback ) {
- var clone = this.length > 1, elems;
-
- return this.each(function(){
- if ( !elems ) {
- elems = jQuery.clean( args, this.ownerDocument );
-
- if ( reverse )
- elems.reverse();
- }
-
- var obj = this;
-
- if ( table && jQuery.nodeName( this, "table" ) && jQuery.nodeName( elems[0], "tr" ) )
- obj = this.getElementsByTagName("tbody")[0] || this.appendChild( this.ownerDocument.createElement("tbody") );
-
- var scripts = jQuery( [] );
-
- jQuery.each(elems, function(){
- var elem = clone ?
- jQuery( this ).clone( true )[0] :
- this;
-
- // execute all scripts after the elements have been injected
- if ( jQuery.nodeName( elem, "script" ) )
- scripts = scripts.add( elem );
- else {
- // Remove any inner scripts for later evaluation
- if ( elem.nodeType == 1 )
- scripts = scripts.add( jQuery( "script", elem ).remove() );
-
- // Inject the elements into the document
- callback.call( obj, elem );
- }
- });
-
- scripts.each( evalScript );
- });
- }
-};
-
-// Give the init function the jQuery prototype for later instantiation
-jQuery.fn.init.prototype = jQuery.fn;
-
-function evalScript( i, elem ) {
- if ( elem.src )
- jQuery.ajax({
- url: elem.src,
- async: false,
- dataType: "script"
- });
-
- else
- jQuery.globalEval( elem.text || elem.textContent || elem.innerHTML || "" );
-
- if ( elem.parentNode )
- elem.parentNode.removeChild( elem );
-}
-
-function now(){
- return +new Date;
-}
-
-jQuery.extend = jQuery.fn.extend = function() {
- // copy reference to target object
- var target = arguments[0] || {}, i = 1, length = arguments.length, deep = false, options;
-
- // Handle a deep copy situation
- if ( target.constructor == Boolean ) {
- deep = target;
- target = arguments[1] || {};
- // skip the boolean and the target
- i = 2;
- }
-
- // Handle case when target is a string or something (possible in deep copy)
- if ( typeof target != "object" && typeof target != "function" )
- target = {};
-
- // extend jQuery itself if only one argument is passed
- if ( length == i ) {
- target = this;
- --i;
- }
-
- for ( ; i < length; i++ )
- // Only deal with non-null/undefined values
- if ( (options = arguments[ i ]) != null )
- // Extend the base object
- for ( var name in options ) {
- var src = target[ name ], copy = options[ name ];
-
- // Prevent never-ending loop
- if ( target === copy )
- continue;
-
- // Recurse if we're merging object values
- if ( deep && copy && typeof copy == "object" && !copy.nodeType )
- target[ name ] = jQuery.extend( deep,
- // Never move original objects, clone them
- src || ( copy.length != null ? [ ] : { } )
- , copy );
-
- // Don't bring in undefined values
- else if ( copy !== undefined )
- target[ name ] = copy;
-
- }
-
- // Return the modified object
- return target;
-};
-
-var expando = "jQuery" + now(), uuid = 0, windowData = {},
- // exclude the following css properties to add px
- exclude = /z-?index|font-?weight|opacity|zoom|line-?height/i,
- // cache defaultView
- defaultView = document.defaultView || {};
-
-jQuery.extend({
- noConflict: function( deep ) {
- window.$ = _$;
-
- if ( deep )
- window.jQuery = _jQuery;
-
- return jQuery;
- },
-
- // See test/unit/core.js for details concerning this function.
- isFunction: function( fn ) {
- return !!fn && typeof fn != "string" && !fn.nodeName &&
- fn.constructor != Array && /^[\s[]?function/.test( fn + "" );
- },
-
- // check if an element is in a (or is an) XML document
- isXMLDoc: function( elem ) {
- return elem.documentElement && !elem.body ||
- elem.tagName && elem.ownerDocument && !elem.ownerDocument.body;
- },
-
- // Evalulates a script in a global context
- globalEval: function( data ) {
- data = jQuery.trim( data );
-
- if ( data ) {
- // Inspired by code by Andrea Giammarchi
- // http://webreflection.blogspot.com/2007/08/global-scope-evaluation-and-dom...
- var head = document.getElementsByTagName("head")[0] || document.documentElement,
- script = document.createElement("script");
-
- script.type = "text/javascript";
- if ( jQuery.browser.msie )
- script.text = data;
- else
- script.appendChild( document.createTextNode( data ) );
-
- // Use insertBefore instead of appendChild to circumvent an IE6 bug.
- // This arises when a base node is used (#2709).
- head.insertBefore( script, head.firstChild );
- head.removeChild( script );
- }
- },
-
- nodeName: function( elem, name ) {
- return elem.nodeName && elem.nodeName.toUpperCase() == name.toUpperCase();
- },
-
- cache: {},
-
- data: function( elem, name, data ) {
- elem = elem == window ?
- windowData :
- elem;
-
- var id = elem[ expando ];
-
- // Compute a unique ID for the element
- if ( !id )
- id = elem[ expando ] = ++uuid;
-
- // Only generate the data cache if we're
- // trying to access or manipulate it
- if ( name && !jQuery.cache[ id ] )
- jQuery.cache[ id ] = {};
-
- // Prevent overriding the named cache with undefined values
- if ( data !== undefined )
- jQuery.cache[ id ][ name ] = data;
-
- // Return the named cache data, or the ID for the element
- return name ?
- jQuery.cache[ id ][ name ] :
- id;
- },
-
- removeData: function( elem, name ) {
- elem = elem == window ?
- windowData :
- elem;
-
- var id = elem[ expando ];
-
- // If we want to remove a specific section of the element's data
- if ( name ) {
- if ( jQuery.cache[ id ] ) {
- // Remove the section of cache data
- delete jQuery.cache[ id ][ name ];
-
- // If we've removed all the data, remove the element's cache
- name = "";
-
- for ( name in jQuery.cache[ id ] )
- break;
-
- if ( !name )
- jQuery.removeData( elem );
- }
-
- // Otherwise, we want to remove all of the element's data
- } else {
- // Clean up the element expando
- try {
- delete elem[ expando ];
- } catch(e){
- // IE has trouble directly removing the expando
- // but it's ok with using removeAttribute
- if ( elem.removeAttribute )
- elem.removeAttribute( expando );
- }
-
- // Completely remove the data cache
- delete jQuery.cache[ id ];
- }
- },
-
- // args is for internal usage only
- each: function( object, callback, args ) {
- var name, i = 0, length = object.length;
-
- if ( args ) {
- if ( length == undefined ) {
- for ( name in object )
- if ( callback.apply( object[ name ], args ) === false )
- break;
- } else
- for ( ; i < length; )
- if ( callback.apply( object[ i++ ], args ) === false )
- break;
-
- // A special, fast, case for the most common use of each
- } else {
- if ( length == undefined ) {
- for ( name in object )
- if ( callback.call( object[ name ], name, object[ name ] ) === false )
- break;
- } else
- for ( var value = object[0];
- i < length && callback.call( value, i, value ) !== false; value = object[++i] ){}
- }
-
- return object;
- },
-
- prop: function( elem, value, type, i, name ) {
- // Handle executable functions
- if ( jQuery.isFunction( value ) )
- value = value.call( elem, i );
-
- // Handle passing in a number to a CSS property
- return value && value.constructor == Number && type == "curCSS" && !exclude.test( name ) ?
- value + "px" :
- value;
- },
-
- className: {
- // internal only, use addClass("class")
- add: function( elem, classNames ) {
- jQuery.each((classNames || "").split(/\s+/), function(i, className){
- if ( elem.nodeType == 1 && !jQuery.className.has( elem.className, className ) )
- elem.className += (elem.className ? " " : "") + className;
- });
- },
-
- // internal only, use removeClass("class")
- remove: function( elem, classNames ) {
- if (elem.nodeType == 1)
- elem.className = classNames != undefined ?
- jQuery.grep(elem.className.split(/\s+/), function(className){
- return !jQuery.className.has( classNames, className );
- }).join(" ") :
- "";
- },
-
- // internal only, use hasClass("class")
- has: function( elem, className ) {
- return jQuery.inArray( className, (elem.className || elem).toString().split(/\s+/) ) > -1;
- }
- },
-
- // A method for quickly swapping in/out CSS properties to get correct calculations
- swap: function( elem, options, callback ) {
- var old = {};
- // Remember the old values, and insert the new ones
- for ( var name in options ) {
- old[ name ] = elem.style[ name ];
- elem.style[ name ] = options[ name ];
- }
-
- callback.call( elem );
-
- // Revert the old values
- for ( var name in options )
- elem.style[ name ] = old[ name ];
- },
-
- css: function( elem, name, force ) {
- if ( name == "width" || name == "height" ) {
- var val, props = { position: "absolute", visibility: "hidden", display:"block" }, which = name == "width" ? [ "Left", "Right" ] : [ "Top", "Bottom" ];
-
- function getWH() {
- val = name == "width" ? elem.offsetWidth : elem.offsetHeight;
- var padding = 0, border = 0;
- jQuery.each( which, function() {
- padding += parseFloat(jQuery.curCSS( elem, "padding" + this, true)) || 0;
- border += parseFloat(jQuery.curCSS( elem, "border" + this + "Width", true)) || 0;
- });
- val -= Math.round(padding + border);
- }
-
- if ( jQuery(elem).is(":visible") )
- getWH();
- else
- jQuery.swap( elem, props, getWH );
-
- return Math.max(0, val);
- }
-
- return jQuery.curCSS( elem, name, force );
- },
-
- curCSS: function( elem, name, force ) {
- var ret, style = elem.style;
-
- // A helper method for determining if an element's values are broken
- function color( elem ) {
- if ( !jQuery.browser.safari )
- return false;
-
- // defaultView is cached
- var ret = defaultView.getComputedStyle( elem, null );
- return !ret || ret.getPropertyValue("color") == "";
- }
-
- // We need to handle opacity special in IE
- if ( name == "opacity" && jQuery.browser.msie ) {
- ret = jQuery.attr( style, "opacity" );
-
- return ret == "" ?
- "1" :
- ret;
- }
- // Opera sometimes will give the wrong display answer, this fixes it, see #2037
- if ( jQuery.browser.opera && name == "display" ) {
- var save = style.outline;
- style.outline = "0 solid black";
- style.outline = save;
- }
-
- // Make sure we're using the right name for getting the float value
- if ( name.match( /float/i ) )
- name = styleFloat;
-
- if ( !force && style && style[ name ] )
- ret = style[ name ];
-
- else if ( defaultView.getComputedStyle ) {
-
- // Only "float" is needed here
- if ( name.match( /float/i ) )
- name = "float";
-
- name = name.replace( /([A-Z])/g, "-$1" ).toLowerCase();
-
- var computedStyle = defaultView.getComputedStyle( elem, null );
-
- if ( computedStyle && !color( elem ) )
- ret = computedStyle.getPropertyValue( name );
-
- // If the element isn't reporting its values properly in Safari
- // then some display: none elements are involved
- else {
- var swap = [], stack = [], a = elem, i = 0;
-
- // Locate all of the parent display: none elements
- for ( ; a && color(a); a = a.parentNode )
- stack.unshift(a);
-
- // Go through and make them visible, but in reverse
- // (It would be better if we knew the exact display type that they had)
- for ( ; i < stack.length; i++ )
- if ( color( stack[ i ] ) ) {
- swap[ i ] = stack[ i ].style.display;
- stack[ i ].style.display = "block";
- }
-
- // Since we flip the display style, we have to handle that
- // one special, otherwise get the value
- ret = name == "display" && swap[ stack.length - 1 ] != null ?
- "none" :
- ( computedStyle && computedStyle.getPropertyValue( name ) ) || "";
-
- // Finally, revert the display styles back
- for ( i = 0; i < swap.length; i++ )
- if ( swap[ i ] != null )
- stack[ i ].style.display = swap[ i ];
- }
-
- // We should always get a number back from opacity
- if ( name == "opacity" && ret == "" )
- ret = "1";
-
- } else if ( elem.currentStyle ) {
- var camelCase = name.replace(/\-(\w)/g, function(all, letter){
- return letter.toUpperCase();
- });
-
- ret = elem.currentStyle[ name ] || elem.currentStyle[ camelCase ];
-
- // From the awesome hack by Dean Edwards
- // http://erik.eae.net/archives/2007/07/27/18.54.15/#comment-102291
-
- // If we're not dealing with a regular pixel number
- // but a number that has a weird ending, we need to convert it to pixels
- if ( !/^\d+(px)?$/i.test( ret ) && /^\d/.test( ret ) ) {
- // Remember the original values
- var left = style.left, rsLeft = elem.runtimeStyle.left;
-
- // Put in the new values to get a computed value out
- elem.runtimeStyle.left = elem.currentStyle.left;
- style.left = ret || 0;
- ret = style.pixelLeft + "px";
-
- // Revert the changed values
- style.left = left;
- elem.runtimeStyle.left = rsLeft;
- }
- }
-
- return ret;
- },
-
- clean: function( elems, context ) {
- var ret = [];
- context = context || document;
- // !context.createElement fails in IE with an error but returns typeof 'object'
- if (typeof context.createElement == 'undefined')
- context = context.ownerDocument || context[0] && context[0].ownerDocument || document;
-
- jQuery.each(elems, function(i, elem){
- if ( !elem )
- return;
-
- if ( elem.constructor == Number )
- elem += '';
-
- // Convert html string into DOM nodes
- if ( typeof elem == "string" ) {
- // Fix "XHTML"-style tags in all browsers
- elem = elem.replace(/(<(\w+)[^>]*?)\/>/g, function(all, front, tag){
- return tag.match(/^(abbr|br|col|img|input|link|meta|param|hr|area|embed)$/i) ?
- all :
- front + "></" + tag + ">";
- });
-
- // Trim whitespace, otherwise indexOf won't work as expected
- var tags = jQuery.trim( elem ).toLowerCase(), div = context.createElement("div");
-
- var wrap =
- // option or optgroup
- !tags.indexOf("<opt") &&
- [ 1, "<select multiple='multiple'>", "</select>" ] ||
-
- !tags.indexOf("<leg") &&
- [ 1, "<fieldset>", "</fieldset>" ] ||
-
- tags.match(/^<(thead|tbody|tfoot|colg|cap)/) &&
- [ 1, "<table>", "</table>" ] ||
-
- !tags.indexOf("<tr") &&
- [ 2, "<table><tbody>", "</tbody></table>" ] ||
-
- // <thead> matched above
- (!tags.indexOf("<td") || !tags.indexOf("<th")) &&
- [ 3, "<table><tbody><tr>", "</tr></tbody></table>" ] ||
-
- !tags.indexOf("<col") &&
- [ 2, "<table><tbody></tbody><colgroup>", "</colgroup></table>" ] ||
-
- // IE can't serialize <link> and <script> tags normally
- jQuery.browser.msie &&
- [ 1, "div<div>", "</div>" ] ||
-
- [ 0, "", "" ];
-
- // Go to html and back, then peel off extra wrappers
- div.innerHTML = wrap[1] + elem + wrap[2];
-
- // Move to the right depth
- while ( wrap[0]-- )
- div = div.lastChild;
-
- // Remove IE's autoinserted <tbody> from table fragments
- if ( jQuery.browser.msie ) {
-
- // String was a <table>, *may* have spurious <tbody>
- var tbody = !tags.indexOf("<table") && tags.indexOf("<tbody") < 0 ?
- div.firstChild && div.firstChild.childNodes :
-
- // String was a bare <thead> or <tfoot>
- wrap[1] == "<table>" && tags.indexOf("<tbody") < 0 ?
- div.childNodes :
- [];
-
- for ( var j = tbody.length - 1; j >= 0 ; --j )
- if ( jQuery.nodeName( tbody[ j ], "tbody" ) && !tbody[ j ].childNodes.length )
- tbody[ j ].parentNode.removeChild( tbody[ j ] );
-
- // IE completely kills leading whitespace when innerHTML is used
- if ( /^\s/.test( elem ) )
- div.insertBefore( context.createTextNode( elem.match(/^\s*/)[0] ), div.firstChild );
-
- }
-
- elem = jQuery.makeArray( div.childNodes );
- }
-
- if ( elem.length === 0 && (!jQuery.nodeName( elem, "form" ) && !jQuery.nodeName( elem, "select" )) )
- return;
-
- if ( elem[0] == undefined || jQuery.nodeName( elem, "form" ) || elem.options )
- ret.push( elem );
-
- else
- ret = jQuery.merge( ret, elem );
-
- });
-
- return ret;
- },
-
- attr: function( elem, name, value ) {
- // don't set attributes on text and comment nodes
- if (!elem || elem.nodeType == 3 || elem.nodeType == 8)
- return undefined;
-
- var notxml = !jQuery.isXMLDoc( elem ),
- // Whether we are setting (or getting)
- set = value !== undefined,
- msie = jQuery.browser.msie;
-
- // Try to normalize/fix the name
- name = notxml && jQuery.props[ name ] || name;
-
- // Only do all the following if this is a node (faster for style)
- // IE elem.getAttribute passes even for style
- if ( elem.tagName ) {
-
- // These attributes require special treatment
- var special = /href|src|style/.test( name );
-
- // Safari mis-reports the default selected property of a hidden option
- // Accessing the parent's selectedIndex property fixes it
- if ( name == "selected" && jQuery.browser.safari )
- elem.parentNode.selectedIndex;
-
- // If applicable, access the attribute via the DOM 0 way
- if ( name in elem && notxml && !special ) {
- if ( set ){
- // We can't allow the type property to be changed (since it causes problems in IE)
- if ( name == "type" && jQuery.nodeName( elem, "input" ) && elem.parentNode )
- throw "type property can't be changed";
-
- elem[ name ] = value;
- }
-
- // browsers index elements by id/name on forms, give priority to attributes.
- if( jQuery.nodeName( elem, "form" ) && elem.getAttributeNode(name) )
- return elem.getAttributeNode( name ).nodeValue;
-
- return elem[ name ];
- }
-
- if ( msie && notxml && name == "style" )
- return jQuery.attr( elem.style, "cssText", value );
-
- if ( set )
- // convert the value to a string (all browsers do this but IE) see #1070
- elem.setAttribute( name, "" + value );
-
- var attr = msie && notxml && special
- // Some attributes require a special call on IE
- ? elem.getAttribute( name, 2 )
- : elem.getAttribute( name );
-
- // Non-existent attributes return null, we normalize to undefined
- return attr === null ? undefined : attr;
- }
-
- // elem is actually elem.style ... set the style
-
- // IE uses filters for opacity
- if ( msie && name == "opacity" ) {
- if ( set ) {
- // IE has trouble with opacity if it does not have layout
- // Force it by setting the zoom level
- elem.zoom = 1;
-
- // Set the alpha filter to set the opacity
- elem.filter = (elem.filter || "").replace( /alpha\([^)]*\)/, "" ) +
- (parseInt( value ) + '' == "NaN" ? "" : "alpha(opacity=" + value * 100 + ")");
- }
-
- return elem.filter && elem.filter.indexOf("opacity=") >= 0 ?
- (parseFloat( elem.filter.match(/opacity=([^)]*)/)[1] ) / 100) + '':
- "";
- }
-
- name = name.replace(/-([a-z])/ig, function(all, letter){
- return letter.toUpperCase();
- });
-
- if ( set )
- elem[ name ] = value;
-
- return elem[ name ];
- },
-
- trim: function( text ) {
- return (text || "").replace( /^\s+|\s+$/g, "" );
- },
-
- makeArray: function( array ) {
- var ret = [];
-
- if( array != null ){
- var i = array.length;
- //the window, strings and functions also have 'length'
- if( i == null || array.split || array.setInterval || array.call )
- ret[0] = array;
- else
- while( i )
- ret[--i] = array[i];
- }
-
- return ret;
- },
-
- inArray: function( elem, array ) {
- for ( var i = 0, length = array.length; i < length; i++ )
- // Use === because on IE, window == document
- if ( array[ i ] === elem )
- return i;
-
- return -1;
- },
-
- merge: function( first, second ) {
- // We have to loop this way because IE & Opera overwrite the length
- // expando of getElementsByTagName
- var i = 0, elem, pos = first.length;
- // Also, we need to make sure that the correct elements are being returned
- // (IE returns comment nodes in a '*' query)
- if ( jQuery.browser.msie ) {
- while ( elem = second[ i++ ] )
- if ( elem.nodeType != 8 )
- first[ pos++ ] = elem;
-
- } else
- while ( elem = second[ i++ ] )
- first[ pos++ ] = elem;
-
- return first;
- },
-
- unique: function( array ) {
- var ret = [], done = {};
-
- try {
-
- for ( var i = 0, length = array.length; i < length; i++ ) {
- var id = jQuery.data( array[ i ] );
-
- if ( !done[ id ] ) {
- done[ id ] = true;
- ret.push( array[ i ] );
- }
- }
-
- } catch( e ) {
- ret = array;
- }
-
- return ret;
- },
-
- grep: function( elems, callback, inv ) {
- var ret = [];
-
- // Go through the array, only saving the items
- // that pass the validator function
- for ( var i = 0, length = elems.length; i < length; i++ )
- if ( !inv != !callback( elems[ i ], i ) )
- ret.push( elems[ i ] );
-
- return ret;
- },
-
- map: function( elems, callback ) {
- var ret = [];
-
- // Go through the array, translating each of the items to their
- // new value (or values).
- for ( var i = 0, length = elems.length; i < length; i++ ) {
- var value = callback( elems[ i ], i );
-
- if ( value != null )
- ret[ ret.length ] = value;
- }
-
- return ret.concat.apply( [], ret );
- }
-});
-
-var userAgent = navigator.userAgent.toLowerCase();
-
-// Figure out what browser is being used
-jQuery.browser = {
- version: (userAgent.match( /.+(?:rv|it|ra|ie)[\/: ]([\d.]+)/ ) || [])[1],
- safari: /webkit/.test( userAgent ),
- opera: /opera/.test( userAgent ),
- msie: /msie/.test( userAgent ) && !/opera/.test( userAgent ),
- mozilla: /mozilla/.test( userAgent ) && !/(compatible|webkit)/.test( userAgent )
-};
-
-var styleFloat = jQuery.browser.msie ?
- "styleFloat" :
- "cssFloat";
-
-jQuery.extend({
- // Check to see if the W3C box model is being used
- boxModel: !jQuery.browser.msie || document.compatMode == "CSS1Compat",
-
- props: {
- "for": "htmlFor",
- "class": "className",
- "float": styleFloat,
- cssFloat: styleFloat,
- styleFloat: styleFloat,
- readonly: "readOnly",
- maxlength: "maxLength",
- cellspacing: "cellSpacing"
- }
-});
-
-jQuery.each({
- parent: function(elem){return elem.parentNode;},
- parents: function(elem){return jQuery.dir(elem,"parentNode");},
- next: function(elem){return jQuery.nth(elem,2,"nextSibling");},
- prev: function(elem){return jQuery.nth(elem,2,"previousSibling");},
- nextAll: function(elem){return jQuery.dir(elem,"nextSibling");},
- prevAll: function(elem){return jQuery.dir(elem,"previousSibling");},
- siblings: function(elem){return jQuery.sibling(elem.parentNode.firstChild,elem);},
- children: function(elem){return jQuery.sibling(elem.firstChild);},
- contents: function(elem){return jQuery.nodeName(elem,"iframe")?elem.contentDocument||elem.contentWindow.document:jQuery.makeArray(elem.childNodes);}
-}, function(name, fn){
- jQuery.fn[ name ] = function( selector ) {
- var ret = jQuery.map( this, fn );
-
- if ( selector && typeof selector == "string" )
- ret = jQuery.multiFilter( selector, ret );
-
- return this.pushStack( jQuery.unique( ret ) );
- };
-});
-
-jQuery.each({
- appendTo: "append",
- prependTo: "prepend",
- insertBefore: "before",
- insertAfter: "after",
- replaceAll: "replaceWith"
-}, function(name, original){
- jQuery.fn[ name ] = function() {
- var args = arguments;
-
- return this.each(function(){
- for ( var i = 0, length = args.length; i < length; i++ )
- jQuery( args[ i ] )[ original ]( this );
- });
- };
-});
-
-jQuery.each({
- removeAttr: function( name ) {
- jQuery.attr( this, name, "" );
- if (this.nodeType == 1)
- this.removeAttribute( name );
- },
-
- addClass: function( classNames ) {
- jQuery.className.add( this, classNames );
- },
-
- removeClass: function( classNames ) {
- jQuery.className.remove( this, classNames );
- },
-
- toggleClass: function( classNames ) {
- jQuery.className[ jQuery.className.has( this, classNames ) ? "remove" : "add" ]( this, classNames );
- },
-
- remove: function( selector ) {
- if ( !selector || jQuery.filter( selector, [ this ] ).r.length ) {
- // Prevent memory leaks
- jQuery( "*", this ).add(this).each(function(){
- jQuery.event.remove(this);
- jQuery.removeData(this);
- });
- if (this.parentNode)
- this.parentNode.removeChild( this );
- }
- },
-
- empty: function() {
- // Remove element nodes and prevent memory leaks
- jQuery( ">*", this ).remove();
-
- // Remove any remaining nodes
- while ( this.firstChild )
- this.removeChild( this.firstChild );
- }
-}, function(name, fn){
- jQuery.fn[ name ] = function(){
- return this.each( fn, arguments );
- };
-});
-
-jQuery.each([ "Height", "Width" ], function(i, name){
- var type = name.toLowerCase();
-
- jQuery.fn[ type ] = function( size ) {
- // Get window width or height
- return this[0] == window ?
- // Opera reports document.body.client[Width/Height] properly in both quirks and standards
- jQuery.browser.opera && document.body[ "client" + name ] ||
-
- // Safari reports inner[Width/Height] just fine (Mozilla and Opera include scroll bar widths)
- jQuery.browser.safari && window[ "inner" + name ] ||
-
- // Everyone else use document.documentElement or document.body depending on Quirks vs Standards mode
- document.compatMode == "CSS1Compat" && document.documentElement[ "client" + name ] || document.body[ "client" + name ] :
-
- // Get document width or height
- this[0] == document ?
- // Either scroll[Width/Height] or offset[Width/Height], whichever is greater
- Math.max(
- Math.max(document.body["scroll" + name], document.documentElement["scroll" + name]),
- Math.max(document.body["offset" + name], document.documentElement["offset" + name])
- ) :
-
- // Get or set width or height on the element
- size == undefined ?
- // Get width or height on the element
- (this.length ? jQuery.css( this[0], type ) : null) :
-
- // Set the width or height on the element (default to pixels if value is unitless)
- this.css( type, size.constructor == String ? size : size + "px" );
- };
-});
-
-// Helper function used by the dimensions and offset modules
-function num(elem, prop) {
- return elem[0] && parseInt( jQuery.curCSS(elem[0], prop, true), 10 ) || 0;
-}var chars = jQuery.browser.safari && parseInt(jQuery.browser.version) < 417 ?
- "(?:[\\w*_-]|\\\\.)" :
- "(?:[\\w\u0128-\uFFFF*_-]|\\\\.)",
- quickChild = new RegExp("^>\\s*(" + chars + "+)"),
- quickID = new RegExp("^(" + chars + "+)(#)(" + chars + "+)"),
- quickClass = new RegExp("^([#.]?)(" + chars + "*)");
-
-jQuery.extend({
- expr: {
- "": function(a,i,m){return m[2]=="*"||jQuery.nodeName(a,m[2]);},
- "#": function(a,i,m){return a.getAttribute("id")==m[2];},
- ":": {
- // Position Checks
- lt: function(a,i,m){return i<m[3]-0;},
- gt: function(a,i,m){return i>m[3]-0;},
- nth: function(a,i,m){return m[3]-0==i;},
- eq: function(a,i,m){return m[3]-0==i;},
- first: function(a,i){return i==0;},
- last: function(a,i,m,r){return i==r.length-1;},
- even: function(a,i){return i%2==0;},
- odd: function(a,i){return i%2;},
-
- // Child Checks
- "first-child": function(a){return a.parentNode.getElementsByTagName("*")[0]==a;},
- "last-child": function(a){return jQuery.nth(a.parentNode.lastChild,1,"previousSibling")==a;},
- "only-child": function(a){return !jQuery.nth(a.parentNode.lastChild,2,"previousSibling");},
-
- // Parent Checks
- parent: function(a){return a.firstChild;},
- empty: function(a){return !a.firstChild;},
-
- // Text Check
- contains: function(a,i,m){return (a.textContent||a.innerText||jQuery(a).text()||"").indexOf(m[3])>=0;},
-
- // Visibility
- visible: function(a){return "hidden"!=a.type&&jQuery.css(a,"display")!="none"&&jQuery.css(a,"visibility")!="hidden";},
- hidden: function(a){return "hidden"==a.type||jQuery.css(a,"display")=="none"||jQuery.css(a,"visibility")=="hidden";},
-
- // Form attributes
- enabled: function(a){return !a.disabled;},
- disabled: function(a){return a.disabled;},
- checked: function(a){return a.checked;},
- selected: function(a){return a.selected||jQuery.attr(a,"selected");},
-
- // Form elements
- text: function(a){return "text"==a.type;},
- radio: function(a){return "radio"==a.type;},
- checkbox: function(a){return "checkbox"==a.type;},
- file: function(a){return "file"==a.type;},
- password: function(a){return "password"==a.type;},
- submit: function(a){return "submit"==a.type;},
- image: function(a){return "image"==a.type;},
- reset: function(a){return "reset"==a.type;},
- button: function(a){return "button"==a.type||jQuery.nodeName(a,"button");},
- input: function(a){return /input|select|textarea|button/i.test(a.nodeName);},
-
- // :has()
- has: function(a,i,m){return jQuery.find(m[3],a).length;},
-
- // :header
- header: function(a){return /h\d/i.test(a.nodeName);},
-
- // :animated
- animated: function(a){return jQuery.grep(jQuery.timers,function(fn){return a==fn.elem;}).length;}
- }
- },
-
- // The regular expressions that power the parsing engine
- parse: [
- // Match: [@value='test'], [@foo]
- /^(\[) *@?([\w-]+) *([!*$^~=]*) *('?"?)(.*?)\4 *\]/,
-
- // Match: :contains('foo')
- /^(:)([\w-]+)\("?'?(.*?(\(.*?\))?[^(]*?)"?'?\)/,
-
- // Match: :even, :last-child, #id, .class
- new RegExp("^([:.#]*)(" + chars + "+)")
- ],
-
- multiFilter: function( expr, elems, not ) {
- var old, cur = [];
-
- while ( expr && expr != old ) {
- old = expr;
- var f = jQuery.filter( expr, elems, not );
- expr = f.t.replace(/^\s*,\s*/, "" );
- cur = not ? elems = f.r : jQuery.merge( cur, f.r );
- }
-
- return cur;
- },
-
- find: function( t, context ) {
- // Quickly handle non-string expressions
- if ( typeof t != "string" )
- return [ t ];
-
- // check to make sure context is a DOM element or a document
- if ( context && context.nodeType != 1 && context.nodeType != 9)
- return [ ];
-
- // Set the correct context (if none is provided)
- context = context || document;
-
- // Initialize the search
- var ret = [context], done = [], last, nodeName;
-
- // Continue while a selector expression exists, and while
- // we're no longer looping upon ourselves
- while ( t && last != t ) {
- var r = [];
- last = t;
-
- t = jQuery.trim(t);
-
- var foundToken = false,
-
- // An attempt at speeding up child selectors that
- // point to a specific element tag
- re = quickChild,
-
- m = re.exec(t);
-
- if ( m ) {
- nodeName = m[1].toUpperCase();
-
- // Perform our own iteration and filter
- for ( var i = 0; ret[i]; i++ )
- for ( var c = ret[i].firstChild; c; c = c.nextSibling )
- if ( c.nodeType == 1 && (nodeName == "*" || c.nodeName.toUpperCase() == nodeName) )
- r.push( c );
-
- ret = r;
- t = t.replace( re, "" );
- if ( t.indexOf(" ") == 0 ) continue;
- foundToken = true;
- } else {
- re = /^([>+~])\s*(\w*)/i;
-
- if ( (m = re.exec(t)) != null ) {
- r = [];
-
- var merge = {};
- nodeName = m[2].toUpperCase();
- m = m[1];
-
- for ( var j = 0, rl = ret.length; j < rl; j++ ) {
- var n = m == "~" || m == "+" ? ret[j].nextSibling : ret[j].firstChild;
- for ( ; n; n = n.nextSibling )
- if ( n.nodeType == 1 ) {
- var id = jQuery.data(n);
-
- if ( m == "~" && merge[id] ) break;
-
- if (!nodeName || n.nodeName.toUpperCase() == nodeName ) {
- if ( m == "~" ) merge[id] = true;
- r.push( n );
- }
-
- if ( m == "+" ) break;
- }
- }
-
- ret = r;
-
- // And remove the token
- t = jQuery.trim( t.replace( re, "" ) );
- foundToken = true;
- }
- }
-
- // See if there's still an expression, and that we haven't already
- // matched a token
- if ( t && !foundToken ) {
- // Handle multiple expressions
- if ( !t.indexOf(",") ) {
- // Clean the result set
- if ( context == ret[0] ) ret.shift();
-
- // Merge the result sets
- done = jQuery.merge( done, ret );
-
- // Reset the context
- r = ret = [context];
-
- // Touch up the selector string
- t = " " + t.substr(1,t.length);
-
- } else {
- // Optimize for the case nodeName#idName
- var re2 = quickID;
- var m = re2.exec(t);
-
- // Re-organize the results, so that they're consistent
- if ( m ) {
- m = [ 0, m[2], m[3], m[1] ];
-
- } else {
- // Otherwise, do a traditional filter check for
- // ID, class, and element selectors
- re2 = quickClass;
- m = re2.exec(t);
- }
-
- m[2] = m[2].replace(/\\/g, "");
-
- var elem = ret[ret.length-1];
-
- // Try to do a global search by ID, where we can
- if ( m[1] == "#" && elem && elem.getElementById && !jQuery.isXMLDoc(elem) ) {
- // Optimization for HTML document case
- var oid = elem.getElementById(m[2]);
-
- // Do a quick check for the existence of the actual ID attribute
- // to avoid selecting by the name attribute in IE
- // also check to insure id is a string to avoid selecting an element with the name of 'id' inside a form
- if ( (jQuery.browser.msie||jQuery.browser.opera) && oid && typeof oid.id == "string" && oid.id != m[2] )
- oid = jQuery('[@id="'+m[2]+'"]', elem)[0];
-
- // Do a quick check for node name (where applicable) so
- // that div#foo searches will be really fast
- ret = r = oid && (!m[3] || jQuery.nodeName(oid, m[3])) ? [oid] : [];
- } else {
- // We need to find all descendant elements
- for ( var i = 0; ret[i]; i++ ) {
- // Grab the tag name being searched for
- var tag = m[1] == "#" && m[3] ? m[3] : m[1] != "" || m[0] == "" ? "*" : m[2];
-
- // Handle IE7 being really dumb about <object>s
- if ( tag == "*" && ret[i].nodeName.toLowerCase() == "object" )
- tag = "param";
-
- r = jQuery.merge( r, ret[i].getElementsByTagName( tag ));
- }
-
- // It's faster to filter by class and be done with it
- if ( m[1] == "." )
- r = jQuery.classFilter( r, m[2] );
-
- // Same with ID filtering
- if ( m[1] == "#" ) {
- var tmp = [];
-
- // Try to find the element with the ID
- for ( var i = 0; r[i]; i++ )
- if ( r[i].getAttribute("id") == m[2] ) {
- tmp = [ r[i] ];
- break;
- }
-
- r = tmp;
- }
-
- ret = r;
- }
-
- t = t.replace( re2, "" );
- }
-
- }
-
- // If a selector string still exists
- if ( t ) {
- // Attempt to filter it
- var val = jQuery.filter(t,r);
- ret = r = val.r;
- t = jQuery.trim(val.t);
- }
- }
-
- // An error occurred with the selector;
- // just return an empty set instead
- if ( t )
- ret = [];
-
- // Remove the root context
- if ( ret && context == ret[0] )
- ret.shift();
-
- // And combine the results
- done = jQuery.merge( done, ret );
-
- return done;
- },
-
- classFilter: function(r,m,not){
- m = " " + m + " ";
- var tmp = [];
- for ( var i = 0; r[i]; i++ ) {
- var pass = (" " + r[i].className + " ").indexOf( m ) >= 0;
- if ( !not && pass || not && !pass )
- tmp.push( r[i] );
- }
- return tmp;
- },
-
- filter: function(t,r,not) {
- var last;
-
- // Look for common filter expressions
- while ( t && t != last ) {
- last = t;
-
- var p = jQuery.parse, m;
-
- for ( var i = 0; p[i]; i++ ) {
- m = p[i].exec( t );
-
- if ( m ) {
- // Remove what we just matched
- t = t.substring( m[0].length );
-
- m[2] = m[2].replace(/\\/g, "");
- break;
- }
- }
-
- if ( !m )
- break;
-
- // :not() is a special case that can be optimized by
- // keeping it out of the expression list
- if ( m[1] == ":" && m[2] == "not" )
- // optimize if only one selector found (most common case)
- r = isSimple.test( m[3] ) ?
- jQuery.filter(m[3], r, true).r :
- jQuery( r ).not( m[3] );
-
- // We can get a big speed boost by filtering by class here
- else if ( m[1] == "." )
- r = jQuery.classFilter(r, m[2], not);
-
- else if ( m[1] == "[" ) {
- var tmp = [], type = m[3];
-
- for ( var i = 0, rl = r.length; i < rl; i++ ) {
- var a = r[i], z = a[ jQuery.props[m[2]] || m[2] ];
-
- if ( z == null || /href|src|selected/.test(m[2]) )
- z = jQuery.attr(a,m[2]) || '';
-
- if ( (type == "" && !!z ||
- type == "=" && z == m[5] ||
- type == "!=" && z != m[5] ||
- type == "^=" && z && !z.indexOf(m[5]) ||
- type == "$=" && z.substr(z.length - m[5].length) == m[5] ||
- (type == "*=" || type == "~=") && z.indexOf(m[5]) >= 0) ^ not )
- tmp.push( a );
- }
-
- r = tmp;
-
- // We can get a speed boost by handling nth-child here
- } else if ( m[1] == ":" && m[2] == "nth-child" ) {
- var merge = {}, tmp = [],
- // parse equations like 'even', 'odd', '5', '2n', '3n+2', '4n-1', '-n+6'
- test = /(-?)(\d*)n((?:\+|-)?\d*)/.exec(
- m[3] == "even" && "2n" || m[3] == "odd" && "2n+1" ||
- !/\D/.test(m[3]) && "0n+" + m[3] || m[3]),
- // calculate the numbers (first)n+(last) including if they are negative
- first = (test[1] + (test[2] || 1)) - 0, last = test[3] - 0;
-
- // loop through all the elements left in the jQuery object
- for ( var i = 0, rl = r.length; i < rl; i++ ) {
- var node = r[i], parentNode = node.parentNode, id = jQuery.data(parentNode);
-
- if ( !merge[id] ) {
- var c = 1;
-
- for ( var n = parentNode.firstChild; n; n = n.nextSibling )
- if ( n.nodeType == 1 )
- n.nodeIndex = c++;
-
- merge[id] = true;
- }
-
- var add = false;
-
- if ( first == 0 ) {
- if ( node.nodeIndex == last )
- add = true;
- } else if ( (node.nodeIndex - last) % first == 0 && (node.nodeIndex - last) / first >= 0 )
- add = true;
-
- if ( add ^ not )
- tmp.push( node );
- }
-
- r = tmp;
-
- // Otherwise, find the expression to execute
- } else {
- var fn = jQuery.expr[ m[1] ];
- if ( typeof fn == "object" )
- fn = fn[ m[2] ];
-
- if ( typeof fn == "string" )
- fn = eval("false||function(a,i){return " + fn + ";}");
-
- // Execute it against the current filter
- r = jQuery.grep( r, function(elem, i){
- return fn(elem, i, m, r);
- }, not );
- }
- }
-
- // Return an array of filtered elements (r)
- // and the modified expression string (t)
- return { r: r, t: t };
- },
-
- dir: function( elem, dir ){
- var matched = [],
- cur = elem[dir];
- while ( cur && cur != document ) {
- if ( cur.nodeType == 1 )
- matched.push( cur );
- cur = cur[dir];
- }
- return matched;
- },
-
- nth: function(cur,result,dir,elem){
- result = result || 1;
- var num = 0;
-
- for ( ; cur; cur = cur[dir] )
- if ( cur.nodeType == 1 && ++num == result )
- break;
-
- return cur;
- },
-
- sibling: function( n, elem ) {
- var r = [];
-
- for ( ; n; n = n.nextSibling ) {
- if ( n.nodeType == 1 && n != elem )
- r.push( n );
- }
-
- return r;
- }
-});
-/*
- * A number of helper functions used for managing events.
- * Many of the ideas behind this code orignated from
- * Dean Edwards' addEvent library.
- */
-jQuery.event = {
-
- // Bind an event to an element
- // Original by Dean Edwards
- add: function(elem, types, handler, data) {
- if ( elem.nodeType == 3 || elem.nodeType == 8 )
- return;
-
- // For whatever reason, IE has trouble passing the window object
- // around, causing it to be cloned in the process
- if ( jQuery.browser.msie && elem.setInterval )
- elem = window;
-
- // Make sure that the function being executed has a unique ID
- if ( !handler.guid )
- handler.guid = this.guid++;
-
- // if data is passed, bind to handler
- if( data != undefined ) {
- // Create temporary function pointer to original handler
- var fn = handler;
-
- // Create unique handler function, wrapped around original handler
- handler = this.proxy( fn, function() {
- // Pass arguments and context to original handler
- return fn.apply(this, arguments);
- });
-
- // Store data in unique handler
- handler.data = data;
- }
-
- // Init the element's event structure
- var events = jQuery.data(elem, "events") || jQuery.data(elem, "events", {}),
- handle = jQuery.data(elem, "handle") || jQuery.data(elem, "handle", function(){
- // Handle the second event of a trigger and when
- // an event is called after a page has unloaded
- if ( typeof jQuery != "undefined" && !jQuery.event.triggered )
- return jQuery.event.handle.apply(arguments.callee.elem, arguments);
- });
- // Add elem as a property of the handle function
- // This is to prevent a memory leak with non-native
- // event in IE.
- handle.elem = elem;
-
- // Handle multiple events separated by a space
- // jQuery(...).bind("mouseover mouseout", fn);
- jQuery.each(types.split(/\s+/), function(index, type) {
- // Namespaced event handlers
- var parts = type.split(".");
- type = parts[0];
- handler.type = parts[1];
-
- // Get the current list of functions bound to this event
- var handlers = events[type];
-
- // Init the event handler queue
- if (!handlers) {
- handlers = events[type] = {};
-
- // Check for a special event handler
- // Only use addEventListener/attachEvent if the special
- // events handler returns false
- if ( !jQuery.event.special[type] || jQuery.event.special[type].setup.call(elem) === false ) {
- // Bind the global event handler to the element
- if (elem.addEventListener)
- elem.addEventListener(type, handle, false);
- else if (elem.attachEvent)
- elem.attachEvent("on" + type, handle);
- }
- }
-
- // Add the function to the element's handler list
- handlers[handler.guid] = handler;
-
- // Keep track of which events have been used, for global triggering
- jQuery.event.global[type] = true;
- });
-
- // Nullify elem to prevent memory leaks in IE
- elem = null;
- },
-
- guid: 1,
- global: {},
-
- // Detach an event or set of events from an element
- remove: function(elem, types, handler) {
- // don't do events on text and comment nodes
- if ( elem.nodeType == 3 || elem.nodeType == 8 )
- return;
-
- var events = jQuery.data(elem, "events"), ret, index;
-
- if ( events ) {
- // Unbind all events for the element
- if ( types == undefined || (typeof types == "string" && types.charAt(0) == ".") )
- for ( var type in events )
- this.remove( elem, type + (types || "") );
- else {
- // types is actually an event object here
- if ( types.type ) {
- handler = types.handler;
- types = types.type;
- }
-
- // Handle multiple events seperated by a space
- // jQuery(...).unbind("mouseover mouseout", fn);
- jQuery.each(types.split(/\s+/), function(index, type){
- // Namespaced event handlers
- var parts = type.split(".");
- type = parts[0];
-
- if ( events[type] ) {
- // remove the given handler for the given type
- if ( handler )
- delete events[type][handler.guid];
-
- // remove all handlers for the given type
- else
- for ( handler in events[type] )
- // Handle the removal of namespaced events
- if ( !parts[1] || events[type][handler].type == parts[1] )
- delete events[type][handler];
-
- // remove generic event handler if no more handlers exist
- for ( ret in events[type] ) break;
- if ( !ret ) {
- if ( !jQuery.event.special[type] || jQuery.event.special[type].teardown.call(elem) === false ) {
- if (elem.removeEventListener)
- elem.removeEventListener(type, jQuery.data(elem, "handle"), false);
- else if (elem.detachEvent)
- elem.detachEvent("on" + type, jQuery.data(elem, "handle"));
- }
- ret = null;
- delete events[type];
- }
- }
- });
- }
-
- // Remove the expando if it's no longer used
- for ( ret in events ) break;
- if ( !ret ) {
- var handle = jQuery.data( elem, "handle" );
- if ( handle ) handle.elem = null;
- jQuery.removeData( elem, "events" );
- jQuery.removeData( elem, "handle" );
- }
- }
- },
-
- trigger: function(type, data, elem, donative, extra) {
- // Clone the incoming data, if any
- data = jQuery.makeArray(data);
-
- if ( type.indexOf("!") >= 0 ) {
- type = type.slice(0, -1);
- var exclusive = true;
- }
-
- // Handle a global trigger
- if ( !elem ) {
- // Only trigger if we've ever bound an event for it
- if ( this.global[type] )
- jQuery("*").add([window, document]).trigger(type, data);
-
- // Handle triggering a single element
- } else {
- // don't do events on text and comment nodes
- if ( elem.nodeType == 3 || elem.nodeType == 8 )
- return undefined;
-
- var val, ret, fn = jQuery.isFunction( elem[ type ] || null ),
- // Check to see if we need to provide a fake event, or not
- event = !data[0] || !data[0].preventDefault;
-
- // Pass along a fake event
- if ( event ) {
- data.unshift({
- type: type,
- target: elem,
- preventDefault: function(){},
- stopPropagation: function(){},
- timeStamp: now()
- });
- data[0][expando] = true; // no need to fix fake event
- }
-
- // Enforce the right trigger type
- data[0].type = type;
- if ( exclusive )
- data[0].exclusive = true;
-
- // Trigger the event, it is assumed that "handle" is a function
- var handle = jQuery.data(elem, "handle");
- if ( handle )
- val = handle.apply( elem, data );
-
- // Handle triggering native .onfoo handlers (and on links since we don't call .click() for links)
- if ( (!fn || (jQuery.nodeName(elem, 'a') && type == "click")) && elem["on"+type] && elem["on"+type].apply( elem, data ) === false )
- val = false;
-
- // Extra functions don't get the custom event object
- if ( event )
- data.shift();
-
- // Handle triggering of extra function
- if ( extra && jQuery.isFunction( extra ) ) {
- // call the extra function and tack the current return value on the end for possible inspection
- ret = extra.apply( elem, val == null ? data : data.concat( val ) );
- // if anything is returned, give it precedence and have it overwrite the previous value
- if (ret !== undefined)
- val = ret;
- }
-
- // Trigger the native events (except for clicks on links)
- if ( fn && donative !== false && val !== false && !(jQuery.nodeName(elem, 'a') && type == "click") ) {
- this.triggered = true;
- try {
- elem[ type ]();
- // prevent IE from throwing an error for some hidden elements
- } catch (e) {}
- }
-
- this.triggered = false;
- }
-
- return val;
- },
-
- handle: function(event) {
- // returned undefined or false
- var val, ret, namespace, all, handlers;
-
- event = arguments[0] = jQuery.event.fix( event || window.event );
-
- // Namespaced event handlers
- namespace = event.type.split(".");
- event.type = namespace[0];
- namespace = namespace[1];
- // Cache this now, all = true means, any handler
- all = !namespace && !event.exclusive;
-
- handlers = ( jQuery.data(this, "events") || {} )[event.type];
-
- for ( var j in handlers ) {
- var handler = handlers[j];
-
- // Filter the functions by class
- if ( all || handler.type == namespace ) {
- // Pass in a reference to the handler function itself
- // So that we can later remove it
- event.handler = handler;
- event.data = handler.data;
-
- ret = handler.apply( this, arguments );
-
- if ( val !== false )
- val = ret;
-
- if ( ret === false ) {
- event.preventDefault();
- event.stopPropagation();
- }
- }
- }
-
- return val;
- },
-
- fix: function(event) {
- if ( event[expando] == true )
- return event;
-
- // store a copy of the original event object
- // and "clone" to set read-only properties
- var originalEvent = event;
- event = { originalEvent: originalEvent };
- var props = "altKey attrChange attrName bubbles button cancelable charCode clientX clientY ctrlKey currentTarget data detail eventPhase fromElement handler keyCode metaKey newValue originalTarget pageX pageY prevValue relatedNode relatedTarget screenX screenY shiftKey srcElement target timeStamp toElement type view wheelDelta which".split(" ");
- for ( var i=props.length; i; i-- )
- event[ props[i] ] = originalEvent[ props[i] ];
-
- // Mark it as fixed
- event[expando] = true;
-
- // add preventDefault and stopPropagation since
- // they will not work on the clone
- event.preventDefault = function() {
- // if preventDefault exists run it on the original event
- if (originalEvent.preventDefault)
- originalEvent.preventDefault();
- // otherwise set the returnValue property of the original event to false (IE)
- originalEvent.returnValue = false;
- };
- event.stopPropagation = function() {
- // if stopPropagation exists run it on the original event
- if (originalEvent.stopPropagation)
- originalEvent.stopPropagation();
- // otherwise set the cancelBubble property of the original event to true (IE)
- originalEvent.cancelBubble = true;
- };
-
- // Fix timeStamp
- event.timeStamp = event.timeStamp || now();
-
- // Fix target property, if necessary
- if ( !event.target )
- event.target = event.srcElement || document; // Fixes #1925 where srcElement might not be defined either
-
- // check if target is a textnode (safari)
- if ( event.target.nodeType == 3 )
- event.target = event.target.parentNode;
-
- // Add relatedTarget, if necessary
- if ( !event.relatedTarget && event.fromElement )
- event.relatedTarget = event.fromElement == event.target ? event.toElement : event.fromElement;
-
- // Calculate pageX/Y if missing and clientX/Y available
- if ( event.pageX == null && event.clientX != null ) {
- var doc = document.documentElement, body = document.body;
- event.pageX = event.clientX + (doc && doc.scrollLeft || body && body.scrollLeft || 0) - (doc.clientLeft || 0);
- event.pageY = event.clientY + (doc && doc.scrollTop || body && body.scrollTop || 0) - (doc.clientTop || 0);
- }
-
- // Add which for key events
- if ( !event.which && ((event.charCode || event.charCode === 0) ? event.charCode : event.keyCode) )
- event.which = event.charCode || event.keyCode;
-
- // Add metaKey to non-Mac browsers (use ctrl for PC's and Meta for Macs)
- if ( !event.metaKey && event.ctrlKey )
- event.metaKey = event.ctrlKey;
-
- // Add which for click: 1 == left; 2 == middle; 3 == right
- // Note: button is not normalized, so don't use it
- if ( !event.which && event.button )
- event.which = (event.button & 1 ? 1 : ( event.button & 2 ? 3 : ( event.button & 4 ? 2 : 0 ) ));
-
- return event;
- },
-
- proxy: function( fn, proxy ){
- // Set the guid of unique handler to the same of original handler, so it can be removed
- proxy.guid = fn.guid = fn.guid || proxy.guid || this.guid++;
- // So proxy can be declared as an argument
- return proxy;
- },
-
- special: {
- ready: {
- setup: function() {
- // Make sure the ready event is setup
- bindReady();
- return;
- },
-
- teardown: function() { return; }
- },
-
- mouseenter: {
- setup: function() {
- if ( jQuery.browser.msie ) return false;
- jQuery(this).bind("mouseover", jQuery.event.special.mouseenter.handler);
- return true;
- },
-
- teardown: function() {
- if ( jQuery.browser.msie ) return false;
- jQuery(this).unbind("mouseover", jQuery.event.special.mouseenter.handler);
- return true;
- },
-
- handler: function(event) {
- // If we actually just moused on to a sub-element, ignore it
- if ( withinElement(event, this) ) return true;
- // Execute the right handlers by setting the event type to mouseenter
- event.type = "mouseenter";
- return jQuery.event.handle.apply(this, arguments);
- }
- },
-
- mouseleave: {
- setup: function() {
- if ( jQuery.browser.msie ) return false;
- jQuery(this).bind("mouseout", jQuery.event.special.mouseleave.handler);
- return true;
- },
-
- teardown: function() {
- if ( jQuery.browser.msie ) return false;
- jQuery(this).unbind("mouseout", jQuery.event.special.mouseleave.handler);
- return true;
- },
-
- handler: function(event) {
- // If we actually just moused on to a sub-element, ignore it
- if ( withinElement(event, this) ) return true;
- // Execute the right handlers by setting the event type to mouseleave
- event.type = "mouseleave";
- return jQuery.event.handle.apply(this, arguments);
- }
- }
- }
-};
-
-jQuery.fn.extend({
- bind: function( type, data, fn ) {
- return type == "unload" ? this.one(type, data, fn) : this.each(function(){
- jQuery.event.add( this, type, fn || data, fn && data );
- });
- },
-
- one: function( type, data, fn ) {
- var one = jQuery.event.proxy( fn || data, function(event) {
- jQuery(this).unbind(event, one);
- return (fn || data).apply( this, arguments );
- });
- return this.each(function(){
- jQuery.event.add( this, type, one, fn && data);
- });
- },
-
- unbind: function( type, fn ) {
- return this.each(function(){
- jQuery.event.remove( this, type, fn );
- });
- },
-
- trigger: function( type, data, fn ) {
- return this.each(function(){
- jQuery.event.trigger( type, data, this, true, fn );
- });
- },
-
- triggerHandler: function( type, data, fn ) {
- return this[0] && jQuery.event.trigger( type, data, this[0], false, fn );
- },
-
- toggle: function( fn ) {
- // Save reference to arguments for access in closure
- var args = arguments, i = 1;
-
- // link all the functions, so any of them can unbind this click handler
- while( i < args.length )
- jQuery.event.proxy( fn, args[i++] );
-
- return this.click( jQuery.event.proxy( fn, function(event) {
- // Figure out which function to execute
- this.lastToggle = ( this.lastToggle || 0 ) % i;
-
- // Make sure that clicks stop
- event.preventDefault();
-
- // and execute the function
- return args[ this.lastToggle++ ].apply( this, arguments ) || false;
- }));
- },
-
- hover: function(fnOver, fnOut) {
- return this.bind('mouseenter', fnOver).bind('mouseleave', fnOut);
- },
-
- ready: function(fn) {
- // Attach the listeners
- bindReady();
-
- // If the DOM is already ready
- if ( jQuery.isReady )
- // Execute the function immediately
- fn.call( document, jQuery );
-
- // Otherwise, remember the function for later
- else
- // Add the function to the wait list
- jQuery.readyList.push( function() { return fn.call(this, jQuery); } );
-
- return this;
- }
-});
-
-jQuery.extend({
- isReady: false,
- readyList: [],
- // Handle when the DOM is ready
- ready: function() {
- // Make sure that the DOM is not already loaded
- if ( !jQuery.isReady ) {
- // Remember that the DOM is ready
- jQuery.isReady = true;
-
- // If there are functions bound, to execute
- if ( jQuery.readyList ) {
- // Execute all of them
- jQuery.each( jQuery.readyList, function(){
- this.call( document );
- });
-
- // Reset the list of functions
- jQuery.readyList = null;
- }
-
- // Trigger any bound ready events
- jQuery(document).triggerHandler("ready");
- }
- }
-});
-
-var readyBound = false;
-
-function bindReady(){
- if ( readyBound ) return;
- readyBound = true;
-
- // Mozilla, Opera (see further below for it) and webkit nightlies currently support this event
- if ( document.addEventListener && !jQuery.browser.opera)
- // Use the handy event callback
- document.addEventListener( "DOMContentLoaded", jQuery.ready, false );
-
- // If IE is used and is not in a frame
- // Continually check to see if the document is ready
- if ( jQuery.browser.msie && window == top ) (function(){
- if (jQuery.isReady) return;
- try {
- // If IE is used, use the trick by Diego Perini
- // http://javascript.nwbox.com/IEContentLoaded/
- document.documentElement.doScroll("left");
- } catch( error ) {
- setTimeout( arguments.callee, 0 );
- return;
- }
- // and execute any waiting functions
- jQuery.ready();
- })();
-
- if ( jQuery.browser.opera )
- document.addEventListener( "DOMContentLoaded", function () {
- if (jQuery.isReady) return;
- for (var i = 0; i < document.styleSheets.length; i++)
- if (document.styleSheets[i].disabled) {
- setTimeout( arguments.callee, 0 );
- return;
- }
- // and execute any waiting functions
- jQuery.ready();
- }, false);
-
- if ( jQuery.browser.safari ) {
- var numStyles;
- (function(){
- if (jQuery.isReady) return;
- if ( document.readyState != "loaded" && document.readyState != "complete" ) {
- setTimeout( arguments.callee, 0 );
- return;
- }
- if ( numStyles === undefined )
- numStyles = jQuery("style, link[rel=stylesheet]").length;
- if ( document.styleSheets.length != numStyles ) {
- setTimeout( arguments.callee, 0 );
- return;
- }
- // and execute any waiting functions
- jQuery.ready();
- })();
- }
-
- // A fallback to window.onload, that will always work
- jQuery.event.add( window, "load", jQuery.ready );
-}
-
-jQuery.each( ("blur,focus,load,resize,scroll,unload,click,dblclick," +
- "mousedown,mouseup,mousemove,mouseover,mouseout,change,select," +
- "submit,keydown,keypress,keyup,error").split(","), function(i, name){
-
- // Handle event binding
- jQuery.fn[name] = function(fn){
- return fn ? this.bind(name, fn) : this.trigger(name);
- };
-});
-
-// Checks if an event happened on an element within another element
-// Used in jQuery.event.special.mouseenter and mouseleave handlers
-var withinElement = function(event, elem) {
- // Check if mouse(over|out) are still within the same parent element
- var parent = event.relatedTarget;
- // Traverse up the tree
- while ( parent && parent != elem ) try { parent = parent.parentNode; } catch(error) { parent = elem; }
- // Return true if we actually just moused on to a sub-element
- return parent == elem;
-};
-
-// Prevent memory leaks in IE
-// And prevent errors on refresh with events like mouseover in other browsers
-// Window isn't included so as not to unbind existing unload events
-jQuery(window).bind("unload", function() {
- jQuery("*").add(document).unbind();
-});
-jQuery.fn.extend({
- // Keep a copy of the old load
- _load: jQuery.fn.load,
-
- load: function( url, params, callback ) {
- if ( typeof url != 'string' )
- return this._load( url );
-
- var off = url.indexOf(" ");
- if ( off >= 0 ) {
- var selector = url.slice(off, url.length);
- url = url.slice(0, off);
- }
-
- callback = callback || function(){};
-
- // Default to a GET request
- var type = "GET";
-
- // If the second parameter was provided
- if ( params )
- // If it's a function
- if ( jQuery.isFunction( params ) ) {
- // We assume that it's the callback
- callback = params;
- params = null;
-
- // Otherwise, build a param string
- } else {
- params = jQuery.param( params );
- type = "POST";
- }
-
- var self = this;
-
- // Request the remote document
- jQuery.ajax({
- url: url,
- type: type,
- dataType: "html",
- data: params,
- complete: function(res, status){
- // If successful, inject the HTML into all the matched elements
- if ( status == "success" || status == "notmodified" )
- // See if a selector was specified
- self.html( selector ?
- // Create a dummy div to hold the results
- jQuery("<div/>")
- // inject the contents of the document in, removing the scripts
- // to avoid any 'Permission Denied' errors in IE
- .append(res.responseText.replace(/<script(.|\s)*?\/script>/g, ""))
-
- // Locate the specified elements
- .find(selector) :
-
- // If not, just inject the full result
- res.responseText );
-
- self.each( callback, [res.responseText, status, res] );
- }
- });
- return this;
- },
-
- serialize: function() {
- return jQuery.param(this.serializeArray());
- },
- serializeArray: function() {
- return this.map(function(){
- return jQuery.nodeName(this, "form") ?
- jQuery.makeArray(this.elements) : this;
- })
- .filter(function(){
- return this.name && !this.disabled &&
- (this.checked || /select|textarea/i.test(this.nodeName) ||
- /text|hidden|password/i.test(this.type));
- })
- .map(function(i, elem){
- var val = jQuery(this).val();
- return val == null ? null :
- val.constructor == Array ?
- jQuery.map( val, function(val, i){
- return {name: elem.name, value: val};
- }) :
- {name: elem.name, value: val};
- }).get();
- }
-});
-
-// Attach a bunch of functions for handling common AJAX events
-jQuery.each( "ajaxStart,ajaxStop,ajaxComplete,ajaxError,ajaxSuccess,ajaxSend".split(","), function(i,o){
- jQuery.fn[o] = function(f){
- return this.bind(o, f);
- };
-});
-
-var jsc = now();
-
-jQuery.extend({
- get: function( url, data, callback, type ) {
- // shift arguments if data argument was ommited
- if ( jQuery.isFunction( data ) ) {
- callback = data;
- data = null;
- }
-
- return jQuery.ajax({
- type: "GET",
- url: url,
- data: data,
- success: callback,
- dataType: type
- });
- },
-
- getScript: function( url, callback ) {
- return jQuery.get(url, null, callback, "script");
- },
-
- getJSON: function( url, data, callback ) {
- return jQuery.get(url, data, callback, "json");
- },
-
- post: function( url, data, callback, type ) {
- if ( jQuery.isFunction( data ) ) {
- callback = data;
- data = {};
- }
-
- return jQuery.ajax({
- type: "POST",
- url: url,
- data: data,
- success: callback,
- dataType: type
- });
- },
-
- ajaxSetup: function( settings ) {
- jQuery.extend( jQuery.ajaxSettings, settings );
- },
-
- ajaxSettings: {
- url: location.href,
- global: true,
- type: "GET",
- timeout: 0,
- contentType: "application/x-www-form-urlencoded",
- processData: true,
- async: true,
- data: null,
- username: null,
- password: null,
- accepts: {
- xml: "application/xml, text/xml",
- html: "text/html",
- script: "text/javascript, application/javascript",
- json: "application/json, text/javascript",
- text: "text/plain",
- _default: "*/*"
- }
- },
-
- // Last-Modified header cache for next request
- lastModified: {},
-
- ajax: function( s ) {
- // Extend the settings, but re-extend 's' so that it can be
- // checked again later (in the test suite, specifically)
- s = jQuery.extend(true, s, jQuery.extend(true, {}, jQuery.ajaxSettings, s));
-
- var jsonp, jsre = /=\?(&|$)/g, status, data,
- type = s.type.toUpperCase();
-
- // convert data if not already a string
- if ( s.data && s.processData && typeof s.data != "string" )
- s.data = jQuery.param(s.data);
-
- // Handle JSONP Parameter Callbacks
- if ( s.dataType == "jsonp" ) {
- if ( type == "GET" ) {
- if ( !s.url.match(jsre) )
- s.url += (s.url.match(/\?/) ? "&" : "?") + (s.jsonp || "callback") + "=?";
- } else if ( !s.data || !s.data.match(jsre) )
- s.data = (s.data ? s.data + "&" : "") + (s.jsonp || "callback") + "=?";
- s.dataType = "json";
- }
-
- // Build temporary JSONP function
- if ( s.dataType == "json" && (s.data && s.data.match(jsre) || s.url.match(jsre)) ) {
- jsonp = "jsonp" + jsc++;
-
- // Replace the =? sequence both in the query string and the data
- if ( s.data )
- s.data = (s.data + "").replace(jsre, "=" + jsonp + "$1");
- s.url = s.url.replace(jsre, "=" + jsonp + "$1");
-
- // We need to make sure
- // that a JSONP style response is executed properly
- s.dataType = "script";
-
- // Handle JSONP-style loading
- window[ jsonp ] = function(tmp){
- data = tmp;
- success();
- complete();
- // Garbage collect
- window[ jsonp ] = undefined;
- try{ delete window[ jsonp ]; } catch(e){}
- if ( head )
- head.removeChild( script );
- };
- }
-
- if ( s.dataType == "script" && s.cache == null )
- s.cache = false;
-
- if ( s.cache === false && type == "GET" ) {
- var ts = now();
- // try replacing _= if it is there
- var ret = s.url.replace(/(\?|&)_=.*?(&|$)/, "$1_=" + ts + "$2");
- // if nothing was replaced, add timestamp to the end
- s.url = ret + ((ret == s.url) ? (s.url.match(/\?/) ? "&" : "?") + "_=" + ts : "");
- }
-
- // If data is available, append data to url for get requests
- if ( s.data && type == "GET" ) {
- s.url += (s.url.match(/\?/) ? "&" : "?") + s.data;
-
- // IE likes to send both get and post data, prevent this
- s.data = null;
- }
-
- // Watch for a new set of requests
- if ( s.global && ! jQuery.active++ )
- jQuery.event.trigger( "ajaxStart" );
-
- // Matches an absolute URL, and saves the domain
- var remote = /^(?:\w+:)?\/\/([^\/?#]+)/;
-
- // If we're requesting a remote document
- // and trying to load JSON or Script with a GET
- if ( s.dataType == "script" && type == "GET"
- && remote.test(s.url) && remote.exec(s.url)[1] != location.host ){
- var head = document.getElementsByTagName("head")[0];
- var script = document.createElement("script");
- script.src = s.url;
- if (s.scriptCharset)
- script.charset = s.scriptCharset;
-
- // Handle Script loading
- if ( !jsonp ) {
- var done = false;
-
- // Attach handlers for all browsers
- script.onload = script.onreadystatechange = function(){
- if ( !done && (!this.readyState ||
- this.readyState == "loaded" || this.readyState == "complete") ) {
- done = true;
- success();
- complete();
- head.removeChild( script );
- }
- };
- }
-
- head.appendChild(script);
-
- // We handle everything using the script element injection
- return undefined;
- }
-
- var requestDone = false;
-
- // Create the request object; Microsoft failed to properly
- // implement the XMLHttpRequest in IE7, so we use the ActiveXObject when it is available
- var xhr = window.ActiveXObject ? new ActiveXObject("Microsoft.XMLHTTP") : new XMLHttpRequest();
-
- // Open the socket
- // Passing null username, generates a login popup on Opera (#2865)
- if( s.username )
- xhr.open(type, s.url, s.async, s.username, s.password);
- else
- xhr.open(type, s.url, s.async);
-
- // Need an extra try/catch for cross domain requests in Firefox 3
- try {
- // Set the correct header, if data is being sent
- if ( s.data )
- xhr.setRequestHeader("Content-Type", s.contentType);
-
- // Set the If-Modified-Since header, if ifModified mode.
- if ( s.ifModified )
- xhr.setRequestHeader("If-Modified-Since",
- jQuery.lastModified[s.url] || "Thu, 01 Jan 1970 00:00:00 GMT" );
-
- // Set header so the called script knows that it's an XMLHttpRequest
- xhr.setRequestHeader("X-Requested-With", "XMLHttpRequest");
-
- // Set the Accepts header for the server, depending on the dataType
- xhr.setRequestHeader("Accept", s.dataType && s.accepts[ s.dataType ] ?
- s.accepts[ s.dataType ] + ", */*" :
- s.accepts._default );
- } catch(e){}
-
- // Allow custom headers/mimetypes
- if ( s.beforeSend && s.beforeSend(xhr, s) === false ) {
- // cleanup active request counter
- s.global && jQuery.active--;
- // close opended socket
- xhr.abort();
- return false;
- }
-
- if ( s.global )
- jQuery.event.trigger("ajaxSend", [xhr, s]);
-
- // Wait for a response to come back
- var onreadystatechange = function(isTimeout){
- // The transfer is complete and the data is available, or the request timed out
- if ( !requestDone && xhr && (xhr.readyState == 4 || isTimeout == "timeout") ) {
- requestDone = true;
-
- // clear poll interval
- if (ival) {
- clearInterval(ival);
- ival = null;
- }
-
- status = isTimeout == "timeout" && "timeout" ||
- !jQuery.httpSuccess( xhr ) && "error" ||
- s.ifModified && jQuery.httpNotModified( xhr, s.url ) && "notmodified" ||
- "success";
-
- if ( status == "success" ) {
- // Watch for, and catch, XML document parse errors
- try {
- // process the data (runs the xml through httpData regardless of callback)
- data = jQuery.httpData( xhr, s.dataType, s.dataFilter );
- } catch(e) {
- status = "parsererror";
- }
- }
-
- // Make sure that the request was successful or notmodified
- if ( status == "success" ) {
- // Cache Last-Modified header, if ifModified mode.
- var modRes;
- try {
- modRes = xhr.getResponseHeader("Last-Modified");
- } catch(e) {} // swallow exception thrown by FF if header is not available
-
- if ( s.ifModified && modRes )
- jQuery.lastModified[s.url] = modRes;
-
- // JSONP handles its own success callback
- if ( !jsonp )
- success();
- } else
- jQuery.handleError(s, xhr, status);
-
- // Fire the complete handlers
- complete();
-
- // Stop memory leaks
- if ( s.async )
- xhr = null;
- }
- };
-
- if ( s.async ) {
- // don't attach the handler to the request, just poll it instead
- var ival = setInterval(onreadystatechange, 13);
-
- // Timeout checker
- if ( s.timeout > 0 )
- setTimeout(function(){
- // Check to see if the request is still happening
- if ( xhr ) {
- // Cancel the request
- xhr.abort();
-
- if( !requestDone )
- onreadystatechange( "timeout" );
- }
- }, s.timeout);
- }
-
- // Send the data
- try {
- xhr.send(s.data);
- } catch(e) {
- jQuery.handleError(s, xhr, null, e);
- }
-
- // firefox 1.5 doesn't fire statechange for sync requests
- if ( !s.async )
- onreadystatechange();
-
- function success(){
- // If a local callback was specified, fire it and pass it the data
- if ( s.success )
- s.success( data, status );
-
- // Fire the global callback
- if ( s.global )
- jQuery.event.trigger( "ajaxSuccess", [xhr, s] );
- }
-
- function complete(){
- // Process result
- if ( s.complete )
- s.complete(xhr, status);
-
- // The request was completed
- if ( s.global )
- jQuery.event.trigger( "ajaxComplete", [xhr, s] );
-
- // Handle the global AJAX counter
- if ( s.global && ! --jQuery.active )
- jQuery.event.trigger( "ajaxStop" );
- }
-
- // return XMLHttpRequest to allow aborting the request etc.
- return xhr;
- },
-
- handleError: function( s, xhr, status, e ) {
- // If a local callback was specified, fire it
- if ( s.error ) s.error( xhr, status, e );
-
- // Fire the global callback
- if ( s.global )
- jQuery.event.trigger( "ajaxError", [xhr, s, e] );
- },
-
- // Counter for holding the number of active queries
- active: 0,
-
- // Determines if an XMLHttpRequest was successful or not
- httpSuccess: function( xhr ) {
- try {
- // IE error sometimes returns 1223 when it should be 204 so treat it as success, see #1450
- return !xhr.status && location.protocol == "file:" ||
- ( xhr.status >= 200 && xhr.status < 300 ) || xhr.status == 304 || xhr.status == 1223 ||
- jQuery.browser.safari && xhr.status == undefined;
- } catch(e){}
- return false;
- },
-
- // Determines if an XMLHttpRequest returns NotModified
- httpNotModified: function( xhr, url ) {
- try {
- var xhrRes = xhr.getResponseHeader("Last-Modified");
-
- // Firefox always returns 200. check Last-Modified date
- return xhr.status == 304 || xhrRes == jQuery.lastModified[url] ||
- jQuery.browser.safari && xhr.status == undefined;
- } catch(e){}
- return false;
- },
-
- httpData: function( xhr, type, filter ) {
- var ct = xhr.getResponseHeader("content-type"),
- xml = type == "xml" || !type && ct && ct.indexOf("xml") >= 0,
- data = xml ? xhr.responseXML : xhr.responseText;
-
- if ( xml && data.documentElement.tagName == "parsererror" )
- throw "parsererror";
-
- // Allow a pre-filtering function to sanitize the response
- if( filter )
- data = filter( data, type );
-
- // If the type is "script", eval it in global context
- if ( type == "script" )
- jQuery.globalEval( data );
-
- // Get the JavaScript object, if JSON is used.
- if ( type == "json" )
- data = eval("(" + data + ")");
-
- return data;
- },
-
- // Serialize an array of form elements or a set of
- // key/values into a query string
- param: function( a ) {
- var s = [];
-
- // If an array was passed in, assume that it is an array
- // of form elements
- if ( a.constructor == Array || a.jquery )
- // Serialize the form elements
- jQuery.each( a, function(){
- s.push( encodeURIComponent(this.name) + "=" + encodeURIComponent( this.value ) );
- });
-
- // Otherwise, assume that it's an object of key/value pairs
- else
- // Serialize the key/values
- for ( var j in a )
- // If the value is an array then the key names need to be repeated
- if ( a[j] && a[j].constructor == Array )
- jQuery.each( a[j], function(){
- s.push( encodeURIComponent(j) + "=" + encodeURIComponent( this ) );
- });
- else
- s.push( encodeURIComponent(j) + "=" + encodeURIComponent( jQuery.isFunction(a[j]) ? a[j]() : a[j] ) );
-
- // Return the resulting serialization
- return s.join("&").replace(/%20/g, "+");
- }
-
-});
-jQuery.fn.extend({
- show: function(speed,callback){
- return speed ?
- this.animate({
- height: "show", width: "show", opacity: "show"
- }, speed, callback) :
-
- this.filter(":hidden").each(function(){
- this.style.display = this.oldblock || "";
- if ( jQuery.css(this,"display") == "none" ) {
- var elem = jQuery("<" + this.tagName + " />").appendTo("body");
- this.style.display = elem.css("display");
- // handle an edge condition where css is - div { display:none; } or similar
- if (this.style.display == "none")
- this.style.display = "block";
- elem.remove();
- }
- }).end();
- },
-
- hide: function(speed,callback){
- return speed ?
- this.animate({
- height: "hide", width: "hide", opacity: "hide"
- }, speed, callback) :
-
- this.filter(":visible").each(function(){
- this.oldblock = this.oldblock || jQuery.css(this,"display");
- this.style.display = "none";
- }).end();
- },
-
- // Save the old toggle function
- _toggle: jQuery.fn.toggle,
-
- toggle: function( fn, fn2 ){
- return jQuery.isFunction(fn) && jQuery.isFunction(fn2) ?
- this._toggle.apply( this, arguments ) :
- fn ?
- this.animate({
- height: "toggle", width: "toggle", opacity: "toggle"
- }, fn, fn2) :
- this.each(function(){
- jQuery(this)[ jQuery(this).is(":hidden") ? "show" : "hide" ]();
- });
- },
-
- slideDown: function(speed,callback){
- return this.animate({height: "show"}, speed, callback);
- },
-
- slideUp: function(speed,callback){
- return this.animate({height: "hide"}, speed, callback);
- },
-
- slideToggle: function(speed, callback){
- return this.animate({height: "toggle"}, speed, callback);
- },
-
- fadeIn: function(speed, callback){
- return this.animate({opacity: "show"}, speed, callback);
- },
-
- fadeOut: function(speed, callback){
- return this.animate({opacity: "hide"}, speed, callback);
- },
-
- fadeTo: function(speed,to,callback){
- return this.animate({opacity: to}, speed, callback);
- },
-
- animate: function( prop, speed, easing, callback ) {
- var optall = jQuery.speed(speed, easing, callback);
-
- return this[ optall.queue === false ? "each" : "queue" ](function(){
- if ( this.nodeType != 1)
- return false;
-
- var opt = jQuery.extend({}, optall), p,
- hidden = jQuery(this).is(":hidden"), self = this;
-
- for ( p in prop ) {
- if ( prop[p] == "hide" && hidden || prop[p] == "show" && !hidden )
- return opt.complete.call(this);
-
- if ( p == "height" || p == "width" ) {
- // Store display property
- opt.display = jQuery.css(this, "display");
-
- // Make sure that nothing sneaks out
- opt.overflow = this.style.overflow;
- }
- }
-
- if ( opt.overflow != null )
- this.style.overflow = "hidden";
-
- opt.curAnim = jQuery.extend({}, prop);
-
- jQuery.each( prop, function(name, val){
- var e = new jQuery.fx( self, opt, name );
-
- if ( /toggle|show|hide/.test(val) )
- e[ val == "toggle" ? hidden ? "show" : "hide" : val ]( prop );
- else {
- var parts = val.toString().match(/^([+-]=)?([\d+-.]+)(.*)$/),
- start = e.cur(true) || 0;
-
- if ( parts ) {
- var end = parseFloat(parts[2]),
- unit = parts[3] || "px";
-
- // We need to compute starting value
- if ( unit != "px" ) {
- self.style[ name ] = (end || 1) + unit;
- start = ((end || 1) / e.cur(true)) * start;
- self.style[ name ] = start + unit;
- }
-
- // If a +=/-= token was provided, we're doing a relative animation
- if ( parts[1] )
- end = ((parts[1] == "-=" ? -1 : 1) * end) + start;
-
- e.custom( start, end, unit );
- } else
- e.custom( start, val, "" );
- }
- });
-
- // For JS strict compliance
- return true;
- });
- },
-
- queue: function(type, fn){
- if ( jQuery.isFunction(type) || ( type && type.constructor == Array )) {
- fn = type;
- type = "fx";
- }
-
- if ( !type || (typeof type == "string" && !fn) )
- return queue( this[0], type );
-
- return this.each(function(){
- if ( fn.constructor == Array )
- queue(this, type, fn);
- else {
- queue(this, type).push( fn );
-
- if ( queue(this, type).length == 1 )
- fn.call(this);
- }
- });
- },
-
- stop: function(clearQueue, gotoEnd){
- var timers = jQuery.timers;
-
- if (clearQueue)
- this.queue([]);
-
- this.each(function(){
- // go in reverse order so anything added to the queue during the loop is ignored
- for ( var i = timers.length - 1; i >= 0; i-- )
- if ( timers[i].elem == this ) {
- if (gotoEnd)
- // force the next step to be the last
- timers[i](true);
- timers.splice(i, 1);
- }
- });
-
- // start the next in the queue if the last step wasn't forced
- if (!gotoEnd)
- this.dequeue();
-
- return this;
- }
-
-});
-
-var queue = function( elem, type, array ) {
- if ( elem ){
-
- type = type || "fx";
-
- var q = jQuery.data( elem, type + "queue" );
-
- if ( !q || array )
- q = jQuery.data( elem, type + "queue", jQuery.makeArray(array) );
-
- }
- return q;
-};
-
-jQuery.fn.dequeue = function(type){
- type = type || "fx";
-
- return this.each(function(){
- var q = queue(this, type);
-
- q.shift();
-
- if ( q.length )
- q[0].call( this );
- });
-};
-
-jQuery.extend({
-
- speed: function(speed, easing, fn) {
- var opt = speed && speed.constructor == Object ? speed : {
- complete: fn || !fn && easing ||
- jQuery.isFunction( speed ) && speed,
- duration: speed,
- easing: fn && easing || easing && easing.constructor != Function && easing
- };
-
- opt.duration = (opt.duration && opt.duration.constructor == Number ?
- opt.duration :
- jQuery.fx.speeds[opt.duration]) || jQuery.fx.speeds.def;
-
- // Queueing
- opt.old = opt.complete;
- opt.complete = function(){
- if ( opt.queue !== false )
- jQuery(this).dequeue();
- if ( jQuery.isFunction( opt.old ) )
- opt.old.call( this );
- };
-
- return opt;
- },
-
- easing: {
- linear: function( p, n, firstNum, diff ) {
- return firstNum + diff * p;
- },
- swing: function( p, n, firstNum, diff ) {
- return ((-Math.cos(p*Math.PI)/2) + 0.5) * diff + firstNum;
- }
- },
-
- timers: [],
- timerId: null,
-
- fx: function( elem, options, prop ){
- this.options = options;
- this.elem = elem;
- this.prop = prop;
-
- if ( !options.orig )
- options.orig = {};
- }
-
-});
-
-jQuery.fx.prototype = {
-
- // Simple function for setting a style value
- update: function(){
- if ( this.options.step )
- this.options.step.call( this.elem, this.now, this );
-
- (jQuery.fx.step[this.prop] || jQuery.fx.step._default)( this );
-
- // Set display property to block for height/width animations
- if ( this.prop == "height" || this.prop == "width" )
- this.elem.style.display = "block";
- },
-
- // Get the current size
- cur: function(force){
- if ( this.elem[this.prop] != null && this.elem.style[this.prop] == null )
- return this.elem[ this.prop ];
-
- var r = parseFloat(jQuery.css(this.elem, this.prop, force));
- return r && r > -10000 ? r : parseFloat(jQuery.curCSS(this.elem, this.prop)) || 0;
- },
-
- // Start an animation from one number to another
- custom: function(from, to, unit){
- this.startTime = now();
- this.start = from;
- this.end = to;
- this.unit = unit || this.unit || "px";
- this.now = this.start;
- this.pos = this.state = 0;
- this.update();
-
- var self = this;
- function t(gotoEnd){
- return self.step(gotoEnd);
- }
-
- t.elem = this.elem;
-
- jQuery.timers.push(t);
-
- if ( jQuery.timerId == null ) {
- jQuery.timerId = setInterval(function(){
- var timers = jQuery.timers;
-
- for ( var i = 0; i < timers.length; i++ )
- if ( !timers[i]() )
- timers.splice(i--, 1);
-
- if ( !timers.length ) {
- clearInterval( jQuery.timerId );
- jQuery.timerId = null;
- }
- }, 13);
- }
- },
-
- // Simple 'show' function
- show: function(){
- // Remember where we started, so that we can go back to it later
- this.options.orig[this.prop] = jQuery.attr( this.elem.style, this.prop );
- this.options.show = true;
-
- // Begin the animation
- this.custom(0, this.cur());
-
- // Make sure that we start at a small width/height to avoid any
- // flash of content
- if ( this.prop == "width" || this.prop == "height" )
- this.elem.style[this.prop] = "1px";
-
- // Start by showing the element
- jQuery(this.elem).show();
- },
-
- // Simple 'hide' function
- hide: function(){
- // Remember where we started, so that we can go back to it later
- this.options.orig[this.prop] = jQuery.attr( this.elem.style, this.prop );
- this.options.hide = true;
-
- // Begin the animation
- this.custom(this.cur(), 0);
- },
-
- // Each step of an animation
- step: function(gotoEnd){
- var t = now();
-
- if ( gotoEnd || t > this.options.duration + this.startTime ) {
- this.now = this.end;
- this.pos = this.state = 1;
- this.update();
-
- this.options.curAnim[ this.prop ] = true;
-
- var done = true;
- for ( var i in this.options.curAnim )
- if ( this.options.curAnim[i] !== true )
- done = false;
-
- if ( done ) {
- if ( this.options.display != null ) {
- // Reset the overflow
- this.elem.style.overflow = this.options.overflow;
-
- // Reset the display
- this.elem.style.display = this.options.display;
- if ( jQuery.css(this.elem, "display") == "none" )
- this.elem.style.display = "block";
- }
-
- // Hide the element if the "hide" operation was done
- if ( this.options.hide )
- this.elem.style.display = "none";
-
- // Reset the properties, if the item has been hidden or shown
- if ( this.options.hide || this.options.show )
- for ( var p in this.options.curAnim )
- jQuery.attr(this.elem.style, p, this.options.orig[p]);
- }
-
- if ( done )
- // Execute the complete function
- this.options.complete.call( this.elem );
-
- return false;
- } else {
- var n = t - this.startTime;
- this.state = n / this.options.duration;
-
- // Perform the easing function, defaults to swing
- this.pos = jQuery.easing[this.options.easing || (jQuery.easing.swing ? "swing" : "linear")](this.state, n, 0, 1, this.options.duration);
- this.now = this.start + ((this.end - this.start) * this.pos);
-
- // Perform the next step of the animation
- this.update();
- }
-
- return true;
- }
-
-};
-
-jQuery.extend( jQuery.fx, {
- speeds:{
- slow: 600,
- fast: 200,
- // Default speed
- def: 400
- },
- step: {
- scrollLeft: function(fx){
- fx.elem.scrollLeft = fx.now;
- },
-
- scrollTop: function(fx){
- fx.elem.scrollTop = fx.now;
- },
-
- opacity: function(fx){
- jQuery.attr(fx.elem.style, "opacity", fx.now);
- },
-
- _default: function(fx){
- fx.elem.style[ fx.prop ] = fx.now + fx.unit;
- }
- }
-});
-// The Offset Method
-// Originally By Brandon Aaron, part of the Dimension Plugin
-// http://jquery.com/plugins/project/dimensions
-jQuery.fn.offset = function() {
- var left = 0, top = 0, elem = this[0], results;
-
- if ( elem ) with ( jQuery.browser ) {
- var parent = elem.parentNode,
- offsetChild = elem,
- offsetParent = elem.offsetParent,
- doc = elem.ownerDocument,
- safari2 = safari && parseInt(version) < 522 && !/adobeair/i.test(userAgent),
- css = jQuery.curCSS,
- fixed = css(elem, "position") == "fixed";
-
- // Use getBoundingClientRect if available
- if ( elem.getBoundingClientRect ) {
- var box = elem.getBoundingClientRect();
-
- // Add the document scroll offsets
- add(box.left + Math.max(doc.documentElement.scrollLeft, doc.body.scrollLeft),
- box.top + Math.max(doc.documentElement.scrollTop, doc.body.scrollTop));
-
- // IE adds the HTML element's border, by default it is medium which is 2px
- // IE 6 and 7 quirks mode the border width is overwritable by the following css html { border: 0; }
- // IE 7 standards mode, the border is always 2px
- // This border/offset is typically represented by the clientLeft and clientTop properties
- // However, in IE6 and 7 quirks mode the clientLeft and clientTop properties are not updated when overwriting it via CSS
- // Therefore this method will be off by 2px in IE while in quirksmode
- add( -doc.documentElement.clientLeft, -doc.documentElement.clientTop );
-
- // Otherwise loop through the offsetParents and parentNodes
- } else {
-
- // Initial element offsets
- add( elem.offsetLeft, elem.offsetTop );
-
- // Get parent offsets
- while ( offsetParent ) {
- // Add offsetParent offsets
- add( offsetParent.offsetLeft, offsetParent.offsetTop );
-
- // Mozilla and Safari > 2 does not include the border on offset parents
- // However Mozilla adds the border for table or table cells
- if ( mozilla && !/^t(able|d|h)$/i.test(offsetParent.tagName) || safari && !safari2 )
- border( offsetParent );
-
- // Add the document scroll offsets if position is fixed on any offsetParent
- if ( !fixed && css(offsetParent, "position") == "fixed" )
- fixed = true;
-
- // Set offsetChild to previous offsetParent unless it is the body element
- offsetChild = /^body$/i.test(offsetParent.tagName) ? offsetChild : offsetParent;
- // Get next offsetParent
- offsetParent = offsetParent.offsetParent;
- }
-
- // Get parent scroll offsets
- while ( parent && parent.tagName && !/^body|html$/i.test(parent.tagName) ) {
- // Remove parent scroll UNLESS that parent is inline or a table to work around Opera inline/table scrollLeft/Top bug
- if ( !/^inline|table.*$/i.test(css(parent, "display")) )
- // Subtract parent scroll offsets
- add( -parent.scrollLeft, -parent.scrollTop );
-
- // Mozilla does not add the border for a parent that has overflow != visible
- if ( mozilla && css(parent, "overflow") != "visible" )
- border( parent );
-
- // Get next parent
- parent = parent.parentNode;
- }
-
- // Safari <= 2 doubles body offsets with a fixed position element/offsetParent or absolutely positioned offsetChild
- // Mozilla doubles body offsets with a non-absolutely positioned offsetChild
- if ( (safari2 && (fixed || css(offsetChild, "position") == "absolute")) ||
- (mozilla && css(offsetChild, "position") != "absolute") )
- add( -doc.body.offsetLeft, -doc.body.offsetTop );
-
- // Add the document scroll offsets if position is fixed
- if ( fixed )
- add(Math.max(doc.documentElement.scrollLeft, doc.body.scrollLeft),
- Math.max(doc.documentElement.scrollTop, doc.body.scrollTop));
- }
-
- // Return an object with top and left properties
- results = { top: top, left: left };
- }
-
- function border(elem) {
- add( jQuery.curCSS(elem, "borderLeftWidth", true), jQuery.curCSS(elem, "borderTopWidth", true) );
- }
-
- function add(l, t) {
- left += parseInt(l, 10) || 0;
- top += parseInt(t, 10) || 0;
- }
-
- return results;
-};
-
-
-jQuery.fn.extend({
- position: function() {
- var left = 0, top = 0, results;
-
- if ( this[0] ) {
- // Get *real* offsetParent
- var offsetParent = this.offsetParent(),
-
- // Get correct offsets
- offset = this.offset(),
- parentOffset = /^body|html$/i.test(offsetParent[0].tagName) ? { top: 0, left: 0 } : offsetParent.offset();
-
- // Subtract element margins
- // note: when an element has margin: auto the offsetLeft and marginLeft
- // are the same in Safari causing offset.left to incorrectly be 0
- offset.top -= num( this, 'marginTop' );
- offset.left -= num( this, 'marginLeft' );
-
- // Add offsetParent borders
- parentOffset.top += num( offsetParent, 'borderTopWidth' );
- parentOffset.left += num( offsetParent, 'borderLeftWidth' );
-
- // Subtract the two offsets
- results = {
- top: offset.top - parentOffset.top,
- left: offset.left - parentOffset.left
- };
- }
-
- return results;
- },
-
- offsetParent: function() {
- var offsetParent = this[0].offsetParent;
- while ( offsetParent && (!/^body|html$/i.test(offsetParent.tagName) && jQuery.css(offsetParent, 'position') == 'static') )
- offsetParent = offsetParent.offsetParent;
- return jQuery(offsetParent);
- }
-});
-
-
-// Create scrollLeft and scrollTop methods
-jQuery.each( ['Left', 'Top'], function(i, name) {
- var method = 'scroll' + name;
-
- jQuery.fn[ method ] = function(val) {
- if (!this[0]) return;
-
- return val != undefined ?
-
- // Set the scroll offset
- this.each(function() {
- this == window || this == document ?
- window.scrollTo(
- !i ? val : jQuery(window).scrollLeft(),
- i ? val : jQuery(window).scrollTop()
- ) :
- this[ method ] = val;
- }) :
-
- // Return the scroll offset
- this[0] == window || this[0] == document ?
- self[ i ? 'pageYOffset' : 'pageXOffset' ] ||
- jQuery.boxModel && document.documentElement[ method ] ||
- document.body[ method ] :
- this[0][ method ];
- };
-});
-// Create innerHeight, innerWidth, outerHeight and outerWidth methods
-jQuery.each([ "Height", "Width" ], function(i, name){
-
- var tl = i ? "Left" : "Top", // top or left
- br = i ? "Right" : "Bottom"; // bottom or right
-
- // innerHeight and innerWidth
- jQuery.fn["inner" + name] = function(){
- return this[ name.toLowerCase() ]() +
- num(this, "padding" + tl) +
- num(this, "padding" + br);
- };
-
- // outerHeight and outerWidth
- jQuery.fn["outer" + name] = function(margin) {
- return this["inner" + name]() +
- num(this, "border" + tl + "Width") +
- num(this, "border" + br + "Width") +
- (margin ?
- num(this, "margin" + tl) + num(this, "margin" + br) : 0);
- };
-
-});})();
-
-jQueryBrowser = jQuery.noConflict(true);
\ No newline at end of file
Deleted: modules/tests/metamer/trunk/application/src/main/webapp/resources/script/jquery.browser-v2.3.js
===================================================================
--- modules/tests/metamer/trunk/application/src/main/webapp/resources/script/jquery.browser-v2.3.js 2010-10-25 06:24:28 UTC (rev 19661)
+++ modules/tests/metamer/trunk/application/src/main/webapp/resources/script/jquery.browser-v2.3.js 2010-10-25 09:02:13 UTC (rev 19662)
@@ -1,82 +0,0 @@
-/*
-
-jQuery Browser Plugin
- * Version 2.3 (modified)
- * 2008-09-17 19:27:05
- * URL: http://jquery.thewikies.com/browser
- * Description: jQuery Browser Plugin extends browser detection capabilities and can assign browser selectors to CSS classes.
- * Author: Nate Cavanaugh, Minhchau Dang, & Jonathan Neal
- * Copyright: Copyright (c) 2008 Jonathan Neal under dual MIT/GPL license.
- * JSLint: This javascript file passes JSLint verification.
- * Modifications: Lukas Fryc
-*//*jslint
- bitwise: true,
- browser: true,
- eqeqeq: true,
- forin: true,
- nomen: true,
- plusplus: true,
- undef: true,
- white: true
-*//*global
- jQuery
-*/
-
-(function ($) {
- $.browserTest = function (a, z) {
- var u = 'unknown', x = 'X', m = function (r, h) {
- for (var i = 0; i < h.length; i = i + 1) {
- r = r.replace(h[i][0], h[i][1]);
- }
-
- return r;
- }, c = function (i, a, b, c) {
- var r = {
- name: m((a.exec(i) || [u, u])[1], b)
- };
-
- r[r.name] = true;
-
- r.version = (c.exec(i) || [x, x, x, x])[3];
-
- if (r.name.match(/safari/) && r.version > 400) {
- r.version = '2.0';
- }
-
- if (r.name === 'presto') {
- r.version = ($.browser.version > 9.27) ? 'futhark' : 'linear_b';
- }
- r.versionNumber = parseFloat(r.version, 10) || 0;
- r.versionX = (r.version !== x) ? (r.version + '').substr(0, 1) : x;
- r.className = r.name + r.versionX;
-
- return r;
- };
-
- a = (a.match(/Opera|Navigator|Minefield|KHTML|Chrome/) ? m(a, [
- [/(Firefox|MSIE|KHTML,\slike\sGecko|Konqueror)/, ''],
- ['Chrome Safari', 'Chrome'],
- ['KHTML', 'Konqueror'],
- ['Minefield', 'Firefox'],
- ['Navigator', 'Netscape']
- ]) : a).toLowerCase();
-
- $.browser = $.extend((!z) ? $.browser : {}, c(a, /(camino|chrome|firefox|netscape|konqueror|lynx|msie|opera|safari)/, [], /(camino|chrome|firefox|netscape|netscape6|opera|version|konqueror|lynx|msie|safari)(\/|\s)([a-z0-9\.\+]*?)(\;|dev|rel|\s|$)/));
-
- $.layout = c(a, /(gecko|konqueror|msie|opera|webkit)/, [
- ['konqueror', 'khtml'],
- ['msie', 'trident'],
- ['opera', 'presto']
- ], /(applewebkit|rv|konqueror|msie)(\:|\/|\s)([a-z0-9\.]*?)(\;|\)|\s)/);
-
- $.os = {
- name: (/(win|mac|linux|sunos|solaris|iphone)/.exec(navigator.platform.toLowerCase()) || [u])[0].replace('sunos', 'solaris').replace('win', 'windows')
- };
-
- if (!z) {
- $('html').addClass([$.os.name, $.browser.name, $.browser.className, $.layout.name, $.layout.className].join(' '));
- }
- };
-
- $.browserTest(navigator.userAgent);
-})(jQueryBrowser);
\ No newline at end of file
Modified: modules/tests/metamer/trunk/application/src/main/webapp/templates/footer.xhtml
===================================================================
--- modules/tests/metamer/trunk/application/src/main/webapp/templates/footer.xhtml 2010-10-25 06:24:28 UTC (rev 19661)
+++ modules/tests/metamer/trunk/application/src/main/webapp/templates/footer.xhtml 2010-10-25 09:02:13 UTC (rev 19662)
@@ -38,19 +38,15 @@
<li><h:outputText id="browserVersion" value="#{metamer.browserVersion}" /></li>
</ul>
-
-
<!-- human-readable browser detection -->
<c:if test="#{metamer.projectStage != 'Production'}">
- <h:outputScript library="script" name="jquery-v1.2.6.js"/>
- <h:outputScript library="script" name="jquery.browser-v2.3.js"/>
+ <h:outputScript name="jquery.js" target="head"/>
+ <h:outputScript library="script" name="detect-browser.js" target="head"/>
<script type="text/javascript">
- String.prototype.capitalize = function(){
- return this.replace( /(^|\s)([a-z])/g , function(m,p1,p2){ return p1+p2.toUpperCase(); } );
- };
- jQueryBrowser("span[id$=browserVersion]").text(jQueryBrowser.browser.name.capitalize() + ' ' + jQueryBrowser.browser.version + ' @ ' + jQueryBrowser.os.name.capitalize());
+ jQuery("span[id$=browserVersion]").text(jQuery.browser.name + ' ' + jQuery.browser.version + ' @ ' + jQuery.browser.os);
</script>
+
</c:if>
-
+
</ui:composition>
</html>
\ No newline at end of file
13 years, 11 months
JBoss Rich Faces SVN: r19661 - in branches/RF-8742/ui/validator/ui/src: test/java/org/richfaces/renderkit/html and 1 other directory.
by richfaces-svn-commits@lists.jboss.org
Author: alexsmirnov
Date: 2010-10-25 02:24:28 -0400 (Mon, 25 Oct 2010)
New Revision: 19661
Modified:
branches/RF-8742/ui/validator/ui/src/main/java/org/richfaces/renderkit/html/ClientValidatorRenderer.java
branches/RF-8742/ui/validator/ui/src/test/java/org/richfaces/renderkit/html/RendererGetClientSideScriptTest.java
branches/RF-8742/ui/validator/ui/src/test/java/org/richfaces/renderkit/html/RendererGetComponentScriptTest.java
branches/RF-8742/ui/validator/ui/src/test/java/org/richfaces/renderkit/html/RendererGetOrCreateResourceTest.java
branches/RF-8742/ui/validator/ui/src/test/java/org/richfaces/renderkit/html/ValidatorRendererGetScriptTest.java
Log:
CODING IN PROGRESS - issue RF-9507: ClientValidatorRendererunit tests and implementation.
https://jira.jboss.org/browse/RF-9507
Modified: branches/RF-8742/ui/validator/ui/src/main/java/org/richfaces/renderkit/html/ClientValidatorRenderer.java
===================================================================
--- branches/RF-8742/ui/validator/ui/src/main/java/org/richfaces/renderkit/html/ClientValidatorRenderer.java 2010-10-25 01:02:43 UTC (rev 19660)
+++ branches/RF-8742/ui/validator/ui/src/main/java/org/richfaces/renderkit/html/ClientValidatorRenderer.java 2010-10-25 06:24:28 UTC (rev 19661)
@@ -134,7 +134,7 @@
if (null != converter) {
try {
LibraryScriptFunction clientSideConverterScript =
- getClientSideConverterScript(behaviorContext, converter);
+ getClientSideConverterScript(behaviorContext.getFacesContext(), converter);
return createValidatorScript(behaviorContext, behavior, validators, clientSideConverterScript);
} catch (ScriptNotFoundException e) {
// ajax-only validation
@@ -155,7 +155,7 @@
private ComponentValidatorScript createValidatorScript(ClientBehaviorContext behaviorContext,
ClientValidatorBehavior behavior, Collection<ValidatorDescriptor> validators,
LibraryScriptFunction clientSideConverterScript) {
- Collection<LibraryScriptFunction> validatorScripts = getClientSideValidatorScript(behaviorContext, validators);
+ Collection<LibraryScriptFunction> validatorScripts = getClientSideValidatorScript(behaviorContext.getFacesContext(), validators);
if (validatorScripts.isEmpty()) {
return new AjaxOnlyScript();
} else if (validatorScripts.size() < validators.size()) {
@@ -185,10 +185,10 @@
* @return
* @throws ScriptNotFoundException
*/
- LibraryScriptFunction getClientSideConverterScript(ClientBehaviorContext behaviorContext,
+ LibraryScriptFunction getClientSideConverterScript(FacesContext facesContext,
ConverterDescriptor converter) throws ScriptNotFoundException {
ClientScriptService clientScriptService =
- ServiceTracker.getService(behaviorContext.getFacesContext(), ClientScriptService.class);
+ ServiceTracker.getService(facesContext, ClientScriptService.class);
return createClientFunction(converter, VALUE_LITERAL, clientScriptService);
}
@@ -203,15 +203,15 @@
* Build client-side function call for Server-side component descriptor.
* </p>
*
- * @param behaviorContext
+ * @param facesContext
* @param validators
* @return
* @throws ScriptNotFoundException
*/
- Collection<LibraryScriptFunction> getClientSideValidatorScript(ClientBehaviorContext behaviorContext,
+ Collection<LibraryScriptFunction> getClientSideValidatorScript(FacesContext facesContext,
Collection<ValidatorDescriptor> validators) {
ClientScriptService clientScriptService =
- ServiceTracker.getService(behaviorContext.getFacesContext(), ClientScriptService.class);
+ ServiceTracker.getService(facesContext, ClientScriptService.class);
List<LibraryScriptFunction> scripts = Lists.newArrayList();
for (ValidatorDescriptor validator : validators) {
try {
Modified: branches/RF-8742/ui/validator/ui/src/test/java/org/richfaces/renderkit/html/RendererGetClientSideScriptTest.java
===================================================================
--- branches/RF-8742/ui/validator/ui/src/test/java/org/richfaces/renderkit/html/RendererGetClientSideScriptTest.java 2010-10-25 01:02:43 UTC (rev 19660)
+++ branches/RF-8742/ui/validator/ui/src/test/java/org/richfaces/renderkit/html/RendererGetClientSideScriptTest.java 2010-10-25 06:24:28 UTC (rev 19661)
@@ -1,7 +1,8 @@
package org.richfaces.renderkit.html;
-import static org.easymock.EasyMock.*;
-import static org.junit.Assert.*;
+import static org.easymock.EasyMock.expect;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
import java.util.Collection;
import java.util.Collections;
@@ -41,10 +42,13 @@
@Mock
private LibraryScript script;
+ private Collection<ValidatorDescriptor> descriptors;
+
@Before
public void setupService() {
- expect(factory.getInstance(ClientScriptService.class)).andStubReturn(scriptService);
+ expect(factory.getInstance(ClientScriptService.class)).andReturn(scriptService);
ServiceTracker.setFactory(factory);
+ descriptors = Collections.singleton(descriptor);
}
@After
@@ -52,12 +56,15 @@
ServiceTracker.release();
}
- @Test(expected = ScriptNotFoundException.class)
+ @Test()
public void testGetClientSideScriptNotExists() throws Throwable {
expect((Class) descriptor.getValidatorClass()).andReturn(RegexValidator.class);
expect(scriptService.getScript(RegexValidator.class)).andThrow(new ScriptNotFoundException());
+
controller.replay();
- renderer.getClientSideValidatorScript(behaviorContext, Collections.singletonList(descriptor));
+ Collection<LibraryScriptFunction> clientSideValidatorScript = renderer.getClientSideValidatorScript(
+ environment.getFacesContext(), descriptors);
+ assertTrue(clientSideValidatorScript.isEmpty());
controller.verify();
}
@@ -66,7 +73,7 @@
expect((Class) converterDescriptor.getValidatorClass()).andReturn(NumberConverter.class);
expect(scriptService.getScript(NumberConverter.class)).andThrow(new ScriptNotFoundException());
controller.replay();
- renderer.getClientSideConverterScript(behaviorContext, converterDescriptor);
+ renderer.getClientSideConverterScript(environment.getFacesContext(), converterDescriptor);
controller.verify();
}
@@ -76,21 +83,19 @@
expect(descriptor.getMessage()).andReturn(VALIDATOR_MESSAGE);
expect((Map<String, Object>) descriptor.getValidatorParameters()).andReturn(
(Map<String, Object>) VALIDATOR_PARAMS);
- controller.replay();
expect(scriptService.getScript(RegexValidator.class)).andReturn(script);
expect(script.getName()).andReturn(REGEX_VALIDATOR);
expect(script.getLibrary()).andReturn(ORG_RICHFACES);
expect(script.getResourceName()).andReturn(CLIENT_VALIDATORS_JS);
- Collection<LibraryScriptFunction> clientSideScriptCollection = renderer.getClientSideValidatorScript(behaviorContext, Collections.singletonList(descriptor));
-
- assertNotNull(clientSideScriptCollection);
- LibraryScriptFunction clientSideScript = Iterables.getOnlyElement(clientSideScriptCollection);
-
- assertEquals(ClientValidatorRenderer.CONVERTED_VALUE_VAR, clientSideScript.getParameters().get(0));
+ controller.replay();
+ Collection<LibraryScriptFunction> clientSideScripts = renderer.getClientSideValidatorScript(environment.getFacesContext(), descriptors);
+ LibraryScriptFunction clientSideScript = Iterables.getOnlyElement(clientSideScripts);
+ assertEquals(ClientValidatorRenderer.CONVERTED_VALUE_LITERAL, clientSideScript.getParameters().get(0));
assertEquals(VALIDATOR_MESSAGE, clientSideScript.getParameters().get(1));
assertEquals(VALIDATOR_PARAMS, clientSideScript.getParameters().get(2));
assertEquals(ORG_RICHFACES, clientSideScript.getLibrary());
assertEquals(CLIENT_VALIDATORS_JS, clientSideScript.getResourceName());
+ controller.verify();
}
@Test
@@ -99,18 +104,19 @@
expect(converterDescriptor.getMessage()).andReturn(VALIDATOR_MESSAGE);
expect((Map<String, Object>) converterDescriptor.getValidatorParameters()).andReturn(
(Map<String, Object>) VALIDATOR_PARAMS);
- controller.replay();
expect(scriptService.getScript(NumberConverter.class)).andReturn(script);
expect(script.getName()).andReturn(REGEX_VALIDATOR);
expect(script.getLibrary()).andReturn(ORG_RICHFACES);
expect(script.getResourceName()).andReturn(CLIENT_VALIDATORS_JS);
+ controller.replay();
LibraryScriptFunction clientSideScript =
- renderer.getClientSideConverterScript(behaviorContext, converterDescriptor);
- assertEquals(ClientValidatorRenderer.VALUE_VAR, clientSideScript.getParameters().get(0));
+ renderer.getClientSideConverterScript(environment.getFacesContext(), converterDescriptor);
+ assertEquals(ClientValidatorRenderer.VALUE_LITERAL, clientSideScript.getParameters().get(0));
assertEquals(VALIDATOR_MESSAGE, clientSideScript.getParameters().get(1));
assertEquals(VALIDATOR_PARAMS, clientSideScript.getParameters().get(2));
assertEquals(ORG_RICHFACES, clientSideScript.getLibrary());
assertEquals(CLIENT_VALIDATORS_JS, clientSideScript.getResourceName());
+ controller.verify();
}
}
Modified: branches/RF-8742/ui/validator/ui/src/test/java/org/richfaces/renderkit/html/RendererGetComponentScriptTest.java
===================================================================
--- branches/RF-8742/ui/validator/ui/src/test/java/org/richfaces/renderkit/html/RendererGetComponentScriptTest.java 2010-10-25 01:02:43 UTC (rev 19660)
+++ branches/RF-8742/ui/validator/ui/src/test/java/org/richfaces/renderkit/html/RendererGetComponentScriptTest.java 2010-10-25 06:24:28 UTC (rev 19661)
@@ -1,16 +1,18 @@
package org.richfaces.renderkit.html;
-import static org.easymock.EasyMock.*;
-import static org.hamcrest.CoreMatchers.*;
-import static org.junit.Assert.*;
-import static org.junit.matchers.JUnitMatchers.*;
+import static org.easymock.EasyMock.expect;
+import static org.hamcrest.CoreMatchers.allOf;
+import static org.hamcrest.CoreMatchers.not;
+import static org.junit.Assert.assertNull;
+import static org.junit.Assert.assertThat;
+import static org.junit.matchers.JUnitMatchers.containsString;
+import static org.junit.matchers.JUnitMatchers.hasItem;
import java.util.ArrayList;
-import java.util.Arrays;
import java.util.Collection;
import java.util.Map;
-import javax.faces.component.behavior.ClientBehaviorContext;
+import javax.faces.context.FacesContext;
import javax.faces.convert.Converter;
import javax.faces.convert.NumberConverter;
import javax.validation.constraints.Max;
@@ -30,6 +32,8 @@
import org.richfaces.validator.ScriptNotFoundException;
import org.richfaces.validator.ValidatorDescriptor;
+import com.google.common.collect.Lists;
+
@RunWith(MockTestRunner.class)
public class RendererGetComponentScriptTest extends RendererTestBase {
@@ -224,10 +228,9 @@
final LibraryScriptFunction... validatorFunctions) {
return new ClientValidatorRenderer() {
- private int validatorsCounter = 0;
@Override
- LibraryScriptFunction getClientSideConverterScript(ClientBehaviorContext behaviorContext,
+ LibraryScriptFunction getClientSideConverterScript(FacesContext facesContext,
ConverterDescriptor converter) throws ScriptNotFoundException {
if (null == converterFunction) {
throw new ScriptNotFoundException();
@@ -236,12 +239,9 @@
}
@Override
- Collection<LibraryScriptFunction> getClientSideValidatorScript(ClientBehaviorContext behaviorContext,
- Collection<ValidatorDescriptor> validators) {
-// if (validatorsCounter >= validatorFunctions.length) {
-// throw new ScriptNotFoundException();
-// }
- return Arrays.asList(validatorFunctions);
+ Collection<LibraryScriptFunction> getClientSideValidatorScript(FacesContext facesContext,
+ Collection<ValidatorDescriptor> validators) {
+ return Lists.newArrayList(validatorFunctions);
}
};
}
Modified: branches/RF-8742/ui/validator/ui/src/test/java/org/richfaces/renderkit/html/RendererGetOrCreateResourceTest.java
===================================================================
--- branches/RF-8742/ui/validator/ui/src/test/java/org/richfaces/renderkit/html/RendererGetOrCreateResourceTest.java 2010-10-25 01:02:43 UTC (rev 19660)
+++ branches/RF-8742/ui/validator/ui/src/test/java/org/richfaces/renderkit/html/RendererGetOrCreateResourceTest.java 2010-10-25 06:24:28 UTC (rev 19661)
@@ -12,6 +12,8 @@
import org.jboss.test.faces.mock.Mock;
import org.jboss.test.faces.mock.MockTestRunner;
+import org.junit.After;
+import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.richfaces.component.UIValidatorScript;
@@ -26,61 +28,81 @@
@Mock
private UIViewRoot viewRoot;
-
+
@Mock
private ComponentValidatorScript validatorScript;
-
+
private UIValidatorScript scriptResource;
+
+ @Before
+ public void setUpResource(){
+ scriptResource = new UIValidatorScript();
+ }
+ @After
+ public void cleanUpResource(){
+ scriptResource = null;
+ }
/**
- * <p class="changed_added_4_0">No resource exist in view, create a new one and store in "form" target.</p>
+ * <p class="changed_added_4_0">
+ * No resource exist in view, create a new one and store in "form" target.
+ * </p>
*/
@Test
public void testCreateValidatorScriptResource() {
- FacesContext facesContext = recordResources(null,null);
- expect(environment.getApplication().createComponent(UIValidatorScript.COMPONENT_TYPE)).andReturn(scriptResource);
- viewRoot.addComponentResource(facesContext, scriptResource);expectLastCall();
+ FacesContext facesContext = recordResources(null, null);
+ expect(environment.getApplication().createComponent(UIValidatorScript.COMPONENT_TYPE))
+ .andReturn(scriptResource);
+ viewRoot.addComponentResource(facesContext, scriptResource);
+ expectLastCall();
verifyResult(facesContext);
}
- private FacesContext recordResources(UIComponent formResource,UIComponent bodyResource) {
+ private FacesContext recordResources(UIComponent formResource, UIComponent bodyResource) {
FacesContext facesContext = recordViewRoot();
recordViewResources("form", formResource);
- recordViewResources("body", bodyResource);
+ if(null == formResource || null != bodyResource){
+ recordViewResources("body", bodyResource);
+ }
return facesContext;
}
private void verifyResult(FacesContext facesContext) {
controller.replay();
- assertSame(scriptResource,renderer.getOrCreateValidatorScriptResource(facesContext));
+ assertSame(scriptResource, renderer.getOrCreateValidatorScriptResource(facesContext));
controller.verify();
}
/**
- * <p class="changed_added_4_0">Resource already exists in "form" target</p>
+ * <p class="changed_added_4_0">
+ * Resource already exists in "form" target
+ * </p>
*/
@Test
public void testGetValidatorScriptResourceForm() {
- FacesContext facesContext = recordResources(scriptResource,null);
+ FacesContext facesContext = recordResources(scriptResource, null);
verifyResult(facesContext);
}
/**
- * <p class="changed_added_4_0">Resource already exists in "body" target</p>
+ * <p class="changed_added_4_0">
+ * Resource already exists in "body" target
+ * </p>
*/
@Test
public void testGetValidatorScriptResourceBody() {
- FacesContext facesContext = recordResources(null,scriptResource);
+ FacesContext facesContext = recordResources(null, scriptResource);
verifyResult(facesContext);
}
-
+
@Test
public void buildAndStoreScript() throws Exception {
- FacesContext facesContext = recordResources(scriptResource,null);
- ClientValidatorRenderer renderer = new ClientValidatorRenderer(){
- ComponentValidatorScript createValidatorScript(ClientBehaviorContext behaviorContext, ClientValidatorBehavior behavior) {
- return validatorScript;
- };
+ FacesContext facesContext = recordResources(scriptResource, null);
+ ClientValidatorRenderer renderer = new ClientValidatorRenderer() {
+ ComponentValidatorScript createValidatorScript(ClientBehaviorContext behaviorContext,
+ ClientValidatorBehavior behavior) {
+ return validatorScript;
+ };
};
setupBehaviorContext(input);
expect(input.getClientId(facesContext)).andReturn(FUNCTION_NAME);
@@ -89,15 +111,14 @@
assertEquals(1, scriptResource.getScripts().size());
controller.verify();
}
-
-
- private void recordViewResources(String target, UIComponent resource){
+
+ private void recordViewResources(String target, UIComponent resource) {
FacesContext facesContext = environment.getFacesContext();
List<UIComponent> resources = Lists.newArrayList();
- if(null != resource){
+ if (null != resource) {
resources.add(resource);
}
- expect(viewRoot.getComponentResources(facesContext, target)).andStubReturn(resources);
+ expect(viewRoot.getComponentResources(facesContext, target)).andReturn(resources);
}
private FacesContext recordViewRoot() {
Modified: branches/RF-8742/ui/validator/ui/src/test/java/org/richfaces/renderkit/html/ValidatorRendererGetScriptTest.java
===================================================================
--- branches/RF-8742/ui/validator/ui/src/test/java/org/richfaces/renderkit/html/ValidatorRendererGetScriptTest.java 2010-10-25 01:02:43 UTC (rev 19660)
+++ branches/RF-8742/ui/validator/ui/src/test/java/org/richfaces/renderkit/html/ValidatorRendererGetScriptTest.java 2010-10-25 06:24:28 UTC (rev 19661)
@@ -26,6 +26,6 @@
@Test(expected=FacesException.class)
public void testGetScriptWrongBehavior() {
- renderer.getScript(null, controller.createNiceMock(ClientBehavior.class));
+ renderer.getScript(behaviorContext, controller.createNiceMock(ClientBehavior.class));
}
}
13 years, 11 months
JBoss Rich Faces SVN: r19660 - branches/RF-8742/ui/validator/ui/src/test/java/org/richfaces/convert.
by richfaces-svn-commits@lists.jboss.org
Author: nbelaevski
Date: 2010-10-24 21:02:43 -0400 (Sun, 24 Oct 2010)
New Revision: 19660
Added:
branches/RF-8742/ui/validator/ui/src/test/java/org/richfaces/convert/BaseConverterTestRunner.java
Removed:
branches/RF-8742/ui/validator/ui/src/test/java/org/richfaces/convert/BaseConverterTestRule.java
Modified:
branches/RF-8742/ui/validator/ui/src/test/java/org/richfaces/convert/BaseConverterTest.java
branches/RF-8742/ui/validator/ui/src/test/java/org/richfaces/convert/DateTimeConverterTest.java
branches/RF-8742/ui/validator/ui/src/test/java/org/richfaces/convert/NumberConverterTest.java
branches/RF-8742/ui/validator/ui/src/test/java/org/richfaces/convert/TestData.java
branches/RF-8742/ui/validator/ui/src/test/java/org/richfaces/convert/TestDataHolder.java
Log:
https://jira.jboss.org/browse/RF-9511
Modified: branches/RF-8742/ui/validator/ui/src/test/java/org/richfaces/convert/BaseConverterTest.java
===================================================================
--- branches/RF-8742/ui/validator/ui/src/test/java/org/richfaces/convert/BaseConverterTest.java 2010-10-24 19:54:39 UTC (rev 19659)
+++ branches/RF-8742/ui/validator/ui/src/test/java/org/richfaces/convert/BaseConverterTest.java 2010-10-25 01:02:43 UTC (rev 19660)
@@ -21,6 +21,11 @@
*/
package org.richfaces.convert;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
+
import java.text.MessageFormat;
import java.util.Calendar;
import java.util.Date;
@@ -40,26 +45,23 @@
import javax.servlet.ServletRequestEvent;
import javax.servlet.ServletRequestListener;
-import junit.framework.AssertionFailedError;
import net.sourceforge.htmlunit.corejs.javascript.Scriptable;
import org.ajax4jsf.javascript.JSFunction;
import org.ajax4jsf.javascript.ScriptUtils;
import org.jboss.test.faces.htmlunit.HtmlUnitEnvironment;
-import org.jboss.test.faces.jetty.JettyServer;
import org.junit.After;
-import org.junit.Assert;
import org.junit.Before;
-import org.junit.Rule;
+import org.junit.runner.RunWith;
import com.gargoylesoftware.htmlunit.ScriptResult;
import com.gargoylesoftware.htmlunit.html.HtmlPage;
-import com.google.common.base.Strings;
/**
* @author Nick Belaevski
*
*/
+(a)RunWith(BaseConverterTestRunner.class)
public abstract class BaseConverterTest {
public static final String TEST_COMPONENT_LABEL = "input";
@@ -179,9 +181,6 @@
}
}
- @Rule
- public BaseConverterTestRule rule = new BaseConverterTestRule();
-
private TestBean testBean;
private HtmlUnitEnvironment environment;
@@ -200,7 +199,7 @@
public void setUp() throws Exception {
testBean = new TestBean();
- environment = new HtmlUnitEnvironment(new JettyServer());
+ environment = new HtmlUnitEnvironment();
environment.getServer().addResource("/test.xhtml", BaseConverterTest.class.getResource("test.xhtml"));
environment.getServer().addResource("/resources/converter.js", converterScriptName);
environment.getServer().addWebListener(new ServletRequestListener() {
@@ -227,42 +226,6 @@
environment = null;
}
- private String formattedParametersData() {
- StringBuilder sb = new StringBuilder();
-
- sb.append("TestData {");
-
- sb.append("submittedValue=\"");
- sb.append(submittedValue);
- sb.append("\"");
-
- if (!Strings.isNullOrEmpty(failureMessage)) {
- sb.append(", failureMessage=\"");
- sb.append(failureMessage);
- sb.append("\"");
- }
-
- sb.append("}");
-
- return sb.toString();
- }
-
- private void fail(String message) {
- Assert.fail(MessageFormat.format("{0}: {1}", formattedParametersData(), message));
- }
-
- private void assertEquals(Object expected, Object actual) {
- if (expected == null && actual == null) {
- return;
- }
- if (expected != null && expected.equals(actual)) {
- return;
- }
-
- throw new AssertionFailedError(MessageFormat.format("{0}: expected {1} but was {2}",
- formattedParametersData(), expected, actual));
- }
-
protected String serializeObjectToScript(Object object) {
if (object instanceof Date) {
Calendar calendar = Calendar.getInstance();
@@ -304,7 +267,7 @@
public void assertConversionOk() throws Exception {
HtmlPage page = environment.getPage("/test.jsf");
- Assert.assertTrue(page.getWebClient().isJavaScriptEnabled());
+ assertTrue(page.getWebClient().isJavaScriptEnabled());
ScriptResult conversionMessageResult = page.executeJavaScript("verifyConversion()");
if (!ScriptResult.isUndefined(conversionMessageResult)) {
fail(conversionMessageResult.getJavaScriptResult().toString());
@@ -314,10 +277,9 @@
public void assertConversionFailure() throws Exception {
HtmlPage page = environment.getPage("/test.jsf");
- Assert.assertNotNull(testBean.getConverterException());
- Assert.assertEquals(testBean.getConverterException().getMessage(), failureMessage);
+ assertNotNull(testBean.getConverterException());
- Assert.assertTrue(page.getWebClient().isJavaScriptEnabled());
+ assertTrue(page.getWebClient().isJavaScriptEnabled());
ScriptResult conversionErrorResult = page.executeJavaScript("window.conversionError");
if (ScriptResult.isUndefined(conversionErrorResult)) {
@@ -325,9 +287,26 @@
return;
}
- Scriptable conversionError = (Scriptable) conversionErrorResult.getJavaScriptResult();
- assertEquals(conversionError.get("message", conversionError), failureMessage);
+ Object conversionErrorMessage;
+
+ Object scriptResult = conversionErrorResult.getJavaScriptResult();
+ if (scriptResult instanceof Scriptable) {
+ Scriptable scriptable = (Scriptable) scriptResult;
+ conversionErrorMessage = scriptable.get("message", scriptable);
+ } else {
+ conversionErrorMessage = scriptResult;
+ }
+ if (failureMessage != null) {
+ assertEquals(failureMessage, conversionErrorMessage);
+ } else {
+ assertEquals(testBean.getConverterException().getMessage(), conversionErrorMessage);
+ }
}
+
+ public void setup(TestData testData) {
+ setSubmittedValue(testData.submittedValue());
+ setFailureMessage(testData.failureMessage());
+ }
}
Deleted: branches/RF-8742/ui/validator/ui/src/test/java/org/richfaces/convert/BaseConverterTestRule.java
===================================================================
--- branches/RF-8742/ui/validator/ui/src/test/java/org/richfaces/convert/BaseConverterTestRule.java 2010-10-24 19:54:39 UTC (rev 19659)
+++ branches/RF-8742/ui/validator/ui/src/test/java/org/richfaces/convert/BaseConverterTestRule.java 2010-10-25 01:02:43 UTC (rev 19660)
@@ -1,72 +0,0 @@
-/*
- * JBoss, Home of Professional Open Source
- * Copyright 2010, Red Hat, Inc. and individual contributors
- * by the @authors tag. See the copyright.txt in the distribution for a
- * full listing of individual contributors.
- *
- * This is free software; you can redistribute it and/or modify it
- * under the terms of the GNU Lesser General Public License as
- * published by the Free Software Foundation; either version 2.1 of
- * the License, or (at your option) any later version.
- *
- * This software is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this software; if not, write to the Free
- * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
- * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
- */
-package org.richfaces.convert;
-
-import java.util.Arrays;
-import java.util.List;
-
-import org.junit.rules.MethodRule;
-import org.junit.runners.model.FrameworkMethod;
-import org.junit.runners.model.Statement;
-
-import com.google.common.base.Strings;
-import com.google.common.collect.Lists;
-
-/**
- * @author Nick Belaevski
- *
- */
-public class BaseConverterTestRule implements MethodRule {
-
- public Statement apply(final Statement base, FrameworkMethod method, final Object target) {
- final List<TestData> testDataList = Lists.newArrayList();
-
- TestDataHolder testDataHolder = method.getAnnotation(TestDataHolder.class);
- if (testDataHolder != null) {
- testDataList.addAll(Arrays.asList(testDataHolder.value()));
- }
-
- TestData testData = method.getAnnotation(TestData.class);
- if (testData != null) {
- testDataList.add(testData);
- }
-
- return new Statement() {
-
- @Override
- public void evaluate() throws Throwable {
- BaseConverterTest baseConverterTest = (BaseConverterTest) target;
-
- for (TestData testData : testDataList) {
- baseConverterTest.setSubmittedValue(testData.submittedValue());
-
- if (!Strings.isNullOrEmpty(testData.failureMessage())) {
- baseConverterTest.setFailureMessage(testData.failureMessage());
- }
-
- base.evaluate();
- }
- }
- };
- }
-
-}
Copied: branches/RF-8742/ui/validator/ui/src/test/java/org/richfaces/convert/BaseConverterTestRunner.java (from rev 19656, branches/RF-8742/ui/validator/ui/src/test/java/org/richfaces/convert/BaseConverterTestRule.java)
===================================================================
--- branches/RF-8742/ui/validator/ui/src/test/java/org/richfaces/convert/BaseConverterTestRunner.java (rev 0)
+++ branches/RF-8742/ui/validator/ui/src/test/java/org/richfaces/convert/BaseConverterTestRunner.java 2010-10-25 01:02:43 UTC (rev 19660)
@@ -0,0 +1,198 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2010, Red Hat, Inc. and individual contributors
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.richfaces.convert;
+
+import java.lang.reflect.Method;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+
+import org.junit.Test;
+import org.junit.internal.runners.model.ReflectiveCallable;
+import org.junit.runner.Runner;
+import org.junit.runner.notification.RunNotifier;
+import org.junit.runners.BlockJUnit4ClassRunner;
+import org.junit.runners.Suite;
+import org.junit.runners.model.FrameworkMethod;
+import org.junit.runners.model.InitializationError;
+import org.junit.runners.model.Statement;
+import org.junit.runners.model.TestClass;
+
+import com.google.common.base.Strings;
+import com.google.common.collect.Lists;
+
+/**
+ * @author Nick Belaevski
+ *
+ */
+public class BaseConverterTestRunner extends Suite {
+
+ private static final class ParameterizedFrameworkMethod extends FrameworkMethod {
+
+ private TestData testData;
+
+ private boolean failure;
+
+ public ParameterizedFrameworkMethod(Method method, TestData testData, boolean failure) {
+ super(method);
+ this.testData = testData;
+ this.failure = failure;
+ }
+
+ public String getFormattedParameters() {
+ if (testData == null) {
+ return "no test data";
+ }
+
+ StringBuilder sb = new StringBuilder();
+
+ if (failure) {
+ sb.append("<failure>");
+ } else {
+ sb.append("<success>");
+ }
+
+ sb.append(" @TestData {");
+
+ sb.append("submittedValue=" + testData.submittedValue());
+
+ if (!Strings.isNullOrEmpty(testData.failureMessage())) {
+ sb.append(", failureMessage=" + testData.failureMessage());
+ }
+
+ sb.append("}");
+
+ return sb.toString();
+ }
+
+ @Override
+ public Object invokeExplosively(final Object target, final Object... params) throws Throwable {
+ return new ReflectiveCallable() {
+ @Override
+ protected Object runReflectiveCall() throws Throwable {
+ BaseConverterTest baseConverterTest = (BaseConverterTest) target;
+
+ baseConverterTest.setSubmittedValue(testData.submittedValue());
+
+ if (!Strings.isNullOrEmpty(testData.failureMessage())) {
+ baseConverterTest.setFailureMessage(testData.failureMessage());
+ }
+
+ Object returnValue = getMethod().invoke(target, params);
+
+ if (failure) {
+ baseConverterTest.assertConversionFailure();
+ } else {
+ baseConverterTest.assertConversionOk();
+ }
+
+ return returnValue;
+ }
+ }.run();
+ }
+ }
+
+ private class ParameterizedTestRunner extends BlockJUnit4ClassRunner {
+
+ private String testMethodName;
+
+ private List<FrameworkMethod> children = Lists.newArrayList();
+
+ public ParameterizedTestRunner(Class<?> klass, FrameworkMethod testMethod)
+ throws InitializationError {
+
+ super(klass);
+
+ this.testMethodName = testMethod.getName();
+
+ TestDataHolder testDataHolder = testMethod.getAnnotation(TestDataHolder.class);
+ if (testDataHolder != null) {
+ for (TestData testData : testDataHolder.successes()) {
+ children.add(new ParameterizedFrameworkMethod(testMethod.getMethod(), testData, false));
+ }
+
+ for (TestData testData : testDataHolder.failures()) {
+ children.add(new ParameterizedFrameworkMethod(testMethod.getMethod(), testData, true));
+ }
+ } else {
+ children.add(testMethod);
+ }
+ }
+
+ @Override
+ public Object createTest() throws Exception {
+ return getTestClass().getOnlyConstructor().newInstance();
+ }
+
+ @Override
+ protected String getName() {
+ return testMethodName;
+ }
+
+ @Override
+ protected String testName(final FrameworkMethod method) {
+ if (method instanceof ParameterizedFrameworkMethod) {
+ String formattedParamsString = ((ParameterizedFrameworkMethod) method).getFormattedParameters();
+
+ return String.format("%s %s", testMethodName, formattedParamsString);
+ }
+
+ return testMethodName;
+ }
+
+ @Override
+ protected void validateConstructor(List<Throwable> errors) {
+ validateOnlyOneConstructor(errors);
+ }
+
+ @Override
+ protected Statement classBlock(RunNotifier notifier) {
+ return childrenInvoker(notifier);
+ }
+
+ @Override
+ protected List<FrameworkMethod> getChildren() {
+ return children;
+ }
+
+ }
+
+ private final ArrayList<Runner> runners = new ArrayList<Runner>();
+
+ /**
+ * Only called reflectively. Do not use programmatically.
+ */
+ public BaseConverterTestRunner(Class<?> klass) throws Throwable {
+ super(klass, Collections.<Runner>emptyList());
+
+ TestClass testClass = getTestClass();
+ List<FrameworkMethod> testMethods = testClass.getAnnotatedMethods(Test.class);
+ for (FrameworkMethod testMethod: testMethods) {
+ runners.add(new ParameterizedTestRunner(klass, testMethod));
+ }
+ }
+
+ @Override
+ protected List<Runner> getChildren() {
+ return runners;
+ }
+}
Modified: branches/RF-8742/ui/validator/ui/src/test/java/org/richfaces/convert/DateTimeConverterTest.java
===================================================================
--- branches/RF-8742/ui/validator/ui/src/test/java/org/richfaces/convert/DateTimeConverterTest.java 2010-10-24 19:54:39 UTC (rev 19659)
+++ branches/RF-8742/ui/validator/ui/src/test/java/org/richfaces/convert/DateTimeConverterTest.java 2010-10-25 01:02:43 UTC (rev 19660)
@@ -36,27 +36,23 @@
}
@Test
- @TestDataHolder({
- @TestData(submittedValue = "18-10-2010"),
- @TestData(submittedValue = "17-10-2010")
- })
- public void testSuccess() throws Exception {
+ @TestDataHolder(
+ successes = {
+ @TestData(submittedValue = "18-10-2010"),
+ @TestData(submittedValue = "17-10-2010")
+ },
+ failures = {
+ @TestData(submittedValue = "10/17/2010")
+ }
+ )
+ public void testPattern() throws Exception {
setClientConverterClassName("org.rf.DateTimeConverter");
setConverterId(DateTimeConverter.CONVERTER_ID);
setAttribute("pattern", "dd-MM-yyyy");
-
- assertConversionOk();
}
@Test
- @TestDataHolder({
- @TestData(submittedValue = "10/17/2010", failureMessage = TEST_COMPONENT_LABEL + ": '10/17/2010' could not be understood as a date.")
- })
- public void testFailures() throws Exception {
- setClientConverterClassName("org.rf.DateTimeConverter");
- setConverterId(DateTimeConverter.CONVERTER_ID);
- setAttribute("pattern", "dd-MM-yyyy");
+ public void testNoPattern() throws Exception {
- assertConversionFailure();
}
}
Modified: branches/RF-8742/ui/validator/ui/src/test/java/org/richfaces/convert/NumberConverterTest.java
===================================================================
--- branches/RF-8742/ui/validator/ui/src/test/java/org/richfaces/convert/NumberConverterTest.java 2010-10-24 19:54:39 UTC (rev 19659)
+++ branches/RF-8742/ui/validator/ui/src/test/java/org/richfaces/convert/NumberConverterTest.java 2010-10-25 01:02:43 UTC (rev 19660)
@@ -21,8 +21,6 @@
*/
package org.richfaces.convert;
-import static org.junit.Assert.*;
-
import javax.faces.convert.NumberConverter;
import org.junit.Test;
@@ -38,27 +36,17 @@
}
@Test
- @TestDataHolder({
- @TestData(submittedValue = "111")
- })
+ @TestDataHolder(
+ successes = {
+ @TestData(submittedValue = "111")
+ },
+ failures = {
+ @TestData(submittedValue = "aaa")
+ }
+ )
public void testSuccess() throws Exception {
setClientConverterClassName("RichFaces.csv.getConverter('number')");
setConverterId(NumberConverter.CONVERTER_ID);
//setAttribute("pattern", "dd-MM-yyyy");
-
- assertConversionOk();
}
-
- @Test
- @TestDataHolder({
- @TestData(submittedValue = "aaa", failureMessage = TEST_COMPONENT_LABEL + ": 'aaa' could not be understood as a number.")
- })
- public void testFailures() throws Exception {
- setClientConverterClassName("RichFaces.csv.getConverter('number')");
- setConverterId(NumberConverter.CONVERTER_ID);
- //setConversionErrorMessage("");
- //setAttribute("pattern", "dd-MM-yyyy");
-
- assertConversionFailure();
- }
}
Modified: branches/RF-8742/ui/validator/ui/src/test/java/org/richfaces/convert/TestData.java
===================================================================
--- branches/RF-8742/ui/validator/ui/src/test/java/org/richfaces/convert/TestData.java 2010-10-24 19:54:39 UTC (rev 19659)
+++ branches/RF-8742/ui/validator/ui/src/test/java/org/richfaces/convert/TestData.java 2010-10-25 01:02:43 UTC (rev 19660)
@@ -38,5 +38,5 @@
public String submittedValue();
public String failureMessage() default "";
-
+
}
Modified: branches/RF-8742/ui/validator/ui/src/test/java/org/richfaces/convert/TestDataHolder.java
===================================================================
--- branches/RF-8742/ui/validator/ui/src/test/java/org/richfaces/convert/TestDataHolder.java 2010-10-24 19:54:39 UTC (rev 19659)
+++ branches/RF-8742/ui/validator/ui/src/test/java/org/richfaces/convert/TestDataHolder.java 2010-10-25 01:02:43 UTC (rev 19660)
@@ -35,6 +35,8 @@
@Target(ElementType.METHOD)
public @interface TestDataHolder {
- public TestData[] value();
+ public TestData[] successes();
+ public TestData[] failures();
+
}
13 years, 11 months
JBoss Rich Faces SVN: r19659 - in trunk/ui/common/ui/src: test/java/org/richfaces/renderkit and 1 other directory.
by richfaces-svn-commits@lists.jboss.org
Author: nbelaevski
Date: 2010-10-24 15:54:39 -0400 (Sun, 24 Oct 2010)
New Revision: 19659
Modified:
trunk/ui/common/ui/src/main/java/org/richfaces/renderkit/RenderKitUtils.java
trunk/ui/common/ui/src/test/java/org/richfaces/renderkit/RenderKitUtilsTest.java
Log:
https://jira.jboss.org/browse/RF-8957
Modified: trunk/ui/common/ui/src/main/java/org/richfaces/renderkit/RenderKitUtils.java
===================================================================
--- trunk/ui/common/ui/src/main/java/org/richfaces/renderkit/RenderKitUtils.java 2010-10-24 19:12:42 UTC (rev 19658)
+++ trunk/ui/common/ui/src/main/java/org/richfaces/renderkit/RenderKitUtils.java 2010-10-24 19:54:39 UTC (rev 19659)
@@ -304,14 +304,12 @@
return result.toString();
}
- public static boolean shouldRenderAttribute(Object attributeValue) {
+ private static boolean isAttributeSet(Object attributeValue) {
//TODO - consider required attributes with "" value (like 'alt')
if (attributeValue == null) {
return false;
} else if (attributeValue instanceof String) {
return ((String) attributeValue).length() > 0;
- } else if (attributeValue instanceof Boolean && Boolean.FALSE.equals(attributeValue)) {
- return false;
} else if (attributeValue instanceof Integer && (Integer) attributeValue == Integer.MIN_VALUE) {
return false;
} else if (attributeValue instanceof Double && (Double) attributeValue == Double.MIN_VALUE) {
@@ -330,7 +328,20 @@
return attributeValue.toString().length() > 0;
}
+
+ public static boolean shouldRenderAttribute(Object attributeValue) {
+ //TODO - consider required attributes with "" value (like 'alt')
+ if (!isAttributeSet(attributeValue)) {
+ return false;
+ }
+
+ if (attributeValue instanceof Boolean && Boolean.FALSE.equals(attributeValue)) {
+ return false;
+ }
+ return attributeValue.toString().length() > 0;
+ }
+
public static String prefixAttributeName(String attributeName, boolean isXhtmlMode) {
if (isXhtmlMode) {
if (Arrays.binarySearch(XHTML_ATTRIBUTE_NAMES, attributeName) >= 0) {
@@ -599,7 +610,7 @@
ScriptHashVariableWrapper wrapperOrDefault = wrapper != null ? wrapper : ScriptHashVariableWrapper.noop;
- if (!isEmpty(value) && shouldRenderAttribute(value)) {
+ if (!isEmpty(value) && isAttributeSet(value)) {
if (defaultValue != null) {
if (!String.valueOf(defaultValue).equals(value.toString())) {
hash.put(name, wrapperOrDefault.wrap(value));
Modified: trunk/ui/common/ui/src/test/java/org/richfaces/renderkit/RenderKitUtilsTest.java
===================================================================
--- trunk/ui/common/ui/src/test/java/org/richfaces/renderkit/RenderKitUtilsTest.java 2010-10-24 19:12:42 UTC (rev 19658)
+++ trunk/ui/common/ui/src/test/java/org/richfaces/renderkit/RenderKitUtilsTest.java 2010-10-24 19:54:39 UTC (rev 19659)
@@ -39,6 +39,7 @@
import java.util.TreeSet;
import org.ajax4jsf.javascript.JSFunctionDefinition;
+import org.ajax4jsf.javascript.ScriptUtils;
import org.junit.Test;
import org.richfaces.renderkit.RenderKitUtils.ScriptHashVariableWrapper;
@@ -163,6 +164,7 @@
assertEquals("1,2,null,3", toScriptArgs(1, 2, null, 3));
}
+ @Test
public void testScriptHashVariableWrapper() throws Exception {
assertEquals("abc", ScriptHashVariableWrapper.noop.wrap("abc"));
@@ -174,9 +176,10 @@
assertEquals("function(event){abc}", dehydrate(handlerFunction.toScript()));
Object arrayObject = ScriptHashVariableWrapper.asArray.wrap("header, footer");
- assertEquals("[\"header\",\"footer\"]", arrayObject.toString().replaceAll("\\s", ""));
+ assertEquals("[\"header\",\"footer\"]", dehydrate(ScriptUtils.toScript(arrayObject)));
}
+ @Test
public void testAddToScriptHash() throws Exception {
Map<String, Object> hash = new HashMap<String, Object>();
@@ -237,11 +240,12 @@
assertTrue(hash.get("onclick1") instanceof JSFunctionDefinition);
}
-
+ @Test
public void testAsArray() {
assertNull(RenderKitUtils.asArray(null));
}
+ @Test
public void testAsArray1() {
String[] strings = new String[] {"a", "b"};
String[] array = RenderKitUtils.asArray(strings);
@@ -249,6 +253,7 @@
assertSame(strings, array);
}
+ @Test
public void testAsArray2() {
Object[] objects = new Object[] {Integer.valueOf(12), null, Integer.valueOf(22), Integer.valueOf(42)};
String[] array = RenderKitUtils.asArray(objects);
@@ -257,6 +262,7 @@
assertTrue(Arrays.equals(etalon, array));
}
+ @Test
public void testAsArray3() {
ArrayList<Integer> list = new ArrayList<Integer>();
@@ -271,6 +277,7 @@
assertTrue(Arrays.equals(etalon, array));
}
+ @Test
public void testAsArray31() {
Set<Integer> set = new TreeSet<Integer>();
@@ -284,6 +291,7 @@
assertTrue(Arrays.equals(etalon, array));
}
+ @Test
public void testAsArray4() {
String string = " a , \t\n b \n , c ";
String[] strings = RenderKitUtils.asArray(string);
13 years, 11 months
JBoss Rich Faces SVN: r19658 - trunk/cdk/generator/src/main/java/org/richfaces/cdk/templatecompiler/builder/model.
by richfaces-svn-commits@lists.jboss.org
Author: nbelaevski
Date: 2010-10-24 15:12:42 -0400 (Sun, 24 Oct 2010)
New Revision: 19658
Added:
trunk/cdk/generator/src/main/java/org/richfaces/cdk/templatecompiler/builder/model/JavaImportImpl.java
Log:
https://jira.jboss.org/browse/RF-8957
Added: trunk/cdk/generator/src/main/java/org/richfaces/cdk/templatecompiler/builder/model/JavaImportImpl.java
===================================================================
--- trunk/cdk/generator/src/main/java/org/richfaces/cdk/templatecompiler/builder/model/JavaImportImpl.java (rev 0)
+++ trunk/cdk/generator/src/main/java/org/richfaces/cdk/templatecompiler/builder/model/JavaImportImpl.java 2010-10-24 19:12:42 UTC (rev 19658)
@@ -0,0 +1,111 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2010, Red Hat, Inc. and individual contributors
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.richfaces.cdk.templatecompiler.builder.model;
+
+import java.util.regex.Pattern;
+
+/**
+ * @author Nick Belaevski
+ *
+ */
+public class JavaImportImpl implements JavaImport {
+
+ private static final Pattern JAVA_LANG_PATTERN = Pattern.compile("^java\\.lang\\.[^\\.]+$");
+
+ private String name;
+
+ private boolean _static;
+
+ public JavaImportImpl(String name) {
+ this(name, false);
+ }
+
+ public JavaImportImpl(Class<?> clazz) {
+ this(clazz.getName());
+ }
+
+ public JavaImportImpl(String name, boolean _static) {
+ super();
+ this.name = name;
+ this._static = _static;
+ }
+
+ public JavaImportImpl(Class<?> clazz, boolean _static) {
+ this(clazz.getName(), _static);
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public boolean isStatic() {
+ return _static;
+ }
+
+ public boolean isDefault() {
+ String name = getName();
+
+ if (!name.contains(".")) {
+ return true;
+ }
+
+ if (JAVA_LANG_PATTERN.matcher(name).matches()) {
+ return true;
+ }
+
+ return false;
+ }
+
+ @Override
+ public int hashCode() {
+ final int prime = 31;
+ int result = 1;
+ result = prime * result + (isStatic() ? 1231 : 1237);
+ result = prime * result + ((getName() == null) ? 0 : getName().hashCode());
+ return result;
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ if (this == obj) {
+ return true;
+ }
+ if (obj == null) {
+ return false;
+ }
+ if (getClass() != obj.getClass()) {
+ return false;
+ }
+ JavaImport other = (JavaImport) obj;
+ if (isStatic() != other.isStatic()) {
+ return false;
+ }
+ if (getName() == null) {
+ if (other.getName() != null) {
+ return false;
+ }
+ } else if (!getName().equals(other.getName())) {
+ return false;
+ }
+ return true;
+ }
+}
13 years, 11 months
JBoss Rich Faces SVN: r19657 - in trunk: cdk/generator/src/main/java/org/richfaces/cdk/templatecompiler/builder/model and 22 other directories.
by richfaces-svn-commits@lists.jboss.org
Author: nbelaevski
Date: 2010-10-24 15:11:47 -0400 (Sun, 24 Oct 2010)
New Revision: 19657
Added:
trunk/cdk/generator/src/main/java/org/richfaces/cdk/templatecompiler/model/CdkScriptObjectElement.java
trunk/cdk/generator/src/main/java/org/richfaces/cdk/templatecompiler/model/CdkScriptOptionElement.java
trunk/cdk/generator/src/main/java/org/richfaces/cdk/templatecompiler/model/ClassImport.java
trunk/cdk/generator/src/main/java/org/richfaces/cdk/templatecompiler/statements/AddAttributesToScriptHashStatement.java
trunk/cdk/generator/src/main/java/org/richfaces/cdk/templatecompiler/statements/PassThrough.java
trunk/cdk/generator/src/main/java/org/richfaces/cdk/templatecompiler/statements/ScriptObjectStatement.java
trunk/cdk/generator/src/main/java/org/richfaces/cdk/templatecompiler/statements/ScriptOptionStatement.java
trunk/cdk/generator/src/main/resources/META-INF/templates/java/add-attributes-to-script-hash.ftl
trunk/cdk/generator/src/main/resources/META-INF/templates/java/script-object.ftl
trunk/cdk/generator/src/main/resources/META-INF/templates/java/script-option.ftl
trunk/cdk/generator/src/test/java/org/richfaces/cdk/templatecompiler/statements/AddAttributesToScriptHashTest.java
Removed:
trunk/cdk/generator/src/main/java/org/richfaces/cdk/templatecompiler/builder/model/ClassImport.java
trunk/cdk/generator/src/main/java/org/richfaces/cdk/templatecompiler/builder/model/RuntimeImport.java
trunk/core/impl/src/main/java/org/richfaces/component/util/ComponentUtil.java
trunk/core/impl/src/test/java/org/richfaces/component/util/ComponentUtilTest.java
Modified:
trunk/cdk/generator/src/main/java/org/richfaces/cdk/templatecompiler/RendererClassVisitor.java
trunk/cdk/generator/src/main/java/org/richfaces/cdk/templatecompiler/builder/model/JavaClass.java
trunk/cdk/generator/src/main/java/org/richfaces/cdk/templatecompiler/builder/model/JavaImport.java
trunk/cdk/generator/src/main/java/org/richfaces/cdk/templatecompiler/builder/model/RequireImports.java
trunk/cdk/generator/src/main/java/org/richfaces/cdk/templatecompiler/el/node/AstFunctionTreeNode.java
trunk/cdk/generator/src/main/java/org/richfaces/cdk/templatecompiler/el/types/PlainClassType.java
trunk/cdk/generator/src/main/java/org/richfaces/cdk/templatecompiler/el/types/TypesFactoryImpl.java
trunk/cdk/generator/src/main/java/org/richfaces/cdk/templatecompiler/model/CompositeInterface.java
trunk/cdk/generator/src/main/java/org/richfaces/cdk/templatecompiler/model/ModelFragment.java
trunk/cdk/generator/src/main/java/org/richfaces/cdk/templatecompiler/model/TemplateVisitor.java
trunk/cdk/generator/src/main/java/org/richfaces/cdk/templatecompiler/statements/AttributesStatement.java
trunk/cdk/generator/src/main/java/org/richfaces/cdk/templatecompiler/statements/FreeMarkerTemplateStatementBase.java
trunk/cdk/generator/src/main/java/org/richfaces/cdk/templatecompiler/statements/HelperMethod.java
trunk/cdk/generator/src/main/java/org/richfaces/cdk/templatecompiler/statements/HelperMethodFactoryImpl.java
trunk/cdk/generator/src/main/java/org/richfaces/cdk/templatecompiler/statements/RendererUtilsMethod.java
trunk/cdk/generator/src/main/java/org/richfaces/cdk/templatecompiler/statements/TemplateStatement.java
trunk/cdk/generator/src/main/java/org/richfaces/cdk/templatecompiler/statements/WriteAttributesSetStatement.java
trunk/cdk/generator/src/main/java/org/richfaces/cdk/util/JavaUtils.java
trunk/cdk/generator/src/main/java/org/richfaces/cdk/util/Strings.java
trunk/cdk/generator/src/main/resources/META-INF/schema/cdk-template.xsd
trunk/cdk/generator/src/main/resources/META-INF/templates/java/class.ftl
trunk/cdk/generator/src/main/resources/META-INF/templates/java/util.ftl
trunk/cdk/generator/src/main/resources/META-INF/templates/java/write-attributes-set.ftl
trunk/cdk/generator/src/test/java/org/richfaces/cdk/templatecompiler/model/TemplateParserTest.java
trunk/cdk/generator/src/test/java/org/richfaces/cdk/templatecompiler/parser/el/test/ELParserTest.java
trunk/cdk/generator/src/test/java/org/richfaces/cdk/templatecompiler/statements/FreeMarkerTemplateStatementTest.java
trunk/cdk/generator/src/test/java/org/richfaces/cdk/templatecompiler/statements/WriteAttributesSetTest.java
trunk/ui/common/ui/src/main/java/org/richfaces/renderkit/RenderKitUtils.java
trunk/ui/common/ui/src/main/java/org/richfaces/renderkit/util/RendererUtils.java
trunk/ui/common/ui/src/test/java/org/richfaces/renderkit/RenderKitUtilsTest.java
trunk/ui/common/ui/src/test/java/org/richfaces/renderkit/util/RendererUtilsTest.java
trunk/ui/core/ui/src/main/java/org/richfaces/renderkit/html/AjaxPushRenderer.java
trunk/ui/core/ui/src/main/java/org/richfaces/renderkit/html/AjaxStatusRenderer.java
trunk/ui/core/ui/src/main/java/org/richfaces/renderkit/html/QueueResourceComponentRenderer.java
trunk/ui/input/ui/src/main/java/org/richfaces/renderkit/AutocompleteRendererBase.java
trunk/ui/iteration/ui/src/main/java/org/richfaces/renderkit/ExtendedDataTableRenderer.java
trunk/ui/iteration/ui/src/main/java/org/richfaces/renderkit/ListRendererBase.java
trunk/ui/misc/ui/src/main/java/org/richfaces/renderkit/JQueryRendererBase.java
trunk/ui/misc/ui/src/main/templates/jquery.template.xml
trunk/ui/output/ui/src/main/java/org/richfaces/renderkit/html/PopupPanelBaseRenderer.java
trunk/ui/output/ui/src/main/java/org/richfaces/renderkit/html/ProgressBarBaseRenderer.java
Log:
https://jira.jboss.org/browse/RF-8957
Modified: trunk/cdk/generator/src/main/java/org/richfaces/cdk/templatecompiler/RendererClassVisitor.java
===================================================================
--- trunk/cdk/generator/src/main/java/org/richfaces/cdk/templatecompiler/RendererClassVisitor.java 2010-10-22 16:54:29 UTC (rev 19656)
+++ trunk/cdk/generator/src/main/java/org/richfaces/cdk/templatecompiler/RendererClassVisitor.java 2010-10-24 19:11:47 UTC (rev 19657)
@@ -25,6 +25,7 @@
import java.io.IOException;
import java.lang.reflect.Type;
+import java.text.MessageFormat;
import java.util.Collection;
import java.util.EnumSet;
import java.util.List;
@@ -58,13 +59,17 @@
import org.richfaces.cdk.templatecompiler.model.CdkIfElement;
import org.richfaces.cdk.templatecompiler.model.CdkObjectElement;
import org.richfaces.cdk.templatecompiler.model.CdkOtherwiseElement;
+import org.richfaces.cdk.templatecompiler.model.CdkScriptObjectElement;
+import org.richfaces.cdk.templatecompiler.model.CdkScriptOptionElement;
import org.richfaces.cdk.templatecompiler.model.CdkSwitchElement;
import org.richfaces.cdk.templatecompiler.model.CdkWhenElement;
+import org.richfaces.cdk.templatecompiler.model.ClassImport;
import org.richfaces.cdk.templatecompiler.model.CompositeImplementation;
import org.richfaces.cdk.templatecompiler.model.CompositeInterface;
import org.richfaces.cdk.templatecompiler.model.ResourceDependency;
import org.richfaces.cdk.templatecompiler.model.Template;
import org.richfaces.cdk.templatecompiler.model.TemplateVisitor;
+import org.richfaces.cdk.templatecompiler.statements.AddAttributesToScriptHashStatement;
import org.richfaces.cdk.templatecompiler.statements.AttributesStatement;
import org.richfaces.cdk.templatecompiler.statements.CaseStatement;
import org.richfaces.cdk.templatecompiler.statements.ConstantReturnMethodBodyStatement;
@@ -76,6 +81,8 @@
import org.richfaces.cdk.templatecompiler.statements.HelperMethodFactory;
import org.richfaces.cdk.templatecompiler.statements.IfElseStatement;
import org.richfaces.cdk.templatecompiler.statements.IfStatement;
+import org.richfaces.cdk.templatecompiler.statements.ScriptObjectStatement;
+import org.richfaces.cdk.templatecompiler.statements.ScriptOptionStatement;
import org.richfaces.cdk.templatecompiler.statements.StartElementStatement;
import org.richfaces.cdk.templatecompiler.statements.StatementsContainer;
import org.richfaces.cdk.templatecompiler.statements.SwitchStatement;
@@ -85,6 +92,7 @@
import org.richfaces.cdk.util.Strings;
import com.google.common.collect.ImmutableMap;
+import com.google.common.collect.Lists;
import com.google.inject.Injector;
/**
@@ -131,11 +139,6 @@
*/
static final String CLIENT_ID_VARIABLE = "clientId";
- /**
- *
- */
- private static final String PASS_THROUGH_ATTRIBUTES_FIELD_NAME = "PASS_THROUGH_ATTRIBUTES";
-
private final Logger log;
private final Injector injector;
@@ -148,8 +151,6 @@
private JavaClass generatedClass;
private Set<HelperMethod> addedHelperMethods = EnumSet.noneOf(HelperMethod.class);
- private int passThroughCounter;
-
public RendererClassVisitor(CompositeInterface compositeInterface, Collection<PropertyBase> attributes, Logger log,
Injector injector, TypesFactory typesFactory, HelperMethodFactory helperFactory) {
this.compositeInterface = compositeInterface;
@@ -170,6 +171,18 @@
this.generatedClass.addImport(ResponseWriter.class);
this.generatedClass.addImport(UIComponent.class);
+ for (ClassImport classImport: compositeInterface.getClassImports()) {
+ List<String> importedNames = classImport.getNames();
+ if (importedNames == null || importedNames.isEmpty()) {
+ importedNames = Lists.newArrayList("*");
+ }
+
+ for (String importedName : importedNames) {
+ this.generatedClass.addImport(Strings.DOT_JOINER.join(classImport.getPackage(), importedName),
+ classImport.isStatic());
+ }
+ }
+
// TODO - make this JavaDoc - Generated annotation is present since JDK6
// this.generatedClass.addAnnotation(Generated.class, "\"RichFaces CDK\"");
// TODO remove this after improving Java model
@@ -603,7 +616,6 @@
*/
public void preProcess(CompositeImplementation impl) {
initializeJavaClass();
- passThroughCounter = -1;
}
/**
@@ -614,4 +626,51 @@
createRendersChildrenMethod();
}
+ @Override
+ public void startElement(CdkScriptObjectElement cdkScriptObjectElement) {
+ ScriptObjectStatement scriptObjectStatement = pushStatement(ScriptObjectStatement.class);
+ scriptObjectStatement.setObject(cdkScriptObjectElement.getName(), cdkScriptObjectElement.getBase());
+ }
+
+ @Override
+ public void endElement(CdkScriptObjectElement cdkScriptObjectElement) {
+ popStatement();
+ }
+
+ private void addScriptHashAttributesPassthroughStatement(List<String> attributeNames, String wrapper) {
+ if (attributeNames == null || attributeNames.isEmpty()) {
+ return;
+ }
+
+ AddAttributesToScriptHashStatement statement = addStatement(AddAttributesToScriptHashStatement.class);
+ statement.setWrapper(wrapper);
+ statement.setAttributes(attributeNames, attributes);
+ }
+
+ private void addScriptOptionStatement(String name, String value, String defaultValue, String wrapper) {
+ ScriptOptionStatement scriptOptionStatement = addStatement(ScriptOptionStatement.class);
+ scriptOptionStatement.setName(name);
+ scriptOptionStatement.setValueExpression(value);
+ scriptOptionStatement.setDefaultValue(defaultValue);
+ scriptOptionStatement.setWrapper(wrapper);
+ }
+
+ @Override
+ public void visitElement(CdkScriptOptionElement cdkScriptOptionElement) {
+ addScriptHashAttributesPassthroughStatement(cdkScriptOptionElement.getAttributes(), cdkScriptOptionElement.getWrapper());
+
+ for (String variableName : cdkScriptOptionElement.getVariables()) {
+ addScriptOptionStatement(variableName,
+ MessageFormat.format("#'{'{0}'}'", variableName),
+ cdkScriptOptionElement.getDefaultValue(),
+ cdkScriptOptionElement.getWrapper());
+ }
+
+ if (!Strings.isEmpty(cdkScriptOptionElement.getName())) {
+ addScriptOptionStatement(cdkScriptOptionElement.getName(),
+ cdkScriptOptionElement.getValue(),
+ cdkScriptOptionElement.getDefaultValue(),
+ cdkScriptOptionElement.getWrapper());
+ }
+ }
}
Deleted: trunk/cdk/generator/src/main/java/org/richfaces/cdk/templatecompiler/builder/model/ClassImport.java
===================================================================
--- trunk/cdk/generator/src/main/java/org/richfaces/cdk/templatecompiler/builder/model/ClassImport.java 2010-10-22 16:54:29 UTC (rev 19656)
+++ trunk/cdk/generator/src/main/java/org/richfaces/cdk/templatecompiler/builder/model/ClassImport.java 2010-10-24 19:11:47 UTC (rev 19657)
@@ -1,48 +0,0 @@
-/**
- * License Agreement.
- *
- * Rich Faces - Natural Ajax for Java Server Faces (JSF)
- *
- * Copyright (C) 2007 Exadel, Inc.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License version 2.1 as published by the Free Software Foundation.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- */
-
-package org.richfaces.cdk.templatecompiler.builder.model;
-
-/**
- * @author Maksim Kaszynski
- */
-public class ClassImport implements JavaImport {
- private Class<?> clazz;
-
- public ClassImport(Class<?> clazz) {
- super();
- this.clazz = clazz;
- }
-
- public String getName() {
- return clazz.getName();
- }
-
- @Override
- public boolean isDefault() {
- if(clazz.isPrimitive()){
- return true;
- } else if("java.lang".equals(clazz.getPackage().getName())){
- return true;
- }
- return false;
- }
-}
Modified: trunk/cdk/generator/src/main/java/org/richfaces/cdk/templatecompiler/builder/model/JavaClass.java
===================================================================
--- trunk/cdk/generator/src/main/java/org/richfaces/cdk/templatecompiler/builder/model/JavaClass.java 2010-10-22 16:54:29 UTC (rev 19656)
+++ trunk/cdk/generator/src/main/java/org/richfaces/cdk/templatecompiler/builder/model/JavaClass.java 2010-10-24 19:11:47 UTC (rev 19657)
@@ -71,18 +71,20 @@
public void addImport(String name) {
- addImport(new RuntimeImport(name));
+ addImport(new JavaImportImpl(name));
}
- public void addImport(JavaImport javaImport) {
- imports.add(javaImport);
+ public void addImport(String name, boolean _static) {
+ addImport(new JavaImportImpl(name, _static));
}
public void addImport(Class<?> claz) {
- if (shouldAddToImports(claz.getName())) {
- imports.add(new ClassImport(claz));
- }
+ addImport(claz.getName());
}
+
+ public void addImport(JavaImport javaImport) {
+ imports.add(javaImport);
+ }
public void addImports(Iterable<JavaImport> imports) {
for (JavaImport elType : imports) {
@@ -141,20 +143,4 @@
return simpleName;
}
- private boolean shouldAddToImports(String className) {
- if (className == null || className.length() == 0) {
- return false;
- }
-
- // default package & primitive types
- if (className.indexOf('.') == -1) {
- return false;
- }
-
- if (className.matches("^java\\.lang\\.[^\\.]+$")) {
- return false;
- }
-
- return true;
- }
}
Modified: trunk/cdk/generator/src/main/java/org/richfaces/cdk/templatecompiler/builder/model/JavaImport.java
===================================================================
--- trunk/cdk/generator/src/main/java/org/richfaces/cdk/templatecompiler/builder/model/JavaImport.java 2010-10-22 16:54:29 UTC (rev 19656)
+++ trunk/cdk/generator/src/main/java/org/richfaces/cdk/templatecompiler/builder/model/JavaImport.java 2010-10-24 19:11:47 UTC (rev 19657)
@@ -27,12 +27,17 @@
* @author Maksim Kaszynski
*/
public interface JavaImport {
+
public Comparator<? super JavaImport> COMPARATOR = new Comparator<JavaImport>() {
public int compare(JavaImport o1, JavaImport o2) {
return o1.getName().compareTo(o2.getName());
}
};
- String getName();
-
- boolean isDefault();
+
+ public String getName();
+
+ public boolean isStatic();
+
+ public boolean isDefault();
+
}
Modified: trunk/cdk/generator/src/main/java/org/richfaces/cdk/templatecompiler/builder/model/RequireImports.java
===================================================================
--- trunk/cdk/generator/src/main/java/org/richfaces/cdk/templatecompiler/builder/model/RequireImports.java 2010-10-22 16:54:29 UTC (rev 19656)
+++ trunk/cdk/generator/src/main/java/org/richfaces/cdk/templatecompiler/builder/model/RequireImports.java 2010-10-24 19:11:47 UTC (rev 19657)
@@ -6,6 +6,7 @@
import com.google.common.base.Function;
public interface RequireImports {
+
public static final Function<RequireImports, Iterable<JavaImport>> IMPORTS_TRANSFORM = new Function<RequireImports, Iterable<JavaImport>>() {
@Override
Deleted: trunk/cdk/generator/src/main/java/org/richfaces/cdk/templatecompiler/builder/model/RuntimeImport.java
===================================================================
--- trunk/cdk/generator/src/main/java/org/richfaces/cdk/templatecompiler/builder/model/RuntimeImport.java 2010-10-22 16:54:29 UTC (rev 19656)
+++ trunk/cdk/generator/src/main/java/org/richfaces/cdk/templatecompiler/builder/model/RuntimeImport.java 2010-10-24 19:11:47 UTC (rev 19657)
@@ -1,59 +0,0 @@
-/**
- * License Agreement.
- *
- * Rich Faces - Natural Ajax for Java Server Faces (JSF)
- *
- * Copyright (C) 2007 Exadel, Inc.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License version 2.1 as published by the Free Software Foundation.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- */
-
-package org.richfaces.cdk.templatecompiler.builder.model;
-
-import java.util.regex.Pattern;
-
-/**
- * Implementation of import taht cannot be resolved in design time
- *
- * @author Maksim Kaszynski
- */
-public class RuntimeImport implements JavaImport {
-
- private static final Pattern JAVA_LANG_PATTERN = Pattern.compile("^java\\.lang\\.[^\\.]+$");
-
- private String name;
-
- public RuntimeImport(String name) {
- super();
- this.name = name;
- }
-
- public String getName() {
- return name;
- }
-
- @Override
- public boolean isDefault() {
- // default package & primitive types
- if (name.indexOf('.') == -1) {
- return true;
- }
-
- if (JAVA_LANG_PATTERN.matcher(name).matches()) {
- return true;
- }
-
- return false;
- }
-}
Modified: trunk/cdk/generator/src/main/java/org/richfaces/cdk/templatecompiler/el/node/AstFunctionTreeNode.java
===================================================================
--- trunk/cdk/generator/src/main/java/org/richfaces/cdk/templatecompiler/el/node/AstFunctionTreeNode.java 2010-10-22 16:54:29 UTC (rev 19656)
+++ trunk/cdk/generator/src/main/java/org/richfaces/cdk/templatecompiler/el/node/AstFunctionTreeNode.java 2010-10-24 19:11:47 UTC (rev 19657)
@@ -22,12 +22,18 @@
package org.richfaces.cdk.templatecompiler.el.node;
+import static org.richfaces.cdk.templatecompiler.el.ELNodeConstants.COMMA;
+import static org.richfaces.cdk.templatecompiler.el.ELNodeConstants.LEFT_BRACKET;
+import static org.richfaces.cdk.templatecompiler.el.ELNodeConstants.RIGHT_BRACKET;
+import static org.richfaces.cdk.templatecompiler.el.ELNodeConstants.THIS_PREFIX;
+
import org.jboss.el.parser.AstFunction;
import org.jboss.el.parser.Node;
-import org.richfaces.cdk.templatecompiler.el.ELNodeConstants;
import org.richfaces.cdk.templatecompiler.el.ELVisitor;
import org.richfaces.cdk.templatecompiler.el.ParsingException;
import org.richfaces.cdk.templatecompiler.el.types.ELType;
+import org.richfaces.cdk.templatecompiler.el.types.TypesFactory;
+import org.richfaces.cdk.templatecompiler.statements.HelperMethod;
import org.richfaces.cdk.util.Strings;
/**
@@ -45,23 +51,68 @@
@Override
public void visit(StringBuilder sb, ELVisitor visitor) throws ParsingException {
AstFunction functionNode = (AstFunction) getNode();
- String functionPrefix = functionNode.getPrefix();
- String functionName = functionNode.getLocalName();
-
- String identifierName;
- if (!Strings.isEmpty(functionPrefix)) {
- // TODO: this should be a property getter, not property name. NB: 'this' & 'super' keywords
- identifierName = functionPrefix;
+
+ HelperMethod helperMethod = findMatchingHelperMethod(functionNode);
+ if (helperMethod != null) {
+ visitHelperMethod(sb, visitor, helperMethod, functionNode);
} else {
- identifierName = ELNodeConstants.THIS_PREFIX;
+ visitObjectMethod(sb, visitor, functionNode);
}
+ }
+ /**
+ * @param sb
+ * @param visitor
+ * @param helperMethod
+ * @param functionNode
+ * @throws ParsingException
+ */
+ private void visitHelperMethod(StringBuilder sb, ELVisitor visitor, HelperMethod helperMethod,
+ AstFunction functionNode) throws ParsingException {
+ visitor.addHelperMethods(helperMethod);
+
+ visitor.setLiteral(false);
+
+ //TODO - helper method doesn't provide this info
+ visitor.setExpressionType(TypesFactory.OBJECT_TYPE);
+
+ sb.append(helperMethod.getName());
+ sb.append(LEFT_BRACKET);
+
+ for (int i = 0; i < functionNode.jjtGetNumChildren(); i++) {
+ if (i != 0) {
+ sb.append(COMMA);
+ }
+
+ String childOutput = getChildOutput(i, visitor);
+ sb.append(childOutput);
+ }
+
+ sb.append(RIGHT_BRACKET);
+ }
+
+ private HelperMethod findMatchingHelperMethod(AstFunction functionNode) {
+ if (Strings.isEmpty(functionNode.getPrefix())) {
+ for (HelperMethod helperMethod: HelperMethod.values()) {
+ if (helperMethod.getName().equals(functionNode.getLocalName())) {
+ return helperMethod;
+ }
+ }
+ }
+
+ return null;
+ }
+
+ private void visitObjectMethod(StringBuilder sb, ELVisitor visitor, AstFunction functionNode)
+ throws ParsingException {
+
+ String identifierName = Strings.firstNonEmpty(functionNode.getPrefix(), THIS_PREFIX);
sb.append(identifierName);
ELType identifierType = visitor.getVariable(identifierName);
visitor.setExpressionType(identifierType);
- visitMethod(sb, visitor, functionName);
+ visitMethod(sb, visitor, functionNode.getLocalName());
visitor.setLiteral(false);
}
}
Modified: trunk/cdk/generator/src/main/java/org/richfaces/cdk/templatecompiler/el/types/PlainClassType.java
===================================================================
--- trunk/cdk/generator/src/main/java/org/richfaces/cdk/templatecompiler/el/types/PlainClassType.java 2010-10-22 16:54:29 UTC (rev 19656)
+++ trunk/cdk/generator/src/main/java/org/richfaces/cdk/templatecompiler/el/types/PlainClassType.java 2010-10-24 19:11:47 UTC (rev 19657)
@@ -25,8 +25,8 @@
import java.util.Collections;
import java.util.Set;
-import org.richfaces.cdk.templatecompiler.builder.model.ClassImport;
import org.richfaces.cdk.templatecompiler.builder.model.JavaImport;
+import org.richfaces.cdk.templatecompiler.builder.model.JavaImportImpl;
/**
* @author Nick Belaevski
@@ -48,7 +48,7 @@
}
this.clazz = clazz;
- this.imports = Collections.<JavaImport>singleton(new ClassImport(clazz));
+ this.imports = Collections.<JavaImport>singleton(new JavaImportImpl(clazz));
}
public Class<?> getPlainJavaClass(){
Modified: trunk/cdk/generator/src/main/java/org/richfaces/cdk/templatecompiler/el/types/TypesFactoryImpl.java
===================================================================
--- trunk/cdk/generator/src/main/java/org/richfaces/cdk/templatecompiler/el/types/TypesFactoryImpl.java 2010-10-22 16:54:29 UTC (rev 19656)
+++ trunk/cdk/generator/src/main/java/org/richfaces/cdk/templatecompiler/el/types/TypesFactoryImpl.java 2010-10-24 19:11:47 UTC (rev 19657)
@@ -79,7 +79,8 @@
static final ImmutableMap<Class<?>, Class<?>> PRIMITIVE_TO_WRAPPER_CLASSES_MAP = ImmutableMap
.<Class<?>, Class<?>> builder().put(Boolean.TYPE, Boolean.class).put(Float.TYPE, Float.class)
.put(Long.TYPE, Long.class).put(Integer.TYPE, Integer.class).put(Short.TYPE, Short.class)
- .put(Byte.TYPE, Byte.class).put(Double.TYPE, Double.class).put(Character.TYPE, Character.class).build();
+ .put(Byte.TYPE, Byte.class).put(Double.TYPE, Double.class).put(Character.TYPE, Character.class)
+ .put(Void.TYPE, Void.class).build();
static final ImmutableMap<String, Class<?>> PRIMITIVE_CLASSES_MAP;
Added: trunk/cdk/generator/src/main/java/org/richfaces/cdk/templatecompiler/model/CdkScriptObjectElement.java
===================================================================
--- trunk/cdk/generator/src/main/java/org/richfaces/cdk/templatecompiler/model/CdkScriptObjectElement.java (rev 0)
+++ trunk/cdk/generator/src/main/java/org/richfaces/cdk/templatecompiler/model/CdkScriptObjectElement.java 2010-10-24 19:11:47 UTC (rev 19657)
@@ -0,0 +1,69 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2010, Red Hat, Inc. and individual contributors
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.richfaces.cdk.templatecompiler.model;
+
+import javax.xml.bind.annotation.XmlAttribute;
+import javax.xml.bind.annotation.XmlRootElement;
+import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
+
+import org.richfaces.cdk.CdkException;
+
+/**
+ * @author Nick Belaevski
+ *
+ */
+@XmlRootElement(name = "scriptObject", namespace = Template.CDK_NAMESPACE)
+public class CdkScriptObjectElement extends ModelFragment {
+
+ @XmlAttribute(required = true)
+ @XmlJavaTypeAdapter(NormalizedStringAdapter.class)
+ private String name;
+
+ @XmlAttribute
+ private String base;
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ public String getBase() {
+ return base;
+ }
+
+ public void setBase(String base) {
+ this.base = base;
+ }
+
+ @Override
+ public void beforeVisit(TemplateVisitor visitor) throws CdkException {
+ visitor.startElement(this);
+ }
+
+ @Override
+ public void afterVisit(TemplateVisitor visitor) throws CdkException {
+ visitor.endElement(this);
+ }
+}
Added: trunk/cdk/generator/src/main/java/org/richfaces/cdk/templatecompiler/model/CdkScriptOptionElement.java
===================================================================
--- trunk/cdk/generator/src/main/java/org/richfaces/cdk/templatecompiler/model/CdkScriptOptionElement.java (rev 0)
+++ trunk/cdk/generator/src/main/java/org/richfaces/cdk/templatecompiler/model/CdkScriptOptionElement.java 2010-10-24 19:11:47 UTC (rev 19657)
@@ -0,0 +1,110 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2010, Red Hat, Inc. and individual contributors
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.richfaces.cdk.templatecompiler.model;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import javax.xml.bind.annotation.XmlAttribute;
+import javax.xml.bind.annotation.XmlRootElement;
+
+import org.richfaces.cdk.CdkException;
+
+/**
+ * @author Nick Belaevski
+ *
+ */
+@XmlRootElement(name = "scriptOption", namespace = Template.CDK_NAMESPACE)
+public class CdkScriptOptionElement implements ModelElement {
+
+ @XmlAttribute
+ private List<String> variables = new ArrayList<String>();
+
+ @XmlAttribute
+ private List<String> attributes = new ArrayList<String>();
+
+ @XmlAttribute
+ private String name;
+
+ @XmlAttribute
+ private String value;
+
+ @XmlAttribute
+ private String defaultValue;
+
+ @XmlAttribute
+ private String wrapper;
+
+ public List<String> getVariables() {
+ return variables;
+ }
+
+ public void setVariables(List<String> variables) {
+ this.variables = variables;
+ }
+
+ public List<String> getAttributes() {
+ return attributes;
+ }
+
+ public void setAttributes(List<String> attributes) {
+ this.attributes = attributes;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ public String getValue() {
+ return value;
+ }
+
+ public void setValue(String value) {
+ this.value = value;
+ }
+
+ public String getDefaultValue() {
+ return defaultValue;
+ }
+
+ public void setDefaultValue(String defaultValue) {
+ this.defaultValue = defaultValue;
+ }
+
+ public String getWrapper() {
+ return wrapper;
+ }
+
+ public void setWrapper(String wrapper) {
+ this.wrapper = wrapper;
+ }
+
+ @Override
+ public void visit(TemplateVisitor visitor) throws CdkException {
+ visitor.visitElement(this);
+ }
+
+}
Added: trunk/cdk/generator/src/main/java/org/richfaces/cdk/templatecompiler/model/ClassImport.java
===================================================================
--- trunk/cdk/generator/src/main/java/org/richfaces/cdk/templatecompiler/model/ClassImport.java (rev 0)
+++ trunk/cdk/generator/src/main/java/org/richfaces/cdk/templatecompiler/model/ClassImport.java 2010-10-24 19:11:47 UTC (rev 19657)
@@ -0,0 +1,87 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2010, Red Hat, Inc. and individual contributors
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.richfaces.cdk.templatecompiler.model;
+
+import java.util.List;
+
+import javax.xml.bind.annotation.XmlAttribute;
+import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
+
+/**
+ * @author Nick Belaevski
+ *
+ */
+public class ClassImport {
+
+ @XmlAttribute(required = true)
+ @XmlJavaTypeAdapter(NormalizedStringAdapter.class)
+ private String _package;
+
+ @XmlAttribute
+ private boolean _static;
+
+ @XmlAttribute
+ private List<String> names;
+
+ /**
+ * @return the package_
+ */
+ public String getPackage() {
+ return _package;
+ }
+
+ /**
+ * @param _package the package_ to set
+ */
+ public void setPackage(String _package) {
+ this._package = _package;
+ }
+
+ /**
+ * @return the static_
+ */
+ public boolean isStatic() {
+ return _static;
+ }
+
+ /**
+ * @param static_ the static_ to set
+ */
+ public void setStatic(boolean _static) {
+ this._static = _static;
+ }
+
+ /**
+ * @return the classes
+ */
+ public List<String> getNames() {
+ return names;
+ }
+
+ /**
+ * @param classes the classes to set
+ */
+ public void setNames(List<String> classes) {
+ this.names = classes;
+ }
+
+}
Modified: trunk/cdk/generator/src/main/java/org/richfaces/cdk/templatecompiler/model/CompositeInterface.java
===================================================================
--- trunk/cdk/generator/src/main/java/org/richfaces/cdk/templatecompiler/model/CompositeInterface.java 2010-10-22 16:54:29 UTC (rev 19656)
+++ trunk/cdk/generator/src/main/java/org/richfaces/cdk/templatecompiler/model/CompositeInterface.java 2010-10-24 19:11:47 UTC (rev 19657)
@@ -67,6 +67,8 @@
private Boolean rendersChildren = null;
+ private List<ClassImport> classImports = Lists.newArrayList();
+
/**
* <p class="changed_added_4_0"></p>
*
@@ -243,4 +245,18 @@
this.attributesImports = attributesImports;
}
+ /**
+ * @return the classImports
+ */
+ @XmlElement(name = "import", namespace = Template.CDK_NAMESPACE)
+ public List<ClassImport> getClassImports() {
+ return classImports;
+ }
+
+ /**
+ * @param classImports the classImports to set
+ */
+ public void setClassImports(List<ClassImport> classImports) {
+ this.classImports = classImports;
+ }
}
Modified: trunk/cdk/generator/src/main/java/org/richfaces/cdk/templatecompiler/model/ModelFragment.java
===================================================================
--- trunk/cdk/generator/src/main/java/org/richfaces/cdk/templatecompiler/model/ModelFragment.java 2010-10-22 16:54:29 UTC (rev 19656)
+++ trunk/cdk/generator/src/main/java/org/richfaces/cdk/templatecompiler/model/ModelFragment.java 2010-10-24 19:11:47 UTC (rev 19657)
@@ -19,7 +19,8 @@
*/
@XmlSeeAlso( { CdkCallElement.class, CdkBodyElement.class, CdkIfElement.class, CdkObjectElement.class,
CdkChooseElement.class, CdkWhenElement.class, CdkOtherwiseElement.class, CdkForEachElement.class,
- CdkSwitchElement.class, CdkCaseElement.class, CdkDefaultElement.class })
+ CdkSwitchElement.class, CdkCaseElement.class, CdkDefaultElement.class,
+ CdkScriptObjectElement.class, CdkScriptOptionElement.class })
public class ModelFragment implements LeafModelElement {
private List<Object> children = Lists.newArrayList();
Modified: trunk/cdk/generator/src/main/java/org/richfaces/cdk/templatecompiler/model/TemplateVisitor.java
===================================================================
--- trunk/cdk/generator/src/main/java/org/richfaces/cdk/templatecompiler/model/TemplateVisitor.java 2010-10-22 16:54:29 UTC (rev 19656)
+++ trunk/cdk/generator/src/main/java/org/richfaces/cdk/templatecompiler/model/TemplateVisitor.java 2010-10-24 19:11:47 UTC (rev 19657)
@@ -82,4 +82,10 @@
void postProcess(CompositeImplementation compositeImplementation);
+ void startElement(CdkScriptObjectElement cdkScriptObjectElement);
+
+ void endElement(CdkScriptObjectElement cdkScriptObjectElement);
+
+ void visitElement(CdkScriptOptionElement cdkScriptOptionElement);
+
}
Added: trunk/cdk/generator/src/main/java/org/richfaces/cdk/templatecompiler/statements/AddAttributesToScriptHashStatement.java
===================================================================
--- trunk/cdk/generator/src/main/java/org/richfaces/cdk/templatecompiler/statements/AddAttributesToScriptHashStatement.java (rev 0)
+++ trunk/cdk/generator/src/main/java/org/richfaces/cdk/templatecompiler/statements/AddAttributesToScriptHashStatement.java 2010-10-24 19:11:47 UTC (rev 19657)
@@ -0,0 +1,142 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2009, Red Hat, Inc. and individual contributors
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.richfaces.cdk.templatecompiler.statements;
+
+import java.util.Collection;
+import java.util.NoSuchElementException;
+import java.util.concurrent.atomic.AtomicInteger;
+
+import javax.xml.namespace.QName;
+
+import org.richfaces.cdk.attributes.Attribute.Kind;
+import org.richfaces.cdk.generate.freemarker.FreeMarkerRenderer;
+import org.richfaces.cdk.model.EventName;
+import org.richfaces.cdk.model.Named.NamePredicate;
+import org.richfaces.cdk.model.PropertyBase;
+import org.richfaces.cdk.templatecompiler.TemplateModel;
+
+import com.google.common.collect.Iterables;
+import com.google.common.collect.Lists;
+import com.google.inject.Inject;
+
+/**
+ * @author Nick Belaevski
+ */
+public class AddAttributesToScriptHashStatement extends FreeMarkerTemplateStatementBase {
+
+ /**
+ *
+ */
+ private static final String ATTRIBUTES_FIELD_NAME = "ATTRIBUTES_FOR_SCRIPT_HASH";
+
+ private static AtomicInteger fieldCounter = new AtomicInteger(0);
+
+ private String fieldName;
+
+ private String wrapper;
+
+ private Collection<PassThrough> attributes = Lists.newArrayList();
+
+ private Collection<PropertyBase> componentAttributes;
+
+ @Inject
+ public AddAttributesToScriptHashStatement(@TemplateModel FreeMarkerRenderer renderer) {
+ super(renderer, "add-attributes-to-script-hash");
+ fieldName = ATTRIBUTES_FIELD_NAME + fieldCounter.getAndIncrement();
+ }
+
+ /**
+ * @return the fieldName
+ */
+ public String getFieldName() {
+ return fieldName;
+ }
+
+ /**
+ * <p class="changed_added_4_0"></p>
+ * @param fieldName the fieldName to set
+ */
+ public void setFieldName(String fieldName) {
+ this.fieldName = fieldName;
+ }
+
+ /**
+ * <p class="changed_added_4_0"></p>
+ * @return the attributes
+ */
+ public Collection<PassThrough> getAttributes() {
+ return this.attributes;
+ }
+
+ /**
+ * @return the wrapper
+ */
+ public String getWrapper() {
+ return wrapper;
+ }
+
+ /**
+ * @param wrapper the wrapper to set
+ */
+ public void setWrapper(String wrapper) {
+ this.wrapper = wrapper;
+ }
+
+ /**
+ * @param attributeNames
+ * @param attributes
+ */
+ public void setAttributes(Collection<String> attributeNames, Collection<PropertyBase> componentAttributes) {
+ this.componentAttributes = componentAttributes;
+
+ for (String attributeName : attributeNames) {
+ PassThrough passThrough = new PassThrough();
+ passThrough.name = QName.valueOf(attributeName);
+ passThrough.componentAttribute = attributeName;
+
+ try {
+ PropertyBase componentAttribute = findComponentAttribute(attributeName);
+ for (EventName event : componentAttribute.getEventNames()) {
+ passThrough.behaviors.add(event.getName());
+ }
+ passThrough.defaultValue = componentAttribute.getDefaultValue();
+ passThrough.type = componentAttribute.getType().getSimpleName();
+
+ } catch (NoSuchElementException e) {
+ passThrough.type = Object.class.getName();
+ }
+
+ if (Boolean.TYPE.equals(passThrough.type) || Boolean.class.equals(passThrough.type)) {
+ passThrough.kind = Kind.BOOLEAN;
+ } else {
+ passThrough.kind = Kind.GENERIC;
+ }
+
+ attributes.add(passThrough);
+ }
+ }
+ private PropertyBase findComponentAttribute(final String name)
+ throws NoSuchElementException {
+
+ return Iterables.find(componentAttributes, new NamePredicate(name));
+ }
+}
Modified: trunk/cdk/generator/src/main/java/org/richfaces/cdk/templatecompiler/statements/AttributesStatement.java
===================================================================
--- trunk/cdk/generator/src/main/java/org/richfaces/cdk/templatecompiler/statements/AttributesStatement.java 2010-10-22 16:54:29 UTC (rev 19656)
+++ trunk/cdk/generator/src/main/java/org/richfaces/cdk/templatecompiler/statements/AttributesStatement.java 2010-10-24 19:11:47 UTC (rev 19657)
@@ -15,13 +15,12 @@
import org.richfaces.cdk.attributes.Element;
import org.richfaces.cdk.attributes.Schema;
import org.richfaces.cdk.model.EventName;
+import org.richfaces.cdk.model.Named.NamePredicate;
import org.richfaces.cdk.model.PropertyBase;
import org.richfaces.cdk.templatecompiler.model.AnyElement;
import org.richfaces.cdk.templatecompiler.model.Template;
-import org.richfaces.cdk.templatecompiler.statements.WriteAttributesSetStatement.PassThrough;
import org.richfaces.cdk.util.Strings;
-import com.google.common.base.Predicate;
import com.google.common.base.Splitter;
import com.google.common.collect.Iterables;
import com.google.common.collect.Sets;
@@ -66,7 +65,7 @@
public void processAttributes(AnyElement element, Collection<PropertyBase> componentAttributes) {
this.componentAttributes = componentAttributes;
Set<String> processedAttributes = Sets.newHashSet();
- TreeSet<WriteAttributesSetStatement.PassThrough> passThroughAttributes = Sets.newTreeSet();
+ TreeSet<PassThrough> passThroughAttributes = Sets.newTreeSet();
this.elementName = element.getName();
processRegularAttributes(element, processedAttributes, passThroughAttributes);
String passThrough = element.getPassThrough();
@@ -81,7 +80,7 @@
}
private void processPassThroughWithExclusions(Set<String> processedAttributes,
- TreeSet<WriteAttributesSetStatement.PassThrough> passThroughAttributes, String passThroughWithExclusions) {
+ TreeSet<PassThrough> passThroughAttributes, String passThroughWithExclusions) {
if (null != passThroughWithExclusions) {
// cdk:passThroughWithExclusions="id,class,style"
Map<String, Element> elements = attributesSchema.getElements();
@@ -101,7 +100,7 @@
}
private void processPassThrough(Set<String> processedAttributes,
- TreeSet<WriteAttributesSetStatement.PassThrough> passThroughAttributes, String passThrough) {
+ TreeSet<PassThrough> passThroughAttributes, String passThrough) {
if (null != passThrough) {
// cdk:passThrough="class:styleClass,style , id:clientId"
Iterable<String> split = PASS_THGOUGH_SPLITTER.split(passThrough);
@@ -117,7 +116,7 @@
}
private void processRegularAttributes(AnyElement element, Set<String> processedAttributes,
- TreeSet<WriteAttributesSetStatement.PassThrough> passThroughAttributes) {
+ TreeSet<PassThrough> passThroughAttributes) {
for (Map.Entry<QName, Object> entry : element.getAttributes().entrySet()) {
QName qName = entry.getKey();
if (Template.CDK_NAMESPACE.equals(qName.getNamespaceURI())) {
@@ -174,13 +173,7 @@
private PropertyBase findComponentAttribute(final String name)
throws NoSuchElementException {
- return Iterables.find(componentAttributes, new Predicate<PropertyBase>() {
- @Override
- public boolean apply(PropertyBase input) {
- return name.equals(input.getName());
- }
- });
-
+ return Iterables.find(componentAttributes, new NamePredicate(name));
}
private WriteAttributeStatement setupAttributeStatement(QName qName, Object value, Attribute schemaAttribute) {
Modified: trunk/cdk/generator/src/main/java/org/richfaces/cdk/templatecompiler/statements/FreeMarkerTemplateStatementBase.java
===================================================================
--- trunk/cdk/generator/src/main/java/org/richfaces/cdk/templatecompiler/statements/FreeMarkerTemplateStatementBase.java 2010-10-22 16:54:29 UTC (rev 19656)
+++ trunk/cdk/generator/src/main/java/org/richfaces/cdk/templatecompiler/statements/FreeMarkerTemplateStatementBase.java 2010-10-24 19:11:47 UTC (rev 19657)
@@ -28,8 +28,8 @@
import org.richfaces.cdk.generate.freemarker.FreeMarkerRenderer;
import org.richfaces.cdk.templatecompiler.builder.model.JavaField;
import org.richfaces.cdk.templatecompiler.builder.model.JavaImport;
+import org.richfaces.cdk.templatecompiler.builder.model.JavaImportImpl;
import org.richfaces.cdk.templatecompiler.builder.model.JavaModifier;
-import org.richfaces.cdk.templatecompiler.builder.model.RuntimeImport;
import org.richfaces.cdk.templatecompiler.el.types.ReferencedType;
import org.richfaces.cdk.util.Strings;
@@ -121,7 +121,7 @@
}
public void addImport(String name) {
- imports.add(new RuntimeImport(name));
+ imports.add(new JavaImportImpl(name));
}
protected void addImports(Iterable<JavaImport> requiredImports) {
Modified: trunk/cdk/generator/src/main/java/org/richfaces/cdk/templatecompiler/statements/HelperMethod.java
===================================================================
--- trunk/cdk/generator/src/main/java/org/richfaces/cdk/templatecompiler/statements/HelperMethod.java 2010-10-22 16:54:29 UTC (rev 19656)
+++ trunk/cdk/generator/src/main/java/org/richfaces/cdk/templatecompiler/statements/HelperMethod.java 2010-10-24 19:11:47 UTC (rev 19657)
@@ -21,11 +21,20 @@
*/
package org.richfaces.cdk.templatecompiler.statements;
-import static org.richfaces.cdk.templatecompiler.el.ELNodeConstants.*;
+import static com.google.common.collect.Iterators.forArray;
+import static com.google.common.collect.Iterators.toArray;
+import static com.google.common.collect.Iterators.transform;
+import static org.richfaces.cdk.templatecompiler.el.ELNodeConstants.CONVERT_TO_BOOLEAN_FUNCTION;
+import static org.richfaces.cdk.templatecompiler.el.ELNodeConstants.CONVERT_TO_STRING_FUNCTION;
+import static org.richfaces.cdk.templatecompiler.el.ELNodeConstants.IS_EMPTY_FUNCTION;
+import static org.richfaces.cdk.templatecompiler.el.ELNodeConstants.IS_EQUAL_FUNCTION;
+import static org.richfaces.cdk.util.JavaUtils.CLASS_TO_CLASS_NAME;
import java.util.Collection;
import java.util.EnumMap;
import java.util.EnumSet;
+import java.util.Iterator;
+import java.util.Map;
import java.util.Set;
import javax.faces.component.UIComponent;
@@ -46,7 +55,14 @@
SHOULD_RENDER_ATTRIBUTE("shouldRenderAttribute", Boolean.TYPE, Object.class),
CREATE_ATTRIBUTES("attributes", "Attributes"),
RENDER_ATTRIBUTES_SET("renderPassThroughAttributes", Void.TYPE,FacesContext.class,UIComponent.class,Collection.class),
- RENDER_ATTRIBUTE("renderAttribute",Void.TYPE,FacesContext.class,String.class,Object.class);
+ RENDER_ATTRIBUTE("renderAttribute",Void.TYPE,FacesContext.class,String.class,Object.class),
+ ADD_TO_SCRIPT_HASH("addToScriptHash", Void.TYPE.getName(), Map.class.getName(), String.class.getName(),
+ Object.class.getName(), Object.class.getName(), "ScriptHashVariableWrapper"),
+ ADD_TO_SCRIPT_HASH_ATTRIBUTES("addToScriptHash", Void.TYPE.getName(), Map.class.getName(),
+ FacesContext.class.getName(), UIComponent.class.getName(),
+ "Attributes", "ScriptHashVariableWrapper"),
+ TO_SCRIPT_ARGS("toScriptArgs", String.class, Object[].class),
+ CONCAT("concat", String.class, String[].class);
public static final EnumMap<HelperMethod, String> METHOD_NAMES = Maps.newEnumMap(HelperMethod.class);
@@ -56,7 +72,7 @@
private final String returnType;
- private final Class<?>[] argumentTypes;
+ private final String[] argumentTypes;
static {
for (HelperMethod method : HelperMethod.values()) {
@@ -64,14 +80,19 @@
}
}
- private HelperMethod(String name, String returnType, Class<?>... argumentTypes) {
+ private static String[] transformClassesToClassNames(Class<?>[] s) {
+ Iterator<String> transformed = transform(forArray(s), CLASS_TO_CLASS_NAME);
+ return toArray(transformed, String.class);
+ }
+
+ private HelperMethod(String name, String returnType, String... argumentTypes) {
this.name = name;
this.returnType = returnType;
this.argumentTypes = argumentTypes;
}
private HelperMethod(String name, Class<?> returnType, Class<?>... argumentTypes) {
- this(name,returnType.getName(),argumentTypes);
+ this(name, CLASS_TO_CLASS_NAME.apply(returnType), transformClassesToClassNames(argumentTypes));
}
public String getName() {
@@ -82,7 +103,7 @@
return returnType;
}
- public Class<?>[] getArgumentTypes() {
+ public String[] getArgumentTypes() {
return argumentTypes;
}
Modified: trunk/cdk/generator/src/main/java/org/richfaces/cdk/templatecompiler/statements/HelperMethodFactoryImpl.java
===================================================================
--- trunk/cdk/generator/src/main/java/org/richfaces/cdk/templatecompiler/statements/HelperMethodFactoryImpl.java 2010-10-22 16:54:29 UTC (rev 19656)
+++ trunk/cdk/generator/src/main/java/org/richfaces/cdk/templatecompiler/statements/HelperMethodFactoryImpl.java 2010-10-24 19:11:47 UTC (rev 19657)
@@ -91,6 +91,10 @@
arguments.add(new Argument("attributes",typesFactory.getType("Attributes")));
renderAttributes.getExceptions().add(typesFactory.getType(IOException.class));
buildHelperMethod(HelperMethod.CREATE_ATTRIBUTES, true, "create-attributes");
+ buildHelperMethod(HelperMethod.ADD_TO_SCRIPT_HASH, true, null);
+ buildHelperMethod(HelperMethod.ADD_TO_SCRIPT_HASH_ATTRIBUTES, true, null);
+ buildHelperMethod(HelperMethod.TO_SCRIPT_ARGS, true, null);
+ buildHelperMethod(HelperMethod.CONCAT, true, null);
}
private JavaMethod buildHelperMethod(HelperMethod helperMethod, boolean utilsMethod, String templateName,
@@ -99,7 +103,7 @@
if (utilsMethod && !RendererUtilsMethod.BUILT_IN.equals(rendererUtilsClass)) {
helperJavaMethod = new RendererUtilsMethod(helperMethod, rendererUtilsClass);
} else {
- Class<?>[] argumentTypes = helperMethod.getArgumentTypes();
+ String[] argumentTypes = helperMethod.getArgumentTypes();
Argument[] arguments = new Argument[argumentNames.length];
for (int i = 0; i < argumentNames.length; i++) {
arguments[i] = new Argument(argumentNames[i], typesFactory.getType(argumentTypes[i]));
Added: trunk/cdk/generator/src/main/java/org/richfaces/cdk/templatecompiler/statements/PassThrough.java
===================================================================
--- trunk/cdk/generator/src/main/java/org/richfaces/cdk/templatecompiler/statements/PassThrough.java (rev 0)
+++ trunk/cdk/generator/src/main/java/org/richfaces/cdk/templatecompiler/statements/PassThrough.java 2010-10-24 19:11:47 UTC (rev 19657)
@@ -0,0 +1,78 @@
+package org.richfaces.cdk.templatecompiler.statements;
+
+import java.util.Set;
+
+import javax.xml.namespace.QName;
+
+import org.richfaces.cdk.attributes.Attribute.Kind;
+
+import com.google.common.collect.Sets;
+
+/**
+ * <p class="changed_added_4_0">object contains information about attribute</p>
+ * @author asmirnov(a)exadel.com
+ *
+ */
+public final class PassThrough implements Comparable<PassThrough> {
+ QName name;
+ Kind kind = Kind.GENERIC;
+ String componentAttribute;
+ String type;
+ Object defaultValue;
+ Set<String> behaviors = Sets.newHashSet();
+
+ /**
+ * <p class="changed_added_4_0"></p>
+ * @return the name
+ */
+ public QName getName() {
+ return this.name;
+ }
+ /**
+ * <p class="changed_added_4_0"></p>
+ * @return the kind
+ */
+ public Kind getKind() {
+ return this.kind;
+ }
+ /**
+ * <p class="changed_added_4_0"></p>
+ * @return the componentAttribute
+ */
+ public String getComponentAttribute() {
+ return this.componentAttribute;
+ }
+ /**
+ * <p class="changed_added_4_0"></p>
+ * @return the type
+ */
+ public String getType() {
+ return this.type;
+ }
+ /**
+ * <p class="changed_added_4_0"></p>
+ * @return the defaultValue
+ */
+ public Object getDefaultValue() {
+ return this.defaultValue;
+ }
+ /**
+ * <p class="changed_added_4_0"></p>
+ * @return the behaviors
+ */
+ public Set<String> getBehaviors() {
+ return this.behaviors;
+ }
+ public String getBuilderMethod() {
+ if(Kind.BOOLEAN.equals(kind)){
+ return "bool";
+ } else {
+ return kind.toString().toLowerCase();
+ }
+ }
+ @Override
+
+ public int compareTo(PassThrough o) {
+ return name.toString().compareTo(o.name.toString());
+ }
+}
\ No newline at end of file
Modified: trunk/cdk/generator/src/main/java/org/richfaces/cdk/templatecompiler/statements/RendererUtilsMethod.java
===================================================================
--- trunk/cdk/generator/src/main/java/org/richfaces/cdk/templatecompiler/statements/RendererUtilsMethod.java 2010-10-22 16:54:29 UTC (rev 19656)
+++ trunk/cdk/generator/src/main/java/org/richfaces/cdk/templatecompiler/statements/RendererUtilsMethod.java 2010-10-24 19:11:47 UTC (rev 19657)
@@ -26,8 +26,8 @@
import java.util.TreeSet;
import org.richfaces.cdk.templatecompiler.builder.model.JavaImport;
+import org.richfaces.cdk.templatecompiler.builder.model.JavaImportImpl;
import org.richfaces.cdk.templatecompiler.builder.model.JavaMethod;
-import org.richfaces.cdk.templatecompiler.builder.model.RuntimeImport;
import com.google.common.collect.Iterables;
import com.google.common.collect.Sets;
@@ -45,9 +45,10 @@
public RendererUtilsMethod(HelperMethod helper,String rendererUtilsClassName) {
super(helper.getName());
- this.runtimeImport.add(new RuntimeImport("static " +rendererUtilsClassName+".*"));
- this.runtimeImport.add(new RuntimeImport(rendererUtilsClassName));
- this.runtimeImport.add(new RuntimeImport(rendererUtilsClassName+".Attributes"));
+ this.runtimeImport.add(new JavaImportImpl(rendererUtilsClassName + ".*", true));
+ this.runtimeImport.add(new JavaImportImpl(rendererUtilsClassName));
+ this.runtimeImport.add(new JavaImportImpl(rendererUtilsClassName+".Attributes"));
+ this.runtimeImport.add(new JavaImportImpl(rendererUtilsClassName+".ScriptHashVariableWrapper"));
}
@Override
Added: trunk/cdk/generator/src/main/java/org/richfaces/cdk/templatecompiler/statements/ScriptObjectStatement.java
===================================================================
--- trunk/cdk/generator/src/main/java/org/richfaces/cdk/templatecompiler/statements/ScriptObjectStatement.java (rev 0)
+++ trunk/cdk/generator/src/main/java/org/richfaces/cdk/templatecompiler/statements/ScriptObjectStatement.java 2010-10-24 19:11:47 UTC (rev 19657)
@@ -0,0 +1,131 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2010, Red Hat, Inc. and individual contributors
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.richfaces.cdk.templatecompiler.statements;
+
+import static org.richfaces.cdk.templatecompiler.builder.model.RequireImports.IMPORTS_TRANSFORM;
+import static org.richfaces.cdk.templatecompiler.statements.TemplateStatement.FIELDS_TRANSFORM;
+
+import org.richfaces.cdk.Logger;
+import org.richfaces.cdk.generate.freemarker.FreeMarkerRenderer;
+import org.richfaces.cdk.templatecompiler.ELParser;
+import org.richfaces.cdk.templatecompiler.TemplateModel;
+import org.richfaces.cdk.templatecompiler.builder.model.JavaField;
+import org.richfaces.cdk.templatecompiler.builder.model.JavaImport;
+import org.richfaces.cdk.templatecompiler.el.ParsingException;
+import org.richfaces.cdk.templatecompiler.el.types.ELType;
+import org.richfaces.cdk.templatecompiler.el.types.TypesFactory;
+
+import com.google.common.base.Strings;
+import com.google.common.collect.Iterables;
+import com.google.inject.Inject;
+
+
+/**
+ * @author Nick Belaevski
+ *
+ */
+//TODO - configure initial map size
+public class ScriptObjectStatement extends FreeMarkerTemplateStatementBase {
+
+ private String name;
+
+ private ELParser parser;
+
+ private TypedTemplateStatement base;
+
+ private Logger logger;
+
+ private TypesFactory typesFactory;
+
+ private ELType mapType;
+
+ private ELType mapImplementationType;
+
+ @Inject
+ public ScriptObjectStatement(@TemplateModel FreeMarkerRenderer renderer, ELParser parser, Logger logger,
+ TypesFactory typesFactory) {
+
+ super(renderer, "script-object");
+
+ this.parser = parser;
+ this.logger = logger;
+ this.typesFactory = typesFactory;
+ }
+
+ /**
+ * @return the keyExpression
+ */
+ public TemplateStatement getBaseExpression() {
+ return base;
+ }
+
+ /**
+ * @return the name
+ */
+ public String getName() {
+ return name;
+ }
+
+ public ELType getType() {
+ return mapType;
+ }
+
+ public ELType getImplementationType() {
+ return mapImplementationType;
+ }
+
+ public void setObject(String name, String baseExpression) {
+ this.mapType = typesFactory.getType("Map<String, Object>");
+ this.mapImplementationType = typesFactory.getType("LinkedHashMap<String, Object>");
+ this.name = name;
+
+ if (!Strings.isNullOrEmpty(baseExpression)) {
+ try {
+ this.base = parser.parse(baseExpression, this, getType());
+ base.setParent(this);
+ } catch (ParsingException e) {
+ logger.error("Error parse scriptObject statement expression", e);
+ }
+ }
+
+ setVariable(name, getType());
+ }
+
+ @Override
+ public Iterable<JavaImport> getRequiredImports() {
+ return Iterables.concat(super.getRequiredImports(), mapImplementationType.getRequiredImports(),
+ mapType.getRequiredImports(),
+ IMPORTS_TRANSFORM.apply(base));
+ }
+
+ @Override
+ public Iterable<HelperMethod> getRequiredMethods() {
+ return Iterables.concat(super.getRequiredMethods(),
+ METHODS_TRANSFORM.apply(base));
+ }
+
+ @Override
+ public Iterable<JavaField> getRequiredFields() {
+ return Iterables.concat(super.getRequiredFields(),
+ FIELDS_TRANSFORM.apply(base));
+ }
+}
Added: trunk/cdk/generator/src/main/java/org/richfaces/cdk/templatecompiler/statements/ScriptOptionStatement.java
===================================================================
--- trunk/cdk/generator/src/main/java/org/richfaces/cdk/templatecompiler/statements/ScriptOptionStatement.java (rev 0)
+++ trunk/cdk/generator/src/main/java/org/richfaces/cdk/templatecompiler/statements/ScriptOptionStatement.java 2010-10-24 19:11:47 UTC (rev 19657)
@@ -0,0 +1,147 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2010, Red Hat, Inc. and individual contributors
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.richfaces.cdk.templatecompiler.statements;
+
+import static org.richfaces.cdk.templatecompiler.builder.model.RequireImports.IMPORTS_TRANSFORM;
+import static org.richfaces.cdk.templatecompiler.statements.TemplateStatement.FIELDS_TRANSFORM;
+
+import java.util.Collections;
+import java.util.List;
+
+import org.richfaces.cdk.Logger;
+import org.richfaces.cdk.generate.freemarker.FreeMarkerRenderer;
+import org.richfaces.cdk.templatecompiler.ELParser;
+import org.richfaces.cdk.templatecompiler.TemplateModel;
+import org.richfaces.cdk.templatecompiler.builder.model.JavaField;
+import org.richfaces.cdk.templatecompiler.builder.model.JavaImport;
+import org.richfaces.cdk.templatecompiler.el.ParsingException;
+import org.richfaces.cdk.templatecompiler.el.types.TypesFactory;
+
+import com.google.common.collect.Iterables;
+import com.google.inject.Inject;
+/**
+ * @author Nick Belaevski
+ *
+ */
+public class ScriptOptionStatement extends FreeMarkerTemplateStatementBase {
+
+ private String name;
+
+ private String defaultValue;
+
+ private TypedTemplateStatement value;
+
+ private String wrapper;
+
+ private ELParser parser;
+
+ private Logger logger;
+
+ @Inject
+ public ScriptOptionStatement(@TemplateModel FreeMarkerRenderer renderer, ELParser parser, Logger logger) {
+ super(renderer, "script-option");
+
+ this.parser = parser;
+ this.logger = logger;
+ }
+
+ /**
+ * @param defaultValue the defaultValue to set
+ */
+ public void setDefaultValue(String defaultValue) {
+ this.defaultValue = defaultValue;
+ }
+
+ /**
+ * @param name the name to set
+ */
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ /**
+ * @param value the value to set
+ */
+ public void setValueExpression(String valueExpression) {
+ try {
+ this.value = parser.parse(valueExpression, this, TypesFactory.OBJECT_TYPE);
+ } catch (ParsingException e) {
+ logger.error("Error parse scriptOption value expression: " + valueExpression, e);
+ }
+ }
+
+ /**
+ * @param wrapper the wrapper to set
+ */
+ public void setWrapper(String wrapper) {
+ this.wrapper = wrapper;
+ }
+
+ @Override
+ public List<TemplateStatement> getStatements() {
+ return value != null ? Collections.<TemplateStatement>singletonList(value) :
+ Collections.<TemplateStatement>emptyList();
+ }
+
+ /**
+ * @return the name
+ */
+ public String getName() {
+ return name;
+ }
+
+ /**
+ * @return the value
+ */
+ public TypedTemplateStatement getValue() {
+ return value;
+ }
+
+ /**
+ * @return the defaultValue
+ */
+ public String getDefaultValue() {
+ return defaultValue;
+ }
+
+ /**
+ * @return the wrapper
+ */
+ public String getWrapper() {
+ return wrapper;
+ }
+
+ @Override
+ public Iterable<JavaField> getRequiredFields() {
+ return Iterables.concat(super.getRequiredFields(), FIELDS_TRANSFORM.apply(value));
+ }
+
+ @Override
+ public Iterable<JavaImport> getRequiredImports() {
+ return Iterables.concat(super.getRequiredImports(), IMPORTS_TRANSFORM.apply(value));
+ }
+
+ @Override
+ public Iterable<HelperMethod> getRequiredMethods() {
+ return Iterables.concat(super.getRequiredMethods(), METHODS_TRANSFORM.apply(value));
+ }
+}
Modified: trunk/cdk/generator/src/main/java/org/richfaces/cdk/templatecompiler/statements/TemplateStatement.java
===================================================================
--- trunk/cdk/generator/src/main/java/org/richfaces/cdk/templatecompiler/statements/TemplateStatement.java 2010-10-22 16:54:29 UTC (rev 19656)
+++ trunk/cdk/generator/src/main/java/org/richfaces/cdk/templatecompiler/statements/TemplateStatement.java 2010-10-24 19:11:47 UTC (rev 19657)
@@ -3,17 +3,40 @@
*/
package org.richfaces.cdk.templatecompiler.statements;
+import java.util.Collections;
+
import org.richfaces.cdk.templatecompiler.builder.model.JavaField;
import org.richfaces.cdk.templatecompiler.builder.model.JavaStatement;
import org.richfaces.cdk.templatecompiler.builder.model.RequireImports;
+import com.google.common.base.Function;
+
/**
* @author asmirnov
*
*/
public interface TemplateStatement extends JavaStatement, RequireImports {
+ public static final Function<TemplateStatement, Iterable<JavaField>> FIELDS_TRANSFORM = new Function<TemplateStatement, Iterable<JavaField>>() {
+ public Iterable<JavaField> apply(TemplateStatement from) {
+ if (from == null) {
+ return Collections.emptyList();
+ }
+
+ return from.getRequiredFields();
+ };
+ };
+ public static final Function<TemplateStatement, Iterable<HelperMethod>> METHODS_TRANSFORM = new Function<TemplateStatement, Iterable<HelperMethod>>() {
+ public Iterable<HelperMethod> apply(TemplateStatement from) {
+ if (from == null) {
+ return Collections.emptyList();
+ }
+
+ return from.getRequiredMethods();
+ };
+ };
+
Iterable<JavaField> getRequiredFields();
Iterable<HelperMethod> getRequiredMethods();
Modified: trunk/cdk/generator/src/main/java/org/richfaces/cdk/templatecompiler/statements/WriteAttributesSetStatement.java
===================================================================
--- trunk/cdk/generator/src/main/java/org/richfaces/cdk/templatecompiler/statements/WriteAttributesSetStatement.java 2010-10-22 16:54:29 UTC (rev 19656)
+++ trunk/cdk/generator/src/main/java/org/richfaces/cdk/templatecompiler/statements/WriteAttributesSetStatement.java 2010-10-24 19:11:47 UTC (rev 19657)
@@ -22,17 +22,12 @@
package org.richfaces.cdk.templatecompiler.statements;
import java.util.Collection;
-import java.util.Set;
import java.util.concurrent.atomic.AtomicInteger;
-import javax.xml.namespace.QName;
-
-import org.richfaces.cdk.attributes.Attribute.Kind;
import org.richfaces.cdk.generate.freemarker.FreeMarkerRenderer;
import org.richfaces.cdk.templatecompiler.TemplateModel;
import com.google.inject.Inject;
-import com.google.inject.internal.Sets;
/**
* @author Nick Belaevski
@@ -40,75 +35,6 @@
public class WriteAttributesSetStatement extends FreeMarkerTemplateStatementBase {
/**
- * <p class="changed_added_4_0">object contains information about attribute</p>
- * @author asmirnov(a)exadel.com
- *
- */
- public static final class PassThrough implements Comparable<PassThrough> {
- QName name;
- Kind kind = Kind.GENERIC;
- String componentAttribute;
- String type;
- Object defaultValue;
- Set<String> behaviors = Sets.newHashSet();
-
- /**
- * <p class="changed_added_4_0"></p>
- * @return the name
- */
- public QName getName() {
- return this.name;
- }
- /**
- * <p class="changed_added_4_0"></p>
- * @return the kind
- */
- public Kind getKind() {
- return this.kind;
- }
- /**
- * <p class="changed_added_4_0"></p>
- * @return the componentAttribute
- */
- public String getComponentAttribute() {
- return this.componentAttribute;
- }
- /**
- * <p class="changed_added_4_0"></p>
- * @return the type
- */
- public String getType() {
- return this.type;
- }
- /**
- * <p class="changed_added_4_0"></p>
- * @return the defaultValue
- */
- public Object getDefaultValue() {
- return this.defaultValue;
- }
- /**
- * <p class="changed_added_4_0"></p>
- * @return the behaviors
- */
- public Set<String> getBehaviors() {
- return this.behaviors;
- }
- public String getBuilderMethod() {
- if(Kind.BOOLEAN.equals(kind)){
- return "bool";
- } else {
- return kind.toString().toLowerCase();
- }
- }
- @Override
-
- public int compareTo(PassThrough o) {
- return name.toString().compareTo(o.name.toString());
- }
- }
-
- /**
*
*/
private static final String PASS_THROUGH_ATTRIBUTES_FIELD_NAME = "PASS_THROUGH_ATTRIBUTES";
Modified: trunk/cdk/generator/src/main/java/org/richfaces/cdk/util/JavaUtils.java
===================================================================
--- trunk/cdk/generator/src/main/java/org/richfaces/cdk/util/JavaUtils.java 2010-10-22 16:54:29 UTC (rev 19656)
+++ trunk/cdk/generator/src/main/java/org/richfaces/cdk/util/JavaUtils.java 2010-10-24 19:11:47 UTC (rev 19657)
@@ -31,6 +31,7 @@
import org.richfaces.cdk.CdkException;
import org.richfaces.cdk.xmlconfig.JAXBBinding;
+import com.google.common.base.Function;
import com.google.common.collect.ImmutableMap;
/**
@@ -43,6 +44,12 @@
Character.class).put(Byte.TYPE, Byte.class).put(Short.TYPE, Short.class).put(Integer.TYPE, Integer.class)
.put(Long.TYPE, Long.class).put(Float.TYPE, Float.class).put(Double.TYPE, Double.class).build();
+ public static final Function<Class<?>, String> CLASS_TO_CLASS_NAME = new Function<Class<?>, String>() {
+ public String apply(java.lang.Class<?> from) {
+ return from.getName();
+ }
+ };
+
private JavaUtils() {
// private constructor
}
Modified: trunk/cdk/generator/src/main/java/org/richfaces/cdk/util/Strings.java
===================================================================
--- trunk/cdk/generator/src/main/java/org/richfaces/cdk/util/Strings.java 2010-10-22 16:54:29 UTC (rev 19656)
+++ trunk/cdk/generator/src/main/java/org/richfaces/cdk/util/Strings.java 2010-10-24 19:11:47 UTC (rev 19657)
@@ -23,12 +23,20 @@
package org.richfaces.cdk.util;
+import java.util.NoSuchElementException;
+
+import com.google.common.base.Joiner;
+
+
/**
* <p class="changed_added_4_0">String manipulation utils.</p>
*
* @author asmirnov(a)exadel.com
*/
public final class Strings {
+
+ public static final Joiner DOT_JOINER = Joiner.on('.');
+
private Strings() {
// this is utility class with static methods only.
@@ -88,4 +96,14 @@
public static boolean isEmpty(String type) {
return type == null || type.length() == 0;
}
+
+ public static String firstNonEmpty(String... strings) {
+ for (String s : strings) {
+ if (!isEmpty(s)) {
+ return s;
+ }
+ }
+
+ throw new NoSuchElementException();
+ }
}
Modified: trunk/cdk/generator/src/main/resources/META-INF/schema/cdk-template.xsd
===================================================================
--- trunk/cdk/generator/src/main/resources/META-INF/schema/cdk-template.xsd 2010-10-22 16:54:29 UTC (rev 19656)
+++ trunk/cdk/generator/src/main/resources/META-INF/schema/cdk-template.xsd 2010-10-24 19:11:47 UTC (rev 19657)
@@ -582,4 +582,39 @@
<xs:attribute name="key" use="required" form="unqualified" type="c:elStrictExpression" />
</xs:complexType>
</xs:element>
+
+ <xs:element name="import">
+ <xs:complexType>
+ <xs:attribute type="xs:string" use="required" name="package" />
+ <xs:attribute type="xs:NMTOKENS" name="names" />
+ <xs:attribute type="xs:boolean" name="static" />
+ </xs:complexType>
+ </xs:element>
+
+ <xs:element name="scriptObject">
+ <xs:complexType>
+ <xs:attribute type="xs:string" name="name" use="required" />
+ <xs:attribute type="c:elStrictExpression" name="base" />
+ </xs:complexType>
+ </xs:element>
+
+ <xs:element name="scriptOption">
+ <xs:complexType>
+ <xs:attribute type="xs:NMTOKENS" name="attributes" />
+ <xs:attribute type="xs:NMTOKENS" name="variables" />
+ <xs:attribute type="xs:string" name="name" />
+ <xs:attribute type="c:elFreeformExpression" name="value" />
+ <xs:attribute type="c:literalExpression" name="defaultValue" />
+ <xs:attribute name="wrapper">
+ <xs:simpleType>
+ <xs:restriction base="xs:string">
+ <xs:enumeration value="noop" />
+ <xs:enumeration value="asArray" />
+ <xs:enumeration value="eventHandler" />
+ </xs:restriction>
+ </xs:simpleType>
+ </xs:attribute>
+ </xs:complexType>
+ </xs:element>
+
</xs:schema>
Added: trunk/cdk/generator/src/main/resources/META-INF/templates/java/add-attributes-to-script-hash.ftl
===================================================================
--- trunk/cdk/generator/src/main/resources/META-INF/templates/java/add-attributes-to-script-hash.ftl (rev 0)
+++ trunk/cdk/generator/src/main/resources/META-INF/templates/java/add-attributes-to-script-hash.ftl 2010-10-24 19:11:47 UTC (rev 19657)
@@ -0,0 +1,5 @@
+<@util.require "ADD_TO_SCRIPT_HASH_ATTRIBUTES"/>
+
+<@util.attributesField "${fieldName}" attributes />
+
+${ADD_TO_SCRIPT_HASH_ATTRIBUTES}(${parent.name}, ${facesContextVariable}, ${componentVariable}, ${fieldName}, <#if wrapper?exists>${wrapper}<#else>null</#if>);
\ No newline at end of file
Modified: trunk/cdk/generator/src/main/resources/META-INF/templates/java/class.ftl
===================================================================
--- trunk/cdk/generator/src/main/resources/META-INF/templates/java/class.ftl 2010-10-22 16:54:29 UTC (rev 19656)
+++ trunk/cdk/generator/src/main/resources/META-INF/templates/java/class.ftl 2010-10-24 19:11:47 UTC (rev 19657)
@@ -1,7 +1,7 @@
package ${package.name};
<#list imports as import><#if !import.default >
-import ${import.name};
+import<#if import.static> static</#if> ${import.name};
</#if></#list>
<@renderCommonJavaElementStuff element=.data_model />class ${simpleName} <#if superClass.name != 'java.lang.Object'>extends ${superClass.simpleName} </#if>{
Added: trunk/cdk/generator/src/main/resources/META-INF/templates/java/script-object.ftl
===================================================================
--- trunk/cdk/generator/src/main/resources/META-INF/templates/java/script-object.ftl (rev 0)
+++ trunk/cdk/generator/src/main/resources/META-INF/templates/java/script-object.ftl 2010-10-24 19:11:47 UTC (rev 19657)
@@ -0,0 +1,4 @@
+${type} ${name} = new ${implementationType}(<#if base?exists>${base}</#if>);
+<#list statements as subStatement>
+${subStatement.code}
+</#list>
\ No newline at end of file
Added: trunk/cdk/generator/src/main/resources/META-INF/templates/java/script-option.ftl
===================================================================
--- trunk/cdk/generator/src/main/resources/META-INF/templates/java/script-option.ftl (rev 0)
+++ trunk/cdk/generator/src/main/resources/META-INF/templates/java/script-option.ftl 2010-10-24 19:11:47 UTC (rev 19657)
@@ -0,0 +1,2 @@
+<@util.require "ADD_TO_SCRIPT_HASH" />
+${ADD_TO_SCRIPT_HASH}(${parent.name}, "${name}", ${value}, <#if defaultValue?exists>${defaultValue}<#else>null</#if>, <#if wrapper?exists>ScriptHashVariableWrapper.${wrapper}<#else>null</#if>);
Modified: trunk/cdk/generator/src/main/resources/META-INF/templates/java/util.ftl
===================================================================
--- trunk/cdk/generator/src/main/resources/META-INF/templates/java/util.ftl 2010-10-22 16:54:29 UTC (rev 19656)
+++ trunk/cdk/generator/src/main/resources/META-INF/templates/java/util.ftl 2010-10-24 19:11:47 UTC (rev 19657)
@@ -3,3 +3,10 @@
<#macro import name>${addImport(name)}</#macro>
<#macro concat seq delimiter=","><#list seq as item><#nested item/><#if item_has_next>${delimiter}</#if></#list></#macro>
+<#macro attributesField fieldName attributes>
+ <@require "CREATE_ATTRIBUTES"/>
+ <@constant "Attributes" "${fieldName}">${CREATE_ATTRIBUTES}()<#list attributes as attribute>
+ .${attribute.builderMethod}("${attribute.name}","${attribute.componentAttribute}"<#list attribute.behaviors as behavior>,"${behavior}"</#list>)
+ <#if attribute.defaultValue?exists >.defaultValue("${attribute.defaultValue}")</#if>
+ </#list></@constant>
+</#macro>
Modified: trunk/cdk/generator/src/main/resources/META-INF/templates/java/write-attributes-set.ftl
===================================================================
--- trunk/cdk/generator/src/main/resources/META-INF/templates/java/write-attributes-set.ftl 2010-10-22 16:54:29 UTC (rev 19656)
+++ trunk/cdk/generator/src/main/resources/META-INF/templates/java/write-attributes-set.ftl 2010-10-24 19:11:47 UTC (rev 19657)
@@ -1,7 +1,6 @@
-<@util.require "RENDER_ATTRIBUTES_SET"/><@util.require "CREATE_ATTRIBUTES"/>
-<@util.constant "Attributes" "${fieldName}">${CREATE_ATTRIBUTES}()<#list attributes as attribute>
- .${attribute.builderMethod}("${attribute.name}","${attribute.componentAttribute}"<#list attribute.behaviors as behavior>,"${behavior}"</#list>)
- <#if attribute.defaultValue?exists >.defaultValue("${attribute.defaultValue}")</#if>
-</#list></(a)util.constant>
+<@util.require "RENDER_ATTRIBUTES_SET"/>
+
+<@util.attributesField "${fieldName}" attributes />
+
${RENDER_ATTRIBUTES_SET}(${facesContextVariable}, ${componentVariable},
${fieldName});
\ No newline at end of file
Modified: trunk/cdk/generator/src/test/java/org/richfaces/cdk/templatecompiler/model/TemplateParserTest.java
===================================================================
--- trunk/cdk/generator/src/test/java/org/richfaces/cdk/templatecompiler/model/TemplateParserTest.java 2010-10-22 16:54:29 UTC (rev 19656)
+++ trunk/cdk/generator/src/test/java/org/richfaces/cdk/templatecompiler/model/TemplateParserTest.java 2010-10-24 19:11:47 UTC (rev 19657)
@@ -23,8 +23,14 @@
package org.richfaces.cdk.templatecompiler.model;
-import static org.junit.Assert.*;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertNull;
+import static org.junit.Assert.assertTrue;
+import java.util.Arrays;
+import java.util.Iterator;
import java.util.List;
import org.junit.Test;
@@ -32,6 +38,8 @@
import org.richfaces.cdk.model.FacesId;
import org.richfaces.cdk.xmlconfig.JaxbTestBase;
+import com.google.common.collect.Iterables;
+
/**
* <p class="changed_added_4_0">
* </p>
@@ -230,7 +238,11 @@
+ "<cdk:component-family>org.richfaces.TreeFamily</cdk:component-family>"
+ "<cdk:renderer-type>org.richfaces.TreeRenderer</cdk:renderer-type>"
+ "<cdk:renderkit-id>RF4_XHTML</cdk:renderkit-id>"
- + "<cdk:renders-children>false</cdk:renders-children>" + TEMPLATE_MIDDLE + TEMPLATE_EPILOG);
+ + "<cdk:renders-children>false</cdk:renders-children>"
+ + "<cdk:import package=\"com.foo\" names=\"Bar Fooz\" />"
+ + "<cdk:import package=\"net.foo\" names=\"Field\" static=\"true\" />"
+ + "<cdk:import package=\"org.foo\" names=\"*\" />"
+ + TEMPLATE_MIDDLE + TEMPLATE_EPILOG);
CompositeInterface interfaceSection = template.getInterface();
assertNotNull(interfaceSection);
@@ -242,6 +254,28 @@
assertEquals("RF4_XHTML", interfaceSection.getRenderKitId());
assertEquals(Boolean.FALSE, interfaceSection.getRendersChildren());
+ List<ClassImport> classImports = interfaceSection.getClassImports();
+
+ ClassImport importElement;
+
+ Iterator<ClassImport> children = classImports.iterator();
+
+ importElement = children.next();
+ assertEquals("com.foo", importElement.getPackage());
+ assertEquals(Arrays.asList("Bar", "Fooz"), importElement.getNames());
+ assertFalse(importElement.isStatic());
+
+ importElement = children.next();
+ assertEquals("net.foo", importElement.getPackage());
+ assertEquals(Arrays.asList("Field"), importElement.getNames());
+ assertTrue(importElement.isStatic());
+
+ importElement = children.next();
+ assertEquals("org.foo", importElement.getPackage());
+ assertEquals(Arrays.asList("*"), importElement.getNames());
+ assertFalse(importElement.isStatic());
+
+ assertFalse(children.hasNext());
}
@Test
@@ -397,4 +431,51 @@
assertNotNull(template.getInterface());
assertNotNull(template.getImplementation());
}
+
+ @Test
+ public void testScriptObject() throws Exception {
+ Template template =
+ unmarshal(Template.class, TEMPLATE_PROLOG + TEMPLATE_MIDDLE
+ + "<cdk:scriptObject name=\"hash\" base=\"#{getBaseOptions(context)}\">"
+ + "<cdk:scriptOption name=\"name\" value=\"#{value}\" />"
+ + "<cdk:scriptOption name=\"delay\" value=\"#{delay}\" defaultValue=\"100\" />"
+ + "<cdk:scriptOption name=\"rowClasses\" value=\"#{rowClasses}\" wrapper=\"asArray\" />"
+ + "<cdk:scriptOption attributes=\"min max\" />"
+ + "<cdk:scriptOption variables=\"allowHeader allowFooter\" />"
+ + "</cdk:scriptObject>" +
+
+ TEMPLATE_EPILOG);
+
+ CompositeImplementation implementation = template.getImplementation();
+ assertNotNull(implementation);
+
+ CdkScriptObjectElement scriptObject = (CdkScriptObjectElement) Iterables.getOnlyElement(implementation.getChildren());
+ assertEquals("hash", scriptObject.getName());
+ assertEquals("#{getBaseOptions(context)}", scriptObject.getBase());
+
+ CdkScriptOptionElement scriptOption;
+ Iterator<Object> children = scriptObject.getChildren().iterator();
+
+ scriptOption = (CdkScriptOptionElement) children.next();
+ assertEquals("name", scriptOption.getName());
+ assertEquals("#{value}", scriptOption.getValue());
+
+ scriptOption = (CdkScriptOptionElement) children.next();
+ assertEquals("delay", scriptOption.getName());
+ assertEquals("#{delay}", scriptOption.getValue());
+ assertEquals("100", scriptOption.getDefaultValue());
+
+ scriptOption = (CdkScriptOptionElement) children.next();
+ assertEquals("rowClasses", scriptOption.getName());
+ assertEquals("#{rowClasses}", scriptOption.getValue());
+ assertEquals("asArray", scriptOption.getWrapper());
+
+ scriptOption = (CdkScriptOptionElement) children.next();
+ assertEquals(Arrays.asList("min", "max"), scriptOption.getAttributes());
+
+ scriptOption = (CdkScriptOptionElement) children.next();
+ assertEquals(Arrays.asList("allowHeader", "allowFooter"), scriptOption.getVariables());
+
+ assertFalse(children.hasNext());
+ }
}
Modified: trunk/cdk/generator/src/test/java/org/richfaces/cdk/templatecompiler/parser/el/test/ELParserTest.java
===================================================================
--- trunk/cdk/generator/src/test/java/org/richfaces/cdk/templatecompiler/parser/el/test/ELParserTest.java 2010-10-22 16:54:29 UTC (rev 19656)
+++ trunk/cdk/generator/src/test/java/org/richfaces/cdk/templatecompiler/parser/el/test/ELParserTest.java 2010-10-24 19:11:47 UTC (rev 19657)
@@ -21,9 +21,14 @@
package org.richfaces.cdk.templatecompiler.parser.el.test;
-import static org.junit.Assert.*;
-import static org.easymock.EasyMock.*;
-import static org.richfaces.cdk.templatecompiler.statements.HelperMethod.*;
+import static org.easymock.EasyMock.anyObject;
+import static org.easymock.EasyMock.expectLastCall;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+import static org.richfaces.cdk.templatecompiler.statements.HelperMethod.EMPTINESS_CHECK;
+import static org.richfaces.cdk.templatecompiler.statements.HelperMethod.EQUALS_CHECK;
+import static org.richfaces.cdk.templatecompiler.statements.HelperMethod.TO_BOOLEAN_CONVERSION;
+import static org.richfaces.cdk.templatecompiler.statements.HelperMethod.TO_STRING_CONVERSION;
import java.util.HashMap;
import java.util.List;
@@ -668,4 +673,12 @@
assertEquals("\"Literal\"",parseExpression.getCode());
assertEquals(String.class.getName(), parseExpression.getType().getRawName());
}
+
+ @Test
+ public void testToScriptArgs() throws Exception {
+ TypedTemplateStatement parseExpression = parseExpression("#{toScriptArgs(clientId, bean)}");
+
+ assertTrue(Iterables.contains(parseExpression.getRequiredMethods(), HelperMethod.TO_SCRIPT_ARGS));
+ assertEquals("toScriptArgs(clientId,bean)", parseExpression.getCode());
+ }
}
Added: trunk/cdk/generator/src/test/java/org/richfaces/cdk/templatecompiler/statements/AddAttributesToScriptHashTest.java
===================================================================
--- trunk/cdk/generator/src/test/java/org/richfaces/cdk/templatecompiler/statements/AddAttributesToScriptHashTest.java (rev 0)
+++ trunk/cdk/generator/src/test/java/org/richfaces/cdk/templatecompiler/statements/AddAttributesToScriptHashTest.java 2010-10-24 19:11:47 UTC (rev 19657)
@@ -0,0 +1,92 @@
+/*
+ * $Id$
+ *
+ * License Agreement.
+ *
+ * Rich Faces - Natural Ajax for Java Server Faces (JSF)
+ *
+ * Copyright (C) 2007 Exadel, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License version 2.1 as published by the Free Software Foundation.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+package org.richfaces.cdk.templatecompiler.statements;
+
+import java.util.Collections;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.richfaces.cdk.CdkClassLoader;
+import org.richfaces.cdk.CdkTestRunner;
+import org.richfaces.cdk.model.ClassName;
+import org.richfaces.cdk.model.PropertyBase;
+import org.richfaces.cdk.model.PropertyModel;
+import org.richfaces.cdk.templatecompiler.builder.model.JavaField;
+import org.richfaces.cdk.templatecompiler.el.types.TypesFactory;
+import org.richfaces.cdk.templatecompiler.el.types.TypesFactoryImpl;
+
+import com.google.common.collect.Iterables;
+import com.google.inject.Binder;
+import com.google.inject.Inject;
+
+/**
+ * <p class="changed_added_4_0">
+ * </p>
+ *
+ * @author asmirnov(a)exadel.com
+ *
+ */
+(a)RunWith(CdkTestRunner.class)
+public class AddAttributesToScriptHashTest extends FreeMarkerTestBase {
+
+ @Inject
+ private TypesFactory typesFactory;
+
+ @Inject
+ private ScriptObjectStatement parentStatement;
+
+ @Inject
+ private AddAttributesToScriptHashStatement statement;
+
+ @Override
+ public void configure(Binder binder) {
+ super.configure(binder);
+ binder.bind(TypesFactory.class).to(TypesFactoryImpl.class);
+ binder.bind(CdkClassLoader.class).toInstance(createClassLoader());
+ }
+
+ /**
+ * Test method for {@link org.richfaces.cdk.templatecompiler.statements.FreeMarkerTemplateStatementBase#getCode()}.
+ */
+ @Test
+ public void testGetCode() {
+ statement.setParent(parentStatement);
+ parentStatement.setObject("hash", null);
+
+ PropertyBase property = new PropertyModel();
+ property.setName("bar");
+ property.setDefaultValue("deflt");
+ property.setType(ClassName.get(String.class));
+
+ controller.replay();
+ statement.setAttributes(Collections.singleton("bar"), Collections.singleton(property));
+ String code = statement.getCode();
+ controller.verify();
+ verifyCode(code, "!attributes()", "!defaultValue(", "!if(", "");
+ verifyHelpers(statement, HelperMethod.CREATE_ATTRIBUTES, HelperMethod.ADD_TO_SCRIPT_HASH_ATTRIBUTES);
+ JavaField javaField = Iterables.getOnlyElement(statement.getRequiredFields());
+ verifyCode(javaField.getValue().getCode(), "attributes()", "generic(", "defaultValue(");
+ }
+
+}
Modified: trunk/cdk/generator/src/test/java/org/richfaces/cdk/templatecompiler/statements/FreeMarkerTemplateStatementTest.java
===================================================================
--- trunk/cdk/generator/src/test/java/org/richfaces/cdk/templatecompiler/statements/FreeMarkerTemplateStatementTest.java 2010-10-22 16:54:29 UTC (rev 19656)
+++ trunk/cdk/generator/src/test/java/org/richfaces/cdk/templatecompiler/statements/FreeMarkerTemplateStatementTest.java 2010-10-24 19:11:47 UTC (rev 19657)
@@ -1,7 +1,7 @@
package org.richfaces.cdk.templatecompiler.statements;
-import static org.easymock.EasyMock.*;
-import static org.junit.Assert.*;
+import static org.easymock.EasyMock.expect;
+import static org.junit.Assert.assertEquals;
import java.util.Collections;
@@ -15,7 +15,7 @@
import org.richfaces.cdk.generate.freemarker.FreeMarkerRenderer;
import org.richfaces.cdk.templatecompiler.builder.model.JavaField;
import org.richfaces.cdk.templatecompiler.builder.model.JavaImport;
-import org.richfaces.cdk.templatecompiler.builder.model.RuntimeImport;
+import org.richfaces.cdk.templatecompiler.builder.model.JavaImportImpl;
import org.richfaces.cdk.templatecompiler.el.types.TypesFactory;
import com.google.common.collect.Iterables;
@@ -64,7 +64,7 @@
public void testGetRequiredImports() {
freeMarkerStatement.addImport("foo.Bar");
expect(statement.getRequiredImports()).andStubReturn(
- Collections.<JavaImport> singleton(new RuntimeImport("foo.baz")));
+ Collections.<JavaImport> singleton(new JavaImportImpl("foo.baz")));
expect(renderer.renderTemplate("foo.ftl", freeMarkerStatement)).andReturn(FOO_CODE);
controller.replay();
freeMarkerStatement.addStatement(statement);
Modified: trunk/cdk/generator/src/test/java/org/richfaces/cdk/templatecompiler/statements/WriteAttributesSetTest.java
===================================================================
--- trunk/cdk/generator/src/test/java/org/richfaces/cdk/templatecompiler/statements/WriteAttributesSetTest.java 2010-10-22 16:54:29 UTC (rev 19656)
+++ trunk/cdk/generator/src/test/java/org/richfaces/cdk/templatecompiler/statements/WriteAttributesSetTest.java 2010-10-24 19:11:47 UTC (rev 19657)
@@ -55,7 +55,7 @@
*/
@Test
public void testGetCode() {
- WriteAttributesSetStatement.PassThrough passThrough = new WriteAttributesSetStatement.PassThrough();
+ PassThrough passThrough = new PassThrough();
passThrough.name = QName.valueOf("foo");
passThrough.type = "String";
passThrough.componentAttribute = "bar";
Deleted: trunk/core/impl/src/main/java/org/richfaces/component/util/ComponentUtil.java
===================================================================
--- trunk/core/impl/src/main/java/org/richfaces/component/util/ComponentUtil.java 2010-10-22 16:54:29 UTC (rev 19656)
+++ trunk/core/impl/src/main/java/org/richfaces/component/util/ComponentUtil.java 2010-10-24 19:11:47 UTC (rev 19657)
@@ -1,83 +0,0 @@
-/**
- * License Agreement.
- *
- * Rich Faces - Natural Ajax for Java Server Faces (JSF)
- *
- * Copyright (C) 2007 Exadel, Inc.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License version 2.1 as published by the Free Software Foundation.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- */
-
-package org.richfaces.component.util;
-
-import java.util.Collection;
-import java.util.Iterator;
-
-/**
- * @author Nick Belaevski
- * mailto:nbelaevski@exadel.com
- * created 20.07.2007
- */
-public final class ComponentUtil {
- private ComponentUtil() {
- }
-
- public static String[] asArray(Object object) {
- if (object == null) {
- return null;
- }
-
- Class componentType = object.getClass().getComponentType();
-
- if (String.class.equals(componentType)) {
- return (String[]) object;
- } else if (componentType != null) {
- Object[] objects = (Object[]) object;
- String[] result = new String[objects.length];
-
- for (int i = 0; i < objects.length; i++) {
- Object o = objects[i];
-
- if (o == null) {
- continue;
- }
-
- result[i] = o.toString();
- }
-
- return result;
- } else if (object instanceof Collection) {
- Collection collection = (Collection) object;
- String[] result = new String[collection.size()];
- Iterator iterator = collection.iterator();
-
- for (int i = 0; i < result.length; i++) {
- Object next = iterator.next();
-
- if (next == null) {
- continue;
- }
-
- result[i] = next.toString();
- }
-
- return result;
- } else {
- String string = object.toString().trim();
- String[] split = string.split("\\s*,\\s*");
-
- return split;
- }
- }
-}
Deleted: trunk/core/impl/src/test/java/org/richfaces/component/util/ComponentUtilTest.java
===================================================================
--- trunk/core/impl/src/test/java/org/richfaces/component/util/ComponentUtilTest.java 2010-10-22 16:54:29 UTC (rev 19656)
+++ trunk/core/impl/src/test/java/org/richfaces/component/util/ComponentUtilTest.java 2010-10-24 19:11:47 UTC (rev 19657)
@@ -1,93 +0,0 @@
-/**
- * License Agreement.
- *
- * Rich Faces - Natural Ajax for Java Server Faces (JSF)
- *
- * Copyright (C) 2007 Exadel, Inc.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License version 2.1 as published by the Free Software Foundation.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- */
-
-
-
-package org.richfaces.component.util;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Set;
-import java.util.TreeSet;
-
-import junit.framework.TestCase;
-
-/**
- * @author Nick Belaevski
- * mailto:nbelaevski@exadel.com
- * created 20.07.2007
- *
- */
-public class ComponentUtilTest extends TestCase {
- public void testAsArray() {
- assertNull(ComponentUtil.asArray(null));
- }
-
- public void testAsArray1() {
- String[] strings = new String[] {"a", "b"};
- String[] array = ComponentUtil.asArray(strings);
-
- assertSame(strings, array);
- }
-
- public void testAsArray2() {
- Object[] objects = new Object[] {Integer.valueOf(12), null, Integer.valueOf(22), Integer.valueOf(42)};
- String[] array = ComponentUtil.asArray(objects);
- String[] etalon = new String[] {"12", null, "22", "42"};
-
- assertTrue(Arrays.equals(etalon, array));
- }
-
- public void testAsArray3() {
- ArrayList list = new ArrayList();
-
- list.add(new Integer(12));
- list.add(null);
- list.add(new Integer(22));
- list.add(new Integer(42));
-
- String[] array = ComponentUtil.asArray(list);
- String[] etalon = new String[] {"12", null, "22", "42"};
-
- assertTrue(Arrays.equals(etalon, array));
- }
-
- public void testAsArray31() {
- Set set = new TreeSet();
-
- set.add(new Integer(12));
- set.add(new Integer(22));
- set.add(new Integer(42));
-
- String[] array = ComponentUtil.asArray(set);
- String[] etalon = new String[] {"12", "22", "42"};
-
- assertTrue(Arrays.equals(etalon, array));
- }
-
- public void testAsArray4() {
- String string = " a , \t\n b \n , c ";
- String[] strings = ComponentUtil.asArray(string);
- String[] etalon = new String[] {"a", "b", "c"};
-
- assertTrue(Arrays.equals(etalon, strings));
- }
-}
Modified: trunk/ui/common/ui/src/main/java/org/richfaces/renderkit/RenderKitUtils.java
===================================================================
--- trunk/ui/common/ui/src/main/java/org/richfaces/renderkit/RenderKitUtils.java 2010-10-22 16:54:29 UTC (rev 19656)
+++ trunk/ui/common/ui/src/main/java/org/richfaces/renderkit/RenderKitUtils.java 2010-10-24 19:11:47 UTC (rev 19657)
@@ -22,10 +22,12 @@
package org.richfaces.renderkit;
import java.io.IOException;
+import java.lang.reflect.Array;
import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
import java.util.HashSet;
+import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;
@@ -41,6 +43,8 @@
import javax.faces.context.FacesContext;
import javax.faces.context.ResponseWriter;
+import org.ajax4jsf.javascript.JSFunctionDefinition;
+import org.ajax4jsf.javascript.ScriptUtils;
import org.richfaces.renderkit.ComponentAttribute.Kind;
/**
@@ -82,10 +86,115 @@
private static final String DISABLED_ATTRIBUTE_NAME = "disabled";
+ /**
+ * Wrapper class around object value used to transform values into particular JS objects
+ *
+ * @author Nick Belaevski
+ * @since 3.3.2
+ */
+ public enum ScriptHashVariableWrapper {
+
+ /**
+ * No-op default wrapper
+ */
+ noop {
+
+ @Override
+ Object wrap(Object o) {
+ return o;
+ }
+
+ },
+
+
+ /**
+ * Convert parameter to array of srings.
+ */
+ asArray {
+
+ @Override
+ Object wrap(Object o) {
+ return asArray(o);
+ }
+
+ },
+
+ /**
+ * Event handler functions wrapper. Wraps <pre>functionCode</pre> object into:
+ * <pre>function(event) {
+ * functionCode
+ * }</pre>
+ */
+ eventHandler {
+
+ @Override
+ Object wrap(Object o) {
+ return new JSFunctionDefinition("event").addToBody(o);
+ }
+
+ };
+
+ /**
+ * Method that does the wrapping
+ *
+ * @param o object to wrap
+ * @return wrapped object
+ */
+ abstract Object wrap(Object o);
+ }
+
private RenderKitUtils() {
// utility constructor
}
+ static String[] asArray(Object object) {
+ if (object == null) {
+ return null;
+ }
+
+ Class<?> componentType = object.getClass().getComponentType();
+
+ if (String.class.equals(componentType)) {
+ return (String[]) object;
+ } else if (componentType != null) {
+ Object[] objects = (Object[]) object;
+ String[] result = new String[objects.length];
+
+ for (int i = 0; i < objects.length; i++) {
+ Object o = objects[i];
+
+ if (o == null) {
+ continue;
+ }
+
+ result[i] = o.toString();
+ }
+
+ return result;
+ } else if (object instanceof Collection) {
+ Collection<?> collection = (Collection<?>) object;
+ String[] result = new String[collection.size()];
+ Iterator<?> iterator = collection.iterator();
+
+ for (int i = 0; i < result.length; i++) {
+ Object next = iterator.next();
+
+ if (next == null) {
+ continue;
+ }
+
+ result[i] = next.toString();
+ }
+
+ return result;
+ } else {
+ String string = object.toString().trim();
+ String[] split = string.split("\\s*,\\s*");
+
+ return split;
+ }
+ }
+
private static Map<String, List<ClientBehavior>> getClientBehaviorsMap(UIComponent component) {
Map<String, List<ClientBehavior>> result;
if (component instanceof ClientBehaviorHolder) {
@@ -196,6 +305,7 @@
}
public static boolean shouldRenderAttribute(Object attributeValue) {
+ //TODO - consider required attributes with "" value (like 'alt')
if (attributeValue == null) {
return false;
} else if (attributeValue instanceof String) {
@@ -422,6 +532,148 @@
return res;
}
+ /**
+ * Checks if the argument passed in is empty or not.
+ * Object is empty if it is: <br />
+ * - <code>null<code><br />
+ * - zero-length string<br />
+ * - empty collection<br />
+ * - empty map<br />
+ * - zero-length array<br />
+ *
+ * @param o object to check for emptiness
+ * @since 3.3.2
+ * @return <code>true</code> if the argument is empty, <code>false</code> otherwise
+ */
+ private static boolean isEmpty(Object o) {
+ if (null == o) {
+ return true;
+ }
+ if (o instanceof String ) {
+ return (0 == ((String)o).length());
+ }
+ if (o instanceof Collection) {
+ return ((Collection<?>)o).isEmpty();
+ }
+ if (o instanceof Map) {
+ return ((Map<?, ?>)o).isEmpty();
+ }
+ if (o.getClass().isArray()) {
+ return Array.getLength(o) == 0;
+ }
+ return false;
+ }
+
+ public static void addToScriptHash(Map<String, Object> hash,
+ String name,
+ Object value) {
+
+ addToScriptHash(hash, name, value, null, null);
+ }
+
+ public static void addToScriptHash(Map<String, Object> hash,
+ String name,
+ Object value,
+ Object defaultValue) {
+
+ addToScriptHash(hash, name, value, defaultValue, null);
+ }
+
+ /**
+ * Puts value into map under specified key if the value is not empty and not default.
+ * Performs optional value wrapping.
+ *
+ * @param hash
+ * @param name
+ * @param value
+ * @param defaultValue
+ * @param wrapper
+ *
+ * @since 3.3.2
+ */
+ public static void addToScriptHash(Map<String, Object> hash,
+ String name,
+ Object value,
+ Object defaultValue,
+ ScriptHashVariableWrapper wrapper) {
+
+ ScriptHashVariableWrapper wrapperOrDefault = wrapper != null ? wrapper : ScriptHashVariableWrapper.noop;
+
+ if (!isEmpty(value) && shouldRenderAttribute(value)) {
+ if (defaultValue != null) {
+ if (!String.valueOf(defaultValue).equals(value.toString())) {
+ hash.put(name, wrapperOrDefault.wrap(value));
+ }
+ } else {
+ if (!(value instanceof Boolean) || ((Boolean) value).booleanValue()) {
+ hash.put(name, wrapperOrDefault.wrap(value));
+ }
+ }
+ }
+ }
+
+ public static void addToScriptHash(Map<String, Object> hash, FacesContext facesContext, UIComponent component,
+ Attributes attributes, ScriptHashVariableWrapper wrapper) {
+
+ boolean disabled = isDisabled(component);
+ for (ComponentAttribute knownAttribute : attributes) {
+ if (!disabled || knownAttribute.getEventNames().length == 0) {
+ String attributeName = knownAttribute.getComponentAttributeName();
+ addToScriptHash(hash, attributeName,
+ getAttributeAndBehaviorsValue(facesContext, component, knownAttribute),
+ knownAttribute.getDefaultValue(), wrapper);
+ }
+ }
+ }
+
+ public static String concat(String... strings) {
+ if (strings == null) {
+ return "";
+ }
+
+ StringBuilder sb = new StringBuilder();
+ for (String s : strings) {
+ if (s == null || s.length() == 0) {
+ continue;
+ }
+
+ sb.append(s);
+ }
+ return sb.toString();
+ }
+
+ public static String toScriptArgs(Object... objects) {
+ if (objects == null) {
+ return "";
+ }
+
+ int lastNonNullIdx = objects.length - 1;
+ for (; 0 <= lastNonNullIdx; lastNonNullIdx--) {
+ if (!isEmpty(objects[lastNonNullIdx])) {
+ break;
+ }
+ }
+
+ if (lastNonNullIdx < 0) {
+ return "";
+ }
+
+ if (lastNonNullIdx == 0) {
+ return ScriptUtils.toScript(objects[lastNonNullIdx]);
+ }
+
+ StringBuilder sb = new StringBuilder();
+ for (int i = 0; i <= lastNonNullIdx; i++) {
+ if (sb.length() > 0) {
+ sb.append(",");
+ }
+
+ sb.append(ScriptUtils.toScript(objects[i]));
+ }
+
+ return sb.toString();
+ }
+
@SuppressWarnings("serial")
public static final class Attributes extends TreeSet<ComponentAttribute> {
Modified: trunk/ui/common/ui/src/main/java/org/richfaces/renderkit/util/RendererUtils.java
===================================================================
--- trunk/ui/common/ui/src/main/java/org/richfaces/renderkit/util/RendererUtils.java 2010-10-22 16:54:29 UTC (rev 19656)
+++ trunk/ui/common/ui/src/main/java/org/richfaces/renderkit/util/RendererUtils.java 2010-10-24 19:11:47 UTC (rev 19657)
@@ -28,11 +28,9 @@
import java.util.Arrays;
import java.util.Collection;
import java.util.HashMap;
-import java.util.HashSet;
import java.util.Iterator;
import java.util.LinkedHashMap;
import java.util.Map;
-import java.util.Set;
import javax.faces.FacesException;
import javax.faces.application.ViewHandler;
@@ -51,10 +49,9 @@
import org.ajax4jsf.Messages;
import org.ajax4jsf.component.JavaScriptParameter;
-import org.ajax4jsf.javascript.JSEncoder;
-import org.ajax4jsf.javascript.JSFunctionDefinition;
import org.ajax4jsf.javascript.JSReference;
import org.richfaces.renderkit.HtmlConstants;
+import org.richfaces.renderkit.RenderKitUtils;
/**
* Util class for common render operations - render passthru html attributes,
@@ -76,12 +73,8 @@
*/
private static final Map<String, String> SUBSTITUTIONS = new HashMap<String, String>();
- private static final Set<String> REQUIRED_ATTRIBUTES = new HashSet<String>();
-
static {
SUBSTITUTIONS.put(HtmlConstants.CLASS_ATTRIBUTE, "styleClass");
-
- REQUIRED_ATTRIBUTES.add(HtmlConstants.ALT_ATTRIBUTE);
Arrays.sort(HtmlConstants.PASS_THRU);
Arrays.sort(HtmlConstants.PASS_THRU_EVENTS);
@@ -96,46 +89,6 @@
}
/**
- * Wrapper class around object value used to transform values into particular JS objects
- *
- * @author Nick Belaevski
- * @since 3.3.2
- */
- public static enum ScriptHashVariableWrapper {
-
- /**
- * No-op default wrapper
- */
- DEFAULT {
- @Override
- Object wrap(Object o) {
- return o;
- }
- },
-
- /**
- * Event handler functions wrapper. Wraps <pre>functionCode</pre> object into:
- * <pre>function(event) {
- * functionCode
- * }</pre>
- */
- EVENT_HANDLER {
- @Override
- Object wrap(Object o) {
- return new JSFunctionDefinition("event").addToBody(o);
- }
- };
-
- /**
- * Method that does the wrapping
- *
- * @param o object to wrap
- * @return wrapped object
- */
- abstract Object wrap(Object o);
- }
-
- /**
* Use this method to get singleton instance of RendererUtils
* @return singleton instance
*/
@@ -360,7 +313,7 @@
Object value = attributeValue(attribute, attributes.get(getComponentAttributeName(attribute)));
- if ((null != value) && shouldRenderAttribute(attribute, value)) {
+ if ((null != value) && RenderKitUtils.shouldRenderAttribute(value)) {
if (Arrays.binarySearch(HtmlConstants.PASS_THRU_URI, attribute) >= 0) {
String url = context.getApplication().getViewHandler().getResourceURL(context, value.toString());
@@ -418,7 +371,7 @@
ResponseWriter writer = context.getResponseWriter();
Object value = component.getAttributes().get(property);
- if (shouldRenderAttribute(attributeName, value)) {
+ if (RenderKitUtils.shouldRenderAttribute(value)) {
writer.writeAttribute(attributeName, value, property.toString());
}
}
@@ -428,81 +381,6 @@
}
/**
- * Write html-attribute
- *
- * @param writer
- * @param attribute
- * @param value
- * @throws IOException
- */
- public void writeAttribute(ResponseWriter writer, String attribute, Object value) throws IOException {
- if (shouldRenderAttribute(attribute, value)) {
- writer.writeAttribute(attribute, value.toString(), attribute);
- }
- }
-
- /**
- * @return true if and only if the argument <code>attributeVal</code> is
- * an instance of a wrapper for a primitive type and its value is
- * equal to the default value for that type as given in the spec.
- */
- public boolean shouldRenderAttribute(Object attributeVal) {
- if (null == attributeVal) {
- return false;
- } else if ((attributeVal instanceof Boolean)
- && ((Boolean) attributeVal).booleanValue() == Boolean.FALSE.booleanValue()) {
- return false;
- } else if (attributeVal.toString().length() == 0) {
- return false;
- } else {
- return isValidProperty(attributeVal);
- }
- }
-
- public boolean shouldRenderAttribute(String attributeName, Object attributeVal) {
- if (REQUIRED_ATTRIBUTES.contains(attributeName)) {
- if (attributeVal == null) {
- return false;
- }
- } else {
- return shouldRenderAttribute(attributeVal);
- }
-
- return true;
- }
-
- /**
- * Test for valid value of property. by default, for non-setted properties
- * with Java primitive types of JSF component return appropriate MIN_VALUE .
- *
- * @param property -
- * value of property returned from
- * {@link UIComponent#getAttributes()}
- * @return true for setted property, false otherthise.
- */
- public boolean isValidProperty(Object property) {
- if (null == property) {
- return false;
- } else if ((property instanceof Integer) && ((Integer) property).intValue() == Integer.MIN_VALUE) {
- return false;
- } else if ((property instanceof Double) && ((Double) property).doubleValue() == Double.MIN_VALUE) {
- return false;
- } else if ((property instanceof Character) && ((Character) property).charValue() == Character.MIN_VALUE) {
- return false;
- } else if ((property instanceof Float) && ((Float) property).floatValue() == Float.MIN_VALUE) {
- return false;
- } else if ((property instanceof Short) && ((Short) property).shortValue() == Short.MIN_VALUE) {
- return false;
- } else if ((property instanceof Byte) && ((Byte) property).byteValue() == Byte.MIN_VALUE) {
- return false;
- } else if ((property instanceof Long) && ((Long) property).longValue() == Long.MIN_VALUE) {
- return false;
- }
-
- return true;
- }
-
- /**
* Checks if the argument passed in is empty or not.
* Object is empty if it is: <br />
* - <code>null</code><br />
@@ -540,64 +418,6 @@
}
/**
- * Puts value into map under specified key if the value is not empty and not default.
- * Performs optional value wrapping.
- *
- * @param hash
- * @param name
- * @param value
- * @param defaultValue
- * @param wrapper
- *
- * @since 3.3.2
- */
- public void addToScriptHash(Map<String, Object> hash, String name, Object value, String defaultValue,
- ScriptHashVariableWrapper wrapper) {
- ScriptHashVariableWrapper wrapperOrDefault = (wrapper != null) ? wrapper : ScriptHashVariableWrapper.DEFAULT;
-
- if (isValidProperty(value) && !isEmpty(value)) {
- if (!isEmpty(defaultValue)) {
- if (!defaultValue.equals(value.toString())) {
- hash.put(name, wrapperOrDefault.wrap(value));
- }
- } else {
- if (!(value instanceof Boolean) || ((Boolean) value).booleanValue()) {
- hash.put(name, wrapperOrDefault.wrap(value));
- }
- }
- }
- }
-
- /**
- * Puts value into map under specified key if the value is not empty and not default.
- * Performs optional value wrapping.
- *
- * @param hash
- * @param name
- * @param value
- * @param defaultValue
- *
- * @since 3.3.2
- */
- public void addToScriptHash(Map<String, Object> hash, String name, Object value, String defaultValue) {
- addToScriptHash(hash, name, value, defaultValue, null);
- }
-
- /**
- * Puts value into map under specified key if the value is not empty and not default.
- * Performs optional value wrapping.
- *
- * @param hash
- * @param name
- * @param value
- *
- * @since 3.3.2
- */
- public void addToScriptHash(Map<String, Object> hash, String name, Object value) {
- addToScriptHash(hash, name, value, null, null);
- }
-
- /**
* Convert HTML attribute name to component property name.
*
* @param key
@@ -916,83 +736,6 @@
return forAttr;
}
- public static void writeEventHandlerFunction(FacesContext context, UIComponent component, String eventName)
- throws IOException {
-
- ResponseWriter writer = context.getResponseWriter();
- Object script = component.getAttributes().get(eventName);
-
- if ((script != null) && !script.equals("")) {
- JSFunctionDefinition onEventDefinition = new JSFunctionDefinition();
-
- onEventDefinition.addParameter("event");
- onEventDefinition.addToBody(script);
- writer.writeText(eventName + ": " + onEventDefinition.toScript(), null);
- } else {
- writer.writeText(eventName + ": ''", null);
- }
- }
-
- public JSFunctionDefinition getAsEventHandler(FacesContext context, UIComponent component, String attributeName,
- String append) {
- String event = (String) component.getAttributes().get(attributeName);
-
- if (event != null) {
- event = event.trim();
-
- if (event.length() != 0) {
- JSFunctionDefinition function = new JSFunctionDefinition();
-
- function.addParameter("event");
-
- if ((null != append) && (append.length() > 0)) {
- function.addToBody(event + append);
- } else {
- function.addToBody(event);
- }
-
- return function;
- }
- }
-
- return null;
- }
-
- public String escapeJavaScript(Object o) {
- if (o != null) {
- StringBuilder result = new StringBuilder();
- JSEncoder encoder = new JSEncoder();
- char[] chars = o.toString().toCharArray();
- int start = 0;
- int end = chars.length;
-
- for (int x = start; x < end; x++) {
- char c = chars[x];
-
- if (encoder.compile(c)) {
- continue;
- }
-
- if (start != x) {
- result.append(chars, start, x - start);
- }
-
- result.append(encoder.encode(c));
- start = x + 1;
-
- continue;
- }
-
- if (start != end) {
- result.append(chars, start, end - start);
- }
-
- return result.toString();
- } else {
- return null;
- }
- }
-
public void encodeChildren(FacesContext context, UIComponent component) throws IOException {
if (component.getChildCount() > 0) {
for (UIComponent child : component.getChildren()) {
Modified: trunk/ui/common/ui/src/test/java/org/richfaces/renderkit/RenderKitUtilsTest.java
===================================================================
--- trunk/ui/common/ui/src/test/java/org/richfaces/renderkit/RenderKitUtilsTest.java 2010-10-22 16:54:29 UTC (rev 19656)
+++ trunk/ui/common/ui/src/test/java/org/richfaces/renderkit/RenderKitUtilsTest.java 2010-10-24 19:11:47 UTC (rev 19657)
@@ -23,9 +23,24 @@
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNull;
+import static org.junit.Assert.assertSame;
import static org.junit.Assert.assertTrue;
+import static org.richfaces.renderkit.RenderKitUtils.addToScriptHash;
+import static org.richfaces.renderkit.RenderKitUtils.concat;
+import static org.richfaces.renderkit.RenderKitUtils.toScriptArgs;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Set;
+import java.util.TreeSet;
+
+import org.ajax4jsf.javascript.JSFunctionDefinition;
import org.junit.Test;
+import org.richfaces.renderkit.RenderKitUtils.ScriptHashVariableWrapper;
/**
* @author Nick Belaevski
@@ -107,4 +122,173 @@
assertFalse(RenderKitUtils.shouldRenderAttribute(Boolean.FALSE));
}
-}
\ No newline at end of file
+ @Test
+ public void testConcat() throws Exception {
+ assertEquals("", concat());
+ assertEquals("", concat((String) null));
+ assertEquals("", concat((String[]) null));
+ assertEquals("", concat(""));
+ assertEquals("test", concat("test"));
+ assertEquals("build a string", concat("build", " a ", "string"));
+ assertEquals("omit nulls", concat(null, "omit", null, " ", null, "nulls", null));
+ }
+
+ private static String dehydrate(String s) {
+ return s.replaceAll("\\s+", "");
+ }
+
+ @Test
+ public void testToScriptArgs() throws Exception {
+ assertEquals("", toScriptArgs());
+ assertEquals("", toScriptArgs((Object) null));
+ assertEquals("", toScriptArgs((Object[]) null));
+
+ assertEquals("\"test\"", toScriptArgs("test"));
+ assertEquals("[5,8]", dehydrate(toScriptArgs(Arrays.asList(5, 8))));
+ assertEquals("{\"a\":true}", dehydrate(toScriptArgs(Collections.singletonMap("a", true))));
+
+ assertEquals("\"test\"", toScriptArgs("test", null));
+ assertEquals("null,\"test\"", toScriptArgs(null, "test"));
+
+ assertEquals("\"test\"", toScriptArgs("test", Collections.emptyList()));
+ assertEquals("[],\"test\"", dehydrate(toScriptArgs(Collections.emptyList(), "test")));
+
+ assertEquals("\"test\"", toScriptArgs("test", Collections.emptyMap()));
+ assertEquals("{},\"test\"", dehydrate(toScriptArgs(Collections.emptyMap(), "test")));
+
+ assertEquals("\"test\"", toScriptArgs("test", ""));
+ assertEquals("\"\",\"test\"", dehydrate(toScriptArgs("", "test")));
+
+ assertEquals("1,2,3", toScriptArgs(1, 2, 3, null));
+ assertEquals("1,2,null,3", toScriptArgs(1, 2, null, 3));
+ }
+
+ public void testScriptHashVariableWrapper() throws Exception {
+ assertEquals("abc", ScriptHashVariableWrapper.noop.wrap("abc"));
+
+ Object eventHandler = ScriptHashVariableWrapper.eventHandler.wrap("abc");
+
+ assertTrue(eventHandler instanceof JSFunctionDefinition);
+
+ JSFunctionDefinition handlerFunction = (JSFunctionDefinition) eventHandler;
+ assertEquals("function(event){abc}", dehydrate(handlerFunction.toScript()));
+
+ Object arrayObject = ScriptHashVariableWrapper.asArray.wrap("header, footer");
+ assertEquals("[\"header\",\"footer\"]", arrayObject.toString().replaceAll("\\s", ""));
+ }
+
+ public void testAddToScriptHash() throws Exception {
+ Map<String, Object> hash = new HashMap<String, Object>();
+
+ addToScriptHash(hash, "x", "y", null, null);
+ assertEquals("y", hash.get("x"));
+ addToScriptHash(hash, "y", "", null, null);
+ assertNull(hash.get("y"));
+ assertFalse(hash.containsKey("y"));
+ addToScriptHash(hash, "y1", null, null, null);
+ assertNull(hash.get("y1"));
+ assertFalse(hash.containsKey("y1"));
+ addToScriptHash(hash, "st", "server", "", null);
+ assertEquals("server", hash.get("st"));
+ addToScriptHash(hash, "st1", "ajax", "ajax", null);
+ assertNull(hash.get("st1"));
+ assertFalse(hash.containsKey("st1"));
+ addToScriptHash(hash, "st2", "", "ajax", null);
+ assertNull(hash.get("st2"));
+ assertFalse(hash.containsKey("st2"));
+ addToScriptHash(hash, "null", null, "server", null);
+ assertNull(hash.get("null"));
+ assertFalse(hash.containsKey("null"));
+ addToScriptHash(hash, "b", false, null, null);
+ assertNull(hash.get("b"));
+ assertFalse(hash.containsKey("b"));
+ addToScriptHash(hash, "b1", true, null, null);
+ assertEquals(Boolean.TRUE, hash.get("b1"));
+ addToScriptHash(hash, "b2", true, "true", null);
+ assertNull(hash.get("b2"));
+ assertFalse(hash.containsKey("b2"));
+ addToScriptHash(hash, "b3", false, "true", null);
+ assertEquals(Boolean.FALSE, hash.get("b3"));
+ addToScriptHash(hash, "b4", true, "false", null);
+ assertEquals(Boolean.TRUE, hash.get("b4"));
+ addToScriptHash(hash, "b5", false, "false", null);
+ assertNull(hash.get("b5"));
+ assertFalse(hash.containsKey("b5"));
+ addToScriptHash(hash, "i", Integer.valueOf(0), null, null);
+ assertEquals(Integer.valueOf(0), hash.get("i"));
+ addToScriptHash(hash, "i1", Integer.valueOf(0), "0", null);
+ assertNull(hash.get("i1"));
+ assertFalse(hash.containsKey("i1"));
+ addToScriptHash(hash, "i2", Integer.valueOf(0), "1", null);
+ assertEquals(Integer.valueOf(0), hash.get("i2"));
+ addToScriptHash(hash, "i3", Integer.MIN_VALUE, null, null);
+ assertNull(hash.get("i3"));
+ assertFalse(hash.containsKey("i3"));
+ addToScriptHash(hash, "i4", Integer.MIN_VALUE, "0", null);
+ assertNull(hash.get("i4"));
+ assertFalse(hash.containsKey("i4"));
+ addToScriptHash(hash, "plain", "test", null, ScriptHashVariableWrapper.noop);
+ assertEquals("test", hash.get("plain"));
+ addToScriptHash(hash, "plain1", "newtest", "blank", ScriptHashVariableWrapper.noop);
+ assertEquals("newtest", hash.get("plain1"));
+ addToScriptHash(hash, "onclick", "alert(1)", null, ScriptHashVariableWrapper.eventHandler);
+ assertTrue(hash.get("onclick") instanceof JSFunctionDefinition);
+ addToScriptHash(hash, "onclick1", "alert(1)", "no-val", ScriptHashVariableWrapper.eventHandler);
+ assertTrue(hash.get("onclick1") instanceof JSFunctionDefinition);
+ }
+
+
+ public void testAsArray() {
+ assertNull(RenderKitUtils.asArray(null));
+ }
+
+ public void testAsArray1() {
+ String[] strings = new String[] {"a", "b"};
+ String[] array = RenderKitUtils.asArray(strings);
+
+ assertSame(strings, array);
+ }
+
+ public void testAsArray2() {
+ Object[] objects = new Object[] {Integer.valueOf(12), null, Integer.valueOf(22), Integer.valueOf(42)};
+ String[] array = RenderKitUtils.asArray(objects);
+ String[] etalon = new String[] {"12", null, "22", "42"};
+
+ assertTrue(Arrays.equals(etalon, array));
+ }
+
+ public void testAsArray3() {
+ ArrayList<Integer> list = new ArrayList<Integer>();
+
+ list.add(new Integer(12));
+ list.add(null);
+ list.add(new Integer(22));
+ list.add(new Integer(42));
+
+ String[] array = RenderKitUtils.asArray(list);
+ String[] etalon = new String[] {"12", null, "22", "42"};
+
+ assertTrue(Arrays.equals(etalon, array));
+ }
+
+ public void testAsArray31() {
+ Set<Integer> set = new TreeSet<Integer>();
+
+ set.add(new Integer(12));
+ set.add(new Integer(22));
+ set.add(new Integer(42));
+
+ String[] array = RenderKitUtils.asArray(set);
+ String[] etalon = new String[] {"12", "22", "42"};
+
+ assertTrue(Arrays.equals(etalon, array));
+ }
+
+ public void testAsArray4() {
+ String string = " a , \t\n b \n , c ";
+ String[] strings = RenderKitUtils.asArray(string);
+ String[] etalon = new String[] {"a", "b", "c"};
+
+ assertTrue(Arrays.equals(etalon, strings));
+ }
+}
Modified: trunk/ui/common/ui/src/test/java/org/richfaces/renderkit/util/RendererUtilsTest.java
===================================================================
--- trunk/ui/common/ui/src/test/java/org/richfaces/renderkit/util/RendererUtilsTest.java 2010-10-22 16:54:29 UTC (rev 19656)
+++ trunk/ui/common/ui/src/test/java/org/richfaces/renderkit/util/RendererUtilsTest.java 2010-10-24 19:11:47 UTC (rev 19657)
@@ -31,10 +31,6 @@
import junit.framework.TestCase;
-import org.ajax4jsf.javascript.JSFunctionDefinition;
-import org.richfaces.renderkit.util.RendererUtils;
-import org.richfaces.renderkit.util.RendererUtils.ScriptHashVariableWrapper;
-
/**
* @author Nick Belaevski
* @since 3.3.2
@@ -71,77 +67,4 @@
assertFalse(utils.isEmpty(new Object[1]));
assertFalse(utils.isEmpty(new int[1]));
}
-
- public void testScriptHashVariableWrapper() throws Exception {
- assertEquals("abc", RendererUtils.ScriptHashVariableWrapper.DEFAULT.wrap("abc"));
-
- Object eventHandler = RendererUtils.ScriptHashVariableWrapper.EVENT_HANDLER.wrap("abc");
-
- assertTrue(eventHandler instanceof JSFunctionDefinition);
-
- JSFunctionDefinition handlerFunction = (JSFunctionDefinition) eventHandler;
-
- assertEquals("function(event){abc}", handlerFunction.toScript().replaceAll("\\s", ""));
- }
-
- public void testAddToScriptHash() throws Exception {
- Map<String, Object> hash = new HashMap<String, Object>();
- RendererUtils utils = RendererUtils.getInstance();
-
- utils.addToScriptHash(hash, "x", "y", null, null);
- assertEquals("y", hash.get("x"));
- utils.addToScriptHash(hash, "y", "", null, null);
- assertNull(hash.get("y"));
- assertFalse(hash.containsKey("y"));
- utils.addToScriptHash(hash, "y1", null, null, null);
- assertNull(hash.get("y1"));
- assertFalse(hash.containsKey("y1"));
- utils.addToScriptHash(hash, "st", "server", "", null);
- assertEquals("server", hash.get("st"));
- utils.addToScriptHash(hash, "st1", "ajax", "ajax", null);
- assertNull(hash.get("st1"));
- assertFalse(hash.containsKey("st1"));
- utils.addToScriptHash(hash, "st2", "", "ajax", null);
- assertNull(hash.get("st2"));
- assertFalse(hash.containsKey("st2"));
- utils.addToScriptHash(hash, "null", null, "server", null);
- assertNull(hash.get("null"));
- assertFalse(hash.containsKey("null"));
- utils.addToScriptHash(hash, "b", false, null, null);
- assertNull(hash.get("b"));
- assertFalse(hash.containsKey("b"));
- utils.addToScriptHash(hash, "b1", true, null, null);
- assertEquals(Boolean.TRUE, hash.get("b1"));
- utils.addToScriptHash(hash, "b2", true, "true", null);
- assertNull(hash.get("b2"));
- assertFalse(hash.containsKey("b2"));
- utils.addToScriptHash(hash, "b3", false, "true", null);
- assertEquals(Boolean.FALSE, hash.get("b3"));
- utils.addToScriptHash(hash, "b4", true, "false", null);
- assertEquals(Boolean.TRUE, hash.get("b4"));
- utils.addToScriptHash(hash, "b5", false, "false", null);
- assertNull(hash.get("b5"));
- assertFalse(hash.containsKey("b5"));
- utils.addToScriptHash(hash, "i", Integer.valueOf(0), null, null);
- assertEquals(Integer.valueOf(0), hash.get("i"));
- utils.addToScriptHash(hash, "i1", Integer.valueOf(0), "0", null);
- assertNull(hash.get("i1"));
- assertFalse(hash.containsKey("i1"));
- utils.addToScriptHash(hash, "i2", Integer.valueOf(0), "1", null);
- assertEquals(Integer.valueOf(0), hash.get("i2"));
- utils.addToScriptHash(hash, "i3", Integer.MIN_VALUE, null, null);
- assertNull(hash.get("i3"));
- assertFalse(hash.containsKey("i3"));
- utils.addToScriptHash(hash, "i4", Integer.MIN_VALUE, "0", null);
- assertNull(hash.get("i4"));
- assertFalse(hash.containsKey("i4"));
- utils.addToScriptHash(hash, "plain", "test", null, ScriptHashVariableWrapper.DEFAULT);
- assertEquals("test", hash.get("plain"));
- utils.addToScriptHash(hash, "plain1", "newtest", "blank", ScriptHashVariableWrapper.DEFAULT);
- assertEquals("newtest", hash.get("plain1"));
- utils.addToScriptHash(hash, "onclick", "alert(1)", null, ScriptHashVariableWrapper.EVENT_HANDLER);
- assertTrue(hash.get("onclick") instanceof JSFunctionDefinition);
- utils.addToScriptHash(hash, "onclick1", "alert(1)", "no-val", ScriptHashVariableWrapper.EVENT_HANDLER);
- assertTrue(hash.get("onclick1") instanceof JSFunctionDefinition);
- }
}
Modified: trunk/ui/core/ui/src/main/java/org/richfaces/renderkit/html/AjaxPushRenderer.java
===================================================================
--- trunk/ui/core/ui/src/main/java/org/richfaces/renderkit/html/AjaxPushRenderer.java 2010-10-22 16:54:29 UTC (rev 19656)
+++ trunk/ui/core/ui/src/main/java/org/richfaces/renderkit/html/AjaxPushRenderer.java 2010-10-24 19:11:47 UTC (rev 19657)
@@ -21,6 +21,8 @@
package org.richfaces.renderkit.html;
+import static org.richfaces.renderkit.RenderKitUtils.shouldRenderAttribute;
+
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
@@ -89,7 +91,7 @@
Map<String, Object> options = new HashMap<String, Object>();
int interval = push.getInterval();
- if (!getUtils().shouldRenderAttribute(interval)) {
+ if (shouldRenderAttribute(interval)) {
String intervalInitParameter = context.getExternalContext().getInitParameter(PUSH_INTERVAL_PARAMETER);
if (null != intervalInitParameter) {
interval = Integer.parseInt(intervalInitParameter);
Modified: trunk/ui/core/ui/src/main/java/org/richfaces/renderkit/html/AjaxStatusRenderer.java
===================================================================
--- trunk/ui/core/ui/src/main/java/org/richfaces/renderkit/html/AjaxStatusRenderer.java 2010-10-22 16:54:29 UTC (rev 19656)
+++ trunk/ui/core/ui/src/main/java/org/richfaces/renderkit/html/AjaxStatusRenderer.java 2010-10-24 19:11:47 UTC (rev 19657)
@@ -21,6 +21,9 @@
package org.richfaces.renderkit.html;
+import static org.richfaces.renderkit.RenderKitUtils.addToScriptHash;
+import static org.richfaces.renderkit.RenderKitUtils.renderAttribute;
+
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
@@ -35,10 +38,9 @@
import org.richfaces.component.AbstractAjaxStatus;
import org.richfaces.component.util.HtmlUtil;
import org.richfaces.renderkit.HtmlConstants;
+import org.richfaces.renderkit.RenderKitUtils.ScriptHashVariableWrapper;
import org.richfaces.renderkit.RendererBase;
import org.richfaces.renderkit.util.HandlersChain;
-import org.richfaces.renderkit.util.RendererUtils;
-import org.richfaces.renderkit.util.RendererUtils.ScriptHashVariableWrapper;
/**
* @author Nick Belaevski
@@ -128,8 +130,6 @@
}
}
- private RendererUtils rendererUtils = RendererUtils.getInstance();
-
protected void encodeState(FacesContext facesContext, AbstractAjaxStatus status,
StatusState state) throws IOException {
@@ -150,14 +150,13 @@
String stateStyle = (String) statusAttributes.get(state.getStyleAttributeName());
- rendererUtils.writeAttribute(writer, HtmlConstants.STYLE_ATTRIBUTE,
- HtmlUtil.concatStyles(stateStyle,
- state.isInitial() ? null : "display:none")
+ renderAttribute(facesContext, HtmlConstants.STYLE_ATTRIBUTE,
+ HtmlUtil.concatStyles(stateStyle, state.isInitial() ? null : "display:none")
);
String stateStyleClass = (String) statusAttributes.get(state.getStyleClassAttributeName());
- rendererUtils.writeAttribute(writer, HtmlConstants.CLASS_ATTRIBUTE,
+ renderAttribute(facesContext, HtmlConstants.CLASS_ATTRIBUTE,
HtmlUtil.concatClasses(state.getDefaultStyleClass(),
stateStyleClass));
@@ -201,12 +200,12 @@
HandlersChain handlersChain = new HandlersChain(context, component, true);
handlersChain.addInlineHandlerFromAttribute(eventAttribute);
handlersChain.addBehaviors(eventName);
- rendererUtils.addToScriptHash(options, eventAttribute,
+ addToScriptHash(options, eventAttribute,
handlersChain.toScript(), null,
- ScriptHashVariableWrapper.EVENT_HANDLER);
+ ScriptHashVariableWrapper.eventHandler);
}
- rendererUtils.addToScriptHash(options, "statusName", attributes.get("name"));
+ addToScriptHash(options, "statusName", attributes.get("name"));
if (!options.isEmpty()) {
statusConstructor.addParameter(options);
Modified: trunk/ui/core/ui/src/main/java/org/richfaces/renderkit/html/QueueResourceComponentRenderer.java
===================================================================
--- trunk/ui/core/ui/src/main/java/org/richfaces/renderkit/html/QueueResourceComponentRenderer.java 2010-10-22 16:54:29 UTC (rev 19656)
+++ trunk/ui/core/ui/src/main/java/org/richfaces/renderkit/html/QueueResourceComponentRenderer.java 2010-10-24 19:11:47 UTC (rev 19657)
@@ -22,6 +22,7 @@
package org.richfaces.renderkit.html;
import static org.richfaces.application.configuration.ConfigurationServiceHelper.getBooleanConfigurationValue;
+import static org.richfaces.renderkit.RenderKitUtils.addToScriptHash;
import java.io.IOException;
import java.util.LinkedHashMap;
@@ -40,7 +41,6 @@
import org.richfaces.cdk.annotations.JsfRenderer;
import org.richfaces.component.QueueRegistry;
import org.richfaces.renderkit.HtmlConstants;
-import org.richfaces.renderkit.util.RendererUtils;
/**
* @author Nick Belaevski
@@ -52,8 +52,6 @@
private static final String FUNCTION_NAME = "RichFaces.queue.setQueueOptions";
- private final RendererUtils utils = RendererUtils.getInstance();
-
private enum QueueOptions {
onbeforedomupdate, oncomplete, onerror, onevent, onrequestdequeue, onrequestqueue, onsubmit,
requestDelay, timeout, status, queueId, ignoreDupResponses, requestGroupingId
@@ -65,7 +63,7 @@
for (QueueOptions option : QueueOptions.values()) {
String optionName = option.name();
Object value = attributes.get(optionName);
- utils.addToScriptHash(optionsHash, optionName, value);
+ addToScriptHash(optionsHash, optionName, value);
}
}
Modified: trunk/ui/input/ui/src/main/java/org/richfaces/renderkit/AutocompleteRendererBase.java
===================================================================
--- trunk/ui/input/ui/src/main/java/org/richfaces/renderkit/AutocompleteRendererBase.java 2010-10-22 16:54:29 UTC (rev 19656)
+++ trunk/ui/input/ui/src/main/java/org/richfaces/renderkit/AutocompleteRendererBase.java 2010-10-24 19:11:47 UTC (rev 19657)
@@ -21,6 +21,8 @@
*/
package org.richfaces.renderkit;
+import static org.richfaces.renderkit.RenderKitUtils.addToScriptHash;
+
import java.io.IOException;
import java.sql.ResultSet;
import java.util.ArrayList;
@@ -52,8 +54,7 @@
import org.richfaces.component.AutocompleteLayout;
import org.richfaces.component.MetaComponentResolver;
import org.richfaces.component.util.InputUtils;
-import org.richfaces.renderkit.util.RendererUtils;
-import org.richfaces.renderkit.util.RendererUtils.ScriptHashVariableWrapper;
+import org.richfaces.renderkit.RenderKitUtils.ScriptHashVariableWrapper;
import com.google.common.base.Predicates;
import com.google.common.collect.Iterators;
@@ -89,32 +90,31 @@
public String getScriptOptions(UIComponent component) {
Map<String, Object> attributes = component.getAttributes();
Map<String, Object> options = new HashMap<String, Object>();
- RendererUtils utils = getUtils();
- utils.addToScriptHash(options, "buttonId", component.getClientId() + "Button");
- utils.addToScriptHash(options, "selectedItemClass", attributes.get("selectedItemClass"));
- utils.addToScriptHash(options, "minChars", attributes.get("minChars"), "1");
- utils.addToScriptHash(options, "filterFunction", attributes.get("filterFunction"));
- utils.addToScriptHash(options, "autofill", attributes.get("autofill"), "true");
- utils.addToScriptHash(options, "disabled", attributes.get("disabled"), "false");
- utils.addToScriptHash(options, "selectFirst", attributes.get("selectFirst"), "true");
- utils.addToScriptHash(options, "tokens", attributes.get("tokens"));
- utils.addToScriptHash(options, "onbegin", attributes.get("onbegin"), null, ScriptHashVariableWrapper.EVENT_HANDLER);
- utils.addToScriptHash(options, "oncomplete", attributes.get("oncomplete"), null, ScriptHashVariableWrapper.EVENT_HANDLER);
- utils.addToScriptHash(options, "onerror", attributes.get("onerror"), null, ScriptHashVariableWrapper.EVENT_HANDLER);
- utils.addToScriptHash(options, "onbeforedomupdate", attributes.get("onbeforedomupdate"), null, ScriptHashVariableWrapper.EVENT_HANDLER);
- utils.addToScriptHash(options, "onchange", attributes.get("onchange"), null, ScriptHashVariableWrapper.EVENT_HANDLER);
- utils.addToScriptHash(options, "onselectitem", attributes.get("onselectitem"), null, ScriptHashVariableWrapper.EVENT_HANDLER);
- utils.addToScriptHash(options, "onfocus", attributes.get("onfocus"), null, ScriptHashVariableWrapper.EVENT_HANDLER);
- utils.addToScriptHash(options, "onblur", attributes.get("onblur"), null, ScriptHashVariableWrapper.EVENT_HANDLER);
- utils.addToScriptHash(options, "filterFunction", getClientFilterFunction(component));
+ addToScriptHash(options, "buttonId", component.getClientId() + "Button");
+ addToScriptHash(options, "selectedItemClass", attributes.get("selectedItemClass"));
+ addToScriptHash(options, "minChars", attributes.get("minChars"), 1);
+ addToScriptHash(options, "filterFunction", attributes.get("filterFunction"));
+ addToScriptHash(options, "autofill", attributes.get("autofill"), true);
+ addToScriptHash(options, "disabled", attributes.get("disabled"), false);
+ addToScriptHash(options, "selectFirst", attributes.get("selectFirst"), true);
+ addToScriptHash(options, "tokens", attributes.get("tokens"));
+ addToScriptHash(options, "onbegin", attributes.get("onbegin"), null, ScriptHashVariableWrapper.eventHandler);
+ addToScriptHash(options, "oncomplete", attributes.get("oncomplete"), null, ScriptHashVariableWrapper.eventHandler);
+ addToScriptHash(options, "onerror", attributes.get("onerror"), null, ScriptHashVariableWrapper.eventHandler);
+ addToScriptHash(options, "onbeforedomupdate", attributes.get("onbeforedomupdate"), null, ScriptHashVariableWrapper.eventHandler);
+ addToScriptHash(options, "onchange", attributes.get("onchange"), null, ScriptHashVariableWrapper.eventHandler);
+ addToScriptHash(options, "onselectitem", attributes.get("onselectitem"), null, ScriptHashVariableWrapper.eventHandler);
+ addToScriptHash(options, "onfocus", attributes.get("onfocus"), null, ScriptHashVariableWrapper.eventHandler);
+ addToScriptHash(options, "onblur", attributes.get("onblur"), null, ScriptHashVariableWrapper.eventHandler);
+ addToScriptHash(options, "filterFunction", getClientFilterFunction(component));
String mode = (String) attributes.get("mode");
if (mode != null) {
if (mode.equals("ajax")) {
- utils.addToScriptHash(options, "isCachedAjax", false, "true");
+ addToScriptHash(options, "isCachedAjax", false, true);
} else if (mode.equals("client") || mode.equals("lazyClient")) {
- utils.addToScriptHash(options, "ajaxMode", false, "true");
+ addToScriptHash(options, "ajaxMode", false, true);
if (mode.equals("lazyClient")) {
- utils.addToScriptHash(options, "lazyClientMode", true, "false");
+ addToScriptHash(options, "lazyClientMode", true, false);
}
}
}
Modified: trunk/ui/iteration/ui/src/main/java/org/richfaces/renderkit/ExtendedDataTableRenderer.java
===================================================================
--- trunk/ui/iteration/ui/src/main/java/org/richfaces/renderkit/ExtendedDataTableRenderer.java 2010-10-22 16:54:29 UTC (rev 19656)
+++ trunk/ui/iteration/ui/src/main/java/org/richfaces/renderkit/ExtendedDataTableRenderer.java 2010-10-24 19:11:47 UTC (rev 19657)
@@ -21,6 +21,8 @@
*/
package org.richfaces.renderkit;
+import static org.richfaces.renderkit.RenderKitUtils.addToScriptHash;
+import static org.richfaces.renderkit.RenderKitUtils.renderAttribute;
import static org.richfaces.renderkit.util.AjaxRendererUtils.AJAX_FUNCTION_NAME;
import static org.richfaces.renderkit.util.AjaxRendererUtils.buildAjaxFunction;
import static org.richfaces.renderkit.util.AjaxRendererUtils.buildEventOptions;
@@ -56,8 +58,7 @@
import org.richfaces.component.util.HtmlUtil;
import org.richfaces.context.OnOffResponseWriter;
import org.richfaces.model.SelectionMode;
-import org.richfaces.renderkit.util.RendererUtils;
-import org.richfaces.renderkit.util.RendererUtils.ScriptHashVariableWrapper;
+import org.richfaces.renderkit.RenderKitUtils.ScriptHashVariableWrapper;
/**
* @author Konstantin Mishin
@@ -581,7 +582,7 @@
writer.writeAttribute(HtmlConstants.ID_ATTRIBUTE, component.getClientId(context), null);
writer.writeAttribute(HtmlConstants.CLASS_ATTRIBUTE, HtmlUtil.concatClasses("rf-edt",
(String) attributes.get("styleClass")), null);
- getUtils().writeAttribute(writer, HtmlConstants.STYLE_ATTRIBUTE, attributes.get("style"));
+ renderAttribute(context, HtmlConstants.STYLE_ATTRIBUTE, attributes.get("style"));
}
public RendererState createRowHolder(FacesContext context, UIComponent component, Object[] options) {
@@ -645,14 +646,13 @@
ajaxFunction.addParameter(eventOptions);
Map<String, Object> attributes = component.getAttributes();
Map<String, Object> options = new HashMap<String, Object>();
- RendererUtils utils = getUtils();
- utils.addToScriptHash(options, "parameters", parameters);
- utils.addToScriptHash(options, "selectionMode", attributes.get("selectionMode"),
- SelectionMode.multiple.toString());
- utils.addToScriptHash(options, "onbeforeselectionchange", RenderKitUtils.getAttributeAndBehaviorsValue(context,
- component, EVENT_ATTRIBUTES.get("onbeforeselectionchange")), null, ScriptHashVariableWrapper.EVENT_HANDLER);
- utils.addToScriptHash(options, "onselectionchange", RenderKitUtils.getAttributeAndBehaviorsValue(context,
- component, EVENT_ATTRIBUTES.get("onselectionchange")), null, ScriptHashVariableWrapper.EVENT_HANDLER);
+ addToScriptHash(options, "parameters", parameters);
+ addToScriptHash(options, "selectionMode", attributes.get("selectionMode"),
+ SelectionMode.multiple);
+ addToScriptHash(options, "onbeforeselectionchange", RenderKitUtils.getAttributeAndBehaviorsValue(context,
+ component, EVENT_ATTRIBUTES.get("onbeforeselectionchange")), null, ScriptHashVariableWrapper.eventHandler);
+ addToScriptHash(options, "onselectionchange", RenderKitUtils.getAttributeAndBehaviorsValue(context,
+ component, EVENT_ATTRIBUTES.get("onselectionchange")), null, ScriptHashVariableWrapper.eventHandler);
StringBuilder builder = new StringBuilder("new RichFaces.ExtendedDataTable('");
builder.append(component.getClientId(context)).append("', ").append(getRowCount(component))
.append(", function(event, parameters) {").append(ajaxFunction.toScript()).append(";}");
@@ -660,7 +660,7 @@
builder.append(",").append(ScriptUtils.toScript(options));
}
builder.append(");");
- utils.writeScript(context, component, builder.toString());
+ getUtils().writeScript(context, component, builder.toString());
writer.endElement(HtmlConstants.DIV_ELEM);
}
Modified: trunk/ui/iteration/ui/src/main/java/org/richfaces/renderkit/ListRendererBase.java
===================================================================
--- trunk/ui/iteration/ui/src/main/java/org/richfaces/renderkit/ListRendererBase.java 2010-10-22 16:54:29 UTC (rev 19656)
+++ trunk/ui/iteration/ui/src/main/java/org/richfaces/renderkit/ListRendererBase.java 2010-10-24 19:11:47 UTC (rev 19657)
@@ -96,11 +96,11 @@
writer.startElement(HtmlConstants.LI_ELEMENT, sequence);
if (rendererUtils.hasExplicitId(sequence)) {
- rendererUtils.writeAttribute(writer, HtmlConstants.ID_ATTRIBUTE, sequence.getClientId(context));
+ writer.writeAttribute(HtmlConstants.ID_ATTRIBUTE, sequence.getClientId(context), null);
}
- rendererUtils.writeAttribute(writer, HtmlConstants.CLASS_ATTRIBUTE,
- HtmlUtil.concatClasses(helper.getRowClass(), helper.getColumnClass(), itemClass));
+ writer.writeAttribute(HtmlConstants.CLASS_ATTRIBUTE,
+ HtmlUtil.concatClasses(helper.getRowClass(), helper.getColumnClass(), itemClass), null);
renderHandlers(context, sequence);
rendererUtils.encodeChildren(context, sequence);
writer.endElement(HtmlConstants.LI_ELEMENT);
@@ -129,11 +129,11 @@
writer.startElement(HtmlConstants.DT_ELEMENT, sequence);
if (rendererUtils.hasExplicitId(sequence)) {
- rendererUtils.writeAttribute(writer, HtmlConstants.ID_ATTRIBUTE, sequence.getClientId(context) + ".dt");
+ writer.writeAttribute(HtmlConstants.ID_ATTRIBUTE, sequence.getClientId(context) + ".dt", null);
}
- rendererUtils.writeAttribute(writer, HtmlConstants.CLASS_ATTRIBUTE,
- HtmlUtil.concatClasses(helper.getRowClass(), helper.getColumnClass(), "rf-dlst-trm"));
+ writer.writeAttribute(HtmlConstants.CLASS_ATTRIBUTE,
+ HtmlUtil.concatClasses(helper.getRowClass(), helper.getColumnClass(), "rf-dlst-trm"), null);
termFacet.encodeAll(context);
writer.endElement(HtmlConstants.DT_ELEMENT);
}
@@ -141,11 +141,11 @@
writer.startElement(HtmlConstants.DD_ELEMENT, sequence);
if (rendererUtils.hasExplicitId(sequence)) {
- rendererUtils.writeAttribute(writer, HtmlConstants.ID_ATTRIBUTE, sequence.getClientId(context));
+ writer.writeAttribute(HtmlConstants.ID_ATTRIBUTE, sequence.getClientId(context), null);
}
- rendererUtils.writeAttribute(writer, HtmlConstants.CLASS_ATTRIBUTE,
- HtmlUtil.concatClasses(helper.getRowClass(), helper.getColumnClass(), "rf-dlst-dfn"));
+ writer.writeAttribute(HtmlConstants.CLASS_ATTRIBUTE,
+ HtmlUtil.concatClasses(helper.getRowClass(), helper.getColumnClass(), "rf-dlst-dfn"), null);
renderHandlers(context, sequence);
rendererUtils.encodeChildren(context, sequence);
writer.endElement(HtmlConstants.DD_ELEMENT);
Modified: trunk/ui/misc/ui/src/main/java/org/richfaces/renderkit/JQueryRendererBase.java
===================================================================
--- trunk/ui/misc/ui/src/main/java/org/richfaces/renderkit/JQueryRendererBase.java 2010-10-22 16:54:29 UTC (rev 19656)
+++ trunk/ui/misc/ui/src/main/java/org/richfaces/renderkit/JQueryRendererBase.java 2010-10-24 19:11:47 UTC (rev 19657)
@@ -22,21 +22,13 @@
package org.richfaces.renderkit;
-import java.util.HashMap;
-import java.util.Map;
-
import javax.faces.application.ResourceDependencies;
import javax.faces.application.ResourceDependency;
import javax.faces.component.UIComponent;
import javax.faces.context.FacesContext;
import javax.faces.render.Renderer;
-import org.ajax4jsf.javascript.ScriptUtils;
-import org.richfaces.component.AbstractJQuery;
-import org.richfaces.component.JQueryAttachType;
-import org.richfaces.component.JQueryTiming;
import org.richfaces.component.util.HtmlUtil;
-import org.richfaces.renderkit.util.RendererUtils;
/**
* @author nick
@@ -48,8 +40,6 @@
})
public abstract class JQueryRendererBase extends Renderer {
- private RendererUtils rendererUtils = RendererUtils.getInstance();
-
protected String getEscapedSelector(FacesContext context, UIComponent component) {
String selector = (String) component.getAttributes().get("selector");
@@ -60,17 +50,4 @@
return selector;
}
- protected String getOptionsAsJavascriptString(FacesContext context, UIComponent component) {
- AbstractJQuery jQuery = (AbstractJQuery) component;
-
- Map<String,Object> map = new HashMap<String, Object>();
-
- rendererUtils.addToScriptHash(map, "selector", getEscapedSelector(context, jQuery));
- rendererUtils.addToScriptHash(map, "event", jQuery.getEvent());
- rendererUtils.addToScriptHash(map, "query", jQuery.getQuery());
- rendererUtils.addToScriptHash(map, "attachType", jQuery.getAttachType(), JQueryAttachType.DEFAULT.toString());
- rendererUtils.addToScriptHash(map, "timing", jQuery.getTiming(), JQueryTiming.DEFAULT.toString());
-
- return ScriptUtils.toScript(map);
- }
}
Modified: trunk/ui/misc/ui/src/main/templates/jquery.template.xml
===================================================================
--- trunk/ui/misc/ui/src/main/templates/jquery.template.xml 2010-10-22 16:54:29 UTC (rev 19656)
+++ trunk/ui/misc/ui/src/main/templates/jquery.template.xml 2010-10-24 19:11:47 UTC (rev 19657)
@@ -10,20 +10,28 @@
<cdk:component-family>org.richfaces.JQuery</cdk:component-family>
<cdk:renderer-type>org.richfaces.JQueryRenderer</cdk:renderer-type>
<cdk:renders-children>true</cdk:renders-children>
+
+ <cdk:import package="org.richfaces.component" names="JQueryAttachType JQueryTiming" />
</cc:interface>
<cc:implementation>
<span id="#{clientId}" style="display: none;">
<script type="text/javascript">
<cdk:object name="functionName" value="#{component.attributes['name']}" />
- <cdk:object name="options" value="#{getOptionsAsJavascriptString(facesContext, component)}" />
+
+ <cdk:scriptObject name="options">
+ <cdk:scriptOption name="selector" value="#{getEscapedSelector(facesContext, component)}" />
+ <cdk:scriptOption attributes="event query" />
+ <cdk:scriptOption name="attachType" value="#{component.attributes['attachType']}" defaultValue="JQueryAttachType.DEFAULT" />
+ <cdk:scriptOption name="timing" value="#{component.attributes['timing']}" defaultValue="JQueryTiming.DEFAULT" />
+ </cdk:scriptObject>
<c:choose>
<c:when test="#{not empty functionName}">
- #{functionName} = RichFaces.jQuery.createFunction(#{options});
+ #{functionName} = RichFaces.jQuery.createFunction(#{toScriptArgs(options)});
</c:when>
<c:otherwise>
- RichFaces.jQuery.query(#{options});
+ RichFaces.jQuery.query(#{toScriptArgs(options)});
</c:otherwise>
</c:choose>
</script>
Modified: trunk/ui/output/ui/src/main/java/org/richfaces/renderkit/html/PopupPanelBaseRenderer.java
===================================================================
--- trunk/ui/output/ui/src/main/java/org/richfaces/renderkit/html/PopupPanelBaseRenderer.java 2010-10-22 16:54:29 UTC (rev 19656)
+++ trunk/ui/output/ui/src/main/java/org/richfaces/renderkit/html/PopupPanelBaseRenderer.java 2010-10-24 19:11:47 UTC (rev 19657)
@@ -1,5 +1,7 @@
package org.richfaces.renderkit.html;
+import static org.richfaces.renderkit.RenderKitUtils.addToScriptHash;
+
import java.io.IOException;
import java.util.HashMap;
import java.util.HashSet;
@@ -20,7 +22,6 @@
import org.richfaces.json.JSONException;
import org.richfaces.json.JSONMap;
import org.richfaces.renderkit.RendererBase;
-import org.richfaces.renderkit.util.RendererUtils;
//TODO nick - JSF have concept of library, it should be used instead of '/' in resource names
@ResourceDependencies( {
@@ -176,35 +177,34 @@
result.append("',");
Map<String, Object> attributes = component.getAttributes();
Map<String, Object> options = new HashMap<String, Object>();
- RendererUtils utils = getUtils();
- utils.addToScriptHash(options, "width", panel.getWidth(), "-1");
- utils.addToScriptHash(options, "height", panel.getHeight(), "-1");
- utils.addToScriptHash(options, "minWidth", panel.getMinWidth(), "-1");
- utils.addToScriptHash(options, "minHeight", panel.getMinHeight(), "-1");
- utils.addToScriptHash(options, "maxWidth", panel.getMaxWidth(), "" +Integer.MAX_VALUE);
- utils.addToScriptHash(options, "maxHeight", panel.getMaxHeight(), "" +Integer.MAX_VALUE);
- utils.addToScriptHash(options, "moveable", panel.isMoveable(), "true");
- utils.addToScriptHash(options, "followByScroll", panel.isFollowByScroll(), "true");
- utils.addToScriptHash(options, "left", panel.getLeft(), "auto");
- utils.addToScriptHash(options, "top", panel.getTop(), "auto");
- utils.addToScriptHash(options, "zindex", panel.getZIndex(), "100");
- utils.addToScriptHash(options, "shadowDepth", panel.getShadowDepth(), "2");
- utils.addToScriptHash(options, "shadowOpacity", panel.getShadowOpacity(), "0.1");
- utils.addToScriptHash(options, "domElementAttachment", panel.getDomElementAttachment());
+ addToScriptHash(options, "width", panel.getWidth(), "-1");
+ addToScriptHash(options, "height", panel.getHeight(), "-1");
+ addToScriptHash(options, "minWidth", panel.getMinWidth(), "-1");
+ addToScriptHash(options, "minHeight", panel.getMinHeight(), "-1");
+ addToScriptHash(options, "maxWidth", panel.getMaxWidth(), "" +Integer.MAX_VALUE);
+ addToScriptHash(options, "maxHeight", panel.getMaxHeight(), "" +Integer.MAX_VALUE);
+ addToScriptHash(options, "moveable", panel.isMoveable(), "true");
+ addToScriptHash(options, "followByScroll", panel.isFollowByScroll(), "true");
+ addToScriptHash(options, "left", panel.getLeft(), "auto");
+ addToScriptHash(options, "top", panel.getTop(), "auto");
+ addToScriptHash(options, "zindex", panel.getZIndex(), "100");
+ addToScriptHash(options, "shadowDepth", panel.getShadowDepth(), "2");
+ addToScriptHash(options, "shadowOpacity", panel.getShadowOpacity(), "0.1");
+ addToScriptHash(options, "domElementAttachment", panel.getDomElementAttachment());
- utils.addToScriptHash(options, "keepVisualState", panel.isKeepVisualState(), "false");
- utils.addToScriptHash(options, "show", panel.isShow(), "false");
- utils.addToScriptHash(options, "modal", panel.isModal(), "true");
- utils.addToScriptHash(options, "autosized", panel.isAutosized(), "false");
- utils.addToScriptHash(options, "resizeable", panel.isResizeable(), "false");
- utils.addToScriptHash(options, "overlapEmbedObjects", panel.isOverlapEmbedObjects(), "false");
- utils.addToScriptHash(options, "visualOptions", writeVisualOptions(context, panel));
- utils.addToScriptHash(options, "onresize", buildEventFunction(attributes.get("onresize")));
- utils.addToScriptHash(options, "onmove", buildEventFunction(attributes.get("onmove")));
- utils.addToScriptHash(options, "onshow", buildEventFunction(attributes.get("onshow")));
- utils.addToScriptHash(options, "onhide", buildEventFunction(attributes.get("onhide")));
- utils.addToScriptHash(options, "onbeforeshow", buildEventFunction(attributes.get("onbeforeshow")));
- utils.addToScriptHash(options, "onbeforehide", buildEventFunction(attributes.get("onbeforehide")));
+ addToScriptHash(options, "keepVisualState", panel.isKeepVisualState(), "false");
+ addToScriptHash(options, "show", panel.isShow(), "false");
+ addToScriptHash(options, "modal", panel.isModal(), "true");
+ addToScriptHash(options, "autosized", panel.isAutosized(), "false");
+ addToScriptHash(options, "resizeable", panel.isResizeable(), "false");
+ addToScriptHash(options, "overlapEmbedObjects", panel.isOverlapEmbedObjects(), "false");
+ addToScriptHash(options, "visualOptions", writeVisualOptions(context, panel));
+ addToScriptHash(options, "onresize", buildEventFunction(attributes.get("onresize")));
+ addToScriptHash(options, "onmove", buildEventFunction(attributes.get("onmove")));
+ addToScriptHash(options, "onshow", buildEventFunction(attributes.get("onshow")));
+ addToScriptHash(options, "onhide", buildEventFunction(attributes.get("onhide")));
+ addToScriptHash(options, "onbeforeshow", buildEventFunction(attributes.get("onbeforeshow")));
+ addToScriptHash(options, "onbeforehide", buildEventFunction(attributes.get("onbeforehide")));
result.append(ScriptUtils.toScript(options));
result.append(");");
Modified: trunk/ui/output/ui/src/main/java/org/richfaces/renderkit/html/ProgressBarBaseRenderer.java
===================================================================
--- trunk/ui/output/ui/src/main/java/org/richfaces/renderkit/html/ProgressBarBaseRenderer.java 2010-10-22 16:54:29 UTC (rev 19656)
+++ trunk/ui/output/ui/src/main/java/org/richfaces/renderkit/html/ProgressBarBaseRenderer.java 2010-10-24 19:11:47 UTC (rev 19657)
@@ -27,6 +27,8 @@
package org.richfaces.renderkit.html;
+import static org.richfaces.renderkit.RenderKitUtils.addToScriptHash;
+
import java.io.IOException;
import java.io.StringWriter;
import java.util.HashMap;
@@ -202,18 +204,18 @@
String clientId = component.getClientId(context);
- utils.addToScriptHash(options, "mode", component.getAttributes().get("mode"), "ajax");
- utils.addToScriptHash(options, "minValue", component.getAttributes().get("minValue"), "0");
- utils.addToScriptHash(options, "maxValue", component.getAttributes().get("maxValue"), "100");
- utils.addToScriptHash(options, "context", getContext(component));
+ addToScriptHash(options, "mode", component.getAttributes().get("mode"), "ajax");
+ addToScriptHash(options, "minValue", component.getAttributes().get("minValue"), "0");
+ addToScriptHash(options, "maxValue", component.getAttributes().get("maxValue"), "100");
+ addToScriptHash(options, "context", getContext(component));
Integer interval = new Integer(progressBar.getInterval());
- utils.addToScriptHash(options, "pollinterval", interval);
- utils.addToScriptHash(options, "enabled", progressBar.isEnabled());
- utils.addToScriptHash(options, "pollId", progressBar.getClientId(context));
- utils.addToScriptHash(options, "state", state, "initialState");
- utils.addToScriptHash(options, "value", NumberUtils.getNumber(component.getAttributes().get("value")));
- utils.addToScriptHash(options, "onsubmit", buildEventFunction(component.getAttributes().get("onsubmit")));
+ addToScriptHash(options, "pollinterval", interval);
+ addToScriptHash(options, "enabled", progressBar.isEnabled());
+ addToScriptHash(options, "pollId", progressBar.getClientId(context));
+ addToScriptHash(options, "state", state, "initialState");
+ addToScriptHash(options, "value", NumberUtils.getNumber(component.getAttributes().get("value")));
+ addToScriptHash(options, "onsubmit", buildEventFunction(component.getAttributes().get("onsubmit")));
script.append("new RichFaces.ui.ProgressBar('").append(clientId).append("'");
if (!options.isEmpty()) {
script.append(",").append(ScriptUtils.toScript(options));
13 years, 11 months