]> git.mxchange.org Git - flightgear.git/blobdiff - src/ATC/ATCDialog.cxx
Daniyar ATADJANOV:
[flightgear.git] / src / ATC / ATCDialog.cxx
index 58f1ceba4c27ee089bf92682253a2ea024c9185b..2946478da79633c790f46e5801005ff4526be488 100644 (file)
 //
 // You should have received a copy of the GNU General Public License
 // along with this program; if not, write to the Free Software
-// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
+
+#ifdef HAVE_CONFIG_H
+#  include "config.h"
+#endif
 
 #include <simgear/compiler.h>
 
 #include "ATCDialog.hxx"
 #include "ATC.hxx"
 #include "ATCmgr.hxx"
-#include "ATCdisplay.hxx"
 #include "commlist.hxx"
 #include "ATCutils.hxx"
 #include <Airports/simple.hxx>
 
 #include <sstream>
-#include <map>
 
 SG_USING_STD(ostringstream);
-SG_USING_STD(map);
 
 FGATCDialog *current_atcdialog;
 
@@ -78,7 +79,6 @@ static SGPropertyNode *getNamedNode(SGPropertyNode *prop, const char *name) {
                if ((p = getNamedNode(prop->getChild(i), name)))
                        return p;
 
-
        if (!strcmp(prop->getStringValue("name"), name))
                return prop;
 
@@ -190,7 +190,7 @@ bool FGATCDialog::trans_reg( const string &station, int code, atc_type type ) {
 // Display the ATC popup dialog box with options relevant to the users current situation.
 void FGATCDialog::PopupDialog() {
        const char *dialog_name = "atc-dialog";
-       SGPropertyNode_ptr dlg = _gui->getDialog(dialog_name);
+       SGPropertyNode_ptr dlg = _gui->getDialogProperties(dialog_name);
        if (!dlg)
                return;
 
@@ -240,6 +240,7 @@ void FGATCDialog::PopupDialog() {
                copyProperties(button_group->getNode("button-template", true), entry);
                entry->removeChildren("hide", false);
                entry->setStringValue("property", buf);
+               entry->setIntValue("keynum", '1' + n);
                if (n == 0)
                        entry->setBoolValue("default", true);
 
@@ -264,12 +265,14 @@ void FGATCDialog::PopupCallback(int num) {
                //cout << "TOWER " << endl;
                //cout << "ident is " << atcptr->get_ident() << endl;
                atcmentry_vec_type atcmlist = (available_dialog[TOWER])[atcptr->get_ident()];
-               if(atcmlist.size()) {
+               unsigned int size = atcmlist.size();
+               if(size && num < size) {
                        //cout << "Doing callback...\n";
                        ATCMenuEntry a = atcmlist[num];
                        atcptr->SetFreqInUse();
+                       string pilot = atcptr->GenText(a.transmission, a.callback_code);
+                       fgSetString("/sim/messages/pilot", pilot.c_str());
                        // This is the user's speech getting displayed.
-                       globals->get_ATC_display()->RegisterSingleMessage(atcptr->GenText(a.transmission, a.callback_code));
                        _callbackPending = true;
                        _callbackTimer = 0.0;
                        _callbackWait = 5.0;
@@ -289,10 +292,10 @@ struct atcdata {
                id = i, name = n, distance = d;
        }
        bool operator<(const atcdata& a) const {
-               return a.id != id && a.distance > distance;
+               return id != a.id && distance < a.distance;
        }
        bool operator==(const atcdata& a) const {
-               return a.distance == distance && a.id == id;
+               return id == a.id && distance == a.distance;
        }
        string id;
        string name;
@@ -301,17 +304,17 @@ struct atcdata {
 
 void FGATCDialog::FreqDialog() {
        const char *dialog_name = "atc-freq-search";
-       SGPropertyNode_ptr dlg = _gui->getDialog(dialog_name);
+       SGPropertyNode_ptr dlg = _gui->getDialogProperties(dialog_name);
        if (!dlg)
                return;
 
        _gui->closeDialog(dialog_name);
 
        SGPropertyNode_ptr button_group = getNamedNode(dlg, "quick-buttons");
-       // remove all dynamic ATC buttons
+       // remove all dynamic airport/ATC buttons
        button_group->removeChildren("button", false);
 
-       // Find the ATC stations within a reasonable range (about 40 miles?)
+       // Find the ATC stations within a reasonable range
        comm_list_type atc_stations;
        comm_list_iterator atc_stat_itr;
        
@@ -322,10 +325,10 @@ void FGATCDialog::FreqDialog() {
                lat * SGD_DEGREES_TO_RADIANS, elev));
 
        // search stations in range
-       int num_stat = current_commlist->FindByPos(lon, lat, elev, 40.0, &atc_stations);
+       int num_stat = current_commlist->FindByPos(lon, lat, elev, 50.0, &atc_stations);
        if (num_stat != 0) {
                map<atcdata, bool> uniq;
-               // fill map (sorts by distance)
+               // fill map (sorts by distance and removes duplicates)
                comm_list_iterator itr = atc_stations.begin();
                for (; itr != atc_stations.end(); ++itr) {
                        Point3D station = Point3D(itr->x, itr->y, itr->z);
@@ -352,7 +355,7 @@ void FGATCDialog::FreqDialog() {
 
 void FGATCDialog::FreqDisplay(string& ident) {
        const char *dialog_name = "atc-freq-display";
-       SGPropertyNode_ptr dlg = _gui->getDialog(dialog_name);
+       SGPropertyNode_ptr dlg = _gui->getDialogProperties(dialog_name);
        if (!dlg)
                return;
 
@@ -365,8 +368,8 @@ void FGATCDialog::FreqDisplay(string& ident) {
        atcUppercase(ident);
        string label;
 
-       FGAirport a;
-       if (!dclFindAirportID(ident, &a)) {
+       const FGAirport *a = fgFindAirportID(ident);
+       if (!a) {
                label = "Airport " + ident + " not found in database.";
                mkDialog(label.c_str());
                return;
@@ -379,7 +382,7 @@ void FGATCDialog::FreqDisplay(string& ident) {
        int n = 0;      // Number of ATC frequencies at this airport
 
        comm_list_type stations;
-       int found = current_commlist->FindByPos(a.getLongitude(), a.getLatitude(), a.getElevation(), 20.0, &stations);
+       int found = current_commlist->FindByPos(a->getLongitude(), a->getLatitude(), a->getElevation(), 20.0, &stations);
        if(found) {
                ostringstream ostr;
                comm_list_iterator itr = stations.begin();