Tightened up datanucleus paths to include only **/domain/*.class

Merged over a few remaining changes from bikeshed

Review at http://gwt-code-reviews.appspot.com/776802


git-svn-id: https://google-web-toolkit.googlecode.com/svn/trunk@8615 8db76d5a-ed1c-0410-87a9-c151d255dfc7
diff --git a/samples/common.ant.xml b/samples/common.ant.xml
index cfd0a47..d0342c7 100755
--- a/samples/common.ant.xml
+++ b/samples/common.ant.xml
@@ -43,6 +43,12 @@
         <copy tofile="${sample.build}/pom.xml" file="pom.xml"/>
       </then>
     </if>
+    <if>
+      <available file="README-MAVEN.txt"/>
+      <then>
+        <copy tofile="${sample.build}/README-MAVEN.txt" file="README-MAVEN.txt"/>
+      </then>
+    </if>
   </target>
 
   <target name="compile" description="Compile all java files">
diff --git a/samples/expenses/README-MAVEN.txt b/samples/expenses/README-MAVEN.txt
new file mode 100644
index 0000000..2ef692d
--- /dev/null
+++ b/samples/expenses/README-MAVEN.txt
@@ -0,0 +1,69 @@
+--- Generated by GWT WebAppCreator ---
+
+Congratulations, you've successfully generated a starter project!  What next?
+
+-- Option A: Import your project into Eclipse (recommended) --
+
+If you use Eclipse, you can simply import the generated project into Eclipse.
+We've tested against Eclipse 3.4 and 3.5.  Later versions will likely also
+work, earlier versions may not.
+
+If the directory containing this file does not have a .classpath or .project
+file, generate them by running 'ant eclipse.generate'
+
+Eclipse users will need to have the m2eclipse, or equivalent, pluigin installed.
+Instructions for how to install the m2eclipse plugin can be found here:
+http://m2eclipse.sonatype.org/installing-m2eclipse.html
+
+Eclipse users will also want to run "mvn package" before importing into Eclipse.
+This will unpack the App Engine SDK to the local repository.
+
+In Eclipse, go to the File menu and choose:
+
+  File -> Import... -> Existing Maven Projects into Workspace
+
+  Browse to the directory containing this file,
+  select "Expenses".
+  
+  Click Finish.
+  
+You can now browse the project in Eclipse.
+
+To launch your web app in GWT development mode, go to the Project -> Properties
+and expand the Google menu item. From there:
+
+  Navigate to App Engine item, select  "Use App Engine", and specify which App Engine
+  SDK to use.
+ 
+  Navigate to the Web Appliation item, select "This project has a WAR directory",
+  speicigy src/main/webapp, and uncheck "Launch and deploy...".
+
+  Navigate to Web Toolkit, select "use Google Web Toolkit", and specify which
+  GWT SDK you want to use.
+
+  Go to the Run menu item and select Run -> Debug as -> Web Application.
+  
+  When prompted for which directory to run from, simply select the directory
+  that Eclipse defaults to.
+
+  You can now use the built-in debugger to debug your web app in development mode.
+
+If you supplied the junit path when invoking webAppCreator, you should see
+launch configurations for running your tests in development and production
+mode.
+
+-- Option B: Build from the command line with Maven --
+
+If you prefer to work from the command line, you can use Maven to build your
+project. (http://maven.apache.org/)  Maven uses the supplied 'pom.xml' file
+which describes exactly how to build your project.  This file has been tested
+to work against Ant 2.2.1.  The following assumes 'mvn' is on your command
+line path.
+
+To run development mode, just type 'mvn gae:run'.
+
+To compile your project for deployment, just type 'mvn package'.
+
+For a full listing of other goals, visit:
+http://mojo.codehaus.org/gwt-maven-plugin/plugin-info.html
+
diff --git a/samples/expenses/pom.xml b/samples/expenses/pom.xml
index 9eac05b..39eca1a 100644
--- a/samples/expenses/pom.xml
+++ b/samples/expenses/pom.xml
@@ -49,7 +49,7 @@
         </repository>
     <repository>
             <id>gwt-repo</id>
-            <url>http://google-web-toolkit.googlecode.com/svn/2.1.0.M2/gwt/maven</url>
+            <url>http://google-web-toolkit.googlecode.com/svn/2.1.0.M3/gwt/maven</url>
             <name>Google Web Toolkit Repository</name>
         </repository>
     </repositories>
@@ -65,7 +65,7 @@
         </pluginRepository>
     <pluginRepository>
             <id>gwt-plugin-repo</id>
-            <url>http://google-web-toolkit.googlecode.com/svn/2.1.0.M2/gwt/maven</url>
+            <url>http://google-web-toolkit.googlecode.com/svn/2.1.0.M3/gwt/maven</url>
             <name>Google Web Toolkit Plugin Repository</name>
         </pluginRepository>
     </pluginRepositories>
@@ -601,7 +601,7 @@
                 <configuration>
 						<fork>false</fork>
 						<log4jConfiguration>${basedir}/src/main/resources/log4j.properties</log4jConfiguration>
-						<mappingIncludes>**/*.class</mappingIncludes>
+						<mappingIncludes>**/domain/*.class</mappingIncludes>
 						<verbose>true</verbose>
 						<enhancerName>ASM</enhancerName>
 						<api>JPA</api>
@@ -650,9 +650,9 @@
 				<runTarget>/Expenses.html</runTarget>
                 <hostedWebapp>${project.build.directory}/${project.build.finalName}</hostedWebapp>
 				<modules>
-					<module>${project.groupId}.gwt.Expenses</module>
-                    <module>${project.groupId}.gwt.ExpensesMobile</module>
-			<module>${project.groupId}.gwt.LoadExpensesDB</module>
+					<module>${project.groupId}.Expenses</module>
+                    <module>${project.groupId}.ExpensesMobile</module>
+			<module>${project.groupId}.LoadExpensesDB</module>
 				</modules>
                 <server>com.google.appengine.tools.development.gwt.AppEngineLauncher</server>
                 <extraJvmArgs>-javaagent:${gae.home}/lib/agent/appengine-agent.jar -Xmx1024m</extraJvmArgs>
diff --git a/samples/expenses/src/main/java/com/google/gwt/sample/expenses/client/ExpenseDetails.java b/samples/expenses/src/main/java/com/google/gwt/sample/expenses/client/ExpenseDetails.java
index 059e17a..dd05e26 100644
--- a/samples/expenses/src/main/java/com/google/gwt/sample/expenses/client/ExpenseDetails.java
+++ b/samples/expenses/src/main/java/com/google/gwt/sample/expenses/client/ExpenseDetails.java
@@ -71,7 +71,7 @@
 import com.google.gwt.valuestore.shared.Property;
 import com.google.gwt.valuestore.shared.Record;
 import com.google.gwt.valuestore.shared.SyncResult;
-import com.google.gwt.view.client.ListViewAdapter;
+import com.google.gwt.view.client.ListDataProvider;
 
 import java.util.ArrayList;
 import java.util.Collection;
@@ -409,9 +409,9 @@
   private final Label errorPopupMessage = new Label();
 
   /**
-   * The adapter that provides expense items.
+   * The data provider that provides expense items.
    */
