/** * Sencha GXT 3.0.0b - Sencha for GWT * Copyright(c) 2007-2012, Sencha, Inc. * licensing@sencha.com * * http://www.sencha.com/products/gxt/license/ */ package com.sencha.gxt.explorer.client.tree; import java.util.List; import com.google.gwt.core.client.EntryPoint; import com.google.gwt.event.logical.shared.SelectionEvent; import com.google.gwt.event.logical.shared.SelectionHandler; import com.google.gwt.user.client.ui.IsWidget; import com.google.gwt.user.client.ui.RootPanel; import com.google.gwt.user.client.ui.Widget; import com.sencha.gxt.core.client.ValueProvider; import com.sencha.gxt.data.shared.ModelKeyProvider; import com.sencha.gxt.data.shared.TreeStore; import com.sencha.gxt.examples.resources.client.TestData; import com.sencha.gxt.examples.resources.client.images.ExampleImages; import com.sencha.gxt.examples.resources.client.model.BaseDto; import com.sencha.gxt.examples.resources.client.model.FolderDto; import com.sencha.gxt.explorer.client.model.Example.Detail; import com.sencha.gxt.widget.core.client.button.TextButton; import com.sencha.gxt.widget.core.client.container.FlowLayoutContainer; import com.sencha.gxt.widget.core.client.container.MarginData; import com.sencha.gxt.widget.core.client.event.SelectEvent; import com.sencha.gxt.widget.core.client.event.SelectEvent.SelectHandler; import com.sencha.gxt.widget.core.client.menu.Item; import com.sencha.gxt.widget.core.client.menu.Menu; import com.sencha.gxt.widget.core.client.menu.MenuItem; import com.sencha.gxt.widget.core.client.tree.Tree; @Detail(name = "Context Menu Tree", category = "Tree", icon = "contextmenutree") public class ContextMenuTreeExample implements IsWidget, EntryPoint { private int count = 1; class KeyProvider implements ModelKeyProvider<BaseDto> { @Override public String getKey(BaseDto item) { return (item instanceof FolderDto ? "f-" : "m-") + item.getId().toString(); } } public void onModuleLoad() { RootPanel.get().add(asWidget()); } private TreeStore<BaseDto> store; private FolderDto root = TestData.getMusicRootFolder(); @Override public Widget asWidget() { FlowLayoutContainer con = new FlowLayoutContainer(); con.addStyleName("margin-10"); store = new TreeStore<BaseDto>(new KeyProvider()); loadStore(store, root); final Tree<BaseDto, String> tree = new Tree<BaseDto, String>(store, new ValueProvider<BaseDto, String>() { @Override public String getValue(BaseDto object) { return object.getName(); } @Override public void setValue(BaseDto object, String value) { } @Override public String getPath() { return "name"; } }); tree.setWidth(300); tree.getStyle().setLeafIcon(ExampleImages.INSTANCE.music()); TextButton b = new TextButton("Reset"); b.addSelectHandler(new SelectHandler() { @Override public void onSelect(SelectEvent event) { store.clear(); loadStore(store, root); } }); Menu contextMenu = new Menu(); MenuItem insert = new MenuItem(); insert.setText("Insert Item"); insert.setIcon(ExampleImages.INSTANCE.add()); insert.addSelectionHandler(new SelectionHandler<Item>() { @Override public void onSelection(SelectionEvent<Item> event) { BaseDto sel = tree.getSelectionModel().getSelectedItem(); if (sel != null) { FolderDto child = new FolderDto(count * 100, "Add Child " + count++); store.add(sel, child); tree.setExpanded(sel, true); } } }); contextMenu.add(insert); MenuItem remove = new MenuItem(); remove.setText("Remove Selected"); remove.setIcon(ExampleImages.INSTANCE.delete()); remove.addSelectionHandler(new SelectionHandler<Item>() { @Override public void onSelection(SelectionEvent<Item> event) { List<BaseDto> selected = tree.getSelectionModel().getSelectedItems(); for (BaseDto sel : selected) { store.remove(sel); } } }); contextMenu.add(remove); tree.setContextMenu(contextMenu); b.setLayoutData(new MarginData(4)); con.add(b); con.add(tree); return con; } private void loadStore(TreeStore<BaseDto> store, FolderDto root) { for (BaseDto base : root.getChildren()) { store.add(base); if (base instanceof FolderDto) { processFolder(store, (FolderDto) base); } } } private void processFolder(TreeStore<BaseDto> store, FolderDto folder) { for (BaseDto child : folder.getChildren()) { store.add(folder, child); if (child instanceof FolderDto) { processFolder(store, (FolderDto) child); } } } }