diff --git a/src/vs/workbench/contrib/extensions/browser/extensionsIcons.ts b/src/vs/workbench/contrib/extensions/browser/extensionsIcons.ts index 7cf7dc9f..bd67ba18 100644 --- a/src/vs/workbench/contrib/extensions/browser/extensionsIcons.ts +++ b/src/vs/workbench/contrib/extensions/browser/extensionsIcons.ts @@ -38,3 +38,6 @@ export const infoIcon = registerIcon('extensions-info-message', Codicon.info, lo export const trustIcon = registerIcon('extension-workspace-trust', Codicon.shield, localize('trustIcon', 'Icon shown with a workspace trust message in the extension editor.')); export const activationTimeIcon = registerIcon('extension-activation-time', Codicon.history, localize('activationtimeIcon', 'Icon shown with a activation time message in the extension editor.')); + +export const kylinIdeExtensionsFilterIcon = registerIcon('kylinide-extensions-filter', Codicon.listFilter, localize('kylinIdeExtensionsFilterIcon', 'Icon for the \'Filter\' action in the extensions view.')); +export const kylinIdeExtensionsResetIcon = registerIcon('kylinide-extensions-reset', Codicon.debugRestartFrame, localize('kylinIdeExtensionsResetIcon', 'Icon for the \'Reset\' action in the extensions view.')); diff --git a/src/vs/workbench/contrib/extensions/browser/extensionsViewlet.ts b/src/vs/workbench/contrib/extensions/browser/extensionsViewlet.ts index 87ca44f4..b24e041d 100644 --- a/src/vs/workbench/contrib/extensions/browser/extensionsViewlet.ts +++ b/src/vs/workbench/contrib/extensions/browser/extensionsViewlet.ts @@ -16,12 +16,12 @@ import { append, $, Dimension, hide, show, DragAndDropObserver, trackFocus } fro import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; import { IInstantiationService, ServicesAccessor } from 'vs/platform/instantiation/common/instantiation'; import { IExtensionService } from 'vs/workbench/services/extensions/common/extensions'; -import { IExtensionsWorkbenchService, IExtensionsViewPaneContainer, VIEWLET_ID, CloseExtensionDetailsOnViewChangeKey, INSTALL_EXTENSION_FROM_VSIX_COMMAND_ID, WORKSPACE_RECOMMENDATIONS_VIEW_ID, AutoCheckUpdatesConfigurationKey, OUTDATED_EXTENSIONS_VIEW_ID, CONTEXT_HAS_GALLERY, extensionsSearchActionsMenu } from '../common/extensions'; +import { IExtensionsWorkbenchService, IExtensionsViewPaneContainer, VIEWLET_ID, CloseExtensionDetailsOnViewChangeKey, INSTALL_EXTENSION_FROM_VSIX_COMMAND_ID, WORKSPACE_RECOMMENDATIONS_VIEW_ID, AutoCheckUpdatesConfigurationKey, OUTDATED_EXTENSIONS_VIEW_ID, CONTEXT_HAS_GALLERY, extensionsSearchActionsMenu, WORKSPACE_KYLINIDETEAM_VIEW_ID } from '../common/extensions'; import { InstallLocalExtensionsInRemoteAction, InstallRemoteExtensionsInLocalAction } from 'vs/workbench/contrib/extensions/browser/extensionsActions'; import { IExtensionManagementService } from 'vs/platform/extensionManagement/common/extensionManagement'; import { IWorkbenchExtensionEnablementService, IExtensionManagementServerService, IExtensionManagementServer } from 'vs/workbench/services/extensionManagement/common/extensionManagement'; import { ExtensionsInput } from 'vs/workbench/contrib/extensions/common/extensionsInput'; -import { ExtensionsListView, EnabledExtensionsView, DisabledExtensionsView, RecommendedExtensionsView, WorkspaceRecommendedExtensionsView, BuiltInFeatureExtensionsView, BuiltInThemesExtensionsView, BuiltInProgrammingLanguageExtensionsView, ServerInstalledExtensionsView, DefaultRecommendedExtensionsView, UntrustedWorkspaceUnsupportedExtensionsView, UntrustedWorkspacePartiallySupportedExtensionsView, VirtualWorkspaceUnsupportedExtensionsView, VirtualWorkspacePartiallySupportedExtensionsView, DefaultPopularExtensionsView, DeprecatedExtensionsView, SearchMarketplaceExtensionsView, RecentlyUpdatedExtensionsView, OutdatedExtensionsView } from 'vs/workbench/contrib/extensions/browser/extensionsViews'; +import { ExtensionsListView, EnabledExtensionsView, DisabledExtensionsView, RecommendedExtensionsView, WorkspaceRecommendedExtensionsView, BuiltInFeatureExtensionsView, BuiltInThemesExtensionsView, BuiltInProgrammingLanguageExtensionsView, ServerInstalledExtensionsView, DefaultRecommendedExtensionsView, UntrustedWorkspaceUnsupportedExtensionsView, UntrustedWorkspacePartiallySupportedExtensionsView, VirtualWorkspaceUnsupportedExtensionsView, VirtualWorkspacePartiallySupportedExtensionsView, DefaultPopularExtensionsView, DeprecatedExtensionsView, SearchMarketplaceExtensionsView, RecentlyUpdatedExtensionsView, OutdatedExtensionsView, DefaultKylinIDETeamExtensionsView, DefaultKylinIDETeamExtensionsViewTitle } from 'vs/workbench/contrib/extensions/browser/extensionsViews'; import { IProgressService, ProgressLocation } from 'vs/platform/progress/common/progress'; import { IEditorGroupsService } from 'vs/workbench/services/editor/common/editorGroupsService'; import Severity from 'vs/base/common/severity'; @@ -229,6 +229,22 @@ export class ExtensionsViewletViewsContribution implements IWorkbenchContributio canToggleVisibility: false }); + /* + * Default kylinIdeTeam extensions view + * When user has installed extensions, this is shown along with the views for enabled & disabled extensions + * When user has no installed extensions, this is shown along with the view for kylinIdeTeam extensions + */ + viewDescriptors.push({ + id: WORKSPACE_KYLINIDETEAM_VIEW_ID, + name: DefaultKylinIDETeamExtensionsViewTitle, + ctorDescriptor: new SyncDescriptor(DefaultKylinIDETeamExtensionsView, [{ flexibleHeight: true }]), + when: ContextKeyExpr.and(DefaultViewsContext, CONTEXT_HAS_GALLERY), + hideByDefault: false, + weight: 60, + order: 2, + canToggleVisibility: true + }); + /* * Default recommended extensions view * When user has installed extensions, this is shown along with the views for enabled & disabled extensions diff --git a/src/vs/workbench/contrib/extensions/browser/extensionsViews.ts b/src/vs/workbench/contrib/extensions/browser/extensionsViews.ts index 64d33c31..1e32bf2f 100644 --- a/src/vs/workbench/contrib/extensions/browser/extensionsViews.ts +++ b/src/vs/workbench/contrib/extensions/browser/extensionsViews.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { localize } from 'vs/nls'; +import { localize, localize2 } from 'vs/nls'; import { Disposable, DisposableStore, toDisposable } from 'vs/base/common/lifecycle'; import { Event, Emitter } from 'vs/base/common/event'; import { isCancellationError, getErrorMessage } from 'vs/base/common/errors'; @@ -18,7 +18,7 @@ import { IContextMenuService } from 'vs/platform/contextview/browser/contextView import { append, $ } from 'vs/base/browser/dom'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; import { Delegate, Renderer, IExtensionsViewState } from 'vs/workbench/contrib/extensions/browser/extensionsList'; -import { ExtensionState, IExtension, IExtensionsWorkbenchService, IWorkspaceRecommendedExtensionsView } from 'vs/workbench/contrib/extensions/common/extensions'; +import { ExtensionState, IExtension, IExtensionsWorkbenchService, IWorkspaceKylinIDETeamExtensionsView, IWorkspaceRecommendedExtensionsView } from 'vs/workbench/contrib/extensions/common/extensions'; import { Query } from 'vs/workbench/contrib/extensions/common/extensionQuery'; import { IExtensionService, toExtension } from 'vs/workbench/services/extensions/common/extensions'; import { IThemeService } from 'vs/platform/theme/common/themeService'; @@ -55,6 +55,7 @@ import { HoverPosition } from 'vs/base/browser/ui/hover/hoverWidget'; import { ILogService } from 'vs/platform/log/common/log'; import { isOfflineError } from 'vs/base/parts/request/common/request'; import { defaultCountBadgeStyles } from 'vs/platform/theme/browser/defaultStyles'; +import { ILocalizedString } from 'vs/platform/action/common/action'; // Extensions that are automatically classified as Programming Language extensions, but should be Feature extensions const FORCE_FEATURE_EXTENSIONS = ['vscode.git', 'vscode.git-base', 'vscode.search-result']; @@ -352,6 +353,10 @@ export class ExtensionsListView extends ViewPane { query.value = query.value.replace('@recentlyPublished', ''); options.sortBy = !options.sortBy ? GallerySortBy.PublishedDate : options.sortBy; } + else if (ExtensionsListView.isSearchKylinIDETeamQuery(query.value)) { + query.value = query.value.replace('@kylinIDETeam', ''); + options.sortBy = !options.sortBy ? GallerySortBy.InstallCount : options.sortBy; + } const galleryQueryOptions: IGalleryQueryOptions = { ...options, sortBy: isLocalSortBy(options.sortBy) ? undefined : options.sortBy }; const model = await this.queryGallery(query, galleryQueryOptions, token); @@ -1183,6 +1188,10 @@ export class ExtensionsListView extends ViewPane { return /@sort:updateDate/i.test(query); } + static isSearchKylinIDETeamQuery(query: string): boolean { + return /@kylinIDETeam:/i.test(query); + } + override focus(): void { super.focus(); if (!this.list) { @@ -1347,6 +1356,84 @@ export class SearchMarketplaceExtensionsView extends ExtensionsListView { } } +export const DefaultKylinIDETeamExtensionsViewTitle: ILocalizedString = localize2('kylinIdeTeamExtensions', "Kylin-Code Recommended"); +export class DefaultKylinIDETeamExtensionsView extends ExtensionsListView implements IWorkspaceKylinIDETeamExtensionsView { + private readonly kylinIDETeamExtensionsQuery = '@kylinIDETeam:"kylinidedev kylinidedevcooperator"'; + private kylinIdeTeamExtensions: IExtension[] = []; + private category: string = ''; + + protected override renderBody(container: HTMLElement): void { + super.renderBody(container); + } + + override async show(query: string, refresh?: boolean): Promise> { + //query is include @sort,then reset query + let flag = false; + if (query && query.trim().startsWith('@sort')) { + flag = true; + } + + // title + if ((!query && flag) || refresh || !this.category) { + super.updateTitle(DefaultKylinIDETeamExtensionsViewTitle.value); + } else { + super.updateTitle(`${DefaultKylinIDETeamExtensionsViewTitle.value}:${this.category}`); + } + + // search + let queryString: string = ''; + if (query && query.trim().startsWith('@sort')) { + queryString = this.kylinIDETeamExtensionsQuery + ' ' + query.trim(); + } else if (query && query.trim().startsWith('@kylinIDETeam')) { + queryString = query.trim(); + } else { + queryString = this.kylinIDETeamExtensionsQuery; + } + // const queryString = (query && !flag) ? query.trim() : this.kylinIDETeamExtensionsQuery; + const model = await super.show(queryString); + + // Expanded + // if (!this.extensionsWorkbenchService.local.some(e => !e.isBuiltin)) { + // this.setExpanded(model.length > 0); + // } + // this.kylinIdeTeamExtensions assign + // if (model.length > 0) { + // this.kylinIdeTeamExtensions.length = 0; + // for (let i = 0; i < model.length; i++) { + // this.kylinIdeTeamExtensions.push(model.get(i)); + // } + // } + + this.category = ''; + return model; + } + + //filter kylinideTeamExtension + filterKylinIdeTeamExtensions(query: string, category: string): void { + this.category = category; + this.show(query); + } + + //install kylinIdeTeamExtensions + private async getInstallableKylinIdeTeamExtensions() { + const installed = (await this.extensionsWorkbenchService.queryLocal()) + .filter(l => l.enablementState !== EnablementState.DisabledByExtensionKind); // Filter extensions disabled by kind + return this.kylinIdeTeamExtensions.filter(item => installed.every(local => !areSameExtensions(item.identifier, local.identifier))); + } + + async installKylinIdeTeamExtensions(): Promise { + const installableKylinIdeTeamExtensions = await this.getInstallableKylinIdeTeamExtensions(); + if (installableKylinIdeTeamExtensions.length) { + await this.extensionManagementService.installGalleryExtensions(installableKylinIdeTeamExtensions.map(i => ({ extension: i.gallery!, options: {} }))); + } else { + this.notificationService.notify({ + severity: Severity.Info, + message: localize('no local extensions', "There are no extensions to install.") + }); + } + } +} + export class DefaultRecommendedExtensionsView extends ExtensionsListView { private readonly recommendedExtensionsQuery = '@recommended:all'; diff --git a/src/vs/workbench/contrib/extensions/common/extensions.ts b/src/vs/workbench/contrib/extensions/common/extensions.ts index dcf8d469..21ee2b7c 100644 --- a/src/vs/workbench/contrib/extensions/common/extensions.ts +++ b/src/vs/workbench/contrib/extensions/common/extensions.ts @@ -32,6 +32,11 @@ export interface IWorkspaceRecommendedExtensionsView extends IView { installWorkspaceRecommendations(): Promise; } +export interface IWorkspaceKylinIDETeamExtensionsView extends IView { + installKylinIdeTeamExtensions(): Promise; + filterKylinIdeTeamExtensions(query: string, category: string): void; +} + export const enum ExtensionState { Installing, Installed, @@ -190,6 +195,7 @@ export class ExtensionContainers extends Disposable { } } +export const WORKSPACE_KYLINIDETEAM_VIEW_ID = 'workbench.views.extensions.kylinIdeTeam'; export const WORKSPACE_RECOMMENDATIONS_VIEW_ID = 'workbench.views.extensions.workspaceRecommendations'; export const OUTDATED_EXTENSIONS_VIEW_ID = 'workbench.views.extensions.searchOutdated'; export const TOGGLE_IGNORE_EXTENSION_ACTION_ID = 'workbench.extensions.action.toggleIgnoreExtension';