You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@wicket.apache.org by iv...@apache.org on 2007/03/06 02:41:37 UTC

svn commit: r514950 - in /incubator/wicket/trunk/wicket/src/main/java/wicket: ./ markup/html/form/ markup/repeater/ markup/repeater/data/ protocol/http/

Author: ivaynberg
Date: Mon Mar  5 17:41:36 2007
New Revision: 514950

URL: http://svn.apache.org/viewvc?view=rev&rev=514950
Log:
first pass at repeaters cleanup, gridview lives again!

Modified:
    incubator/wicket/trunk/wicket/src/main/java/wicket/Component.java
    incubator/wicket/trunk/wicket/src/main/java/wicket/MarkupContainer.java
    incubator/wicket/trunk/wicket/src/main/java/wicket/markup/html/form/Form.java
    incubator/wicket/trunk/wicket/src/main/java/wicket/markup/repeater/DefaultItemReuseStrategy.java
    incubator/wicket/trunk/wicket/src/main/java/wicket/markup/repeater/IItemFactory.java
    incubator/wicket/trunk/wicket/src/main/java/wicket/markup/repeater/IItemReuseStrategy.java
    incubator/wicket/trunk/wicket/src/main/java/wicket/markup/repeater/RefreshingView.java
    incubator/wicket/trunk/wicket/src/main/java/wicket/markup/repeater/ReuseIfModelsEqualStrategy.java
    incubator/wicket/trunk/wicket/src/main/java/wicket/markup/repeater/data/GridView.java
    incubator/wicket/trunk/wicket/src/main/java/wicket/protocol/http/WicketServlet.java

Modified: incubator/wicket/trunk/wicket/src/main/java/wicket/Component.java
URL: http://svn.apache.org/viewvc/incubator/wicket/trunk/wicket/src/main/java/wicket/Component.java?view=diff&rev=514950&r1=514949&r2=514950
==============================================================================
--- incubator/wicket/trunk/wicket/src/main/java/wicket/Component.java (original)
+++ incubator/wicket/trunk/wicket/src/main/java/wicket/Component.java Mon Mar  5 17:41:36 2007
@@ -708,6 +708,24 @@
 		return parent;
 	}
 
