/*[]=====================================================================[]*/ /*[] LEADTOOLS for Windows - Version 10 []*/ /*[] []*/ /*[] []*/ /*[] Copyright (c) 1991-2000 LEAD Technologies, Inc. []*/ /*[] All Rights Reserved. []*/ /*[]=====================================================================[]*/ //tables.c #include /* Required for all Windows applications. */ #include /* Needed for message crackers. */ #include /* Windows' header for common controls. */ #include "..\\..\\..\\include\\l_bitmap.h" /* LEADTOOLS main header file. */ #include "..\\..\\..\\include\\l_error.h" /* LEADTOOLS error definition header file. */ #include "..\\..\\..\\include\\ltdic.h" /* LEADTOOLS main header file. */ #include "dicom.h" #include "resource.h" #define DCODE_SIZE 10 #define DLENGTH_SIZE 10 #define DRESTRICT_SIZE 10 #define DUNIT_SIZE 10 #define DMASK_SIZE 10 #define DVR_SIZE 10 #define DMINVM_SIZE 10 #define DMAXVM_SIZE 10 #define DDIVIDEVM_SIZE 10 L_CHAR *IntToString(UINT iVal, L_CHAR *szVal) { wsprintf(szVal, "%d", iVal); return szVal; } L_CHAR *IntToHexString(UINT iVal, L_CHAR *szVal) { wsprintf(szVal, "%04X:%04X", GETGROUP(iVal), GETELEMENT(iVal)); return szVal; } L_CHAR * CodeToString(L_UINT uiCode) { L_CHAR *szCode; szCode = ""; switch (uiCode) { case VR_AE: szCode = "AE"; break;// Application Entity case VR_AS: szCode = "AS"; break;// Age String case VR_AT: szCode = "AT"; break;// Attribute Tag case VR_CS: szCode = "CS"; break;// Code String case VR_DA: szCode = "DA"; break;// Date case VR_DS: szCode = "DS"; break;// Decimal String case VR_DT: szCode = "DT"; break;// Date Time case VR_FD: szCode = "FD"; break;// Floating Point Double case VR_FL: szCode = "FL"; break;// Floating Point Single case VR_IS: szCode = "IS"; break;// Integer String case VR_LO: szCode = "LO"; break;// Long String case VR_LT: szCode = "LT"; break;// Long Text case VR_OB: szCode = "OB"; break;// Other Byte String case VR_OW: szCode = "OW"; break;// Other Word String case VR_PN: szCode = "PN"; break;// Person Name case VR_SH: szCode = "SH"; break;// Short String case VR_SL: szCode = "SL"; break;// Signed Long case VR_SQ: szCode = "SQ"; break;// Sequence of Items case VR_SS: szCode = "SS"; break;// Signed Short case VR_ST: szCode = "ST"; break;// Short Text case VR_TM: szCode = "TM"; break;// Time case VR_UI: szCode = "UI"; break;// Unique Identifier case VR_UL: szCode = "UL"; break;// Unsigned Long case VR_UN: szCode = "UN"; break;// Unknown case VR_US: szCode = "US"; break;// Unsigned Short case VR_UT: szCode = "UT"; break; // Unlimited Text } return szCode; } L_CHAR * RestrictToString(L_UINT uiRestrict) { L_CHAR *szRestrict; //Mask out unwanted bits using exclusive or operator //uiRestrict = (((uiRestrict ^ VR_BINARY) ^ VR_STRING) ^ VR_TEXT); uiRestrict = ((uiRestrict & ~VR_BINARY) & ~VR_STRING) & ~VR_TEXT; szRestrict = ""; switch (uiRestrict) { case VR_FIXED: // DICOMVR.nLength bytes fixed szRestrict = "Fixed"; break; case VR_MAXIMUM: // DICOMVR.nLength bytes maximum szRestrict = "Maximum"; break; case VR_MAXIMUM_GROUP: // DICOMVR.nLength maximum per component group szRestrict = "Maximum Group"; break; case VR_ANY: // Any length valid for any of the other DICOM Value Representations szRestrict = "Any Length"; break; case VR_NOT_APPLICABLE: // DICOMVR.nLength not applicable szRestrict = "Not Applicable"; break; case VR_MAX: szRestrict = "Max"; break; } return szRestrict; } L_VOID UpdateVRTextBoxes(HWND hDlg, pDICOMVR pVR) { L_CHAR szLength[DLENGTH_SIZE]; // string representation of DICOM length L_CHAR szUnitSize[DUNIT_SIZE]; // string representation of DICOM size of the smallest item Static_SetText(GetDlgItem(hDlg, IDC_EDIT_VR_CODE), CodeToString(pVR->nCode)); Static_SetText(GetDlgItem(hDlg, IDC_EDIT_VR_NAME), pVR->pszName); Static_SetText(GetDlgItem(hDlg, IDC_EDIT_VR_LENGTH), IntToString(pVR->nLength, szLength)); Static_SetText(GetDlgItem(hDlg, IDC_EDIT_VR_RESTRICT), RestrictToString(pVR->nRestrict)); Static_SetText(GetDlgItem(hDlg, IDC_EDIT_VR_UNITSIZE), IntToString(pVR->nUnitSize, szUnitSize)); } L_VOID UpdateUIDTextBoxes(HWND hDlg, pDICOMUID pUID) { Static_SetText(GetDlgItem(hDlg, IDC_EDIT_UID_CODE), pUID->pszCode); Static_SetText(GetDlgItem(hDlg, IDC_EDIT_UID_NAME), pUID->pszName); ComboBox_SetCurSel(GetDlgItem(hDlg, IDC_COMBO_UID_TYPE), pUID->nType); } L_VOID UpdateTagTextBoxes(HWND hDlg, pDICOMTAG pTag) { L_CHAR szTemp[DLENGTH_SIZE]; // string representation of DICOM length Static_SetText(GetDlgItem(hDlg, IDC_EDIT_TAG_CODE), IntToHexString(pTag->nCode, szTemp) ); Static_SetText(GetDlgItem(hDlg, IDC_EDIT_TAG_MASK), IntToHexString(pTag->nMask, szTemp) ); Static_SetText(GetDlgItem(hDlg, IDC_EDIT_TAG_NAME), pTag->pszName ); Static_SetText(GetDlgItem(hDlg, IDC_EDIT_TAG_VR), CodeToString(pTag->nVR) ); Static_SetText(GetDlgItem(hDlg, IDC_EDIT_TAG_MINVM), IntToString(pTag->nMinVM, szTemp) ); Static_SetText(GetDlgItem(hDlg, IDC_EDIT_TAG_MAXVM), IntToString(pTag->nMaxVM, szTemp) ); Static_SetText(GetDlgItem(hDlg, IDC_EDIT_TAG_DIVIDEVM), IntToString(pTag->nDivideVM, szTemp) ); } L_VOID ListView_SetCursor(HWND hListView, L_INT iListViewIndex) { LV_ITEM lvItem; lvItem.iItem = iListViewIndex; lvItem.iSubItem = 0; lvItem.mask = LVIF_STATE; lvItem.state = LVIS_SELECTED | LVIS_FOCUSED; lvItem.stateMask = LVIS_SELECTED | LVIS_FOCUSED; ListView_SetItem(hListView, &lvItem); ListView_EnsureVisible(hListView, iListViewIndex, TRUE); } BOOL CALLBACK VRTableDlgProc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) { L_UINT32 i; L_UINT32 nCount; static pDICOMVR pVR; pDICOMVR pTempVR; static HWND hListView; static L_INT32 iListViewIndex = 0; static L_INT32 iListViewCount = 0; LV_COLUMN col; LV_ITEM lvItem; L_CHAR szCode[DCODE_SIZE]; // string representation of DICOM length L_CHAR szLength[DLENGTH_SIZE]; // string representation of DICOM length L_CHAR szUnitSize[DUNIT_SIZE]; // string representation of DICOM size of the smallest item L_CHAR szRestrict[DRESTRICT_SIZE]; // string representation of DICOM size of the smallest item switch(uMsg) { case WM_INITDIALOG: hListView = GetDlgItem(hDlg,IDC_LIST_VR); col.mask = LVCF_FMT | LVCF_WIDTH | LVCF_TEXT | LVCF_SUBITEM; col.fmt = LVCFMT_LEFT; col.cx = 50; col.pszText = "Code"; col.iSubItem = 0; ListView_InsertColumn(hListView, 0, &col); col.cx = 120; col.pszText = "Name"; ListView_InsertColumn(hListView, 1, &col); col.cx = 60; col.pszText = "Length"; ListView_InsertColumn(hListView, 2, &col); col.pszText = "Restrict"; ListView_InsertColumn(hListView, 3, &col); col.pszText = "UnitSize"; ListView_InsertColumn(hListView, 4, &col); //ENABLEMENUITEM(GetMenu(hDlg), ID_FILE_SAVE, FALSE); nCount = L_DicomGetCountVR(); for (i = 0; i < nCount; i++) { pVR = L_DicomFindIndexVR(i); if (pVR != NULL) { lvItem.mask = LVIF_TEXT | LVIF_PARAM ; lvItem.pszText = IntToString(pVR->nCode, szCode); lvItem.iItem = ListView_GetItemCount(hListView); lvItem.lParam = (LPARAM)pVR; lvItem.iSubItem = 0; ListView_InsertItem(hListView, &lvItem); lvItem.mask = LVIF_TEXT; lvItem.pszText = pVR->pszName; lvItem.iSubItem = 1; ListView_SetItem(hListView, &lvItem); lvItem.pszText = IntToString(pVR->nLength, szLength); lvItem.iSubItem = 2; ListView_SetItem(hListView, &lvItem); lvItem.pszText = IntToString(pVR->nRestrict, szRestrict); lvItem.iSubItem = 3; ListView_SetItem(hListView, &lvItem); lvItem.pszText = IntToString(pVR->nUnitSize, szUnitSize); lvItem.iSubItem = 4; ListView_SetItem(hListView, &lvItem); } } iListViewCount = ListView_GetItemCount(hListView); pVR = L_DicomGetFirstVR(); UpdateVRTextBoxes(hDlg, pVR); ListView_SetCursor( hListView, iListViewIndex); SetFocus(GetDlgItem(hDlg,IDC_LIST_VR)); break; case WM_NOTIFY : { NM_LISTVIEW* pNM = (NM_LISTVIEW*)lParam; if (pNM->hdr.code == LVN_ITEMCHANGED) { if (pNM->iItem != iListViewIndex) { iListViewIndex = pNM->iItem; pVR = (pDICOMVR)pNM->lParam; UpdateVRTextBoxes(hDlg, pVR); } } } break; case WM_DESTROY: return FALSE; break; case WM_COMMAND: switch (GET_WM_COMMAND_ID(wParam, lParam)) { case IDC_FIRST: pVR = L_DicomGetFirstVR(); if ( pVR != NULL) { iListViewIndex = 0; ListView_SetCursor(hListView, iListViewIndex); //UpdateVRTextBoxes(hDlg, pVR); } SetFocus(GetDlgItem(hDlg,IDC_LIST_VR)); break; case IDC_NEXT: pTempVR = L_DicomGetNextVR(pVR); if (pTempVR != NULL) { pVR = pTempVR; iListViewIndex++; ListView_SetCursor(hListView, iListViewIndex); //UpdateVRTextBoxes(hDlg, pVR); } SetFocus(GetDlgItem(hDlg,IDC_LIST_VR)); break; case IDC_PREV: pTempVR = L_DicomGetPrevVR(pVR); if (pTempVR != NULL) { pVR = pTempVR; iListViewIndex--; ListView_SetCursor(hListView, iListViewIndex); //UpdateVRTextBoxes(hDlg, pVR); } SetFocus(GetDlgItem(hDlg,IDC_LIST_VR)); break; case IDC_LAST: pVR = L_DicomGetLastVR(); iListViewIndex = 0; if ( pVR != NULL) { iListViewIndex = iListViewCount - 1; ListView_SetCursor(hListView, iListViewIndex); //UpdateVRTextBoxes(hDlg, pVR); } SetFocus(GetDlgItem(hDlg,IDC_LIST_VR)); break; case IDCANCEL: case IDABORT: case ID_FILE_EXIT: EndDialog(hDlg, TRUE); break; } return FALSE; break; default: return FALSE; } return TRUE; } //VRTableDlgProc BOOL CALLBACK UITableDlgProc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) { L_UINT32 i; L_UINT32 nCount; static pDICOMUID pUID; pDICOMUID pTempUID; static HWND hListView; static HWND hCombo1; static L_INT32 iListViewIndex = 0; static L_INT32 iListViewCount = 0; LV_COLUMN col; LV_ITEM lvItem; switch(uMsg) { case WM_INITDIALOG: hListView = GetDlgItem(hDlg,IDC_LIST_UID); hCombo1 = GetDlgItem(hDlg, IDC_COMBO_UID_TYPE); col.mask = LVCF_FMT | LVCF_WIDTH | LVCF_TEXT | LVCF_SUBITEM; col.fmt = LVCFMT_LEFT; col.cx = 150; col.pszText = "Code"; col.iSubItem = 0; ListView_InsertColumn(hListView, 0, &col); col.cx = 200; col.pszText = "Name"; ListView_InsertColumn(hListView, 1, &col); ComboBox_AddString(hCombo1, "Unknown"); ComboBox_AddString(hCombo1, "Transfer Syntax - Uncompressed Image"); ComboBox_AddString(hCombo1, "Transfer Syntax - Compressed Image"); ComboBox_AddString(hCombo1, "SOP Class"); ComboBox_AddString(hCombo1, "Meta SOP Class"); ComboBox_AddString(hCombo1, "SOP Instance"); ComboBox_AddString(hCombo1, "Application Context Name"); //ENABLEMENUITEM(GetMenu(hDlg), ID_FILE_SAVE, FALSE); nCount = L_DicomGetCountUID(); for (i = 0; i < nCount; i++) { pUID = L_DicomFindIndexUID(i); if (pUID != NULL) { lvItem.mask = LVIF_TEXT | LVIF_PARAM ; lvItem.pszText = pUID->pszCode; lvItem.iItem = ListView_GetItemCount(hListView); lvItem.lParam = (LPARAM)pUID; lvItem.iSubItem = 0; ListView_InsertItem(hListView, &lvItem); lvItem.mask = LVIF_TEXT; lvItem.pszText = pUID->pszName; lvItem.iSubItem = 1; ListView_SetItem(hListView, &lvItem); } } iListViewCount = ListView_GetItemCount(hListView); pUID = L_DicomGetFirstUID(); UpdateUIDTextBoxes(hDlg, pUID); ListView_SetCursor( hListView, iListViewIndex); SetFocus(GetDlgItem(hDlg,IDC_LIST_UID)); break; case WM_NOTIFY : { NM_LISTVIEW* pNM = (NM_LISTVIEW*)lParam; if (pNM->hdr.code == LVN_ITEMCHANGED) { if (pNM->iItem != iListViewIndex) { iListViewIndex = pNM->iItem; //pUID = L_DicomFindIndexUID(iListViewIndex); pUID = (pDICOMUID)pNM->lParam; UpdateUIDTextBoxes(hDlg, pUID); } } } break; case WM_DESTROY: return FALSE; break; case WM_COMMAND: switch (GET_WM_COMMAND_ID(wParam, lParam)) { case IDC_FIRST: pUID = L_DicomGetFirstUID(); if ( pUID != NULL) { iListViewIndex = 0; ListView_SetCursor(hListView, iListViewIndex); //UpdateUIDTextBoxes(hDlg, pUID); } SetFocus(GetDlgItem(hDlg,IDC_LIST_UID)); break; case IDC_NEXT: pTempUID = L_DicomGetNextUID(pUID); if ( pTempUID != NULL) { pUID = pTempUID; iListViewIndex++; ListView_SetCursor(hListView, iListViewIndex); //UpdateUIDTextBoxes(hDlg, pUID); } SetFocus(GetDlgItem(hDlg,IDC_LIST_UID)); break; case IDC_PREV: pTempUID = L_DicomGetPrevUID(pUID); if ( pTempUID != NULL) { pUID = pTempUID; iListViewIndex--; ListView_SetCursor(hListView, iListViewIndex); //UpdateUIDTextBoxes(hDlg, pUID); } SetFocus(GetDlgItem(hDlg,IDC_LIST_UID)); break; case IDC_LAST: pUID = L_DicomGetLastUID(); iListViewIndex = 0; if ( pUID != NULL) { iListViewIndex = iListViewCount - 1; ListView_SetCursor(hListView, iListViewIndex); //UpdateUIDTextBoxes(hDlg, pUID); } SetFocus(GetDlgItem(hDlg,IDC_LIST_UID)); break; case IDCANCEL: case IDABORT: case ID_FILE_EXIT: EndDialog(hDlg, TRUE); break; } return FALSE; break; default: return FALSE; } return TRUE; } //UITableDlgProc BOOL CALLBACK TagTableDlgProc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) { L_UINT32 i; L_UINT32 nCount; static pDICOMTAG pTag; pDICOMTAG pTempTag; static HWND hListView; static L_INT32 iListViewIndex = 0; static L_INT32 iListViewCount = 0; LV_COLUMN col; LV_ITEM lvItem; L_CHAR szCode[DCODE_SIZE]; L_CHAR szMask[DMASK_SIZE]; L_CHAR szVR[DVR_SIZE]; L_CHAR szMinVM[DMINVM_SIZE]; L_CHAR szMaxVM[DMAXVM_SIZE]; L_CHAR szDivideVM[DDIVIDEVM_SIZE]; switch(uMsg) { case WM_INITDIALOG: hListView = GetDlgItem(hDlg,IDC_LIST_TAG); col.mask = LVCF_FMT | LVCF_WIDTH | LVCF_TEXT | LVCF_SUBITEM; col.fmt = LVCFMT_LEFT; col.cx = 70; col.pszText = "Code"; col.iSubItem = 0; ListView_InsertColumn(hListView, 0, &col); col.cx = 70; col.pszText = "Mask"; ListView_InsertColumn(hListView, 1, &col); col.cx = 150; col.pszText = "Name"; ListView_InsertColumn(hListView, 2, &col); col.cx = 50; col.pszText = "VR"; ListView_InsertColumn(hListView, 3, &col); col.cx = 40; col.pszText = "MinVM"; ListView_InsertColumn(hListView, 4, &col); col.pszText = "MaxVM"; ListView_InsertColumn(hListView, 5, &col); col.pszText = "DivideVM"; ListView_InsertColumn(hListView, 6, &col); //ENABLEMENUITEM(GetMenu(hDlg), ID_FILE_SAVE, FALSE); nCount = L_DicomGetCountTag(); for (i = 0; i < nCount; i++) { pTag = L_DicomFindIndexTag(i); if (pTag != NULL) { lvItem.mask = LVIF_TEXT | LVIF_PARAM ; lvItem.pszText = IntToHexString(pTag->nCode, szCode); lvItem.iItem = ListView_GetItemCount(hListView); lvItem.lParam = (LPARAM)pTag; lvItem.iSubItem = 0; ListView_InsertItem(hListView, &lvItem); lvItem.mask = LVIF_TEXT; lvItem.pszText = IntToHexString(pTag->nMask, szMask);; lvItem.iSubItem = 1; ListView_SetItem(hListView, &lvItem); lvItem.pszText = pTag->pszName; lvItem.iSubItem = 2; ListView_SetItem(hListView, &lvItem); lvItem.pszText = IntToString(pTag->nVR, szVR); lvItem.iSubItem = 3; ListView_SetItem(hListView, &lvItem); lvItem.pszText = IntToString(pTag->nMinVM, szMinVM); lvItem.iSubItem = 4; ListView_SetItem(hListView, &lvItem); lvItem.pszText = IntToString(pTag->nMaxVM, szMaxVM); lvItem.iSubItem = 5; ListView_SetItem(hListView, &lvItem); lvItem.pszText = IntToString(pTag->nDivideVM, szDivideVM); lvItem.iSubItem = 6; ListView_SetItem(hListView, &lvItem); } } iListViewCount = ListView_GetItemCount(hListView); pTag = L_DicomGetFirstTag(); UpdateTagTextBoxes(hDlg, pTag); ListView_SetCursor( hListView, iListViewIndex); SetFocus(GetDlgItem(hDlg,IDC_LIST_TAG)); break; case WM_NOTIFY : { NM_LISTVIEW* pNM = (NM_LISTVIEW*)lParam; if (pNM->hdr.code == LVN_ITEMCHANGED) { if (pNM->iItem != iListViewIndex) { iListViewIndex = pNM->iItem; pTag = (pDICOMTAG)pNM->lParam; //pTag = L_DicomFindIndexTag(iListViewIndex); UpdateTagTextBoxes(hDlg, pTag); } } } break; case WM_DESTROY: return FALSE; break; case WM_COMMAND: switch (GET_WM_COMMAND_ID(wParam, lParam)) { case IDC_FIRST: pTag = L_DicomGetFirstTag(); if ( pTag != NULL) { iListViewIndex = 0; ListView_SetCursor(hListView, iListViewIndex); //UpdateTagTextBoxes(hDlg, pTag); } SetFocus(GetDlgItem(hDlg,IDC_LIST_TAG)); break; case IDC_NEXT: pTempTag = L_DicomGetNextTag(pTag); if ( pTempTag != NULL) { pTag = pTempTag; iListViewIndex++; ListView_SetCursor(hListView, iListViewIndex); //UpdateTagTextBoxes(hDlg, pTag); } SetFocus(GetDlgItem(hDlg,IDC_LIST_TAG)); break; case IDC_PREV: pTempTag = L_DicomGetPrevTag(pTag); if ( pTempTag != NULL) { pTag = pTempTag; iListViewIndex--; ListView_SetCursor(hListView, iListViewIndex); //UpdateTagTextBoxes(hDlg, pTag); } SetFocus(GetDlgItem(hDlg,IDC_LIST_TAG)); break; case IDC_LAST: pTag = L_DicomGetLastTag(); iListViewIndex = 0; if ( pTag != NULL) { iListViewIndex = iListViewCount - 1; ListView_SetCursor(hListView, iListViewIndex); //UpdateTagTextBoxes(hDlg, pTag); } SetFocus(GetDlgItem(hDlg,IDC_LIST_TAG)); break; case IDCANCEL: case IDABORT: case ID_FILE_EXIT: EndDialog(hDlg, TRUE); break; } return FALSE; break; default: return FALSE; } return TRUE; } //TagTableDlgProc