| /* |
| * 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.content.lists; |
| |
| import com.google.gwt.core.client.GWT; |
| import com.google.gwt.core.client.RunAsyncCallback; |
| import com.google.gwt.event.logical.shared.OpenEvent; |
| import com.google.gwt.event.logical.shared.OpenHandler; |
| import com.google.gwt.i18n.client.Constants; |
| import com.google.gwt.sample.showcase.client.ContentWidget; |
| import com.google.gwt.sample.showcase.client.ShowcaseAnnotations.ShowcaseData; |
| import com.google.gwt.sample.showcase.client.ShowcaseAnnotations.ShowcaseSource; |
| import com.google.gwt.sample.showcase.client.ShowcaseAnnotations.ShowcaseStyle; |
| import com.google.gwt.user.client.Random; |
| import com.google.gwt.user.client.rpc.AsyncCallback; |
| import com.google.gwt.user.client.ui.DecoratorPanel; |
| import com.google.gwt.user.client.ui.Grid; |
| import com.google.gwt.user.client.ui.HasVerticalAlignment; |
| import com.google.gwt.user.client.ui.ScrollPanel; |
| import com.google.gwt.user.client.ui.Tree; |
| import com.google.gwt.user.client.ui.TreeItem; |
| import com.google.gwt.user.client.ui.Widget; |
| |
| /** |
| * Example file. |
| */ |
| @ShowcaseStyle(".gwt-Tree") |
| public class CwTree extends ContentWidget { |
| /** |
| * The constants used in this Content Widget. |
| */ |
| @ShowcaseSource |
| public static interface CwConstants extends Constants { |
| String[] cwTreeBeethovenWorkConcertos(); |
| |
| String[] cwTreeBeethovenWorkQuartets(); |
| |
| String[] cwTreeBeethovenWorkSonatas(); |
| |
| String[] cwTreeBeethovenWorkSymphonies(); |
| |
| String[] cwTreeBrahmsWorkConcertos(); |
| |
| String[] cwTreeBrahmsWorkQuartets(); |
| |
| String[] cwTreeBrahmsWorkSonatas(); |
| |
| String[] cwTreeBrahmsWorkSymphonies(); |
| |
| String[] cwTreeComposers(); |
| |
| String cwTreeConcertos(); |
| |
| String cwTreeDescription(); |
| |
| String cwTreeDynamicLabel(); |
| |
| String cwTreeItem(); |
| |
| String[] cwTreeMozartWorkConcertos(); |
| |
| String cwTreeName(); |
| |
| String cwTreeQuartets(); |
| |
| String cwTreeSonatas(); |
| |
| String cwTreeStaticLabel(); |
| |
| String cwTreeSymphonies(); |
| } |
| |
| /** |
| * An instance of the constants. |
| */ |
| @ShowcaseData |
| private final CwConstants constants; |
| |
| /** |
| * Constructor. |
| * |
| * @param constants the constants |
| */ |
| public CwTree(CwConstants constants) { |
| super(constants.cwTreeName(), constants.cwTreeDescription(), true); |
| this.constants = constants; |
| } |
| |
| /** |
| * Initialize this example. |
| */ |
| @ShowcaseSource |
| @Override |
| public Widget onInitialize() { |
| // Create a static tree and a container to hold it |
| Tree staticTree = createStaticTree(); |
| staticTree.setAnimationEnabled(true); |
| staticTree.ensureDebugId("cwTree-staticTree"); |
| ScrollPanel staticTreeWrapper = new ScrollPanel(staticTree); |
| staticTreeWrapper.ensureDebugId("cwTree-staticTree-Wrapper"); |
| staticTreeWrapper.setSize("300px", "300px"); |
| |
| // Wrap the static tree in a DecoratorPanel |
| DecoratorPanel staticDecorator = new DecoratorPanel(); |
| staticDecorator.setWidget(staticTreeWrapper); |
| |
| // Create a dynamically generated tree and a container to hold it |
| final Tree dynamicTree = createDynamicTree(); |
| dynamicTree.ensureDebugId("cwTree-dynamicTree"); |
| ScrollPanel dynamicTreeWrapper = new ScrollPanel(dynamicTree); |
| dynamicTreeWrapper.ensureDebugId("cwTree-dynamicTree-Wrapper"); |
| dynamicTreeWrapper.setSize("300px", "300px"); |
| |
| // Wrap the dynamic tree in a DecoratorPanel |
| DecoratorPanel dynamicDecorator = new DecoratorPanel(); |
| dynamicDecorator.setWidget(dynamicTreeWrapper); |
| |
| // Combine trees onto the page |
| Grid grid = new Grid(2, 3); |
| grid.setCellPadding(2); |
| grid.getRowFormatter().setVerticalAlign(1, HasVerticalAlignment.ALIGN_TOP); |
| grid.setHTML(0, 0, constants.cwTreeStaticLabel()); |
| grid.setHTML(0, 1, " "); |
| grid.setHTML(0, 2, constants.cwTreeDynamicLabel()); |
| grid.setWidget(1, 0, staticDecorator); |
| grid.setHTML(1, 1, " "); |
| grid.setWidget(1, 2, dynamicDecorator); |
| |
| // Wrap the trees in DecoratorPanels |
| return grid; |
| } |
| |
| @Override |
| protected void asyncOnInitialize(final AsyncCallback<Widget> callback) { |
| GWT.runAsync(CwTree.class, new RunAsyncCallback() { |
| |
| public void onFailure(Throwable caught) { |
| callback.onFailure(caught); |
| } |
| |
| public void onSuccess() { |
| callback.onSuccess(onInitialize()); |
| } |
| }); |
| } |
| |
| /** |
| * Add a new section of music created by a specific composer. |
| * |
| * @param parent the parent {@link TreeItem} where the section will be added |
| * @param label the label of the new section of music |
| * @param composerWorks an array of works created by the composer |
| */ |
| @ShowcaseSource |
| private void addMusicSection( |
| TreeItem parent, String label, String[] composerWorks) { |
| TreeItem section = parent.addItem(label); |
| for (String work : composerWorks) { |
| section.addItem(work); |
| } |
| } |
| |
| /** |
| * Create a dynamic tree that will add a random number of children to each |
| * node as it is clicked. |
| * |
| * @return the new tree |
| */ |
| @ShowcaseSource |
| private Tree createDynamicTree() { |
| // Create a new tree |
| Tree dynamicTree = new Tree(); |
| |
| // Add some default tree items |
| for (int i = 0; i < 5; i++) { |
| TreeItem item = dynamicTree.addItem(constants.cwTreeItem() + " " + i); |
| |
| // Temporarily add an item so we can expand this node |
| item.addItem(""); |
| } |
| |
| // Add a handler that automatically generates some children |
| dynamicTree.addOpenHandler(new OpenHandler<TreeItem>() { |
| public void onOpen(OpenEvent<TreeItem> event) { |
| TreeItem item = event.getTarget(); |
| if (item.getChildCount() == 1) { |
| // Close the item immediately |
| item.setState(false, false); |
| |
| // Add a random number of children to the item |
| String itemText = item.getText(); |
| int numChildren = Random.nextInt(5) + 2; |
| for (int i = 0; i < numChildren; i++) { |
| TreeItem child = item.addItem(itemText + "." + i); |
| child.addItem(""); |
| } |
| |
| // Remove the temporary item when we finish loading |
| item.getChild(0).remove(); |
| |
| // Reopen the item |
| item.setState(true, false); |
| } |
| } |
| }); |
| |
| // Return the tree |
| return dynamicTree; |
| } |
| |
| /** |
| * Create a static tree with some data in it. |
| * |
| * @return the new tree |
| */ |
| @ShowcaseSource |
| private Tree createStaticTree() { |
| // Create the tree |
| String[] composers = constants.cwTreeComposers(); |
| String concertosLabel = constants.cwTreeConcertos(); |
| String quartetsLabel = constants.cwTreeQuartets(); |
| String sonatasLabel = constants.cwTreeSonatas(); |
| String symphoniesLabel = constants.cwTreeSymphonies(); |
| Tree staticTree = new Tree(); |
| |
| // Add some of Beethoven's music |
| TreeItem beethovenItem = staticTree.addItem(composers[0]); |
| addMusicSection(beethovenItem, concertosLabel, |
| constants.cwTreeBeethovenWorkConcertos()); |
| addMusicSection( |
| beethovenItem, quartetsLabel, constants.cwTreeBeethovenWorkQuartets()); |
| addMusicSection( |
| beethovenItem, sonatasLabel, constants.cwTreeBeethovenWorkSonatas()); |
| addMusicSection(beethovenItem, symphoniesLabel, |
| constants.cwTreeBeethovenWorkSymphonies()); |
| |
| // Add some of Brahms's music |
| TreeItem brahmsItem = staticTree.addItem(composers[1]); |
| addMusicSection( |
| brahmsItem, concertosLabel, constants.cwTreeBrahmsWorkConcertos()); |
| addMusicSection( |
| brahmsItem, quartetsLabel, constants.cwTreeBrahmsWorkQuartets()); |
| addMusicSection( |
| brahmsItem, sonatasLabel, constants.cwTreeBrahmsWorkSonatas()); |
| addMusicSection( |
| brahmsItem, symphoniesLabel, constants.cwTreeBrahmsWorkSymphonies()); |
| |
| // Add some of Mozart's music |
| TreeItem mozartItem = staticTree.addItem(composers[2]); |
| addMusicSection( |
| mozartItem, concertosLabel, constants.cwTreeMozartWorkConcertos()); |
| |
| // Return the tree |
| return staticTree; |
| } |
| } |