diff --git a/src/vs/base/common/comparers.ts b/src/vs/base/common/comparers.ts index ea4209ebee7297eb198564905f8e07bae58fa3ab..94109915eb788429d4ef714ab72e9a174c91bb68 100644 --- a/src/vs/base/common/comparers.ts +++ b/src/vs/base/common/comparers.ts @@ -7,10 +7,41 @@ import scorer = require('vs/base/common/scorer'); import strings = require('vs/base/common/strings'); -const FileNameComparer = new Intl.Collator(undefined, { numeric: true, sensitivity: 'base' }); +let intlFileNameComparer: Intl.Collator; + +export function setFileNameComparer(collator: Intl.Collator): void { + intlFileNameComparer = collator; +} export function compareFileNames(one: string, other: string): number { - return FileNameComparer.compare(one || '', other || ''); + if (intlFileNameComparer) { + return intlFileNameComparer.compare(one || '', other || ''); + } + + return noIntlCompareFileNames(one, other); +} + +const FileNameMatch = /^([^.]*)(\.(.*))?$/; + +export function noIntlCompareFileNames(one: string, other: string): number { + let oneMatch = FileNameMatch.exec(one.toLowerCase()); + let otherMatch = FileNameMatch.exec(other.toLowerCase()); + + let oneName = oneMatch[1] || ''; + let oneExtension = oneMatch[3] || ''; + + let otherName = otherMatch[1] || ''; + let otherExtension = otherMatch[3] || ''; + + if (oneName !== otherName) { + return oneName < otherName ? -1 : 1; + } + + if (oneExtension === otherExtension) { + return 0; + } + + return oneExtension < otherExtension ? -1 : 1; } export function compareAnything(one: string, other: string, lookFor: string): number { diff --git a/src/vs/workbench/electron-browser/main.ts b/src/vs/workbench/electron-browser/main.ts index 4f2a20f0373089b05c0efc10358a4b60acae0a9a..f8ad40bec26ffe944bc9a478846afe5d2918c3df 100644 --- a/src/vs/workbench/electron-browser/main.ts +++ b/src/vs/workbench/electron-browser/main.ts @@ -12,6 +12,7 @@ import { IOptions } from 'vs/workbench/common/options'; import * as browser from 'vs/base/browser/browser'; import { domContentLoaded } from 'vs/base/browser/dom'; import errors = require('vs/base/common/errors'); +import comparer = require('vs/base/common/comparers'); import platform = require('vs/base/common/platform'); import paths = require('vs/base/common/paths'); import uri from 'vs/base/common/uri'; @@ -46,11 +47,15 @@ export interface IWindowConfiguration extends ParsedArgs, IOpenFileRequest { } export function startup(configuration: IWindowConfiguration): TPromise { + // Ensure others can listen to zoom level changes browser.setZoomFactor(webFrame.getZoomFactor()); browser.setZoomLevel(webFrame.getZoomLevel()); browser.setFullscreen(!!configuration.fullscreen); + // Setup Intl + comparer.setFileNameComparer(new Intl.Collator(undefined, { numeric: true, sensitivity: 'base' })); + // Shell Options const filesToOpen = configuration.filesToOpen && configuration.filesToOpen.length ? toInputs(configuration.filesToOpen) : null; const filesToCreate = configuration.filesToCreate && configuration.filesToCreate.length ? toInputs(configuration.filesToCreate) : null;