| /* |
| * 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.event.dom.client.ClickEvent; |
| import com.google.gwt.event.dom.client.ClickHandler; |
| import com.google.gwt.user.client.ui.Composite; |
| import com.google.gwt.user.client.ui.FlexTable; |
| import com.google.gwt.user.client.ui.HTML; |
| import com.google.gwt.user.client.ui.HorizontalPanel; |
| 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 Composite implements ClickHandler { |
| |
| private static final int VISIBLE_EMAIL_COUNT = 10; |
| |
| private HTML countLabel = new HTML(); |
| private HTML newerButton = new HTML("<a href='javascript:;'>< newer</a>", |
| true); |
| private HTML olderButton = new HTML("<a href='javascript:;'>older ></a>", |
| true); |
| private int startIndex, selectedRow = -1; |
| private FlexTable table = new FlexTable(); |
| private HorizontalPanel navBar = new HorizontalPanel(); |
| |
| public MailList() { |
| // Setup the table. |
| table.setCellSpacing(0); |
| table.setCellPadding(0); |
| table.setWidth("100%"); |
| |
| // Hook up events. |
| table.addClickHandler(this); |
| newerButton.addClickHandler(this); |
| olderButton.addClickHandler(this); |
| |
| // Create the 'navigation' bar at the upper-right. |
| HorizontalPanel innerNavBar = new HorizontalPanel(); |
| navBar.setStyleName("mail-ListNavBar"); |
| innerNavBar.add(newerButton); |
| innerNavBar.add(countLabel); |
| innerNavBar.add(olderButton); |
| |
| navBar.setHorizontalAlignment(HorizontalPanel.ALIGN_RIGHT); |
| navBar.add(innerNavBar); |
| navBar.setWidth("100%"); |
| |
| initWidget(table); |
| setStyleName("mail-List"); |
| |
| initTable(); |
| update(); |
| } |
| |
| public void onClick(ClickEvent event) { |
| Object sender = event.getSource(); |
| if (sender == olderButton) { |
| // Move forward a page. |
| startIndex += VISIBLE_EMAIL_COUNT; |
| if (startIndex >= MailItems.getMailItemCount()) { |
| startIndex -= VISIBLE_EMAIL_COUNT; |
| } else { |
| styleRow(selectedRow, false); |
| selectedRow = -1; |
| update(); |
| } |
| } else if (sender == newerButton) { |
| // Move back a page. |
| startIndex -= VISIBLE_EMAIL_COUNT; |
| if (startIndex < 0) { |
| startIndex = 0; |
| } else { |
| styleRow(selectedRow, false); |
| selectedRow = -1; |
| update(); |
| } |
| } else if (sender == table) { |
| // Select the row that was clicked (-1 to account for header row). |
| Cell cell = table.getCellForEvent(event); |
| if (cell != null) { |
| int row = cell.getRowIndex(); |
| if (row > 0) { |
| selectRow(row - 1); |
| } |
| } |
| } |
| } |
| |
| /** |
| * 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() { |
| // Create the header row. |
| table.setText(0, 0, "Sender"); |
| table.setText(0, 1, "Email"); |
| table.setText(0, 2, "Subject"); |
| table.setWidget(0, 3, navBar); |
| table.getRowFormatter().setStyleName(0, "mail-ListHeader"); |
| |
| // Initialize the rest of the rows. |
| for (int i = 0; i < VISIBLE_EMAIL_COUNT; ++i) { |
| table.setText(i + 1, 0, ""); |
| table.setText(i + 1, 1, ""); |
| table.setText(i + 1, 2, ""); |
| table.getCellFormatter().setWordWrap(i + 1, 0, false); |
| table.getCellFormatter().setWordWrap(i + 1, 1, false); |
| table.getCellFormatter().setWordWrap(i + 1, 2, false); |
| table.getFlexCellFormatter().setColSpan(i + 1, 2, 2); |
| } |
| } |
| |
| /** |
| * 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; |
| Mail.get().displayItem(item); |
| } |
| |
| private void styleRow(int row, boolean selected) { |
| if (row != -1) { |
| if (selected) { |
| table.getRowFormatter().addStyleName(row + 1, "mail-SelectedRow"); |
| } else { |
| table.getRowFormatter().removeStyleName(row + 1, "mail-SelectedRow"); |
| } |
| } |
| } |
| |
| private void update() { |
| // Update the older/newer buttons & label. |
| int count = MailItems.getMailItemCount(); |
| int max = startIndex + VISIBLE_EMAIL_COUNT; |
| if (max > count) { |
| max = count; |
| } |
| |
| newerButton.setVisible(startIndex != 0); |
| olderButton.setVisible(startIndex + VISIBLE_EMAIL_COUNT < count); |
| countLabel.setText("" + (startIndex + 1) + " - " + max + " of " + count); |
| |
| // 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 + 1, 0, item.sender); |
| table.setText(i + 1, 1, item.email); |
| table.setText(i + 1, 2, item.subject); |
| } |
| |
| // Clear any remaining slots. |
| for (; i < VISIBLE_EMAIL_COUNT; ++i) { |
| table.setHTML(i + 1, 0, " "); |
| table.setHTML(i + 1, 1, " "); |
| table.setHTML(i + 1, 2, " "); |
| } |
| |
| // Select the first row if none is selected. |
| if (selectedRow == -1) { |
| selectRow(0); |
| } |
| } |
| } |