-  private final ListViewAdapter<ExpenseRecord> items;
+  private final ListDataProvider<ExpenseRecord> items;
 
   /**
    * The set of Expense keys that we have seen. When a new key is added, we
@@ -449,10 +449,10 @@
   public ExpenseDetails() {
     createErrorPopup();
     initWidget(uiBinder.createAndBindUi(this));
-    items = new ListViewAdapter<ExpenseRecord>();
+    items = new ListDataProvider<ExpenseRecord>();
     items.setKeyProvider(Expenses.EXPENSE_RECORD_KEY_PROVIDER);
     table.setKeyProvider(items);
-    items.addView(table);
+    items.addDataDisplay(table);
 
     // Switch to edit notes.
     notesEditLink.addClickHandler(new ClickHandler() {
@@ -899,7 +899,8 @@
     // Cancel the timer since we are about to send a request.
     refreshTimer.cancel();
     lastReceiver = new Receiver<List<ExpenseRecord>>() {
-      public void onSuccess(List<ExpenseRecord> newValues, Set<SyncResult> syncResults) {
+      public void onSuccess(
+          List<ExpenseRecord> newValues, Set<SyncResult> syncResults) {
         if (this == lastReceiver) {
           List<ExpenseRecord> list = new ArrayList<ExpenseRecord>(newValues);
           sortExpenses(list, lastComparator);
@@ -932,7 +933,8 @@
       }
     };
     expensesRequestFactory.expenseRequest().findExpensesByReport(
-        report.getRef(Record.id)).forProperties(getExpenseColumns()).fire(lastReceiver);
+        report.getRef(Record.id)).forProperties(getExpenseColumns()).fire(
+        lastReceiver);
   }
 
   /**
@@ -954,15 +956,15 @@
     ReportRecord editableReport = editRequest.edit(report);
     editableReport.setNotes(pendingNotes);
     editRequest.fire(new Receiver<Void>() {
-          public void onSuccess(Void ignore, Set<SyncResult> response) {
-            // We expect onReportChanged to be called if there are no errors.
-            String errorMessage = getErrorMessageFromSync(response);
-            if (errorMessage.length() > 0) {
-              showErrorPopup(errorMessage);
-              setNotesEditState(false, false, report.getNotes());
-            }
-          }
-        });
+      public void onSuccess(Void ignore, Set<SyncResult> response) {
+        // We expect onReportChanged to be called if there are no errors.
+        String errorMessage = getErrorMessageFromSync(response);
+        if (errorMessage.length() > 0) {
+          showErrorPopup(errorMessage);
+          setNotesEditState(false, false, report.getNotes());
+        }
+      }
+    });
   }
 
   /**
@@ -1039,13 +1041,12 @@
     editableRecord.setApproval(approval);
     editableRecord.setReasonDenied(reasonDenied);
     editRequest.fire(new Receiver<Void>() {
-          public void onSuccess(Void ignore, Set<SyncResult> response) {
-            String errorMessage = getErrorMessageFromSync(response);
-            if (errorMessage.length() > 0) {
-              syncCommit(
-                  record, errorMessage.length() > 0 ? errorMessage : null);
-            }
-          }
-        });
+      public void onSuccess(Void ignore, Set<SyncResult> response) {
+        String errorMessage = getErrorMessageFromSync(response);
+        if (errorMessage.length() > 0) {
+          syncCommit(record, errorMessage.length() > 0 ? errorMessage : null);
+        }
+      }
+    });
   }
 }
diff --git a/samples/expenses/src/main/java/com/google/gwt/sample/expenses/client/ExpenseList.java b/samples/expenses/src/main/java/com/google/gwt/sample/expenses/client/ExpenseList.java
index aa5e1d2..157b273 100644
--- a/samples/expenses/src/main/java/com/google/gwt/sample/expenses/client/ExpenseList.java
+++ b/samples/expenses/src/main/java/com/google/gwt/sample/expenses/client/ExpenseList.java
@@ -34,11 +34,11 @@
 import com.google.gwt.i18n.client.DateTimeFormat;
 import com.google.gwt.regexp.shared.RegExp;
 import com.google.gwt.requestfactory.shared.Receiver;
+import com.google.gwt.sample.expenses.client.style.Styles;
 import com.google.gwt.sample.expenses.client.request.EmployeeRecord;
 import com.google.gwt.sample.expenses.client.request.ExpensesRequestFactory;
 import com.google.gwt.sample.expenses.client.request.ReportRecord;
 import com.google.gwt.sample.expenses.client.request.ReportRecordChanged;
-import com.google.gwt.sample.expenses.client.style.Styles;
 import com.google.gwt.uibinder.client.UiBinder;
 import com.google.gwt.uibinder.client.UiFactory;
 import com.google.gwt.uibinder.client.UiField;
@@ -53,7 +53,7 @@
 import com.google.gwt.user.client.ui.Widget;
 import com.google.gwt.valuestore.shared.Property;
 import com.google.gwt.valuestore.shared.SyncResult;
-import com.google.gwt.view.client.AsyncListViewAdapter;
+import com.google.gwt.view.client.AsyncDataProvider;
 import com.google.gwt.view.client.HasData;
 import com.google.gwt.view.client.NoSelectionModel;
 import com.google.gwt.view.client.Range;
@@ -201,11 +201,11 @@
   }
 
   /**
-   * The adapter used to retrieve reports.
+   * The data provider used to retrieve reports.
    */
