static void Directories_OnBrowse(HWND hDlg) { int nType; int nItem; TCHAR inbuf[MAX_PATH]; TCHAR outbuf[MAX_PATH]; HWND hList; hList = GetDlgItem(hDlg, IDC_DIR_LIST); nItem = ListView_GetNextItem(hList, -1, LVNI_SELECTED); if (nItem == -1) return; nType = ComboBox_GetCurSel(GetDlgItem(hDlg, IDC_DIR_COMBO)); if (IsMultiDir(nType)) { /* Last item is placeholder for append */ if (nItem == ListView_GetItemCount(hList) - 1) { Directories_OnInsert(hDlg); return; } } ListView_GetItemText(hList, nItem, 0, inbuf, MAX_PATH); if (BrowseForDirectory(hDlg, inbuf, outbuf) == TRUE) { nType = ComboBox_GetCurSel(GetDlgItem(hDlg, IDC_DIR_COMBO)); DirInfo_SetDir(g_pDirInfo, nType, nItem, outbuf); UpdateDirectoryList(hDlg); } }
static BOOL Directories_OnEndLabelEdit(HWND hDlg, NMHDR* pNMHDR) { BOOL bResult = FALSE; NMLVDISPINFO* pDispInfo = (NMLVDISPINFO*)pNMHDR; LVITEM* pItem = &pDispInfo->item; if (pItem->pszText != NULL) { struct _stat file_stat; /* Don't allow empty entries. */ if (!_tcscmp(pItem->pszText, TEXT(""))) { return FALSE; } /* Check validity of edited directory. */ if (_tstat(pItem->pszText, &file_stat) == 0 && (file_stat.st_mode & S_IFDIR)) { bResult = TRUE; } else { if (MessageBox(NULL, TEXT("Directory does not exist, continue anyway?"), TEXT(MAMEUINAME), MB_OKCANCEL) == IDOK) bResult = TRUE; } } if (bResult == TRUE) { int nType; int i; nType = ComboBox_GetCurSel(GetDlgItem(hDlg, IDC_DIR_COMBO)); if (IsMultiDir(nType)) { /* Last item is placeholder for append */ if (pItem->iItem == ListView_GetItemCount(GetDlgItem(hDlg, IDC_DIR_LIST)) - 1) { if (MAX_DIRS <= DirInfo_NumDir(g_pDirInfo, nType)) return FALSE; for (i = DirInfo_NumDir(g_pDirInfo, nType); pItem->iItem < i; i--) _tcscpy(DirInfo_Path(g_pDirInfo, nType, i), DirInfo_Path(g_pDirInfo, nType, i - 1)); _tcscpy(DirInfo_Path(g_pDirInfo, nType, pItem->iItem), pItem->pszText); DirInfo_SetModified(g_pDirInfo, nType, TRUE); DirInfo_NumDir(g_pDirInfo, nType)++; } else DirInfo_SetDir(g_pDirInfo, nType, pItem->iItem, pItem->pszText); } else { DirInfo_SetDir(g_pDirInfo, nType, pItem->iItem, pItem->pszText); } UpdateDirectoryList(hDlg); ListView_SetItemState(GetDlgItem(hDlg, IDC_DIR_LIST), pItem->iItem, LVIS_FOCUSED | LVIS_SELECTED, LVIS_FOCUSED | LVIS_SELECTED); } return bResult; }
static BOOL Directories_OnInitDialog(HWND hDlg, HWND hwndFocus, LPARAM lParam) { RECT rectClient; LVCOLUMN LVCol; int i; int nDirInfoCount; LPCSTR s; TCHAR *token; TCHAR buf[MAX_PATH * MAX_DIRS]; TCHAR* t_s = NULL; HRESULT res; /* count how many dirinfos there are */ nDirInfoCount = 0; while(g_directoryInfo[nDirInfoCount].lpName) nDirInfoCount++; g_pDirInfo = (tDirInfo *) malloc(sizeof(tDirInfo) * nDirInfoCount); if (!g_pDirInfo) /* bummer */ goto error; memset(g_pDirInfo, 0, sizeof(tDirInfo) * nDirInfoCount); for (i = nDirInfoCount - 1; i >= 0; i--) { t_s = tstring_from_utf8(g_directoryInfo[i].lpName); if( !t_s ) return FALSE; (void)ComboBox_InsertString(GetDlgItem(hDlg, IDC_DIR_COMBO), 0, win_tstring_strdup(t_s)); osd_free(t_s); t_s = NULL; } (void)ComboBox_SetCurSel(GetDlgItem(hDlg, IDC_DIR_COMBO), 0); GetClientRect(GetDlgItem(hDlg, IDC_DIR_LIST), &rectClient); memset(&LVCol, 0, sizeof(LVCOLUMN)); LVCol.mask = LVCF_WIDTH; LVCol.cx = rectClient.right - rectClient.left - GetSystemMetrics(SM_CXHSCROLL); res = ListView_InsertColumn(GetDlgItem(hDlg, IDC_DIR_LIST), 0, &LVCol); /* Keep a temporary copy of the directory strings in g_pDirInfo. */ for (i = 0; i < nDirInfoCount; i++) { s = g_directoryInfo[i].pfnGetTheseDirs(); t_s = tstring_from_utf8(s); if( !t_s ) return FALSE; if (g_directoryInfo[i].bMulti) { /* Copy the string to our own buffer so that we can mutilate it */ _tcscpy(buf, t_s); g_pDirInfo[i].m_Path = (tPath*)malloc(sizeof(tPath)); if (!g_pDirInfo[i].m_Path) goto error; g_pDirInfo[i].m_Path->m_NumDirectories = 0; token = _tcstok(buf, TEXT(";")); while ((DirInfo_NumDir(g_pDirInfo, i) < MAX_DIRS) && token) { _tcscpy(DirInfo_Path(g_pDirInfo, i, DirInfo_NumDir(g_pDirInfo, i)), token); DirInfo_NumDir(g_pDirInfo, i)++; token = _tcstok(NULL, TEXT(";")); } DirInfo_SetModified(g_pDirInfo, i, FALSE); } else { DirInfo_SetDir(g_pDirInfo, i, -1, t_s); } osd_free(t_s); t_s = NULL; } UpdateDirectoryList(hDlg); return TRUE; error: if( t_s ) osd_free(t_s); Directories_OnDestroy(hDlg); EndDialog(hDlg, -1); return FALSE; }
static BOOL Directories_OnEndLabelEdit(HWND hDlg, NMHDR* pNMHDR) { BOOL bResult = FALSE; NMLVDISPINFO* pDispInfo = (NMLVDISPINFO*)pNMHDR; LVITEM* pItem = &pDispInfo->item; if (pItem->pszText != NULL) { struct stat file_stat; /* Don't allow empty entries. */ if (!strcmp(pItem->pszText, "")) { return FALSE; } /* Check validity of edited directory. */ if (stat(pItem->pszText, &file_stat) == 0 && (file_stat.st_mode & S_IFDIR)) { bResult = TRUE; } else { if (MessageBox(NULL, "Directory does not exist, continue anyway?", "MAME32", MB_OKCANCEL) == IDOK) bResult = TRUE; } } if (bResult == TRUE) { int nType; int i; nType = ComboBox_GetCurSel(GetDlgItem(hDlg, IDC_DIR_COMBO)); switch (nType) { case ROM: case SAMPLE: /* Last item is placeholder for append */ if (pItem->iItem == ListView_GetItemCount(GetDlgItem(hDlg, IDC_DIR_LIST)) - 1) { if (MAX_DIRS <= DirInfo_NumDir(pDirInfo, nType)) return FALSE; for (i = DirInfo_NumDir(pDirInfo, nType); pItem->iItem < i; i--) strcpy(DirInfo_Path(pDirInfo, nType, i), DirInfo_Path(pDirInfo, nType, i - 1)); strcpy(DirInfo_Path(pDirInfo, nType, pItem->iItem), pItem->pszText); pDirInfo->m_Paths[nType].m_bModified = TRUE; DirInfo_NumDir(pDirInfo, nType)++; } else DirInfo_SetDir(pDirInfo, nType, pItem->iItem, pItem->pszText); break; case CFG: case HI: case IMG: case INP: case STATE: case ART: case MEMCARD: case FLYER: case CABINET: case NVRAM: DirInfo_SetDir(pDirInfo, nType, pItem->iItem, pItem->pszText); break; } UpdateDirectoryList(hDlg); ListView_SetItemState(GetDlgItem(hDlg, IDC_DIR_LIST), pItem->iItem, LVIS_FOCUSED | LVIS_SELECTED, LVIS_FOCUSED | LVIS_SELECTED); } return bResult; }