/**
   * Build internal lists buttonDrag, keyDrags, etc from BehaviourMap(?) and InputMap(?). The
   * internal lists only contain entries for Behaviours that can be actually triggered with the
   * current InputMap, grouped by Behaviour type, such that hopefully lookup from the event handlers
   * is fast.
   */
  private void updateInternalMaps() {
    buttonDrags.clear();
    keyDrags.clear();
    buttonClicks.clear();
    keyClicks.clear();

    for (final Entry<InputTrigger, Set<String>> entry : inputMap.getAllBindings().entrySet()) {
      final InputTrigger buttons = entry.getKey();
      final Set<String> behaviourKeys = entry.getValue();
      if (behaviourKeys == null) continue;

      for (final String behaviourKey : behaviourKeys) {
        final Behaviour behaviour = behaviourMap.get(behaviourKey);
        if (behaviour == null) continue;

        if (behaviour instanceof DragBehaviour) {
          final BehaviourEntry<DragBehaviour> dragEntry =
              new BehaviourEntry<>(buttons, (DragBehaviour) behaviour);
          if (buttons.isKeyStroke()) keyDrags.add(dragEntry);
          else buttonDrags.add(dragEntry);
        } else if (behaviour instanceof ClickBehaviour) {
          final BehaviourEntry<ClickBehaviour> clickEntry =
              new BehaviourEntry<>(buttons, (ClickBehaviour) behaviour);
          if (buttons.isKeyStroke()) keyClicks.add(clickEntry);
          else buttonClicks.add(clickEntry);
        } else if (behaviour instanceof ScrollBehaviour) {
          final BehaviourEntry<ScrollBehaviour> scrollEntry =
              new BehaviourEntry<>(buttons, (ScrollBehaviour) behaviour);
          scrolls.add(scrollEntry);
        }
      }
    }
  }
 public void checkAndPerformTriggers(
     final Set<InputTrigger> triggers,
     final Canvas source,
     final TwoInputStates states,
     final double tpf) {
   for (final InputTrigger trigger : triggers) {
     trigger.performIfValid(source, states, tpf);
   }
 }