-  private class ReportAdapter extends AsyncListViewAdapter<ReportRecord> {
+  private class ReportDataProvider extends AsyncDataProvider<ReportRecord> {
     @Override
-    protected void onRangeChanged(HasData<ReportRecord> view) {
+    protected void onRangeChanged(HasData<ReportRecord> display) {
       requestReports(false);
     }
   }
@@ -283,9 +283,9 @@
   private final List<Property<?>> reportColumns;
 
   /**
-   * The adapter that provides reports.
+   * The data provider that provides reports.
    */
-  private final ReportAdapter reports = new ReportAdapter();
+  private final ReportDataProvider reports = new ReportDataProvider();
 
   /**
    * The factory used to send requests.
@@ -314,8 +314,8 @@
     searchBox = new DefaultTextBox("search");
     initWidget(uiBinder.createAndBindUi(this));
 
-    // Add the view to the adapter.
-    reports.addView(table);
+    // Add the view to the data provider.
+    reports.addDataDisplay(table);
 
     // Listen for key events from the text boxes.
     searchBox.addKeyUpHandler(new KeyUpHandler() {
@@ -352,7 +352,7 @@
       if (record != null && changedId.equals(record.getId())) {
         List<ReportRecord> changedList = new ArrayList<ReportRecord>();
         changedList.add(changed);
-        reports.updateViewData(i + table.getPageStart(), 1, changedList);
+        reports.updateRowData(i + table.getPageStart(), changedList);
       }
       i++;
     }
@@ -390,7 +390,7 @@
   @UiFactory
   SimplePager createPager() {
     SimplePager p = new SimplePager(TextLocation.RIGHT);
-    p.setView(table);
+    p.setDisplay(table);
     p.setRangeLimited(true);
     return p;
   }
@@ -471,14 +471,15 @@
     final NoSelectionModel<ReportRecord> selectionModel = new NoSelectionModel<
         ReportRecord>();
     table.setSelectionModel(selectionModel);
-    selectionModel.addSelectionChangeHandler(new SelectionChangeEvent.Handler() {
-      public void onSelectionChange(SelectionChangeEvent event) {
-        Object selected = selectionModel.getLastSelectedObject();
-        if (selected != null && listener != null) {
-          listener.onReportSelected((ReportRecord) selected);
-        }
-      }
-    });
+    selectionModel.addSelectionChangeHandler(
+        new SelectionChangeEvent.Handler() {
+          public void onSelectionChange(SelectionChangeEvent event) {
+            Object selected = selectionModel.getLastSelectedObject();
+            if (selected != null && listener != null) {
+              listener.onReportSelected((ReportRecord) selected);
+            }
+          }
+        });
 
     // Spacer column.
     table.addColumn(new Column<ReportRecord, String>(new TextCell()) {
@@ -577,7 +578,7 @@
           if (this == lastDataSizeReceiver) {
             int count = response.intValue();
             // Treat count == 1000 as inexact due to AppEngine limitation
-            reports.updateDataSize(count, count != 1000);
+            reports.updateRowCount(count, count != 1000);
           }
         }
       };
@@ -593,10 +594,10 @@
           int size = newValues.size();
           if (size < table.getPageSize()) {
             // Now we know the exact data size
-            reports.updateDataSize(table.getPageStart() + size, true);
+            reports.updateRowCount(table.getPageStart() + size, true);
           }
           if (size > 0) {
-            reports.updateViewData(table.getPageStart(), size, newValues);
+            reports.updateRowData(table.getPageStart(), newValues);
           }
 
           // Add the new keys to the known keys.
diff --git a/samples/expenses/src/main/java/com/google/gwt/sample/expenses/client/ExpensesShell.ui.xml b/samples/expenses/src/main/java/com/google/gwt/sample/expenses/client/ExpensesShell.ui.xml
index 5a6954d..aea7ece 100644
--- a/samples/expenses/src/main/java/com/google/gwt/sample/expenses/client/ExpensesShell.ui.xml
+++ b/samples/expenses/src/main/java/com/google/gwt/sample/expenses/client/ExpensesShell.ui.xml
@@ -20,7 +20,8 @@
       left: 75%;
       right: 0%;
       text-align: center;
-      background-color: yellow;
+      background-color: white;
+      color: #7b8fae;    
     }
     
     .title {
diff --git a/samples/expenses/src/main/java/com/google/gwt/sample/expenses/client/MobileExpenseList.java b/samples/expenses/src/main/java/com/google/gwt/sample/expenses/client/MobileExpenseList.java
index ca70c27..447b382 100644
--- a/samples/expenses/src/main/java/com/google/gwt/sample/expenses/client/MobileExpenseList.java
+++ b/samples/expenses/src/main/java/com/google/gwt/sample/expenses/client/MobileExpenseList.java
@@ -1,12 +1,12 @@
 /*
  * Copyright 2010 Google Inc.
- * 
+ *
  * Licensed 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
@@ -26,7 +26,7 @@
 import com.google.gwt.user.client.ui.Widget;
 import com.google.gwt.valuestore.shared.Property;
 import com.google.gwt.valuestore.shared.SyncResult;
-import com.google.gwt.view.client.AsyncListViewAdapter;
+import com.google.gwt.view.client.AsyncDataProvider;
 import com.google.gwt.view.client.HasData;
 import com.google.gwt.view.client.NoSelectionModel;
 import com.google.gwt.view.client.SelectionChangeEvent;
@@ -95,7 +95,7 @@
 
   private final ExpensesRequestFactory requestFactory;
   private final CellList<ExpenseRecord> expenseList;
-  private final AsyncListViewAdapter<ExpenseRecord> expenseAdapter;
+  private final AsyncDataProvider<ExpenseRecord> expenseDataProvider;
   private final NoSelectionModel<ExpenseRecord> expenseSelection;
 
   /**
@@ -122,29 +122,31 @@
     }
   };
 
-  public MobileExpenseList(final Listener listener,
-      final ExpensesRequestFactory requestFactory) {
+  public MobileExpenseList(
+      final Listener listener, final ExpensesRequestFactory requestFactory) {
     this.listener = listener;
     this.requestFactory = requestFactory;
-    expenseAdapter = new AsyncListViewAdapter<ExpenseRecord>() {
+    expenseDataProvider = new AsyncDataProvider<ExpenseRecord>() {
       @Override
       protected void onRangeChanged(HasData<ExpenseRecord> view) {
         requestExpenses();
       }
     };
-    expenseAdapter.setKeyProvider(Expenses.EXPENSE_RECORD_KEY_PROVIDER);
+    expenseDataProvider.setKeyProvider(Expenses.EXPENSE_RECORD_KEY_PROVIDER);
 
     expenseList = new CellList<ExpenseRecord>(new ExpenseCell());
 
     expenseSelection = new NoSelectionModel<ExpenseRecord>();
     expenseList.setSelectionModel(expenseSelection);
-    expenseSelection.addSelectionChangeHandler(new SelectionChangeEvent.Handler() {
-      public void onSelectionChange(SelectionChangeEvent event) {
-        listener.onExpenseSelected(expenseSelection.getLastSelectedObject());
-      }
-    });
+    expenseSelection.addSelectionChangeHandler(
+        new SelectionChangeEvent.Handler() {
+          public void onSelectionChange(SelectionChangeEvent event) {
+            listener.onExpenseSelected(
+                expenseSelection.getLastSelectedObject());
+          }
+        });
 
-    expenseAdapter.addView(expenseList);
+    expenseDataProvider.addDataDisplay(expenseList);
     initWidget(expenseList);
   }
 
@@ -178,7 +180,7 @@
 
   public void onRefresh(boolean clear) {
     if (clear) {
-      expenseAdapter.updateDataSize(0, true);
+      expenseDataProvider.updateRowCount(0, true);
     }
     requestExpenses();
   }
@@ -206,11 +208,12 @@
       return;
     }
     lastReceiver = new Receiver<List<ExpenseRecord>>() {
-      public void onSuccess(List<ExpenseRecord> newValues, Set<SyncResult> syncResults) {
+      public void onSuccess(
+          List<ExpenseRecord> newValues, Set<SyncResult> syncResults) {
         if (this == lastReceiver) {
           int size = newValues.size();
-          expenseAdapter.updateDataSize(size, true);
-          expenseAdapter.updateViewData(0, size, newValues);
+          expenseDataProvider.updateRowCount(size, true);
+          expenseDataProvider.updateRowData(0, newValues);
 
           // Add the new keys to the known keys.
           boolean isInitialData = knownDeniedKeys == null;
@@ -218,12 +221,12 @@
             knownDeniedKeys = new HashSet<Object>();
           }
           for (ExpenseRecord value : newValues) {
-            Object key = expenseAdapter.getKey(value);
+            Object key = expenseDataProvider.getKey(value);
             String approval = value.getApproval();
             if (Expenses.Approval.DENIED.getText().equals(approval)) {
               if (!isInitialData && !knownDeniedKeys.contains(key)) {
                 (new PhaseAnimation.CellListPhaseAnimation<ExpenseRecord>(
-                    expenseList, value, expenseAdapter)).run();
+                    expenseList, value, expenseDataProvider)).run();
               }
               knownDeniedKeys.add(key);
             } else {
diff --git a/samples/expenses/src/main/java/com/google/gwt/sample/expenses/client/MobileReportList.java b/samples/expenses/src/main/java/com/google/gwt/sample/expenses/client/MobileReportList.java
index c27e1ec..ee59638 100644
--- a/samples/expenses/src/main/java/com/google/gwt/sample/expenses/client/MobileReportList.java
+++ b/samples/expenses/src/main/java/com/google/gwt/sample/expenses/client/MobileReportList.java
@@ -1,12 +1,12 @@
 /*
  * Copyright 2010 Google Inc.
- * 
+ *
  * Licensed 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
@@ -25,7 +25,7 @@
 import com.google.gwt.user.client.ui.Widget;
 import com.google.gwt.valuestore.shared.Property;
 import com.google.gwt.valuestore.shared.SyncResult;
-import com.google.gwt.view.client.AsyncListViewAdapter;
+import com.google.gwt.view.client.AsyncDataProvider;
 import com.google.gwt.view.client.HasData;
 import com.google.gwt.view.client.NoSelectionModel;
 import com.google.gwt.view.client.SelectionChangeEvent;
@@ -57,7 +57,7 @@
   private final EmployeeRecord employee;
   private final Listener listener;
   private final CellList<ReportRecord> reportList;
-  private final AsyncListViewAdapter<ReportRecord> reportAdapter;
+  private final AsyncDataProvider<ReportRecord> reportDataProvider;
   private final NoSelectionModel<ReportRecord> reportSelection;
   private final ExpensesRequestFactory requestFactory;
 
@@ -66,31 +66,34 @@
     this.listener = listener;
     this.requestFactory = requestFactory;
     this.employee = employee;
-    reportAdapter = new AsyncListViewAdapter<ReportRecord>() {
+
+    reportDataProvider = new AsyncDataProvider<ReportRecord>() {
       @Override
       protected void onRangeChanged(HasData<ReportRecord> view) {
         requestReports();
       }
     };
-    reportAdapter.setKeyProvider(Expenses.REPORT_RECORD_KEY_PROVIDER);
+    reportDataProvider.setKeyProvider(Expenses.REPORT_RECORD_KEY_PROVIDER);
 
     reportList = new CellList<ReportRecord>(new AbstractCell<ReportRecord>() {
       @Override
-      public void render(ReportRecord value, Object viewData, StringBuilder sb) {
+      public void render(
+          ReportRecord value, Object viewData, StringBuilder sb) {
         sb.append("<div class='item'>" + value.getPurpose() + "</div>");
       }
     });
 
     reportSelection = new NoSelectionModel<ReportRecord>();
     reportSelection.setKeyProvider(Expenses.REPORT_RECORD_KEY_PROVIDER);
-    reportSelection.addSelectionChangeHandler(new SelectionChangeEvent.Handler() {
-      public void onSelectionChange(SelectionChangeEvent event) {
-        listener.onReportSelected(reportSelection.getLastSelectedObject());
-      }
-    });
+    reportSelection.addSelectionChangeHandler(
+        new SelectionChangeEvent.Handler() {
+          public void onSelectionChange(SelectionChangeEvent event) {
+            listener.onReportSelected(reportSelection.getLastSelectedObject());
+          }
+        });
 
     reportList.setSelectionModel(reportSelection);
-    reportAdapter.addView(reportList);
+    reportDataProvider.addDataDisplay(reportList);
 
     initWidget(reportList);
     onRefresh(false);
@@ -125,7 +128,7 @@
 
   public void onRefresh(boolean clear) {
     if (clear) {
-      reportAdapter.updateDataSize(0, true);
+      reportDataProvider.updateRowCount(0, true);
     }
     requestReports();
   }
@@ -142,10 +145,11 @@
       return;
     }
     lastReceiver = new Receiver<List<ReportRecord>>() {
-      public void onSuccess(List<ReportRecord> newValues, Set<SyncResult> syncResults) {
+      public void onSuccess(
+          List<ReportRecord> newValues, Set<SyncResult> syncResults) {
         int size = newValues.size();
-        reportAdapter.updateDataSize(size, true);
-        reportAdapter.updateViewData(0, size, newValues);
+        reportDataProvider.updateRowCount(size, true);
+        reportDataProvider.updateRowData(0, newValues);
       }
     };
     requestFactory.reportRequest().findReportEntriesBySearch(employee.getId(), "",
diff --git a/samples/expenses/src/main/java/com/google/gwt/sample/expenses/client/ui/employee/EmployeeDetailsView.java b/samples/expenses/src/main/java/com/google/gwt/sample/expenses/client/ui/employee/EmployeeDetailsView.java
index b8fea04..e73dda5 100644
--- a/samples/expenses/src/main/java/com/google/gwt/sample/expenses/client/ui/employee/EmployeeDetailsView.java
+++ b/samples/expenses/src/main/java/com/google/gwt/sample/expenses/client/ui/employee/EmployeeDetailsView.java
@@ -95,7 +95,7 @@
     displayName.setInnerText(record.getDisplayName());
     userName.setInnerText(record.getUserName());
     password.setInnerText(record.getPassword());
-    supervisor.setInnerText(String.valueOf(record.getSupervisor() == null ? null : record.getSupervisor().getId()));
+    supervisor.setInnerText(EmployeeRenderer.instance().render(record.getSupervisor()));
     idSpan.setInnerText(record.getId().toString());
     versionSpan.setInnerText(record.getVersion().toString());
   }
diff --git a/samples/expenses/src/main/java/com/google/gwt/sample/expenses/client/ui/employee/EmployeeDetailsView.ui.xml b/samples/expenses/src/main/java/com/google/gwt/sample/expenses/client/ui/employee/EmployeeDetailsView.ui.xml
index bc70a28..2f473d9 100644
--- a/samples/expenses/src/main/java/com/google/gwt/sample/expenses/client/ui/employee/EmployeeDetailsView.ui.xml
+++ b/samples/expenses/src/main/java/com/google/gwt/sample/expenses/client/ui/employee/EmployeeDetailsView.ui.xml
@@ -35,7 +35,7 @@
     <table class='{style.fields}'>
       <tr><td><div class='{style.label}'>Display Name:</div></td><td><span ui:field='displayName'></span></td></tr>
       <tr><td><div class='{style.label}'>User Name:</div></td><td><span ui:field='userName'></span></td></tr>
-      <tr><td><div class='{style.label}'>Supervisor Key:</div></td><td><span ui:field='supervisorKey'></span></td></tr>
+      <tr><td><div class='{style.label}'>Supervisor:</div></td><td><span ui:field='supervisor'></span></td></tr>
       <tr><td><div class='{style.label}'>Password:</div></td><td><span ui:field='password'></span></td></tr>
    </table>
 
diff --git a/samples/expenses/src/main/java/com/google/gwt/sample/expenses/client/ui/employee/EmployeeEditView.java b/samples/expenses/src/main/java/com/google/gwt/sample/expenses/client/ui/employee/EmployeeEditView.java
index 5b130c3..16a2688 100644
--- a/samples/expenses/src/main/java/com/google/gwt/sample/expenses/client/ui/employee/EmployeeEditView.java
+++ b/samples/expenses/src/main/java/com/google/gwt/sample/expenses/client/ui/employee/EmployeeEditView.java
@@ -16,7 +16,6 @@
 package com.google.gwt.sample.expenses.client.ui.employee;
 
 import com.google.gwt.app.client.EditorSupport;
-import com.google.gwt.app.client.LongBox;
 import com.google.gwt.app.place.RecordEditView;
 import com.google.gwt.core.client.GWT;
 import com.google.gwt.dom.client.DivElement;
@@ -32,10 +31,10 @@
 import com.google.gwt.user.client.ui.HTMLPanel;
 import com.google.gwt.user.client.ui.InlineLabel;
 import com.google.gwt.user.client.ui.TextBox;
-import com.google.gwt.valuestore.shared.Property;
+import com.google.gwt.user.client.ui.ValueListBox;
 
+import java.util.Collection;
 import java.util.Map;
-import java.util.Set;
 
 /**
  * Edit view for employee records.
@@ -51,18 +50,31 @@
   private static final Binder BINDER = GWT.create(Binder.class);
   private static final DataBinder DATA_BINDER = GWT.create(DataBinder.class);
 
-  @UiField TextBox displayName;
-  @UiField TextBox password;
-  @UiField LongBox supervisorKey;
-  @UiField TextBox userName;
-  @UiField Button cancel;
-  @UiField Button save;
-  @UiField InlineLabel id;
-  @UiField InlineLabel version;
-  @UiField DivElement errors;
-  
-  @UiField Element editTitle;
-  @UiField Element createTitle;
+  @UiField
+  TextBox displayName;
+  @UiField
+  TextBox password;
+  @UiField(provided = true)
+  ValueListBox<EmployeeRecord> supervisor = new ValueListBox<EmployeeRecord>(
+      EmployeeRenderer.instance());
+
+  @UiField
+  TextBox userName;
+  @UiField
+  Button cancel;
+  @UiField
+  Button save;
+  @UiField
+  InlineLabel id;
+  @UiField
+  InlineLabel version;
+  @UiField
+  DivElement errors;
+
+  @UiField
+  Element editTitle;
+  @UiField
+  Element createTitle;
 
   private Delegate delegate;
   private EmployeeRecord record;
@@ -76,8 +88,8 @@
     return this;
   }
 
-  public Set<Property<?>> getProperties() {
-    return DATA_BINDER.getProperties();
+  public String[] getPaths() {
+    return DATA_BINDER.getPaths();
   }
 
   public EmployeeRecord getValue() {
@@ -102,6 +114,10 @@
     this.delegate = delegate;
   }
 
+  public void setEmployeePickerValues(Collection<EmployeeRecord> values) {
+    supervisor.setAcceptableValues(values);
+  }
+
   public void setEnabled(boolean enabled) {
     DATA_BINDER.setEnabled(this, enabled);
     save.setEnabled(enabled);
diff --git a/samples/expenses/src/main/java/com/google/gwt/sample/expenses/client/ui/employee/EmployeeEditView.ui.xml b/samples/expenses/src/main/java/com/google/gwt/sample/expenses/client/ui/employee/EmployeeEditView.ui.xml
index ccfba3e..1f836af 100644
--- a/samples/expenses/src/main/java/com/google/gwt/sample/expenses/client/ui/employee/EmployeeEditView.ui.xml
+++ b/samples/expenses/src/main/java/com/google/gwt/sample/expenses/client/ui/employee/EmployeeEditView.ui.xml
@@ -40,7 +40,7 @@
     <table class='{style.fields}'>
       <tr><td><div class='{style.label}'>Display Name:</div></td><td><g:TextBox ui:field='displayName'></g:TextBox></td></tr>
       <tr><td><div class='{style.label}'>User Name:</div></td><td><g:TextBox ui:field='userName'></g:TextBox></td></tr>
-      <tr><td><div class='{style.label}'>Supervisor Key:</div></td><td><a:LongBox ui:field='supervisorKey'></a:LongBox></td></tr>
+      <tr><td><div class='{style.label}'>Supervisor:</div></td><td><g:ValueListBox ui:field='supervisor'></g:ValueListBox></td></tr>
       <tr><td><div class='{style.label}'>Password:</div></td><td><g:PasswordTextBox ui:field='password'></g:PasswordTextBox></td></tr>
     </table>
 
diff --git a/samples/expenses/src/main/java/com/google/gwt/sample/expenses/client/ui/employee/EmployeeListView.java b/samples/expenses/src/main/java/com/google/gwt/sample/expenses/client/ui/employee/EmployeeListView.java
index 5e545f5..b94784b 100644
--- a/samples/expenses/src/main/java/com/google/gwt/sample/expenses/client/ui/employee/EmployeeListView.java
+++ b/samples/expenses/src/main/java/com/google/gwt/sample/expenses/client/ui/employee/EmployeeListView.java
@@ -15,7 +15,6 @@
  */
 package com.google.gwt.sample.expenses.client.ui.employee;
 
-import com.google.gwt.app.client.ProxyIdRenderer;
 import com.google.gwt.app.place.AbstractRecordListView;
 import com.google.gwt.app.place.PropertyColumn;
 import com.google.gwt.core.client.GWT;
@@ -51,10 +50,14 @@
     List<PropertyColumn<EmployeeRecord, ?>> columns = new ArrayList<PropertyColumn<EmployeeRecord, ?>>();
 
     columns.add(PropertyColumn.<EmployeeRecord> getStringPropertyColumn(EmployeeRecord.userName));
+
     columns.add(PropertyColumn.<EmployeeRecord> getStringPropertyColumn(EmployeeRecord.displayName));
+
     columns.add(PropertyColumn.<EmployeeRecord> getStringPropertyColumn(EmployeeRecord.password));
+
     columns.add(new PropertyColumn<EmployeeRecord, EmployeeRecord>(
-        EmployeeRecord.supervisor, ProxyIdRenderer.<EmployeeRecord>instance()));
+        EmployeeRecord.supervisor, EmployeeRenderer.instance()));
+
     return columns;
   }
 }
