001: /*
002: * Copyright 2007 Google Inc.
003: *
004: * Licensed under the Apache License, Version 2.0 (the "License"); you may not
005: * use this file except in compliance with the License. You may obtain a copy of
006: * the License at
007: *
008: * http://www.apache.org/licenses/LICENSE-2.0
009: *
010: * Unless required by applicable law or agreed to in writing, software
011: * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
012: * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
013: * License for the specific language governing permissions and limitations under
014: * the License.
015: */
016: package com.google.gwt.sample.mail.client;
017:
018: import com.google.gwt.core.client.EntryPoint;
019: import com.google.gwt.core.client.GWT;
020: import com.google.gwt.user.client.Command;
021: import com.google.gwt.user.client.DeferredCommand;
022: import com.google.gwt.user.client.Window;
023: import com.google.gwt.user.client.WindowResizeListener;
024: import com.google.gwt.user.client.ui.DockPanel;
025: import com.google.gwt.user.client.ui.RootPanel;
026: import com.google.gwt.user.client.ui.VerticalPanel;
027:
028: /**
029: * This application demonstrates how to construct a relatively complex user
030: * interface, similar to many common email readers. It has no back-end,
031: * populating its components with hard-coded data.
032: */
033: public class Mail implements EntryPoint, WindowResizeListener {
034:
035: private static Mail singleton;
036:
037: /**
038: * Instantiate an application-level image bundle. This object will provide
039: * programmatic access to all the images needed by widgets.
040: */
041: private static final Images images = GWT.create(Images.class);
042:
043: /**
044: * An aggragate image bundle that pulls together all the images for this
045: * application into a single bundle.
046: */
047: public interface Images extends Shortcuts.Images, TopPanel.Images {
048: }
049:
050: /**
051: * Gets the singleton Mail instance.
052: */
053: public static Mail get() {
054: return singleton;
055: }
056:
057: private TopPanel topPanel = new TopPanel(images);
058: private VerticalPanel rightPanel = new VerticalPanel();
059: private MailList mailList;
060: private MailDetail mailDetail = new MailDetail();
061: private Shortcuts shortcuts = new Shortcuts(images);
062:
063: /**
064: * Displays the specified item.
065: *
066: * @param item
067: */
068: public void displayItem(MailItem item) {
069: mailDetail.setItem(item);
070: }
071:
072: /**
073: * This method constructs the application user interface by instantiating
074: * controls and hooking up event listeners.
075: */
076: public void onModuleLoad() {
077: singleton = this ;
078:
079: topPanel.setWidth("100%");
080:
081: // MailList uses Mail.get() in its constructor, so initialize it after
082: // 'singleton'.
083: mailList = new MailList();
084: mailList.setWidth("100%");
085:
086: // Create the right panel, containing the email list & details.
087: rightPanel.add(mailList);
088: rightPanel.add(mailDetail);
089: mailList.setWidth("100%");
090: mailDetail.setWidth("100%");
091:
092: // Create a dock panel that will contain the menu bar at the top,
093: // the shortcuts to the left, and the mail list & details taking the rest.
094: DockPanel outer = new DockPanel();
095: outer.add(topPanel, DockPanel.NORTH);
096: outer.add(shortcuts, DockPanel.WEST);
097: outer.add(rightPanel, DockPanel.CENTER);
098: outer.setWidth("100%");
099:
100: outer.setSpacing(4);
101: outer.setCellWidth(rightPanel, "100%");
102:
103: // Hook the window resize event, so that we can adjust the UI.
104: Window.addWindowResizeListener(this );
105:
106: // Get rid of scrollbars, and clear out the window's built-in margin,
107: // because we want to take advantage of the entire client area.
108: Window.enableScrolling(false);
109: Window.setMargin("0px");
110:
111: // Finally, add the outer panel to the RootPanel, so that it will be
112: // displayed.
113: RootPanel.get().add(outer);
114:
115: // Call the window resized handler to get the initial sizes setup. Doing
116: // this in a deferred command causes it to occur after all widgets' sizes
117: // have been computed by the browser.
118: DeferredCommand.addCommand(new Command() {
119: public void execute() {
120: onWindowResized(Window.getClientWidth(), Window
121: .getClientHeight());
122: }
123: });
124:
125: onWindowResized(Window.getClientWidth(), Window
126: .getClientHeight());
127: }
128:
129: public void onWindowResized(int width, int height) {
130: // Adjust the shortcut panel and detail area to take up the available room
131: // in the window.
132: int shortcutHeight = height - shortcuts.getAbsoluteTop() - 8;
133: if (shortcutHeight < 1) {
134: shortcutHeight = 1;
135: }
136: shortcuts.setHeight("" + shortcutHeight);
137:
138: // Give the mail detail widget a chance to resize itself as well.
139: mailDetail.adjustSize(width, height);
140: }
141: }
|