|
|
//////////////////////////////////////////////////////////////////////////////
//
// File: cfgDlg.cpp
//
// Description:
//
// Copyright (c) 2000 Microsoft Corp.
//
//////////////////////////////////////////////////////////////////////////////
// App Includes
#include "precomp.h"
#include "resource.h"
#include "main.h"
#include "SlideshowDevice.h"
#include "SlideshowDevice_i.c"
#include <commctrl.h>
#include <shlobj.h>
///////////////////////////////
// ErrorState_Enum
//
typedef enum { ErrorState_NONE = 0, ErrorState_IMAGE_DIR_DOESNT_EXIST = 1, ErrorState_DEVICE_DIR_DOESNT_EXIST = 2, ErrorState_SLIDESHOW_SERVER_NOT_FOUND = 3, ErrorState_FAILED_TO_START_SLIDESHOW = 4 } ErrorState_Enum;
///////////////////////////////
// GVAR_pSlideshowProjector
//
CComPtr<ISlideshowProjector> GVAR_pSlideshowProjector;
///////////////////////////
// GVAR_LOCAL
//
// Global Variable
//
static struct GVAR_LOCAL { HINSTANCE hInstance; HWND hwndMain; ErrorState_Enum ErrorState; } GVAR_LOCAL = { NULL, NULL, ErrorState_NONE };
// Custom user message
#define WM_USER_TASKBAR WM_USER + 100
////////////////////////// Function Prototypes ////////////////////////////////
INT_PTR CALLBACK DlgProc(HWND hwndDlg, UINT uiMsg, WPARAM wParam, LPARAM lParam);
static int InitDlg(HWND hwndDlg);
static int ProcessWMCommand(HWND hwndDlg, UINT uiMsg, WPARAM wParam, LPARAM lParam);
static int ProcessTaskbarMsg(HWND hwnd, UINT uiMessage, WPARAM wParam, LPARAM lParam);
static int ProcessScroll(HWND hwndDlg, HWND hwndScroll);
static HRESULT LoadCurrentSettings(); static HRESULT SaveCurrentSettings(); static HRESULT ShowConfigWindow(); static BOOL IsChecked(INT iResID);
static void ProcessError(ErrorState_Enum ErrorState); static HRESULT SetImageFreqTrackbar(DWORD dwImageFreq); static HRESULT SetImageScaleTrackbar(DWORD dwImageScaleFactor); static void EnableApplyButton(BOOL bEnable);
//////////////////////////////
// CfgDlg::Init
//
HRESULT CfgDlg::Init(HINSTANCE hInstance) { HRESULT hr = S_OK; TCHAR szImageDir[_MAX_PATH + 1] = {0}; TCHAR szDeviceDir[_MAX_PATH + 1] = {0};
GVAR_LOCAL.hInstance = hInstance;
if (SUCCEEDED(hr)) { hr = CoCreateInstance(CLSID_SlideshowProjector, NULL, CLSCTX_INPROC_SERVER, IID_ISlideshowProjector, (void**) &GVAR_pSlideshowProjector);
if (FAILED(hr)) { DBG_ERR(("Failed to CoCreate CLSID_SlideshowProjector. Is the " "server DLL registered?, hr = 0x%08lx", hr));
GVAR_LOCAL.ErrorState = ErrorState_SLIDESHOW_SERVER_NOT_FOUND; } }
ASSERT(GVAR_pSlideshowProjector != NULL);
if (SUCCEEDED(hr)) { hr = Util::GetAppDirs(szDeviceDir, sizeof(szDeviceDir) / sizeof(TCHAR), szImageDir, sizeof(szImageDir) / sizeof(TCHAR)); }
if (SUCCEEDED(hr)) { BOOL bDirExists = FALSE;
bDirExists = Util::DoesDirExist(szDeviceDir);
if (!bDirExists) { GVAR_LOCAL.ErrorState = ErrorState_DEVICE_DIR_DOESNT_EXIST; hr = E_FAIL; } else { bDirExists = Util::DoesDirExist(szImageDir); }
// couldn't find images directory, default to My Pictures directory
if (!bDirExists) { Util::GetMyPicturesFolder(szImageDir, sizeof(szImageDir) / sizeof(TCHAR)); } }
// start up the slideshow projector.
if (SUCCEEDED(hr)) { hr = GVAR_pSlideshowProjector->Init(szDeviceDir, szImageDir); }
return hr; }
//////////////////////////////
// CfgDlg::Term
//
HRESULT CfgDlg::Term() { HRESULT hr = S_OK;
GVAR_pSlideshowProjector->Term();
return hr; }
//////////////////////////////
// CfgDlg::Create
//
HWND CfgDlg::Create(int nCmdShow) { HWND hwnd = CreateDialog(GVAR_LOCAL.hInstance, MAKEINTRESOURCE(IDD_CONFIG_DIALOG), NULL, DlgProc);
// this is set in InitDlg
if (GVAR_LOCAL.hwndMain != NULL) { Tray::Init(GVAR_LOCAL.hInstance, GVAR_LOCAL.hwndMain, WM_USER_TASKBAR);
::ShowWindow(GVAR_LOCAL.hwndMain, nCmdShow); }
return GVAR_LOCAL.hwndMain; }
//////////////////////////////
// ProcessError
//
static void ProcessError(ErrorState_Enum ErrorState) { HRESULT hr = S_OK; TCHAR szErrMsg[255 + 1] = {0}; TCHAR szCaption[63 + 1] = {0}; TCHAR szDeviceDir[_MAX_PATH + 1] = {0}; TCHAR szImageDir[_MAX_PATH + 1] = {0};
if (ErrorState == ErrorState_NONE) { return; }
Util::GetString(GVAR_LOCAL.hInstance, IDS_ERR_CAPTION, szCaption, sizeof(szCaption) / sizeof(TCHAR));
hr = Util::GetAppDirs(szDeviceDir, sizeof(szDeviceDir) / sizeof(TCHAR), szImageDir, sizeof(szImageDir) / sizeof(TCHAR));
if (ErrorState == ErrorState_DEVICE_DIR_DOESNT_EXIST) { Util::GetString(GVAR_LOCAL.hInstance, IDS_ERR_INVALID_DEVICE_DIR, szErrMsg, sizeof(szErrMsg) / sizeof(TCHAR), szDeviceDir); } else if (ErrorState == ErrorState_IMAGE_DIR_DOESNT_EXIST) { Util::GetString(GVAR_LOCAL.hInstance, IDS_ERR_INVALID_IMAGE_DIR, szErrMsg, sizeof(szErrMsg) / sizeof(TCHAR), szImageDir); } else if (ErrorState == ErrorState_SLIDESHOW_SERVER_NOT_FOUND) { Util::GetString(GVAR_LOCAL.hInstance, IDS_ERR_SLIDESHOW_SERVER_NOT_FOUND, szErrMsg, sizeof(szErrMsg) / sizeof(TCHAR)); } else if (ErrorState == ErrorState_FAILED_TO_START_SLIDESHOW) { Util::GetString(GVAR_LOCAL.hInstance, IDS_ERR_FAILED_TO_START_SLIDESHOW, szErrMsg, sizeof(szErrMsg) / sizeof(TCHAR)); } else { Util::GetString(GVAR_LOCAL.hInstance, IDS_ERR_SERVER_ERROR, szErrMsg, sizeof(szErrMsg) / sizeof(TCHAR)); }
MessageBox(GVAR_LOCAL.hwndMain, szErrMsg, szCaption, MB_ICONERROR | MB_OK);
return; }
//////////////////////////////
// InitDlg
//
static int InitDlg(HWND hwndDlg) { HRESULT hr = S_OK;
GVAR_LOCAL.hwndMain = hwndDlg;
//
// set the image frequency trackbar range.
//
SendDlgItemMessage(hwndDlg, IDC_FREQUENCY, TBM_SETRANGE, (WPARAM) TRUE, (LPARAM) MAKELONG(MIN_IMAGE_FREQ_IN_SEC, MAX_IMAGE_FREQ_IN_SEC));
//
// set the image scale factor range.
//
SendDlgItemMessage(hwndDlg, IDC_MAX_SIZE, TBM_SETRANGE, (WPARAM) TRUE, (LPARAM) MAKELONG(MIN_IMAGE_SCALE_FACTOR, MAX_IMAGE_SCALE_FACTOR));
// these are just initial settings in case we fail to load the last
// saved settings.
//
SetImageFreqTrackbar(MIN_IMAGE_FREQ_IN_SEC); SetImageScaleTrackbar(MAX_IMAGE_SCALE_FACTOR);
if (GVAR_LOCAL.ErrorState == ErrorState_NONE) { if (GVAR_pSlideshowProjector) { hr = GVAR_pSlideshowProjector->StartProjector();
if (FAILED(hr)) { GVAR_LOCAL.ErrorState = ErrorState_FAILED_TO_START_SLIDESHOW; } } if (SUCCEEDED(hr)) { LoadCurrentSettings(); } } ProcessError(GVAR_LOCAL.ErrorState);
return 0; }
//////////////////////////////
// TermDlg
//
static bool TermDlg() { HRESULT hr = S_OK;
if (GVAR_pSlideshowProjector) { hr = GVAR_pSlideshowProjector->StopProjector(); }
Tray::Term(GVAR_LOCAL.hwndMain); DestroyWindow(GVAR_LOCAL.hwndMain);
return true; }
//////////////////////////////
// DlgProc
//
INT_PTR CALLBACK DlgProc(HWND hwndDlg, UINT uiMsg, WPARAM wParam, LPARAM lParam) { int iReturn = 0;
switch(uiMsg) { case WM_INITDIALOG:
// intialize the controls on the dialog.
InitDlg(hwndDlg);
iReturn = TRUE; break;
case WM_CLOSE:
// rather than closing the window when the user hits the
// X, we hide it, thereby keeping the taskbar icon.
ShowWindow(hwndDlg, SW_HIDE); break;
case WM_DESTROY:
// if we are destroying the window, then lets
// exit the app.
::PostQuitMessage(0); break;
case WM_COMMAND: iReturn = ProcessWMCommand(hwndDlg, uiMsg, wParam, lParam); break;
case WM_USER_TASKBAR: iReturn = ProcessTaskbarMsg(hwndDlg, uiMsg, wParam, lParam); break;
case WM_HSCROLL: ProcessScroll(hwndDlg, (HWND) lParam); break;
default: iReturn = 0; break; } return iReturn; }
///////////////////////////////
// ProcessWMCommand
//
static int ProcessWMCommand(HWND hwndDlg, UINT uiMsg, WPARAM wParam, LPARAM lParam) { int iReturn = 0; int iControlID = LOWORD(wParam); int iNotifyCode = HIWORD(wParam);
switch (iControlID) { case IDOK:
// the user hit the OK button, save the setting changes
// they made, and hide the window.
SaveCurrentSettings(); ShowWindow(hwndDlg, SW_HIDE); break;
case IDCANCEL:
// abandoning changes made by the user.
ShowWindow(hwndDlg, SW_HIDE); EnableApplyButton(FALSE); break;
case IDC_APPLY:
// the user hit the APPLY button, save the setting changes
// they made, but don't hide the window
SaveCurrentSettings(); break;
case IDC_ALLOWSTRETCHING: case IDC_DISPLAYFILENAME: case IDC_ALLOW_KEYBOARDCONTROL: EnableApplyButton(TRUE); break;
case IDM_POPUP_OPEN: ShowConfigWindow(); break;
case IDM_POPUP_EXIT: TermDlg(); break;
case IDC_BROWSE: { bool bNewDirSelected = false; TCHAR szDir[_MAX_PATH + 1] = {0};
// popup the browse for directories dialog.
// On return this dialog returns the directory selected
// by the user.
bNewDirSelected = Util::BrowseForDirectory(hwndDlg, NULL, szDir, sizeof(szDir) / sizeof(TCHAR));
if (bNewDirSelected) { // set the directory in the edit text control.
SetDlgItemText(hwndDlg, IDC_IMAGEDIR, szDir);
EnableApplyButton(TRUE); } } break;
default: break; }
return iReturn; }
//////////////////////////////////////////////////////////////////////
// ProcessTaskbarMsg
//
// Desc: Function is called when there is an event at the taskbar
//
//
// Params: - hwnd, handle of main window.
// - uiMessage, message sent.
static int ProcessTaskbarMsg(HWND hwnd, UINT uiMessage, WPARAM wParam, LPARAM lParam) { int iReturn = 0; UINT uID; UINT uMouseMsg; uID = (UINT) wParam; uMouseMsg = (UINT) lParam;
// remove unref param warning
uiMessage = uiMessage; switch (uMouseMsg) { case WM_LBUTTONDBLCLK:
ShowConfigWindow();
break;
case WM_LBUTTONDOWN:
break;
case WM_RBUTTONDOWN: Tray::PopupMenu(hwnd); break; }
return iReturn; }
///////////////////////////////
// ShowConfigWindow
//
static int ProcessScroll(HWND hwndDlg, HWND hwndScroll) { ASSERT(hwndScroll != NULL);
int iReturn = 0; HRESULT hr = S_OK; TCHAR szString[255 + 1] = {0};
if (hwndScroll == NULL) { return E_INVALIDARG; }
if (GetDlgItem(hwndDlg, IDC_FREQUENCY) == hwndScroll) { UINT nFrequency = (UINT)SendDlgItemMessage(hwndDlg, IDC_FREQUENCY, TBM_GETPOS, 0, 0 );
SetImageFreqTrackbar(nFrequency);
hr = Util::FormatTime(GVAR_LOCAL.hInstance, nFrequency, szString, sizeof(szString) / sizeof(TCHAR));
SendDlgItemMessage(hwndDlg, IDC_MINUTES_AND_SECONDS, WM_SETTEXT, 0, (LPARAM) szString); } else if (GetDlgItem(hwndDlg, IDC_MAX_SIZE) == hwndScroll) { UINT nScaleFactor = (UINT)SendDlgItemMessage(hwndDlg, IDC_MAX_SIZE, TBM_GETPOS, 0, 0 );
SetImageScaleTrackbar(nScaleFactor); }
EnableApplyButton(TRUE);
return iReturn; }
///////////////////////////////
// ShowConfigWindow
//
static HRESULT ShowConfigWindow() { HRESULT hr = S_OK;
// reload our settings from the DLL to ensure that
// we are reflecting the real state of the settings.
LoadCurrentSettings();
// popup the window on double click.
ShowWindow(GVAR_LOCAL.hwndMain, SW_SHOW);
// make sure we are the foreground window.
SetForegroundWindow(GVAR_LOCAL.hwndMain);
return hr; }
///////////////////////////////
// IsChecked
//
static BOOL IsChecked(INT iResID) { LRESULT lState = 0; BOOL bChecked = TRUE;
// Get the Display File Name
lState = SendDlgItemMessage(GVAR_LOCAL.hwndMain, iResID, BM_GETCHECK, 0, 0); if (lState == BST_CHECKED) { bChecked = TRUE; } else { bChecked = FALSE; }
return bChecked; }
///////////////////////////////
// SetImageFreqTrackbar
//
static HRESULT SetImageFreqTrackbar(DWORD dwImageFreq) { HRESULT hr = S_OK;
if (SUCCEEDED(hr)) { TCHAR szTime[255 + 1] = {0};
// set the trackbar's current position.
SendDlgItemMessage(GVAR_LOCAL.hwndMain, IDC_FREQUENCY, TBM_SETPOS, (WPARAM) TRUE, (LPARAM) dwImageFreq);
hr = Util::FormatTime(GVAR_LOCAL.hInstance, dwImageFreq, szTime, sizeof(szTime) / sizeof(TCHAR));
SendDlgItemMessage(GVAR_LOCAL.hwndMain, IDC_MINUTES_AND_SECONDS, WM_SETTEXT, 0, (LPARAM) szTime); }
return hr; }
///////////////////////////////
// SetImageScaleTrackbar
//
static HRESULT SetImageScaleTrackbar(DWORD dwImageScaleFactor) { HRESULT hr = S_OK;
//
// Set Image Scale Factor Trackbar
//
if (SUCCEEDED(hr)) { TCHAR szScale[255 + 1] = {0};
// set the trackbar's current position.
SendDlgItemMessage(GVAR_LOCAL.hwndMain, IDC_MAX_SIZE, TBM_SETPOS, (WPARAM) TRUE, (LPARAM) dwImageScaleFactor);
hr = Util::FormatScale(GVAR_LOCAL.hInstance, dwImageScaleFactor, szScale, sizeof(szScale) / sizeof(TCHAR));
SendDlgItemMessage(GVAR_LOCAL.hwndMain, IDC_IMAGE_SIZE_DESC, WM_SETTEXT, 0, (LPARAM) szScale); }
return hr; }
///////////////////////////////
// EnableApplyButton
//
static void EnableApplyButton(BOOL bEnable) { EnableWindow(GetDlgItem(GVAR_LOCAL.hwndMain, IDC_APPLY), bEnable); }
///////////////////////////////
// LoadCurrentSettings
//
static HRESULT LoadCurrentSettings() { HRESULT hr = S_OK; DWORD dwImageFreq = 0; DWORD dwImageScaleFactor = 0; TCHAR szImageDir[_MAX_PATH + 1] = {0}; BOOL bShowFileName = FALSE; BOOL bAllowKeyControl = FALSE; BOOL bStretchSmallImages = FALSE;
ASSERT(GVAR_pSlideshowProjector != NULL);
if (GVAR_pSlideshowProjector == NULL) { DBG_ERR(("InitDlg, failed to get Image Frequency, slide show " "projector object doesn't exist"));
return 0; } //
// Get the Image Frequency
//
hr = GVAR_pSlideshowProjector->get_ImageFrequency(&dwImageFreq);
if (SUCCEEDED(hr)) { if (dwImageFreq < MIN_IMAGE_FREQ_IN_SEC) { dwImageFreq = MIN_IMAGE_FREQ_IN_SEC; hr = GVAR_pSlideshowProjector->put_ImageFrequency(dwImageFreq); } else if (dwImageFreq > MAX_IMAGE_FREQ_IN_SEC) { dwImageFreq = MAX_IMAGE_FREQ_IN_SEC; hr = GVAR_pSlideshowProjector->put_ImageFrequency(dwImageFreq); } }
//
// Set Image Frequency Trackbar
//
if (SUCCEEDED(hr)) { SetImageFreqTrackbar(dwImageFreq); }
//
// Get the Image Scale Factor
//
hr = GVAR_pSlideshowProjector->get_ImageScaleFactor(&dwImageScaleFactor);
if (SUCCEEDED(hr)) { if (dwImageScaleFactor < MIN_IMAGE_SCALE_FACTOR) { dwImageScaleFactor = MIN_IMAGE_SCALE_FACTOR; hr = GVAR_pSlideshowProjector->put_ImageScaleFactor(dwImageScaleFactor); } else if (dwImageScaleFactor > MAX_IMAGE_SCALE_FACTOR) { dwImageScaleFactor = MAX_IMAGE_SCALE_FACTOR; hr = GVAR_pSlideshowProjector->put_ImageScaleFactor(dwImageScaleFactor); } }
//
// Set Image Scale Factor Trackbar
//
if (SUCCEEDED(hr)) { SetImageScaleTrackbar(dwImageScaleFactor); }
//
// Get the current Image Directory
//
hr = GVAR_pSlideshowProjector->get_ImageDirectory(szImageDir, sizeof(szImageDir) / sizeof(TCHAR));
// set the edit control's image directory to reflect the current
// image directory.
if (SUCCEEDED(hr)) { SetDlgItemText(GVAR_LOCAL.hwndMain, IDC_IMAGEDIR, szImageDir); }
//
// get the "ShowFilename" attribute
//
hr = GVAR_pSlideshowProjector->get_ShowFilename(&bShowFileName);
// set the ShowFileName checkbox
if (SUCCEEDED(hr)) { if (bShowFileName) { SendDlgItemMessage(GVAR_LOCAL.hwndMain, IDC_DISPLAYFILENAME, BM_SETCHECK, BST_CHECKED, 0); } else { SendDlgItemMessage(GVAR_LOCAL.hwndMain, IDC_DISPLAYFILENAME, BM_SETCHECK, BST_UNCHECKED, 0); } }
//
// get the "AllowKeyControl" attribute
//
hr = GVAR_pSlideshowProjector->get_AllowKeyControl(&bAllowKeyControl);
// set the Allow Keyboard Control checkbox
if (SUCCEEDED(hr)) { if (bAllowKeyControl) { SendDlgItemMessage(GVAR_LOCAL.hwndMain, IDC_ALLOW_KEYBOARDCONTROL, BM_SETCHECK, BST_CHECKED, 0); } else { SendDlgItemMessage(GVAR_LOCAL.hwndMain, IDC_ALLOW_KEYBOARDCONTROL, BM_SETCHECK, BST_UNCHECKED, 0); } }
//
// get the "StretchSmallImages" attribute
//
hr = GVAR_pSlideshowProjector->get_StretchSmallImages(&bStretchSmallImages);
// set the Stretch Small Images Control checkbox
if (SUCCEEDED(hr)) { if (bStretchSmallImages) { SendDlgItemMessage(GVAR_LOCAL.hwndMain, IDC_ALLOWSTRETCHING, BM_SETCHECK, BST_CHECKED, 0); } else { SendDlgItemMessage(GVAR_LOCAL.hwndMain, IDC_ALLOWSTRETCHING, BM_SETCHECK, BST_UNCHECKED, 0); } }
return hr; }
///////////////////////////////
// SaveCurrentSettings
//
static HRESULT SaveCurrentSettings() { HRESULT hr = S_OK; DWORD_PTR dwImageFreq = 0; DWORD_PTR dwImageScaleFactor = 0; TCHAR szImageDir[_MAX_PATH + 1] = {0}; BOOL bShowFileName = FALSE; BOOL bAllowKeyControl = FALSE; BOOL bStretchSmallImages = FALSE; LONG lState = 0;
ASSERT(GVAR_pSlideshowProjector != NULL);
//
// get the image frequency trackbar value
//
dwImageFreq = (DWORD_PTR) SendDlgItemMessage(GVAR_LOCAL.hwndMain, IDC_FREQUENCY, TBM_GETPOS, 0, 0);
//
// get the image scale factor trackbar value
//
dwImageScaleFactor = (DWORD_PTR) SendDlgItemMessage(GVAR_LOCAL.hwndMain, IDC_MAX_SIZE, TBM_GETPOS, 0, 0);
//
// get the image directory
//
GetDlgItemText(GVAR_LOCAL.hwndMain, IDC_IMAGEDIR, szImageDir, sizeof(szImageDir) / sizeof(TCHAR));
// Get the Display File Name
bShowFileName = IsChecked(IDC_DISPLAYFILENAME);
// Get the Allow Key Control
bAllowKeyControl = IsChecked(IDC_ALLOW_KEYBOARDCONTROL);
// Get the Stretch Small Images
bStretchSmallImages = IsChecked(IDC_ALLOWSTRETCHING);
//
// set the image frequency
//
hr = GVAR_pSlideshowProjector->put_ImageFrequency((DWORD) dwImageFreq);
if (FAILED(hr)) { DBG_ERR(("SaveCurrentSettings, failed to set image frequency")); }
//
// set the image scale factor
//
hr = GVAR_pSlideshowProjector->put_ImageScaleFactor((DWORD) dwImageScaleFactor);
if (FAILED(hr)) { DBG_ERR(("SaveCurrentSettings, failed to set image scale factor")); }
//
// put the show file name attribute
//
hr = GVAR_pSlideshowProjector->put_ShowFilename(bShowFileName);
if (FAILED(hr)) { DBG_ERR(("SaveCurrentSettings, failed to set show filename property")); }
//
// put the allow key control attribute
//
hr = GVAR_pSlideshowProjector->put_AllowKeyControl(bAllowKeyControl);
if (FAILED(hr)) { DBG_ERR(("SaveCurrentSettings, failed to set Allow Key Control property")); }
//
// put the Stretch Small Images control attribute
//
hr = GVAR_pSlideshowProjector->put_StretchSmallImages(bStretchSmallImages);
if (FAILED(hr)) { DBG_ERR(("SaveCurrentSettings, failed to set StretchSmallImages property")); }
//
// set the control's image directory
// Notice we store the image directory rather than the Projector
// server control because it is not something that can be
// set remotely. Only items that can be configured by the client
// are stored by the COM Projector Server
//
hr = GVAR_pSlideshowProjector->put_ImageDirectory(szImageDir);
if (SUCCEEDED(hr)) { // save to the registry
Util::SetRegString(REG_VAL_IMAGE_DIR, szImageDir, sizeof(szImageDir) / sizeof(TCHAR)); } else { DBG_ERR(("SaveCurrentSettings, failed to set image directory")); }
EnableApplyButton(FALSE);
return hr; }
|