src/Tools/VSCode/extension/src/preview_panel.ts
author wenzelm
Tue, 25 Feb 2020 18:30:08 +0100
changeset 71473 be84312a2d53
parent 66214 eec1c99e1bdc
child 71479 6aa2dc263912
permissions -rw-r--r--
update to WebviewPanel API, following initial version by Peter Zeller;
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
66203
5763d9a2f47d added missing files (cf. 5aa9cb83e70e);
wenzelm
parents:
diff changeset
     1
'use strict';
5763d9a2f47d added missing files (cf. 5aa9cb83e70e);
wenzelm
parents:
diff changeset
     2
5763d9a2f47d added missing files (cf. 5aa9cb83e70e);
wenzelm
parents:
diff changeset
     3
import * as timers from 'timers'
5763d9a2f47d added missing files (cf. 5aa9cb83e70e);
wenzelm
parents:
diff changeset
     4
import { ViewColumn, TextDocument, TextEditor, TextDocumentContentProvider,
5763d9a2f47d added missing files (cf. 5aa9cb83e70e);
wenzelm
parents:
diff changeset
     5
  ExtensionContext, Event, EventEmitter, Uri, Position, workspace,
71473
be84312a2d53 update to WebviewPanel API, following initial version by Peter Zeller;
wenzelm
parents: 66214
diff changeset
     6
  window, commands, WebviewPanel } from 'vscode'
66203
5763d9a2f47d added missing files (cf. 5aa9cb83e70e);
wenzelm
parents:
diff changeset
     7
import { LanguageClient } from 'vscode-languageclient';
5763d9a2f47d added missing files (cf. 5aa9cb83e70e);
wenzelm
parents:
diff changeset
     8
import * as library from './library'
5763d9a2f47d added missing files (cf. 5aa9cb83e70e);
wenzelm
parents:
diff changeset
     9
import * as protocol from './protocol'
5763d9a2f47d added missing files (cf. 5aa9cb83e70e);
wenzelm
parents:
diff changeset
    10
import { Content_Provider } from './content_provider'
5763d9a2f47d added missing files (cf. 5aa9cb83e70e);
wenzelm
parents:
diff changeset
    11
5763d9a2f47d added missing files (cf. 5aa9cb83e70e);
wenzelm
parents:
diff changeset
    12
5763d9a2f47d added missing files (cf. 5aa9cb83e70e);
wenzelm
parents:
diff changeset
    13
/* HTML content */
5763d9a2f47d added missing files (cf. 5aa9cb83e70e);
wenzelm
parents:
diff changeset
    14
5763d9a2f47d added missing files (cf. 5aa9cb83e70e);
wenzelm
parents:
diff changeset
    15
const content_provider = new Content_Provider("isabelle-preview")
5763d9a2f47d added missing files (cf. 5aa9cb83e70e);
wenzelm
parents:
diff changeset
    16
5763d9a2f47d added missing files (cf. 5aa9cb83e70e);
wenzelm
parents:
diff changeset
    17
function encode_preview(document_uri: Uri | undefined): Uri | undefined
5763d9a2f47d added missing files (cf. 5aa9cb83e70e);
wenzelm
parents:
diff changeset
    18
{
5763d9a2f47d added missing files (cf. 5aa9cb83e70e);
wenzelm
parents:
diff changeset
    19
  if (document_uri && library.is_file(document_uri)) {
5763d9a2f47d added missing files (cf. 5aa9cb83e70e);
wenzelm
parents:
diff changeset
    20
    return content_provider.uri_template.with({ query: document_uri.fsPath })
5763d9a2f47d added missing files (cf. 5aa9cb83e70e);
wenzelm
parents:
diff changeset
    21
  }
5763d9a2f47d added missing files (cf. 5aa9cb83e70e);
wenzelm
parents:
diff changeset
    22
  else undefined
5763d9a2f47d added missing files (cf. 5aa9cb83e70e);
wenzelm
parents:
diff changeset
    23
}
5763d9a2f47d added missing files (cf. 5aa9cb83e70e);
wenzelm
parents:
diff changeset
    24
5763d9a2f47d added missing files (cf. 5aa9cb83e70e);
wenzelm
parents:
diff changeset
    25
function decode_preview(preview_uri: Uri | undefined): Uri | undefined
5763d9a2f47d added missing files (cf. 5aa9cb83e70e);
wenzelm
parents:
diff changeset
    26
{
5763d9a2f47d added missing files (cf. 5aa9cb83e70e);
wenzelm
parents:
diff changeset
    27
  if (preview_uri && preview_uri.scheme === content_provider.uri_scheme) {
5763d9a2f47d added missing files (cf. 5aa9cb83e70e);
wenzelm
parents:
diff changeset
    28
    return Uri.file(preview_uri.query)
5763d9a2f47d added missing files (cf. 5aa9cb83e70e);
wenzelm
parents:
diff changeset
    29
  }
5763d9a2f47d added missing files (cf. 5aa9cb83e70e);
wenzelm
parents:
diff changeset
    30
  else undefined
5763d9a2f47d added missing files (cf. 5aa9cb83e70e);
wenzelm
parents:
diff changeset
    31
}
5763d9a2f47d added missing files (cf. 5aa9cb83e70e);
wenzelm
parents:
diff changeset
    32
