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 2010/09/24 20:28:04 UTC

svn commit: r1001008 - in /wicket/branches/wicket-1.4.x/wicket/src: main/java/org/apache/wicket/markup/html/link/ test/java/org/apache/wicket/markup/html/link/

Author: mgrigorov
Date: Fri Sep 24 18:28:04 2010
New Revision: 1001008

URL: http://svn.apache.org/viewvc?rev=1001008&view=rev
Log:
WICKET-1936 Client-Side Image Map

Down-port the ClientSideImageMap from 1.5.
The old ImageMap is deprecated since 1.4.12 and now the users can migrate to the new implementation.


Added:
    wicket/branches/wicket-1.4.x/wicket/src/main/java/org/apache/wicket/markup/html/link/ClientSideImageMap.html   (with props)
    wicket/branches/wicket-1.4.x/wicket/src/main/java/org/apache/wicket/markup/html/link/ClientSideImageMap.java   (with props)
    wicket/branches/wicket-1.4.x/wicket/src/test/java/org/apache/wicket/markup/html/link/ClientSideImageMapPageExpectedResult_1.html   (with props)
    wicket/branches/wicket-1.4.x/wicket/src/test/java/org/apache/wicket/markup/html/link/ClientSideImageMapPage_1.html   (with props)
    wicket/branches/wicket-1.4.x/wicket/src/test/java/org/apache/wicket/markup/html/link/ClientSideImageMapPage_1.java   (with props)
    wicket/branches/wicket-1.4.x/wicket/src/test/java/org/apache/wicket/markup/html/link/ClientSideImageMapTest.java   (with props)

Added: wicket/branches/wicket-1.4.x/wicket/src/main/java/org/apache/wicket/markup/html/link/ClientSideImageMap.html
URL: http://svn.apache.org/viewvc/wicket/branches/wicket-1.4.x/wicket/src/main/java/org/apache/wicket/markup/html/link/ClientSideImageMap.html?rev=1001008&view=auto
==============================================================================
--- wicket/branches/wicket-1.4.x/wicket/src/main/java/org/apache/wicket/markup/html/link/ClientSideImageMap.html (added)
+++ wicket/branches/wicket-1.4.x/wicket/src/main/java/org/apache/wicket/markup/html/link/ClientSideImageMap.html Fri Sep 24 18:28:04 2010
@@ -0,0 +1,23 @@
+<!--
+   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.
+-->
+<html>
+<body>
+	<wicket:panel>
+		<area wicket:id="area"/>
+	</wicket:panel>
+</body>
+</html>

Propchange: wicket/branches/wicket-1.4.x/wicket/src/main/java/org/apache/wicket/markup/html/link/ClientSideImageMap.html
------------------------------------------------------------------------------
    svn:eol-style = native

