//list_box #ifndef INCLUDE_LIST_BOX_H #define INCLUDE_LIST_BOX_H #print "[include ]\n" #ifndef INCLUDE_KOLIBRI_H #include "../lib/kolibri.h" #endif struct llist { int x, y, w, h, min_h, line_h, text_y; int column_max; int count, visible, first, current; //visible = row_max int active; void ClearList(); int MouseOver(int xx, yy); int ProcessMouse(int xx, yy); int ProcessKey(dword key); int KeyDown(); int KeyUp(); int KeyHome(); int KeyEnd(); int KeyPgDown(); int KeyPgUp(); void CheckDoesValuesOkey(); void SetSizes(int xx, yy, ww, hh, min_hh, line_hh); int MouseScroll(dword scroll_state); int MouseScrollNoSelection(dword scroll_state); void debug_values(); }; void llist::debug_values() { char yi[128]; sprintf(#yi, "%s %d %s %d %s %d %s %d", "current:", current, "first:", first, "visible:", visible, "count:", count); debugln(#yi); } void llist::ClearList() { count = visible = first = current = 0; } void llist::SetSizes(int xx, yy, ww, hh, min_hh, line_hh) { x = xx; y = yy; w = ww; h = hh; min_h = min_hh; line_h = line_hh; text_y = line_h / 2 - 4; visible = h / line_h; column_max = w / 6; //if (visible > count) visible=count; } int llist::MouseScroll(dword scroll_state) { if (count<=visible) return 0; if (scroll_state == 65535) { if (first == 0) return 0; if (first > 3) first -= 2; else first=0; return 1; } if (scroll_state == 1) { if (visible + first == count) return 0; if (visible+first+3 > count) first = count - visible; else first+=2; return 1; } return 0; } int llist::MouseScrollNoSelection(dword scroll_state) { if (count<=visible) return 0; if (scroll_state == 65535) { if (current == 0) return 0; if (current > 3) current -= 2; else current=0; return 1; } if (scroll_state == 1) { if (visible + current == count) return 0; if (visible+current+3 > count) current = count - visible; else current+=2; return 1; } return 0; } int llist::MouseOver(int xx, yy) { if (xx>x) && (xxy) && (yy= count) return 0; current++; } else { if (visible + first >= count) return 0; first++; current++; } if (current < first) || (current > first + visible) { first = current; CheckDoesValuesOkey(); } return 1; } int llist::KeyUp() { if (current > first) { current--; } else { if (first == 0) return 0; first--; current--; } if (current < first) || (current > first + visible) { first = current; CheckDoesValuesOkey(); } return 1; } int llist::KeyHome() { if (current==0) && (first==0) return 0; current = first = 0; return 1; } int llist::KeyEnd() { if (current==count-1) && (first==count-visible) return 0; current = count-1; first = count - visible; return 1; } int llist::KeyPgUp() { if (count <= visible) return KeyHome(); if (first == 0) return 0; first -= visible; CheckDoesValuesOkey(); return 1; } int llist::KeyPgDown() { if (count <= visible) return KeyEnd(); if (first == count - visible) return 0; first += visible; CheckDoesValuesOkey(); return 1; } void llist::CheckDoesValuesOkey() { if (first < 0) first = 0; if (visible + first > count) first = count - visible; if (current >= count) current = count - 1; if (current < 0) current = 0; } #endif