Skip to content

Commit

Permalink
fixup! Select created new files and folders in the navigator
Browse files Browse the repository at this point in the history
  • Loading branch information
vinokurig committed May 13, 2020
1 parent 4db7dad commit 2529b47
Show file tree
Hide file tree
Showing 7 changed files with 55 additions and 114 deletions.
6 changes: 0 additions & 6 deletions packages/core/src/browser/tree/tree-model.ts
Original file line number Diff line number Diff line change
Expand Up @@ -147,15 +147,13 @@ export class TreeModelImpl implements TreeModel, SelectionProvider<ReadonlyArray
@inject(TreeSearch) protected readonly treeSearch: TreeSearch;

protected readonly onChangedEmitter = new Emitter<void>();
protected readonly onNodesAddedEmitter = new Emitter<TreeNode[]>();
protected readonly onOpenNodeEmitter = new Emitter<TreeNode>();
protected readonly toDispose = new DisposableCollection();

@postConstruct()
protected init(): void {
this.toDispose.push(this.tree);
this.toDispose.push(this.tree.onChanged(() => this.fireChanged()));
this.toDispose.push(this.tree.onNodesAdded(nodes => this.onNodesAddedEmitter.fire(nodes)));

this.toDispose.push(this.selectionService);

Expand Down Expand Up @@ -201,10 +199,6 @@ export class TreeModelImpl implements TreeModel, SelectionProvider<ReadonlyArray
return this.onChangedEmitter.event;
}

get onNodesAdded(): Event<TreeNode[]> {
return this.onNodesAddedEmitter.event;
}

