src/Tools/VSCode/extension/src/preview.ts
author wenzelm
Wed, 14 Jun 2017 16:03:02 +0200
changeset 66093 440112959631
parent 66092 f5595bef6545
child 66097 ee4c2d5b650e
permissions -rw-r--r--
tuned;
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
65958
6338355b2a88 basic setup for document preview;
wenzelm
parents:
diff changeset
     1
'use strict';
6338355b2a88 basic setup for document preview;
wenzelm
parents:
diff changeset
     2
65974
fd5f80ee2de0 clarified event handling;
wenzelm
parents: 65971
diff changeset
     3
import * as timers from 'timers'
65983
d8c5603c1732 explicit preview request/response;
wenzelm
parents: 65977
diff changeset
     4
import { ViewColumn, TextDocument, TextEditor, TextDocumentContentProvider,
d8c5603c1732 explicit preview request/response;
wenzelm
parents: 65977
diff changeset
     5
  ExtensionContext, Event, EventEmitter, Uri, Position, workspace,
d8c5603c1732 explicit preview request/response;
wenzelm
parents: 65977
diff changeset
     6
  window, commands } from 'vscode'
d8c5603c1732 explicit preview request/response;
wenzelm
parents: 65977
diff changeset
     7
import { LanguageClient } from 'vscode-languageclient';
65966
169d2928cce1 clarified modules;
wenzelm
parents: 65961
diff changeset
     8
import * as library from './library'
66092
f5595bef6545 clarified modules;
wenzelm
parents: 66081
diff changeset
     9
import * as protocol from './protocol'
f5595bef6545 clarified modules;
wenzelm
parents: 66081
diff changeset
    10
import { Content_Provider } from './content_provider'
65983
d8c5603c1732 explicit preview request/response;
wenzelm
parents: 65977
diff changeset
    11
d8c5603c1732 explicit preview request/response;
wenzelm
parents: 65977
diff changeset
    12
66092
f5595bef6545 clarified modules;
wenzelm
parents: 66081
diff changeset
    13
/* HTML content */
65983
d8c5603c1732 explicit preview request/response;
wenzelm
parents: 65977
diff changeset
    14
66092
f5595bef6545 clarified modules;
wenzelm
parents: 66081
diff changeset
    15
const content_provider = new Content_Provider("isabelle-preview")
65983
d8c5603c1732 explicit preview request/response;
wenzelm
parents: 65977
diff changeset
    16
d8c5603c1732 explicit preview request/response;
wenzelm
parents: 65977
diff changeset
    17
function encode_preview(document_uri: Uri | undefined): Uri | undefined
d8c5603c1732 explicit preview request/response;
wenzelm
parents: 65977
diff changeset
    18
{
d8c5603c1732 explicit preview request/response;
wenzelm
parents: 65977
diff changeset
    19
  if (document_uri && library.is_file(document_uri)) {
66092
f5595bef6545 clarified modules;
wenzelm
parents: 66081
diff changeset
    20
    return content_provider.uri_template.with({ query: document_uri.fsPath })
65983
d8c5603c1732 explicit preview request/response;
wenzelm
parents: 65977
diff changeset
    21
  }
d8c5603c1732 explicit preview request/response;
wenzelm
parents: 65977
diff changeset
    22
  else undefined
d8c5603c1732 explicit preview request/response;
wenzelm
parents: 65977
diff changeset
    23
}
d8c5603c1732 explicit preview request/response;
wenzelm
parents: 65977
diff changeset
    24
d8c5603c1732 explicit preview request/response;
wenzelm
parents: 65977
diff changeset
    25
function decode_preview(preview_uri: Uri | undefined): Uri | undefined
d8c5603c1732 explicit preview request/response;
wenzelm
parents: 65977
diff changeset
    26
{
66092
f5595bef6545 clarified modules;
wenzelm
parents: 66081
diff changeset
    27
  if (preview_uri && preview_uri.scheme === content_provider.uri_scheme) {
65983
d8c5603c1732 explicit preview request/response;
wenzelm
parents: 65977
diff changeset
    28
    return Uri.file(preview_uri.query)
d8c5603c1732 explicit preview request/response;
wenzelm
parents: 65977
diff changeset
    29
  }
d8c5603c1732 explicit preview request/response;
wenzelm
parents: 65977
diff changeset
    30
  else undefined
d8c5603c1732 explicit preview request/response;
wenzelm
parents: 65977
diff changeset
    31
}
65958
6338355b2a88 basic setup for document preview;
wenzelm
parents:
diff changeset
    32
