-
Notifications
You must be signed in to change notification settings - Fork 2.6k
/
Copy pathpreference-tree-label-provider.ts
72 lines (64 loc) · 3.12 KB
/
preference-tree-label-provider.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
// *****************************************************************************
// Copyright (C) 2021 Ericsson and others.
//
// This program and the accompanying materials are made available under the
// terms of the Eclipse Public License v. 2.0 which is available at
// http://www.eclipse.org/legal/epl-2.0.
//
// This Source Code may also be made available under the following Secondary
// Licenses when the conditions for such availability set forth in the Eclipse
// Public License v. 2.0 are satisfied: GNU General Public License, version 2
// with the GNU Classpath Exception which is available at
// https://www.gnu.org/software/classpath/license.html.
//
// SPDX-License-Identifier: EPL-2.0 OR GPL-2.0-only WITH Classpath-exception-2.0
// *****************************************************************************
import { inject, injectable } from '@theia/core/shared/inversify';
import { LabelProviderContribution, TreeNode } from '@theia/core/lib/browser';
import { Preference } from './preference-types';
import { PreferenceLayoutProvider } from './preference-layout';
@injectable()
export class PreferenceTreeLabelProvider implements LabelProviderContribution {
@inject(PreferenceLayoutProvider)
protected readonly layoutProvider: PreferenceLayoutProvider;
canHandle(element: object): number {
return TreeNode.is(element) && Preference.TreeNode.is(element) ? 150 : 0;
}
getName(node: Preference.TreeNode): string {
if (Preference.TreeNode.is(node) && node.label) {
return node.label;
}
const { id } = Preference.TreeNode.getGroupAndIdFromNodeId(node.id);
const labels = id.split('.');
const groupName = labels[labels.length - 1];
return this.formatString(groupName);
}
getPrefix(node: Preference.TreeNode, fullPath = false): string | undefined {
const { depth } = node;
const { id, group } = Preference.TreeNode.getGroupAndIdFromNodeId(node.id);
const segments = id.split('.');
const segmentsHandled = group === segments[0] ? depth : depth - 1;
segments.pop(); // Ignore the leaf name.
const prefixSegments = fullPath ? segments : segments.slice(segmentsHandled);
if (prefixSegments.length) {
let output = prefixSegments.length > 1 ? `${this.formatString(prefixSegments[0])} › ` : `${this.formatString(prefixSegments[0])}: `;
for (const segment of prefixSegments.slice(1)) {
output += `${this.formatString(segment)}: `;
}
return output;
}
}
protected formatString(string: string): string {
let formattedString = string[0].toLocaleUpperCase();
for (let i = 1; i < string.length; i++) {
if (this.isUpperCase(string[i]) && !/\s/.test(string[i - 1]) && !this.isUpperCase(string[i - 1])) {
formattedString += ' ';
}
formattedString += string[i];
}
return formattedString.trim();
}
protected isUpperCase(char: string): boolean {
return char === char.toLocaleUpperCase() && char.toLocaleLowerCase() !== char.toLocaleUpperCase();
}
}