diff --git a/samples/expenses/src/main/java/com/google/gwt/sample/expenses/client/ui/employee/EmployeeListView.ui.xml b/samples/expenses/src/main/java/com/google/gwt/sample/expenses/client/ui/employee/EmployeeListView.ui.xml
index 50d9d31..f99a54b 100644
--- a/samples/expenses/src/main/java/com/google/gwt/sample/expenses/client/ui/employee/EmployeeListView.ui.xml
+++ b/samples/expenses/src/main/java/com/google/gwt/sample/expenses/client/ui/employee/EmployeeListView.ui.xml
@@ -50,7 +50,7 @@
     <c:CellTable width='100%' ui:field='table' pageSize='8'/>
     <div class='{style.controls}'>      
       <g:Button styleName='{style.createButton}' ui:field='newButton'>Create Employee</g:Button>
-      <c:SimplePager view='{table}' location='RIGHT'/>
+      <c:SimplePager display='{table}' location='RIGHT'/>
     </div>
   </g:HTMLPanel>
 </ui:UiBinder>
diff --git a/samples/expenses/src/main/java/com/google/gwt/sample/expenses/client/ui/employee/EmployeeRenderer.java b/samples/expenses/src/main/java/com/google/gwt/sample/expenses/client/ui/employee/EmployeeRenderer.java
new file mode 100644
index 0000000..be6c5eb
--- /dev/null
+++ b/samples/expenses/src/main/java/com/google/gwt/sample/expenses/client/ui/employee/EmployeeRenderer.java
@@ -0,0 +1,46 @@
+/*
+ * Copyright 2010 Google Inc.
+ * 
+ * Licensed 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 com.google.gwt.sample.expenses.client.ui.employee;
+
+import com.google.gwt.app.place.ProxyRenderer;
+import com.google.gwt.sample.expenses.client.request.EmployeeRecord;
+
+/**
+ * Renders {@link EmployeeRecord}s for display to the user. Requires the
+ * displayName property to have been fetched.
+ */
+public class EmployeeRenderer extends ProxyRenderer<EmployeeRecord> {
+  private static EmployeeRenderer INSTANCE;
+
+  public static EmployeeRenderer instance() {
+    if (INSTANCE == null) {
+      INSTANCE = new EmployeeRenderer();
+    }
+
+    return INSTANCE;
+  }
+
+  protected EmployeeRenderer() {
+    super(new String[] { "displayName"} );
+  }
+
+  public String render(EmployeeRecord object) {
+    if (object == null) {
+      return "";
+    }
+    return object.getDisplayName() + " (" + object.getId() + ")";
+  }
+}
diff --git a/samples/expenses/src/main/java/com/google/gwt/sample/expenses/client/ui/report/ReportDetailsView.java b/samples/expenses/src/main/java/com/google/gwt/sample/expenses/client/ui/report/ReportDetailsView.java
index 7740ffc..ec362aa 100644
--- a/samples/expenses/src/main/java/com/google/gwt/sample/expenses/client/ui/report/ReportDetailsView.java
+++ b/samples/expenses/src/main/java/com/google/gwt/sample/expenses/client/ui/report/ReportDetailsView.java
@@ -22,6 +22,7 @@
 import com.google.gwt.event.dom.client.HasClickHandlers;
 import com.google.gwt.i18n.client.DateTimeFormatRenderer;
 import com.google.gwt.sample.expenses.client.request.ReportRecord;