6338355b2a88 basic setup for document preview;
wenzelm
parents:
diff changeset
    33
65971
wenzelm
parents: 65967
diff changeset
    34
/* init */
65959
47309113ee4d clarified view column;
wenzelm
parents: 65958
diff changeset
    35
65983
d8c5603c1732 explicit preview request/response;
wenzelm
parents: 65977
diff changeset
    36
let language_client: LanguageClient
65974
fd5f80ee2de0 clarified event handling;
wenzelm
parents: 65971
diff changeset
    37
65983
d8c5603c1732 explicit preview request/response;
wenzelm
parents: 65977
diff changeset
    38
export function init(context: ExtensionContext, client: LanguageClient)
65958
6338355b2a88 basic setup for document preview;
wenzelm
parents:
diff changeset
    39
{
66092
f5595bef6545 clarified modules;
wenzelm
parents: 66081
diff changeset
    40
  context.subscriptions.push(content_provider.register())
65983
d8c5603c1732 explicit preview request/response;
wenzelm
parents: 65977
diff changeset
    41
66093
wenzelm
parents: 66092
diff changeset
    42
  language_client = client
65987
44e44bfc738a tuned signature;
wenzelm
parents: 65986
diff changeset
    43
  language_client.onNotification(protocol.preview_response_type, params =>
44e44bfc738a tuned signature;
wenzelm
parents: 65986
diff changeset
    44
    {
44e44bfc738a tuned signature;
wenzelm
parents: 65986
diff changeset
    45
      const preview_uri = encode_preview(Uri.parse(params.uri))
44e44bfc738a tuned signature;
wenzelm
parents: 65986
diff changeset
    46
      if (preview_uri) {
66092
f5595bef6545 clarified modules;
wenzelm
parents: 66081
diff changeset
    47
        content_provider.set_content(preview_uri, params.content)
65994
46123b9dadc8 proper update of already existing preview;
wenzelm
parents: 65987
diff changeset
    48
        content_provider.update(preview_uri)
66027
396785562768 avoid redundant Preview documents;
wenzelm
parents: 65994
diff changeset
    49
396785562768 avoid redundant Preview documents;
wenzelm
parents: 65994
diff changeset
    50
        const existing_document =
396785562768 avoid redundant Preview documents;
wenzelm
parents: 65994
diff changeset
    51
          workspace.textDocuments.find(document =>
396785562768 avoid redundant Preview documents;
wenzelm
parents: 65994
diff changeset
    52
            document.uri.scheme === preview_uri.scheme &&
396785562768 avoid redundant Preview documents;
wenzelm
parents: 65994
diff changeset
    53
            document.uri.query === preview_uri.query)
396785562768 avoid redundant Preview documents;
wenzelm
parents: 65994
diff changeset
    54
        if (!existing_document && params.column != 0) {
65994
46123b9dadc8 proper update of already existing preview;
wenzelm
parents: 65987
diff changeset
    55
          commands.executeCommand("vscode.previewHtml", preview_uri, params.column, params.label)
46123b9dadc8 proper update of already existing preview;
wenzelm
parents: 65987
diff changeset
    56
        }
65987
44e44bfc738a tuned signature;
wenzelm
parents: 65986
diff changeset
    57
      }
44e44bfc738a tuned signature;
wenzelm
parents: 65986
diff changeset
    58
    })
65983
d8c5603c1732 explicit preview request/response;
wenzelm
parents: 65977
diff changeset
    59
}
d8c5603c1732 explicit preview request/response;
wenzelm
parents: 65977
diff changeset
    60
d8c5603c1732 explicit preview request/response;
wenzelm
parents: 65977
diff changeset
    61
d8c5603c1732 explicit preview request/response;
wenzelm
parents: 65977
diff changeset
    62
/* commands */
d8c5603c1732 explicit preview request/response;
wenzelm
parents: 65977
diff changeset
    63
65987
44e44bfc738a tuned signature;
wenzelm
parents: 65986
diff changeset
    64
