diff options
Diffstat (limited to 'Source/CursesDialog/cmCursesStringWidget.cxx')
-rw-r--r-- | Source/CursesDialog/cmCursesStringWidget.cxx | 106 |
1 files changed, 106 insertions, 0 deletions
diff --git a/Source/CursesDialog/cmCursesStringWidget.cxx b/Source/CursesDialog/cmCursesStringWidget.cxx new file mode 100644 index 0000000..90ca05c --- /dev/null +++ b/Source/CursesDialog/cmCursesStringWidget.cxx @@ -0,0 +1,106 @@ +#include "cmCursesStringWidget.h" +inline int ctrl(int z) +{ + return (z&037); +} + +cmCursesStringWidget::cmCursesStringWidget(int width, int height, + int left, int top) : + cmCursesWidget(width, height, left, top) +{ + m_InEdit = false; + m_Type = cmCacheManager::STRING; + set_field_fore(m_Field, A_NORMAL); + set_field_back(m_Field, A_STANDOUT); + field_opts_off(m_Field, O_STATIC); +} + + +bool cmCursesStringWidget::HandleInput(int& key, FORM* form, WINDOW* w) +{ + // 10 == enter + if (!m_InEdit && ( key != 10 ) ) + { + return false; + } + + char* originalStr=0; + + // <Enter> is used to change edit mode (like <Esc> in vi). + while(1) + { + if (!m_InEdit && ( key != 10 ) ) + { + return false; + } + // 10 == enter + if (key == 10) + { + if (m_InEdit) + { + m_InEdit = false; + delete[] originalStr; + // trick to force forms to update the field buffer + form_driver(form, REQ_NEXT_FIELD); + form_driver(form, REQ_PREV_FIELD); + return true; + } + else + { + m_InEdit = true; + char* buf = field_buffer(m_Field, 0); + originalStr = new char[strlen(buf)+1]; + strcpy(originalStr, buf); + } + } + else if (key == 27) + { + if (m_InEdit) + { + m_InEdit = false; + this->SetString(originalStr); + delete[] originalStr; + touchwin(w); + wrefresh(w); + return true; + } + } + else if ( key == KEY_LEFT || key == ctrl('b') ) + { + form_driver(form, REQ_PREV_CHAR); + } + else if ( key == KEY_RIGHT || key == ctrl('f') ) + { + form_driver(form, REQ_NEXT_CHAR); + } + else if ( key == ctrl('d') || key == 127 ) + { + form_driver(form, REQ_DEL_PREV); + } + else + { + form_driver(form, key); + } + + touchwin(w); + wrefresh(w); + + key=getch(); + } +} + +void cmCursesStringWidget::SetString(const char* value) +{ + this->SetValue(value); +} + +const char* cmCursesStringWidget::GetString() +{ + return this->GetValue(); +} + +const char* cmCursesStringWidget::GetValue() +{ + std::cout << field_buffer(m_Field, 0) << std::endl; + return field_buffer(m_Field, 0); +} |