summaryrefslogtreecommitdiff
path: root/src/context.hh
diff options
context:
space:
mode:
authorMaxime Coste <frrrwww@gmail.com>2013-04-09 19:39:03 +0200
committerMaxime Coste <frrrwww@gmail.com>2013-04-09 19:39:03 +0200
commit34b8604f902042985fa9a7101427f5eafadee55e (patch)
tree0bb559741a33a3e94e9fff00eb6e1c00b6d7cd39 /src/context.hh
parent240e0321e81c5919f98d4d812cf909e63a53b9d9 (diff)
move context implementation to context.cc
Diffstat (limited to 'src/context.hh')
-rw-r--r--src/context.hh160
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;