-#include <string.h> // strncpy()
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
#include <Main/globals.hxx>
#include <Airports/simple.hxx>
#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());
- int str_len = strlen(buf);
- _content[i] = new char[(str_len > 1023) ? 1024 : str_len+1];
- strncpy(_content[i], buf, 1023);
- }
- _content[_nAirports] = 0;
- newList(_content);
+ destroy_list();
+}
+
+
+void
+AirportList::create_list()
+{
+ 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;
}
-AirportList::~AirportList ()
+
+void
+AirportList::destroy_list()
{
- for (int i = 0; i < _nAirports; i++) {
- delete _content[i];
- _content[i] = 0;
+ 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<char> &ct = std::use_facet<std::ctype<char> >(std::locale());
+ ct.toupper((char *)filter.data(), (char *)filter.data() + filter.size());
+
+ if (filter != _filter) {
+ _filter = filter;
+ create_list();
+ }
}
-// end of AirportList.cxx