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

632 lines
20 KiB
C++

/*******************************************************************************
*
* (C) COPYRIGHT MICROSOFT CORPORATION, 2000
*
* TITLE: PPATTACH.CPP
*
* VERSION: 1.0
*
* AUTHOR: ShaunIv
*
* DATE: 10/26/2000
*
* DESCRIPTION:
*
*******************************************************************************/
#include "precomp.h"
#pragma hdrstop
#include "ppattach.h"
#include "psutil.h"
#include "resource.h"
#include "wiacsh.h"
#include "simrect.h"
#include "wiaffmt.h"
#include "itranhlp.h"
#include "wiadevdp.h"
#include "textdlg.h"
//
// We use this instead of GetSystemMetrics(SM_CXSMICON)/GetSystemMetrics(SM_CYSMICON) because
// large "small" icons wreak havoc with dialog layout
//
#define SMALL_ICON_SIZE 16
//
// Context Help IDs
//
static const DWORD g_HelpIDs[] =
{
IDOK, IDH_OK,
IDCANCEL, IDH_CANCEL,
0, 0
};
extern HINSTANCE g_hInstance;
//
// The only constructor
//
CAttachmentCommonPropertyPage::CAttachmentCommonPropertyPage( HWND hWnd )
: m_hWnd(hWnd)
{
}
CAttachmentCommonPropertyPage::~CAttachmentCommonPropertyPage(void)
{
if (m_hDefAttachmentIcon)
{
DestroyIcon(m_hDefAttachmentIcon);
m_hDefAttachmentIcon = NULL;
}
m_hWnd = NULL;
}
LRESULT CAttachmentCommonPropertyPage::OnKillActive( WPARAM , LPARAM )
{
return FALSE;
}
LRESULT CAttachmentCommonPropertyPage::OnSetActive( WPARAM , LPARAM )
{
//
// Don't allow activation unless we have an item
//
if (!m_pWiaItem)
{
return -1;
}
CWaitCursor wc;
Initialize();
return 0;
}
LRESULT CAttachmentCommonPropertyPage::OnApply( WPARAM , LPARAM )
{
return 0;
}
void CAttachmentCommonPropertyPage::AddAnnotation( HWND hwndList, const CAnnotation &Annotation )
{
WIA_PUSH_FUNCTION((TEXT("CAttachmentCommonPropertyPage::AddAnnotation")));
WIA_ASSERT(hwndList != NULL);
if (hwndList)
{
HIMAGELIST hImageList = ListView_GetImageList( hwndList, LVSIL_SMALL );
if (hImageList)
{
WIA_TRACE((TEXT("Annotation.FileFormat().Icon(): %p"), Annotation.FileFormat().Icon() ));
int nIconIndex = ImageList_AddIcon( hImageList, Annotation.FileFormat().Icon() );
if (nIconIndex != -1)
{
WIA_TRACE((TEXT("nIconIndex: %d"), nIconIndex ));
CAnnotation *pAnnotation = new CAnnotation(Annotation);
if (pAnnotation)
{
//
// Prepare Column 0, Name
//
LVITEM LvItem;
CSimpleString strText;
ZeroMemory(&LvItem,sizeof(LvItem));
strText = pAnnotation->Name();
LvItem.mask = LVIF_IMAGE | LVIF_PARAM | LVIF_TEXT | LVIF_STATE;
LvItem.iItem = ListView_GetItemCount(hwndList);
LvItem.iSubItem = 0;
LvItem.pszText = const_cast<LPTSTR>(strText.String());
LvItem.iImage = nIconIndex;
LvItem.lParam = reinterpret_cast<LPARAM>(pAnnotation);
LvItem.state = ListView_GetItemCount(hwndList) ? 0 : LVIS_FOCUSED | LVIS_SELECTED;
LvItem.stateMask = LVIS_FOCUSED | LVIS_SELECTED;
//
// Insert the item
//
int nItemIndex = ListView_InsertItem( hwndList, &LvItem );
if (nItemIndex != -1)
{
//
// Prepare the description
//
ZeroMemory(&LvItem,sizeof(LvItem));
strText = pAnnotation->FileFormat().Description();
LvItem.mask = LVIF_TEXT;
LvItem.iItem = nItemIndex;
LvItem.iSubItem = 1;
LvItem.pszText = const_cast<LPTSTR>(strText.String());
//
// Set the subitem
//
ListView_SetItem( hwndList, &LvItem );
//
// Prepare the description
//
ZeroMemory(&LvItem,sizeof(LvItem));
TCHAR szSize[MAX_PATH] = {0};
StrFormatByteSize( pAnnotation->Size(), szSize, ARRAYSIZE(szSize) );
LvItem.mask = LVIF_TEXT;
LvItem.iItem = nItemIndex;
LvItem.iSubItem = 2;
LvItem.pszText = szSize;
//
// Set the subitem
//
ListView_SetItem( hwndList, &LvItem );
}
else
{
WIA_ERROR((TEXT("Couldn't insert the item")));
}
}
else
{
WIA_ERROR((TEXT("Couldn't create the annotation")));
}
}
else
{
WIA_ERROR((TEXT("Couldn't add the icon")));
}
}
else
{
WIA_ERROR((TEXT("Couldn't get the image list")));
}
}
else
{
WIA_ERROR((TEXT("Couldn't get the window")));
}
}
void CAttachmentCommonPropertyPage::Initialize()
{
WIA_PUSH_FUNCTION((TEXT("CAttachmentCommonPropertyPage::Initialize")));
//
// Get the listview
//
HWND hwndList = GetDlgItem( m_hWnd, IDC_ATTACHMENTSDLG_ATTACHMENTLIST );
if (hwndList)
{
//
// Remove all of the items from the list
//
ListView_DeleteAllItems(hwndList);
//
// Get the current image list
//
HIMAGELIST hImageList = ListView_GetImageList( hwndList, LVSIL_SMALL );
WIA_ASSERT(hImageList != NULL);
if (hImageList)
{
//
// Remove all of the icons from the current image list
//
ImageList_RemoveAll(hImageList);
//
// Get the item type so we can see if this item has attachments
//
LONG nItemType = 0;
if (SUCCEEDED(m_pWiaItem->GetItemType(&nItemType)))
{
//
// If this item has attachments, enumerate and add them
//
if (nItemType & WiaItemTypeHasAttachments)
{
//
// Enumerate the child items
//
CComPtr<IEnumWiaItem> pEnumWiaItem;
if (SUCCEEDED(m_pWiaItem->EnumChildItems( &pEnumWiaItem )))
{
//
// Get the next item
//
CComPtr<IWiaItem> pWiaItem;
while (S_OK == pEnumWiaItem->Next(1,&pWiaItem,NULL))
{
//
// Create an annotation and try to get all its info
//
CAnnotation Annotation(pWiaItem);
if (SUCCEEDED(Annotation.InitializeFileFormat( m_hDefAttachmentIcon, m_strDefaultUnknownDescription, m_strEmptyDescriptionMask, m_strDefUnknownExtension )))
{
//
// Add the annotation
//
AddAnnotation(hwndList,Annotation);
}
else
{
WIA_ERROR((TEXT("InitializeFileFormat failed")));
}
//
// Free this item
//
pWiaItem = NULL;
}
}
else
{
WIA_ERROR((TEXT("EnumChildItems failed")));
}
}
else
{
CAnnotation Annotation(m_pWiaItem);
if (SUCCEEDED(Annotation.InitializeFileFormat( m_hDefAttachmentIcon, m_strDefaultUnknownDescription, m_strEmptyDescriptionMask, m_strDefUnknownExtension )))
{
//
// Add the annotation
//
AddAnnotation(hwndList,Annotation);
}
}
}
}
}
else
{
WIA_ERROR((TEXT("Can't get the listview window")));
}
UpdateControls();
}
LRESULT CAttachmentCommonPropertyPage::OnInitDialog( WPARAM, LPARAM lParam )
{
//
// Get the WIA item
//
PROPSHEETPAGE *pPropSheetPage = reinterpret_cast<PROPSHEETPAGE*>(lParam);
if (pPropSheetPage)
{
m_pWiaItem = reinterpret_cast<IWiaItem*>(pPropSheetPage->lParam);
}
if (!m_pWiaItem)
{
return -1;
}
CSimpleRect rcClient( GetDlgItem( m_hWnd, IDC_ATTACHMENTSDLG_ATTACHMENTLIST ) );
CSimpleString strColumnTitle;
LVCOLUMN LvColumn = {0};
//
// Set up the various columns
//
ZeroMemory( &LvColumn, sizeof(LvColumn) );
strColumnTitle.LoadString( IDS_ATTACHMENTS_COLTITLE_NAME, g_hInstance );
LvColumn.pszText = const_cast<LPTSTR>(strColumnTitle.String());
LvColumn.iSubItem = 0;
LvColumn.mask = LVCF_FMT | LVCF_SUBITEM | LVCF_TEXT | LVCF_WIDTH;
LvColumn.cx = rcClient.Width() / 3;
LvColumn.fmt = LVCFMT_LEFT;
ListView_InsertColumn( GetDlgItem( m_hWnd, IDC_ATTACHMENTSDLG_ATTACHMENTLIST ), 0, &LvColumn );
ZeroMemory( &LvColumn, sizeof(LvColumn) );
strColumnTitle.LoadString( IDS_ATTACHMENTS_COLTITLE_TYPE, g_hInstance );
LvColumn.pszText = const_cast<LPTSTR>(strColumnTitle.String());
LvColumn.iSubItem = 1;
LvColumn.mask = LVCF_FMT | LVCF_SUBITEM | LVCF_TEXT | LVCF_WIDTH;
LvColumn.cx = rcClient.Width() / 3;
LvColumn.fmt = LVCFMT_LEFT;
ListView_InsertColumn( GetDlgItem( m_hWnd, IDC_ATTACHMENTSDLG_ATTACHMENTLIST ), 1, &LvColumn );
ZeroMemory( &LvColumn, sizeof(LvColumn) );
strColumnTitle.LoadString( IDS_ATTACHMENTS_COLTITLE_SIZE, g_hInstance );
LvColumn.pszText = const_cast<LPTSTR>(strColumnTitle.String());
LvColumn.iSubItem = 2;
LvColumn.mask = LVCF_FMT | LVCF_SUBITEM | LVCF_TEXT | LVCF_WIDTH;
LvColumn.cx = rcClient.Width() - (rcClient.Width() / 3 * 2);
LvColumn.fmt = LVCFMT_RIGHT;
ListView_InsertColumn( GetDlgItem( m_hWnd, IDC_ATTACHMENTSDLG_ATTACHMENTLIST ), 2, &LvColumn );
//
// Create an image list for the icons
//
HIMAGELIST hImageList = ImageList_Create( SMALL_ICON_SIZE, SMALL_ICON_SIZE, ILC_MASK|PrintScanUtil::CalculateImageListColorDepth(), 5, 5 );
if (hImageList)
{
//
// Set the image list
//
ListView_SetImageList( GetDlgItem( m_hWnd, IDC_ATTACHMENTSDLG_ATTACHMENTLIST ), hImageList, LVSIL_SMALL );
}
//
// Get the default strings used for information we can't derive from the item itself
//
m_hDefAttachmentIcon = reinterpret_cast<HICON>(LoadImage( g_hInstance, MAKEINTRESOURCE(IDI_ATTACHMENTSDLG_DEFICON), IMAGE_ICON, GetSystemMetrics(SM_CXSMICON), GetSystemMetrics(SM_CYSMICON), LR_DEFAULTCOLOR ) );
m_strDefaultUnknownDescription.LoadString( IDS_ATTACHMENTSDLG_UNKNOWNDESCRIPTION, g_hInstance );
m_strEmptyDescriptionMask.LoadString( IDS_ATTACHMENTSDLG_EMPTYDESCRIPTIONMASK, g_hInstance );
m_strDefUnknownExtension.LoadString( IDS_ATTACHMENTSDLG_UNKNOWNEXTENSION, g_hInstance );
return TRUE;
}
LRESULT CAttachmentCommonPropertyPage::OnHelp( WPARAM wParam, LPARAM lParam )
{
return WiaHelp::HandleWmHelp( wParam, lParam, g_HelpIDs );
}
LRESULT CAttachmentCommonPropertyPage::OnContextMenu( WPARAM wParam, LPARAM lParam )
{
return WiaHelp::HandleWmContextMenu( wParam, lParam, g_HelpIDs );
}
LRESULT CAttachmentCommonPropertyPage::OnListDeleteItem( WPARAM, LPARAM lParam )
{
//
// Delete the CAnnotation stored in each lParam as it the listview item is deleted
//
NMLISTVIEW *pNmListView = reinterpret_cast<NMLISTVIEW*>(lParam);
if (pNmListView)
{
CAnnotation *pAnnotation = reinterpret_cast<CAnnotation*>(pNmListView->lParam);
if (pAnnotation)
{
delete pAnnotation;
}
}
return 0;
}
bool CAttachmentCommonPropertyPage::IsPlaySupported( const GUID &guidFormat )
{
//
// For now we can only play WAV files
//
return ((guidFormat == WiaAudFmt_WAV) != 0 || (guidFormat == WiaImgFmt_TXT) != 0);
}
//
// Update the status of dependent controls when the selection changes
//
LRESULT CAttachmentCommonPropertyPage::OnListItemChanged( WPARAM, LPARAM lParam )
{
NMLISTVIEW *pNmListView = reinterpret_cast<NMLISTVIEW*>(lParam);
if (pNmListView)
{
if (pNmListView->uChanged & LVIF_STATE)
{
UpdateControls();
}
}
return 0;
}
LRESULT CAttachmentCommonPropertyPage::OnListDblClk( WPARAM, LPARAM lParam )
{
NMITEMACTIVATE *pNmItemActivate = reinterpret_cast<NMITEMACTIVATE*>(lParam);
if (pNmItemActivate)
{
PlayItem(pNmItemActivate->iItem);
}
return 0;
}
//
// Update the dependent controls
//
void CAttachmentCommonPropertyPage::UpdateControls(void)
{
//
// If the current item is not playable, disable the play button
//
CAnnotation *pAnnotation = GetAttachment(GetCurrentSelection());
BOOL bEnablePlay = FALSE;
if (pAnnotation)
{
if (IsPlaySupported(pAnnotation->FileFormat().Format()))
{
bEnablePlay = TRUE;
}
}
EnableWindow( GetDlgItem( m_hWnd, IDC_ATTACHMENTSDLG_PLAY ), bEnablePlay );
}
//
// Find the currently selected item, if there is one
//
int CAttachmentCommonPropertyPage::GetCurrentSelection(void)
{
int nResult = -1;
HWND hWnd = GetDlgItem( m_hWnd, IDC_ATTACHMENTSDLG_ATTACHMENTLIST );
if (hWnd)
{
int nCount = ListView_GetItemCount(hWnd);
for (int i=0;i<nCount;i++)
{
if (ListView_GetItemState(hWnd,i,LVIS_SELECTED) & LVIS_SELECTED)
{
nResult = i;
break;
}
}
}
return nResult;
}
//
// Get the CAttachment* from the lParam for the nIndex'th item
//
CAnnotation *CAttachmentCommonPropertyPage::GetAttachment( int nIndex )
{
CAnnotation *pResult = NULL;
HWND hWnd = GetDlgItem( m_hWnd, IDC_ATTACHMENTSDLG_ATTACHMENTLIST );
if (hWnd)
{
LV_ITEM lvItem = {0};
lvItem.mask = LVIF_PARAM;
lvItem.iItem = nIndex;
if (ListView_GetItem( hWnd, &lvItem ))
{
pResult = reinterpret_cast<CAnnotation*>(lvItem.lParam);
}
}
return pResult;
}
void CAttachmentCommonPropertyPage::PlayItem( int nIndex )
{
WIA_PUSH_FUNCTION((TEXT("CAttachmentCommonPropertyPage::PlayItem( %d )"), nIndex ));
//
// This will take a while
//
CWaitCursor wc;
//
// Get the attachement data for this item
//
CAnnotation *pAnnotation = GetAttachment(nIndex);
if (pAnnotation)
{
//
// Make sure we can play this format before we go to the trouble of getting the data
//
if (IsPlaySupported(pAnnotation->FileFormat().Format()))
{
//
// Get the window that has the initial focus, so we can reset it after we enable the play button
//
HWND hWndFocus = GetFocus();
//
// Disable the play button so the user can't click on it a million times
//
EnableWindow( GetDlgItem( m_hWnd, IDC_ATTACHMENTSDLG_PLAY ), FALSE );
//
// Create an annotation helper to transfer the data
//
CComPtr<IWiaAnnotationHelpers> pWiaAnnotationHelpers;
HRESULT hr = CoCreateInstance( CLSID_WiaDefaultUi, NULL, CLSCTX_INPROC_SERVER, IID_IWiaAnnotationHelpers, (void**)&pWiaAnnotationHelpers );
if (SUCCEEDED(hr))
{
//
// Transfer the data and make sure it is valid
//
PBYTE pBuffer = NULL;
DWORD dwLength = 0;
hr = pWiaAnnotationHelpers->TransferAttachmentToMemory( pAnnotation->WiaItem(), pAnnotation->FileFormat().Format(), m_hWnd, &pBuffer, &dwLength );
if (SUCCEEDED(hr) && pBuffer && dwLength)
{
CWaitCursor wc;
UpdateWindow(m_hWnd);
//
// If this is a WAV file, play it using PlaySound. It can't be async, because we are going to
// delete the buffer right after we call it.
//
if (WiaAudFmt_WAV == pAnnotation->FileFormat().Format())
{
if (!PlaySound( reinterpret_cast<LPCTSTR>(pBuffer), NULL, SND_MEMORY ))
{
WIA_TRACE((TEXT("PlaySound returned FALSE")));
}
}
if (WiaImgFmt_TXT == pAnnotation->FileFormat().Format())
{
//
// We need to copy the text to a new buffer so we can NULL terminate it,
// so allocate a dwLength+1 char bufferr
//
LPSTR pszTemp = new CHAR[dwLength+1];
if (pszTemp)
{
//
// Copy the buffer and null terminate it
//
CopyMemory( pszTemp, pBuffer, dwLength );
pszTemp[dwLength] = '\0';
//
// Prepare the data and display the dialog
//
CTextDialog::CData Data( CSimpleStringConvert::WideString(CSimpleStringAnsi(reinterpret_cast<LPCSTR>(pszTemp))), true );
DialogBoxParam( g_hInstance, MAKEINTRESOURCE(IDD_TEXT), m_hWnd, CTextDialog::DialogProc, reinterpret_cast<LPARAM>(&Data) );
//
// Release the temp buffer
//
delete[] pszTemp;
}
}
//
// Free the data
//
CoTaskMemFree(pBuffer);
}
}
//
// Re-enable the play button
//
EnableWindow( GetDlgItem( m_hWnd, IDC_ATTACHMENTSDLG_PLAY ), TRUE );
//
// Restore the focus
//
SetFocus( hWndFocus ? hWndFocus : GetDlgItem( m_hWnd, IDC_ATTACHMENTSDLG_PLAY ) );
}
}
}
void CAttachmentCommonPropertyPage::OnPlay( WPARAM, LPARAM )
{
WIA_PUSH_FUNCTION((TEXT("CAttachmentCommonPropertyPage::OnPlay")));
PlayItem(GetCurrentSelection());
}
LRESULT CAttachmentCommonPropertyPage::OnNotify( WPARAM wParam, LPARAM lParam )
{
SC_BEGIN_NOTIFY_MESSAGE_HANDLERS()
{
SC_HANDLE_NOTIFY_MESSAGE_CODE(PSN_APPLY, OnApply);
SC_HANDLE_NOTIFY_MESSAGE_CODE(PSN_KILLACTIVE,OnKillActive);
SC_HANDLE_NOTIFY_MESSAGE_CODE(PSN_SETACTIVE,OnSetActive);
SC_HANDLE_NOTIFY_MESSAGE_CONTROL(LVN_DELETEITEM,IDC_ATTACHMENTSDLG_ATTACHMENTLIST,OnListDeleteItem);
SC_HANDLE_NOTIFY_MESSAGE_CONTROL(LVN_ITEMCHANGED,IDC_ATTACHMENTSDLG_ATTACHMENTLIST,OnListItemChanged);
SC_HANDLE_NOTIFY_MESSAGE_CONTROL(NM_DBLCLK,IDC_ATTACHMENTSDLG_ATTACHMENTLIST,OnListDblClk);
}
SC_END_NOTIFY_MESSAGE_HANDLERS();
}
LRESULT CAttachmentCommonPropertyPage::OnCommand( WPARAM wParam, LPARAM lParam )
{
SC_BEGIN_COMMAND_HANDLERS()
{
SC_HANDLE_COMMAND( IDC_ATTACHMENTSDLG_PLAY, OnPlay );
}
SC_END_COMMAND_HANDLERS();
}
INT_PTR CALLBACK CAttachmentCommonPropertyPage::DialogProc( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam )
{
SC_BEGIN_DIALOG_MESSAGE_HANDLERS(CAttachmentCommonPropertyPage)
{
SC_HANDLE_DIALOG_MESSAGE( WM_INITDIALOG, OnInitDialog );
SC_HANDLE_DIALOG_MESSAGE( WM_NOTIFY, OnNotify );
SC_HANDLE_DIALOG_MESSAGE( WM_COMMAND, OnCommand );
SC_HANDLE_DIALOG_MESSAGE( WM_HELP, OnHelp );
SC_HANDLE_DIALOG_MESSAGE( WM_CONTEXTMENU, OnContextMenu );
}
SC_END_DIALOG_MESSAGE_HANDLERS();
}