void dispatch (E event) { // if this interaction has been manually canceled, ignore further dispatch requests if (canceled) return; assert event != null; LayerUtil.screenToLayer(hitLayer, local.set(event.x, event.y), local); this.event = event; try { if (bubble) { Depth depth = Depth.BELOW; for (Layer target = hitLayer; target != null; target = target.parent()) { if (target == capturingLayer) depth = Depth.AT; else if (depth == Depth.AT) depth = Depth.ABOVE; if (captureMode != null && !captureMode.allow(depth)) continue; dispatch(target); // the above dispatch may have caused a capture, in which case capturing layer will have // just been set and we need to update our depth accordingly if (target == capturingLayer) depth = Depth.AT; } } else { dispatch(hitLayer); } } finally { this.event = null; } local.set(0, 0); }
private void notifyCancel (Layer except, CaptureMode exceptMode, E source) { E oldEvent = event; event = newCancelEvent(source); try { if (bubble) { Depth depth = Depth.BELOW; for (Layer target = hitLayer; target != null; target = target.parent()) { if (target == except) depth = Depth.AT; else if (depth == Depth.AT) depth = Depth.ABOVE; if (exceptMode != null && exceptMode.allow(depth)) continue; dispatch(target); } } else { if (hitLayer != except) dispatch(hitLayer); } } finally { this.event = oldEvent; } }