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