summaryrefslogtreecommitdiffstats
path: root/curses/cursesbutton.C
diff options
context:
space:
mode:
Diffstat (limited to 'curses/cursesbutton.C')
-rw-r--r--curses/cursesbutton.C136
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);
+}