Editor.h 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122
  1. /*
  2. * Copyright (c) 2018-2021, Andreas Kling <kling@serenityos.org>
  3. * Copyright (c) 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. bool is_program_running() const { return execution_position().has_value(); }
  30. void set_execution_position(size_t line_number);
  31. void clear_execution_position();
  32. void set_debug_mode(bool);
  33. const CodeDocument& code_document() const;
  34. CodeDocument& code_document();
  35. virtual void set_document(GUI::TextDocument&) override;
  36. virtual void will_execute(GUI::TextDocumentUndoCommand const&) override;
  37. virtual void undo() override;
  38. virtual void redo() override;
  39. LanguageClient& language_client()
  40. {
  41. VERIFY(m_language_client);
  42. return *m_language_client;
  43. }
  44. virtual void set_cursor(const GUI::TextPosition& a_position) override;
  45. private:
  46. virtual void focusin_event(GUI::FocusEvent&) override;
  47. virtual void focusout_event(GUI::FocusEvent&) override;
  48. virtual void paint_event(GUI::PaintEvent&) override;
  49. virtual void mousemove_event(GUI::MouseEvent&) override;
  50. virtual void mousedown_event(GUI::MouseEvent&) override;
  51. virtual void drop_event(GUI::DropEvent&) override;
  52. virtual void enter_event(Core::Event&) override;
  53. virtual void leave_event(Core::Event&) override;
  54. virtual void keydown_event(GUI::KeyEvent&) override;
  55. void show_documentation_tooltip_if_available(const String&, const Gfx::IntPoint& screen_location);
  56. void navigate_to_include_if_available(String);
  57. void on_navigatable_link_click(const GUI::TextDocumentSpan&);
  58. void on_identifier_click(const GUI::TextDocumentSpan&);
  59. Gfx::IntRect gutter_icon_rect(size_t line_number) const;
  60. static const Gfx::Bitmap& breakpoint_icon_bitmap();
  61. static const Gfx::Bitmap& current_position_icon_bitmap();
  62. struct AutoCompleteRequestData {
  63. GUI::TextPosition position;
  64. };
  65. class LanguageServerAidedAutocompleteProvider final : virtual public GUI::AutocompleteProvider {
  66. public:
  67. LanguageServerAidedAutocompleteProvider(LanguageClient& client)
  68. : m_language_client(client)
  69. {
  70. }
  71. virtual ~LanguageServerAidedAutocompleteProvider() override { }
  72. private:
  73. virtual void provide_completions(Function<void(Vector<Entry>)> callback) override;
  74. LanguageClient& m_language_client;
  75. };
  76. Optional<AutoCompleteRequestData> get_autocomplete_request_data();
  77. void flush_file_content_to_langauge_server();
  78. void set_syntax_highlighter_for(const CodeDocument&);
  79. void set_language_client_for(const CodeDocument&);
  80. void set_autocomplete_provider_for(CodeDocument const&);
  81. void handle_function_parameters_hint_request();
  82. explicit Editor();
  83. RefPtr<GUI::Window> m_documentation_tooltip_window;
  84. RefPtr<GUI::Window> m_parameters_hint_tooltip_window;
  85. RefPtr<Web::OutOfProcessWebView> m_documentation_page_view;
  86. RefPtr<Web::OutOfProcessWebView> m_parameter_hint_page_view;
  87. String m_last_parsed_token;
  88. GUI::TextPosition m_previous_text_position { 0, 0 };
  89. bool m_hovering_editor { false };
  90. bool m_hovering_clickable { false };
  91. bool m_autocomplete_in_focus { false };
  92. RefPtr<GUI::Action> m_evaluate_expression_action;
  93. RefPtr<GUI::Action> m_move_execution_to_line_action;
  94. OwnPtr<LanguageClient> m_language_client;
  95. void initialize_documentation_tooltip();
  96. void initialize_parameters_hint_tooltip();
  97. };
  98. }