src/Tools/VSCode/extension/src/preview_panel.ts
author wenzelm
Thu, 29 Jun 2017 13:28:08 +0200
changeset 66214 eec1c99e1bdc
parent 66203 5763d9a2f47d
child 71473 be84312a2d53
permissions -rw-r--r--
tuned signature;
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,
5763d9a2f47d added missing files (cf. 5aa9cb83e70e);
wenzelm
parents:
diff changeset
     6
  window, commands } from 'vscode'
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
5763d9a2f47d added missing files (cf. 5aa9cb83e70e);
wenzelm
parents:
diff changeset
    42
  language_client = client
5763d9a2f47d added missing files (cf. 5aa9cb83e70e);
wenzelm
parents:
diff changeset
    43
  language_client.onNotification(protocol.preview_response_type, params =>
5763d9a2f47d added missing files (cf. 5aa9cb83e70e);
wenzelm
parents:
diff changeset
    44
    {
5763d9a2f47d added missing files (cf. 5aa9cb83e70e);
wenzelm
parents:
diff changeset
    45
      const preview_uri = encode_preview(Uri.parse(params.uri))
5763d9a2f47d added missing files (cf. 5aa9cb83e70e);
wenzelm
parents:
diff changeset
    46
      if (preview_uri) {
5763d9a2f47d added missing files (cf. 5aa9cb83e70e);
wenzelm
parents:
diff changeset
    47
        content_provider.set_content(preview_uri, params.content)
5763d9a2f47d added missing files (cf. 5aa9cb83e70e);
wenzelm
parents:
diff changeset
    48
        content_provider.update(preview_uri)
5763d9a2f47d added missing files (cf. 5aa9cb83e70e);
wenzelm
parents:
diff changeset
    49
5763d9a2f47d added missing files (cf. 5aa9cb83e70e);
wenzelm
parents:
diff changeset
    50
        const existing_document =
5763d9a2f47d added missing files (cf. 5aa9cb83e70e);
wenzelm
parents:
diff changeset
    51
          workspace.textDocuments.find(document =>
5763d9a2f47d added missing files (cf. 5aa9cb83e70e);
wenzelm
parents:
diff changeset
    52
            document.uri.scheme === preview_uri.scheme &&
5763d9a2f47d added missing files (cf. 5aa9cb83e70e);
wenzelm
parents:
diff changeset
    53
            document.uri.query === preview_uri.query)
5763d9a2f47d added missing files (cf. 5aa9cb83e70e);
wenzelm
parents:
diff changeset
    54
        if (!existing_document && params.column != 0) {
5763d9a2f47d added missing files (cf. 5aa9cb83e70e);
wenzelm
parents:
diff changeset
    55
          commands.executeCommand("vscode.previewHtml", preview_uri, params.column, params.label)
5763d9a2f47d added missing files (cf. 5aa9cb83e70e);
wenzelm
parents:
diff changeset
    56
        }
5763d9a2f47d added missing files (cf. 5aa9cb83e70e);
wenzelm
parents:
diff changeset
    57
      }
5763d9a2f47d added missing files (cf. 5aa9cb83e70e);
wenzelm
parents:
diff changeset
    58
    })
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
/* commands */
5763d9a2f47d added missing files (cf. 5aa9cb83e70e);
wenzelm
parents:
diff changeset
    63
5763d9a2f47d added missing files (cf. 5aa9cb83e70e);
wenzelm
parents:
diff changeset
    64
export function request(uri?: Uri, split: boolean = false)
5763d9a2f47d added missing files (cf. 5aa9cb83e70e);
wenzelm
parents:
diff changeset
    65
{
5763d9a2f47d added missing files (cf. 5aa9cb83e70e);
wenzelm
parents:
diff changeset
    66
  const document_uri = uri || window.activeTextEditor.document.uri
5763d9a2f47d added missing files (cf. 5aa9cb83e70e);
wenzelm
parents:
diff changeset
    67
  const preview_uri = encode_preview(document_uri)
5763d9a2f47d added missing files (cf. 5aa9cb83e70e);
wenzelm
parents:
diff changeset
    68
  if (preview_uri && language_client) {
5763d9a2f47d added missing files (cf. 5aa9cb83e70e);
wenzelm
parents:
diff changeset
    69
    language_client.sendNotification(protocol.preview_request_type,
5763d9a2f47d added missing files (cf. 5aa9cb83e70e);
wenzelm
parents:
diff changeset
    70
      { uri: document_uri.toString(),
5763d9a2f47d added missing files (cf. 5aa9cb83e70e);
wenzelm
parents:
diff changeset
    71
        column: library.adjacent_editor_column(window.activeTextEditor, split) })
5763d9a2f47d added missing files (cf. 5aa9cb83e70e);
wenzelm
parents:
diff changeset
    72
  }
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
export function update(preview_uri: Uri)
5763d9a2f47d added missing files (cf. 5aa9cb83e70e);
wenzelm
parents:
diff changeset
    76
{
5763d9a2f47d added missing files (cf. 5aa9cb83e70e);
wenzelm
parents:
diff changeset
    77
  const document_uri = decode_preview(preview_uri)
5763d9a2f47d added missing files (cf. 5aa9cb83e70e);
wenzelm
parents:
diff changeset
    78
  if (document_uri && language_client) {
5763d9a2f47d added missing files (cf. 5aa9cb83e70e);
wenzelm
parents:
diff changeset
    79
    language_client.sendNotification(protocol.preview_request_type,
5763d9a2f47d added missing files (cf. 5aa9cb83e70e);
wenzelm
parents:
diff changeset
    80
      { uri: document_uri.toString(), column: 0 })
5763d9a2f47d added missing files (cf. 5aa9cb83e70e);
wenzelm
parents:
diff changeset
    81
  }
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
export function source(preview_uri: Uri)
5763d9a2f47d added missing files (cf. 5aa9cb83e70e);
wenzelm
parents:
diff changeset
    85
{
5763d9a2f47d added missing files (cf. 5aa9cb83e70e);
wenzelm
parents:
diff changeset
    86
  const document_uri = decode_preview(preview_uri)
5763d9a2f47d added missing files (cf. 5aa9cb83e70e);
wenzelm
parents:
diff changeset
    87
  if (document_uri) {
66214
eec1c99e1bdc tuned signature;
wenzelm
parents: 66203
diff changeset
    88
    const editor = library.find_file_editor(document_uri)
66203
5763d9a2f47d added missing files (cf. 5aa9cb83e70e);
wenzelm
parents:
diff changeset
    89
    if (editor) window.showTextDocument(editor.document, editor.viewColumn)
5763d9a2f47d added missing files (cf. 5aa9cb83e70e);
wenzelm
parents:
diff changeset
    90
    else workspace.openTextDocument(document_uri).then(window.showTextDocument)
5763d9a2f47d added missing files (cf. 5aa9cb83e70e);
wenzelm
parents:
diff changeset
    91
  }
5763d9a2f47d added missing files (cf. 5aa9cb83e70e);
wenzelm
parents:
diff changeset
    92
  else commands.executeCommand("workbench.action.navigateBack")
5763d9a2f47d added missing files (cf. 5aa9cb83e70e);
wenzelm
parents:
diff changeset
    93
}