windows-nt/Source/XPSP1/NT/printscan/ui/photowiz/printwiz.cpp
2020-09-26 16:20:57 +08:00

506 lines
15 KiB
C++

/*****************************************************************************
*
* (C) COPYRIGHT MICROSOFT CORPORATION, 2000
*
* TITLE: printwiz.cpp
*
* VERSION: 1.0, stolen from netplwiz (pubwiz.cpp)
*
* AUTHOR: RickTu
*
* DATE: 10/12/00
*
* DESCRIPTION: Implements IWizardExtension for printing wizard
*
*****************************************************************************/
#include "precomp.h"
#pragma hdrstop
class CPrintPhotosWizard : public IPrintPhotosWizardSetInfo
{
public:
CPrintPhotosWizard();
~CPrintPhotosWizard();
// IUnknown
STDMETHOD(QueryInterface)(REFIID riid, void **ppvObj);
STDMETHOD_(ULONG,AddRef)(void);
STDMETHOD_(ULONG,Release)(void);
// IPrintPhotosWizardSetInfo
STDMETHODIMP SetFileListDataObject( IDataObject * pdo );
STDMETHODIMP SetFileListArray( LPITEMIDLIST *aidl, int cidl, int iSelectedItem);
STDMETHODIMP RunWizard( VOID );
private:
LONG _cRef; // object lifetime count
HPROPSHEETPAGE _aWizPages[MAX_WIZPAGES]; // page handles for this wizard (so we can navigate)
CComPtr<IDataObject> _pdo; // dataobject which contains files to print
LPITEMIDLIST* _aidl;
int _cidl;
int _iSelection;
HRESULT _CreateWizardPages(void); // construct and load our wizard pages
// Get a pointer to our wizard class from static members
static CPrintPhotosWizard* s_GetPPW(HWND hwnd, UINT uMsg, LPARAM lParam);
// DlgProc's for our wizard pages -- we forward through s_GetPPW
CStartPage * _pStartPage;
CPhotoSelectionPage * _pPhotoSelectionPage;
CPrintOptionsPage * _pPrintOptionsPage;
CSelectTemplatePage * _pSelectTemplatePage;
CStatusPage * _pStatusPage;
CEndPage * _pEndPage;
static INT_PTR s_StartPageDlgProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) \
{ \
CPrintPhotosWizard *ppw = s_GetPPW(hwnd, uMsg, lParam); \
if (ppw && ppw->_pStartPage) \
{ \
return ppw->_pStartPage->DoHandleMessage(hwnd, uMsg, wParam, lParam); \
} \
return FALSE; \
}
static INT_PTR s_PictureSelectionDlgProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) \
{ \
CPrintPhotosWizard *ppw = s_GetPPW(hwnd, uMsg, lParam); \
if (ppw && ppw->_pPhotoSelectionPage) \
{ \
return ppw->_pPhotoSelectionPage->DoHandleMessage(hwnd, uMsg, wParam, lParam); \
} \
return FALSE; \
}
static INT_PTR s_PrintOptionsDlgProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) \
{ \
CPrintPhotosWizard *ppw = s_GetPPW(hwnd, uMsg, lParam); \
if (ppw && ppw->_pPrintOptionsPage) \
{ \
return ppw->_pPrintOptionsPage->DoHandleMessage(hwnd, uMsg, wParam, lParam); \
} \
return FALSE; \
}
static INT_PTR s_SelectTemplateDlgProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{ \
CPrintPhotosWizard *ppw = s_GetPPW(hwnd, uMsg, lParam); \
if (ppw && ppw->_pSelectTemplatePage) \
{ \
return ppw->_pSelectTemplatePage->DoHandleMessage(hwnd, uMsg, wParam, lParam); \
} \
return FALSE; \
}
static INT_PTR s_StatusPageDlgProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) \
{ \
CPrintPhotosWizard *ppw = s_GetPPW(hwnd, uMsg, lParam); \
if (ppw && ppw->_pStatusPage) \
{ \
return ppw->_pStatusPage->DoHandleMessage(hwnd, uMsg, wParam, lParam); \
} \
return FALSE; \
}
static INT_PTR s_EndPageDlgProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) \
{ \
CPrintPhotosWizard *ppw = s_GetPPW(hwnd, uMsg, lParam); \
if (ppw && ppw->_pEndPage) \
{ \
return ppw->_pEndPage->DoHandleMessage(hwnd, uMsg, wParam, lParam); \
} \
return FALSE; \
}
};
/*****************************************************************************
CPrintPhotosWizard constructor/destructor
<Notes>
*****************************************************************************/
CPrintPhotosWizard::CPrintPhotosWizard() :
_cRef(1),
_pStartPage(NULL),
_pPhotoSelectionPage(NULL),
_pPrintOptionsPage(NULL),
_pSelectTemplatePage(NULL),
_pStatusPage(NULL),
_pEndPage(NULL),
_cidl(0),
_aidl(NULL),
_iSelection(0)
{
WIA_PUSH_FUNCTION_MASK((TRACE_WIZ,TEXT("CPrintPhotosWizard::CPrintPhotosWizard( this == 0x%x )"), this));
DllAddRef();
}
CPrintPhotosWizard::~CPrintPhotosWizard()
{
WIA_PUSH_FUNCTION_MASK((TRACE_WIZ,TEXT("CPrintPhotosWizard::~CPrintPhotosWizard( this == 0x%x )"), this));
if (_aidl)
{
for (int i=0;i<_cidl;i++)
{
ILFree(_aidl[i]);
}
delete[] _aidl;
}
DllRelease();
}
/*****************************************************************************
CPrintPhotosWizard IUnknown methods
<Notes>
*****************************************************************************/
ULONG CPrintPhotosWizard::AddRef()
{
ULONG ul = InterlockedIncrement(&_cRef);
WIA_PUSH_FUNCTION_MASK((TRACE_REF_COUNTS,TEXT("CPrintPhotosWizard::AddRef( new count is %d )"),ul));
return ul;
}
ULONG CPrintPhotosWizard::Release()
{
ULONG ul = InterlockedDecrement(&_cRef);
WIA_PUSH_FUNCTION_MASK((TRACE_REF_COUNTS,TEXT("CPrintPhotosWizard::Release( new count is %d )"),ul));
if (ul)
return ul;
WIA_TRACE((TEXT("deleting object ( this == 0x%x ) because ref count is zero."),this));
delete this;
return 0;
}
HRESULT CPrintPhotosWizard::QueryInterface(REFIID riid, void **ppv)
{
WIA_PUSH_FUNCTION_MASK((TRACE_REF_COUNTS,TEXT("CPrintPhotosWizard::QueryInterface()")));
static const QITAB qit[] =
{
QITABENT(CPrintPhotosWizard, IPrintPhotosWizardSetInfo), // IID_IPrintPhotosWizardSetInfo
{0, 0 },
};
HRESULT hr = QISearch(this, qit, riid, ppv);
WIA_RETURN_HR(hr);
}
/*****************************************************************************
CPrintPhotosWizard_CreateInstance
Creates an instance of our wizard
*****************************************************************************/
STDAPI CPrintPhotosWizard_CreateInstance(IUnknown* pUnkOuter, IUnknown** ppunk, LPCOBJECTINFO poi)
{
WIA_PUSH_FUNCTION_MASK((TRACE_WIZ,TEXT("CPrintPhotosWizard_CreateInstance()")));
CPrintPhotosWizard *pwiz = new CPrintPhotosWizard();
if (!pwiz)
{
*ppunk = NULL; // incase of failure
WIA_ERROR((TEXT("returning E_OUTOFMEMORY")));
return E_OUTOFMEMORY;
}
HRESULT hr = pwiz->QueryInterface(IID_PPV_ARG(IUnknown, ppunk));
pwiz->Release(); // we do this release because the new of CPrintPhotosWizard
// set the ref count to 1, doing the QI bumps it up to 2,
// and we want to leave this function with the ref count
// at zero...
WIA_RETURN_HR(hr);
}
/*****************************************************************************
CPrintPhotosWizard::s_GetPPW
static function that stores the "this" pointer for the class in
user data slot of dlg, so that we can have our wndproc's as methods
of this class.
*****************************************************************************/
CPrintPhotosWizard* CPrintPhotosWizard::s_GetPPW(HWND hwnd, UINT uMsg, LPARAM lParam)
{
WIA_PUSH_FUNCTION_MASK((TRACE_DLGPROC,TEXT("CPrintPhotosWizard::s_GetPPW()")));
if (uMsg == WM_INITDIALOG)
{
PROPSHEETPAGE *ppsp = (PROPSHEETPAGE*)lParam;
SetWindowLongPtr(hwnd, GWLP_USERDATA, ppsp->lParam);
return (CPrintPhotosWizard*)ppsp->lParam;
}
return (CPrintPhotosWizard*)GetWindowLongPtr(hwnd, GWLP_USERDATA);
}
/*****************************************************************************
CPrintPhotosWizard::_CreateWizardPages
utility function to contruct and then create our wizard pages (property
sheets).
*****************************************************************************/
HRESULT CPrintPhotosWizard::_CreateWizardPages( VOID )
{
WIA_PUSH_FUNCTION_MASK((TRACE_WIZ,TEXT("CPrintPhotosWizard::_CreateWizardPages()")));
#define WIZDLG(name, dlgproc, title, sub, dwFlags) \
{ MAKEINTRESOURCE(##name##), dlgproc, MAKEINTRESOURCE(##title##), MAKEINTRESOURCE(##sub##), dwFlags }
static const WIZPAGE c_wpPages[] =
{
WIZDLG(IDD_START_PAGE, CPrintPhotosWizard::s_StartPageDlgProc, 0, 0, PSP_HIDEHEADER),
WIZDLG(IDD_PICTURE_SELECTION, CPrintPhotosWizard::s_PictureSelectionDlgProc, IDS_WIZ_SEL_PICTURE_TITLE, IDS_WIZ_SEL_PICTURE_SUBTITLE, PSP_PREMATURE),
WIZDLG(IDD_PRINTING_OPTIONS, CPrintPhotosWizard::s_PrintOptionsDlgProc, IDS_WIZ_PRINTER_OPT_TITLE, IDS_WIZ_PRINTER_OPT_SUBTITLE, 0),
WIZDLG(IDD_SELECT_TEMPLATE, CPrintPhotosWizard::s_SelectTemplateDlgProc, IDS_WIZ_SEL_TEMPLATE_TITLE, IDS_WIZ_SEL_TEMPLATE_SUBTITLE, PSP_PREMATURE),
WIZDLG(IDD_PRINT_PROGRESS, CPrintPhotosWizard::s_StatusPageDlgProc, IDS_WIZ_PRINT_PROGRESS_TITLE, IDS_WIZ_PRINT_PROGRESS_SUBTITLE, PSP_PREMATURE),
WIZDLG(IDD_END_PAGE, CPrintPhotosWizard::s_EndPageDlgProc, 0, 0, PSP_HIDEHEADER),
};
// if we haven't created the pages yet, then lets initialize our array of handlers.
if (!_aWizPages[0])
{
WIA_TRACE((TEXT("Pages have not been created yet, creating them now...")));
INITCOMMONCONTROLSEX iccex = { 0 };
iccex.dwSize = sizeof (iccex);
iccex.dwICC = ICC_LISTVIEW_CLASSES | ICC_USEREX_CLASSES | ICC_PROGRESS_CLASS;
WIA_TRACE((TEXT("Initializing common controls...")));
InitCommonControlsEx(&iccex);
for (int i = 0; i < ARRAYSIZE(c_wpPages) ; i++ )
{
PROPSHEETPAGE psp = { 0 };
psp.dwSize = SIZEOF(PROPSHEETPAGE);
psp.hInstance = g_hInst;
psp.lParam = (LPARAM)this;
psp.dwFlags = PSP_USETITLE | PSP_DEFAULT |
PSP_USEHEADERTITLE | PSP_USEHEADERSUBTITLE |
c_wpPages[i].dwFlags;
psp.pszTemplate = c_wpPages[i].idPage;
psp.pfnDlgProc = c_wpPages[i].pDlgProc;
psp.pszTitle = MAKEINTRESOURCE(IDS_WIZ_TITLE);
psp.pszHeaderTitle = c_wpPages[i].pHeading;
psp.pszHeaderSubTitle = c_wpPages[i].pSubHeading;
WIA_TRACE((TEXT("attempting to create page %d"),i));
_aWizPages[i] = CreatePropertySheetPage(&psp);
if (!_aWizPages[i])
{
WIA_ERROR((TEXT("returning E_FAIL because wizard page %d didn't create."),i));
return E_FAIL;
}
}
}
else
{
WIA_TRACE((TEXT("Wizard pages already created.")));
}
return S_OK;
}
/*****************************************************************************
CPrintPhotosWizard [IPrintPhotosWizardSetInfo methods]
<Notes>
*****************************************************************************/
STDMETHODIMP CPrintPhotosWizard::SetFileListDataObject( IDataObject * pdo )
{
WIA_PUSH_FUNCTION_MASK((TRACE_WIZ,TEXT("CPrintPhotosWizard::SetFileListDataObject()")));
HRESULT hr = E_INVALIDARG;
if (pdo)
{
_pdo = pdo;
hr = S_OK;
}
WIA_RETURN_HR(hr);
}
STDMETHODIMP CPrintPhotosWizard::SetFileListArray( LPITEMIDLIST *aidl, int cidl, int iSelection )
{
WIA_PUSH_FUNCTION_MASK((TRACE_WIZ,TEXT("CPrintPhotosWizard::SetFileListArray()")));
HRESULT hr = E_INVALIDARG;
if (aidl && cidl)
{
_aidl = new LPITEMIDLIST[cidl];
if (_aidl)
{
for (int i=0;i<cidl;i++)
{
_aidl[i] = ILClone(aidl[i]);
}
if (iSelection > 0)
{
LPITEMIDLIST pTemp = _aidl[0];
_aidl[0] = _aidl[iSelection];
_aidl[iSelection] = pTemp;
}
_cidl = cidl;
_iSelection = iSelection;
hr = S_OK;
}
else
{
hr = E_OUTOFMEMORY;
}
}
WIA_RETURN_HR(hr);
}
STDMETHODIMP CPrintPhotosWizard::RunWizard( VOID )
{
HRESULT hr = E_FAIL;
WIA_PUSH_FUNCTION_MASK((TRACE_WIZ,TEXT("CPrintPhotosWizard::RunWizard()")));
//
// Create wizard blob
//
CWizardInfoBlob * pBlob = new CWizardInfoBlob( _aidl?NULL:_pdo, TRUE, FALSE );
if (pBlob && _aidl)
{
pBlob->AddPhotosFromList(_aidl, _cidl, _iSelection >= 0? FALSE:TRUE);
}
//
// Create each page handling class
//
_pStartPage = new CStartPage( pBlob );
_pPhotoSelectionPage = new CPhotoSelectionPage( pBlob );
_pPrintOptionsPage = new CPrintOptionsPage( pBlob );
_pSelectTemplatePage = new CSelectTemplatePage( pBlob );
_pStatusPage = new CStatusPage( pBlob );
_pEndPage = new CEndPage( pBlob );
//
// Create the wizard pages...
//
hr = _CreateWizardPages();
WIA_CHECK_HR(hr,"_CreateWizardPages()");
if (SUCCEEDED(hr))
{
PROPSHEETHEADER psh = {0};
psh.dwSize = sizeof(PROPSHEETHEADER);
psh.dwFlags = PSH_WIZARD | PSH_WIZARD97 | PSH_WATERMARK | PSH_HEADER;
psh.hwndParent = NULL;
psh.hInstance = g_hInst;
psh.nPages = MAX_WIZPAGES;
psh.nStartPage = 0;
psh.phpage = (HPROPSHEETPAGE *)_aWizPages;
psh.pszbmHeader = MAKEINTRESOURCE(IDB_BANNER);
psh.pszbmWatermark = MAKEINTRESOURCE(IDB_WATERMARK);
WIA_TRACE((TEXT("Wizard pages created, trying to start wizard via PropertySheet()...")));
if (PropertySheet( &psh ))
{
hr = S_OK;
}
else
{
WIA_ERROR((TEXT("PropertySheet() failed")));
}
}
//
// Give wizard a chance to shut down in an orderly fashion...
//
pBlob->ShutDownWizard();
//
// clean up page handling classes...
//
if (_pStartPage)
{
delete _pStartPage;
_pStartPage = NULL;
}
if (_pPhotoSelectionPage)
{
delete _pPhotoSelectionPage;
_pPhotoSelectionPage = NULL;
}
if (_pPrintOptionsPage)
{
delete _pPrintOptionsPage;
_pPrintOptionsPage = NULL;
}
if (_pSelectTemplatePage)
{
delete _pSelectTemplatePage;
_pSelectTemplatePage = NULL;
}
if (_pStatusPage)
{
delete _pStatusPage;
_pStatusPage = NULL;
}
if (_pEndPage)
{
delete _pEndPage;
_pEndPage = NULL;
}
WIA_RETURN_HR(hr);
}