X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=src%2FGUI%2FAirportList.cxx;h=bcbe06e09c90dea778a4430228f2d208d93f4313;hb=0f7f7fce6bd57bea6c93f5d40c89f1b741edff45;hp=43cee70ab522fd361d336f6c78c54a2e5dbdc6a4;hpb=8b2cfb515befa803ed86a5cc458717d2e2c240c0;p=flightgear.git diff --git a/src/GUI/AirportList.cxx b/src/GUI/AirportList.cxx index 43cee70ab..bcbe06e09 100644 --- a/src/GUI/AirportList.cxx +++ b/src/GUI/AirportList.cxx @@ -1,43 +1,65 @@ +#ifdef HAVE_CONFIG_H +# include "config.h" +#endif + #include
#include #include "AirportList.hxx" +AirportList::AirportList(int x, int y, int width, int height) : + puaList(x, y, width, height), + GUI_ID(FGCLASS_AIRPORTLIST), + _content(0) +{ + create_list(); +} + -AirportList::AirportList (int x, int y, int width, int height) - : puList(x, y, width, height) +AirportList::~AirportList() { - char buf[1024]; - - _airports = globals->get_airports(); - _nAirports = _airports->size(); - - _content = new char *[_nAirports+1]; - for (int i = 0; i < _nAirports; i++) { - const FGAirport * airport = _airports->getAirport(i); - snprintf(buf, 1023, "%s %s\n", - airport->id.c_str(), - airport->name.c_str()); - _content[i] = strndup(buf, 1023); - } - _content[_nAirports] = 0; - newList(_content); + destroy_list(); } -AirportList::~AirportList () + +void +AirportList::create_list() { - for (int i = 0; i < _nAirports; i++) { - delete _content[i]; - _content[i] = 0; + char **content = FGAirport::searchNamesAndIdents(_filter); + int n = (content[0] != NULL) ? 1 : 0; + + // work around plib 2006/04/18 bug: lists with no entries cause crash on arrow-up + newList(n > 0 ? content : 0); + + if (_content) + destroy_list(); + + _content = content; +} + + +void +AirportList::destroy_list() +{ + for (char **c = _content; *c; c++) { + delete *c; + *c = 0; } delete [] _content; } -char * -AirportList::getStringValue () + +void +AirportList::setValue(const char *s) { - return (char *)_airports->getAirport(getIntegerValue())->id.c_str(); + std::string filter(s); + const std::ctype &ct = std::use_facet >(std::locale()); + ct.toupper((char *)filter.data(), (char *)filter.data() + filter.size()); + + if (filter != _filter) { + _filter = filter; + create_list(); + } } -// end of AirportList.cxx