1 #include <lib/gui/einput.h>
2 #include <lib/gdi/font.h>
3 #include <lib/actions/action.h>
4 #include <linux/input.h>
6 eInput::eInput(eWidget *parent): eLabel(parent)
8 /* default to center alignment */
9 m_valign = alignCenter;
10 m_halign = alignCenter;
13 eActionMap::getInstance(ptr);
14 ptr->bindAction("InputActions", 0, 0, this);
17 ptr->bindAction("", 0, 1, this);
23 eActionMap::getInstance(ptr);
24 ptr->unbindAction(this, 0);
25 ptr->unbindAction(this, 1);
28 void eInput::setContent(eInputContent *content)
31 m_content->setInput(0);
34 m_content->setInput(this);
37 int eInput::event(int event, void *data, void *data2)
43 gPainter &painter = *(gPainter*)data2;
44 ePtr<eWindowStyle> style;
48 eWidget::event(event, data, data2);
50 ePtr<eTextPara> para = new eTextPara(eRect(0, 0, size().width(), size().height()));
56 m_content->getDisplay(text, cursor);
58 eDebug("cursor is %d", cursor);
59 para->setFont(m_font);
60 para->renderString(text, 0);
62 int glyphs = para->size();
66 bbox = para->getGlyphBBox(cursor);
67 bbox = eRect(bbox.left()-1, 0, 2, size().height());
70 bbox = para->getGlyphBBox(cursor - 1);
71 bbox = eRect(bbox.right(), 0, 2, size().height());
75 painter.renderPara(para, ePoint(0, 0));
85 m_content->moveCursor(eInputContent::dirLeft);
88 m_content->moveCursor(eInputContent::dirRight);
91 m_content->moveCursor(eInputContent::dirHome);
94 m_content->moveCursor(eInputContent::dirEnd);
97 m_content->deleteChar(eInputContent::deleteForward);
100 m_content->deleteChar(eInputContent::deleteBackward);
109 int flags = (int)data2;
110 if (m_content && !(flags & 1))
111 m_content->haveKey(key);
117 return eLabel::event(event, data, data2);
120 int eInput::getNumber()
122 return atoi(m_text.c_str());
125 DEFINE_REF(eInputContentNumber);
127 void eInputContent::setInput(eInput *widget)
132 eInputContentNumber::eInputContentNumber(int cur, int min, int max)
142 void eInputContentNumber::getDisplay(std::string &res, int &cursor)
146 sprintf(r, "%d", m_value);
151 void eInputContentNumber::moveCursor(int dir)
153 eDebug("move cursor..");
154 int old_cursor = m_cursor;
174 if (m_cursor > m_len)
177 if (m_cursor != old_cursor)
179 m_input->invalidate();
182 int eInputContentNumber::haveKey(int code)
186 #define ASCII(x) (x | 0x8000)
187 #define DIGIT(x) case KEY_##x: case KEY_KP##x: case ASCII(x|0x30): have_digit=x; break;
202 if (have_digit != -1)
204 insertDigit(m_cursor, have_digit);
209 // can happen when 0 -> x
210 if (m_cursor > m_len)
214 m_input->invalidate();
219 void eInputContentNumber::deleteChar(int dir)
221 if (dir == deleteForward)
224 if (m_cursor != m_len)
229 /* backward delete at begin */
232 insertDigit(m_cursor, -1);
238 m_input->invalidate();
241 int eInputContentNumber::isValid()
243 return m_value >= m_min && m_value <= m_max;
246 void eInputContentNumber::recalcLen()
256 if (!m_len) /* zero */
260 void eInputContentNumber::insertDigit(int pos, int dig)
262 /* get stuff left from cursor */
265 for (i = 0; i < (m_len - pos); ++i)
268 /* now it's 1...max */
269 int left = m_value / exp;
270 int right = m_value % exp;
276 } else if (dig == -1) /* delete */