diff options
Diffstat (limited to 'curses/cursesbutton.C')
| -rw-r--r-- | curses/cursesbutton.C | 136 | 
1 files changed, 136 insertions, 0 deletions
| diff --git a/curses/cursesbutton.C b/curses/cursesbutton.C new file mode 100644 index 0000000..3638860 --- /dev/null +++ b/curses/cursesbutton.C @@ -0,0 +1,136 @@ +/* +** Copyright 2002, Double Precision Inc. +** +** See COPYING for distribution information. +*/ + +#include "curses_config.h" +#include "cursesbutton.H" + +using namespace std; + +CursesButton::CursesButton(CursesContainer *parent, +			   string textArg, +			   int toggle) : CursesLabel(parent, ""), +					 toggleButton(toggle), +					 buttonName(textArg) +{ +	setStyle(toggleButton ? TOGGLE:NORMAL); +} + +CursesButton::~CursesButton() +{ +	erase(); +} + +void CursesButton::setText(string textArg) +{ +	buttonName=textArg; +	setStyle(currentStyle); +} + +void CursesButton::setToggled(bool flag) +{ +	toggleButton= flag ? -1:1; +	setStyle(TOGGLE); +} + +void CursesButton::setStyle(Style style) +{ +	currentStyle=style; + +	switch (currentStyle) { +	case TOGGLE: +		CursesLabel::setText((toggleButton < 0 ? "[X] ":"[ ] ") + buttonName); +		break; +	case MENU: +		CursesLabel::setText(buttonName); +		break; +	default: +		CursesLabel::setText("[ " + buttonName + " ]"); +		break; +	} +} + +void CursesButton::draw() +{ +	int fg=attribute.getFgColor(); +	int bg=attribute.getBgColor(); + +	switch (currentStyle) { +	case TOGGLE: +		attribute=Curses::CursesAttr(); +		break; +	case MENU: +		attribute=Curses::CursesAttr().setReverse(hasFocus()); +		break; +	default: +		if (hasFocus()) +			attribute=Curses::CursesAttr().setReverse(); +		else +			attribute=Curses::CursesAttr().setHighlight(); +		break; +	} + +	attribute.setFgColor(fg); +	attribute.setBgColor(bg); +	CursesLabel::draw(); +} + +bool CursesButton::isFocusable() +{ +	return true; +} + +void CursesButton::focusGained() +{ +	draw(); +} + +void CursesButton::focusLost() +{ +	draw(); +} + +int CursesButton::getCursorPosition(int &r, int &c) +{ +	r=0; + +	if (currentStyle == TOGGLE) +	{ +		c=1; +		CursesLabel::getCursorPosition(r, c); +		return 1; +	} + +	c=CursesLabel::getWidth(); + +	CursesLabel::getCursorPosition(r, c); + +	return 0; +} + +int CursesButton::getWidth() const +{ +	return CursesLabel::getWidth()+1; +} + +void CursesButton::clicked() +{ +} + +bool CursesButton::processKeyInFocus(const Key &key) +{ +	if (key == key.ENTER || (key.plain() && key.ukey == ' ')) +	{ +		if (toggleButton) +		{ +			toggleButton= -toggleButton; +			setStyle(TOGGLE); +		} +		clicked(); +		return true; +	} + +	return CursesLabel::processKeyInFocus(key); +} | 
