gt:     for (; i < VISIBLE_EMAIL_COUNT; ++i) {
context: /*
   * Copyright 2007 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.mail.client;
  
  import com.google.gwt.core.client.GWT;
  import com.google.gwt.event.dom.client.ClickEvent;
  import com.google.gwt.resources.client.CssResource;
  import com.google.gwt.uibinder.client.UiBinder;
  import com.google.gwt.uibinder.client.UiField;
  import com.google.gwt.uibinder.client.UiHandler;
  import com.google.gwt.user.client.ui.FlexTable;
  import com.google.gwt.user.client.ui.HasHorizontalAlignment;
  import com.google.gwt.user.client.ui.ResizeComposite;
  import com.google.gwt.user.client.ui.Widget;
  import com.google.gwt.user.client.ui.HTMLTable.Cell;
  
  /**
   * A composite that displays a list of emails that can be selected.
   */
  public class MailList extends ResizeComposite {
  
    /**
     * Callback when mail items are selected. 
     */
    public interface Listener {
      void onItemSelected(MailItem item);
    }
  
    interface Binder extends UiBinder<Widget, MailList> { }
    interface SelectionStyle extends CssResource {
      String selectedRow();
    }
  
    private static final Binder binder = GWT.create(Binder.class);
    static final int VISIBLE_EMAIL_COUNT = 20;
  
    @UiField FlexTable header;
    @UiField FlexTable table;
    @UiField SelectionStyle selectionStyle;
  
    private Listener listener;
    private int startIndex, selectedRow = -1;
    private NavBar navBar;
  
    public MailList() {
      initWidget(binder.createAndBindUi(this));
      navBar = new NavBar(this);
  
      initTable();
      update();
    }
  
    /**
     * Sets the listener that will be notified when an item is selected.
     */
    public void setListener(Listener listener) {
      this.listener = listener;
    }
  
    @Override
    protected void onLoad() {
      // Select the first row if none is selected.
      if (selectedRow == -1) {
        selectRow(0);
      }
    }
  
    void newer() {
      // Move back a page.
      startIndex -= VISIBLE_EMAIL_COUNT;
      if (startIndex < 0) {
        startIndex = 0;
      } else {
        styleRow(selectedRow, false);
        selectedRow = -1;
        update();
      }
    }
  
    void older() {
      // Move forward a page.
      startIndex += VISIBLE_EMAIL_COUNT;
      if (startIndex >= MailItems.getMailItemCount()) {
        startIndex -= VISIBLE_EMAIL_COUNT;
      } else {
        styleRow(selectedRow, false);
        selectedRow = -1;
        update();
      }
    }
  
    @UiHandler("table")
    void onTableClicked(ClickEvent event) {
      // Select the row that was clicked (-1 to account for header row).
      Cell cell = table.getCellForEvent(event);
      if (cell != null) {
        int row = cell.getRowIndex();
        selectRow(row);
      }
    }
  
    /**
     * Initializes the table so that it contains enough rows for a full page of
     * emails. Also creates the images that will be used as 'read' flags.
     */
    private void initTable() {
      // Initialize the header.
      header.getColumnFormatter().setWidth(0, "128px");
      header.getColumnFormatter().setWidth(1, "192px");
      header.getColumnFormatter().setWidth(3, "256px");
  
      header.setText(0, 0, "Sender");
      header.setText(0, 1, "Email");
      header.setText(0, 2, "Subject");
      header.setWidget(0, 3, navBar);
      header.getCellFormatter().setHorizontalAlignment(0, 3, HasHorizontalAlignment.ALIGN_RIGHT);
  
      // Initialize the table.
      table.getColumnFormatter().setWidth(0, "128px");
      table.getColumnFormatter().setWidth(1, "192px");
    }
  
    /**
     * Selects the given row (relative to the current page).
     * 
     * @param row the row to be selected
     */
    private void selectRow(int row) {
      // When a row (other than the first one, which is used as a header) is
      // selected, display its associated MailItem.
      MailItem item = MailItems.getMailItem(startIndex + row);
      if (item == null) {
        return;
      }
  
      styleRow(selectedRow, false);
      styleRow(row, true);
  
      item.read = true;
      selectedRow = row;
  
      if (listener != null) {
        listener.onItemSelected(item);
      }
    }
  
    private void styleRow(int row, boolean selected) {
      if (row != -1) {
        String style = selectionStyle.selectedRow();
  
        if (selected) {
          table.getRowFormatter().addStyleName(row, style);
        } else {
          table.getRowFormatter().removeStyleName(row, style);
        }
      }
    }
  
    private void update() {
      // Update the older/newer buttons & label.
      int count = MailItems.getMailItemCount();
      int max = startIndex + VISIBLE_EMAIL_COUNT;
      if (max > count) {
        max = count;
      }
  
      // Update the nav bar.
      navBar.update(startIndex, count, max);
  
      // Show the selected emails.
      int i = 0;
      for (; i < VISIBLE_EMAIL_COUNT; ++i) {
        // Don't read past the end.
        if (startIndex + i >= MailItems.getMailItemCount()) {
          break;
        }
  
        MailItem item = MailItems.getMailItem(startIndex + i);
  
        // Add a new row to the table, then set each of its columns to the
        // email's sender and subject values.
        table.setText(i, 0, item.sender);
        table.setText(i, 1, item.email);
        table.setText(i, 2, item.subject);
      }
  
      // Clear any remaining slots.
  