diff --git a/src/vs/workbench/electron-browser/workbench.ts b/src/vs/workbench/electron-browser/workbench.ts index 36a23f6cc6ed21a53fa715d19b96cd06118cf160..eb99329ae51c44fc0142738e51a78505973fb193 100644 --- a/src/vs/workbench/electron-browser/workbench.ts +++ b/src/vs/workbench/electron-browser/workbench.ts @@ -111,6 +111,8 @@ import { IEditorService, IResourceEditor } from 'vs/workbench/services/editor/co import { IEditorGroupsService, GroupDirection, preferredSideBySideGroupDirection, GroupOrientation } from 'vs/workbench/services/group/common/editorGroupsService'; import { EditorService } from 'vs/workbench/services/editor/browser/editorService'; import { IExtensionUrlHandler, ExtensionUrlHandler } from 'vs/platform/url/electron-browser/inactiveExtensionUrlHandler'; +import { WorkbenchThemeService } from 'vs/workbench/services/themes/electron-browser/workbenchThemeService'; +import { IWorkbenchThemeService } from 'vs/workbench/services/themes/common/workbenchThemeService'; interface WorkbenchParams { configuration: IWindowConfiguration; @@ -236,6 +238,7 @@ export class Workbench extends Disposable implements IPartService { @IWorkspaceContextService private contextService: IWorkspaceContextService, @IStorageService private storageService: IStorageService, @IConfigurationService private configurationService: WorkspaceService, + @IWorkbenchThemeService private themeService: WorkbenchThemeService, @IEnvironmentService private environmentService: IEnvironmentService, @IWindowService private windowService: IWindowService, @INotificationService private notificationService: NotificationService @@ -375,6 +378,7 @@ export class Workbench extends Disposable implements IPartService { this.fileService = this.instantiationService.createInstance(RemoteFileService); serviceCollection.set(IFileService, this.fileService); this.configurationService.acquireFileService(this.fileService); + this.themeService.acquireFileService(this.fileService); // Editor and Group services const restorePreviousEditorState = !this.hasInitialFilesToOpen; diff --git a/src/vs/workbench/services/themes/electron-browser/fileIconThemeData.ts b/src/vs/workbench/services/themes/electron-browser/fileIconThemeData.ts index 5f233d3ea3d7977e2752a9bcaf09434c6fe83b86..263292f0dc7ae58c4def2c18d9bb12604903e022 100644 --- a/src/vs/workbench/services/themes/electron-browser/fileIconThemeData.ts +++ b/src/vs/workbench/services/themes/electron-browser/fileIconThemeData.ts @@ -7,11 +7,11 @@ import URI from 'vs/base/common/uri'; import * as nls from 'vs/nls'; import * as Paths from 'path'; +import * as resources from 'vs/base/common/resources'; import * as Json from 'vs/base/common/json'; import { ExtensionData, IThemeExtensionPoint, IFileIconTheme } from 'vs/workbench/services/themes/common/workbenchThemeService'; import { TPromise } from 'vs/base/common/winjs.base'; -import * as pfs from 'vs/base/node/pfs'; -import { WorkbenchThemeService } from 'vs/workbench/services/themes/electron-browser/workbenchThemeService'; +import { IFileService } from 'vs/platform/files/common/files'; import { getParseErrorMessage } from 'vs/base/common/jsonErrorMessages'; export class FileIconThemeData implements IFileIconTheme { @@ -23,7 +23,7 @@ export class FileIconThemeData implements IFileIconTheme { hasFolderIcons?: boolean; hidesExplorerArrows?: boolean; isLoaded: boolean; - path?: string; + location?: URI; extensionData: ExtensionData; styleSheetContent?: string; @@ -31,11 +31,11 @@ export class FileIconThemeData implements IFileIconTheme { private constructor() { } - public ensureLoaded(themeService: WorkbenchThemeService): TPromise { + public ensureLoaded(fileService: IFileService): TPromise { if (!this.isLoaded) { - if (this.path) { - return _loadIconThemeDocument(this.path).then(iconThemeDocument => { - let result = _processIconThemeDocument(this.id, this.path, iconThemeDocument); + if (this.location) { + return _loadIconThemeDocument(fileService, this.location).then(iconThemeDocument => { + let result = _processIconThemeDocument(this.id, this.location, iconThemeDocument); this.styleSheetContent = result.content; this.hasFileIcons = result.hasFileIcons; this.hasFolderIcons = result.hasFolderIcons; @@ -48,13 +48,13 @@ export class FileIconThemeData implements IFileIconTheme { return TPromise.as(this.styleSheetContent); } - static fromExtensionTheme(iconTheme: IThemeExtensionPoint, normalizedAbsolutePath: string, extensionData: ExtensionData): FileIconThemeData { + static fromExtensionTheme(iconTheme: IThemeExtensionPoint, location: URI, extensionData: ExtensionData): FileIconThemeData { let themeData = new FileIconThemeData(); themeData.id = extensionData.extensionId + '-' + iconTheme.id; themeData.label = iconTheme.label || Paths.basename(iconTheme.path); themeData.settingsId = iconTheme.id; themeData.description = iconTheme.description; - themeData.path = normalizedAbsolutePath; + themeData.location = location; themeData.extensionData = extensionData; themeData.isLoaded = false; return themeData; @@ -89,13 +89,15 @@ export class FileIconThemeData implements IFileIconTheme { case 'description': case 'settingsId': case 'extensionData': - case 'path': case 'styleSheetContent': case 'hasFileIcons': case 'hidesExplorerArrows': case 'hasFolderIcons': theme[key] = data[key]; break; + case 'location': + theme.location = URI.revive(data.location); + break; } } return theme; @@ -110,7 +112,7 @@ export class FileIconThemeData implements IFileIconTheme { label: this.label, description: this.description, settingsId: this.settingsId, - path: this.path, + location: this.location, styleSheetContent: this.styleSheetContent, hasFileIcons: this.hasFileIcons, hasFolderIcons: this.hasFolderIcons, @@ -156,10 +158,10 @@ interface IconThemeDocument extends IconsAssociation { hidesExplorerArrows?: boolean; } -function _loadIconThemeDocument(fileSetPath: string): TPromise { - return pfs.readFile(fileSetPath).then(content => { +function _loadIconThemeDocument(fileService: IFileService, location: URI): TPromise { + return fileService.resolveContent(location).then((content) => { let errors: Json.ParseError[] = []; - let contentValue = Json.parse(content.toString(), errors); + let contentValue = Json.parse(content.value.toString(), errors); if (errors.length > 0 || !contentValue) { return TPromise.wrapError(new Error(nls.localize('error.cannotparseicontheme', "Problems parsing file icons file: {0}", errors.map(e => getParseErrorMessage(e.error)).join(', ')))); } @@ -167,7 +169,7 @@ function _loadIconThemeDocument(fileSetPath: string): TPromise { return this.onColorThemeChange.event; } @@ -405,7 +412,7 @@ export class WorkbenchThemeService implements IWorkbenchThemeService { if (!iconThemeData) { iconThemeData = FileIconThemeData.noIconTheme(); } - return iconThemeData.ensureLoaded(this).then(_ => { + return iconThemeData.ensureLoaded(this.fileService).then(_ => { return _applyIconTheme(iconThemeData, onApply); }); });