提交 6dd175fd 编写于 作者: J Johannes Rieken

show message source in title, #21302

上级 253490c9
......@@ -13,6 +13,7 @@ import { Action } from 'vs/base/common/actions';
export interface IMessageWithAction {
message: string;
actions: Action[];
source?: string;
}
export interface IConfirmation {
......@@ -77,4 +78,4 @@ export interface IChoiceService {
choose(severity: Severity, message: string, options: string[], cancelId: number, modal?: boolean): TPromise<number>;
}
export import Severity = Severity;
\ No newline at end of file
export import Severity = Severity;
......@@ -9,32 +9,35 @@ import { IMessageService, IChoiceService } from 'vs/platform/message/common/mess
import Severity from 'vs/base/common/severity';
import { Action } from 'vs/base/common/actions';
import { TPromise as Promise } from 'vs/base/common/winjs.base';
import { MainThreadMessageServiceShape, MainContext, IExtHostContext } from '../node/extHost.protocol';
import * as vscode from 'vscode';
import { MainThreadMessageServiceShape, MainContext, IExtHostContext, MainThreadMessageOptions } from '../node/extHost.protocol';
import { extHostNamedCustomer } from "vs/workbench/api/electron-browser/extHostCustomers";
import { IExtensionService } from "vs/platform/extensions/common/extensions";
@extHostNamedCustomer(MainContext.MainThreadMessageService)
export class MainThreadMessageService implements MainThreadMessageServiceShape {
constructor(
extHostContext: IExtHostContext,
@IMessageService private _messageService: IMessageService,
@IChoiceService private _choiceService: IChoiceService
@IExtensionService private readonly _extensionService: IExtensionService,
@IMessageService private readonly _messageService: IMessageService,
@IChoiceService private readonly _choiceService: IChoiceService
) {
//
}
public dispose(): void {
dispose(): void {
//
}
$showMessage(severity: Severity, message: string, options: vscode.MessageOptions, commands: { title: string; isCloseAffordance: boolean; handle: number; }[]): Thenable<number> {
$showMessage(severity: Severity, message: string, options: MainThreadMessageOptions, commands: { title: string; isCloseAffordance: boolean; handle: number; }[]): Thenable<number> {
if (options.modal) {
return this.showModalMessage(severity, message, commands);
return this._showModalMessage(severity, message, commands);
} else {
return this.showMessage(severity, message, commands);
return this._showMessage(severity, message, commands, options.extensionId);
}
}
private showMessage(severity: Severity, message: string, commands: { title: string; isCloseAffordance: boolean; handle: number; }[]): Thenable<number> {
private _showMessage(severity: Severity, message: string, commands: { title: string; isCloseAffordance: boolean; handle: number; }[], extensionId: string): Thenable<number> {
return new Promise<number>(resolve => {
......@@ -68,12 +71,13 @@ export class MainThreadMessageService implements MainThreadMessageServiceShape {
messageHide = this._messageService.show(severity, {
message,
actions
actions,
source: extensionId
});
});
}
private showModalMessage(severity: Severity, message: string, commands: { title: string; isCloseAffordance: boolean; handle: number; }[]): Thenable<number> {
private _showModalMessage(severity: Severity, message: string, commands: { title: string; isCloseAffordance: boolean; handle: number; }[]): Thenable<number> {
let cancelId: number | undefined = void 0;
const options = commands.map((command, index) => {
......
......@@ -325,13 +325,13 @@ export function createApiFactory(
return extHostTerminalService.onDidCloseTerminal(listener, thisArg, disposables);
},
showInformationMessage(message, first, ...rest) {
return extHostMessageService.showMessage(Severity.Info, message, first, rest);
return extHostMessageService.showMessage(extension.id, Severity.Info, message, first, rest);
},
showWarningMessage(message, first, ...rest) {
return extHostMessageService.showMessage(Severity.Warning, message, first, rest);
return extHostMessageService.showMessage(extension.id, Severity.Warning, message, first, rest);
},
showErrorMessage(message, first, ...rest) {
return extHostMessageService.showMessage(Severity.Error, message, first, rest);
return extHostMessageService.showMessage(extension.id, Severity.Error, message, first, rest);
},
showQuickPick(items: any, options: vscode.QuickPickOptions, token?: vscode.CancellationToken) {
return extHostQuickOpen.showQuickPick(items, options, token);
......@@ -366,7 +366,7 @@ export function createApiFactory(
},
// proposed API
sampleFunction: proposedApiFunction(extension, () => {
return extHostMessageService.showMessage(Severity.Info, 'Hello Proposed Api!', {}, []);
return extHostMessageService.showMessage(extension.id, Severity.Info, 'Hello Proposed Api!', {}, []);
}),
};
......
......@@ -222,8 +222,13 @@ export interface MainThreadLanguagesShape extends IDisposable {
$getLanguages(): TPromise<string[]>;
}
export interface MainThreadMessageOptions {
extensionId?: string;
modal?: boolean;
}
export interface MainThreadMessageServiceShape extends IDisposable {
$showMessage(severity: Severity, message: string, options: vscode.MessageOptions, commands: { title: string; isCloseAffordance: boolean; handle: number; }[]): Thenable<number>;
$showMessage(severity: Severity, message: string, options: MainThreadMessageOptions, commands: { title: string; isCloseAffordance: boolean; handle: number; }[]): Thenable<number>;
}
export interface MainThreadOutputServiceShape extends IDisposable {
......
......@@ -6,22 +6,13 @@
import Severity from 'vs/base/common/severity';
import vscode = require('vscode');
import { MainContext, MainThreadMessageServiceShape, IMainContext } from './extHost.protocol';
import { MainContext, MainThreadMessageServiceShape, MainThreadMessageOptions, IMainContext } from './extHost.protocol';
const emptyMessageOptions: vscode.MessageOptions = Object.create(null);
function isMessageItem<T>(item: any): item is vscode.MessageItem {
return item && item.title;
}
function parseMessageArguments(first: vscode.MessageOptions | string | vscode.MessageItem, rest: (string | vscode.MessageItem)[]): { options: vscode.MessageOptions; items: (string | vscode.MessageItem)[]; } {
if (typeof first === 'string' || isMessageItem(first)) {
return { options: emptyMessageOptions, items: [first, ...rest] };
} else {
return { options: first || emptyMessageOptions, items: rest };
}
}
export class ExtHostMessageService {
private _proxy: MainThreadMessageServiceShape;
......@@ -30,10 +21,20 @@ export class ExtHostMessageService {
this._proxy = mainContext.get(MainContext.MainThreadMessageService);
}
showMessage(severity: Severity, message: string, optionsOrFirstItem: vscode.MessageOptions | string, rest: string[]): Thenable<string | undefined>;
showMessage(severity: Severity, message: string, optionsOrFirstItem: vscode.MessageOptions | vscode.MessageItem, rest: vscode.MessageItem[]): Thenable<vscode.MessageItem | undefined>;
showMessage(severity: Severity, message: string, optionsOrFirstItem: vscode.MessageOptions | string | vscode.MessageItem, rest: (string | vscode.MessageItem)[]): Thenable<string | vscode.MessageItem | undefined> {
const { options, items } = parseMessageArguments(optionsOrFirstItem, rest);
showMessage(extensionId: string, severity: Severity, message: string, optionsOrFirstItem: vscode.MessageOptions | string, rest: string[]): Thenable<string | undefined>;
showMessage(extensionId: string, severity: Severity, message: string, optionsOrFirstItem: vscode.MessageOptions | vscode.MessageItem, rest: vscode.MessageItem[]): Thenable<vscode.MessageItem | undefined>;
showMessage(extensionId: string, severity: Severity, message: string, optionsOrFirstItem: vscode.MessageOptions | string | vscode.MessageItem, rest: (string | vscode.MessageItem)[]): Thenable<string | vscode.MessageItem | undefined> {
let options: MainThreadMessageOptions = { extensionId };
let items: (string | vscode.MessageItem)[];
if (typeof optionsOrFirstItem === 'string' || isMessageItem(optionsOrFirstItem)) {
items = [optionsOrFirstItem, ...rest];
} else {
options.modal = optionsOrFirstItem.modal;
items = rest;
}
const commands: { title: string; isCloseAffordance: boolean; handle: number; }[] = [];
for (let handle = 0; handle < items.length; handle++) {
......
......@@ -35,11 +35,13 @@ export enum Severity {
export interface IMessageWithAction {
message: string;
actions: Action[];
source: string;
}
interface IMessageEntry {
id: any;
text: string;
source: string;
severity: Severity;
time: number;
count?: number;
......@@ -199,6 +201,7 @@ export class MessageList {
severity: severity,
time: Date.now(),
actions: (<IMessageWithAction>id).actions,
source: (<IMessageWithAction>id).source,
onHide
});
......@@ -339,7 +342,10 @@ export class MessageList {
className: 'message-left-side',
});
$(messageContentElement as HTMLElement).title(messageContentElement.textContent).appendTo(div);
// Hover title
const title = message.source ? `[${message.source}] ${messageContentElement.textContent}` : messageContentElement.textContent;
$(messageContentElement as HTMLElement).title(title).appendTo(div);
});
});
}
......
......@@ -14,7 +14,7 @@ suite('ExtHostMessageService', function () {
test('propagte handle on select', function () {
let service = new MainThreadMessageService(null, <any>{
let service = new MainThreadMessageService(null, null, <any>{
show(sev: number, m: { message; actions: Action[] }) {
assert.equal(m.actions.length, 1);
setImmediate(() => m.actions[0].run());
......@@ -34,7 +34,7 @@ suite('ExtHostMessageService', function () {
test('isCloseAffordance', function () {
let actions: Action[];
let service = new MainThreadMessageService(null, <any>{
let service = new MainThreadMessageService(null, null, <any>{
show(sev: number, m: { message; actions: Action[] }) {
actions = m.actions;
}
......@@ -62,7 +62,7 @@ suite('ExtHostMessageService', function () {
let actions: Action[];
let c: number;
let service = new MainThreadMessageService(null, <any>{
let service = new MainThreadMessageService(null, null, <any>{
show(sev: number, m: { message; actions: Action[] }) {
c = 0;
actions = m.actions;
......@@ -85,7 +85,7 @@ suite('ExtHostMessageService', function () {
suite('modal', () => {
test('calls choice service', () => {
const service = new MainThreadMessageService(null, <any>{
const service = new MainThreadMessageService(null, null, <any>{
show(sev: number, m: { message; actions: Action[] }) {
throw new Error('not implemented');
}
......@@ -105,7 +105,7 @@ suite('ExtHostMessageService', function () {
});
test('returns undefined when cancelled', () => {
const service = new MainThreadMessageService(null, <any>{
const service = new MainThreadMessageService(null, null, <any>{
show(sev: number, m: { message; actions: Action[] }) {
throw new Error('not implemented');
}
......@@ -121,7 +121,7 @@ suite('ExtHostMessageService', function () {
});
test('hides Cancel button when not needed', () => {
const service = new MainThreadMessageService(null, <any>{
const service = new MainThreadMessageService(null, null, <any>{
show(sev: number, m: { message; actions: Action[] }) {
throw new Error('not implemented');
}
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册