From 82df8a6add52572f54884424a4f4b8048384502a Mon Sep 17 00:00:00 2001 From: Akos Kitta Date: Fri, 2 Aug 2019 16:21:32 +0200 Subject: [PATCH] PROEDITOR-27: Try to preserve the window. When opening sketches. Rules: - If `sketch` is missing from the URL, we reuse the same window. - NOOP, if we try to open the currently opened sketch. - Otherwise, use the existing logic: open sketch in a new window. Signed-off-by: Akos Kitta --- .../browser/arduino-frontend-contribution.tsx | 23 +++++++++++++++---- 1 file changed, 19 insertions(+), 4 deletions(-) diff --git a/arduino-ide-extension/src/browser/arduino-frontend-contribution.tsx b/arduino-ide-extension/src/browser/arduino-frontend-contribution.tsx index 63f4930a..314956fb 100644 --- a/arduino-ide-extension/src/browser/arduino-frontend-contribution.tsx +++ b/arduino-ide-extension/src/browser/arduino-frontend-contribution.tsx @@ -19,7 +19,7 @@ import { WorkspaceService } from '@theia/workspace/lib/browser/workspace-service import { SketchFactory } from './sketch-factory'; import { ArduinoToolbar } from './toolbar/arduino-toolbar'; import { EditorManager, EditorMainMenu } from '@theia/editor/lib/browser'; -import { ContextMenuRenderer, OpenerService, Widget, StatusBar, ShellLayoutRestorer, StatusBarAlignment } from '@theia/core/lib/browser'; +import { ContextMenuRenderer, OpenerService, Widget, StatusBar, ShellLayoutRestorer, StatusBarAlignment, LabelProvider } from '@theia/core/lib/browser'; import { OpenFileDialogProps, FileDialogService } from '@theia/filesystem/lib/browser/file-dialog'; import { FileSystem, FileStat } from '@theia/filesystem/lib/common'; import { ArduinoToolbarContextMenu } from './arduino-file-menu'; @@ -113,6 +113,9 @@ export class ArduinoFrontendContribution implements TabBarToolbarContribution, C @inject(ShellLayoutRestorer) protected readonly layoutRestorer: ShellLayoutRestorer; + @inject(LabelProvider) + protected readonly labelProvider: LabelProvider; + protected boardsToolbarItem: BoardsToolBarItem | null; protected wsSketchCount: number = 0; @@ -375,9 +378,21 @@ export class ArduinoFrontendContribution implements TabBarToolbarContribution, C } protected async openSketchFilesInNewWindow(uri: string) { - const location = new URL(window.location.href); - location.searchParams.set('sketch', uri); - this.windowService.openNewWindow(location.toString()); + const url = new URL(window.location.href); + const currentSketch = url.searchParams.get('sketch'); + // Nothing to do if we want to open the same sketch which is already opened. + if (!!currentSketch && new URI(currentSketch).toString() === new URI(uri).toString()) { + this.messageService.info(`The '${this.labelProvider.getLongName(new URI(uri))}' is already opened.`); + // NOOP. + return; + } + // Preserve the current window if the `sketch` is not in the `searchParams`. + url.searchParams.set('sketch', uri); + if (!currentSketch) { + setTimeout(() => window.location.href = url.toString(), 100); + return; + } + this.windowService.openNewWindow(url.toString()); } async openSketchFiles(uri: string) {