237 lines
5.4 KiB
C++
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;
|
|
} |