ソースを参照

opps I forgot to add these

Berk Geveci 24 年 前
コミット
8a59c205bd

+ 178 - 0
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); 
+    }
+
+}

+ 47 - 0
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