begin working on Cursor movement routines
This commit is contained in:
parent
e545336c51
commit
37ad814b53
@ -8,6 +8,7 @@ GapBuffer::GapBuffer(Encoding::Type encoding)
|
|||||||
m_size = 0u;
|
m_size = 0u;
|
||||||
m_gap_position = 0u;
|
m_gap_position = 0u;
|
||||||
m_encoding = encoding;
|
m_encoding = encoding;
|
||||||
|
tabstop = 4u;
|
||||||
}
|
}
|
||||||
|
|
||||||
GapBuffer::GapBuffer(uint8_t * buffer, size_t buffer_size, size_t size, Encoding::Type encoding)
|
GapBuffer::GapBuffer(uint8_t * buffer, size_t buffer_size, size_t size, Encoding::Type encoding)
|
||||||
@ -17,6 +18,7 @@ GapBuffer::GapBuffer(uint8_t * buffer, size_t buffer_size, size_t size, Encoding
|
|||||||
m_size = size;
|
m_size = size;
|
||||||
m_gap_position = size;
|
m_gap_position = size;
|
||||||
m_encoding = encoding;
|
m_encoding = encoding;
|
||||||
|
tabstop = 4u;
|
||||||
}
|
}
|
||||||
|
|
||||||
GapBuffer::~GapBuffer()
|
GapBuffer::~GapBuffer()
|
||||||
@ -86,3 +88,81 @@ bool GapBuffer::Iterator::check_back()
|
|||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
bool GapBuffer::Cursor::is_start_of_line()
|
||||||
|
{
|
||||||
|
Iterator i2 = m_iterator;
|
||||||
|
if (!i2.check_back())
|
||||||
|
{
|
||||||
|
/* Iterator cannot go backwards so it is at beginning of buffer. */
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return *i2 == '\n';
|
||||||
|
}
|
||||||
|
|
||||||
|
bool GapBuffer::Cursor::go_start_of_line()
|
||||||
|
{
|
||||||
|
/* TODO */
|
||||||
|
}
|
||||||
|
|
||||||
|
bool GapBuffer::Cursor::go_end_of_line()
|
||||||
|
{
|
||||||
|
/* TODO */
|
||||||
|
}
|
||||||
|
|
||||||
|
bool GapBuffer::Cursor::go_left()
|
||||||
|
{
|
||||||
|
if (!is_start_of_line())
|
||||||
|
{
|
||||||
|
uint32_t chr = *m_iterator;
|
||||||
|
if (m_iterator.check_back())
|
||||||
|
{
|
||||||
|
if (chr == '\t')
|
||||||
|
{
|
||||||
|
calculate_column();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
/* TODO: handle multi-column characters */
|
||||||
|
m_column--;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool GapBuffer::Cursor::go_right()
|
||||||
|
{
|
||||||
|
if (!is_end_of_line())
|
||||||
|
{
|
||||||
|
if (m_iterator.check_forward())
|
||||||
|
{
|
||||||
|
uint32_t chr = *m_iterator;
|
||||||
|
if (chr == '\t')
|
||||||
|
{
|
||||||
|
uint8_t tabstop = m_iterator.gap_buffer()->tabstop;
|
||||||
|
m_column += tabstop - (m_column + 1u) % tabstop;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
/* TODO: handle multi-column characters */
|
||||||
|
m_column++;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
void GapBuffer::Cursor::calculate_column()
|
||||||
|
{
|
||||||
|
Cursor tmp_cursor = *this;
|
||||||
|
tmp_cursor.go_start_of_line();
|
||||||
|
while (tmp_cursor < *this)
|
||||||
|
{
|
||||||
|
tmp_cursor.go_right();
|
||||||
|
}
|
||||||
|
m_column = tmp_cursor.m_column;
|
||||||
|
}
|
||||||
|
@ -41,6 +41,11 @@ public:
|
|||||||
return 0xFFFFFFFFu;
|
return 0xFFFFFFFFu;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
GapBuffer * gap_buffer() { return m_gap_buffer; }
|
||||||
|
bool operator<(const Iterator & other)
|
||||||
|
{
|
||||||
|
return m_offset < other.m_offset;
|
||||||
|
}
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
GapBuffer * m_gap_buffer;
|
GapBuffer * m_gap_buffer;
|
||||||
@ -56,13 +61,30 @@ public:
|
|||||||
m_line = 0u;
|
m_line = 0u;
|
||||||
m_column = 0u;
|
m_column = 0u;
|
||||||
}
|
}
|
||||||
|
bool is_start_of_line();
|
||||||
|
bool is_end_of_line()
|
||||||
|
{
|
||||||
|
return *m_iterator == '\n';
|
||||||
|
}
|
||||||
|
bool go_start_of_line();
|
||||||
|
bool go_end_of_line();
|
||||||
|
bool go_left();
|
||||||
|
bool go_right();
|
||||||
|
bool operator<(const Cursor & other)
|
||||||
|
{
|
||||||
|
return m_iterator < other.m_iterator;
|
||||||
|
}
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
Iterator m_iterator;
|
Iterator m_iterator;
|
||||||
size_t m_line;
|
size_t m_line;
|
||||||
size_t m_column;
|
size_t m_column;
|
||||||
|
|
||||||
|
void calculate_column();
|
||||||
};
|
};
|
||||||
|
|
||||||
|
uint8_t tabstop;
|
||||||
|
|
||||||
GapBuffer(Encoding::Type encoding);
|
GapBuffer(Encoding::Type encoding);
|
||||||
GapBuffer(uint8_t * buffer, size_t buffer_size, size_t size, Encoding::Type encoding);
|
GapBuffer(uint8_t * buffer, size_t buffer_size, size_t size, Encoding::Type encoding);
|
||||||
~GapBuffer();
|
~GapBuffer();
|
||||||
|
Loading…
x
Reference in New Issue
Block a user