2025-04-27 07:49:33 -04:00

3556 lines
81 KiB
C++
Raw Permalink Blame History

// ***************************************************************************
//
// Copyright (c) 1997-2001 Microsoft Corporation, All Rights Reserved
//
// File: ClassNavCtl.cpp
//
// Description:
// This file implements the CClassNavCtrl ActiveX control class.
// The CClassNavCtrl class is a part of the Class Explorer OCX, it
// is a subclass of the Microsoft COleControl class and performs
// the following functions:
// a. Displays the class hierarchy
// b. Allows classes to be added and deleted
// c. Searches for classes in the tree
// d. Implements automation properties, methods and events.
//
// Part of:
// ClassNav.ocx
//
// Used by:
//
//
// History:
// Judith Ann Powell 10-08-96 Created.
//
//
// **************************************************************************
// ===========================================================================
//
// Includes
//
// ===========================================================================
#include "precomp.h"
#include "ClassNav.h"
#include "wbemidl.h"
#include "olemsclient.h"
#include "AddDialog.h"
#include "RenameClassDialog.h"
#include "ClassSearch.h"
#include "CClassTree.h"
#include "CContainedToolBar.h"
#include "Banner.h"
#include "ClassNavCtl.h"
#include "ClassNavPpg.h"
#include "ProgDlg.h"
#include "nsentry.h"
#include "InitNamespaceNSEntry.h"
#include "InitNamespaceDialog.h"
#include "ClassNavNSEntry.h"
#include <genlex.h>
#include <opathlex.h>
#include <objpath.h>
#include "logindlg.h"
#include "SchemaInfo.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
// ===========================================================================
//
// Externs
//
// ===========================================================================
extern CClassNavApp theApp;
// ===========================================================================
//
// Dynamic creation
//
// ===========================================================================
IMPLEMENT_DYNCREATE(CClassNavCtrl, COleControl)
// ===========================================================================
//
// Message map
//
// ===========================================================================
BEGIN_MESSAGE_MAP(CClassNavCtrl, COleControl)
//{{AFX_MSG_MAP(CClassNavCtrl)
ON_WM_SIZE()
ON_WM_CREATE()
ON_COMMAND(ID_CLEAREXTENDEDSELECTION, OnClearextendedselection)
ON_UPDATE_COMMAND_UI(ID_CLEAREXTENDEDSELECTION, OnUpdateClearextendedselection)
ON_COMMAND(ID_POPUP_SEARCHFORCLASS, OnPopupSearchforclass)
ON_UPDATE_COMMAND_UI(ID_POPUP_SEARCHFORCLASS, OnUpdatePopupSearchforclass)
ON_COMMAND(ID_POPUP_SELECTALL, OnPopupSelectall)
ON_UPDATE_COMMAND_UI(ID_POPUP_SELECTALL, OnUpdatePopupSelectall)
ON_WM_DESTROY()
ON_COMMAND(ID_MENUITEMREFRESH, OnMenuitemrefresh)
ON_UPDATE_COMMAND_UI(ID_MENUITEMREFRESH, OnUpdateMenuitemrefresh)
ON_WM_LBUTTONUP()
ON_WM_KILLFOCUS()
ON_WM_SETFOCUS()
ON_COMMAND(ID_POPUP_ADDCLASS, OnPopupAddclass)
ON_UPDATE_COMMAND_UI(ID_POPUP_ADDCLASS, OnUpdatePopupAddclass)
ON_COMMAND(ID_POPUP_DELETECLASS, OnPopupDeleteclass)
ON_UPDATE_COMMAND_UI(ID_POPUP_DELETECLASS, OnUpdatePopupDeleteclass)
ON_COMMAND(ID_POPUP_RENAMECLASS, OnPopupRenameclass)
ON_UPDATE_COMMAND_UI(ID_POPUP_RENAMECLASS, OnUpdatePopupRenameclass)
//}}AFX_MSG_MAP
ON_OLEVERB(AFX_IDS_VERB_EDIT, OnEdit)
ON_OLEVERB(AFX_IDS_VERB_PROPERTIES, OnProperties)
ON_MESSAGE(INITIALIZE_NAMESPACE, InitializeState )
ON_MESSAGE(FIRE_OPEN_NAMESPACE, FireOpenNamespace )
ON_MESSAGE(REDRAW_CONTROL, RedrawAll)
ON_MESSAGE(SETFOCUSTREE, SetFocusTree)
ON_MESSAGE(SETFOCUSNSE, SetFocusNSE)
ON_MESSAGE(CLEARNAMESPACE, ClearNamespace)
END_MESSAGE_MAP()
// ===========================================================================
//
// Dispatch map
//
// ===========================================================================
BEGIN_DISPATCH_MAP(CClassNavCtrl, COleControl)
//{{AFX_DISPATCH_MAP(CClassNavCtrl)
DISP_PROPERTY_EX(CClassNavCtrl, "NameSpace", GetNameSpace, SetNameSpace, VT_BSTR)
DISP_FUNCTION(CClassNavCtrl, "GetExtendedSelection", GetExtendedSelection, VT_VARIANT, VTS_NONE)
DISP_FUNCTION(CClassNavCtrl, "GetSingleSelection", GetSingleSelection, VT_BSTR, VTS_NONE)
DISP_FUNCTION(CClassNavCtrl, "OnReadySignal", OnReadySignal, VT_EMPTY, VTS_NONE)
DISP_FUNCTION(CClassNavCtrl, "InvalidateServer", InvalidateServer, VT_EMPTY, VTS_BSTR)
DISP_FUNCTION(CClassNavCtrl, "MofCompiled", MofCompiled, VT_EMPTY, VTS_BSTR)
//}}AFX_DISPATCH_MAP
DISP_FUNCTION_ID(CClassNavCtrl, "AboutBox", DISPID_ABOUTBOX, AboutBox, VT_EMPTY, VTS_NONE)
END_DISPATCH_MAP()
// ===========================================================================
//
// Event map
//
// ===========================================================================
BEGIN_EVENT_MAP(CClassNavCtrl, COleControl)
//{{AFX_EVENT_MAP(CClassNavCtrl)
EVENT_CUSTOM("EditExistingClass", FireEditExistingClass, VTS_VARIANT)
EVENT_CUSTOM("NotifyOpenNameSpace", FireNotifyOpenNameSpace, VTS_BSTR)
EVENT_CUSTOM("GetIWbemServices", FireGetIWbemServices, VTS_BSTR VTS_PVARIANT VTS_PVARIANT VTS_PVARIANT VTS_PVARIANT)
EVENT_CUSTOM("QueryCanChangeSelection", FireQueryCanChangeSelection, VTS_BSTR VTS_PVARIANT)
//}}AFX_EVENT_MAP
END_EVENT_MAP()
// ===========================================================================
//
// Property Pages
//
// ===========================================================================
BEGIN_PROPPAGEIDS(CClassNavCtrl, 1)
PROPPAGEID(CClassNavPropPage::guid)
END_PROPPAGEIDS(CClassNavCtrl)
// ===========================================================================
//
// Class factory and guid
//
// ===========================================================================
IMPLEMENT_OLECREATE_EX(CClassNavCtrl, "WBEM.ClassNavCtrl.1",
0xc587b673, 0x103, 0x11d0, 0x8c, 0xa2, 0, 0xaa, 0, 0x6d, 0x1, 0xa)
// ===========================================================================
//
// Type library ID and version
//
// ===========================================================================
IMPLEMENT_OLETYPELIB(CClassNavCtrl, _tlid, _wVerMajor, _wVerMinor)
// ===========================================================================
//
// Interface IDs
//
// ===========================================================================
const IID BASED_CODE IID_DClassNav =
{ 0xc587b671, 0x103, 0x11d0, { 0x8c, 0xa2, 0, 0xaa, 0, 0x6d, 0x1, 0xa } };
const IID BASED_CODE IID_DClassNavEvents =
{ 0xc587b672, 0x103, 0x11d0, { 0x8c, 0xa2, 0, 0xaa, 0, 0x6d, 0x1, 0xa } };
// ===========================================================================
//
// Font Height
//
// ===========================================================================
#define CY_FONT 15
// ===========================================================================
//
// Control type information
//
// ===========================================================================
static const DWORD BASED_CODE _dwClassNavOleMisc =
OLEMISC_ACTIVATEWHENVISIBLE |
OLEMISC_SETCLIENTSITEFIRST |
OLEMISC_INSIDEOUT |
OLEMISC_CANTLINKINSIDE |
OLEMISC_RECOMPOSEONRESIZE;
IMPLEMENT_OLECTLTYPE(CClassNavCtrl, IDS_CLASSNAV, _dwClassNavOleMisc)
// ***************************************************************************
//
// CClassNavCtrl::CClassNavCtrlFactory::UpdateRegistry
//
// Description:
// Adds or removes system registry entries for CCClassNavCtrl.
//
// Parameters:
// BOOL bRegister Register if TRUE; Unregister if FALSE.
//
// Returns:
// BOOL TRUE on success
// FALSE on failure
//
// Globals accessed:
// NONE
//
// Globals modified:
// NONE
//
// ***************************************************************************
BOOL CClassNavCtrl::CClassNavCtrlFactory::UpdateRegistry(BOOL bRegister)
{
// TODO: Verify that your control follows apartment-model threading rules.
// Refer to MFC TechNote 64 for more information.
// If your control does not conform to the apartment-model rules, then
// you must modify the code below, changing the 6th parameter from
// afxRegInsertable | afxRegApartmentThreading to afxRegInsertable.
if (bRegister)
return AfxOleRegisterControlClass(
AfxGetInstanceHandle(),
m_clsid,
m_lpszProgID,
IDS_CLASSNAV,
IDB_CLASSNAV,
afxRegInsertable | afxRegApartmentThreading,
_dwClassNavOleMisc,
_tlid,
_wVerMajor,
_wVerMinor);
else
return AfxOleUnregisterClass(m_clsid, m_lpszProgID);
}
int GetPropNames(IWbemClassObject * pClass, CString *&pcsReturn)
{
SCODE sc;
long ix[2] = {0,0};
long lLower, lUpper;
SAFEARRAY * psa = NULL;
VARIANTARG var;
VariantInit(&var);
CString csNull;
sc = pClass->GetNames(NULL,0,NULL,&psa);
if(sc != S_OK)
{
CString csUserMsg;
csUserMsg = _T("Cannot get property names ");
csUserMsg += _T(" for object ");
csUserMsg += GetIWbemFullPath (NULL, pClass);
ErrorMsg
(&csUserMsg, S_OK, NULL, TRUE, &csUserMsg, __FILE__,
__LINE__ - 10);
}
else
{
int iDim = SafeArrayGetDim(psa);
int i;
sc = SafeArrayGetLBound(psa,1,&lLower);
sc = SafeArrayGetUBound(psa,1,&lUpper);
pcsReturn = new CString [(lUpper - lLower) + 1];
for(ix[0] = lLower, i = 0; ix[0] <= lUpper; ix[0]++, i++)
{
BOOL bClsidSetForProp = FALSE;
BSTR PropName;
sc = SafeArrayGetElement(psa,ix,&PropName);
pcsReturn[i] = PropName;
SysFreeString(PropName);
}
}
SafeArrayDestroy(psa);
return (lUpper - lLower) + 1;
}
void GetAssocLeftRight(IWbemClassObject *pAssoc , CString &szLeft, CString &szRight)
{
SCODE sc;
long ix[2] = {0,0};
long lLower, lUpper;
SAFEARRAY * psa = NULL;
int nProps;
CString *pcsProps;
nProps = GetPropNames(pAssoc, pcsProps);
int i,k;
IWbemQualifierSet * pAttrib = NULL;
int cRefs = 0;
CString csTmp = _T("syntax");
k = 0; // index into pcsRolesAndPaths
for (i = 0; i < nProps; i++)
{
BSTR bstrTemp = pcsProps[i].AllocSysString();
sc = pAssoc -> GetPropertyQualifierSet(bstrTemp,
&pAttrib);
::SysFreeString(bstrTemp);
if (sc == S_OK)
{
VARIANTARG var;
VariantInit(&var);
sc = pAttrib->GetNames(0,&psa);
if(sc == S_OK)
{
int iDim = SafeArrayGetDim(psa);
sc = SafeArrayGetLBound(psa,1,&lLower);
sc = SafeArrayGetUBound(psa,1,&lUpper);
BSTR AttrName;
for(ix[0] = lLower; ix[0] <= lUpper; ix[0]++)
{
sc = SafeArrayGetElement(psa,ix,&AttrName);
csTmp = AttrName;
//Get the attrib value
long lReturn;
BSTR bstrTemp = csTmp.AllocSysString();
sc = pAttrib -> Get(bstrTemp, 0,
&var,&lReturn);
::SysFreeString(bstrTemp);
if (sc != S_OK)
{
CString csUserMsg;
csUserMsg = _T("Cannot get qualifier value ");
csUserMsg += pcsProps[i] + _T(" for object ");
csUserMsg += GetIWbemFullPath (NULL, pAssoc);
csUserMsg += _T(" quialifier ") + csTmp;
ErrorMsg
(&csUserMsg, S_OK, NULL, TRUE, &csUserMsg, __FILE__,
__LINE__ - 11);
}
else
{
CString csValue;
CString csValue2;
if (var.vt == VT_BSTR)
{
csValue = var.bstrVal;
csValue2 = csValue.Right(csValue.GetLength() - 4);
csValue = csValue.Left(4);
if(csValue.CompareNoCase(_T("ref:")) == 0)
{
if(cRefs == 0)
szLeft = csValue2;
else
szRight = csValue2;
cRefs++;
// pcsRolesAndPaths[k++] = pcsProps[i];
}
}
SysFreeString(AttrName);
}
}
}
pAttrib -> Release();
}
}
SafeArrayDestroy(psa);
delete [] pcsProps;
}
// ***************************************************************************
//
// CClassNavCtrl::CClassNavCtrl
//
// Description:
// Class constructor.
//
// Parameters:
// NONE
//
// Returns:
// NONE
//
// Globals accessed:
// NONE
//
// Globals modified:
// NONE
//
// ***************************************************************************
CClassNavCtrl::CClassNavCtrl()
{
InitializeIIDs(&IID_DClassNav, &IID_DClassNavEvents);
m_bChildrenCreated = FALSE;
m_bInit = FALSE;
m_lWidth = 200;
m_lHeight = 200;
m_pcilImageList = NULL;
m_pcilStateImageList = NULL;
m_nBitmaps = 2;
m_pAddDialog = NULL;
m_pRenameDialog = NULL;
m_pSearchDialog = NULL;
m_hContextSelection = NULL;
m_bMetricSet = FALSE;
m_csBanner = _T("Classes in:");
m_nOffset = 2;
m_bDrawAll = FALSE;
m_bFirstDraw = TRUE;
m_pServices = NULL;
m_bSelectAllMode = FALSE;
m_bOpeningNamespace = FALSE;
m_bInOnDraw = FALSE;
m_bOpenedInitialNamespace = FALSE;
m_csFontName = _T("MS Shell Dlg");
m_nFontHeight = CY_FONT;
m_nFontWeight = (short) FW_NORMAL;
m_pProgressDlg = NULL;
m_bItemUnselected = NULL;
m_bRestoreFocusToTree = TRUE;
m_bReadySignal = FALSE;
m_pDlg = NULL;
AfxEnableControlContainer();
}
// ***************************************************************************
//
// CClassNavCtrl::~CClassNavCtrl
//
// Description:
// Class destructor.
//
// Parameters:
// NONE
//
// Returns:
// NONE
//
// Globals accessed:
// NONE
//
// Globals modified:
// NONE
//
// ***************************************************************************
CClassNavCtrl::~CClassNavCtrl()
{
if (m_pServices)
{
m_pServices -> Release();
}
delete m_pProgressDlg;
}
// ***************************************************************************
//
// CClassNavCtrl::GetControlFlags
//
// Description:
// Returns flags to customize MFC's implementation of ActiveX controls. For
// a description of the flags see MFC technical note "Optimizing an ActiveX
// Control".
//
// Parameters:
// NONE
//
// Returns:
// DWORD Control flags
//
// Globals accessed:
// NONE
//
// Globals modified:
// NONE
//
// ***************************************************************************
DWORD CClassNavCtrl::GetControlFlags()
{
DWORD dwFlags = COleControl::GetControlFlags();
// The control will not be redrawn when making the transition
// between the active and inactivate state.
dwFlags |= noFlickerActivate;
return dwFlags;
}
// ***************************************************************************
//
// CClassNavCtrl::OnDraw
//
// Description:
// Drawing member function for screen device.
//
// Parameters:
// CDC *pDC The device context in which the drawing occurs.
// CRect &rcBounds The rectangular area of the control, including the
// border.
// CRect &rcInvalid The rectangular area of the control that is invalid.
//
// Returns:
// void
//
// Globals accessed:
// NONE
//
// Globals modified:
// NONE
//
// ***************************************************************************
void CClassNavCtrl::OnDraw(
CDC* pdc, const CRect& rcBounds, const CRect& rcInvalid)
{
CRect rcSave = rcBounds;
CRect rcSave1 = rcBounds;
if (m_bInOnDraw)
{
return;
}
COLORREF dwBackColor = GetSysColor(COLOR_3DFACE);
COLORREF crWhite = RGB(255,255,255);
COLORREF crGray = GetSysColor(COLOR_3DHILIGHT);
COLORREF crDkGray = GetSysColor(COLOR_3DSHADOW);
COLORREF crBlack = GetSysColor(COLOR_WINDOWTEXT);
m_bInOnDraw = TRUE;
if (GetSafeHwnd()) {
CRect rcOutline(rcBounds);
CBrush cbBackGround;
cbBackGround.CreateSolidBrush(dwBackColor);
CBrush *cbSave = pdc -> SelectObject(&cbBackGround);
pdc ->FillRect(&rcOutline, &cbBackGround);
pdc -> SelectObject(cbSave);
}
if (m_bOpeningNamespace == TRUE)
{
if (m_cbBannerWindow.GetSafeHwnd())
{
m_cbBannerWindow.ShowWindow(SW_SHOWNA);
}
if (m_ctcTree.GetSafeHwnd())
{
m_ctcTree.ShowWindow(SW_SHOWNA);
}
m_bInOnDraw = FALSE;
return;
}
// So we can count on fundamental display characteristics.
pdc -> SetMapMode (MM_TEXT);
pdc -> SetWindowOrg(0,0);
if (m_bOpeningNamespace == FALSE && m_pServices == NULL && m_bDrawAll == TRUE)
{
m_bInOnDraw = FALSE;
return;
}
if (!AmbientUserMode( ) && m_ctcTree.GetSafeHwnd( ))
{
// May want to do something fancier, but for now just print
// text.
m_bInOnDraw = FALSE;
return;
}
else // In case an editor does not support ambient modes.
if (m_ctcTree.GetSafeHwnd( ) == NULL)
{
m_bInOnDraw = FALSE;
return;
}
// First time just a blank window.
CFont* pOldFont;
if (m_bFirstDraw)
{
m_bFirstDraw = FALSE;
CWnd::SetFont ( &m_cfFont , FALSE);
pOldFont = pdc -> SelectObject( &m_cfFont );
InitializeChildControlSize(rcBounds.Width(), rcBounds.Height());
}
pOldFont = pdc -> SelectObject( &m_cfFont );
CRect rcOutline(rcBounds);
CBrush cbBackGround;
cbBackGround.CreateSolidBrush(dwBackColor);
CBrush *cbSave = pdc -> SelectObject(&cbBackGround);
pdc ->FillRect(&rcOutline, &cbBackGround);
pdc -> SelectObject(cbSave);
rcOutline = m_rTreeRect;
pdc -> Draw3dRect(&rcOutline, crBlack, crGray);
pdc -> SetBkMode( TRANSPARENT );
pdc -> TextOut
( m_nOffset + 4 , ((int) (m_nFontHeight * .35)) + ( 3 * m_nOffset),
(LPCTSTR) m_csBanner, m_csBanner.GetLength() );
pdc -> SetBkMode( OPAQUE );
pdc->SelectObject(pOldFont);
InitializeTreeForDrawing();
m_bInOnDraw = FALSE;
m_cbBannerWindow.ShowWindow(SW_SHOW);
m_ctcTree.ShowWindow(SW_SHOW);
}
// ***************************************************************************
//
// CClassNavCtrl::GetControlFont
//
// Description:
// Create the font used by the control and get the font metrics.
//
// Parameters:
// NONE
//
// Returns:
// VOID
//
// Globals accessed:
// NONE
//
// Globals modified:
// NONE
//
// ***************************************************************************
void CClassNavCtrl::CreateControlFont()
{
if (!m_bMetricSet) // Create the font used by the control.
{
CDC *pdc = CWnd::GetDC( );
pdc -> SetMapMode (MM_TEXT);
pdc -> SetWindowOrg(0,0);
LOGFONT lfFont;
InitializeLogFont
(lfFont, m_csFontName,m_nFontHeight, m_nFontWeight);
m_cfFont.CreateFontIndirect(&lfFont);
CWnd::SetFont ( &m_cfFont , FALSE);
CFont* pOldFont = pdc -> SelectObject( &m_cfFont );
pdc->GetTextMetrics(&m_tmFont);
pdc -> SelectObject(pOldFont);
m_bMetricSet = TRUE;
ReleaseDC(pdc);
}
}
// ***************************************************************************
//
// CClassNavCtrl::InitializeLogFont
//
// Description:
// Fill in LOGFONT structure.
//
// Parameters:
// LOGFONT &rlfFont Structure to fill in.
// CString csName Font name.
// int nHeight Font height.
// int nWeight Font weight.
//
// Returns:
// VOID
//
// Globals accessed:
// NONE
//
// Globals modified:
// NONE
//
// ***************************************************************************
void CClassNavCtrl::InitializeLogFont
(LOGFONT &rlfFont, CString csName, int nHeight, int nWeight)
{
_tcscpy(rlfFont.lfFaceName, (LPCTSTR) csName);
rlfFont.lfWeight = nWeight;
rlfFont.lfHeight = nHeight;
rlfFont.lfWidth = 0;
rlfFont.lfQuality = DEFAULT_QUALITY;
rlfFont.lfPitchAndFamily = DEFAULT_PITCH | FF_SWISS;
rlfFont.lfEscapement = 0;
rlfFont.lfOrientation = 0;
rlfFont.lfWidth = 0;
rlfFont.lfItalic = FALSE;
rlfFont.lfUnderline = FALSE;
rlfFont.lfStrikeOut = FALSE;
rlfFont.lfOutPrecision = OUT_DEFAULT_PRECIS;
rlfFont.lfClipPrecision = CLIP_DEFAULT_PRECIS;
}
// ***************************************************************************
//
// CClassNavCtrl::InitializeTreeForDrawing
//
// Description:
// Create the tree control's image list and set the root node.
//
// Parameters:
// NONE
//
// Returns:
// VOID
//
// Globals accessed:
// NONE
//
// Globals modified:
// NONE
//
// ***************************************************************************
void CClassNavCtrl::InitializeTreeForDrawing()
{
if (!m_bInit)
{
//InitializeState();
m_bInit = TRUE;
HICON hIconObjectClass = theApp.LoadIcon(IDI_ICONOBJECTCLASS);
HICON hIconObjectClassChecked =
theApp.LoadIcon(IDI_ICONOBJECTCLASSCHECKED);
HICON hIconAssocClass =
theApp.LoadIcon(IDI_ICONASSOCCLASS);
HICON hIconAssocClassChecked =
theApp.LoadIcon(IDI_ICONASSOCCLASSCHECKED);
m_pcilImageList = new CImageList();
CSchemaInfo::CreateImageList(m_pcilImageList);
// m_pcilImageList->Create(MAKEINTRESOURCE(IDB_SYMBOLS), 16, 16, RGB(0,0,0));
// m_pcilImageList->Attach(ImageList_LoadBitmap(GetModuleHandle(_T("WBEMUtils.dll")),MAKEINTRESOURCE(IDB_SYMBOLS), 16, 16, RGB(0,128,128)));
#if 0
m_pcilImageList->Create(16, 16, TRUE, 4, 4);
iReturn = m_pcilImageList -> Add(hIconObjectClass); // 0
iReturn = m_pcilImageList -> Add(hIconObjectClassChecked); // 1
iReturn = m_pcilImageList -> Add(hIconAssocClass); // 2
iReturn = m_pcilImageList -> Add(hIconAssocClassChecked); // 3
m_pcilImageList->Add(theApp.LoadIcon(IDI_ICONOBJECTCLASSABSTRACT)); // 4
m_pcilImageList->Add(theApp.LoadIcon(IDI_ICONASSOCCLASSABSTRACT)); // 5
m_pcilImageList->Add(theApp.LoadIcon(IDI_ICONOBJECTCLASSABSTRACT1));// 6
m_pcilImageList->Add(theApp.LoadIcon(IDI_ICONASSOCCLASSABSTRACT1)); // 7
m_pcilImageList->Add(theApp.LoadIcon(IDI_ABOUTDLL1)); // 8
m_pcilImageList->Add(theApp.LoadIcon(IDI_ICONOBJECTCLASS1)); // 9
m_pcilImageList->Add(theApp.LoadIcon(IDI_ICONASSOCCLASS1)); // 10
m_pcilImageList->Add(theApp.LoadIcon(IDI_ICONASSOCCLASS2)); // 11
m_pcilImageList->Add(theApp.LoadIcon(IDI_ICONASSOCCLASS3)); // 12
#endif
// This image list is maintained by the ctreectrl.
CImageList *pcilOld = m_ctcTree.CTreeCtrl::SetImageList(m_pcilImageList,TVSIL_NORMAL);
delete pcilOld;
CBitmap cbmChecks;
cbmChecks.LoadBitmap(IDB_BITMAPCHECKS);
m_pcilStateImageList = new CImageList();
m_pcilStateImageList -> Create (16, 16, TRUE, 3, 0);
m_pcilStateImageList -> Add(&cbmChecks,RGB (255,0,0));
pcilOld = m_ctcTree.CTreeCtrl::SetImageList(m_pcilStateImageList,TVSIL_STATE);
delete pcilOld;
HTREEITEM hRoot;
if (m_htiTreeRoots.GetSize() > 0)
hRoot = reinterpret_cast<HTREEITEM>(m_htiTreeRoots.GetAt(0));
else
hRoot = NULL; // start do something here.
if (hRoot)
{
m_ctcTree.SelectItem(hRoot);
m_ctcTree.SetFocus();
IWbemClassObject *pimcsRoot = reinterpret_cast<IWbemClassObject *>(m_iwcoTreeRoots.GetAt(0));
CString m_csSingleSelection = GetIWbemFullPath(m_pServices, pimcsRoot);
}
m_bDrawAll = TRUE;
InvalidateControl();
}
}
// ***************************************************************************
//
// CClassNavCtrl::DoPropExchange
//
// Description:
// Control property persistence support. Called by the framework when
// loading or storing a control from a persistent storage representation,
// such as a stream or property set.
//
// Parameters:
// CPropExchange* pPX Context of the property exchange, including its
// direction.
//
// Returns:
// void
//
// Globals accessed:
// NONE
//
// Globals modified:
// NONE
//
// ***************************************************************************
void CClassNavCtrl::DoPropExchange(CPropExchange* pPX)
{
ExchangeVersion(pPX, MAKELONG(_wVerMinor, _wVerMajor));
COleControl::DoPropExchange(pPX);
PX_String(pPX, _T("NameSpace"), m_csNameSpace, _T(""));
}
// ***************************************************************************
//
// CClassNavCtrl::OnResetState
//
// Description:
// Reset control to default state to defaults found in DoPropExchange.
//
// Parameters:
// NONE
//
// Returns:
// VOID
//
// Globals accessed:
// NONE
//
// Globals modified:
// NONE
//
// ***************************************************************************
void CClassNavCtrl::OnResetState()
{
COleControl::OnResetState();
}
// ***************************************************************************
//
// CClassNavCtrl::AboutBox
//
// Description:
// Display an "About" box to the user.
//
// Parameters:
// NONE
//
// Returns:
// void
//
// Globals accessed:
// NONE
//
// Globals modified:
// NONE
//
// ***************************************************************************
void CClassNavCtrl::AboutBox()
{
CDialog dlgAbout(IDD_ABOUTBOX_CLASSNAV);
dlgAbout.DoModal();
}
// ***************************************************************************
//
// CClassNavCtrl::OnDrawMetafile
//
// Description:
// Drawing member function for Metafile device.
//
// Parameters:
// CDC *pDC The device context in which the drawing occurs.
// CRect &rcBounds The rectangular area of the control, including the
// border.
//
// Returns:
// void
//
// Globals accessed:
// NONE
//
// Globals modified:
// NONE
//
// ***************************************************************************
void CClassNavCtrl::OnDrawMetafile(CDC* pDC, const CRect& rcBounds)
{
return;
CRect rcOutline(rcBounds);
rcOutline.DeflateRect( 1, 1, 1, 1);
pDC->Rectangle( &rcBounds);
}
// ***************************************************************************
//
// CClassNavCtrl::OnSize
//
// Description:
// Called by the framework after the window is being resized.
//
// Parameters:
// UINT nType Specifies the type of resizing requested.
// int cx Specifies the new width of the client area.
// int cy Specifies the new height of the client area.
//
// Returns:
// void
//
// Globals accessed:
// NONE
//
// Globals modified:
// NONE
//
// ***************************************************************************
void CClassNavCtrl::OnSize(UINT nType, int cx, int cy)
{
if (!GetSafeHwnd())
return;
COleControl::OnSize(nType, cx, cy);
if (!m_bMetricSet) // Create the font used by the control.
CreateControlFont();
SetChildControlGeometry(cx, cy);
if (!m_bChildrenCreated)
{
m_bChildrenCreated = TRUE;
if (m_ctcTree.Create (WS_CHILD | TVS_HASLINES | WS_VISIBLE, m_rTree, this , IDC_TREE ) == -1)
return;
m_ctcTree.UpdateWindow();
m_ctcTree.RedrawWindow();
m_cbBannerWindow.SetParent(this);
if (m_cbBannerWindow.Create(NULL, _T("BannerCWnd"), WS_CHILD | WS_VISIBLE ,m_rBannerRect, this, IDC_TOOLBAR) == -1)
return;
m_pAddDialog = new CAddDialog(this);
m_pRenameDialog = new CRenameClassDIalog(this);
m_pSearchDialog = new CClassSearch(this);
m_ctcTree.CWnd::SetFont ( &m_cfFont , FALSE);
m_cbBannerWindow.CWnd::SetFont ( &m_cfFont , FALSE);
m_pProgressDlg = new CProgressDlg;
}
m_cbBannerWindow.MoveWindow(m_rBannerRect,TRUE);
m_ctcTree.MoveWindow(m_rTree,TRUE);
InvalidateControl();
}
LRESULT CClassNavCtrl::RedrawAll(WPARAM, LPARAM)
{
m_cbBannerWindow.UpdateWindow();
m_ctcTree.UpdateWindow();
m_cbBannerWindow.RedrawWindow();
m_ctcTree.RedrawWindow();
Refresh();
return 0;
}
// ***************************************************************************
//
// CClassNavCtrl::InitializeChildControlSize
//
// Description:
// Initializes the child control (banner and tree control) sizes.
//
// Parameters:
// int cx Width
// int cy Height
//
// Returns:
// void
//
// Globals accessed:
// NONE
//
// Globals modified:
// NONE
//
// ***************************************************************************
void CClassNavCtrl::InitializeChildControlSize(int cx, int cy)
{
SetChildControlGeometry(cx, cy);
m_cbBannerWindow.MoveWindow(m_rBannerRect);
m_ctcTree.MoveWindow(m_rTree);
}
// ***************************************************************************
//
// CClassNavCtrl::SetChildControlGeometry
//
// Description:
// Set the geometry of the children controls based upon font size for the
// edit and button controls. Remainder goes to the tree control.
//
// Parameters:
// int cx Width
// int cy Height
//
// Returns:
// void
//
// Globals accessed:
// NONE
//
// Globals modified:
// NONE
//
// ***************************************************************************
void CClassNavCtrl::SetChildControlGeometry(int cx, int cy)
{
int nBannerHeight = (m_tmFont.tmHeight) + 20;
m_rBannerRect = CRect( 0,
0,
cx,
nBannerHeight);
m_rTreeRect = CRect ( nSideMargin,
nBannerHeight + m_nOffset,
cx - (nSideMargin + 1) ,
cy - nTopMargin);
m_rTree = CRect( nSideMargin + 1,
nBannerHeight + m_nOffset + 1,
cx - (nSideMargin + 2),
cy - (nTopMargin + 1));
}
void CClassNavCtrl::PopulateTree(HTREEITEM hRoot, CString szRoot, CSchemaInfo &schema, BOOL bSelf /*= FALSE*/)
{
CSchemaInfo::CClassInfo &infoRoot = schema[szRoot];
HTREEITEM hSelf = NULL;
if(bSelf)
{
if(infoRoot.m_szClass.GetLength())
{
hSelf = m_ctcTree.AddTreeObject2(hRoot, infoRoot);
hRoot = hSelf;
}
else
{
CString sz = _T("Unable to find class ") + szRoot;
m_ctcTree.InsertItem(sz, 0, 0, hRoot);
}
}
for(int i=0;i<infoRoot.m_rgszSubs.GetSize();i++)
{
CSchemaInfo::CClassInfo &info = schema[infoRoot.m_rgszSubs[i]];
if(!info.m_szClass.GetLength())
{
ASSERT(FALSE);
continue;
}
HTREEITEM hChild = m_ctcTree.AddTreeObject2(hRoot, info);
if(NULL == hRoot && hChild)
{
m_htiTreeRoots.Add(reinterpret_cast<void *>(hChild));
m_iwcoTreeRoots.Add(info.m_pObject);
}
BOOL bChildren = info.m_rgszSubs.GetSize()>0;
if(bChildren && hChild)
PopulateTree(hChild, infoRoot.m_rgszSubs[i], schema);
}
}
// ***************************************************************************
//
// CClassNavCtrl::InitializeState
//
// Description:
// If we are in AmbientUserMode initialize the state of the control.
//
// Parameters:
// NONE
//
// Returns:
// void
//
// Globals accessed:
// NONE
//
// Globals modified:
// NONE
//
// ***************************************************************************
void CClassNavCtrl::InitializeState()
{
PostMessage(INITIALIZE_NAMESPACE,0,0);
}
#if 0
// Routine for enumerating all tree items
void ForEach(CTreeCtrl &tree, HTREEITEM hItem, CSchemaInfo &schema)
{
if(TVI_ROOT != hItem)
{
...FOR EACH...
}
HTREEITEM hChild = tree.GetChildItem(hItem);
while(hChild)
{
ForEach(tree, hChild, schema);
hChild = tree.GetNextSiblingItem(hChild);
}
}
#endif
void CClassNavCtrl::PopulateTree()
{
DWORD dw1 = GetTickCount();
int i;
CPtrArray cpaDeepEnum;
// Do deep enum here.
GetClasses(m_pServices, NULL, cpaDeepEnum, FALSE); //m_iwcoTreeRoots);
if(m_bCancel)
{
m_bCancel = FALSE;
ReleaseObjects(&cpaDeepEnum);
return;
}
m_ctcTree.m_schema.Init(cpaDeepEnum);
m_ctcTree.SetRedraw(FALSE);
PopulateTree(NULL, "", m_ctcTree.m_schema);
// Sort by Associations first
HTREEITEM hFirst = m_ctcTree.GetChildItem(NULL);
i=0;
while(hFirst)
{
int nImage, nSelectedImage;
m_ctcTree.GetItemImage(hFirst, nImage, nSelectedImage);
CString szCount;
szCount.Format(_T("%05i"), i);
if(SCHEMA_CLASS == nImage || SCHEMA_CLASS_ABSTRACT1 == nImage || SCHEMA_CLASS_ABSTRACT2 == nImage)
m_ctcTree.SetItemText(hFirst, " " + szCount + m_ctcTree.GetItemText(hFirst));
else
m_ctcTree.SetItemText(hFirst, "zzz" + szCount + m_ctcTree.GetItemText(hFirst));
hFirst = m_ctcTree.GetNextSiblingItem(hFirst);
i++;
}
m_ctcTree.SortChildren(NULL);
hFirst = m_ctcTree.GetChildItem(NULL);
while(hFirst)
{
// int nImage, nSelectedImage;
// m_ctcTree.GetItemImage(hFirst, nImage, nSelectedImage);
// if(0 == nImage || 4 == nImage || 6 == nImage)
{
CString sz = m_ctcTree.GetItemText(hFirst);
m_ctcTree.SetItemText(hFirst, sz.Right(sz.GetLength()-8));
}
hFirst = m_ctcTree.GetNextSiblingItem(hFirst);
}
m_ctcTree.SetRedraw(TRUE);
}
LRESULT CClassNavCtrl::InitializeState(WPARAM, LPARAM)
{
if (AmbientUserMode( ))
{
if (m_bOpeningNamespace == TRUE)
{
return 0;
}
m_bOpeningNamespace = TRUE;
CWaitCursor cwcWait;
int nRoots = (int) m_htiTreeRoots.GetSize( );
int i;
HTREEITEM hItem;
for (i = 0; i < nRoots; i++)
{
hItem =
reinterpret_cast<HTREEITEM>(m_htiTreeRoots.GetAt(i));
if (hItem)
{
m_ctcTree.ReleaseClassObjects(hItem);
}
}
m_htiTreeRoots.RemoveAll();
m_iwcoTreeRoots.RemoveAll();
m_ctcTree.SetRedraw(FALSE);
m_ctcTree.DeleteAllItems();
m_ctcTree.SetRedraw(TRUE);
m_pServices = NULL;
m_bUserCancel = FALSE;
m_pServices = InitServices(&m_csNameSpace);
// bug#39985
if(m_bUserCancel && !m_hWnd)
return 0;
m_bOpeningNamespace = FALSE;
if (m_bUserCancel)
{
InvalidateControl();
m_ctcTree.Invalidate();
m_ctcTree.RedrawWindow(NULL,NULL,RDW_INVALIDATE | RDW_INTERNALPAINT);
CString csText = m_cbBannerWindow.m_pnseNameSpace->GetNamespaceText();
if (!csText.IsEmpty())
{
m_cbBannerWindow.m_pnseNameSpace->ClearNamespaceText((LPCTSTR) csText);
m_cbBannerWindow.UpdateWindow();
m_cbBannerWindow.RedrawWindow();
}
return 0;
}
if (!m_pServices)
{
CString csUserMsg;
if (m_sc == 0x8001010e)
{
csUserMsg =
_T("You cannot open another Developer Studio window. Please close this web page.");
//ErrorMsg
// (&csUserMsg, S_OK, NULL, TRUE, &csUserMsg, __FILE__, __LINE__ - 10);
CString csTitle = _T("WBEM Developer Studio");
MessageBox(csUserMsg,csTitle);
m_ctcTree.Invalidate();
InvalidateControl();
return 0;
}
else
{
if (!m_csNameSpace.IsEmpty())
{
csUserMsg =
_T("Cannot open namespace ");
csUserMsg += m_csNameSpace;
ErrorMsg
(&csUserMsg, m_sc, NULL, TRUE, &csUserMsg, __FILE__, __LINE__ - 10);
}
m_ctcTree.Invalidate();
InvalidateControl();
return 0;
}
}
m_cbBannerWindow.OpenNamespace(&m_csNameSpace,TRUE);
if (!m_bOpenedInitialNamespace)
{
if (m_bReadySignal && AmbientUserMode( ))
{
FireNotifyOpenNameSpace(m_csNameSpace);
}
m_bOpenedInitialNamespace = TRUE;
}
if (!m_pProgressDlg->GetSafeHwnd())
{
m_bCancel = FALSE;
CString csMessage;
csMessage = _T("Retrieving classes:");
SetProgressDlgLabel(csMessage);
csMessage = _T("Root classes");
//csMessage = _T("Retrieving " ) + *pcsParent + _T(" subclasses. You may cancel the operation.");
SetProgressDlgMessage(csMessage);
CreateProgressDlgWindow();
}
PopulateTree();
if (m_bCancel)
{
CString csText = m_cbBannerWindow.m_pnseNameSpace->GetNamespaceText();
if (!csText.IsEmpty())
{
m_cbBannerWindow.m_pnseNameSpace->ClearNamespaceText((LPCTSTR) csText);
m_cbBannerWindow.UpdateWindow();
m_cbBannerWindow.RedrawWindow();
}
int nRoots = (int) m_htiTreeRoots.GetSize( );
int i;
HTREEITEM hItem;
for (i = 0; i < nRoots; i++)
{
hItem =
reinterpret_cast<HTREEITEM>(m_htiTreeRoots.GetAt(i));
if (hItem)
{
m_ctcTree.ReleaseClassObjects(hItem);
}
}
m_htiTreeRoots.RemoveAll();
m_iwcoTreeRoots.RemoveAll();
m_cbBannerWindow.m_cctbToolBar.GetToolBarCtrl().EnableButton(ID_BUTTONCLASSSEARCH,FALSE);
m_cbBannerWindow.m_cctbToolBar.GetToolBarCtrl().EnableButton(ID_BUTTONADD,FALSE);
m_cbBannerWindow.m_cctbToolBar.GetToolBarCtrl().EnableButton(ID_BUTTONDELETE,FALSE);
m_ctcTree.SetRedraw(FALSE);
m_ctcTree.DeleteAllItems();
m_ctcTree.SetRedraw(TRUE);
m_bCancel = FALSE;
if (m_bReadySignal)
{
CString csEmpty = _T("");
COleVariant covEmpty(csEmpty);
FireEditExistingClass(covEmpty);
#ifdef _DEBUG
afxDump <<"CBanner::InitializeState: m_pParent -> FireEditExistingClass(covEmpty); \n";
afxDump << " " << csEmpty << "\n";
#endif
}
}
DestroyProgressDlgWindow();
SetModifiedFlag();
InvalidateControl();
PostMessage(SETFOCUSTREE,0,0);
}
return 0;
}
LRESULT CClassNavCtrl::FireOpenNamespace(WPARAM, LPARAM)
{
if (!m_bOpenedInitialNamespace && m_bReadySignal)
{
FireNotifyOpenNameSpace(m_csNameSpace);
}
return 0;
}
// ***************************************************************************
//
// CClassNavCtrl::GrowTree
//
// Description:
// Add subclass items to a class object to the tree.
//
// Parameters:
// HTREEITEM hParent Parent tree item.
// IWbemClassObject *pParent Parent class object.
//
// Returns:
// VOID
//
// Globals accessed:
// NONE
//
// Globals modified:
// NONE
//
// ***************************************************************************
int CClassNavCtrl::GrowTree(HTREEITEM hParent, IWbemClassObject *pParent)
{
CPtrArray cpaClasses;
CString csClass = _T("__Class");
csClass = ::GetProperty(pParent,&csClass);
if (!m_pProgressDlg->GetSafeHwnd())
{
m_bCancel = FALSE;
CString csMessage;
csMessage = _T("Retrieving classes:");
SetProgressDlgLabel(csMessage);
csMessage = csClass + _T(" subclasses");
SetProgressDlgMessage(csMessage);
CreateProgressDlgWindow();
}
// Do deep enum here
//int nEnumed =
// GetClasses
// (m_pServices, &csClass, cpaClasses, FALSE);
CPtrArray cpaDeepEnum;
// Do deep enum here.
GetClasses(m_pServices, &csClass, cpaDeepEnum, FALSE);
int nClasses = 0;
DestroyProgressDlgWindow();
if (m_bCancel)
{
m_bCancel = FALSE;
PostMessage(SETFOCUSTREE,0,0);
ReleaseObjects(&cpaDeepEnum);
return 0;
}
m_ctcTree.m_schema.Delete(csClass);
IWbemClassObject *pObject = NULL;
BSTR bstrTemp = csClass.AllocSysString();
HRESULT hr = m_pServices->GetObject(bstrTemp,0, NULL,&pObject,NULL);
::SysFreeString(bstrTemp);
if(SUCCEEDED(hr))
m_ctcTree.m_schema.AddClass(pObject);
m_ctcTree.m_schema.Update(cpaDeepEnum);
m_ctcTree.SetRedraw(FALSE);
PopulateTree(hParent, csClass, m_ctcTree.m_schema);
m_ctcTree.SetRedraw(TRUE);
m_ctcTree.RefreshIcons(hParent);
PostMessage(SETFOCUSTREE,0,0);
return (int)cpaDeepEnum.GetSize(); // NOTE: Win64 - We will NEVER have more that 4 billion items as possible from GetSize
}
// ***************************************************************************
//
// CClassNavCtrl::GetOLEMSObject
//
// Description:
// Get an OLEMS class object.
//
// Parameters:
// CString *pcsClass Class name.
//
// Returns:
// IWbemClassObject * The class object.
//
// Globals accessed:
// NONE
//
// Globals modified:
// NONE
//
// ***************************************************************************
IWbemClassObject *CClassNavCtrl::GetOLEMSObject (CString *pcsClass)
{
IWbemClassObject *pClass = NULL;
BSTR bstrTemp = pcsClass -> AllocSysString();
SCODE sc =
GetServices() -> GetObject
(bstrTemp,0,NULL,&pClass,NULL);
::SysFreeString(bstrTemp);
return pClass;
}
// ***************************************************************************
//
// CClassNavCtrl::OnCreate
//
// Description:
// Called by the framework after the window is being created but before
// the window is shown.
//
// Parameters:
// LPCREATESTRUCT lpCreateStruct Pointer to the structure which contains
// default parameters.
//
// Returns:
// BOOL 0 if continue; -1 if the window should be destroyed.
//
// Globals accessed:
// NONE
//
// Globals modified:
// NONE
//
// ***************************************************************************
int CClassNavCtrl::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
lpCreateStruct->style |= WS_CLIPCHILDREN;
if (COleControl::OnCreate(lpCreateStruct) == -1)
return -1;
m_ctcTree.InitTreeState(this);
return 0;
}
// ***************************************************************************
//
// CClassNavCtrl::DestroyWindow
//
// Description:
// Destroy objects that cannot be destroyed in the class destructor.
//
// Parameters:
// NONE
//
// Returns:
// BOOL Nonzero if the window is destroyed; otherwise 0.
//
// Globals accessed:
// NONE
//
// Globals modified:
// NONE
//
// ***************************************************************************
BOOL CClassNavCtrl::DestroyWindow()
{
m_ctcTree.SetImageList(NULL, TVSIL_NORMAL);
m_ctcTree.SetImageList(NULL, TVSIL_STATE);
delete m_pcilImageList;
delete m_pcilStateImageList;
delete m_pAddDialog;
delete m_pRenameDialog;
delete m_pSearchDialog;
m_pcilImageList = NULL;
m_pcilStateImageList = NULL;
m_pAddDialog = NULL;
m_pRenameDialog = NULL;
m_pSearchDialog = NULL;
return COleControl::DestroyWindow();
}
// ***************************************************************************
//
// CClassNavCtrl::GetExtendedSelection
//
// Description:
// Automation method to allow other programs to retireve the extended
// selection. Selection via a check in check box.
//
// Parameters:
// NONE
//
// Returns:
// VARIANT A safearray of type VT_ARRAY | VT_BSTR.
//
// Globals accessed:
// NONE
//
// Globals modified:
// NONE
//
// ***************************************************************************
VARIANT CClassNavCtrl::GetExtendedSelection()
{
SAFEARRAY *psa;
if (m_bSelectAllMode)
{
psa = GetExtendedSelectionSelectAllMode();
}
else
{
psa = m_ctcTree.GetExtendedSelection ();
}
VARIANT vaResult;
VariantInit(&vaResult);
vaResult.vt = VT_ARRAY | VT_BSTR;
vaResult.parray = psa;
return vaResult;
}
// ***************************************************************************
//
// CClassNavCtrl::GetExtendedSelectionSelectAllMode
//
// Description:
// Get the extended selection if we are in select all mode.
//
// Parameters:
// NONE
//
// Returns:
// VARIANT A safearray of bstr's.
//
// Globals accessed:
// NONE
//
// Globals modified:
// NONE
//
// ***************************************************************************
SAFEARRAY *CClassNavCtrl::GetExtendedSelectionSelectAllMode()
{
SAFEARRAY *psaNotSelected = m_ctcTree.GetExtendedSelection (1);
long uBound;
SafeArrayGetUBound(psaNotSelected, 1, &uBound);
int i;
long ix;
BSTR bstrClassName;
CString csTmp;
CStringArray csaNotSelected;
// First name is the namespace.
for(i = 1; i <= uBound; ++i)
{
ix = i;
HRESULT hresult =
SafeArrayGetElement
(psaNotSelected, &ix, &bstrClassName);
if (hresult == S_OK)
{
csTmp = bstrClassName;
csaNotSelected.Add(csTmp);
SysFreeString(bstrClassName);
}
}
SafeArrayDestroy(psaNotSelected);
psaNotSelected = NULL;
int nNotSelected = (int) csaNotSelected.GetSize();
CStringArray *pcsaClassNames =
GetAllClassPaths(GetServices(), m_csNameSpace);
int nAllClasses = (int) pcsaClassNames->GetSize();
int nExtendedSelection = ((int) pcsaClassNames->GetSize()) - nNotSelected + 1;
SAFEARRAY *psaSelections;
MakeSafeArray (&psaSelections, VT_BSTR, nExtendedSelection);
int iSelected = 0;
PutStringInSafeArray (psaSelections, &m_csNameSpace , iSelected++);
for (i = 0; i < nAllClasses; i++)
{
CString csClass = pcsaClassNames->GetAt(i);
if (nNotSelected > 0)
{
BOOL bNotSelected = FALSE;
for (int n = 0; n < nNotSelected; n++)
{
csTmp = csaNotSelected.GetAt(n);
if (csClass.CompareNoCase(csTmp) == 0)
{
bNotSelected = TRUE;
break;
}
}
if (bNotSelected == FALSE)
{
PutStringInSafeArray (psaSelections, &csClass , iSelected++);
}
}
else
{
PutStringInSafeArray (psaSelections, &csClass , iSelected++);
}
}
delete pcsaClassNames;
return psaSelections;
}
// ***************************************************************************
//
// CClassNavCtrl::GetSingleSelection
//
// Description:
// Automation method to allow other programs to retireve currently
// selected tree item. Selection via tree item selection.
//
// Parameters:
// NONE
//
// Returns:
// BSTR Class path.
//
// Globals accessed:
// NONE
//
// Globals modified:
// NONE
//
// ***************************************************************************
BSTR CClassNavCtrl::GetSingleSelection()
{
return m_ctcTree.GetSelectionPath().AllocSysString();
}
// ***************************************************************************
//
// CClassNavCtrl::IsTreeItemARoot
//
// Description:
// Predicate to tell if a tree item handle is a root.
//
// Parameters:
// HTREEITEM hItem Item to test
//
// Returns:
// BOOL TRUE if a root; FALSE is not a root.
//
// Globals accessed:
// NONE
//
// Globals modified:
// NONE
//
// ***************************************************************************
BOOL CClassNavCtrl::IsTreeItemARoot(HTREEITEM hItem)
{
int nRoots = (int) m_htiTreeRoots.GetSize( );
HTREEITEM hRoot;
for (int i = 0; i < nRoots; i++)
{
hRoot =
reinterpret_cast<HTREEITEM>(m_htiTreeRoots.GetAt(i));
if (hItem == hRoot)
{
return TRUE;
}
}
return FALSE;
}
// ***************************************************************************
//
// CClassNavCtrl::RemoveObjectFromClassRoots
//
// Description:
// Delete a class root object.
//
// Parameters:
// IWbemClassObject *pClassObject Object to remove.
//
// Returns:
// VOID
//
// Globals accessed:
// NONE
//
// Globals modified:
// NONE
//
// ***************************************************************************
void CClassNavCtrl::RemoveObjectFromClassRoots
(IWbemClassObject *pClassObject)
{
int nRoots = (int) m_iwcoTreeRoots.GetSize( );
if (nRoots == 0)
{
return;
}
IWbemClassObject * pRoot;
for (int i = 0; i < nRoots; i++)
{
pRoot =
reinterpret_cast<IWbemClassObject *>(m_iwcoTreeRoots.GetAt(i));
if (pClassObject == pRoot)
{
m_iwcoTreeRoots.RemoveAt( i );
break;
}
}
}
// ***************************************************************************
//
// CClassNavCtrl::FindObjectinClassRoots
//
// Description:
// Searches for a class, by name, in the tree roots.
//
// Parameters:
// CString *pcsClassObject Class name.
//
// Returns:
// HTREEITEM Tree item if found; NULL otherwise.
//
// Globals accessed:
// NONE
//
// Globals modified:
// NONE
//
// ***************************************************************************
HTREEITEM CClassNavCtrl::FindObjectinClassRoots(CString *pcsClassObject)
{
IWbemClassObject *pClassObject = NULL;
BSTR bstrTemp = pcsClassObject->AllocSysString();
SCODE sc = m_pServices->GetObject
(bstrTemp,0,NULL,&pClassObject,NULL);
::SysFreeString(bstrTemp);
if (sc != S_OK)
{
return NULL;
}
int nRoots = (int) m_htiTreeRoots.GetSize( );
if (nRoots == 0)
{
pClassObject->Release();
return NULL;
}
IWbemClassObject * pRoot;
for (int i = 0; i < nRoots; i++)
{
pRoot =
reinterpret_cast<IWbemClassObject *>
(m_ctcTree.GetItemData
(reinterpret_cast<HTREEITEM>(m_htiTreeRoots.GetAt(i))));
if (ClassIdentity(pClassObject,pRoot))
{
pClassObject->Release();
return reinterpret_cast<HTREEITEM>(m_htiTreeRoots.GetAt(i));
}
}
pClassObject->Release();
return NULL;
}
// ***************************************************************************
//
// CClassNavCtrl::RemoveItemFromTreeItemRoots
//
// Description:
// Delete a tree item from roots.
//
// Parameters:
// HTREEITEM hItem Item to remove.
//
// Returns:
// VOID
//
// Globals accessed:
// NONE
//
// Globals modified:
// NONE
//
// ***************************************************************************
void CClassNavCtrl::RemoveItemFromTreeItemRoots(HTREEITEM hItem)
{
int nRoots = (int) m_htiTreeRoots.GetSize( );
if (nRoots == 0)
{
return;
}
HTREEITEM hRoot;
for (int i = 0; i < nRoots; i++)
{
hRoot =
reinterpret_cast<HTREEITEM>(m_htiTreeRoots.GetAt(i));
if (hItem == hRoot)
{
m_htiTreeRoots.RemoveAt( i );
break;
}
}
}
// ***************************************************************************
//
// CClassNavCtrl::GetSelectionClassName
//
// Description:
// Get class name of single selection.
//
// Parameters:
// NONE
//
// Returns:
// CString Class name.
//
// Globals accessed:
// NONE
//
// Globals modified:
// NONE
//
// ***************************************************************************
CString CClassNavCtrl::GetSelectionClassName()
{
HTREEITEM hItem = GetSelection();
if (hItem)
{
IWbemClassObject *pItem = (IWbemClassObject*)
m_ctcTree.GetItemData(hItem);
if (pItem)
{
CString csClass = _T("__Class");
return ::GetProperty(pItem, &csClass);
}
}
return _T("");
}
// ***************************************************************************
//
// CClassNavCtrl::OnClearextendedselection
//
// Description:
// Clear extended tree item selection and selection mode.
//
// Parameters:
// NONE
//
// Returns:
// VOID
//
// Globals accessed:
// NONE
//
// Globals modified:
// NONE
//
// ***************************************************************************
void CClassNavCtrl::OnClearextendedselection()
{
m_ctcTree.ClearExtendedSelection();
m_bSelectAllMode = FALSE;
}
// ***************************************************************************
//
// CClassNavCtrl::OnUpdateClearextendedselection
//
// Description:
// Enable or disable context menu item.
//
// Parameters:
// CCmdUI* pCmdUI Represents the menu item.
//
// Returns:
// VOID
//
// Globals accessed:
// NONE
//
// Globals modified:
// NONE
//
// ***************************************************************************
void CClassNavCtrl::OnUpdateClearextendedselection(CCmdUI* pCmdUI)
{
if (m_ctcTree.NumExtendedSelection() > 0)
pCmdUI -> Enable(TRUE);
else
pCmdUI -> Enable(FALSE);
}
// ***************************************************************************
//
// CClassNavCtrl::GetNameSpace
//
// Description:
// Get automation property.
//
// Parameters:
// NONE
//
// Returns:
// BSTR Currently opened namespace.
//
// Globals accessed:
// NONE
//
// Globals modified:
// NONE
//
// ***************************************************************************
BSTR CClassNavCtrl::GetNameSpace()
{
return m_csNameSpace.AllocSysString();
}
// ***************************************************************************
//
// CClassNavCtrl::SetNameSpace
//
// Description:
// Set automation property.
//
// Parameters:
// LPCTSTR lpszNewValue Namespace to open.
//
// Returns:
// VOID
//
// Globals accessed:
// NONE
//
// Globals modified:
// NONE
//
// ***************************************************************************
void CClassNavCtrl::SetNameSpace(LPCTSTR lpszNewValue)
{
m_bOpeningNamespace = TRUE;
CString csNameSpace = lpszNewValue;
if (GetSafeHwnd() && AmbientUserMode())
{
IWbemServices *pServices = GetIWbemServices(csNameSpace);
if (pServices)
{
SCODE sc = m_cbBannerWindow.OpenNamespace(&csNameSpace,TRUE);
m_pServices = pServices;
OpenNameSpace(&csNameSpace);
}
else if (m_sc == S_OK)
{
CString csUserMsg =
_T("Cannot open namespace \"");
csUserMsg += m_csNameSpace;
csUserMsg += _T("\".");
ErrorMsg
(&csUserMsg, m_sc, NULL, TRUE, &csUserMsg, __FILE__, __LINE__ - 10);
m_bOpeningNamespace = FALSE;
return;
}
SetModifiedFlag();
}
else if (GetSafeHwnd() && !AmbientUserMode())
{
m_csNameSpace = lpszNewValue;
SetModifiedFlag();
}
m_bOpeningNamespace = FALSE;
}
// ***************************************************************************
//
// CClassNavCtrl::OpenNameSpace
//
// Description:
// Connect to namespace server, fire an event, and reset the tree state.
//
// Parameters:
// CString *pcsNameSpace Namespace to connect to.
//
// Returns:
// BOOL TRUE if successful; FALSE otherwise.
//
// Globals accessed:
// NONE
//
// Globals modified:
// NONE
//
// ***************************************************************************
BOOL CClassNavCtrl::OpenNameSpace(CString *pcsNameSpace)
{
//bug#56727
CString csSelection = m_ctcTree.GetSelectionPath();
if (!QueryCanChangeSelection(csSelection))
{
SetFocus();
return FALSE;
}
m_bOpeningNamespace = TRUE;
CWaitCursor cwcWait;
IWbemServices *pServices = InitServices(pcsNameSpace);
if (pServices)
{
if (m_pServices)
{
m_pServices -> Release();
}
m_pServices = pServices;
m_csNameSpace = *pcsNameSpace;
if (m_bReadySignal)
{
FireNotifyOpenNameSpace(*pcsNameSpace);
}
int nRoots = (int) m_htiTreeRoots.GetSize( );
int i;
HTREEITEM hItem;
for (i = 0; i < nRoots; i++)
{
hItem =
reinterpret_cast<HTREEITEM>(m_htiTreeRoots.GetAt(i));
if (hItem)
{
m_ctcTree.ReleaseClassObjects(hItem);
}
}
m_htiTreeRoots.RemoveAll();
m_iwcoTreeRoots.RemoveAll();
m_ctcTree.SetRedraw(FALSE);
m_ctcTree.DeleteAllItems();
m_ctcTree.SetRedraw(TRUE);
if (!m_pProgressDlg->GetSafeHwnd())
{
m_bCancel = FALSE;
CString csMessage;
csMessage = _T("Retrieving classes:");
SetProgressDlgLabel(csMessage);
csMessage = _T("Root classes");
//csMessage = _T("Retrieving " ) + *pcsParent + _T(" subclasses. You may cancel the operation.");
SetProgressDlgMessage(csMessage);
CreateProgressDlgWindow();
}
PopulateTree();
#if 0
CPtrArray cpaDeepEnum;
// Do deep enum here.
GetClasses
(m_pServices, NULL, cpaDeepEnum, FALSE); //m_iwcoTreeRoots);
CSchemaInfo schema;
ASSERT(FALSE);
m_ctcTree.SetRedraw(FALSE);
PopulateTree(NULL, "", schema);
m_ctcTree.SetRedraw(TRUE);
#endif
if (m_bCancel)
{
#if 0
int nRootsd = (int) m_htiTreeRoots.GetSize( );
int i;
HTREEITEM hItem;
for (i = 0; i < nRoots; i++)
{
hItem =
reinterpret_cast<HTREEITEM>(m_htiTreeRoots.GetAt(i));
if (hItem)
{
m_ctcTree.ReleaseClassObjects(hItem);
m_ctcTree.UnCacheTools(hItem);
}
}
#endif
m_cbBannerWindow.m_cctbToolBar.GetToolBarCtrl().EnableButton(ID_BUTTONCLASSSEARCH,FALSE);
m_cbBannerWindow.m_cctbToolBar.GetToolBarCtrl().EnableButton(ID_BUTTONADD,FALSE);
m_cbBannerWindow.m_cctbToolBar.GetToolBarCtrl().EnableButton(ID_BUTTONDELETE,FALSE);
m_htiTreeRoots.RemoveAll();
m_iwcoTreeRoots.RemoveAll();
m_ctcTree.SetRedraw(FALSE);
m_ctcTree.DeleteAllItems();
m_ctcTree.SetRedraw(TRUE);
m_bCancel = FALSE;
PostMessage(CLEARNAMESPACE,0,0);
}
DestroyProgressDlgWindow();
hItem = 0;
hItem = m_ctcTree.GetRootItem();
if (hItem)
{
m_ctcTree.SelectItem(hItem);
m_ctcTree.SetFocus();
}
InvalidateControl();
SetModifiedFlag();
PostMessage(SETFOCUSTREE,0,0);
m_bOpeningNamespace = FALSE;
return TRUE;
}
else
{
CString csPrompt = _T("Cannot open ") + *pcsNameSpace +
_T(". ");
int nReturn =
MessageBox
(
csPrompt,
_T("Namespace Open Error"),
MB_OK | MB_ICONEXCLAMATION | MB_DEFBUTTON1 |
MB_APPLMODAL);
PostMessage(SETFOCUSTREE,0,0);
m_bOpeningNamespace = FALSE;
return FALSE;
}
}
// ***************************************************************************
//
// CClassNavCtrl::PreTranslateMessage
//
// Description:
// Used by class CWinApp to translate window messages before they are
// dispatched to the TranslateMessage and DispatchMessage Windows functions.
//
// Parameters:
// LPMSG lpMsg The window message.
//
// Returns:
// BOOL Nonzero if the message was translated and
// should not be dispatched; 0 if the message
// was not translated and should be dispatched.
//
// Globals accessed:
// NONE
//
// Globals modified:
// NONE
//
// ***************************************************************************
BOOL CClassNavCtrl::PreTranslateMessage(LPMSG lpMsg)
{
BOOL bDidTranslate;
bDidTranslate = COleControl::PreTranslateMessage(lpMsg);
if (bDidTranslate)
{
return bDidTranslate;
}
switch (lpMsg->message)
{
case WM_KEYDOWN:
case WM_KEYUP:
if (lpMsg->wParam == VK_TAB)
{
return FALSE;
}
if (lpMsg->wParam == VK_ESCAPE)
{
TCHAR szClass[40];
CWnd* pWndFocus = GetFocus();
if (pWndFocus != NULL &&
IsChild(pWndFocus) &&
GetClassName(pWndFocus->m_hWnd, szClass, 39) &&
((_tcsicmp(szClass, _T("SysTreeView32")) == 0) ||
(_tcsicmp(szClass, _T("edit")) == 0)))
{
pWndFocus->SendMessage(lpMsg->message, lpMsg->wParam, lpMsg->lParam);
return TRUE;
}
}
if (lpMsg->wParam == VK_RETURN)
{
TCHAR szClass[40];
CWnd* pWndFocus = GetFocus();
if (!pWndFocus)
{
break;
}
CRect crEdit;
CRect crTree;
CRect crIntersect;
pWndFocus->GetWindowRect(&crEdit);
m_ctcTree.GetWindowRect(&crTree);
crEdit.NormalizeRect();
crTree.NormalizeRect();
BOOL bIntersect = crIntersect.IntersectRect(&crEdit,&crTree);
if (bIntersect &&
IsChild(pWndFocus) &&
GetClassName(pWndFocus->m_hWnd, szClass, 39) &&
((_tcsicmp(szClass, _T("SysTreeView32")) == 0) ||
(_tcsicmp(szClass, _T("edit")) == 0)))
{
pWndFocus->SendMessage(lpMsg->message, lpMsg->wParam, lpMsg->lParam);
return TRUE;
}
}
break;
}
// bug #51022 - Should call PreTranslateMessage, not PreTranslateInput
return COleControl::PreTranslateMessage (lpMsg);
#if 0
CWnd* pWndFocus = NULL;
TCHAR szClass[40];
szClass[0] = '\0';
switch (lpMsg->message)
{
case WM_LBUTTONUP:
pWndFocus = GetFocus();
if (pWndFocus)
{
GetClassName(pWndFocus->m_hWnd, szClass, 39);
}
if ((pWndFocus != NULL) &&
IsChild(pWndFocus) &&
(szClass) &&
(_tcsicmp(szClass, _T("EDIT")) == 0))
{
}
break;
case WM_KEYDOWN:
if (lpMsg->wParam == VK_LEFT ||
lpMsg->wParam == VK_UP ||
lpMsg->wParam == VK_RIGHT ||
lpMsg->wParam == VK_DOWN||
lpMsg->wParam == VK_NEXT ||
lpMsg->wParam == VK_PRIOR ||
lpMsg->wParam == VK_HOME ||
lpMsg->wParam == VK_END
)
{
TCHAR szClass[40];
CWnd* pWndFocus = GetFocus();
if (((pWndFocus = GetFocus()) != NULL) &&
IsChild(pWndFocus) &&
GetClassName(pWndFocus->m_hWnd, szClass, 39) &&
((_tcsicmp(szClass, _T("SysTreeView32")) == 0) ||
(_tcsicmp(szClass, _T("edit")) == 0)))
{
pWndFocus->SendMessage(WM_KEYDOWN, lpMsg->wParam, lpMsg->lParam);
return TRUE;
}
}
break;
case WM_KEYUP:
if (lpMsg->wParam == VK_RETURN)
{
// Allow combo box edit control to process a CR.
pWndFocus = GetFocus();
if (((pWndFocus = GetFocus()) != NULL) &&
IsChild(pWndFocus) &&
(pWndFocus->GetStyle() & ES_WANTRETURN) &&
GetClassName(pWndFocus->m_hWnd, szClass, 39) &&
(_tcsicmp(szClass, _T("EDIT")) == 0))
{
pWndFocus->SendMessage(WM_CHAR, lpMsg->wParam, lpMsg->lParam);
return TRUE;
}
}
else if (lpMsg->wParam == VK_LEFT ||
lpMsg->wParam == VK_UP ||
lpMsg->wParam == VK_RIGHT ||
lpMsg->wParam == VK_DOWN ||
lpMsg->wParam == VK_NEXT ||
lpMsg->wParam == VK_PRIOR ||
lpMsg->wParam == VK_HOME ||
lpMsg->wParam == VK_END
)
{
TCHAR szClass[40];
CWnd* pWndFocus = GetFocus();
if (((pWndFocus = GetFocus()) != NULL) &&
IsChild(pWndFocus) &&
GetClassName(pWndFocus->m_hWnd, szClass, 39) &&
((_tcsicmp(szClass, _T("SysTreeView32")) == 0) ||
(_tcsicmp(szClass, _T("edit")) == 0)))
{
pWndFocus->SendMessage(WM_KEYUP, lpMsg->wParam, lpMsg->lParam);
return TRUE;
}
}
break;
}
BOOL b = COleControl::PreTranslateMessage(lpMsg);
return b;
#endif
}
// ***************************************************************************
//
// CClassNavCtrl::OnPopupSearchforclass
//
// Description:
// Implements simple class search mechanism. Should be replaced by
// a menu driven search rather than having the user type in the class name.
//
// Parameters:
// NONE
//
// Returns:
// VOID
//
// Globals accessed:
// NONE
//
// Globals modified:
// NONE
//
// ***************************************************************************
void CClassNavCtrl::OnPopupSearchforclass()
{
CString csSelection = m_ctcTree.GetSelectionPath();
BOOL bCanChangeSelection = QueryCanChangeSelection(csSelection);
if (!bCanChangeSelection)
{
SetFocus();
return;
}
CString csSave = "";
BOOL bDone = FALSE;
while(!bDone)
{
GetSearchDialog()->m_csSearchClass=csSave;
PreModalDialog();
int nReturn = (int) GetSearchDialog()->DoModal( );
PostModalDialog();
if (nReturn == IDCANCEL)
return;
HTREEITEM hItem;
IWbemClassObject *pClass = GetSearchDialog()->GetSelectedObject();
if (pClass == NULL) {
return;
}
CWaitCursor cwcWait;
CStringArray *pcsaPath = PathFromRoot (pClass) ;
#ifdef _DEBUG
for (int index = 0; index < pcsaPath->GetSize(); index++)
{
afxDump << pcsaPath->GetAt(index) << "\n";
}
#endif
m_ctcTree.SetRedraw(FALSE);
HTREEITEM hRoot;
if (pcsaPath->GetSize() > 1)
{
HTREEITEM hChild;
hChild = hRoot =
FindObjectinClassRoots
(&pcsaPath->GetAt(0));
for (int i = 1; i < pcsaPath->GetSize(); i++)
{
#ifdef _DEBUG
afxDump << pcsaPath->GetAt(i) << "\n";
#endif
IWbemClassObject *pObject = NULL;
BSTR bstrTemp = pcsaPath->GetAt(i).AllocSysString();
SCODE sc =
m_pServices -> GetObject
(bstrTemp,0,
NULL,&pObject,NULL);
::SysFreeString(bstrTemp);
if (sc == S_OK)
{
hChild =
m_ctcTree.FindObjectinChildren
(hRoot, pObject);
if (hChild)
{
hRoot = hChild;
}
else
{
ASSERT(FALSE);
CString csUserMsg;
csUserMsg.Format(_T("Cannot find class %s in tree"), pcsaPath->GetAt(i));
csUserMsg += m_csNameSpace;
ErrorMsg(&csUserMsg, m_sc, NULL, TRUE, &csUserMsg, __FILE__, __LINE__ - 10);
}
pObject ->Release();
}
}
hItem = hChild;
}
else //the object is one of the root objects
{
hRoot =
FindObjectinClassRoots (&pcsaPath->GetAt(0));
hItem = hRoot;
}
delete pcsaPath;
pClass->Release();
m_ctcTree.SelectSetFirstVisible(hItem);
m_ctcTree.SelectItem(hItem);
m_ctcTree.SetFocus();
bDone = TRUE;
m_ctcTree.SetRedraw(TRUE);
}
m_ctcTree.UpdateWindow();
m_ctcTree.RedrawWindow();
}
// ***************************************************************************
//
// CClassNavCtrl::OnUpdatePopupSearchforclass
//
// Description:
// Enable context menu item.
//
// Parameters:
// CCmdUI* pCmdUI Represents the menu item.
//
// Returns:
// VOID
//
// Globals accessed:
// NONE
//
// Globals modified:
// NONE
//
// ***************************************************************************
void CClassNavCtrl::OnUpdatePopupSearchforclass(CCmdUI* pCmdUI)
{
pCmdUI -> Enable(TRUE);
}
// ***************************************************************************
//
// CClassNavCtrl::OnPopupSelectall
//
// Description:
// Selects all of the tree items in terms of extended selection.
//
// Parameters:
// NONE
//
// Returns:
// VOID
//
// Globals accessed:
// NONE
//
// Globals modified:
// NONE
//
// ***************************************************************************
void CClassNavCtrl::OnPopupSelectall()
{
m_ctcTree.SetExtendedSelection();
m_bSelectAllMode = TRUE;
m_bItemUnselected = FALSE;
}
// ***************************************************************************
//
// CClassNavCtrl::OnUpdatePopupSelectall
//
// Description:
// Enable or disable context menu item.
//
// Parameters:
// CCmdUI* pCmdUI Represents the menu item.
//
// Returns:
// VOID
//
// Globals accessed:
// NONE
//
// Globals modified:
// NONE
//
// ***************************************************************************
void CClassNavCtrl::OnUpdatePopupSelectall(CCmdUI* pCmdUI)
{
if (!m_bSelectAllMode)
{
pCmdUI -> Enable(TRUE);
}
else
{
if (m_bItemUnselected)
{
pCmdUI -> Enable(TRUE);
}
else
{
pCmdUI -> Enable(FALSE);
}
}
}
// ***************************************************************************
//
// CClassNavCtrl::OnReadySignal
//
// Description:
// Automation method that tells the control that it can now fire events.
//
// Parameters:
// NONE
//
// Returns:
// VOID
//
// Globals accessed:
// NONE
//
// Globals modified:
// NONE
//
// ***************************************************************************
void CClassNavCtrl::OnReadySignal()
{
m_bReadySignal = TRUE;
if (m_pServices)
{
return;
}
InitializeState(0,0);
// bug#39985
if(!m_hWnd)
return;
HTREEITEM hItem = m_ctcTree.GetSelectedItem();
if (hItem)
{
IWbemClassObject *pItem = (IWbemClassObject*)
m_ctcTree.GetItemData(hItem);
CString csItem =
GetIWbemFullPath(GetServices(),pItem);
if (m_bReadySignal)
{
COleVariant covClass;
covClass = csItem;
FireEditExistingClass(covClass);
#ifdef _DEBUG
afxDump <<"CBanner::OnReadySignal(): m_pParent -> FireEditExistingClass(covClass); \n";
afxDump << " " << csItem << "\n";
#endif
}
}
else
{
hItem = m_ctcTree.GetRootItem();
if (hItem)
{
m_ctcTree.SelectItem(hItem);
m_ctcTree.SetFocus();
}
}
}
// ***************************************************************************
//
// CClassNavCtrl::OnGetControlInfo
//
// Description:
// Called by the framework when the control<6F>s container has requested
// information about the control. This information consists primarily of
// a description of the control<6F>s mnemonic keys.
//
// Parameters:
// LPCONTROLINFO pControlInfo Control info structure.
//
// Returns:
// VOID
//
// Globals accessed:
// NONE
//
// Globals modified:
// NONE
//
// ***************************************************************************
void CClassNavCtrl::OnGetControlInfo(LPCONTROLINFO pControlInfo)
{
pControlInfo->dwFlags |= CTRLINFO_EATS_RETURN;
COleControl::OnGetControlInfo(pControlInfo);
}
void CClassNavCtrl::PassThroughGetIWbemServices
(LPCTSTR lpctstrNamespace, VARIANT FAR* pvarUpdatePointer, VARIANT FAR* pvarServices, VARIANT FAR* pvarSC, VARIANT FAR* pvarUserCancel)
{
FireGetIWbemServices
(lpctstrNamespace,
pvarUpdatePointer,
pvarServices,
pvarSC,
pvarUserCancel);
}
void CClassNavCtrl::InvalidateServer(LPCTSTR lpctstrServer)
{
// TODO: Add your dispatch handler code here
}
//***************************************************************************
//
// InitServices
//
// Purpose:
//
//***************************************************************************
IWbemServices *CClassNavCtrl::InitServices
(CString *pcsNameSpace)
{
CString csObjectPath;
if (pcsNameSpace == NULL || pcsNameSpace->IsEmpty())
{
PreModalDialog();
CInitNamespaceDialog cindInitNamespace;
cindInitNamespace.m_pParent = this;
m_pDlg = &cindInitNamespace;
int nReturn = (int) cindInitNamespace.DoModal();
m_pDlg = NULL;
PostModalDialog();
if (nReturn == IDOK)
{
csObjectPath = cindInitNamespace.GetNamespace();
*pcsNameSpace = csObjectPath;
}
else
{
m_sc = S_OK;
m_bUserCancel = TRUE;
return NULL;
}
}
else
{
csObjectPath = *pcsNameSpace;
}
IWbemServices *pSession = 0;
IWbemServices *pChild = 0;
CString csUser = _T("");
pSession = GetIWbemServices(csObjectPath);
return pSession;
}
IWbemServices *CClassNavCtrl::GetIWbemServices
(CString &rcsNamespace)
{
IUnknown *pServices = NULL;
BOOL bUpdatePointer= FALSE;
m_sc = S_OK;
m_bUserCancel = FALSE;
VARIANT varUpdatePointer;
VariantInit(&varUpdatePointer);
varUpdatePointer.vt = VT_I4;
if (bUpdatePointer == TRUE)
{
varUpdatePointer.lVal = 1;
}
else
{
varUpdatePointer.lVal = 0;
}
VARIANT varService;
VariantInit(&varService);
VARIANT varSC;
VariantInit(&varSC);
VARIANT varUserCancel;
VariantInit(&varUserCancel);
FireGetIWbemServices
((LPCTSTR)rcsNamespace, &varUpdatePointer, &varService, &varSC,
&varUserCancel);
if (varService.vt == VT_UNKNOWN)
{
pServices = reinterpret_cast<IWbemServices*>(varService.punkVal);
}
varService.punkVal = NULL;
VariantClear(&varService);
if (varSC.vt == VT_I4)
{
m_sc = varSC.lVal;
}
else
{
m_sc = WBEM_E_FAILED;
}
VariantClear(&varSC);
if (varUserCancel.vt == VT_BOOL)
{
m_bUserCancel = varUserCancel.boolVal;
}
VariantClear(&varUserCancel);
VariantClear(&varUpdatePointer);
IWbemServices *pRealServices = NULL;
if (m_sc == S_OK && !m_bUserCancel)
{
pRealServices = reinterpret_cast<IWbemServices *>(pServices);
m_cbBannerWindow.m_cctbToolBar.
GetToolBarCtrl().EnableButton(ID_BUTTONCLASSSEARCH,TRUE);
m_bSelectAllMode = FALSE;
}
return pRealServices;
}
/*
BOOL CClassNavCtrl::OnHelpInfo(HELPINFO* pHelpInfo)
{
// TODO: Add your message handler code here and/or call default
WinHelp(0,HELP_FINDER);
return TRUE;
}
*/
void CClassNavCtrl::OnSetClientSite()
{
COleControl::OnSetClientSite();
}
void CClassNavCtrl::OnDestroy()
{
m_ctcTree.SetImageList(NULL, TVSIL_NORMAL);
m_ctcTree.SetImageList(NULL, TVSIL_STATE);
delete m_pcilImageList;
delete m_pcilStateImageList;
delete m_pAddDialog;
delete m_pRenameDialog;
delete m_pSearchDialog;
m_pcilImageList = NULL;
m_pcilStateImageList = NULL;
m_pAddDialog = NULL;
m_pRenameDialog = NULL;
m_pSearchDialog = NULL;
COleControl::OnDestroy();
// TODO: Add your message handler code here
}
void CClassNavCtrl::OnMenuitemrefresh()
{
//bug#57686
CString csSelection = m_ctcTree.GetSelectionPath();
if (!QueryCanChangeSelection(csSelection))
{
SetFocus();
return;
}
// TODO: Add your command handler code here
if (m_hContextSelection)
{
IWbemClassObject *pClassObject
= reinterpret_cast<IWbemClassObject *>
(m_ctcTree.GetItemData( m_hContextSelection ));
m_ctcTree.SetRedraw(FALSE);
m_ctcTree.Expand(m_hContextSelection,TVE_COLLAPSE);
m_ctcTree.SetRedraw(TRUE);
CString csPath;
if (pClassObject)
{
pClassObject->AddRef();
HTREEITEM hParent = m_ctcTree.GetParentItem(m_hContextSelection);
HTREEITEM hChild = m_ctcTree.GetChildItem(m_hContextSelection);
m_ctcTree.SetRedraw(FALSE);
while (hChild)
{
HTREEITEM hNextChild = m_ctcTree.GetNextSiblingItem(hChild);
m_ctcTree.DeleteBranch(hChild);
hChild = hNextChild;
}
m_ctcTree.SetRedraw(TRUE);
int nSubs = GrowTree(m_hContextSelection, pClassObject);
if (nSubs > 0)
{
TV_INSERTSTRUCT tvstruct;
tvstruct.item.hItem = m_hContextSelection;
tvstruct.item.mask = TVIF_CHILDREN;
tvstruct.item.cChildren = nSubs;
m_ctcTree.SetItem(&tvstruct.item);
m_ctcTree.EnsureVisible (m_hContextSelection);
}
m_ctcTree.Expand(m_hContextSelection,TVE_COLLAPSE);
}
}
else if (m_ctcTree.GetRootItem() == NULL)
{
InitializeState(0,0);
}
}
void CClassNavCtrl::OnUpdateMenuitemrefresh(CCmdUI* pCmdUI)
{
// TODO: Add your command update UI handler code here
if (m_hContextSelection)
{
pCmdUI -> Enable(TRUE);
}
else
{
pCmdUI -> Enable(FALSE);
}
}
void CClassNavCtrl::SetProgressDlgMessage(CString &csMessage)
{
m_pProgressDlg->SetMessage(csMessage);
}
void CClassNavCtrl::SetProgressDlgLabel(CString &csLabel)
{
m_pProgressDlg->SetLabel(csLabel);
}
void CClassNavCtrl::CreateProgressDlgWindow()
{
PreModalDialog();
m_pProgressDlg->Create(this);
}
BOOL CClassNavCtrl::CheckCancelButtonProgressDlgWindow()
{
if (m_pProgressDlg->GetSafeHwnd())
{
return m_pProgressDlg->CheckCancelButton();
}
return FALSE;
}
void CClassNavCtrl::DestroyProgressDlgWindow()
{
if (m_pProgressDlg->GetSafeHwnd())
{
m_pProgressDlg->DestroyWindow();
PostModalDialog();
}
}
void CClassNavCtrl::PumpMessagesProgressDlgWindow()
{
if (m_pProgressDlg->GetSafeHwnd())
{
m_pProgressDlg->PumpMessages();
}
}
int CClassNavCtrl::GetClasses(IWbemServices * pIWbemServices, CString *pcsParent,
CPtrArray &cpaClasses, BOOL bShallow)
{
#ifdef _DEBUG
DWORD d1 = GetTickCount();
#endif
SCODE sc;
IEnumWbemClassObject *pIEnumWbemClassObject = NULL;
IWbemClassObject *pIWbemClassObject = NULL;
IWbemClassObject *pErrorObject = NULL;
long lFlag = bShallow ? WBEM_FLAG_SHALLOW : WBEM_FLAG_DEEP;
if (pcsParent)
{
BSTR bstrTemp = pcsParent->AllocSysString();
sc = pIWbemServices->CreateClassEnum
(bstrTemp,
lFlag | WBEM_RETURN_IMMEDIATELY | WBEM_FLAG_FORWARD_ONLY, NULL, &pIEnumWbemClassObject);
::SysFreeString(bstrTemp);
}
else
{
sc = pIWbemServices->CreateClassEnum
(NULL,
lFlag | WBEM_RETURN_IMMEDIATELY | WBEM_FLAG_FORWARD_ONLY, NULL, &pIEnumWbemClassObject);
}
if (sc != S_OK)
{
CString csUserMsg =
_T("Cannot create a class enumeration ");
ErrorMsg
(&csUserMsg, sc, pErrorObject, TRUE, &csUserMsg, __FILE__, __LINE__ - 8);
ReleaseErrorObject(pErrorObject);
return 0;
}
else
{
ReleaseErrorObject(pErrorObject);
SetEnumInterfaceSecurity(m_csNameSpace,pIEnumWbemClassObject, pIWbemServices);
}
IWbemClassObject *pimcoInstances[N_INSTANCES];
IWbemClassObject **pInstanceArray =
reinterpret_cast<IWbemClassObject **> (&pimcoInstances);
for (int i = 0; i < N_INSTANCES; i++)
{
pimcoInstances[i] = NULL;
}
ULONG uReturned;
HRESULT hResult =
pIEnumWbemClassObject->Next(1000,N_INSTANCES,pInstanceArray, &uReturned);
pIWbemClassObject = NULL;
while(hResult == S_OK || hResult == WBEM_S_TIMEDOUT || uReturned > 0)
{
#pragma warning( disable :4018 )
for (int c = 0; c < uReturned; c++)
#pragma warning( default : 4018 )
{
pIWbemClassObject = pInstanceArray[c];
cpaClasses.Add(reinterpret_cast<void *>(pIWbemClassObject));
pimcoInstances[c] = NULL;
pIWbemClassObject = NULL;
}
m_bCancel = CheckCancelButtonProgressDlgWindow();
if (m_bCancel)
{
for (int i = 0; i < cpaClasses.GetSize(); i++)
{
IWbemClassObject *pObject =
reinterpret_cast<IWbemClassObject *>(cpaClasses.GetAt(i));
pObject->Release();
}
cpaClasses.RemoveAll();
break;
}
uReturned = 0;
hResult = pIEnumWbemClassObject->Next
(1000,N_INSTANCES,pInstanceArray, &uReturned);
}
pIEnumWbemClassObject -> Release();
return (int) cpaClasses.GetSize();
}
void CClassNavCtrl::MofCompiled(LPCTSTR lpctstrNamespace)
{
// TODO: Add your dispatch handler code here
CString csNamespace = lpctstrNamespace;
if (csNamespace.IsEmpty())
{
return;
}
BOOL bReturn;
if (m_csNameSpace.IsEmpty())
{
m_cbBannerWindow.m_pnseNameSpace->SetNamespaceText((LPCTSTR)csNamespace);
m_cbBannerWindow.UpdateWindow();
m_cbBannerWindow.RedrawWindow();
bReturn = OpenNameSpace(&csNamespace);
if (bReturn)
{
m_cbBannerWindow.OpenNamespace(&csNamespace,TRUE);
}
PostMessage(SETFOCUSNSE,0,0);
}
else if (m_csNameSpace.CompareNoCase(csNamespace))
{
m_cbBannerWindow.m_pnseNameSpace->SetNamespaceText((LPCTSTR)csNamespace);
m_cbBannerWindow.UpdateWindow();
m_cbBannerWindow.RedrawWindow();
bReturn = OpenNameSpace(&csNamespace);
if (bReturn)
{
m_cbBannerWindow.OpenNamespace(&csNamespace,TRUE);
}
PostMessage(SETFOCUSNSE,0,0);
}
else
{
bReturn = OpenNameSpace(&m_csNameSpace);
if (bReturn)
{
m_cbBannerWindow.OpenNamespace(&csNamespace,TRUE);
}
PostMessage(SETFOCUSNSE,0,0);
}
}
void CClassNavCtrl::OnLButtonUp(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
COleControl::OnLButtonUp(nFlags, point);
}
void CClassNavCtrl::OnKillFocus(CWnd* pNewWnd)
{
COleControl::OnKillFocus(pNewWnd);
// TODO: Add your message handler code here
Refresh();
}
LRESULT CClassNavCtrl::SetFocusTree(WPARAM, LPARAM)
{
m_ctcTree.SetFocus();
return 0;
}
LRESULT CClassNavCtrl::SetFocusNSE(WPARAM, LPARAM)
{
m_cbBannerWindow.m_pnseNameSpace->SetFocus();
return 0;
}
LRESULT CClassNavCtrl::ClearNamespace(WPARAM, LPARAM)
{
CString csText = m_cbBannerWindow.m_pnseNameSpace->GetNamespaceText();
if (!csText.IsEmpty())
{
m_cbBannerWindow.m_pnseNameSpace->ClearNamespaceText((LPCTSTR) csText);
m_cbBannerWindow.UpdateWindow();
m_cbBannerWindow.RedrawWindow();
}
return 0;
}
int CClassNavCtrl::PartitionClasses(CPtrArray *pcpaDeepEnum, CPtrArray *pcpaShallowEnum, CString csClass)
{
int cEnum = (int) pcpaDeepEnum->GetSize();
CDWordArray cdwaRoots;
int i;
for (i = 0; i < cEnum; i++)
{
IWbemClassObject *pObject =
reinterpret_cast<IWbemClassObject *>(pcpaDeepEnum->GetAt(i));
CString csSuper = GetIWbemSuperClass(pObject);
if (csSuper.CompareNoCase(csClass) == 0)
{
pcpaShallowEnum->Add(pObject);
cdwaRoots.Add(i);
}
}
for (i = ((int) cdwaRoots.GetSize()) - 1; i >= 0; i--)
{
pcpaDeepEnum->RemoveAt(cdwaRoots.GetAt(i));
}
return ((int) pcpaShallowEnum->GetSize());
}
void CClassNavCtrl::ReleaseObjects(CPtrArray *pcpaEnum)
{
int cEnum = (int) pcpaEnum->GetSize();
int i;
for (i = 0; i < cEnum; i++)
{
IWbemClassObject *pObject =
reinterpret_cast<IWbemClassObject *>(pcpaEnum->GetAt(i));
if (pObject)
{
pObject->Release();
}
}
}
void CClassNavCtrl::OnSetFocus(CWnd* pOldWnd)
{
COleControl::OnSetFocus(pOldWnd);
#ifdef _DEBUG
afxDump << _T("Before COleControl::OnActivateInPlace in CClassNavCtrl::OnSetFocus\n");
#endif
// TODO: Add your message handler code here
OnActivateInPlace(TRUE,NULL);
if (m_bRestoreFocusToTree)
{
m_ctcTree.SetFocus();
}
else
{
m_cbBannerWindow.SetFocus();
}
#ifdef _DEBUG
afxDump << _T("After COleControl::OnActivateInPlace in CClassNavCtrl::OnSetFocus\n");
#endif
}
BOOL CClassNavCtrl::QueryCanChangeSelection(CString &rcsSelection)
{
if (rcsSelection.GetLength() == 0)
{
return TRUE;
}
VARIANT varScode;
VariantInit(&varScode);
varScode.vt = VT_I4;
varScode.lVal = S_OK;
if (m_bReadySignal)
{
FireQueryCanChangeSelection ((LPCTSTR) rcsSelection, &varScode);
}
SCODE sc = varScode.lVal;
VariantClear(&varScode);
BOOL bCanChangeSelection = (sc == E_FAIL ? FALSE: TRUE);
return bCanChangeSelection;
}
/* EOF: ClassNavCtl.cpp */
void CClassNavCtrl::OnPopupAddclass()
{
// TODO: Add your command handler code here
IWbemClassObject *pimcoItem =
reinterpret_cast<IWbemClassObject *>(m_ctcTree.GetItemData(m_hContextSelection));
CString csPath = GetIWbemClass(pimcoItem);
m_cbBannerWindow.AddClass(&csPath, m_hContextSelection);
}
void CClassNavCtrl::OnUpdatePopupAddclass(CCmdUI* pCmdUI)
{
// TODO: Add your command update UI handler code here
if (m_hContextSelection)
{
pCmdUI -> Enable(TRUE);
}
else
{
pCmdUI -> Enable(FALSE);
}
}
void CClassNavCtrl::OnPopupDeleteclass()
{
// bug#57685
if(!m_hContextSelection)
return;
// TODO: Add your command handler code here
IWbemClassObject *pimcoItem =
reinterpret_cast<IWbemClassObject *>(m_ctcTree.GetItemData(m_hContextSelection));
CString csPath = GetIWbemClass(pimcoItem);
m_cbBannerWindow.DeleteClass(&csPath, m_hContextSelection);
}
void CClassNavCtrl::OnUpdatePopupDeleteclass(CCmdUI* pCmdUI)
{
// TODO: Add your command update UI handler code here
if (m_hContextSelection)
{
IWbemClassObject *pItem =
reinterpret_cast<IWbemClassObject *>(m_ctcTree.GetItemData(m_hContextSelection));
if (!pItem)
{
pCmdUI -> Enable(FALSE);
return;
}
CString csClass = _T("__Class");
CString m_csSelection = ::GetProperty(pItem, &csClass);
if (m_csSelection[0] == '_' && m_csSelection[1] == '_')
{
pCmdUI -> Enable(FALSE);
return;
}
}
// bug#57685
if(!m_hContextSelection)
{
pCmdUI->Enable(FALSE);
return;
}
pCmdUI -> Enable(TRUE);
}
void CClassNavCtrl::OnPopupRenameclass()
{
// TODO: Add your command handler code here
if (m_hContextSelection)
{
m_ctcTree.EditLabel(m_hContextSelection);
}
}
void CClassNavCtrl::OnUpdatePopupRenameclass(CCmdUI* pCmdUI)
{
// TODO: Add your command update UI handler code here
if (m_hContextSelection)
{
IWbemClassObject *pItem =
reinterpret_cast<IWbemClassObject *>(m_ctcTree.GetItemData(m_hContextSelection));
if (!pItem)
{
pCmdUI -> Enable(FALSE);
return;
}
CString csClass = _T("__Class");
CString m_csSelection = ::GetProperty(pItem, &csClass);
if (m_csSelection[0] == '_' && m_csSelection[1] == '_')
{
pCmdUI -> Enable(FALSE);
return;
}
if (m_ctcTree.ItemHasChildren(m_hContextSelection))
{
pCmdUI -> Enable(FALSE);
return;
}
}
// bug#57685
if(!m_hContextSelection)
{
pCmdUI->Enable(FALSE);
return;
}
pCmdUI -> Enable(TRUE);
}