+	public final Component reparent(MarkupContainer<?> parent)
+	{
+		this.parent = getRealParent(parent, id);
+		if (id.startsWith(AUTO_COMPONENT_PREFIX) == false)
+		{
+			this.markupFragment = getMarkupFragment();
+		}
+		else
+		{
+			setAuto(true);
+		}
+		this.parent.add(this);
+		setFlag(FLAG_REMOVED_FROM_PARENT, false);
+
+		return this;
+	}
+
+
 	/**
 	 * Gets the markup fragment associated with the component. Except for Pages,
 	 * Panels and Borders, it is assumed that the first markup element of the
@@ -2017,11 +2035,11 @@
 		if (isVisible())
 		{
 			// is this component also a IHeaderContributor
-			if (this instanceof IHeaderContributor) 
+			if (this instanceof IHeaderContributor)
 			{
 				((IHeaderContributor)this).renderHead(response);
 			}
-			
+
 			// Ask all behaviors if they have something to contribute to the
 			// header or body onLoad tag.
 			if (this.behaviors != null)

Modified: incubator/wicket/trunk/wicket/src/main/java/wicket/MarkupContainer.java
URL: http://svn.apache.org/viewvc/incubator/wicket/trunk/wicket/src/main/java/wicket/MarkupContainer.java?view=diff&rev=514950&r1=514949&r2=514950
==============================================================================
--- incubator/wicket/trunk/wicket/src/main/java/wicket/MarkupContainer.java (original)
+++ incubator/wicket/trunk/wicket/src/main/java/wicket/MarkupContainer.java Mon Mar  5 17:41:36 2007
@@ -180,21 +180,27 @@
 
 		// Add to map
 		Component<?> replaced = put(child);
-		if (replaced != null)
+		// guard against the component.reparent(component.getparent()) case
+		if (replaced != child)
 		{
-			replaced.setFlag(FLAG_REMOVED_FROM_PARENT, true);
-			removedComponent(replaced);
-			// The position of the associated markup remains the same
-			child.markupIndex = replaced.markupIndex;
+			if (replaced != null)
+			{
+				replaced.setFlag(FLAG_REMOVED_FROM_PARENT, true);
+				removedComponent(replaced);
+				// The position of the associated markup remains the same
+				child.markupIndex = replaced.markupIndex;
 
 
-			// The generated markup id remains the same
-			String replacedId = (replaced.hasMarkupIdMetaData()) ? replaced.getMarkupId() : null;
-			child.setMarkupIdMetaData(replacedId);
-		}
-		// now call addedComponent (after removedComponent)
-		addedComponent(child);
+				// The generated markup id remains the same
+				String replacedId = (replaced.hasMarkupIdMetaData())
+						? replaced.getMarkupId()
+						: null;
+				child.setMarkupIdMetaData(replacedId);
+			}
 
+			// now call addedComponent (after removedComponent)
+			addedComponent(child);
+		}
 		return this;
 	}
 
@@ -505,6 +511,13 @@
 	 */
 	public final void removeAll()
 	{
+		Iterator<Component<?>> children = iterator();
+		while (children.hasNext())
+		{
+			children.next().setFlag(FLAG_REMOVED_FROM_PARENT, true);
+		}
+
+
 		if (children != null)
 		{
 			addStateChange(new Change()

Modified: incubator/wicket/trunk/wicket/src/main/java/wicket/markup/html/form/Form.java
URL: http://svn.apache.org/viewvc/incubator/wicket/trunk/wicket/src/main/java/wicket/markup/html/form/Form.java?view=diff&rev=514950&r1=514949&r2=514950
==============================================================================
--- incubator/wicket/trunk/wicket/src/main/java/wicket/markup/html/form/Form.java (original)
+++ incubator/wicket/trunk/wicket/src/main/java/wicket/markup/html/form/Form.java Mon Mar  5 17:41:36 2007
@@ -619,17 +619,9 @@
 		}
 
 		// append the button
-		String userAgent = ((WebClientInfo)getSession().getClientInfo()).getUserAgent();
 		buffer.append("<input type=\"submit\" value=\"").append(value).append("\" name=\"").append(
 				defaultButton.getInputName()).append("\"");
-		if (userAgent != null && userAgent.indexOf("MSIE") != -1)
-		{
-			buffer.append("style=\"width: 0px; height: 0px; position: absolute;\"");
-		}
-		else
-		{
-			buffer.append(" style=\"display: none\"");
-		}
+		buffer.append("style=\"width: 0px; height: 0px; position: absolute; left:-1000px;\"");
 		buffer.append(" />");
 		getResponse().write(buffer);
 	}

Modified: incubator/wicket/trunk/wicket/src/main/java/wicket/markup/repeater/DefaultItemReuseStrategy.java
URL: http://svn.apache.org/viewvc/incubator/wicket/trunk/wicket/src/main/java/wicket/markup/repeater/DefaultItemReuseStrategy.java?view=diff&rev=514950&r1=514949&r2=514950
==============================================================================
--- incubator/wicket/trunk/wicket/src/main/java/wicket/markup/repeater/DefaultItemReuseStrategy.java (original)
+++ incubator/wicket/trunk/wicket/src/main/java/wicket/markup/repeater/DefaultItemReuseStrategy.java Mon Mar  5 17:41:36 2007
@@ -51,7 +51,7 @@
 	 * @see wicket.markup.repeater.IItemReuseStrategy#getItems(MarkupContainer, wicket.markup.repeater.IItemFactory,
 	 *      java.util.Iterator, java.util.Iterator)
 	 */
