Announcement

Collapse
No announcement yet.
X
  • Filter
  • Time
Clear All
new posts

    TreeGrid setData causes onSelectionChanged event

    Hi,

    The use case:
    A tree can be recreated, sometimes with new data, sometimes with other data. Whenever this happens, it seems the TreeGrid is giving me 'unselect' events on the current data's selected records.
    I don't expect those events, since I just try to overwrite the data.
    Am I creating the new data wrong? Is there a better way to discard the previous data to not receive the 'unselect state' events when data is overwritten?

    Illustration:
    Code:
    private static final String fieldName1 = "id";
    private static final String fieldName2 = "name";
    private static final String parentField = "parent";
    
    public Canvas getViewPanel() {
    	
    	final HTMLPane logger = new HTMLPane();
    	logger.setContents("");
    	logger.setWidth(300);
    	logger.setHeight(300);
    	
    	final TreeGrid grid = new TreeGrid();
    	grid.setWidth(300);
    	grid.setHeight(300);
    	grid.setShowPartialSelection(true);
    	grid.setCascadeSelection(true);
    	grid.setSelectionAppearance(SelectionAppearance.CHECKBOX);
    	grid.setShowSelectedStyle(false);
    	
    	ListGridField field1 = new ListGridField(fieldName1);
    	ListGridField field2 = new ListGridField(fieldName2);
    	ListGridField field3 = new ListGridField(parentField);
    	grid.setFields(field2, field1, field3);
    	
    	
    	
    	IButton addData = new IButton("Recreate tree");
    	addData.addClickHandler(new ClickHandler() {
    		
    		public void onClick(ClickEvent event) {
    			logger.setContents(logger.getContents()+ "recreating tree<br/>");
    			
    			TreeNode rootNode = new TreeNode();
    			int rootNodeID = 0;
    			rootNode.setAttribute(fieldName1, rootNodeID);
    			rootNode.setAttribute(fieldName2, "root");
    
    			TreeNode [] records = new TreeNode[5];
    			for (int i=0; i<records.length; i++) {
    				records[i] = new TreeNode();
    				records[i].setAttribute(fieldName1, (i+1));
    				records[i].setAttribute(fieldName2, "oho" + (i+1));
    				records[i].setAttribute(parentField, i);
    			}
    			
    			Tree dataTree = new Tree();
    			dataTree.setModelType(TreeModelType.PARENT);
    			dataTree.setIdField(fieldName1);
    			dataTree.setParentIdField(parentField);
    			dataTree.setNameProperty(fieldName2);
    			dataTree.setAutoOpenRoot(true);
    			dataTree.setReportCollisions(false);
    			dataTree.setShowRoot(false);
    			dataTree.setAutoOpenRoot(true);
    			dataTree.setRoot(rootNode);
    			dataTree.setData(records);
    			grid.setData(dataTree);
    		}
    	});
    	
    	grid.addSelectionChangedHandler(new SelectionChangedHandler() {
    		
    		public void onSelectionChanged(SelectionEvent event) {
    			String logLine = "";
    			
    			Record r = event.getRecord();
    			
    			if (event.getState()) {
    				logLine = "selected " + r.getAttribute(fieldName1)+"<br/>";
    			} else {
    				logLine = "unselected " + r.getAttribute(fieldName1)+"<br/>";
    			}
    			
    			logger.setContents(logger.getContents() + logLine);
    		}
    	});
    	
    	
    	VLayout layout = new VLayout();
    	layout.setWidth100();
    	layout.setMembers(grid, addData, logger);
    	return layout;
    }
    1) click Recreate Tree
    2) open the folders and click one
    => the cascading comes in action and throws onChangedEvents (OK)
    3) click Recreate Tree again
    => I receive onChangedEvents for the unselected state (OK?)



    thanks,


    using SNAPSHOT_v8.3d_2012-08-31/Pro Deployment (built 2012-08-31)

    #2
    These events are accurate (a node is indeed becoming unelected) and would often be useful for cleanup. If they aren't useful for you and cause some kind of undesired effect, it's easy to set a flag to ignore these before you call setData(), then clear the flag afterward.

    Comment

    Working...
    X