You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@wicket.apache.org by mg...@apache.org on 2014/06/24 16:03:39 UTC

[2/3] git commit: WICKET-5340 CssAttributeModifier and StyleAttributeModifier

WICKET-5340 CssAttributeModifier and StyleAttributeModifier

(cherry picked from commit a20cdb51cc77765fff0a82d66f02e4abc68c31b8)


Project: http://git-wip-us.apache.org/repos/asf/wicket/repo
Commit: http://git-wip-us.apache.org/repos/asf/wicket/commit/e2f8fae1
Tree: http://git-wip-us.apache.org/repos/asf/wicket/tree/e2f8fae1
Diff: http://git-wip-us.apache.org/repos/asf/wicket/diff/e2f8fae1

Branch: refs/heads/master
Commit: e2f8fae14e22a63d79236ba07b78dcb6dd3200ad
Parents: 96b9081
Author: Martin Tzvetanov Grigorov <mg...@apache.org>
Authored: Wed Feb 26 17:37:09 2014 +0200
Committer: Martin Tzvetanov Grigorov <mg...@apache.org>
Committed: Tue Jun 24 17:01:51 2014 +0300

----------------------------------------------------------------------
 .../apache/wicket/ClassAttributeModifier.java   |   2 +-
 .../apache/wicket/StyleAttributeModifier.java   |  84 +++++++++++++
 .../wicket/ClassAttributeModifierTest.java      |   4 +-
 .../wicket/StyleAttributeModifierTest.java      | 120 +++++++++++++++++++
 4 files changed, 207 insertions(+), 3 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/wicket/blob/e2f8fae1/wicket-core/src/main/java/org/apache/wicket/ClassAttributeModifier.java
----------------------------------------------------------------------
diff --git a/wicket-core/src/main/java/org/apache/wicket/ClassAttributeModifier.java b/wicket-core/src/main/java/org/apache/wicket/ClassAttributeModifier.java
index 6f3bf8a..b67ff5b 100644
--- a/wicket-core/src/main/java/org/apache/wicket/ClassAttributeModifier.java
+++ b/wicket-core/src/main/java/org/apache/wicket/ClassAttributeModifier.java
@@ -50,7 +50,7 @@ public abstract class ClassAttributeModifier extends AttributeAppender
 		}
 		else
 		{
-			classes = SPLITTER.split(currentValue);
+			classes = SPLITTER.split(currentValue.trim());
 		}
 		Set<String> oldClasses = new TreeSet<>();
 		Collections.addAll(oldClasses, classes);

http://git-wip-us.apache.org/repos/asf/wicket/blob/e2f8fae1/wicket-core/src/main/java/org/apache/wicket/StyleAttributeModifier.java
----------------------------------------------------------------------
diff --git a/wicket-core/src/main/java/org/apache/wicket/StyleAttributeModifier.java b/wicket-core/src/main/java/org/apache/wicket/StyleAttributeModifier.java
new file mode 100644
index 0000000..64cf077
--- /dev/null
+++ b/wicket-core/src/main/java/org/apache/wicket/StyleAttributeModifier.java
@@ -0,0 +1,84 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.wicket;
+
+import java.util.LinkedHashMap;
+import java.util.Map;
+import java.util.regex.Pattern;
+
+import org.apache.wicket.behavior.AttributeAppender;
+import org.apache.wicket.util.string.Strings;
+
+/**
+ * An AttributeModifier specialized in managing the <em>CSS style</em>
+ * attribute
+ */
+public abstract class StyleAttributeModifier extends AttributeAppender
+{
+	private static final Pattern STYLES_SPLITTER = Pattern.compile("\\s*;\\s*");
+	private static final Pattern KEY_VALUE_SPLITTER = Pattern.compile("\\s*:\\s*");
+
+	/**
+	 * Constructor.
+	 */
+	public StyleAttributeModifier()
+	{
+		super("style", null, ";");
+	}
+
+	@Override
+	protected final String newValue(String currentValue, String appendValue)
+	{
+		String[] styles;
+		if (Strings.isEmpty(currentValue))
+		{
+			styles = new String[0];
+		}
+		else
+		{
+			styles = STYLES_SPLITTER.split(currentValue.trim());
+		}
+		Map<String, String> oldStyles = new LinkedHashMap<>();
+		for (String style : styles)
+		{
+			String[] keyValue = KEY_VALUE_SPLITTER.split(style, 2);
+			oldStyles.put(keyValue[0], keyValue[1]);
+		}
+
+		Map<String, String> newStyles = update(oldStyles);
+
+		StringBuilder result = new StringBuilder();
+		for (Map.Entry<String, String> entry : newStyles.entrySet())
+		{
+			result
+				.append(entry.getKey())
+				.append(':')
+				.append(entry.getValue())
+				.append(getSeparator());
+		}
+		return result.length() > 0 ? result.toString() : VALUELESS_ATTRIBUTE_REMOVE;
+	}
+
+	/**
+	 * Callback to update the CSS class values for a tag.
+	 *
+	 * @param oldStyles
+	 *          A map with the old style key/values
+	 * @return A map with the new style key/values
+	 */
+	protected abstract Map<String, String> update(Map<String, String> oldStyles);
+}