5763d9a2f47d added missing files (cf. 5aa9cb83e70e);
wenzelm
parents:
diff changeset
    33
5763d9a2f47d added missing files (cf. 5aa9cb83e70e);
wenzelm
parents:
diff changeset
    34
/* setup */
5763d9a2f47d added missing files (cf. 5aa9cb83e70e);
wenzelm
parents:
diff changeset
    35
5763d9a2f47d added missing files (cf. 5aa9cb83e70e);
wenzelm
parents:
diff changeset
    36
let language_client: LanguageClient
5763d9a2f47d added missing files (cf. 5aa9cb83e70e);
wenzelm
parents:
diff changeset
    37
5763d9a2f47d added missing files (cf. 5aa9cb83e70e);
wenzelm
parents:
diff changeset
    38
export function setup(context: ExtensionContext, client: LanguageClient)
5763d9a2f47d added missing files (cf. 5aa9cb83e70e);
wenzelm
parents:
diff changeset
    39
{
5763d9a2f47d added missing files (cf. 5aa9cb83e70e);
wenzelm
parents:
diff changeset
    40
  context.subscriptions.push(content_provider.register())
5763d9a2f47d added missing files (cf. 5aa9cb83e70e);
wenzelm
parents:
diff changeset
    41
71473
be84312a2d53 update to WebviewPanel API, following initial version by Peter Zeller;
wenzelm
parents: 66214
diff changeset
    42
  var panel: WebviewPanel
66203
5763d9a2f47d added missing files (cf. 5aa9cb83e70e);
wenzelm
parents:
diff changeset
    43
  language_client = client
5763d9a2f47d added missing files (cf. 5aa9cb83e70e);
wenzelm
parents:
diff changeset
    44
  language_client.onNotification(protocol.preview_response_type, params =>
5763d9a2f47d added missing files (cf. 5aa9cb83e70e);
wenzelm
parents:
diff changeset
    45
    {
5763d9a2f47d added missing files (cf. 5aa9cb83e70e);
wenzelm
parents:
diff changeset
    46
      const preview_uri = encode_preview(Uri.parse(params.uri))
71473
be84312a2d53 update to WebviewPanel API, following initial version by Peter Zeller;
wenzelm
parents: 66214
diff changeset
    47
      if (!panel) {
be84312a2d53 update to WebviewPanel API, following initial version by Peter Zeller;
wenzelm
parents: 66214
diff changeset
    48
        panel = window.createWebviewPanel(
be84312a2d53 update to WebviewPanel API, following initial version by Peter Zeller;
wenzelm
parents: 66214
diff changeset
    49
          preview_uri.fsPath,
be84312a2d53 update to WebviewPanel API, following initial version by Peter Zeller;
wenzelm
parents: 66214
diff changeset
    50
          params.label,
be84312a2d53 update to WebviewPanel API, following initial version by Peter Zeller;
wenzelm
parents: 66214
diff changeset
    51
          params.column,
be84312a2d53 update to WebviewPanel API, following initial version by Peter Zeller;
wenzelm
parents: 66214
diff changeset
    52
          {
be84312a2d53 update to WebviewPanel API, following initial version by Peter Zeller;
wenzelm
parents: 66214
diff changeset
    53
            enableScripts: true,
be84312a2d53 update to WebviewPanel API, following initial version by Peter Zeller;
wenzelm
parents: 66214
diff changeset
    54
            retainContextWhenHidden: true
be84312a2d53 update to WebviewPanel API, following initial version by Peter Zeller;
wenzelm
parents: 66214
diff changeset
    55
          }
be84312a2d53 update to WebviewPanel API, following initial version by Peter Zeller;
wenzelm
parents: 66214
diff changeset
    56
        );
66203
5763d9a2f47d added missing files (cf. 5aa9cb83e70e);
wenzelm
parents:
diff changeset
    57
      }
71473
be84312a2d53 update to WebviewPanel API, following initial version by Peter Zeller;
wenzelm
parents: 66214
diff changeset
    58
      panel.webview.html = params.content;
66203
5763d9a2f47d added missing files (cf. 5aa9cb83e70e);
wenzelm
parents:
diff changeset
    59
    })
5763d9a2f47d added missing files (cf. 5aa9cb83e70e);
wenzelm
parents:
diff changeset
    60
}
5763d9a2f47d added missing files (cf. 5aa9cb83e70e);
wenzelm
parents:
diff changeset
    61
5763d9a2f47d added missing files (cf. 5aa9cb83e70e);
wenzelm
parents:
diff changeset
    62
