|
|
"use strict";
|
|
|
/*---------------------------------------------------------------------------------------------
|
|
|
* Copyright (c) Microsoft Corporation. All rights reserved.
|
|
|
* Licensed under the MIT License. See License.txt in the project root for license information.
|
|
|
*--------------------------------------------------------------------------------------------*/
|
|
|
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
|
return new (P || (P = Promise))(function (resolve, reject) {
|
|
|
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
|
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
|
function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); }
|
|
|
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
|
});
|
|
|
};
|
|
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
const vscode = require("vscode");
|
|
|
const dispose_1 = require("../util/dispose");
|
|
|
const topmostLineMonitor_1 = require("../util/topmostLineMonitor");
|
|
|
const preview_1 = require("./preview");
|
|
|
const previewConfig_1 = require("./previewConfig");
|
|
|
class HTMLPreviewManager {
|
|
|
constructor(_contentProvider, _logger) {
|
|
|
this._contentProvider = _contentProvider;
|
|
|
this._logger = _logger;
|
|
|
this._topmostLineMonitor = new topmostLineMonitor_1.HTMLFileTopmostLineMonitor();
|
|
|
this._previewConfigurations = new previewConfig_1.HTMLPreviewConfigurationManager();
|
|
|
this._previews = [];
|
|
|
this._activePreview = undefined;
|
|
|
this._disposables = [];
|
|
|
this._disposables.push(vscode.window.registerWebviewPanelSerializer(preview_1.HTMLPreview.viewType, this));
|
|
|
}
|
|
|
dispose() {
|
|
|
dispose_1.disposeAll(this._disposables);
|
|
|
dispose_1.disposeAll(this._previews);
|
|
|
}
|
|
|
refresh() {
|
|
|
for (const preview of this._previews) {
|
|
|
preview.refresh();
|
|
|
}
|
|
|
}
|
|
|
updateConfiguration() {
|
|
|
for (const preview of this._previews) {
|
|
|
preview.updateConfiguration();
|
|
|
}
|
|
|
}
|
|
|
preview(resource, previewSettings) {
|
|
|
let preview = this.getExistingPreview(resource, previewSettings);
|
|
|
if (preview) {
|
|
|
preview.reveal(previewSettings.previewColumn);
|
|
|
}
|
|
|
else {
|
|
|
preview = this.createNewPreview(resource, previewSettings);
|
|
|
}
|
|
|
preview.update(resource);
|
|
|
}
|
|
|
get activePreviewResource() {
|
|
|
return this._activePreview && this._activePreview.resource;
|
|
|
}
|
|
|
toggleLock() {
|
|
|
const preview = this._activePreview;
|
|
|
if (preview) {
|
|
|
preview.toggleLock();
|
|
|
// Close any previews that are now redundant, such as having two dynamic previews in the same editor group
|
|
|
for (const otherPreview of this._previews) {
|
|
|
if (otherPreview !== preview && preview.matches(otherPreview)) {
|
|
|
otherPreview.dispose();
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
deserializeWebviewPanel(webview, state) {
|
|
|
return __awaiter(this, void 0, void 0, function* () {
|
|
|
const preview = yield preview_1.HTMLPreview.revive(webview, state, this._contentProvider, this._previewConfigurations, this._logger, this._topmostLineMonitor);
|
|
|
this.registerPreview(preview);
|
|
|
});
|
|
|
}
|
|
|
getExistingPreview(resource, previewSettings) {
|
|
|
return this._previews.find(preview => preview.matchesResource(resource, previewSettings.previewColumn, previewSettings.locked));
|
|
|
}
|
|
|
createNewPreview(resource, previewSettings) {
|
|
|
const preview = preview_1.HTMLPreview.create(resource, previewSettings.previewColumn, previewSettings.locked, this._contentProvider, this._previewConfigurations, this._logger, this._topmostLineMonitor);
|
|
|
this.setPreviewActiveContext(true);
|
|
|
this._activePreview = preview;
|
|
|
return this.registerPreview(preview);
|
|
|
}
|
|
|
registerPreview(preview) {
|
|
|
this._previews.push(preview);
|
|
|
preview.onDispose(() => {
|
|
|
const existing = this._previews.indexOf(preview);
|
|
|
if (existing === -1) {
|
|
|
return;
|
|
|
}
|
|
|
this._previews.splice(existing, 1);
|
|
|
if (this._activePreview === preview) {
|
|
|
this.setPreviewActiveContext(false);
|
|
|
this._activePreview = undefined;
|
|
|
}
|
|
|
});
|
|
|
preview.onDidChangeViewState(({ webviewPanel }) => {
|
|
|
dispose_1.disposeAll(this._previews.filter(otherPreview => preview !== otherPreview && preview.matches(otherPreview)));
|
|
|
this.setPreviewActiveContext(webviewPanel.active);
|
|
|
this._activePreview = webviewPanel.active ? preview : undefined;
|
|
|
});
|
|
|
return preview;
|
|
|
}
|
|
|
setPreviewActiveContext(value) {
|
|
|
vscode.commands.executeCommand('setContext', HTMLPreviewManager.htmlPreviewActiveContextKey, value);
|
|
|
}
|
|
|
}
|
|
|
HTMLPreviewManager.htmlPreviewActiveContextKey = 'htmlPreviewFocus';
|
|
|
exports.HTMLPreviewManager = HTMLPreviewManager;
|