-	public Iterator<Item<T>> getItems(final MarkupContainer<?> parent, final IItemFactory<T> factory, final Iterator<IModel<T>> newModels,
+	public Iterator<Item<T>> getItems(final IItemFactory<T> factory, final Iterator<IModel<T>> newModels,
 			final Iterator<Item<T>> existingItems)
 	{
 		return new Iterator<Item<T>>()
@@ -72,7 +72,7 @@
 			{
 				final IModel<T> model = newModels.next();
 
-				Item<T> item = factory.newItem(parent, index, model);
+				Item<T> item = factory.newItem(index, model);
 				index++;
 
 				return item;

Modified: incubator/wicket/trunk/wicket/src/main/java/wicket/markup/repeater/IItemFactory.java
URL: http://svn.apache.org/viewvc/incubator/wicket/trunk/wicket/src/main/java/wicket/markup/repeater/IItemFactory.java?view=diff&rev=514950&r1=514949&r2=514950
==============================================================================
--- incubator/wicket/trunk/wicket/src/main/java/wicket/markup/repeater/IItemFactory.java (original)
+++ incubator/wicket/trunk/wicket/src/main/java/wicket/markup/repeater/IItemFactory.java Mon Mar  5 17:41:36 2007
@@ -16,7 +16,6 @@
  */
 package wicket.markup.repeater;
 
-import wicket.MarkupContainer;
 import wicket.model.IModel;
 
 /**
@@ -42,8 +41,8 @@
 	 * @param model
 	 *            the model for the new data item
 	 * 
-	 * @return DataItem new DataItem
+	 * @return  new Item
 	 */
-	Item<T> newItem(MarkupContainer<?> parent, int index, IModel<T> model);
+	Item<T> newItem(int index, IModel<T> model);
 
 }

Modified: incubator/wicket/trunk/wicket/src/main/java/wicket/markup/repeater/IItemReuseStrategy.java
URL: http://svn.apache.org/viewvc/incubator/wicket/trunk/wicket/src/main/java/wicket/markup/repeater/IItemReuseStrategy.java?view=diff&rev=514950&r1=514949&r2=514950
==============================================================================
--- incubator/wicket/trunk/wicket/src/main/java/wicket/markup/repeater/IItemReuseStrategy.java (original)
+++ incubator/wicket/trunk/wicket/src/main/java/wicket/markup/repeater/IItemReuseStrategy.java Mon Mar  5 17:41:36 2007
@@ -25,15 +25,15 @@
 /**
  * Interface for item reuse strategies.
  * <p>
- * <u>Notice:</u> Child items will be rendered in the order they are provided
- * by the returned iterator, so it is important that the strategy preserve this
- * order
+ * <u>Note:</u> Child items will be rendered in the order they are provided by
+ * the returned iterator, so it is important that the returned iterator
+ * preserves the order of the <code>models</code> iterator.
  * </p>
  * 
  * @author Igor Vaynberg (ivaynberg)
- *
- * @param <T> 
- * 			Type of model object this component holds 
+ * 
+ * @param <T>
+ *            Type of model object this component holds
  */
 public interface IItemReuseStrategy<T> extends IClusterable
 {
@@ -42,19 +42,24 @@
 	 * Returns an iterator over items that will be added to the view. The
 	 * iterator needs to return all the items because the old ones are removed
 	 * prior to the new ones added.
+	 * <p>
+	 * <u>Note:</u> Child items will be rendered in the order they are provided
+	 * by the returned iterator, so it is important that the returned iterator
+	 * preserves the order of the <code>models</code> iterator.
+	 * </p>
 	 * 
 	 * @param parent
 	 *            parent for returned item components
 	 * 
 	 * @param factory
 	 *            implementation of IItemFactory
-	 * @param newModels
+	 * @param models
 	 *            iterator over models for items
 	 * @param existingItems
-	 *            iterator over child items
+	 *            iterator over child items from the previous request
 	 * @return iterator over items that will be added after all the old items
-	 *         are moved.
+	 *         are removed.
 	 */
-	Iterator<Item<T>> getItems(MarkupContainer<?> parent, IItemFactory<T> factory, Iterator<IModel<T>> newModels,
-			Iterator<Item<T>> existingItems);
+	Iterator<Item<T>> getItems(IItemFactory<T> factory,
+			Iterator<IModel<T>> models, Iterator<Item<T>> existingItems);
 }

Modified: incubator/wicket/trunk/wicket/src/main/java/wicket/markup/repeater/RefreshingView.java
URL: http://svn.apache.org/viewvc/incubator/wicket/trunk/wicket/src/main/java/wicket/markup/repeater/RefreshingView.java?view=diff&rev=514950&r1=514949&r2=514950
==============================================================================
--- incubator/wicket/trunk/wicket/src/main/java/wicket/markup/repeater/RefreshingView.java (original)
+++ incubator/wicket/trunk/wicket/src/main/java/wicket/markup/repeater/RefreshingView.java Mon Mar  5 17:41:36 2007
@@ -88,32 +88,45 @@
 	@Override
 	protected void onAttach()
 	{
+		if (isVisibleInHierarchy())
+		{
+			populate();
+		}
+
 		super.onAttach();
+	}
 
-		if (isVisibleInHierarchy())
+	/**
+	 * Populates the repeater with items
+	 */
+	protected void populate()
+	{
+
+		IItemFactory<T> itemFactory = new IItemFactory<T>()
 		{
 
-			IItemFactory<T> itemFactory = new IItemFactory<T>()
+			public Item<T> newItem(int index, IModel<T> model)
 			{
+				String id = RefreshingView.this.newChildId();
+				Item<T> item = RefreshingView.this.newItem(RefreshingView.this, id, index, model);
+				RefreshingView.this.populateItem(item);
+				return item;
+			}
 
-				public Item<T> newItem(MarkupContainer<?> parent, int index, IModel<T> model)
-				{
-					String id = RefreshingView.this.newChildId();
-					Item<T> item = RefreshingView.this.newItem(parent, id, index, model);
-					RefreshingView.this.populateItem(item);
-					item.attach();
-					return item;
-				}
-
-			};
-
-			Iterator<IModel<T>> models = getItemModels();
-			Iterator<Item<T>> items = getItemReuseStrategy().getItems(RefreshingView.this,
-					itemFactory, models, getItems());
-			removeAll();
-			addItems(items);
-		}
+		};
+
+		Iterator<IModel<T>> models = getItemModels();
+
+		Iterator<Item<T>> items = getItemReuseStrategy().getItems(itemFactory, models, getItems());
 
+		removeAll();
+		// we need to iterate over the strategy-returned iterator so that it
+		// creates all the items, and we also reattach them in case they
+		// have been detached by removeAll() and reused
+		while (items.hasNext())
+		{
+			items.next().reAttach();
+		}
 	}
 
 	/**
@@ -172,7 +185,7 @@
 	/**
 	 * @return iterator over item instances that exist as children of this view
 	 */
