Add keys to SelectionModel; add Column.dependsOnSelection() method to assist with table refresh Review at http://gwt-code-reviews.appspot.com/331801 Review by: jlabanca@google.com git-svn-id: https://google-web-toolkit.googlecode.com/svn/trunk@7898 8db76d5a-ed1c-0410-87a9-c151d255dfc7
diff --git a/bikeshed/src/com/google/gwt/bikeshed/list/client/Column.java b/bikeshed/src/com/google/gwt/bikeshed/list/client/Column.java index f296f4f..42b522a 100644 --- a/bikeshed/src/com/google/gwt/bikeshed/list/client/Column.java +++ b/bikeshed/src/com/google/gwt/bikeshed/list/client/Column.java
@@ -54,6 +54,15 @@ return cell.consumesEvents(); } + /** + * Returns true if the contents of the column may depend on the current + * state of the selection model associated with the table that is displaying + * this column. The default implementation returns false. + */ + public boolean dependsOnSelection() { + return false; + } + public Cell<C, V> getCell() { return cell; }
diff --git a/bikeshed/src/com/google/gwt/bikeshed/list/client/PagingTableListView.java b/bikeshed/src/com/google/gwt/bikeshed/list/client/PagingTableListView.java index 1124b75..d24666b 100644 --- a/bikeshed/src/com/google/gwt/bikeshed/list/client/PagingTableListView.java +++ b/bikeshed/src/com/google/gwt/bikeshed/list/client/PagingTableListView.java
@@ -196,6 +196,17 @@ row.setClassName("pagingTableListView " + ((indexOnPage & 0x1) == 0 ? "evenRow" : "oddRow")); } + + int numCols = columns.size(); + for (int c = 0; c < numCols; ++c) { + TableCellElement cell = row.getCells().getItem(c); + StringBuilder sb = new StringBuilder(); + Column<T, ?, ?> column = columns.get(c); + if (column.dependsOnSelection()) { + columns.get(c).render(q, sb); + cell.setInnerHTML(sb.toString()); + } + } } }
diff --git a/bikeshed/src/com/google/gwt/bikeshed/list/shared/DefaultSelectionModel.java b/bikeshed/src/com/google/gwt/bikeshed/list/shared/DefaultSelectionModel.java index 31046a0..30e5f7a 100644 --- a/bikeshed/src/com/google/gwt/bikeshed/list/shared/DefaultSelectionModel.java +++ b/bikeshed/src/com/google/gwt/bikeshed/list/shared/DefaultSelectionModel.java
@@ -29,7 +29,9 @@ public abstract class DefaultSelectionModel<T> extends AbstractSelectionModel<T> { - private final Map<T, Boolean> exceptions = new HashMap<T, Boolean>(); + private final Map<Object, Boolean> exceptions = new HashMap<Object, Boolean>(); + + private final ProvidesKey<T> keyProvider = getKeyProvider(); /** * Removes all exceptions. @@ -53,7 +55,8 @@ */ public boolean isSelected(T object) { // Check exceptions first - Boolean exception = exceptions.get(object); + Object key = getKey(object); + Boolean exception = exceptions.get(key); if (exception != null) { return exception.booleanValue(); } @@ -69,12 +72,13 @@ * selected state. */ public void setSelected(T object, boolean selected) { - Boolean currentlySelected = exceptions.get(object); + Object key = getKey(object); + Boolean currentlySelected = exceptions.get(key); if (currentlySelected != null && currentlySelected.booleanValue() != selected) { - exceptions.remove(object); + exceptions.remove(key); } else { - exceptions.put(object, selected); + exceptions.put(key, selected); } scheduleSelectionChangeEvent(); @@ -83,8 +87,15 @@ /** * Copies the exceptions map into a user-supplied map. */ - protected void getExceptions(Map<T, Boolean> output) { + protected void getExceptions(Map<Object, Boolean> output) { output.clear(); output.putAll(exceptions); } + + private Object getKey(T object) { + if (keyProvider == null) { + return object; + } + return keyProvider.getKey(object); + } }
diff --git a/bikeshed/src/com/google/gwt/bikeshed/list/shared/SelectionModel.java b/bikeshed/src/com/google/gwt/bikeshed/list/shared/SelectionModel.java index 9fe4548..8bc91bf 100644 --- a/bikeshed/src/com/google/gwt/bikeshed/list/shared/SelectionModel.java +++ b/bikeshed/src/com/google/gwt/bikeshed/list/shared/SelectionModel.java
@@ -111,6 +111,8 @@ */ private boolean isEventScheduled; + private ProvidesKey<T> keyProvider; + public HandlerRegistration addSelectionChangeHandler( SelectionChangeHandler handler) { return handlerManager.addHandler(SelectionChangeEvent.getType(), handler); @@ -121,6 +123,20 @@ } /** + * Returns a ProvidesKey instance that simply returns the input data item. + */ + public ProvidesKey<T> getKeyProvider() { + if (keyProvider == null) { + keyProvider = new ProvidesKey<T>() { + public Object getKey(T item) { + return item; + } + }; + } + return keyProvider; + } + + /** * Schedules a {@link SelectionModel.SelectionChangeEvent} to fire at the * end of the current event loop. */ @@ -146,6 +162,12 @@ HandlerRegistration addSelectionChangeHandler(SelectionChangeHandler handler); /** + * Returns a ProvidesKey instance that may be used to provide a unique + * key for each record. + */ + ProvidesKey<T> getKeyProvider(); + + /** * Check if an object is selected. * * @param object the object
diff --git a/bikeshed/src/com/google/gwt/sample/bikeshed/mail/client/MailSample.java b/bikeshed/src/com/google/gwt/sample/bikeshed/mail/client/MailSample.java index fa30a91..d4d9cea 100644 --- a/bikeshed/src/com/google/gwt/sample/bikeshed/mail/client/MailSample.java +++ b/bikeshed/src/com/google/gwt/sample/bikeshed/mail/client/MailSample.java
@@ -23,6 +23,7 @@ import com.google.gwt.bikeshed.list.client.TextColumn; import com.google.gwt.bikeshed.list.shared.DefaultSelectionModel; import com.google.gwt.bikeshed.list.shared.ListListModel; +import com.google.gwt.bikeshed.list.shared.ProvidesKey; import com.google.gwt.core.client.EntryPoint; import com.google.gwt.event.dom.client.ClickEvent; import com.google.gwt.event.dom.client.ClickHandler; @@ -55,6 +56,13 @@ } } + private static ProvidesKey<Message> keyProvider = + new ProvidesKey<Message>() { + public Object getKey(Message item) { + return Integer.valueOf(item.id); + } + }; + // A map from enum names to their values private static Map<String, Type> typeMap = new HashMap<String, Type>(); @@ -62,6 +70,11 @@ private Type type = Type.NONE; @Override + public ProvidesKey<Message> getKeyProvider() { + return keyProvider; + } + + @Override public boolean isDefaultSelected(Message object) { switch (type) { case NONE: @@ -109,7 +122,7 @@ } // Copy the exceptions into a TreeMap in order to sort by message id - TreeMap<Message, Boolean> exceptions = new TreeMap<Message, Boolean>(); + TreeMap<Object, Boolean> exceptions = new TreeMap<Object, Boolean>(); getExceptions(exceptions); appendExceptions(sb, exceptions, true); @@ -124,10 +137,10 @@ } private void appendExceptions(StringBuilder sb, - Map<Message, Boolean> exceptions, boolean selected) { + Map<Object, Boolean> exceptions, boolean selected) { boolean first = true; - for (Message message : exceptions.keySet()) { - if (exceptions.get(message) != selected) { + for (Object messageId : exceptions.keySet()) { + if (exceptions.get(messageId) != selected) { continue; } @@ -136,7 +149,7 @@ sb.append(selected ? '+' : '-'); sb.append("msg(s) "); } - sb.append(message.id); + sb.append(messageId); sb.append(' '); } } @@ -257,6 +270,11 @@ SimpleColumn<Message, Boolean> selectedColumn = new SimpleColumn<Message, Boolean>( new CheckboxCell()) { @Override + public boolean dependsOnSelection() { + return true; + } + + @Override public Boolean getValue(Message object) { return selectionModel.isSelected(object); } @@ -269,6 +287,14 @@ }); table.addColumn(selectedColumn, "Selected"); + TextColumn<Message> idColumn = new TextColumn<Message>() { + @Override + public String getValue(Message object) { + return "" + object.id; + } + }; + table.addColumn(idColumn, "ID"); + TextColumn<Message> isReadColumn = new TextColumn<Message>() { @Override public String getValue(Message object) {