summaryrefslogtreecommitdiff
path: root/src/editor.cc
diff options
context:
space:
mode:
authorMaxime Coste <frrrwww@gmail.com>2012-10-09 19:36:03 +0200
committerMaxime Coste <frrrwww@gmail.com>2012-10-10 13:59:55 +0200
commitb48d6399765fa06e6c6723d3df35eb53b1c3148c (patch)
treea70bda4c2c8dc6263b5a090a559ea39908206bfa /src/editor.cc
parentd574ae864d828fb743c9bebf90f968e26508204c (diff)
Editor::insert handle all InsertModes
Diffstat (limited to 'src/editor.cc')
-rw-r--r--src/editor.cc37
1 files changed, 33 insertions, 4 deletions
diff --git a/src/editor.cc b/src/editor.cc
index 69ee81e9..b07ed449 100644
--- a/src/editor.cc
+++ b/src/editor.cc
@@ -29,6 +29,37 @@ void Editor::erase()
}
}
+static BufferIterator prepare_insert(Buffer& buffer, const Selection& sel,
+ InsertMode mode)
+{
+ switch (mode)
+ {
+ case InsertMode::Insert:
+ case InsertMode::Replace:
+ return sel.begin();
+ case InsertMode::Append:
+ return sel.end();
+ case InsertMode::InsertAtLineBegin:
+ return buffer.iterator_at_line_begin(sel.begin());
+ case InsertMode::AppendAtLineEnd:
+ return buffer.iterator_at_line_end(sel.end()-1);
+ case InsertMode::OpenLineBelow:
+ {
+ auto pos = buffer.iterator_at_line_end(sel.end() - 1);
+ buffer.insert(pos, "\n");
+ return buffer.iterator_at_line_begin(pos.line() + 1);
+ }
+ case InsertMode::OpenLineAbove:
+ {
+ auto pos = buffer.iterator_at_line_begin(sel.begin());
+ buffer.insert(pos, "\n");
+ return pos;
+ }
+ }
+ assert(false);
+ return BufferIterator{};
+}
+
void Editor::insert(const String& string, InsertMode mode)
{
scoped_edition edition(*this);
@@ -37,8 +68,7 @@ void Editor::insert(const String& string, InsertMode mode)
for (auto& sel : m_selections)
{
- BufferIterator pos = (mode == InsertMode::Append) ?
- sel.end() : sel.begin();
+ BufferIterator pos = prepare_insert(m_buffer, sel.selection, mode);
m_buffer.insert(pos, string);
}
}
@@ -54,8 +84,7 @@ void Editor::insert(const memoryview<String>& strings, InsertMode mode)
for (size_t i = 0; i < selections().size(); ++i)
{
- BufferIterator pos = (mode == InsertMode::Append) ?
- m_selections[i].end() : m_selections[i].begin();
+ BufferIterator pos = prepare_insert(m_buffer, m_selections[i].selection, mode);
size_t index = std::min(i, strings.size()-1);
m_buffer.insert(pos, strings[index]);
}