#include #include "SelItemList.h" #include "listwnd.h" #define SELITEMEXPAND 2040 SelItemList::SelItemList(ListWnd *parent) : listwnd(parent), list(SELITEMEXPAND), num_selected(0) { } void SelItemList::setSelected(int pos, int selected, int cb) { int s = list.getSize(); if (pos >= s) { if (!selected) { // turning off something that's out of range is a no-brainer return ; } s = ((s / SELITEMEXPAND) + 1) * SELITEMEXPAND; list.setSize(s); } char *l = list.getMemory(); if (selected) { // quick and dirty way to prevent more than one item from // ever being selected? if (listwnd->getPreventMultipleSelection()) { listwnd->deselectAll(cb); } if (!isSelected(pos)) { l[pos] = 1; num_selected++; if (cb) listwnd->itemSelection(pos, TRUE); listwnd->invalidateItem(pos); } } else { if (isSelected(pos)) { l[pos] = 0; num_selected--; if (cb) listwnd->itemSelection(pos, FALSE); listwnd->invalidateItem(pos); } } } int SelItemList::isSelected(int pos) { if (pos >= list.getSize()) return 0; return list.getMemory()[pos]; } int SelItemList::getNumSelected() { return num_selected; } void SelItemList::deleteByPos(int pos) { ASSERT(pos >= 0); int s = list.getSize(); if (pos >= s) return ; num_selected -= isSelected(pos); char *m = list.getMemory() + pos; MEMCPY(m, m + 1, s - (pos + 1)); } void SelItemList::deselectAll() { // for internal use, doesn't send callbacks list.zeroMemory(); num_selected = 0; }