blob: adf1b8290e931cdb521543d6ebd0e7684b3d7367 [file] [log] [blame]
/*
* 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.HTMLTable.Cell;
import com.google.gwt.user.client.ui.HasHorizontalAlignment;
import com.google.gwt.user.client.ui.ResizeComposite;
import com.google.gwt.user.client.ui.Widget;
/**
* 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.
for (; i < VISIBLE_EMAIL_COUNT; ++i) {
table.removeRow(table.getRowCount() - 1);
}
}
}