Bläddra i källkod

Spreadsheet: Add a syntax highlighter to the cell editor

AnotherTest 5 år sedan
förälder
incheckning
de13c6939d

+ 1 - 0
Applications/Spreadsheet/CMakeLists.txt

@@ -1,4 +1,5 @@
 set(SOURCES
+    CellSyntaxHighlighter.cpp
     HelpWindow.cpp
     Spreadsheet.cpp
     SpreadsheetModel.cpp

+ 62 - 0
Applications/Spreadsheet/CellSyntaxHighlighter.cpp

@@ -0,0 +1,62 @@
+/*
+ * Copyright (c) 2020, the SerenityOS developers.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this
+ *    list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ *    this list of conditions and the following disclaimer in the documentation
+ *    and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+ * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include "CellSyntaxHighlighter.h"
+#include <LibGUI/JSSyntaxHighlighter.h>
+#include <LibGUI/TextEditor.h>
+#include <LibGfx/Palette.h>
+#include <LibJS/Lexer.h>
+
+namespace Spreadsheet {
+
+void CellSyntaxHighlighter::rehighlight(Gfx::Palette palette)
+{
+    ASSERT(m_editor);
+    auto text = m_editor->text();
+    m_editor->document().spans().clear();
+    if (!text.starts_with('=')) {
+        m_editor->update();
+        return;
+    }
+
+    JSSyntaxHighlighter::rehighlight(palette);
+
+    // Highlight the '='
+    m_editor->document().spans().empend(
+        GUI::TextRange { { 0, 0 }, { 0, 1 } },
+        palette.syntax_keyword(),
+        Optional<Color> {},
+        false,
+        false,
+        nullptr,
+        nullptr);
+}
+
+CellSyntaxHighlighter::~CellSyntaxHighlighter()
+{
+}
+
+}

+ 42 - 0
Applications/Spreadsheet/CellSyntaxHighlighter.h

@@ -0,0 +1,42 @@
+/*
+ * Copyright (c) 2020, the SerenityOS developers.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this
+ *    list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ *    this list of conditions and the following disclaimer in the documentation
+ *    and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+ * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#pragma once
+
+#include <LibGUI/JSSyntaxHighlighter.h>
+#include <LibGUI/SyntaxHighlighter.h>
+
+namespace Spreadsheet {
+
+class CellSyntaxHighlighter final : public GUI::JSSyntaxHighlighter {
+public:
+    CellSyntaxHighlighter() { }
+    virtual ~CellSyntaxHighlighter() override;
+
+    virtual void rehighlight(Gfx::Palette) override;
+};
+
+}

+ 2 - 0
Applications/Spreadsheet/SpreadsheetWidget.cpp

@@ -25,6 +25,7 @@
  */
 
 #include "SpreadsheetWidget.h"
+#include "CellSyntaxHighlighter.h"
 #include "HelpWindow.h"
 #include <AK/JsonArray.h>
 #include <AK/JsonObject.h>
@@ -68,6 +69,7 @@ SpreadsheetWidget::SpreadsheetWidget()
     auto& cell_value_editor = top_bar.add<GUI::TextEditor>(GUI::TextEditor::Type::SingleLine);
     cell_value_editor.set_scrollbars_enabled(false);
 
+    cell_value_editor.set_syntax_highlighter(make<CellSyntaxHighlighter>());
     cell_value_editor.set_enabled(false);
     current_cell_label.set_enabled(false);
 

+ 2 - 2
Libraries/LibGUI/JSSyntaxHighlighter.h

@@ -30,9 +30,9 @@
 
 namespace GUI {
 
-class JSSyntaxHighlighter final : public SyntaxHighlighter {
+class JSSyntaxHighlighter : public SyntaxHighlighter {
 public:
-    JSSyntaxHighlighter() {}
+    JSSyntaxHighlighter() { }
     virtual ~JSSyntaxHighlighter() override;
 
     virtual bool is_identifier(void*) const override;