celestia/src/celestia/wingotodlg.cpp

178 lines
6.1 KiB
C++

// wingotodlg.cpp
//
// Copyright (C) 2001, Chris Laurel <claurel@shatters.net>
//
// 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 <windows.h>
#include "wingotodlg.h"
#include "celutil/winutil.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,
WPARAM wParam,
LPARAM lParam)
{
GotoObjectDialog* gotoDlg = reinterpret_cast<GotoObjectDialog*>(GetWindowLongPtr(hDlg, DWLP_USER));
switch (message)
{
case WM_INITDIALOG:
{
GotoObjectDialog* gotoDlg = reinterpret_cast<GotoObjectDialog*>(lParam);
if (gotoDlg == NULL)
return EndDialog(hDlg, 0);
SetWindowLongPtr(hDlg, DWLP_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,
const_cast<char*>(UTF8ToCurrentCP(sim->getSelection().body()->getName(true)).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], out[1024];
wchar_t wbuff[1024];
int len = GetDlgItemText(hDlg, IDC_EDIT_OBJECTNAME, buf, sizeof buf);
Simulation* sim = gotoDlg->appCore->getSimulation();
Selection sel;
if (len > 0)
{
int wlen = MultiByteToWideChar(CP_ACP, 0, buf, -1, wbuff, sizeof(wbuff));
WideCharToMultiByte(CP_UTF8, 0, wbuff, wlen, out, sizeof(out), NULL, NULL);
sel = sim->findObjectFromPath(string(out), true);
}
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),
ObserverFrame::ObserverLocal);
}
}
return TRUE;
}
else if (LOWORD(wParam) == IDCANCEL)
{
if (gotoDlg != NULL && gotoDlg->parent != NULL)
{
SendMessage(gotoDlg->parent, WM_COMMAND, IDCLOSE,
reinterpret_cast<LPARAM>(gotoDlg));
}
EndDialog(hDlg, 0);
return TRUE;
}
break;
case WM_DESTROY:
if (gotoDlg != NULL && gotoDlg->parent != NULL)
{
SendMessage(gotoDlg->parent, WM_COMMAND, IDCLOSE,
reinterpret_cast<LPARAM>(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,
(DLGPROC)GotoObjectProc,
reinterpret_cast<LPARAM>(this));
}