src/Tools/VSCode/extension/src/decorations.ts
author wenzelm
Fri, 10 Mar 2017 21:47:48 +0100
changeset 65176 908d8be90533
parent 65173 3700be571a01
child 65180 b5a8f27a4980
permissions -rw-r--r--
suppress irrelevant markup for VSCode;
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
65094
386d9d487f62 support for decorations;
wenzelm
parents:
diff changeset
     1
'use strict';
386d9d487f62 support for decorations;
wenzelm
parents:
diff changeset
     2
386d9d487f62 support for decorations;
wenzelm
parents:
diff changeset
     3
import * as vscode from 'vscode'
65173
3700be571a01 more compact protocol message;
wenzelm
parents: 65171
diff changeset
     4
import { Position, Range, MarkedString, DecorationOptions, DecorationRenderOptions,
65135
158cba86140f maintain decorations for document (model) and update it for each editor (view);
wenzelm
parents: 65134
diff changeset
     5
  TextDocument, TextEditor, TextEditorDecorationType, ExtensionContext, Uri } from 'vscode'
65094
386d9d487f62 support for decorations;
wenzelm
parents:
diff changeset
     6
386d9d487f62 support for decorations;
wenzelm
parents:
diff changeset
     7
386d9d487f62 support for decorations;
wenzelm
parents:
diff changeset
     8
/* known decoration types */
386d9d487f62 support for decorations;
wenzelm
parents:
diff changeset
     9
65104
66b19d05dcee decorations for background and foreground colors;
wenzelm
parents: 65098
diff changeset
    10
export const types = new Map<string, TextEditorDecorationType>()
66b19d05dcee decorations for background and foreground colors;
wenzelm
parents: 65098
diff changeset
    11
66b19d05dcee decorations for background and foreground colors;
wenzelm
parents: 65098
diff changeset
    12
const background_colors = [
66b19d05dcee decorations for background and foreground colors;
wenzelm
parents: 65098
diff changeset
    13
  "unprocessed1",
66b19d05dcee decorations for background and foreground colors;
wenzelm
parents: 65098
diff changeset
    14
  "running1",
66b19d05dcee decorations for background and foreground colors;
wenzelm
parents: 65098
diff changeset
    15
  "bad",
66b19d05dcee decorations for background and foreground colors;
wenzelm
parents: 65098
diff changeset
    16
  "intensify",
66b19d05dcee decorations for background and foreground colors;
wenzelm
parents: 65098
diff changeset
    17
  "quoted",
66b19d05dcee decorations for background and foreground colors;
wenzelm
parents: 65098
diff changeset
    18
  "antiquoted",
66b19d05dcee decorations for background and foreground colors;
wenzelm
parents: 65098
diff changeset
    19
  "markdown_item1",
66b19d05dcee decorations for background and foreground colors;
wenzelm
parents: 65098
diff changeset
    20
  "markdown_item2",
66b19d05dcee decorations for background and foreground colors;
wenzelm
parents: 65098
diff changeset
    21
  "markdown_item3",
66b19d05dcee decorations for background and foreground colors;
wenzelm
parents: 65098
diff changeset
    22
  "markdown_item4"
66b19d05dcee decorations for background and foreground colors;
wenzelm
parents: 65098
diff changeset
    23
]
66b19d05dcee decorations for background and foreground colors;
wenzelm
parents: 65098
diff changeset
    24
66b19d05dcee decorations for background and foreground colors;
wenzelm
parents: 65098
diff changeset
    25
const foreground_colors = [
66b19d05dcee decorations for background and foreground colors;
wenzelm
parents: 65098
diff changeset
    26
  "quoted",
66b19d05dcee decorations for background and foreground colors;
wenzelm
parents: 65098
diff changeset
    27
  "antiquoted"
66b19d05dcee decorations for background and foreground colors;
wenzelm
parents: 65098
diff changeset
    28
]
66b19d05dcee decorations for background and foreground colors;
wenzelm
parents: 65098
diff changeset
    29
65122
1edb570f5b17 decorations for dotted underline: less intrusive;
wenzelm
parents: 65106
diff changeset
    30
