windows-nt/Source/XPSP1/NT/admin/hmonitor/snapin/insertionstringmenu.cpp
2020-09-26 16:20:57 +08:00

237 lines
5.4 KiB
C++

// InsertionStringMenu.cpp: implementation of the CInsertionStringMenu class.
//
//////////////////////////////////////////////////////////////////////
//
// Copyright (c) 2000 Microsoft Corporation
//
// 03-15-00 v-marfin : bug 60935 - Set focus back to edit control
// after inserting a string and set
// cursor in proper location a
//
#include "stdafx.h"
#include "snapin.h"
#include "InsertionStringMenu.h"
#include "WbemClassObject.h"
#include "HMObject.h"
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
BOOL CHiddenWnd::OnCommand(WPARAM wParam, LPARAM lParam)
{
if( ! m_pMenu )
{
return CWnd::OnCommand(wParam,lParam);
}
return m_pMenu->OnCommand(wParam,lParam);
}
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
CInsertionStringMenu::CInsertionStringMenu()
{
m_pEditCtl = NULL;
}
CInsertionStringMenu::~CInsertionStringMenu()
{
}
//////////////////////////////////////////////////////////////////////
// Create
//////////////////////////////////////////////////////////////////////
bool CInsertionStringMenu::Create(CWnd* pEditControl, CHMObject* pObject, bool bRuleMenu /*=true*/)
{
ASSERT(pEditControl);
if( pEditControl == NULL )
{
return false;
}
ASSERT(pEditControl->GetSafeHwnd());
if( pEditControl->GetSafeHwnd() == NULL )
{
return false;
}
ASSERT(pObject);
if( pObject == NULL )
{
return false;
}
m_pEditCtl = pEditControl;
CString sPrefix;
if( ! bRuleMenu )
{
sPrefix = _T("TargetInstance.EmbeddedStatus.");
}
// get the insertion strings
CWbemClassObject ClassObject;
ClassObject.Create(pObject->GetSystemName());
HRESULT hr = ClassObject.GetObject(_T("Microsoft_HMThresholdStatusInstance"));
if( ! CHECKHRESULT(hr) )
{
return false;
}
ClassObject.GetPropertyNames(m_saInsertionStrings);
ClassObject.Destroy();
CWbemClassObject* pParentObject = pObject->GetParentClassObject();
CString sObjectPath;
CString sNamespace;
CStringArray saEmbeddedInstNames;
if( pParentObject )
{
pParentObject->GetProperty(IDS_STRING_MOF_PATH,sObjectPath);
pParentObject->GetProperty(IDS_STRING_MOF_TARGETNAMESPACE,sNamespace);
delete pParentObject;
pParentObject = NULL;
}
if( ! sObjectPath.IsEmpty() )
{
int iIndex = -1;
if( (iIndex = sObjectPath.Find(_T("."))) != -1 )
{
sObjectPath = sObjectPath.Left(iIndex);
}
CWbemClassObject WmiObject;
WmiObject.SetNamespace(_T("\\\\") + pObject->GetSystemName() + _T("\\") + sNamespace);
WmiObject.GetObject(sObjectPath);
WmiObject.GetPropertyNames(saEmbeddedInstNames);
for( int i = 0; i < saEmbeddedInstNames.GetSize(); i++ )
{
saEmbeddedInstNames.SetAt(i,_T("%") + sPrefix + _T("EmbeddedInstance.") + saEmbeddedInstNames[i]+ _T("%"));
}
}
ASSERT(m_saInsertionStrings.GetSize());
if( m_saInsertionStrings.GetSize() == 0 )
{
return false;
}
for( int i = 0; i < m_saInsertionStrings.GetSize(); i++ )
{
m_saInsertionStrings.SetAt(i,_T("%") + sPrefix + m_saInsertionStrings[i] + _T("%"));
}
m_saInsertionStrings.Append(saEmbeddedInstNames);
m_pEditCtl->SetCaretPos(CPoint(0,0));
if( ! m_HiddenWnd.Create(NULL,NULL,WS_CHILD,CRect(0,0,10,10),m_pEditCtl,2411) )
{
m_saInsertionStrings.RemoveAll();
return false;
}
m_HiddenWnd.m_pMenu = this;
m_HiddenWnd.ShowWindow(SW_HIDE);
return true;
}
//////////////////////////////////////////////////////////////////////
// DisplayMenu
//////////////////////////////////////////////////////////////////////
void CInsertionStringMenu::DisplayMenu(CPoint& pt)
{
ASSERT(m_saInsertionStrings.GetSize());
if( m_saInsertionStrings.GetSize() == 0)
{
return;
}
ASSERT(m_pEditCtl);
if( m_pEditCtl == NULL )
{
return;
}
ASSERT(m_pEditCtl->GetSafeHwnd());
if( m_pEditCtl->GetSafeHwnd() == NULL )
{
return;
}
if( ! CreatePopupMenu() )
{
ASSERT(FALSE);
return;
}
// add each insertion string to the menu
for( int i = 0; i < m_saInsertionStrings.GetSize(); i++ )
{
InsertMenu(i,MF_BYPOSITION,i,m_saInsertionStrings[i]);
}
TrackPopupMenu(TPM_LEFTALIGN,pt.x,pt.y,&m_HiddenWnd);
DestroyMenu();
}
BOOL CInsertionStringMenu::OnCommand(WPARAM wParam, LPARAM lParam)
{
ASSERT(m_saInsertionStrings.GetSize());
if( m_saInsertionStrings.GetSize() == 0)
{
return FALSE;
}
ASSERT(m_pEditCtl);
if( m_pEditCtl == NULL )
{
return FALSE;
}
ASSERT(m_pEditCtl->GetSafeHwnd());
if( m_pEditCtl->GetSafeHwnd() == NULL )
{
return FALSE;
}
int id = LOWORD(wParam);
if( id < m_saInsertionStrings.GetSize() && id >= 0 )
{
CPoint point = m_pEditCtl->GetCaretPos();
int iCharIndex = LOWORD(((CEdit*)m_pEditCtl)->CharFromPos(point));
CString sWindowText;
m_pEditCtl->GetWindowText(sWindowText);
sWindowText.Insert(iCharIndex,m_saInsertionStrings[id]);
m_pEditCtl->SetWindowText(sWindowText);
//--------------------------------------------------------
// v-marfin : bug 60935 - Set focus back to edit control
// after inserting a string and set
// cursor in proper location a
m_pEditCtl->SetFocus();
CEdit* pEdit = (CEdit*)m_pEditCtl;
CString sInsertion = m_saInsertionStrings[id];
int nLen = sInsertion.GetLength() + iCharIndex;
pEdit->SetSel(nLen,nLen,TRUE);
//--------------------------------------------------------
return TRUE;
}
return FALSE;
}