-	public Iterator<Item<T>> getItems()
+	private Iterator<Item<T>> getItems()
 	{
 		final Iterator<Component<?>> iterator = iterator();
 		return new Iterator<Item<T>>()
@@ -192,21 +205,6 @@
 				iterator.remove();
 			}
 		};
-	}
-
-	/**
-	 * Add items to the view. Prior to this all items were removed so every
-	 * request this function starts from a clean slate.
-	 * 
-	 * @param items
-	 *            item instances to be added to this view
-	 */
-	protected void addItems(Iterator<Item<T>> items)
-	{
-		while (items.hasNext())
-		{
-			items.next().reAttach();
-		}
 	}
 
 	// /////////////////////////////////////////////////////////////////////////

Modified: incubator/wicket/trunk/wicket/src/main/java/wicket/markup/repeater/ReuseIfModelsEqualStrategy.java
URL: http://svn.apache.org/viewvc/incubator/wicket/trunk/wicket/src/main/java/wicket/markup/repeater/ReuseIfModelsEqualStrategy.java?view=diff&rev=514950&r1=514949&r2=514950
==============================================================================
--- incubator/wicket/trunk/wicket/src/main/java/wicket/markup/repeater/ReuseIfModelsEqualStrategy.java (original)
+++ incubator/wicket/trunk/wicket/src/main/java/wicket/markup/repeater/ReuseIfModelsEqualStrategy.java Mon Mar  5 17:41:36 2007
@@ -55,7 +55,7 @@
 	 * @see wicket.markup.repeater.IItemReuseStrategy#getItems(MarkupContainer, wicket.markup.repeater.IItemFactory,
 	 *      java.util.Iterator, java.util.Iterator)
 	 */
