diff options
| author | Maxime Coste <frrrwww@gmail.com> | 2012-01-31 19:12:06 +0000 |
|---|---|---|
| committer | Maxime Coste <frrrwww@gmail.com> | 2012-01-31 19:12:06 +0000 |
| commit | 69d96c90da543fee83cd6f9fbac6d3348d28d446 (patch) | |
| tree | 49a3a90f68a2dd504630db0171468fda082c5266 /src/editor.hh | |
| parent | d23a175533ebc04fa5c8a9712118cc5bf509adf0 (diff) | |
extract an Editor class from Window and refactor
Diffstat (limited to 'src/editor.hh')
| -rw-r--r-- | src/editor.hh | 115 |
1 files changed, 115 insertions, 0 deletions
diff --git a/src/editor.hh b/src/editor.hh new file mode 100644 index 00000000..988564ce --- /dev/null +++ b/src/editor.hh @@ -0,0 +1,115 @@ +#ifndef editor_hh_INCLUDED +#define editor_hh_INCLUDED + +#include "buffer.hh" +#include "selection.hh" +#include "filter.hh" +#include "idvaluemap.hh" +#include "hooks_manager.hh" + +namespace Kakoune +{ + +class IncrementalInserter; + +// An Editor is a buffer mutator +// +// The Editor class provides methods to manipulate a set of selections +// and to use these selections to mutate it's buffer. +class Editor +{ +public: + typedef BufferString String; + typedef std::function<Selection (const BufferIterator&)> Selector; + typedef std::function<SelectionList (const Selection&)> MultiSelector; + + Editor(Buffer& buffer); + virtual ~Editor() {} + + Buffer& buffer() const { return m_buffer; } + + void erase(); + void insert(const String& string); + void append(const String& string); + void replace(const String& string); + + void push_selections(); + void pop_selections(); + + void move_selections(const BufferCoord& offset, bool append = false); + void clear_selections(); + void keep_selection(int index); + void select(const BufferIterator& iterator); + void select(const Selector& selector, bool append = false); + void multi_select(const MultiSelector& selector); + + BufferString selection_content() const; + const SelectionList& selections() const { return m_selections.back(); } + + bool undo(); + bool redo(); + + void add_filter(FilterAndId&& filter); + void remove_filter(const std::string& id); + + CandidateList complete_filterid(const std::string& prefix, + size_t cursor_pos = std::string::npos); + + bool is_inserting() const { return m_current_inserter != nullptr; } + +private: + void erase_noundo(); + void insert_noundo(const String& string); + void append_noundo(const String& string); + + SelectionList& selections() { return m_selections.back(); } + + void check_invariant() const; + + friend class IncrementalInserter; + IncrementalInserter* m_current_inserter; + + void begin_incremental_insert(IncrementalInserter* inserter); + void end_incremental_insert(IncrementalInserter* inserter); + virtual void on_begin_incremental_insert() {} + virtual void on_end_incremental_insert() {} + + + Buffer& m_buffer; + std::vector<SelectionList> m_selections; + idvaluemap<std::string, FilterFunc> m_filters; +}; + +// An IncrementalInserter manage insert mode +class IncrementalInserter +{ +public: + enum class Mode + { + Insert, + Append, + Change, + InsertAtLineBegin, + AppendAtLineEnd, + OpenLineBelow, + OpenLineAbove + }; + + IncrementalInserter(Editor& editor, Mode mode = Mode::Insert); + ~IncrementalInserter(); + + void insert(const Editor::String& string); + void insert_capture(size_t index); + void erase(); + void move_cursors(const BufferCoord& offset); + +private: + void apply(Modification&& modification) const; + + Editor& m_editor; +}; + +} + +#endif // editor_hh_INCLUDED + |
