#include #include DEFINE_REF(eInputContentNumber); eInputContentNumber::eInputContentNumber(int cur, int min, int max) { m_min = min; m_max = max; m_value = cur; m_cursor = 0; m_input = 0; recalcLen(); } void eInputContentNumber::getDisplay(std::string &res, int &cursor) { // TODO char r[128]; int e = 1; for (int i = 1; i < m_len; ++i) e *= 10; int v = m_value; int i; for (i = 0; i < m_len; ++i) { int rem = v / e; r[i] = '0' + rem; v %= e; e /= 10; } r[i] = 0; res = r; cursor = m_cursor; } void eInputContentNumber::moveCursor(int dir) { eDebug("move cursor.."); int old_cursor = m_cursor; switch (dir) { case dirLeft: --m_cursor; break; case dirRight: ++m_cursor; break; case dirHome: m_cursor = 0; break; case dirEnd: m_cursor = m_len; break; } if (m_cursor < 0) m_cursor = 0; if (m_cursor > m_len) m_cursor = m_len; if (m_cursor != old_cursor) if (m_input) m_input->invalidate(); } int eInputContentNumber::haveKey(int code, int overwrite) { int have_digit = -1; /* we handle KEY_KPx, but not KEY_x. otherwise we would get stuff twice. */ #define ASCII(x) (x | 0x8000) #define DIGIT(x) /* case KEY_##x: */ case KEY_KP##x: case ASCII(x|0x30): have_digit=x; break; switch (code) { DIGIT(0); DIGIT(1); DIGIT(2); DIGIT(3); DIGIT(4); DIGIT(5); DIGIT(6); DIGIT(7); DIGIT(8); DIGIT(9); default: return 0; } if (have_digit != -1) { insertDigit(m_cursor, have_digit); /* if overwrite and not end of line, erase char first. */ if (overwrite && m_cursor < m_len) insertDigit(m_cursor + 1, -1); else ++m_len; m_cursor++; assert(m_cursor <= m_len); if (m_input) m_input->invalidate(); return 1; } return 0; } void eInputContentNumber::deleteChar(int dir) { if (dir == deleteForward) { eDebug("forward"); if (m_cursor != m_len) ++m_cursor; else return; } /* backward delete at begin */ if (!m_cursor) return; if (!m_len) return; insertDigit(m_cursor, -1); m_len--; m_cursor--; if (m_input) m_input->invalidate(); } int eInputContentNumber::isValid() { return m_value >= m_min && m_value <= m_max; } void eInputContentNumber::validate() { recalcLen(); } void eInputContentNumber::setValue(int val) { m_value = val; recalcLen(); if (m_cursor > m_len) m_cursor = m_len; if (m_input) m_input->invalidate(); } int eInputContentNumber::getValue() { return m_value; } void eInputContentNumber::recalcLen() { int v = m_value; m_len = 0; while (v) { ++m_len; v /= 10; } if (!m_len) /* zero */ m_len = 1; } void eInputContentNumber::insertDigit(int pos, int dig) { /* get stuff left from cursor */ int exp = 1; int i; for (i = 0; i < (m_len - pos); ++i) exp *= 10; /* now it's 1...max */ int left = m_value / exp; int right = m_value % exp; if (dig >= 0) { left *= 10; left += dig; } else if (dig == -1) /* delete */ { left /= 10; } left *= exp; left += right; m_value = left; }