| /* |
| * Copyright 2008 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; |
| |
| import com.google.gwt.core.client.EntryPoint; |
| import com.google.gwt.core.client.GWT; |
| import com.google.gwt.core.client.prefetch.Prefetcher; |
| import com.google.gwt.dom.client.Document; |
| import com.google.gwt.dom.client.HeadElement; |
| import com.google.gwt.dom.client.LinkElement; |
| import com.google.gwt.event.logical.shared.OpenEvent; |
| import com.google.gwt.event.logical.shared.OpenHandler; |
| import com.google.gwt.event.logical.shared.ValueChangeEvent; |
| import com.google.gwt.event.logical.shared.ValueChangeHandler; |
| import com.google.gwt.i18n.client.LocaleInfo; |
| import com.google.gwt.safehtml.shared.SafeHtmlBuilder; |
| import com.google.gwt.safehtml.shared.SafeHtmlUtils; |
| import com.google.gwt.sample.showcase.client.MainMenuTreeViewModel.Category; |
| import com.google.gwt.user.cellview.client.CellTree; |
| import com.google.gwt.user.cellview.client.TreeNode; |
| import com.google.gwt.user.client.History; |
| import com.google.gwt.user.client.Window; |
| import com.google.gwt.user.client.ui.HTML; |
| import com.google.gwt.user.client.ui.RootLayoutPanel; |
| import com.google.gwt.user.client.ui.RootPanel; |
| import com.google.gwt.view.client.SelectionChangeEvent; |
| import com.google.gwt.view.client.SingleSelectionModel; |
| |
| import java.util.ArrayList; |
| import java.util.List; |
| import java.util.Set; |
| |
| /** |
| * Entry point classes define <code>onModuleLoad()</code>. |
| */ |
| public class Showcase implements EntryPoint { |
| /** |
| * The type passed into the |
| * {@link com.google.gwt.sample.showcase.generator.ShowcaseGenerator}. |
| */ |
| private static final class GeneratorInfo { |
| } |
| |
| /** |
| * The static images used throughout the Showcase. |
| */ |
| public static final ShowcaseResources images = GWT.create( |
| ShowcaseResources.class); |
| |
| /** |
| * The name of the style theme used in showcase. |
| */ |
| public static final String THEME = "clean"; |
| |
| /** |
| * Get the token for a given content widget. |
| * |
| * @return the content widget token. |
| */ |
| public static String getContentWidgetToken(ContentWidget content) { |
| return getContentWidgetToken(content.getClass()); |
| } |
| |
| /** |
| * Get the token for a given content widget. |
| * |
| * @return the content widget token. |
| */ |
| public static <C extends ContentWidget> String getContentWidgetToken( |
| Class<C> cwClass) { |
| String className = cwClass.getName(); |
| className = className.substring(className.lastIndexOf('.') + 1); |
| return "!" + className; |
| } |
| |
| /** |
| * The main application shell. |
| */ |
| private ShowcaseShell shell; |
| |
| /** |
| * This is the entry point method. |
| */ |
| public void onModuleLoad() { |
| // Generate the source code and css for the examples |
| GWT.create(GeneratorInfo.class); |
| |
| // Inject global styles. |
| injectThemeStyleSheet(); |
| images.css().ensureInjected(); |
| |
| // Initialize the constants. |
| ShowcaseConstants constants = GWT.create(ShowcaseConstants.class); |
| |
| // Create the application shell. |
| final SingleSelectionModel<ContentWidget> selectionModel = new SingleSelectionModel<ContentWidget>(); |
| final MainMenuTreeViewModel treeModel = new MainMenuTreeViewModel( |
| constants, selectionModel); |
| Set<ContentWidget> contentWidgets = treeModel.getAllContentWidgets(); |
| shell = new ShowcaseShell(treeModel); |
| RootLayoutPanel.get().add(shell); |
| |
| // Prefetch examples when opening the Category tree nodes. |
| final List<Category> prefetched = new ArrayList<Category>(); |
| final CellTree mainMenu = shell.getMainMenu(); |
| mainMenu.addOpenHandler(new OpenHandler<TreeNode>() { |
| public void onOpen(OpenEvent<TreeNode> event) { |
| Object value = event.getTarget().getValue(); |
| if (!(value instanceof Category)) { |
| return; |
| } |
| |
| Category category = (Category) value; |
| if (!prefetched.contains(category)) { |
| prefetched.add(category); |
| Prefetcher.prefetch(category.getSplitPoints()); |
| } |
| } |
| }); |
| |
| // Always prefetch. |
| Prefetcher.start(); |
| |
| // Change the history token when a main menu item is selected. |
| selectionModel.addSelectionChangeHandler( |
| new SelectionChangeEvent.Handler() { |
| public void onSelectionChange(SelectionChangeEvent event) { |
| ContentWidget selected = selectionModel.getSelectedObject(); |
| if (selected != null) { |
| History.newItem(getContentWidgetToken(selected), true); |
| } |
| } |
| }); |
| |
| // Setup a history handler to reselect the associate menu item. |
| final ValueChangeHandler<String> historyHandler = new ValueChangeHandler< |
| String>() { |
| public void onValueChange(ValueChangeEvent<String> event) { |
| // Get the content widget associated with the history token. |
| ContentWidget contentWidget = treeModel.getContentWidgetForToken( |
| event.getValue()); |
| if (contentWidget == null) { |
| return; |
| } |
| |
| // Expand the tree node associated with the content. |
| Category category = treeModel.getCategoryForContentWidget( |
| contentWidget); |
| TreeNode node = mainMenu.getRootTreeNode(); |
| int childCount = node.getChildCount(); |
| for (int i = 0; i < childCount; i++) { |
| if (node.getChildValue(i) == category) { |
| node.setChildOpen(i, true, true); |
| break; |
| } |
| } |
| |
| // Select the node in the tree. |
| selectionModel.setSelected(contentWidget, true); |
| |
| // Display the content widget. |
| displayContentWidget(contentWidget); |
| } |
| }; |
| History.addValueChangeHandler(historyHandler); |
| |
| // Show the initial example. |
| if (History.getToken().length() > 0) { |
| History.fireCurrentHistoryState(); |
| } else { |
| // Use the first token available. |
| TreeNode root = mainMenu.getRootTreeNode(); |
| TreeNode category = root.setChildOpen(0, true); |
| ContentWidget content = (ContentWidget) category.getChildValue(0); |
| selectionModel.setSelected(content, true); |
| } |
| |
| // Generate a site map. |
| createSiteMap(contentWidgets); |
| } |
| |
| /** |
| * Create a hidden site map for crawlability. |
| * |
| * @param contentWidgets the {@link ContentWidget}s used in Showcase |
| */ |
| private void createSiteMap(Set<ContentWidget> contentWidgets) { |
| SafeHtmlBuilder sb = new SafeHtmlBuilder(); |
| for (ContentWidget cw : contentWidgets) { |
| String token = getContentWidgetToken(cw); |
| sb.append(SafeHtmlUtils.fromTrustedString("<a href=\"#" + token + "\">" |
| + token + "</a>")); |
| } |
| |
| // Add the site map to the page. |
| HTML siteMap = new HTML(sb.toSafeHtml()); |
| siteMap.setVisible(false); |
| RootPanel.get().add(siteMap, 0, 0); |
| } |
| |
| /** |
| * Set the content to the {@link ContentWidget}. |
| * |
| * @param content the {@link ContentWidget} to display |
| */ |
| private void displayContentWidget(ContentWidget content) { |
| if (content == null) { |
| return; |
| } |
| |
| shell.setContent(content); |
| Window.setTitle("Showcase of Features: " + content.getName()); |
| } |
| |
| /** |
| * Convenience method for getting the document's head element. |
| * |
| * @return the document's head element |
| */ |
| private native HeadElement getHeadElement() /*-{ |
| return $doc.getElementsByTagName("head")[0]; |
| }-*/; |
| |
| /** |
| * Inject the GWT theme style sheet based on the RTL direction of the current |
| * locale. |
| */ |
| private void injectThemeStyleSheet() { |
| // Choose the name style sheet based on the locale. |
| String styleSheet = "gwt/" + THEME + "/" + THEME; |
| styleSheet += LocaleInfo.getCurrentLocale().isRTL() ? "_rtl.css" : ".css"; |
| |
| // Load the GWT theme style sheet |
| String modulePath = GWT.getModuleBaseURL(); |
| LinkElement linkElem = Document.get().createLinkElement(); |
| linkElem.setRel("stylesheet"); |
| linkElem.setType("text/css"); |
| linkElem.setHref(modulePath + styleSheet); |
| getHeadElement().appendChild(linkElem); |
| } |
| } |