-	public Iterator getItems(final MarkupContainer parent, final IItemFactory factory, final Iterator newModels,
+	public Iterator getItems(final IItemFactory factory, final Iterator newModels,
 			Iterator existingItems)
 	{
 		final Map<IModel< ? >, Item> modelToItem = new HashMap<IModel< ? >, Item>();
@@ -82,12 +82,13 @@
 				final Item item;
 				if (oldItem == null)
 				{
-					item = factory.newItem(parent, index, model);
+					item = factory.newItem(index, model);
 				}
 				else
 				{
 					oldItem.setIndex(index);
 					item = oldItem;
+					oldItem.reAttach();
 				}
 				index++;
 

Modified: incubator/wicket/trunk/wicket/src/main/java/wicket/markup/repeater/data/GridView.java
URL: http://svn.apache.org/viewvc/incubator/wicket/trunk/wicket/src/main/java/wicket/markup/repeater/data/GridView.java?view=diff&rev=514950&r1=514949&r2=514950
==============================================================================
--- incubator/wicket/trunk/wicket/src/main/java/wicket/markup/repeater/data/GridView.java (original)
+++ incubator/wicket/trunk/wicket/src/main/java/wicket/markup/repeater/data/GridView.java Mon Mar  5 17:41:36 2007
@@ -20,8 +20,11 @@
 
 import wicket.Component;
 import wicket.MarkupContainer;
+import wicket.markup.html.WebMarkupContainer;
+import wicket.markup.repeater.IItemFactory;
 import wicket.markup.repeater.Item;
 import wicket.markup.repeater.RepeatingView;
+import wicket.model.IModel;
 import wicket.version.undo.Change;
 
 /**
@@ -33,13 +36,13 @@
  * Example
  * 
  * <pre>
- *     &lt;tbody&gt;
- *       &lt;tr wicket:id=&quot;rows&quot; class&quot;even&quot;&gt;
- *         &lt;td wicket:id=&quot;cols&quot;&gt;
- *           &lt;span wicket:id=&quot;id&quot;&gt;Test ID&lt;/span&gt;
- *         &lt;/td&gt;
- *       &lt;/tr&gt;
- *     &lt;/tbody&gt;  
+ *        &lt;tbody&gt;
+ *          &lt;tr wicket:id=&quot;rows&quot; class&quot;even&quot;&gt;
+ *            &lt;td wicket:id=&quot;cols&quot;&gt;
+ *              &lt;span wicket:id=&quot;id&quot;&gt;Test ID&lt;/span&gt;
+ *            &lt;/td&gt;
+ *          &lt;/tr&gt;
+ *        &lt;/tbody&gt;  
  * </pre>
  * 
  * and in java:
@@ -51,8 +54,8 @@
  * @author Igor Vaynberg
  * @author Christian Essl
  * 
- * @param <T> 
- * 			Type of model object this component holds 
+ * @param <T>
+ *            Type of model object this component holds
  */
 public abstract class GridView<T> extends DataViewBase<T>
 {
@@ -202,10 +205,32 @@
 
 	}
 
-
 	@Override
-	protected void addItems(Iterator<Item<T>> items)
+	protected void populate()
 	{
+		Iterator<Item<T>> items = new ItemsIterator<T>(iterator());
+
+		WebMarkupContainer fake1 = new WebMarkupContainer(this, newChildId());
+		final WebMarkupContainer fake2 = new RepeatingView(fake1, "cols");
+
+		IItemFactory<T> itemFactory = new IItemFactory<T>()
+		{
+
+			public Item<T> newItem(int index, IModel<T> model)
+			{
+				String id = GridView.this.newChildId();
+				Item<T> item = GridView.this.newItem(fake2, id, index, model);
+				GridView.this.populateItem(item);
+				return item;
+			}
+
+		};
+
+
+		items = getItemReuseStrategy().getItems(itemFactory, getItemModels(), items);
+
+		removeAll();
+
 		if (items.hasNext())
 		{
 			final int cols = getColumns();
@@ -216,7 +241,7 @@
 			{
 				// Build a row
 				Item<T> rowItem = newRowItem(newChildId(), row);
-				new RepeatingView<T>(rowItem, "cols");
+				RepeatingView rowRepeater = new RepeatingView<T>(rowItem, "cols");
 
 				// Populate the row
 				for (int index = 0; index < cols; index++)
@@ -225,12 +250,14 @@
 					if (items.hasNext())
 					{
 						cellItem = items.next();
+						cellItem.reparent(rowRepeater);
 					}
 					else
 					{
-						cellItem = newEmptyItem(newChildId(), index);
+						cellItem = newEmptyItem(rowRepeater, newChildId(), index);
 						populateEmptyItem(cellItem);
 					}
+
 				}
 
 				// increase row
@@ -239,9 +266,9 @@
 			}
 			while (items.hasNext());
 		}
-
 	}
 
+
 	/**
 	 * @return data provider
 	 */
@@ -250,14 +277,6 @@
 		return internalGetDataProvider();
 	}
 
