From a8e787c306d7666be1bb32da2893b780eeaf06c2 Mon Sep 17 00:00:00 2001 From: Maxime Jacquemin <maxime2.jacquemin@gmail.com> Date: Thu, 2 Mar 2023 12:19:26 +0100 Subject: [PATCH] [Ivette] Editors improvements Readonly code, search and goto line in SourceCode, fix the line number gutter width. --- ivette/package.json | 1 + ivette/src/dome/renderer/text/editor.tsx | 9 ++++- ivette/src/dome/renderer/text/style.css | 48 +++++++++++++++++++++++- ivette/src/frama-c/kernel/ASTview.tsx | 1 + ivette/src/frama-c/kernel/SourceCode.tsx | 2 + ivette/yarn.lock | 14 +++++++ 6 files changed, 73 insertions(+), 2 deletions(-) diff --git a/ivette/package.json b/ivette/package.json index bedf12a40dd..66513266706 100644 --- a/ivette/package.json +++ b/ivette/package.json @@ -60,6 +60,7 @@ "codemirror": "^5.65.2", "@codemirror/view": "6.2.3", "@codemirror/state": "6.1.1", + "@codemirror/search": "6.2.3", "@codemirror/language": "6.2.1", "@codemirror/commands": "6.1.0", "@codemirror/lang-cpp": "6.0.1", diff --git a/ivette/src/dome/renderer/text/editor.tsx b/ivette/src/dome/renderer/text/editor.tsx index 6f0438512f5..3426e8b4fa6 100644 --- a/ivette/src/dome/renderer/text/editor.tsx +++ b/ivette/src/dome/renderer/text/editor.tsx @@ -31,7 +31,8 @@ import { Decoration, DecorationSet } from '@codemirror/view'; import { DOMEventMap as EventMap } from '@codemirror/view'; import { GutterMarker, gutter } from '@codemirror/view'; import { Tooltip, showTooltip } from '@codemirror/view'; -import { lineNumbers } from '@codemirror/view'; +import { lineNumbers, keymap } from '@codemirror/view'; +import { searchKeymap, search, openSearchPanel } from '@codemirror/search'; import { parser } from '@lezer/cpp'; import { tags } from '@lezer/highlight'; @@ -328,6 +329,12 @@ export const LanguageHighlighter: Extension = // Standard extensions and commands // ----------------------------------------------------------------------------- +export const ReadOnly = EditorState.readOnly.of(true); + +const SearchAlternativeKey = [{ key: 'Alt-f', run: openSearchPanel }]; +const SearchKeymap = searchKeymap.slice(1).concat(SearchAlternativeKey); +export const Search : Extension = [ search(), keymap.of(SearchKeymap) ]; + export const Selection = createSelectionField(); function createSelectionField(): Field<EditorSelection> { const cursor = EditorSelection.cursor(0); diff --git a/ivette/src/dome/renderer/text/style.css b/ivette/src/dome/renderer/text/style.css index d9361977768..e339d8c9e86 100644 --- a/ivette/src/dome/renderer/text/style.css +++ b/ivette/src/dome/renderer/text/style.css @@ -124,7 +124,7 @@ .cm-editor .cm-gutters { border-right: 0px; - width: 2.15em; + min-width: 2.15em; background: var(--background-report); } @@ -132,6 +132,52 @@ color: var(--disabled-text); } +.cm-editor .cm-panels { + font-size: 13px; + background: var(--background-report); + color: var(--text); +} + +.cm-editor .cm-panels-bottom { + border-top: 2px solid var(--background-softer); +} + +.cm-editor .cm-panel.cm-search { + padding: 4px 6px 4px 6px; + display: flex; + align-items: center; + gap: 2px; +} + +.cm-editor .cm-panel.cm-search label { + font-size: 80%; + display: flex; + align-items: center; +} + +.cm-editor .cm-panel.cm-search [name=close] { + color: var(--info-text); +} + +.cm-editor .cm-textfield { + background: var(--background-report); + color: var(--text); + border: 1px solid var(--border); +} + +.cm-editor .cm-button { + background-image: var(--default-button-img); + border: 1px solid var(--border); + color: var(--text); +} + +.cm-editor .cm-panel.cm-gotoLine { + padding: 4px 6px 4px 6px; + display: flex; + align-items: center; + gap: 6px; +} + .cm-property-gutter { width: 1.3em; background: var(--code-bullet); diff --git a/ivette/src/frama-c/kernel/ASTview.tsx b/ivette/src/frama-c/kernel/ASTview.tsx index 63495a564ee..c923ee9d4d1 100644 --- a/ivette/src/frama-c/kernel/ASTview.tsx +++ b/ivette/src/frama-c/kernel/ASTview.tsx @@ -617,6 +617,7 @@ const extensions: Editor.Extension[] = [ PropertiesGutter, TaintedLvaluesDecorator, TaintTooltip, + Editor.ReadOnly, Editor.FoldGutter, Editor.LanguageHighlighter, ]; diff --git a/ivette/src/frama-c/kernel/SourceCode.tsx b/ivette/src/frama-c/kernel/SourceCode.tsx index cc059c919a4..59f285f981d 100644 --- a/ivette/src/frama-c/kernel/SourceCode.tsx +++ b/ivette/src/frama-c/kernel/SourceCode.tsx @@ -232,6 +232,8 @@ function useSourceGetter(): GetSource { // Necessary extensions. const extensions: Editor.Extension[] = [ Source, + Editor.Search, + Editor.ReadOnly, Editor.Selection, Editor.LineNumbers, Editor.LanguageHighlighter, diff --git a/ivette/yarn.lock b/ivette/yarn.lock index aa98dbadf52..f7180e42c20 100644 --- a/ivette/yarn.lock +++ b/ivette/yarn.lock @@ -1816,6 +1816,15 @@ "@lezer/lr" "^1.0.0" style-mod "^4.0.0" +"@codemirror/search@6.2.3": + version "6.2.3" + resolved "https://registry.yarnpkg.com/@codemirror/search/-/search-6.2.3.tgz#fab933fef1b1de8ef40cda275c73d9ac7a1ff40f" + integrity sha512-V9n9233lopQhB1dyjsBK2Wc1i+8hcCqxl1wQ46c5HWWLePoe4FluV3TGHoZ04rBRlGjNyz9DTmpJErig8UE4jw== + dependencies: + "@codemirror/state" "^6.0.0" + "@codemirror/view" "^6.0.0" + crelt "^1.0.5" + "@codemirror/state@6.1.1", "@codemirror/state@^6.0.0": version "6.1.1" resolved "https://registry.yarnpkg.com/@codemirror/state/-/state-6.1.1.tgz#4f512e5e34ea23a5e10b2c1fe43f6195e90417bb" @@ -3840,6 +3849,11 @@ create-hmac@^1.1.0, create-hmac@^1.1.4, create-hmac@^1.1.7: safe-buffer "^5.0.1" sha.js "^2.4.8" +crelt@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/crelt/-/crelt-1.0.5.tgz#57c0d52af8c859e354bace1883eb2e1eb182bb94" + integrity sha512-+BO9wPPi+DWTDcNYhr/W90myha8ptzftZT+LwcmUbbok0rcP/fequmFYCw8NMoH7pkAZQzU78b3kYrlua5a9eA== + crocket@^0.9.11: version "0.9.11" resolved "https://registry.yarnpkg.com/crocket/-/crocket-0.9.11.tgz#288fca11ef0d3dd239b62c488265f30c8edfb0c5" -- GitLab