diff options
Diffstat (limited to 'curses/cursesdialog.C')
| -rw-r--r-- | curses/cursesdialog.C | 233 | 
1 files changed, 233 insertions, 0 deletions
| diff --git a/curses/cursesdialog.C b/curses/cursesdialog.C new file mode 100644 index 0000000..fb87a97 --- /dev/null +++ b/curses/cursesdialog.C @@ -0,0 +1,233 @@ +/* +** Copyright 2002-2011, Double Precision Inc. +** +** See COPYING for distribution information. +*/ + +#include "curses_config.h" +#include "cursesdialog.H" +#include "curseslabel.H" +#include "cursesfield.H" + +using namespace std; + +CursesDialog::CursesDialog(CursesContainer *parent) +	: CursesContainer(parent), max_label_width(0), max_field_width(0), +	  draw_flag(0) +{ +} + +CursesDialog::~CursesDialog() +{ +} + +// Automatically size to the largest prompt/input field combo + +int CursesDialog::getWidth() const +{ +	return max_label_width + max_field_width; +} + +// Automatically size to the lowest input field + +int CursesDialog::getHeight() const +{ +	int h=0; + +	vector< pair<CursesLabel *, Curses *> >::const_iterator +		b=prompts.begin(), e=prompts.end(); + +	while (b != e) +	{ +		if (b->first && b->first->getRow() >= h) +			h=b->first->getRow()+1; + +		if (b->second && b->second->getRow() >= h) +			h=b->second->getRow()+1; +		b++; + +	} + +	return h; +} + +void CursesDialog::draw() +{ +	draw_flag=1; +	CursesContainer::draw(); +} + +void CursesDialog::addPrompt(CursesLabel *label, Curses *field) +{ +	size_t maxrow=0; + +	vector< pair<CursesLabel *, Curses *> >::iterator +		b=prompts.begin(), e=prompts.end(); + +	while (b != e) +	{ +		if ( b->first != NULL && (size_t)b->first->getRow() >= maxrow) +			maxrow=b->first->getRow()+1; + +		if ( b->second != NULL && (size_t)b->second->getRow() >=maxrow) +			maxrow=b->second->getRow()+1; + +		b++; +	} + +	addPrompt(label, field, maxrow); +} + + +void CursesDialog::addPrompt(CursesLabel *label, Curses *field, size_t atRow) +{ +	vector< pair<CursesLabel *, Curses *> >::iterator +		b=prompts.begin(), e=prompts.end(); + +	// If the new field should precede the existing fields, push them down +	// by one row. + +	while (b != e) +	{ +		if ( b->first != NULL && (size_t)b->first->getRow() >= atRow) +			b->first->setRow(b->first->getRow()+1); + +		if ( b->second != NULL && (size_t)b->second->getRow() >= atRow) +			b->second->setRow(b->second->getRow()+1); +		b++; +	} + +	if (label != NULL) +	{ +		label->setAlignment(Curses::RIGHT); +		label->setRow(atRow); +		addChild(label); +	} + +	if (field != NULL) +	{ +		field->setRow(atRow); +		addChild(field); +	} + +	prompts.push_back(make_pair(label, field)); + +	int w; + +	if (label != NULL) +	{ +		w=label->getWidth(); + +		if (w > max_label_width) +			max_label_width=w; +	} + +	if (field != NULL) +	{ +		w=field->getWidth(); + +		if (w > max_field_width) +			max_field_width=w; +	} + +	b=prompts.begin(); +	e=prompts.end(); + +	while (b != e) +	{ +		if (b->first != NULL) +			b->first->setCol(max_label_width); +		if (b->second != NULL) +			b->second->setCol(max_label_width); +		b++; +	} +} + +void CursesDialog::delPrompt(CursesLabel *label) +{ +	vector< pair<CursesLabel *, Curses *> >::iterator +		b=prompts.begin(), e=prompts.end(); + +	while (b != e) +	{ +		if (b->first == label) +		{ +			delPrompt(b, b->first->getRow()); +			return; +		} +		b++; +	} +} + +void CursesDialog::delPrompt(Curses *field) +{ +	vector< pair<CursesLabel *, Curses *> >::iterator +		b=prompts.begin(), e=prompts.end(); + +	while (b != e) +	{ +		if (b->second == field) +		{ +			delPrompt(b, b->second->getRow()); +			return; +		} +		b++; +	} +} + +void CursesDialog::delPrompt(vector< pair<CursesLabel *, Curses *> >::iterator +			     p, int row) +{ +	prompts.erase(p); + +	vector< pair<CursesLabel *, Curses *> >::iterator +		b=prompts.begin(), e=prompts.end(); + +	while (b != e) +	{ +		if (b->first && b->first->getRow() > row) +			b->first->setRow(b->first->getRow()-1); + +		if (b->second && b->second->getRow() > row) +			b->second->setRow(b->second->getRow()-1); +		b++; +	} +} + +bool CursesDialog::writeText(const char *text, int row, int col, +			       const CursesAttr &attr) const +{ +	if (draw_flag) +		return CursesContainer::writeText(text, row, col, attr); +	return false; +} + +bool CursesDialog::writeText(const std::vector<unicode_char> &text, +			     int row, int col, +			     const Curses::CursesAttr &attr) const +{ +	if (draw_flag) +		CursesContainer::writeText(text, row, col, attr); +	return false; +} + + +void CursesDialog::deleteChild(Curses *child) +{ +	vector< pair<CursesLabel *, Curses *> >::iterator +		b=prompts.begin(), e=prompts.end(); + +	while (b != e) +	{ +		if ( b->first != NULL && +		     ((Curses *)b->first) == child) +			b->first=NULL; + +		if ( b->second != NULL && +		     ((Curses *)b->second) == child) +			b->second=NULL; +		b++; +	} + +	CursesContainer::deleteChild(child); +} | 