5763d9a2f47d added missing files (cf. 5aa9cb83e70e);
wenzelm
parents:
diff changeset
    63
/* commands */
5763d9a2f47d added missing files (cf. 5aa9cb83e70e);
wenzelm
parents:
diff changeset
    64
5763d9a2f47d added missing files (cf. 5aa9cb83e70e);
wenzelm
parents:
diff changeset
    65
export function request(uri?: Uri, split: boolean = false)
5763d9a2f47d added missing files (cf. 5aa9cb83e70e);
wenzelm
parents:
diff changeset
    66
{
5763d9a2f47d added missing files (cf. 5aa9cb83e70e);
wenzelm
parents:
diff changeset
    67
  const document_uri = uri || window.activeTextEditor.document.uri
5763d9a2f47d added missing files (cf. 5aa9cb83e70e);
wenzelm
parents:
diff changeset
    68
  const preview_uri = encode_preview(document_uri)
5763d9a2f47d added missing files (cf. 5aa9cb83e70e);
wenzelm
parents:
diff changeset
    69
  if (preview_uri && language_client) {
5763d9a2f47d added missing files (cf. 5aa9cb83e70e);
wenzelm
parents:
diff changeset
    70
    language_client.sendNotification(protocol.preview_request_type,
5763d9a2f47d added missing files (cf. 5aa9cb83e70e);
wenzelm
parents:
diff changeset
    71
      { uri: document_uri.toString(),
5763d9a2f47d added missing files (cf. 5aa9cb83e70e);
wenzelm
parents:
diff changeset
    72
        column: library.adjacent_editor_column(window.activeTextEditor, split) })
5763d9a2f47d added missing files (cf. 5aa9cb83e70e);
wenzelm
parents:
diff changeset
    73
  }
5763d9a2f47d added missing files (cf. 5aa9cb83e70e);
wenzelm
parents:
diff changeset
    74
}
5763d9a2f47d added missing files (cf. 5aa9cb83e70e);
wenzelm
parents:
diff changeset
    75
5763d9a2f47d added missing files (cf. 5aa9cb83e70e);
wenzelm
parents:
diff changeset
    76
export function update(preview_uri: Uri)
5763d9a2f47d added missing files (cf. 5aa9cb83e70e);
wenzelm
parents:
diff changeset
    77
{
5763d9a2f47d added missing files (cf. 5aa9cb83e70e);
wenzelm
parents:
diff changeset
    78
  const document_uri = decode_preview(preview_uri)
5763d9a2f47d added missing files (cf. 5aa9cb83e70e);
wenzelm
parents:
diff changeset
    79
  if (document_uri && language_client) {
5763d9a2f47d added missing files (cf. 5aa9cb83e70e);
wenzelm
parents:
diff changeset
    80
    language_client.sendNotification(protocol.preview_request_type,
5763d9a2f47d added missing files (cf. 5aa9cb83e70e);
wenzelm
parents:
diff changeset
    81
      { uri: document_uri.toString(), column: 0 })
5763d9a2f47d added missing files (cf. 5aa9cb83e70e);
wenzelm
parents:
diff changeset
    82
  }
5763d9a2f47d added missing files (cf. 5aa9cb83e70e);
wenzelm
parents:
diff changeset
    83
}
5763d9a2f47d added missing files (cf. 5aa9cb83e70e);
wenzelm
parents:
diff changeset
    84
5763d9a2f47d added missing files (cf. 5aa9cb83e70e);
wenzelm
parents:
diff changeset
    85
export function source(preview_uri: Uri)
5763d9a2f47d added missing files (cf. 5aa9cb83e70e);
wenzelm
parents:
diff changeset
    86
{
5763d9a2f47d added missing files (cf. 5aa9cb83e70e);
wenzelm
parents:
diff changeset
    87
  const document_uri = decode_preview(preview_uri)
5763d9a2f47d added missing files (cf. 5aa9cb83e70e);
wenzelm
parents:
diff changeset
    88
  if (document_uri) {
66214
eec1c99e1bdc tuned signature;
wenzelm
parents: 66203
diff changeset
    89
    const editor = library.find_file_editor(document_uri)
66203
5763d9a2f47d added missing files (cf. 5aa9cb83e70e);
wenzelm
parents:
diff changeset
    90
    if (editor) window.showTextDocument(editor.document, editor.viewColumn)
5763d9a2f47d added missing files (cf. 5aa9cb83e70e);
wenzelm
parents:
diff changeset
    91
    else workspace.openTextDocument(document_uri).then(window.showTextDocument)
5763d9a2f47d added missing files (cf. 5aa9cb83e70e);
wenzelm
parents:
diff changeset
    92
  }
5763d9a2f47d added missing files (cf. 5aa9cb83e70e);
wenzelm
parents:
diff changeset
    93
  else commands.executeCommand("workbench.action.navigateBack")
5763d9a2f47d added missing files (cf. 5aa9cb83e70e);
wenzelm
parents:
diff changeset
    94
}