com.dingziran.effective.client.Showcase.java Source code

Java tutorial

Introduction

Here is the source code for com.dingziran.effective.client.Showcase.java

Source

/*
 * 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.dingziran.effective.client;

import com.dingziran.effective.client.MainMenuTreeViewModel.Category;
import com.dingziran.effective.client.resources.ShowcaseResources;
import com.dingziran.effective.shared.Factory;
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.event.shared.SimpleEventBus;
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.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 com.google.web.bindery.requestfactory.shared.Receiver;

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 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;
    static Factory factory;

    public static Factory getFactory() {
        return factory;
    }

    static SimpleEventBus eventBus;

    public static SimpleEventBus getEventBus() {
        return eventBus;
    }

    /**
       * This is the entry point method.
       */
    public void onModuleLoad() {
        factory = GWT.create(Factory.class);
        eventBus = new SimpleEventBus();
        factory.initialize(eventBus);
        // 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);

        final CellTree mainMenu = shell.getMainMenu();
        /*
            // Prefetch examples when opening the Category tree nodes.
            final List<Category> prefetched = new ArrayList<Category>();
            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);
    }
}