// filename: Listbox.cpp // author: John Flores // date: May, 2003. // // Permission is hereby granted, free of charge, to any person obtaining a // copy of this software and associated documentation files (the "Software"), // to deal in the Software without restriction, including without limitation // the rights to use, copy, modify, merge, publish, distribute, sublicense, // and/or sell copies of the Software, and to permit persons to whom the // Software is furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL // THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER // DEALINGS IN THE SOFTWARE. #include "Listbox.h" Listbox::Listbox(int h, int w, int r, int c, Component *p) { height = h; width = w; parent = p; win = newwin(h, w, r, c); keypad(win, true); } Listbox::~Listbox() { delwin(win); } void Listbox::display() { int row = 0; werase(win); for (ItmListItr item = startitem; item != list.end() && row < height - 2; item++) { if (item == currentitem) mvwprintw(win, row+1, 1, ">>%s<<", item->text.c_str()); else mvwprintw(win, row+1, 1, " %s ", item->text.c_str()); row++; } wborder(win, '|', '|', '-', '-', '+', '+', '+', '+'); } void Listbox::addseparator(const char *text) { additem(SEPARATOR, text); } void Listbox::additem(int id, const char *text) { list.insert(list.end(), Item(id, text)); startitem = list.begin(); currentitem = list.begin(); } int Listbox::getitem(int &id, char *text) { bool done = false; int keypress; int row = 0; startitem = list.begin(); currentitem = list.begin(); while (!done) { display(); keypress = mvwgetch(win, row + 1, 1); switch (keypress) { case key::UP: do { if (currentitem != list.begin()) { currentitem--; if (row > 0) row--; else startitem--; } } while (currentitem != list.begin() && currentitem->id == SEPARATOR); break; case key::DOWN: do { if (currentitem != list.rbegin()) { currentitem++; if (row < height - 3) row++; else startitem++; } } while (currentitem != list.rbegin() && currentitem->id == SEPARATOR); break; case key::ENTER: id = currentitem->id; if (text != NULL) strcpy(text, currentitem->text.c_str()); done = true; break; case key::ESCAPE: done = true; break; default: id = keypress; done = true; } } return keypress; } void Listbox::notify(Component *notifier) { }