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

Java tutorial

Introduction

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

Source

/*
 * Copyright 2010 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.google.gwt.core.client.GWT;
import com.google.gwt.dom.client.Style.Display;
import com.google.gwt.dom.client.Style.Unit;
import com.google.gwt.dom.client.TableCellElement;
import com.google.gwt.dom.client.TableElement;
import com.google.gwt.event.dom.client.ChangeEvent;
import com.google.gwt.event.dom.client.ChangeHandler;
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.event.dom.client.ClickHandler;
import com.google.gwt.event.logical.shared.ValueChangeEvent;
import com.google.gwt.event.logical.shared.ValueChangeHandler;
import com.google.gwt.event.shared.HandlerRegistration;
import com.google.gwt.http.client.UrlBuilder;
import com.google.gwt.i18n.client.HasDirection.Direction;
import com.google.gwt.i18n.client.LocaleInfo;
import com.google.gwt.uibinder.client.UiBinder;
import com.google.gwt.uibinder.client.UiField;
import com.google.gwt.user.cellview.client.CellTree;
import com.google.gwt.user.cellview.client.HasKeyboardSelectionPolicy.KeyboardSelectionPolicy;
import com.google.gwt.user.client.Cookies;
import com.google.gwt.user.client.Window;
import com.google.gwt.user.client.Window.Location;
import com.google.gwt.user.client.ui.AbstractImagePrototype;
import com.google.gwt.user.client.ui.Anchor;
import com.google.gwt.user.client.ui.HTML;
import com.google.gwt.user.client.ui.ListBox;
import com.google.gwt.user.client.ui.ResizeComposite;
import com.google.gwt.user.client.ui.ScrollPanel;
import com.google.gwt.user.client.ui.SimpleLayoutPanel;
import com.google.gwt.user.client.ui.Widget;
import com.google.gwt.view.client.TreeViewModel;

import java.util.Date;
import java.util.List;

/**
 * Application shell for Showcase sample.
 */
public class ShowcaseShell extends ResizeComposite {

    interface ShowcaseShellUiBinder extends UiBinder<Widget, ShowcaseShell> {
    }

    /**
     * The text color of the selected tab.
     */
    private static final String SELECTED_TAB_COLOR = "#333333";

    /**
     * The unique ID assigned to the next callback.
     */
    private static int nextCallbackId = 0;

    private static ShowcaseShellUiBinder uiBinder = GWT.create(ShowcaseShellUiBinder.class);

    /**
     * The panel that holds the content.
     */
    @UiField
    SimpleLayoutPanel contentPanel;

    /**
     * The container around the links at the top of the app.
     */
    @UiField
    TableElement linkCell;

    /**
     * A drop box used to change the locale.
     */
    @UiField
    ListBox localeBox;

    /**
     * The container around locale selection.
     */
    @UiField
    TableCellElement localeSelectionCell;

    /**
     * The main menu used to navigate to examples.
     */
    @UiField(provided = true)
    CellTree mainMenu;

    /**
     * The button used to show the example.
     */
    @UiField
    Anchor tabExample;

    /**
     * The button used to show the source CSS style.
     */
    @UiField
    Anchor tabStyle;

    /**
     * The button used to show the source code.
     */
    @UiField
    Anchor tabSource;

    /**
     * The list of available source code.
     */
    @UiField
    ListBox tabSourceList;

    /**
     * The current {@link ContentWidget} being displayed.
     */
    private ContentWidget content;

    /**
     * The handler used to handle user requests to view raw source.
     */
    private HandlerRegistration contentSourceHandler;

    /**
     * The widget that holds CSS or source code for an example.
     */
    private HTML contentSource = new HTML();

    /**
     * The html used to show a loading icon.
     */
    private final String loadingHtml;

    /**
     * Construct the {@link ShowcaseShell}.
     *
     * @param treeModel the treeModel that backs the main menu
     */
    public ShowcaseShell(TreeViewModel treeModel) {
        AbstractImagePrototype proto = AbstractImagePrototype.create(Showcase.images.loading());
        loadingHtml = proto.getHTML();

        // Create the cell tree.
        mainMenu = new CellTree(treeModel, null);
        mainMenu.setAnimationEnabled(true);
        mainMenu.setKeyboardSelectionPolicy(KeyboardSelectionPolicy.DISABLED);
        mainMenu.ensureDebugId("mainMenu");

        // Initialize the ui binder.
        initWidget(uiBinder.createAndBindUi(this));
        initializeLocaleBox();
        contentSource.getElement().getStyle().setBackgroundColor("#eee");
        contentSource.getElement().getStyle().setMargin(10.0, Unit.PX);
        contentSource.getElement().getStyle().setProperty("border", "1px solid #c3c3c3");
        contentSource.getElement().getStyle().setProperty("padding", "10px 2px");

        // In RTL mode, we need to set some attributes.
        if (LocaleInfo.getCurrentLocale().isRTL()) {
            localeSelectionCell.setAlign("left");
            linkCell.setPropertyString("align", "left");
        }
        // Default to no content.
        contentPanel.ensureDebugId("contentPanel");
        setContent(null);
    }

