cmCursesStringWidget.cxx 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125
  1. #include "cmCursesStringWidget.h"
  2. inline int ctrl(int z)
  3. {
  4. return (z&037);
  5. }
  6. cmCursesStringWidget::cmCursesStringWidget(int width, int height,
  7. int left, int top) :
  8. cmCursesWidget(width, height, left, top)
  9. {
  10. m_InEdit = false;
  11. m_Type = cmCacheManager::STRING;
  12. set_field_fore(m_Field, A_NORMAL);
  13. set_field_back(m_Field, A_STANDOUT);
  14. field_opts_off(m_Field, O_STATIC);
  15. }
  16. bool cmCursesStringWidget::HandleInput(int& key, FORM* form, WINDOW* w)
  17. {
  18. // 10 == enter
  19. if (!m_InEdit && ( key != 10 ) )
  20. {
  21. return false;
  22. }
  23. char* originalStr=0;
  24. // <Enter> is used to change edit mode (like <Esc> in vi).
  25. while(1)
  26. {
  27. // If resize occured during edit, move out of edit mode
  28. if (!m_InEdit && ( key != 10 && key != KEY_ENTER ) )
  29. {
  30. return false;
  31. }
  32. // 10 == enter
  33. if (key == 10 || key == KEY_ENTER)
  34. {
  35. if (m_InEdit)
  36. {
  37. m_InEdit = false;
  38. delete[] originalStr;
  39. // trick to force forms to update the field buffer
  40. form_driver(form, REQ_NEXT_FIELD);
  41. form_driver(form, REQ_PREV_FIELD);
  42. return true;
  43. }
  44. else
  45. {
  46. m_InEdit = true;
  47. char* buf = field_buffer(m_Field, 0);
  48. originalStr = new char[strlen(buf)+1];
  49. strcpy(originalStr, buf);
  50. }
  51. }
  52. // esc
  53. else if (key == 27)
  54. {
  55. if (m_InEdit)
  56. {
  57. m_InEdit = false;
  58. this->SetString(originalStr);
  59. delete[] originalStr;
  60. touchwin(w);
  61. wrefresh(w);
  62. return true;
  63. }
  64. }
  65. else if ( key == KEY_LEFT || key == ctrl('b') )
  66. {
  67. form_driver(form, REQ_PREV_CHAR);
  68. }
  69. else if ( key == KEY_RIGHT || key == ctrl('f') )
  70. {
  71. form_driver(form, REQ_NEXT_CHAR);
  72. }
  73. else if ( key == ctrl('k') )
  74. {
  75. form_driver(form, REQ_CLR_EOL);
  76. }
  77. else if ( key == ctrl('a') )
  78. {
  79. form_driver(form, REQ_BEG_FIELD);
  80. }
  81. else if ( key == ctrl('e') )
  82. {
  83. form_driver(form, REQ_END_FIELD);
  84. }
  85. else if ( key == ctrl('d') || key == 127 ||
  86. key == KEY_BACKSPACE )
  87. {
  88. form_driver(form, REQ_DEL_PREV);
  89. }
  90. else if ( key == ctrl('d') || key == 127 ||
  91. key == KEY_BACKSPACE || key == KEY_DC )
  92. {
  93. form_driver(form, REQ_DEL_PREV);
  94. }
  95. else
  96. {
  97. form_driver(form, key);
  98. }
  99. touchwin(w);
  100. wrefresh(w);
  101. key=getch();
  102. }
  103. }
  104. void cmCursesStringWidget::SetString(const char* value)
  105. {
  106. this->SetValue(value);
  107. }
  108. const char* cmCursesStringWidget::GetString()
  109. {
  110. return this->GetValue();
  111. }
  112. const char* cmCursesStringWidget::GetValue()
  113. {
  114. return field_buffer(m_Field, 0);
  115. }