const dotted_colors = [
1edb570f5b17 decorations for dotted underline: less intrusive;
wenzelm
parents: 65106
diff changeset
    31
  "writeln",
65134
511bf19348d3 clarified messages (with improved scalability): legacy/error as diagnostics, writeln/information/warning/bad as tooltips (dynamic hover);
wenzelm
parents: 65122
diff changeset
    32
  "information",
511bf19348d3 clarified messages (with improved scalability): legacy/error as diagnostics, writeln/information/warning/bad as tooltips (dynamic hover);
wenzelm
parents: 65122
diff changeset
    33
  "warning"
65122
1edb570f5b17 decorations for dotted underline: less intrusive;
wenzelm
parents: 65106
diff changeset
    34
]
1edb570f5b17 decorations for dotted underline: less intrusive;
wenzelm
parents: 65106
diff changeset
    35
65146
69ea3f1715be decorations for text color;
wenzelm
parents: 65142
diff changeset
    36
const text_colors = [
69ea3f1715be decorations for text color;
wenzelm
parents: 65142
diff changeset
    37
  "keyword1",
69ea3f1715be decorations for text color;
wenzelm
parents: 65142
diff changeset
    38
  "keyword2",
69ea3f1715be decorations for text color;
wenzelm
parents: 65142
diff changeset
    39
  "keyword3",
69ea3f1715be decorations for text color;
wenzelm
parents: 65142
diff changeset
    40
  "quasi_keyword",
69ea3f1715be decorations for text color;
wenzelm
parents: 65142
diff changeset
    41
  "improper",
69ea3f1715be decorations for text color;
wenzelm
parents: 65142
diff changeset
    42
  "operator",
69ea3f1715be decorations for text color;
wenzelm
parents: 65142
diff changeset
    43
  "tfree",
69ea3f1715be decorations for text color;
wenzelm
parents: 65142
diff changeset
    44
  "tvar",
69ea3f1715be decorations for text color;
wenzelm
parents: 65142
diff changeset
    45
  "free",
69ea3f1715be decorations for text color;
wenzelm
parents: 65142
diff changeset
    46
  "skolem",
69ea3f1715be decorations for text color;
wenzelm
parents: 65142
diff changeset
    47
  "bound",
69ea3f1715be decorations for text color;
wenzelm
parents: 65142
diff changeset
    48
  "var",
69ea3f1715be decorations for text color;
wenzelm
parents: 65142
diff changeset
    49
  "inner_numeral",
69ea3f1715be decorations for text color;
wenzelm
parents: 65142
diff changeset
    50
  "inner_quoted",
69ea3f1715be decorations for text color;
wenzelm
parents: 65142
diff changeset
    51
  "inner_cartouche",
69ea3f1715be decorations for text color;
wenzelm
parents: 65142
diff changeset
    52
  "inner_comment",
69ea3f1715be decorations for text color;
wenzelm
parents: 65142
diff changeset
    53
  "dynamic",
69ea3f1715be decorations for text color;
wenzelm
parents: 65142
diff changeset
    54
  "class_parameter",
69ea3f1715be decorations for text color;
wenzelm
parents: 65142
diff changeset
    55
  "antiquote"
69ea3f1715be decorations for text color;
wenzelm
parents: 65142
diff changeset
    56
]
69ea3f1715be decorations for text color;
wenzelm
parents: 65142
diff changeset
    57
65122
1edb570f5b17 decorations for dotted underline: less intrusive;
wenzelm
parents: 65106
diff changeset
    58
function get_color(color: string, light: boolean): string
65094
386d9d487f62 support for decorations;
wenzelm
parents:
diff changeset
    59
{
65153
wenzelm
parents: 65146
diff changeset
    60
  const config = color + (light ? "_light" : "_dark") + "_color"
65122
1edb570f5b17 decorations for dotted underline: less intrusive;
wenzelm
parents: 65106
diff changeset
    61
  return vscode.workspace.getConfiguration("isabelle").get<string>(config)
65094
386d9d487f62 support for decorations;
wenzelm
parents:
diff changeset
    62
}
386d9d487f62 support for decorations;
wenzelm
parents:
diff changeset
    63
386d9d487f62 support for decorations;
wenzelm
parents:
diff changeset
    64