+import com.google.gwt.sample.expenses.client.ui.employee.EmployeeRenderer;
 import com.google.gwt.uibinder.client.UiBinder;
 import com.google.gwt.uibinder.client.UiField;
 import com.google.gwt.uibinder.client.UiHandler;
@@ -99,7 +100,7 @@
     created.setInnerText(new DateTimeFormatRenderer().render(record.getCreated()));
     idSpan.setInnerText(record.getId().toString());
     versionSpan.setInnerText(record.getVersion().toString());
-    reporterKey.setInnerText(String.valueOf(record.getReporter()));
-    approvedSupervisorKey.setInnerText(String.valueOf(record.getApprovedSupervisor()));
+    reporterKey.setInnerText(EmployeeRenderer.instance().render(record.getReporter()));
+    approvedSupervisorKey.setInnerText(EmployeeRenderer.instance().render(record.getApprovedSupervisor()));
   }
 }
diff --git a/samples/expenses/src/main/java/com/google/gwt/sample/expenses/client/ui/report/ReportEditView.java b/samples/expenses/src/main/java/com/google/gwt/sample/expenses/client/ui/report/ReportEditView.java
index a41f57e..0996f6f 100644
--- a/samples/expenses/src/main/java/com/google/gwt/sample/expenses/client/ui/report/ReportEditView.java
+++ b/samples/expenses/src/main/java/com/google/gwt/sample/expenses/client/ui/report/ReportEditView.java
@@ -16,14 +16,15 @@
 package com.google.gwt.sample.expenses.client.ui.report;
 
 import com.google.gwt.app.client.EditorSupport;
