/* * 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.dom.client.Element; import com.google.gwt.event.dom.client.ClickEvent; import com.google.gwt.event.dom.client.ClickHandler; 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.UiTemplate; import com.google.gwt.user.client.ui.Anchor; import com.google.gwt.user.client.ui.ComplexPanel; import com.google.gwt.user.client.ui.Composite; import com.google.gwt.user.client.ui.PopupPanel; import com.google.gwt.user.client.ui.Widget; /** * A component that displays a list of contacts. */ public class Contacts extends Composite { /** * Simple data structure representing a contact. */ private static class Contact { public String email; public String name; public Contact(String name, String email) { this.name = name; this.email = email; } } /** * A simple popup that displays a contact's information. */ static class ContactPopup extends PopupPanel { @UiTemplate("ContactPopup.ui.xml") interface Binder extends UiBinder<Widget, ContactPopup> { } private static final Binder binder = GWT.create(Binder.class); @UiField Element nameDiv; @UiField Element emailDiv; public ContactPopup(Contact contact) { // The popup's constructor's argument is a boolean specifying that it // auto-close itself when the user clicks outside of it. super(true); add(binder.createAndBindUi(this)); nameDiv.setInnerText(contact.name); emailDiv.setInnerText(contact.email); } } interface Binder extends UiBinder<Widget, Contacts> { } interface Style extends CssResource { String item(); } private static final Binder binder = GWT.create(Binder.class); private Contact[] contacts = new Contact[] { new Contact("Benoit Mandelbrot", "benoit@example.com"), new Contact("Albert Einstein", "albert@example.com"), new Contact("Rene Descartes", "rene@example.com"), new Contact("Bob Saget", "bob@example.com"), new Contact("Ludwig von Beethoven", "ludwig@example.com"), new Contact("Richard Feynman", "richard@example.com"), new Contact("Alan Turing", "alan@example.com"), new Contact("John von Neumann", "john@example.com")}; @UiField ComplexPanel panel; @UiField Style style; public Contacts() { initWidget(binder.createAndBindUi(this)); // Add all the contacts to the list. for (int i = 0; i < contacts.length; ++i) { addContact(contacts[i]); } } private void addContact(final Contact contact) { final Anchor link = new Anchor(contact.name); link.setStyleName(style.item()); panel.add(link); // Add a click handler that displays a ContactPopup when it is clicked. link.addClickHandler(new ClickHandler() { public void onClick(ClickEvent event) { ContactPopup popup = new ContactPopup(contact); int left = link.getAbsoluteLeft() + 14; int top = link.getAbsoluteTop() + 14; popup.setPopupPosition(left, top); popup.show(); } }); } }