#include <string>#include <algorithm>#include <set>#include <windows.h>#include <commctrl.h>#include <cstring>#include "winstarbrowser.h"#include "res/resource.h"Include dependency graph for winstarbrowser.cpp:

Go to the source code of this file.
Classes | |
| struct | BrighterStarPredicate |
| struct | CloserStarPredicate |
| struct | SolarSystemPredicate |
Enumerations | |
| enum | { BrightestStars = 0, NearestStars = 1, StarsWithPlanets = 2 } |
Functions | |
| template<class Pred> | |
| vector< const Star * > * | FindStars (const StarDatabase &stardb, Pred pred, int nStars) |
| static Point3f | fromMicroLY (const Point3f &p) |
| bool | InitStarBrowserColumns (HWND listView) |
| bool | InitStarBrowserItems (HWND listView, StarBrowser *browser) |
| bool | InitStarBrowserLVItems (HWND listView, vector< const Star * > &stars) |
| void | RefreshItems (HWND hDlg, StarBrowser *browser) |
| void | SetMouseCursor (LPCTSTR lpCursor) |
| int CALLBACK | StarBrowserCompareFunc (LPARAM lParam0, LPARAM lParam1, LPARAM lParamSort) |
| void | StarBrowserDisplayItem (LPNMLVDISPINFOA nm, StarBrowser *browser) |
| BOOL APIENTRY | StarBrowserProc (HWND hDlg, UINT message, UINT wParam, LONG lParam) |
| static string | starNameString ("") |
| static Point3f | toMicroLY (const Point3f &p) |
Variables | |
| static char | callbackScratch [256] |
| static const int | DefaultListStars = 100 |
| static const int | MaxListStars = 500 |
| static const int | MinListStars = 10 |
|
|
Definition at line 34 of file winstarbrowser.cpp. 00034 {
00035 BrightestStars = 0,
00036 NearestStars = 1,
00037 StarsWithPlanets = 2,
00038 };
|
|
||||||||||||||||||||
|
Definition at line 150 of file winstarbrowser.cpp. References Star::getVisibility(). Referenced by InitStarBrowserItems(). 00151 {
00152 vector<const Star*>* finalStars = new vector<const Star*>();
00153 if (nStars == 0)
00154 return finalStars;
00155
00156 typedef multiset<const Star*, Pred> StarSet;
00157 StarSet firstStars(pred);
00158
00159 int totalStars = stardb.size();
00160 if (totalStars < nStars)
00161 nStars = totalStars;
00162
00163 // We'll need at least nStars in the set, so first fill
00164 // up the list indiscriminately.
00165 int i = 0;
00166 for (i = 0; i < nStars; i++)
00167 {
00168 Star* star = stardb.getStar(i);
00169 if (star->getVisibility())
00170 firstStars.insert(star);
00171 }
00172
00173 // From here on, only add a star to the set if it's
00174 // a better match than the worst matching star already
00175 // in the set.
00176 const Star* lastStar = *--firstStars.end();
00177 for (; i < totalStars; i++)
00178 {
00179 Star* star = stardb.getStar(i);
00180 if (star->getVisibility() && pred(star, lastStar))
00181 {
00182 firstStars.insert(star);
00183 firstStars.erase(--firstStars.end());
00184 lastStar = *--firstStars.end();
00185 }
00186 }
00187
00188 // Move the best matching stars into the vector
00189 finalStars->reserve(nStars);
00190 for (StarSet::const_iterator iter = firstStars.begin();
00191 iter != firstStars.end(); iter++)
00192 {
00193 finalStars->insert(finalStars->end(), *iter);
00194 }
00195
00196 return finalStars;
00197 }
|
|
|
Definition at line 45 of file winstarbrowser.cpp. Referenced by RefreshItems(), and StarBrowser::StarBrowser().
|
|
|
Definition at line 51 of file winstarbrowser.cpp. Referenced by StarBrowserProc(). 00052 {
00053 LVCOLUMN lvc;
00054 LVCOLUMN columns[5];
00055
00056 lvc.mask = LVCF_FMT | LVCF_WIDTH | LVCF_TEXT | LVCF_SUBITEM;
00057 lvc.fmt = LVCFMT_LEFT;
00058 lvc.cx = 60;
00059 lvc.pszText = "";
00060
00061 int nColumns = sizeof(columns) / sizeof(columns[0]);
00062 int i;
00063
00064 for (i = 0; i < nColumns; i++)
00065 columns[i] = lvc;
00066
00067 columns[0].pszText = "Name";
00068 columns[0].cx = 100;
00069 columns[1].pszText = "Distance (ly)";
00070 columns[1].fmt = LVCFMT_RIGHT;
00071 columns[1].cx = 75;
00072 columns[2].pszText = "App. mag";
00073 columns[2].fmt = LVCFMT_RIGHT;
00074 columns[3].pszText = "Abs. mag";
00075 columns[3].fmt = LVCFMT_RIGHT;
00076 columns[4].pszText = "Type";
00077
00078 for (i = 0; i < nColumns; i++)
00079 {
00080 columns[i].iSubItem = i;
00081 if (ListView_InsertColumn(listView, i, &columns[i]) == -1)
00082 return false;
00083 }
00084
00085 return true;
00086 }
|
|
||||||||||||
|
Definition at line 221 of file winstarbrowser.cpp. References BrightestStars, FindStars(), Universe::getSolarSystemCatalog(), Universe::getStarCatalog(), InitStarBrowserLVItems(), min, NearestStars, SolarSystemPredicate::pos, CloserStarPredicate::pos, BrighterStarPredicate::pos, SolarSystemPredicate::solarSystems, stars, StarsWithPlanets, and BrighterStarPredicate::ucPos. Referenced by RefreshItems(), and StarBrowserProc(). 00222 {
00223 Universe* univ = browser->appCore->getSimulation()->getUniverse();
00224 StarDatabase* stardb = univ->getStarCatalog();
00225 SolarSystemCatalog* solarSystems = univ->getSolarSystemCatalog();
00226
00227 vector<const Star*>* stars = NULL;
00228 switch (browser->predicate)
00229 {
00230 case BrightestStars:
00231 {
00232 BrighterStarPredicate brighterPred;
00233 brighterPred.pos = browser->pos;
00234 brighterPred.ucPos = browser->ucPos;
00235 stars = FindStars(*stardb, brighterPred, browser->nStars);
00236 }
00237 break;
00238
00239 case NearestStars:
00240 {
00241 CloserStarPredicate closerPred;
00242 closerPred.pos = browser->pos;
00243 stars = FindStars(*stardb, closerPred, browser->nStars);
00244 }
00245 break;
00246
00247 case StarsWithPlanets:
00248 {
00249 if (solarSystems == NULL)
00250 return false;
00251 SolarSystemPredicate solarSysPred;
00252 solarSysPred.pos = browser->pos;
00253 solarSysPred.solarSystems = solarSystems;
00254 stars = FindStars(*stardb, solarSysPred,
00255 min((unsigned int) browser->nStars, solarSystems->size()));
00256 }
00257 break;
00258
00259 default:
00260 return false;
00261 }
00262
00263 bool succeeded = InitStarBrowserLVItems(listView, *stars);
00264 delete stars;
00265
00266 return succeeded;
00267 }
|
|
||||||||||||
|
Definition at line 200 of file winstarbrowser.cpp. References stars. Referenced by InitStarBrowserItems(). 00201 {
00202 LVITEM lvi;
00203
00204 lvi.mask = LVIF_TEXT | LVIF_PARAM | LVIF_STATE;
00205 lvi.state = 0;
00206 lvi.stateMask = 0;
00207 lvi.pszText = LPSTR_TEXTCALLBACK;
00208
00209 for (unsigned int i = 0; i < stars.size(); i++)
00210 {
00211 lvi.iItem = i;
00212 lvi.iSubItem = 0;
00213 lvi.lParam = (LPARAM) stars[i];
00214 ListView_InsertItem(listView, &lvi);
00215 }
00216
00217 return true;
00218 }
|
|
||||||||||||
|
Definition at line 373 of file winstarbrowser.cpp. References fromMicroLY(), Simulation::getObserver(), Observer::getPosition(), IDC_STARBROWSER_LIST, InitStarBrowserItems(), and SetMouseCursor(). Referenced by StarBrowserProc(), and ViewOptionsProc(). 00374 {
00375 SetMouseCursor(IDC_WAIT);
00376
00377 Simulation* sim = browser->appCore->getSimulation();
00378 browser->ucPos = sim->getObserver().getPosition();
00379 browser->pos = fromMicroLY((Point3f) browser->ucPos);
00380 HWND hwnd = GetDlgItem(hDlg, IDC_STARBROWSER_LIST);
00381 if (hwnd != 0)
00382 {
00383 ListView_DeleteAllItems(hwnd);
00384 InitStarBrowserItems(hwnd, browser);
00385 }
00386
00387 SetMouseCursor(IDC_ARROW);
00388 }
|
|
|
Definition at line 12 of file winutil.cpp. 00013 {
00014 HCURSOR hNewCrsr;
00015
00016 if (hNewCrsr = LoadCursor(NULL, lpCursor))
00017 SetCursor(hNewCrsr);
00018 }
|
|
||||||||||||||||
|
Definition at line 281 of file winstarbrowser.cpp. References astro::absToAppMag(), Point3< T >::distanceTo(), Star::getAbsoluteMagnitude(), Star::getPosition(), Star::getSpectralType(), StarBrowserSortInfo::pos, sign(), StarBrowserSortInfo::subItem, toMicroLY(), and StarBrowserSortInfo::ucPos. Referenced by StarBrowserProc(). 00283 {
00284 StarBrowserSortInfo* sortInfo = reinterpret_cast<StarBrowserSortInfo*>(lParamSort);
00285 Star* star0 = reinterpret_cast<Star*>(lParam0);
00286 Star* star1 = reinterpret_cast<Star*>(lParam1);
00287
00288 switch (sortInfo->subItem)
00289 {
00290 case 0:
00291 return 0;
00292
00293 case 1:
00294 {
00295 float d0 = sortInfo->pos.distanceTo(star0->getPosition());
00296 float d1 = sortInfo->pos.distanceTo(star1->getPosition());
00297 return (int) sign(d0 - d1);
00298 }
00299
00300 case 2:
00301 {
00302 float d0 = sortInfo->pos.distanceTo(star0->getPosition());
00303 float d1 = sortInfo->pos.distanceTo(star1->getPosition());
00304 if (d0 < 1.0f)
00305 d0 = (toMicroLY(star0->getPosition()) - sortInfo->ucPos).length() * 1e-6f;
00306 if (d1 < 1.0f)
00307 d1 = (toMicroLY(star1->getPosition()) - sortInfo->ucPos).length() * 1e-6f;
00308 return (int) sign(astro::absToAppMag(star0->getAbsoluteMagnitude(), d0) -
00309 astro::absToAppMag(star1->getAbsoluteMagnitude(), d1));
00310 }
00311
00312 case 3:
00313 return (int) sign(star0->getAbsoluteMagnitude() - star1->getAbsoluteMagnitude());
00314
00315 case 4:
00316 return strcmp(star0->getSpectralType(), star1->getSpectralType());
00317
00318 default:
00319 return 0;
00320 }
00321 }
|
|
||||||||||||
|
Definition at line 324 of file winstarbrowser.cpp. References astro::absToAppMag(), callbackScratch, Star::getAbsoluteMagnitude(), Star::getPosition(), Star::getSpectralType(), Universe::getStarCatalog(), StarDatabase::getStarName(), Vector3< T >::length(), starNameString(), and toMicroLY(). Referenced by StarBrowserProc(). 00325 {
00326 Star* star = reinterpret_cast<Star*>(nm->item.lParam);
00327 if (star == NULL)
00328 {
00329 nm->item.pszText = "";
00330 return;
00331 }
00332
00333 switch (nm->item.iSubItem)
00334 {
00335 case 0:
00336 {
00337 Universe* u = browser->appCore->getSimulation()->getUniverse();
00338 starNameString = u->getStarCatalog()->getStarName(*star);
00339 nm->item.pszText = const_cast<char*>(starNameString.c_str());
00340 }
00341 break;
00342
00343 case 1:
00344 sprintf(callbackScratch, "%.3f",
00345 browser->pos.distanceTo(star->getPosition()));
00346 nm->item.pszText = callbackScratch;
00347 break;
00348
00349 case 2:
00350 {
00351 Vec3f r = toMicroLY(star->getPosition()) - browser->ucPos;
00352 float appMag = astro::absToAppMag(star->getAbsoluteMagnitude(),
00353 r.length() * 1e-6f);
00354 sprintf(callbackScratch, "%.2f", appMag);
00355 nm->item.pszText = callbackScratch;
00356 }
00357 break;
00358
00359 case 3:
00360 sprintf(callbackScratch, "%.2f", star->getAbsoluteMagnitude());
00361 nm->item.pszText = callbackScratch;
00362 break;
00363
00364 case 4:
00365 strncpy(callbackScratch, star->getSpectralType(),
00366 sizeof(callbackScratch));
00367 callbackScratch[sizeof(callbackScratch) - 1] = '\0';
00368 nm->item.pszText = callbackScratch;
00369 break;
00370 }
00371 }
|
|
||||||||||||||||||||
|
Definition at line 390 of file winstarbrowser.cpp. References StarBrowser::appCore, BOOL(), BrightestStars, CelestiaCore::charEntered(), DefaultListStars, CelestiaCore::getSimulation(), IDC_BUTTON_CENTER, IDC_BUTTON_GOTO, IDC_BUTTON_REFRESH, IDC_MAXSTARS_EDIT, IDC_MAXSTARS_SLIDER, IDC_RADIO_BRIGHTEST, IDC_RADIO_NEAREST, IDC_RADIO_WITHPLANETS, IDC_STARBROWSER_LIST, InitStarBrowserColumns(), InitStarBrowserItems(), MaxListStars, MinListStars, NearestStars, StarBrowser::nStars, StarBrowser::parent, StarBrowser::pos, StarBrowserSortInfo::pos, StarBrowser::predicate, RefreshItems(), Simulation::setSelection(), StarBrowserCompareFunc(), StarBrowserDisplayItem(), StarsWithPlanets, StarBrowserSortInfo::subItem, StarBrowser::ucPos, and StarBrowserSortInfo::ucPos. Referenced by StarBrowser::StarBrowser(). 00394 {
00395 StarBrowser* browser = reinterpret_cast<StarBrowser*>(GetWindowLong(hDlg, DWL_USER));
00396
00397 switch (message)
00398 {
00399 case WM_INITDIALOG:
00400 {
00401 StarBrowser* browser = reinterpret_cast<StarBrowser*>(lParam);
00402 if (browser == NULL)
00403 return EndDialog(hDlg, 0);
00404 SetWindowLong(hDlg, DWL_USER, lParam);
00405
00406 HWND hwnd = GetDlgItem(hDlg, IDC_STARBROWSER_LIST);
00407 InitStarBrowserColumns(hwnd);
00408 InitStarBrowserItems(hwnd, browser);
00409 CheckRadioButton(hDlg, IDC_RADIO_NEAREST, IDC_RADIO_WITHPLANETS, IDC_RADIO_NEAREST);
00410
00411 //Initialize Max Stars edit box
00412 char val[16];
00413 hwnd = GetDlgItem(hDlg, IDC_MAXSTARS_EDIT);
00414 sprintf(val, "%d", DefaultListStars);
00415 SetWindowText(hwnd, val);
00416 SendMessage(hwnd, EM_LIMITTEXT, 3, 0);
00417
00418 //Initialize Max Stars Slider control
00419 SendDlgItemMessage(hDlg, IDC_MAXSTARS_SLIDER, TBM_SETRANGE,
00420 (WPARAM)TRUE, (LPARAM)MAKELONG(MinListStars, MaxListStars));
00421 SendDlgItemMessage(hDlg, IDC_MAXSTARS_SLIDER, TBM_SETPOS,
00422 (WPARAM)TRUE, (LPARAM)DefaultListStars);
00423
00424 return(TRUE);
00425 }
00426
00427 case WM_DESTROY:
00428 if (browser != NULL && browser->parent != NULL)
00429 {
00430 SendMessage(browser->parent, WM_COMMAND, IDCLOSE,
00431 reinterpret_cast<LPARAM>(browser));
00432 }
00433 break;
00434
00435 case WM_COMMAND:
00436 switch (LOWORD(wParam))
00437 {
00438 case IDOK:
00439 case IDCANCEL:
00440 if (browser != NULL && browser->parent != NULL)
00441 {
00442 SendMessage(browser->parent, WM_COMMAND, IDCLOSE,
00443 reinterpret_cast<LPARAM>(browser));
00444 }
00445 EndDialog(hDlg, 0);
00446 return TRUE;
00447
00448 case IDC_BUTTON_CENTER:
00449 browser->appCore->charEntered('c');
00450 break;
00451
00452 case IDC_BUTTON_GOTO:
00453 browser->appCore->charEntered('G');
00454 break;
00455
00456 case IDC_RADIO_BRIGHTEST:
00457 browser->predicate = BrightestStars;
00458 RefreshItems(hDlg, browser);
00459 break;
00460
00461 case IDC_RADIO_NEAREST:
00462 browser->predicate = NearestStars;
00463 RefreshItems(hDlg, browser);
00464 break;
00465
00466 case IDC_RADIO_WITHPLANETS:
00467 browser->predicate = StarsWithPlanets;
00468 RefreshItems(hDlg, browser);
00469 break;
00470
00471 case IDC_BUTTON_REFRESH:
00472 RefreshItems(hDlg, browser);
00473 break;
00474
00475 case IDC_MAXSTARS_EDIT:
00476 // TODO: browser != NULL check should be in a lot more places
00477 if (HIWORD(wParam) == EN_KILLFOCUS && browser != NULL)
00478 {
00479 char val[16];
00480 DWORD nNewStars;
00481 DWORD minRange, maxRange;
00482 GetWindowText((HWND) lParam, val, sizeof(val));
00483 nNewStars = atoi(val);
00484
00485 // Check if new value is different from old. Don't want to
00486 // cause a refresh to occur if not necessary.
00487 if (nNewStars != browser->nStars)
00488 {
00489 minRange = SendDlgItemMessage(hDlg, IDC_MAXSTARS_SLIDER, TBM_GETRANGEMIN, 0, 0);
00490 maxRange = SendDlgItemMessage(hDlg, IDC_MAXSTARS_SLIDER, TBM_GETRANGEMAX, 0, 0);
00491 if (nNewStars < minRange)
00492 nNewStars = minRange;
00493 else if (nNewStars > maxRange)
00494 nNewStars = maxRange;
00495
00496 // If new value has been adjusted from what was entered,
00497 // reflect new value back in edit control.
00498 if (atoi(val) != nNewStars)
00499 {
00500 sprintf(val, "%d", nNewStars);
00501 SetWindowText((HWND)lParam, val);
00502 }
00503
00504 // Recheck value if different from original.
00505 if (nNewStars != browser->nStars)
00506 {
00507 browser->nStars = nNewStars;
00508 SendDlgItemMessage(hDlg,
00509 IDC_MAXSTARS_SLIDER,
00510 TBM_SETPOS,
00511 (WPARAM) TRUE,
00512 (LPARAM) browser->nStars);
00513 RefreshItems(hDlg, browser);
00514 }
00515 }
00516 }
00517 break;
00518 }
00519 break;
00520
00521 case WM_NOTIFY:
00522 {
00523 LPNMHDR hdr = (LPNMHDR) lParam;
00524
00525 if(hdr->idFrom == IDC_STARBROWSER_LIST)
00526 {
00527 switch(hdr->code)
00528 {
00529 case LVN_GETDISPINFO:
00530 StarBrowserDisplayItem((LPNMLVDISPINFOA) lParam, browser);
00531 break;
00532 case LVN_ITEMCHANGED:
00533 {
00534 LPNMLISTVIEW nm = (LPNMLISTVIEW) lParam;
00535 if ((nm->uNewState & LVIS_SELECTED) != 0)
00536 {
00537 Simulation* sim = browser->appCore->getSimulation();
00538 Star* star = reinterpret_cast<Star*>(nm->lParam);
00539 if (star != NULL)
00540 sim->setSelection(Selection(star));
00541 }
00542 break;
00543 }
00544 case LVN_COLUMNCLICK:
00545 {
00546 HWND hwnd = GetDlgItem(hDlg, IDC_STARBROWSER_LIST);
00547 if (hwnd != 0)
00548 {
00549 LPNMLISTVIEW nm = (LPNMLISTVIEW) lParam;
00550 StarBrowserSortInfo sortInfo;
00551 sortInfo.subItem = nm->iSubItem;
00552 sortInfo.ucPos = browser->ucPos;
00553 sortInfo.pos = browser->pos;
00554 ListView_SortItems(hwnd, StarBrowserCompareFunc,
00555 reinterpret_cast<LPARAM>(&sortInfo));
00556 }
00557 }
00558
00559 }
00560 }
00561 }
00562 break;
00563
00564 case WM_HSCROLL:
00565 {
00566 WORD sbValue = LOWORD(wParam);
00567 switch(sbValue)
00568 {
00569 case SB_THUMBTRACK:
00570 {
00571 char val[16];
00572 HWND hwnd = GetDlgItem(hDlg, IDC_MAXSTARS_EDIT);
00573 sprintf(val, "%d", HIWORD(wParam));
00574 SetWindowText(hwnd, val);
00575 break;
00576 }
00577 case SB_THUMBPOSITION:
00578 {
00579 browser->nStars = (int)HIWORD(wParam);
00580 RefreshItems(hDlg, browser);
00581 break;
00582 }
00583 }
00584 }
00585 break;
00586 }
00587
00588 return FALSE;
00589 }
|
|
|
Referenced by StarBrowserDisplayItem(). |
|
|
Definition at line 40 of file winstarbrowser.cpp. Referenced by BrighterStarPredicate::operator()(), StarBrowserCompareFunc(), and StarBrowserDisplayItem().
|
|
|
Definition at line 272 of file winstarbrowser.cpp. Referenced by StarBrowserDisplayItem(). |
|
|
Definition at line 28 of file winstarbrowser.cpp. Referenced by StarBrowser::StarBrowser(), and StarBrowserProc(). |
|
|
Definition at line 27 of file winstarbrowser.cpp. Referenced by StarBrowserProc(). |
|
|
Definition at line 26 of file winstarbrowser.cpp. Referenced by StarBrowserProc(). |
1.4.1