blob: 7728fe7879d239d4ae4e0f93333a6d8640f8d02d [file] [log] [blame]
/*
* Copyright 2011 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.showcase.client.content.lists;
import com.google.gwt.core.client.GWT;
import com.google.gwt.core.client.RunAsyncCallback;
import com.google.gwt.dom.client.Style.Unit;
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.event.dom.client.ClickHandler;
import com.google.gwt.i18n.client.Constants;
import com.google.gwt.resources.client.ImageResource;
import com.google.gwt.safehtml.shared.SafeHtmlBuilder;
import com.google.gwt.safehtml.shared.SafeHtmlUtils;
import com.google.gwt.sample.showcase.client.ContentWidget;
import com.google.gwt.sample.showcase.client.ShowcaseAnnotations.ShowcaseData;
import com.google.gwt.sample.showcase.client.ShowcaseAnnotations.ShowcaseSource;
import com.google.gwt.sample.showcase.client.ShowcaseAnnotations.ShowcaseStyle;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.google.gwt.user.client.ui.AbstractImagePrototype;
import com.google.gwt.user.client.ui.Anchor;
import com.google.gwt.user.client.ui.CheckBox;
import com.google.gwt.user.client.ui.HTML;
import com.google.gwt.user.client.ui.HasVerticalAlignment;
import com.google.gwt.user.client.ui.HorizontalPanel;
import com.google.gwt.user.client.ui.Image;
import com.google.gwt.user.client.ui.PopupPanel;
import com.google.gwt.user.client.ui.SimplePanel;
import com.google.gwt.user.client.ui.StackLayoutPanel;
import com.google.gwt.user.client.ui.Tree;
import com.google.gwt.user.client.ui.TreeItem;
import com.google.gwt.user.client.ui.VerticalPanel;
import com.google.gwt.user.client.ui.Widget;
/**
* Example file.
*/
@ShowcaseStyle({
".gwt-DecoratedStackPanel", "html>body .gwt-DecoratedStackPanel",
"* html .gwt-DecoratedStackPanel", ".cw-StackPanelHeader"})
public class CwStackLayoutPanel extends ContentWidget {
/**
* The constants used in this Content Widget.
*/
@ShowcaseSource
public static interface CwConstants extends Constants {
String[] cwStackLayoutPanelContacts();
String[] cwStackLayoutPanelContactsEmails();
String cwStackLayoutPanelContactsHeader();
String cwStackLayoutPanelDescription();
String[] cwStackLayoutPanelFilters();
String cwStackLayoutPanelFiltersHeader();
String[] cwStackLayoutPanelMailFolders();
String cwStackLayoutPanelMailHeader();
String cwStackLayoutPanelName();
}
/**
* Specifies the images that will be bundled for this example.
*
* We will override the leaf image used in the tree. Instead of using a blank
* 16x16 image, we will use a blank 1x1 image so it does not take up any
* space. Each TreeItem will use its own custom image.
*/
@ShowcaseSource
public interface Images extends Tree.Resources {
ImageResource contactsgroup();
ImageResource defaultContact();
ImageResource drafts();
ImageResource filtersgroup();
ImageResource inbox();
ImageResource mailgroup();
ImageResource sent();
ImageResource templates();
ImageResource trash();
/**
* Use noimage.png, which is a blank 1x1 image.
*/
@Source("noimage.png")
ImageResource treeLeaf();
}
/**
* An instance of the constants.
*/
@ShowcaseData
private final CwConstants constants;
/**
* Constructor.
*
* @param constants the constants
*/
public CwStackLayoutPanel(CwConstants constants) {
super(constants.cwStackLayoutPanelName(), constants
.cwStackLayoutPanelDescription(), true);
this.constants = constants;
}
/**
* Initialize this example.
*/
@ShowcaseSource
@Override
public Widget onInitialize() {
// Get the images.
Images images = (Images) GWT.create(Images.class);
// Create a new stack layout panel.
StackLayoutPanel stackPanel = new StackLayoutPanel(Unit.EM);
stackPanel.setPixelSize(200, 400);
// Add the Mail folders.
Widget mailHeader = createHeaderWidget(
constants.cwStackLayoutPanelMailHeader(), images.mailgroup());
stackPanel.add(createMailItem(images), mailHeader, 4);
// Add a list of filters.
Widget filtersHeader = createHeaderWidget(
constants.cwStackLayoutPanelFiltersHeader(), images.filtersgroup());
stackPanel.add(createFiltersItem(), filtersHeader, 4);
// Add a list of contacts.
Widget contactsHeader = createHeaderWidget(
constants.cwStackLayoutPanelContactsHeader(), images.contactsgroup());
stackPanel.add(createContactsItem(images), contactsHeader, 4);
// Return the stack panel.
stackPanel.ensureDebugId("cwStackLayoutPanel");
return stackPanel;
}
@Override
protected void asyncOnInitialize(final AsyncCallback<Widget> callback) {
GWT.runAsync(CwStackLayoutPanel.class, new RunAsyncCallback() {
public void onFailure(Throwable caught) {
callback.onFailure(caught);
}
public void onSuccess() {
callback.onSuccess(onInitialize());
}
});
}
/**
* Add a {@link TreeItem} to a root item.
*
* @param root the root {@link TreeItem}
* @param image the icon for the new child item
* @param label the label for the child icon
*/
@ShowcaseSource
private void addItem(TreeItem root, ImageResource image, String label) {
SafeHtmlBuilder sb = new SafeHtmlBuilder();
sb.append(SafeHtmlUtils.fromTrustedString(AbstractImagePrototype.create(
image).getHTML()));
sb.appendEscaped(" ").appendEscaped(label);
root.addItem(sb.toSafeHtml());
}
/**
* Create the list of Contacts.
*
* @param images the {@link Images} used in the Contacts
* @return the list of contacts
*/
@ShowcaseSource
private Widget createContactsItem(Images images) {
// Create a popup to show the contact info when a contact is clicked
HorizontalPanel contactPopupContainer = new HorizontalPanel();
contactPopupContainer.setSpacing(5);
contactPopupContainer.add(new Image(images.defaultContact()));
final HTML contactInfo = new HTML();
contactPopupContainer.add(contactInfo);
final PopupPanel contactPopup = new PopupPanel(true, false);
contactPopup.setWidget(contactPopupContainer);
// Create the list of contacts
VerticalPanel contactsPanel = new VerticalPanel();
contactsPanel.setSpacing(4);
String[] contactNames = constants.cwStackLayoutPanelContacts();
String[] contactEmails = constants.cwStackLayoutPanelContactsEmails();
for (int i = 0; i < contactNames.length; i++) {
final String contactName = contactNames[i];
final String contactEmail = contactEmails[i];
final Anchor contactLink = new Anchor(contactName);
contactsPanel.add(contactLink);
// Open the contact info popup when the user clicks a contact
contactLink.addClickHandler(new ClickHandler() {
public void onClick(ClickEvent event) {
// Set the info about the contact
SafeHtmlBuilder sb = new SafeHtmlBuilder();
sb.appendEscaped(contactName);
sb.appendHtmlConstant("<br><i>");
sb.appendEscaped(contactEmail);
sb.appendHtmlConstant("</i>");
contactInfo.setHTML(sb.toSafeHtml());
// Show the popup of contact info
int left = contactLink.getAbsoluteLeft() + 14;
int top = contactLink.getAbsoluteTop() + 14;
contactPopup.setPopupPosition(left, top);
contactPopup.show();
}
});
}
return new SimplePanel(contactsPanel);
}
/**
* Create the list of filters for the Filters item.
*
* @return the list of filters
*/
@ShowcaseSource
private Widget createFiltersItem() {
VerticalPanel filtersPanel = new VerticalPanel();
filtersPanel.setSpacing(4);
for (String filter : constants.cwStackLayoutPanelFilters()) {
filtersPanel.add(new CheckBox(filter));
}
return new SimplePanel(filtersPanel);
}
/**
* Create a widget to display in the header that includes an image and some
* text.
*
* @param text the header text
* @param image the {@link ImageResource} to add next to the header
* @return the header widget
*/
@ShowcaseSource
private Widget createHeaderWidget(String text, ImageResource image) {
// Add the image and text to a horizontal panel
HorizontalPanel hPanel = new HorizontalPanel();
hPanel.setHeight("100%");
hPanel.setSpacing(0);
hPanel.setVerticalAlignment(HasVerticalAlignment.ALIGN_MIDDLE);
hPanel.add(new Image(image));
HTML headerText = new HTML(text);
headerText.setStyleName("cw-StackPanelHeader");
hPanel.add(headerText);
return new SimplePanel(hPanel);
}
/**
* Create the {@link Tree} of Mail options.
*
* @param images the {@link Images} used in the Mail options
* @return the {@link Tree} of mail options
*/
@ShowcaseSource
private Widget createMailItem(Images images) {
Tree mailPanel = new Tree(images);
TreeItem mailPanelRoot = mailPanel.addItem("foo@example.com");
String[] mailFolders = constants.cwStackLayoutPanelMailFolders();
addItem(mailPanelRoot, images.inbox(), mailFolders[0]);
addItem(mailPanelRoot, images.drafts(), mailFolders[1]);
addItem(mailPanelRoot, images.templates(), mailFolders[2]);
addItem(mailPanelRoot, images.sent(), mailFolders[3]);
addItem(mailPanelRoot, images.trash(), mailFolders[4]);
mailPanelRoot.setState(true);
return mailPanel;
}
}