export function init(context: ExtensionContext)
386d9d487f62 support for decorations;
wenzelm
parents:
diff changeset
    65
{
386d9d487f62 support for decorations;
wenzelm
parents:
diff changeset
    66
  function decoration(options: DecorationRenderOptions): TextEditorDecorationType
386d9d487f62 support for decorations;
wenzelm
parents:
diff changeset
    67
  {
386d9d487f62 support for decorations;
wenzelm
parents:
diff changeset
    68
    const typ = vscode.window.createTextEditorDecorationType(options)
386d9d487f62 support for decorations;
wenzelm
parents:
diff changeset
    69
    context.subscriptions.push(typ)
386d9d487f62 support for decorations;
wenzelm
parents:
diff changeset
    70
    return typ
386d9d487f62 support for decorations;
wenzelm
parents:
diff changeset
    71
  }
386d9d487f62 support for decorations;
wenzelm
parents:
diff changeset
    72
65104
66b19d05dcee decorations for background and foreground colors;
wenzelm
parents: 65098
diff changeset
    73
  function background(color: string): TextEditorDecorationType
66b19d05dcee decorations for background and foreground colors;
wenzelm
parents: 65098
diff changeset
    74
  {
65122
1edb570f5b17 decorations for dotted underline: less intrusive;
wenzelm
parents: 65106
diff changeset
    75
    return decoration(
1edb570f5b17 decorations for dotted underline: less intrusive;
wenzelm
parents: 65106
diff changeset
    76
      { light: { backgroundColor: get_color(color, true) },
1edb570f5b17 decorations for dotted underline: less intrusive;
wenzelm
parents: 65106
diff changeset
    77
        dark: { backgroundColor: get_color(color, false) } })
1edb570f5b17 decorations for dotted underline: less intrusive;
wenzelm
parents: 65106
diff changeset
    78
  }
1edb570f5b17 decorations for dotted underline: less intrusive;
wenzelm
parents: 65106
diff changeset
    79
65146
69ea3f1715be decorations for text color;
wenzelm
parents: 65142
diff changeset
    80
  function text_color(color: string): TextEditorDecorationType
69ea3f1715be decorations for text color;
wenzelm
parents: 65142
diff changeset
    81
  {
69ea3f1715be decorations for text color;
wenzelm
parents: 65142
diff changeset
    82
    return decoration(
69ea3f1715be decorations for text color;
wenzelm
parents: 65142
diff changeset
    83
      { light: { color: get_color(color, true) },
69ea3f1715be decorations for text color;
wenzelm
parents: 65142
diff changeset
    84
        dark: { color: get_color(color, false) } })
69ea3f1715be decorations for text color;
wenzelm
parents: 65142
diff changeset
    85
  }
69ea3f1715be decorations for text color;
wenzelm
parents: 65142
diff changeset
    86
65142
368004bed323 decorations for spell-checker;
wenzelm
parents: 65135
diff changeset
    87
  function bottom_border(width: string, style: string, color: string): TextEditorDecorationType
65122
1edb570f5b17 decorations for dotted underline: less intrusive;
wenzelm
parents: 65106
diff changeset
    88
  {
65142
368004bed323 decorations for spell-checker;
wenzelm
parents: 65135
diff changeset
    89
    const border = `${width} none; border-bottom-style: ${style}; border-color: `
65122
1edb570f5b17 decorations for dotted underline: less intrusive;
wenzelm
parents: 65106
diff changeset
    90
    return decoration(
65153
wenzelm
parents: 65146
diff changeset
    91
      { light: { border: border + get_color(color, true) },
wenzelm
parents: 65146
diff changeset
    92
        dark: { border: border + get_color(color, false) } })
65104
66b19d05dcee decorations for background and foreground colors;
wenzelm
parents: 65098
diff changeset
    93
  }
66b19d05dcee decorations for background and foreground colors;
wenzelm
parents: 65098
diff changeset
    94
66b19d05dcee decorations for background and foreground colors;
wenzelm
parents: 65098
diff changeset
    95
  types.clear
65168
9eabc312a2a2 prefer immutable bindings;
wenzelm
parents: 65153
diff changeset
    96
  for (const color of background_colors) {
65153
wenzelm
parents: 65146
diff changeset
    97
    types["background_" + color] = background(color)
65104
66b19d05dcee decorations for background and foreground colors;
wenzelm
parents: 65098
diff changeset
    98
  }
65168
9eabc312a2a2 prefer immutable bindings;
wenzelm
parents: 65153
diff changeset
    99
  for (const color of foreground_colors) {
65153
wenzelm
parents: 65146
diff changeset
   100
    types["foreground_" + color] = background(color) // approximation
65104
66b19d05dcee decorations for background and foreground colors;
wenzelm
parents: 65098
diff changeset
   101
  }
65168
9eabc312a2a2 prefer immutable bindings;
wenzelm
parents: 65153
diff changeset
   102
  for (const color of dotted_colors) {
65153
wenzelm
parents: 65146
diff changeset
   103
    types["dotted_" + color] = bottom_border("2px", "dotted", color)
65122
1edb570f5b17 decorations for dotted underline: less intrusive;
wenzelm
parents: 65106
diff changeset
   104
  }
65168
9eabc312a2a2 prefer immutable bindings;
wenzelm
parents: 65153
diff changeset
   105
  for (const color of text_colors) {
65153
wenzelm
parents: 65146
diff changeset
   106
    types["text_" + color] = text_color(color)
65146
69ea3f1715be decorations for text color;
wenzelm
parents: 65142
diff changeset
   107
  }
65142
368004bed323 decorations for spell-checker;
wenzelm
parents: 65135
diff changeset
   108
  types["spell_checker"] = bottom_border("1px", "solid", "spell_checker")
65094
386d9d487f62 support for decorations;
wenzelm
parents:
diff changeset
   109
}
386d9d487f62 support for decorations;
wenzelm
parents:
diff changeset
   110
