// ModifyDE.cpp : implementation file // #include "stdafx.h" ///////////////////////////////////////////////////////////////////////////// // CDicomModifyElementDlg dialog CDicomModifyElementDlg::CDicomModifyElementDlg(CWnd* pParent /*=NULL*/) : CDialog(CDicomModifyElementDlg::IDD, pParent) { //{{AFX_DATA_INIT(CDicomModifyElementDlg) m_strDesc = _T(""); m_strHint = _T(""); m_strCode = _T(""); m_strName = _T(""); m_strUsage = _T(""); m_strVR = _T(""); m_strVRMultiplicity = _T(""); m_strVRInfo = _T(""); m_strStaticInstructions = _T(""); //}}AFX_DATA_INIT m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME); m_pMyTreeData = NULL; m_strValue = _T(""); m_strVRInfo = _T(""); } void CDicomModifyElementDlg::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); //{{AFX_DATA_MAP(CDicomModifyElementDlg) DDX_Control(pDX, IDC_LIST_VALUE, m_ListValue); DDX_Control(pDX, ID_MODIFY, m_Modify); DDX_Text(pDX, IDC_EDIT_DESC, m_strDesc); DDX_Text(pDX, IDC_EDIT_HINT, m_strHint); DDX_Text(pDX, IDC_EDIT_CODE, m_strCode); DDX_Text(pDX, IDC_EDIT_NAME, m_strName); DDX_Text(pDX, IDC_EDIT_USAGE, m_strUsage); DDX_Text(pDX, IDC_VR, m_strVR); DDX_Text(pDX, IDC_EDIT_VR_MULTIPLICITY, m_strVRMultiplicity); DDX_Text(pDX, IDC_STATIC_INSTRUCTIONS, m_strStaticInstructions); //}}AFX_DATA_MAP } BEGIN_MESSAGE_MAP(CDicomModifyElementDlg, CDialog) //{{AFX_MSG_MAP(CDicomModifyElementDlg) ON_BN_CLICKED(ID_MODIFY, OnModify) ON_BN_CLICKED(ID_INSERT_BEFORE, OnInsertBefore) ON_BN_CLICKED(ID_INSERT_AFTER, OnInsertAfter) ON_BN_CLICKED(ID_DELETE, OnDelete) ON_LBN_DBLCLK(IDC_LIST_VALUE, OnDblclkListValue) //}}AFX_MSG_MAP END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// // CDicomModifyElementDlg message handlers int CDicomModifyElementDlg::GetVRInfo(int nVR, CString &strVR, CString &strVRDetail) { int bMulti = FALSE; pDICOMVR pVR = LDicomVR::Find(nVR); if (pVR) { strVR = pVR->pszName; if ((pVR->nRestrict & VR_BINARY) || (pVR->nRestrict & VR_STRING)) { bMulti = TRUE; } } else { nVR = VR_UN; strVR = "Unknown"; bMulti = TRUE; } switch (nVR) { case VR_OB: case VR_UN: strVRDetail = "Hexadecimal"; break; case VR_SS: case VR_US: case VR_OW: case VR_SL: case VR_IS: case VR_UL: strVRDetail = "Integer"; break; case VR_AT: strVRDetail = "Group:Element\r\n(Group and Element should be hexadecimal words)"; break; case VR_FD: case VR_FL: case VR_DS: strVRDetail = "Float"; break; case VR_CS: case VR_SH: case VR_LO: case VR_AE: case VR_LT: case VR_ST: case VR_UI: case VR_UT: case VR_PN: if (bMulti != FALSE) { strVRDetail = "String"; } else { strVRDetail = "Text"; } break; case VR_AS: strVRDetail = "Number Reference\r\n(Reference = 'days' or 'weeks' or 'months' or 'years')"; break; case VR_DA: { strVRDetail = "MM/DD/YYYY\r\n(MM=Month, DD=Day, YYYY=Year)"; /* EnableDateCtrl(TRUE); m_Date.SetFormat("MM/dd/yyy"); m_Date.SetDate(m_strValue); */ } break; case VR_DT: strVRDetail = "MM/DD/YYYY HH:MM:SS.FFFFFF+OOOO\r\n(MM=Month, DD=Day, YYYY=Year)\r\n(HH=Hours, MM=Minutes, SS=Seconds, FFFFFF=Fractional Second, OOOO=Offset from Coordinated Universal Time)"; break; case VR_TM: strVRDetail = "HH:MM:SS.FFFF\r\n(HH=Hours, MM=Minutes, SS=Seconds, FFFFFF=Fractional Second)"; break; default: strVRDetail = ""; break; } return nVR; } CString CDicomModifyElementDlg::GetUsage(int nUsage) { CString strUsage; switch(nUsage) { case IOD_USAGE_M: strUsage = "Mandatory"; break; case IOD_USAGE_C: strUsage = "Conditional"; break; case IOD_USAGE_U: strUsage = "Optional"; break; case IOD_USAGE_1: strUsage = "Mandatory -- Type 1"; break; case IOD_USAGE_1C: strUsage = "Conditional -- Type 1"; break; case IOD_USAGE_2: strUsage = "Mandatory -- Type 2"; break; case IOD_USAGE_2C: strUsage = "Conditional -- Type 2"; break; case IOD_USAGE_3: strUsage = "Mandatory -- Type 3"; break; } return strUsage; } BOOL CDicomModifyElementDlg::OnInitDialog() { CDialog::OnInitDialog(); m_bMultipleItems = FALSE; SetIcon(m_hIcon, TRUE); // Set big icon SetIcon(m_hIcon, FALSE); // Set small icon CString strText; if (m_pMyTreeData) { //m_strValue = m_pMyTreeData->m_strValue; if (m_pMyTreeData->m_pDicomIOD) { m_strCode = LMyDicomDS::GetStringTag(m_pMyTreeData->m_pDicomIOD->nCode); m_strName = m_pMyTreeData->m_pDicomIOD->pszName; m_strUsage = GetUsage(m_pMyTreeData->m_pDicomIOD->nUsage); m_strHint = m_pMyTreeData->m_pDicomIOD->pszDescription; pDICOMTAG pDicomTag = LDicomTag::Find(m_pMyTreeData->m_pDicomIOD->nCode); if (pDicomTag) { if ((L_UINT32)pDicomTag->nMinVM == (L_UINT32)pDicomTag->nMaxVM) { m_bMultipleItems = pDicomTag->nMinVM > 1; m_strVRMultiplicity.Format("Exactly %d value", pDicomTag->nMinVM); if (pDicomTag->nMinVM > 1) m_strVRMultiplicity += "s"; } else if (pDicomTag->nMaxVM == -1) { m_bMultipleItems = TRUE; m_strVRMultiplicity.Format("At least %d value", pDicomTag->nMinVM); if (pDicomTag->nMinVM > 1) m_strVRMultiplicity += "s"; } else { m_bMultipleItems = TRUE; m_strVRMultiplicity.Format("%d to %d values", pDicomTag->nMinVM); } m_strVRMultiplicity += "."; if (pDicomTag->nDivideVM != 1) { CString strTemp; strTemp.Format("Count must be divisible by %d.", pDicomTag->nDivideVM); m_strVRMultiplicity += strTemp; } } } m_nVR = m_pMyTreeData->m_pElement->nVR; GetVRInfo(m_nVR, m_strVR, m_strVRInfo); PopulateListBox(); UpdateData(FALSE); } if (m_bMultipleItems) m_strStaticInstructions.LoadString(IDS_MODIFY_MULTI_INSTR); else m_strStaticInstructions.LoadString(IDS_MODIFY_SINGLE_INSTR); GetDlgItem(IDC_EDIT_VALUE_MULTI)->ShowWindow(SW_HIDE); GetDlgItem(IDC_EDIT_VALUE_SINGLE)->ShowWindow(SW_HIDE); UpdateData(FALSE); EnableItems(TRUE); ShowItems(); m_ListValue.SetFocus(); m_ListValue.SetCurSel(0); return TRUE; // return TRUE unless you set the focus to a control // EXCEPTION: OCX Property Pages should return FALSE } void CDicomModifyElementDlg::PopulateListBox() { if (!m_pMyTreeData) return; CString strCopy = m_pMyTreeData->m_strValue; char *pszCopy = strCopy.GetBuffer(0); char *p = pszCopy; char *q = NULL; int i; for (i=0; im_nCount; i++) { q = strchr(p, '\\'); if (q != NULL) *q = '\0'; m_ListValue.InsertString(i, p); p += strlen(p) + 1; } strCopy.ReleaseBuffer(); } void CDicomModifyElementDlg::ResizeListBox() { RECT rcTree; // if single item and empty, hide the list box and display a disabled text box int nListCount = m_ListValue.GetCount(); if (nListCount == 0) { if (m_bMultipleItems) GetDlgItem(IDC_EDIT_VALUE_MULTI)->ShowWindow(SW_NORMAL); else GetDlgItem(IDC_EDIT_VALUE_SINGLE)->ShowWindow(SW_NORMAL); m_ListValue.ShowWindow(SW_HIDE); return; } GetDlgItem(IDC_EDIT_VALUE_SINGLE)->ShowWindow(SW_HIDE); GetDlgItem(IDC_EDIT_VALUE_MULTI)->ShowWindow(SW_HIDE); if (m_bMultipleItems) { //IDC_EDIT_VALUE_MULTI is a placeholder GetDlgItem(IDC_EDIT_VALUE_MULTI)->GetWindowRect(&rcTree); } else { //IDC_EDIT_VALUE_SINGLE is a placeholder GetDlgItem(IDC_EDIT_VALUE_SINGLE)->GetWindowRect(&rcTree); } // Reposition and size ScreenToClient(&rcTree); m_ListValue.MoveWindow(&rcTree); m_ListValue.ShowWindow(SW_SHOW); } // Determines which buttons will be enabled/disabled void CDicomModifyElementDlg::EnableItems(int bEnable) { int nListCount = m_ListValue.GetCount(); CButton *pModify = (CButton *)GetDlgItem(ID_MODIFY); pModify->EnableWindow(bEnable); if (nListCount == 0) { pModify->SetWindowText("&Insert"); } else { pModify->SetWindowText("&Modify"); } ResizeListBox(); GetDlgItem(ID_INSERT_BEFORE)->EnableWindow(bEnable && m_bMultipleItems && (nListCount >= 1)); GetDlgItem(ID_INSERT_AFTER)->EnableWindow(bEnable && m_bMultipleItems && (nListCount >= 1)); GetDlgItem(ID_DELETE)->EnableWindow(bEnable && (nListCount >= 1)); m_ListValue.SetFocus(); } // Determines which buttons will be visible/invisible void CDicomModifyElementDlg::ShowItems() { int nListCount = m_ListValue.GetCount(); GetDlgItem(ID_MODIFY)->ShowWindow(SW_NORMAL);//SW_NORMAL GetDlgItem(ID_INSERT_BEFORE)->ShowWindow( m_bMultipleItems ? SW_NORMAL : SW_HIDE); GetDlgItem(ID_INSERT_AFTER)->ShowWindow( m_bMultipleItems ? SW_NORMAL : SW_HIDE ); GetDlgItem(ID_DELETE)->ShowWindow(SW_NORMAL); m_ListValue.SetFocus(); } void CDicomModifyElementDlg::OnOK() { int i; CString strTmp; m_strValue = ""; m_nCount = m_ListValue.GetCount(); for (i=0; i= 0) m_ListValue.GetText( nSelected, dlg.m_strValue); else nSelected = 0; dlg.m_nVR = m_nVR; dlg.m_strVRInfo = m_strVRInfo; if (IDOK == dlg.DoModal()) { if (dlg.m_strValue.GetLength()) { m_ListValue.InsertString(nSelected, dlg.m_strValue); m_ListValue.DeleteString(nSelected + 1); } else { m_ListValue.DeleteString(nSelected); } } m_ListValue.SetCurSel(nSelected); EnableItems(TRUE); ShowItems(); } void CDicomModifyElementDlg::OnInsert(int bAfter) { CEditItemDlg dlg; dlg.m_nType = CEditItemDlg::INSERT_ITEM; int nSelected = m_ListValue.GetCurSel(); if (nSelected < 0) nSelected = 0; dlg.m_strValue = ""; dlg.m_nVR = m_nVR; dlg.m_strVRInfo = m_strVRInfo; if (IDOK == dlg.DoModal()) { if (bAfter) nSelected++; int nNewItem = m_ListValue.InsertString(nSelected, dlg.m_strValue); m_ListValue.SetCurSel(nNewItem); } EnableItems(TRUE); } void CDicomModifyElementDlg::OnInsertBefore() { OnInsert(FALSE); } void CDicomModifyElementDlg::OnInsertAfter() { OnInsert(TRUE); } void CDicomModifyElementDlg::OnDelete() { int nSelected = m_ListValue.GetCurSel(); if (nSelected >= 0) { m_ListValue.DeleteString(nSelected); nSelected = nSelected <= 0 ? 0 : nSelected - 1; m_ListValue.SetCurSel( nSelected); } EnableItems(TRUE); ShowItems(); } void CDicomModifyElementDlg::OnDblclkListValue() { OnModify(); }