/******************************************************************************* * * (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(strText.String()); LvItem.iImage = nIconIndex; LvItem.lParam = reinterpret_cast(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(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 pEnumWiaItem; if (SUCCEEDED(m_pWiaItem->EnumChildItems( &pEnumWiaItem ))) { // // Get the next item // CComPtr 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(lParam); if (pPropSheetPage) { m_pWiaItem = reinterpret_cast(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(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(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(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(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(lParam); if (pNmListView) { CAnnotation *pAnnotation = reinterpret_cast(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(lParam); if (pNmListView) { if (pNmListView->uChanged & LVIF_STATE) { UpdateControls(); } } return 0; } LRESULT CAttachmentCommonPropertyPage::OnListDblClk( WPARAM, LPARAM lParam ) { NMITEMACTIVATE *pNmItemActivate = reinterpret_cast(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(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 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(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(pszTemp))), true ); DialogBoxParam( g_hInstance, MAKEINTRESOURCE(IDD_TEXT), m_hWnd, CTextDialog::DialogProc, reinterpret_cast(&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(); }