// PJobPage.cpp : implementation file // #include "stdafx.h" #include "cldprn32.h" #include "PJobPage.h" #include "PrnSheet.h" #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif class CPrintJobInfo { public: CString m_sPrintJobInstanceUID; CString m_sExecutionStatus; CString m_sExecutionStatusInfo; CString m_sPrintPriority; CString m_sCreationDate; CString m_sCreationTime; CString m_sPrinterName; CString m_sOriginator; }; ///////////////////////////////////////////////////////////////////////////// // CPrintJobsPage property page IMPLEMENT_DYNCREATE(CPrintJobsPage, CPropertyPage) CPrintJobsPage::CPrintJobsPage() : CPropertyPage(CPrintJobsPage::IDD), m_bReset(FALSE), m_bPendingOperation(FALSE) { //{{AFX_DATA_INIT(CPrintJobsPage) // NOTE: the ClassWizard will add member initialization here //}}AFX_DATA_INIT } CPrintJobsPage::~CPrintJobsPage() { } void CPrintJobsPage::DoDataExchange(CDataExchange* pDX) { CPropertyPage::DoDataExchange(pDX); //{{AFX_DATA_MAP(CPrintJobsPage) DDX_Control(pDX, IDC_LIST_INFORMATION, m_PrintJobInfoListCtrl); DDX_Control(pDX, IDC_LIST_NOTIFICATIONS, m_NotificationsListCtrl); DDX_Control(pDX, IDC_TREE_PRINTJOBS, m_PrintJobsTree); //}}AFX_DATA_MAP } BEGIN_MESSAGE_MAP(CPrintJobsPage, CPropertyPage) //{{AFX_MSG_MAP(CPrintJobsPage) ON_NOTIFY(TVN_SELCHANGED, IDC_TREE_PRINTJOBS, OnSelChangedTreePrintJobs) ON_WM_DESTROY() ON_NOTIFY(TVN_ENDLABELEDIT, IDC_TREE_PRINTJOBS, OnEndLabelEditTreePrintJobs) ON_BN_CLICKED(IDC_BUTTON_GET, OnButtonGet) //}}AFX_MSG_MAP END_MESSAGE_MAP() void CPrintJobsPage::AddPrintJob(L_PCSTR pszPrintJobInstanceUID) { CPrintJobInfo* pPrintJobInfo = new CPrintJobInfo(); if (!pPrintJobInfo) return; pPrintJobInfo->m_sPrintJobInstanceUID = pszPrintJobInstanceUID; CString sItemText; sItemText.Format(TEXT("Print Job %u"), m_PrintJobsTree.GetCount() + 1); HTREEITEM hPrintJobItem = m_PrintJobsTree.InsertItem(sItemText); m_PrintJobsTree.SetItemData(hPrintJobItem, DWORD(pPrintJobInfo)); m_PrintJobsTree.SelectItem(hPrintJobItem); int iCount = m_PrintJobInfoListCtrl.GetItemCount(); for (int i = 0; i < iCount; i++) { m_PrintJobInfoListCtrl.SetItemText(i, 1, TEXT("")); } GetDlgItem(IDC_BUTTON_GET)->EnableWindow(TRUE); m_PrintJobInfoListCtrl.SetFocus(); } void CPrintJobsPage::AddNotification(L_PCSTR pszPrintJobInstanceUID, L_UINT16 uEventTypeID, const pPRINTJOBREPORTINFO pReportInfo) { if (!pReportInfo) return; LPCTSTR pszEventType = TEXT("Pending"); switch (uEventTypeID) { case 2: pszEventType = TEXT("Printing"); break; case 3: pszEventType = TEXT("Done"); break; case 4: pszEventType = TEXT("Failure"); break; } CString sPrintJob = GetPrintJobName(pszPrintJobInstanceUID); int iIndex = m_NotificationsListCtrl.InsertItem(m_NotificationsListCtrl.GetItemCount(), sPrintJob); if (iIndex != -1) { m_NotificationsListCtrl.SetItemText(iIndex, 1, pszEventType); m_NotificationsListCtrl.SetItemText(iIndex, 2, pReportInfo->pszExecutionStatusInfo); m_NotificationsListCtrl.SetItemText(iIndex, 3, pReportInfo->pszPrintJobID); m_NotificationsListCtrl.SetItemText(iIndex, 4, pReportInfo->pszFilmSessionLabel); m_NotificationsListCtrl.SetItemText(iIndex, 5, pReportInfo->pszPrinterName); LPTSTR pszInstanceUID = new TCHAR[lstrlen(pszPrintJobInstanceUID) + 1]; if (pszInstanceUID) { lstrcpy(pszInstanceUID, pszPrintJobInstanceUID ? pszPrintJobInstanceUID : TEXT("")); } m_NotificationsListCtrl.SetItemData(iIndex, DWORD(pszInstanceUID)); m_NotificationsListCtrl.SetItemState(iIndex, LVIS_SELECTED, LVIS_SELECTED); } } void CPrintJobsPage::Reset() { ClearPrintJobsInfoTree(); int iCount = m_PrintJobInfoListCtrl.GetItemCount(); for (int i = 0; i < iCount; i++) { m_PrintJobInfoListCtrl.SetItemText(i, 1, TEXT("")); } ClearNotificationsListCtrl(); m_bReset = FALSE; } void CPrintJobsPage::UpdateControlsState() { CPrintSCU& PrintSCU = ((CPrintScuSheet*) GetParent())->m_PrintSCU; BOOL bPrintJobSupported = PrintSCU.IsClassSupported(PRINTSCU_PRINT_JOB_SOP_CLASS); BOOL bPrintJobAdded = (m_PrintJobsTree.GetRootItem() != NULL); m_PrintJobsTree.EnableWindow(bPrintJobSupported); m_PrintJobInfoListCtrl.EnableWindow(bPrintJobSupported); GetDlgItem(IDC_BUTTON_GET)->EnableWindow(bPrintJobSupported && bPrintJobAdded && !m_bPendingOperation); m_NotificationsListCtrl.EnableWindow(bPrintJobSupported); } CString CPrintJobsPage::GetPrintJobName(L_PCSTR pszPrintJobInstanceUID) { CString sPrintJobName; HTREEITEM hItem; CPrintJobInfo* pPrintJobInfo; hItem = m_PrintJobsTree.GetRootItem(); while (hItem) { pPrintJobInfo = (CPrintJobInfo*) m_PrintJobsTree.GetItemData(hItem); if (pszPrintJobInstanceUID && pPrintJobInfo->m_sPrintJobInstanceUID == pszPrintJobInstanceUID) { sPrintJobName = m_PrintJobsTree.GetItemText(hItem); break; } hItem = m_PrintJobsTree.GetNextItem(hItem, TVGN_NEXT); } return sPrintJobName; } void CPrintJobsPage::ClearPrintJobsInfoTree() { HTREEITEM hItem = m_PrintJobsTree.GetRootItem(); while (hItem) { delete ((CPrintJobInfo*) m_PrintJobsTree.GetItemData(hItem)); hItem = m_PrintJobsTree.GetNextItem(hItem, TVGN_NEXT); } m_PrintJobsTree.DeleteAllItems(); } void CPrintJobsPage::ClearNotificationsListCtrl() { int iCount = m_NotificationsListCtrl.GetItemCount(); for (int i = 0; i < iCount; i++) { delete [] ((LPTSTR) m_NotificationsListCtrl.GetItemData(i)); } m_NotificationsListCtrl.DeleteAllItems(); } ///////////////////////////////////////////////////////////////////////////// // CPrintJobsPage message handlers BOOL CPrintJobsPage::OnInitDialog() { CPropertyPage::OnInitDialog(); // Prepare the Print Job Information list control m_PrintJobInfoListCtrl.InsertColumn(0, TEXT("Attribute"), LVCFMT_LEFT, 130, 0); m_PrintJobInfoListCtrl.InsertColumn(1, TEXT("Value"), LVCFMT_LEFT, 100, 1); m_PrintJobInfoListCtrl.SetExtendedStyle(m_PrintJobInfoListCtrl.GetExtendedStyle() | LVS_EX_FULLROWSELECT | LVS_EX_CHECKBOXES); m_PrintJobInfoListCtrl.InsertItem(0, TEXT("Execution Status")); m_PrintJobInfoListCtrl.InsertItem(1, TEXT("Execution Status Info")); m_PrintJobInfoListCtrl.InsertItem(2, TEXT("Print Priority")); m_PrintJobInfoListCtrl.InsertItem(3, TEXT("Creation Date")); m_PrintJobInfoListCtrl.InsertItem(4, TEXT("Creation Time")); m_PrintJobInfoListCtrl.InsertItem(5, TEXT("Printer Name")); m_PrintJobInfoListCtrl.InsertItem(6, TEXT("Originator")); m_PrintJobInfoListCtrl.SetCheck(0); // Execution Status m_PrintJobInfoListCtrl.SetCheck(1); // Execution Status Info m_PrintJobInfoListCtrl.SetCheck(2); // Print Priority m_PrintJobInfoListCtrl.SetCheck(5); // Printer Name // END: Prepare the Print Job Information list control // Prepare the Notifications list control m_NotificationsListCtrl.InsertColumn(0, TEXT("Print Job"), LVCFMT_LEFT, 60, 0); m_NotificationsListCtrl.InsertColumn(1, TEXT("Event Type"), LVCFMT_LEFT, 70, 1); m_NotificationsListCtrl.InsertColumn(2, TEXT("Execution Status Info"), LVCFMT_LEFT, 120, 2); m_NotificationsListCtrl.InsertColumn(3, TEXT("Print Job ID"), LVCFMT_LEFT, 70, 3); m_NotificationsListCtrl.InsertColumn(4, TEXT("Film Session Label"), LVCFMT_LEFT, 110, 4); m_NotificationsListCtrl.InsertColumn(5, TEXT("Printer Name"), LVCFMT_LEFT, 80, 5); m_NotificationsListCtrl.SetExtendedStyle(m_NotificationsListCtrl.GetExtendedStyle() | LVS_EX_FULLROWSELECT); return TRUE; } BOOL CPrintJobsPage::OnSetActive() { if (m_bReset) { Reset(); } UpdateControlsState(); return CPropertyPage::OnSetActive(); } void CPrintJobsPage::OnDestroy() { CPropertyPage::OnDestroy(); ClearPrintJobsInfoTree(); ClearNotificationsListCtrl(); } void CPrintJobsPage::OnButtonGet() { CPrintScuSheet& PrintScuSheet = *((CPrintScuSheet*) GetParent()); CPrintSCU& PrintSCU = PrintScuSheet.m_PrintSCU; HTREEITEM hSelectedItem = m_PrintJobsTree.GetSelectedItem(); if (!hSelectedItem) return; int iCount = m_PrintJobInfoListCtrl.GetItemCount(); for (int i = 0; i < iCount; i++) { m_PrintJobInfoListCtrl.SetItemText(i, 1, TEXT("")); } CPrintJobInfo* pPrintJobInfo = (CPrintJobInfo*) m_PrintJobsTree.GetItemData(hSelectedItem); if (!pPrintJobInfo) return; pPrintJobInfo->m_sExecutionStatus = TEXT(""); pPrintJobInfo->m_sExecutionStatusInfo = TEXT(""); pPrintJobInfo->m_sPrintPriority = TEXT(""); pPrintJobInfo->m_sCreationDate = TEXT(""); pPrintJobInfo->m_sCreationTime = TEXT(""); pPrintJobInfo->m_sPrinterName = TEXT(""); pPrintJobInfo->m_sOriginator = TEXT(""); // The required Print Job info PRINTJOBINFO PrintJobInfo; PrintJobInfo.uStructSize = sizeof(PRINTJOBINFO); SPECIFY_ATTRIB(m_PrintJobInfoListCtrl, 0, PrintJobInfo.szExecutionStatus); SPECIFY_ATTRIB(m_PrintJobInfoListCtrl, 1, PrintJobInfo.szExecutionStatusInfo); SPECIFY_ATTRIB(m_PrintJobInfoListCtrl, 2, PrintJobInfo.szPrintPriority); SPECIFY_ATTRIB(m_PrintJobInfoListCtrl, 3, PrintJobInfo.szCreationDate); SPECIFY_ATTRIB(m_PrintJobInfoListCtrl, 4, PrintJobInfo.szCreationTime); SPECIFY_ATTRIB(m_PrintJobInfoListCtrl, 5, PrintJobInfo.szPrinterName); SPECIFY_ATTRIB(m_PrintJobInfoListCtrl, 6, PrintJobInfo.szOriginator); PrintScuSheet.FlagPendingOperation(); L_INT iRet = PrintSCU.GetPrintJobInfo(pPrintJobInfo->m_sPrintJobInstanceUID, &PrintJobInfo); if (iRet != DICOM_SUCCESS) { PrintScuSheet.DisplayError(iRet); PrintScuSheet.FlagPendingOperation(FALSE); return; } PrintSCU.GetPrintJobInfo(&PrintJobInfo, sizeof(PRINTJOBINFO)); pPrintJobInfo->m_sExecutionStatus = PrintJobInfo.szExecutionStatus; pPrintJobInfo->m_sExecutionStatusInfo = PrintJobInfo.szExecutionStatusInfo; pPrintJobInfo->m_sPrintPriority = PrintJobInfo.szPrintPriority; pPrintJobInfo->m_sCreationDate = PrintJobInfo.szCreationDate; pPrintJobInfo->m_sCreationTime = PrintJobInfo.szCreationTime; pPrintJobInfo->m_sPrinterName = PrintJobInfo.szPrinterName; pPrintJobInfo->m_sOriginator = PrintJobInfo.szOriginator; m_PrintJobInfoListCtrl.SetItemText(0, 1, pPrintJobInfo->m_sExecutionStatus); m_PrintJobInfoListCtrl.SetItemText(1, 1, pPrintJobInfo->m_sExecutionStatusInfo); m_PrintJobInfoListCtrl.SetItemText(2, 1, pPrintJobInfo->m_sPrintPriority); m_PrintJobInfoListCtrl.SetItemText(3, 1, pPrintJobInfo->m_sCreationDate); m_PrintJobInfoListCtrl.SetItemText(4, 1, pPrintJobInfo->m_sCreationTime); m_PrintJobInfoListCtrl.SetItemText(5, 1, pPrintJobInfo->m_sPrinterName); m_PrintJobInfoListCtrl.SetItemText(6, 1, pPrintJobInfo->m_sOriginator); PrintScuSheet.FlagPendingOperation(FALSE); } void CPrintJobsPage::OnSelChangedTreePrintJobs(NMHDR* pNMHDR, LRESULT* pResult) { NM_TREEVIEW* pNMTreeView = (NM_TREEVIEW*) pNMHDR; int iCount = m_PrintJobInfoListCtrl.GetItemCount(); for (int i = 0; i < iCount; i++) { m_PrintJobInfoListCtrl.SetItemText(i, 1, TEXT("")); } CPrintJobInfo* pPrintJobInfo; pPrintJobInfo = (CPrintJobInfo*) m_PrintJobsTree.GetItemData(pNMTreeView->itemNew.hItem); if (!pPrintJobInfo) return; m_PrintJobInfoListCtrl.SetItemText(0, 1, pPrintJobInfo->m_sExecutionStatus); m_PrintJobInfoListCtrl.SetItemText(1, 1, pPrintJobInfo->m_sExecutionStatusInfo); m_PrintJobInfoListCtrl.SetItemText(2, 1, pPrintJobInfo->m_sPrintPriority); m_PrintJobInfoListCtrl.SetItemText(3, 1, pPrintJobInfo->m_sCreationDate); m_PrintJobInfoListCtrl.SetItemText(4, 1, pPrintJobInfo->m_sCreationTime); m_PrintJobInfoListCtrl.SetItemText(5, 1, pPrintJobInfo->m_sPrinterName); m_PrintJobInfoListCtrl.SetItemText(6, 1, pPrintJobInfo->m_sOriginator); *pResult = 0; } void CPrintJobsPage::OnEndLabelEditTreePrintJobs(NMHDR* pNMHDR, LRESULT* pResult) { TV_DISPINFO* pTVDispInfo = (TV_DISPINFO*) pNMHDR; CString sNewItemText = pTVDispInfo->item.pszText; sNewItemText.TrimLeft(); sNewItemText.TrimRight(); if (sNewItemText.GetLength()) { m_PrintJobsTree.SetItemText(pTVDispInfo->item.hItem, sNewItemText); // Change the Print Job name for all the related events CPrintJobInfo* pPrintJobInfo = (CPrintJobInfo*) m_PrintJobsTree.GetItemData(pTVDispInfo->item.hItem); if (pPrintJobInfo) { CString& sPrintJobInstanceUID = pPrintJobInfo->m_sPrintJobInstanceUID; LPCTSTR pszPrintJobInstanceUID; int iCount = m_NotificationsListCtrl.GetItemCount(); for (int i = 0; i < iCount; i++) { pszPrintJobInstanceUID = (LPCTSTR) m_NotificationsListCtrl.GetItemData(i); if (pszPrintJobInstanceUID && sPrintJobInstanceUID == pszPrintJobInstanceUID) { m_NotificationsListCtrl.SetItemText(i, 0, sNewItemText); } } } } *pResult = 0; }