// wingotodlg.cpp // // Copyright (C) 2001, Chris Laurel // // Goto object dialog for Windows. // // This program is free software; you can redistribute it and/or // modify it under the terms of the GNU General Public License // as published by the Free Software Foundation; either version 2 // of the License, or (at your option) any later version. #include #include "wingotodlg.h" #include "res/resource.h" using namespace std; static bool GetDialogFloat(HWND hDlg, int id, float& f) { char buf[128]; if (GetDlgItemText(hDlg, id, buf, sizeof buf) > 0 && sscanf(buf, " %f", &f) == 1) return true; else return false; } static bool SetDialogFloat(HWND hDlg, int id, char* format, float f) { char buf[128]; sprintf(buf, format, f); return (SetDlgItemText(hDlg, id, buf) == TRUE); } static BOOL APIENTRY GotoObjectProc(HWND hDlg, UINT message, UINT wParam, LONG lParam) { GotoObjectDialog* gotoDlg = reinterpret_cast(GetWindowLong(hDlg, DWL_USER)); switch (message) { case WM_INITDIALOG: { GotoObjectDialog* gotoDlg = reinterpret_cast(lParam); if (gotoDlg == NULL) return EndDialog(hDlg, 0); SetWindowLong(hDlg, DWL_USER, lParam); CheckRadioButton(hDlg, IDC_RADIO_KM, IDC_RADIO_RADII, IDC_RADIO_KM); //Initialize name, distance, latitude and longitude edit boxes with current values. Simulation* sim = gotoDlg->appCore->getSimulation(); double distance, longitude, latitude; sim->getSelectionLongLat(distance, longitude, latitude); //Display information in format appropriate for object if (sim->getSelection().body() != NULL) { distance = distance - (double) sim->getSelection().body()->getRadius(); SetDialogFloat(hDlg, IDC_EDIT_DISTANCE, "%.1f", (float)distance); SetDialogFloat(hDlg, IDC_EDIT_LONGITUDE, "%.5f", (float)longitude); SetDialogFloat(hDlg, IDC_EDIT_LATITUDE, "%.5f", (float)latitude); SetDlgItemText(hDlg, IDC_EDIT_OBJECTNAME, (char*) sim->getSelection().body()->getName().c_str()); } // else if (sim->getSelection().star != NULL) // { // //Code to obtain searchable star name // SetDlgItemText(hDlg, IDC_EDIT_OBJECTNAME, (char*)sim->getSelection().star->); // } return(TRUE); } break; case WM_COMMAND: if (LOWORD(wParam) == IDC_BUTTON_GOTO) { char buf[1024]; int len = GetDlgItemText(hDlg, IDC_EDIT_OBJECTNAME, buf, sizeof buf); Simulation* sim = gotoDlg->appCore->getSimulation(); Selection sel; if (len > 0) sel = sim->findObjectFromPath(buf); if (!sel.empty()) { sim->setSelection(sel); sim->geosynchronousFollow(); float distance = (float) (sel.radius() * 5); if (GetDialogFloat(hDlg, IDC_EDIT_DISTANCE, distance)) { if (IsDlgButtonChecked(hDlg, IDC_RADIO_AU) == BST_CHECKED) distance = astro::AUtoKilometers(distance); else if (IsDlgButtonChecked(hDlg, IDC_RADIO_RADII) == BST_CHECKED) distance = distance * (float) sel.radius(); distance += (float) sel.radius(); } distance = astro::kilometersToLightYears(distance); float longitude, latitude; if (GetDialogFloat(hDlg, IDC_EDIT_LONGITUDE, longitude) && GetDialogFloat(hDlg, IDC_EDIT_LATITUDE, latitude)) { sim->gotoSelectionLongLat(5.0, distance, degToRad(longitude), degToRad(latitude), Vec3f(0, 1, 0)); } else { sim->gotoSelection(5.0, distance, Vec3f(0, 1, 0), astro::ObserverLocal); } } return TRUE; } else if (LOWORD(wParam) == IDCANCEL) { if (gotoDlg != NULL && gotoDlg->parent != NULL) { SendMessage(gotoDlg->parent, WM_COMMAND, IDCLOSE, reinterpret_cast(gotoDlg)); } EndDialog(hDlg, 0); return TRUE; } break; case WM_DESTROY: if (gotoDlg != NULL && gotoDlg->parent != NULL) { SendMessage(gotoDlg->parent, WM_COMMAND, IDCLOSE, reinterpret_cast(gotoDlg)); } EndDialog(hDlg, 0); return TRUE; } return FALSE; } GotoObjectDialog::GotoObjectDialog(HINSTANCE appInstance, HWND _parent, CelestiaCore* _appCore) : appCore(_appCore), parent(_parent) { hwnd = CreateDialogParam(appInstance, MAKEINTRESOURCE(IDD_GOTO_OBJECT), parent, GotoObjectProc, reinterpret_cast(this)); }