Editor.h 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119
  1. /*
  2. * Copyright (c) 2018-2021, Andreas Kling <kling@serenityos.org>
  3. * 2018-2021, the SerenityOS developers
  4. *
  5. * SPDX-License-Identifier: BSD-2-Clause
  6. */
  7. #pragma once
  8. #include "CodeDocument.h"
  9. #include "Debugger/BreakpointCallback.h"
  10. #include "LanguageClient.h"
  11. #include <AK/Assertions.h>
  12. #include <AK/Optional.h>
  13. #include <AK/OwnPtr.h>
  14. #include <LibGUI/TextEditor.h>
  15. #include <LibWeb/Forward.h>
  16. namespace HackStudio {
  17. class EditorWrapper;
  18. class Editor final : public GUI::TextEditor {
  19. C_OBJECT(Editor)
  20. public:
  21. virtual ~Editor() override;
  22. Function<void()> on_focus;
  23. Function<void(String)> on_open;
  24. EditorWrapper& wrapper();
  25. const EditorWrapper& wrapper() const;
  26. const Vector<size_t>& breakpoint_lines() const { return code_document().breakpoint_lines(); }
  27. Vector<size_t>& breakpoint_lines() { return code_document().breakpoint_lines(); }
  28. Optional<size_t> execution_position() const { return code_document().execution_position(); }
  29. void set_execution_position(size_t line_number);
  30. void clear_execution_position();
  31. const CodeDocument& code_document() const;
  32. CodeDocument& code_document();
  33. virtual void set_document(GUI::TextDocument&) override;
  34. virtual void will_execute(GUI::TextDocumentUndoCommand const&) override;
  35. virtual void undo() override;
  36. virtual void redo() override;
  37. LanguageClient& language_client()
  38. {
  39. VERIFY(m_language_client);
  40. return *m_language_client;
  41. }
  42. virtual void set_cursor(const GUI::TextPosition& a_position) override;
  43. private:
  44. virtual void focusin_event(GUI::FocusEvent&) override;
  45. virtual void focusout_event(GUI::FocusEvent&) override;
  46. virtual void paint_event(GUI::PaintEvent&) override;
  47. virtual void mousemove_event(GUI::MouseEvent&) override;
  48. virtual void mousedown_event(GUI::MouseEvent&) override;
  49. virtual void drop_event(GUI::DropEvent&) override;
  50. virtual void enter_event(Core::Event&) override;
  51. virtual void leave_event(Core::Event&) override;
  52. virtual void keydown_event(GUI::KeyEvent&) override;
  53. void show_documentation_tooltip_if_available(const String&, const Gfx::IntPoint& screen_location);
  54. void navigate_to_include_if_available(String);
  55. void on_navigatable_link_click(const GUI::TextDocumentSpan&);
  56. void on_identifier_click(const GUI::TextDocumentSpan&);
  57. Gfx::IntRect gutter_icon_rect(size_t line_number) const;
  58. static const Gfx::Bitmap& breakpoint_icon_bitmap();
  59. static const Gfx::Bitmap& current_position_icon_bitmap();
  60. struct AutoCompleteRequestData {
  61. GUI::TextPosition position;
  62. };
  63. class LanguageServerAidedAutocompleteProvider final : virtual public GUI::AutocompleteProvider {
  64. public:
  65. LanguageServerAidedAutocompleteProvider(LanguageClient& client)
  66. : m_language_client(client)
  67. {
  68. }
  69. virtual ~LanguageServerAidedAutocompleteProvider() override { }
  70. private:
  71. virtual void provide_completions(Function<void(Vector<Entry>)> callback) override;
  72. LanguageClient& m_language_client;
  73. };
  74. Optional<AutoCompleteRequestData> get_autocomplete_request_data();
  75. void flush_file_content_to_langauge_server();
  76. void set_syntax_highlighter_for(const CodeDocument&);
  77. void set_language_client_for(const CodeDocument&);
  78. void handle_function_parameters_hint_request();
  79. explicit Editor();
  80. RefPtr<GUI::Window> m_documentation_tooltip_window;
  81. RefPtr<GUI::Window> m_parameters_hint_tooltip_window;
  82. RefPtr<Web::OutOfProcessWebView> m_documentation_page_view;
  83. RefPtr<Web::OutOfProcessWebView> m_parameter_hint_page_view;
  84. String m_last_parsed_token;
  85. GUI::TextPosition m_previous_text_position { 0, 0 };
  86. bool m_hovering_editor { false };
  87. bool m_hovering_clickable { false };
  88. bool m_autocomplete_in_focus { false };
  89. RefPtr<GUI::Action> m_evaluate_expression_action;
  90. RefPtr<GUI::Action> m_move_execution_to_line_action;
  91. OwnPtr<LanguageClient> m_language_client;
  92. void initialize_documentation_tooltip();
  93. void initialize_parameters_hint_tooltip();
  94. };
  95. }