blob: cb2efb396df97b475a4bee83eb787bc5bf056b28 [file] [log] [blame]
/*
* 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);
}
}