////////////////////////////////////////////////////////////////////////////// /*++ Copyright (C) Microsoft Corporation, 1998 - 2001 Module Name: IASMultivaluedEditorPage.cpp Abstract: Implementation file for the CMultivaluedEditorPage class. Revision History: mmaguire 06/25/98 - created --*/ ////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////// // BEGIN INCLUDES // // standard includes: // #include "Precompiled.h" // // where we can find declaration for main class in this file: // #include "IASMultivaluedEditorPage.h" // // where we can find declarations needed in this file: // #include "iasdebug.h" // // END INCLUDES ////////////////////////////////////////////////////////////////////////////// const int NOTHING_SELECTED = -1; #define ATTRIBUTE_VENDOR_COLUMN_WIDTH 120 #define ATTRIBUTE_VALUE_COLUMN_WIDTH 300 ////////////////////////////////////////////////////////////////////////////// /*++ ::GetSelectedItemIndex Utility function which returns index value of first selected item in list control. Returns NOTHING_SELECTED if no item is selected. --*/ ////////////////////////////////////////////////////////////////////////////// inline int GetSelectedItemIndex( CListCtrl & ListCtrl ) { int iIndex = 0; int iFlags = LVNI_ALL | LVNI_SELECTED; // Note: GetNextItem excludes the current item passed in. So to // find the first item which matches, you must pass in -1. iIndex = ListCtrl.GetNextItem( -1, iFlags ); // Note: GetNextItem returns -1 (which is NOTHING_SELECTED for us) if it can't find anything. return iIndex; } ///////////////////////////////////////////////////////////////////////////// // CMultivaluedEditorPage property page IMPLEMENT_DYNCREATE(CMultivaluedEditorPage, CHelpDialog) BEGIN_MESSAGE_MAP(CMultivaluedEditorPage, CHelpDialog) //{{AFX_MSG_MAP(CMultivaluedEditorPage) ON_NOTIFY(NM_DBLCLK, IDC_IAS_LIST_MULTI_ATTRS, OnDblclkListIasMultiAttrs) ON_NOTIFY(LVN_ITEMCHANGED, IDC_IAS_LIST_MULTI_ATTRS, OnItemChangedListIasMultiAttrs) ON_BN_CLICKED(IDC_IAS_BUTTON_ADD_VALUE, OnButtonAddValue) ON_BN_CLICKED(IDC_IAS_BUTTON_MOVE_UP, OnButtonMoveUp) ON_BN_CLICKED(IDC_IAS_BUTTON_MOVE_DOWN, OnButtonMoveDown) ON_BN_CLICKED(IDC_IAS_BUTTON_REMOVE, OnButtonRemove) ON_BN_CLICKED(IDC_IAS_BUTTON_EDIT, OnButtonEdit) // ON_WM_CONTEXTMENU() // ON_WM_HELPINFO() //}}AFX_MSG_MAP END_MESSAGE_MAP() ////////////////////////////////////////////////////////////////////////////// /*++ CMultivaluedEditorPage::CMultivaluedEditorPage Constructor --*/ ////////////////////////////////////////////////////////////////////////////// CMultivaluedEditorPage::CMultivaluedEditorPage() : CHelpDialog(CMultivaluedEditorPage::IDD) { TRACE_FUNCTION("CMultivaluedEditorPage::CMultivaluedEditorPage"); //{{AFX_DATA_INIT(CMultivaluedEditorPage) m_strAttrFormat = _T(""); m_strAttrName = _T(""); m_strAttrType = _T(""); //}}AFX_DATA_INIT m_fIsDirty = FALSE; } ////////////////////////////////////////////////////////////////////////////// /*++ CMultivaluedEditorPage::~CMultivaluedEditorPage Destructor --*/ ////////////////////////////////////////////////////////////////////////////// CMultivaluedEditorPage::~CMultivaluedEditorPage() { TRACE_FUNCTION("CMultivaluedEditorPage::~CMultivaluedEditorPage"); } ////////////////////////////////////////////////////////////////////////////// /*++ CMultivaluedEditorPage::SetData --*/ ////////////////////////////////////////////////////////////////////////////// HRESULT CMultivaluedEditorPage::SetData( IIASAttributeInfo *pIASAttributeInfo, VARIANT * pvarVariant ) { TRACE_FUNCTION("CMultivaluedEditorPage::SetData"); // ISSUE: Should assert that pvarVariant contains a safe array. HRESULT hr = S_OK; // Store off some pointers. m_spIASAttributeInfo = pIASAttributeInfo; m_pvarData = pvarVariant; // Open the variant up into a safe array of its constiuent parts. // To have this page close the array back up again and save it // using the pvarVariant pointer supplied above, call CommitArrayToVariant. try { // Check to see whether the variant passed was empty. if( V_VT( m_pvarData ) == VT_EMPTY ) { // Create a new 1-dimensional safearray with no elements. DWORD dwInitialElements = 0; m_osaValueList.Create( VT_VARIANT, 1, &dwInitialElements ); } else { _ASSERTE( V_VT( m_pvarData ) == (VT_VARIANT | VT_ARRAY) ); // This creates a new copy of the SAFEARRAY pointed to by m_pvarData // wrapped by the standard COleSafeArray instance m_osaValueList. m_osaValueList = m_pvarData; } } catch(...) { return E_FAIL; } return hr; } ////////////////////////////////////////////////////////////////////////////// /*++ CMultivaluedEditorPage::DoDataExchange --*/ ////////////////////////////////////////////////////////////////////////////// void CMultivaluedEditorPage::DoDataExchange(CDataExchange* pDX) { TRACE_FUNCTION("CMultivaluedEditorPage::DoDataExchange"); CHelpDialog::DoDataExchange(pDX); //{{AFX_DATA_MAP(CMultivaluedEditorPage) DDX_Control(pDX, IDC_IAS_LIST_MULTI_ATTRS, m_listMultiValues); DDX_Text(pDX, IDC_IAS_EDIT_MULTI_ATTR_FORMAT, m_strAttrFormat); DDX_Text(pDX, IDC_IAS_EDIT_MULTI_ATTR_NAME, m_strAttrName); DDX_Text(pDX, IDC_IAS_EDIT_MULTI_ATTR_NUMBER, m_strAttrType); //}}AFX_DATA_MAP } ///////////////////////////////////////////////////////////////////////////// // CMultivaluedEditorPage message handlers ////////////////////////////////////////////////////////////////////////////// /*++ CMultivaluedEditorPage::OnInitDialog --*/ ////////////////////////////////////////////////////////////////////////////// BOOL CMultivaluedEditorPage::OnInitDialog() { TRACE_FUNCTION("CMultivaluedEditorPage::OnInitDialog"); CHelpDialog::OnInitDialog(); HRESULT hr = S_OK; // // first, set the list box to 3 columns // LVCOLUMN lvc; ::CString strColumnHeader; WCHAR wzColumnHeader[MAX_PATH]; // initialize the LVCOLUMN structure lvc.mask = LVCF_FMT | LVCF_WIDTH | LVCF_TEXT | LVCF_SUBITEM; lvc.fmt = LVCFMT_LEFT; lvc.pszText = wzColumnHeader; // Add the vendor column. strColumnHeader.LoadString(IDS_IAS_MULTI_ATTR_COLUMN_VENDOR); wcscpy(wzColumnHeader, strColumnHeader); lvc.cx = ATTRIBUTE_VENDOR_COLUMN_WIDTH; m_listMultiValues.InsertColumn(0, &lvc); // Add the value column. strColumnHeader.LoadString(IDS_IAS_MULTI_ATTR_COLUMN_VALUE); wcscpy(wzColumnHeader, strColumnHeader); lvc.cx = ATTRIBUTE_VALUE_COLUMN_WIDTH; m_listMultiValues.InsertColumn(1, &lvc); hr = UpdateAttrListCtrl(); // Take action based on whether list is empty or not. DWORD dwSize; try { dwSize = m_osaValueList.GetOneDimSize(); } catch(...) { dwSize = 0; } if( dwSize > 0 ) { // We have at least one element. // Select the first element. m_listMultiValues.SetItemState(0, LVIS_FOCUSED, LVIS_FOCUSED); m_listMultiValues.SetItemState(0, LVIS_SELECTED, LVIS_SELECTED); } else { // We are currently empty. GetDlgItem(IDOK)->EnableWindow(FALSE); GetDlgItem(IDC_IAS_BUTTON_MOVE_UP)->EnableWindow(FALSE); GetDlgItem(IDC_IAS_BUTTON_MOVE_DOWN)->EnableWindow(FALSE); GetDlgItem(IDC_IAS_BUTTON_REMOVE)->EnableWindow(FALSE); GetDlgItem(IDC_IAS_BUTTON_EDIT)->EnableWindow(FALSE); } return TRUE; // return TRUE unless you set the focus to a control // EXCEPTION: OCX Property Pages should return FALSE } ////////////////////////////////////////////////////////////////////////////// /*++ CMultivaluedEditorPage::UpdateAttrListCtrl --*/ ////////////////////////////////////////////////////////////////////////////// HRESULT CMultivaluedEditorPage::UpdateAttrListCtrl() { TRACE_FUNCTION("CMultivaluedEditorPage::UpdateAttrListCtrl"); HRESULT hr = S_OK; CComPtr spIASAttributeEditor; // Get the editor to use. hr = SetUpAttributeEditor( m_spIASAttributeInfo.p, &spIASAttributeEditor ); if( FAILED( hr ) ) return hr; // // clear up the whole list first // m_listMultiValues.DeleteAllItems(); try { DWORD dwSize = m_osaValueList.GetOneDimSize(); // number of multi-valued attrs. // Lock the safearray. This wrapper class will unlock as soon as it goes out of scope. CMyOleSafeArrayLock osaLock( m_osaValueList ); for (long lIndex = 0; (DWORD) lIndex < dwSize; lIndex++) { VARIANT * pvar; m_osaValueList.PtrOfIndex( &lIndex, (void**) &pvar ); CComBSTR bstrVendor; CComBSTR bstrValue; CComBSTR bstrReserved; // Ignore HRESULT if fails -- we will just end up with empty strings. HRESULT hrTemp = spIASAttributeEditor->GetDisplayInfo(m_spIASAttributeInfo.p, pvar, &bstrVendor, &bstrValue, &bstrReserved ); m_listMultiValues.InsertItem(lIndex, bstrVendor ); m_listMultiValues.SetItemText( lIndex, 1, bstrValue ); } } catch(...) { return E_FAIL; } return hr; } ////////////////////////////////////////////////////////////////////////////// /*++ CMultivaluedEditorPage::OnDblclkListIasMultiAttrs --*/ ////////////////////////////////////////////////////////////////////////////// void CMultivaluedEditorPage::OnDblclkListIasMultiAttrs(NMHDR* pNMHDR, LRESULT* pResult) { TRACE_FUNCTION("CMultivaluedEditorPage::OnDblclkListIasMultiAttrs"); // // see if there is an item already selected in ProfAttr list // int iSelected = GetSelectedItemIndex(m_listMultiValues); if (NOTHING_SELECTED == iSelected ) { // do nothing return; } HRESULT hr; hr = EditItemInList( iSelected ); *pResult = 0; } ////////////////////////////////////////////////////////////////////////////// /*++ CMultivaluedEditorPage::UpdateProfAttrListItem --*/ ////////////////////////////////////////////////////////////////////////////// HRESULT CMultivaluedEditorPage::UpdateProfAttrListItem(int iItem) { TRACE_FUNCTION("CMultivaluedEditorPage::UpdateProfAttrListItem"); HRESULT hr = S_OK; CComBSTR bstrVendor; CComBSTR bstrValue; CComBSTR bstrReserved; try { // Get the editor to use. CComPtr spIASAttributeEditor; hr = SetUpAttributeEditor( m_spIASAttributeInfo.p, &spIASAttributeEditor ); if( FAILED( hr ) ) throw hr; // Retrieve item from array. VARIANT * pvar; // Scope for osaLock only. { // Lock the safearray. This wrapper class will unlock as soon as it goes out of scope. CMyOleSafeArrayLock osaLock( m_osaValueList ); long lIndex = iItem; m_osaValueList.PtrOfIndex( &lIndex, (void **) &pvar ); } hr = spIASAttributeEditor->GetDisplayInfo(m_spIASAttributeInfo.p, pvar, &bstrVendor, &bstrValue, &bstrReserved ); if( FAILED( hr ) ) throw hr; } catch(...) { // Do nothing -- we'll just show what we have. } // Update the item's display. m_listMultiValues.SetItemText( iItem, 0, bstrVendor ); m_listMultiValues.SetItemText( iItem, 1, bstrValue ); return S_OK; } ////////////////////////////////////////////////////////////////////////////// /*++ CMultivaluedEditorPage::CommitArrayToVariant --*/ ////////////////////////////////////////////////////////////////////////////// HRESULT CMultivaluedEditorPage::CommitArrayToVariant() { TRACE_FUNCTION("CMultivaluedEditorPage::CommitArrayToVariant"); // Commit the safe array passed in to the variant whose pointer // was passed in in set data. // Any changes made to the safe array won't be preserver unless // you call this method. HRESULT hr; // VariantCopy initializes the existing m_pvarData // -- releasing all data associated with it, before // copying the new value into this destination. try { hr = VariantCopy( m_pvarData, (LPVARIANT) m_osaValueList ); } catch(...) { return E_FAIL; } return hr; } ////////////////////////////////////////////////////////////////////////////// /*++ CMultivaluedEditorPage::OnButtonMoveUp --*/ ////////////////////////////////////////////////////////////////////////////// void CMultivaluedEditorPage::OnButtonMoveUp() { TRACE_FUNCTION("CMultivaluedEditorPage::OnButtonMoveUp"); HRESULT hr; try { int iSelected = GetSelectedItemIndex(m_listMultiValues); if( NOTHING_SELECTED == iSelected ) { // Do nothing. return; } // Swap the currently selected variant with the one above it. long lIndex = iSelected; // Lock the safearray. This wrapper class will unlock as soon as it goes out of scope. CMyOleSafeArrayLock osaLock( m_osaValueList ); VARIANT *pvarTop, *pvarBottom; m_osaValueList.PtrOfIndex( &lIndex, (void **) &pvarBottom ); lIndex--; m_osaValueList.PtrOfIndex( &lIndex, (void **) &pvarTop ); void* pvarTemp = pvarTop; pvarTop = pvarBottom; pvarBottom = reinterpret_cast (pvarTemp); // Update items that have changed. UpdateProfAttrListItem( iSelected - 1 ); UpdateProfAttrListItem( iSelected ); // Move the selection down one item. m_listMultiValues.SetItemState( iSelected, 0, LVIS_SELECTED); m_listMultiValues.SetItemState( iSelected - 1, LVIS_SELECTED, LVIS_SELECTED); } catch(...) { // Error message } } ////////////////////////////////////////////////////////////////////////////// /*++ CMultivaluedEditorPage::OnButtonMoveDown --*/ ////////////////////////////////////////////////////////////////////////////// void CMultivaluedEditorPage::OnButtonMoveDown() { TRACE_FUNCTION("CMultivaluedEditorPage::OnButtonMoveDown"); HRESULT hr; try { long lSize = m_osaValueList.GetOneDimSize(); int iSelected = GetSelectedItemIndex(m_listMultiValues); if( iSelected >= lSize ) { // Do nothing. return; } // Swap the currently selected variant with the one below it. long lIndex = iSelected; // Lock the safearray. This wrapper class will unlock as soon as it goes out of scope. CMyOleSafeArrayLock osaLock( m_osaValueList ); VARIANT *pvarTop, *pvarBottom; m_osaValueList.PtrOfIndex( &lIndex, (void **) &pvarTop ); lIndex++; m_osaValueList.PtrOfIndex( &lIndex, (void **) &pvarBottom ); void* pvarTemp = pvarTop; pvarTop = pvarBottom; pvarBottom = reinterpret_cast (pvarTemp); // Update items that have changed. UpdateProfAttrListItem( iSelected ); UpdateProfAttrListItem( iSelected + 1 ); // Move the selection down one item. m_listMultiValues.SetItemState( iSelected, 0, LVIS_SELECTED); m_listMultiValues.SetItemState( iSelected + 1, LVIS_SELECTED, LVIS_SELECTED); } catch(...) { // Error message } } ////////////////////////////////////////////////////////////////////////////// /*++ CMultivaluedEditorPage::OnButtonAddValue --*/ ////////////////////////////////////////////////////////////////////////////// void CMultivaluedEditorPage::OnButtonAddValue() { TRACE_FUNCTION("CMultivaluedEditorPage::OnButtonAddValue"); CComVariant varNewVariant; HRESULT hr = S_OK; try { CComPtr spIASAttributeEditor; // Get the editor to use. hr = SetUpAttributeEditor( m_spIASAttributeInfo.p, &spIASAttributeEditor ); if( FAILED( hr ) ) throw hr; // Edit it! CComBSTR bstrReserved; hr = spIASAttributeEditor->Edit( m_spIASAttributeInfo.p, &varNewVariant, &bstrReserved ); if( hr == S_OK ) { VARIANT *pvar; // Make the safe array bigger by 1 long lSize = m_osaValueList.GetOneDimSize(); m_osaValueList.ResizeOneDim( lSize + 1 ); // Get a pointer to the variant at new position (indexed by lSize+1-1 == lSize) // Scope for osaLock only. { // Lock the safearray. This wrapper class will unlock as soon as it goes out of scope. CMyOleSafeArrayLock osaLock( m_osaValueList ); m_osaValueList.PtrOfIndex( &lSize, (void **) &pvar ); } hr = VariantCopy( pvar, &varNewVariant ); if (FAILED(hr)) { throw hr; } // The user added the value. m_fIsDirty = TRUE; // Make a new place for the newly added value in the list control. // We pass a null string because we will let UpdataProfAttrListItem do the display text. m_listMultiValues.InsertItem( lSize, L"" ); // Update the view of that item. UpdateProfAttrListItem( lSize ); // Take action based on whether list is no longer empty. DWORD dwSize; try { dwSize = m_osaValueList.GetOneDimSize(); } catch(...) { dwSize = 0; } if( dwSize > 0 ) { // We currently have at least one item. GetDlgItem(IDOK)->EnableWindow(TRUE); } // Deselect any currently selected item. int iSelected = GetSelectedItemIndex( m_listMultiValues ); if( iSelected != NOTHING_SELECTED ) { m_listMultiValues.SetItemState( iSelected, 0, LVIS_SELECTED); } // Select the newly added item. m_listMultiValues.SetItemState( lSize, LVIS_SELECTED, LVIS_SELECTED); if( FAILED( hr ) ) throw hr; } } catch( HRESULT &hr ) { // Print out error message saying that there was an error adding. return; } catch(...) { // Print out error message saying that there was an error adding. return; } } ////////////////////////////////////////////////////////////////////////////// /*++ CMultivaluedEditorPage::OnButtonRemove --*/ ////////////////////////////////////////////////////////////////////////////// void CMultivaluedEditorPage::OnButtonRemove() { TRACE_FUNCTION("CMultivaluedEditorPage::OnButtonRemove"); // // see if there is an item already selected in ProfAttr list // int iSelected = GetSelectedItemIndex(m_listMultiValues); if (NOTHING_SELECTED == iSelected ) { // do nothing return; } HRESULT hr; try { // Swap the currently selected variant with the one below it. long lTarget = iSelected; VARIANT *pvarTop, *pvarBottom; long lSize = m_osaValueList.GetOneDimSize(); // Do some sanity checks. _ASSERTE( lSize > 0 ); _ASSERTE( lTarget >= 0 && lTarget < lSize ); // Scope for osaLock only. { // Lock the safearray. This wrapper class will unlock as soon as it goes out of scope. CMyOleSafeArrayLock osaLock( m_osaValueList ); for( long lIndex = lTarget; lIndex < lSize - 1 ; lIndex++ ) { m_osaValueList.PtrOfIndex( &lIndex, (void **) &pvarTop ); long lNext = lIndex + 1; m_osaValueList.PtrOfIndex( &lNext, (void **) &pvarBottom ); hr = VariantCopy( pvarTop, pvarBottom ); if( FAILED( hr ) ) throw hr; } } // Reduce the size of the safe array by one. // NOTE: You must make sure that you have unlocked the safearray before calling this. // ISSUE: We are assuming this deletes the element in the last position. m_osaValueList.ResizeOneDim( lSize - 1 ); m_listMultiValues.SetItemState( iSelected, 0, LVIS_SELECTED); // Remove the item from our list. if(m_listMultiValues.GetItemCount() > iSelected + 1) m_listMultiValues.SetItemState( iSelected + 1, LVIS_SELECTED, LVIS_SELECTED); else if (iSelected > 0) m_listMultiValues.SetItemState( iSelected - 1, LVIS_SELECTED, LVIS_SELECTED); else // iSelected == 0; and it's the only one ::SetFocus(GetDlgItem(IDC_IAS_BUTTON_ADD_VALUE)->m_hWnd); m_listMultiValues.DeleteItem( iSelected ); // Take action based on whether list is empty or not. DWORD dwSize; try { dwSize = m_osaValueList.GetOneDimSize(); } catch(...) { dwSize = 0; } if( dwSize > 0 ) { // We have at least one element. // Make sure the selection stays on the same position in the list. if( ! m_listMultiValues.SetItemState( iSelected, LVIS_SELECTED, LVIS_SELECTED) ) { // We failed, probably because the item that was deleted was the last // in the list, so try to select the one before the deleted item. m_listMultiValues.SetItemState( iSelected -1, LVIS_SELECTED | LVIS_FOCUSED, LVIS_SELECTED | LVIS_FOCUSED); } } else { // We are currently empty. GetDlgItem(IDOK)->EnableWindow(FALSE); } } catch(...) { //ISSUE: Put up error message. } } ////////////////////////////////////////////////////////////////////////////// /*++ CMultivaluedEditorPage::OnButtonEdit --*/ ////////////////////////////////////////////////////////////////////////////// void CMultivaluedEditorPage::OnButtonEdit() { TRACE_FUNCTION("CMultivaluedEditorPage::OnButtonEdit"); // // see if there is an item already selected in ProfAttr list // int iSelected = GetSelectedItemIndex(m_listMultiValues); if (NOTHING_SELECTED == iSelected ) { // do nothing return; } HRESULT hr; hr = EditItemInList( iSelected ); } ////////////////////////////////////////////////////////////////////////////// /*++ CMultivaluedEditorPage::EditItemInList --*/ ////////////////////////////////////////////////////////////////////////////// STDMETHODIMP CMultivaluedEditorPage::EditItemInList( long lIndex ) { TRACE_FUNCTION("CMultivaluedEditorPage::EditItemInList"); HRESULT hr = S_OK; VARIANT * pvar; // // get the current node // try { // Scope for osaLock only. { // Lock the safearray. This wrapper class will unlock as soon as it goes out of scope. CMyOleSafeArrayLock osaLock( m_osaValueList ); m_osaValueList.PtrOfIndex( &lIndex, (void **) &pvar ); } CComPtr spIASAttributeEditor; // Get the editor to use. hr = SetUpAttributeEditor( m_spIASAttributeInfo.p, &spIASAttributeEditor ); if( FAILED( hr ) ) throw hr; // Edit it! CComBSTR bstrReserved; hr = spIASAttributeEditor->Edit( m_spIASAttributeInfo.p, pvar, &bstrReserved ); if( hr == S_OK ) { // The user changed the value. m_fIsDirty = TRUE; hr = UpdateProfAttrListItem(lIndex); if( FAILED( hr ) ) throw hr; } } catch( HRESULT & hr ) { // ISSUE: Should put up an error message. return hr; } catch(...) { // ISSUE: Should put up an error message. return E_FAIL; } return hr; } ////////////////////////////////////////////////////////////////////////////// /*++ ::SetUpAttributeEditor --*/ ////////////////////////////////////////////////////////////////////////////// STDMETHODIMP SetUpAttributeEditor( /* in */ IIASAttributeInfo *pIASAttributeInfo , /* out */ IIASAttributeEditor ** ppIASAttributeEditor ) { TRACE_FUNCTION("::SetUpAttributeEditor"); // Check for preconditions: _ASSERTE( pIASAttributeInfo ); _ASSERTE( ppIASAttributeEditor ); // Query the schema attribute to see which attribute editor to use. CLSID clsidEditorToUse; CComBSTR bstrProgID; HRESULT hr; hr = pIASAttributeInfo->get_EditorProgID( &bstrProgID ); if( FAILED( hr ) ) { // We could try putting up a default (e.g. hex) editor, but for now: return hr; } hr = CLSIDFromProgID( bstrProgID, &clsidEditorToUse ); if( FAILED( hr ) ) { // We could try putting up a default (e.g. hex) editor, but for now: return hr; } hr = CoCreateInstance( clsidEditorToUse , NULL, CLSCTX_INPROC_SERVER, IID_IIASAttributeEditor, (LPVOID *) ppIASAttributeEditor ); if( FAILED( hr ) ) { return hr; } if( ! *ppIASAttributeEditor ) { return E_FAIL; } return hr; } //+--------------------------------------------------------------------------- // // Function: OnItemchangedListIasAllattrs // // Class: CDlgIASAddAttr // // Synopsis: something has changed in All Attribute list box // We'll try to get the currently selected one // // Arguments: NMHDR* pNMHDR - // LRESULT* pResult - // // Returns: Nothing // // History: Created Header 2/19/98 3:32:05 PM // //+--------------------------------------------------------------------------- void CMultivaluedEditorPage::OnItemChangedListIasMultiAttrs(NMHDR* pNMHDR, LRESULT* pResult) { TRACE(_T("CDlgIASAddAttr::OnItemchangedListIasAllattrs\n")); AFX_MANAGE_STATE(AfxGetStaticModuleState()); // NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR; // if (pNMListView->uNewState & LVIS_SELECTED) // { // m_dAllAttrCurSel = pNMListView->iItem; // } // Set button states depending on whether anything is selected. int iSelected = GetSelectedItemIndex(m_listMultiValues); if (NOTHING_SELECTED == iSelected ) { HWND hFocus = ::GetFocus(); if(hFocus == GetDlgItem(IDC_IAS_BUTTON_REMOVE)->m_hWnd) ::SetFocus(GetDlgItem(IDC_IAS_BUTTON_ADD_VALUE)->m_hWnd); GetDlgItem(IDC_IAS_BUTTON_MOVE_UP)->EnableWindow(FALSE); GetDlgItem(IDC_IAS_BUTTON_MOVE_DOWN)->EnableWindow(FALSE); GetDlgItem(IDC_IAS_BUTTON_REMOVE)->EnableWindow(FALSE); GetDlgItem(IDC_IAS_BUTTON_EDIT)->EnableWindow(FALSE); } else { // Something is selected. GetDlgItem(IDC_IAS_BUTTON_MOVE_UP)->EnableWindow(TRUE); GetDlgItem(IDC_IAS_BUTTON_MOVE_DOWN)->EnableWindow(TRUE); GetDlgItem(IDC_IAS_BUTTON_REMOVE)->EnableWindow(TRUE); GetDlgItem(IDC_IAS_BUTTON_EDIT)->EnableWindow(TRUE); } *pResult = 0; }