Skip to content

Commit

Permalink
Merge remote-tracking branch 'origin/master' into alex/asar
Browse files Browse the repository at this point in the history
  • Loading branch information
alexdima committed Jan 29, 2018
2 parents f7f8e9c + 153c398 commit f8d1683
Show file tree
Hide file tree
Showing 52 changed files with 833 additions and 462 deletions.
20 changes: 3 additions & 17 deletions build/gulpfile.vscode.js
Original file line number Diff line number Diff line change
Expand Up @@ -93,7 +93,7 @@ const BUNDLED_FILE_HEADER = [
' *--------------------------------------------------------*/'
].join('\n');

const languages = i18n.defaultLanguages.concat(process.env.VSCODE_QUALITY !== 'stable' ? i18n.extraLanguages: []);
const languages = i18n.defaultLanguages.concat(process.env.VSCODE_QUALITY !== 'stable' ? i18n.extraLanguages : []);

gulp.task('clean-optimized-vscode', util.rimraf('out-vscode'));
gulp.task('optimize-vscode', ['clean-optimized-vscode', 'compile-build', 'compile-extensions-build'], common.optimizeTask({
Expand Down Expand Up @@ -411,7 +411,7 @@ gulp.task('vscode-translations-push', function () {
gulp.src(pathToSetup).pipe(i18n.createXlfFilesForIsl()),
gulp.src(pathToExtensions).pipe(i18n.createXlfFilesForExtensions())
).pipe(i18n.findObsoleteResources(apiHostname, apiName, apiToken)
).pipe(i18n.pushXlfFiles(apiHostname, apiName, apiToken));
).pipe(i18n.pushXlfFiles(apiHostname, apiName, apiToken));
});

gulp.task('vscode-translations-push-test', function () {
Expand All @@ -424,7 +424,7 @@ gulp.task('vscode-translations-push-test', function () {
gulp.src(pathToSetup).pipe(i18n.createXlfFilesForIsl()),
gulp.src(pathToExtensions).pipe(i18n.createXlfFilesForExtensions())
).pipe(i18n.findObsoleteResources(apiHostname, apiName, apiToken)
).pipe(vfs.dest('../vscode-transifex-input'));
).pipe(vfs.dest('../vscode-transifex-input'));
});

gulp.task('vscode-translations-pull', function () {
Expand Down Expand Up @@ -599,17 +599,3 @@ gulp.task('generate-vscode-configuration', () => {
console.error(e.toString());
});
});

//#region Built-In Extensions
gulp.task('clean-builtin-extensions', util.rimraf('.build/builtInExtensions'));
gulp.task('download-builtin-extensions', ['clean-builtin-extensions'], function () {
const marketplaceExtensions = es.merge(...builtInExtensions.map(extension => {
return ext.fromMarketplace(extension.name, extension.version)
.pipe(rename(p => p.dirname = `${extension.name}/${p.dirname}`));
}));

return marketplaceExtensions
.pipe(util.setExecutableBit(['**/*.sh']))
.pipe(vfs.dest('.build/builtInExtensions'));
});
//#endregion
106 changes: 98 additions & 8 deletions build/lib/builtInExtensions.js
Original file line number Diff line number Diff line change
Expand Up @@ -7,26 +7,116 @@

const fs = require('fs');
const path = require('path');
const mkdirp = require('mkdirp');
const rimraf = require('rimraf');
const es = require('event-stream');
const rename = require('gulp-rename');
const vfs = require('vinyl-fs');
const ext = require('./extensions');
const util = require('gulp-util');

const root = path.dirname(path.dirname(__dirname));
const builtInExtensions = require('../builtInExtensions');
const controlFilePath = path.join(process.env['HOME'], '.vscode-oss-dev', 'extensions', 'control.json');

function getExtensionPath(extension) {
return path.join(root, '.build', 'builtInExtensions', extension.name);
}

function isUpToDate(extension) {
const packagePath = path.join(root, '.build', 'builtInExtensions', extension.name, 'package.json');
const packagePath = path.join(getExtensionPath(extension), 'package.json');

if (!fs.existsSync(packagePath)) {
return false;
}

const packageContents = fs.readFileSync(packagePath);

try {
const diskVersion = JSON.parse(packageContents).version;
return (diskVersion === extension.version);
} catch(err) {
} catch (err) {
return false;
}
}

const builtInExtensions = require('../builtInExtensions');
builtInExtensions.forEach((extension) => {
if (!isUpToDate(extension)) {
process.exit(1);
function syncMarketplaceExtension(extension) {
if (isUpToDate(extension)) {
util.log(util.colors.blue('[marketplace]'), `${extension.name}@${extension.version}`, util.colors.green('✔︎'));
return es.readArray([]);
}

rimraf.sync(getExtensionPath(extension));

return ext.fromMarketplace(extension.name, extension.version)
.pipe(rename(p => p.dirname = `${extension.name}/${p.dirname}`))
.pipe(vfs.dest('.build/builtInExtensions'))
.on('end', () => util.log(util.colors.blue('[marketplace]'), extension.name, util.colors.green('✔︎')));
}

function syncExtension(extension, controlState) {
switch (controlState) {
case 'disabled':
util.log(util.colors.blue('[disabled]'), util.colors.gray(extension.name));
rimraf.sync(getExtensionPath(extension));
return es.readArray([]);

case 'marketplace':
return syncMarketplaceExtension(extension);

default:
if (!fs.existsSync(controlState)) {
util.log(util.colors.red(`Error: Built-in extension '${extension.name}' is configured to run from '${controlState}' but that path does not exist.`));
return es.readArray([]);

} else if (!fs.existsSync(path.join(controlState, 'package.json'))) {
util.log(util.colors.red(`Error: Built-in extension '${extension.name}' is configured to run from '${controlState}' but there is no 'package.json' file in that directory.`));
return es.readArray([]);
}

util.log(util.colors.blue('[local]'), `${extension.name}: ${controlState}`, util.colors.green('✔︎'));
return es.readArray([]);
}
});
process.exit(0);
}

function readControlFile() {
try {
return JSON.parse(fs.readFileSync(controlFilePath, 'utf8'));
} catch (err) {
return {};
}
}

function writeControlFile(control) {
mkdirp.sync(path.dirname(controlFilePath));
fs.writeFileSync(controlFilePath, JSON.stringify(control, null, 2));
}

function main() {
util.log('Syncronizing built-in extensions...');
util.log('Control file:', controlFilePath);

const control = readControlFile();
const streams = [];

for (const extension of builtInExtensions) {
let controlState = control[extension.name] || 'marketplace';
control[extension.name] = controlState;

streams.push(syncExtension(extension, controlState));
}

writeControlFile(control);

es.merge(streams)
.on('error', err => {
console.error(err);
process.exit(1);
})
.on('end', () => {
util.log(`${streams.length} built-in extensions processed.`);
process.exit(0);
});
}

main();
3 changes: 1 addition & 2 deletions scripts/code.bat
Original file line number Diff line number Diff line change
Expand Up @@ -17,9 +17,8 @@ set CODE=".build\electron\%NAMESHORT%"
node build\lib\electron.js
if %errorlevel% neq 0 node .\node_modules\gulp\bin\gulp.js electron

:: Get built-in extensions
:: Sync built-in extensions
node build\lib\builtInExtensions.js
if %errorlevel% neq 0 node .\node_modules\gulp\bin\gulp.js download-builtin-extensions

:: Build
if not exist out node .\node_modules\gulp\bin\gulp.js compile
Expand Down
4 changes: 2 additions & 2 deletions scripts/code.sh
Original file line number Diff line number Diff line change
Expand Up @@ -24,8 +24,8 @@ function code() {
# Get electron
node build/lib/electron.js || ./node_modules/.bin/gulp electron

# Get built-in extensions
node build/lib/builtInExtensions.js || ./node_modules/.bin/gulp download-builtin-extensions
# Sync built-in extensions
node build/lib/builtInExtensions.js

# Build
test -d out || ./node_modules/.bin/gulp compile
Expand Down
6 changes: 6 additions & 0 deletions src/vs/base/browser/ui/list/list.ts
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,12 @@ export interface IRenderer<TElement, TTemplateData> {
disposeTemplate(templateData: TTemplateData): void;
}

export interface IListOpenEvent<T> {
elements: T[];
indexes: number[];
browserEvent?: UIEvent;
}

export interface IListEvent<T> {
elements: T[];
indexes: number[];
Expand Down
10 changes: 7 additions & 3 deletions src/vs/base/browser/ui/list/listPaging.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
import 'vs/css!./list';
import { IDisposable } from 'vs/base/common/lifecycle';
import { range } from 'vs/base/common/arrays';
import { IDelegate, IRenderer, IListEvent } from './list';
import { IDelegate, IRenderer, IListEvent, IListOpenEvent } from './list';
import { List, IListStyles, IListOptions } from './listWidget';
import { IPagedModel } from 'vs/base/common/paging';
import Event, { mapEvent } from 'vs/base/common/event';
Expand Down Expand Up @@ -97,6 +97,10 @@ export class PagedList<T> {
return mapEvent(this.list.onFocusChange, ({ elements, indexes }) => ({ elements: elements.map(e => this._model.get(e)), indexes }));
}

get onOpen(): Event<IListOpenEvent<T>> {
return mapEvent(this.list.onOpen, ({ elements, indexes, browserEvent }) => ({ elements: elements.map(e => this._model.get(e)), indexes, browserEvent }));
}

get onSelectionChange(): Event<IListEvent<T>> {
return mapEvent(this.list.onSelectionChange, ({ elements, indexes }) => ({ elements: elements.map(e => this._model.get(e)), indexes }));
}
Expand Down Expand Up @@ -126,8 +130,8 @@ export class PagedList<T> {
this.list.scrollTop = scrollTop;
}

open(indexes: number[]): void {
this.list.open(indexes);
open(indexes: number[], browserEvent?: UIEvent): void {
this.list.open(indexes, browserEvent);
}

setFocus(indexes: number[]): void {
Expand Down
44 changes: 34 additions & 10 deletions src/vs/base/browser/ui/list/listWidget.ts
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ import { KeyCode } from 'vs/base/common/keyCodes';
import { StandardKeyboardEvent } from 'vs/base/browser/keyboardEvent';
import Event, { Emitter, EventBufferer, chain, mapEvent, anyEvent } from 'vs/base/common/event';
import { domEvent } from 'vs/base/browser/event';
import { IDelegate, IRenderer, IListEvent, IListContextMenuEvent, IListMouseEvent, IListTouchEvent, IListGestureEvent } from './list';
import { IDelegate, IRenderer, IListEvent, IListContextMenuEvent, IListMouseEvent, IListTouchEvent, IListGestureEvent, IListOpenEvent } from './list';
import { ListView, IListViewOptions } from './listView';
import { Color } from 'vs/base/common/color';
import { mixin } from 'vs/base/common/objects';
Expand Down Expand Up @@ -261,6 +261,7 @@ function isInputElement(e: HTMLElement): boolean {
class KeyboardController<T> implements IDisposable {

private disposables: IDisposable[];
private openController: IOpenController;

constructor(
private list: List<T>,
Expand All @@ -270,6 +271,8 @@ class KeyboardController<T> implements IDisposable {
const multipleSelectionSupport = !(options.multipleSelectionSupport === false);
this.disposables = [];

this.openController = options.openController || DefaultOpenController;

const onKeyDown = chain(domEvent(view.domNode, 'keydown'))
.filter(e => !isInputElement(e.target as HTMLElement))
.map(e => new StandardKeyboardEvent(e));
Expand All @@ -290,7 +293,10 @@ class KeyboardController<T> implements IDisposable {
e.preventDefault();
e.stopPropagation();
this.list.setSelection(this.list.getFocus());
this.list.open(this.list.getFocus());

if (this.openController.shouldOpen(e.browserEvent)) {
this.list.open(this.list.getFocus(), e.browserEvent);
}
}

private onUpArrow(e: StandardKeyboardEvent): void {
Expand Down Expand Up @@ -357,10 +363,15 @@ const DefaultMultipleSelectionContoller = {
isSelectionRangeChangeEvent
};

const DefaultOpenController = {
shouldOpen: (event: UIEvent) => true
};

class MouseController<T> implements IDisposable {

private multipleSelectionSupport: boolean;
private multipleSelectionController: IMultipleSelectionController<T> | undefined;
private multipleSelectionController: IMultipleSelectionController<T>;
private openController: IOpenController;
private didJustPressContextMenuKey: boolean = false;
private disposables: IDisposable[] = [];

Expand Down Expand Up @@ -406,6 +417,8 @@ class MouseController<T> implements IDisposable {
this.multipleSelectionController = options.multipleSelectionController || DefaultMultipleSelectionContoller;
}

this.openController = options.openController || DefaultOpenController;

view.onMouseDown(this.onMouseDown, this, this.disposables);
view.onMouseClick(this.onPointer, this, this.disposables);
view.onMouseDblClick(this.onDoubleClick, this, this.disposables);
Expand Down Expand Up @@ -458,7 +471,10 @@ class MouseController<T> implements IDisposable {

if (this.options.selectOnMouseDown) {
this.list.setSelection([focus]);
this.list.open([focus]);

if (this.openController.shouldOpen(e.browserEvent)) {
this.list.open([focus], e.browserEvent);
}
}
}

Expand All @@ -470,7 +486,10 @@ class MouseController<T> implements IDisposable {
if (!this.options.selectOnMouseDown) {
const focus = this.list.getFocus();
this.list.setSelection(focus);
this.list.open(focus);

if (this.openController.shouldOpen(e.browserEvent)) {
this.list.open(focus, e.browserEvent);
}
}
}

Expand Down Expand Up @@ -523,6 +542,10 @@ export interface IMultipleSelectionController<T> {
isSelectionRangeChangeEvent(event: IListMouseEvent<T> | IListTouchEvent<T>): boolean;
}

export interface IOpenController {
shouldOpen(event: UIEvent): boolean;
}

export interface IListOptions<T> extends IListViewOptions, IListStyles {
identityProvider?: IIdentityProvider<T>;
ariaLabel?: string;
Expand All @@ -533,6 +556,7 @@ export interface IListOptions<T> extends IListViewOptions, IListStyles {
verticalScrollMode?: ScrollbarVisibility;
multipleSelectionSupport?: boolean;
multipleSelectionController?: IMultipleSelectionController<T>;
openController?: IOpenController;
}

export interface IListStyles {
Expand Down Expand Up @@ -708,9 +732,9 @@ export class List<T> implements ISpliceable<T>, IDisposable {

readonly onContextMenu: Event<IListContextMenuEvent<T>> = Event.None;

private _onOpen = new Emitter<number[]>();
@memoize get onOpen(): Event<IListEvent<T>> {
return mapEvent(this._onOpen.event, indexes => this.toListEvent({ indexes }));
private _onOpen = new Emitter<IListOpenEvent<T>>();
@memoize get onOpen(): Event<IListOpenEvent<T>> {
return this._onOpen.event;
}

private _onPin = new Emitter<number[]>();
Expand Down Expand Up @@ -973,8 +997,8 @@ export class List<T> implements ISpliceable<T>, IDisposable {
return this.view.domNode;
}

open(indexes: number[]): void {
this._onOpen.fire(indexes);
open(indexes: number[], browserEvent?: UIEvent): void {
this._onOpen.fire({ indexes, elements: indexes.map(i => this.view.element(i)), browserEvent });
}

pin(indexes: number[]): void {
Expand Down
Loading

0 comments on commit f8d1683

Please sign in to comment.