Question

I am implementing a directory structure like Windows Explorer. I want to re-render a specific node of tree after any folder operations is done such as add folder, remove folder... etc

private ListDataProvider<Object> dataProvider= new ListDataProvider<Object>();

private Object current;//store object of currentNode;

private Map<Object, ListDataProvider<Object>> keyprovider =
    new HashMap<Object,ListDataProvider<Object>>();

private CellTree tree;

// keeps a map for storing dataproviders in each hierarchy , 

public void setListToCurrentNode(List<Object> newList){

    //adding this newlist to current data provider not reflecting to display
    keyprovider.get(currentObject).setList(newList);

}

public void onModuleLoad(){

    treeSelectionModel.addSelectionChangeHandler(new SelectionChangeEvent.Handler() {

        public void onSelectionChange(SelectionChangeEvent event) {

            //setting current object as selected  node
            current = treeSelectionModel.getSelectedObject();

        }
    });

}
Was it helpful?

Solution 2

Solved by Changing Listdataprovider into AsyncDataProvider ,Implementation is below

private final class DataProvider extends AsyncDataProvider<Object> {

    private Object value;
            private List Objs;

    DataProvider(Object value) {
        this.value = value;
    }


    public void update(List objs) {//Call update when you wanted to refresh tree
                   this.objs=objs;
        for (HasData<Object> disp : getDataDisplays()) {
            this.onRangeChanged(disp);
            break;
        }
    }

    @Override
    protected void onRangeChanged(final HasData<Object> display) {

                                    updateRowData(0, objs);
                updateRowCount(objs.size(), true);

           }

OTHER TIPS

Data providers force to re-render corresponding DOM. Code below demonstrates how it works. This example generates 2-leveled tree, where you can refresh (re-generate) leaf nodes by pressing Enter key on selected root node.

I tried to keep code as simple as possible, all needed stuff contained right here.

public class TestEntryPoint implements EntryPoint {

    private static final Logger LOG = Logger.getLogger(TestEntryPoint.class.getName());

    class Item {

        String name;
        boolean leaf;

        public Item(String name, boolean leaf) {
            this.name = name;
            this.leaf = leaf;
        }

        @Override
        public String toString() {
            return "Item {name=" + name + ", leaf=" + leaf + "}";
        }
    }

    class ItemCell extends AbstractCell<Item> {

        public ItemCell() {
            super("keydown");
        }

        @Override
        public void render(Context context, Item value, SafeHtmlBuilder sb) {
            if (value != null) sb.appendEscaped(value.name);
        }

        @Override
        protected void onEnterKeyDown(
                Context context, Element parent, Item value, NativeEvent event, ValueUpdater<Item> valueUpdater) {
            LOG.info("ItemCell.onEnterKeyDown: value=" + value);
            if (value == null || value.leaf) return;
            ListDataProvider<Item> leafDataProvider = leafDataProviders.get(value.name);
            if (leafDataProvider == null) return;
            // -->> Here we generate new childs of selected root node  
            leafDataProvider.setList(generateLeafs());
        }
    }

    class ItemTreeViewModel implements TreeViewModel {

        @Override
        public <T> NodeInfo<?> getNodeInfo(T value) {
            return new DefaultNodeInfo<Item>(
                value == null ? rootDataProvider : leafDataProviders.get(((Item) value).name),
                new ItemCell());
        }

        @Override
        public boolean isLeaf(Object value) {
            return (value instanceof Item) && ((Item) value).leaf;
        }
    }

    private int id = 0;
    private CellTree cellTree;
    private ListDataProvider<Item> rootDataProvider;
    private Map<String, ListDataProvider<Item>> leafDataProviders = new HashMap<String, ListDataProvider<Item>>();

    private List<Item> generateLeafs() {
        List<Item> leafList = new ArrayList<Item>(5);
        for (int j = 0; j < 5; ++j)
            leafList.add(new Item("Leaf Item " + (++id), true));
        return leafList;
    }

    public void onModuleLoad() {
        List<Item> rootList = new ArrayList<Item>(10);
        for (int i = 0; i < 10; ++i) {
            Item rootItem = new Item("Root Item " + (++id), false);
            rootList.add(rootItem);
            leafDataProviders.put(rootItem.name, new ListDataProvider<Item>(generateLeafs()));
        }
        rootDataProvider = new ListDataProvider<Item>(rootList);

        cellTree = new CellTree(new ItemTreeViewModel(), null);
        cellTree.setAnimationEnabled(true);
        RootLayoutPanel.get().add(cellTree);
    }
}
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top