Added: wicket/branches/wicket-1.4.x/wicket/src/main/java/org/apache/wicket/markup/html/link/ClientSideImageMap.java
URL: http://svn.apache.org/viewvc/wicket/branches/wicket-1.4.x/wicket/src/main/java/org/apache/wicket/markup/html/link/ClientSideImageMap.java?rev=1001008&view=auto
==============================================================================
--- wicket/branches/wicket-1.4.x/wicket/src/main/java/org/apache/wicket/markup/html/link/ClientSideImageMap.java (added)
+++ wicket/branches/wicket-1.4.x/wicket/src/main/java/org/apache/wicket/markup/html/link/ClientSideImageMap.java Fri Sep 24 18:28:04 2010
@@ -0,0 +1,269 @@
+/*
+ * 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.markup.html.link;
+
+import java.awt.Shape;
+import java.awt.geom.PathIterator;
+
+import org.apache.wicket.AttributeModifier;
+import org.apache.wicket.Component;
+import org.apache.wicket.behavior.AbstractBehavior;
+import org.apache.wicket.markup.ComponentTag;
+import org.apache.wicket.markup.html.image.Image;
+import org.apache.wicket.markup.html.panel.Panel;
+import org.apache.wicket.markup.repeater.RepeatingView;
+import org.apache.wicket.model.Model;
+import org.apache.wicket.model.PropertyModel;
+
+/**
+ * A client-side image map implementation which allows you to "attach" the map to any existing
+ * {@link Image} component.
+ * 
+ * @since 1.5
+ */
+public class ClientSideImageMap extends Panel
+{
+
+	private static final long serialVersionUID = 1L;
+	private static final String CIRCLE = "circle";
+	private static final String POLYGON = "polygon";
+	private static final String RECTANGLE = "rect";
+
+	private final RepeatingView areas;
+
+	/**
+	 * Constructs a client-side image map which is "attached" to the given {@link Image} component.
+	 * 
+	 * @param id
+	 *            the component id
+	 * @param image
+	 *            the image component
+	 */
+	public ClientSideImageMap(String id, Image image)
+	{
+		super(id);
+		setOutputMarkupId(true);
+		add(new AttributeModifier("name", true, new PropertyModel<String>(this, "markupId")));
+		image.add(new AttributeModifier("usemap", true, new UsemapModel()));
+
+		areas = new RepeatingView("area");
+		add(areas);
+	}
+
+	private String circleCoordinates(int x, int y, int radius)
+	{
+		return x + "," + y + "," + radius;
+	}
+
+	private String polygonCoordinates(int... coordinates)
+	{
+		final StringBuffer buffer = new StringBuffer();
+		for (int i = 0; i < coordinates.length; i++)
+		{
+			buffer.append(coordinates[i]);
+
+			if (i < (coordinates.length - 1))
+			{
+				buffer.append(',');
+			}
+		}
+		return buffer.toString();
+	}
+
+	private String rectangleCoordinates(int x1, int y1, int x2, int y2)
+	{
+		return x1 + "," + y1 + "," + x2 + "," + y2;
+	}
+
+	private String shapeCoordinates(Shape shape)
+	{
+		final StringBuilder sb = new StringBuilder();
+		final PathIterator pi = shape.getPathIterator(null, 1.0);
+		final float[] coords = new float[6];
+		final float[] lastMove = new float[2];
+		while (!pi.isDone())
+		{
+			switch (pi.currentSegment(coords))
+			{
+				case PathIterator.SEG_MOVETO :
+					if (sb.length() != 0)
+					{
+						sb.append(",");
+					}
+					sb.append(Math.round(coords[0]));
+					sb.append(",");
+					sb.append(Math.round(coords[1]));
+					lastMove[0] = coords[0];
+					lastMove[1] = coords[1];
+					break;
+				case PathIterator.SEG_LINETO :
+					if (sb.length() != 0)
+					{
+						sb.append(",");
+					}
+					sb.append(Math.round(coords[0]));
+					sb.append(",");
+					sb.append(Math.round(coords[1]));
+					break;
+				case PathIterator.SEG_CLOSE :
+					if (sb.length() != 0)
+					{
+						sb.append(",");
+					}
+					sb.append(Math.round(lastMove[0]));
+					sb.append(",");
+					sb.append(Math.round(lastMove[1]));
+					break;
+			}
+			pi.next();
+		}
+		return sb.toString();
+	}
+
+	@Override
+	protected void onComponentTag(ComponentTag tag)
+	{
+		// Must be attached to an map tag
+		checkComponentTag(tag, "map");
+
+		super.onComponentTag(tag);
+	}
+
+	/**
+	 * Generates a unique id string. This makes it easy to add items to be rendered w/out having to
+	 * worry about generating unique id strings in your code.
+	 * 
+	 * @return unique child id
+	 */
+	public String newChildId()
+	{
+		return areas.newChildId();
+	}
+
+	/**
+	 * Adds a circle-shaped area centered at (x,y) with radius r.
+	 * 
+	 * @param link
+	 *            the link
+	 * @param x
+	 *            x coordinate of the center of the circle
+	 * @param y
+	 *            y coordinate of center
+	 * @param radius
+	 *            the radius
+	 * @return this
+	 */
+	public ClientSideImageMap addCircleArea(AbstractLink link, int x, int y, int radius)
+	{
+		areas.add(link);
+
+		link.add(new Area(circleCoordinates(x, y, radius), CIRCLE));
+
+		return this;
+	}
+
+	/**
+	 * Adds a polygon-shaped area defined by coordinates.
+	 * 
+	 * @param link
+	 *            the link
+	 * @param coordinates
+	 *            the coordinates for the polygon
+	 * @return This
+	 */
+	public ClientSideImageMap addPolygonArea(AbstractLink link, int... coordinates)
+	{
+		areas.add(link);
+
+		link.add(new Area(polygonCoordinates(coordinates), POLYGON));
+
+		return this;
+	}
+
+	/**
+	 * Adds a rectangular-shaped area.
+	 * 
+	 * @param link
+	 *            the link
+	 * @param x1
+	 *            top left x
+	 * @param y1
+	 *            top left y
+	 * @param x2
+	 *            bottom right x
+	 * @param y2
+	 *            bottom right y
+	 * @return this
+	 */
+	public ClientSideImageMap addRectangleArea(AbstractLink link, int x1, int y1, int x2, int y2)
+	{
+		areas.add(link);
+		link.add(new Area(rectangleCoordinates(x1, y1, x2, y2), RECTANGLE));
+		return this;
+	}
+
+	/**
+	 * Adds an area defined by a shape object.
+	 * 
+	 * @param link
+	 *            the link
+	 * @param shape
+	 *            the shape
+	 * @return this
+	 */
+	public ClientSideImageMap addShapeArea(AbstractLink link, Shape shape)
+	{
+		areas.add(link);
+		link.add(new Area(shapeCoordinates(shape), POLYGON));
+		return this;
+	}
+
+	/**
+	 * Encapsulates the concept of an <area> within a <map>.
+	 */
+	private static class Area extends AbstractBehavior
+	{
+		private static final long serialVersionUID = 1L;
+
+		private final String coordinates;
+		private final String type;
+
+		protected Area(final String coordinates, final String type)
+		{
+			this.coordinates = coordinates;
+			this.type = type;
+		}
+
+		@Override
+		public void onComponentTag(Component component, ComponentTag tag)
+		{
+			tag.put("shape", type);
+			tag.put("coords", coordinates);
+		}
+	}
+
+	private class UsemapModel extends Model<String>
+	{
+		private static final long serialVersionUID = 1L;
+
+		@Override
+		public String getObject()
+		{
+			return "#" + getMarkupId();
+		}
+	}
+}

