diff --git a/packages/markers/src/browser/marker-tree-model.ts b/packages/markers/src/browser/marker-tree-model.ts index 2c1a27e213966..0b1197f334860 100644 --- a/packages/markers/src/browser/marker-tree-model.ts +++ b/packages/markers/src/browser/marker-tree-model.ts @@ -34,4 +34,14 @@ export class MarkerTreeModel extends TreeModelImpl { protected getOpenerOptionsByMarker(node: MarkerNode): OpenerOptions | undefined { return undefined; } + + /** + * Reveal the corresponding node at the marker. + * @param node {TreeNode} the tree node. + */ + revealNode(node: TreeNode): void { + if (MarkerNode.is(node)) { + open(this.openerService, node.uri, { ...this.getOpenerOptionsByMarker(node), mode: 'reveal' }); + } + } } diff --git a/packages/markers/src/browser/problem/problem-widget.tsx b/packages/markers/src/browser/problem/problem-widget.tsx index 4801bc962e74b..793eff0616163 100644 --- a/packages/markers/src/browser/problem/problem-widget.tsx +++ b/packages/markers/src/browser/problem/problem-widget.tsx @@ -61,6 +61,14 @@ export class ProblemWidget extends TreeWidget { return; } + protected handleClickEvent(node: TreeNode | undefined, event: React.MouseEvent): void { + if (MarkerNode.is(node)) { + this.model.revealNode(node); + } else { + super.handleClickEvent(node, event); + } + } + protected handleCopy(event: ClipboardEvent) { const uris = this.model.selectedNodes.filter(MarkerNode.is).map(node => node.uri.toString()); if (uris.length > 0 && event.clipboardData) { @@ -69,6 +77,26 @@ export class ProblemWidget extends TreeWidget { } } + protected handleDown(event: KeyboardEvent): void { + const node = this.model.getNextSelectableNode(); + if (MarkerNode.is(node)) { + super.handleDown(event); + this.model.revealNode(node); + } else { + super.handleDown(event); + } + } + + protected handleUp(event: KeyboardEvent): void { + const node = this.model.getPrevSelectableNode(); + if (MarkerNode.is(node)) { + super.handleUp(event); + this.model.revealNode(node); + } else { + super.handleUp(event); + } + } + protected renderTree(model: TreeModel): React.ReactNode { if (MarkerRootNode.is(model.root) && model.root.children.length > 0) { return super.renderTree(model);