http://git-wip-us.apache.org/repos/asf/wicket/blob/e2f8fae1/wicket-core/src/test/java/org/apache/wicket/ClassAttributeModifierTest.java
----------------------------------------------------------------------
diff --git a/wicket-core/src/test/java/org/apache/wicket/ClassAttributeModifierTest.java b/wicket-core/src/test/java/org/apache/wicket/ClassAttributeModifierTest.java
index 9b425ad..7cde80c 100644
--- a/wicket-core/src/test/java/org/apache/wicket/ClassAttributeModifierTest.java
+++ b/wicket-core/src/test/java/org/apache/wicket/ClassAttributeModifierTest.java
@@ -75,7 +75,7 @@ public class ClassAttributeModifierTest extends Assert
 		ComponentTag tag = createTag();
 
 		Map<String, Object> attributes = tag.getAttributes();
-		attributes.put(cam.getAttribute(), "one two");
+		attributes.put(cam.getAttribute(), "one two    ");
 
 		cam.replaceAttributeValue(null, tag);
 
@@ -102,7 +102,7 @@ public class ClassAttributeModifierTest extends Assert
 		ComponentTag tag = createTag();
 
 		Map<String, Object> attributes = tag.getAttributes();
-		attributes.put(cam.getAttribute(), "two one");
+		attributes.put(cam.getAttribute(), "two    one");
 
 		cam.replaceAttributeValue(null, tag);
 

http://git-wip-us.apache.org/repos/asf/wicket/blob/e2f8fae1/wicket-core/src/test/java/org/apache/wicket/StyleAttributeModifierTest.java
----------------------------------------------------------------------
diff --git a/wicket-core/src/test/java/org/apache/wicket/StyleAttributeModifierTest.java b/wicket-core/src/test/java/org/apache/wicket/StyleAttributeModifierTest.java
new file mode 100644
index 0000000..b471166
--- /dev/null
+++ b/wicket-core/src/test/java/org/apache/wicket/StyleAttributeModifierTest.java
@@ -0,0 +1,120 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.wicket;
+
+import java.util.Map;
+
+import org.apache.wicket.markup.ComponentTag;
+import org.apache.wicket.markup.parser.XmlTag;
+import org.junit.Assert;
+import org.junit.Test;
+
+/**
+ * Tests for StyleAttributeModifier
+ */
+public class StyleAttributeModifierTest extends Assert
+{
+	/**
+	 * Adds two style properties
+	 */
+	@Test
+	public void addCssStyles()
+	{
+		StyleAttributeModifier cam = new StyleAttributeModifier()
+		{
+			@Override
+			protected Map<String, String> update(Map<String, String> oldStyles)
+			{
+				oldStyles.put("color", "white");
+				oldStyles.put("font-size", "9px");
+				return oldStyles;
+			}
+		};
+		ComponentTag tag = createTag();
+
+		Map<String, Object> attributes = tag.getAttributes();
+
+		cam.replaceAttributeValue(null, tag);
+
+		String styles = (String) attributes.get(cam.getAttribute());
+		assertEquals("color:white;font-size:9px;", styles);
+	}
+
+	/**
+	 * Modifies one style, removes another and adds a new style
+	 */
+	@Test
+	public void addRemoveCssStyles()
+	{
+		StyleAttributeModifier cam = new StyleAttributeModifier()
+		{
+			@Override
+			protected Map<String, String> update(Map<String, String> oldStyles)
+			{
+				oldStyles.put("color", "black");           // modify the value
+				oldStyles.remove("font-size");             // remove
+				oldStyles.put("background-color", "red");  // add
+				return oldStyles;
+			}
+		};
+		ComponentTag tag = createTag();
+
+		Map<String, Object> attributes = tag.getAttributes();
+		attributes.put(cam.getAttribute(), "color:white;font-size:9px;");
+
+		cam.replaceAttributeValue(null, tag);
+
+		String classes = (String) attributes.get(cam.getAttribute());
+		assertEquals("color:black;background-color:red;", classes);
+	}
+
+	/**
+	 * Removes all CSS style values and the attribute itself
+	 */
+	@Test
+	public void removeAllCssStyles()
+	{
+		StyleAttributeModifier cam = new StyleAttributeModifier()
+		{
+			@Override
+			protected Map<String, String> update(Map<String, String> oldStyles)
+			{
+				oldStyles.remove("color");
+				oldStyles.remove("font-size");
+				return oldStyles;
+			}
+		};
+		ComponentTag tag = createTag();
+
+		Map<String, Object> attributes = tag.getAttributes();
+		attributes.put(cam.getAttribute(), "color:white ;   font-size:99999px; ");
+
+		cam.replaceAttributeValue(null, tag);
+
+		String classes = (String) attributes.get(cam.getAttribute());
+		assertNull(classes);
+	}
+
+	private ComponentTag createTag()
+	{
+		XmlTag xmlTag = new XmlTag();
+		ComponentTag tag = new ComponentTag(xmlTag);
+		tag.setId("StyleAttributeModifier");
+		tag.setName("test");
+		return tag;
+	}
+}