Serenity Operating System
at master 152 lines 4.9 kB view raw
1/* 2 * Copyright (c) 2018-2021, Andreas Kling <kling@serenityos.org> 3 * Copyright (c) 2022, the SerenityOS developers. 4 * 5 * SPDX-License-Identifier: BSD-2-Clause 6 */ 7 8#pragma once 9 10#include <AK/Function.h> 11#include <AK/LexicalPath.h> 12#include <LibFileSystemAccessClient/Client.h> 13#include <LibGUI/ActionGroup.h> 14#include <LibGUI/Application.h> 15#include <LibGUI/Icon.h> 16#include <LibGUI/TextEditor.h> 17#include <LibGUI/Widget.h> 18#include <LibGUI/Window.h> 19#include <LibWebView/Forward.h> 20 21namespace TextEditor { 22 23class MainWidget final : public GUI::Widget { 24 C_OBJECT(MainWidget); 25 26public: 27 virtual ~MainWidget() override = default; 28 ErrorOr<void> read_file(String const& filename, Core::File&); 29 void open_nonexistent_file(DeprecatedString const& path); 30 bool request_close(); 31 32 GUI::TextEditor& editor() { return *m_editor; } 33 34 enum class PreviewMode { 35 None, 36 Markdown, 37 HTML, 38 }; 39 40 void set_preview_mode(PreviewMode); 41 void set_auto_detect_preview_mode(bool value) { m_auto_detect_preview_mode = value; } 42 43 void update_title(); 44 void update_statusbar(); 45 void initialize_menubar(GUI::Window&); 46 47private: 48 MainWidget(); 49 void set_path(StringView); 50 void update_preview(); 51 void update_markdown_preview(); 52 void update_html_preview(); 53 54 WebView::OutOfProcessWebView& ensure_web_view(); 55 void set_web_view_visible(bool); 56 57 virtual void drag_enter_event(GUI::DragEvent&) override; 58 virtual void drop_event(GUI::DropEvent&) override; 59 60 enum class ShowMessageIfNoResults { 61 Yes = 1, 62 No = 0 63 }; 64 void find_text(GUI::TextEditor::SearchDirection, ShowMessageIfNoResults); 65 66 RefPtr<GUI::TextEditor> m_editor; 67 DeprecatedString m_path; 68 DeprecatedString m_name; 69 DeprecatedString m_extension; 70 RefPtr<GUI::Action> m_new_action; 71 RefPtr<GUI::Action> m_open_action; 72 RefPtr<GUI::Action> m_save_action; 73 RefPtr<GUI::Action> m_save_as_action; 74 RefPtr<GUI::Action> m_open_folder_action; 75 RefPtr<GUI::Action> m_find_replace_action; 76 RefPtr<GUI::Action> m_vim_emulation_setting_action; 77 78 RefPtr<GUI::Action> m_find_next_action; 79 RefPtr<GUI::Action> m_find_previous_action; 80 RefPtr<GUI::Action> m_replace_action; 81 RefPtr<GUI::Action> m_replace_all_action; 82 83 RefPtr<GUI::Action> m_layout_toolbar_action; 84 RefPtr<GUI::Action> m_layout_statusbar_action; 85 RefPtr<GUI::Action> m_layout_ruler_action; 86 87 GUI::ActionGroup m_preview_actions; 88 RefPtr<GUI::Action> m_no_preview_action; 89 RefPtr<GUI::Action> m_markdown_preview_action; 90 RefPtr<GUI::Action> m_html_preview_action; 91 92 RefPtr<GUI::Toolbar> m_toolbar; 93 RefPtr<GUI::ToolbarContainer> m_toolbar_container; 94 RefPtr<GUI::Statusbar> m_statusbar; 95 RefPtr<GUI::Menu> m_line_column_statusbar_menu; 96 RefPtr<GUI::Menu> m_syntax_statusbar_menu; 97 98 RefPtr<GUI::TextBox> m_find_textbox; 99 RefPtr<GUI::TextBox> m_replace_textbox; 100 RefPtr<GUI::Button> m_find_previous_button; 101 RefPtr<GUI::Button> m_find_next_button; 102 RefPtr<GUI::Button> m_replace_button; 103 RefPtr<GUI::Button> m_replace_all_button; 104 RefPtr<GUI::Widget> m_find_replace_widget; 105 RefPtr<GUI::Widget> m_find_widget; 106 RefPtr<GUI::Widget> m_replace_widget; 107 RefPtr<GUI::CheckBox> m_regex_checkbox; 108 RefPtr<GUI::CheckBox> m_match_case_checkbox; 109 RefPtr<GUI::CheckBox> m_wrap_around_checkbox; 110 111 GUI::ActionGroup m_wrapping_mode_actions; 112 RefPtr<GUI::Action> m_no_wrapping_action; 113 RefPtr<GUI::Action> m_wrap_anywhere_action; 114 RefPtr<GUI::Action> m_wrap_at_words_action; 115 116 RefPtr<GUI::Action> m_visualize_trailing_whitespace_action; 117 RefPtr<GUI::Action> m_visualize_leading_whitespace_action; 118 RefPtr<GUI::Action> m_cursor_line_highlighting_action; 119 RefPtr<GUI::Action> m_relative_line_number_action; 120 121 GUI::ActionGroup m_soft_tab_width_actions; 122 RefPtr<GUI::Action> m_soft_tab_1_width_action; 123 RefPtr<GUI::Action> m_soft_tab_2_width_action; 124 RefPtr<GUI::Action> m_soft_tab_4_width_action; 125 RefPtr<GUI::Action> m_soft_tab_8_width_action; 126 RefPtr<GUI::Action> m_soft_tab_16_width_action; 127 128 GUI::ActionGroup syntax_actions; 129 RefPtr<GUI::Action> m_plain_text_highlight; 130 RefPtr<GUI::Action> m_cmake_highlight; 131 RefPtr<GUI::Action> m_cmakecache_highlight; 132 RefPtr<GUI::Action> m_cpp_highlight; 133 RefPtr<GUI::Action> m_css_highlight; 134 RefPtr<GUI::Action> m_js_highlight; 135 RefPtr<GUI::Action> m_html_highlight; 136 RefPtr<GUI::Action> m_git_highlight; 137 RefPtr<GUI::Action> m_gml_highlight; 138 RefPtr<GUI::Action> m_ini_highlight; 139 RefPtr<GUI::Action> m_shell_highlight; 140 RefPtr<GUI::Action> m_sql_highlight; 141 142 RefPtr<WebView::OutOfProcessWebView> m_page_view; 143 144 bool m_auto_detect_preview_mode { false }; 145 bool m_use_regex { false }; 146 bool m_match_case { true }; 147 bool m_should_wrap { true }; 148 149 PreviewMode m_preview_mode { PreviewMode::None }; 150}; 151 152}