/****************************************************************************\ * * FILEDLG.CPP - Code to manage the Rating Systems dialog. * * gregj 06/27/96 Moved code here from msludlg.cpp and largely rewrote. * \****************************************************************************/ /*INCLUDES--------------------------------------------------------------------*/ #include "msrating.h" #include "ratings.h" #include "mslubase.h" #include "commctrl.h" #include "commdlg.h" #include "buffer.h" #include "filedlg.h" // CProviderDialog // #include "custfile.h" // CCustomFileDialog #include "debug.h" #include #include #include typedef BOOL (APIENTRY *PFNGETOPENFILENAME)(LPOPENFILENAME); DWORD CProviderDialog::aIds[] = { IDC_STATIC1, IDH_RATINGS_SYSTEM_RATSYS_LIST, IDC_PROVIDERLIST, IDH_RATINGS_SYSTEM_RATSYS_LIST, IDC_OPENPROVIDER, IDH_RATINGS_SYSTEM_RATSYS_ADD, IDC_CLOSEPROVIDER, IDH_RATINGS_SYSTEM_RATSYS_REMOVE, IDC_STATIC2, IDH_IGNORE, 0,0 }; CProviderDialog::CProviderDialog( PicsRatingSystemInfo * p_pPRSI ) { m_pPRSI = p_pPRSI; } BOOL CProviderDialog::OpenTemplateDlg( CHAR * szFilename,UINT cbFilename ) { CHAR szFilter[MAXPATHLEN]; CHAR szOpenInfTitle[MAXPATHLEN]; CHAR szInitialDir[MAXPATHLEN]; GetSystemDirectory(szInitialDir, sizeof(szInitialDir)); strcpyf(szFilename,szNULL); MLLoadStringA(IDS_RAT_OPENFILE, szOpenInfTitle,sizeof(szOpenInfTitle)); // have to load the openfile filter in 2 stages, because the string // contains a terminating character and MLLoadString won't load the // whole thing in one go memset(szFilter,0,sizeof(szFilter)); MLLoadStringA(IDS_RAT_FILTER_DESC,szFilter,sizeof(szFilter) - 10); // save some room for the filespec MLLoadStringA(IDS_RAT_FILTER,szFilter+strlenf(szFilter)+1,sizeof(szFilter)- (strlenf(szFilter)+1)); OPENFILENAME ofn; memset(&ofn,0,sizeof(ofn)); ofn.lStructSize = sizeof(ofn); ofn.hwndOwner = m_hWnd; ofn.hInstance = NULL; ofn.lpstrFilter = szFilter; ofn.lpstrFile = szFilename; ofn.nMaxFile = cbFilename; ofn.lpstrTitle = szOpenInfTitle; ofn.lpstrInitialDir = szInitialDir; ofn.Flags = OFN_FILEMUSTEXIST | OFN_PATHMUSTEXIST | OFN_SHAREAWARE | OFN_HIDEREADONLY; BOOL fRet = ::GetOpenFileName( &ofn ); #ifdef NEVER DWORD dwFlags = OFN_FILEMUSTEXIST | OFN_PATHMUSTEXIST | OFN_NONETWORKBUTTON | OFN_SHAREAWARE | OFN_HIDEREADONLY; BOOL fRet = FALSE; CCustomFileDialog cfd( TRUE, // Local Files Only TRUE, // Open File NULL, // Default Extension NULL, // Initial Filename dwFlags, // Open File Flags szFilter, // Filter m_hWnd ); // Parent if ( cfd.DoModal( m_hWnd ) == IDOK ) { fRet = TRUE; lstrcpy( szFilename, cfd.m_szFileName ); } #endif return fRet; } void CProviderDialog::SetHorizontalExtent(HWND hwndLB, LPCSTR pszString) { HDC hDC = ::GetDC(hwndLB); HFONT hFont = (HFONT)::SendMessage(hwndLB, WM_GETFONT, 0, 0); HFONT hfontOld = (HFONT)::SelectObject(hDC, hFont); UINT cxSlop = ::GetSystemMetrics(SM_CXBORDER) * 4; /* 2 for LB border, 2 for margin inside border */ UINT cxNewMaxExtent = 0; SIZE s; if (pszString != NULL) { ::GetTextExtentPoint(hDC, pszString, ::strlenf(pszString), &s); UINT cxCurExtent = (UINT)::SendMessage(hwndLB, LB_GETHORIZONTALEXTENT, 0, 0); if ((UINT)s.cx > cxCurExtent) cxNewMaxExtent = s.cx + cxSlop; } else { UINT cItems = (UINT)::SendMessage(hwndLB, LB_GETCOUNT, 0, 0); for (UINT i=0; i cxNewMaxExtent) cxNewMaxExtent = s.cx; } cxNewMaxExtent += cxSlop; } if (cxNewMaxExtent > 0) ::SendMessage(hwndLB, LB_SETHORIZONTALEXTENT, (WPARAM)cxNewMaxExtent, 0); ::SelectObject(hDC, hfontOld); ::ReleaseDC(hwndLB, hDC); } void CProviderDialog::AddProviderToList(UINT idx, LPCSTR pszFilename) { UINT_PTR iItem = SendDlgItemMessage(IDC_PROVIDERLIST, LB_ADDSTRING, 0, (LPARAM)pszFilename); if (iItem != LB_ERR) { SendDlgItemMessage(IDC_PROVIDERLIST, LB_SETITEMDATA, iItem, (LPARAM)idx); } } BOOL CProviderDialog::InitProviderDlg( void ) { ASSERT( m_pPRSI ); if ( ! m_pPRSI ) { TraceMsg( TF_ERROR, "CProviderDialog::InitProviderDlg() - m_pPRSI is NULL!" ); return FALSE; } for (UINT i = 0; i < (UINT)m_pPRSI->arrpPRS.Length(); ++i) { PicsRatingSystem *pPRS = m_pPRSI->arrpPRS[i]; ProviderData pd; pd.pPRS = pPRS; pd.pprsNew = NULL; pd.nAction = PROVIDER_KEEP; if (!m_aPD.Append(pd)) return FALSE; if(pPRS->etstrName.Get()) { // add provider using name AddProviderToList(i, pPRS->etstrName.Get()); } else if(pPRS->etstrFile.Get()) { // no name - possibly missing file, use filespec instead AddProviderToList(i, pPRS->etstrFile.Get()); } } SetHorizontalExtent(GetDlgItem(IDC_PROVIDERLIST), NULL); ::EnableWindow(GetDlgItem(IDC_CLOSEPROVIDER), FALSE); ::EnableWindow(GetDlgItem(IDC_OPENPROVIDER), TRUE); if (SendDlgItemMessage(IDC_PROVIDERLIST, LB_SETCURSEL, 0, 0) != LB_ERR) { ::EnableWindow(GetDlgItem(IDC_CLOSEPROVIDER), TRUE); } return TRUE; } void CProviderDialog::EndProviderDlg(BOOL fRet) { ASSERT( m_pPRSI ); if ( ! m_pPRSI ) { TraceMsg( TF_ERROR, "CProviderDialog::EndProviderDlg() - m_pPRSI is NULL!" ); return; } /* Go through our auxiliary array and delete any provider structures which * we added in this dialog. Note that if the user previously hit OK, the * providers which were added will be marked as KEEP when they're put back * in the main data structure, so we won't delete them here. */ UINT cProviders = m_aPD.Length(); for (UINT i=0; iarrpPRS.ClearAll(); UINT cItems = m_aPD.Length(); for (UINT i=0; iarrpPRS.Append(m_aPD[i].pprsNew); delete m_aPD[i].pPRS; m_aPD[i].pPRS = NULL; m_aPD[i].pprsNew = NULL; /* protect from cleanup code */ } else if (!(m_aPD[i].pPRS->dwFlags & PRS_ISVALID)) { delete m_aPD[i].pPRS; m_aPD[i].pPRS = NULL; } else { CheckUserSettings(m_aPD[i].pPRS); m_pPRSI->arrpPRS.Append(m_aPD[i].pPRS); } break; case PROVIDER_ADD: if (m_aPD[i].pPRS != NULL) { CheckUserSettings(m_aPD[i].pPRS); m_pPRSI->arrpPRS.Append(m_aPD[i].pPRS); m_aPD[i].nAction = PROVIDER_KEEP; /* keep this one now */ } break; default: ASSERT(FALSE); } } if (m_pPRSI->arrpPRS.Length() == 0) { if (!fPrompted && MyMessageBox(m_hWnd, IDS_NO_PROVIDERS, IDS_GENERIC, MB_YESNO) == IDYES) { return; } m_pPRSI->fRatingInstalled = FALSE; } else { m_pPRSI->fRatingInstalled = TRUE; } EndProviderDlg(TRUE); } void CProviderDialog::RemoveProvider( void ) { ASSERT( m_pPRSI ); if ( ! m_pPRSI ) { TraceMsg( TF_ERROR, "CProviderDialog::AddProvider() - m_pPRSI is NULL!" ); return; } UINT_PTR i = SendDlgItemMessage( IDC_PROVIDERLIST, LB_GETCURSEL,0,0); if (i != LB_ERR) { UINT idx = (UINT)SendDlgItemMessage( IDC_PROVIDERLIST, LB_GETITEMDATA, i, 0); if (idx < (UINT)m_aPD.Length()) { /* If the user added the provider in this dialog session, just * delete it from the array. The null pPRS pointer will be * detected later, so it's OK to leave the array element itself. * (Yes, if the user adds and removes an item over and over, we * consume 12 bytes of memory each time. Oh well.) * * If the item was there before the user launched the dialog, * then just mark it for deletion on OK. */ if (m_aPD[idx].nAction == PROVIDER_ADD) { delete m_aPD[idx].pPRS; m_aPD[idx].pPRS = NULL; } else m_aPD[idx].nAction = PROVIDER_DEL; } SendDlgItemMessage(IDC_PROVIDERLIST, LB_DELETESTRING, i, 0); ::EnableWindow(GetDlgItem(IDC_CLOSEPROVIDER), FALSE); SendDlgItemMessage(IDC_PROVIDERLIST, LB_SETCURSEL,0,0); ::SetFocus(GetDlgItem(IDOK)); SetHorizontalExtent(GetDlgItem(IDC_PROVIDERLIST), NULL); } } /* Returns zero if the two PicsRatingSystems have the same RAT-filename, * non-zero otherwise. Handles the '*' marker on the end for failed * loads. It is assumed that only pprsOld may have that marker. */ int CProviderDialog::CompareProviderNames(PicsRatingSystem *pprsOld, PicsRatingSystem *pprsNew) { if (!pprsOld->etstrFile.fIsInit()) return 1; UINT cbNewName = ::strlenf(pprsNew->etstrFile.Get()); LPSTR pszOld = pprsOld->etstrFile.Get(); int nCmp = ::strnicmpf(pprsNew->etstrFile.Get(), pszOld, cbNewName); if (nCmp != 0) return nCmp; pszOld += cbNewName; if (*pszOld == '\0' || (*pszOld == '*' && *(pszOld+1) == '\0')) return 0; return 1; } void CProviderDialog::AddProvider( PSTR szAddFileName ) { BOOL fAdd=FALSE; char szFileName[MAXPATHLEN+1]; ASSERT( m_pPRSI ); if ( ! m_pPRSI ) { TraceMsg( TF_ERROR, "CProviderDialog::AddProvider() - m_pPRSI is NULL!" ); return; } if (szAddFileName!=NULL) { lstrcpy(szFileName,szAddFileName); fAdd=TRUE; } else { fAdd=OpenTemplateDlg(szFileName, sizeof(szFileName)); } if (fAdd==TRUE) { PicsRatingSystem *pPRS; HRESULT hres = LoadRatingSystem(szFileName, &pPRS); if (FAILED(hres)) { if (pPRS != NULL) { pPRS->ReportError(hres); delete pPRS; pPRS = NULL; } } else { /* Check to see if this guy is already in the list. If he is, * the user might have said to delete him; in that case, put * him back. Otherwise, the system is already installed, so * tell the user he doesn't have to install it again. */ for (UINT i=0; i<(UINT)m_aPD.Length(); i++) { ProviderData *ppd = &m_aPD[i]; if (ppd->pPRS==NULL) { //This system was added and then removed during //this dialog session. It will be detected later, //so just skip it and keep appending entries. continue; } if (!CompareProviderNames(ppd->pPRS, pPRS)) { if (!(ppd->pPRS->dwFlags & PRS_ISVALID) && (ppd->pprsNew == NULL)) ppd->pprsNew = pPRS; else { delete pPRS; /* don't need copy */ pPRS = NULL; } if (ppd->nAction == PROVIDER_DEL) { ppd->nAction = PROVIDER_KEEP; AddProviderToList(i, ppd->pPRS->etstrName.Get()); } else { MyMessageBox(m_hWnd, IDS_ALREADY_INSTALLED, IDS_GENERIC, MB_OK); } return; } } /* This guy isn't already in the list. Add him to the listbox * and to the array. */ ProviderData pd; pd.nAction = PROVIDER_ADD; pd.pPRS = pPRS; pd.pprsNew = NULL; if (!m_aPD.Append(pd)) { MyMessageBox(m_hWnd, IDS_LOADRAT_MEMORY, IDS_GENERIC, MB_OK | MB_ICONWARNING); delete pPRS; pPRS = NULL; return; } AddProviderToList(m_aPD.Length() - 1, pPRS->etstrName.Get()); ::SetFocus(GetDlgItem(IDOK)); SetHorizontalExtent(GetDlgItem(IDC_PROVIDERLIST), szFileName); } } } LRESULT CProviderDialog::OnInitDialog(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled) { ASSERT( m_pPRSI ); if ( ! m_pPRSI ) { TraceMsg( TF_ERROR, "CProviderDialog::OnInitDialog() - m_pPRSI is NULL!" ); return 0L; } if ( ! InitProviderDlg() ) { MyMessageBox(m_hWnd, IDS_LOADRAT_MEMORY, IDS_GENERIC, MB_OK | MB_ICONSTOP); EndProviderDlg(FALSE); } if ( m_pPRSI->lpszFileName != NULL ) { AddProvider( m_pPRSI->lpszFileName ); } bHandled = FALSE; return 1L; // Let the system set the focus } LRESULT CProviderDialog::OnSelChange(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled) { if (SendDlgItemMessage(IDC_PROVIDERLIST, LB_GETCURSEL, 0,0) >= 0) { ::EnableWindow(GetDlgItem(IDC_CLOSEPROVIDER), TRUE); bHandled = TRUE; } return 0L; } LRESULT CProviderDialog::OnOK(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled) { CommitProviderDlg(); return 0L; } LRESULT CProviderDialog::OnCancel(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled) { EndProviderDlg(FALSE); return 0L; } LRESULT CProviderDialog::OnCloseProvider(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled) { RemoveProvider(); return 0L; } LRESULT CProviderDialog::OnOpenProvider(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled) { AddProvider(); return 0L; } LRESULT CProviderDialog::OnHelp(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled) { SHWinHelpOnDemandWrap((HWND)((LPHELPINFO)lParam)->hItemHandle, ::szHelpFile, HELP_WM_HELP, (DWORD_PTR)(LPSTR)aIds); return 0L; } LRESULT CProviderDialog::OnContextMenu(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled) { SHWinHelpOnDemandWrap((HWND)wParam, ::szHelpFile, HELP_CONTEXTMENU, (DWORD_PTR)(LPVOID)aIds); return 0L; } INT_PTR DoProviderDialog(HWND hDlg, PicsRatingSystemInfo *pPRSI) { CProviderDialog provDialog( pPRSI ); return provDialog.DoModal( hDlg ); }