Editor.h 4.6 KB

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