#include #include #include #include #include "resource.h" #include "defs.h" HFONT HfNormal; HFONT HfBold; HMENU HPopupMenu; HWND HWnd; static LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); static INT_PTR CALLBACK AboutDlgProc(HWND, UINT, WPARAM, LPARAM); static int Attach(void); static void SetupFonts(void); static void UpdateTheme(void); int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, INT nCmdShow) { char *rgArgs[2]; HWND hWnd; LPTSTR tszErr; MSG msg; INITCOMMONCONTROLSEX icc; WNDCLASSEX wc; /* Initialize Prolog. */ rgArgs[0] = "EpisodeBrowser"; rgArgs[1] = NULL; tszErr = TEXT("Could not initialize Prolog."); if (!PL_initialise(1, rgArgs)) goto f; tszErr = TEXT("Could not attach databases."); if (!Attach()) goto f; /* Initialize window. */ icc.dwSize = sizeof(icc); icc.dwICC = ICC_WIN95_CLASSES; tszErr = TEXT("Could not initialize common controls."); if (!InitCommonControlsEx(&icc)) goto f; HPopupMenu = LoadMenu(NULL, MAKEINTRESOURCE(IDR_POPUPMENU)); HPopupMenu = GetSubMenu(HPopupMenu, 0); memset(&wc, 0, sizeof(WNDCLASSEX)); wc.cbSize = sizeof(WNDCLASSEX); wc.lpfnWndProc = WndProc; wc.hInstance = hInstance; wc.hIcon = LoadIcon(NULL, IDI_APPLICATION); wc.hCursor = LoadCursor(NULL, IDC_ARROW); wc.hbrBackground = (HBRUSH)(COLOR_WINDOW+1); wc.lpszMenuName = MAKEINTRESOURCE(IDR_MENU); wc.lpszClassName = TEXT("EpisodeBrowser"); wc.hIconSm = LoadIcon(NULL, IDI_APPLICATION); tszErr = TEXT("Could not register window class."); if (!RegisterClassEx(&wc)) goto f; hWnd = CreateWindowEx( 0, TEXT("EpisodeBrowser"), TEXT("Episode Browser"), WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, 510, 400, NULL, NULL, hInstance, NULL ); tszErr = TEXT("Could not create main window."); if (!hWnd) goto f; SetupFonts(); ShowWindow(hWnd, nCmdShow); while (GetMessage(&msg, NULL, 0, 0) > 0) { if (IsDialogMessage(hWnd, &msg)) continue; TranslateMessage(&msg); DispatchMessage(&msg); } PL_halt(0); return 0; f: MessageBox(NULL, tszErr, TEXT("Error"), MB_ICONERROR); PL_halt(1); return 1; } LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { switch (uMsg) { case WM_CLOSE: DestroyWindow(hWnd); break; case WM_DESTROY: PostQuitMessage(0); break; case WM_SIZE: UpdateLayout(); break; case WM_CREATE: { extern HWND HElv; HWnd = hWnd; DlvCreate(); ElvCreate(); UpdateTheme(); break; } case WM_THEMECHANGED: UpdateTheme(); break; case WM_ACTIVATE: switch (wParam) { fid_t f; term_t t; extern HWND HElv; case WA_INACTIVE: break; case WA_ACTIVE: SetFocus(HElv); /* FALLTHROUGH */ case WA_CLICKACTIVE: F(f); t = T(0); P("track_episodes","update_tracked_episodes",0,t); ElvRedraw(); Fd(f); } break; case WM_NOTIFY: switch (((LPNMHDR)lParam)->idFrom) { case IDC_EPISODELISTVIEW: return ElvHandleNotify(lParam); } break; case WM_COMMAND: switch (LOWORD(wParam)) { case ID_FILE_EXIT: PostMessage(hWnd, WM_CLOSE, 0, 0); break; case ID_FILE_REFRESH: ElvUpdate(); break; case ID_FILE_ABOUT: DialogBox( GetModuleHandle(NULL), MAKEINTRESOURCE(IDD_ABOUT), hWnd, AboutDlgProc ); break; case ID_WATCH: case ID_TOGGLE: case ID_FORGET: case ID_LOOKUP: { fid_t f; HWND hElv; term_t t; extern LPLVITEM LpLviElvSelection; hElv = GetDlgItem(hWnd, IDC_EPISODELISTVIEW); F(f); t = T(1); PI(t,LpLviElvSelection->lParam) break; switch (LOWORD(wParam)) { case ID_WATCH: P("local_episode","open_episode",1,t); break; case ID_TOGGLE: P("track_episodes","toggle_episode",1,t); ElvRedraw(); break; case ID_FORGET: P("track_episodes","forget_episode",1,t); P("track_episodes","update_tracked_episodes",0,t); ElvRedraw(); break; case ID_LOOKUP: P("episode_data","retract_episode",1,t); ElvUpdateName(LpLviElvSelection); ElvRedraw(); DlvShowEpisode(LpLviElvSelection->lParam); break; } Fd(f); break; } } break; default: return DefWindowProc(hWnd, uMsg, wParam, lParam); } return 0; } INT_PTR CALLBACK AboutDlgProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { switch (uMsg) { case WM_CLOSE: EndDialog(hWnd, IDOK); break; case WM_COMMAND: switch (LOWORD(wParam)) { case IDOK: EndDialog(hWnd, IDOK); break; } break; default: return FALSE; } return TRUE; } /***/ /* Attach persistent databases. */ int Attach() { fid_t f; term_t t; F(f); t = T(0); P("track_episodes","attach",0,t) goto f; P("episode_data","attach",0,t) goto f; Fd(f); return 1; f: Fd(f); return 0; } void SetupFonts() { HMODULE hModule; LOGFONT lf; hModule = LoadLibrary(TEXT("User32.dll")); if (hModule && GetProcAddress(hModule, "SystemParametersInfoW")) { NONCLIENTMETRICS m; m.cbSize = sizeof(NONCLIENTMETRICS); SystemParametersInfo(SPI_GETNONCLIENTMETRICS, sizeof(NONCLIENTMETRICS), &m, 0); HfNormal = CreateFontIndirect(&m.lfMessageFont); } else HfNormal = GetStockObject(DEFAULT_GUI_FONT); GetObject(HfNormal, sizeof(LOGFONT), &lf); lf.lfWeight = FW_BOLD; HfBold = CreateFontIndirect(&lf); } /***/ void UpdateLayout() { HWND hElv, hDlv; int cxColumn, cyDlv, iCount; LOGFONT lf; RECT rc; static int cxVScroll = 0; GetClientRect(HWnd, &rc); if (!cxVScroll) cxVScroll = GetSystemMetrics(SM_CXVSCROLL); /* Resize data list view. */ hDlv = GetDlgItem(HWnd, IDC_DATALISTVIEW); iCount = ListView_GetItemCount(hDlv); cyDlv = rc.bottom - (iCount ? 27+iCount*19 : 0); MoveWindow(hDlv, 0, cyDlv, rc.right, rc.bottom, TRUE); cxColumn = ListView_GetColumnWidth(hDlv, 0); ListView_SetColumnWidth(hDlv, 1, rc.right-cxColumn-cxVScroll-4); /* Resize episode list view. */ hElv = GetDlgItem(HWnd, IDC_EPISODELISTVIEW); MoveWindow(hElv, 0, 0, rc.right, cyDlv+1, TRUE); cxColumn = ListView_GetColumnWidth(hElv, 0); ListView_SetColumnWidth(hElv, 1, rc.right-cxColumn-cxVScroll-4); } void UpdateTheme() { int bThemeActive; extern HWND HElv, HDlv; static int bTheming = -1; if (bTheming == -1) { HMODULE hModule; hModule = LoadLibrary(TEXT("uxtheme.dll")); bTheming = hModule && GetProcAddress(hModule,"SetWindowTheme"); } if (!bTheming) return; bThemeActive = IsThemeActive(); LvSetTheme(HElv, bThemeActive); LvSetTheme(HDlv, bThemeActive); }