Change:
Testing Not sure if this lack of functionality blocks anything truly useful, but at least in the treeview, you can multi-select problems and copy them to the clipboard. In the table view you can't.
This also has the side effect of losing a multi-select that you may have had in the treeview.
what was the thinking for enabling multi-select in the problems treeview? Was there a particular scenario or this is what the default behaviour is for a treeview? If there is a real scenario, than we should enable multi-select in the table as well.
You can copy multiple problems is the primary use case.
that makes sense. Thanks!

Discussion:
getFocus(): (MarkerTableItem | null)[] { const focus = this.table.getFocus(); <del> return focus.length > 0 ? [this.table.row(focus[0])] : []; </del> <ins> return focus.length > 0 ? [...focus.map(f => this.table.row(f))] : []; </ins> } getHTMLElement(): HTMLElement {

getSelection(): (MarkerTableItem | null)[] { const selection = this.table.getSelection(); <del> return selection.length > 0 ? [this.table.row(selection[0])] : []; </del> <ins> return selection.length > 0 ? [...selection.map(i => this.table.row(i))] : []; </ins> } getVisibleItemCount(): number {

this.table.domNode.ariaLabel = label; } <del> setMarkerSelection(marker?: Marker): void { </del> <ins> setMarkerSelection(selection?: Marker[], focus?: Marker[]): void { </ins> if (this.isVisible()) { <del> if (marker) { const index = this.findMarkerIndex(marker); if (index !== -1) { this.table.setFocus([index]); this.table.setSelection([index]); </del> <ins> if (selection && selection.length > 0) { this.table.setSelection(selection.map(m => this.findMarkerIndex(m))); if (focus && focus.length > 0) { this.table.setFocus(focus.map(f => this.findMarkerIndex(f))); } else { this.table.setFocus([this.findMarkerIndex(selection[0])]); </ins> } } else if (this.getSelection().length === 0 && this.getVisibleItemCount() > 0) { this.table.setFocus([0]);

reset(resourceMarkers: ResourceMarkers[]): void; revealMarkers(activeResource: ResourceMarkers | null, focus: boolean, lastSelectedRelativeTop: number): void; setAriaLabel(label: string): void; <del> setMarkerSelection(marker?: Marker): void; </del> <ins> setMarkerSelection(selection?: Marker[], focus?: Marker[]): void; </ins> toggleVisibility(hide: boolean): void; update(resourceMarkers: ResourceMarkers[]): void; updateMarker(marker: Marker): void;

accessibilityProvider: this.widgetAccessibilityProvider, horizontalScrolling: false, identityProvider: this.widgetIdentityProvider, <del> multipleSelectionSupport: false, </del> <ins> multipleSelectionSupport: true, </ins> selectionNavigation: true }, );

} // Save selection <del> const selection = this.widget?.getSelection(); </del> <ins> const selection = new Set<Marker>(); for (const marker of this.widget.getSelection()) { if (marker instanceof ResourceMarkers) { marker.markers.forEach(m => selection.add(m)); } else if (marker instanceof Marker || marker instanceof MarkerTableItem) { selection.add(marker); } } // Save focus const focus = new Set<Marker>(); for (const marker of this.widget.getFocus()) { if (marker instanceof Marker || marker instanceof MarkerTableItem) { focus.add(marker); } } </ins> // Create new widget this.createWidget(this.widgetContainer); this.refreshPanel(); // Restore selection <del> if (selection && selection.length > 0 && (selection[0] instanceof Marker || selection[0] instanceof MarkerTableItem)) { </del> <ins> if (selection.size > 0) { this.widget.setMarkerSelection(Array.from(selection), Array.from(focus)); </ins> this.widget.domFocus(); <del> this.widget.setMarkerSelection(selection[0]); </del> } }

this.ariaLabel = label; } <del> setMarkerSelection(marker: Marker): void { </del> <ins> setMarkerSelection(selection?: Marker[], focus?: Marker[]): void { </ins> if (this.isVisible()) { <del> if (marker) { const markerNode = this.findMarkerNode(marker); </del> <ins> if (selection && selection.length > 0) { this.setSelection(selection.map(m => this.findMarkerNode(m))); </ins> <del> if (markerNode) { this.setFocus([markerNode]); this.setSelection([markerNode]); </del> <ins> if (focus && focus.length > 0) { this.setFocus(focus.map(f => this.findMarkerNode(f))); } else { this.setFocus([this.findMarkerNode(selection[0])]); </ins> } } else if (this.getSelection().length === 0) { const firstVisibleElement = this.firstVisibleElement;

} } <del> return undefined; </del> <ins> return null; </ins> } private hasSelectedMarkerFor(resource: ResourceMarkers): boolean {