提交 006361a6 编写于 作者: B Benjamin Pasero

share one kind of label class

上级 84168a6e
......@@ -6,12 +6,14 @@
'use strict';
import uri from 'vs/base/common/uri';
import {getFileIconClasses} from 'vs/base/browser/ui/fileLabel/fileLabel';
import paths = require('vs/base/common/paths');
import {IconLabel, IIconLabelOptions} from 'vs/base/browser/ui/iconLabel/iconLabel';
import {IExtensionService} from 'vs/platform/extensions/common/extensions';
import {IModeService} from 'vs/editor/common/services/modeService';
import {IEditorInput} from 'vs/platform/editor/common/editor';
import {getResource} from 'vs/workbench/common/editor';
import {getPathLabel} from 'vs/base/common/labels';
import {IWorkspaceContextService} from 'vs/platform/workspace/common/workspace';
export interface IEditorLabel {
name: string;
......@@ -19,13 +21,18 @@ export interface IEditorLabel {
resource?: uri;
}
export class EditorLabel extends IconLabel {
export interface IResourceLabelOptions extends IIconLabelOptions {
isFolder?: boolean;
}
export class ResourceLabel extends IconLabel {
private label: IEditorLabel;
private options: IIconLabelOptions;
private options: IResourceLabelOptions;
constructor(
container: HTMLElement,
@IExtensionService private extensionService: IExtensionService,
@IWorkspaceContextService protected contextService: IWorkspaceContextService,
@IModeService private modeService: IModeService
) {
super(container);
......@@ -35,15 +42,7 @@ export class EditorLabel extends IconLabel {
});
}
public setInput(input: IEditorInput, options?: IIconLabelOptions): void {
this.setLabel({
resource: getResource(input),
name: input.getName(),
description: input.getDescription()
}, options);
}
public setLabel(label: IEditorLabel, options?: IIconLabelOptions): void {
public setLabel(label: IEditorLabel, options?: IResourceLabelOptions): void {
this.label = label;
this.options = options;
......@@ -71,7 +70,7 @@ export class EditorLabel extends IconLabel {
title = resource.fsPath;
}
const extraClasses = getFileIconClasses(resource, path => this.modeService.getModeIdByFilenameOrFirstLine(path));
const extraClasses = this.getIconClasses(resource);
if (this.options && this.options.extraClasses) {
extraClasses.push(...this.options.extraClasses);
}
......@@ -85,4 +84,69 @@ export class EditorLabel extends IconLabel {
this.label = void 0;
this.options = void 0;
}
protected getIconClasses(arg1?: uri | string): string[] {
let path: string;
if (typeof arg1 === 'string') {
path = arg1;
} else if (arg1) {
path = arg1.fsPath;
}
const classes = (this.options && this.options.isFolder) ? ['folder-icon'] : ['file-icon'];
if (path) {
const basename = paths.basename(path);
const dotSegments = basename.split('.');
const name = dotSegments[0]; // file.txt => "file", .dockerfile => "", file.some.txt => "file"
if (name) {
classes.push(`${this.cssEscape(name.toLowerCase())}-name-file-icon`);
}
const extensions = dotSegments.splice(1);
if (extensions.length > 0) {
for (let i = 0; i < extensions.length; i++) {
classes.push(`${this.cssEscape(extensions.slice(i).join('.').toLowerCase())}-ext-file-icon`); // add each combination of all found extensions if more than one
}
}
const langId = this.modeService.getModeIdByFilenameOrFirstLine(path);
if (langId) {
classes.push(`${this.cssEscape(langId)}-lang-file-icon`);
}
}
return classes;
}
private cssEscape(val: string): string {
return val.replace(/\s/g, '\\$&'); // make sure to not introduce CSS classes from files that contain whitespace
}
}
export class EditorLabel extends ResourceLabel {
public setEditor(editor: IEditorInput, options?: IResourceLabelOptions): void {
this.setLabel({
resource: getResource(editor),
name: editor.getName(),
description: editor.getDescription()
}, options);
}
}
export interface IFileLabelOptions extends IResourceLabelOptions {
hidePath?: boolean;
}
export class FileLabel extends ResourceLabel {
public setFile(resource: uri, options: IFileLabelOptions = Object.create(null)): void {
this.setLabel({
resource,
name: paths.basename(resource.fsPath),
description: !options.hidePath ? getPathLabel(paths.dirname(resource.fsPath), this.contextService) : void 0
}, options);
}
}
\ No newline at end of file
......@@ -10,7 +10,7 @@ import errors = require('vs/base/common/errors');
import {IEditorGroup, getResource} from 'vs/workbench/common/editor';
import DOM = require('vs/base/browser/dom');
import {TitleControl} from 'vs/workbench/browser/parts/editor/titleControl';
import {EditorLabel} from 'vs/workbench/browser/parts/editor/editorLabel';
import {EditorLabel} from 'vs/workbench/browser/labels';
export class NoTabsTitleControl extends TitleControl {
private titleContainer: HTMLElement;
......
......@@ -15,7 +15,7 @@ import {Position, IEditorInput} from 'vs/platform/editor/common/editor';
import {IEditorGroup, IEditorIdentifier, asFileEditorInput, getResource} from 'vs/workbench/common/editor';
import {StandardKeyboardEvent} from 'vs/base/browser/keyboardEvent';
import {KeyCode} from 'vs/base/common/keyCodes';
import {EditorLabel} from 'vs/workbench/browser/parts/editor/editorLabel';
import {EditorLabel} from 'vs/workbench/browser/labels';
import {ActionBar} from 'vs/base/browser/ui/actionbar/actionbar';
import {IConfigurationService} from 'vs/platform/configuration/common/configuration';
import {IWorkbenchEditorService} from 'vs/workbench/services/editor/common/editorService';
......
......@@ -4,16 +4,8 @@
*--------------------------------------------------------------------------------------------*/
'use strict';
import uri from 'vs/base/common/uri';
import paths = require('vs/base/common/paths');
import {EditorDescriptor} from 'vs/workbench/browser/parts/editor/baseEditor';
import {IFileEditorDescriptor} from 'vs/workbench/parts/files/common/files';
import {getFileIconClasses} from 'vs/base/browser/ui/fileLabel/fileLabel';
import {IconLabel, IIconLabelOptions} from 'vs/base/browser/ui/iconLabel/iconLabel';
import {IExtensionService} from 'vs/platform/extensions/common/extensions';
import {IModeService} from 'vs/editor/common/services/modeService';
import {getPathLabel} from 'vs/base/common/labels';
import {IWorkspaceContextService} from 'vs/platform/workspace/common/workspace';
/**
* A lightweight descriptor of an editor for files. Optionally allows to specify a list of mime types the editor
......@@ -32,75 +24,4 @@ export class FileEditorDescriptor extends EditorDescriptor implements IFileEdito
public getMimeTypes(): string[] {
return this.mimetypes;
}
}
export interface IFileIconLabelOptions extends IIconLabelOptions {
hidePath?: boolean;
isFolder?: boolean;
}
export class FileLabel extends IconLabel {
private file: uri;
private options: IFileIconLabelOptions;
constructor(
container: HTMLElement,
@IExtensionService private extensionService: IExtensionService,
@IWorkspaceContextService private contextService: IWorkspaceContextService,
@IModeService private modeService: IModeService
) {
super(container);
this.extensionService.onReady().then(() => {
this.render(); // there can be additional modes once the extension host is ready so we need to render again
});
}
public setFile(resource: uri, options?: IFileIconLabelOptions): void {
this.file = resource;
this.options = options;
this.render();
}
public clear(): void {
this.file = void 0;
this.options = void 0;
this.setValue();
}
private render(): void {
if (!this.file) {
return;
}
const label = paths.basename(this.file.fsPath);
let description: string;
if (!this.options || !this.options.hidePath) {
description = getPathLabel(paths.dirname(this.file.fsPath), this.contextService);
}
let title = '';
if (this.options && this.options.title) {
title = this.options.title;
} else if (this.file) {
title = this.file.fsPath;
}
const extraClasses = getFileIconClasses(this.file, path => this.modeService.getModeIdByFilenameOrFirstLine(path), this.options && this.options.isFolder);
if (this.options && this.options.extraClasses) {
extraClasses.push(...this.options.extraClasses);
}
const italic = this.options && this.options.italic;
this.setValue(label, description, { title, extraClasses, italic });
}
public dispose(): void {
this.file = void 0;
this.options = void 0;
}
}
\ No newline at end of file
......@@ -21,7 +21,7 @@ import {InputBox} from 'vs/base/browser/ui/inputbox/inputBox';
import {$, Builder} from 'vs/base/browser/builder';
import platform = require('vs/base/common/platform');
import glob = require('vs/base/common/glob');
import {FileLabel} from 'vs/workbench/parts/files/browser/files';
import {FileLabel} from 'vs/workbench/browser/labels';
import {IDisposable} from 'vs/base/common/lifecycle';
import {ContributableActionProvider} from 'vs/workbench/browser/actionBarRegistry';
import {LocalFileChangeEvent, IFilesConfiguration, ITextFileService} from 'vs/workbench/parts/files/common/files';
......
......@@ -8,7 +8,7 @@ import uri from 'vs/base/common/uri';
import errors = require('vs/base/common/errors');
import {TPromise} from 'vs/base/common/winjs.base';
import {IAction} from 'vs/base/common/actions';
import {EditorLabel} from 'vs/workbench/browser/parts/editor/editorLabel';
import {EditorLabel} from 'vs/workbench/browser/labels';
import treedefaults = require('vs/base/parts/tree/browser/treeDefaults');
import {IDataSource, ITree, IAccessibilityProvider, IDragAndDropData, IDragOverReaction, DRAG_OVER_ACCEPT, DRAG_OVER_REJECT, ContextMenuEvent, IRenderer} from 'vs/base/parts/tree/browser/tree';
import {ExternalElementsDragAndDropData, ElementsDragAndDropData, DesktopDragAndDropData} from 'vs/base/parts/tree/browser/treeDnd';
......@@ -178,7 +178,7 @@ export class Renderer implements IRenderer {
private renderOpenEditor(tree: ITree, editor: OpenEditor, templateData: IOpenEditorTemplateData): void {
editor.isDirty() ? dom.addClass(templateData.container, 'dirty') : dom.removeClass(templateData.container, 'dirty');
templateData.root.setInput(editor.editorInput, { italic: editor.isPreview(), extraClasses: ['open-editor'] });
templateData.root.setEditor(editor.editorInput, { italic: editor.isPreview(), extraClasses: ['open-editor'] });
templateData.actionBar.context = { group: editor.editorGroup, editor: editor.editorInput };
}
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册