-import com.google.gwt.app.client.LongBox;
 import com.google.gwt.app.place.RecordEditView;
 import com.google.gwt.core.client.GWT;
 import com.google.gwt.dom.client.DivElement;
 import com.google.gwt.dom.client.Element;
 import com.google.gwt.dom.client.Style.Display;
 import com.google.gwt.event.dom.client.ClickEvent;
+import com.google.gwt.sample.expenses.client.request.EmployeeRecord;
 import com.google.gwt.sample.expenses.client.request.ReportRecord;
+import com.google.gwt.sample.expenses.client.ui.employee.EmployeeRenderer;
 import com.google.gwt.uibinder.client.UiBinder;
 import com.google.gwt.uibinder.client.UiField;
 import com.google.gwt.uibinder.client.UiHandler;
@@ -32,11 +33,11 @@
 import com.google.gwt.user.client.ui.HTMLPanel;
 import com.google.gwt.user.client.ui.InlineLabel;
 import com.google.gwt.user.client.ui.TextBox;
+import com.google.gwt.user.client.ui.ValueListBox;
 import com.google.gwt.user.datepicker.client.DateBox;
-import com.google.gwt.valuestore.shared.Property;
 
+import java.util.Collection;
 import java.util.Map;
-import java.util.Set;
 
 /**
  * Edit view for employee records.
@@ -54,8 +55,10 @@
 
   @UiField TextBox notes;
   @UiField TextBox purpose;
-  @UiField LongBox reporterKey;
-  @UiField LongBox approvedSupervisorKey;
+  @UiField(provided = true) ValueListBox<EmployeeRecord> reporter =
+    new ValueListBox<EmployeeRecord>(EmployeeRenderer.instance());
+  @UiField(provided = true) ValueListBox<EmployeeRecord> approvedSupervisor =
+    new ValueListBox<EmployeeRecord>(EmployeeRenderer.instance());
   @UiField DateBox created;
   @UiField Button cancel;
   @UiField Button save;
@@ -68,18 +71,18 @@
   private Delegate delegate;
 
   private ReportRecord record;
-  
+
   public ReportEditView() {
     initWidget(BINDER.createAndBindUi(this));
     DATA_BINDER.init(this);
   }
-  
+
   public ReportEditView asWidget() {
     return this;
   }
 
-  public Set<Property<?>> getProperties() {
-    return DATA_BINDER.getProperties();
+  public String[] getPaths() {
+    return DATA_BINDER.getPaths();
   }
 
   public ReportRecord getValue() {
@@ -104,6 +107,11 @@
     this.delegate = delegate;
   }
 
+  public void setEmployeePickerValues(Collection<EmployeeRecord> values) {
+    approvedSupervisor.setAcceptableValues(values);
+    reporter.setAcceptableValues(values);
+  }
+
   public void setEnabled(boolean enabled) {
     DATA_BINDER.setEnabled(this, enabled);
     save.setEnabled(enabled);
diff --git a/samples/expenses/src/main/java/com/google/gwt/sample/expenses/client/ui/report/ReportEditView.ui.xml b/samples/expenses/src/main/java/com/google/gwt/sample/expenses/client/ui/report/ReportEditView.ui.xml
index 2120839..98c8743 100644
--- a/samples/expenses/src/main/java/com/google/gwt/sample/expenses/client/ui/report/ReportEditView.ui.xml
+++ b/samples/expenses/src/main/java/com/google/gwt/sample/expenses/client/ui/report/ReportEditView.ui.xml
@@ -42,8 +42,8 @@
       <tr><td><div class='{style.label}'>Purpose:</div></td><td><g:TextBox ui:field='purpose'></g:TextBox></td></tr>
       <tr><td><div class='{style.label}'>Notes:</div></td><td><g:TextBox ui:field='notes'></g:TextBox></td></tr>
       <tr><td><div class='{style.label}'>Created:</div></td><td><d:DateBox ui:field='created'></d:DateBox></td></tr>
-      <tr><td><div class='{style.label}'>Reporter Key:</div></td><td><a:LongBox ui:field='reporterKey'></a:LongBox></td></tr>
-      <tr><td><div class='{style.label}'>Approved Supervisor Key:</div></td><td><a:LongBox ui:field='approvedSupervisorKey'></a:LongBox></td></tr>
+      <tr><td><div class='{style.label}'>Reporter:</div></td><td><g:ValueListBox ui:field='reporter'></g:ValueListBox></td></tr>
+      <tr><td><div class='{style.label}'>Approved Supervisor:</div></td><td><g:ValueListBox ui:field='approvedSupervisor'></g:ValueListBox></td></tr>
     </table>
 
     <div class='{style.bar}'>
diff --git a/samples/expenses/src/main/java/com/google/gwt/sample/expenses/client/ui/report/ReportListView.java b/samples/expenses/src/main/java/com/google/gwt/sample/expenses/client/ui/report/ReportListView.java
index 8713269..ba66572 100644
--- a/samples/expenses/src/main/java/com/google/gwt/sample/expenses/client/ui/report/ReportListView.java
+++ b/samples/expenses/src/main/java/com/google/gwt/sample/expenses/client/ui/report/ReportListView.java
@@ -15,7 +15,6 @@
  */
 package com.google.gwt.sample.expenses.client.ui.report;
 
