Author: maksimkaszynski
Date: 2007-11-16 14:14:12 -0500 (Fri, 16 Nov 2007)
New Revision: 4050
Added:
trunk/sandbox/ui/contextMenu/src/main/java/org/richfaces/renderkit/html/ContextMenuContentHandler.java
trunk/sandbox/ui/contextMenu/src/main/java/org/richfaces/renderkit/html/Lifo.java
trunk/sandbox/ui/contextMenu/src/main/resources/org/
trunk/sandbox/ui/contextMenu/src/main/resources/org/richfaces/
trunk/sandbox/ui/contextMenu/src/main/resources/org/richfaces/renderkit/
trunk/sandbox/ui/contextMenu/src/main/resources/org/richfaces/renderkit/html/
trunk/sandbox/ui/contextMenu/src/main/resources/org/richfaces/renderkit/html/context-menu.js
Modified:
trunk/framework/impl/src/main/java/org/richfaces/renderkit/MacroDefinitionJSContentHandler.java
trunk/framework/impl/src/main/java/org/richfaces/renderkit/TemplateEncoderRendererBase.java
trunk/framework/impl/src/main/resources/org/richfaces/renderkit/html/scripts/utils.js
trunk/sandbox/samples/contextMenuDemo/pom.xml
trunk/sandbox/samples/contextMenuDemo/src/main/java/org/richfaces/Bean.java
trunk/sandbox/samples/contextMenuDemo/src/main/webapp/pages/index.jsp
trunk/sandbox/ui/contextMenu/src/main/java/org/richfaces/component/UIContextMenu.java
trunk/sandbox/ui/contextMenu/src/main/java/org/richfaces/renderkit/html/ContextMenuRendererBase.java
Log:
Added special content handler
Modified:
trunk/framework/impl/src/main/java/org/richfaces/renderkit/MacroDefinitionJSContentHandler.java
===================================================================
---
trunk/framework/impl/src/main/java/org/richfaces/renderkit/MacroDefinitionJSContentHandler.java 2007-11-16
19:13:18 UTC (rev 4049)
+++
trunk/framework/impl/src/main/java/org/richfaces/renderkit/MacroDefinitionJSContentHandler.java 2007-11-16
19:14:12 UTC (rev 4050)
@@ -73,9 +73,9 @@
this.epilog = epilog;
}
- private List parseExpressiion(String expressionString) throws SAXException {
+ protected List<?> parseExpressiion(String expressionString) throws SAXException {
try {
- List result = new RichMacroDefinition(new
StringReader(expressionString)).expression();
+ List<?> result = new RichMacroDefinition(new
StringReader(expressionString)).expression();
return result;
} catch (Exception e) {
@@ -90,10 +90,10 @@
this.outputWriter.write("\'\'");
}
- List parsedExpressiion = parseExpressiion(string);
+ List<?> parsedExpressiion = parseExpressiion(string);
boolean isExpression = false;
- for (Iterator iterator = parsedExpressiion.iterator(); iterator
+ for (Iterator<?> iterator = parsedExpressiion.iterator(); iterator
.hasNext();) {
Object next = (Object) iterator.next();
if (next instanceof Expression) {
@@ -107,7 +107,7 @@
}
boolean first = true;
- for (Iterator iterator = parsedExpressiion.iterator(); iterator
+ for (Iterator<?> iterator = parsedExpressiion.iterator(); iterator
.hasNext();) {
Object next = (Object) iterator.next();
@@ -155,9 +155,9 @@
outputWriter = new WellFormedWriter(oldWriter);
try {
- List parsedExpression = parseExpressiion(new String(ch, start,
+ List<?> parsedExpression = parseExpressiion(new String(ch, start,
length));
- for (Iterator iterator = parsedExpression.iterator(); iterator
+ for (Iterator<?> iterator = parsedExpression.iterator(); iterator
.hasNext();) {
Object next = iterator.next();
Modified:
trunk/framework/impl/src/main/java/org/richfaces/renderkit/TemplateEncoderRendererBase.java
===================================================================
---
trunk/framework/impl/src/main/java/org/richfaces/renderkit/TemplateEncoderRendererBase.java 2007-11-16
19:13:18 UTC (rev 4049)
+++
trunk/framework/impl/src/main/java/org/richfaces/renderkit/TemplateEncoderRendererBase.java 2007-11-16
19:14:12 UTC (rev 4050)
@@ -7,6 +7,7 @@
import java.io.InputStream;
import java.io.StringReader;
import java.io.StringWriter;
+import java.io.Writer;
import java.util.Properties;
import javax.faces.component.UIComponent;
@@ -26,11 +27,11 @@
import org.ajax4jsf.webapp.tidy.TidyParser;
import org.ajax4jsf.webapp.tidy.TidyXMLFilter;
import org.richfaces.component.TemplateComponent;
-import org.richfaces.json.JSContentHandler;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
+import org.xml.sax.ContentHandler;
/**
* @author Nick Belaevski - mailto:nbelaevski@exadel.com
@@ -95,7 +96,7 @@
transformer.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "yes");
transformer.setOutputProperty(OutputKeys.METHOD, "xml");
- JSContentHandler contentHandler = new MacroDefinitionJSContentHandler(writer,
"Richfaces.evalMacro(\"", "\", context)");
+ ContentHandler contentHandler = createContentHandler(writer);
Result result = new SAXResult(contentHandler);
for (int i = 0; i < bodyChildrenLength; i++) {
@@ -158,4 +159,9 @@
writer.write(";\n new Insertion.Top($('" + component.getClientId(context)
+ "'), evaluator.invoke('getContent', window).join(''));");
writer.endElement("script");
}
+
+
+ protected ContentHandler createContentHandler(Writer writer) {
+ return new MacroDefinitionJSContentHandler(writer,
"Richfaces.evalMacro(\"", "\", context)");
+ }
}
Modified:
trunk/framework/impl/src/main/resources/org/richfaces/renderkit/html/scripts/utils.js
===================================================================
---
trunk/framework/impl/src/main/resources/org/richfaces/renderkit/html/scripts/utils.js 2007-11-16
19:13:18 UTC (rev 4049)
+++
trunk/framework/impl/src/main/resources/org/richfaces/renderkit/html/scripts/utils.js 2007-11-16
19:14:12 UTC (rev 4050)
@@ -175,6 +175,18 @@
return value;
};
+Richfaces.interpolate = function (placeholders, context) {
+
+ for(var k in context) {
+ var v = context[k];
+ var regexp = new RegExp("\\{" + k + "\\}", "g");
+ placeholders = placeholders.replace(regexp, v);
+ }
+
+ return placeholders;
+
+};
+
if (!Richfaces.position) Richfaces.Position={};
Richfaces.Position.setElementPosition = function(element, baseElement, jointPoint,
direction, offset)
Modified: trunk/sandbox/samples/contextMenuDemo/pom.xml
===================================================================
--- trunk/sandbox/samples/contextMenuDemo/pom.xml 2007-11-16 19:13:18 UTC (rev 4049)
+++ trunk/sandbox/samples/contextMenuDemo/pom.xml 2007-11-16 19:14:12 UTC (rev 4050)
@@ -5,7 +5,7 @@
<version>3.2.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
- <groupId>org.richfaces</groupId>
+ <groupId>org.richfaces.sandbox.samples</groupId>
<artifactId>contextMenuDemo</artifactId>
<packaging>war</packaging>
<name>contextMenuDemo Maven Webapp</name>
Modified: trunk/sandbox/samples/contextMenuDemo/src/main/java/org/richfaces/Bean.java
===================================================================
--- trunk/sandbox/samples/contextMenuDemo/src/main/java/org/richfaces/Bean.java 2007-11-16
19:13:18 UTC (rev 4049)
+++ trunk/sandbox/samples/contextMenuDemo/src/main/java/org/richfaces/Bean.java 2007-11-16
19:14:12 UTC (rev 4050)
@@ -24,6 +24,8 @@
import java.util.ArrayList;
import java.util.List;
+import javax.faces.event.ActionEvent;
+
/**
* @author k
*
@@ -60,6 +62,16 @@
private List<Pair> model = new ArrayList<Pair>();
+ private String param;
+
+ public String getParam() {
+ return param;
+ }
+
+ public void setParam(String param) {
+ this.param = param;
+ }
+
public Bean() {
for (int i = 0; i < 100; i++) {
model.add(new Pair(i));
@@ -73,5 +85,15 @@
public void setModel(List<Pair> model) {
this.model = model;
}
+
+ public void actionListener(ActionEvent event) {
+ System.out.println("Bean.actionListener()" + event.getComponent());
+ }
+
+ public void action() {
+ System.out.println("Bean.action()" + param);
+ }
+
+
}
\ No newline at end of file
Modified: trunk/sandbox/samples/contextMenuDemo/src/main/webapp/pages/index.jsp
===================================================================
--- trunk/sandbox/samples/contextMenuDemo/src/main/webapp/pages/index.jsp 2007-11-16
19:13:18 UTC (rev 4049)
+++ trunk/sandbox/samples/contextMenuDemo/src/main/webapp/pages/index.jsp 2007-11-16
19:14:12 UTC (rev 4050)
@@ -1,5 +1,6 @@
<%@ taglib
uri="http://java.sun.com/jsf/html" prefix="h" %>
<%@ taglib
uri="http://java.sun.com/jsf/core" prefix="f"%>
+<%@ taglib
uri="http://richfaces.org/a4j" prefix="a4j" %>
<%@ taglib
uri="http://labs.jboss.com/jbossrichfaces/ui/dataTable"
prefix="dt"%>
<%@ taglib
uri="http://labs.jboss.com/jbossrichfaces/ui/ui/contextMenu"
prefix="cm"%>
<%@ taglib
uri="http://labs.jboss.com/jbossrichfaces/ui/menu-components"
prefix="mc" %>
@@ -23,15 +24,24 @@
<h:form>
<h:panelGroup id="outputText">
<h:outputText value="Right Click Here" />
- <cm:contextMenu submitMode="none">
- <mc:menuItem id="menuItem11" value="Active11:
ajax" submitMode="ajax" />
- <mc:menuItem id="menuItem12" value="Active12"
immediate="true"/>
- <mc:menuItem id="menuItem14"
value="Active14"/>
+ <cm:contextMenu submitMode="ajax">
+ <mc:menuItem id="menuItem11"
action="#{bean.action}" value="Active11: ajax"
submitMode="ajax" actionListener="#{bean.actionListener}">
+ <a4j:actionparam assignTo="#{bean.param}"
name="param" value="{param}"></a4j:actionparam>
+ </mc:menuItem>
+ <mc:menuItem id="menuItem12"
action="#{bean.action}" value="Active12" immediate="true"
actionListener="#{bean.actionListener}">
+ <a4j:actionparam assignTo="#{bean.param}"
name="param" value="{param}"></a4j:actionparam>
+ </mc:menuItem>
+ <mc:menuItem id="menuItem14"
action="#{bean.action}" value="Active14"
actionListener="#{bean.actionListener}">
+ <a4j:actionparam assignTo="#{bean.param}"
name="param" value="{param}"></a4j:actionparam>
+ </mc:menuItem>
<mc:menuSeparator id="menuSeparator11"/>
- <mc:menuItem id="menuItem16" value="Disable16"
disabled="true"/>
- <mc:menuItem id="menuItem17" value="">
+ <mc:menuItem id="menuItem16"
action="#{bean.action}" value="Disable16" disabled="true"
actionListener="#{bean.actionListener}">
+ <a4j:actionparam assignTo="#{bean.param}"
name="param" value="{param}"></a4j:actionparam>
+ </mc:menuItem>
+ <mc:menuItem id="menuItem17"
action="#{bean.action}" actionListener="#{bean.actionListener}">
+ <a4j:actionparam assignTo="#{bean.param}"
name="param" value="{param}"></a4j:actionparam>
<h:inputText value="xXx"/>
</mc:menuItem>
</cm:contextMenu>
Modified:
trunk/sandbox/ui/contextMenu/src/main/java/org/richfaces/component/UIContextMenu.java
===================================================================
---
trunk/sandbox/ui/contextMenu/src/main/java/org/richfaces/component/UIContextMenu.java 2007-11-16
19:13:18 UTC (rev 4049)
+++
trunk/sandbox/ui/contextMenu/src/main/java/org/richfaces/component/UIContextMenu.java 2007-11-16
19:14:12 UTC (rev 4050)
@@ -29,5 +29,9 @@
*/
public abstract class UIContextMenu extends UIComponentBase implements MenuComponent {
public static final String COMPONENT_TYPE = "org.richfaces.ContextMenu";
+
+ public abstract boolean isAttached();
+
+ public abstract void setAttached(boolean b);
}
Added:
trunk/sandbox/ui/contextMenu/src/main/java/org/richfaces/renderkit/html/ContextMenuContentHandler.java
===================================================================
---
trunk/sandbox/ui/contextMenu/src/main/java/org/richfaces/renderkit/html/ContextMenuContentHandler.java
(rev 0)
+++
trunk/sandbox/ui/contextMenu/src/main/java/org/richfaces/renderkit/html/ContextMenuContentHandler.java 2007-11-16
19:14:12 UTC (rev 4050)
@@ -0,0 +1,119 @@
+/**
+ * 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 java.io.IOException;
+import java.io.Writer;
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+
+import org.ajax4jsf.renderkit.RendererUtils.HTML;
+import org.richfaces.renderkit.MacroDefinitionJSContentHandler;
+import org.xml.sax.Attributes;
+import org.xml.sax.SAXException;
+
+/**
+ * @author Maksim Kaszynski
+ *
+ */
+public class ContextMenuContentHandler extends MacroDefinitionJSContentHandler {
+
+
+ private static final Set<String> INTERPOLATED_ATTRIBUTES = new
HashSet<String>();
+
+ static {
+ String[] attrs = {
+ HTML.onblur_ATTRIBUTE,
+ HTML.onchange_ATTRIBUTE,
+ HTML.onclick_ATTRIBUTE,
+ HTML.onfocus_ATTRIBUTE,
+ HTML.onkeydown_ATTRIBUTE,
+ HTML.onkeypress_ATTRIBUTE,
+ HTML.onkeyup_ATTRIBUTE,
+ HTML.onmousedown_ATTRIBUTE,
+ HTML.onmousemove_ATTRIBUTE,
+ HTML.onmouseout_ATTRIBUTE,
+ HTML.onmouseover_ATTRIBUTE,
+ HTML.onmouseup_ATTRIBUTE,
+ HTML.onselect_ATTRIBUTE
+ };
+
+ for (String string : attrs) {
+ INTERPOLATED_ATTRIBUTES.add(string);
+ }
+ }
+
+ private Lifo<String> elementStack = new Lifo<String>();
+
+
+ /**
+ * @param writer
+ * @param prolog
+ * @param epilog
+ */
+ public ContextMenuContentHandler(Writer writer, String prolog, String epilog) {
+ super(writer, prolog, epilog);
+ }
+
+ @Override
+ public void startElement(String uri, String localName, String name,
+ Attributes attributes) throws SAXException {
+ elementStack.push(localName);
+ super.startElement(uri, localName, name, attributes);
+ }
+
+ @Override
+ public void endElement(String uri, String localName, String name)
+ throws SAXException {
+ elementStack.pop();
+ super.endElement(uri, localName, name);
+ }
+
+ @Override
+ protected List<?> parseExpressiion(String expressionString)
+ throws SAXException {
+
+ if (HTML.SCRIPT_ELEM.equals(elementStack.peek())) {
+ return Collections.singletonList(expressionString);
+ } else {
+ return super.parseExpressiion(expressionString);
+ }
+ }
+
+ @Override
+ protected void encodeAttributeValue(Attributes attributes, int idx)
+ throws SAXException, IOException {
+
+ if (INTERPOLATED_ATTRIBUTES.contains(attributes.getQName(idx))) {
+ outputWriter.write("function (context) { return
Richfaces.interpolate(\"");
+
+ String value = attributes.getValue(idx);
+ outputWriter.write(value);
+ outputWriter.write("\", context);}");
+ } else {
+ super.encodeAttributeValue(attributes, idx);
+ }
+
+ }
+}
Modified:
trunk/sandbox/ui/contextMenu/src/main/java/org/richfaces/renderkit/html/ContextMenuRendererBase.java
===================================================================
---
trunk/sandbox/ui/contextMenu/src/main/java/org/richfaces/renderkit/html/ContextMenuRendererBase.java 2007-11-16
19:13:18 UTC (rev 4049)
+++
trunk/sandbox/ui/contextMenu/src/main/java/org/richfaces/renderkit/html/ContextMenuRendererBase.java 2007-11-16
19:14:12 UTC (rev 4050)
@@ -22,6 +22,7 @@
package org.richfaces.renderkit.html;
import java.io.IOException;
+import java.io.Writer;
import javax.faces.component.UIComponent;
import javax.faces.context.FacesContext;
@@ -30,6 +31,7 @@
import org.ajax4jsf.renderkit.RendererUtils.HTML;
import org.ajax4jsf.resource.InternetResource;
import org.richfaces.renderkit.TemplateEncoderRendererBase;
+import org.xml.sax.ContentHandler;
/**
* @author Maksim Kaszynski
@@ -42,7 +44,10 @@
new ContextMenuRendererDelegate();
private final InternetResource[] ownScripts = {
- getResource("/org/richfaces/renderkit/html/scripts/json/json-dom.js")
+ getResource("/org/richfaces/renderkit/html/scripts/json/json-dom.js"),
+ getResource("/org/richfaces/renderkit/html/scripts/utils.js"),
+ getResource("/org/richfaces/renderkit/html/scripts/context-menu.js")
+
};
private final InternetResource[] scripts;
@@ -84,10 +89,27 @@
delegate.encodeChildren(context, component);
}
+
+ public void encodeChildren(FacesContext context, UIComponent component)
+ throws IOException {
+ ResponseWriter writer = context.getResponseWriter();
+ writer.startElement("script", component);
+ writer.write("var evaluator = ");
+ writeScriptBody(context, component, true);
+ writer.write(";\n new Insertion.Top($('" + component.getClientId(context)
+ "'), evaluator.invoke('getContent', window).join(''));");
+ writer.endElement("script");
+ }
+
+
@Override
protected void doEncodeEnd(ResponseWriter writer, FacesContext context,
UIComponent component) throws IOException {
writer.endElement(HTML.DIV_ELEM);
}
+
+ @Override
+ protected ContentHandler createContentHandler(Writer writer) {
+ return new ContextMenuContentHandler(writer, "Richfaces.evalMacro(\"",
"\", context)");
+ }
}
Added: trunk/sandbox/ui/contextMenu/src/main/java/org/richfaces/renderkit/html/Lifo.java
===================================================================
--- trunk/sandbox/ui/contextMenu/src/main/java/org/richfaces/renderkit/html/Lifo.java
(rev 0)
+++
trunk/sandbox/ui/contextMenu/src/main/java/org/richfaces/renderkit/html/Lifo.java 2007-11-16
19:14:12 UTC (rev 4050)
@@ -0,0 +1,63 @@
+/**
+ * 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;
+
+public class Lifo<T> {
+
+ private class Element {
+ private T content;
+ private Element next;
+
+ public Element(Element next, T content) {
+ super();
+ this.next = next;
+ this.content = content;
+ }
+
+ }
+
+ private Element top = null;
+
+ public void push(T element) {
+ top = new Element(top, element);
+ }
+
+ public T pop() {
+ if (top == null) {
+ return null;
+ }
+
+ Element e = top;
+ top = top.next;
+
+ return e.content;
+ }
+
+ public T peek() {
+ if (top == null) {
+ return null;
+ }
+
+ return top.content;
+ }
+
+}
\ No newline at end of file
Added:
trunk/sandbox/ui/contextMenu/src/main/resources/org/richfaces/renderkit/html/context-menu.js
===================================================================
---
trunk/sandbox/ui/contextMenu/src/main/resources/org/richfaces/renderkit/html/context-menu.js
(rev 0)
+++
trunk/sandbox/ui/contextMenu/src/main/resources/org/richfaces/renderkit/html/context-menu.js 2007-11-16
19:14:12 UTC (rev 4050)
@@ -0,0 +1,4 @@
+if (!window.Richfaces) var Richfaces = {};
+Richfaces.ContextMenu = {
+ //show
+};
\ No newline at end of file