summaryrefslogtreecommitdiff
path: root/src
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
parent240e0321e81c5919f98d4d812cf909e63a53b9d9 (diff)
move context implementation to context.cc
Diffstat (limited to 'src')
-rw-r--r--src/client_manager.cc6
-rw-r--r--src/commands.cc28
-rw-r--r--src/context.cc152
-rw-r--r--src/context.hh160
-rw-r--r--src/highlighters.cc7
-rw-r--r--src/input_handler.cc6
-rw-r--r--src/input_handler.hh8
7 files changed, 213 insertions, 154 deletions
diff --git a/src/client_manager.cc b/src/client_manager.cc
index fc95c118..0cf05967 100644
--- a/src/client_manager.cc
+++ b/src/client_manager.cc
@@ -1,10 +1,12 @@
#include "client_manager.hh"
-#include "event_manager.hh"
#include "buffer_manager.hh"
+#include "color_registry.hh"
#include "command_manager.hh"
+#include "event_manager.hh"
#include "file.hh"
-#include "color_registry.hh"
+#include "user_interface.hh"
+#include "window.hh"
namespace Kakoune
{
diff --git a/src/commands.cc b/src/commands.cc
index 72b6d347..63ec8ddc 100644
--- a/src/commands.cc
+++ b/src/commands.cc
@@ -1,26 +1,28 @@
#include "commands.hh"
-#include "command_manager.hh"
+#include "buffer.hh"
#include "buffer_manager.hh"
-#include "option_manager.hh"
+#include "client_manager.hh"
+#include "color_registry.hh"
+#include "command_manager.hh"
+#include "completion.hh"
#include "context.hh"
-#include "buffer.hh"
-#include "window.hh"
+#include "debug.hh"
+#include "event_manager.hh"
#include "file.hh"
-#include "input_handler.hh"
-#include "string.hh"
+#include "filter.hh"
#include "highlighter.hh"
#include "highlighters.hh"
-#include "filter.hh"
+#include "input_handler.hh"
+#include "option_manager.hh"
+#include "option_types.hh"
+#include "parameters_parser.hh"
#include "register_manager.hh"
-#include "completion.hh"
#include "shell_manager.hh"
-#include "event_manager.hh"
-#include "color_registry.hh"
-#include "client_manager.hh"
-#include "parameters_parser.hh"
+#include "string.hh"
+#include "user_interface.hh"
#include "utf8_iterator.hh"
-#include "option_types.hh"
+#include "window.hh"
#include <sys/types.h>
#include <sys/stat.h>
diff --git a/src/context.cc b/src/context.cc
new file mode 100644
index 00000000..30c56e20
--- /dev/null
+++ b/src/context.cc
@@ -0,0 +1,152 @@
+#include "context.hh"
+
+#include "input_handler.hh"
+#include "user_interface.hh"
+#include "window.hh"
+
+namespace Kakoune
+{
+
+Context::Context() = default;
+
+Context::Context(Editor& editor)
+ : m_editor(&editor) {}
+
+Context::Context(InputHandler& input_handler, UserInterface& ui)
+ : m_input_handler(&input_handler), m_ui(&ui) {}
+
+Context::~Context() = default;
+
+Buffer& Context::buffer() const
+{
+ if (not has_buffer())
+ throw runtime_error("no buffer in context");
+ return m_editor->buffer();
+}
+
+Editor& Context::editor() const
+{
+ if (not has_editor())
+ throw runtime_error("no editor in context");
+ return *m_editor.get();
+}
+
+Window& Context::window() const
+{
+ if (not has_window())
+ throw runtime_error("no window in context");
+ return *dynamic_cast<Window*>(m_editor.get());
+}
+
+bool Context::has_window() const
+{
+ return (bool)m_editor and dynamic_cast<Window*>(m_editor.get());
+}
+
+InputHandler& Context::input_handler() const
+{
+ if (not has_input_handler())
+ throw runtime_error("no input handler in context");
+ return *m_input_handler;
+}
+
+UserInterface& Context::ui() const
+{
+ if (not has_ui())
+ throw runtime_error("no user interface in context");
+ return *m_ui;
+}
+
+OptionManager& Context::options() const
+{
+ if (has_window())
+ return window().options();
+ if (has_buffer())
+ return buffer().options();
+ return GlobalOptions::instance();
+}
+
+HookManager& Context::hooks() const
+{
+ if (has_window())
+ return window().hooks();
+ if (has_buffer())
+ return buffer().hooks();
+ return GlobalHooks::instance();
+}
+
+void Context::print_status(const DisplayLine& status) const
+{
+ if (has_ui())
+ ui().print_status(status);
+}
+
+void Context::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& Context::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& Context::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 Context::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 Context::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);
+ }
+}
+
+}
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;
diff --git a/src/highlighters.cc b/src/highlighters.cc
index ae0591f0..0e56d1e2 100644
--- a/src/highlighters.cc
+++ b/src/highlighters.cc
@@ -1,13 +1,14 @@
#include "highlighters.hh"
+
#include "assert.hh"
#include "color_registry.hh"
-#include "register_manager.hh"
#include "context.hh"
+#include "option_types.hh"
+#include "register_manager.hh"
#include "string.hh"
#include "utf8.hh"
#include "utf8_iterator.hh"
-
-#include "option_types.hh"
+#include "window.hh"
#include <sstream>
#include <locale>
diff --git a/src/input_handler.cc b/src/input_handler.cc
index a8b161cb..c8a1466f 100644
--- a/src/input_handler.cc
+++ b/src/input_handler.cc
@@ -1,11 +1,13 @@
#include "input_handler.hh"
+#include "color_registry.hh"
#include "context.hh"
#include "editor.hh"
-#include "register_manager.hh"
#include "event_manager.hh"
+#include "register_manager.hh"
+#include "user_interface.hh"
#include "utf8.hh"
-#include "color_registry.hh"
+#include "window.hh"
#include <unordered_map>
diff --git a/src/input_handler.hh b/src/input_handler.hh
index 7b2d771f..5dccced1 100644
--- a/src/input_handler.hh
+++ b/src/input_handler.hh
@@ -1,11 +1,13 @@
#ifndef input_handler_hh_INCLUDED
#define input_handler_hh_INCLUDED
-#include "keys.hh"
+#include "color.hh"
#include "completion.hh"
-#include "utils.hh"
-#include "string.hh"
#include "context.hh"
+#include "editor.hh"
+#include "keys.hh"
+#include "string.hh"
+#include "utils.hh"
namespace Kakoune
{