Sunday, April 8, 2012

Smart Gwt TreeGrid filter Example ..



import java.util.ArrayList;
import java.util.List;

import com.smartgwt.client.widgets.grid.events.FilterEditorSubmitEvent;
import com.smartgwt.client.widgets.grid.events.FilterEditorSubmitHandler;
import com.smartgwt.client.widgets.tree.Tree;
import com.smartgwt.client.widgets.tree.TreeGrid;
import com.smartgwt.client.widgets.tree.TreeGridField;
import com.smartgwt.client.widgets.tree.TreeNode;

public class TreeGridExperiment extends TreeGrid{
    private Tree tree;
    private TreeNodeRecord[] records;
   
    public TreeGridExperiment() {
        tree = new Tree();
        updateData();
        setShowFilterEditor(true);
        setFilterOnKeypress(false);

        enableFiltering();
        TreeGridField field = new TreeGridField(TreeNodeRecord.NODE_NAME);
        field.setCanFilter(true);
        setFields(field);
    }
   
    private void enableFiltering() {
        addFilterEditorSubmitHandler(new FilterEditorSubmitHandler() {
            @Override
            public void onFilterEditorSubmit(FilterEditorSubmitEvent event) {
                String inputValue = event.getCriteria().getAttribute(TreeNodeRecord.NODE_NAME);
                if(inputValue == null){
                    setData(tree);
                    return;
                }
                setData(new Tree());
                List matchingNodes = new ArrayList();
                for (TreeNodeRecord record : records) {
                    if(record.contains(inputValue.toLowerCase(), tree)){
                        matchingNodes.add(record);
                    }
                }
                Tree newTree = new Tree();
                newTree.setData(matchingNodes.toArray(new TreeNodeRecord[0]));
                setData(newTree);
                for (TreeNodeRecord treeNodeRecord : matchingNodes) {
                    newTree.openAll(treeNodeRecord);
                }
            }
        });
    }

    public void updateData() {
        records = new TreeNodeRecord[2];

        for (int i = 0; i < 2; i++) {
            records[i] = new TreeNodeRecord("Display " + i);
            TreeNodeRecord[] leafs = new TreeNodeRecord[2];
            for (int j = 0; j < 1; j++) {
                leafs[j] = new TreeNodeRecord("Leaf" + j+i);
            }
            records[i].setChildren(leafs);
        }
        tree.setData(records);
        this.setData(tree);
    }
}

class TreeNodeRecord extends TreeNode {
    public static String NODE_NAME = "nodeName";
   
    public TreeNodeRecord(String attribute) {
        setAttribute(NODE_NAME, attribute);
    }

    public boolean contains(String inputValue, Tree tree) {
        if(getAttributeAsString(NODE_NAME).toLowerCase().contains(inputValue)) {
            return true;
        } else {
            TreeNode[] childes = tree.getChildren(this);
            for (TreeNode treeNode : childes) {
                TreeNodeRecord record = (TreeNodeRecord)treeNode;
                if(record.contains(inputValue, tree)){
                    return true;
                }
            }
        }
        return false;
    }
}

    

4 comments:

  1. Thank you, you help me very much!

    ReplyDelete
  2. That helped me... one note though: you can reduce the complexity of the filtering routine populating matchingNodes directly from the contains (recursive) method invoked on the tree root, hence doing exactly one visit on the entire tree.

    ReplyDelete
  3. This solution is awesome thanks Ranjeet

    ReplyDelete

Search Ranjeet's Blog