WindowsXP/Source/XPSP1/NT/shell/comdlg32/printnew.h
2024-08-03 16:30:48 +02:00

457 lines
14 KiB
C++

/*++
Copyright (c) 1990-1998, Microsoft Corporation All rights reserved.
Module Name:
printnew.h
Abstract:
This module contains the header information for the Win32
property sheet print common dialogs.
Revision History:
11-04-97 JulieB Created.
Feb-2000 LazarI major redesign (not to use printui anymore)
--*/
#ifdef __cplusplus
extern "C" {
#endif
#ifdef WINNT
//
// Include Files.
//
#include <dlgs.h>
#include <initguid.h>
#include <winprtp.h>
//
// Constant Declarations.
//
//
// Dialog Constants.
//
#define IDD_PRINT_GENERAL 100
#define IDD_PRINT_GENERAL_LARGE 101
#define IDI_COLLATE ico1
#define IDC_PRINTER_LIST 1000
#define IDC_PRINTER_LISTVIEW 1001
#define IDC_PRINT_TO_FILE 1002
#define IDC_FIND_PRINTER 1003
#define IDC_STATUS_TEXT 1004
#define IDC_STATUS 1005
#define IDC_LOCATION_TEXT 1006
#define IDC_LOCATION 1007
#define IDC_COMMENT_TEXT 1008
#define IDC_COMMENT 1009
#define IDC_DRIVER 1010
#define IDC_HIDDEN_TEXT 1011
#define IDC_RANGE_ALL rad1
#define IDC_RANGE_SELECTION rad2
#define IDC_RANGE_CURRENT rad3
#define IDC_RANGE_PAGES rad4
#define IDC_RANGE_EDIT edt1
#define IDC_RANGE_TEXT1 stc1
#define IDC_RANGE_TEXT2 stc2
#define IDC_COPIES edt2
#define IDC_COPIES_TEXT stc3
#define IDC_COLLATE chx1
#define IDC_STATIC -1
//
// Typedef Declarations.
//
typedef struct
{
UINT ApiType;
LPPRINTDLGEX pPD;
DWORD ProcessVersion;
DWORD dwFlags;
UINT FinalResult;
HRESULT hResult;
BOOL fApply;
BOOL fOld;
DWORD dwExtendedError;
HRESULT hrOleInit;
#ifdef UNICODE
LPPRINTDLGEXA pPDA;
BOOL fPrintTemplateAlloc;
#endif
} PRINTINFOEX, *PPRINTINFOEX;
//
// Registry keys.
//
static const TCHAR c_szSettings[] = TEXT("Printers\\Settings");
static const TCHAR c_szViewMode[] = TEXT("ViewMode");
//
// CPrintBrowser Class.
//
class CPrintBrowser : public IShellBrowser,
public ICommDlgBrowser2,
public IPrintDialogCallback,
public IPrintDialogServices
{
public:
// *** IUnknown methods ***
STDMETHOD(QueryInterface) (THIS_ REFIID riid, LPVOID *ppvObj);
STDMETHOD_(ULONG, AddRef) (THIS);
STDMETHOD_(ULONG, Release) (THIS);
// *** IOleWindow methods ***
STDMETHOD(GetWindow) (THIS_ HWND *lphwnd);
STDMETHOD(ContextSensitiveHelp) (THIS_ BOOL fEnterMode);
// *** IShellBrowser methods *** (same as IOleInPlaceFrame)
STDMETHOD(InsertMenusSB) (THIS_ HMENU hmenuShared, LPOLEMENUGROUPWIDTHS lpMenuWidths);
STDMETHOD(SetMenuSB) (THIS_ HMENU hmenuShared, HOLEMENU holemenu, HWND hwndActiveObject);
STDMETHOD(RemoveMenusSB) (THIS_ HMENU hmenuShared);
STDMETHOD(SetStatusTextSB) (THIS_ LPCOLESTR lpszStatusText);
STDMETHOD(EnableModelessSB) (THIS_ BOOL fEnable);
STDMETHOD(TranslateAcceleratorSB) (THIS_ LPMSG lpmsg, WORD wID);
// *** IShellBrowser methods ***
STDMETHOD(BrowseObject) (THIS_ LPCITEMIDLIST pidl, UINT wFlags);
STDMETHOD(GetViewStateStream) (THIS_ DWORD grfMode, LPSTREAM *pStrm);
STDMETHOD(GetControlWindow) (THIS_ UINT id, HWND *lphwnd);
STDMETHOD(SendControlMsg) (THIS_ UINT id, UINT uMsg, WPARAM wParam, LPARAM lParam, LRESULT *pret);
STDMETHOD(QueryActiveShellView) (THIS_ struct IShellView **ppshv);
STDMETHOD(OnViewWindowActive) (THIS_ struct IShellView *pshv);
STDMETHOD(SetToolbarItems) (THIS_ LPTBBUTTON lpButtons, UINT nButtons, UINT uFlags);
// *** ICommDlgBrowser2 methods ***
STDMETHOD(OnDefaultCommand) (THIS_ struct IShellView *ppshv);
STDMETHOD(OnStateChange) (THIS_ struct IShellView *ppshv, ULONG uChange);
STDMETHOD(IncludeObject) (THIS_ struct IShellView *ppshv, LPCITEMIDLIST lpItem);
STDMETHOD(Notify) (THIS_ struct IShellView *ppshv, DWORD dwNotifyType);
STDMETHOD(GetDefaultMenuText) (THIS_ struct IShellView *ppshv, WCHAR *pszText, INT cchMax);
STDMETHOD(GetViewFlags)(THIS_ DWORD *pdwFlags);
// *** IPrintDialogCallback methods ***
STDMETHOD(InitDone) (THIS);
STDMETHOD(SelectionChange) (THIS);
STDMETHOD(HandleMessage) (THIS_ HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam, LRESULT *pResult);
// *** IPrintDialogServices methods ***
STDMETHOD(GetCurrentDevMode) (THIS_ LPDEVMODE pDevMode, UINT *pcbSize);
STDMETHOD(GetCurrentPrinterName) (THIS_ LPTSTR pPrinterName, UINT *pcchSize);
STDMETHOD(GetCurrentPortName) (THIS_ LPTSTR pPortName, UINT *pcchSize);
// *** Our own methods ***
CPrintBrowser(HWND hDlg);
~CPrintBrowser();
BOOL OnInitDialog(WPARAM wParam, LPARAM lParam);
BOOL OnChildInitDialog(HWND hDlg, WPARAM wParam, LPARAM lParam);
VOID OnDestroyMessage();
BOOL OnCommandMessage(WPARAM wParam, LPARAM lParam);
BOOL OnChildCommandMessage(WPARAM wParam, LPARAM lParam);
BOOL OnNotifyMessage(WPARAM wParam, LPNMHDR lpnmhdr);
BOOL OnSelChange();
BOOL OnChangeNotify(LONG lNotification, LPCITEMIDLIST *ppidl);
BOOL OnAccelerator(HWND hwndActivePrint, HWND hwndFocus, HACCEL haccPrint, PMSG pMsg);
VOID OnNoPrinters(HWND hDlg, UINT uID);
VOID OnInitDone();
private:
HRESULT CreatePrintShellView();
UINT GetViewMode();
VOID SetViewMode();
HRESULT CreateHookDialog();
BOOL UpdateStatus(LPCITEMIDLIST pidl);
BOOL SelectSVItem();
BOOL GetCurrentPrinter();
VOID InitPrintToFile();
VOID InitPageRangeGroup();
VOID InitCopiesAndCollate();
BOOL SaveCopiesAndCollateInDevMode(LPDEVMODE pDM, LPTSTR pszPrinter);
BOOL SetCopiesOnApply();
VOID SaveDevMode();
BOOL MergeDevMode(LPTSTR pszPrinterName);
BOOL IsValidPageRange(LPTSTR pszString, UINT *pErrorId);
BOOL ConvertPageRangesToString(LPTSTR pszString, UINT cchLen);
UINT IntegerToString(DWORD Value, LPTSTR pszString, UINT cchLen);
VOID ShowError(HWND hDlg, UINT uCtrlID, UINT uMsgID, ...);
int ShowMessage(HWND hDlg, UINT uCtrlID, UINT uMsgID, UINT uType, BOOL bBeep, ...);
int InternalShowMessage(HWND hDlg, UINT uCtrlID, UINT uMsgID, UINT uType, BOOL bBeep, va_list args);
UINT InsertDevicePage(LPCWSTR pszName, PDEVMODE pDevMode);
UINT RemoveDevicePage();
UINT RemoveAndInsertDevicePage(LPCWSTR pszName, PDEVMODE pDevMode);
BOOL FitViewModeBest(HWND hwndListView);
VOID SelectPrinterItem(LPITEMIDLIST pidlItem);
BOOL IsCurrentPrinter(LPCITEMIDLIST pidl);
BOOL OnRename(LPCITEMIDLIST *ppidl);
//
// The error codes returned by InstallDevMode/UninstallDevMode functions below.
//
enum
{
kSuccess, // Success no error
kError, // General error
kInvalidDevMode, // Invalid devmode specified
kInvalidPrinterName, // Invalid printer name specified
kAccessDenied, // User does not have access to printer
};
//
// These functions maintain the internal devmode, driver UI stuff and
// implement the printui.dll functionality - bPrinterSetup(...).
//
BOOL FindPrinter(HWND hwnd, LPTSTR pszBuffer, UINT cchSize);
BOOL GetInternalPrinterName(LPTSTR pszBuffer, DWORD *pdwSize);
LPDEVMODE GetCurrentDevMode();
BOOL GetDefaultDevMode(HANDLE hPrinter, LPCTSTR pszPrinterName, PDEVMODE *ppDevMode, BOOL bFillWithDefault);
BOOL WrapEnumPrinters(DWORD dwFlags, LPCTSTR pszServer, DWORD dwLevel, PVOID* ppvBuffer, PDWORD pcbBuffer, PDWORD pcPrinters);
BOOL GetUsablePrinter(LPTSTR szPrinterNameBuf, DWORD *pcchBuf);
BOOL GetInternalDevMode(PDEVMODE *ppOutDevMode, LPCTSTR pszPrinter, HANDLE hPrinter, PDEVMODE pInDevMode);
UINT InstallDevMode(LPCTSTR pszPrinterName, PDEVMODE pDevModeToMerge);
UINT UninstallDevMode();
//
// Members start here.
//
UINT cRef; // compobj refcount
HWND hwndDlg; // handle of this dialog
HWND hSubDlg; // handle of the hook dialog
HWND hwndView; // current view window
HWND hwndUpDown; // UpDown Control Window handle;
IShellView *psv; // shell view object
IShellFolderView *psfv; // shell folder view object
IShellFolder2 *psfRoot; // print folder shell folder
LPITEMIDLIST pidlRoot; // pidl for print folder
IPrinterFolder *ppf; // printer folder private interface
HIMAGELIST himl; // system imagelist (small images)
PPRINTINFOEX pPI; // ptr to PRINTINFOEX struct
LPPRINTDLGEX pPD; // caller's PRINTDLGEX struct
IPrintDialogCallback *pCallback; // ptr to app's callback interface
IObjectWithSite *pSite; // ptr to app's SetSite interface
LPDEVMODE pDMInit; // ptr to the initial DEVMODE struct
LPDEVMODE pDMCur; // ptr to the current DEVMODE struct
LPDEVMODE pDMSave; // ptr to the last good DEVMODE struct
UINT cchCurPrinter; // size, in chars, of pszCurPrinter
LPTSTR pszCurPrinter; // ptr to name of current printer
DWORD nCopies; // number of copies
DWORD nMaxCopies; // max number for the "number of copies"
DWORD nPageRanges; // number of page ranges in pPageRange
DWORD nMaxPageRanges; // max number of page ranges allowed
LPPRINTPAGERANGE pPageRanges; // ptr to an array of page range structs
BOOL fCollateRequested; // collate is requested
BOOL fSelChangePending; // we have a selchange message pending
BOOL fFirstSel; // still need to set first selection
BOOL fAPWSelected; // add printer wizard is selected
BOOL fNoAccessPrinterSelected; // a printer we do not have access to is selected
BOOL fDirtyDevmode; // Set if we change the devmode while editing.
BOOL fDevmodeEdit; // devmode editor is open
BOOL fAllowCollate; // whether collation is allowed by the device
UINT nInitDone; // number of CDM_INITDONE messages
UINT nListSep; // number of characters in szListSep
TCHAR szListSep[20]; // list separator
UINT uRegister; // change notify register
TCHAR szScratch[kPrinterBufMax]; // scratch buffer
UINT uDefViewMode; // How the default view mode is mapped
LPDEVMODE pInternalDevMode; // ptr to the internal DEVMODE
TCHAR szPrinter[kPrinterBufMax]; // The internal printer name
HANDLE hPrinter; // The internal printer
};
//
// Context Help IDs.
//
DWORD aPrintExHelpIDs[] =
{
grp1, NO_HELP,
IDC_PRINTER_LISTVIEW, IDH_PRINT_PRINTER_FOLDER,
IDC_STATUS_TEXT, IDH_PRINT_SETUP_DETAILS,
IDC_STATUS, IDH_PRINT_SETUP_DETAILS,
IDC_LOCATION_TEXT, IDH_PRINT_SETUP_DETAILS,
IDC_LOCATION, IDH_PRINT_SETUP_DETAILS,
IDC_COMMENT_TEXT, IDH_PRINT_SETUP_DETAILS,
IDC_COMMENT, IDH_PRINT_SETUP_DETAILS,
IDC_PRINT_TO_FILE, IDH_PRINT_TO_FILE,
IDC_FIND_PRINTER, IDH_PRINT_FIND_PRINTER,
IDC_DRIVER, IDH_PRINT_PREFERENCES,
grp2, NO_HELP,
IDOK, IDH_PRINT_BTN,
0, 0
};
DWORD aPrintExChildHelpIDs[] =
{
grp1, NO_HELP,
IDC_RANGE_ALL, IDH_PRINT32_RANGE,
IDC_RANGE_SELECTION, IDH_PRINT32_RANGE,
IDC_RANGE_CURRENT, IDH_PRINT32_RANGE,
IDC_RANGE_PAGES, IDH_PRINT32_RANGE,
IDC_RANGE_EDIT, IDH_PRINT32_RANGE,
IDC_RANGE_TEXT1, IDH_PRINT32_RANGE,
IDC_RANGE_TEXT2, IDH_PRINT32_RANGE,
grp2, NO_HELP,
IDC_COPIES, IDH_PRINT_COPIES,
IDC_COPIES_TEXT, IDH_PRINT_COPIES,
IDC_COLLATE, IDH_PRINT_COLLATE,
IDI_COLLATE, IDH_PRINT_COLLATE,
0, 0
};
//
// Function Prototypes.
//
HRESULT
PrintDlgExX(
PPRINTINFOEX pPI);
HRESULT
Print_ReturnDefault(
PPRINTINFOEX pPI);
BOOL
Print_LoadLibraries();
VOID
Print_UnloadLibraries();
BOOL
Print_LoadIcons();
BOOL
Print_InvokePropertySheets(
PPRINTINFOEX pPI,
LPPRINTDLGEX pPD);
BOOL_PTR
Print_GeneralDlgProc(
HWND hDlg,
UINT uMsg,
WPARAM wParam,
LPARAM lParam);
BOOL_PTR
Print_GeneralChildDlgProc(
HWND hDlg,
UINT uMsg,
WPARAM wParam,
LPARAM lParam);
LRESULT
Print_MessageHookProc(
int nCode,
WPARAM wParam,
LPARAM lParam);
BOOL
Print_InitDialog(
HWND hDlg,
WPARAM wParam,
LPARAM lParam);
HRESULT
Print_ICoCreateInstance(
REFCLSID rclsid,
REFIID riid,
LPVOID *ppv);
BOOL
Print_SaveDevNames(
LPTSTR pCurPrinter,
LPPRINTDLGEX pPD);
VOID
Print_GetPortName(
LPTSTR pCurPrinter,
LPTSTR pBuffer,
int cchBuffer);
HANDLE
Print_GetDevModeWrapper(
LPTSTR pszDeviceName,
HANDLE hDevMode);
BOOL
Print_NewPrintDlg(
PPRINTINFO pPI);
#ifdef UNICODE
HRESULT
ThunkPrintDlgEx(
PPRINTINFOEX pPI,
LPPRINTDLGEXA pPDA);
VOID
FreeThunkPrintDlgEx(
PPRINTINFOEX pPI);
VOID
ThunkPrintDlgExA2W(
PPRINTINFOEX pPI);
VOID
ThunkPrintDlgExW2A(
PPRINTINFOEX pPI);
#endif
#endif // WINNT
#ifdef __cplusplus
}; // extern "C"
#endif