summaryrefslogtreecommitdiffstats
path: root/Source/CursesDialog
diff options
context:
space:
mode:
authorBerk Geveci <berk.geveci@kitware.com>2001-11-06 03:10:52 (GMT)
committerBerk Geveci <berk.geveci@kitware.com>2001-11-06 03:10:52 (GMT)
commit4848c81428b8b8218eb86f23451ff32d78c039cd (patch)
tree33efacbfbe9d519bf62302fffbd06e49d7668c88 /Source/CursesDialog
parent1a8e3ba1e666da622e6f9eb8bcf87ebc707eaaf6 (diff)
downloadCMake-4848c81428b8b8218eb86f23451ff32d78c039cd.zip
CMake-4848c81428b8b8218eb86f23451ff32d78c039cd.tar.gz
CMake-4848c81428b8b8218eb86f23451ff32d78c039cd.tar.bz2
Many improvements.
Diffstat (limited to 'Source/CursesDialog')
-rw-r--r--Source/CursesDialog/ccurses.cxx15
-rw-r--r--Source/CursesDialog/cmCursesBoolWidget.cxx2
-rw-r--r--Source/CursesDialog/cmCursesLabelWidget.cxx1
-rw-r--r--Source/CursesDialog/cmCursesMainForm.cxx187
-rw-r--r--Source/CursesDialog/cmCursesMainForm.h17
-rw-r--r--Source/CursesDialog/cmCursesStringWidget.cxx27
6 files changed, 214 insertions, 35 deletions
diff --git a/Source/CursesDialog/ccurses.cxx b/Source/CursesDialog/ccurses.cxx
index 4017bd5..b89f16c 100644
--- a/Source/CursesDialog/ccurses.cxx
+++ b/Source/CursesDialog/ccurses.cxx
@@ -24,7 +24,7 @@ void onsig(int sig)
getmaxyx(w, y, x);
myform->SetWindow(w);
myform->Render(1,1,x,y);
- std::cerr << "Size change: " << x << " " << y << std::endl;
+ myform->UpdateStatusBar();
}
signal(SIGWINCH, onsig);
}
@@ -32,9 +32,9 @@ void onsig(int sig)
int main(int argc, char** argv)
{
- if ( argc != 2 )
+ if ( argc > 2 )
{
- std::cerr << "Usage: " << argv[0] << " source_directory"
+ std::cerr << "Usage: " << argv[0] << " source_directory."
<< std::endl;
return -1;
}
@@ -57,7 +57,14 @@ int main(int argc, char** argv)
int x,y;
getmaxyx(w, y, x);
- myform = new cmCursesMainForm(argv[1], newCache);
+ if ( argc == 2 )
+ {
+ myform = new cmCursesMainForm(argv[1], newCache);
+ }
+ else
+ {
+ myform = new cmCursesMainForm("", newCache);
+ }
myform->InitializeUI(w);
myform->Render(1, 1, x, y);
myform->HandleInput();
diff --git a/Source/CursesDialog/cmCursesBoolWidget.cxx b/Source/CursesDialog/cmCursesBoolWidget.cxx
index 4057a3f..9d54b54 100644
--- a/Source/CursesDialog/cmCursesBoolWidget.cxx
+++ b/Source/CursesDialog/cmCursesBoolWidget.cxx
@@ -14,7 +14,7 @@ cmCursesBoolWidget::cmCursesBoolWidget(int width, int height,
bool cmCursesBoolWidget::HandleInput(int& key, FORM* form, WINDOW* w)
{
// 10 == enter
- if (key == 10)
+ if (key == 10 || key == KEY_ENTER)
{
if (this->GetValueAsBool())
{
diff --git a/Source/CursesDialog/cmCursesLabelWidget.cxx b/Source/CursesDialog/cmCursesLabelWidget.cxx
index 6c8adcc..b260eac 100644
--- a/Source/CursesDialog/cmCursesLabelWidget.cxx
+++ b/Source/CursesDialog/cmCursesLabelWidget.cxx
@@ -7,6 +7,7 @@ cmCursesLabelWidget::cmCursesLabelWidget(int width, int height,
{
field_opts_off(m_Field, O_EDIT);
field_opts_off(m_Field, O_ACTIVE);
+ field_opts_off(m_Field, O_STATIC);
this->SetValue(name.c_str());
}
diff --git a/Source/CursesDialog/cmCursesMainForm.cxx b/Source/CursesDialog/cmCursesMainForm.cxx
index 9e2c111..57811ed 100644
--- a/Source/CursesDialog/cmCursesMainForm.cxx
+++ b/Source/CursesDialog/cmCursesMainForm.cxx
@@ -10,6 +10,16 @@
#include "cmCursesDummyWidget.h"
#include "cmCursesCacheEntryComposite.h"
+const int cmCursesMainForm::MIN_WIDTH = 65;
+const int cmCursesMainForm::MIN_HEIGHT = 6;
+const int cmCursesMainForm::IDEAL_WIDTH = 80;
+const int cmCursesMainForm::MAX_WIDTH = 512;
+
+inline int ctrl(int z)
+{
+ return (z&037);
+}
+
cmCursesMainForm::cmCursesMainForm(const char* whereSource,
bool newCache) :
m_WhereSource(whereSource)
@@ -188,14 +198,13 @@ void cmCursesMainForm::Render(int left, int top, int width, int height)
free_form(m_Form);
m_Form = 0;
}
- if ( width < 22 || height < 2 )
+ if ( width < cmCursesMainForm::MIN_WIDTH ||
+ height < cmCursesMainForm::MIN_HEIGHT )
{
return;
}
- std::cerr << "Rendering again." << std::endl;
-
- height -= 3;
+ height -= 5;
m_Height = height;
int size = m_Entries->size();
@@ -212,29 +221,98 @@ void cmCursesMainForm::Render(int left, int top, int width, int height)
}
m_Form = new_form(m_Fields);
post_form(m_Form);
- this->UpdateCurrentEntry();
+ this->UpdateStatusBar();
+ this->PrintKeys();
touchwin(m_Window);
refresh();
}
-void cmCursesMainForm::UpdateCurrentEntry()
+void cmCursesMainForm::PrintKeys()
{
- FIELD* cur = current_field(m_Form);
- int index = field_index(cur);
- char* text = field_buffer(m_Fields[index-2], 0);
-
int x,y;
getmaxyx(m_Window, y, x);
+ if ( x < cmCursesMainForm::MIN_WIDTH ||
+ y < cmCursesMainForm::MIN_HEIGHT )
+ {
+ return;
+ }
+ char firstLine[512], secondLine[512];
+ sprintf(firstLine, "C)onfigure G)enerate and Exit");
+ sprintf(secondLine, "Q)uit H)elp");
+
+ move(y-2,0);
+ printw(firstLine);
move(y-1,0);
- printw(text);
+ printw(secondLine);
+ pos_form_cursor(m_Form);
+
+}
+
+// Print the key of the current entry and the CMake version
+// on the status bar. Designed for a width of 80 chars.
+void cmCursesMainForm::UpdateStatusBar()
+{
+ int x,y;
+ getmaxyx(m_Window, y, x);
+ if ( x < cmCursesMainForm::MIN_WIDTH ||
+ y < cmCursesMainForm::MIN_HEIGHT )
+ {
+ move(0,0);
+ printw("Window is too small. A size of at least %dx%d is required.",
+ cmCursesMainForm::MIN_WIDTH, cmCursesMainForm::MIN_HEIGHT);
+ touchwin(m_Window);
+ wrefresh(m_Window);
+ return;
+ }
+
+ FIELD* cur = current_field(m_Form);
+ int index = field_index(cur);
+ char* curField = field_buffer(m_Fields[index-2], 0);
char version[128];
- sprintf(version,"CMake Version %d.%d", cmMakefile::GetMajorVersion(),
+ sprintf(version,"(CMake Version %d.%d)", cmMakefile::GetMajorVersion(),
cmMakefile::GetMinorVersion());
- int len = strlen(version);
- move(y-1, x-len);
- printw(version);
+ char bar[cmCursesMainForm::MAX_WIDTH];
+ int i, curFieldLen = strlen(curField);
+ int versionLen = strlen(version);
+ int leftLen = cmCursesMainForm::IDEAL_WIDTH - versionLen;
+ if (curFieldLen >= leftLen)
+ {
+ strncpy(bar, curField, leftLen);
+ }
+ else
+ {
+ strcpy(bar, curField);
+ for(i=curFieldLen; i < leftLen; ++i) { bar[i] = ' '; }
+ }
+ strcpy(bar+leftLen, version);
+
+ if ( x < cmCursesMainForm::MAX_WIDTH )
+ {
+ if (x > cmCursesMainForm::IDEAL_WIDTH )
+ {
+ for(i=cmCursesMainForm::IDEAL_WIDTH; i < x; i++)
+ {
+ bar[i] = ' ';
+ }
+ }
+ bar[x] = '\0';
+ }
+ else
+ {
+ for(i=cmCursesMainForm::IDEAL_WIDTH;
+ i < cmCursesMainForm::MAX_WIDTH-1; i++)
+ {
+ bar[i] = ' ';
+ }
+ bar[cmCursesMainForm::MAX_WIDTH-1] = '\0';
+ }
+
+ move(y-3,0);
+ attron(A_STANDOUT);
+ printw(bar);
+ attroff(A_STANDOUT);
pos_form_cursor(m_Form);
}
@@ -254,9 +332,12 @@ void cmCursesMainForm::RunCMake(bool generateMakefiles)
// create the arguments for the cmake object
std::vector<std::string> args;
args.push_back("cmake");
- std::string arg;
- arg = m_WhereSource;
- args.push_back(arg);
+ if (m_WhereSource != "")
+ {
+ std::string arg;
+ arg = m_WhereSource;
+ args.push_back(arg);
+ }
// run the generate process
if(make.Generate(args, generateMakefiles) != 0)
{
@@ -269,7 +350,7 @@ void cmCursesMainForm::RunCMake(bool generateMakefiles)
cbreak(); /* nl- or cr not needed */
keypad(m_Window,TRUE); /* Use key symbols as
KEY_DOWN*/
-
+
this->InitializeUI(m_Window);
this->Render(1, 1, x, y);
@@ -307,7 +388,8 @@ void cmCursesMainForm::HandleInput()
cmCursesWidget* currentWidget;
while(1)
{
- this->UpdateCurrentEntry();
+ this->UpdateStatusBar();
+ this->PrintKeys();
int key = getch();
currentField = current_field(m_Form);
@@ -316,11 +398,13 @@ void cmCursesMainForm::HandleInput()
if (!currentWidget || !currentWidget->HandleInput(key, m_Form, m_Window))
{
+ // quit
if ( key == 'q' )
{
break;
}
- else if ( key == KEY_DOWN )
+ // if not end of page, next field otherwise next page
+ else if ( key == KEY_DOWN || key == ctrl('n') )
{
int x,y;
getmaxyx(m_Window, y, x);
@@ -339,7 +423,8 @@ void cmCursesMainForm::HandleInput()
form_driver(m_Form, REQ_NEXT_FIELD);
}
}
- else if ( key == KEY_UP )
+ // if not beginning of page, previous field, otherwise previous page
+ else if ( key == KEY_UP || key == ctrl('p') )
{
int x,y;
getmaxyx(m_Window, y, x);
@@ -359,23 +444,75 @@ void cmCursesMainForm::HandleInput()
form_driver(m_Form, REQ_PREV_FIELD);
}
}
- else if ( key == KEY_NPAGE )
+ // pg down
+ else if ( key == KEY_NPAGE || key == ctrl('d') )
{
form_driver(m_Form, REQ_NEXT_PAGE);
}
- else if ( key == KEY_PPAGE )
+ // pg up
+ else if ( key == KEY_PPAGE || key == ctrl('u') )
{
form_driver(m_Form, REQ_PREV_PAGE);
}
+ // configure
else if ( key == 'c' )
{
this->RunCMake(false);
}
- else if ( key == 'o' )
+ // generate and exit
+ else if ( key == 'g' )
{
this->RunCMake(true);
break;
}
+ // delete cache entry
+ else if ( key == 'd' )
+ {
+ FIELD* cur = current_field(m_Form);
+ int index = field_index(cur);
+
+ // make the next or prev. current field after deletion
+ FIELD* nextCur;
+ if ( index == 2 )
+ {
+ }
+ else if ( index == 3*m_Entries->size()-1 )
+ {
+ nextCur = m_Fields[index-5];
+ }
+ else
+ {
+ nextCur = m_Fields[index+1];
+ }
+
+ // Get the label widget
+ cmCursesWidget* lbl = reinterpret_cast<cmCursesWidget*>(field_userptr(
+ m_Fields[index-2]));
+ cmCacheManager::GetInstance()->RemoveCacheEntry(lbl->GetValue());
+
+ std::string nextVal (reinterpret_cast<cmCursesWidget*>(field_userptr(nextCur))->GetValue());
+
+ int x,y;
+ getmaxyx(m_Window, y, x);
+ this->InitializeUI(m_Window);
+ this->Render(1, 1, x, y);
+
+ // make the next or prev. current field after deletion
+ nextCur = 0;
+ std::vector<cmCursesCacheEntryComposite*>::iterator it;
+ for (it = m_Entries->begin(); it != m_Entries->end(); ++it)
+ {
+ if (nextVal == (*it)->m_Key)
+ {
+ nextCur = (*it)->m_Entry->m_Field;
+ }
+ }
+
+ if (nextCur)
+ {
+ set_current_field(m_Form, nextCur);
+ }
+ }
}
touchwin(m_Window);
diff --git a/Source/CursesDialog/cmCursesMainForm.h b/Source/CursesDialog/cmCursesMainForm.h
index 5102708..2408cf2 100644
--- a/Source/CursesDialog/cmCursesMainForm.h
+++ b/Source/CursesDialog/cmCursesMainForm.h
@@ -36,11 +36,25 @@ public:
// list of current composites.
bool LookForCacheEntry(const char* key);
+ static const int MIN_WIDTH;
+ static const int MIN_HEIGHT;
+ static const int IDEAL_WIDTH;
+ static const int MAX_WIDTH;
+
+ // Description:
+ // This method should normally called only by the form.
+ // The only exception is during a resize.
+ void UpdateStatusBar();
+
+ // Description:
+ // This method should normally called only by the form.
+ // The only exception is during a resize.
+ void PrintKeys();
+
protected:
cmCursesMainForm(const cmCursesMainForm& from);
void operator=(const cmCursesMainForm&);
- void UpdateCurrentEntry();
void RunCMake(bool generateMakefiles);
void FillCacheManagerFromUI();
@@ -49,6 +63,7 @@ protected:
WINDOW* m_Window;
std::string m_WhereSource;
int m_Height;
+
};
#endif // __cmCursesMainForm_h
diff --git a/Source/CursesDialog/cmCursesStringWidget.cxx b/Source/CursesDialog/cmCursesStringWidget.cxx
index 90ca05c..9bc8232 100644
--- a/Source/CursesDialog/cmCursesStringWidget.cxx
+++ b/Source/CursesDialog/cmCursesStringWidget.cxx
@@ -29,12 +29,13 @@ bool cmCursesStringWidget::HandleInput(int& key, FORM* form, WINDOW* w)
// <Enter> is used to change edit mode (like <Esc> in vi).
while(1)
{
- if (!m_InEdit && ( key != 10 ) )
+ // If resize occured during edit, move out of edit mode
+ if (!m_InEdit && ( key != 10 && key != KEY_ENTER ) )
{
return false;
}
// 10 == enter
- if (key == 10)
+ if (key == 10 || key == KEY_ENTER)
{
if (m_InEdit)
{
@@ -53,6 +54,7 @@ bool cmCursesStringWidget::HandleInput(int& key, FORM* form, WINDOW* w)
strcpy(originalStr, buf);
}
}
+ // esc
else if (key == 27)
{
if (m_InEdit)
@@ -73,7 +75,25 @@ bool cmCursesStringWidget::HandleInput(int& key, FORM* form, WINDOW* w)
{
form_driver(form, REQ_NEXT_CHAR);
}
- else if ( key == ctrl('d') || key == 127 )
+ else if ( key == ctrl('k') )
+ {
+ form_driver(form, REQ_CLR_EOL);
+ }
+ else if ( key == ctrl('a') )
+ {
+ form_driver(form, REQ_BEG_FIELD);
+ }
+ else if ( key == ctrl('e') )
+ {
+ form_driver(form, REQ_END_FIELD);
+ }
+ else if ( key == ctrl('d') || key == 127 ||
+ key == KEY_BACKSPACE )
+ {
+ form_driver(form, REQ_DEL_PREV);
+ }
+ else if ( key == ctrl('d') || key == 127 ||
+ key == KEY_BACKSPACE || key == KEY_DC )
{
form_driver(form, REQ_DEL_PREV);
}
@@ -101,6 +121,5 @@ const char* cmCursesStringWidget::GetString()
const char* cmCursesStringWidget::GetValue()
{
- std::cout << field_buffer(m_Field, 0) << std::endl;
return field_buffer(m_Field, 0);
}