get onOpenNode(): Event<TreeNode> {
return this.onOpenNodeEmitter.event;
}
Expand Down
20 changes: 0 additions & 20 deletions packages/core/src/browser/tree/tree.ts
Original file line number Diff line number Diff line change
Expand Up @@ -37,11 +37,6 @@ export interface Tree extends Disposable {
* Emit when the tree is changed.
*/
readonly onChanged: Event<void>;

/**
* Emit when new nodes are added to the tree.
*/
readonly onNodesAdded: Event<TreeNode[]>;
/**
* Return a node for the given identifier or undefined if such does not exist.
*/
Expand Down Expand Up @@ -238,7 +233,6 @@ export class TreeImpl implements Tree {

protected _root: TreeNode | undefined;
protected readonly onChangedEmitter = new Emitter<void>();
protected readonly onNodesAddedEmitter = new Emitter<TreeNode[]>();
protected readonly onNodeRefreshedEmitter = new Emitter<CompositeTreeNode & WaitUntilEvent>();
protected readonly toDispose = new DisposableCollection();

Expand All @@ -253,7 +247,6 @@ export class TreeImpl implements Tree {
this.toDispose.push(this.onChangedEmitter);
this.toDispose.push(this.onNodeRefreshedEmitter);
this.toDispose.push(this.onDidChangeBusyEmitter);
this.toDispose.push(this.onNodesAddedEmitter);
}

dispose(): void {
Expand All @@ -276,10 +269,6 @@ export class TreeImpl implements Tree {
return this.onChangedEmitter.event;
}

get onNodesAdded(): Event<TreeNode[]> {
return this.onNodesAddedEmitter.event;
}

protected fireChanged(): void {
this.onChangedEmitter.fire(undefined);
}
Expand Down Expand Up @@ -325,12 +314,6 @@ export class TreeImpl implements Tree {
}

protected async setChildren(parent: CompositeTreeNode, children: TreeNode[]): Promise<CompositeTreeNode | undefined> {
const newNodes: TreeNode[] = [];
children.forEach(newNode => {
if (!parent.children.find(node => node.id === newNode.id)) {
newNodes.push(newNode);
}
});
const root = this.getRootNode(parent);
if (this.nodes[root.id] && this.nodes[root.id] !== root) {
console.error(`Child node '${parent.id}' does not belong to this '${root.id}' tree.`);
Expand All @@ -340,9 +323,6 @@ export class TreeImpl implements Tree {
parent.children = children;
this.addNode(parent);
await this.fireNodeRefreshed(parent);
if (newNodes.length > 0) {
this.onNodesAddedEmitter.fire(newNodes);
}
return parent;
}

Expand Down
60 changes: 27 additions & 33 deletions packages/navigator/src/browser/navigator-contribution.ts
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,12 @@ import {
MenuPath,
Mutable
} from '@theia/core/lib/common';
import { WorkspaceCommands, WorkspacePreferences, WorkspaceService } from '@theia/workspace/lib/browser';
import {
WorkspaceCommandContribution,
WorkspaceCommands,
WorkspacePreferences,
WorkspaceService
} from '@theia/workspace/lib/browser';
import { EXPLORER_VIEW_CONTAINER_ID, FILE_NAVIGATOR_ID, FileNavigatorWidget } from './navigator-widget';
import { FileNavigatorPreferences } from './navigator-preferences';
import { NavigatorKeybindingContexts } from './navigator-keybinding-context';
Expand All @@ -55,8 +60,9 @@ import {
import { FileSystemCommands } from '@theia/filesystem/lib/browser/filesystem-frontend-contribution';
import { NavigatorDiff, NavigatorDiffCommands } from './navigator-diff';
import { UriSelection } from '@theia/core/lib/common/selection';
import { FileChangeType, FileStatNode, FileSystemWatcher } from '@theia/filesystem/lib/browser';
import { CommandEvents } from '@theia/workspace/lib/browser/command-events';
import { DirNode } from '@theia/filesystem/lib/browser';
import { FileNavigatorModel } from './navigator-model';
import URI from '@theia/core/lib/common/uri';

export namespace FileNavigatorCommands {
export const REVEAL_IN_NAVIGATOR: Command = {
Expand Down Expand Up @@ -151,11 +157,8 @@ export class FileNavigatorContribution extends AbstractViewContribution<FileNavi
@inject(PreferenceService)
protected readonly preferenceService: PreferenceService;

@inject(FileSystemWatcher)
protected readonly watcher: FileSystemWatcher;

@inject(CommandEvents)
protected readonly commandEvents: CommandEvents;
@inject(WorkspaceCommandContribution)
protected readonly workspaceCommandContribution: WorkspaceCommandContribution;

constructor(
@inject(FileNavigatorPreferences) protected readonly fileNavigatorPreferences: FileNavigatorPreferences,
Expand Down Expand Up @@ -190,32 +193,23 @@ export class FileNavigatorContribution extends AbstractViewContribution<FileNavi
updateFocusContextKeys();
this.shell.activeChanged.connect(updateFocusContextKeys);
const widget = await this.widget;
const model = widget.model;
let addedResourceUri: string | undefined;
this.commandEvents.onNewFileCommand(uri => {
addedResourceUri = uri.toString();
});
this.commandEvents.onNewFolderCommand(uri => {
addedResourceUri = uri.toString();
});
model.onNodesAdded(async nodes => {
// Select created new file or folder.
const node = nodes[0];
if (nodes.length === 1 && SelectableTreeNode.is(node) && FileStatNode.is(node) && node.fileStat.uri.toString() === addedResourceUri) {
addedResourceUri = undefined;
model.selectNode(node);
}
});
this.watcher.onFilesChanged(changes => {
// Expand the parent of the created new file or folder.
const change = changes[0];
if (changes.length === 1 && change.type === FileChangeType.ADDED) {
const node = model.getNodesByUri(change.uri.parent).next().value;
if (change.uri.toString() === addedResourceUri && ExpandableTreeNode.is(node) && !node.expanded) {
model.expandNode(node);
}
const model: FileNavigatorModel = widget.model;
this.workspaceCommandContribution.onNewFileCommand(async uri => this.onDidCreateNewResource(uri, model));
this.workspaceCommandContribution.onNewFolderCommand(async uri => this.onDidCreateNewResource(uri, model));
}

private async onDidCreateNewResource(uri: URI, model: FileNavigatorModel): Promise<void> {
const parent = model.getNodesByUri(uri.parent).next().value;
if (DirNode.is(parent)) {
await model.refresh(parent);
if (ExpandableTreeNode.is(parent) && !parent.expanded) {
await model.expandNode(parent);
}
});
}
const node = model.getNodesByUri(uri).next().value;
if (SelectableTreeNode.is(node)) {
model.selectNode(node);
}
}

async onStart(app: FrontendApplication): Promise<void> {
Expand Down
2 changes: 0 additions & 2 deletions packages/navigator/src/browser/navigator-model.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -136,7 +136,6 @@ describe('FileNavigatorModel', () => {
const mockFileChangeEmitter: Emitter<FileChange[]> = new Emitter();
const mockFileMoveEmitter: Emitter<FileMoveEvent> = new Emitter();
const mockTreeChangeEmitter: Emitter<void> = new Emitter();
const mockNodesAddedEmitter: Emitter<TreeNode[]> = new Emitter();
const mockExpansionChangeEmitter: Emitter<Readonly<ExpandableTreeNode>> = new Emitter();

let navigatorModel: FileNavigatorModel;
Expand Down Expand Up @@ -189,7 +188,6 @@ describe('FileNavigatorModel', () => {
sinon.stub(mockFileSystemWatcher, 'onFilesChanged').value(mockFileChangeEmitter.event);
sinon.stub(mockFileSystemWatcher, 'onDidMove').value(mockFileMoveEmitter.event);
sinon.stub(mockFileNavigatorTree, 'onChanged').value(mockTreeChangeEmitter.event);
sinon.stub(mockFileNavigatorTree, 'onNodesAdded').value(mockNodesAddedEmitter.event);
sinon.stub(mockFileNavigatorTree, 'onDidChangeBusy').value(Event.None);
sinon.stub(mockTreeExpansionService, 'onExpansionChanged').value(mockExpansionChangeEmitter.event);

Expand Down
47 changes: 0 additions & 47 deletions packages/workspace/src/browser/command-events.ts

This file was deleted.

32 changes: 28 additions & 4 deletions packages/workspace/src/browser/workspace-commands.ts
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@ import { WorkspaceCompareHandler } from './workspace-compare-handler';
import { FileDownloadCommands } from '@theia/filesystem/lib/browser/download/file-download-command-contribution';
import { FileSystemCommands } from '@theia/filesystem/lib/browser/filesystem-frontend-contribution';
import { WorkspaceInputDialog } from './workspace-input-dialog';
import { CommandEvents } from './command-events';
import { Emitter, Event } from '@theia/core/lib/common';

const validFilename: (arg: string) => boolean = require('valid-filename');

Expand Down Expand Up @@ -185,7 +185,31 @@ export class WorkspaceCommandContribution implements CommandContribution {
@inject(WorkspaceDeleteHandler) protected readonly deleteHandler: WorkspaceDeleteHandler;
@inject(WorkspaceDuplicateHandler) protected readonly duplicateHandler: WorkspaceDuplicateHandler;
@inject(WorkspaceCompareHandler) protected readonly compareHandler: WorkspaceCompareHandler;
@inject(CommandEvents) protected readonly commandEvents: CommandEvents;

private readonly onDidCreateNewFileEmitter = new Emitter<URI>();
private readonly onDidCreateNewFolderEmitter = new Emitter<URI>();

/**
* Emit when the 'New File' command is clicked.
*/
get onNewFileCommand(): Event<URI> {
return this.onDidCreateNewFileEmitter.event;
}

/**
* Emit when the 'New Folder' command is clicked.
*/
get onNewFolderCommand(): Event<URI> {
return this.onDidCreateNewFolderEmitter.event;
}

fireNewFileCommand(uri: URI): void {
this.onDidCreateNewFileEmitter.fire(uri);
}

fireNewFolderCommand(uri: URI): void {
this.onDidCreateNewFolderEmitter.fire(uri);
}

registerCommands(registry: CommandRegistry): void {
this.openerService.getOpeners().then(openers => {
Expand Down Expand Up @@ -216,8 +240,8 @@ export class WorkspaceCommandContribution implements CommandContribution {
if (name) {
const fileUri = parentUri.resolve(name);
this.fileSystem.createFile(fileUri.toString()).then(async () => {
this.commandEvents.fireNewFileCommand(fileUri);
await open(this.openerService, fileUri);
this.fireNewFileCommand(fileUri);
});
}
});
Expand All @@ -238,8 +262,8 @@ export class WorkspaceCommandContribution implements CommandContribution {
await dialog.open().then(async name => {
if (name) {
const folderUri = parentUri.resolve(name);
this.commandEvents.fireNewFileCommand(folderUri);
await this.fileSystem.createFolder(parentUri.resolve(name).toString());
this.fireNewFileCommand(folderUri);
}
});
}
Expand Down
2 changes: 0 additions & 2 deletions packages/workspace/src/browser/workspace-frontend-module.ts
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,6 @@ import { WorkspaceDuplicateHandler } from './workspace-duplicate-handler';
import { WorkspaceUtils } from './workspace-utils';
import { WorkspaceCompareHandler } from './workspace-compare-handler';
import { DiffService } from './diff-service';
import { CommandEvents } from './command-events';

export default new ContainerModule((bind: interfaces.Bind, unbind: interfaces.Unbind, isBound: interfaces.IsBound, rebind: interfaces.Rebind) => {
bindWorkspacePreferences(bind);
Expand Down Expand Up @@ -90,5 +89,4 @@ export default new ContainerModule((bind: interfaces.Bind, unbind: interfaces.Un
bind(QuickOpenWorkspace).toSelf().inSingletonScope();

bind(WorkspaceUtils).toSelf().inSingletonScope();
bind(CommandEvents).toSelf().inSingletonScope();
});

0 comments on commit 2529b47

Please sign in to comment.