/*++ Copyright (C) 1997-2001 Microsoft Corporation Module Name: Abstract: History: --*/ // PropsPg.cpp : implementation file // #include "stdafx.h" #include "wmitest.h" #include "OpWrap.h" #include "PropsPg.h" #include "WMITestDoc.h" #include "ObjVw.h" #include "OpView.h" #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif ///////////////////////////////////////////////////////////////////////////// // CPropsPg property page IMPLEMENT_DYNCREATE(CPropsPg, CPropertyPage) CPropsPg::CPropsPg() : CPropertyPage(CPropsPg::IDD), m_pObj(NULL), //m_bShowSystemProperties(theApp.m_bShowSystemProperties), //m_bShowInheritedProperties(theApp.m_bShowInheritedProperties), m_bTranslateValues(theApp.m_bTranslateValues) { //{{AFX_DATA_INIT(CPropsPg) // NOTE: the ClassWizard will add member initialization here //}}AFX_DATA_INIT m_bShowSystemProperties = theApp.GetProfileInt(_T("Settings"), _T("ShowSysOnDlg"), TRUE); m_bShowInheritedProperties = theApp.GetProfileInt(_T("Settings"), _T("ShowInheritedOnDlg"), TRUE); } CPropsPg::~CPropsPg() { theApp.WriteProfileInt(_T("Settings"), _T("ShowSysOnDlg"), m_bShowSystemProperties); theApp.WriteProfileInt(_T("Settings"), _T("ShowInheritedOnDlg"), m_bShowInheritedProperties); } void CPropsPg::DoDataExchange(CDataExchange* pDX) { CPropertyPage::DoDataExchange(pDX); //{{AFX_DATA_MAP(CPropsPg) DDX_Control(pDX, IDC_PROPS, m_ctlProps); //}}AFX_DATA_MAP } void CPropsPg::InitListCtrl() { RECT rect; CString strTemp; m_ctlProps.SetExtendedStyle(LVS_EX_FULLROWSELECT); m_ctlProps.SetImageList(&((CMainFrame *) AfxGetMainWnd())->m_imageList, LVSIL_SMALL); m_ctlProps.GetClientRect(&rect); strTemp.LoadString(IDS_NAME); m_ctlProps.InsertColumn(0, strTemp, LVCFMT_LEFT, rect.right * 25 / 100); strTemp.LoadString(IDS_TYPE); m_ctlProps.InsertColumn(1, strTemp, LVCFMT_LEFT, rect.right * 25 / 100); strTemp.LoadString(IDS_VALUE); m_ctlProps.InsertColumn(2, strTemp, LVCFMT_LEFT, rect.right * 50 / 100); } void CPropsPg::LoadProps() { int nItems = m_pObj->GetProps()->GetSize(), iItem = 0; CPropInfo *pProps = m_pObj->GetProps()->GetData(); m_ctlProps.DeleteAllItems(); for (int i = 0; i < nItems; i++) { CString strType, strValue; int iImage, iFlavor; m_pObj->GetPropInfo(i, strValue, strType, &iImage, &iFlavor, m_bTranslateValues); if ((m_bShowSystemProperties || iFlavor != WBEM_FLAVOR_ORIGIN_SYSTEM) && (m_bShowInheritedProperties || iFlavor != WBEM_FLAVOR_ORIGIN_PROPAGATED)) { m_ctlProps.InsertItem(iItem, pProps[i].m_strName, iImage); m_ctlProps.SetItemData(iItem, i); m_ctlProps.SetItemText(iItem, 1, strType); m_ctlProps.SetItemText(iItem, 2, strValue); iItem++; } } UpdateButtons(); //if (FAILED(hr)) // CWMITestDoc::DisplayWMIErrorBox(hr, NULL); } int CPropsPg::GetSelectedItem() { POSITION pos = m_ctlProps.GetFirstSelectedItemPosition(); if (pos) return m_ctlProps.GetNextSelectedItem(pos); else return -1; } void CPropsPg::UpdateButtons() { int iIndex = GetSelectedItem(); GetDlgItem(IDC_DELETE)->EnableWindow(iIndex != -1); GetDlgItem(IDC_EDIT)->EnableWindow(iIndex != -1); } BEGIN_MESSAGE_MAP(CPropsPg, CPropertyPage) //{{AFX_MSG_MAP(CPropsPg) ON_BN_CLICKED(IDC_ADD, OnAdd) ON_BN_CLICKED(IDC_EDIT, OnEdit) ON_BN_CLICKED(IDC_DELETE, OnDelete) ON_NOTIFY(NM_DBLCLK, IDC_PROPS, OnDblclkProps) ON_NOTIFY(LVN_ITEMCHANGED, IDC_PROPS, OnItemchangedProps) ON_BN_CLICKED(IDC_SYSTEM, OnSystem) ON_BN_CLICKED(IDC_INHERITED, OnInherited) //}}AFX_MSG_MAP END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// // CPropsPg message handlers void CPropsPg::OnAdd() { CString strName; if (CObjView::AddProperty(m_pObj, strName)) { m_pObj->LoadProps(g_pOpView->GetDocument()->m_pNamespace); LoadProps(); // Now try to find the item we just added. LVFINDINFO find; int iItem; find.flags = LVFI_STRING; find.psz = strName; iItem = m_ctlProps.FindItem(&find); if (iItem != -1) { m_ctlProps.EnsureVisible(iItem, FALSE); m_ctlProps.SetItemState(iItem, LVIS_SELECTED, LVIS_SELECTED); } } } void CPropsPg::OnEdit() { int iItem = GetSelectedItem(); if (iItem != -1) { CPropInfo *pProp; _variant_t var; iItem = m_ctlProps.GetItemData(iItem); pProp = &m_pObj->GetProps()->GetData()[iItem]; m_pObj->ValueToVariant(iItem, &var); if (CObjView::EditProperty(m_pObj, pProp, &var)) { LoadProps(); m_ctlProps.EnsureVisible(iItem, FALSE); m_ctlProps.SetItemState(iItem, LVIS_SELECTED, LVIS_SELECTED); } // Otherwise the destructor freaks out because it doesn't know what to // do with VT_I8. if (var.vt == VT_I8) var.vt = VT_I4; } } void CPropsPg::OnDelete() { int iItem = GetSelectedItem(); if (iItem != -1) { CString strProperty = m_ctlProps.GetItemText(iItem, 0); HRESULT hr; hr = m_pObj->m_pObj->Delete(_bstr_t(strProperty)); if (SUCCEEDED(hr)) { m_pObj->LoadProps(g_pOpView->GetDocument()->m_pNamespace); LoadProps(); if (iItem >= m_ctlProps.GetItemCount()) iItem--; if (iItem >= 0) { m_ctlProps.EnsureVisible(iItem, FALSE); m_ctlProps.SetItemState(iItem, LVIS_SELECTED, LVIS_SELECTED); } } else CWMITestDoc::DisplayWMIErrorBox(hr); } } void CPropsPg::OnDblclkProps(NMHDR* pNMHDR, LRESULT* pResult) { OnEdit(); *pResult = 0; } void CPropsPg::OnItemchangedProps(NMHDR* pNMHDR, LRESULT* pResult) { NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR; UpdateButtons(); *pResult = 0; } BOOL CPropsPg::OnInitDialog() { CPropertyPage::OnInitDialog(); CheckDlgButton(IDC_SYSTEM, m_bShowSystemProperties); CheckDlgButton(IDC_INHERITED, m_bShowInheritedProperties); InitListCtrl(); LoadProps(); return TRUE; // return TRUE unless you set the focus to a control // EXCEPTION: OCX Property Pages should return FALSE } void CPropsPg::OnSystem() { m_bShowSystemProperties ^= 1; LoadProps(); } void CPropsPg::OnInherited() { m_bShowInheritedProperties ^= 1; LoadProps(); }