diff --git a/src/sql/platform/theme/common/colors.ts b/src/sql/platform/theme/common/colors.ts index 0e9cd3638b..3321dc3a42 100644 --- a/src/sql/platform/theme/common/colors.ts +++ b/src/sql/platform/theme/common/colors.ts @@ -21,4 +21,6 @@ export const tableBackground = registerColor('agent.tableBackground', { light: ' export const cellBackground = registerColor('agent.cellBackground', { light: '#faf5f8', dark: Color.black, hc: Color.black }, nls.localize('agentCellBackground', "SQL Agent table cell background color.")); export const tableHoverBackground = registerColor('agent.tableHoverColor', { light: '#dcdcdc', dark: '#444444', hc: null }, nls.localize('agentTableHoverBackground', "SQL Agent table hover background color.")); export const jobsHeadingBackground = registerColor('agent.jobsHeadingColor', { light: '#f4f4f4', dark: '#444444', hc: '#2b56f2' }, nls.localize('agentJobsHeadingColor', "SQL Agent heading background color.")); -export const cellBorderColor = registerColor('agent.cellBorderColor', { light: null, dark: null, hc: '#2b56f2' }, nls.localize('agentCellBorderColor', "SQL Agent table cell border color.")); \ No newline at end of file +export const cellBorderColor = registerColor('agent.cellBorderColor', { light: null, dark: null, hc: '#2b56f2' }, nls.localize('agentCellBorderColor', "SQL Agent table cell border color.")); + +export const resultsErrorColor = registerColor('results.error.color', { light: '#f44242', dark: '#f44242', hc: '#f44242' }, nls.localize('resultsErrorColor', "Results messages error color.")); diff --git a/src/sql/workbench/parts/query/browser/media/messagePanel.css b/src/sql/workbench/parts/query/browser/media/messagePanel.css index 91ab8c21f8..19d087eff2 100644 --- a/src/sql/workbench/parts/query/browser/media/messagePanel.css +++ b/src/sql/workbench/parts/query/browser/media/messagePanel.css @@ -37,10 +37,6 @@ cursor: pointer; } -.message-tree .error-message { - color: red; -} - .message-tree .batch-start:hover { color: red; } diff --git a/src/sql/workbench/parts/query/browser/messagePanel.ts b/src/sql/workbench/parts/query/browser/messagePanel.ts index ec08b694e2..56bb25f55c 100644 --- a/src/sql/workbench/parts/query/browser/messagePanel.ts +++ b/src/sql/workbench/parts/query/browser/messagePanel.ts @@ -16,7 +16,7 @@ import { IContextMenuService } from 'vs/platform/contextview/browser/contextView import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; import { Tree } from 'vs/base/parts/tree/browser/treeImpl'; import { attachListStyler } from 'vs/platform/theme/common/styler'; -import { IThemeService } from 'vs/platform/theme/common/themeService'; +import { IThemeService, ITheme } from 'vs/platform/theme/common/themeService'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; import { OpenMode, ClickBehavior, ICancelableEvent, IControllerOptions } from 'vs/base/parts/tree/browser/treeDefaults'; import { WorkbenchTreeController } from 'vs/platform/list/browser/listService'; @@ -26,9 +26,10 @@ import { IDisposable, dispose, Disposable } from 'vs/base/common/lifecycle'; import { IEditorService } from 'vs/workbench/services/editor/common/editorService'; import { ScrollbarVisibility } from 'vs/base/common/scrollable'; import { IClipboardService } from 'vs/platform/clipboard/common/clipboardService'; -import { $, Dimension } from 'vs/base/browser/dom'; +import { $, Dimension, createStyleSheet } from 'vs/base/browser/dom'; import { QueryEditor } from 'sql/workbench/parts/query/browser/queryEditor'; import { ICodeEditor } from 'vs/editor/browser/editorBrowser'; +import { resultsErrorColor } from 'sql/platform/theme/common/colors'; export interface IResultMessageIntern extends IQueryMessage { id?: string; @@ -68,12 +69,12 @@ export class MessagePanelState { } export class MessagePanel extends Disposable { - private messageLineCountMap = new Map(); private ds = new MessageDataSource(); - private renderer = new MessageRenderer(this.messageLineCountMap); + private renderer = new MessageRenderer(); private model = new Model(); private controller: MessageController; private container = $('.message-tree'); + private styleElement = createStyleSheet(this.container); private queryRunnerDisposables: IDisposable[] = []; private _state: MessagePanelState; @@ -103,6 +104,11 @@ export class MessagePanel extends Disposable { this.state.scrollPosition = expandableTree.getScrollPosition(); } }); + this.container.style.width = '100%'; + this.container.style.height = '100%'; + this._register(attachListStyler(this.tree, this.themeService)); + this._register(this.themeService.onThemeChange(this.applyStyles, this)); + this.applyStyles(this.themeService.getTheme()); this.controller.onKeyDown = (tree, event) => { if (event.ctrlKey) { let context: IMessagesActionContext = { @@ -155,9 +161,6 @@ export class MessagePanel extends Disposable { } public render(container: HTMLElement): void { - this.container.style.width = '100%'; - this.container.style.height = '100%'; - this._register(attachListStyler(this.tree, this.themeService)); container.appendChild(this.container); } @@ -215,6 +218,19 @@ export class MessagePanel extends Disposable { } } + private applyStyles(theme: ITheme): void { + const errorColor = theme.getColor(resultsErrorColor); + const content: string[] = []; + if (errorColor) { + content.push(`.message-tree .monaco-tree-rows .error-message { color: ${errorColor}; }`); + } + + const newStyles = content.join('\n'); + if (newStyles !== this.styleElement.innerHTML) { + this.styleElement.innerHTML = newStyles; + } + } + private reset() { this.model.messages = []; this.model.totalExecuteMessage = undefined; @@ -240,6 +256,14 @@ export class MessagePanel extends Disposable { public dispose() { dispose(this.queryRunnerDisposables); + if (this.container) { + this.container.remove(); + this.container = undefined; + } + if (this.styleElement) { + this.styleElement.remove(); + this.styleElement = undefined; + } super.dispose(); } } @@ -278,15 +302,11 @@ class MessageDataSource implements IDataSource { } class MessageRenderer implements IRenderer { - constructor(private messageLineCountMap: Map) { - } getHeight(tree: ITree, element: IQueryMessage): number { const lineHeight = 22; - if (this.messageLineCountMap.has(element)) { - return lineHeight * this.messageLineCountMap.get(element); - } - return lineHeight; + let lines = element.message.split('\n').length; + return lineHeight * lines; } getTemplateId(tree: ITree, element: IQueryMessage): string {