386d9d487f62 support for decorations;
wenzelm
parents:
diff changeset
   111
386d9d487f62 support for decorations;
wenzelm
parents:
diff changeset
   112
/* decoration for document node */
386d9d487f62 support for decorations;
wenzelm
parents:
diff changeset
   113
65173
3700be571a01 more compact protocol message;
wenzelm
parents: 65171
diff changeset
   114
interface DecorationOpts {
3700be571a01 more compact protocol message;
wenzelm
parents: 65171
diff changeset
   115
  range: number[],
3700be571a01 more compact protocol message;
wenzelm
parents: 65171
diff changeset
   116
  hover_message?: MarkedString | MarkedString[]
3700be571a01 more compact protocol message;
wenzelm
parents: 65171
diff changeset
   117
}
3700be571a01 more compact protocol message;
wenzelm
parents: 65171
diff changeset
   118
65094
386d9d487f62 support for decorations;
wenzelm
parents:
diff changeset
   119
export interface Decoration
386d9d487f62 support for decorations;
wenzelm
parents:
diff changeset
   120
{
386d9d487f62 support for decorations;
wenzelm
parents:
diff changeset
   121
  uri: string,
386d9d487f62 support for decorations;
wenzelm
parents:
diff changeset
   122
  "type": string,
65173
3700be571a01 more compact protocol message;
wenzelm
parents: 65171
diff changeset
   123
  content: DecorationOpts[]
65094
386d9d487f62 support for decorations;
wenzelm
parents:
diff changeset
   124
}
386d9d487f62 support for decorations;
wenzelm
parents:
diff changeset
   125
65135
158cba86140f maintain decorations for document (model) and update it for each editor (view);
wenzelm
parents: 65134
diff changeset
   126
type Content = Range[] | DecorationOptions[]
158cba86140f maintain decorations for document (model) and update it for each editor (view);
wenzelm
parents: 65134
diff changeset
   127
const document_decorations = new Map<string, Map<string, Content>>()
158cba86140f maintain decorations for document (model) and update it for each editor (view);
wenzelm
parents: 65134
diff changeset
   128
158cba86140f maintain decorations for document (model) and update it for each editor (view);
wenzelm
parents: 65134
diff changeset
   129
export function close_document(document: TextDocument)
65094
386d9d487f62 support for decorations;
wenzelm
parents:
diff changeset
   130
{
65135
158cba86140f maintain decorations for document (model) and update it for each editor (view);
wenzelm
parents: 65134
diff changeset
   131
  document_decorations.delete(document.uri.toString())
158cba86140f maintain decorations for document (model) and update it for each editor (view);
wenzelm
parents: 65134
diff changeset
   132
}
158cba86140f maintain decorations for document (model) and update it for each editor (view);
wenzelm
parents: 65134
diff changeset
   133
65173
3700be571a01 more compact protocol message;
wenzelm
parents: 65171
diff changeset
   134
