/* * 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.view.client; import com.google.gwt.cell.client.Cell; import com.google.gwt.cell.client.ValueUpdater; import com.google.gwt.event.shared.HandlerRegistration; /** * A model of a tree. */ public interface TreeViewModel { /** * Default implementation of {@link NodeInfo}. */ class DefaultNodeInfo<T> implements NodeInfo<T> { private final Cell<T> cell; private final AbstractDataProvider<T> dataProvider; private final CellPreviewEvent.Handler<T> selectionEventManager; private HandlerRegistration selectionEventManagerReg; private final SelectionModel<? super T> selectionModel; private final ValueUpdater<T> valueUpdater; private HasData<T> display; /** * Construct a new {@link DefaultNodeInfo}. * * @param dataProvider the {@link AbstractDataProvider} that provides the * child values * @param cell the {@link Cell} used to render the child values */ public DefaultNodeInfo(AbstractDataProvider<T> dataProvider, Cell<T> cell) { this(dataProvider, cell, null, null); } /** * Construct a new {@link DefaultNodeInfo}. * * @param dataProvider the {@link AbstractDataProvider} that provides the * child values * @param cell the {@link Cell} used to render the child values update when * the selection changes * @param selectionModel the {@link SelectionModel} used for selection * @param valueUpdater the {@link ValueUpdater} */ public DefaultNodeInfo(AbstractDataProvider<T> dataProvider, final Cell<T> cell, SelectionModel<? super T> selectionModel, final ValueUpdater<T> valueUpdater) { this(dataProvider, cell, selectionModel, DefaultSelectionEventManager.<T> createDefaultManager(), valueUpdater); } /** * Construct a new {@link DefaultNodeInfo}. * * @param dataProvider the {@link AbstractDataProvider} that provides the * child values * @param cell the {@link Cell} used to render the child values update when * the selection changes * @param selectionModel the {@link SelectionModel} used for selection * @param selectionEventManager the {@link CellPreviewEvent.Handler} that * handles user selection interaction * @param valueUpdater the {@link ValueUpdater} */ public DefaultNodeInfo(AbstractDataProvider<T> dataProvider, final Cell<T> cell, SelectionModel<? super T> selectionModel, CellPreviewEvent.Handler<T> selectionEventManager, final ValueUpdater<T> valueUpdater) { this.dataProvider = dataProvider; this.cell = cell; this.selectionModel = selectionModel; this.valueUpdater = valueUpdater; this.selectionEventManager = selectionEventManager; } public Cell<T> getCell() { return cell; } public ProvidesKey<T> getProvidesKey() { return dataProvider; } public SelectionModel<? super T> getSelectionModel() { return selectionModel; } public ValueUpdater<T> getValueUpdater() { return valueUpdater; } public void setDataDisplay(HasData<T> display) { this.display = display; if (selectionEventManager != null) { selectionEventManagerReg = display.addCellPreviewHandler(selectionEventManager); } dataProvider.addDataDisplay(display); } public void unsetDataDisplay() { if (display != null) { dataProvider.removeDataDisplay(display); if (selectionEventManagerReg != null) { selectionEventManagerReg.removeHandler(); selectionEventManagerReg = null; } display = null; } } } /** * The info needed to create the children of a tree node. */ interface NodeInfo<T> { /** * Get the {@link Cell} used to render the children of this node. * * @return the {@link Cell} */ Cell<T> getCell(); /** * Return the key provider for children of this node. * * @return the {@link ProvidesKey} */ ProvidesKey<T> getProvidesKey(); /** * Get the {@link SelectionModel} used for the children of this node. To * unify selection across all items of the same type, or across the entire * tree, return the same instance of {@link SelectionModel} from all * {@link NodeInfo}. * * @return the {@link SelectionModel} */ SelectionModel<? super T> getSelectionModel(); /** * Get the value updater associated with the cell. * * @return the value updater */ ValueUpdater<T> getValueUpdater(); /** * Set the display that is listening to this {@link NodeInfo}. The * implementation should attach the display to the source of data. * * @param display the {@link HasData} */ void setDataDisplay(HasData<T> display); /** * Unset the display from the {@link NodeInfo}. The implementation should * detach the display from the source of data. */ void unsetDataDisplay(); } /** * Get the {@link NodeInfo} that will provide the {@link ProvidesKey}, * {@link Cell}, and {@link HasData} instances to retrieve and display the * children of the specified value. * * @param value the value in the parent node * @return the {@link NodeInfo} */ <T> NodeInfo<?> getNodeInfo(T value); /** * Check if the value is known to be a leaf node. * * @param value the value at the node * * @return true if the node is known to be a leaf node, false otherwise */ boolean isLeaf(Object value); }