/**************************************************************************** * * Microsoft Confidential * Copyright (c) Microsoft Corporation 1994 * All rights reserved * ***************************************************************************/ #ifdef UNIX_FEATURE_ALIAS #undef UNICODE #include "inetcplp.h" #include "shalias.h" #include "mluisupp.h" STDAPI RefreshGlobalAliasList(); #define GETALIASLIST(hDlg) ((LPALIASINFO )GetWindowLong(hDlg, DWL_USER))->aliasList #define GETALIASDELLIST(hDlg) ((LPALIASINFO )GetWindowLong(hDlg, DWL_USER))->aliasDelList BOOL CALLBACK AlEditDlgProc( HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam); VOID WINAPI InitAliasListStyle(HWND hwndLV, DWORD dwView); static TCHAR g_szAliasKey[] = TEXT("Software\\Microsoft\\Internet Explorer\\Unix\\Alias"); // InitListViewImageLists - creates image lists for a list view. // Returns TRUE if successful, or FALSE otherwise. // hwndLV - handle to the list view control. BOOL WINAPI InitAliasListImageLists(HWND hwndLV) { HICON hiconItem; // icon for list view items HIMAGELIST himlLarge; // image list for icon view HIMAGELIST himlSmall; // image list for other views // Create the full-sized and small icon image lists. himlLarge = ImageList_Create(GetSystemMetrics(SM_CXICON), GetSystemMetrics(SM_CYICON), TRUE, 1, 1); himlSmall = ImageList_Create(GetSystemMetrics(SM_CXSMICON), GetSystemMetrics(SM_CYSMICON), TRUE, 1, 1); // Add an icon to each image list. // note that IDI_WALLET has to live in inetcplc.rc because // it's used by a localizable dialog, hence the MLGetHinst() hiconItem = LoadIcon(MLGetHinst(), MAKEINTRESOURCE(IDI_WALLET)); ImageList_AddIcon(himlLarge, hiconItem); ImageList_AddIcon(himlSmall, hiconItem); DeleteObject(hiconItem); // Assign the image lists to the list view control. ListView_SetImageList(hwndLV, himlLarge, LVSIL_NORMAL); ListView_SetImageList(hwndLV, himlSmall, LVSIL_SMALL); return TRUE; } // InitListViewItems - adds items and subitems to a list view. // Returns TRUE if successful, or FALSE otherwise. // hwndLV - handle to the list view control. // pfData - text file containing list view items with columns // separated by semicolons. BOOL WINAPI InitAliasListItems(HWND hwndLV, HDPA aliasList) { PSTR pszEnd; int iItem; int iSubItem; LVITEM lvi; // Initialize LVITEM members that are common to all items. lvi.mask = LVIF_TEXT | LVIF_IMAGE | LVIF_PARAM | LVIF_STATE; lvi.state = 0; lvi.stateMask = 0; lvi.pszText = LPSTR_TEXTCALLBACK; // app. maintains text lvi.iImage = 0; // image list index int aliasCount = DPA_GetPtrCount( aliasList ); for (int i = 0; i< aliasCount; i++) { CAlias * ptr = (CAlias *)DPA_FastGetPtr( aliasList, i ); // Initialize item-specific LVITEM members. lvi.iItem = i; lvi.iSubItem = 0; lvi.lParam = (LPARAM) NULL; // item data // Add the item. ListView_InsertItem(hwndLV, &lvi); // Initialize item-specific LVITEM members. ListView_SetItemText(hwndLV, i, 0, (TCHAR*)GetAliasName(ptr)); ListView_SetItemText(hwndLV, i, 1, (TCHAR*)GetAliasUrl(ptr)); } return TRUE; } // InitListViewColumns - adds columns to a list view control. // Returns TRUE if successful, or FALSE otherwise. // hwndLV - handle to the list view control. BOOL WINAPI InitAliasListColumns(HWND hwndLV) { TCHAR g_achTemp[256]; // temporary buffer LVCOLUMN lvc; int iCol; // Initialize the LVCOLUMN structure. lvc.mask = LVCF_FMT | LVCF_WIDTH | LVCF_TEXT | LVCF_SUBITEM; lvc.fmt = LVCFMT_LEFT; lvc.pszText = g_achTemp; // Add the columns. for (iCol = 0; iCol < ALIASLIST_COLUMNS; iCol++) { lvc.iSubItem = iCol; lvc.cx = 100 + (iCol*150); MLLoadString(IDS_FIRSTCOLUMN + iCol, g_achTemp, sizeof(g_achTemp)); if (ListView_InsertColumn(hwndLV, iCol, &lvc) == -1) return FALSE; } return TRUE; } // SetView - sets a list view's window style to change the view. // hwndLV - handle to the list view control. // dwView - value specifying a view style. VOID WINAPI InitAliasListStyle(HWND hwndLV, DWORD dwView) { // Get the current window style. DWORD dwStyle = ListView_GetExtendedListViewStyle(hwndLV); ListView_SetExtendedListViewStyle( hwndLV, (dwStyle|dwView) ); // SetWindowLong(hwndLV, GWL_EXSTYLE, (dwStyle | dwView)); } // AliasDel - deletes alias from active list and moves it to the // del list to be delete later. // hDlg - handle of the propertysheet dialog. BOOL WINAPI AliasDel( HWND hDlg ) { int index = 0, iItem = 0; HWND lb = GetDlgItem( hDlg, IDC_ALIAS_LIST ); HDPA aliasList = GETALIASLIST(hDlg); HDPA aliasDelList = GETALIASDELLIST(hDlg); BOOL fAsked = FALSE; BOOL fChanged = FALSE; int count = ListView_GetItemCount(lb); // Get the selection from the Listview and remove it from the // active alias list, add it to the aliaslist to be deleted. while( (iItem = ListView_GetNextItem( lb, -1, LVNI_SELECTED ) ) != -1 ) { TCHAR str[MAX_URL_STRING]; *str = TEXT('\0'); if( !fAsked ) { TCHAR question[MAX_PATH]; wsprintf( question, "Are you Sure you want to delete the selected items?"); if( MessageBox( GetParent(hDlg), question, TEXT("Delete Alias"), MB_YESNO ) != IDYES ) return FALSE; fAsked = TRUE; } // if( !ListView_GetCheckState(lb, iItem) ) continue; ListView_GetItemText(lb, iItem, 0, str, MAX_URL_STRING ); if(*str) { if( (index = FindAliasIndex(aliasList, str) ) != -1 ) { CAlias * ptr = (CAlias *)DPA_FastGetPtr( aliasList, index ); if( ptr ) { CAlias *pAlias = (CAlias *)DPA_DeletePtr( aliasList, index ); // Add to List of deleted entries DPA_InsertPtr( aliasDelList, 0x7FFF, pAlias ); ListView_DeleteItem(lb, iItem); fChanged = TRUE; LocalFree( str ); } } } } if( fChanged ) { InitAliasDialog( hDlg, NULL, FALSE ); PropSheet_Changed(GetParent(hDlg),hDlg); } return TRUE; } // AliasEdit - Called in response to the Edit button pressed. // hDlg - Handle to the property sheet BOOL WINAPI AliasEdit( HWND hDlg ) { CAlias * ptr = GetCurrentAlias( hDlg ); HDPA aliasDelList = GETALIASDELLIST(hDlg); if( ptr ) { CAlias *ptrOld = (CAlias *)CreateAlias( (LPTSTR)GetAliasName(ptr) ); ALIASEDITINFO aliasEditInfo = { GETALIASLIST(hDlg), ptr, hDlg, EDIT_ALIAS }; if(MLDialogBoxParamWrap( MLGetHinst(), MAKEINTRESOURCE(IDD_ALIAS_EDIT), hDlg, AlEditDlgProc, (LPARAM)&aliasEditInfo ) == 2 ) { // Add old alias to del list if alias name changes. LPCTSTR aliasNew = GetAliasName(ptr); LPCTSTR aliasOld = GetAliasName(ptrOld); if( StrCmp( aliasNew, aliasOld) ) DPA_InsertPtr( aliasDelList, 0x7FFF, ptrOld ); else DestroyAlias( ptrOld ); InitAliasDialog( hDlg, ptr, FALSE ); PropSheet_Changed(GetParent(hDlg),hDlg); } } return TRUE; } // AliasEdit - Called in response to the Add button pressed. // hDlg - Handle to the property sheet BOOL WINAPI AliasAdd( HWND hDlg) { CAlias * ptr = (CAlias *)CreateAlias( TEXT("") ); if ( ptr ) { ALIASEDITINFO aliasEditInfo = { GETALIASLIST(hDlg), ptr, hDlg, ADD_ALIAS }; if(MLDialogBoxParamWrap( MLGetHinst(), MAKEINTRESOURCE(IDD_ALIAS_EDIT), hDlg, AlEditDlgProc, (LPARAM)&aliasEditInfo ) == 2) { InitAliasDialog( hDlg, ptr, FALSE ); PropSheet_Changed(GetParent(hDlg),hDlg); } DestroyAlias(ptr); } return TRUE; } // GetCurrentAlias - returns currently selected alis from the listview // Returns - Selected alias // hDlg - handle to the property sheet. CAlias * GetCurrentAlias( HWND hDlg ) { int index = 0, iItem = 0; HDPA aliasList = GETALIASLIST( hDlg ); HWND lb = GetDlgItem( hDlg, IDC_ALIAS_LIST ); if( ListView_GetSelectedCount(lb) == 1 && ( (iItem = ListView_GetNextItem( lb, -1, LVNI_SELECTED ) ) != -1 ) ) { TCHAR str[MAX_URL_STRING]; *str = TEXT('\0'); ListView_GetItemText(lb, iItem, 0, str, MAX_URL_STRING ); if(*str) { if( (index = FindAliasIndex(aliasList, str) ) != -1 ) { CAlias * ptr = (CAlias *)DPA_FastGetPtr( aliasList, index ); return ptr; } } } return NULL; } // InitAliasDialog - Initalizes the aliases dialog // Returns - TRUE if succeeded/FALSE if failed. // hDlg - handle to the property sheet. // fFullInit - Init listview columns/styles/etc BOOL FAR PASCAL InitAliasDialog(HWND hDlg, CAlias * current, BOOL fFullInit) { HRESULT hr = E_FAIL; HKEY hKey; HWND listBox = GetDlgItem( hDlg, IDC_ALIAS_LIST ); TCHAR * displayString; // Allocate memory for a structure which will hold all the info // gathered from this page // LPALIASINFO pgti = (LPALIASINFO)GetWindowLong(hDlg, DWL_USER); pgti->fInternalChange = FALSE; SendMessage( listBox, LVM_DELETEALLITEMS, 0, 0L ); // Initailize ListView if( fFullInit ) { SendDlgItemMessage( hDlg, IDC_ALIAS_EDIT, EM_LIMITTEXT, 255, 0 ); SendDlgItemMessage( hDlg, IDC_URL_EDIT, EM_LIMITTEXT, MAX_URL_STRING-1, 0 ); // InitAliasListStyle(listBox, LVS_EX_CHECKBOXES|LVS_EX_FULLROWSELECT ); InitAliasListStyle(listBox, LVS_EX_FULLROWSELECT ); InitAliasListImageLists(listBox); InitAliasListColumns(listBox); } InitAliasListItems(listBox, GETALIASLIST(hDlg)); return TRUE; } // AliasApply - This function is called in response to pressing the apply/ok // button on the property sheet dialog. void AliasApply(HWND hDlg) { HDPA aliasDelList = GETALIASDELLIST(hDlg); HDPA aliasList = GETALIASLIST(hDlg); ASSERT(aliasList); if( aliasDelList ) { int count = DPA_GetPtrCount( aliasDelList ); for(int i=count-1; i>=0; i--) { CAlias * pAlias = (CAlias *)DPA_DeletePtr( aliasDelList, i ); if(pAlias) { pAlias->Delete(); DestroyAlias(pAlias); } } } // Save the currently changed aliases SaveAliases( aliasList ); // Refresh Global Alias List. RefreshGlobalAliasList(); } // AliasDlgProc - Alias PropertySheet dialog Proc // Returns BOOL // hDlg - Handle to the property sheet window // wParam, lParam - Word/Long param BOOL CALLBACK AliasDlgProc( HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) { // get our tab info structure LPALIASINFO pgti; if (uMsg == WM_INITDIALOG) { // Allocate memory for a structure which will hold all the info // gathered from this page // LPALIASINFO pgti = (LPALIASINFO)LocalAlloc(LPTR, sizeof(tagALIASINFO)); if (!pgti) { EndDialog(hDlg, 0); return FALSE; } pgti->hDlg = hDlg; pgti->fInternalChange = FALSE; SetWindowLong(hDlg, DWL_USER, (LPARAM)pgti); if((pgti->aliasList = DPA_Create(4)) != (HDPA)NULL ) { pgti->aliasDelList = DPA_Create(4); LoadAliases( pgti->aliasList ); // Initailize dialog if( InitAliasDialog(hDlg, NULL, TRUE) ) { return TRUE; } else { TCHAR szTitle[MAX_PATH]; MLLoadString(IDS_ERROR_REGISTRY_TITLE, szTitle, sizeof(szTitle)); MessageBox( GetParent(hDlg), TEXT("Cannot read aliases from registry."), szTitle, MB_OK ); return FALSE; } } else return FALSE; } else pgti = (LPALIASINFO)GetWindowLong(hDlg, DWL_USER); if (!pgti) return FALSE; switch (uMsg) { case WM_NOTIFY: { NMHDR *lpnm = (NMHDR *) lParam; switch (lpnm->code) { case NM_DBLCLK: if(lpnm->idFrom == IDC_ALIAS_LIST) AliasEdit( pgti->hDlg ); break; case PSN_QUERYCANCEL: case PSN_KILLACTIVE: case PSN_RESET: SetWindowLong( hDlg, DWL_MSGRESULT, FALSE ); return TRUE; case PSN_APPLY: AliasApply(hDlg); break; } break; } case WM_COMMAND: { if(HIWORD(wParam) == BN_CLICKED) { switch (LOWORD(wParam)) { case IDC_ALIAS_ADD: AliasAdd( pgti->hDlg ); break; case IDC_ALIAS_EDIT: AliasEdit( pgti->hDlg ); break; case IDC_ALIAS_DEL: AliasDel( pgti->hDlg ); break; } } } break; case WM_DESTROY: // Delete registry information if( pgti->aliasList ) { FreeAliases(pgti->aliasList); DPA_Destroy(pgti->aliasList); } if( pgti->aliasDelList ) { FreeAliases(pgti->aliasDelList); DPA_Destroy(pgti->aliasDelList); } if (pgti) LocalFree(pgti); SetWindowLong(hDlg, DWL_USER, (LONG)NULL); // make sure we don't re-enter break; } return FALSE; } BOOL CALLBACK AlEditDlgProc( HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) { CAlias * pAlias; LPALIASEDITINFO pAliasInfo; if (uMsg == WM_INITDIALOG) { TCHAR achTemp[256]; pAliasInfo = (LPALIASEDITINFO)lParam; pAlias = pAliasInfo->alias; if( !lParam ) { EndDialog(hDlg, 0); return FALSE; } SendDlgItemMessage( hDlg, IDC_ALIAS_EDIT, WM_SETTEXT, 0, (LPARAM)GetAliasName(pAlias)); SendDlgItemMessage( hDlg, IDC_URL_EDIT, WM_SETTEXT, 0, (LPARAM)GetAliasUrl(pAlias)); if( pAliasInfo->dwFlags & EDIT_ALIAS ) { // EnableWindow( GetDlgItem(hDlg, IDC_ALIAS_EDIT ), FALSE ); MLLoadString(IDS_TITLE_ALIASEDIT, achTemp, sizeof(achTemp)); SendMessage( hDlg, WM_SETTEXT, 0, (LPARAM)achTemp); } else { MLLoadString(IDS_TITLE_ALIASADD, achTemp, sizeof(achTemp)); SendMessage( hDlg, WM_SETTEXT, 0, (LPARAM)achTemp); } SetWindowLong(hDlg, DWL_USER, (LPARAM)pAliasInfo); EnableWindow( GetDlgItem(hDlg, IDOK), FALSE ); } else pAliasInfo = (LPALIASEDITINFO)GetWindowLong(hDlg, DWL_USER); if (!pAlias) return FALSE; switch (uMsg) { case WM_COMMAND: switch (GET_WM_COMMAND_ID(wParam, lParam)) { case IDC_ALIAS_EDIT: case IDC_URL_EDIT: if (GET_WM_COMMAND_CMD(wParam, lParam) == EN_UPDATE) { EnableWindow( GetDlgItem(hDlg, IDOK), TRUE ); } break; case IDOK: { if( pAliasInfo ) { TCHAR alias[MAX_URL_STRING]; TCHAR szurl[MAX_URL_STRING]; SendDlgItemMessage( hDlg, IDC_ALIAS_EDIT, WM_GETTEXT, MAX_URL_STRING, (LPARAM)alias ); SendDlgItemMessage( hDlg, IDC_URL_EDIT, WM_GETTEXT, MAX_URL_STRING, (LPARAM)szurl ); EatSpaces( alias ); if( !*alias ) { EndDialog( hDlg, 1 ); break; } if( pAliasInfo->dwFlags & ADD_ALIAS && *alias) { if(AddAliasToList( pAliasInfo->aliasList, alias, szurl, hDlg )) EndDialog( hDlg, 2); } else if( pAliasInfo->dwFlags & EDIT_ALIAS ) { CAlias * ptr = pAliasInfo->alias; if( StrCmp(GetAliasName(ptr), alias) ) if(FindAliasIndex( pAliasInfo->aliasList, alias ) != -1) { MessageBox( hDlg, TEXT("Alias with same name already exists"), TEXT("Edit Alias"), MB_OK|MB_ICONSTOP ); break; } SetAliasInfo(ptr, alias, szurl); EndDialog( hDlg, 2); } break; } else EndDialog( hDlg, 1 ); break; } case IDCANCEL: { EndDialog( hDlg, 1 ); } } break; case WM_DESTROY: SetWindowLong(hDlg, DWL_USER, (LONG)NULL); break; } return FALSE; } #endif /* UNIX_FEATURE_ALIAS */