@theia/plugin-ext 1.18.0-next.73c11a11 → 1.18.0-next.77
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.
- package/LICENSE +642 -0
- package/lib/common/arrays.d.ts +4 -0
- package/lib/common/arrays.d.ts.map +1 -1
- package/lib/common/arrays.js +9 -1
- package/lib/common/arrays.js.map +1 -1
- package/lib/common/plugin-api-rpc-model.d.ts +2 -0
- package/lib/common/plugin-api-rpc-model.d.ts.map +1 -1
- package/lib/common/plugin-api-rpc-model.js.map +1 -1
- package/lib/common/plugin-api-rpc.d.ts +22 -3
- package/lib/common/plugin-api-rpc.d.ts.map +1 -1
- package/lib/common/plugin-api-rpc.js +21 -1
- package/lib/common/plugin-api-rpc.js.map +1 -1
- package/lib/common/plugin-protocol.d.ts.map +1 -1
- package/lib/common/plugin-protocol.js.map +1 -1
- package/lib/hosted/browser/hosted-plugin.d.ts +3 -2
- package/lib/hosted/browser/hosted-plugin.d.ts.map +1 -1
- package/lib/hosted/browser/hosted-plugin.js +15 -7
- package/lib/hosted/browser/hosted-plugin.js.map +1 -1
- package/lib/hosted/browser/worker/debug-stub.d.ts.map +1 -1
- package/lib/hosted/browser/worker/debug-stub.js +1 -0
- package/lib/hosted/browser/worker/debug-stub.js.map +1 -1
- package/lib/hosted/node/scanners/scanner-theia.d.ts.map +1 -1
- package/lib/hosted/node/scanners/scanner-theia.js +2 -2
- package/lib/hosted/node/scanners/scanner-theia.js.map +1 -1
- package/lib/main/browser/callhierarchy/callhierarchy-type-converters.d.ts.map +1 -1
- package/lib/main/browser/callhierarchy/callhierarchy-type-converters.js +2 -1
- package/lib/main/browser/callhierarchy/callhierarchy-type-converters.js.map +1 -1
- package/lib/main/browser/custom-editors/custom-editor-opener.d.ts +1 -0
- package/lib/main/browser/custom-editors/custom-editor-opener.d.ts.map +1 -1
- package/lib/main/browser/custom-editors/custom-editor-opener.js +6 -2
- package/lib/main/browser/custom-editors/custom-editor-opener.js.map +1 -1
- package/lib/main/browser/debug/plugin-debug-adapter-contribution.d.ts +1 -1
- package/lib/main/browser/debug/plugin-debug-adapter-contribution.d.ts.map +1 -1
- package/lib/main/browser/debug/plugin-debug-adapter-contribution.js +2 -2
- package/lib/main/browser/debug/plugin-debug-adapter-contribution.js.map +1 -1
- package/lib/main/browser/debug/plugin-debug-service.d.ts +8 -0
- package/lib/main/browser/debug/plugin-debug-service.d.ts.map +1 -1
- package/lib/main/browser/debug/plugin-debug-service.js +15 -0
- package/lib/main/browser/debug/plugin-debug-service.js.map +1 -1
- package/lib/main/browser/dialogs/modal-notification.d.ts +1 -1
- package/lib/main/browser/dialogs/modal-notification.d.ts.map +1 -1
- package/lib/main/browser/dialogs/modal-notification.js +4 -4
- package/lib/main/browser/dialogs/modal-notification.js.map +1 -1
- package/lib/main/browser/plugin-ext-frontend-module.d.ts.map +1 -1
- package/lib/main/browser/plugin-ext-frontend-module.js +5 -3
- package/lib/main/browser/plugin-ext-frontend-module.js.map +1 -1
- package/lib/main/browser/plugin-ext-widget.d.ts.map +1 -1
- package/lib/main/browser/plugin-ext-widget.js +3 -2
- package/lib/main/browser/plugin-ext-widget.js.map +1 -1
- package/lib/main/browser/plugin-icon-theme-service.d.ts +2 -0
- package/lib/main/browser/plugin-icon-theme-service.d.ts.map +1 -1
- package/lib/main/browser/plugin-icon-theme-service.js +15 -2
- package/lib/main/browser/plugin-icon-theme-service.js.map +1 -1
- package/lib/main/browser/plugin-shared-style.js +1 -1
- package/lib/main/browser/plugin-shared-style.js.map +1 -1
- package/lib/main/browser/quick-open-main.d.ts +2 -5
- package/lib/main/browser/quick-open-main.d.ts.map +1 -1
- package/lib/main/browser/quick-open-main.js +48 -100
- package/lib/main/browser/quick-open-main.js.map +1 -1
- package/lib/main/browser/view/plugin-view-registry.js +1 -1
- package/lib/main/browser/view/plugin-view-registry.js.map +1 -1
- package/lib/main/browser/view/plugin-view-widget.d.ts +7 -1
- package/lib/main/browser/view/plugin-view-widget.d.ts.map +1 -1
- package/lib/main/browser/view/plugin-view-widget.js +10 -0
- package/lib/main/browser/view/plugin-view-widget.js.map +1 -1
- package/lib/main/browser/view/tree-views-main.d.ts +1 -0
- package/lib/main/browser/view/tree-views-main.d.ts.map +1 -1
- package/lib/main/browser/view/tree-views-main.js +6 -0
- package/lib/main/browser/view/tree-views-main.js.map +1 -1
- package/lib/main/browser/webview/webview.js +1 -1
- package/lib/main/browser/webview/webview.js.map +1 -1
- package/lib/plugin/languages/call-hierarchy.d.ts.map +1 -1
- package/lib/plugin/languages/call-hierarchy.js +2 -1
- package/lib/plugin/languages/call-hierarchy.js.map +1 -1
- package/lib/plugin/languages.d.ts.map +1 -1
- package/lib/plugin/languages.js +2 -1
- package/lib/plugin/languages.js.map +1 -1
- package/lib/plugin/node/debug/debug.d.ts +3 -2
- package/lib/plugin/node/debug/debug.d.ts.map +1 -1
- package/lib/plugin/node/debug/debug.js +24 -11
- package/lib/plugin/node/debug/debug.js.map +1 -1
- package/lib/plugin/plugin-context.d.ts.map +1 -1
- package/lib/plugin/plugin-context.js +7 -3
- package/lib/plugin/plugin-context.js.map +1 -1
- package/lib/plugin/plugin-manager.d.ts +2 -0
- package/lib/plugin/plugin-manager.d.ts.map +1 -1
- package/lib/plugin/plugin-manager.js +24 -3
- package/lib/plugin/plugin-manager.js.map +1 -1
- package/lib/plugin/plugin-storage.d.ts +4 -0
- package/lib/plugin/plugin-storage.d.ts.map +1 -1
- package/lib/plugin/plugin-storage.js +6 -1
- package/lib/plugin/plugin-storage.js.map +1 -1
- package/lib/plugin/quick-open.d.ts +1 -3
- package/lib/plugin/quick-open.d.ts.map +1 -1
- package/lib/plugin/quick-open.js +4 -26
- package/lib/plugin/quick-open.js.map +1 -1
- package/lib/plugin/tasks/tasks.d.ts +1 -1
- package/lib/plugin/tasks/tasks.d.ts.map +1 -1
- package/lib/plugin/tasks/tasks.js +3 -2
- package/lib/plugin/tasks/tasks.js.map +1 -1
- package/lib/plugin/tree/tree-views.d.ts +3 -0
- package/lib/plugin/tree/tree-views.d.ts.map +1 -1
- package/lib/plugin/tree/tree-views.js +15 -1
- package/lib/plugin/tree/tree-views.js.map +1 -1
- package/lib/plugin/type-converters.d.ts.map +1 -1
- package/lib/plugin/type-converters.js +9 -5
- package/lib/plugin/type-converters.js.map +1 -1
- package/lib/plugin/types-impl.d.ts +24 -1
- package/lib/plugin/types-impl.d.ts.map +1 -1
- package/lib/plugin/types-impl.js +28 -1
- package/lib/plugin/types-impl.js.map +1 -1
- package/package.json +29 -27
- package/src/common/arrays.ts +8 -0
- package/src/common/plugin-api-rpc-model.ts +2 -0
- package/src/common/plugin-api-rpc.ts +24 -3
- package/src/common/plugin-protocol.ts +1 -0
- package/src/hosted/browser/hosted-plugin.ts +17 -8
- package/src/hosted/browser/worker/debug-stub.ts +1 -0
- package/src/hosted/node/scanners/scanner-theia.ts +3 -2
- package/src/main/browser/callhierarchy/callhierarchy-type-converters.ts +2 -1
- package/src/main/browser/custom-editors/custom-editor-opener.tsx +7 -2
- package/src/main/browser/debug/plugin-debug-adapter-contribution.ts +3 -3
- package/src/main/browser/debug/plugin-debug-service.ts +23 -0
- package/src/main/browser/dialogs/modal-notification.ts +6 -6
- package/src/main/browser/plugin-ext-frontend-module.ts +6 -4
- package/src/main/browser/plugin-ext-widget.tsx +3 -2
- package/src/main/browser/plugin-icon-theme-service.ts +12 -2
- package/src/main/browser/plugin-shared-style.ts +1 -1
- package/src/main/browser/quick-open-main.ts +53 -108
- package/src/main/browser/style/index.css +1 -5
- package/src/main/browser/style/plugin-sidebar.css +1 -1
- package/src/main/browser/view/plugin-view-registry.ts +2 -2
- package/src/main/browser/view/plugin-view-widget.ts +15 -1
- package/src/main/browser/view/tree-views-main.ts +7 -0
- package/src/main/browser/webview/pre/host.js +19 -10
- package/src/main/browser/webview/pre/main.js +1 -2
- package/src/main/browser/webview/pre/service-worker.js +1 -1
- package/src/main/browser/webview/webview.ts +1 -1
- package/src/plugin/languages/call-hierarchy.ts +2 -1
- package/src/plugin/languages.ts +2 -1
- package/src/plugin/node/debug/debug.ts +26 -12
- package/src/plugin/plugin-context.ts +16 -7
- package/src/plugin/plugin-manager.ts +26 -4
- package/src/plugin/plugin-storage.ts +6 -0
- package/src/plugin/quick-open.ts +5 -29
- package/src/plugin/tasks/tasks.ts +3 -2
- package/src/plugin/tree/tree-views.ts +17 -1
- package/src/plugin/type-converters.ts +9 -6
- package/src/plugin/types-impl.ts +30 -1
|
@@ -14,7 +14,7 @@
|
|
|
14
14
|
* SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0
|
|
15
15
|
********************************************************************************/
|
|
16
16
|
|
|
17
|
-
import { DebugExt
|
|
17
|
+
import { DebugExt } from '../../../common/plugin-api-rpc';
|
|
18
18
|
import { DebugConfiguration } from '@theia/debug/lib/common/debug-configuration';
|
|
19
19
|
import { MaybePromise } from '@theia/core/lib/common/types';
|
|
20
20
|
import { DebuggerDescription } from '@theia/debug/lib/common/debug-service';
|
|
@@ -37,8 +37,8 @@ export class PluginDebugAdapterContribution {
|
|
|
37
37
|
return this.description.label;
|
|
38
38
|
}
|
|
39
39
|
|
|
40
|
-
async provideDebugConfigurations(workspaceFolderUri: string | undefined): Promise<DebugConfiguration[]> {
|
|
41
|
-
return this.debugExt.$provideDebugConfigurations(this.type, workspaceFolderUri);
|
|
40
|
+
async provideDebugConfigurations(workspaceFolderUri: string | undefined, dynamic: boolean = false): Promise<DebugConfiguration[]> {
|
|
41
|
+
return this.debugExt.$provideDebugConfigurations(this.type, workspaceFolderUri, dynamic);
|
|
42
42
|
}
|
|
43
43
|
|
|
44
44
|
async resolveDebugConfiguration(config: DebugConfiguration, workspaceFolderUri: string | undefined): Promise<DebugConfiguration | undefined> {
|
|
@@ -25,6 +25,7 @@ import { WorkspaceService } from '@theia/workspace/lib/browser';
|
|
|
25
25
|
import { DebuggerContribution } from '../../../common/plugin-protocol';
|
|
26
26
|
import { DebugRequestTypes } from '@theia/debug/lib/browser/debug-session-connection';
|
|
27
27
|
import * as theia from '@theia/plugin';
|
|
28
|
+
|
|
28
29
|
/**
|
|
29
30
|
* Debug adapter contribution registrator.
|
|
30
31
|
*/
|
|
@@ -111,6 +112,28 @@ export class PluginDebugService implements DebugService, PluginDebugAdapterContr
|
|
|
111
112
|
}
|
|
112
113
|
}
|
|
113
114
|
|
|
115
|
+
async provideDynamicDebugConfigurations(): Promise<{ type: string, configurations: DebugConfiguration[] }[]> {
|
|
116
|
+
const result: Promise<{ type: string, configurations: theia.DebugConfiguration[] }>[] = [];
|
|
117
|
+
|
|
118
|
+
for (const [type, contributor] of this.contributors.entries()) {
|
|
119
|
+
const typeConfigurations = this.resolveDynamicConfigurationsForType(type, contributor);
|
|
120
|
+
result.push(typeConfigurations);
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
return Promise.all(result);
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
protected async resolveDynamicConfigurationsForType(
|
|
127
|
+
type: string,
|
|
128
|
+
contributor: PluginDebugAdapterContribution): Promise<{ type: string, configurations: DebugConfiguration[] }> {
|
|
129
|
+
|
|
130
|
+
const configurations = await contributor.provideDebugConfigurations(undefined, true);
|
|
131
|
+
for (const configuration of configurations) {
|
|
132
|
+
configuration.dynamic = true;
|
|
133
|
+
}
|
|
134
|
+
return { type, configurations };
|
|
135
|
+
}
|
|
136
|
+
|
|
114
137
|
async resolveDebugConfiguration(config: DebugConfiguration, workspaceFolderUri: string | undefined): Promise<DebugConfiguration> {
|
|
115
138
|
let resolved = config;
|
|
116
139
|
|
|
@@ -15,7 +15,7 @@
|
|
|
15
15
|
********************************************************************************/
|
|
16
16
|
import { injectable } from '@theia/core/shared/inversify';
|
|
17
17
|
import { Message } from '@theia/core/shared/@phosphor/messaging';
|
|
18
|
-
import { Key } from '@theia/core/lib/browser';
|
|
18
|
+
import { codiconArray, Key } from '@theia/core/lib/browser';
|
|
19
19
|
import { AbstractDialog } from '@theia/core/lib/browser/dialogs';
|
|
20
20
|
import '../../../../src/main/browser/dialogs/style/modal-notification.css';
|
|
21
21
|
import { MainMessageItem } from '../../../common/plugin-api-rpc';
|
|
@@ -60,7 +60,7 @@ export class ModalNotification extends AbstractDialog<string | undefined> {
|
|
|
60
60
|
const iconContainer = messageNode.appendChild(document.createElement('div'));
|
|
61
61
|
iconContainer.classList.add(ICON);
|
|
62
62
|
const iconElement = iconContainer.appendChild(document.createElement('i'));
|
|
63
|
-
iconElement.classList.add(
|
|
63
|
+
iconElement.classList.add(...this.toIconClass(messageType), messageType.toString());
|
|
64
64
|
|
|
65
65
|
const textContainer = messageNode.appendChild(document.createElement('div'));
|
|
66
66
|
textContainer.classList.add(TEXT);
|
|
@@ -86,13 +86,13 @@ export class ModalNotification extends AbstractDialog<string | undefined> {
|
|
|
86
86
|
return messageNode;
|
|
87
87
|
}
|
|
88
88
|
|
|
89
|
-
protected toIconClass(icon: MessageType): string {
|
|
89
|
+
protected toIconClass(icon: MessageType): string[] {
|
|
90
90
|
if (icon === MessageType.Error) {
|
|
91
|
-
return '
|
|
91
|
+
return codiconArray('error');
|
|
92
92
|
}
|
|
93
93
|
if (icon === MessageType.Warning) {
|
|
94
|
-
return '
|
|
94
|
+
return codiconArray('warning');
|
|
95
95
|
}
|
|
96
|
-
return '
|
|
96
|
+
return codiconArray('info');
|
|
97
97
|
}
|
|
98
98
|
}
|
|
@@ -21,7 +21,7 @@ import '../../../src/main/browser/style/comments.css';
|
|
|
21
21
|
import { ContainerModule } from '@theia/core/shared/inversify';
|
|
22
22
|
import {
|
|
23
23
|
FrontendApplicationContribution, WidgetFactory, bindViewContribution,
|
|
24
|
-
ViewContainerIdentifier, ViewContainer, createTreeContainer, TreeImpl, TreeWidget, TreeModelImpl, LabelProviderContribution
|
|
24
|
+
ViewContainerIdentifier, ViewContainer, createTreeContainer, TreeImpl, TreeWidget, TreeModelImpl, LabelProviderContribution
|
|
25
25
|
} from '@theia/core/lib/browser';
|
|
26
26
|
import { MaybePromise, CommandContribution, ResourceResolver, bindContributionProvider } from '@theia/core/lib/common';
|
|
27
27
|
import { WebSocketConnectionProvider } from '@theia/core/lib/browser/messaging';
|
|
@@ -147,10 +147,12 @@ export default new ContainerModule((bind, unbind, isBound, rebind) => {
|
|
|
147
147
|
createWidget: (identifier: TreeViewWidgetIdentifier) => {
|
|
148
148
|
const child = createTreeContainer(container, {
|
|
149
149
|
contextMenuPath: VIEW_ITEM_CONTEXT_MENU,
|
|
150
|
-
|
|
151
|
-
|
|
150
|
+
expandOnlyOnExpansionToggleClick: true,
|
|
151
|
+
expansionTogglePadding: 22,
|
|
152
|
+
globalSelection: true,
|
|
153
|
+
leftPadding: 8,
|
|
154
|
+
search: true
|
|
152
155
|
});
|
|
153
|
-
child.rebind(TreeProps).toConstantValue({ leftPadding: 8, expansionTogglePadding: 22, expandOnlyOnExpansionToggleClick: true, });
|
|
154
156
|
child.bind(TreeViewWidgetIdentifier).toConstantValue(identifier);
|
|
155
157
|
child.bind(PluginTree).toSelf();
|
|
156
158
|
child.rebind(TreeImpl).toService(PluginTree);
|
|
@@ -23,6 +23,7 @@ import { AlertMessage } from '@theia/core/lib/browser/widgets/alert-message';
|
|
|
23
23
|
import { HostedPluginSupport, PluginProgressLocation } from '../../hosted/browser/hosted-plugin';
|
|
24
24
|
import { ProgressBarFactory } from '@theia/core/lib/browser/progress-bar-factory';
|
|
25
25
|
import { DisposableCollection } from '@theia/core/lib/common/disposable';
|
|
26
|
+
import { codicon } from '@theia/core/lib/browser';
|
|
26
27
|
|
|
27
28
|
@injectable()
|
|
28
29
|
export class PluginWidget extends ReactWidget {
|
|
@@ -38,7 +39,7 @@ export class PluginWidget extends ReactWidget {
|
|
|
38
39
|
this.id = 'plugins';
|
|
39
40
|
this.title.label = 'Plugins';
|
|
40
41
|
this.title.caption = 'Plugins';
|
|
41
|
-
this.title.iconClass = '
|
|
42
|
+
this.title.iconClass = codicon('diff-added');
|
|
42
43
|
this.title.closable = true;
|
|
43
44
|
this.node.tabIndex = 0;
|
|
44
45
|
this.addClass('theia-plugins');
|
|
@@ -86,7 +87,7 @@ export class PluginWidget extends ReactWidget {
|
|
|
86
87
|
return <div key={plugin.model.name} className={this.createPluginClassName(plugin)}>
|
|
87
88
|
<div className='column flexcontainer pluginInformationContainer'>
|
|
88
89
|
<div className='row flexcontainer'>
|
|
89
|
-
<div className='
|
|
90
|
+
<div className={codicon('list-selection')}></div>
|
|
90
91
|
<div title={plugin.model.name} className='pluginName noWrapInfo'>{plugin.model.name}</div>
|
|
91
92
|
</div>
|
|
92
93
|
<div className='row flexcontainer'>
|
|
@@ -36,6 +36,7 @@ import { WorkspaceRootNode } from '@theia/navigator/lib/browser/navigator-tree';
|
|
|
36
36
|
import { Endpoint } from '@theia/core/lib/browser/endpoint';
|
|
37
37
|
import { FileService } from '@theia/filesystem/lib/browser/file-service';
|
|
38
38
|
import { FileStat, FileChangeType } from '@theia/filesystem/lib/common/files';
|
|
39
|
+
import { WorkspaceService } from '@theia/workspace/lib/browser';
|
|
39
40
|
|
|
40
41
|
export interface PluginIconDefinition {
|
|
41
42
|
iconPath: string;
|
|
@@ -107,6 +108,9 @@ export class PluginIconTheme extends PluginIconThemeDefinition implements IconTh
|
|
|
107
108
|
@inject(PluginIconThemeDefinition)
|
|
108
109
|
protected readonly definition: PluginIconThemeDefinition;
|
|
109
110
|
|
|
111
|
+
@inject(WorkspaceService)
|
|
112
|
+
protected readonly workspaceService: WorkspaceService;
|
|
113
|
+
|
|
110
114
|
protected readonly onDidChangeEmitter = new Emitter<DidChangeLabelEvent>();
|
|
111
115
|
readonly onDidChange = this.onDidChangeEmitter.event;
|
|
112
116
|
|
|
@@ -508,9 +512,15 @@ export class PluginIconTheme extends PluginIconThemeDefinition implements IconTh
|
|
|
508
512
|
const name = this.labelProvider.getName(element);
|
|
509
513
|
const classNames = this.fileNameIcon(name);
|
|
510
514
|
if (uri) {
|
|
511
|
-
const
|
|
515
|
+
const parsedURI = new URI(uri);
|
|
516
|
+
const isRoot = this.workspaceService.getWorkspaceRootUri(new URI(uri))?.isEqual(parsedURI);
|
|
517
|
+
if (isRoot) {
|
|
518
|
+
classNames.unshift(this.rootFolderIcon);
|
|
519
|
+
} else {
|
|
520
|
+
classNames.unshift(this.fileIcon);
|
|
521
|
+
}
|
|
522
|
+
const language = monaco.services.StaticServices.modeService.get().createByFilepathOrFirstLine(parsedURI['codeUri']);
|
|
512
523
|
classNames.push(this.languageIcon(language.languageIdentifier.language));
|
|
513
|
-
classNames.unshift(this.fileIcon);
|
|
514
524
|
}
|
|
515
525
|
return classNames;
|
|
516
526
|
}
|
|
@@ -111,7 +111,7 @@ export class PluginSharedStyle {
|
|
|
111
111
|
background-position: 2px;
|
|
112
112
|
width: ${size}px;
|
|
113
113
|
height: ${size}px;
|
|
114
|
-
background: no-repeat url("${theme.type === 'light' ? lightIconUrl : darkIconUrl}");
|
|
114
|
+
background: center no-repeat url("${theme.type === 'light' ? lightIconUrl : darkIconUrl}");
|
|
115
115
|
background-size: ${size}px;
|
|
116
116
|
`));
|
|
117
117
|
return {
|
|
@@ -15,7 +15,7 @@
|
|
|
15
15
|
********************************************************************************/
|
|
16
16
|
/* eslint-disable @typescript-eslint/no-explicit-any */
|
|
17
17
|
|
|
18
|
-
import { InputBoxOptions
|
|
18
|
+
import { InputBoxOptions } from '@theia/plugin';
|
|
19
19
|
import { interfaces } from '@theia/core/shared/inversify';
|
|
20
20
|
import { RPCProtocol } from '../../common/rpc-protocol';
|
|
21
21
|
import {
|
|
@@ -23,15 +23,17 @@ import {
|
|
|
23
23
|
QuickOpenMain,
|
|
24
24
|
MAIN_RPC_CONTEXT,
|
|
25
25
|
TransferInputBox,
|
|
26
|
-
TransferQuickPick,
|
|
27
26
|
TransferQuickPickItems,
|
|
28
27
|
TransferQuickInput,
|
|
29
28
|
TransferQuickInputButton
|
|
30
29
|
} from '../../common/plugin-api-rpc';
|
|
31
30
|
import {
|
|
32
|
-
InputOptions,
|
|
31
|
+
InputOptions,
|
|
32
|
+
PickOptions,
|
|
33
|
+
QuickInputButton,
|
|
34
|
+
QuickInputButtonHandle,
|
|
35
|
+
QuickInputService
|
|
33
36
|
} from '@theia/core/lib/browser';
|
|
34
|
-
import { QuickPickService } from '@theia/core/lib/common/quick-pick-service';
|
|
35
37
|
import { DisposableCollection, Disposable } from '@theia/core/lib/common/disposable';
|
|
36
38
|
import { CancellationToken } from '@theia/core/lib/common/cancellation';
|
|
37
39
|
import { MonacoQuickInputService } from '@theia/monaco/lib/browser/monaco-quick-input-service';
|
|
@@ -47,7 +49,6 @@ export interface QuickInputSession {
|
|
|
47
49
|
export class QuickOpenMainImpl implements QuickOpenMain, Disposable {
|
|
48
50
|
|
|
49
51
|
private quickInputService: QuickInputService;
|
|
50
|
-
private quickPickService: QuickPickService;
|
|
51
52
|
private proxy: QuickOpenExt;
|
|
52
53
|
private delegate: MonacoQuickInputService;
|
|
53
54
|
private readonly items: Record<number, {
|
|
@@ -61,7 +62,6 @@ export class QuickOpenMainImpl implements QuickOpenMain, Disposable {
|
|
|
61
62
|
this.proxy = rpc.getProxy(MAIN_RPC_CONTEXT.QUICK_OPEN_EXT);
|
|
62
63
|
this.delegate = container.get(MonacoQuickInputService);
|
|
63
64
|
this.quickInputService = container.get(QuickInputService);
|
|
64
|
-
this.quickPickService = container.get(QuickPickService);
|
|
65
65
|
}
|
|
66
66
|
|
|
67
67
|
dispose(): void {
|
|
@@ -196,52 +196,53 @@ export class QuickOpenMainImpl implements QuickOpenMain, Disposable {
|
|
|
196
196
|
|
|
197
197
|
$createOrUpdate<T extends theia.QuickPickItem>(params: TransferQuickInput<T>): Promise<void> {
|
|
198
198
|
const sessionId = params.id;
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
199
|
+
let session = this.sessions.get(sessionId);
|
|
200
|
+
if (!session) {
|
|
201
|
+
if (params.type === 'quickPick') {
|
|
202
|
+
const quickPick = this.quickInputService.createQuickPick();
|
|
203
|
+
quickPick.onDidAccept(() => {
|
|
204
|
+
this.proxy.$acceptOnDidAccept(sessionId);
|
|
205
|
+
});
|
|
206
|
+
quickPick.onDidChangeActive((items: Array<monaco.quickInput.IQuickPickItem>) => {
|
|
207
|
+
this.proxy.$onDidChangeActive(sessionId, items.map(item => (item as TransferQuickPickItems).handle));
|
|
208
|
+
});
|
|
209
|
+
quickPick.onDidChangeSelection((items: Array<monaco.quickInput.IQuickPickItem>) => {
|
|
210
|
+
this.proxy.$onDidChangeSelection(sessionId, items.map(item => (item as TransferQuickPickItems).handle));
|
|
211
|
+
});
|
|
212
|
+
quickPick.onDidTriggerButton((button: QuickInputButtonHandle) => {
|
|
213
|
+
this.proxy.$acceptOnDidTriggerButton(sessionId, button);
|
|
214
|
+
});
|
|
215
|
+
quickPick.onDidChangeValue((value: string) => {
|
|
216
|
+
this.proxy.$acceptDidChangeValue(sessionId, value);
|
|
217
|
+
});
|
|
218
|
+
quickPick.onDidHide(() => {
|
|
219
|
+
this.proxy.$acceptOnDidHide(sessionId);
|
|
220
|
+
});
|
|
221
|
+
session = {
|
|
222
|
+
input: quickPick,
|
|
223
|
+
handlesToItems: new Map()
|
|
224
|
+
};
|
|
225
|
+
} else {
|
|
226
|
+
const inputBox = this.quickInputService.createInputBox();
|
|
227
|
+
inputBox.onDidAccept(() => {
|
|
228
|
+
this.proxy.$acceptOnDidAccept(sessionId);
|
|
229
|
+
});
|
|
230
|
+
inputBox.onDidTriggerButton((button: QuickInputButtonHandle) => {
|
|
231
|
+
this.proxy.$acceptOnDidTriggerButton(sessionId, button);
|
|
232
|
+
});
|
|
233
|
+
inputBox.onDidChangeValue((value: string) => {
|
|
234
|
+
this.proxy.$acceptDidChangeValue(sessionId, value);
|
|
235
|
+
});
|
|
236
|
+
inputBox.onDidHide(() => {
|
|
237
|
+
this.proxy.$acceptOnDidHide(sessionId);
|
|
238
|
+
});
|
|
239
|
+
session = {
|
|
240
|
+
input: inputBox,
|
|
241
|
+
handlesToItems: new Map()
|
|
242
|
+
};
|
|
243
|
+
}
|
|
244
|
+
this.sessions.set(sessionId, session);
|
|
245
|
+
}
|
|
245
246
|
if (session) {
|
|
246
247
|
const { input, handlesToItems } = session;
|
|
247
248
|
for (const param in params) {
|
|
@@ -297,47 +298,6 @@ export class QuickOpenMainImpl implements QuickOpenMain, Disposable {
|
|
|
297
298
|
return Promise.resolve(undefined);
|
|
298
299
|
}
|
|
299
300
|
|
|
300
|
-
async $showCustomQuickPick<T extends QuickPickItemExt>(options: TransferQuickPick<T>): Promise<void> {
|
|
301
|
-
const sessionId = options.id;
|
|
302
|
-
const toDispose = new DisposableCollection();
|
|
303
|
-
|
|
304
|
-
toDispose.push(this.quickPickService.onDidAccept(() => {
|
|
305
|
-
this.proxy.$acceptOnDidAccept(sessionId);
|
|
306
|
-
}));
|
|
307
|
-
toDispose.push(this.quickPickService.onDidChangeActive((e: { quickPick: any, activeItems: Array<QuickPickValue<number>> }) => {
|
|
308
|
-
this.proxy.$onDidChangeActive(sessionId, e.activeItems.map(item => item.value!));
|
|
309
|
-
}));
|
|
310
|
-
toDispose.push(this.quickPickService.onDidChangeSelection((e: { quickPick: any, selectedItems: Array<QuickPickValue<number>> }) => {
|
|
311
|
-
this.proxy.$onDidChangeSelection(sessionId, e.selectedItems.map(item => item.value!));
|
|
312
|
-
}));
|
|
313
|
-
toDispose.push(this.quickPickService.onDidChangeValue((e: { quickPick: any, filter: string }) => {
|
|
314
|
-
this.proxy.$acceptDidChangeValue(sessionId, e.filter);
|
|
315
|
-
}));
|
|
316
|
-
toDispose.push(this.quickPickService.onDidTriggerButton(button => {
|
|
317
|
-
this.proxy.$acceptOnDidTriggerButton(sessionId, button);
|
|
318
|
-
}));
|
|
319
|
-
toDispose.push(this.quickPickService.onDidHide(() => {
|
|
320
|
-
this.proxy.$acceptOnDidHide(sessionId);
|
|
321
|
-
if (!toDispose.disposed) {
|
|
322
|
-
toDispose.dispose();
|
|
323
|
-
}
|
|
324
|
-
}));
|
|
325
|
-
this.toDispose.push(toDispose);
|
|
326
|
-
|
|
327
|
-
this.quickPickService.show(this.convertToQuickPickItem(options.items), {
|
|
328
|
-
buttons: options.buttons ? this.convertToQuickInputButtons(options.buttons) : [],
|
|
329
|
-
placeholder: options.placeholder,
|
|
330
|
-
matchOnDescription: options.matchOnDescription,
|
|
331
|
-
step: options.step,
|
|
332
|
-
title: options.title,
|
|
333
|
-
totalSteps: options.totalSteps,
|
|
334
|
-
ignoreFocusOut: options.ignoreFocusOut,
|
|
335
|
-
value: options.value,
|
|
336
|
-
matchOnLabel: true,
|
|
337
|
-
runIfSingle: false,
|
|
338
|
-
});
|
|
339
|
-
}
|
|
340
|
-
|
|
341
301
|
$hide(): void {
|
|
342
302
|
this.delegate.hide();
|
|
343
303
|
}
|
|
@@ -351,21 +311,6 @@ export class QuickOpenMainImpl implements QuickOpenMain, Disposable {
|
|
|
351
311
|
return Promise.resolve(undefined);
|
|
352
312
|
}
|
|
353
313
|
|
|
354
|
-
private convertToQuickPickItem(items: TransferQuickPickItems[] | undefined): Array<QuickPickItem> {
|
|
355
|
-
const convertedItems: QuickPickValue<number>[] = [];
|
|
356
|
-
if (items) {
|
|
357
|
-
for (const i of items) {
|
|
358
|
-
convertedItems.push({
|
|
359
|
-
label: i.label,
|
|
360
|
-
description: i.description,
|
|
361
|
-
detail: i.detail,
|
|
362
|
-
value: i.handle
|
|
363
|
-
});
|
|
364
|
-
}
|
|
365
|
-
}
|
|
366
|
-
return convertedItems;
|
|
367
|
-
}
|
|
368
|
-
|
|
369
314
|
private convertToQuickInputButtons(buttons: Array<TransferQuickInputButton>): Array<QuickInputButton> {
|
|
370
315
|
return buttons.map((button, i) => ({
|
|
371
316
|
iconPath: getIconUris(button.iconPath),
|
|
@@ -37,11 +37,7 @@
|
|
|
37
37
|
.theia-plugin-view-container {
|
|
38
38
|
-webkit-mask: url('');
|
|
39
39
|
mask: url('');
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
.theia-plugin-test-tab-icon {
|
|
43
|
-
-webkit-mask: url('test.svg');
|
|
44
|
-
mask: url('test.svg');
|
|
40
|
+
background-color: var(--theia-activityBar-inactiveForeground);
|
|
45
41
|
}
|
|
46
42
|
|
|
47
43
|
.theia-plugin-file-icon,
|
|
@@ -30,7 +30,6 @@
|
|
|
30
30
|
.theia-plugins .pluginHeaderContainer {
|
|
31
31
|
padding: 5px 15px;
|
|
32
32
|
font-size: var(--theia-ui-font-size0);
|
|
33
|
-
border-bottom: 1px solid;
|
|
34
33
|
}
|
|
35
34
|
|
|
36
35
|
.theia-side-panel .theia-plugins .pluginHeaderContainer {
|
|
@@ -48,6 +47,7 @@
|
|
|
48
47
|
.theia-plugins .pluginName {
|
|
49
48
|
flex: 1;
|
|
50
49
|
margin-right: 5px;
|
|
50
|
+
margin-left: 4px;
|
|
51
51
|
font-size: var(--theia-ui-font-size1);
|
|
52
52
|
font-weight: 400;
|
|
53
53
|
}
|
|
@@ -18,7 +18,7 @@ import { injectable, inject, postConstruct, optional } from '@theia/core/shared/
|
|
|
18
18
|
import {
|
|
19
19
|
ApplicationShell, ViewContainer as ViewContainerWidget, WidgetManager,
|
|
20
20
|
ViewContainerIdentifier, ViewContainerTitleOptions, Widget, FrontendApplicationContribution,
|
|
21
|
-
StatefulWidget, CommonMenus, BaseWidget, TreeViewWelcomeWidget
|
|
21
|
+
StatefulWidget, CommonMenus, BaseWidget, TreeViewWelcomeWidget, codicon
|
|
22
22
|
} from '@theia/core/lib/browser';
|
|
23
23
|
import { ViewContainer, View, ViewWelcome } from '../../../common';
|
|
24
24
|
import { PluginSharedStyle } from '../plugin-shared-style';
|
|
@@ -146,7 +146,7 @@ export class PluginViewRegistry implements FrontendApplicationContribution {
|
|
|
146
146
|
});
|
|
147
147
|
this.doRegisterViewContainer('test', 'left', {
|
|
148
148
|
label: 'Test',
|
|
149
|
-
iconClass: '
|
|
149
|
+
iconClass: codicon('beaker'),
|
|
150
150
|
closeable: true
|
|
151
151
|
});
|
|
152
152
|
this.contextKeyService.onDidChange(e => {
|
|
@@ -22,6 +22,8 @@ import { ViewContextKeyService } from './view-context-key-service';
|
|
|
22
22
|
import { StatefulWidget } from '@theia/core/lib/browser/shell/shell-layout-restorer';
|
|
23
23
|
import { Message } from '@theia/core/shared/@phosphor/messaging';
|
|
24
24
|
import { TreeViewWidget } from './tree-view-widget';
|
|
25
|
+
import { DescriptionWidget } from '@theia/core/lib/browser/view-container';
|
|
26
|
+
import { Emitter } from '@theia/core/lib/common';
|
|
25
27
|
|
|
26
28
|
@injectable()
|
|
27
29
|
export class PluginViewWidgetIdentifier {
|
|
@@ -30,7 +32,7 @@ export class PluginViewWidgetIdentifier {
|
|
|
30
32
|
}
|
|
31
33
|
|
|
32
34
|
@injectable()
|
|
33
|
-
export class PluginViewWidget extends Panel implements StatefulWidget {
|
|
35
|
+
export class PluginViewWidget extends Panel implements StatefulWidget, DescriptionWidget {
|
|
34
36
|
|
|
35
37
|
@inject(MenuModelRegistry)
|
|
36
38
|
protected readonly menus: MenuModelRegistry;
|
|
@@ -50,6 +52,8 @@ export class PluginViewWidget extends Panel implements StatefulWidget {
|
|
|
50
52
|
this.node.style.height = '100%';
|
|
51
53
|
}
|
|
52
54
|
|
|
55
|
+
public onDidChangeDescription: Emitter<void> = new Emitter<void>();
|
|
56
|
+
|
|
53
57
|
@postConstruct()
|
|
54
58
|
protected init(): void {
|
|
55
59
|
this.id = this.options.id;
|
|
@@ -112,6 +116,16 @@ export class PluginViewWidget extends Panel implements StatefulWidget {
|
|
|
112
116
|
this.updateWidgetMessage();
|
|
113
117
|
}
|
|
114
118
|
|
|
119
|
+
private _description: string = '';
|
|
120
|
+
get description(): string {
|
|
121
|
+
return this._description;
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
set description(description: string) {
|
|
125
|
+
this._description = description;
|
|
126
|
+
this.onDidChangeDescription.fire();
|
|
127
|
+
}
|
|
128
|
+
|
|
115
129
|
private updateWidgetMessage(): void {
|
|
116
130
|
const widget = this.widgets[0];
|
|
117
131
|
if (widget) {
|
|
@@ -150,6 +150,13 @@ export class TreeViewsMainImpl implements TreeViewsMain, Disposable {
|
|
|
150
150
|
}
|
|
151
151
|
}
|
|
152
152
|
|
|
153
|
+
async $setDescription(treeViewId: string, description: string): Promise<void> {
|
|
154
|
+
const viewPanel = await this.viewRegistry.getView(treeViewId);
|
|
155
|
+
if (viewPanel) {
|
|
156
|
+
viewPanel.description = description;
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
|
|
153
160
|
protected handleTreeEvents(treeViewId: string, treeViewWidget: TreeViewWidget): void {
|
|
154
161
|
this.toDispose.push(treeViewWidget.model.onExpansionChanged(event => {
|
|
155
162
|
this.proxy.$setExpanded(treeViewId, event.id, event.expanded);
|
|
@@ -25,19 +25,28 @@
|
|
|
25
25
|
const hostMessaging = new class HostMessaging {
|
|
26
26
|
constructor() {
|
|
27
27
|
this.handlers = new Map();
|
|
28
|
-
window.addEventListener('message',
|
|
29
|
-
|
|
28
|
+
window.addEventListener('message', e => {
|
|
29
|
+
let sourceIsChildFrame = false;
|
|
30
|
+
for (let i = 0; i < window.frames.length; i++) {
|
|
31
|
+
const frame = window.frames[i];
|
|
32
|
+
if (e.source === frame) {
|
|
33
|
+
sourceIsChildFrame = true;
|
|
34
|
+
break;
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
if (sourceIsChildFrame && e.data && (e.data.command === 'onmessage' || e.data.command === 'do-update-state')) {
|
|
30
38
|
// Came from inner iframe
|
|
31
39
|
this.postMessage(e.data.command, e.data.data);
|
|
32
|
-
return;
|
|
33
40
|
}
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
handler
|
|
39
|
-
|
|
40
|
-
|
|
41
|
+
// Note: `window.parent === window` when there is no parent...
|
|
42
|
+
if (sourceIsChildFrame || e.source === window.parent) {
|
|
43
|
+
const channel = e.data.channel;
|
|
44
|
+
const handler = this.handlers.get(channel);
|
|
45
|
+
if (handler) {
|
|
46
|
+
handler(e, e.data.args);
|
|
47
|
+
} else {
|
|
48
|
+
console.error('no handler for ', e);
|
|
49
|
+
}
|
|
41
50
|
}
|
|
42
51
|
});
|
|
43
52
|
}
|
|
@@ -193,7 +193,6 @@
|
|
|
193
193
|
initialScrollProgress: undefined
|
|
194
194
|
};
|
|
195
195
|
|
|
196
|
-
|
|
197
196
|
/**
|
|
198
197
|
* @param {HTMLDocument?} document
|
|
199
198
|
* @param {HTMLElement?} body
|
|
@@ -477,7 +476,7 @@
|
|
|
477
476
|
const newFrame = document.createElement('iframe');
|
|
478
477
|
newFrame.setAttribute('id', 'pending-frame');
|
|
479
478
|
newFrame.setAttribute('frameborder', '0');
|
|
480
|
-
newFrame.setAttribute('sandbox', options.allowScripts ? 'allow-scripts allow-forms allow-same-origin' : 'allow-same-origin');
|
|
479
|
+
newFrame.setAttribute('sandbox', options.allowScripts ? 'allow-scripts allow-forms allow-same-origin allow-downloads' : 'allow-same-origin');
|
|
481
480
|
if (host.fakeLoad) {
|
|
482
481
|
// We should just be able to use srcdoc, but I wasn't
|
|
483
482
|
// seeing the service worker applying properly.
|
|
@@ -248,7 +248,7 @@ async function processLocalhostRequest(event, requestUrl) {
|
|
|
248
248
|
const origin = requestUrl.origin;
|
|
249
249
|
|
|
250
250
|
const resolveRedirect = redirectOrigin => {
|
|
251
|
-
if (!redirectOrigin) {
|
|
251
|
+
if (!redirectOrigin || requestUrl.origin === redirectOrigin) {
|
|
252
252
|
return fetch(event.request);
|
|
253
253
|
}
|
|
254
254
|
const location = event.request.url.replace(new RegExp(`^${requestUrl.origin}(/|$)`), `${redirectOrigin}$1`);
|
|
@@ -249,7 +249,7 @@ export class WebviewWidget extends BaseWidget implements StatefulWidget {
|
|
|
249
249
|
|
|
250
250
|
const element = document.createElement('iframe');
|
|
251
251
|
element.className = 'webview';
|
|
252
|
-
element.sandbox.add('allow-scripts', 'allow-forms', 'allow-same-origin');
|
|
252
|
+
element.sandbox.add('allow-scripts', 'allow-forms', 'allow-same-origin', 'allow-downloads');
|
|
253
253
|
element.setAttribute('src', `${this.externalEndpoint}/index.html?id=${this.identifier.id}`);
|
|
254
254
|
element.style.border = 'none';
|
|
255
255
|
element.style.width = '100%';
|
package/src/plugin/languages.ts
CHANGED
|
@@ -90,6 +90,7 @@ import { DeclarationAdapter } from './languages/declaration';
|
|
|
90
90
|
import { CallHierarchyAdapter } from './languages/call-hierarchy';
|
|
91
91
|
import { BinaryBuffer } from '@theia/core/lib/common/buffer';
|
|
92
92
|
import { DocumentSemanticTokensAdapter, DocumentRangeSemanticTokensAdapter } from './languages/semantic-highlighting';
|
|
93
|
+
import { isReadonlyArray } from '../common/arrays';
|
|
93
94
|
|
|
94
95
|
type Adapter = CompletionAdapter |
|
|
95
96
|
SignatureHelpAdapter |
|
|
@@ -204,7 +205,7 @@ export class LanguagesExtImpl implements LanguagesExt {
|
|
|
204
205
|
}
|
|
205
206
|
|
|
206
207
|
private transformDocumentSelector(selector: theia.DocumentSelector): SerializedDocumentFilter[] {
|
|
207
|
-
if (
|
|
208
|
+
if (isReadonlyArray(selector)) {
|
|
208
209
|
return selector.map(sel => this.doTransformDocumentSelector(sel)!);
|
|
209
210
|
}
|
|
210
211
|
|