editor_core.hpp 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285
  1. #pragma once
  2. #include "lumacs/buffer.hpp"
  3. #include "lumacs/window.hpp"
  4. // #include "lumacs/kill_ring.hpp" // Now using KillRingManager
  5. #include "lumacs/theme.hpp"
  6. #include "lumacs/config.hpp"
  7. #include "lumacs/keybinding.hpp"
  8. #include "lumacs/modeline.hpp"
  9. #include "lumacs/minibuffer_manager.hpp" // Added include
  10. #include "lumacs/completion_system.hpp" // Added include
  11. #include "lumacs/ui_interface.hpp" // Include for EditorEvent
  12. #include "lumacs/i_command_target.hpp" // New include for ICommandTarget
  13. #include "lumacs/plugin_manager.hpp" // New include for PluginManager
  14. #include "lumacs/buffer_manager.hpp" // New include for BufferManager
  15. #include "lumacs/window_manager.hpp" // New include for WindowManager
  16. #include "lumacs/kill_ring_manager.hpp" // New include for KillRingManager
  17. #include "lumacs/register_manager.hpp" // New include for RegisterManager
  18. #include "lumacs/macro_manager.hpp" // New include for MacroManager
  19. #include "lumacs/rectangle_manager.hpp" // New include for RectangleManager
  20. #include <memory>
  21. #include <functional>
  22. #include <vector>
  23. #include <list>
  24. #include <unordered_map>
  25. #include <chrono> // For std::chrono::steady_clock
  26. #include <optional> // For std::optional
  27. namespace lumacs {
  28. class LuaApi; // Forward declaration
  29. class CommandSystem; // Forward declaration
  30. class PluginManager; // Forward declaration
  31. // class WindowManager; // Forward declaration already in window_manager.hpp
  32. /// @brief Core logic of the Lumacs editor, independent of the UI framework.
  33. ///
  34. /// This class acts as the central controller/facade for the editor's logic.
  35. /// It manages buffers, windows, the kill ring, registers, macros, configuration,
  36. /// and subsystems like the command system and Lua API.
  37. /// It emits events to notify the UI (IEditorView) of state changes.
  38. class EditorCore : public ICommandTarget { // Inherit from ICommandTarget
  39. public:
  40. EditorCore();
  41. ~EditorCore();
  42. // Disable copy, allow move
  43. EditorCore(const EditorCore&) = delete;
  44. EditorCore& operator=(const EditorCore&) = delete;
  45. EditorCore(EditorCore&&) noexcept = default; // Should now be fine due to unique_ptr members
  46. EditorCore& operator=(EditorCore&&) noexcept = default; // Should now be fine due to unique_ptr members
  47. // === ICommandTarget Implementation ===
  48. // These methods implement the ICommandTarget interface.
  49. // Buffer Management (Delegated to BufferManager)
  50. [[nodiscard]] const Buffer& buffer() const noexcept override { return buffer_manager_->active_buffer()->get(); }
  51. [[nodiscard]] Buffer& buffer() noexcept override { return buffer_manager_->active_buffer()->get(); }
  52. bool load_file(const std::filesystem::path& path) override { return buffer_manager_->load_file(path); }
  53. void new_buffer(std::string name = "*scratch*") override { buffer_manager_->new_buffer(std::move(name)); }
  54. [[nodiscard]] std::vector<std::string> get_buffer_names() const override { return buffer_manager_->get_buffer_names(); }
  55. [[nodiscard]] std::shared_ptr<Buffer> get_buffer_by_name(const std::string& name) override { return buffer_manager_->get_buffer_by_name(name); }
  56. bool switch_buffer_in_window(const std::string& name) override { return buffer_manager_->switch_buffer_in_window(name); }
  57. bool close_buffer(const std::string& name) override { return buffer_manager_->close_buffer(name); }
  58. // Window Management (Delegated to WindowManager)
  59. [[nodiscard]] std::shared_ptr<Window> active_window() const override { return window_manager_->active_window(); }
  60. bool set_active_window(std::shared_ptr<Window> window) override { return window_manager_->set_active_window(window); }
  61. void split_horizontally() override { window_manager_->split_horizontally(); }
  62. void split_vertically() override { window_manager_->split_vertically(); }
  63. void close_active_window() override { window_manager_->close_active_window(); }
  64. void next_window() override { window_manager_->next_window(); }
  65. // Cursor Management
  66. [[nodiscard]] Position cursor() const noexcept override;
  67. void set_cursor(Position pos) override;
  68. // Basic Editing
  69. void move_up() override;
  70. void move_down() override;
  71. void move_left() override;
  72. void move_right() override;
  73. void move_to_line_start() override;
  74. void move_to_line_end() override;
  75. void move_forward_word() override;
  76. void move_backward_word() override;
  77. void page_up() override;
  78. void page_down() override;
  79. void goto_beginning() override;
  80. void goto_end() override;
  81. void goto_line(size_t line) override;
  82. void kill_line() override;
  83. void kill_region() override;
  84. void copy_region_as_kill() override;
  85. void yank() override;
  86. void yank_pop() override;
  87. void kill_word() override;
  88. void backward_kill_word() override;
  89. // Message Display
  90. void set_message(std::string msg) override;
  91. // Quit
  92. void request_quit() override;
  93. // Configuration
  94. Config& config() override { return config_; }
  95. const Config& config() const override { return config_; }
  96. // Theme Management
  97. ThemeManager& theme_manager() override { return theme_manager_; }
  98. const ThemeManager& theme_manager() const override { return theme_manager_; }
  99. // === Original EditorCore methods not part of ICommandTarget ===
  100. /// @brief Get the last set message.
  101. const std::string& last_message() const { return last_message_; }
  102. /// @brief Check if a message is set and if its display time has expired.
  103. /// Clears the message if expired.
  104. void check_and_clear_message();
  105. // === Actions ===
  106. // These methods trigger specific input modes in the UI.
  107. void enter_command_mode();
  108. void enter_buffer_switch_mode();
  109. void enter_kill_buffer_mode();
  110. void enter_find_file_mode();
  111. void enter_theme_selection_mode();
  112. void enter_isearch_mode();
  113. void enter_isearch_backward_mode();
  114. /// @brief Get detailed information about all buffers.
  115. [[nodiscard]] std::vector<BufferManager::BufferInfo> get_all_buffer_info() const { return buffer_manager_->get_all_buffer_info(); }
  116. /// @brief Get the root node of the window layout tree.
  117. std::shared_ptr<LayoutNode> root_layout() const { return window_manager_->root_layout(); }
  118. // === Viewport Management (Proxies to active window) ===
  119. const Viewport& viewport() const noexcept;
  120. void set_viewport_size(int width, int height);
  121. void adjust_scroll();
  122. std::pair<size_t, size_t> visible_line_range() const;
  123. // === Event Callbacks ===
  124. using EventCallback = std::function<void(EditorEvent)>;
  125. /// @brief Register a callback to be notified of editor events.
  126. void on_event(EventCallback callback) {
  127. event_callbacks_.push_back(std::move(callback));
  128. }
  129. /// @brief Clear all registered event callbacks.
  130. void clear_event_callbacks() {
  131. event_callbacks_.clear();
  132. }
  133. // === Undo/Redo ===
  134. bool undo();
  135. bool redo();
  136. bool can_undo() const;
  137. bool can_redo() const;
  138. // === Kill Ring ===
  139. // Delegated to KillRingManager
  140. void kill_line() override;
  141. void kill_region() override;
  142. void copy_region_as_kill() override;
  143. void yank() override;
  144. void yank_pop() override;
  145. void kill_word() override;
  146. void backward_kill_word() override;
  147. /// @brief Access the global Kill Ring (clipboard history).
  148. [[nodiscard]] KillRingManager& kill_ring_manager() noexcept { return *kill_ring_manager_; }
  149. [[nodiscard]] const KillRingManager& kill_ring_manager() const noexcept { return *kill_ring_manager_; }
  150. // === Registers ===
  151. // Delegated to RegisterManager
  152. void copy_to_register(char register_name, const std::string& text) override;
  153. bool insert_register(char register_name) override;
  154. void copy_region_to_register(char register_name) override;
  155. bool yank_from_register(char register_name) override;
  156. /// @brief Access the global Register Manager.
  157. [[nodiscard]] RegisterManager& register_manager() noexcept { return *register_manager_; }
  158. [[nodiscard]] const RegisterManager& register_manager() const noexcept { return *register_manager_; }
  159. // === Keyboard Macros ===
  160. // Delegated to MacroManager
  161. void start_kbd_macro() override;
  162. void end_kbd_macro_or_call() override;
  163. void record_key_sequence(const std::string& key_sequence) override;
  164. [[nodiscard]] bool is_recording_macro() const noexcept override { return macro_manager_->is_recording_macro(); }
  165. /// @brief Access the global Macro Manager.
  166. [[nodiscard]] MacroManager& macro_manager() noexcept { return *macro_manager_; }
  167. [[nodiscard]] const MacroManager& macro_manager() const noexcept { return *macro_manager_; }
  168. // === Rectangles ===
  169. // Delegated to RectangleManager
  170. void kill_rectangle() override;
  171. void yank_rectangle() override;
  172. void string_rectangle(const std::string& text) override;
  173. /// @brief Access the global Rectangle Manager.
  174. [[nodiscard]] RectangleManager& rectangle_manager() noexcept { return *rectangle_manager_; }
  175. [[nodiscard]] const RectangleManager& rectangle_manager() const noexcept { return *rectangle_manager_; }
  176. // === Key Binding System ===
  177. [[nodiscard]] KeyBindingManager& keybinding_manager() noexcept { return *keybinding_manager_; }
  178. [[nodiscard]] const KeyBindingManager& keybinding_manager() const noexcept { return *keybinding_manager_; }
  179. // === Lua API ===
  180. [[nodiscard]] LuaApi* lua_api() const { return lua_api_.get(); }
  181. // === Command System ===
  182. [[nodiscard]] CommandSystem& command_system() noexcept { return *command_system_; }
  183. [[nodiscard]] const CommandSystem& command_system() const noexcept { return *command_system_; }
  184. // === Modeline Manager ===
  185. [[nodiscard]] ModelineManager& modeline_manager() noexcept { return modeline_manager_; }
  186. [[nodiscard]] const ModelineManager& modeline_manager() const noexcept { return modeline_manager_; }
  187. // === Minibuffer Manager ===
  188. [[nodiscard]] MinibufferManager& minibuffer_manager() noexcept { return *minibuffer_manager_; }
  189. [[nodiscard]] const MinibufferManager& minibuffer_manager() const noexcept { return *minibuffer_manager_; }
  190. // === Completion System ===
  191. [[nodiscard]] CompletionSystem& completion_system() noexcept { return *completion_system_; }
  192. [[nodiscard]] const CompletionSystem& completion_system() const noexcept { return *completion_system_; }
  193. // === Plugin Manager ===
  194. [[nodiscard]] PluginManager& plugin_manager() noexcept { return *plugin_manager_; }
  195. [[nodiscard]] const PluginManager& plugin_manager() const noexcept { return *plugin_manager_; }
  196. // === Buffer Manager ===
  197. [[nodiscard]] BufferManager& buffer_manager() noexcept { return *buffer_manager_; }
  198. [[nodiscard]] const BufferManager& buffer_manager() const noexcept { return *buffer_manager_; }
  199. /// @brief Helper to collect all windows in traversal order.
  200. /// @param node The current node to traverse.
  201. /// @param windows The vector to populate with windows.
  202. void collect_windows(LayoutNode* node, std::vector<std::shared_ptr<Window>>& windows) { window_manager_->collect_windows(node, windows); }
  203. private:
  204. // Word movement helpers
  205. Position calculate_forward_word_pos(Position start_pos);
  206. Position calculate_backward_word_pos(Position start_pos);
  207. std::string last_message_;
  208. std::optional<std::chrono::steady_clock::time_point> message_clear_time_;
  209. std::vector<EventCallback> event_callbacks_;
  210. // Last yank position (for yank-pop)
  211. std::optional<Position> last_yank_start_;
  212. std::optional<Position> last_yank_end_;
  213. // Subsystems
  214. ThemeManager theme_manager_;
  215. Config config_;
  216. std::unique_ptr<CommandSystem> command_system_; // Must be declared before KeyBindingManager
  217. std::unique_ptr<KeyBindingManager> keybinding_manager_; // Changed to unique_ptr
  218. std::unique_ptr<LuaApi> lua_api_;
  219. ModelineManager modeline_manager_;
  220. std::unique_ptr<CompletionSystem> completion_system_; // Added missing member
  221. std::unique_ptr<MinibufferManager> minibuffer_manager_; // Added missing member
  222. std::unique_ptr<PluginManager> plugin_manager_; // Added missing member
  223. std::unique_ptr<BufferManager> buffer_manager_; // New: BufferManager
  224. std::unique_ptr<WindowManager> window_manager_; // New: WindowManager
  225. std::unique_ptr<KillRingManager> kill_ring_manager_; // New: KillRingManager
  226. std::unique_ptr<RegisterManager> register_manager_; // New: RegisterManager
  227. std::unique_ptr<MacroManager> macro_manager_; // New: MacroManager
  228. std::unique_ptr<RectangleManager> rectangle_manager_; // New: RectangleManager
  229. void emit_event(EditorEvent event);
  230. };
  231. } // namespace lumacs