Propchange: wicket/branches/wicket-1.4.x/wicket/src/main/java/org/apache/wicket/markup/html/link/ClientSideImageMap.java
------------------------------------------------------------------------------
    svn:eol-style = native

Added: wicket/branches/wicket-1.4.x/wicket/src/test/java/org/apache/wicket/markup/html/link/ClientSideImageMapPageExpectedResult_1.html
URL: http://svn.apache.org/viewvc/wicket/branches/wicket-1.4.x/wicket/src/test/java/org/apache/wicket/markup/html/link/ClientSideImageMapPageExpectedResult_1.html?rev=1001008&view=auto
==============================================================================
--- wicket/branches/wicket-1.4.x/wicket/src/test/java/org/apache/wicket/markup/html/link/ClientSideImageMapPageExpectedResult_1.html (added)
+++ wicket/branches/wicket-1.4.x/wicket/src/test/java/org/apache/wicket/markup/html/link/ClientSideImageMapPageExpectedResult_1.html Fri Sep 24 18:28:04 2010
@@ -0,0 +1,11 @@
+<html xmlns:wicket>
+<head>
+<title>Mock Page</title>
+</head>
+<body>
+<img wicket:id="image" src="resources/org.apache.wicket.markup.html.image.ImageTest/Beer.gif" usemap="#map1"/>
+<map wicket:id="map" id="map1" name="map1"><wicket:panel>
+		<area wicket:id="area" href="http://wicket.apache.org" shape="circle" coords="0,0,10"/><area wicket:id="area" href="http://wicket.apache.org" shape="rect" coords="0,0,10,10"/><area wicket:id="area" href="http://wicket.apache.org" shape="polygon" coords="0,0,10,0,10,10,0,10"/><area wicket:id="area" href="http://wicket.apache.org" shape="polygon" coords="0,0,10,0,10,10,0,10,0,0,0,0"/>
+	</wicket:panel></map>
+</body>
+</html>
\ No newline at end of file

Propchange: wicket/branches/wicket-1.4.x/wicket/src/test/java/org/apache/wicket/markup/html/link/ClientSideImageMapPageExpectedResult_1.html
------------------------------------------------------------------------------
    svn:eol-style = native

Added: wicket/branches/wicket-1.4.x/wicket/src/test/java/org/apache/wicket/markup/html/link/ClientSideImageMapPage_1.html
URL: http://svn.apache.org/viewvc/wicket/branches/wicket-1.4.x/wicket/src/test/java/org/apache/wicket/markup/html/link/ClientSideImageMapPage_1.html?rev=1001008&view=auto
==============================================================================
--- wicket/branches/wicket-1.4.x/wicket/src/test/java/org/apache/wicket/markup/html/link/ClientSideImageMapPage_1.html (added)
+++ wicket/branches/wicket-1.4.x/wicket/src/test/java/org/apache/wicket/markup/html/link/ClientSideImageMapPage_1.html Fri Sep 24 18:28:04 2010
@@ -0,0 +1,9 @@
+<html xmlns:wicket>
+<head>
+<title>Mock Page</title>
+</head>
+<body>
+<img wicket:id="image" />
+<map wicket:id="map" />
+</body>
+</html>
\ No newline at end of file

