| /* |
| * 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.google.gwt.sample.showcase.client; |
| |
| import com.google.gwt.cell.client.AbstractCell; |
| import com.google.gwt.core.client.prefetch.RunAsyncCode; |
| import com.google.gwt.i18n.client.Constants; |
| import com.google.gwt.safehtml.shared.SafeHtmlBuilder; |
| import com.google.gwt.sample.showcase.client.content.cell.CwCellBrowser; |
| import com.google.gwt.sample.showcase.client.content.cell.CwCellList; |
| import com.google.gwt.sample.showcase.client.content.cell.CwCellSampler; |
| import com.google.gwt.sample.showcase.client.content.cell.CwCellTable; |
| import com.google.gwt.sample.showcase.client.content.cell.CwCellTree; |
| import com.google.gwt.sample.showcase.client.content.cell.CwCellValidation; |
| import com.google.gwt.sample.showcase.client.content.cell.CwCustomDataGrid; |
| import com.google.gwt.sample.showcase.client.content.cell.CwDataGrid; |
| import com.google.gwt.sample.showcase.client.content.i18n.CwBidiFormatting; |
| import com.google.gwt.sample.showcase.client.content.i18n.CwBidiInput; |
| import com.google.gwt.sample.showcase.client.content.i18n.CwConstantsExample; |
| import com.google.gwt.sample.showcase.client.content.i18n.CwConstantsWithLookupExample; |
| import com.google.gwt.sample.showcase.client.content.i18n.CwDateTimeFormat; |
| import com.google.gwt.sample.showcase.client.content.i18n.CwDictionaryExample; |
| import com.google.gwt.sample.showcase.client.content.i18n.CwMessagesExample; |
| import com.google.gwt.sample.showcase.client.content.i18n.CwNumberFormat; |
| import com.google.gwt.sample.showcase.client.content.i18n.CwPluralFormsExample; |
| import com.google.gwt.sample.showcase.client.content.lists.CwListBox; |
| import com.google.gwt.sample.showcase.client.content.lists.CwMenuBar; |
| import com.google.gwt.sample.showcase.client.content.lists.CwStackLayoutPanel; |
| import com.google.gwt.sample.showcase.client.content.lists.CwStackPanel; |
| import com.google.gwt.sample.showcase.client.content.lists.CwSuggestBox; |
| import com.google.gwt.sample.showcase.client.content.lists.CwTree; |
| import com.google.gwt.sample.showcase.client.content.other.CwAnimation; |
| import com.google.gwt.sample.showcase.client.content.other.CwCookies; |
| import com.google.gwt.sample.showcase.client.content.panels.CwAbsolutePanel; |
| import com.google.gwt.sample.showcase.client.content.panels.CwDecoratorPanel; |
| import com.google.gwt.sample.showcase.client.content.panels.CwDisclosurePanel; |
| import com.google.gwt.sample.showcase.client.content.panels.CwDockPanel; |
| import com.google.gwt.sample.showcase.client.content.panels.CwFlowPanel; |
| import com.google.gwt.sample.showcase.client.content.panels.CwHorizontalPanel; |
| import com.google.gwt.sample.showcase.client.content.panels.CwSplitLayoutPanel; |
| import com.google.gwt.sample.showcase.client.content.panels.CwTabLayoutPanel; |
| import com.google.gwt.sample.showcase.client.content.panels.CwVerticalPanel; |
| import com.google.gwt.sample.showcase.client.content.popups.CwBasicPopup; |
| import com.google.gwt.sample.showcase.client.content.popups.CwDialogBox; |
| import com.google.gwt.sample.showcase.client.content.tables.CwFlexTable; |
| import com.google.gwt.sample.showcase.client.content.tables.CwGrid; |
| import com.google.gwt.sample.showcase.client.content.text.CwBasicText; |
| import com.google.gwt.sample.showcase.client.content.text.CwRichText; |
| import com.google.gwt.sample.showcase.client.content.widgets.CwBasicButton; |
| import com.google.gwt.sample.showcase.client.content.widgets.CwCheckBox; |
| import com.google.gwt.sample.showcase.client.content.widgets.CwCustomButton; |
| import com.google.gwt.sample.showcase.client.content.widgets.CwDatePicker; |
| import com.google.gwt.sample.showcase.client.content.widgets.CwFileUpload; |
| import com.google.gwt.sample.showcase.client.content.widgets.CwHyperlink; |
| import com.google.gwt.sample.showcase.client.content.widgets.CwRadioButton; |
| import com.google.gwt.view.client.ListDataProvider; |
| import com.google.gwt.view.client.SelectionModel; |
| import com.google.gwt.view.client.TreeViewModel; |
| |
| import java.util.ArrayList; |
| import java.util.HashMap; |
| import java.util.HashSet; |
| import java.util.List; |
| import java.util.Map; |
| import java.util.Set; |
| |
| /** |
| * The {@link TreeViewModel} used by the main menu. |
| */ |
| public class MainMenuTreeViewModel implements TreeViewModel { |
| |
| /** |
| * The constants used in the menu. |
| */ |
| public static interface MenuConstants extends Constants { |
| |
| String categoryCells(); |
| |
| String categoryI18N(); |
| |
| String categoryLists(); |
| |
| String categoryOther(); |
| |
| String categoryPanels(); |
| |
| String categoryPopups(); |
| |
| String categoryTables(); |
| |
| String categoryTextInput(); |
| |
| String categoryWidgets(); |
| } |
| |
| /** |
| * The cell used to render categories. |
| */ |
| private static class CategoryCell extends AbstractCell<Category> { |
| @Override |
| public void render(Context context, Category value, SafeHtmlBuilder sb) { |
| if (value != null) { |
| sb.appendEscaped(value.getName()); |
| } |
| } |
| } |
| |
| /** |
| * The cell used to render examples. |
| */ |
| private static class ContentWidgetCell extends AbstractCell<ContentWidget> { |
| @Override |
| public void render(Context context, ContentWidget value, SafeHtmlBuilder sb) { |
| if (value != null) { |
| sb.appendEscaped(value.getName()); |
| } |
| } |
| } |
| |
| /** |
| * A top level category in the tree. |
| */ |
| public class Category { |
| |
| private final ListDataProvider<ContentWidget> examples = |
| new ListDataProvider<ContentWidget>(); |
| private final String name; |
| private NodeInfo<ContentWidget> nodeInfo; |
| private final List<RunAsyncCode> splitPoints = |
| new ArrayList<RunAsyncCode>(); |
| |
| public Category(String name) { |
| this.name = name; |
| } |
| |
| public void addExample(ContentWidget example, RunAsyncCode splitPoint) { |
| examples.getList().add(example); |
| if (splitPoint != null) { |
| splitPoints.add(splitPoint); |
| } |
| contentCategory.put(example, this); |
| contentToken.put(Showcase.getContentWidgetToken(example), example); |
| } |
| |
| public String getName() { |
| return name; |
| } |
| |
| /** |
| * Get the node info for the examples under this category. |
| * |
| * @return the node info |
| */ |
| public NodeInfo<ContentWidget> getNodeInfo() { |
| if (nodeInfo == null) { |
| nodeInfo = new DefaultNodeInfo<ContentWidget>(examples, |
| contentWidgetCell, selectionModel, null); |
| } |
| return nodeInfo; |
| } |
| |
| /** |
| * Get the list of split points to prefetch for this category. |
| * |
| * @return the list of classes in this category |
| */ |
| public Iterable<RunAsyncCode> getSplitPoints() { |
| return splitPoints; |
| } |
| } |
| |
| /** |
| * The top level categories. |
| */ |
| private final ListDataProvider<Category> categories = new ListDataProvider<Category>(); |
| |
| /** |
| * A mapping of {@link ContentWidget}s to their associated categories. |
| */ |
| private final Map<ContentWidget, Category> contentCategory = new HashMap<ContentWidget, Category>(); |
| |
| /** |
| * The cell used to render examples. |
| */ |
| private final ContentWidgetCell contentWidgetCell = new ContentWidgetCell(); |
| |
| /** |
| * A mapping of history tokens to their associated {@link ContentWidget}. |
| */ |
| private final Map<String, ContentWidget> contentToken = new HashMap<String, ContentWidget>(); |
| |
| /** |
| * The selection model used to select examples. |
| */ |
| private final SelectionModel<ContentWidget> selectionModel; |
| |
| public MainMenuTreeViewModel(ShowcaseConstants constants, |
| SelectionModel<ContentWidget> selectionModel) { |
| this.selectionModel = selectionModel; |
| initializeTree(constants); |
| } |
| |
| /** |
| * Get the {@link Category} associated with a widget. |
| * |
| * @param widget the {@link ContentWidget} |
| * @return the associated {@link Category} |
| */ |
| public Category getCategoryForContentWidget(ContentWidget widget) { |
| return contentCategory.get(widget); |
| } |
| |
| /** |
| * Get the content widget associated with the specified history token. |
| * |
| * @param token the history token |
| * @return the associated {@link ContentWidget} |
| */ |
| public ContentWidget getContentWidgetForToken(String token) { |
| return contentToken.get(token); |
| } |
| |
| public <T> NodeInfo<?> getNodeInfo(T value) { |
| if (value == null) { |
| // Return the top level categories. |
| return new DefaultNodeInfo<Category>(categories, new CategoryCell()); |
| } else if (value instanceof Category) { |
| // Return the examples within the category. |
| Category category = (Category) value; |
| return category.getNodeInfo(); |
| } |
| return null; |
| } |
| |
| public boolean isLeaf(Object value) { |
| return value != null && !(value instanceof Category); |
| } |
| |
| /** |
| * Get the set of all {@link ContentWidget}s used in the model. |
| * |
| * @return the {@link ContentWidget}s |
| */ |
| Set<ContentWidget> getAllContentWidgets() { |
| Set<ContentWidget> widgets = new HashSet<ContentWidget>(); |
| for (Category category : categories.getList()) { |
| for (ContentWidget example : category.examples.getList()) { |
| widgets.add(example); |
| } |
| } |
| return widgets; |
| } |
| |
| /** |
| * Initialize the top level categories in the tree. |
| */ |
| private void initializeTree(ShowcaseConstants constants) { |
| List<Category> catList = categories.getList(); |
| |
| // Widgets. |
| { |
| Category category = new Category(constants.categoryWidgets()); |
| catList.add(category); |
| // CwCheckBox is the default example, so don't prefetch it. |
| category.addExample(new CwCheckBox(constants), null); |
| category.addExample(new CwRadioButton(constants), |
| RunAsyncCode.runAsyncCode(CwRadioButton.class)); |
| category.addExample(new CwBasicButton(constants), |
| RunAsyncCode.runAsyncCode(CwBasicButton.class)); |
| category.addExample(new CwCustomButton(constants), |
| RunAsyncCode.runAsyncCode(CwCustomButton.class)); |
| category.addExample(new CwFileUpload(constants), |
| RunAsyncCode.runAsyncCode(CwFileUpload.class)); |
| category.addExample(new CwDatePicker(constants), |
| RunAsyncCode.runAsyncCode(CwDatePicker.class)); |
| category.addExample(new CwHyperlink(constants), |
| RunAsyncCode.runAsyncCode(CwHyperlink.class)); |
| } |
| |
| // Lists and Menus. |
| { |
| Category category = new Category(constants.categoryLists()); |
| catList.add(category); |
| category.addExample(new CwListBox(constants), |
| RunAsyncCode.runAsyncCode(CwListBox.class)); |
| category.addExample(new CwSuggestBox(constants), |
| RunAsyncCode.runAsyncCode(CwSuggestBox.class)); |
| category.addExample(new CwTree(constants), |
| RunAsyncCode.runAsyncCode(CwTree.class)); |
| category.addExample(new CwMenuBar(constants), |
| RunAsyncCode.runAsyncCode(CwMenuBar.class)); |
| category.addExample(new CwStackPanel(constants), |
| RunAsyncCode.runAsyncCode(CwStackPanel.class)); |
| category.addExample(new CwStackLayoutPanel(constants), |
| RunAsyncCode.runAsyncCode(CwStackLayoutPanel.class)); |
| } |
| |
| // Text Input. |
| { |
| Category category = new Category(constants.categoryTextInput()); |
| catList.add(category); |
| category.addExample(new CwBasicText(constants), |
| RunAsyncCode.runAsyncCode(CwBasicText.class)); |
| category.addExample(new CwRichText(constants), |
| RunAsyncCode.runAsyncCode(CwRichText.class)); |
| } |
| |
| // Popups. |
| { |
| Category category = new Category(constants.categoryPopups()); |
| catList.add(category); |
| category.addExample(new CwBasicPopup(constants), |
| RunAsyncCode.runAsyncCode(CwBasicPopup.class)); |
| category.addExample(new CwDialogBox(constants), |
| RunAsyncCode.runAsyncCode(CwDialogBox.class)); |
| } |
| |
| // Panels. |
| { |
| Category category = new Category(constants.categoryPanels()); |
| catList.add(category); |
| category.addExample(new CwDecoratorPanel(constants), |
| RunAsyncCode.runAsyncCode(CwDecoratorPanel.class)); |
| category.addExample(new CwFlowPanel(constants), |
| RunAsyncCode.runAsyncCode(CwFlowPanel.class)); |
| category.addExample(new CwHorizontalPanel(constants), |
| RunAsyncCode.runAsyncCode(CwHorizontalPanel.class)); |
| category.addExample(new CwVerticalPanel(constants), |
| RunAsyncCode.runAsyncCode(CwVerticalPanel.class)); |
| category.addExample(new CwAbsolutePanel(constants), |
| RunAsyncCode.runAsyncCode(CwAbsolutePanel.class)); |
| category.addExample(new CwDockPanel(constants), |
| RunAsyncCode.runAsyncCode(CwDockPanel.class)); |
| category.addExample(new CwDisclosurePanel(constants), |
| RunAsyncCode.runAsyncCode(CwDisclosurePanel.class)); |
| category.addExample(new CwTabLayoutPanel(constants), |
| RunAsyncCode.runAsyncCode(CwTabLayoutPanel.class)); |
| category.addExample(new CwSplitLayoutPanel(constants), |
| RunAsyncCode.runAsyncCode(CwSplitLayoutPanel.class)); |
| } |
| |
| // Tables. |
| { |
| Category category = new Category(constants.categoryTables()); |
| catList.add(category); |
| category.addExample(new CwGrid(constants), |
| RunAsyncCode.runAsyncCode(CwGrid.class)); |
| category.addExample(new CwFlexTable(constants), |
| RunAsyncCode.runAsyncCode(CwFlexTable.class)); |
| } |
| |
| // Cells. |
| { |
| Category category = new Category(constants.categoryCells()); |
| catList.add(category); |
| category.addExample(new CwCellList(constants), |
| RunAsyncCode.runAsyncCode(CwCellList.class)); |
| category.addExample(new CwCellTable(constants), |
| RunAsyncCode.runAsyncCode(CwCellTable.class)); |
| category.addExample(new CwDataGrid(constants), |
| RunAsyncCode.runAsyncCode(CwDataGrid.class)); |
| category.addExample(new CwCustomDataGrid(constants), |
| RunAsyncCode.runAsyncCode(CwCustomDataGrid.class)); |
| category.addExample(new CwCellTree(constants), |
| RunAsyncCode.runAsyncCode(CwCellTree.class)); |
| category.addExample(new CwCellBrowser(constants), |
| RunAsyncCode.runAsyncCode(CwCellBrowser.class)); |
| category.addExample(new CwCellSampler(constants), |
| RunAsyncCode.runAsyncCode(CwCellSampler.class)); |
| category.addExample(new CwCellValidation(constants), |
| RunAsyncCode.runAsyncCode(CwCellValidation.class)); |
| } |
| |
| // I18N. |
| { |
| Category category = new Category(constants.categoryI18N()); |
| catList.add(category); |
| category.addExample(new CwNumberFormat(constants), |
| RunAsyncCode.runAsyncCode(CwNumberFormat.class)); |
| category.addExample(new CwDateTimeFormat(constants), |
| RunAsyncCode.runAsyncCode(CwDateTimeFormat.class)); |
| category.addExample(new CwMessagesExample(constants), |
| RunAsyncCode.runAsyncCode(CwMessagesExample.class)); |
| category.addExample(new CwBidiInput(constants), |
| RunAsyncCode.runAsyncCode(CwBidiInput.class)); |
| category.addExample(new CwBidiFormatting(constants), |
| RunAsyncCode.runAsyncCode(CwBidiFormatting.class)); |
| category.addExample(new CwPluralFormsExample(constants), |
| RunAsyncCode.runAsyncCode(CwPluralFormsExample.class)); |
| category.addExample(new CwConstantsExample(constants), |
| RunAsyncCode.runAsyncCode(CwConstantsExample.class)); |
| category.addExample(new CwConstantsWithLookupExample(constants), |
| RunAsyncCode.runAsyncCode(CwConstantsWithLookupExample.class)); |
| category.addExample(new CwDictionaryExample(constants), |
| RunAsyncCode.runAsyncCode(CwDictionaryExample.class)); |
| } |
| |
| // Other. |
| { |
| Category category = new Category(constants.categoryOther()); |
| catList.add(category); |
| category.addExample(new CwAnimation(constants), |
| RunAsyncCode.runAsyncCode(CwAnimation.class)); |
| category.addExample(new CwCookies(constants), |
| RunAsyncCode.runAsyncCode(CwCookies.class)); |
| } |
| } |
| } |