-import com.google.gwt.app.client.ProxyIdRenderer;
 import com.google.gwt.app.place.AbstractRecordListView;
 import com.google.gwt.app.place.PropertyColumn;
 import com.google.gwt.core.client.GWT;
@@ -23,6 +22,7 @@
 import com.google.gwt.i18n.client.DateTimeFormatRenderer;
 import com.google.gwt.sample.expenses.client.request.EmployeeRecord;
 import com.google.gwt.sample.expenses.client.request.ReportRecord;
+import com.google.gwt.sample.expenses.client.ui.employee.EmployeeRenderer;
 import com.google.gwt.uibinder.client.UiBinder;
 import com.google.gwt.uibinder.client.UiField;
 import com.google.gwt.user.cellview.client.CellTable;
@@ -58,11 +58,15 @@
 
     columns.add(new PropertyColumn<ReportRecord, Date>(ReportRecord.created,
         new DateTimeFormatRenderer(DateTimeFormat.getShortDateFormat())));
+
     columns.add(PropertyColumn.<ReportRecord> getStringPropertyColumn(ReportRecord.purpose));
+
     columns.add(new PropertyColumn<ReportRecord, EmployeeRecord>(
-        ReportRecord.reporter, ProxyIdRenderer.<EmployeeRecord>instance()));
+        ReportRecord.reporter, EmployeeRenderer.instance()));
+
     columns.add(new PropertyColumn<ReportRecord, EmployeeRecord>(
-        ReportRecord.approvedSupervisor, ProxyIdRenderer.<EmployeeRecord>instance()));
+        ReportRecord.approvedSupervisor, EmployeeRenderer.instance()));
+
     return columns;
   }
 }
