diff options
Diffstat (limited to 'Source')
-rw-r--r-- | Source/CursesDialog/cmCursesLongMessageForm.cxx | 178 | ||||
-rw-r--r-- | Source/CursesDialog/cmCursesLongMessageForm.h | 47 |
2 files changed, 225 insertions, 0 deletions
diff --git a/Source/CursesDialog/cmCursesLongMessageForm.cxx b/Source/CursesDialog/cmCursesLongMessageForm.cxx new file mode 100644 index 0000000..f97fee1 --- /dev/null +++ b/Source/CursesDialog/cmCursesLongMessageForm.cxx @@ -0,0 +1,178 @@ +#include "../cmCacheManager.h" +#include "../cmSystemTools.h" +#include "../cmake.h" +#include "cmCursesLongMessageForm.h" +#include "cmCursesMainForm.h" + +cmCursesLongMessageForm::cmCursesLongMessageForm(std::vector<string> const& + messages, const char* + title) +{ + // Append all messages into on big string + std::vector<string>::const_iterator it; + for(it=messages.begin(); it != messages.end(); it++) + { + m_Messages += (*it); + // Add one blank line after each message + m_Messages += "\n\n"; + } + m_Title = title; + m_Fields[0] = 0; + m_Fields[1] = 0; +} + +cmCursesLongMessageForm::~cmCursesLongMessageForm() +{ + if (m_Fields[0]) + { + free_field(m_Fields[0]); + } +} + + +void cmCursesLongMessageForm::UpdateStatusBar() +{ + int x,y; + getmaxyx(stdscr, y, x); + + char bar[cmCursesMainForm::MAX_WIDTH]; + int size = strlen(m_Title.c_str()); + if ( size >= cmCursesMainForm::MAX_WIDTH ) + { + size = cmCursesMainForm::MAX_WIDTH-1; + } + strncpy(bar, m_Title.c_str(), size); + for(int i=size-1; i<cmCursesMainForm::MAX_WIDTH; i++) bar[i] = ' '; + + int width; + if (x < cmCursesMainForm::MAX_WIDTH ) + { + width = x; + } + else + { + width = cmCursesMainForm::MAX_WIDTH; + } + + bar[width] = '\0'; + + char version[cmCursesMainForm::MAX_WIDTH]; + char vertmp[128]; + sprintf(vertmp,"CMake Version %d.%d", cmMakefile::GetMajorVersion(), + cmMakefile::GetMinorVersion()); + int sideSpace = (width-strlen(vertmp)); + for(int i=0; i<sideSpace; i++) { version[i] = ' '; } + sprintf(version+sideSpace, "%s", vertmp); + version[width] = '\0'; + + curses_move(y-4,0); + attron(A_STANDOUT); + printw(bar); + attroff(A_STANDOUT); + curses_move(y-3,0); + printw(version); + pos_form_cursor(m_Form); +} + +void cmCursesLongMessageForm::PrintKeys() +{ + int x,y; + getmaxyx(stdscr, y, x); + if ( x < cmCursesMainForm::MIN_WIDTH || + y < cmCursesMainForm::MIN_HEIGHT ) + { + return; + } + char firstLine[512]; + sprintf(firstLine, "O)k"); + + curses_move(y-2,0); + printw(firstLine); + pos_form_cursor(m_Form); + +} + +void cmCursesLongMessageForm::Render(int left, int top, int width, int height) +{ + int x,y; + getmaxyx(stdscr, y, x); + + if (m_Form) + { + unpost_form(m_Form); + free_form(m_Form); + m_Form = 0; + } + + const char* msg = m_Messages.c_str(); + + clear(); + + if (m_Fields[0]) + { + free_field(m_Fields[0]); + m_Fields[0] = 0; + } + + m_Fields[0] = new_field(y-6, x-2, 1, 1, 0, 0); + + field_opts_off(m_Fields[0], O_STATIC); + + m_Form = new_form(m_Fields); + post_form(m_Form); + + int i=0; + form_driver(m_Form, REQ_BEG_FIELD); + while(msg[i] != '\0') + { + if (msg[i] == '\n' && msg[i+1] != '\0') + { + form_driver(m_Form, REQ_NEW_LINE); + } + else + { + form_driver(m_Form, msg[i]); + } + i++; + } + form_driver(m_Form, REQ_BEG_FIELD); + + this->UpdateStatusBar(); + this->PrintKeys(); + touchwin(stdscr); + refresh(); + +} + +void cmCursesLongMessageForm::HandleInput() +{ + if (!m_Form) + { + return; + } + + while(1) + { + int key = getch(); + + // quit + if ( key == 'o' ) + { + break; + } + else if ( key == KEY_DOWN ) + { + form_driver(m_Form, REQ_SCR_FLINE); + } + else if ( key == KEY_UP ) + { + form_driver(m_Form, REQ_SCR_BLINE); + } + + this->UpdateStatusBar(); + this->PrintKeys(); + touchwin(stdscr); + wrefresh(stdscr); + } + +} diff --git a/Source/CursesDialog/cmCursesLongMessageForm.h b/Source/CursesDialog/cmCursesLongMessageForm.h new file mode 100644 index 0000000..6f28bd2 --- /dev/null +++ b/Source/CursesDialog/cmCursesLongMessageForm.h @@ -0,0 +1,47 @@ +#ifndef __cmCursesLongMessageForm_h +#define __cmCursesLongMessageForm_h + +#include "../cmStandardIncludes.h" +#include "cmCursesForm.h" +#include "cmCursesStandardIncludes.h" + +class cmCursesCacheEntryComposite; + +class cmCursesLongMessageForm : public cmCursesForm +{ +public: + cmCursesLongMessageForm(std::vector<string> const& messages, + const char* title); + virtual ~cmCursesLongMessageForm(); + + // Description: + // Handle user input. + virtual void HandleInput(); + + // Description: + // Display form. Use a window of size width x height, starting + // at top, left. + virtual void Render(int left, int top, int width, int height); + + // Description: + // This method should normally called only by the form. + // The only exception is during a resize. + void PrintKeys(); + + // Description: + // This method should normally called only by the form. + // The only exception is during a resize. + virtual void UpdateStatusBar(); + +protected: + cmCursesLongMessageForm(const cmCursesLongMessageForm& from); + void operator=(const cmCursesLongMessageForm&); + + std::string m_Messages; + std::string m_Title; + + FIELD* m_Fields[2]; + +}; + +#endif // __cmCursesLongMessageForm_h |