-	/**
-	 * @see wicket.markup.repeater.PageableRefreshingView#getItems()
-	 */
-	@Override
-	public Iterator<Item<T>> getItems()
-	{
-		return new ItemsIterator<T>(iterator());
-	}
 
 	/**
 	 * Add component to an Item for which there is no model anymore and is shown
@@ -272,13 +291,16 @@
 	 * Create a Item which represents an empty cell (there is no model for it in
 	 * the DataProvider)
 	 * 
+	 * @param parent
+	 *            parent
+	 * 
 	 * @param id
 	 * @param index
 	 * @return created item
 	 */
-	protected Item<T> newEmptyItem(final String id, int index)
+	protected Item<T> newEmptyItem(WebMarkupContainer<?> parent, final String id, int index)
 	{
-		return new Item<T>(this, id, index, null);
+		return new Item<T>(parent, id, index, null);
 	}
 
 	/**
@@ -296,10 +318,10 @@
 	/**
 	 * Iterator that iterats over all items in the cells
 	 * 
-	 * @author igor
-	 *
-	 * @param <T> 
-	 * 		Type of model object this component holds 
+	 * @author ivaynberg
+	 * 
+	 * @param <T>
+	 *            Type of model object this component holds
 	 */
 	private static class ItemsIterator<T> implements Iterator<Item<T>>
 	{

Modified: incubator/wicket/trunk/wicket/src/main/java/wicket/protocol/http/WicketServlet.java
URL: http://svn.apache.org/viewvc/incubator/wicket/trunk/wicket/src/main/java/wicket/protocol/http/WicketServlet.java?view=diff&rev=514950&r1=514949&r2=514950
==============================================================================
--- incubator/wicket/trunk/wicket/src/main/java/wicket/protocol/http/WicketServlet.java (original)
+++ incubator/wicket/trunk/wicket/src/main/java/wicket/protocol/http/WicketServlet.java Mon Mar  5 17:41:36 2007
@@ -116,7 +116,8 @@
 	public WicketServlet() {
 		// log warning
 		log.info("********************************************");
-		log.info("DEPRECATED! Please use WicketFilter instead.");
+		log.info("IF YOUR SERVLET CONTAINER SUPPORTS FILTERS");
+		log.info("YOU SHOULD USE WicketFilter INSTEAD");
 		log.info("********************************************");
 	}