anchor.diff:      return _dragEvent.removeHandler(thing, handlerId);
     }
   }
  +
  +class ThingDragStartingEventArgs extends ThingMouseEventArgs implements CancelableEventArgs {
  +  bool _canceled = false;
  +
  +  ThingDragStartingEventArgs(Thing thing, MouseEvent source) :
  +    super(thing, source);
  +
  +  bool get isCanceled => _canceled;
  +
  +  void cancel() {
  +    assert(!isCanceled);
  +    _canceled = true;
  +  }
  +}
  
positive.code:     _clickEvent.fireEvent(thing, args);
    }
  
    void _doDrag(Thing thing, MouseEvent e) {
      assert(!_isDragging);
      // todo: implement cancel
      e.preventDefault();
      _dragCoordinate = new Coordinate(e.clientX, e.clientY);
    }
  
    void _windowMouseMove(MouseEvent e) {
  
negative.code:     for(final t in hits) {
        if(getDraggable(t)) {
          _draggingThing = t;
          _startDrag(_draggingThing, e);
          break;
        } else if(getClickable(t)) {
          _mouseDownThing = t;
  