Propchange: wicket/branches/wicket-1.4.x/wicket/src/test/java/org/apache/wicket/markup/html/link/ClientSideImageMapPage_1.html
------------------------------------------------------------------------------
    svn:eol-style = native

Added: wicket/branches/wicket-1.4.x/wicket/src/test/java/org/apache/wicket/markup/html/link/ClientSideImageMapPage_1.java
URL: http://svn.apache.org/viewvc/wicket/branches/wicket-1.4.x/wicket/src/test/java/org/apache/wicket/markup/html/link/ClientSideImageMapPage_1.java?rev=1001008&view=auto
==============================================================================
--- wicket/branches/wicket-1.4.x/wicket/src/test/java/org/apache/wicket/markup/html/link/ClientSideImageMapPage_1.java (added)
+++ wicket/branches/wicket-1.4.x/wicket/src/test/java/org/apache/wicket/markup/html/link/ClientSideImageMapPage_1.java Fri Sep 24 18:28:04 2010
@@ -0,0 +1,45 @@
+/*
+ * 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.markup.html.link;
+
+import java.awt.geom.Rectangle2D;
+
+import org.apache.wicket.ResourceReference;
+import org.apache.wicket.markup.html.WebPage;
+import org.apache.wicket.markup.html.image.Image;
+import org.apache.wicket.markup.html.image.ImageTest;
+
+/**
+ * @since 1.5
+ */
+public class ClientSideImageMapPage_1 extends WebPage
+{
+	public ClientSideImageMapPage_1()
+	{
+		final Image image = new Image("image", new ResourceReference(ImageTest.class, "Beer.gif"));
+		add(image);
+		final ClientSideImageMap map = new ClientSideImageMap("map", image);
+		map.addCircleArea(new ExternalLink("wicketHomePage1", "http://wicket.apache.org"), 0, 0, 10);
+		map.addRectangleArea(new ExternalLink("wicketHomePage2", "http://wicket.apache.org"), 0, 0,
+			10, 10);
+		map.addPolygonArea(new ExternalLink("wicketHomePage3", "http://wicket.apache.org"), 0, 0,
+			10, 0, 10, 10, 0, 10);
+		map.addShapeArea(new ExternalLink("wicketHomePage4", "http://wicket.apache.org"),
+			new Rectangle2D.Float(0, 0, 10, 10));
+		add(map);
+	}
+}

Propchange: wicket/branches/wicket-1.4.x/wicket/src/test/java/org/apache/wicket/markup/html/link/ClientSideImageMapPage_1.java
------------------------------------------------------------------------------
    svn:eol-style = native

Added: wicket/branches/wicket-1.4.x/wicket/src/test/java/org/apache/wicket/markup/html/link/ClientSideImageMapTest.java
URL: http://svn.apache.org/viewvc/wicket/branches/wicket-1.4.x/wicket/src/test/java/org/apache/wicket/markup/html/link/ClientSideImageMapTest.java?rev=1001008&view=auto
==============================================================================
--- wicket/branches/wicket-1.4.x/wicket/src/test/java/org/apache/wicket/markup/html/link/ClientSideImageMapTest.java (added)
+++ wicket/branches/wicket-1.4.x/wicket/src/test/java/org/apache/wicket/markup/html/link/ClientSideImageMapTest.java Fri Sep 24 18:28:04 2010
@@ -0,0 +1,33 @@
+/*
+ * 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.markup.html.link;
+
+import java.util.Locale;
+
+import org.apache.wicket.WicketTestCase;
+
+/**
+ * @since 1.5
+ */
+public class ClientSideImageMapTest extends WicketTestCase
+{
+	public void testRenderClientSideImageMapPage_1() throws Exception
+	{
+		tester.getWicketSession().setLocale(Locale.US);
+		executeTest(ClientSideImageMapPage_1.class, "ClientSideImageMapPageExpectedResult_1.html");
+	}
+}

Propchange: wicket/branches/wicket-1.4.x/wicket/src/test/java/org/apache/wicket/markup/html/link/ClientSideImageMapTest.java
------------------------------------------------------------------------------
    svn:eol-style = native