diff options
Diffstat (limited to 'Source/CursesDialog/cmCursesLongMessageForm.cxx')
-rw-r--r-- | Source/CursesDialog/cmCursesLongMessageForm.cxx | 207 |
1 files changed, 207 insertions, 0 deletions
diff --git a/Source/CursesDialog/cmCursesLongMessageForm.cxx b/Source/CursesDialog/cmCursesLongMessageForm.cxx new file mode 100644 index 0000000..057f8f3 --- /dev/null +++ b/Source/CursesDialog/cmCursesLongMessageForm.cxx @@ -0,0 +1,207 @@ +/*============================================================================ + CMake - Cross Platform Makefile Generator + Copyright 2000-2009 Kitware, Inc., Insight Software Consortium + + Distributed under the OSI-approved BSD License (the "License"); + see accompanying file Copyright.txt for details. + + This software is distributed WITHOUT ANY WARRANTY; without even the + implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + See the License for more information. +============================================================================*/ +#include "../cmCacheManager.h" +#include "../cmSystemTools.h" +#include "../cmake.h" +#include "../cmVersion.h" +#include "cmCursesLongMessageForm.h" +#include "cmCursesMainForm.h" + +inline int ctrl(int z) +{ + return (z&037); +} + +cmCursesLongMessageForm::cmCursesLongMessageForm(std::vector<std::string> + const& messages, const char* + title) +{ + // Append all messages into on big string + std::vector<std::string>::const_iterator it; + for(it=messages.begin(); it != messages.end(); it++) + { + this->Messages += (*it); + // Add one blank line after each message + this->Messages += "\n\n"; + } + this->Title = title; + this->Fields[0] = 0; + this->Fields[1] = 0; +} + +cmCursesLongMessageForm::~cmCursesLongMessageForm() +{ + if (this->Fields[0]) + { + free_field(this->Fields[0]); + } +} + + +void cmCursesLongMessageForm::UpdateStatusBar() +{ + int x,y; + getmaxyx(stdscr, y, x); + + char bar[cmCursesMainForm::MAX_WIDTH]; + size_t size = strlen(this->Title.c_str()); + if ( size >= cmCursesMainForm::MAX_WIDTH ) + { + size = cmCursesMainForm::MAX_WIDTH-1; + } + strncpy(bar, this->Title.c_str(), size); + for(size_t i=size-1; i<cmCursesMainForm::MAX_WIDTH; i++) bar[i] = ' '; + + int width; + if (x < cmCursesMainForm::MAX_WIDTH ) + { + width = x; + } + else + { + width = cmCursesMainForm::MAX_WIDTH-1; + } + + bar[width] = '\0'; + + char version[cmCursesMainForm::MAX_WIDTH]; + char vertmp[128]; + sprintf(vertmp,"CMake Version %s", cmVersion::GetCMakeVersion()); + size_t sideSpace = (width-strlen(vertmp)); + for(size_t 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(this->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, "Press [e] to exit help"); + + curses_move(y-2,0); + printw(firstLine); + pos_form_cursor(this->Form); + +} + +void cmCursesLongMessageForm::Render(int, int, int, int) +{ + int x,y; + getmaxyx(stdscr, y, x); + + if (this->Form) + { + unpost_form(this->Form); + free_form(this->Form); + this->Form = 0; + } + + const char* msg = this->Messages.c_str(); + + curses_clear(); + + if (this->Fields[0]) + { + free_field(this->Fields[0]); + this->Fields[0] = 0; + } + + this->Fields[0] = new_field(y-6, x-2, 1, 1, 0, 0); + + field_opts_off(this->Fields[0], O_STATIC); + + this->Form = new_form(this->Fields); + post_form(this->Form); + + int i=0; + form_driver(this->Form, REQ_BEG_FIELD); + while(msg[i] != '\0' && i < 60000) + { + if (msg[i] == '\n' && msg[i+1] != '\0') + { + form_driver(this->Form, REQ_NEW_LINE); + } + else + { + form_driver(this->Form, msg[i]); + } + i++; + } + form_driver(this->Form, REQ_BEG_FIELD); + + this->UpdateStatusBar(); + this->PrintKeys(); + touchwin(stdscr); + refresh(); + +} + +void cmCursesLongMessageForm::HandleInput() +{ + if (!this->Form) + { + return; + } + + char debugMessage[128]; + + for(;;) + { + int key = getch(); + + sprintf(debugMessage, "Message widget handling input, key: %d", key); + cmCursesForm::LogMessage(debugMessage); + + // quit + if ( key == 'o' || key == 'e' ) + { + break; + } + else if ( key == KEY_DOWN || key == ctrl('n') ) + { + form_driver(this->Form, REQ_SCR_FLINE); + } + else if ( key == KEY_UP || key == ctrl('p') ) + { + form_driver(this->Form, REQ_SCR_BLINE); + } + else if ( key == KEY_NPAGE || key == ctrl('d') ) + { + form_driver(this->Form, REQ_SCR_FPAGE); + } + else if ( key == KEY_PPAGE || key == ctrl('u') ) + { + form_driver(this->Form, REQ_SCR_BPAGE); + } + + this->UpdateStatusBar(); + this->PrintKeys(); + touchwin(stdscr); + wrefresh(stdscr); + } + +} |