private handleKeydown()

in static/shared/outline/tree.ts [386:467]


  private handleKeydown(event: KeyboardEvent) {
    if (event.altKey || event.ctrlKey || event.metaKey) {
      return;
    }

    let captured = false;
    switch (event.key) {
      case ' ':
      case 'Enter':
        if (this.isExpandable) {
          if (this.isExpanded() && this.isSelected()) {
            this.tree.collapseTreeitem(this);
          } else {
            this.tree.expandTreeitem(this);
          }
          captured = true;
        } else {
          event.stopPropagation();
        }
        this.tree.setSelected(this);
        break;

      case 'ArrowUp':
        this.tree.setFocusToPreviousItem(this);
        captured = true;
        break;

      case 'ArrowDown':
        this.tree.setFocusToNextItem(this);
        captured = true;
        break;

      case 'ArrowRight':
        if (this.isExpandable) {
          if (this.isExpanded()) {
            this.tree.setFocusToNextItem(this);
          } else {
            this.tree.expandTreeitem(this);
          }
        }
        captured = true;
        break;

      case 'ArrowLeft':
        if (this.isExpandable && this.isExpanded()) {
          this.tree.collapseTreeitem(this);
          captured = true;
        } else {
          if (this.isInGroup) {
            this.tree.setFocusToParentItem(this);
            captured = true;
          }
        }
        break;

      case 'Home':
        this.tree.setFocusToFirstItem();
        captured = true;
        break;

      case 'End':
        this.tree.setFocusToLastItem();
        captured = true;
        break;

      default:
        if (event.key.length === 1 && event.key.match(/\S/)) {
          if (event.key == '*') {
            this.tree.expandAllSiblingItems(this);
          } else {
            this.tree.setFocusByFirstCharacter(this, event.key);
          }
          captured = true;
        }
        break;
    }

    if (captured) {
      event.stopPropagation();
      event.preventDefault();
    }
  }