]> git.mxchange.org Git - flightgear.git/blobdiff - src/GUI/AirportList.cxx
Expose vertical speed for MP planes
[flightgear.git] / src / GUI / AirportList.cxx
index 43cee70ab522fd361d336f6c78c54a2e5dbdc6a4..bcbe06e09c90dea778a4430228f2d208d93f4313 100644 (file)
@@ -1,43 +1,65 @@
+#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());
-        _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<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