celestia/src/celestia/winssbrowser.cpp

202 lines
6.5 KiB
C++

// winssbrowser.h
//
// Copyright (C) 2001, Chris Laurel <claurel@shatters.net>
//
// Solar system browser tool 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 <string>
#include <sstream>
#include <algorithm>
#include <set>
#include <windows.h>
#include <commctrl.h>
#include "winssbrowser.h"
#include "celutil/winutil.h"
#include "res/resource.h"
using namespace std;
HTREEITEM AddItemToTree(HWND hwndTV, LPSTR lpszItem, int nLevel, void* data,
HTREEITEM parent)
{
TVITEM tvi;
TVINSERTSTRUCT tvins;
static HTREEITEM hPrev = (HTREEITEM) TVI_FIRST;
#if 0
tvi.mask = TVIF_TEXT | TVIF_IMAGE | TVIF_SELECTEDIMAGE | TVIF_PARAM;
#endif
tvi.mask = TVIF_TEXT | TVIF_PARAM;
// Set the text of the item.
tvi.pszText = lpszItem;
tvi.cchTextMax = lstrlen(lpszItem);
// Save the heading level in the item's application-defined
// data area.
tvi.lParam = (LPARAM) data;
tvins.item = tvi;
tvins.hInsertAfter = hPrev;
tvins.hParent = parent;
// Add the item to the tree view control.
hPrev = (HTREEITEM) SendMessage(hwndTV, TVM_INSERTITEM, 0,
(LPARAM) (LPTVINSERTSTRUCT) &tvins);
#if 0
// The new item is a child item. Give the parent item a
// closed folder bitmap to indicate it now has child items.
if (nLevel > 1)
{
hti = TreeView_GetParent(hwndTV, hPrev);
tvi.mask = TVIF_IMAGE | TVIF_SELECTEDIMAGE;
tvi.hItem = hti;
// tvi.iImage = g_nClosed;
// tvi.iSelectedImage = g_nClosed;
TreeView_SetItem(hwndTV, &tvi);
}
#endif
return hPrev;
}
void AddPlanetarySystemToTree(const PlanetarySystem* sys, HWND treeView, int level, HTREEITEM parent)
{
for (int i = 0; i < sys->getSystemSize(); i++)
{
Body* world = sys->getBody(i);
if (world != NULL && world->getClassification() != Body::Invisible && !world->getName().empty())
{
HTREEITEM item;
item = AddItemToTree(treeView,
const_cast<char*>(UTF8ToCurrentCP(world->getName(true)).c_str()),
level,
static_cast<void*>(world),
parent);
const PlanetarySystem* satellites = world->getSatellites();
if (satellites != NULL)
AddPlanetarySystemToTree(satellites, treeView, level + 1, item);
}
}
}
BOOL APIENTRY SolarSystemBrowserProc(HWND hDlg,
UINT message,
UINT wParam,
LONG lParam)
{
SolarSystemBrowser* browser = reinterpret_cast<SolarSystemBrowser*>(GetWindowLong(hDlg, DWL_USER));
switch (message)
{
case WM_INITDIALOG:
{
SolarSystemBrowser* browser = reinterpret_cast<SolarSystemBrowser*>(lParam);
if (browser == NULL)
return EndDialog(hDlg, 0);
SetWindowLong(hDlg, DWL_USER, lParam);
HWND hwnd = GetDlgItem(hDlg, IDC_SSBROWSER_TREE);
const SolarSystem* solarSys = browser->appCore->getSimulation()->getNearestSolarSystem();
if (solarSys != NULL)
{
Universe* u = browser->appCore->getSimulation()->getUniverse();
string starNameString = UTF8ToCurrentCP(u->getStarCatalog()->getStarName(*(solarSys->getStar())));
HTREEITEM rootItem = AddItemToTree(hwnd, const_cast<char*>(starNameString.c_str()), 1, NULL,
(HTREEITEM) TVI_ROOT);
const PlanetarySystem* planets = solarSys->getPlanets();
if (planets != NULL)
AddPlanetarySystemToTree(planets, hwnd, 2, rootItem);
SendMessage(hwnd, TVM_EXPAND, TVE_EXPAND, (LPARAM) rootItem);
}
}
return(TRUE);
case WM_DESTROY:
if (browser != NULL && browser->parent != NULL)
{
SendMessage(browser->parent, WM_COMMAND, IDCLOSE,
reinterpret_cast<LPARAM>(browser));
}
break;
case WM_COMMAND:
if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL)
{
if (browser != NULL && browser->parent != NULL)
{
SendMessage(browser->parent, WM_COMMAND, IDCLOSE,
reinterpret_cast<LPARAM>(browser));
}
EndDialog(hDlg, 0);
return TRUE;
}
else if (LOWORD(wParam) == IDC_BUTTON_CENTER)
{
browser->appCore->charEntered('c');
}
else if (LOWORD(wParam) == IDC_BUTTON_GOTO)
{
browser->appCore->charEntered('G');
}
break;
case WM_NOTIFY:
{
LPNMHDR hdr = (LPNMHDR) lParam;
if (hdr->code == TVN_SELCHANGED)
{
LPNMTREEVIEW nm = (LPNMTREEVIEW) lParam;
Body* body = reinterpret_cast<Body*>(nm->itemNew.lParam);
if (body != NULL)
{
browser->appCore->getSimulation()->setSelection(Selection(body));
}
else
{
// If the body is NULL, assume that this is the tree item for
// the sun.
const SolarSystem* solarSys = browser->appCore->getSimulation()->getNearestSolarSystem();
if (solarSys != NULL && solarSys->getStar() != NULL)
browser->appCore->getSimulation()->setSelection(Selection(const_cast<Star*>(solarSys->getStar())));
}
}
}
}
return FALSE;
}
SolarSystemBrowser::SolarSystemBrowser(HINSTANCE appInstance,
HWND _parent,
CelestiaCore* _appCore) :
appCore(_appCore),
parent(_parent)
{
hwnd = CreateDialogParam(appInstance,
MAKEINTRESOURCE(IDD_SSBROWSER),
parent,
SolarSystemBrowserProc,
reinterpret_cast<LONG>(this));
}
SolarSystemBrowser::~SolarSystemBrowser()
{
SetWindowLong(hwnd, DWL_USER, 0);
}