// BPrnPage.cpp : implementation file // #include "stdafx.h" #include "cldprn32.h" #include "BPrnPage.h" #include "PrnSheet.h" #include "PJobPage.h" #include "IBDlg.h" #include "ABDlg.h" #include "LUTDlg.h" #include "OBDlg.h" #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif #define CREATE_FILM_SESSION_LABEL TEXT("&Create Film Session...") #define CREATE_FILM_BOX_LABEL TEXT("&Create Film Box...") #define ITEMTYPE_NO_OPERATIONS 0 #define ITEMTYPE_FILM_SESSION 1 #define ITEMTYPE_FILM_BOX 2 #define ITEMTYPE_IMAGE_BOX 3 #define ITEMTYPE_ANNOTATION_BOX 4 ///////////////////////////////////////////////////////////////////////////// // CBasicPrintPage property page IMPLEMENT_DYNCREATE(CBasicPrintPage, CPropertyPage) CBasicPrintPage::CBasicPrintPage() : CPropertyPage(CBasicPrintPage::IDD), m_FilmBoxDlg(m_PresentationLUTsTree), m_bGrayscalePrintManagement(TRUE), m_hCurrentFilmBoxItem(NULL), m_ImageBoxes(NULL), m_iImageBoxesCount(0), m_AnnotationBoxes(NULL), m_iAnnotationBoxesCount(0), m_bReset(FALSE), m_bPendingOperation(FALSE) { //{{AFX_DATA_INIT(CBasicPrintPage) //}}AFX_DATA_INIT } CBasicPrintPage::~CBasicPrintPage() { if (m_ImageBoxes) delete [] m_ImageBoxes; if (m_AnnotationBoxes) delete [] m_AnnotationBoxes; } void CBasicPrintPage::DoDataExchange(CDataExchange* pDX) { CPropertyPage::DoDataExchange(pDX); //{{AFX_DATA_MAP(CBasicPrintPage) DDX_Control(pDX, IDC_TREE_OVERLAYS, m_OverlayBoxesTree); DDX_Control(pDX, IDC_TREE_LUTS, m_PresentationLUTsTree); DDX_Control(pDX, IDC_TREE_PRINTSESSION, m_PrintSessionTree); //}}AFX_DATA_MAP } BEGIN_MESSAGE_MAP(CBasicPrintPage, CPropertyPage) //{{AFX_MSG_MAP(CBasicPrintPage) ON_BN_CLICKED(IDC_BUTTON_CREATE, OnButtonCreate) ON_BN_CLICKED(IDC_BUTTON_UPDATE, OnButtonUpdate) ON_NOTIFY(TVN_SELCHANGED, IDC_TREE_PRINTSESSION, OnSelChangedTreePrintSession) ON_BN_CLICKED(IDC_BUTTON_PRINT, OnButtonPrint) ON_BN_CLICKED(IDC_BUTTON_DELETE, OnButtonDelete) ON_NOTIFY(NM_DBLCLK, IDC_TREE_PRINTSESSION, OnDblClkTreePrintSession) ON_BN_CLICKED(IDC_BUTTON_CREATELUT, OnButtonCreateLUT) ON_NOTIFY(TVN_ENDLABELEDIT, IDC_TREE_LUTS, OnEndLabelEditTreeLUTs) ON_NOTIFY(TVN_ENDLABELEDIT, IDC_TREE_OVERLAYS, OnEndLabelEditTreeOverlays) ON_WM_DESTROY() ON_BN_CLICKED(IDC_BUTTON_DELETELUT, OnButtonDeleteLUT) ON_BN_CLICKED(IDC_BUTTON_CREATEOVERLAY, OnButtonCreateOverlay) ON_BN_CLICKED(IDC_BUTTON_UPDATEOVERLAY, OnButtonUpdateOverlay) ON_BN_CLICKED(IDC_BUTTON_DELETEOVERLAY, OnButtonDeleteOverlay) //}}AFX_MSG_MAP END_MESSAGE_MAP() void CBasicPrintPage::ClearPrintSessionTree() { FreeCurrentFilmBox(); m_PrintSessionTree.DeleteAllItems(); } void CBasicPrintPage::ClearPresentationLUTsTree() { HTREEITEM hItem = m_PresentationLUTsTree.GetRootItem(); while (hItem) { delete [] LPTSTR(m_PresentationLUTsTree.GetItemData(hItem)); hItem = m_PresentationLUTsTree.GetNextItem(hItem, TVGN_NEXT); } m_PresentationLUTsTree.DeleteAllItems(); } void CBasicPrintPage::ClearOverlayBoxesTree() { HTREEITEM hItem = m_OverlayBoxesTree.GetRootItem(); while (hItem) { delete ((CImageOverlayBox*) m_OverlayBoxesTree.GetItemData(hItem)); hItem = m_OverlayBoxesTree.GetNextItem(hItem, TVGN_NEXT); } m_OverlayBoxesTree.DeleteAllItems(); } void CBasicPrintPage::Reset() { ClearPrintSessionTree(); ClearPresentationLUTsTree(); ClearOverlayBoxesTree(); m_bReset = FALSE; } void CBasicPrintPage::UpdateControlsState() { CPrintSCU& PrintSCU = ((CPrintScuSheet*) GetParent())->m_PrintSCU; BOOL bGrayscaleColorPMSupported = PrintSCU.IsClassSupported(PRINTSCU_BASIC_GRAYSCALE_PM_META_SOP_CLASS) || PrintSCU.IsClassSupported(PRINTSCU_BASIC_COLOR_PM_META_SOP_CLASS); BOOL bFilmSessionCreated = (m_PrintSessionTree.GetRootItem() != NULL); BOOL bPresLUTSupported = PrintSCU.IsClassSupported(PRINTSCU_PRESENTATION_LUT_SOP_CLASS); BOOL bPresLUTCreated = (m_PresentationLUTsTree.GetRootItem() != NULL); BOOL bOverlayBoxesSupported = PrintSCU.IsClassSupported(PRINTSCU_BASIC_PRINT_IMAGE_OVERLAY_BOX_SOP_CLASS); BOOL bOverlayBoxCreated = (m_OverlayBoxesTree.GetRootItem() != NULL); // Basic Print Management controls m_PrintSessionTree.EnableWindow(bGrayscaleColorPMSupported); SetDlgItemText(IDC_BUTTON_CREATE, bFilmSessionCreated ? CREATE_FILM_BOX_LABEL : CREATE_FILM_SESSION_LABEL); GetDlgItem(IDC_BUTTON_CREATE)->EnableWindow(bGrayscaleColorPMSupported && !m_bPendingOperation); if (bGrayscaleColorPMSupported && !m_bPendingOperation && bFilmSessionCreated) { UpdateBasicPMControlsState(); } else { GetDlgItem(IDC_BUTTON_PRINT)->EnableWindow(FALSE); GetDlgItem(IDC_BUTTON_UPDATE)->EnableWindow(FALSE); GetDlgItem(IDC_BUTTON_DELETE)->EnableWindow(FALSE); } // Presentation LUT controls m_PresentationLUTsTree.EnableWindow(bPresLUTSupported); GetDlgItem(IDC_BUTTON_CREATELUT)->EnableWindow(bPresLUTSupported && !m_bPendingOperation); GetDlgItem(IDC_BUTTON_DELETELUT)->EnableWindow(bPresLUTSupported && !m_bPendingOperation && bPresLUTCreated); // Image Overlay Box controls m_OverlayBoxesTree.EnableWindow(bOverlayBoxesSupported); GetDlgItem(IDC_BUTTON_CREATEOVERLAY)->EnableWindow(bOverlayBoxesSupported && !m_bPendingOperation); GetDlgItem(IDC_BUTTON_UPDATEOVERLAY)->EnableWindow(bOverlayBoxesSupported && !m_bPendingOperation && bOverlayBoxCreated); GetDlgItem(IDC_BUTTON_DELETEOVERLAY)->EnableWindow(bOverlayBoxesSupported && !m_bPendingOperation && bOverlayBoxCreated); } void CBasicPrintPage::UpdateBasicPMControlsState() { HTREEITEM hSelectedItem = m_PrintSessionTree.GetSelectedItem(); if (!hSelectedItem) return; DWORD dwItemType = m_PrintSessionTree.GetItemData(hSelectedItem); BOOL bFilmSessionOrBox = (dwItemType == ITEMTYPE_FILM_SESSION) || (dwItemType == ITEMTYPE_FILM_BOX); GetDlgItem(IDC_BUTTON_PRINT)->EnableWindow(bFilmSessionOrBox); GetDlgItem(IDC_BUTTON_UPDATE)->EnableWindow(dwItemType != ITEMTYPE_NO_OPERATIONS); GetDlgItem(IDC_BUTTON_DELETE)->EnableWindow(bFilmSessionOrBox); } void CBasicPrintPage::FreeCurrentFilmBox(BOOL bDeleteFilmBox) { // Free the arrays of Image Boxes and Annotation Boxes if (m_ImageBoxes) { delete [] m_ImageBoxes; m_ImageBoxes = NULL; m_iImageBoxesCount = 0; } if (m_AnnotationBoxes) { delete [] m_AnnotationBoxes; m_AnnotationBoxes = NULL; m_iAnnotationBoxesCount = 0; } if (!m_hCurrentFilmBoxItem) return; if (bDeleteFilmBox) { m_PrintSessionTree.DeleteItem(m_hCurrentFilmBoxItem); m_hCurrentFilmBoxItem = NULL; return; } // This Film Box cannot be updated, printed, or deleted any longer m_PrintSessionTree.SetItemData(m_hCurrentFilmBoxItem, ITEMTYPE_NO_OPERATIONS); // Image Boxes and Annotation Boxes that belong to this Film Box cannot be updated // any longer HTREEITEM hItem = m_PrintSessionTree.GetChildItem(m_hCurrentFilmBoxItem); while (hItem) { m_PrintSessionTree.SetItemData(hItem, ITEMTYPE_NO_OPERATIONS); hItem = m_PrintSessionTree.GetNextItem(hItem, TVGN_NEXT); } m_hCurrentFilmBoxItem = NULL; } ///////////////////////////////////////////////////////////////////////////// // CBasicPrintPage message handlers BOOL CBasicPrintPage::OnSetActive() { if (m_bReset) { Reset(); } UpdateControlsState(); return CPropertyPage::OnSetActive(); } void CBasicPrintPage::OnDestroy() { CPropertyPage::OnDestroy(); ClearPresentationLUTsTree(); ClearOverlayBoxesTree(); } // This is to create either a Film Session or a Film Box void CBasicPrintPage::OnButtonCreate() { CPrintScuSheet& PrintScuSheet = *((CPrintScuSheet*) GetParent()); CPrintSCU& PrintSCU = PrintScuSheet.m_PrintSCU; // We will use the label of the button to decide whether we should proceed in creating // a Film Session or in creating a Film Box CString sButtonLabel; GetDlgItemText(IDC_BUTTON_CREATE, sButtonLabel); if (sButtonLabel == CREATE_FILM_SESSION_LABEL) { /* --- Create a Film Session --- */ m_FilmSessionDlg.m_bCreationMode = TRUE; BOOL bGrayscalePM = PrintSCU.IsClassSupported(PRINTSCU_BASIC_GRAYSCALE_PM_META_SOP_CLASS); BOOL bColorPM = PrintSCU.IsClassSupported(PRINTSCU_BASIC_COLOR_PM_META_SOP_CLASS); m_FilmSessionDlg.m_bGrayscalePrintManagement = bGrayscalePM; m_FilmSessionDlg.m_bEnablePrintManagementCheckBox = bGrayscalePM && bColorPM; m_FilmSessionDlg.SetDefaults(); // Display the dialog box if (m_FilmSessionDlg.DoModal() != IDOK) { return; } ClearPrintSessionTree(); m_bGrayscalePrintManagement = m_FilmSessionDlg.m_bGrayscalePrintManagement; FILMSESSIONPARAMETERS Parameters; Parameters.uStructSize = sizeof(FILMSESSIONPARAMETERS); SET_NPARAM(Parameters.nNumberOfCopies, m_FilmSessionDlg.m_NumberOfCopiesChkBox, m_FilmSessionDlg.m_iNumberOfCopies); SET_SPARAM(Parameters.pszPrintPriority, m_FilmSessionDlg.m_PrintPriorityChkBox, m_FilmSessionDlg.m_sPrintPriority); SET_SPARAM(Parameters.pszMediumType, m_FilmSessionDlg.m_MediumTypeChkBox, m_FilmSessionDlg.m_sMediumType); SET_SPARAM(Parameters.pszFilmDestination, m_FilmSessionDlg.m_FilmDestinationChkBox, m_FilmSessionDlg.m_sFilmDestination); SET_SPARAM(Parameters.pszFilmSessionLabel, m_FilmSessionDlg.m_FilmSessionLabelChkBox, m_FilmSessionDlg.m_sFilmSessionLabel); SET_NPARAM(Parameters.nMemoryAllocation, m_FilmSessionDlg.m_MemoryAllocationChkBox, m_FilmSessionDlg.m_iMemoryAllocation); SET_SPARAM(Parameters.pszOwnerID, m_FilmSessionDlg.m_OwnerIDChkBox, m_FilmSessionDlg.m_sOwnerID); PrintScuSheet.FlagPendingOperation(); // Now ask the Print SCP to create a Film Session L_INT iRet = PrintSCU.CreateFilmSession(&Parameters, !m_bGrayscalePrintManagement); if (iRet != DICOM_SUCCESS) { PrintScuSheet.DisplayError(iRet); PrintScuSheet.FlagPendingOperation(FALSE); return; } // Add a Film Session item to the tree control HTREEITEM hFilmSessionItem; hFilmSessionItem = m_PrintSessionTree.InsertItem(TEXT("Film Session [Empty]")); m_PrintSessionTree.SetItemData(hFilmSessionItem, ITEMTYPE_FILM_SESSION); m_PrintSessionTree.SelectItem(hFilmSessionItem); PrintScuSheet.FlagPendingOperation(FALSE); } else { /* --- Create a Film Box --- */ m_FilmBoxDlg.m_bCreationMode = TRUE; m_FilmBoxDlg.m_bEnableAnnotationDisplayFormatID = PrintSCU.IsClassSupported(PRINTSCU_BASIC_ANNOTATION_BOX_SOP_CLASS); m_FilmBoxDlg.SetDefaults(); // Display the dialog box if (m_FilmBoxDlg.DoModal() != IDOK) { return; } FreeCurrentFilmBox(FALSE); FILMBOXPARAMETERS Parameters; Parameters.uStructSize = sizeof(FILMBOXPARAMETERS); L_PCSTR pszRefPresLUT; Parameters.pszImageDisplayFormat = m_FilmBoxDlg.m_sImageDisplayFormat; SET_SPARAM(Parameters.pszFilmOrientation, m_FilmBoxDlg.m_FilmOrientationChkBox, m_FilmBoxDlg.m_sFilmOrientation); SET_SPARAM(Parameters.pszFilmSizeID, m_FilmBoxDlg.m_FilmSizeIDChkBox, m_FilmBoxDlg.m_sFilmSizeID); SET_SPARAM(Parameters.pszMagnificationType, m_FilmBoxDlg.m_MagnificationTypeChkBox, m_FilmBoxDlg.m_sMagnificationType); SET_NPARAM(Parameters.nMaxDensity, m_FilmBoxDlg.m_MaxDensityChkBox, m_FilmBoxDlg.m_iMaxDensity); SET_SPARAM(Parameters.pszConfigurationInformation, m_FilmBoxDlg.m_ConfigurationInformationChkBox, m_FilmBoxDlg.m_sConfigurationInformation); SET_SPARAM(Parameters.pszAnnotationDisplayFormatID, m_FilmBoxDlg.m_AnnotationDisplayFormatIDChkBox, m_FilmBoxDlg.m_sAnnotationDisplayFormatID); SET_SPARAM(Parameters.pszSmoothingType, m_FilmBoxDlg.m_SmoothingTypeChkBox, m_FilmBoxDlg.m_sSmoothingType); SET_SPARAM(Parameters.pszBorderDensity, m_FilmBoxDlg.m_BorderDensityChkBox, m_FilmBoxDlg.m_sBorderDensity); SET_SPARAM(Parameters.pszEmptyImageDensity, m_FilmBoxDlg.m_EmptyImageDensityChkBox, m_FilmBoxDlg.m_sEmptyImageDensity); SET_NPARAM(Parameters.nMinDensity, m_FilmBoxDlg.m_MinDensityChkBox, m_FilmBoxDlg.m_iMinDensity); SET_SPARAM(Parameters.pszTrim, m_FilmBoxDlg.m_TrimChkBox, m_FilmBoxDlg.m_sTrim); SET_NPARAM(Parameters.nIllumination, m_FilmBoxDlg.m_IlluminationChkBox, m_FilmBoxDlg.m_iIllumination); SET_NPARAM(Parameters.nReflectedAmbientLight, m_FilmBoxDlg.m_ReflectedAmbientLightChkBox, m_FilmBoxDlg.m_iReflectedAmbientLight); SET_SPARAM(Parameters.pszRequestedResolutionID, m_FilmBoxDlg.m_RequestedResolutionIDChkBox, m_FilmBoxDlg.m_sRequestedResolutionID); SET_SPARAM(pszRefPresLUT, m_FilmBoxDlg.m_ReferencedPresentationLUTChkBox, m_FilmBoxDlg.m_sReferencedPresentationLUT); PrintScuSheet.FlagPendingOperation(); // Now ask the Print SCP to create a Film Box L_INT iRet = PrintSCU.CreateFilmBox(&Parameters, pszRefPresLUT); if (iRet != DICOM_SUCCESS) { PrintScuSheet.DisplayError(iRet); PrintScuSheet.FlagPendingOperation(FALSE); return; } HTREEITEM hFilmSessionItem = m_PrintSessionTree.GetRootItem(); m_PrintSessionTree.SetItemText(hFilmSessionItem, TEXT("Film Session")); // Add a Film Box item to the tree control m_hCurrentFilmBoxItem = m_PrintSessionTree.InsertItem(TEXT("Film Box"), hFilmSessionItem); m_PrintSessionTree.SetItemData(m_hCurrentFilmBoxItem, ITEMTYPE_FILM_BOX); PrintScuSheet.FlagPendingOperation(FALSE); // Add Image Box items to the tree control m_iImageBoxesCount = PrintSCU.GetImageBoxesCount(); if (m_iImageBoxesCount) { m_ImageBoxes = new CImageBox[m_iImageBoxesCount]; if (!m_ImageBoxes) { PrintScuSheet.DisplayError(DICOM_ERROR_MEMORY); m_iImageBoxesCount = 0; return; } HTREEITEM hImageBoxItem; CString sItemText; for (int i = 0; i < m_iImageBoxesCount; i++) { sItemText.Format(TEXT("Image Box %i"), i + 1); hImageBoxItem = m_PrintSessionTree.InsertItem(sItemText, m_hCurrentFilmBoxItem); m_PrintSessionTree.SetItemData(hImageBoxItem, ITEMTYPE_IMAGE_BOX); m_ImageBoxes[i].m_hItem = hImageBoxItem; m_ImageBoxes[i].m_sImageBoxInstanceUID = PrintSCU.GetImageBoxInstanceUID(i); m_ImageBoxes[i].m_uImagePosition = i + 1; } PrintSCU.FreeImageBoxesInstanceUIDs(); } // Add Annotation Box items to the tree control m_iAnnotationBoxesCount = PrintSCU.GetAnnotationBoxesCount(); if (m_iAnnotationBoxesCount) { m_AnnotationBoxes = new CAnnotationBox[m_iAnnotationBoxesCount]; if (!m_AnnotationBoxes) { PrintScuSheet.DisplayError(DICOM_ERROR_MEMORY); m_iAnnotationBoxesCount = 0; return; } HTREEITEM hAnnotationBoxItem; CString sItemText; for (int i = 0; i < m_iAnnotationBoxesCount; i++) { sItemText.Format(TEXT("Annotation Box %i"), i + 1); hAnnotationBoxItem = m_PrintSessionTree.InsertItem(sItemText, m_hCurrentFilmBoxItem); m_PrintSessionTree.SetItemData(hAnnotationBoxItem, ITEMTYPE_ANNOTATION_BOX); m_AnnotationBoxes[i].m_hItem = hAnnotationBoxItem; m_AnnotationBoxes[i].m_sAnnotationBoxInstanceUID = PrintSCU.GetAnnotationBoxInstanceUID(i); m_AnnotationBoxes[i].m_uAnnotationPosition = i + 1; } PrintSCU.FreeAnnotationBoxesInstanceUIDs(); } m_PrintSessionTree.Expand(m_hCurrentFilmBoxItem, TVE_EXPAND); m_PrintSessionTree.SelectItem(m_hCurrentFilmBoxItem); } } // This is to update a Film Session, a Film Box, an Image Box, or an Annotation Box void CBasicPrintPage::OnButtonUpdate() { CPrintScuSheet& PrintScuSheet = *((CPrintScuSheet*) GetParent()); CPrintSCU& PrintSCU = PrintScuSheet.m_PrintSCU; HTREEITEM hSelectedItem = m_PrintSessionTree.GetSelectedItem(); if (!hSelectedItem) return; L_INT iRet; switch (m_PrintSessionTree.GetItemData(hSelectedItem)) { case ITEMTYPE_FILM_SESSION: m_FilmSessionDlg.m_bCreationMode = FALSE; // Display the dialog box if (m_FilmSessionDlg.DoModal() != IDOK) { return; } FILMSESSIONPARAMETERS FSParameters; FSParameters.uStructSize = sizeof(FILMSESSIONPARAMETERS); SET_NPARAM(FSParameters.nNumberOfCopies, m_FilmSessionDlg.m_NumberOfCopiesChkBox, m_FilmSessionDlg.m_iNumberOfCopies); SET_SPARAM(FSParameters.pszPrintPriority, m_FilmSessionDlg.m_PrintPriorityChkBox, m_FilmSessionDlg.m_sPrintPriority); SET_SPARAM(FSParameters.pszMediumType, m_FilmSessionDlg.m_MediumTypeChkBox, m_FilmSessionDlg.m_sMediumType); SET_SPARAM(FSParameters.pszFilmDestination, m_FilmSessionDlg.m_FilmDestinationChkBox, m_FilmSessionDlg.m_sFilmDestination); SET_SPARAM(FSParameters.pszFilmSessionLabel, m_FilmSessionDlg.m_FilmSessionLabelChkBox, m_FilmSessionDlg.m_sFilmSessionLabel); SET_NPARAM(FSParameters.nMemoryAllocation, m_FilmSessionDlg.m_MemoryAllocationChkBox, m_FilmSessionDlg.m_iMemoryAllocation); SET_SPARAM(FSParameters.pszOwnerID, m_FilmSessionDlg.m_OwnerIDChkBox, m_FilmSessionDlg.m_sOwnerID); PrintScuSheet.FlagPendingOperation(); // Now ask the Print SCP to update the Film Session iRet = PrintSCU.UpdateFilmSession(&FSParameters); if (iRet != DICOM_SUCCESS) { PrintScuSheet.DisplayError(iRet); PrintScuSheet.FlagPendingOperation(FALSE); return; } PrintScuSheet.FlagPendingOperation(FALSE); break; case ITEMTYPE_FILM_BOX: m_FilmBoxDlg.m_bCreationMode = FALSE; // Display the dialog box if (m_FilmBoxDlg.DoModal() != IDOK) { return; } FILMBOXPARAMETERS FBParameters; L_PCSTR pszRefPresLUT; memset(&FBParameters, 0, sizeof(FILMBOXPARAMETERS)); FBParameters.uStructSize = sizeof(FILMBOXPARAMETERS); SET_SPARAM(FBParameters.pszMagnificationType, m_FilmBoxDlg.m_MagnificationTypeChkBox, m_FilmBoxDlg.m_sMagnificationType); SET_NPARAM(FBParameters.nMaxDensity, m_FilmBoxDlg.m_MaxDensityChkBox, m_FilmBoxDlg.m_iMaxDensity); SET_SPARAM(FBParameters.pszConfigurationInformation, m_FilmBoxDlg.m_ConfigurationInformationChkBox, m_FilmBoxDlg.m_sConfigurationInformation); SET_SPARAM(FBParameters.pszSmoothingType, m_FilmBoxDlg.m_SmoothingTypeChkBox, m_FilmBoxDlg.m_sSmoothingType); SET_SPARAM(FBParameters.pszBorderDensity, m_FilmBoxDlg.m_BorderDensityChkBox, m_FilmBoxDlg.m_sBorderDensity); SET_SPARAM(FBParameters.pszEmptyImageDensity, m_FilmBoxDlg.m_EmptyImageDensityChkBox, m_FilmBoxDlg.m_sEmptyImageDensity); SET_NPARAM(FBParameters.nMinDensity, m_FilmBoxDlg.m_MinDensityChkBox, m_FilmBoxDlg.m_iMinDensity); SET_SPARAM(FBParameters.pszTrim, m_FilmBoxDlg.m_TrimChkBox, m_FilmBoxDlg.m_sTrim); SET_NPARAM(FBParameters.nIllumination, m_FilmBoxDlg.m_IlluminationChkBox, m_FilmBoxDlg.m_iIllumination); SET_NPARAM(FBParameters.nReflectedAmbientLight, m_FilmBoxDlg.m_ReflectedAmbientLightChkBox, m_FilmBoxDlg.m_iReflectedAmbientLight); SET_SPARAM(pszRefPresLUT, m_FilmBoxDlg.m_ReferencedPresentationLUTChkBox, m_FilmBoxDlg.m_sReferencedPresentationLUT); PrintScuSheet.FlagPendingOperation(); // Now ask the Print SCP to update the current Film Box iRet = PrintSCU.UpdateFilmBox(&FBParameters, pszRefPresLUT); if (iRet != DICOM_SUCCESS) { PrintScuSheet.DisplayError(iRet); PrintScuSheet.FlagPendingOperation(FALSE); return; } PrintScuSheet.FlagPendingOperation(FALSE); break; case ITEMTYPE_IMAGE_BOX: { if (!m_ImageBoxes) return; for (int i = 0; i < m_iImageBoxesCount; i++) { if (m_ImageBoxes[i].m_hItem == hSelectedItem) break; } if (i >= m_iImageBoxesCount) { return; } CImageBoxDlg ImageBoxDlg(m_ImageBoxes[i], m_PresentationLUTsTree, m_OverlayBoxesTree); ImageBoxDlg.m_bGrayscaleImageBox = m_bGrayscalePrintManagement; // Display the dialog box if (ImageBoxDlg.DoModal() != IDOK) { return; } LDicomDS Image; int iLength = m_ImageBoxes[i].m_sImageFilename.GetLength(); if (iLength) { iRet = Image.LoadDS((L_CHAR*)(LPCTSTR) m_ImageBoxes[i].m_sImageFilename, 0); if (iRet != DICOM_SUCCESS) { PrintScuSheet.DisplayError(iRet); return; } } IMAGEBOXPARAMETERS IBParameters; IBParameters.uStructSize = sizeof(IMAGEBOXPARAMETERS); L_PCSTR pszRefPresLUT; L_PCSTR pszRefImageOverlayBox; IBParameters.nImagePosition = m_ImageBoxes[i].m_uImagePosition; SET_SPARAM(IBParameters.pszPolarity, ImageBoxDlg.m_PolarityChkBox, m_ImageBoxes[i].m_sPolarity); SET_SPARAM(IBParameters.pszMagnificationType, ImageBoxDlg.m_MagnificationTypeChkBox, m_ImageBoxes[i].m_sMagnificationType); SET_SPARAM(IBParameters.pszSmoothingType, ImageBoxDlg.m_SmoothingTypeChkBox, m_ImageBoxes[i].m_sSmoothingType); SET_NPARAM(IBParameters.nMinDensity, ImageBoxDlg.m_MinDensityChkBox, m_ImageBoxes[i].m_iMinDensity); SET_NPARAM(IBParameters.nMaxDensity, ImageBoxDlg.m_MaxDensityChkBox, m_ImageBoxes[i].m_iMaxDensity); SET_SPARAM(IBParameters.pszConfigurationInformation, ImageBoxDlg.m_ConfigurationInformationChkBox, m_ImageBoxes[i].m_sConfigurationInformation); SET_NPARAM(IBParameters.dRequestedImageSize, ImageBoxDlg.m_RequestedImageSizeChkBox, m_ImageBoxes[i].m_dRequestedImageSize); SET_SPARAM(IBParameters.pszRequestedDecimateCropBehavior, ImageBoxDlg.m_ReqDecimateCropBehaviorChkBox, m_ImageBoxes[i].m_sRequestedDecimateCropBehavior); SET_SPARAM(pszRefPresLUT, ImageBoxDlg.m_ReferencedPresentationLUTChkBox, m_ImageBoxes[i].m_sRefPresLUTInstanceUID); SET_SPARAM(pszRefImageOverlayBox, ImageBoxDlg.m_ReferencedImageOverlayBoxChkBox, m_ImageBoxes[i].m_sRefImageOverlayBoxInstanceUID); PrintScuSheet.FlagPendingOperation(); // Now ask the Print SCP to update the Image Box iRet = PrintSCU.UpdateImageBox(m_ImageBoxes[i].m_sImageBoxInstanceUID, iLength ? &Image : NULL, &IBParameters, pszRefImageOverlayBox, pszRefPresLUT); if (iRet != DICOM_SUCCESS) { PrintScuSheet.DisplayError(iRet); PrintScuSheet.FlagPendingOperation(FALSE); return; } PrintScuSheet.FlagPendingOperation(FALSE); } break; case ITEMTYPE_ANNOTATION_BOX: { if (!m_AnnotationBoxes) return; for (int i = 0; i < m_iAnnotationBoxesCount; i++) { if (m_AnnotationBoxes[i].m_hItem == hSelectedItem) break; } if (i >= m_iAnnotationBoxesCount) { return; } CAnnotationBoxDlg AnnotationBoxDlg(m_AnnotationBoxes[i]); // Display the dialog box if (AnnotationBoxDlg.DoModal() != IDOK) { return; } L_PCSTR pszTextString; SET_SPARAM(pszTextString, AnnotationBoxDlg.m_TextStringChkBox, m_AnnotationBoxes[i].m_sTextString); PrintScuSheet.FlagPendingOperation(); // Now ask the Print SCP to update the Annotation Box iRet = PrintSCU.UpdateAnnotationBox(m_AnnotationBoxes[i].m_sAnnotationBoxInstanceUID, m_AnnotationBoxes[i].m_uAnnotationPosition, pszTextString); if (iRet != DICOM_SUCCESS) { PrintScuSheet.DisplayError(iRet); PrintScuSheet.FlagPendingOperation(FALSE); return; } PrintScuSheet.FlagPendingOperation(FALSE); } break; } } // This is to print either a Film Session or a Film Box void CBasicPrintPage::OnButtonPrint() { CPrintScuSheet& PrintScuSheet = *((CPrintScuSheet*) GetParent()); CPrintSCU& PrintSCU = PrintScuSheet.m_PrintSCU; HTREEITEM hSelectedItem = m_PrintSessionTree.GetSelectedItem(); if (!hSelectedItem) return; L_INT iRet; switch (m_PrintSessionTree.GetItemData(hSelectedItem)) { case ITEMTYPE_FILM_SESSION: PrintScuSheet.FlagPendingOperation(); // Ask the Print SCP to print all the Film Boxes of the Film Session iRet = PrintSCU.PrintFilmSession(); if (iRet != DICOM_SUCCESS) { PrintScuSheet.DisplayError(iRet); PrintScuSheet.FlagPendingOperation(FALSE); return; } PrintScuSheet.FlagPendingOperation(FALSE); // If the Print Job SOP Class is supported, then a Print Job SOP Instance UID should // have been sent by the Print SCP if (PrintSCU.IsClassSupported(PRINTSCU_PRINT_JOB_SOP_CLASS)) { PrintScuSheet.SetActivePage(&PrintScuSheet.m_PrintJobsPage); PrintScuSheet.m_PrintJobsPage.AddPrintJob(PrintSCU.GetPrintJobInstanceUID()); } break; case ITEMTYPE_FILM_BOX: PrintScuSheet.FlagPendingOperation(); // Ask the Print SCP to print the current Film Box iRet = PrintSCU.PrintFilmBox(); if (iRet != DICOM_SUCCESS) { PrintScuSheet.DisplayError(iRet); PrintScuSheet.FlagPendingOperation(FALSE); return; } PrintScuSheet.FlagPendingOperation(FALSE); // If the Print Job SOP Class is supported, then a Print Job SOP Instance UID should // have been sent by the Print SCP if (PrintSCU.IsClassSupported(PRINTSCU_PRINT_JOB_SOP_CLASS)) { PrintScuSheet.SetActivePage(&PrintScuSheet.m_PrintJobsPage); PrintScuSheet.m_PrintJobsPage.AddPrintJob(PrintSCU.GetPrintJobInstanceUID()); } break; } } // This is to delete either a Film Session or a Film Box void CBasicPrintPage::OnButtonDelete() { CPrintScuSheet& PrintScuSheet = *((CPrintScuSheet*) GetParent()); CPrintSCU& PrintSCU = PrintScuSheet.m_PrintSCU; HTREEITEM hSelectedItem = m_PrintSessionTree.GetSelectedItem(); if (!hSelectedItem) return; L_INT iRet; switch (m_PrintSessionTree.GetItemData(hSelectedItem)) { case ITEMTYPE_FILM_SESSION: PrintScuSheet.FlagPendingOperation(); // Ask the Print SCP to delete the Film Session iRet = PrintSCU.DeleteFilmSession(); if (iRet != DICOM_SUCCESS) { PrintScuSheet.DisplayError(iRet); PrintScuSheet.FlagPendingOperation(FALSE); return; } ClearPrintSessionTree(); PrintScuSheet.FlagPendingOperation(FALSE); break; case ITEMTYPE_FILM_BOX: PrintScuSheet.FlagPendingOperation(); // Ask the Print SCP to delete the current Film Box iRet = PrintSCU.DeleteFilmBox(); if (iRet != DICOM_SUCCESS) { PrintScuSheet.DisplayError(iRet); PrintScuSheet.FlagPendingOperation(FALSE); return; } FreeCurrentFilmBox(); PrintScuSheet.FlagPendingOperation(FALSE); break; } } void CBasicPrintPage::OnSelChangedTreePrintSession(NMHDR* pNMHDR, LRESULT* pResult) { if (GetDlgItem(IDC_BUTTON_CREATE)->IsWindowEnabled()) { UpdateBasicPMControlsState(); } *pResult = 0; } void CBasicPrintPage::OnDblClkTreePrintSession(NMHDR* pNMHDR, LRESULT* pResult) { if (GetDlgItem(IDC_BUTTON_UPDATE)->IsWindowEnabled()) { CPoint Point; ::GetCursorPos(&Point); m_PrintSessionTree.ScreenToClient(&Point); HTREEITEM hItem = m_PrintSessionTree.HitTest(Point); if (hItem && hItem == m_PrintSessionTree.GetSelectedItem()) { DWORD dwItemType = m_PrintSessionTree.GetItemData(hItem); if (dwItemType == ITEMTYPE_IMAGE_BOX || dwItemType == ITEMTYPE_ANNOTATION_BOX) { OnButtonUpdate(); } } } *pResult = 0; } void CBasicPrintPage::OnButtonCreateLUT() { CPresentationLUTDlg PresentationLUTDlg; // Display the dialog box if (PresentationLUTDlg.DoModal() != IDOK) { return; } CPrintScuSheet& PrintScuSheet = *((CPrintScuSheet*) GetParent()); CPrintSCU& PrintSCU = PrintScuSheet.m_PrintSCU; L_INT iRet; if (PresentationLUTDlg.m_bPresentationLUTShapeSelected) { PrintScuSheet.FlagPendingOperation(); // Ask the Print SCP to create a Presentation LUT iRet = PrintSCU.CreatePresentationLUT(NULL, PresentationLUTDlg.m_sPresentationLUTShape); } else { LDicomDS PresentationLUT; iRet = PresentationLUT.LoadDS((L_CHAR*)(LPCTSTR) PresentationLUTDlg.m_sPresentationLUTFilename, 0); if (iRet == DICOM_SUCCESS) { PrintScuSheet.FlagPendingOperation(); // Ask the Print SCP to create a Presentation LUT iRet = PrintSCU.CreatePresentationLUT(&PresentationLUT); } } if (iRet != DICOM_SUCCESS) { PrintScuSheet.DisplayError(iRet); PrintScuSheet.FlagPendingOperation(FALSE); return; } // Add a Presentation LUT item CString sItemText; sItemText.Format(TEXT("Presentation LUT %u"), m_PresentationLUTsTree.GetCount() + 1); LPTSTR pszInstanceUID = new TCHAR[lstrlen(PrintSCU.GetPresentationLUTInstanceUID()) + 1]; if (pszInstanceUID) { lstrcpy(pszInstanceUID, PrintSCU.GetPresentationLUTInstanceUID()); } HTREEITEM hPresLUTItem = m_PresentationLUTsTree.InsertItem(sItemText); m_PresentationLUTsTree.SetItemData(hPresLUTItem, DWORD(pszInstanceUID)); m_PresentationLUTsTree.SelectItem(hPresLUTItem); PrintScuSheet.FlagPendingOperation(FALSE); } void CBasicPrintPage::OnButtonDeleteLUT() { CPrintScuSheet& PrintScuSheet = *((CPrintScuSheet*) GetParent()); CPrintSCU& PrintSCU = PrintScuSheet.m_PrintSCU; HTREEITEM hSelectedItem = m_PresentationLUTsTree.GetSelectedItem(); if (!hSelectedItem) return; LPTSTR pszInstanceUID = (LPTSTR) m_PresentationLUTsTree.GetItemData(hSelectedItem); PrintScuSheet.FlagPendingOperation(); // Ask the Print SCP to delete the selected Presentation LUT L_INT iRet = PrintSCU.DeletePresentationLUT(pszInstanceUID); if (iRet != DICOM_SUCCESS) { PrintScuSheet.DisplayError(iRet); PrintScuSheet.FlagPendingOperation(FALSE); return; } // Remove the Presentation LUT item delete [] pszInstanceUID; m_PresentationLUTsTree.DeleteItem(hSelectedItem); PrintScuSheet.FlagPendingOperation(FALSE); } void CBasicPrintPage::OnButtonCreateOverlay() { CPrintScuSheet& PrintScuSheet = *((CPrintScuSheet*) GetParent()); CPrintSCU& PrintSCU = PrintScuSheet.m_PrintSCU; CImageOverlayBox* pImageOverlayBox = new CImageOverlayBox(); if (!pImageOverlayBox) { PrintScuSheet.DisplayError(DICOM_ERROR_MEMORY); return; } CImageOverlayBoxDlg ImageOverlayBoxDlg(*pImageOverlayBox); ImageOverlayBoxDlg.m_bCreationMode = TRUE; // Display the dialog box if (ImageOverlayBoxDlg.DoModal() != IDOK) { delete pImageOverlayBox; return; } L_INT iRet; LDicomDS Overlay; iRet = Overlay.LoadDS((L_CHAR*)(LPCTSTR) pImageOverlayBox->m_sOverlayFilename, 0); if (iRet != DICOM_SUCCESS) { delete pImageOverlayBox; PrintScuSheet.DisplayError(iRet); return; } OVERLAYBOXPARAMETERS Parameters; Parameters.uStructSize = sizeof(OVERLAYBOXPARAMETERS); Parameters.nOverlayOriginRow = pImageOverlayBox->m_iOverlayOriginRow; Parameters.nOverlayOriginColumn = pImageOverlayBox->m_iOverlayOriginColumn; SET_SPARAM(Parameters.pszOverlayOrImageMagnification, ImageOverlayBoxDlg.m_OverlayOrImageMagnificationChkBox, pImageOverlayBox->m_sOverlayOrImageMagnification); SET_NPARAM(Parameters.nMagnifyToNumberOfColumns, ImageOverlayBoxDlg.m_MagnifyToNumberOfColumnsChkBox, pImageOverlayBox->m_iMagnifyToNumberOfColumns); SET_SPARAM(Parameters.pszOverlayMagnificationType, ImageOverlayBoxDlg.m_OverlayMagnificationTypeChkBox, pImageOverlayBox->m_sOverlayMagnificationType); SET_SPARAM(Parameters.pszOverlayForegroundDensity, ImageOverlayBoxDlg.m_OverlayForegroundDensityChkBox, pImageOverlayBox->m_sOverlayForegroundDensity); SET_SPARAM(Parameters.pszOverlayBackgroundDensity, ImageOverlayBoxDlg.m_OverlayBackgroundDensityChkBox, pImageOverlayBox->m_sOverlayBackgroundDensity); SET_SPARAM(Parameters.pszOverlaySmoothingType, ImageOverlayBoxDlg.m_OverlaySmoothingTypeChkBox, pImageOverlayBox->m_sOverlaySmoothingType); PrintScuSheet.FlagPendingOperation(); // Now ask the Print SCP to create a Basic Print Image Overlay Box iRet = PrintSCU.CreateOverlayBox(&Overlay, &Parameters); if (iRet != DICOM_SUCCESS) { delete pImageOverlayBox; PrintScuSheet.DisplayError(iRet); PrintScuSheet.FlagPendingOperation(FALSE); return; } pImageOverlayBox->m_bOverlayFilenameChecked = FALSE; pImageOverlayBox->m_sImageOverlayBoxInstanceUID = PrintSCU.GetOverlayBoxInstanceUID(); // Add an Image Overlay Box item CString sItemText; sItemText.Format(TEXT("Image Overlay Box %u"), m_OverlayBoxesTree.GetCount() + 1); HTREEITEM hImageOverlayBoxItem = m_OverlayBoxesTree.InsertItem(sItemText); m_OverlayBoxesTree.SetItemData(hImageOverlayBoxItem, DWORD(pImageOverlayBox)); m_OverlayBoxesTree.SelectItem(hImageOverlayBoxItem); PrintScuSheet.FlagPendingOperation(FALSE); } void CBasicPrintPage::OnButtonUpdateOverlay() { CPrintScuSheet& PrintScuSheet = *((CPrintScuSheet*) GetParent()); CPrintSCU& PrintSCU = PrintScuSheet.m_PrintSCU; HTREEITEM hSelectedItem = m_OverlayBoxesTree.GetSelectedItem(); if (!hSelectedItem) return; CImageOverlayBox* pImageOverlayBox = (CImageOverlayBox*) m_OverlayBoxesTree.GetItemData(hSelectedItem); if (!pImageOverlayBox) return; CImageOverlayBoxDlg ImageOverlayBoxDlg(*pImageOverlayBox); ImageOverlayBoxDlg.m_bCreationMode = FALSE; // Display the dialog box if (ImageOverlayBoxDlg.DoModal() != IDOK) { return; } L_INT iRet; LDicomDS Overlay; if (pImageOverlayBox->m_bOverlayFilenameChecked) { iRet = Overlay.LoadDS((L_CHAR*)(LPCTSTR) pImageOverlayBox->m_sOverlayFilename, 0); if (iRet != DICOM_SUCCESS) { PrintScuSheet.DisplayError(iRet); return; } } OVERLAYBOXPARAMETERS Parameters; Parameters.uStructSize = sizeof(OVERLAYBOXPARAMETERS); Parameters.nOverlayOriginRow = pImageOverlayBox->m_iOverlayOriginRow; Parameters.nOverlayOriginColumn = pImageOverlayBox->m_iOverlayOriginColumn; SET_SPARAM(Parameters.pszOverlayOrImageMagnification, ImageOverlayBoxDlg.m_OverlayOrImageMagnificationChkBox, pImageOverlayBox->m_sOverlayOrImageMagnification); SET_NPARAM(Parameters.nMagnifyToNumberOfColumns, ImageOverlayBoxDlg.m_MagnifyToNumberOfColumnsChkBox, pImageOverlayBox->m_iMagnifyToNumberOfColumns); SET_SPARAM(Parameters.pszOverlayMagnificationType, ImageOverlayBoxDlg.m_OverlayMagnificationTypeChkBox, pImageOverlayBox->m_sOverlayMagnificationType); SET_SPARAM(Parameters.pszOverlayForegroundDensity, ImageOverlayBoxDlg.m_OverlayForegroundDensityChkBox, pImageOverlayBox->m_sOverlayForegroundDensity); SET_SPARAM(Parameters.pszOverlayBackgroundDensity, ImageOverlayBoxDlg.m_OverlayBackgroundDensityChkBox, pImageOverlayBox->m_sOverlayBackgroundDensity); SET_SPARAM(Parameters.pszOverlaySmoothingType, ImageOverlayBoxDlg.m_OverlaySmoothingTypeChkBox, pImageOverlayBox->m_sOverlaySmoothingType); PrintScuSheet.FlagPendingOperation(); // Now ask the Print SCP to update the Basic Print Image Overlay Box iRet = PrintSCU.UpdateOverlayBox(pImageOverlayBox->m_sImageOverlayBoxInstanceUID, pImageOverlayBox->m_bOverlayFilenameChecked ? &Overlay : NULL, &Parameters, pImageOverlayBox->m_bOverlayOriginChecked); if (iRet != DICOM_SUCCESS) { PrintScuSheet.DisplayError(iRet); PrintScuSheet.FlagPendingOperation(FALSE); return; } PrintScuSheet.FlagPendingOperation(FALSE); } void CBasicPrintPage::OnButtonDeleteOverlay() { CPrintScuSheet& PrintScuSheet = *((CPrintScuSheet*) GetParent()); CPrintSCU& PrintSCU = PrintScuSheet.m_PrintSCU; HTREEITEM hSelectedItem = m_OverlayBoxesTree.GetSelectedItem(); if (!hSelectedItem) return; CImageOverlayBox* pImageOverlayBox = (CImageOverlayBox*) m_OverlayBoxesTree.GetItemData(hSelectedItem); if (!pImageOverlayBox) return; PrintScuSheet.FlagPendingOperation(); // Ask the Print SCP to delete the Basic Print Image Overlay Box L_INT iRet = PrintSCU.DeleteOverlayBox(pImageOverlayBox->m_sImageOverlayBoxInstanceUID); if (iRet != DICOM_SUCCESS) { PrintScuSheet.DisplayError(iRet); PrintScuSheet.FlagPendingOperation(FALSE); return; } // Remove the Image Overlay Box item delete pImageOverlayBox; m_OverlayBoxesTree.DeleteItem(hSelectedItem); PrintScuSheet.FlagPendingOperation(FALSE); } void CBasicPrintPage::OnEndLabelEditTreeLUTs(NMHDR* pNMHDR, LRESULT* pResult) { TV_DISPINFO* pTVDispInfo = (TV_DISPINFO*) pNMHDR; CString sNewItemText = pTVDispInfo->item.pszText; sNewItemText.TrimLeft(); sNewItemText.TrimRight(); if (sNewItemText.GetLength()) { m_PresentationLUTsTree.SetItemText(pTVDispInfo->item.hItem, sNewItemText); } *pResult = 0; } void CBasicPrintPage::OnEndLabelEditTreeOverlays(NMHDR* pNMHDR, LRESULT* pResult) { TV_DISPINFO* pTVDispInfo = (TV_DISPINFO*) pNMHDR; CString sNewItemText = pTVDispInfo->item.pszText; sNewItemText.TrimLeft(); sNewItemText.TrimRight(); if (sNewItemText.GetLength()) { m_OverlayBoxesTree.SetItemText(pTVDispInfo->item.hItem, sNewItemText); } *pResult = 0; }