blob: 9f4ce98880c9d5b650803fa876282aa51a640051 [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.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;
}
}