@theia/plugin-ext 1.34.0 → 1.34.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -34,7 +34,6 @@ import { URI } from '@theia/core/shared/vscode-uri';
34
34
  import { UriComponents } from '@theia/core/lib/common/uri';
35
35
 
36
36
  export class TreeViewsExtImpl implements TreeViewsExt {
37
-
38
37
  private proxy: TreeViewsMain;
39
38
 
40
39
  private readonly treeViews = new Map<string, TreeViewExtImpl<any>>();
@@ -45,9 +44,9 @@ export class TreeViewsExtImpl implements TreeViewsExt {
45
44
  commandRegistry.registerArgumentProcessor({
46
45
  processArgument: arg => {
47
46
  if (TreeViewItemReference.is(arg)) {
48
- return this.toTreeItem(arg);
47
+ return this.toTreeElement(arg);
49
48
  } else if (Array.isArray(arg)) {
50
- return arg.map(param => TreeViewItemReference.is(param) ? this.toTreeItem(param) : param);
49
+ return arg.map(param => TreeViewItemReference.is(param) ? this.toTreeElement(param) : param);
51
50
  } else {
52
51
  return arg;
53
52
  }
@@ -62,8 +61,8 @@ export class TreeViewsExtImpl implements TreeViewsExt {
62
61
  return this.getTreeView(treeViewId).handleDrop!(treeItemId, dataTransferItems, token);
63
62
  }
64
63
 
65
- protected toTreeItem(treeViewItemRef: TreeViewItemReference): any {
66
- return this.treeViews.get(treeViewItemRef.viewId)?.getTreeItem(treeViewItemRef.itemId);
64
+ protected toTreeElement(treeViewItemRef: TreeViewItemReference): any {
65
+ return this.treeViews.get(treeViewItemRef.viewId)?.getElement(treeViewItemRef.itemId);
67
66
  }
68
67
 
69
68
  registerTreeDataProvider<T>(plugin: Plugin, treeViewId: string, treeDataProvider: TreeDataProvider<T>): PluginDisposable {
@@ -186,6 +185,10 @@ interface TreeExtNode<T> extends Disposable {
186
185
  }
187
186
 
188
187
  class TreeViewExtImpl<T> implements Disposable {
188
+ private static readonly ID_COMPUTED = 'c';
189
+ private static readonly ID_ITEM = 'i';
190
+
191
+ private nextItemId: 0;
189
192
 
190
193
  private readonly onDidExpandElementEmitter = new Emitter<TreeViewExpansionEvent<T>>();
191
194
  readonly onDidExpandElement = this.onDidExpandElementEmitter.event;
@@ -274,7 +277,7 @@ class TreeViewExtImpl<T> implements Disposable {
274
277
  this.proxy.$setDescription(this.treeViewId, this._description);
275
278
  }
276
279
 
277
- getTreeItem(treeItemId: string): T | undefined {
280
+ getElement(treeItemId: string): T | undefined {
278
281
  return this.nodes.get(treeItemId)?.value;
279
282
  }
280
283
 
@@ -312,14 +315,9 @@ class TreeViewExtImpl<T> implements Disposable {
312
315
  // parent is inconsistent
313
316
  return undefined;
314
317
  }
315
- const idLabel = this.getTreeItemIdLabel(treeItem);
316
- let possibleIndex = children.length;
317
- // find the right element id by searching all possible id names in the cache
318
- while (possibleIndex-- > 0) {
319
- const candidateId = this.buildTreeItemId(parentId, possibleIndex, idLabel);
320
- if (this.nodes.has(candidateId)) {
321
- return chain.concat(candidateId);
322
- }
318
+ const candidateId = this.buildTreeItemId(parentId, treeItem);
319
+ if (this.nodes.has(candidateId)) {
320
+ return chain.concat(candidateId);
323
321
  }
324
322
  // couldn't calculate consistent parent chain and id
325
323
  return undefined;
@@ -335,7 +333,7 @@ class TreeViewExtImpl<T> implements Disposable {
335
333
  return typeof treeItemLabel === 'object' ? treeItemLabel.highlights : undefined;
336
334
  }
337
335
 
338
- private getTreeItemIdLabel(treeItem: TreeItem): string | undefined {
336
+ private getItemLabel(treeItem: TreeItem): string | undefined {
339
337
  let idLabel = this.getTreeItemLabel(treeItem);
340
338
  // Use resource URI if label is not set
341
339
  if (idLabel === undefined && treeItem.resourceUri) {
@@ -348,8 +346,18 @@ class TreeViewExtImpl<T> implements Disposable {
348
346
  return idLabel;
349
347
  }
350
348
 
351
- private buildTreeItemId(parentId: string, index: number, idLabel: string | undefined): string {
352
- return `${parentId}/${index}:${idLabel}`;
349
+ private buildTreeItemId(parentId: string, item: TreeItem): string {
350
+ // build tree id according to https://code.visualstudio.com/api/references/vscode-api#TreeItem
351
+ // note: the front end tree implementation cannot handle reparenting items, hence the id is set to the "path" of individual ids
352
+ let id = typeof item.id === 'string' ? item.id : this.getItemLabel(item);
353
+ if (id) {
354
+ // we use '' as the id of the root, we don't consider that a valid id
355
+ // since '' is falsy, we'll never get '' in this branch
356
+ id = TreeViewExtImpl.ID_ITEM + id;
357
+ } else {
358
+ id = TreeViewExtImpl.ID_COMPUTED + this.nextItemId++;
359
+ }
360
+ return `${parentId}/${id}`;
353
361
  }
354
362
 
355
363
  async getChildren(parentId: string): Promise<TreeViewItem[] | undefined> {
@@ -369,20 +377,19 @@ class TreeViewExtImpl<T> implements Disposable {
369
377
  // ask data provider for children for cached element
370
378
  const result = await this.options.treeDataProvider.getChildren(parent);
371
379
  if (result) {
372
- const treeItemPromises = result.map(async (value, index) => {
380
+ const treeItemPromises = result.map(async value => {
373
381
 
374
382
  // Ask data provider for a tree item for the value
375
383
  // Data provider must return theia.TreeItem
376
384
  const treeItem = await this.options.treeDataProvider.getTreeItem(value);
377
385
  // Convert theia.TreeItem to the TreeViewItem
378
386
 
379
- const label = this.getTreeItemLabel(treeItem);
387
+ const label = this.getItemLabel(treeItem);
380
388
  const highlights = this.getTreeItemLabelHighlights(treeItem);
381
- const idLabel = this.getTreeItemIdLabel(treeItem);
382
389
 
383
390
  // Generate the ID
384
391
  // ID is used for caching the element
385
- const id = treeItem.id || this.buildTreeItemId(parentId, index, idLabel);
392
+ const id = this.buildTreeItemId(parentId, treeItem);
386
393
 
387
394
  const toDisposeElement = new DisposableCollection();
388
395
  const node: TreeExtNode<T> = {
@@ -467,7 +474,7 @@ class TreeViewExtImpl<T> implements Disposable {
467
474
 
468
475
  async onExpanded(treeItemId: string): Promise<any> {
469
476
  // get element from a cache
470
- const cachedElement = this.getTreeItem(treeItemId);
477
+ const cachedElement = this.getElement(treeItemId);
471
478
 
472
479
  // fire an event
473
480
  if (cachedElement) {
@@ -479,7 +486,7 @@ class TreeViewExtImpl<T> implements Disposable {
479
486
 
480
487
  async onCollapsed(treeItemId: string): Promise<any> {
481
488
  // get element from a cache
482
- const cachedElement = this.getTreeItem(treeItemId);
489
+ const cachedElement = this.getElement(treeItemId);
483
490
 
484
491
  // fire an event
485
492
  if (cachedElement) {
@@ -513,7 +520,7 @@ class TreeViewExtImpl<T> implements Disposable {
513
520
  get selectedElements(): T[] {
514
521
  const items: T[] = [];
515
522
  for (const id of this.selectedItemIds) {
516
- const item = this.getTreeItem(id);
523
+ const item = this.getElement(id);
517
524
  if (item) {
518
525
  items.push(item);
519
526
  }
@@ -554,7 +561,7 @@ class TreeViewExtImpl<T> implements Disposable {
554
561
  async onDragStarted(treeItemIds: string[], token: CancellationToken): Promise<UriComponents[] | undefined> {
555
562
  const treeItems: T[] = [];
556
563
  for (const id of treeItemIds) {
557
- const item = this.getTreeItem(id);
564
+ const item = this.getElement(id);
558
565
  if (item) {
559
566
  treeItems.push(item);
560
567
  }
@@ -571,7 +578,7 @@ class TreeViewExtImpl<T> implements Disposable {
571
578
  }
572
579
 
573
580
  async handleDrop(treeItemId: string | undefined, dataTransferItems: [string, string | DataTransferFileDTO][], token: CancellationToken): Promise<void> {
574
- const treeItem = treeItemId ? this.getTreeItem(treeItemId) : undefined;
581
+ const treeItem = treeItemId ? this.getElement(treeItemId) : undefined;
575
582
  const dropTransfer = new DataTransfer();
576
583
  if (this.options.dragAndDropController?.handleDrop) {
577
584
  this.localDataTransfer.forEach((item, type) => {