提交 960258c8 编写于 作者: I Isidor Nikolic

Merge pull request #1123 from Microsoft/isidorn/extensions-statusbar

Isidorn/extensions statusbar
......@@ -5,7 +5,7 @@
'use strict';
import nls = require('vs/nls');
import {IPluginDescription, IPluginService, IMessage, IPointListener, IActivationEventListener } from 'vs/platform/plugins/common/plugins';
import {IPluginDescription, IPluginService, IMessage, IPointListener, IActivationEventListener, IPluginStatus } from 'vs/platform/plugins/common/plugins';
import WinJS = require('vs/base/common/winjs.base');
import {IDisposable} from 'vs/base/common/lifecycle';
import Errors = require('vs/base/common/errors');
......@@ -111,6 +111,10 @@ export abstract class AbstractPluginService implements IPluginService {
return this.activatedPlugins[pluginId].exports;
}
public getPluginsStatus(): { [id: string]: IPluginStatus } {
return null;
}
public isActivated(pluginId:string): boolean {
return hasOwnProperty.call(this.activatedPlugins, pluginId);
}
......
......@@ -4,7 +4,7 @@
*--------------------------------------------------------------------------------------------*/
'use strict';
import {IPluginDescription, IMessage} from 'vs/platform/plugins/common/plugins';
import {IPluginDescription, IMessage, IPluginStatus} from 'vs/platform/plugins/common/plugins';
import {PluginsRegistry} from 'vs/platform/plugins/common/pluginsRegistry';
import WinJS = require('vs/base/common/winjs.base');
import {Remotable, IThreadService} from 'vs/platform/thread/common/thread';
......@@ -64,6 +64,7 @@ export class MainProcessPluginService extends AbstractPluginService {
private _telemetryService: ITelemetryService;
private _proxy: PluginHostPluginService;
private _isDev: boolean;
private _pluginsStatus: { [id: string]: IPluginStatus };
/**
* This class is constructed manually because it is a service, so it doesn't use any ctor injection
......@@ -83,8 +84,13 @@ export class MainProcessPluginService extends AbstractPluginService {
this._threadService = threadService;
this._telemetryService = telemetryService;
this._proxy = this._threadService.getRemotable(PluginHostPluginService);
this._pluginsStatus = {};
PluginsRegistry.handleExtensionPoints((severity, source, message) => {
if (!this._pluginsStatus[source]) {
this._pluginsStatus[source] = { messages: [] };
}
this._pluginsStatus[source].messages.push({ type: severity, source, message });
this.showMessage(severity, source, message);
});
}
......@@ -158,6 +164,10 @@ export class MainProcessPluginService extends AbstractPluginService {
}
}
public getPluginsStatus(): { [id: string]: IPluginStatus } {
return this._pluginsStatus;
}
// -- overwriting AbstractPluginService
protected _actualActivatePlugin(pluginDescription: IPluginDescription): WinJS.TPromise<ActivatedPlugin> {
......
......@@ -40,6 +40,10 @@ export interface IMessage {
source: string;
}
export interface IPluginStatus {
messages: IMessage[];
}
export interface IPluginService {
serviceId: ServiceIdentifier<any>;
activateByEvent(activationEvent:string): TPromise<any>;
......@@ -52,6 +56,7 @@ export interface IPluginService {
get(pluginId:string): any;
onReady(): TPromise<boolean>;
getPluginsStatus(): { [id: string]: IPluginStatus };
}
export var INSTANCE:IPluginService = null;
\ No newline at end of file
......@@ -5,6 +5,8 @@
import platform = require('vs/platform/platform');
import { registerSingleton } from 'vs/platform/instantiation/common/extensions';
import statusbar = require('vs/workbench/browser/parts/statusbar/statusbar');
import { ExtensionsStatusbarItem } from 'vs/workbench/parts/extensions/electron-browser/extensionsWidgets';
import { IGalleryService } from 'vs/workbench/parts/extensions/common/extensions';
import { GalleryService } from 'vs/workbench/parts/extensions/node/vsoGalleryService';
import { IWorkbenchContributionsRegistry, Extensions as WorkbenchExtensions } from 'vs/workbench/common/contributions';
......@@ -17,3 +19,10 @@ registerSingleton(IGalleryService, GalleryService);
(<IWorkbenchContributionsRegistry>platform.Registry.as(WorkbenchExtensions.Workbench)).registerWorkbenchContribution(
ExtensionsWorkbenchExtension
);
// Register Statusbar item
(<statusbar.IStatusbarRegistry>platform.Registry.as(statusbar.Extensions.Statusbar)).registerStatusbarItem(new statusbar.StatusbarItemDescriptor(
ExtensionsStatusbarItem,
statusbar.StatusbarAlignment.LEFT,
10 /* Low Priority */
));
\ No newline at end of file
......@@ -119,4 +119,17 @@
-moz-transform: none;
-o-transform: none;
transform: none;
}
/* Status bar */
.monaco-shell .extensions-statusbar {
cursor: pointer;
}
.monaco-shell .extensions-statusbar.warning::before {
color: yellow;
}
.monaco-shell .extensions-statusbar.error::before {
color: #FF9D00;
}
\ No newline at end of file
......@@ -6,6 +6,9 @@
import nls = require('vs/nls');
import { Promise } from 'vs/base/common/winjs.base';
import { Action } from 'vs/base/common/actions';
import Severity from 'vs/base/common/severity';
import { IPluginService, IPluginStatus } from 'vs/platform/plugins/common/plugins';
import { IMessageService } from 'vs/platform/message/common/message';
import { IExtensionsService } from 'vs/workbench/parts/extensions/common/extensions';
import { IQuickOpenService } from 'vs/workbench/services/quickopen/browser/quickOpenService';
......@@ -32,6 +35,43 @@ export class ListExtensionsAction extends Action {
}
}
export class ShowExtensionsStatusAction extends Action {
static ID = 'workbench.extensions.action.showExtensionsStatus';
static LABEL = nls.localize('showInstalledExtensions', "Show Extensions Status");
private status: { [id: string]: IPluginStatus };
constructor(
id: string,
label: string,
@IPluginService pluginService: IPluginService,
@IMessageService private messageService: IMessageService
) {
super(id, label, null, true);
pluginService.onReady().then(() => {
this.status = pluginService.getPluginsStatus();
});
}
public run(): Promise {
Object.keys(this.status).forEach(key => {
this.status[key].messages.forEach(m => {
if (m.type > Severity.Ignore) {
this.messageService.show(m.type, m.message);
}
});
});
return Promise.as(null);
}
protected isEnabled(): boolean {
return true;
}
}
export class InstallExtensionAction extends Action {
static ID = 'workbench.extensions.action.installExtension';
......
/*---------------------------------------------------------------------------------------------
* Copyright (c) Microsoft Corporation. All rights reserved.
* Licensed under the MIT License. See License.txt in the project root for license information.
*--------------------------------------------------------------------------------------------*/
import nls = require('vs/nls');
import Severity from 'vs/base/common/severity';
import errors = require('vs/base/common/errors');
import dom = require('vs/base/browser/dom');
import lifecycle = require('vs/base/common/lifecycle');
import statusbar = require('vs/workbench/browser/parts/statusbar/statusbar');
import { IPluginService } from 'vs/platform/plugins/common/plugins';
import { IQuickOpenService } from 'vs/workbench/services/quickopen/browser/quickOpenService';
var $ = dom.emmet;
export class ExtensionsStatusbarItem implements statusbar.IStatusbarItem {
private toDispose: lifecycle.IDisposable[];
private domNode: HTMLElement;
constructor(
@IPluginService pluginService: IPluginService,
@IQuickOpenService private quickOpenService: IQuickOpenService
) {
this.toDispose = [];
pluginService.onReady().then(() => {
const pluginsStatus = pluginService.getPluginsStatus();
Object.keys(pluginsStatus).forEach(key => {
const severity = pluginsStatus[key].messages.reduce((maxSeverity, message) => Math.max(maxSeverity, message.type), Severity.Ignore);
this.domNode.classList.add(Severity[severity].toLowerCase());
});
});
}
public render(container: HTMLElement): lifecycle.IDisposable {
this.domNode = dom.append(container, $('.extensions-statusbar octicon octicon-package'));
this.domNode.title = nls.localize('extensions', "Extensions"),
this.toDispose.push(dom.addDisposableListener(this.domNode, 'click', () => {
this.quickOpenService.show('>extensions: ').done(null, errors.onUnexpectedError);
}));
return {
dispose: () => lifecycle.disposeAll(this.toDispose)
};
}
}
......@@ -16,7 +16,7 @@ import { IWorkspaceContextService } from 'vs/workbench/services/workspace/common
import { ReloadWindowAction } from 'vs/workbench/electron-browser/actions';
import wbaregistry = require('vs/workbench/browser/actionRegistry');
import { SyncActionDescriptor } from 'vs/platform/actions/common/actions';
import { ListExtensionsAction, InstallExtensionAction, ListOutdatedExtensionsAction } from './extensionsActions';
import { ListExtensionsAction, ShowExtensionsStatusAction, InstallExtensionAction, ListOutdatedExtensionsAction } from './extensionsActions';
import { IQuickOpenRegistry, Extensions, QuickOpenHandlerDescriptor } from 'vs/workbench/browser/quickopen';
import ipc = require('ipc');
......@@ -45,6 +45,7 @@ export class ExtensionsWorkbenchExtension implements IWorkbenchContribution {
const extensionsCategory = nls.localize('extensionsCategory', "Extensions");
const actionRegistry = (<wbaregistry.IWorkbenchActionRegistry> platform.Registry.as(wbaregistry.Extensions.WorkbenchActions));
actionRegistry.registerWorkbenchAction(new SyncActionDescriptor(ListExtensionsAction, ListExtensionsAction.ID, ListExtensionsAction.LABEL), extensionsCategory);
actionRegistry.registerWorkbenchAction(new SyncActionDescriptor(ShowExtensionsStatusAction, ShowExtensionsStatusAction.ID, ShowExtensionsStatusAction.LABEL), extensionsCategory);
(<IQuickOpenRegistry>platform.Registry.as(Extensions.Quickopen)).registerQuickOpenHandler(
new QuickOpenHandlerDescriptor(
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册