]> git.mxchange.org Git - flightgear.git/blobdiff - src/ATC/ATCDialog.cxx
Harald JOHNSEN:
[flightgear.git] / src / ATC / ATCDialog.cxx
index 0bb9ce5b2eb167bca60d44ff92e38cabf2832877..42d8bf7be7f5b873d618145900c0569d2afaad84 100644 (file)
@@ -28,6 +28,7 @@
 #include "ATCDialog.hxx"
 #include "ATC.hxx"
 #include "ATCmgr.hxx"
+#include "ATCdisplay.hxx"
 #include "commlist.hxx"
 #include "ATCutils.hxx"
 #include <Airports/simple.hxx>
@@ -40,7 +41,7 @@ FGATCDialog *current_atcdialog;
 
 // For the command manager - maybe eventually this should go in the built in command list
 static bool do_ATC_dialog(const SGPropertyNode* arg) {
-       globals->get_ATC_mgr()->doPopupDialog();
+       current_atcdialog->PopupDialog();
        return(true);
 }
 
@@ -51,249 +52,252 @@ static bool do_ATC_freq_search(const SGPropertyNode* arg) {
 
 ATCMenuEntry::ATCMenuEntry() {
   stationid    = "";
-  stationfr    = 0;
+  //stationfr    = 0;
   transmission = "";
   menuentry    = "";
+  callback_code = 0;
 }
 
 ATCMenuEntry::~ATCMenuEntry() {
 }
 
-static char* t0 = "No communication currently available";
-//static char* t1 = "Request departure clearance";
-//static char* t2 = "Report Runway vacated";
-static char** towerOptions = new char*[2];
-
-// ----------------------- DCL ------------------------------------------
-// For the ATC dialog - copied from the Autopilot new heading dialog code!
-static puDialogBox*            atcDialog;
-static puFrame*                        atcDialogFrame;
-static puText*                 atcDialogMessage;
-//static puInput*                      atcDialogInput;
-static puOneShot*              atcDialogOkButton;
-static puOneShot*              atcDialogCancelButton;
-static puButtonBox*            atcDialogCommunicationOptions;
-// ----------------------------------------------------------------------
-
-// ------------------------ AK ------------------------------------------
-static puDialogBox  *ATCMenuBox = 0;
-static puFrame      *ATCMenuFrame = 0;
-static puText       *ATCMenuBoxMessage = 0;
-static puButtonBox     *ATCOptionsList = 0;
-// ----------------------------------------------------------------------
-
-// AK
-static void AKATCDialogOK(puObject *)
-{
-       switch(ATCOptionsList->getValue()) {
-       case 0:
-               //cout << "Option 0 chosen\n";
-               fgSetBool("/sim/atc/opt0",true);
-               break;
-       case 1:
-               //cout << "Option 1 chosen\n";
-               fgSetBool("/sim/atc/opt1",true);
-               break;
-       case 2:
-               //cout << "Option 2 chosen\n";
-               fgSetBool("/sim/atc/opt2",true);
-               break;
-       case 3:
-               //cout << "Option 2 chosen\n";
-               fgSetBool("/sim/atc/opt3",true);
-               break;
-       default:
-               break;
+static void atcUppercase(string &s) {
+       for(unsigned int i=0; i<s.size(); ++i) {
+               s[i] = toupper(s[i]);
        }
-       FG_POP_PUI_DIALOG( ATCMenuBox );
 }
 
-// AK
-static void AKATCDialogCancel(puObject *)
-{
-    FG_POP_PUI_DIALOG( ATCMenuBox );
+// ----------------------- Popup Dialog Statics------------------
+static puDialogBox*     atcDialog;
+static puFrame*         atcDialogFrame;
+static puText*          atcDialogMessage;
+static puOneShot*       atcDialogOkButton;
+static puOneShot*       atcDialogCancelButton;
+static puButtonBox*     atcDialogCommunicationOptions;
+// --------------------------------------------------------------
+
+// ----------------------- Freq Dialog Statics-------------------
+static const int ATC_MAX_FREQ_DISPLAY = 20;            // Maximum number of frequencies that can be displayed for any one airport
+
+static puDialogBox*     atcFreqDialog;
+static puFrame*         atcFreqDialogFrame;
+static puText*          atcFreqDialogMessage;
+static puInput*         atcFreqDialogInput;
+static puOneShot*       atcFreqDialogOkButton;
+static puOneShot*       atcFreqDialogCancelButton;
+
+static puDialogBox*     atcFreqDisplay;
+static puFrame*         atcFreqDisplayFrame;
+static puText*          atcFreqDisplayMessage;
+static puOneShot*       atcFreqDisplayOkButton;
+static puText*          atcFreqDisplayText[ATC_MAX_FREQ_DISPLAY];
+// --------------------------------------------------------------
+
+//////////////// Popup callbacks ///////////////////
+static void ATCDialogOK(puObject*) {
+       current_atcdialog->PopupCallback();
+       FG_POP_PUI_DIALOG( atcDialog );
 }
 
-// DCL
-static void ATCDialogCancel(puObject *)
-{
-    //ATCDialogInput->rejectInput();
+static void ATCDialogCancel(puObject*) {
     FG_POP_PUI_DIALOG( atcDialog );
 }
+//////////////////////////////////////////////////
 
-// DCL
-static void ATCDialogOK (puObject *me)
-{
-       // Note that currently the dialog is hardwired to comm1 only here.
-       switch(globals->get_ATC_mgr()->GetComm1ATCType()) {
-       case INVALID:
-               break;
-       case ATIS:
-               break;
-       case TOWER: {
-               /*
-               FGTower* twr = (FGTower*)globals->get_ATC_mgr()->GetComm1ATCPointer();
-               switch(atcDialogCommunicationOptions->getValue()) {
-               case 0:
-                       //cout << "Option 0 chosen\n";
-                       twr->RequestLandingClearance("charlie foxtrot sierra");
-                       break;
-               case 1:
-                       //cout << "Option 1 chosen\n";
-                       twr->RequestDepartureClearance("charlie foxtrot sierra");
-                       break;
-               case 2:
-                       //cout << "Option 2 chosen\n";
-                       twr->ReportRunwayVacated("charlie foxtrot sierra");
-                       break;
-               default:
-                       break;
-               }
-               */
-               break;
-       }
-       case GROUND:
-               break;
-       case APPROACH:
-               break;
-       default:
-               break;
-       }
 
-    ATCDialogCancel(me);
-    //if(error) mkDialog(s.c_str());
+///////////////// Freq search callbacks ///////////
+static void FreqDialogCancel(puObject*) {
+       FG_POP_PUI_DIALOG(atcFreqDialog);
 }
 
-// DCL
-static void ATCDialog(puObject *cb)
-{
-    //ApHeadingDialogInput   ->    setValue ( heading );
-    //ApHeadingDialogInput    -> acceptInput();
-    FG_PUSH_PUI_DIALOG(atcDialog);
+static void FreqDialogOK(puObject*) {
+       string tmp = atcFreqDialogInput->getStringValue();
+       FG_POP_PUI_DIALOG(atcFreqDialog);
+       current_atcdialog->FreqDisplay(tmp);
 }
 
-// DCL
-void ATCDialogInit()
-{
-       char defaultATCLabel[] = "Enter desired option to communicate with ATC:";
-       char *s;
+static void FreqDisplayOK(puObject*) {
+       FG_POP_PUI_DIALOG(atcFreqDisplay);
+}
+//////////////////////////////////////////////////
+
 
-       // Option lists hardwired per ATC type  
-       towerOptions[0] = new char[strlen(t0)+1];
-       strcpy(towerOptions[0], t0);
-       //towerOptions[1] = new char[strlen(t1)+1];
-       //strcpy(towerOptions[1], t1);
-       //towerOptions[2] = new char[strlen(t2)+1];
-       //strcpy(towerOptions[2], t2);
-       towerOptions[1] = NULL;
+FGATCDialog::FGATCDialog() {
+       _callbackPending = false;
+       _callbackTimer = 0.0;
+       _callbackWait = 0.0;
+       _callbackPtr = NULL;
+       _callbackCode = 0;
+}
+
+FGATCDialog::~FGATCDialog() {
+       if(atcDialog) puDeleteObject(atcDialog);
+       if(atcFreqDialog) puDeleteObject(atcFreqDialog);
+       if(atcFreqDisplay) puDeleteObject(atcFreqDisplay);
+}
+
+void FGATCDialog::Init() {
+       // Add ATC-dialog to the command list
+       globals->get_commands()->addCommand("ATC-dialog", do_ATC_dialog);
+       // Add ATC-freq-search to the command list
+       globals->get_commands()->addCommand("ATC-freq-search", do_ATC_freq_search);
+       
+       int w;
+       int h;
+       int x;
+       int y;
+       
+       // Init the freq-search dialog
+       w = 300;
+       h = 150;
+       x = (fgGetInt("/sim/startup/xsize") / 2) - (w / 2);
+       y = 50;
+       char *s;
+       atcFreqDialog = new puDialogBox (x, y);
+       {
+               atcFreqDialogFrame = new puFrame (0, 0, w, h);
+               atcFreqDialogMessage = new puText          (40, (h - 30));
+               atcFreqDialogMessage->setDefaultValue ("Enter airport identifier:");
+               atcFreqDialogMessage->getDefaultValue (&s);
+               atcFreqDialogMessage->setLabel(s);
+       
+               atcFreqDialogInput = new puInput (50, (h - 75), 150, (h - 45));
+                       
+               atcFreqDialogOkButton     =  new puOneShot         (50, 10, 110, 50);
+               atcFreqDialogOkButton     ->     setLegend         (gui_msg_OK);
+               atcFreqDialogOkButton     ->     makeReturnDefault (TRUE);
+               atcFreqDialogOkButton     ->     setCallback       (FreqDialogOK);
+                       
+               atcFreqDialogCancelButton =  new puOneShot         (140, 10, 210, 50);
+               atcFreqDialogCancelButton ->     setLegend         (gui_msg_CANCEL);
+               atcFreqDialogCancelButton ->     setCallback       (FreqDialogCancel);
+               
+               atcFreqDialogInput->acceptInput();
+       }
+       
+       FG_FINALIZE_PUI_DIALOG(atcFreqDialog);
        
-       atcDialog = new puDialogBox (150, 50);
+       // Init the freq-display dialog
+       w = 400;
+       h = 100;
+       x = (fgGetInt("/sim/startup/xsize") / 2) - (w / 2);
+       y = 50;
+       atcFreqDisplay = new puDialogBox (x, y);
        {
-               atcDialogFrame   = new puFrame (0, 0, 500, 250);
+               atcFreqDisplayFrame   = new puFrame (0, 0, w, h);
                
-               atcDialogMessage = new puText          (250, 220);
-               atcDialogMessage    -> setDefaultValue (defaultATCLabel);
-               atcDialogMessage    -> getDefaultValue (&s);
-               atcDialogMessage    -> setLabel        (s);
-               atcDialogMessage    -> setLabelPlace   (PUPLACE_TOP_CENTERED);
-
-               atcDialogCommunicationOptions = new puButtonBox (50, 50, 450, 210, NULL, true);
+               atcFreqDisplayMessage = new puText          (40, (h - 30));
+               atcFreqDisplayMessage    -> setDefaultValue ("No freqencies found");
+               atcFreqDisplayMessage    -> getDefaultValue (&s);
+               atcFreqDisplayMessage    -> setLabel        (s);
+               
+               for(int i=0; i<ATC_MAX_FREQ_DISPLAY; ++i) {
+                       atcFreqDisplayText[i] = new puText(40, h - 65 - (30 * i));
+                       atcFreqDisplayText[i]->setDefaultValue("");
+                       atcFreqDisplayText[i]-> getDefaultValue (&s);
+                       atcFreqDisplayText[i]-> setLabel        (s);
+                       atcFreqDisplayText[i]->hide();
+               }
                
-               atcDialogOkButton     =  new puOneShot         (50, 10, 110, 50);
+               atcFreqDisplayOkButton     =  new puOneShot         (50, 10, 110, 50);
+               atcFreqDisplayOkButton     ->     setLegend         (gui_msg_OK);
+               atcFreqDisplayOkButton     ->     makeReturnDefault (TRUE);
+               atcFreqDisplayOkButton     ->     setCallback       (FreqDisplayOK);
+       }
+       FG_FINALIZE_PUI_DIALOG(atcFreqDisplay);
+       
+       // Init AK's interactive ATC menus
+       w = 500;
+       h = 110;
+       x = (fgGetInt("/sim/startup/xsize") / 2) - (w / 2);
+       //y = (fgGetInt("/sim/startup/ysize") / 2) - (h / 2);
+       y = 50;
+       atcDialog = new puDialogBox (x, y);
+       {
+               atcDialogFrame = new puFrame (0,0,w,h);
+               atcDialogMessage = new puText (w / 2, h - 30);
+               atcDialogMessage -> setLabel( "No transmission available" );
+               atcDialogMessage -> setLabelPlace(PUPLACE_TOP_CENTERED);
+               atcDialogCommunicationOptions = new puButtonBox (50, 60, 450, 50, NULL, true);
+               atcDialogCommunicationOptions -> hide();
+               atcDialogOkButton     =  new puOneShot         ((w/2)-85, 10, (w/2)-25, 50);
                atcDialogOkButton     ->     setLegend         (gui_msg_OK);
                atcDialogOkButton     ->     makeReturnDefault (TRUE);
                atcDialogOkButton     ->     setCallback       (ATCDialogOK);
                
-               atcDialogCancelButton =  new puOneShot         (140, 10, 210, 50);
+               atcDialogCancelButton =  new puOneShot         ((w/2)+25, 10, (w/2)+85, 50);
                atcDialogCancelButton ->     setLegend         (gui_msg_CANCEL);
                atcDialogCancelButton ->     setCallback       (ATCDialogCancel);
-               
        }
        FG_FINALIZE_PUI_DIALOG(atcDialog);
-       
-       // Add ATC-dialog to the command list
-       globals->get_commands()->addCommand("ATC-dialog", do_ATC_dialog);
 }
 
-///////////////////////////////////////////////////////////////////////
-//
-// ATCDoDialog is in a state of flux at the moment
-// Stations other than approach are handled by DCL's simple code
-// Approach is handled by AK's fancy dynamic-list code
-// Hopefully all interactive stations should go to AK's code eventually
-//
-///////////////////////////////////////////////////////////////////////
-void ATCDoDialog(atc_type type) {
-       switch(type) {
-       case INVALID:
-               atcDialogCommunicationOptions->newList(NULL);
-               atcDialogMessage->setLabel("Not tuned in to any ATC service.");
-               break;
-       case ATIS:
-               atcDialogCommunicationOptions->newList(NULL);
-               atcDialogMessage->setLabel("Tuned in to ATIS: no communication possible.");
-               break;
-       case TOWER: 
-               atcDialogCommunicationOptions->newList(towerOptions);
-               atcDialogMessage->setLabel("Tuned in to Tower - select communication to transmit:");
-               break;
-       case GROUND:
-               atcDialogCommunicationOptions->newList(NULL);
-               atcDialogMessage->setLabel("Tuned in to Ground - select communication to transmit:");
-               break;
-       case APPROACH:
-               current_atcdialog->DoDialog();
-               break;
-       default:
-               atcDialogCommunicationOptions->newList(NULL);
-               atcDialogMessage->setLabel("Tuned in to unknown ATC service - enter transmission:");
-               break;
-       }
-
-       // Third - display the dialog without pausing sim.
-       if(type != APPROACH) {  
-               ATCDialog(NULL);
+void FGATCDialog::Update(double dt) {
+       if(_callbackPending) {
+               if(_callbackTimer > _callbackWait) {
+                       _callbackPtr->ReceiveUserCallback(_callbackCode);
+                       _callbackPtr->NotifyTransmissionFinished(fgGetString("/sim/user/callsign"));
+                       _callbackPending = false;
+               } else {
+                       _callbackTimer += dt;
+               }
        }
 }
 
-void FGATCDialog::Init() {
-       // Add ATC-freq-search to the command list
-       globals->get_commands()->addCommand("ATC-freq-search", do_ATC_freq_search);
-}
-
-// AK
 // Add an entry
-void FGATCDialog::add_entry(string station, string transmission, string menutext ) {
-  
+void FGATCDialog::add_entry(string station, string transmission, string menutext, atc_type type, int code) {
+
   ATCMenuEntry a;
 
   a.stationid = station;
   a.transmission = transmission;
   a.menuentry = menutext;
+  a.callback_code = code;
 
-  atcmentrylist_station[station.c_str()].push_back(a);
+  (available_dialog[type])[station.c_str()].push_back(a);
 
 }
 
-// AK
-// query the database whether the transmission is already registered; 
-bool FGATCDialog::trans_reg( const string &station, const string &trans ) {
+void FGATCDialog::remove_entry( const string &station, const string &trans, atc_type type ) {
+  atcmentry_vec_type* p = &((available_dialog[type])[station]);
+  atcmentry_vec_iterator current = p->begin();  
+  while(current != p->end()) {
+    if(current->transmission == trans) current = p->erase(current);
+       else ++current;
+  }
+}
+
+void FGATCDialog::remove_entry( const string &station, int code, atc_type type ) {
+  atcmentry_vec_type* p = &((available_dialog[type])[station]);
+  atcmentry_vec_iterator current = p->begin();
+  while(current != p->end()) {
+    if(current->callback_code == code) current = p->erase(current);
+       else ++current;
+  }
+}
 
-  atcmentry_list_type     atcmlist = atcmentrylist_station[station];
-  atcmentry_list_iterator current  = atcmlist.begin();
-  atcmentry_list_iterator last     = atcmlist.end();
-  
-  for ( ; current != last ; ++current ) {
+// query the database whether the transmission is already registered; 
+bool FGATCDialog::trans_reg( const string &station, const string &trans, atc_type type ) {
+  atcmentry_vec_type* p = &((available_dialog[type])[station]);
+  atcmentry_vec_iterator current = p->begin();
+  for ( ; current != p->end() ; ++current ) {
     if ( current->transmission == trans ) return true;
   }
   return false;
 }
 
-// AK
-// ===================================================
-// ===  Update ATC menue and look for keys pressed ===
-// ===================================================
-void FGATCDialog::DoDialog() {
+// query the database whether the transmission is already registered; 
+bool FGATCDialog::trans_reg( const string &station, int code, atc_type type ) {
+  atcmentry_vec_type* p = &((available_dialog[type])[station]);
+  atcmentry_vec_iterator current = p->begin();
+  for ( ; current != p->end() ; ++current ) {
+    if ( current->callback_code == code ) return true;
+  }
+  return false;
+}
+
+// Display the ATC popup dialog box with options relevant to the users current situation.
+void FGATCDialog::PopupDialog() {
        
        static string mentry[10];
        static string mtrans[10];
@@ -301,148 +305,118 @@ void FGATCDialog::DoDialog() {
        TransPar TPar;
        FGATC* atcptr = globals->get_ATC_mgr()->GetComm1ATCPointer();   // Hardwired to comm1 at the moment
        
-       if(atcptr != NULL) {
-               
-               atcmentry_list_type     atcmlist = atcmentrylist_station[atcptr->get_ident()];
-               //atcmentry_list_type     atcmlist = atcmentrylist_station["EGNX"];
-               atcmentry_list_iterator current  = atcmlist.begin();
-               atcmentry_list_iterator last     = atcmlist.end();
-               
-               // Set all opt flags to false before displaying box
-               fgSetBool("/sim/atc/opt0",false);
-               fgSetBool("/sim/atc/opt1",false);
-               fgSetBool("/sim/atc/opt2",false);
-               fgSetBool("/sim/atc/opt3",false);
-               fgSetBool("/sim/atc/opt4",false);
-               fgSetBool("/sim/atc/opt5",false);
-               fgSetBool("/sim/atc/opt6",false);
-               fgSetBool("/sim/atc/opt7",false);
-               fgSetBool("/sim/atc/opt8",false);
-               fgSetBool("/sim/atc/opt9",false);
-               
-               //int yc = 10;
-               int yc = 70;
-               int xsize = 600;
-               
-               if ( atcmlist.size() != 0 ){ 
-                       int k=atcmlist.size();
-                       //int k = 3;
-                       //cout << "k = " << k << endl;
-                       int y = (fgGetInt("/sim/startup/ysize") - 200 - 20 - k*20);
-                       ATCMenuBox = new puDialogBox (100, y);
-                       ATCMenuFrame      =  new puFrame (0,0,xsize,yc+40);
-                       // loop over all entries in atcmentrylist
-                       ATCOptionsList = new puButtonBox (50, 50, 450, 50+(k*25), NULL, true);
-                       char** optList = new char*[k+1];
-                       int kk = 0;
-                       for ( ; current != last ; ++current ) {
-                               string dum;
-                               sprintf( buf, "%i", kk+1 );
-                               buf[1] = '\0';
-                               dum = buf;
-                               mentry[kk] = dum + ". " + current->menuentry;
-                               optList[kk] = new char[strlen(mentry[kk].c_str()) + 1];
-                               strcpy(optList[kk], mentry[kk].c_str());
-                               //cout << "optList[" << kk << "] = " << optList[kk] << endl; 
-                               mtrans[kk] =              current->transmission;
-                               //ATCMenuBoxMessage =  new puText (10, yc);
-                               //ATCMenuBoxMessage ->     setLabel( mentry[kk].c_str() );
-                               yc += 20;
-                               ++kk;
-                       } 
-                       yc += 2*20;
-                       optList[k] = NULL;
-                       ATCOptionsList->newList(optList);
+       int w = 500;
+       int h = 100;
+       if(atcptr) {
+               if(atcptr->GetType() == ATIS) {
+                       atcDialogCommunicationOptions->hide();
+                       atcDialogMessage -> setLabel( "Tuned to ATIS - no communication possible" );
+                       atcDialogFrame->setSize(w, h);
+                       atcDialogMessage -> setPosition(w / 2, h - 30);
                } else {
-                       int y = (fgGetInt("/sim/startup/ysize") - 100 - 20 );
-                       ATCMenuBox = new puDialogBox (10, y);
-                       ATCMenuFrame      =  new puFrame (0,0,xsize,yc+40);
-                       ATCMenuBoxMessage =  new puText (10, yc-10);
-                       ATCMenuBoxMessage ->     setLabel( "No transmission available" );
-               }
-               
-               ATCMenuBoxMessage =  new puText (10, yc+10);
-               ATCMenuBoxMessage ->     setLabel( "ATC Menu" );
-               atcDialogOkButton     =  new puOneShot         ((xsize/2)-85, 10, (xsize/2)-25, 50);
-               atcDialogOkButton     ->     setLegend         (gui_msg_OK);
-               atcDialogOkButton     ->     makeReturnDefault (TRUE);
-               atcDialogOkButton     ->     setCallback       (AKATCDialogOK);
-               
-               atcDialogCancelButton =  new puOneShot         ((xsize/2)+25, 10, (xsize/2)+85, 50);
-               atcDialogCancelButton ->     setLegend         (gui_msg_CANCEL);
-               atcDialogCancelButton ->     setCallback       (AKATCDialogCancel);
-               FG_FINALIZE_PUI_DIALOG( ATCMenuBox );
-               FG_PUSH_PUI_DIALOG( ATCMenuBox );
-               
-               
-               /*      
-               if ( atckey != -1 && TransDisplayed && mtrans[atckey-1].c_str() != "" ) {
-                       cout << mtrans[atckey-1].c_str() << endl;
-                       TPar = current_transmissionlist->extract_transpar( mtrans[atckey-1].c_str() );
-                       current_atcmentrylist->reset = true;
-                       current_transparlist->add_entry( TPar );
                        
-                       //    transpar_list_type test = current_transparlist;
-                       // transpar_list_iterator current = test.begin();
-                       //for ( ; current != test.end(); ++current ) {
-                               // current->tpar.intention;
-                       //}
-               }
-               
-               if ( current_atcmentrylist->freq != (int)(comm1_freq*100.0 + 0.5) ) {
-                       current_atcmentrylist->reset = true;
-               }
-               
-               // reset (delete) ATCmenue list if reset is true
-               if ( current_atcmentrylist->reset == true ) {
-                       delete ( current_atcmentrylist );
-                       current_atcmentrylist = new FGatcmentryList;
-                       current_atcmentrylist->init( (int)(comm1_freq*100.0 + 0.5) );
-                       if ( TransDisplayed ) {
-                               FG_POP_PUI_DIALOG( ATCMenuBox ); 
-                               TransDisplayed = false;
+                       atcmentry_vec_type atcmlist = (available_dialog[atcptr->GetType()])[atcptr->get_ident()];
+                       atcmentry_vec_iterator current = atcmlist.begin();
+                       atcmentry_vec_iterator last = atcmlist.end();
+                       
+                       // Set all opt flags to false before displaying box
+                       fgSetBool("/sim/atc/opt0",false);
+                       fgSetBool("/sim/atc/opt1",false);
+                       fgSetBool("/sim/atc/opt2",false);
+                       fgSetBool("/sim/atc/opt3",false);
+                       fgSetBool("/sim/atc/opt4",false);
+                       fgSetBool("/sim/atc/opt5",false);
+                       fgSetBool("/sim/atc/opt6",false);
+                       fgSetBool("/sim/atc/opt7",false);
+                       fgSetBool("/sim/atc/opt8",false);
+                       fgSetBool("/sim/atc/opt9",false);
+                       
+                       int k = atcmlist.size();
+                       h += k * 25;
+                       //cout << "k = " << k << '\n';
+                       
+                       atcDialogFrame->setSize(w, h); 
+                       
+                       if(k) { 
+                               // loop over all entries in atcmentrylist
+                               char** optList = new char*[k+1];
+                               int kk = 0;
+                               for ( ; current != last ; ++current ) {
+                                       string dum;
+                                       sprintf( buf, "%i", kk+1 );
+                                       buf[1] = '\0';
+                                       dum = buf;
+                                       mentry[kk] = dum + ". " + current->menuentry;
+                                       optList[kk] = new char[strlen(mentry[kk].c_str()) + 1];
+                                       strcpy(optList[kk], mentry[kk].c_str());
+                                       //cout << "optList[" << kk << "] = " << optList[kk] << endl; 
+                                       mtrans[kk] =              current->transmission;
+                                       ++kk;
+                               } 
+                               optList[k] = NULL;
+                               atcDialogCommunicationOptions->newList(optList);
+                               atcDialogCommunicationOptions->setSize(w-100, h-90);
+                               atcDialogCommunicationOptions->reveal();
+                               atcDialogMessage -> setLabel( "ATC Menu" );
+                               atcDialogMessage -> setPosition(w / 2, h - 30);
+                       } else {
+                               atcDialogCommunicationOptions->hide();
+                               atcDialogMessage -> setLabel( "No transmission available" );
+                               atcDialogMessage -> setPosition(w / 2, h - 30);
                        }
                }
-               */      
+       } else {
+               atcDialogCommunicationOptions->hide();
+               atcDialogMessage -> setLabel( "Not currently tuned to any ATC service" );
+               atcDialogFrame->setSize(w, h);
+               atcDialogMessage -> setPosition(w / 2, h - 30);
        }
+               
+       FG_PUSH_PUI_DIALOG(atcDialog);
 }
 
-//////////////////////////////////////////////////////
-//
-//  STUFF FOR THE FREQUENCY SEARCH DIALOG
-//
-//////////////////////////////////////////////////////
-
-static puDialogBox*     atcFreqDialog;
-static puFrame*         atcFreqDialogFrame;
-static puText*          atcFreqDialogMessage;
-static puInput*         atcFreqDialogInput;
-static puOneShot*       atcFreqDialogOkButton;
-static puOneShot*       atcFreqDialogCancelButton;
-
-static puDialogBox*     atcFreqDisplay;
-static puFrame*         atcFreqDisplayFrame;
-static puText*          atcFreqDisplayMessage;
-static puOneShot*       atcFreqDisplayOkButton;
-static puOneShot*       atcFreqDisplayCancelButton;
-static puText*          atcFreqDisplayText[20];
-       
-static void FreqDialogCancel(puObject*) {
-       FG_POP_PUI_DIALOG(atcFreqDialog);
-}
-
-static void FreqDialogOK(puObject*) {
-       string tmp = atcFreqDialogInput->getStringValue();
-       FG_POP_PUI_DIALOG(atcFreqDialog);
-       current_atcdialog->FreqDisplay(tmp);
-}
-
-static void FreqDisplayOK(puObject*) {
-       FG_POP_PUI_DIALOG(atcFreqDisplay);
-}
-
-static void FreqDisplayCancel(puObject*) {
-       FG_POP_PUI_DIALOG(atcFreqDisplay);
+void FGATCDialog::PopupCallback() {
+       FGATC* atcptr = globals->get_ATC_mgr()->GetComm1ATCPointer();   // FIXME - Hardwired to comm1 at the moment
+
+       if(atcptr) {
+               if(atcptr->GetType() == APPROACH) {
+                       switch(atcDialogCommunicationOptions->getValue()) {
+                       case 0:
+                               fgSetBool("/sim/atc/opt0",true);
+                               break;
+                       case 1:
+                               fgSetBool("/sim/atc/opt1",true);
+                               break;
+                       case 2:
+                               fgSetBool("/sim/atc/opt2",true);
+                               break;
+                       case 3:
+                               fgSetBool("/sim/atc/opt3",true);
+                               break;
+                       default:
+                               break;
+                       }
+               } else if(atcptr->GetType() == TOWER) {
+                       //cout << "TOWER " << endl;
+                       //cout << "ident is " << atcptr->get_ident() << endl;
+                       atcmentry_vec_type atcmlist = (available_dialog[TOWER])[atcptr->get_ident()];
+                       if(atcmlist.size()) {
+                               //cout << "Doing callback...\n";
+                               ATCMenuEntry a = atcmlist[atcDialogCommunicationOptions->getValue()];
+                               atcptr->SetFreqInUse();
+                               // 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;
+                               _callbackPtr = atcptr;
+                               _callbackCode = a.callback_code;
+                       } else {
+                               //cout << "No options available...\n";
+                       }
+                       //cout << "Donded" << endl;
+               }
+       }
 }
 
 void FGATCDialog::FreqDialog() {
@@ -464,63 +438,29 @@ void FGATCDialog::FreqDialog() {
        }
        */
        
-       //char defaultATCLabel[] = "Enter desired option to communicate with ATC:";
-       char *s;
-       
-       int hsize = 150;
-       atcFreqDialog = new puDialogBox (150, 50);
-       {
-               atcFreqDialogFrame   = new puFrame (0, 0, 300, hsize);
-               
-               atcFreqDialogMessage = new puText          (40, (hsize - 30));
-               atcFreqDialogMessage    -> setDefaultValue ("Enter airport identifier:");
-               atcFreqDialogMessage    -> getDefaultValue (&s);
-               atcFreqDialogMessage    -> setLabel        (s);
-
-               atcFreqDialogInput = new puInput (50, (hsize - 75), 150, (hsize - 45));
-               atcFreqDialogInput->acceptInput();
-               
-               atcFreqDialogOkButton     =  new puOneShot         (50, 10, 110, 50);
-               atcFreqDialogOkButton     ->     setLegend         (gui_msg_OK);
-               atcFreqDialogOkButton     ->     makeReturnDefault (TRUE);
-               atcFreqDialogOkButton     ->     setCallback       (FreqDialogOK);
-               
-               atcFreqDialogCancelButton =  new puOneShot         (140, 10, 210, 50);
-               atcFreqDialogCancelButton ->     setLegend         (gui_msg_CANCEL);
-               atcFreqDialogCancelButton ->     setCallback       (FreqDialogCancel);
-               
-       }
-       FG_FINALIZE_PUI_DIALOG(atcFreqDialog);
+       // TODO - it would be nice to display a drop-down list of airports within the general vicinity of the user
+       //        in addition to the general input box (started above).
        
+       atcFreqDialogInput->setValue("");
+       atcFreqDialogInput->acceptInput();
        FG_PUSH_PUI_DIALOG(atcFreqDialog);
-       
-}
-
-static void atcUppercase(string &s)
-{
-       for(unsigned int i=0; i<s.size(); ++i) {
-               s[i] = toupper(s[i]);
-       }
 }
 
 void FGATCDialog::FreqDisplay(string ident) {
 
        atcUppercase(ident);
        
-       //char defaultATCLabel[] = "Enter desired option to communicate with ATC:";
-       string label = "Frequencies for airport ";
-       label += ident;
-       label += ":";
+       string label;
        char *s;
        
        int n = 0;      // Number of ATC frequencies at this airport
-       string freqs[20];
+       string freqs[ATC_MAX_FREQ_DISPLAY];
        char buf[8];
 
     FGAirport a;
     if ( dclFindAirportID( ident, &a ) ) {
                comm_list_type stations;
-               int found = current_commlist->FindByPos(a.longitude, a.latitude, a.elevation, 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();
@@ -542,46 +482,39 @@ void FGATCDialog::FreqDisplay(string ident) {
                                ++itr;
                        }
                }
+               if(n == 0) {
+                       label = "No frequencies found for airport ";
+                       label += ident;
+               } else {
+                       label = "Frequencies for airport ";
+                       label += ident;
+                       label += ":";
+               }
     } else {
                label = "Airport ";
                label += ident;
                label += " not found in database.";
-               n = -1;
        }
+
+       int hsize = 105 + (n * 30);
        
-       if(n == 0) {
-               label = "No frequencies found for airport ";
-               label += ident;
+       atcFreqDisplayFrame->setSize(400, hsize);
+       
+       atcFreqDisplayMessage -> setPosition (40, (hsize - 30));
+       atcFreqDisplayMessage -> setValue    (label.c_str());
+       atcFreqDisplayMessage -> getValue    (&s);
+       atcFreqDisplayMessage -> setLabel    (s);
+       
+       for(int i=0; i<n; ++i) {
+               atcFreqDisplayText[i] -> setPosition(40, hsize - 65 - (30 * i));
+               atcFreqDisplayText[i] -> setValue(freqs[i].c_str());
+               atcFreqDisplayText[i] -> getValue (&s);
+               atcFreqDisplayText[i] -> setLabel (s);
+               atcFreqDisplayText[i] -> reveal();
        }
-
-       int hsize = (n < 0 ? 100 : 105 + (n * 30));
-       atcFreqDisplay = new puDialogBox (250, 50);
-       {
-               atcFreqDisplayFrame   = new puFrame (0, 0, 400, hsize);
-               
-               atcFreqDisplayMessage = new puText          (40, (hsize - 30));
-               atcFreqDisplayMessage    -> setDefaultValue (label.c_str());
-               atcFreqDisplayMessage    -> getDefaultValue (&s);
-               atcFreqDisplayMessage    -> setLabel        (s);
-               
-               for(int i=0; i<n; ++i) {
-                       atcFreqDisplayText[i] = new puText(40, hsize - 65 - (30 * i));
-                       atcFreqDisplayText[i]->setDefaultValue(freqs[i].c_str());
-                       atcFreqDisplayText[i]-> getDefaultValue (&s);
-                       atcFreqDisplayText[i]-> setLabel        (s);
-               }
-               
-               atcFreqDisplayOkButton     =  new puOneShot         (50, 10, 110, 50);
-               atcFreqDisplayOkButton     ->     setLegend         (gui_msg_OK);
-               atcFreqDisplayOkButton     ->     makeReturnDefault (TRUE);
-               atcFreqDisplayOkButton     ->     setCallback       (FreqDisplayOK);
-               
-               atcFreqDisplayCancelButton =  new puOneShot         (140, 10, 210, 50);
-               atcFreqDisplayCancelButton ->     setLegend         (gui_msg_CANCEL);
-               atcFreqDisplayCancelButton ->     setCallback       (FreqDisplayCancel);
-               
+       for(int j=n; j<ATC_MAX_FREQ_DISPLAY; ++j) {
+               atcFreqDisplayText[j] -> hide();
        }
-       FG_FINALIZE_PUI_DIALOG(atcFreqDisplay);
        
        FG_PUSH_PUI_DIALOG(atcFreqDisplay);