// PrnPage.cpp : implementation file // #include "stdafx.h" #include "cldprn32.h" #include "PrnPage.h" #include "PrnSheet.h" #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif ///////////////////////////////////////////////////////////////////////////// // CPrinterPage property page IMPLEMENT_DYNCREATE(CPrinterPage, CPropertyPage) CPrinterPage::CPrinterPage() : CPropertyPage(CPrinterPage::IDD), m_bReset(FALSE), m_bPendingOperation(FALSE) { //{{AFX_DATA_INIT(CPrinterPage) // NOTE: the ClassWizard will add member initialization here //}}AFX_DATA_INIT } CPrinterPage::~CPrinterPage() { } void CPrinterPage::DoDataExchange(CDataExchange* pDX) { CPropertyPage::DoDataExchange(pDX); //{{AFX_DATA_MAP(CPrinterPage) DDX_Control(pDX, IDC_TREE_CONFIG, m_PrinterConfigTree); DDX_Control(pDX, IDC_LIST_NOTIFICATIONS, m_NotificationsListCtrl); DDX_Control(pDX, IDC_LIST_INFORMATION, m_PrinterInformationListCtrl); //}}AFX_DATA_MAP } BEGIN_MESSAGE_MAP(CPrinterPage, CPropertyPage) //{{AFX_MSG_MAP(CPrinterPage) ON_BN_CLICKED(IDC_BUTTON_GET, OnButtonGet) ON_BN_CLICKED(IDC_BUTTON_GETCONFIG, OnButtonGetConfig) ON_NOTIFY(TVN_SELCHANGED, IDC_TREE_CONFIG, OnSelChangedTreeConfig) //}}AFX_MSG_MAP END_MESSAGE_MAP() void CPrinterPage::AddNotification(L_UINT16 uEventTypeID, const pPRINTERREPORTINFO pPrinterReportInfo) { LPCTSTR pszEventType = TEXT("Normal"); switch (uEventTypeID) { case 2: pszEventType = TEXT("Warning"); break; case 3: pszEventType = TEXT("Failure"); break; } int iIndex = m_NotificationsListCtrl.InsertItem(m_NotificationsListCtrl.GetItemCount(), pszEventType); if (iIndex != -1) { if (pPrinterReportInfo) { m_NotificationsListCtrl.SetItemText(iIndex, 1, pPrinterReportInfo->pszPrinterStatusInfo); m_NotificationsListCtrl.SetItemText(iIndex, 2, pPrinterReportInfo->pszFilmDestination); m_NotificationsListCtrl.SetItemText(iIndex, 3, pPrinterReportInfo->pszPrinterName); } m_NotificationsListCtrl.SetItemState(iIndex, LVIS_SELECTED, LVIS_SELECTED); } } void CPrinterPage::DisplaySequence(LDicomDS& PrnConfig, pDICOMELEMENT pSequence, HTREEITEM hSequenceTreeItem) { if (!pSequence || !hSequenceTreeItem) return; pDICOMELEMENT pItem, pElement; HTREEITEM hItemTreeItem, hElementTreeItem; pDICOMTAG pTag; pItem = PrnConfig.GetChildElement(pSequence, TRUE); while (pItem) { hItemTreeItem = m_PrinterConfigTree.InsertItem(TEXT("Item"), hSequenceTreeItem); m_PrinterConfigTree.SetItemData(hItemTreeItem, 0); pElement = PrnConfig.GetChildElement(pItem, TRUE); while (pElement) { pTag = LDicomTag::Find(pElement->nTag); if (pTag && pElement->nLength != ELEMENT_LENGTH_MAX) { hElementTreeItem = m_PrinterConfigTree.InsertItem(pTag->pszName, hItemTreeItem); m_PrinterConfigTree.SetItemData(hElementTreeItem, DWORD(pElement)); } pElement = PrnConfig.GetNextElement(pElement, TRUE, TRUE); } pItem = PrnConfig.GetNextElement(pItem, TRUE, TRUE); } } void CPrinterPage::Reset() { int iCount = m_PrinterInformationListCtrl.GetItemCount(); for (int i = 0; i < iCount; i++) { m_PrinterInformationListCtrl.SetItemText(i, 1, TEXT("")); } m_NotificationsListCtrl.DeleteAllItems(); m_PrinterConfigTree.DeleteAllItems(); SetDlgItemText(IDC_EDIT_VALUE, TEXT("")); m_bReset = FALSE; } void CPrinterPage::UpdateControlsState() { CPrintSCU& PrintSCU = ((CPrintScuSheet*) GetParent())->m_PrintSCU; BOOL bPrinterSupported = PrintSCU.IsClassSupported(PRINTSCU_BASIC_GRAYSCALE_PM_META_SOP_CLASS) || PrintSCU.IsClassSupported(PRINTSCU_BASIC_COLOR_PM_META_SOP_CLASS) || PrintSCU.IsClassSupported(PRINTSCU_PULL_STORED_PM_META_SOP_CLASS); BOOL bPrinterConfigSupported = PrintSCU.IsClassSupported(PRINTSCU_PRINTER_CONFIGURATION_RETRIEVAL_SOP_CLASS); m_PrinterInformationListCtrl.EnableWindow(bPrinterSupported); GetDlgItem(IDC_BUTTON_GET)->EnableWindow(bPrinterSupported && !m_bPendingOperation); m_NotificationsListCtrl.EnableWindow(bPrinterSupported); m_PrinterConfigTree.EnableWindow(bPrinterConfigSupported); GetDlgItem(IDC_BUTTON_GETCONFIG)->EnableWindow(bPrinterConfigSupported && !m_bPendingOperation); } ///////////////////////////////////////////////////////////////////////////// // CPrinterPage message handlers BOOL CPrinterPage::OnInitDialog() { CPropertyPage::OnInitDialog(); // Prepare the Printer Information list control m_PrinterInformationListCtrl.InsertColumn(0, TEXT("Attribute"), LVCFMT_LEFT, 150, 0); m_PrinterInformationListCtrl.InsertColumn(1, TEXT("Value"), LVCFMT_LEFT, 100, 1); m_PrinterInformationListCtrl.SetExtendedStyle(m_PrinterInformationListCtrl.GetExtendedStyle() | LVS_EX_FULLROWSELECT | LVS_EX_CHECKBOXES); m_PrinterInformationListCtrl.InsertItem(0, TEXT("Printer Status")); m_PrinterInformationListCtrl.InsertItem(1, TEXT("Printer Status Info")); m_PrinterInformationListCtrl.InsertItem(2, TEXT("Printer Name")); m_PrinterInformationListCtrl.InsertItem(3, TEXT("Manufacturer")); m_PrinterInformationListCtrl.InsertItem(4, TEXT("Manufacturer Model Name")); m_PrinterInformationListCtrl.InsertItem(5, TEXT("Device Serial Number")); m_PrinterInformationListCtrl.InsertItem(6, TEXT("Software Versions")); m_PrinterInformationListCtrl.InsertItem(7, TEXT("Date of Last Calibration")); m_PrinterInformationListCtrl.InsertItem(8, TEXT("Time of Last Calibration")); m_PrinterInformationListCtrl.SetCheck(0); // Printer Status m_PrinterInformationListCtrl.SetCheck(1); // Printer Status Info m_PrinterInformationListCtrl.SetCheck(2); // Printer Name m_PrinterInformationListCtrl.SetCheck(3); // Manufacturer // END: Prepare the Printer Information list control // Prepare the Notifications list control m_NotificationsListCtrl.InsertColumn(0, TEXT("Event Type"), LVCFMT_LEFT, 70, 0); m_NotificationsListCtrl.InsertColumn(1, TEXT("Printer Status Info"), LVCFMT_LEFT, 100, 1); m_NotificationsListCtrl.InsertColumn(2, TEXT("Film Destination"), LVCFMT_LEFT, 90, 2); m_NotificationsListCtrl.InsertColumn(3, TEXT("Printer Name"), LVCFMT_LEFT, 80, 3); m_NotificationsListCtrl.SetExtendedStyle(m_NotificationsListCtrl.GetExtendedStyle() | LVS_EX_FULLROWSELECT); return TRUE; } BOOL CPrinterPage::OnSetActive() { if (m_bReset) { Reset(); } UpdateControlsState(); return CPropertyPage::OnSetActive(); } void CPrinterPage::OnButtonGet() { CPrintScuSheet& PrintScuSheet = *((CPrintScuSheet*) GetParent()); CPrintSCU& PrintSCU = PrintScuSheet.m_PrintSCU; int iCount = m_PrinterInformationListCtrl.GetItemCount(); for (int i = 0; i < iCount; i++) { m_PrinterInformationListCtrl.SetItemText(i, 1, TEXT("")); } // The required printer info PRINTERINFO PrinterInfo; PrinterInfo.uStructSize = sizeof(PRINTERINFO); SPECIFY_ATTRIB(m_PrinterInformationListCtrl, 0, PrinterInfo.szPrinterStatus); SPECIFY_ATTRIB(m_PrinterInformationListCtrl, 1, PrinterInfo.szPrinterStatusInfo); SPECIFY_ATTRIB(m_PrinterInformationListCtrl, 2, PrinterInfo.szPrinterName); SPECIFY_ATTRIB(m_PrinterInformationListCtrl, 3, PrinterInfo.szManufacturer); SPECIFY_ATTRIB(m_PrinterInformationListCtrl, 4, PrinterInfo.szManufacturerModelName); SPECIFY_ATTRIB(m_PrinterInformationListCtrl, 5, PrinterInfo.szDeviceSerialNumber); SPECIFY_ATTRIB(m_PrinterInformationListCtrl, 6, PrinterInfo.szSoftwareVersions); SPECIFY_ATTRIB(m_PrinterInformationListCtrl, 7, PrinterInfo.szDateOfLastCalibration); SPECIFY_ATTRIB(m_PrinterInformationListCtrl, 8, PrinterInfo.szTimeOfLastCalibration); PrintScuSheet.FlagPendingOperation(); L_INT iRet = PrintSCU.GetPrinterInfo(&PrinterInfo, TRUE, FALSE); if (iRet != DICOM_SUCCESS) { PrintScuSheet.DisplayError(iRet); PrintScuSheet.FlagPendingOperation(FALSE); return; } PrintSCU.GetPrinterInfo(&PrinterInfo, sizeof(PRINTERINFO)); m_PrinterInformationListCtrl.SetItemText(0, 1, PrinterInfo.szPrinterStatus); m_PrinterInformationListCtrl.SetItemText(1, 1, PrinterInfo.szPrinterStatusInfo); m_PrinterInformationListCtrl.SetItemText(2, 1, PrinterInfo.szPrinterName); m_PrinterInformationListCtrl.SetItemText(3, 1, PrinterInfo.szManufacturer); m_PrinterInformationListCtrl.SetItemText(4, 1, PrinterInfo.szManufacturerModelName); m_PrinterInformationListCtrl.SetItemText(5, 1, PrinterInfo.szDeviceSerialNumber); m_PrinterInformationListCtrl.SetItemText(6, 1, PrinterInfo.szSoftwareVersions); m_PrinterInformationListCtrl.SetItemText(7, 1, PrinterInfo.szDateOfLastCalibration); m_PrinterInformationListCtrl.SetItemText(8, 1, PrinterInfo.szTimeOfLastCalibration); PrintScuSheet.FlagPendingOperation(FALSE); } void CPrinterPage::OnButtonGetConfig() { CPrintScuSheet& PrintScuSheet = *((CPrintScuSheet*) GetParent()); CPrintSCU& PrintSCU = PrintScuSheet.m_PrintSCU; m_PrinterConfigTree.DeleteAllItems(); SetDlgItemText(IDC_EDIT_VALUE, TEXT("")); PrintScuSheet.FlagPendingOperation(); L_INT iRet = PrintSCU.GetPrinterConfiguration(); if (iRet != DICOM_SUCCESS) { PrintScuSheet.DisplayError(iRet); PrintScuSheet.FlagPendingOperation(FALSE); return; } PrintScuSheet.FlagPendingOperation(FALSE); pDICOMELEMENT pPrnConfigItem, pElement; HTREEITEM hPrnConfigItemTreeItem, hElementTreeItem; pDICOMTAG pTag; // Display the retrieved configuration info LDicomDS& PrnConfig = PrintSCU.m_PrinterConfiguration; pElement = PrnConfig.FindFirstElement(NULL, TAG_PRINTER_CONFIGURATION_SEQUENCE, FALSE); if (!pElement) return; pPrnConfigItem = PrnConfig.GetChildElement(pElement, TRUE); while (pPrnConfigItem) { hPrnConfigItemTreeItem = m_PrinterConfigTree.InsertItem(TEXT("Printer Configuration Item")); m_PrinterConfigTree.SetItemData(hPrnConfigItemTreeItem, 0); pElement = PrnConfig.GetChildElement(pPrnConfigItem, TRUE); while (pElement) { pTag = LDicomTag::Find(pElement->nTag); if (pTag) { hElementTreeItem = m_PrinterConfigTree.InsertItem(pTag->pszName, hPrnConfigItemTreeItem); if (pElement->nLength == ELEMENT_LENGTH_MAX) { m_PrinterConfigTree.SetItemData(hElementTreeItem, 0); DisplaySequence(PrnConfig, pElement, hElementTreeItem); } else { m_PrinterConfigTree.SetItemData(hElementTreeItem, DWORD(pElement)); } } pElement = PrnConfig.GetNextElement(pElement, TRUE, TRUE); } pPrnConfigItem = PrnConfig.GetNextElement(pPrnConfigItem, TRUE, TRUE); } hPrnConfigItemTreeItem = m_PrinterConfigTree.GetRootItem(); if (hPrnConfigItemTreeItem) { m_PrinterConfigTree.SelectItem(hPrnConfigItemTreeItem); m_PrinterConfigTree.SetFocus(); } } void CPrinterPage::OnSelChangedTreeConfig(NMHDR* pNMHDR, LRESULT* pResult) { NM_TREEVIEW* pNMTreeView = (NM_TREEVIEW*) pNMHDR; SetDlgItemText(IDC_EDIT_VALUE, TEXT("")); LDicomDS& PrnConfig = ((CPrintScuSheet*) GetParent())->m_PrintSCU.m_PrinterConfiguration; pDICOMELEMENT pElement; pElement = (pDICOMELEMENT) m_PrinterConfigTree.GetItemData(pNMTreeView->itemNew.hItem); if (!pElement || !PrnConfig.ExistsElement(pElement)) return; L_UINT32 uLength = PrnConfig.GetConvertValue(pElement, NULL); if (uLength == 0) return; L_CHAR* pszValue = new L_CHAR[uLength]; if (!pszValue) { PrnConfig.FreeValue(pElement); return; } PrnConfig.GetConvertValue(pElement, pszValue); PrnConfig.FreeValue(pElement); SetDlgItemText(IDC_EDIT_VALUE, pszValue); delete [] pszValue; *pResult = 0; }