export function request(uri?: Uri, split: boolean = false)
65983
d8c5603c1732 explicit preview request/response;
wenzelm
parents: 65977
diff changeset
    65
{
d8c5603c1732 explicit preview request/response;
wenzelm
parents: 65977
diff changeset
    66
  const document_uri = uri || window.activeTextEditor.document.uri
d8c5603c1732 explicit preview request/response;
wenzelm
parents: 65977
diff changeset
    67
  const preview_uri = encode_preview(document_uri)
65984
8e6a833da7db register commands earlier, before prover startup;
wenzelm
parents: 65983
diff changeset
    68
  if (preview_uri && language_client) {
65983
d8c5603c1732 explicit preview request/response;
wenzelm
parents: 65977
diff changeset
    69
    language_client.sendNotification(protocol.preview_request_type,
66081
441f95b05944 clarified modules;
wenzelm
parents: 66079
diff changeset
    70
      { uri: document_uri.toString(),
441f95b05944 clarified modules;
wenzelm
parents: 66079
diff changeset
    71
        column: library.adjacent_editor_column(window.activeTextEditor, split) })
65983
d8c5603c1732 explicit preview request/response;
wenzelm
parents: 65977
diff changeset
    72
  }
d8c5603c1732 explicit preview request/response;
wenzelm
parents: 65977
diff changeset
    73
}
d8c5603c1732 explicit preview request/response;
wenzelm
parents: 65977
diff changeset
    74
65987
44e44bfc738a tuned signature;
wenzelm
parents: 65986
diff changeset
    75
export function update(preview_uri: Uri)
65983
d8c5603c1732 explicit preview request/response;
wenzelm
parents: 65977
diff changeset
    76
{
65987
44e44bfc738a tuned signature;
wenzelm
parents: 65986
diff changeset
    77
  const document_uri = decode_preview(preview_uri)
44e44bfc738a tuned signature;
wenzelm
parents: 65986
diff changeset
    78
  if (document_uri && language_client) {
44e44bfc738a tuned signature;
wenzelm
parents: 65986
diff changeset
    79
    language_client.sendNotification(protocol.preview_request_type,
44e44bfc738a tuned signature;
wenzelm
parents: 65986
diff changeset
    80
      { uri: document_uri.toString(), column: 0 })
65983
d8c5603c1732 explicit preview request/response;
wenzelm
parents: 65977
diff changeset
    81
  }
d8c5603c1732 explicit preview request/response;
wenzelm
parents: 65977
diff changeset
    82
}
d8c5603c1732 explicit preview request/response;
wenzelm
parents: 65977
diff changeset
    83
65987
44e44bfc738a tuned signature;
wenzelm
parents: 65986
diff changeset
    84
export function source(preview_uri: Uri)
65983
d8c5603c1732 explicit preview request/response;
wenzelm
parents: 65977
diff changeset
    85
{
d8c5603c1732 explicit preview request/response;
wenzelm
parents: 65977
diff changeset
    86
  const document_uri = decode_preview(preview_uri)
d8c5603c1732 explicit preview request/response;
wenzelm
parents: 65977
diff changeset
    87
  if (document_uri) {
d8c5603c1732 explicit preview request/response;
wenzelm
parents: 65977
diff changeset
    88
    const editor =
d8c5603c1732 explicit preview request/response;
wenzelm
parents: 65977
diff changeset
    89
      window.visibleTextEditors.find(editor =>
66064
wenzelm
parents: 66027
diff changeset
    90
        library.is_file(editor.document.uri) &&
65983
d8c5603c1732 explicit preview request/response;
wenzelm
parents: 65977
diff changeset
    91
        editor.document.uri.fsPath === document_uri.fsPath)
d8c5603c1732 explicit preview request/response;
wenzelm
parents: 65977
diff changeset
    92
    if (editor) window.showTextDocument(editor.document, editor.viewColumn)
d8c5603c1732 explicit preview request/response;
wenzelm
parents: 65977
diff changeset
    93
    else workspace.openTextDocument(document_uri).then(window.showTextDocument)
d8c5603c1732 explicit preview request/response;
wenzelm
parents: 65977
diff changeset
    94
  }
d8c5603c1732 explicit preview request/response;
wenzelm
parents: 65977
diff changeset
    95
  else commands.executeCommand("workbench.action.navigateBack")
d8c5603c1732 explicit preview request/response;
wenzelm
parents: 65977
diff changeset
    96
}