anchor.diff:        default:
           return true;
       }
  -    
  +
       for(String nodeUID in selection) {
         if (_rowsMap.containsKey(nodeUID)) {
           setNodeExpanded(nodeUID, expand);
         }
       }
  -    
  +
       if (!expand) {
         _cleanSelection();
       }
  
positive.code:     return _delegate.treeViewDropEffect(this, event.dataTransfer, nodeUID);
    }
  
     List<String> _innerDragSelection(DataTransfer dataTransfer) {
       if (dataTransfer.types.contains('application/x-spark-treeview')) {
         // TODO(dvh): dataTransfer.getData returns empty string when
         // it's called in dragOver event handler. Then, we can't check if uuid
         // matches. We'll improve the behavior when it will be fixed.
         return selection;
       } else {
         return null;
       }
    }
  
    void listViewDrop(ListView view, int rowIndex, DataTransfer dataTransfer) {
  
negative.code:    * Sets expanded state of a node.
     */
    void setNodeExpanded(String nodeUID, bool expanded) {
      if (isNodeExpanded(nodeUID) != expanded) {
        HashSet<String> previousSelection = new HashSet.from(selection);
        _rowsMap[nodeUID].expanded = expanded;
        reloadData();
        HashSet<String> currentSelection = new HashSet.from(selection);
  
        // Testing previousSelection == currentSelection won't behaves as expected
        // then, we're testing if the set are the same using intersection.
        bool changed = false;
        if (previousSelection.length != currentSelection.length) {
          changed = true;
        }
        if (previousSelection.length != previousSelection.intersection(currentSelection).length) {
          changed = true;
        }
        if (changed) {
          _delegate.treeViewSelectedChanged(this,
              _rowIndexesToNodeUIDs(_listView.selection));
        }
  
        _delegate.treeViewSaveExpandedState(this);
      }
    }
  
    void toggleNodeExpanded(String nodeUID, {bool animated: false}) {
  