Ok.... here a very simple complete example of my try to add/remove
nodes in a celltree.
Sadly it doesn't work very well. Please try my example and maybe now
somebody can give me a hint how to solve this problem.



import java.util.ArrayList;
import com.google.gwt.cell.client.AbstractCell;
import com.google.gwt.core.client.EntryPoint;
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.event.dom.client.ClickHandler;
import com.google.gwt.safehtml.shared.SafeHtmlBuilder;
import com.google.gwt.user.cellview.client.CellTree;
import com.google.gwt.user.client.ui.AbsolutePanel;
import com.google.gwt.user.client.ui.Button;
import com.google.gwt.user.client.ui.RootPanel;
import com.google.gwt.view.client.ListDataProvider;
import com.google.gwt.view.client.SingleSelectionModel;
import com.google.gwt.view.client.TreeViewModel;

public class MyCelltreeTest implements EntryPoint {
        private AbsolutePanel absolutePanel;
        private CellTree cellTree;
        private Button btnAdd;
        private Button btnRemove;
        private MyTreeModel myTreeModel;
        private SingleSelectionModel<MyNode> selectionModelCellTree = null;

        public void onModuleLoad() {
                RootPanel rootPanel = RootPanel.get();
                rootPanel.add(getAbsolutePanel(), 0, 0);
        }

        private AbsolutePanel getAbsolutePanel() {
                if (absolutePanel == null) {
                        absolutePanel = new AbsolutePanel();
                        absolutePanel.setSize("612px", "482px");
                        absolutePanel.add(getCellTree(), 0, 0);
                        absolutePanel.add(getBtnAdd(), 265, 428);
                        absolutePanel.add(getBtnRemove(), 336, 428);
                }
                return absolutePanel;
        }
        private CellTree getCellTree() {
                if (cellTree == null) {
                        myTreeModel = new MyTreeModel();
                        cellTree = new CellTree(myTreeModel, null);
                        cellTree.setSize("285px", "401px");
                }
                return cellTree;
        }
        private Button getBtnAdd() {
                if (btnAdd == null) {
                        btnAdd = new Button("Add");
                        btnAdd.addClickHandler(new ClickHandler() {
                                public void onClick(ClickEvent event) {

                                        MyNode node = 
selectionModelCellTree.getSelectedObject();
                                        if(node != null)
                                                myTreeModel.addNew(node, "Bla");
                                }
                        });
                }
                return btnAdd;
        }
        private Button getBtnRemove() {
                if (btnRemove == null) {
                        btnRemove = new Button("Remove");
                        btnRemove.addClickHandler(new ClickHandler() {
                                public void onClick(ClickEvent event) {

                                        MyNode node = 
selectionModelCellTree.getSelectedObject();
                                        if(node != null)
                                                myTreeModel.remove(node);
                                }
                        });
                }
                return btnRemove;
        }


        public class MyNode {

            private String name;
            private ArrayList<MyNode> childs; //nodes childrens
            private MyNode parent; //track internal parent
            private MyCell cell; //for refresh - reference to visual
component

            public MyNode(String name) {
                super();
                parent = null;
                this.name = name;
                childs = new ArrayList<MyNode>();
            }

            public void addSubMenu(MyNode m) {
                m.parent = this;
                childs.add(m);
            }

            public void removeMenu(MyNode m) {

                    m.getParent().childs.remove(m);
                }
            public boolean hasChildrens() {
                return childs.size()>0;
            }
            public ArrayList<MyNode> getList() {
                return childs;
            }
            public MyNode getParent() {
                return parent;
            }
            public void setCell(MyCell cell) {
                this.cell = cell;
            }
            public void refresh() {
              if(parent!=null) {
                  parent.refresh();
              }
              if (cell!=null) {
                  cell.refresh(); //refresh tree
              }
            }
            public String getName() {
                return name;
            }
            public void setName(String name) {
                this.name = name;
            }
        }

        public class MyTreeModel implements TreeViewModel {
            private MyNode officialRoot; //default not dynamic
            private MyNode studentRoot; //default not dynamic
            private MyNode testRoot; //default not dynamic
            private MyNode root;

            public MyNode getRoot() { // to set CellTree root
                return root;
            }

            public MyTreeModel() {
                selectionModelCellTree = new SingleSelectionModel<MyNode>();
                root = new MyNode("root");
                // Default items
                officialRoot = new MyNode("Cat"); //some basic static data
                studentRoot = new MyNode("Dog");
                testRoot = new MyNode("Fish");
                root.addSubMenu(officialRoot);
                root.addSubMenu(studentRoot);
                root.addSubMenu(testRoot);
            }

            //example of add add logic
            public void addNew(MyNode myparent, String name) {
                myparent.addSubMenu(new MyNode(name));
                myparent.refresh(); //HERE refresh tree
            }
            public void remove(MyNode objToRemove) {

                objToRemove.removeMenu(objToRemove);
                objToRemove.refresh();
            }

            @Override
            public <T> NodeInfo<?> getNodeInfo(T value) {
                ListDataProvider<MyNode> dataProvider;
                MyNode myValue = null;
                if (value == null) { // root is not set
                    dataProvider = new
ListDataProvider<MyNode>(root.getList());
                } else {
                    myValue = (MyNode) value;
                    dataProvider = new
ListDataProvider<MyNode>(myValue.getList());
                }
                MyCell cell = new MyCell(dataProvider); //HERE Add reference
                if (myValue != null)
                    myValue.setCell(cell);
                return new DefaultNodeInfo<MyNode>(dataProvider, cell,
selectionModelCellTree, null);
            }

            @Override
            public boolean isLeaf(Object value) {
                if (value instanceof MyNode) {
                    MyNode t = (MyNode) value;
                    if (!t.hasChildrens())
                        return true;
                    return false;
                }
                return false;
            }

        }

        public class MyCell extends AbstractCell<MyNode> {
                ListDataProvider<MyNode> dataProvider; //for refresh
                public MyCell(ListDataProvider<MyNode> dataProvider) {
                  super();
                  this.dataProvider = dataProvider;
                }
                public void refresh() {
                    dataProvider.refresh();
                }

                @Override
                public void render(Context context, MyNode value,
SafeHtmlBuilder sb) {
                  if (value == null) {
                    return;
                  }
                  sb.appendEscaped(value.getName());
                }
        }
}

-- 
You received this message because you are subscribed to the Google Groups 
"Google Web Toolkit" group.
To post to this group, send email to google-web-toolkit@googlegroups.com.
To unsubscribe from this group, send email to 
google-web-toolkit+unsubscr...@googlegroups.com.
For more options, visit this group at 
http://groups.google.com/group/google-web-toolkit?hl=en.

Reply via email to