|
|
//////////////////////////////////////////////////////////////////////////////
/*++
Copyright (C) Microsoft Corporation, 1997 - 1998
Module Name:
PgIASAdv.cpp
Abstract:
Implementation file for the CPgIASAdv class.
We implement the class needed to handle the Advanced tab of the profile sheet.
Revision History: byao - created mmaguire 06/01/98 - extensively revamped
--*/ //////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////
// BEGIN INCLUDES
//
// standard includes:
//
#include "stdafx.h"
#include "resource.h"
//
// where we can find declaration for main class in this file:
//
#include "PgIASAdv.h"
//
//
// where we can find declarations needed in this file:
//
#include "IASHelper.h"
#include "IASProfA.h"
#include "DlgIASAdd.h"
#include "vendors.h"
#include "napmmc.h"
// help table
#include "hlptable.h"
//
// END INCLUDES
//////////////////////////////////////////////////////////////////////////////
#define NOTHING_SELECTED -1
IMPLEMENT_DYNCREATE(CPgIASAdv, CManagedPage)
BEGIN_MESSAGE_MAP(CPgIASAdv, CPropertyPage) //{{AFX_MSG_MAP(CPgIASAdv)
ON_BN_CLICKED(IDC_IAS_BUTTON_ATTRIBUTE_ADD, OnButtonIasAttributeAdd) ON_BN_CLICKED(IDC_IAS_BUTTON_ATTRIBUTE_REMOVE, OnButtonIasAttributeRemove) ON_BN_CLICKED(IDC_IAS_BUTTON_ATTRIBUTE_EDIT, OnButtonIasAttributeEdit) ON_WM_HELPINFO() ON_WM_CONTEXTMENU() ON_NOTIFY(NM_DBLCLK, IDC_IAS_LIST_ATTRIBUTES_IN_PROFILE, OnDblclkListIasProfattrs) ON_NOTIFY(LVN_ITEMCHANGED, IDC_IAS_LIST_ATTRIBUTES_IN_PROFILE, OnItemChangedListIasProfileAttributes) ON_NOTIFY(LVN_KEYDOWN, IDC_IAS_LIST_ATTRIBUTES_IN_PROFILE, OnKeydownIasListAttributesInProfile) //}}AFX_MSG_MAP
END_MESSAGE_MAP()
//////////////////////////////////////////////////////////////////////////////
/*++
CPgIASAdv::CPgIASAdv
Constructor
--*/ //////////////////////////////////////////////////////////////////////////////
CPgIASAdv::CPgIASAdv(ISdo* pIProfile, ISdoDictionaryOld* pIDictionary) : CManagedPage(CPgIASAdv::IDD) { TRACE(_T("CPgIASAdv::CPgIASAdv\n"));
m_spProfileSdo = pIProfile; m_spDictionarySdo = pIDictionary; m_fAllAttrInitialized = FALSE;
SetHelpTable(g_aHelpIDs_IDD_IAS_ADVANCED_TAB);
m_bModified = FALSE; m_lAttrFilter = 0;
}
//////////////////////////////////////////////////////////////////////////////
/*++
CPgIASAdv::CPgIASAdv
Destructor
--*/ //////////////////////////////////////////////////////////////////////////////
CPgIASAdv::~CPgIASAdv() { TRACE(_T("CPgIASAdv::~CPgIASAdv\n"));
int iIndex; // delete all the profiel attribute node
TRACE(_T("Deleting arrProfileAttr list...\n")); for (iIndex=0; iIndex<m_vecProfileAttributes.size(); iIndex++) { delete m_vecProfileAttributes[iIndex]; }
// release all the SDO pointers
for (iIndex=0; iIndex<m_vecProfileSdos.size(); iIndex++) { if ( m_vecProfileSdos[iIndex] ) { m_vecProfileSdos[iIndex]->Release(); m_vecProfileSdos[iIndex] = NULL; } }
}
//////////////////////////////////////////////////////////////////////////////
/*++
CPgIASAdv::DoDataExchange
--*/ //////////////////////////////////////////////////////////////////////////////
void CPgIASAdv::DoDataExchange(CDataExchange* pDX) { TRACE(_T("CPgIASAdv::DoDataExchange\n"));
CPropertyPage::DoDataExchange(pDX); //{{AFX_DATA_MAP(CPgIASAdv)
DDX_Control(pDX, IDC_IAS_LIST_ATTRIBUTES_IN_PROFILE, m_listProfileAttributes); //}}AFX_DATA_MAP
}
/////////////////////////////////////////////////////////////////////////////
// CPgIASAdv message handlers
//////////////////////////////////////////////////////////////////////////////
/*++
CPgIASAdv::OnInitDialog
--*/ //////////////////////////////////////////////////////////////////////////////
BOOL CPgIASAdv::OnInitDialog() { TRACE(_T("CPgIASAdv::OnInitDialog\n"));
HRESULT hr = S_OK;
CPropertyPage::OnInitDialog(); //
// first, set the list box to 3 columns
//
LVCOLUMN lvc; int iCol; 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.cx = 120; lvc.pszText = wzColumnHeader;
lvc.cx = ATTRIBUTE_NAME_COLUMN_WIDTH; strColumnHeader.LoadString(IDS_IAS_ATTRIBUTES_COLUMN_NAME); wcscpy(wzColumnHeader, strColumnHeader); m_listProfileAttributes.InsertColumn(0, &lvc);
lvc.cx = ATTRIBUTE_VENDOR_COLUMN_WIDTH; strColumnHeader.LoadString(IDS_IAS_ATTRIBUTES_COLUMN_VENDOR); wcscpy(wzColumnHeader, strColumnHeader); m_listProfileAttributes.InsertColumn(1, &lvc);
lvc.cx = ATTRIBUTE_VALUE_COLUMN_WIDTH; strColumnHeader.LoadString(IDS_IAS_ATTRIBUTES_COLUMN_VALUE); wcscpy(wzColumnHeader, strColumnHeader); m_listProfileAttributes.InsertColumn(2, &lvc);
if ( !m_pvecAllAttributeInfos ) { TRACE(_T("Empty attribute list!\n")); ShowErrorDialog(m_hWnd, IDS_IAS_ERR_ADVANCED_EMPTY_ATTRLIST, _T(""), hr); return TRUE; } //
// get the attribute collection of this profile
//
hr = IASGetSdoInterfaceProperty(m_spProfileSdo, (LONG)PROPERTY_PROFILE_ATTRIBUTES_COLLECTION, IID_ISdoCollection, (void **) &m_spProfileAttributeCollectionSdo ); TRACE(_T("IASGetSdoInterfaceProperty() returned %x\n"), hr);
if (SUCCEEDED(hr)) { TRACE(_T("Initializing profAttr list...\n")); hr = InitProfAttrList(); }
if (FAILED(hr)) { ShowErrorDialog(m_hWnd, IDS_IAS_ERR_ADVANCED_PROFATTRLIST, _T(""), hr); }
UpdateButtonState();
return TRUE; // return TRUE unless you set the focus to a control
// EXCEPTION: OCX Property Pages should return FALSE
}
//+---------------------------------------------------------------------------
//
// Function: CPgIASAdv::InitProfAttrList
//
// Synopsis: initialize the attribute list for this profile
//
// Arguments: None
//
// Returns: HRESULT -
//
// History: Created Header byao 2/22/98 4:40:17 AM
//
//+---------------------------------------------------------------------------
HRESULT CPgIASAdv::InitProfAttrList() { TRACE(_T("CPgIASAdv::InitProfAttrList\n"));
HRESULT hr = S_OK; int iIndex;
CComPtr<IUnknown> spUnknown; CComPtr<IEnumVARIANT> spEnumVariant; CComVariant varAttributeSdo; long ulCount; ULONG ulCountReceived; ATTRIBUTEID AttrId; //
// initialize the variant
//
_ASSERTE(m_spProfileAttributeCollectionSdo);
// We check the count of items in our collection and don't bother getting the
// enumerator if the count is zero.
// This saves time and also helps us to a void a bug in the the enumerator which
// causes it to fail if we call next when it is empty.
m_spProfileAttributeCollectionSdo->get_Count( & ulCount ); TRACE(_T("Number of attribute in the profile: %ld\n"), ulCount);
if( ulCount <= 0 ) { TRACE(_T("No profile attributes, now updating the UI list\n")); hr = UpdateProfAttrListCtrl(); return hr; }
// Get the enumerator for the attribute collection.
hr = m_spProfileAttributeCollectionSdo->get__NewEnum( (IUnknown **) & spUnknown ); _ASSERTE( SUCCEEDED( hr ) );
hr = spUnknown->QueryInterface( IID_IEnumVARIANT, (void **) &spEnumVariant ); spUnknown.Release();
_ASSERTE( spEnumVariant != NULL );
// Get the first item.
hr = spEnumVariant->Next( 1, &varAttributeSdo, &ulCountReceived ); TRACE(_T("Next() returned %x\n"), hr);
while( SUCCEEDED( hr ) && ulCountReceived == 1 ) { // Get an sdo pointer from the variant we received.
_ASSERTE( V_VT(&varAttributeSdo) == VT_DISPATCH ); _ASSERTE( V_DISPATCH(&varAttributeSdo) != NULL );
CComPtr<ISdo> spSdo; hr = V_DISPATCH(&varAttributeSdo)->QueryInterface( IID_ISdo, (void **) &spSdo ); if ( !SUCCEEDED(hr)) { ShowErrorDialog(m_hWnd, IDS_IAS_ERR_SDOERROR_QUERYINTERFACE, _T(""), hr); continue; }
//
// get attribute ID
//
CComVariant varAttributeID; hr = spSdo->GetProperty(PROPERTY_ATTRIBUTE_ID, &varAttributeID); if ( !SUCCEEDED(hr) ) { TRACE(_T("GetProperty(attributeId) failed, err = %x\n"), hr); ShowErrorDialog(m_hWnd, IDS_IAS_ERR_SDOERROR_GETPROPERTY, _T(""), hr); continue; } _ASSERTE( V_VT(&varAttributeID) == VT_I4 ); AttrId = (ATTRIBUTEID) V_I4(&varAttributeID);
TRACE(_T("Attribute ID = %ld\n"), AttrId);
// search the attribute in the system attribute list
for (iIndex=0; iIndex<m_pvecAllAttributeInfos->size(); iIndex++) { // search for this attribute in the profile attribute list
ATTRIBUTEID id; m_pvecAllAttributeInfos->at(iIndex)->get_AttributeID( &id ); if( AttrId == id ) break; } if ( iIndex < m_pvecAllAttributeInfos->size() ) {
LONG lRestriction; hr = m_pvecAllAttributeInfos->at(iIndex)->get_AttributeRestriction( &lRestriction ); _ASSERTE( SUCCEEDED(hr) ); if( lRestriction & m_lAttrFilter ) { // attribute found in the global list, that means this is a valid ADVANCED IAS
// attribute
// -- add this SDO pointer to the profile SDO list
spSdo->AddRef(); m_vecProfileSdos.push_back(spSdo); // -- get attribute value
TRACE(_T("Getting attribute value...\n"));
CComVariant varValue;
hr = spSdo->GetProperty(PROPERTY_ATTRIBUTE_VALUE, &varValue); if ( !SUCCEEDED(hr)) { ShowErrorDialog(m_hWnd, IDS_IAS_ERR_SDOERROR_GETPROPERTY, _T(""), hr ); continue; }
TRACE(_T("Valid attribute ID! Creating a new attribute node...\n"));
IIASAttributeInfo *pAttributeInfo = m_pvecAllAttributeInfos->at(iIndex); _ASSERTE(pAttributeInfo);
CIASProfileAttribute *pProfileAttribute = new CIASProfileAttribute( pAttributeInfo, varValue ); if( ! pProfileAttribute ) { hr = HRESULT_FROM_WIN32(GetLastError()); ShowErrorDialog(m_hWnd, IDS_IAS_ERR_ADD_ATTR, _T(""), hr); continue; }
// Add the newly created node to the list of attributes.
try { m_vecProfileAttributes.push_back(pProfileAttribute); } catch(...) { hr = HRESULT_FROM_WIN32(GetLastError());
TRACE(_T("Can't add this attribuet node to profile attribute list, err = %x\n"), hr); ShowErrorDialog(m_hWnd, IDS_IAS_ERR_ADD_ATTR, _T(""), hr); delete pProfileAttribute; continue; };
} // if
} // if
// ISSUE: Find out why Wei is compiling with atl10 only: varAttributeSdo.Clear();
VariantClear( &varAttributeSdo );
// Get the next item.
hr = spEnumVariant->Next( 1, &varAttributeSdo, &ulCountReceived ); TRACE(_T("Next() returned %x\n"), hr);
if ( !SUCCEEDED(hr)) { ShowErrorDialog(m_hWnd, IDS_IAS_ERR_SDOERROR_COLLECTION, _T(""), hr); return hr; } } // while
//
// fill in the prof attribute list
//
TRACE(_T("We've got all the profile attributes, now updating the UI list\n")); hr = UpdateProfAttrListCtrl(); return hr; }
//+---------------------------------------------------------------------------
//
// Function: CPgIASAdv::UpdateProfAttrListCtrl
//
// Synopsis: update the profile attribute list control
//
// Arguments: None
//
// Returns: HRESULT -
//
// History: Created Header byao 2/23/98 12:19:11 AM
//
//+---------------------------------------------------------------------------
HRESULT CPgIASAdv::UpdateProfAttrListCtrl() { TRACE(_T("CPgIASAdv::UpdateProfAttrListCtrl\n"));
LVITEM lvi; int iItem;
//
// clear up the whole list first
//
m_listProfileAttributes.DeleteAllItems();
// re populate the list again
for (int iIndex = 0; iIndex < m_vecProfileAttributes.size(); iIndex++) { CComBSTR bstrName; CComBSTR bstrVendor; CComBSTR bstrDisplayValue;
// Set the attribute name (the leftmost column).
m_vecProfileAttributes[iIndex]->get_AttributeName( &bstrName ); m_listProfileAttributes.InsertItem(iIndex, bstrName );
// Set the subitems (the other columns).
// Vendor and value of variant as a displayable string.
m_vecProfileAttributes[iIndex]->GetDisplayInfo( &bstrVendor, &bstrDisplayValue ); m_listProfileAttributes.SetItemText(iIndex, 1, bstrVendor ); m_listProfileAttributes.SetItemText(iIndex, 2, bstrDisplayValue );
}
return S_OK; }
//+---------------------------------------------------------------------------
//
// Function: OnButtonIasAttributeAdd
//
// Class: CPgIASAdv
//
// Synopsis: User has clicked Add button -- pop up the attribute list
//
// Arguments: None
//
// Returns: Nothing
//
// History: Created Header 2/19/98 5:46:17 PM
//
//+---------------------------------------------------------------------------
void CPgIASAdv::OnButtonIasAttributeAdd() { TRACE(_T("CPgIASAdv::OnButtonIasAttributeAdd()\n"));
HRESULT hr = S_OK;
CDlgIASAddAttr *pDlgAddAttr = new CDlgIASAddAttr( this, m_lAttrFilter, m_pvecAllAttributeInfos );
if (!pDlgAddAttr) { hr = HRESULT_FROM_WIN32(GetLastError()); ShowErrorDialog(m_hWnd, IDS_IAS_ERR_ADVANCED, _T(""), hr); return; }
pDlgAddAttr->SetSdo(m_spProfileAttributeCollectionSdo, m_spDictionarySdo); if( pDlgAddAttr->DoModal() ) { TRACE(_T("User selected something to add from the Add Attribute dialog\n")); CPropertyPage::SetModified(); m_bModified = TRUE;
}
}
/////////////////////////////////////////////////////////////////////////////
/*++
CPgIASAdv::EditProfileItemInList
--*/ //////////////////////////////////////////////////////////////////////////////
STDMETHODIMP CPgIASAdv::EditProfileItemInList( int iIndex ) { TRACE(_T("CPgIASAdv::EditProfileItemInList\n"));
HRESULT hr = S_OK;
// Get the specified node.
CIASProfileAttribute* pProfAttr = m_vecProfileAttributes.at( iIndex ); if( ! pProfAttr ) { return E_FAIL; }
// edit it!
hr = pProfAttr->Edit(); if( S_OK == hr ) { // Update the UI.
UpdateProfAttrListItem( iIndex ); CPropertyPage::SetModified(); m_bModified = TRUE;
}
return hr; }
//+---------------------------------------------------------------------------
//
// Function: CPgIASAdv::OnApply
//
// Synopsis: User chose Apply or OK -- commit all changes
//
// Arguments: None
//
// Returns: BOOL - succeed or not
//
// History: Created Header byao 2/23/98 11:09:05 PM
//
//+---------------------------------------------------------------------------
BOOL CPgIASAdv::OnApply() { TRACE(_T("CPgIASAdv::OnApply\n")); HRESULT hr = S_OK; int iIndex;
if( ! m_bModified ) { TRACE(_T("User changed nothing here, do nothing!\n")); return TRUE; }
// remove all Advanced attributes SDOs - to repopulate them.
for (iIndex =0; iIndex<m_vecProfileSdos.size(); iIndex++) { if ( m_vecProfileSdos[iIndex] != NULL ) { CComPtr<IDispatch> spDispatch;
hr = m_vecProfileSdos[iIndex]->QueryInterface( IID_IDispatch, (void **) & spDispatch ); _ASSERTE( SUCCEEDED( hr ) );
hr = m_spProfileAttributeCollectionSdo->Remove(spDispatch); if ( !SUCCEEDED(hr) ) { TRACE(_T("Remove() failed, err = %x\n"), hr); ShowErrorDialog(m_hWnd, IDS_IAS_ERR_SDOERROR_COLLECTION, _T(""),hr); } m_vecProfileSdos[iIndex]->Release(); m_vecProfileSdos[iIndex] = NULL; } } m_vecProfileSdos.clear();
// repopulate the prof-attribute list
for (iIndex=0; iIndex<m_vecProfileAttributes.size(); iIndex++) {
// create the SDO for this attribute
CComPtr<IDispatch> spDispatch;
spDispatch.p = NULL;
ATTRIBUTEID ID;
hr = m_vecProfileAttributes[iIndex]->get_AttributeID( &ID ); if( FAILED(hr) ) { TRACE(_T("get_AttributeID() failed, err = %x\n"), hr); ShowErrorDialog(m_hWnd, IDS_IAS_ERR_SDOERROR_CREATEATTR,_T(""), hr); continue; }
hr = m_spDictionarySdo->CreateAttribute( ID, (IDispatch**)&spDispatch.p); if ( !SUCCEEDED(hr) ) { TRACE(_T("CreateAttrbute() failed, err = %x\n"), hr); ShowErrorDialog(m_hWnd, IDS_IAS_ERR_SDOERROR_CREATEATTR,_T(""), hr); continue; // go to the next attribute
}
_ASSERTE( spDispatch.p != NULL );
// add this node to profile attribute collection
hr = m_spProfileAttributeCollectionSdo->Add(NULL, (IDispatch**)&spDispatch.p); if ( !SUCCEEDED(hr) ) { TRACE(_T("Add() failed, err = %x\n"), hr); ShowErrorDialog(m_hWnd, IDS_IAS_ERR_SDOERROR_CREATEATTR, _T("Add"),hr); continue; // go to the next attribute
}
//
// get the ISdo pointer
//
CComPtr<ISdo> spAttrSdo; hr = spDispatch->QueryInterface( IID_ISdo, (void **) &spAttrSdo); if ( !SUCCEEDED(hr) ) { TRACE(_T("QueryInterface() failed, err = %x\n"), hr); ShowErrorDialog(m_hWnd,IDS_IAS_ERR_SDOERROR_QUERYINTERFACE,_T(""),hr); continue; // go on to the next attribute
}
_ASSERTE( spAttrSdo != NULL ); TRACE(_T("Created an attribute successfully! Now setting the properties...\n"));
// set sdo property for this attribute
CComVariant varValue;
m_vecProfileAttributes[iIndex]->get_VarValue( &varValue );
// set value
TRACE(_T("Set value\n"));
hr = spAttrSdo->PutProperty(PROPERTY_ATTRIBUTE_VALUE, &varValue );
if ( !SUCCEEDED(hr) ) { TRACE(_T("PutProperty(value) failed, err = %x\n"), hr);
CComBSTR bstrTemp; m_vecProfileAttributes[iIndex]->get_AttributeName( &bstrTemp ); ShowErrorDialog(m_hWnd, IDS_IAS_ERR_SDOERROR_PUTPROPERTY_ATTRIBUTE_VALUE, bstrTemp, hr ); continue; // go on to the next attribute
}
// commit
hr = spAttrSdo->Apply(); if ( !SUCCEEDED(hr) ) { TRACE(_T("Apply() failed, err = %x\n"), hr); ShowErrorDialog(m_hWnd, IDS_IAS_ERR_SDOERROR_APPLY, _T(""),hr); continue; // go on to the next attribute
}
// -- add this SDO pointer to the profile SDO list
// we must AddRef() first for this SDO pointer because we are to copy it to
// the array. We don't want the SDO object be released with spAttrSdo;
spAttrSdo->AddRef(); m_vecProfileSdos.push_back(spAttrSdo);
} // for
TRACE(_T("Done with this profile !\n")); return CPropertyPage::OnApply(); }
//////////////////////////////////////////////////////////////////////////////
/*++
CPgIASAdv::OnHelpInfo
--*/ //////////////////////////////////////////////////////////////////////////////
BOOL CPgIASAdv::OnHelpInfo(HELPINFO* pHelpInfo) { TRACE(_T("CPgIASAdv::OnHelpInfo\n"));
return CManagedPage::OnHelpInfo(pHelpInfo); }
//////////////////////////////////////////////////////////////////////////////
/*++
CPgIASAdv::OnContextMenu
--*/ //////////////////////////////////////////////////////////////////////////////
void CPgIASAdv::OnContextMenu(CWnd* pWnd, CPoint point) { TRACE(_T("CPgIASAdv::OnContextMenu\n"));
CManagedPage::OnContextMenu(pWnd, point); }
//+---------------------------------------------------------------------------
//
// Function: CPgIASAdv::OnButtonIasAttributeEdit
//
// Synopsis: edit the currectly selected attribute
//
// Arguments: None
//
// Returns: Nothing
//
// History: Created Header byao 2/25/98 8:03:38 PM
//
//+---------------------------------------------------------------------------
void CPgIASAdv::OnButtonIasAttributeEdit() { TRACE(_T("CPgIASAdv::OnButtonIasAttributeEdit\n"));
HRESULT hr = S_OK; //
// see if there is an item already selected in ProfAttr list
//
int iSelected = GetSelectedItemIndex( m_listProfileAttributes ); if (NOTHING_SELECTED == iSelected ) { // do nothing
return; } EditProfileItemInList( iSelected );
}
//+---------------------------------------------------------------------------
//
// Function: OnButtonIasAttributeRemove
//
// Class: CPgIASAdv
//
// Synopsis: The user has clicked the "Remove" button. Remove an attribute from
// the profile
//
// Arguments: None
//
// Returns: Nothing
//
// History: Created Header 2/19/98 3:01:14 PM
//
//+---------------------------------------------------------------------------
void CPgIASAdv::OnButtonIasAttributeRemove() { TRACE(_T("CPgIASAdv::OnButtonIasAttributeRemove()")); HRESULT hr; AFX_MANAGE_STATE(AfxGetStaticModuleState()); //
// see if there is an item already selected in ProfAttr list
//
int iSelected = GetSelectedItemIndex( m_listProfileAttributes ); if (NOTHING_SELECTED == iSelected ) { // do nothing
return; } //
// get the current node
//
CIASProfileAttribute* pProfAttr = m_vecProfileAttributes.at(iSelected); _ASSERTE( pProfAttr != NULL );
// delete the attribute node
m_vecProfileAttributes.erase( m_vecProfileAttributes.begin() + iSelected ); delete pProfAttr;
CPropertyPage::SetModified(); m_bModified = TRUE;
// Update the UI.
// for some reason, the focus is lost within the following, so save it, and restore it later
HWND hWnd = ::GetFocus();
m_listProfileAttributes.DeleteItem(iSelected);
// Make sure the selection stays on the same position in the list.
if( ! m_listProfileAttributes.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.
if (iSelected > 0) m_listProfileAttributes.SetItemState( iSelected -1, LVIS_SELECTED, LVIS_SELECTED); }
// restore the focus
::SetFocus(hWnd);
UpdateButtonState();
}
//+---------------------------------------------------------------------------
//
// Function: UpdateButtonState
//
// Class: CPgIASAdv
//
// Synopsis: Enable/Disable Edit/Remove/Up/Down/Add buttons
//
// Returns: Nothing
//
// History: Created byao 4/7/98 3:32:05 PM
//
//+---------------------------------------------------------------------------
void CPgIASAdv::UpdateButtonState() { TRACE(_T("CPgIASAdv::UpdateButtonState\n"));
// According to whether we have anything in this list box, enable or disable
// remove and edit button
// if ( m_listProfileAttributes.GetItemCount() > 0 )
// {
// }
// else
// {
// }
// Set button states depending on whether anything is selected.
int iSelected = GetSelectedItemIndex( m_listProfileAttributes ); if (NOTHING_SELECTED == iSelected ) { HWND hFocus = ::GetFocus();
// move focus
if(hFocus == GetDlgItem(IDC_IAS_BUTTON_ATTRIBUTE_REMOVE)->m_hWnd) ::SetFocus(GetDlgItem(IDC_IAS_BUTTON_ATTRIBUTE_ADD)->m_hWnd);
GetDlgItem(IDC_IAS_BUTTON_ATTRIBUTE_REMOVE)->EnableWindow(FALSE); GetDlgItem(IDC_IAS_BUTTON_ATTRIBUTE_EDIT)->EnableWindow(FALSE); } else { // Something is selected.
GetDlgItem(IDC_IAS_BUTTON_ATTRIBUTE_REMOVE)->EnableWindow(TRUE); GetDlgItem(IDC_IAS_BUTTON_ATTRIBUTE_EDIT)->EnableWindow(TRUE);
}
}
//+---------------------------------------------------------------------------
//
// Function: OnItemChangedListIasProfileAttributes
//
// Class: CPgIASAdv
//
// Synopsis: something has changed in Profile 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 CPgIASAdv::OnItemChangedListIasProfileAttributes(NMHDR* pNMHDR, LRESULT* pResult) { TRACE(_T("CPgIASAdv::OnItemChangedListIasProfileAttributes\n"));
AFX_MANAGE_STATE(AfxGetStaticModuleState());
// NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR;
// if (pNMListView->uNewState & LVIS_SELECTED)
// {
// m_dProfAttrCurSel = pNMListView->iItem;
// }
UpdateButtonState();
*pResult = 0; }
//+---------------------------------------------------------------------------
//
// Function: CPgIASAdv::UpdateProfAttrListItem
//
// Synopsis: update the No.nItem of the profile attribute list ctrl
//
// Arguments: int nItem - index of the item to update
//
// Returns: HRESULT -
//
// History: Created Header byao 2/23/98 2:46:21 PM
//
//+---------------------------------------------------------------------------
HRESULT CPgIASAdv::UpdateProfAttrListItem(int nItem) { TRACE(_T("CPgIASAdv::UpdateProfAttrListItem\n"));
//
// update the profattrlist
//
LVITEM lvi; WCHAR wszItemText[MAX_PATH];
lvi.mask = LVIF_TEXT | LVIF_STATE; lvi.state = 0; lvi.stateMask = 0; lvi.iSubItem = 0; lvi.iItem = nItem;
CComBSTR bstrName; CComBSTR bstrVendor; CComBSTR bstrDisplayValue;
// Attribute name.
m_vecProfileAttributes.at(nItem)->get_AttributeName( &bstrName ); lvi.pszText = bstrName; if (m_listProfileAttributes.SetItem(&lvi) == -1) { return E_FAIL; }
// Vendor and value of variant as a displayable string.
m_vecProfileAttributes.at(nItem)->GetDisplayInfo( &bstrVendor, &bstrDisplayValue ); m_listProfileAttributes.SetItemText(nItem,1, bstrVendor ); m_listProfileAttributes.SetItemText(nItem,2, bstrDisplayValue );
return S_OK; }
//+---------------------------------------------------------------------------
//
// Function: CPgIASAdv::InsertProfileAttributeListItem
//
// Synopsis: insert the No.nItem of the profile attribute to the list ctrl
//
// Arguments: int nItem - index of the item to update
//
// Returns: HRESULT -
//
// History: Created Header byao 2/23/98 2:46:21 PM
//
//+---------------------------------------------------------------------------
HRESULT CPgIASAdv::InsertProfileAttributeListItem(int nItem) { TRACE(_T("CPgIASAdv::InsertProfileAttributeListItem\n"));
//
// update the profattrlist
//
LVITEM lvi;
lvi.mask = LVIF_TEXT | LVIF_STATE; lvi.state = 0; lvi.stateMask = 0; lvi.iSubItem = 0; lvi.iItem = nItem;
CComBSTR bstrName; CComBSTR bstrVendor; CComBSTR bstrDisplayValue;
m_vecProfileAttributes.at(nItem)->get_AttributeName( &bstrName ); lvi.pszText = bstrName; if (m_listProfileAttributes.InsertItem(&lvi) == -1) { return E_FAIL; }
// Vendor and value of variant as a displayable string.
m_vecProfileAttributes.at(nItem)->GetDisplayInfo( &bstrVendor, &bstrDisplayValue ); m_listProfileAttributes.SetItemText(nItem,1, bstrVendor ); m_listProfileAttributes.SetItemText(nItem,2, bstrDisplayValue );
return S_OK; }
//+---------------------------------------------------------------------------
//
// Function: CPgIASAdv::OnDblclkListIasProfattrs
//
// Synopsis: user has double clicked on the profile attribute list
// We need to edit the attribute value using corresponding UI
//
// Arguments: NMHDR* pNMHDR -
// LRESULT* pResult -
//
// Returns: Nothing
//
// History: Created Header byao 2/23/98 5:56:36 PM
//
//+---------------------------------------------------------------------------
void CPgIASAdv::OnDblclkListIasProfattrs(NMHDR* pNMHDR, LRESULT* pResult) { TRACE(_T("CPgIASAdv::OnDblclkListIasProfattrs\n"));
HRESULT hr = S_OK;
//
// see if there is an item already selected in ProfAttr list
//
int iSelected = GetSelectedItemIndex( m_listProfileAttributes ); if (NOTHING_SELECTED == iSelected) { // do nothing
return; } EditProfileItemInList( iSelected ); *pResult = 0;
}
//////////////////////////////////////////////////////////////////////////////
/*++
CPgIASAdv::AddAttributeToProfile
iItem is the ordinal in m_vecAllAttributeInfos of the attribute to add to m_vecProfileAttributes.
Called by external customers of this class, checks to see whether an attribute at position iItem in m_vecAllAttributeInfos is already in the profile. If it is, gives the option to edit it. If it isn't, then calls InternalAddAttributeToProfile, which adds it.
--*/ //////////////////////////////////////////////////////////////////////////////
STDMETHODIMP CPgIASAdv::AddAttributeToProfile( int iItem ) { TRACE(_T("CPgIASAdv::AddAttributeToProfile\n"));
HRESULT hr;
ATTRIBUTEID ID1; hr = m_pvecAllAttributeInfos->at( iItem )->get_AttributeID( &ID1 ); _ASSERTE( SUCCEEDED( hr ) ); // Check if this attribute already in the profile.
for( int iIndex=0; iIndex< m_vecProfileAttributes.size(); iIndex++ ) {
ATTRIBUTEID ID2; hr = m_vecProfileAttributes.at(iIndex)->get_AttributeID( &ID2 ); _ASSERTE( SUCCEEDED( hr ) );
if ( ID1 == ID2 ) { // The selected attribute is already in the profile.
// Ask the user if they want to edit it.
CString strMessage; strMessage.LoadString(IDS_IAS_ATTRIBUTE_ALREADY_IN_PROFILE);
CString strTitle; strTitle.LoadString(IDS_IAS_TITLE_ATTRIBUTE_ALREADY_IN_PROFILE); int iResult = MessageBox(strMessage, strTitle, MB_YESNO); if( iResult == IDYES ) { // Edit the existing profile
EditProfileItemInList( iIndex ); }
// In any case, don't continue with this function.
return S_FALSE; } }
// Now we create this attribute, and add it to profile.
hr = InternalAddAttributeToProfile( iItem ); if ( FAILED(hr) ) { ShowErrorDialog(m_hWnd, IDS_IAS_ERR_ADD_ATTR, _T(""), hr); return hr; } // The use may have cancelled out, so don't need to update.
if( S_OK == hr ) { UpdateButtonState(); UpdateProfAttrListCtrl();
}
return hr;
}
//////////////////////////////////////////////////////////////////////////////
/*++
CPgIASAdv::InternalAddAttributeToProfile
iItem is the ordinal in m_vecAllAttributeInfos of the attribute to add to m_vecProfileAttributes.
Private to this class. Used to add a new attribute to a profile and edit it.
--*/ //////////////////////////////////////////////////////////////////////////////
STDMETHODIMP CPgIASAdv::InternalAddAttributeToProfile(int nIndex) { TRACE(_T("CPgIASAdv::InternalAddAttributeToProfile\n"));
AFX_MANAGE_STATE(AfxGetStaticModuleState());
_ASSERTE( 0<=nIndex && nIndex < m_pvecAllAttributeInfos->size() ); _ASSERTE( m_pvecAllAttributeInfos->at(nIndex) != NULL );
HRESULT hr = S_OK;
// Get the "schema" of the new attributevendor to create.
IIASAttributeInfo *pAttributeInfo = m_pvecAllAttributeInfos->at(nIndex);
// Create a new attribute, initialized with an empty variant.
CComVariant varValue; CIASProfileAttribute *pProfileAttribute = new CIASProfileAttribute( pAttributeInfo, varValue ); if( ! pProfileAttribute ) { hr = E_OUTOFMEMORY; ReportError(hr, IDS_OUTOFMEMORY, NULL); return hr; }
// Edit the value of this profile attribute node.
hr = pProfileAttribute->Edit(); if ( hr != S_OK ) { // The user hit cancel or there was an error -- don't add.
return hr; }
//
// add this prof attribute node to the list
//
try { m_vecProfileAttributes.push_back(pProfileAttribute); } catch(CMemoryException&) { hr = E_OUTOFMEMORY; ReportError(hr, IDS_OUTOFMEMORY, NULL); return hr; }
// Update the UI.
HRESULT InsertProfileAttributeListItem( m_listProfileAttributes.GetItemCount() ); return S_OK; }
void CPgIASAdv::OnKeydownIasListAttributesInProfile(NMHDR* pNMHDR, LRESULT* pResult) { LV_KEYDOWN* pLVKeyDow = (LV_KEYDOWN*)pNMHDR; // TODO: Add your control notification handler code here
if (pLVKeyDow->wVKey == VK_DELETE) { // delete the item
OnButtonIasAttributeRemove(); } *pResult = 0; }
|