JBoss Rich Faces SVN: r4664 - branches/3.1.x/ui/listShuttle/src/test/java/org/richfaces/renderkit.
by richfaces-svn-commits@lists.jboss.org
Author: sergeyhalipov
Date: 2007-12-10 11:25:41 -0500 (Mon, 10 Dec 2007)
New Revision: 4664
Modified:
branches/3.1.x/ui/listShuttle/src/test/java/org/richfaces/renderkit/ListShuttleRenderingTest.java
Log:
http://jira.jboss.com/jira/browse/RF-1178
Modified: branches/3.1.x/ui/listShuttle/src/test/java/org/richfaces/renderkit/ListShuttleRenderingTest.java
===================================================================
--- branches/3.1.x/ui/listShuttle/src/test/java/org/richfaces/renderkit/ListShuttleRenderingTest.java 2007-12-10 16:20:51 UTC (rev 4663)
+++ branches/3.1.x/ui/listShuttle/src/test/java/org/richfaces/renderkit/ListShuttleRenderingTest.java 2007-12-10 16:25:41 UTC (rev 4664)
@@ -67,7 +67,6 @@
javaScripts.add("scripts/LayoutManager.js");
javaScripts.add("scripts/Control.js");
javaScripts.add("scripts/OrderingList.js");
- javaScripts.add("scripts/extend/extend.js");
javaScripts.add("scripts/ListShuttle.js");
javaScripts.add("scripts/ListBase.js");
@@ -157,7 +156,6 @@
public void testCommonRendering() throws Exception{
HtmlPage view = renderView();
assertNotNull(view);
- System.out.println(view.asXml());
HtmlElement table = view.getHtmlElementById(listShuttle.getClientId(facesContext));
assertNotNull(table);
@@ -169,7 +167,13 @@
HtmlElement tr = (HtmlElement) tbody.getFirstChild();
assertNotNull(tr);
+ String style = tr.getAttributeValue("style");
+ assertNotNull(style);
+ assertTrue(style.contains("display: none;"));
assertEquals("tr", tr.getTagName());
+
+ tr = (HtmlElement) tr.getNextSibling();
+ assertNotNull(tr);
assertNull(tr.getNextSibling());
int childCount = 0;
@@ -193,7 +197,7 @@
inputs = view.getDocumentElement().getHtmlElementsByAttribute("input", "name", listShuttle.getClientId(facesContext));
assertNotNull(inputs);
- assertEquals(2, inputs.size());
+ assertEquals(4, inputs.size());
}
/**
@@ -231,7 +235,7 @@
assertTrue(found);
}
}
- assertEquals(foundCount, javaScripts.size());
+ assertEquals(javaScripts.size(), foundCount);
}
/**
@@ -265,8 +269,8 @@
List images = view.getDocumentElement().getHtmlElementsByTagName("img");
assertNotNull(images);
- assertEquals(IMAGE_COUNT, images.size());
+ int foundImages = 0;
for (Iterator it = images.iterator(); it.hasNext(); ) {
HtmlElement img = (HtmlElement) it.next();
assertNotNull(img);
@@ -276,21 +280,31 @@
assertNotNull(page);
assertTrue(page.getWebResponse().getStatusCode() == HttpServletResponse.SC_OK);
- HtmlElement div = (HtmlElement) img.getParentNode();
- assertNotNull(div);
- assertEquals("div", div.getNodeName());
+ if (uri.contains("spacer.gif")) {
+ continue;
+ }
+ foundImages++;
- div = (HtmlElement) div.getParentNode();
- assertNotNull(div);
- assertEquals("div", div.getNodeName());
+ HtmlElement element = (HtmlElement) img.getParentNode();
+ assertNotNull(element);
+ assertEquals("div", element.getNodeName());
- div = (HtmlElement) div.getParentNode();
- assertNotNull(div);
- assertEquals("div", div.getNodeName());
- String clazz = div.getAttributeValue("class");
+ element = (HtmlElement) element.getParentNode();
+ assertNotNull(element);
+ assertEquals("a", element.getNodeName());
+
+ element = (HtmlElement) element.getParentNode();
+ assertNotNull(element);
+ assertEquals("div", element.getNodeName());
+
+ element = (HtmlElement) element.getParentNode();
+ assertNotNull(element);
+ assertEquals("div", element.getNodeName());
+ String clazz = element.getAttributeValue("class");
assertNotNull(clazz);
assertTrue(clazz.contains("rich-shuttle-control"));
}
+ assertEquals(IMAGE_COUNT, foundImages);
}
/**
16 years, 10 months
JBoss Rich Faces SVN: r4663 - in branches/3.1.x/samples/richfaces-demo/src/main: webapp/WEB-INF and 1 other directories.
by richfaces-svn-commits@lists.jboss.org
Author: ilya_shaikovsky
Date: 2007-12-10 11:20:51 -0500 (Mon, 10 Dec 2007)
New Revision: 4663
Added:
branches/3.1.x/samples/richfaces-demo/src/main/java/org/richfaces/demo/listShuttle/Converter.java
Modified:
branches/3.1.x/samples/richfaces-demo/src/main/java/org/richfaces/demo/listShuttle/ToolBar.java
branches/3.1.x/samples/richfaces-demo/src/main/java/org/richfaces/demo/listShuttle/ToolBarItem.java
branches/3.1.x/samples/richfaces-demo/src/main/webapp/WEB-INF/faces-config.xml
branches/3.1.x/samples/richfaces-demo/src/main/webapp/richfaces/listShuttle/examples/toolBarCustomization.xhtml
Log:
http://jira.jboss.com/jira/browse/RF-1181
Added: branches/3.1.x/samples/richfaces-demo/src/main/java/org/richfaces/demo/listShuttle/Converter.java
===================================================================
--- branches/3.1.x/samples/richfaces-demo/src/main/java/org/richfaces/demo/listShuttle/Converter.java (rev 0)
+++ branches/3.1.x/samples/richfaces-demo/src/main/java/org/richfaces/demo/listShuttle/Converter.java 2007-12-10 16:20:51 UTC (rev 4663)
@@ -0,0 +1,23 @@
+package org.richfaces.demo.listShuttle;
+
+import javax.faces.component.UIComponent;
+import javax.faces.context.FacesContext;
+
+public class Converter implements javax.faces.convert.Converter{
+
+ public Object getAsObject(FacesContext context, UIComponent component,
+ String value) {
+
+ int index = value.indexOf(':');
+
+ return new ToolBarItem(value.substring(0, index), value.substring(index + 1));
+ }
+
+ public String getAsString(FacesContext context, UIComponent component,
+ Object value) {
+
+ ToolBarItem optionItem = (ToolBarItem) value;
+ return optionItem.getLabel() + ":" + optionItem.getType();
+ }
+
+}
\ No newline at end of file
Modified: branches/3.1.x/samples/richfaces-demo/src/main/java/org/richfaces/demo/listShuttle/ToolBar.java
===================================================================
--- branches/3.1.x/samples/richfaces-demo/src/main/java/org/richfaces/demo/listShuttle/ToolBar.java 2007-12-10 16:10:40 UTC (rev 4662)
+++ branches/3.1.x/samples/richfaces-demo/src/main/java/org/richfaces/demo/listShuttle/ToolBar.java 2007-12-10 16:20:51 UTC (rev 4663)
@@ -19,6 +19,14 @@
item.setType("label");
item.setLabel("Close");
items.add(item);
+ item = new ToolBarItem();
+ item.setType("label");
+ item.setLabel("Import");
+ freeItems.add(item);
+ item = new ToolBarItem();
+ item.setType("label");
+ item.setLabel("Export");
+ freeItems.add(item);
}
public List<ToolBarItem> getItems() {
Modified: branches/3.1.x/samples/richfaces-demo/src/main/java/org/richfaces/demo/listShuttle/ToolBarItem.java
===================================================================
--- branches/3.1.x/samples/richfaces-demo/src/main/java/org/richfaces/demo/listShuttle/ToolBarItem.java 2007-12-10 16:10:40 UTC (rev 4662)
+++ branches/3.1.x/samples/richfaces-demo/src/main/java/org/richfaces/demo/listShuttle/ToolBarItem.java 2007-12-10 16:20:51 UTC (rev 4663)
@@ -3,7 +3,16 @@
public class ToolBarItem {
private String type;
private String label;
-private String icon;
+
+public ToolBarItem() {
+ // TODO Auto-generated constructor stub
+}
+
+public ToolBarItem(String label, String type) {
+ setLabel(label);
+ setType(type);
+}
+
public String getType() {
return type;
}
@@ -16,10 +25,35 @@
public void setLabel(String label) {
this.label = label;
}
-public String getIcon() {
- return icon;
+
+public int hashCode() {
+ final int prime = 31;
+ int result = 1;
+ result = prime * result + ((label == null) ? 0 : label.hashCode());
+ result = prime * result + ((type == null) ? 0 : type.hashCode());
+ return result;
}
-public void setIcon(String icon) {
- this.icon = icon;
+
+public boolean equals(Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ final ToolBarItem other = (ToolBarItem) obj;
+ if (label == null) {
+ if (other.label != null)
+ return false;
+ } else if (!label.equals(other.label))
+ return false;
+ if (type == null) {
+ if (other.type != null)
+ return false;
+ } else if (!type.equals(other.type))
+ return false;
+ return true;
}
+
+
}
Modified: branches/3.1.x/samples/richfaces-demo/src/main/webapp/WEB-INF/faces-config.xml
===================================================================
--- branches/3.1.x/samples/richfaces-demo/src/main/webapp/WEB-INF/faces-config.xml 2007-12-10 16:10:40 UTC (rev 4662)
+++ branches/3.1.x/samples/richfaces-demo/src/main/webapp/WEB-INF/faces-config.xml 2007-12-10 16:20:51 UTC (rev 4663)
@@ -2,6 +2,10 @@
<!DOCTYPE faces-config PUBLIC "-//Sun Microsystems, Inc.//DTD JavaServer Faces Config 1.0//EN"
"http://java.sun.com/dtd/web-facesconfig_1_0.dtd">
<faces-config>
+ <converter>
+ <converter-id>listShuttleconverter</converter-id>
+ <converter-class>org.richfaces.demo.listShuttle.Converter</converter-class>
+ </converter>
<managed-bean>
<managed-bean-name>skinBean</managed-bean-name>
<managed-bean-class>org.richfaces.demo.common.SkinBean</managed-bean-class>
Modified: branches/3.1.x/samples/richfaces-demo/src/main/webapp/richfaces/listShuttle/examples/toolBarCustomization.xhtml
===================================================================
--- branches/3.1.x/samples/richfaces-demo/src/main/webapp/richfaces/listShuttle/examples/toolBarCustomization.xhtml 2007-12-10 16:10:40 UTC (rev 4662)
+++ branches/3.1.x/samples/richfaces-demo/src/main/webapp/richfaces/listShuttle/examples/toolBarCustomization.xhtml 2007-12-10 16:20:51 UTC (rev 4663)
@@ -6,25 +6,28 @@
xmlns:rich="http://richfaces.org/rich"
xmlns:c="http://java.sun.com/jstl/core">
<h:form>
- <rich:toolBar id="toolBar">
+ <rich:toolBar id="toolBar" itemSeparator="line">
<c:forEach items="#{toolBar.items}" var="item">
<h:outputLink value="#">
<h:outputText value="#{item.label}"></h:outputText>
</h:outputLink>
</c:forEach>
</rich:toolBar>
-
<rich:spacer height="20"></rich:spacer>
- <rich:listShuttle sourceValue="#{toolBar.freeItems}" targetValue="#{toolBar.items}" var="items" listHeight="300px">
+ <rich:listShuttle sourceValue="#{toolBar.freeItems}" targetValue="#{toolBar.items}" var="items" listHeight="300px" sourceCaptionLabel="Available Items" targetCaptionLabel="Currently Active Items" converter="listShuttleconverter">
<rich:column>
+ <f:facet name="header">
+ <h:outputText value="Items List"></h:outputText>
+ </f:facet>
<h:outputText value="#{items.label}"></h:outputText>
</rich:column>
+ <a4j:support event="onorderchanged" reRender="toolBar"></a4j:support>
</rich:listShuttle>
<rich:spacer height="20"></rich:spacer>
<h:commandButton value="Update Toolbar" reRender="toolBar"/>
-
+ <rich:messages></rich:messages>
</h:form>
</ui:composition>
\ No newline at end of file
16 years, 10 months
JBoss Rich Faces SVN: r4662 - trunk/sandbox/ui/columns/src/main/java/org/richfaces/taglib/html/facelets.
by richfaces-svn-commits@lists.jboss.org
Author: andrei_exadel
Date: 2007-12-10 11:10:40 -0500 (Mon, 10 Dec 2007)
New Revision: 4662
Modified:
trunk/sandbox/ui/columns/src/main/java/org/richfaces/taglib/html/facelets/ColumnsHandler.java
Log:
RF-1201 refactoring
Modified: trunk/sandbox/ui/columns/src/main/java/org/richfaces/taglib/html/facelets/ColumnsHandler.java
===================================================================
--- trunk/sandbox/ui/columns/src/main/java/org/richfaces/taglib/html/facelets/ColumnsHandler.java 2007-12-10 15:56:23 UTC (rev 4661)
+++ trunk/sandbox/ui/columns/src/main/java/org/richfaces/taglib/html/facelets/ColumnsHandler.java 2007-12-10 16:10:40 UTC (rev 4662)
@@ -50,37 +50,7 @@
/** index attribute */
private TagAttribute index;
-
- /** colspan attribute */
- private TagAttribute colspan;
-
- /** rowspan attribute */
- private TagAttribute rowspan;
-
- /** breakBefore attribute */
- private TagAttribute breakBefore;
-
- /** headerClass attribute */
- private TagAttribute headerClass;
-
- /** footerClass attribute */
- private TagAttribute footerClass;
-
- /** width attribute */
- private TagAttribute width;
-
- /** sortable attribute */
- private TagAttribute sortable;
-
- /** sortExpression attribute */
- private TagAttribute sortExpression;
-
- /** style attribute */
- private TagAttribute style;
-
- /** styleClass attribute */
- private TagAttribute styleClass;
-
+
/** rendered attribute */
private TagAttribute rendered;
@@ -118,21 +88,9 @@
*/
public ColumnsHandler(ComponentConfig config) {
super(config);
- this.breakBefore = getAttribute("breakBefore");
this.value = getAttribute("value");
this.var = getAttribute("var");
this.index = getAttribute("index");
- this.rowspan = getAttribute("rowspan");
- this.colspan = getAttribute("colspan");
- this.headerClass = getAttribute("headerClass");
- this.footerClass = getAttribute("footerClass");
- this.width = getAttribute("width");
- this.sortable = getAttribute("sortable");
- this.sortExpression = getAttribute("sortExpression");
- this.style = getAttribute("style");
- this.styleClass = getAttribute("styleClass");
-
- // TODO Auto-generated constructor stub
}
/**
@@ -290,7 +248,6 @@
try {
if (hasNext()) {
next(ctx);
- initColumn(ctx, c);
super.apply(ctx, parent);
} else {
vCounter = 1;
@@ -403,28 +360,8 @@
}
+
/**
- * Inits created column by this tag attributes
- *
- * @param ctx
- * @param column
- */
- private void initColumn(FaceletContext ctx, UIComponent column) {
- setColumnAttribute(width, column, ctx);
- setColumnAttribute(colspan, column, ctx);
- setColumnAttribute(rowspan, column, ctx);
- setColumnAttribute(style, column, ctx);
- setColumnAttribute(styleClass, column, ctx);
- setColumnAttribute(breakBefore, column, ctx);
- setColumnAttribute(headerClass, column, ctx);
- setColumnAttribute(footerClass, column, ctx);
- setColumnAttribute(sortable, column, ctx);
- setColumnAttribute(sortExpression, column, ctx);
- setColumnAttribute(rendered, column, ctx);
-
- }
-
- /**
* Sets attribute to column
*
* @param attr
16 years, 10 months
JBoss Rich Faces SVN: r4661 - in branches/3.1.x/ui/orderingList/src/test/java/org/richfaces: renderkit and 1 other directory.
by richfaces-svn-commits@lists.jboss.org
Author: sergeyhalipov
Date: 2007-12-10 10:56:23 -0500 (Mon, 10 Dec 2007)
New Revision: 4661
Modified:
branches/3.1.x/ui/orderingList/src/test/java/org/richfaces/component/OrderingListComponentTest.java
branches/3.1.x/ui/orderingList/src/test/java/org/richfaces/renderkit/OrderingListRenderingTest.java
Log:
Tests for ordering list was changed.
Modified: branches/3.1.x/ui/orderingList/src/test/java/org/richfaces/component/OrderingListComponentTest.java
===================================================================
--- branches/3.1.x/ui/orderingList/src/test/java/org/richfaces/component/OrderingListComponentTest.java 2007-12-10 15:17:50 UTC (rev 4660)
+++ branches/3.1.x/ui/orderingList/src/test/java/org/richfaces/component/OrderingListComponentTest.java 2007-12-10 15:56:23 UTC (rev 4661)
@@ -61,7 +61,7 @@
private UIForm form = null;
private UIOrderingList orderingList = null;
- private OrderingListBean bean = null;
+ private List valueList = null;
private UICommand command = null;
private UIOrderingList orderingList2 = null;
@@ -78,7 +78,9 @@
command.setId("command");
form.getChildren().add(command);
- bean = new OrderingListBean();
+ valueList = new ArrayList();
+ valueList.add("1");
+ valueList.add("2");
orderingList = (UIOrderingList)application.createComponent("org.richfaces.OrderingList");
orderingList.setControlsType("link");
@@ -87,12 +89,12 @@
public Class getType(FacesContext arg0) throws EvaluationException,
PropertyNotFoundException {
- return String.class;
+ return List.class;
}
public Object getValue(FacesContext arg0)
throws EvaluationException, PropertyNotFoundException {
- return bean.getValue();
+ return valueList;
}
public boolean isReadOnly(FacesContext arg0)
@@ -103,18 +105,27 @@
public void setValue(FacesContext arg0, Object arg1)
throws EvaluationException, PropertyNotFoundException {
assertTrue(arg1 instanceof List);
- bean.setValue((List)arg1);
+ valueList = (List)arg1;
}
});
+ orderingList.addValidator(new Validator() {
+
+ public void validate(FacesContext arg0, UIComponent arg1,
+ Object arg2) throws ValidatorException {
+ // Fake validator.
+ }
+
+ });
+
form.getChildren().add(orderingList);
orderingList2 = (UIOrderingList)application.createComponent("org.richfaces.OrderingList");
}
public void tearDown() throws Exception {
- bean = null;
+ valueList = null;
orderingList = null;
orderingList2 = null;
command = null;
@@ -135,18 +146,15 @@
HtmlAnchor anchor = (HtmlAnchor)page.getDocumentElement().getHtmlElementById(command.getClientId(facesContext));
anchor.click();
- externalContext.addRequestParameterMap(orderingList.getClientId(facesContext), "1sa,0");
+ externalContext.addRequestParameterMap(orderingList.getClientId(facesContext), "sa1:2");
+ externalContext.addRequestParameterMap(orderingList.getClientId(facesContext), "0:1");
orderingList.processDecodes(facesContext);
Object submittedValue = orderingList.getSubmittedValue();
assertNotNull(submittedValue);
- assertTrue(submittedValue instanceof Object[]);
- assertEquals(2, ((Object[])submittedValue).length);
+ assertTrue(submittedValue instanceof UIOrderingList.SubmittedValue);
+ UIOrderingList.SubmittedValue sValue = (UIOrderingList.SubmittedValue) submittedValue;
+ assertFalse(sValue.isNull());
- Object valueHolder = ((Object[])submittedValue)[0];
- assertNotNull(valueHolder);
- assertTrue(valueHolder instanceof UIOrderingList.SubmittedValue);
- assertEquals("1sa,0", valueHolder.toString());
-
orderingList.setImmediate(true);
orderingList.addValidator(new Validator() {
@@ -162,7 +170,8 @@
page = renderView();
anchor = (HtmlAnchor)page.getDocumentElement().getHtmlElementById(command.getClientId(facesContext));
anchor.click();
- externalContext.addRequestParameterMap(orderingList.getClientId(facesContext), "1sa,0");
+ externalContext.addRequestParameterMap(orderingList.getClientId(facesContext), "sa1:2");
+ externalContext.addRequestParameterMap(orderingList.getClientId(facesContext), "0:1");
orderingList.processDecodes(facesContext);
assertTrue(facesContext.getMessages().hasNext());
}
@@ -178,16 +187,16 @@
HtmlAnchor anchor = (HtmlAnchor)page.getDocumentElement().getHtmlElementById(command.getClientId(facesContext));
anchor.click();
- externalContext.addRequestParameterMap(orderingList.getClientId(facesContext), "1sa,0");
+ externalContext.addRequestParameterMap(orderingList.getClientId(facesContext), "sa1:2");
+ externalContext.addRequestParameterMap(orderingList.getClientId(facesContext), "0:1");
orderingList.processDecodes(facesContext);
orderingList.processValidators(facesContext);
orderingList.processUpdates(facesContext);
- List newValue = bean.getValue();
- assertNotNull(newValue);
- assertEquals(2, newValue.size());
- assertEquals(newValue.get(0), "2");
- assertEquals(newValue.get(1), "1");
+ assertNotNull(valueList);
+ assertEquals(2, valueList.size());
+ assertEquals("2", valueList.get(0));
+ assertEquals("1", valueList.get(1));
}
/**
@@ -212,24 +221,21 @@
HtmlAnchor anchor = (HtmlAnchor)page.getDocumentElement().getHtmlElementById(command.getClientId(facesContext));
anchor.click();
- externalContext.addRequestParameterMap(orderingList.getClientId(facesContext), "1sa,0");
+ externalContext.addRequestParameterMap(orderingList.getClientId(facesContext), "sa1:2");
+ externalContext.addRequestParameterMap(orderingList.getClientId(facesContext), "0:1");
orderingList.processDecodes(facesContext);
orderingList.processValidators(facesContext);
assertTrue(facesContext.getMessages().hasNext());
Object submittedValue = orderingList.getSubmittedValue();
assertNotNull(submittedValue);
- assertTrue(submittedValue instanceof Object[]);
- assertEquals(2, ((Object[])submittedValue).length);
-
- Object valueHolder = ((Object[])submittedValue)[0];
- assertNotNull(valueHolder);
- assertTrue(valueHolder instanceof UIOrderingList.SubmittedValue);
- assertEquals("1sa,0", valueHolder.toString());
+ assertTrue(submittedValue instanceof UIOrderingList.SubmittedValue);
+ assertFalse(((UIOrderingList.SubmittedValue)submittedValue).isNull());
}
public void testSaveRestore() throws Exception {
- String [] value = new String [] {"1"};
+ List value = new ArrayList();
+ value.add("1");
orderingList.setValueBinding("value", null);
orderingList.setValue(value);
assertEquals(value, orderingList.getValue());
@@ -243,21 +249,4 @@
assertEquals(value, value2);
}
- protected class OrderingListBean {
- private List value = null;
-
- public OrderingListBean() {
- value = new ArrayList();
- value.add("1");
- value.add("2");
- }
-
- public List getValue() {
- return value;
- }
-
- public void setValue(List value) {
- this.value = value;
- }
- }
}
Modified: branches/3.1.x/ui/orderingList/src/test/java/org/richfaces/renderkit/OrderingListRenderingTest.java
===================================================================
--- branches/3.1.x/ui/orderingList/src/test/java/org/richfaces/renderkit/OrderingListRenderingTest.java 2007-12-10 15:17:50 UTC (rev 4660)
+++ branches/3.1.x/ui/orderingList/src/test/java/org/richfaces/renderkit/OrderingListRenderingTest.java 2007-12-10 15:56:23 UTC (rev 4661)
@@ -61,6 +61,7 @@
javaScripts.add("scripts/LayoutManager.js");
javaScripts.add("scripts/Control.js");
javaScripts.add("scripts/OrderingList.js");
+ javaScripts.add("scripts/ListBase.js");
imageClasses.add("org.richfaces.renderkit.html.images.OrderingListIconUp");
imageClasses.add("org.richfaces.renderkit.html.images.OrderingListIconDown");
@@ -85,6 +86,8 @@
super( testName );
}
+ private final static int ROWS_COUNT = 3;
+
private UIForm form = null;
private UIOrderingList orderingList = null;
private List items = null;
@@ -235,11 +238,12 @@
public void testRenderControls() throws Exception {
HtmlPage view = renderView();
assertNotNull(view);
+ System.out.println(view.asXml());
List images = view.getDocumentElement().getHtmlElementsByTagName("img");
assertNotNull(images);
- assertEquals(8, images.size());
+ int generatedCount = 0;
for (Iterator it = images.iterator(); it.hasNext(); ) {
HtmlElement img = (HtmlElement) it.next();
assertNotNull(img);
@@ -249,21 +253,40 @@
assertNotNull(page);
assertTrue(page.getWebResponse().getStatusCode() == HttpServletResponse.SC_OK);
- HtmlElement div = (HtmlElement) img.getParentNode();
- assertNotNull(div);
- assertEquals("div", div.getNodeName());
+ if (uri.contains("spacer.gif")) {
+ continue;
+ }
+ generatedCount++;
- div = (HtmlElement) div.getParentNode();
- assertNotNull(div);
- assertEquals("div", div.getNodeName());
+ HtmlElement element = (HtmlElement) img.getParentNode();
+ assertNotNull(element);
+ assertEquals("div", element.getNodeName());
+ String clazz = element.getAttributeValue("class");
+ assertNotNull(clazz);
+ assertTrue("rich-ordering-list-button-content".equals(clazz));
- div = (HtmlElement) div.getParentNode();
- assertNotNull(div);
- assertEquals("div", div.getNodeName());
- String clazz = div.getAttributeValue("class");
+ element = (HtmlElement) element.getParentNode();
+ assertNotNull(element);
+ assertEquals("a", element.getNodeName());
+ String href = element.getAttributeValue("href");
+ assertNotNull(href);
+ assertTrue("#".equals(href));
+
+ element = (HtmlElement) element.getParentNode();
+ assertNotNull(element);
+ assertEquals("div", element.getNodeName());
+ clazz = element.getAttributeValue("class");
assertNotNull(clazz);
+ assertTrue(clazz.startsWith("rich-ordering-list-button"));
+
+ element = (HtmlElement) element.getParentNode();
+ assertNotNull(element);
+ assertEquals("div", element.getNodeName());
+ clazz = element.getAttributeValue("class");
+ assertNotNull(clazz);
assertTrue(clazz.contains("rich-ordering-control"));
}
+ assertEquals(8, generatedCount);
}
/**
@@ -335,10 +358,14 @@
assertEquals("button", hidden1.getAttributeValue("type"));
hidden1.getAttributeValue("style").contains("left: -32767px");
- HtmlElement hidden2 = view.getHtmlElementById(orderingList.getClientId(facesContext) + "valueKeeper");
- assertNotNull(hidden2);
- assertEquals("input", hidden2.getNodeName());
- assertEquals("hidden", hidden2.getAttributeValue("type"));
+ List hiddens = view.getDocumentElement().getHtmlElementsByAttribute("input", "name", orderingList.getClientId(facesContext));
+ assertNotNull(hiddens);
+ assertEquals(ROWS_COUNT, hiddens.size());
+ for (Iterator it = hiddens.iterator(); it.hasNext(); ) {
+ HtmlElement hidden2 = (HtmlElement) it.next();
+ assertEquals("input", hidden2.getNodeName());
+ assertEquals("hidden", hidden2.getAttributeValue("type"));
+ }
}
protected class SimpleItem {
16 years, 10 months
JBoss Rich Faces SVN: r4660 - branches/3.1.x/ui/orderingList/src/main/resources/org/richfaces/renderkit/html/scripts.
by richfaces-svn-commits@lists.jboss.org
Author: vmolotkov
Date: 2007-12-10 10:17:50 -0500 (Mon, 10 Dec 2007)
New Revision: 4660
Modified:
branches/3.1.x/ui/orderingList/src/main/resources/org/richfaces/renderkit/html/scripts/LayoutManager.js
Log:
headers rendering was changed
Modified: branches/3.1.x/ui/orderingList/src/main/resources/org/richfaces/renderkit/html/scripts/LayoutManager.js
===================================================================
--- branches/3.1.x/ui/orderingList/src/main/resources/org/richfaces/renderkit/html/scripts/LayoutManager.js 2007-12-10 15:17:13 UTC (rev 4659)
+++ branches/3.1.x/ui/orderingList/src/main/resources/org/richfaces/renderkit/html/scripts/LayoutManager.js 2007-12-10 15:17:50 UTC (rev 4660)
@@ -1,7 +1,7 @@
LayoutManager = function(headerId, contentId) {
this.headerTable = $(headerId);
this.contentTable = $(contentId);
- this.headerDiv = this.headerTable.parentNode;
+ this.headerDiv = (this.headerTable) ? this.headerTable.parentNode : null;
this.contentDiv = this.contentTable.parentNode;
var obj = this;
@@ -39,7 +39,9 @@
headCell.style.width = width + "px";
}
} else {
- this.headerTable.style.width = this.contentDiv.offsetWidth;
+ if (this.headerTable && this.headerTable.tHead) {
+ this.headerTable.style.width = this.contentDiv.offsetWidth;
+ }
}
}
@@ -51,7 +53,9 @@
}
LayoutManager.prototype.scrollHandler = function(obj) {
- obj.headerDiv.scrollLeft = obj.contentDiv.scrollLeft;
+ if (obj.headerDiv) {
+ obj.headerDiv.scrollLeft = obj.contentDiv.scrollLeft;
+ }
}
LayoutManager.getHeaderWidth = function(visibleBox, realBox) {
16 years, 10 months
JBoss Rich Faces SVN: r4659 - in branches/3.1.x/ui/listShuttle/src/main: templates/org/richfaces and 1 other directory.
by richfaces-svn-commits@lists.jboss.org
Author: vmolotkov
Date: 2007-12-10 10:17:13 -0500 (Mon, 10 Dec 2007)
New Revision: 4659
Modified:
branches/3.1.x/ui/listShuttle/src/main/java/org/richfaces/renderkit/ListShuttleRendererBase.java
branches/3.1.x/ui/listShuttle/src/main/templates/org/richfaces/htmlListShuttle.jspx
Log:
headers rendering was changed
Modified: branches/3.1.x/ui/listShuttle/src/main/java/org/richfaces/renderkit/ListShuttleRendererBase.java
===================================================================
--- branches/3.1.x/ui/listShuttle/src/main/java/org/richfaces/renderkit/ListShuttleRendererBase.java 2007-12-10 15:12:34 UTC (rev 4658)
+++ branches/3.1.x/ui/listShuttle/src/main/java/org/richfaces/renderkit/ListShuttleRendererBase.java 2007-12-10 15:17:13 UTC (rev 4659)
@@ -89,6 +89,18 @@
public void encodeTLHeader(FacesContext context, UIOrderingBaseComponent shuttle) throws IOException {
encodeHeader(context, shuttle, "rich-table-header", "rich-shuttle-header-tab-cell", "sourceHeaderClass");
}
+
+ public boolean isHeaderExists(FacesContext context, UIOrderingBaseComponent component) {
+ Iterator headers = component.columns();
+ while (headers.hasNext()) {
+ UIComponent column = (UIComponent) headers.next();
+ UIComponent facet = column.getFacet("header");
+ if (facet != null) {
+ return true;
+ }
+ }
+ return false;
+ }
protected String encodeRows(FacesContext context, UIOrderingBaseComponent shuttle, boolean source) throws IOException {
ResponseWriter writer = context.getResponseWriter();
Modified: branches/3.1.x/ui/listShuttle/src/main/templates/org/richfaces/htmlListShuttle.jspx
===================================================================
--- branches/3.1.x/ui/listShuttle/src/main/templates/org/richfaces/htmlListShuttle.jspx 2007-12-10 15:12:34 UTC (rev 4658)
+++ branches/3.1.x/ui/listShuttle/src/main/templates/org/richfaces/htmlListShuttle.jspx 2007-12-10 15:17:13 UTC (rev 4659)
@@ -75,7 +75,8 @@
contentContainerStyle = contentContainerStyle.concat("width:").concat(HtmlUtil.qualifySize(sourceListWidthValue)).concat(";");
variables.setVariable("contentContainerStyle", contentContainerStyle);
}
- ]]>
+ if (isHeaderExists(context, component)) {
+ ]]>
</jsp:scriptlet>
<div class="rich-shuttle-list-header" style="#{contentContainerStyle}">
<table id="#{clientId}internal_header_tab" class="rich-shuttle-internal-header-tab" cellpadding="0" cellspacing="0">
@@ -84,6 +85,7 @@
</div>
<jsp:scriptlet>
<![CDATA[
+ }
String listHeightValue = (String) component.getAttributes().get("listsHeight");
if (listHeightValue != null) {
contentContainerStyle = contentContainerStyle.concat("height:").concat(HtmlUtil.qualifySize(listHeightValue)).concat(";");
@@ -135,8 +137,9 @@
trContentContainerStyle = trContentContainerStyle.concat("width:").concat(HtmlUtil.qualifySize(targetListWidthValue)).concat(";");
variables.setVariable("trContentContainerStyle", trContentContainerStyle);
}
- ]]>
- </jsp:scriptlet>
+ if (isHeaderExists(context, component)) {
+ ]]>
+ </jsp:scriptlet>
<div class="rich-shuttle-list-header" style="#{trContentContainerStyle}">
<table id="#{clientId}tlInternal_header_tab" class="rich-shuttle-internal-header-tab" cellpadding="0" cellspacing="0">
<f:call name="encodeTLHeader"/>
@@ -144,6 +147,7 @@
</div>
<jsp:scriptlet>
<![CDATA[
+ }
if (listHeightValue != null) {
trContentContainerStyle = trContentContainerStyle.concat("height:").concat(HtmlUtil.qualifySize(listHeightValue)).concat(";");
variables.setVariable("trContentContainerStyle", trContentContainerStyle);
16 years, 10 months
JBoss Rich Faces SVN: r4658 - branches/3.1.x/docs/userguide/en/src/main/docbook/included.
by richfaces-svn-commits@lists.jboss.org
Author: artdaw
Date: 2007-12-10 10:12:34 -0500 (Mon, 10 Dec 2007)
New Revision: 4658
Modified:
branches/3.1.x/docs/userguide/en/src/main/docbook/included/orderingList.xml
Log:
http://jira.jboss.com/jira/browse/RF-1184 - edit Details of Usage, edit example for 'selection' attribute
Modified: branches/3.1.x/docs/userguide/en/src/main/docbook/included/orderingList.xml
===================================================================
--- branches/3.1.x/docs/userguide/en/src/main/docbook/included/orderingList.xml 2007-12-10 15:11:57 UTC (rev 4657)
+++ branches/3.1.x/docs/userguide/en/src/main/docbook/included/orderingList.xml 2007-12-10 15:12:34 UTC (rev 4658)
@@ -103,29 +103,37 @@
<para>Controls rendering is based on the <emphasis>
<property>"controlsType" </property>
- </emphasis> attribute. Possible types are button or none.
+ </emphasis> attribute. Possible types are button<!--, link--> or none.
</para>
<para>
The <emphasis>
<property>"selection" </property>
- </emphasis> attribute stores the collection of items selected by user. After submitting the form the current collection is placed in the object's property.
+ </emphasis> attribute stores the collection of items selected by user. After submitting the form the current collection is placed in the object's property and then
+ <emphasis role="bold"><property><rich:dataTable></property></emphasis> with selected items will be shown.
</para>
<para>
<emphasis role="bold">Example:</emphasis>
</para>
<programlisting role="XML"><![CDATA[...
-<rich:orderingList value="#{bean.simpleItems}" var="item" selection="#{bean.selection}" controlsType="button">
- <rich:column>
- <f:facet name="header">
- <h:outputText value="Cars" />
- </f:facet>
- <h:outputText value="#{item}" />
- </rich:column>
-</rich:orderingList>
+<h:form>
+ <rich:orderingList value="#{bean.simpleItems}" var="item" selection="#{bean.selection}" controlsType="button">
+ <rich:column>
+ <f:facet name="header">
+ <h:outputText value="Cars" />
+ </f:facet>
+ <h:outputText value="#{item}" />
+ </rich:column>
+ </rich:orderingList>
+ <rich:dataTable id="infoPanelID" value="#{bean.info}" var="info" rendered="true">
+ <rich:column>
+ <h:outputText value="#{info}" />
+ </rich:column>
+ </rich:dataTable>
+ <a4j:commandButton value="reRender" reRender="infoPanelID" />
+</h:form>
...]]></programlisting>
-
<para> The <emphasis role="bold">
<property><rich:orderingList></property>
</emphasis> component allows to use <emphasis>
@@ -163,18 +171,20 @@
</f:facet>
<h:outputText value="#{item.price}" />
</rich:column>
- <f:facet name="footer">
- <h:outputText value="Footer Facet" />
- </f:facet>
</rich:orderingList>
...]]></programlisting>
<!-- ordering control set-->
<para>The <emphasis role="bold">
- <property><rich:orderingList></property>
- </emphasis> component provides the possibility to use <property>ordering controls
- set</property>, which performs reordering. Every control has possibility to be disabled. </para>
- <para>
+ <property><rich:orderingList></property>
+ </emphasis> component provides the possibility to use <property>ordering controls
+ set</property>, which performs reordering. Every control has possibility to be disabled.
+ </para>
+ <para>An <property>ordering controls set</property> could be defined with
+ <emphasis><property>"topControlLabel"</property></emphasis>, <emphasis><property>"bottomControlLabel"</property></emphasis>,
+ <emphasis><property>"upControlLabel"</property></emphasis>, <emphasis><property>"downControlLabel"</property></emphasis>attributes.
+ </para>
+ <para>It is also possible to use
<emphasis>
<property> "topControl" </property>
</emphasis>, <emphasis>
@@ -191,12 +201,8 @@
<property> "downControl"</property>
</emphasis> , <emphasis>
<property> "downControlDisabled" </property>
- </emphasis> facets are used to replaces the default control with facets content.
+ </emphasis> facets in order to replace the default controls with facets content.
</para>
- <para>An <property>ordering controls set</property> could be also defined with
- <emphasis><property>"topControlLabel"</property></emphasis>, <emphasis><property>"bottomControlLabel"</property></emphasis>,
- <emphasis><property>"upControlLabel"</property></emphasis>, <emphasis><property>"downControlLabel"</property></emphasis>attributes.
- </para>
<para>
<emphasis role="bold">Example:</emphasis>
</para>
16 years, 10 months
JBoss Rich Faces SVN: r4657 - branches/3.1.x/docs/userguide/en/src/main/docbook/included.
by richfaces-svn-commits@lists.jboss.org
Author: artdaw
Date: 2007-12-10 10:11:57 -0500 (Mon, 10 Dec 2007)
New Revision: 4657
Modified:
branches/3.1.x/docs/userguide/en/src/main/docbook/included/listShuttle.xml
Log:
http://jira.jboss.com/jira/browse/RF-1174 - edit Details of Usage
Modified: branches/3.1.x/docs/userguide/en/src/main/docbook/included/listShuttle.xml
===================================================================
--- branches/3.1.x/docs/userguide/en/src/main/docbook/included/listShuttle.xml 2007-12-10 15:11:32 UTC (rev 4656)
+++ branches/3.1.x/docs/userguide/en/src/main/docbook/included/listShuttle.xml 2007-12-10 15:11:57 UTC (rev 4657)
@@ -46,8 +46,8 @@
</emphasis> component consists of the following parts: <itemizedlist>
<listitem>two <property>item lists</property> (source and target). List consists of
items. Each item has three different representations: common, selected, active</listitem>
- <listitem>optional <property>caption</property>, <property>header</property> (sorted
- and non-sorted)<!--, <property>footer</property>--> elements</listitem>
+ <listitem>optional <property>caption</property>, <property>header</property><!--(sorted
+ and non-sorted), <property>footer</property>--> elements</listitem>
<listitem><property>copy/moving controls set</property> is a set of controls, which
performs moving/copying items between lists</listitem>
<listitem><property>optional ordering controls set</property> is a set of controls
@@ -100,29 +100,29 @@
</emphasis> component provides the possibility to use <property>ordering controls
set</property>, which performs reordering in the target item list. Every control has
possibility to be disabled. </para>
- <para>
+ <para>An <property>ordering controls set</property> could be defined with
+ <emphasis><property>"topControlLabel"</property></emphasis>, <emphasis><property>"bottomControlLabel"</property></emphasis>,
+ <emphasis><property>"upControlLabel"</property></emphasis>, <emphasis><property>"downControlLabel"</property></emphasis>attributes.
+ </para>
+ <para>It is also possible to use
<emphasis>
- <property>"topControl" </property>
+ <property> "topControl" </property>
</emphasis>, <emphasis>
- <property>"topControlDisabled" </property>
+ <property>"topControlDisabled"</property>
+ </emphasis> , <emphasis>
+ <property> "bottomControl"</property>
+ </emphasis> , <emphasis>
+ <property> "bottomControlDisabled" </property>
</emphasis>, <emphasis>
- <property>"bottomControl" </property>
+ <property> "upControl" </property>
</emphasis>, <emphasis>
- <property>"bottomControlDisabled" </property>
+ <property> "upControlDisabled" </property>
</emphasis>, <emphasis>
- <property>"upControl" </property>
- </emphasis>, <emphasis>
- <property>"upControlDisabled" </property>
- </emphasis>, <emphasis>
- <property>"downControl" </property>
- </emphasis>, <emphasis>
- <property>"downControlDisabled" </property>
- </emphasis> facets are used to replaces the default control with facets content.
+ <property> "downControl"</property>
+ </emphasis> , <emphasis>
+ <property> "downControlDisabled" </property>
+ </emphasis> facets in order to replace the default controls with facets content.
</para>
- <para>An <property>ordering controls set</property> could be also defined with
- <emphasis><property>"topControlLabel"</property></emphasis>, <emphasis><property>"bottomControlLabel"</property></emphasis>,
- <emphasis><property>"upControlLabel"</property></emphasis>, <emphasis><property>"downControlLabel"</property></emphasis>attributes.
- </para>
<para>
<emphasis role="bold">Example:</emphasis>
</para>
@@ -132,13 +132,13 @@
<f:facet name="topControl">
<h:outputText value="Move to top" />
</f:facet>
- <f:facet name="upControl">
+ <f:facet name="upControl">
<h:outputText value="Move up" />
</f:facet>
- <f:facet name="downControl">
+ <f:facet name="downControl">
<h:outputText value="Move down" />
</f:facet>
- <f:facet name="bottomControl">
+ <f:facet name="bottomControl">
<h:outputText value="Move to bottom" />
</f:facet>
<rich:orderingList>
@@ -147,10 +147,16 @@
<!-- copy/move control set -->
<para>The <emphasis role="bold">
<property><rich:listShuttle></property>
- </emphasis>component also provides 4 predefined controls in <property> move/copy
+ </emphasis>component also provides 4 predefined controls in <property>move/copy
controls set</property> for moving or copying items between source and target lists.
- Every control has possibility to be disabled. </para>
- <para>
+ Every control has possibility to be disabled. </para>
+
+ <para>A <property>move/copy
+ controls set</property> could be defined with
+ <emphasis><property>"copyControlLabel"</property></emphasis>, <emphasis><property>"removeControlLabel"</property></emphasis>,
+ <emphasis><property>"copyAllControlLabel"</property></emphasis>, <emphasis><property>"removeAllControlLabel"</property></emphasis>attributes.
+ </para>
+ <para>It is also possible to use
<emphasis>
<property>"copyControl" </property>
</emphasis>,
@@ -174,12 +180,9 @@
</emphasis>
<!--<emphasis>
<property>"removeAll_disabled" </property>
- </emphasis>--> facets are used to replaces the default control with facets content.
+ </emphasis>--> facets in order to replace the default controls with facets content.
</para>
- <para>An <property>move/copy controls set</property> could be also defined with
- <emphasis><property>"copyControlLabel"</property></emphasis>, <emphasis><property>"removeControlLabel"</property></emphasis>,
- <emphasis><property>"copyAllControlLabel"</property></emphasis>, <emphasis><property>"removeAllControlLabel"</property></emphasis>attributes.
- </para>
+
<!-- attributes -->
<para> The <emphasis>
<property>"sourceValue" </property>
16 years, 10 months
JBoss Rich Faces SVN: r4656 - branches/3.1.x/docs/userguide/en/src/main/docbook/included.
by richfaces-svn-commits@lists.jboss.org
Author: artdaw
Date: 2007-12-10 10:11:32 -0500 (Mon, 10 Dec 2007)
New Revision: 4656
Modified:
branches/3.1.x/docs/userguide/en/src/main/docbook/included/contextMenu.xml
Log:
http://jira.jboss.com/jira/browse/RF-1298 - review component
Modified: branches/3.1.x/docs/userguide/en/src/main/docbook/included/contextMenu.xml
===================================================================
--- branches/3.1.x/docs/userguide/en/src/main/docbook/included/contextMenu.xml 2007-12-10 14:48:48 UTC (rev 4655)
+++ branches/3.1.x/docs/userguide/en/src/main/docbook/included/contextMenu.xml 2007-12-10 15:11:32 UTC (rev 4656)
@@ -118,6 +118,7 @@
<rich:menuItem value="Delete package" action="#{bean.delete}" />
</rich:contextMenu>
...]]></programlisting>
+ <para>This is the result:</para>
<figure>
<title>Using the <emphasis><property>"attached"</property></emphasis> attribute</title>
<mediaobject>
16 years, 10 months
JBoss Rich Faces SVN: r4655 - in branches/3.1.x/framework/impl/src: main/java/org/ajax4jsf/css and 3 other directories.
by richfaces-svn-commits@lists.jboss.org
Author: andrei_exadel
Date: 2007-12-10 09:48:48 -0500 (Mon, 10 Dec 2007)
New Revision: 4655
Added:
branches/3.1.x/framework/impl/src/main/java/org/ajax4jsf/css/
branches/3.1.x/framework/impl/src/main/java/org/ajax4jsf/css/CssCompressor.java
branches/3.1.x/framework/impl/src/main/java/org/ajax4jsf/resource/CountingOutputWriter.java
branches/3.1.x/framework/impl/src/test/java/org/ajax4jsf/css/
branches/3.1.x/framework/impl/src/test/java/org/ajax4jsf/css/CssCompressorTest.java
Modified:
branches/3.1.x/framework/impl/src/main/java/org/ajax4jsf/resource/TemplateCSSRenderer.java
Log:
RF-1349
Added: branches/3.1.x/framework/impl/src/main/java/org/ajax4jsf/css/CssCompressor.java
===================================================================
--- branches/3.1.x/framework/impl/src/main/java/org/ajax4jsf/css/CssCompressor.java (rev 0)
+++ branches/3.1.x/framework/impl/src/main/java/org/ajax4jsf/css/CssCompressor.java 2007-12-10 14:48:48 UTC (rev 4655)
@@ -0,0 +1,154 @@
+/*
+ * YUI Compressor
+ * Author: Julien Lecomte <jlecomte(a)yahoo-inc.com>
+ * Copyright (c) 2007, Yahoo! Inc. All rights reserved.
+ * Code licensed under the BSD License:
+ * http://developer.yahoo.net/yui/license.txt
+ *
+ * This code is a port of Isaac Schlueter's cssmin utility.
+ */
+
+package org.ajax4jsf.css;
+
+import java.io.IOException;
+import java.io.Writer;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+public class CssCompressor {
+
+ private StringBuffer srcsb = null;
+
+ public CssCompressor(StringBuffer buffer) throws IOException {
+ srcsb = buffer;
+ }
+
+ public int compress(Writer out, int linebreakpos)
+ throws IOException {
+
+ Pattern p;
+ Matcher m;
+ String css;
+ StringBuffer sb;
+ int startIndex, endIndex;
+ int bytesLength;
+
+ // Remove all comment blocks...
+ sb = new StringBuffer(srcsb.toString());
+ while ((startIndex = sb.indexOf("/*")) >= 0) {
+ endIndex = sb.indexOf("*/", startIndex + 2);
+ if (endIndex >= startIndex + 2)
+ sb.delete(startIndex, endIndex + 2);
+ }
+
+ css = sb.toString();
+
+ // Normalize all whitespace strings to single spaces. Easier to work with that way.
+ css = css.replaceAll("\\s+", " ");
+
+ // Remove the spaces before the things that should not have spaces before them.
+ // But, be careful not to turn "p :link {...}" into "p:link{...}"
+ // Swap out any pseudo-class colons with the token, and then swap back.
+ sb = new StringBuffer();
+ p = Pattern.compile("(^|\\})(([^\\{:])+:)+([^\\{]*\\{)");
+ m = p.matcher(css);
+ while (m.find()) {
+ String s = m.group();
+ s = s.replaceAll(":", "___PSEUDOCLASSCOLON___");
+ m.appendReplacement(sb, s);
+ }
+ m.appendTail(sb);
+ css = sb.toString();
+ css = css.replaceAll("\\s+([!{};:>+\\(\\)\\],])", "$1");
+ css = css.replaceAll("___PSEUDOCLASSCOLON___", ":");
+
+ // Remove the spaces after the things that should not have spaces after them.
+ css = css.replaceAll("([!{}:;>+\\(\\[,])\\s+", "$1");
+
+ // Add the semicolon where it's missing.
+ css = css.replaceAll("([^;\\}])}", "$1;}");
+
+ // Replace 0(px,em,%) with 0.
+ css = css.replaceAll("([\\s:])(0)(px|em|%|in|cm|mm|pc|pt|ex)", "$1$2");
+
+ // Replace 0 0 0 0; with 0.
+ css = css.replaceAll(":0 0 0 0;", ":0;");
+ css = css.replaceAll(":0 0 0;", ":0;");
+ css = css.replaceAll(":0 0;", ":0;");
+ // Replace background-position:0; with background-position:0 0;
+ css = css.replaceAll("background-position:0;", "background-position:0 0;");
+
+ // Replace 0.6 to .6, but only when preceded by : or a white-space
+ css = css.replaceAll("(:|\\s)0+\\.(\\d+)", "$1.$2");
+
+ // Shorten colors from rgb(51,102,153) to #336699
+ // This makes it more likely that it'll get further compressed in the next step.
+ p = Pattern.compile("rgb\\s*\\(\\s*([0-9,\\s]+)\\s*\\)");
+ m = p.matcher(css);
+ sb = new StringBuffer();
+ while (m.find()) {
+ String[] rgbcolors = m.group(1).split(",");
+ StringBuffer hexcolor = new StringBuffer("#");
+ for (int i = 0; i < rgbcolors.length; i++) {
+ int val = Integer.parseInt(rgbcolors[i]);
+ if (val < 16) {
+ hexcolor.append("0");
+ }
+ hexcolor.append(Integer.toHexString(val));
+ }
+ m.appendReplacement(sb, hexcolor.toString());
+ }
+ m.appendTail(sb);
+ css = sb.toString();
+
+ // Shorten colors from #AABBCC to #ABC. Note that we want to make sure
+ // the color is not preceded by either ", " or =. Indeed, the property
+ // filter: chroma(color="#FFFFFF");
+ // would become
+ // filter: chroma(color="#FFF");
+ // which makes the filter break in IE.
+ p = Pattern.compile("([^\"'=\\s])(\\s*)#([0-9a-fA-F])([0-9a-fA-F])([0-9a-fA-F])([0-9a-fA-F])([0-9a-fA-F])([0-9a-fA-F])");
+ m = p.matcher(css);
+ sb = new StringBuffer();
+ while (m.find()) {
+ // Test for AABBCC pattern
+ if (m.group(3).equalsIgnoreCase(m.group(4)) &&
+ m.group(5).equalsIgnoreCase(m.group(6)) &&
+ m.group(7).equalsIgnoreCase(m.group(8))) {
+ m.appendReplacement(sb, m.group(1) + m.group(2) + "#" + m.group(3) + m.group(5) + m.group(7));
+ } else {
+ m.appendReplacement(sb, m.group());
+ }
+ }
+ m.appendTail(sb);
+ css = sb.toString();
+
+ // Remove empty rules.
+ css = css.replaceAll("[^\\}]+\\{;\\}", "");
+
+ if (linebreakpos >= 0) {
+ // Some source control tools don't like it when files containing lines longer
+ // than, say 8000 characters, are checked in. The linebreak option is used in
+ // that case to split long lines after a specific column.
+ int i = 0;
+ int linestartpos = 0;
+ sb = new StringBuffer(css);
+ while (i < sb.length()) {
+ char c = sb.charAt(i++);
+ if (c == '}' && i - linestartpos > linebreakpos) {
+ sb.insert(i, '\n');
+ linestartpos = i;
+ }
+ }
+
+ css = sb.toString();
+ }
+
+ // Trim the final string (for any leading or trailing white spaces)
+ css = css.trim();
+ bytesLength = css.length() * 2;
+ // Write the output...
+ out.write(css);
+ return bytesLength;
+ }
+}
Added: branches/3.1.x/framework/impl/src/main/java/org/ajax4jsf/resource/CountingOutputWriter.java
===================================================================
--- branches/3.1.x/framework/impl/src/main/java/org/ajax4jsf/resource/CountingOutputWriter.java (rev 0)
+++ branches/3.1.x/framework/impl/src/main/java/org/ajax4jsf/resource/CountingOutputWriter.java 2007-12-10 14:48:48 UTC (rev 4655)
@@ -0,0 +1,110 @@
+/*
+ * CountingOutputWriter.java Date created: 21.11.2007
+ * Last modified by: $Author$
+ * $Revision$ $Date$
+ */
+
+package org.ajax4jsf.resource;
+
+import java.io.IOException;
+import java.io.Writer;
+
+/**
+ * Class provides custom writer implementation with counting of bytes written
+ * Is using for replacement of css component writer
+ * @author Andrey Markavtsov
+ */
+public class CountingOutputWriter extends Writer {
+
+ /** count of written bytes */
+ private int written = 0;
+
+ /** Size of char type */
+ private static final int sizeOfChar = 2;
+
+ /** Size of int type */
+ private static final int sizeOfInt = 4;
+
+ /** Buffer to store bytes written */
+ private StringBuffer buffer;
+
+ /**
+ * Default constructor
+ */
+ public CountingOutputWriter() {
+ super();
+ this.buffer = new StringBuffer();
+ }
+
+ /* (non-Javadoc)
+ * @see java.io.Writer#close()
+ */
+ public void close() throws IOException {
+ ;
+ }
+
+ /* (non-Javadoc)
+ * @see java.io.Writer#flush()
+ */
+ public void flush() throws IOException {
+ ;
+ }
+
+ /** Methods appends chars written to buffer
+ * @param cbuf - chars to be written
+ * @param off - offset
+ * @param len - length of bytes
+ */
+ public void write(char[] cbuf, int off, int len) throws IOException {
+ buffer.append(cbuf, off, len);
+ written += len * sizeOfChar;
+ }
+
+ /** Methods appends chars written to buffer
+ * @param cbuf - chars to be written
+ */
+ public void write(char[] cbuf) throws IOException {
+ buffer.append(cbuf);
+ written += cbuf.length * sizeOfChar;
+ }
+
+ /** Methods appends int written to buffer
+ * @param c - int to be written
+ */
+ public void write(int c) throws IOException {
+ buffer.append(c);
+ written += sizeOfInt;
+ }
+
+ /** Methods appends string written to buffer
+ * @param str - string to be written
+ * @param off - offset
+ * @param len - length of bytes
+ */
+ public void write(String str, int off, int len) throws IOException {
+ buffer.append(str, off, len);
+ written += len * sizeOfChar;
+ }
+
+ /** Methods appends string written to buffer
+ * @param str - string to be written
+ */
+ public void write(String str) throws IOException {
+ buffer.append(str);
+ written += str.length() * sizeOfChar;
+ }
+
+ /** Methods gets written bytes count
+ * @return written count of bytes
+ */
+ public int getWritten() {
+ return written;
+ }
+
+ /** Methods gets content of written bytes
+ * @return buffer
+ */
+ public StringBuffer getContent () {
+ return buffer;
+ }
+}
\ No newline at end of file
Modified: branches/3.1.x/framework/impl/src/main/java/org/ajax4jsf/resource/TemplateCSSRenderer.java
===================================================================
--- branches/3.1.x/framework/impl/src/main/java/org/ajax4jsf/resource/TemplateCSSRenderer.java 2007-12-10 14:37:16 UTC (rev 4654)
+++ branches/3.1.x/framework/impl/src/main/java/org/ajax4jsf/resource/TemplateCSSRenderer.java 2007-12-10 14:48:48 UTC (rev 4655)
@@ -23,6 +23,7 @@
import java.io.IOException;
import java.io.InputStream;
+import java.io.Writer;
import java.nio.ByteBuffer;
import javax.faces.FacesException;
@@ -33,12 +34,11 @@
import javax.faces.render.RenderKit;
import javax.faces.render.RenderKitFactory;
+import org.ajax4jsf.css.CssCompressor;
import org.ajax4jsf.renderkit.RendererBase;
import org.ajax4jsf.renderkit.compiler.HtmlCompiler;
import org.ajax4jsf.renderkit.compiler.PreparedTemplate;
import org.ajax4jsf.renderkit.compiler.TemplateContext;
-import org.ajax4jsf.resource.InternetResource;
-import org.ajax4jsf.resource.ResourceContext;
import org.richfaces.skin.SkinFactory;
/**
@@ -48,6 +48,9 @@
public class TemplateCSSRenderer extends StyleRenderer {
private static final String COMPILED_TEMPLATE_PROPERTY = "compiled-template";
+
+ /** Parameter allows switch on/off comressing for css */
+ private static final String COMPRESS_STYLE_PARAMETER = "org.ajax4jsf.COMPRESS_STYLE";
private RendererBase renderer = new RendererBase() {
@@ -62,8 +65,13 @@
*/
public int send(InternetResource base, ResourceContext context) throws IOException {
PreparedTemplate template = null;
+ CountingOutputWriter countingOutputWriter = new CountingOutputWriter();
template = getTemplate(base, context);
FacesContext facesContext = FacesContext.getCurrentInstance();
+ boolean _CompressStyleOn = !"false".equals(facesContext.getExternalContext()
+ .getInitParameter(COMPRESS_STYLE_PARAMETER));
+ Writer writer = context.getWriter();
+ int bytesLength;
if(null != facesContext) {
// Create responseWriter.
String defaultRenderKitId = facesContext.getApplication().getDefaultRenderKitId();
@@ -73,19 +81,34 @@
RenderKitFactory renderKitFactory = (RenderKitFactory) FactoryFinder.getFactory(FactoryFinder.RENDER_KIT_FACTORY);
RenderKit renderKit = renderKitFactory.getRenderKit(facesContext,defaultRenderKitId);
// TODO - handle response encoding
- ResponseWriter responseWriter = renderKit.createResponseWriter(context.getWriter(),null,"UTF-8");
+
+ ResponseWriter responseWriter = renderKit.createResponseWriter(countingOutputWriter,null,"UTF-8");
facesContext.setResponseWriter(responseWriter);
responseWriter.startDocument();
+
// TODO - parameters and mock renderer/component ?
// for first time, this template only allow skin or faces variables interaction
template.encode(renderer,facesContext,null);
responseWriter.endDocument();
responseWriter.flush();
responseWriter.close();
+
+ if (_CompressStyleOn) {
+ CssCompressor compressor = new CssCompressor(countingOutputWriter.getContent()); // Compressing css document and printing result in response stream
+ bytesLength = compressor.compress(writer, -1);
+ writer.flush();
+ writer.close();
+ } else {
+ writer.write(countingOutputWriter.getContent().toString()); // Write not compressed style content
+ bytesLength = countingOutputWriter.getWritten();
+ writer.flush();
+ writer.close();
+ }
+
} else {
throw new FacesException("FacesContext for resource from template "+base.getKey()+" is null");
}
- return 0;
+ return bytesLength;
}
/**
Added: branches/3.1.x/framework/impl/src/test/java/org/ajax4jsf/css/CssCompressorTest.java
===================================================================
--- branches/3.1.x/framework/impl/src/test/java/org/ajax4jsf/css/CssCompressorTest.java (rev 0)
+++ branches/3.1.x/framework/impl/src/test/java/org/ajax4jsf/css/CssCompressorTest.java 2007-12-10 14:48:48 UTC (rev 4655)
@@ -0,0 +1,87 @@
+/*
+ * CssCompressorTest.java Date created: 21.11.2007
+ * Last modified by: $Author$
+ * $Revision$ $Date$
+ */
+
+package org.ajax4jsf.css;
+
+import java.io.IOException;
+
+import junit.framework.TestCase;
+
+import org.ajax4jsf.resource.CountingOutputWriter;
+
+/**
+ * Test case for css compressing process
+ * @author Andrey Markavtsov
+ *
+ */
+public class CssCompressorTest extends TestCase {
+
+ /** Length of correctly compressed css example */
+ private static final int lengthCompressed = 610;
+
+ /** css example to be comressed */
+ private static final String cssExample =
+ "HTML { \n"+
+ "MARGIN-BOTTOM: 0.01em; HEIGHT: 100%; BACKGROUND-COLOR: #ffffff;\n" +
+ "}\n" +
+ "TD {\n" +
+ "FONT-SIZE: 10px; COLOR: #000000; FONT-FAMILY: verdana, arial\n" +
+ "}\n" +
+ "TH {\n" +
+ "FONT-WEIGHT: bold; FONT-SIZE: 10px; COLOR: #336699; FONT-FAMILY: verdana, arial; BACKGROUND-COLOR: #ffffff; text-align:left;\n" +
+ "}\n" +
+ ".header {\n" +
+ "FONT-WEIGHT: bold; FONT-SIZE: 11px; COLOR: #000000; FONT-FAMILY: verdana, arial\n" +
+ "}\n";
+
+ /**
+ * Constructor
+ * @param name
+ */
+ public CssCompressorTest(String name) {
+ super(name);
+ // TODO Auto-generated constructor stub
+ }
+
+ /* (non-Javadoc)
+ * @see junit.framework.TestCase#setUp()
+ */
+ @Override
+ protected void setUp() throws Exception {
+ // TODO Auto-generated method stub
+ super.setUp();
+ }
+
+ /* (non-Javadoc)
+ * @see junit.framework.TestCase#tearDown()
+ */
+ @Override
+ protected void tearDown() throws Exception {
+ // TODO Auto-generated method stub
+ super.tearDown();
+ }
+
+
+ /**
+ * Test method
+ * @throws IOException
+ */
+ public void testCssCompressor () throws IOException {
+
+ StringBuffer cssBuffer = new StringBuffer(cssExample);
+ CssCompressor compressor = new CssCompressor(cssBuffer);
+ CountingOutputWriter writer = new CountingOutputWriter();
+ compressor.compress(writer, -1);
+
+ // compressed length should equal
+ assertEquals(writer.getWritten(), lengthCompressed);
+
+ }
+
+
+
+
+}
16 years, 10 months