/*++ Copyright (C) 1997-2001 Microsoft Corporation Module Name: Abstract: History: --*/ // PropUtil.cpp: implementation of the CPropUtil class. // ////////////////////////////////////////////////////////////////////// #include "stdafx.h" #include "wmitest.h" #include "GetTextDlg.h" #include "OpWrap.h" #include "PropUtil.h" #include "WMITestDoc.h" #include "OpView.h" #include "ArrayItemDlg.h" #ifdef _DEBUG #undef THIS_FILE static char THIS_FILE[]=__FILE__; #define new DEBUG_NEW #endif ////////////////////////////////////////////////////////////////////// // Construction/Destruction ////////////////////////////////////////////////////////////////////// CPropUtil::CPropUtil() : m_bTranslate(TRUE), m_bNewProperty(FALSE), m_bIsQualifier(FALSE), m_pNamespace(NULL), m_bOnInitDialog(FALSE) { } CPropUtil::~CPropUtil() { } void ArrayValuesToList(HWND hwnd, CPropInfo *pProp, VARIANT *pVar, BOOL bTranslate) { SendMessage(hwnd, LB_RESETCONTENT, 0, 0); if (pVar->vt != VT_NULL) { int nItems = pProp->GetArrayItemCount(pVar); BOOL bIsBitmask = pProp->IsBitmask() && bTranslate, bObjEdit = (pVar->vt & ~VT_ARRAY) == VT_UNKNOWN; for (int i = 0; i < nItems; i++) { CString strItem; int iIndex; pProp->ArrayItemToString(pVar, i, strItem, bTranslate); iIndex = SendMessage(hwnd, LB_ADDSTRING, 0, (LPARAM) (LPCTSTR) strItem); if (bIsBitmask || bObjEdit) { DWORD dwItem = pProp->GetArrayItem(pVar, i); SendMessage(hwnd, LB_SETITEMDATA, iIndex, dwItem); if (bObjEdit) ((IUnknown*) dwItem)->AddRef(); } } } } void ListToArrayValues(HWND hwnd, CPropInfo *pProp, VARIANT *pVar, BOOL bTranslate) { int nItems = SendMessage(hwnd, LB_GETCOUNT, 0, 0); BOOL bUseData = (pProp->IsBitmask() && bTranslate) || pProp->GetRawType() == VT_UNKNOWN; pProp->PrepArrayVar(pVar, nItems); for (int i = 0; i < nItems; i++) { TCHAR szItem[1024] = _T(""); if (!bUseData) { SendMessage(hwnd, LB_GETTEXT, i, (LPARAM) szItem); pProp->StringToArrayItem(szItem, pVar, i, bTranslate); } else { DWORD dwValue = SendMessage(hwnd, LB_GETITEMDATA, i, 0); pProp->SetArrayItem(pVar, i, dwValue); } } } void ValuemapValuesToCombo(HWND hwnd, CPropInfo *pProp, LPCTSTR szDefault) { SendMessage(hwnd, CB_RESETCONTENT, 0, 0); if (pProp->GetRawType() != CIM_BOOLEAN) { POSITION pos = pProp->m_mapValues.GetStartPosition(); while(pos) { CString strKey, strValue; pProp->m_mapValues.GetNextAssoc(pos, strKey, strValue); SendMessage(hwnd, CB_ADDSTRING, 0, (LPARAM) (LPCTSTR) strValue); } } else { CString strTemp; strTemp.LoadString(IDS_FALSE); SendMessage(hwnd, CB_ADDSTRING, 0, (LPARAM) (LPCTSTR) strTemp); strTemp.LoadString(IDS_TRUE); SendMessage(hwnd, CB_ADDSTRING, 0, (LPARAM) (LPCTSTR) strTemp); } // Try to select the default. if (SendMessage(hwnd, CB_SELECTSTRING, 0, (LPARAM) szDefault) == CB_ERR) { DWORD dwStyle = GetWindowLong(hwnd, GWL_STYLE); // If that didn't work... if ((dwStyle & CBS_DROPDOWNLIST) == CBS_DROPDOWNLIST || !*szDefault) // If we're a drop down list, choose the first item. SendMessage(hwnd, CB_SETCURSEL, 0, 0); else // If we're a drop down, set the window text. SetWindowText(hwnd, szDefault); } } void BitmaskValuesToCheckListbox(CCheckListBox &ctlListbox, CPropInfo *pProp, DWORD dwDefValue) { int nValues = pProp->m_bitmaskValues.GetSize(); ctlListbox.ResetContent(); for (int i = 0; i < nValues; i++) { DWORD dwValue = pProp->m_bitmaskValues[i].m_dwBitmaskValue; int nIndex; nIndex = ctlListbox.AddString(pProp->m_bitmaskValues[i].m_strName); ctlListbox.SetItemData(nIndex, dwValue); if (dwDefValue & dwValue) ctlListbox.SetCheck(nIndex, TRUE); } } void BitmaskValueToCheckListbox(CCheckListBox &ctlListbox, DWORD dwValue) { int nValues = ctlListbox.GetCount(); for (int i = 0; i < nValues; i++) { DWORD dwItemValue = ctlListbox.GetItemData(i); ctlListbox.SetCheck(i, (dwItemValue & dwValue) != 0); } } void CheckListboxToBitmaskValue(CCheckListBox &ctlListBox, DWORD *pdwValue) { int nItems = ctlListBox.GetCount(); *pdwValue = 0; for (int i = 0; i < nItems; i++) { if (ctlListBox.GetCheck(i)) *pdwValue |= ctlListBox.GetItemData(i); } } void CPropUtil::Init(CWnd *pWnd) { m_pWnd = pWnd; m_spropUtil.Init(pWnd); m_spropUtil.m_pVar = m_pVar; m_spropUtil.m_prop = m_prop; m_spropUtil.m_bTranslate = m_bTranslate; m_spropUtil.m_bNewProperty = m_bNewProperty; } CIMTYPE CPropUtil::GetCurrentType() { int iIndex = m_ctlTypes.GetCurSel(); return (CIMTYPE) m_ctlTypes.GetItemData(iIndex); } void CPropUtil::DoDataExchange(CDataExchange* pDX) { DDX_Control(pDX, IDC_TYPE, m_ctlTypes); DDX_Control(pDX, IDC_ARRAY_VALUES, m_ctlArrayValues); //DDX_Control(pDX, IDC_BITMASK_ARRAY, m_ctlBitmaskValues); //DDX_Control(pDX, IDC_VALUE_LIST, m_ctlListValues); BOOL bNull = m_pVar->vt == VT_NULL, bArray = m_prop.IsArray(); // Setup lots of stuff if we're entering the dialog. if (!pDX->m_bSaveAndValidate) { CString strValue, strType; BOOL bIsBool = m_prop.GetRawCIMType() == CIM_BOOLEAN; m_spropUtil.DoDataExchange(pDX); // Set the property name m_pWnd->SetDlgItemText(IDC_NAME, m_prop.m_strName); // Init the type combo box. InitTypeCombo(); if (!m_bNewProperty) { m_pWnd->GetDlgItem(IDC_TYPE)->EnableWindow(FALSE); m_pWnd->GetDlgItem(IDC_ARRAY)->EnableWindow(FALSE); ((CEdit*) m_pWnd->GetDlgItem(IDC_NAME))->SetReadOnly(TRUE); } // Set the NULL checkbox. m_pWnd->CheckDlgButton(IDC_NULL, bNull); m_pWnd->CheckDlgButton(IDC_ARRAY, bArray); // This will simulate the array button getting checked so our // controls get hidden or shown. OnArray(); // Add the array strings. if (bArray) { ArrayValuesToList(m_ctlArrayValues.m_hWnd, &m_prop, m_pVar, m_bTranslate); UpdateArrayButtons(); } // This will simulate the null button getting checked so our // controls get enabled/disabled. OnNull(); } else // Time to put the data back into the variant. { BOOL bArray = m_pWnd->IsDlgButtonChecked(IDC_ARRAY), bEmbeddedObject = GetCurrentType() == CIM_OBJECT; if (m_bNewProperty) { CIMTYPE type = GetCurrentType(); m_pWnd->GetDlgItemText(IDC_NAME, m_prop.m_strName); if (bArray) type |= CIM_FLAG_ARRAY; m_prop.SetType(type); } if (m_pWnd->IsDlgButtonChecked(IDC_NULL)) { VariantClear(m_pVar); m_pVar->vt = VT_NULL; } else { if (bArray) ListToArrayValues(m_ctlArrayValues.m_hWnd, &m_prop, m_pVar, m_bTranslate); else m_spropUtil.DoDataExchange(pDX); } } } ///////////////////////////////////////////////////////////////////////////// // CPropUtil message handlers void CPropUtil::UpdateArrayButtons() { BOOL bIsNull = m_pWnd->IsDlgButtonChecked(IDC_NULL); if (!bIsNull) { int iWhere = m_ctlArrayValues.GetCurSel(), nItems = m_ctlArrayValues.GetCount(); m_pWnd->GetDlgItem(IDC_UP)->EnableWindow(iWhere > 0); m_pWnd->GetDlgItem(IDC_DOWN)->EnableWindow(iWhere != -1 && iWhere != nItems - 1); m_pWnd->GetDlgItem(IDC_DELETE)->EnableWindow(iWhere != -1); m_pWnd->GetDlgItem(IDC_EDIT)->EnableWindow(iWhere != -1); } } void CPropUtil::OnNull() { BOOL bIsNull = m_pWnd->IsDlgButtonChecked(IDC_NULL); const DWORD dwToEnable[] = { IDC_ARRAY_VALUES, IDC_ADD, IDC_EDIT, IDC_DELETE, IDC_UP, IDC_DOWN, }; for (int i = 0; i < sizeof(dwToEnable) / sizeof(DWORD); i++) m_pWnd->GetDlgItem(dwToEnable[i])->EnableWindow(!bIsNull); m_spropUtil.EnableControls(!bIsNull); UpdateArrayButtons(); } void CPropUtil::OnAdd() { Modify(FALSE); } void CPropUtil::OnEdit() { int iWhich = m_ctlArrayValues.GetCurSel(); Modify(iWhich != -1); } void CPropUtil::Modify(BOOL bEdit) { if (GetCurrentType() == CIM_OBJECT) { int iItem = m_ctlArrayValues.GetCurSel(); if (bEdit) { IUnknown *pUnk = (IUnknown*) m_ctlArrayValues.GetItemData(iItem); CSinglePropUtil::EditObj(pUnk); } else { // Not a smart pointer because we'll release it later. IUnknown *pUnk = NULL; if (CSinglePropUtil::GetNewObj(&pUnk)) { CString strText; CSinglePropUtil::EditObj(pUnk); //strText.Format(IDS_EMBEDDED_OBJECT, (IUnknown*) pUnk); strText = GetEmbeddedObjectText(pUnk); iItem = m_ctlArrayValues.InsertString(iItem, strText); m_ctlArrayValues.SetItemData(iItem, (DWORD_PTR) pUnk); } } return; } DWORD dwData = 0; CArrayItemDlg dlg; _variant_t var; dlg.m_spropUtil.m_bNewProperty = !bEdit; dlg.m_spropUtil.m_bTranslate = m_bTranslate; dlg.m_spropUtil.m_pVar = &var; if (!m_bNewProperty) dlg.m_spropUtil.m_prop = m_prop; else dlg.m_spropUtil.m_prop.SetType(GetCurrentType()); if (bEdit) { int iItem = m_ctlArrayValues.GetCurSel(); BOOL bIsBitmap = m_prop.IsBitmask() && m_bTranslate; if (bIsBitmap) { var = (long) m_ctlArrayValues.GetItemData(iItem); var.vt = m_prop.GetRawType(); } else { CString strValue; BOOL bIsObjEdit = GetCurrentType() == CIM_OBJECT; if (!bIsObjEdit) { m_ctlArrayValues.GetText(iItem, strValue); dlg.m_spropUtil.m_prop.StringToVariant(strValue, &var, m_bTranslate); } else { var.vt = VT_UNKNOWN; var.punkVal = (IUnknown*) m_ctlArrayValues.GetItemData(iItem); // So var doesn't nuke us when it goes away. var.punkVal->AddRef(); } } } if (dlg.DoModal() != IDOK) return; int iNewIndex; if (!bEdit) { if (!m_ctlArrayValues.GetCount()) iNewIndex = 0; else { iNewIndex = m_ctlArrayValues.GetCurSel() + 1; if (iNewIndex == 0) iNewIndex = m_ctlArrayValues.GetCount(); } } else { iNewIndex = m_ctlArrayValues.GetCurSel(); m_ctlArrayValues.DeleteString(iNewIndex); } CString strValue; m_prop.VariantToString(&var, strValue, m_bTranslate); m_ctlArrayValues.InsertString(iNewIndex, strValue); m_ctlArrayValues.SetCurSel(iNewIndex); // This also works if var is VT_IUNKNOWN. m_ctlArrayValues.SetItemData(iNewIndex, var.iVal); UpdateArrayButtons(); } void CPropUtil::OnDelete() { int iWhere = m_ctlArrayValues.GetCurSel(); if (iWhere != -1) { if (IsObjEdit()) { IUnknown *pUnk = (IUnknown *) m_ctlArrayValues.GetItemData(iWhere); pUnk->Release(); } m_ctlArrayValues.DeleteString(iWhere); if (iWhere >= m_ctlArrayValues.GetCount()) iWhere = m_ctlArrayValues.GetCount() - 1; m_ctlArrayValues.SetCurSel(iWhere); UpdateArrayButtons(); } } void CPropUtil::OnUp() { int iWhere = m_ctlArrayValues.GetCurSel(); if (iWhere > 0) { CString strValue; DWORD dwVal; m_ctlArrayValues.GetText(iWhere, strValue); dwVal = m_ctlArrayValues.GetItemData(iWhere); m_ctlArrayValues.DeleteString(iWhere); iWhere--; m_ctlArrayValues.InsertString(iWhere, strValue); m_ctlArrayValues.SetItemData(iWhere, dwVal); m_ctlArrayValues.SetCurSel(iWhere); UpdateArrayButtons(); } } void CPropUtil::OnDown() { int iWhere = m_ctlArrayValues.GetCurSel(); if (iWhere != -1 && iWhere != m_ctlArrayValues.GetCount()) { CString strValue; DWORD dwVal; m_ctlArrayValues.GetText(iWhere, strValue); dwVal = m_ctlArrayValues.GetItemData(iWhere); m_ctlArrayValues.DeleteString(iWhere); iWhere++; m_ctlArrayValues.InsertString(iWhere, strValue); m_ctlArrayValues.SetItemData(iWhere, dwVal); m_ctlArrayValues.SetCurSel(iWhere); UpdateArrayButtons(); } } void CPropUtil::OnSelchangeValueArray() { UpdateArrayButtons(); } void CPropUtil::OnSelchangeType() { if (!m_pWnd->IsDlgButtonChecked(IDC_ARRAY)) { m_spropUtil.SetType(GetCurrentType()); OnNull(); } else { m_ctlArrayValues.ResetContent(); UpdateArrayButtons(); } } void CPropUtil::InitTypeCombo() { const DWORD dwIDs[] = { IDS_CIM_STRING, IDS_CIM_BOOLEAN, IDS_CIM_SINT32, IDS_CIM_REAL64, IDS_CIM_SINT8, IDS_CIM_UINT8, IDS_CIM_SINT16, IDS_CIM_UINT16, IDS_CIM_UINT32, IDS_CIM_SINT64, IDS_CIM_UINT64, IDS_CIM_REAL32, IDS_CIM_DATETIME, IDS_CIM_REFERENCE, IDS_CIM_CHAR16, IDS_CIM_OBJECT, }; const CIMTYPE types[] = { CIM_STRING, CIM_BOOLEAN, CIM_SINT32, CIM_REAL64, CIM_SINT8, CIM_UINT8, CIM_SINT16, CIM_UINT16, CIM_UINT32, CIM_SINT64, CIM_UINT64, CIM_REAL32, CIM_DATETIME, CIM_REFERENCE, CIM_CHAR16, CIM_OBJECT, }; CString strToSelect; CIMTYPE typeToSelect = m_prop.GetRawCIMType(); int nItems = m_bIsQualifier ? 4 : sizeof(dwIDs) / sizeof(dwIDs[0]); for (int i = 0; i < nItems; i++) { CString strType; int iIndex; strType.LoadString(dwIDs[i]); iIndex = m_ctlTypes.AddString(strType); m_ctlTypes.SetItemData(iIndex, types[i]); if (types[i] == typeToSelect) strToSelect = strType; } // Select the type given in m_prop. if (m_ctlTypes.SelectString(-1, strToSelect) == -1) m_ctlTypes.SetCurSel(0); } void CPropUtil::ShowArrayControls(BOOL bVal) { const DWORD dwToEnable[] = { IDC_ARRAY_VALUES, IDC_ADD, IDC_EDIT, IDC_DELETE, IDC_UP, IDC_DOWN, }; DWORD dwFlag = bVal ? SW_SHOW : SW_HIDE; for (int i = 0; i < sizeof(dwToEnable) / sizeof(DWORD); i++) m_pWnd->GetDlgItem(dwToEnable[i])->ShowWindow(dwFlag); if (bVal) UpdateArrayButtons(); } void CPropUtil::OnArray() { BOOL bArray = m_pWnd->IsDlgButtonChecked(IDC_ARRAY); m_spropUtil.ShowControls(!bArray); ShowArrayControls(bArray); } BOOL CPropUtil::OnSetActive() { return TRUE; } BOOL CPropUtil::OnInitDialog() { // This is a total pain!!! I tried putting this in WM_INIT_DIALOG and // DoDataExchange but neither one worked. MoveArrayButtons(); BOOL bRet = m_spropUtil.OnInitDialog(); return bRet; } void CPropUtil::OnEditEmbedded() { m_spropUtil.OnEditEmbedded(); } void CPropUtil::OnClearEmbedded() { m_spropUtil.OnClearEmbedded(); } void CPropUtil::OnDblclkArrayValues() { OnEdit(); } void CPropUtil::MoveArrayButtons() { RECT rectEdit, rectAdd; CWnd *pwndAdd = m_pWnd->GetDlgItem(IDC_ADD), *pwndEdit = m_pWnd->GetDlgItem(IDC_BITMASK_ARRAY), *pwndParent = pwndAdd->GetParent(); int dx, dy; pwndEdit->GetClientRect(&rectEdit); pwndEdit->MapWindowPoints(pwndParent, &rectEdit); pwndAdd->GetClientRect(&rectAdd); pwndAdd->MapWindowPoints(pwndParent, &rectAdd); // Why this 2 business? Because it seems to make the movement more // accurate. dx = rectEdit.left - rectAdd.left - 2; dy = rectEdit.top - rectAdd.top - 2; const DWORD dwToMove[] = { IDC_ARRAY_VALUES, IDC_ADD, IDC_EDIT, IDC_DELETE, IDC_UP, IDC_DOWN, }; for (int i = 0; i < sizeof(dwToMove) / sizeof(DWORD); i++) { CWnd *pWnd = m_pWnd->GetDlgItem(dwToMove[i]); CRect rect; pWnd->GetClientRect(&rect); pWnd->MapWindowPoints(pwndParent, &rect); rect.OffsetRect(dx, dy); // The array values controls seems to need this. Why? I don't know. if (i == 0) rect.OffsetRect(-2, -2); pWnd->MoveWindow(&rect); pWnd->GetClientRect(&rect); pWnd->MapWindowPoints(pwndParent, &rect); } // Now make the array listbox the same size as the bitmask listbox. CWnd *pBitValues = m_pWnd->GetDlgItem(IDC_BITMASK_ARRAY), *pArrayValues = m_pWnd->GetDlgItem(IDC_ARRAY_VALUES); RECT rectBitValues, rectArrayValues; pBitValues->GetClientRect(&rectBitValues); pArrayValues->GetClientRect(&rectArrayValues); pArrayValues->SetWindowPos( NULL, 0, 0, // More screwy values to make the sizing correct. rectBitValues.right + 4, rectBitValues.bottom + 4, SWP_NOMOVE | SWP_NOZORDER); // Move the up and down buttons since we grew the array listbox. dx = rectBitValues.right - rectArrayValues.right - 2; dy = (rectBitValues.bottom - rectArrayValues.bottom) / 2; for (i = 0; i < 2; i++) { CWnd *pWnd = m_pWnd->GetDlgItem(i == 0 ? IDC_UP : IDC_DOWN); CRect rect; pWnd->GetClientRect(&rect); pWnd->MapWindowPoints(m_pWnd, &rect); rect.OffsetRect(dx, dy); pWnd->MoveWindow(&rect); } } ///////////////////////////////////////////////////////////////////////////// // CSinglePropUtil void CSinglePropUtil::DoDataExchange(CDataExchange* pDX) { DDX_Control(pDX, IDC_VALUE_LIST, m_ctlListValues); DDX_Control(pDX, IDC_BITMASK_ARRAY, m_ctlBitmaskValues); DDX_Control(pDX, IDC_VALUE, m_ctlScalar); DDX_Control(pDX, IDC_VALUE_TEXT, m_ctlText); if (!pDX->m_bSaveAndValidate) { // This will set our data. SetType(m_prop.GetRawCIMType()); } else { if (m_prop.GetRawCIMType() != CIM_OBJECT) { switch(m_type) { case TYPE_CHECKLISTBOX: m_pVar->vt = m_prop.GetRawType(); CheckListboxToBitmaskValue(m_ctlBitmaskValues, (DWORD*) &V_I4(m_pVar)); break; default: { CString strValue; m_pWnd->GetDlgItemText(m_dwScalarID, strValue); m_prop.StringToVariant(strValue, m_pVar, m_bTranslate); break; } } } else { VariantClear(m_pVar); m_pVar->vt = VT_NULL; if (m_pObjValue != NULL) { m_pVar->vt = VT_UNKNOWN; m_pVar->punkVal = m_pObjValue; m_pVar->punkVal->AddRef(); } } } } void CSinglePropUtil::ShowControls(BOOL bShow) { DWORD dwFlag = bShow ? SW_SHOW : SW_HIDE; switch(m_type) { case TYPE_EDIT_SCALAR: m_ctlScalar.ShowWindow(dwFlag); //m_ctlScalar.EnableWindow(TRUE); break; case TYPE_EDIT_TEXT: m_ctlText.ShowWindow(dwFlag); //m_ctlText.EnableWindow(TRUE); break; case TYPE_CHECKLISTBOX: m_ctlBitmaskValues.ShowWindow(dwFlag); break; case TYPE_EDIT_OBJ: m_ctlScalar.ShowWindow(dwFlag); m_ctlScalar.EnableWindow(FALSE); m_pWnd->GetDlgItem(IDC_EDIT_OBJ)->ShowWindow(dwFlag); m_pWnd->GetDlgItem(IDC_CLEAR)->ShowWindow(dwFlag); break; case TYPE_DROPDOWN: case TYPE_DROPDOWNLIST: m_ctlListValues.ShowWindow(dwFlag); break; } } void CSinglePropUtil::EnableControls(BOOL bEnable) { const DWORD dwIDs[] = { IDC_VALUE_LIST, IDC_BITMASK_ARRAY, IDC_EDIT_OBJ, IDC_CLEAR, IDC_VALUE_TEXT, }; for (int i = 0; i < sizeof(dwIDs) / sizeof(dwIDs[0]); i++) m_pWnd->GetDlgItem(dwIDs[i])->EnableWindow(bEnable); m_pWnd->GetDlgItem(IDC_VALUE)->EnableWindow(bEnable && m_type != TYPE_EDIT_OBJ); } void CSinglePropUtil::SetType(CIMTYPE type) { BOOL bIsBool, bNull, bArray; CString strValue; m_prop.SetType(type); bIsBool = m_prop.GetRawCIMType() == CIM_BOOLEAN; bNull = m_pVar->vt == VT_NULL; bArray = (m_pVar->vt & VT_ARRAY) != 0; // Set the value. if (!bNull) m_prop.VariantToString(m_pVar, strValue, m_bTranslate); if (!m_bControlsInited) InitControls(); // Get the type of operation we're dealing with. if (m_prop.IsBitmask() && m_bTranslate) { m_type = TYPE_CHECKLISTBOX; m_ctlBitmaskValues.ShowWindow(SW_SHOW); m_ctlListValues.ShowWindow(SW_HIDE); m_ctlScalar.ShowWindow(SW_HIDE); m_ctlText.ShowWindow(SW_HIDE); m_pWnd->GetDlgItem(IDC_EDIT_OBJ)->ShowWindow(SW_HIDE); m_pWnd->GetDlgItem(IDC_CLEAR)->ShowWindow(SW_HIDE); BitmaskValuesToCheckListbox( m_ctlBitmaskValues, &m_prop, bNull ? 0 : m_pVar->iVal); } else if ((m_prop.HasValuemap() && m_bTranslate) || bIsBool) { m_type = TYPE_DROPDOWN; m_ctlListValues.ShowWindow(SW_SHOW); m_ctlBitmaskValues.ShowWindow(SW_HIDE); m_ctlScalar.ShowWindow(SW_HIDE); m_ctlText.ShowWindow(SW_HIDE); m_pWnd->GetDlgItem(IDC_EDIT_OBJ)->ShowWindow(SW_HIDE); m_pWnd->GetDlgItem(IDC_CLEAR)->ShowWindow(SW_HIDE); ValuemapValuesToCombo(m_ctlListValues.m_hWnd, &m_prop, strValue); m_dwScalarID = IDC_VALUE_LIST; } else { BOOL bMultiLine = type == CIM_STRING; CWnd *pwndValue = m_pWnd->GetDlgItem(IDC_VALUE); //pwndValue->ShowWindow(SW_SHOW); /* if (bMultiLine) { pwndValue->DestroyWindow(); CreateWindowEx( 0x204, // From Spy++. _T("Edit"), NULL, ES_WANTRETURN | ES_MULTILINE | ES_LEFT | WS_VSCROLL | WS_CHILDWINDOW | WS_VISIBLE | WS_TABSTOP, m_rectText.left, m_rectText.top, m_rectText.Width(), m_rectText.Height(), m_pWnd->m_hWnd, (HMENU) IDC_VALUE, NULL, NULL); //pwndValue->ModifyStyle(ES_AUTOHSCROLL, ); //pwndValue->MoveWindow(&m_rectText, TRUE); } else { pwndValue->DestroyWindow(); CreateWindowEx( 0x204, // From Spy++. _T("Edit"), NULL, ES_AUTOHSCROLL | ES_LEFT | WS_CHILDWINDOW | WS_VISIBLE | WS_TABSTOP, m_rectScalar.left, m_rectScalar.top, m_rectScalar.Width(), m_rectScalar.Height(), m_pWnd->m_hWnd, (HMENU) IDC_VALUE, NULL, NULL); //pwndValue->ModifyStyle(ES_WANTRETURN | ES_MULTILINE | WS_VSCROLL, ES_AUTOHSCROLL); //pwndValue->MoveWindow(&m_rectScalar); } pwndValue = m_pWnd->GetDlgItem(IDC_VALUE); pwndValue->UpdateWindow(); pwndValue->ShowWindow(SW_SHOW); pwndValue->SetFont(m_pWnd->GetFont()); */ m_ctlListValues.ShowWindow(SW_HIDE); m_ctlBitmaskValues.ShowWindow(SW_HIDE); if (bMultiLine) { m_ctlScalar.ShowWindow(SW_HIDE); m_ctlText.ShowWindow(SW_SHOW); m_ctlText.EnableWindow(TRUE); m_pWnd->GetDlgItem(IDC_EDIT_OBJ)->ShowWindow(SW_HIDE); m_pWnd->GetDlgItem(IDC_CLEAR)->ShowWindow(SW_HIDE); m_dwScalarID = IDC_VALUE_TEXT; m_type = TYPE_EDIT_TEXT; } else { m_ctlText.ShowWindow(SW_HIDE); m_ctlScalar.ShowWindow(SW_SHOW); m_dwScalarID = IDC_VALUE; if (type == VT_UNKNOWN) { m_type = TYPE_EDIT_OBJ; m_pWnd->GetDlgItem(IDC_VALUE)->EnableWindow(FALSE); m_pWnd->GetDlgItem(IDC_EDIT_OBJ)->ShowWindow(SW_SHOW); m_pWnd->GetDlgItem(IDC_CLEAR)->ShowWindow(SW_SHOW); if (!bArray) { if (m_pVar->vt == VT_UNKNOWN) m_pObjValue = m_pVar->punkVal; else m_pObjValue = NULL; VariantClear(m_pVar); m_pVar->vt = VT_NULL; } } else { m_type = TYPE_EDIT_SCALAR; m_pWnd->GetDlgItem(IDC_VALUE)->EnableWindow(TRUE); m_pWnd->GetDlgItem(IDC_EDIT_OBJ)->ShowWindow(SW_HIDE); m_pWnd->GetDlgItem(IDC_CLEAR)->ShowWindow(SW_HIDE); } } m_pWnd->SetDlgItemText(m_dwScalarID, strValue); } } void CSinglePropUtil::InitControls() { if (m_bControlsInited) return; m_bControlsInited = TRUE; // Move the combo box into place. #define DROPDOWNLISTBOX_INCREASE 100 // Get a bunch of vars the next group of code will use to // resize the dialog, create controls, etc. CWnd *pwndEdit = m_pWnd->GetDlgItem(IDC_VALUE), *pwndBitmask = m_pWnd->GetDlgItem(IDC_BITMASK_ARRAY); // Save this for single-line text editing. pwndEdit->GetClientRect(&m_rectScalar); pwndEdit->MapWindowPoints(m_pWnd, &m_rectScalar); // Save this for multi-line text editing. pwndBitmask->GetClientRect(&m_rectText); pwndBitmask->MapWindowPoints(m_pWnd, &m_rectText); m_rectScalar.InflateRect(2, 2); m_rectText.InflateRect(2, 2); m_ctlText.MoveWindow(&m_rectText); RECT rectDropdown = m_rectScalar; // Adjust the position of the translation since the edit control // doesn't seem to tell us exactly where it is. //rectDropdown.left -= 2; //rectDropdown.top -= 2; //rectDropdown.right += 2; // Make bigger for the dropdown list. rectDropdown.bottom += DROPDOWNLISTBOX_INCREASE; m_ctlListValues.MoveWindow(&rectDropdown); } ///////////////////////////////////////////////////////////////////////////// // CSinglePropUtil message handlers BOOL CSinglePropUtil::GetNewObj(IUnknown **ppUnk) { CGetTextDlg dlg; BOOL bRet = FALSE; dlg.m_dwPromptID = IDS_CREATE_OBJ_PROMPT; dlg.m_dwTitleID = IDS_CREATE_OBJ_TITLE; dlg.m_bAllowClassBrowse = TRUE; dlg.m_pNamespace = g_pOpView->GetDocument()->m_pNamespace; dlg.LoadListViaReg(_T("GetClassHistory")); if (dlg.DoModal() == IDOK) { HRESULT hr; IWbemClassObjectPtr pClass; // Get the superclass. hr = dlg.m_pNamespace->GetObject( _bstr_t(dlg.m_strText), WBEM_FLAG_USE_AMENDED_QUALIFIERS, NULL, &pClass, NULL); if (SUCCEEDED(hr)) { IWbemClassObjectPtr pObj; hr = pClass->SpawnInstance( 0, &pObj); if (SUCCEEDED(hr)) { pObj->QueryInterface( IID_IUnknown, (LPVOID*) ppUnk); bRet = TRUE; } } if (FAILED(hr)) CWMITestDoc::DisplayWMIErrorBox(hr); } return bRet; } void CSinglePropUtil::OnEditEmbedded() { if (m_pObjValue == NULL) { if (GetNewObj(&m_pObjValue)) { // Call this again since now we're setup OK. OnEditEmbedded(); CString strText; //strText.Format(IDS_EMBEDDED_OBJECT, (IUnknown*) m_pObjValue); strText = GetEmbeddedObjectText(m_pObjValue); m_ctlScalar.SetWindowText(strText); } } else { EditObj(m_pObjValue); } } void CSinglePropUtil::EditObj(IUnknown *pUnk) { HRESULT hr; IWbemClassObjectPtr pObj; hr = pUnk->QueryInterface( IID_IWbemClassObject, (LPVOID*) &pObj); if (SUCCEEDED(hr)) CWMITestDoc::EditGenericObject(IDS_EDIT_EMBEDDED_OBJ, pObj); else CWMITestDoc::DisplayWMIErrorBox(hr); } void CSinglePropUtil::OnClearEmbedded() { m_pObjValue = NULL; CString strNull; strNull.LoadString(IDS_NULL); m_ctlScalar.SetWindowText(strNull); } BOOL CSinglePropUtil::OnInitDialog() { InitControls(); return TRUE; }