export function apply_decoration(decoration: Decoration)
65135
158cba86140f maintain decorations for document (model) and update it for each editor (view);
wenzelm
parents: 65134
diff changeset
   135
{
65173
3700be571a01 more compact protocol message;
wenzelm
parents: 65171
diff changeset
   136
  const typ = types[decoration.type]
65094
386d9d487f62 support for decorations;
wenzelm
parents:
diff changeset
   137
  if (typ) {
65173
3700be571a01 more compact protocol message;
wenzelm
parents: 65171
diff changeset
   138
    const uri = Uri.parse(decoration.uri).toString()
3700be571a01 more compact protocol message;
wenzelm
parents: 65171
diff changeset
   139
    const content: DecorationOptions[] = decoration.content.map(opt =>
3700be571a01 more compact protocol message;
wenzelm
parents: 65171
diff changeset
   140
      {
3700be571a01 more compact protocol message;
wenzelm
parents: 65171
diff changeset
   141
        const r = opt.range
3700be571a01 more compact protocol message;
wenzelm
parents: 65171
diff changeset
   142
        return {
3700be571a01 more compact protocol message;
wenzelm
parents: 65171
diff changeset
   143
          range: new Range(new Position(r[0], r[1]), new Position(r[2], r[3])),
3700be571a01 more compact protocol message;
wenzelm
parents: 65171
diff changeset
   144
          hoverMessage: opt.hover_message
3700be571a01 more compact protocol message;
wenzelm
parents: 65171
diff changeset
   145
        }
3700be571a01 more compact protocol message;
wenzelm
parents: 65171
diff changeset
   146
      })
65135
158cba86140f maintain decorations for document (model) and update it for each editor (view);
wenzelm
parents: 65134
diff changeset
   147
65173
3700be571a01 more compact protocol message;
wenzelm
parents: 65171
diff changeset
   148
    const document = document_decorations.get(uri) || new Map<string, Content>()
3700be571a01 more compact protocol message;
wenzelm
parents: 65171
diff changeset
   149
    document.set(decoration.type, content)
3700be571a01 more compact protocol message;
wenzelm
parents: 65171
diff changeset
   150
    document_decorations.set(uri, document)
65135
158cba86140f maintain decorations for document (model) and update it for each editor (view);
wenzelm
parents: 65134
diff changeset
   151
65168
9eabc312a2a2 prefer immutable bindings;
wenzelm
parents: 65153
diff changeset
   152
    for (const editor of vscode.window.visibleTextEditors) {
65173
3700be571a01 more compact protocol message;
wenzelm
parents: 65171
diff changeset
   153
      if (uri === editor.document.uri.toString()) {
3700be571a01 more compact protocol message;
wenzelm
parents: 65171
diff changeset
   154
        editor.setDecorations(typ, content)
65135
158cba86140f maintain decorations for document (model) and update it for each editor (view);
wenzelm
parents: 65134
diff changeset
   155
      }
158cba86140f maintain decorations for document (model) and update it for each editor (view);
wenzelm
parents: 65134
diff changeset
   156
    }
65094
386d9d487f62 support for decorations;
wenzelm
parents:
diff changeset
   157
  }
65135
158cba86140f maintain decorations for document (model) and update it for each editor (view);
wenzelm
parents: 65134
diff changeset
   158
}
158cba86140f maintain decorations for document (model) and update it for each editor (view);
wenzelm
parents: 65134
diff changeset
   159
158cba86140f maintain decorations for document (model) and update it for each editor (view);
wenzelm
parents: 65134
diff changeset
   160
export function update_editor(editor: TextEditor)
158cba86140f maintain decorations for document (model) and update it for each editor (view);
wenzelm
parents: 65134
diff changeset
   161
{
158cba86140f maintain decorations for document (model) and update it for each editor (view);
wenzelm
parents: 65134
diff changeset
   162
  if (editor) {
65168
9eabc312a2a2 prefer immutable bindings;
wenzelm
parents: 65153
diff changeset
   163
    const decorations = document_decorations.get(editor.document.uri.toString())
65135
158cba86140f maintain decorations for document (model) and update it for each editor (view);
wenzelm
parents: 65134
diff changeset
   164
    if (decorations) {
65168
9eabc312a2a2 prefer immutable bindings;
wenzelm
parents: 65153
diff changeset
   165
      for (const [typ, content] of decorations) {
65135
158cba86140f maintain decorations for document (model) and update it for each editor (view);
wenzelm
parents: 65134
diff changeset
   166
        editor.setDecorations(types[typ], content)
158cba86140f maintain decorations for document (model) and update it for each editor (view);
wenzelm
parents: 65134
diff changeset
   167
      }
158cba86140f maintain decorations for document (model) and update it for each editor (view);
wenzelm
parents: 65134
diff changeset
   168
    }
158cba86140f maintain decorations for document (model) and update it for each editor (view);
wenzelm
parents: 65134
diff changeset
   169
  }
158cba86140f maintain decorations for document (model) and update it for each editor (view);
wenzelm
parents: 65134
diff changeset
   170
}