    /**
     * Returns the currently displayed content. (Used by tests.)
     */
    public ContentWidget getContent() {
        return content;
    }

    /**
     * Get the main menu used to select examples.
     *
     * @return the main menu
     */
    public CellTree getMainMenu() {
        return mainMenu;
    }

    /**
     * Set the content to display.
     *
     * @param content the content
     */
    public void setContent(final ContentWidget content) {
        // Clear the old handler.
        if (contentSourceHandler != null) {
            contentSourceHandler.removeHandler();
            contentSourceHandler = null;
        }

        this.content = content;
        if (content == null) {
            tabExample.setVisible(true);
            tabStyle.setVisible(false);
            tabSource.setVisible(false);
            tabSourceList.setVisible(false);
            contentPanel.setWidget(null);
            return;
        }

        // Setup the options bar.
        tabExample.setVisible(true);
        tabStyle.setVisible(false);
        tabSource.setVisible(false);

        /*
         * Show the list of raw source files if there are any. We need to add at
         * least one option to the list for crawlability. If we do not, HtmlUnit
         * innerHtml will close the select tag in the open tag (ie, use a forward
         * slash instead of a separate close tag) which most browsers parse
         * incorrectly.
         */
        tabSourceList.clear();
        tabSourceList.addItem("Example");
        tabSourceList.setVisible(false);

        // Handle user requests for raw source.
        contentSourceHandler = content.addValueChangeHandler(new ValueChangeHandler<String>() {
            public void onValueChange(ValueChangeEvent<String> event) {
                // Select the file in the list box.
                String filename = event.getValue();

                // Show the file.
                //showSourceFile();
            }
        });

        // Show the widget.
        showExample();
    }

    /**
     * Initialize the {@link ListBox} used for locale selection.
     */
    private void initializeLocaleBox() {
        final String cookieName = LocaleInfo.getLocaleCookieName();
        final String queryParam = LocaleInfo.getLocaleQueryParam();
        if (cookieName == null && queryParam == null) {
            // if there is no way for us to affect the locale, don't show the selector
            localeSelectionCell.getStyle().setDisplay(Display.NONE);
            return;
        }
        String currentLocale = LocaleInfo.getCurrentLocale().getLocaleName();
        if (currentLocale.equals("default")) {
            currentLocale = "en";
        }
        String[] localeNames = LocaleInfo.getAvailableLocaleNames();
        for (String localeName : localeNames) {
            if (!localeName.equals("default")) {
                String nativeName = LocaleInfo.getLocaleNativeDisplayName(localeName);
                localeBox.addItem(nativeName, localeName);
                if (localeName.equals(currentLocale)) {
                    localeBox.setSelectedIndex(localeBox.getItemCount() - 1);
                }
            }
        }
        localeBox.addChangeHandler(new ChangeHandler() {
            @SuppressWarnings("deprecation")
            public void onChange(ChangeEvent event) {
                String localeName = localeBox.getValue(localeBox.getSelectedIndex());
                if (cookieName != null) {
                    // expire in one year
                    Date expires = new Date();
                    expires.setYear(expires.getYear() + 1);
                    Cookies.setCookie(cookieName, localeName, expires);
                }
                if (queryParam != null) {
                    UrlBuilder builder = Location.createUrlBuilder().setParameter(queryParam, localeName);
                    Window.Location.replace(builder.buildString());
                } else {
                    // If we are using only cookies, just reload
                    Window.Location.reload();
                }
            }
        });
    }

    /**
     * Show a example.
     */
    private void showExample() {
        if (content == null) {
            return;
        }

        // Set the highlighted tab.
        tabExample.getElement().getStyle().setColor(SELECTED_TAB_COLOR);
        tabStyle.getElement().getStyle().clearColor();
        tabSource.getElement().getStyle().clearColor();

        contentPanel.setWidget(content);
    }
}