提交 bf79b494 编写于 作者: A Alex Dima

Clean up icon theme uri usage

上级 f7bdfb5e
......@@ -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;
......
......@@ -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<string> {
public ensureLoaded(fileService: IFileService): TPromise<string> {
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<IconThemeDocument> {
return pfs.readFile(fileSetPath).then(content => {
function _loadIconThemeDocument(fileService: IFileService, location: URI): TPromise<IconThemeDocument> {
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<IconThemeDocument
});
}
function _processIconThemeDocument(id: string, iconThemeDocumentPath: string, iconThemeDocument: IconThemeDocument): { content: string; hasFileIcons: boolean; hasFolderIcons: boolean; hidesExplorerArrows: boolean; } {
function _processIconThemeDocument(id: string, iconThemeDocumentLocation: URI, iconThemeDocument: IconThemeDocument): { content: string; hasFileIcons: boolean; hasFolderIcons: boolean; hidesExplorerArrows: boolean; } {
let result = { content: '', hasFileIcons: false, hasFolderIcons: false, hidesExplorerArrows: iconThemeDocument.hidesExplorerArrows };
......@@ -176,9 +178,9 @@ function _processIconThemeDocument(id: string, iconThemeDocumentPath: string, ic
}
let selectorByDefinitionId: { [def: string]: string[] } = {};
const iconThemeDocumentLocationDirname = resources.dirname(iconThemeDocumentLocation);
function resolvePath(path: string) {
const uri = URI.file(Paths.join(Paths.dirname(iconThemeDocumentPath), path));
return uri.toString();
return resources.joinPath(iconThemeDocumentLocationDirname, path);
}
function collectSelectors(associations: IconsAssociation, baseThemeClassName?: string) {
......
......@@ -8,6 +8,7 @@ import * as nls from 'vs/nls';
import * as types from 'vs/base/common/types';
import * as Paths from 'path';
import * as resources from 'vs/base/common/resources';
import { ExtensionsRegistry, ExtensionMessageCollector } from 'vs/workbench/services/extensions/common/extensionsRegistry';
import { ExtensionData, IThemeExtensionPoint } from 'vs/workbench/services/themes/common/workbenchThemeService';
import { IExtensionService } from 'vs/workbench/services/extensions/common/extensions';
......@@ -95,14 +96,13 @@ export class FileIconThemeStore {
));
return;
}
// TODO@extensionLocation
let normalizedAbsolutePath = Paths.normalize(Paths.join(extensionLocation.fsPath, iconTheme.path));
if (normalizedAbsolutePath.indexOf(Paths.normalize(extensionLocation.fsPath)) !== 0) {
collector.warn(nls.localize('invalid.path.1', "Expected `contributes.{0}.path` ({1}) to be included inside extension's folder ({2}). This might make the extension non-portable.", iconThemeExtPoint.name, normalizedAbsolutePath, extensionLocation.fsPath));
const iconThemeLocation = resources.joinPath(extensionLocation, iconTheme.path);
if (iconThemeLocation.path.indexOf(Paths.normalize(extensionLocation.path)) !== 0) {
collector.warn(nls.localize('invalid.path.1', "Expected `contributes.{0}.path` ({1}) to be included inside extension's folder ({2}). This might make the extension non-portable.", iconThemeExtPoint.name, iconThemeLocation.path, extensionLocation.path));
}
let themeData = FileIconThemeData.fromExtensionTheme(iconTheme, normalizedAbsolutePath, extensionData);
let themeData = FileIconThemeData.fromExtensionTheme(iconTheme, iconThemeLocation, extensionData);
this.knownIconThemes.push(themeData);
});
......
......@@ -31,6 +31,7 @@ import { FileIconThemeData } from 'vs/workbench/services/themes/electron-browser
import { IWindowService } from 'vs/platform/windows/common/windows';
import { removeClasses, addClasses } from 'vs/base/browser/dom';
import { IEnvironmentService } from 'vs/platform/environment/common/environment';
import { IFileService } from 'vs/platform/files/common/files';
// implementation
......@@ -70,6 +71,8 @@ export interface IColorCustomizations {
export class WorkbenchThemeService implements IWorkbenchThemeService {
_serviceBrand: any;
private fileService: IFileService;
private colorThemeStore: ColorThemeStore;
private currentColorTheme: ColorThemeData;
private container: HTMLElement;
......@@ -182,6 +185,10 @@ export class WorkbenchThemeService implements IWorkbenchThemeService {
});
}
acquireFileService(fileService: IFileService): void {
this.fileService = fileService;
}
public get onDidColorThemeChange(): Event<IColorTheme> {
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);
});
});
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册