cmCursesLongMessageForm.cxx 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191
  1. #include "../cmCacheManager.h"
  2. #include "../cmSystemTools.h"
  3. #include "../cmake.h"
  4. #include "cmCursesLongMessageForm.h"
  5. #include "cmCursesMainForm.h"
  6. inline int ctrl(int z)
  7. {
  8. return (z&037);
  9. }
  10. cmCursesLongMessageForm::cmCursesLongMessageForm(std::vector<std::string>
  11. const& messages, const char*
  12. title)
  13. {
  14. // Append all messages into on big string
  15. std::vector<std::string>::const_iterator it;
  16. for(it=messages.begin(); it != messages.end(); it++)
  17. {
  18. m_Messages += (*it);
  19. // Add one blank line after each message
  20. m_Messages += "\n\n";
  21. }
  22. m_Title = title;
  23. m_Fields[0] = 0;
  24. m_Fields[1] = 0;
  25. }
  26. cmCursesLongMessageForm::~cmCursesLongMessageForm()
  27. {
  28. if (m_Fields[0])
  29. {
  30. free_field(m_Fields[0]);
  31. }
  32. }
  33. void cmCursesLongMessageForm::UpdateStatusBar()
  34. {
  35. int x,y;
  36. getmaxyx(stdscr, y, x);
  37. char bar[cmCursesMainForm::MAX_WIDTH];
  38. int size = strlen(m_Title.c_str());
  39. if ( size >= cmCursesMainForm::MAX_WIDTH )
  40. {
  41. size = cmCursesMainForm::MAX_WIDTH-1;
  42. }
  43. strncpy(bar, m_Title.c_str(), size);
  44. for(int i=size-1; i<cmCursesMainForm::MAX_WIDTH; i++) bar[i] = ' ';
  45. int width;
  46. if (x < cmCursesMainForm::MAX_WIDTH )
  47. {
  48. width = x;
  49. }
  50. else
  51. {
  52. width = cmCursesMainForm::MAX_WIDTH;
  53. }
  54. bar[width] = '\0';
  55. char version[cmCursesMainForm::MAX_WIDTH];
  56. char vertmp[128];
  57. sprintf(vertmp,"CMake Version %d.%d", cmMakefile::GetMajorVersion(),
  58. cmMakefile::GetMinorVersion());
  59. int sideSpace = (width-strlen(vertmp));
  60. for(int i=0; i<sideSpace; i++) { version[i] = ' '; }
  61. sprintf(version+sideSpace, "%s", vertmp);
  62. version[width] = '\0';
  63. curses_move(y-4,0);
  64. attron(A_STANDOUT);
  65. printw(bar);
  66. attroff(A_STANDOUT);
  67. curses_move(y-3,0);
  68. printw(version);
  69. pos_form_cursor(m_Form);
  70. }
  71. void cmCursesLongMessageForm::PrintKeys()
  72. {
  73. int x,y;
  74. getmaxyx(stdscr, y, x);
  75. if ( x < cmCursesMainForm::MIN_WIDTH ||
  76. y < cmCursesMainForm::MIN_HEIGHT )
  77. {
  78. return;
  79. }
  80. char firstLine[512];
  81. sprintf(firstLine, "O)k");
  82. curses_move(y-2,0);
  83. printw(firstLine);
  84. pos_form_cursor(m_Form);
  85. }
  86. void cmCursesLongMessageForm::Render(int left, int top, int width, int height)
  87. {
  88. int x,y;
  89. getmaxyx(stdscr, y, x);
  90. if (m_Form)
  91. {
  92. unpost_form(m_Form);
  93. free_form(m_Form);
  94. m_Form = 0;
  95. }
  96. const char* msg = m_Messages.c_str();
  97. curses_clear();
  98. if (m_Fields[0])
  99. {
  100. free_field(m_Fields[0]);
  101. m_Fields[0] = 0;
  102. }
  103. m_Fields[0] = new_field(y-6, x-2, 1, 1, 0, 0);
  104. field_opts_off(m_Fields[0], O_STATIC);
  105. m_Form = new_form(m_Fields);
  106. post_form(m_Form);
  107. int i=0;
  108. form_driver(m_Form, REQ_BEG_FIELD);
  109. while(msg[i] != '\0')
  110. {
  111. if (msg[i] == '\n' && msg[i+1] != '\0')
  112. {
  113. form_driver(m_Form, REQ_NEW_LINE);
  114. }
  115. else
  116. {
  117. form_driver(m_Form, msg[i]);
  118. }
  119. i++;
  120. }
  121. form_driver(m_Form, REQ_BEG_FIELD);
  122. this->UpdateStatusBar();
  123. this->PrintKeys();
  124. touchwin(stdscr);
  125. refresh();
  126. }
  127. void cmCursesLongMessageForm::HandleInput()
  128. {
  129. if (!m_Form)
  130. {
  131. return;
  132. }
  133. while(1)
  134. {
  135. int key = getch();
  136. // quit
  137. if ( key == 'o' )
  138. {
  139. break;
  140. }
  141. else if ( key == KEY_DOWN || key == ctrl('n') )
  142. {
  143. form_driver(m_Form, REQ_SCR_FLINE);
  144. }
  145. else if ( key == KEY_UP || key == ctrl('p') )
  146. {
  147. form_driver(m_Form, REQ_SCR_BLINE);
  148. }
  149. else if ( key == KEY_NPAGE || key == ctrl('d') )
  150. {
  151. form_driver(m_Form, REQ_SCR_FPAGE);
  152. }
  153. else if ( key == KEY_PPAGE || key == ctrl('u') )
  154. {
  155. form_driver(m_Form, REQ_SCR_BPAGE);
  156. }
  157. this->UpdateStatusBar();
  158. this->PrintKeys();
  159. touchwin(stdscr);
  160. wrefresh(stdscr);
  161. }
  162. }