diff --git a/samples/expenses/src/main/java/com/google/gwt/sample/expenses/client/ui/report/ReportListView.ui.xml b/samples/expenses/src/main/java/com/google/gwt/sample/expenses/client/ui/report/ReportListView.ui.xml
index 2e3bf9c..34d5bd1 100644
--- a/samples/expenses/src/main/java/com/google/gwt/sample/expenses/client/ui/report/ReportListView.ui.xml
+++ b/samples/expenses/src/main/java/com/google/gwt/sample/expenses/client/ui/report/ReportListView.ui.xml
@@ -49,7 +49,7 @@
     <c:CellTable width='100%' ui:field='table' pageSize='8'/>
     <div class='{style.controls}'>
       <g:Button styleName='{style.createButton}' ui:field='newButton'>Create Report</g:Button>
-      <c:SimplePager view='{table}' location='RIGHT'/>
+      <c:SimplePager display='{table}' location='RIGHT'/>
     </div>
   </g:HTMLPanel>
 </ui:UiBinder>
diff --git a/samples/expenses/src/main/java/com/google/gwt/sample/expenses/server/domain/Report.java b/samples/expenses/src/main/java/com/google/gwt/sample/expenses/server/domain/Report.java
index ac574e1..5f28680 100644
--- a/samples/expenses/src/main/java/com/google/gwt/sample/expenses/server/domain/Report.java
+++ b/samples/expenses/src/main/java/com/google/gwt/sample/expenses/server/domain/Report.java
@@ -437,6 +437,10 @@
     }
   }
 
+  public void setApprovedSupervisor(Employee reporter) {
+    approvedSupervisorKey = reporter == null ? null : reporter.getId();
+  }
+
   public void setApprovedSupervisorKey(Long approvedSupervisorKey) {
     this.approvedSupervisorKey = approvedSupervisorKey;
   }