diff options
| author | Maxime Coste <frrrwww@gmail.com> | 2013-04-09 19:39:03 +0200 |
|---|---|---|
| committer | Maxime Coste <frrrwww@gmail.com> | 2013-04-09 19:39:03 +0200 |
| commit | 34b8604f902042985fa9a7101427f5eafadee55e (patch) | |
| tree | 0bb559741a33a3e94e9fff00eb6e1c00b6d7cd39 /src/context.hh | |
| parent | 240e0321e81c5919f98d4d812cf909e63a53b9d9 (diff) | |
move context implementation to context.cc
Diffstat (limited to 'src/context.hh')
| -rw-r--r-- | src/context.hh | 160 |
1 files changed, 29 insertions, 131 deletions
diff --git a/src/context.hh b/src/context.hh index b4442e5f..1217df3a 100644 --- a/src/context.hh +++ b/src/context.hh @@ -1,13 +1,17 @@ #ifndef context_hh_INCLUDED #define context_hh_INCLUDED -#include "window.hh" -#include "user_interface.hh" +#include "dynamic_selection_list.hh" namespace Kakoune { +class Editor; +class Window; +class Buffer; class InputHandler; +class UserInterface; +class DisplayLine; // A Context is used to access non singleton objects for various services // in commands. @@ -17,151 +21,45 @@ class InputHandler; // a hook execution or a macro replay. struct Context { - Context() {} - explicit Context(Editor& editor) - : m_editor(&editor) {} - Context(InputHandler& input_handler, UserInterface& ui) - : m_input_handler(&input_handler), m_ui(&ui) {} + Context(); + explicit Context(Editor& editor); + Context(InputHandler& input_handler, UserInterface& ui); + ~Context(); Context(const Context&) = delete; Context& operator=(const Context&) = delete; - Buffer& buffer() const - { - if (not has_buffer()) - throw runtime_error("no buffer in context"); - return m_editor->buffer(); - } + Buffer& buffer() const; bool has_buffer() const { return (bool)m_editor; } - Editor& editor() const - { - if (not has_editor()) - throw runtime_error("no editor in context"); - return *m_editor.get(); - } + Editor& editor() const; bool has_editor() const { return (bool)m_editor; } - Window& window() const - { - if (not has_window()) - throw runtime_error("no window in context"); - return *dynamic_cast<Window*>(m_editor.get()); - } - bool has_window() const { return (bool)m_editor and dynamic_cast<Window*>(m_editor.get()); } - - InputHandler& input_handler() const - { - if (not has_input_handler()) - throw runtime_error("no input handler in context"); - return *m_input_handler; - } + Window& window() const; + bool has_window() const; + + InputHandler& input_handler() const; bool has_input_handler() const { return (bool)m_input_handler; } - UserInterface& ui() const - { - if (not has_ui()) - throw runtime_error("no user interface in context"); - return *m_ui; - } + UserInterface& ui() const; bool has_ui() const { return (bool)m_ui; } - void change_editor(Editor& editor) - { - m_editor.reset(&editor); - if (has_window()) - { - if (has_ui()) - window().set_dimensions(ui().dimensions()); - window().hooks().run_hook("WinDisplay", buffer().name(), *this); - } - } - - OptionManager& options() const - { - if (has_window()) - return window().options(); - if (has_buffer()) - return buffer().options(); - return GlobalOptions::instance(); - } - - HookManager& hooks() const - { - if (has_window()) - return window().hooks(); - if (has_buffer()) - return buffer().hooks(); - return GlobalHooks::instance(); - } - - void print_status(const DisplayLine& status) const - { - if (has_ui()) - ui().print_status(status); - } - - void push_jump() - { - const SelectionList& jump = editor().selections(); - if (m_current_jump != m_jump_list.end()) - { - auto begin = m_current_jump; - if (&editor().buffer() != &begin->buffer() or - (const SelectionList&)(*begin) != jump) - ++begin; - m_jump_list.erase(begin, m_jump_list.end()); - } - m_jump_list.erase(std::remove(begin(m_jump_list), end(m_jump_list), jump), - end(m_jump_list)); - m_jump_list.push_back({editor().buffer(), jump}); - m_current_jump = m_jump_list.end(); - } - - const SelectionList& jump_forward() - { - if (m_current_jump != m_jump_list.end() and - m_current_jump + 1 != m_jump_list.end()) - return *++m_current_jump; - throw runtime_error("no next jump"); - } - - const SelectionList& jump_backward() - { - if (m_current_jump != m_jump_list.begin()) - { - if (m_current_jump == m_jump_list.end()) - { - push_jump(); - --m_current_jump; - } - return *--m_current_jump; - } - throw runtime_error("no previous jump"); - } - - void forget_jumps_to_buffer(Buffer& buffer) - { - for (auto it = m_jump_list.begin(); it != m_jump_list.end();) - { - if (&it->buffer() == &buffer) - { - if (it < m_current_jump) - --m_current_jump; - else if (it == m_current_jump) - m_current_jump = m_jump_list.end()-1; - - it = m_jump_list.erase(it); - } - else - ++it; - } - } + void change_editor(Editor& editor); + + OptionManager& options() const; + HookManager& hooks() const; + + void print_status(const DisplayLine& status) const; + + void push_jump(); + const SelectionList& jump_forward(); + const SelectionList& jump_backward(); + void forget_jumps_to_buffer(Buffer& buffer); int& numeric_param() { return m_numeric_param; } private: safe_ptr<Editor> m_editor; - InputHandler* m_input_handler = nullptr; + safe_ptr<InputHandler> m_input_handler; safe_ptr<UserInterface> m_ui; int m_numeric_param = 0; |
