1216 lines
26 KiB
C++
1216 lines
26 KiB
C++
// Copyright (c) 1997-2001 Microsoft Corporation, All Rights Reserved
|
|
//***************************************************************************
|
|
//
|
|
// (c) 1996, 1997 by Microsoft Corporation
|
|
//
|
|
// hmmvtab.cpp
|
|
//
|
|
// This file contains the code for the main tab control.
|
|
//
|
|
// a-larryf 17-Sept-96 Created.
|
|
//
|
|
//***************************************************************************
|
|
|
|
|
|
#include "precomp.h"
|
|
|
|
#ifndef _wbemidl_h
|
|
#define _wbemidl_h
|
|
#include <wbemidl.h>
|
|
#endif //_wbemidl_h
|
|
|
|
#include <afxcmn.h>
|
|
#include "icon.h"
|
|
#include "hmomutil.h"
|
|
#include "SingleView.h"
|
|
#include "Methods.h"
|
|
#include "HmmvTab.h"
|
|
#include "Hmmverr.h"
|
|
#include "utils.h"
|
|
#include "notify.h"
|
|
#include "SingleViewCtl.h"
|
|
#include "icon.h"
|
|
#include "props.h"
|
|
#include "agraph.h"
|
|
#include "path.h"
|
|
|
|
#ifdef _DEBUG
|
|
#define new DEBUG_NEW
|
|
#undef THIS_FILE
|
|
static char THIS_FILE[] = __FILE__;
|
|
#endif
|
|
|
|
|
|
|
|
#define CY_TAB_DESCRIPTION 2 * CY_FONT - 3
|
|
|
|
#define CX_LEFT_MARGIN 8
|
|
#define CX_RIGHT_MARGIN 8
|
|
#define CY_TOP_MARGIN 32
|
|
#define CY_BOTTOM_MARGIN 8
|
|
#define CY_CONTENT_LEADING 8
|
|
|
|
#define CX_TAB_ICON 32
|
|
#define CY_TAB_ICON 32
|
|
#define CX_TAB_ICON_MARGIN 8
|
|
#define CY_TAB_ICON_MARGIN 8
|
|
|
|
|
|
// The tab icons remain constant for all instances of the object viewer, so
|
|
// they are declared at file scope rather than created on a per-instance basis.
|
|
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// CHmmvTab
|
|
|
|
|
|
//************************************************************
|
|
// CHmmvTab::CHmmvTab
|
|
//
|
|
// Constructor.
|
|
//
|
|
// Parameters:
|
|
// [in] CSingleViewCtrl* psv
|
|
// Pointer to the generic view.
|
|
//
|
|
// Returns:
|
|
// Nothing.
|
|
//
|
|
//*************************************************************
|
|
CHmmvTab::CHmmvTab(CSingleViewCtrl* psv)
|
|
{
|
|
m_bUIActive = FALSE;
|
|
m_psv = psv;
|
|
m_pgridMeths = NULL;
|
|
// m_pgridMeths = new CMethodGrid(psv);
|
|
m_pgridProps = new CPropGridStd(psv);
|
|
m_bDidInitializeChildren = FALSE;
|
|
m_iCurSel = ITAB_PROPERTIES;
|
|
m_pAssocGraph = NULL;
|
|
m_bAssocTabEnabled = FALSE;
|
|
m_bMethodsTabEnabled = TRUE;
|
|
m_bDecorateWithIcon = TRUE;
|
|
m_bDecorateWithDescription = TRUE;
|
|
m_pwndIcon = new CIconWnd;
|
|
|
|
|
|
m_piconPropTab = new CIcon(CSize(CX_TAB_ICON, CY_TAB_ICON), IDI_TAB_PROPERTIES);
|
|
m_piconAssocTab = new CIcon(CSize(CX_TAB_ICON, CY_TAB_ICON), IDI_TAB_ASSOCIATIONS);
|
|
m_piconMethodsTab = new CIcon(CSize(CX_TAB_ICON, CY_TAB_ICON), IDI_TAB_METHODS);
|
|
|
|
|
|
m_clrBackground = GetSysColor(COLOR_3DFACE);
|
|
m_pbrBackground = new CBrush(m_clrBackground);
|
|
|
|
}
|
|
|
|
|
|
//************************************************************
|
|
// CHmmvTab::~CHmmvTab
|
|
//
|
|
// Destructor.
|
|
//
|
|
// Parameters:
|
|
// None.
|
|
//
|
|
// Returns:
|
|
// Nothing.
|
|
//
|
|
//*************************************************************
|
|
CHmmvTab::~CHmmvTab()
|
|
{
|
|
delete m_piconMethodsTab;
|
|
delete m_piconAssocTab;
|
|
delete m_piconPropTab;
|
|
|
|
delete m_pgridProps;
|
|
delete m_pgridMeths;
|
|
delete m_pAssocGraph;
|
|
delete m_pwndIcon;
|
|
delete m_pbrBackground;
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//***********************************************************
|
|
// CHmmvTab::HasEmptyKey
|
|
//
|
|
// Check the property grid to see if the currently selected
|
|
// object has any key that is empty (null).
|
|
//
|
|
// Paramters:
|
|
// None.
|
|
//
|
|
// Returns:
|
|
// BOOL
|
|
// TRUE if any key property is empty (null), FALSE
|
|
// otherwise.
|
|
//
|
|
//***********************************************************
|
|
BOOL CHmmvTab::HasEmptyKey()
|
|
{
|
|
return m_pgridProps->HasEmptyKey();
|
|
|
|
}
|
|
|
|
|
|
|
|
//************************************************************
|
|
// CHmmvTab::EnableMethodsTab
|
|
//
|
|
// Enable/disable the methods tab.
|
|
//
|
|
// Parameters:
|
|
// [in] BOOL bEnableMethodsTab
|
|
// TRUE if the methods tab should be visible, FALSE
|
|
// if it should not be visible.
|
|
//
|
|
// Returns:
|
|
// Nothing.
|
|
//
|
|
//*************************************************************
|
|
void CHmmvTab::EnableMethodsTab(BOOL bEnableMethodsTab)
|
|
{
|
|
if (m_bMethodsTabEnabled == bEnableMethodsTab) {
|
|
return;
|
|
}
|
|
int iItemMethods = FindTab(ITAB_METHODS);
|
|
if (!bEnableMethodsTab) {
|
|
if (m_iCurSel == ITAB_METHODS) {
|
|
if (m_pgridMeths) {
|
|
m_pgridMeths->ShowWindow(SW_HIDE);
|
|
}
|
|
m_pgridProps->ShowWindow(SW_SHOW);
|
|
SetCurSel(FindTab(ITAB_PROPERTIES));
|
|
m_iCurSel = ITAB_PROPERTIES;
|
|
m_pwndIcon->SelectIcon(ITAB_PROPERTIES);
|
|
}
|
|
|
|
if (iItemMethods != -1) {
|
|
DeleteItem(iItemMethods);
|
|
}
|
|
}
|
|
else {
|
|
if (iItemMethods == -1) {
|
|
|
|
CString sText;
|
|
TC_ITEM TabCtrlItem;
|
|
TabCtrlItem.mask = TCIF_TEXT | TCIF_PARAM;
|
|
TabCtrlItem.lParam = ITAB_METHODS;
|
|
|
|
// Add the methods tab
|
|
sText.LoadString(IDS_TAB_TITLE_METHODS);
|
|
TabCtrlItem.pszText = (LPTSTR) (void*) (LPCTSTR) sText;
|
|
|
|
iItemMethods = GetItemCount();
|
|
InsertItem(iItemMethods, &TabCtrlItem );
|
|
|
|
if (m_pgridMeths == NULL) {
|
|
m_pgridMeths = new CMethodGrid(m_psv);
|
|
m_pgridMeths->Create(m_rcContent, this, GenerateWindowID(), FALSE);
|
|
}
|
|
}
|
|
}
|
|
m_bMethodsTabEnabled = bEnableMethodsTab;
|
|
}
|
|
|
|
|
|
//********************************************************
|
|
// CHmmvTab::DeleteMethodsTab
|
|
//
|
|
// Delete the methods tab.
|
|
//
|
|
// Parameters:
|
|
// None.
|
|
//
|
|
// Returns:
|
|
// Nothing.
|
|
//
|
|
//*********************************************************
|
|
void CHmmvTab::DeleteMethodsTab()
|
|
{
|
|
int iItemMethods = FindTab(ITAB_METHODS);
|
|
if (iItemMethods != -1) {
|
|
DeleteItem(iItemMethods);
|
|
}
|
|
|
|
if (m_pgridMeths == NULL) {
|
|
return;
|
|
}
|
|
|
|
// Remove the associations tab
|
|
DeleteItem(ITAB_METHODS);
|
|
delete m_pgridMeths;
|
|
m_pgridMeths = NULL;
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//************************************************************
|
|
// CHmmvTab::EnableAssocTab
|
|
//
|
|
// Enable/disable the associations tab.
|
|
//
|
|
// Parameters:
|
|
// [in] BOOL bEnableAssocTab
|
|
// TRUE if the associations tab should be visible, FALSE
|
|
// if it should not be visible.
|
|
//
|
|
// Returns:
|
|
// Nothing.
|
|
//
|
|
//*************************************************************
|
|
void CHmmvTab::EnableAssocTab(BOOL bEnableAssocTab)
|
|
{
|
|
|
|
if (m_bAssocTabEnabled == bEnableAssocTab) {
|
|
return;
|
|
}
|
|
int iItemAssoc = FindTab(ITAB_ASSOCIATIONS);
|
|
if (!bEnableAssocTab) {
|
|
if (m_iCurSel == ITAB_ASSOCIATIONS) {
|
|
m_pAssocGraph->ShowWindow(SW_HIDE);
|
|
m_pgridProps->ShowWindow(SW_SHOW);
|
|
|
|
int iItemProps = FindTab(ITAB_PROPERTIES);
|
|
SetCurSel(iItemProps);
|
|
m_iCurSel = ITAB_PROPERTIES;
|
|
m_pwndIcon->SelectIcon(ITAB_PROPERTIES);
|
|
}
|
|
|
|
if (iItemAssoc != -1) {
|
|
DeleteItem(iItemAssoc);
|
|
}
|
|
|
|
}
|
|
else {
|
|
if (iItemAssoc == -1) {
|
|
CString sText;
|
|
TC_ITEM TabCtrlItem;
|
|
TabCtrlItem.mask = TCIF_TEXT | TCIF_PARAM;
|
|
TabCtrlItem.lParam = ITAB_ASSOCIATIONS;
|
|
|
|
// Add the associations tab
|
|
sText.LoadString(IDS_TAB_TITLE_ASSOCIATIONS);
|
|
TabCtrlItem.pszText = (LPTSTR) (void*) (LPCTSTR) sText;
|
|
|
|
iItemAssoc = GetItemCount();
|
|
InsertItem(iItemAssoc, &TabCtrlItem );
|
|
|
|
if (m_pAssocGraph == NULL) {
|
|
m_pAssocGraph = new CAssocGraph(m_psv);
|
|
m_pAssocGraph->Create(m_rcContent, this, GenerateWindowID(), FALSE);
|
|
}
|
|
}
|
|
ASSERT(m_pAssocGraph != NULL);
|
|
}
|
|
m_bAssocTabEnabled = bEnableAssocTab;
|
|
}
|
|
|
|
|
|
//********************************************************
|
|
// CHmmvTab::DeleteAssocTab
|
|
//
|
|
// Delete the association tab and the association graph
|
|
// that goes along with it.
|
|
//
|
|
// Parameters:
|
|
// None.
|
|
//
|
|
// Returns:
|
|
// Nothing.
|
|
//
|
|
//*********************************************************
|
|
void CHmmvTab::DeleteAssocTab()
|
|
{
|
|
int iItemAssoc = FindTab(ITAB_ASSOCIATIONS);
|
|
if (iItemAssoc != -1) {
|
|
DeleteItem(iItemAssoc);
|
|
}
|
|
|
|
if (m_pAssocGraph == NULL) {
|
|
return;
|
|
}
|
|
|
|
// Remove the associations tab
|
|
m_psv->GetGlobalNotify()->RemoveClient((CNotifyClient*) m_pAssocGraph);
|
|
delete m_pAssocGraph;
|
|
m_pAssocGraph = NULL;
|
|
}
|
|
|
|
|
|
//********************************************************
|
|
// CHmmvTab::Create
|
|
//
|
|
// Create the tab control.
|
|
//
|
|
// Parameters:
|
|
// See the MFC documentation for CTabCtrl
|
|
//
|
|
// Returns:
|
|
// TRUE if the window was created successfully.
|
|
//
|
|
//*********************************************************
|
|
BOOL CHmmvTab::Create(DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID )
|
|
{
|
|
BOOL bDidCreate = CTabCtrl::Create(dwStyle,
|
|
rect,
|
|
pParentWnd,
|
|
nID);
|
|
|
|
if (!bDidCreate) {
|
|
return FALSE;
|
|
}
|
|
|
|
CString sText;
|
|
TC_ITEM TabCtrlItem;
|
|
TabCtrlItem.mask = TCIF_TEXT | TCIF_PARAM;
|
|
TabCtrlItem.lParam = ITAB_PROPERTIES;
|
|
|
|
|
|
sText.LoadString(IDS_TAB_TITLE_PROPERTIES);
|
|
TabCtrlItem.pszText = (LPTSTR) (void*) (LPCTSTR) sText;
|
|
|
|
int iItem = GetItemCount();
|
|
InsertItem(iItem, &TabCtrlItem );
|
|
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
|
|
BEGIN_MESSAGE_MAP(CHmmvTab, CTabCtrl)
|
|
//{{AFX_MSG_MAP(CHmmvTab)
|
|
ON_NOTIFY_REFLECT(TCN_SELCHANGE, OnSelchange)
|
|
ON_WM_DESTROY()
|
|
ON_WM_SIZE()
|
|
ON_WM_CREATE()
|
|
ON_WM_SETFOCUS()
|
|
ON_WM_KILLFOCUS()
|
|
ON_WM_CTLCOLOR()
|
|
ON_WM_ERASEBKGND()
|
|
//}}AFX_MSG_MAP
|
|
END_MESSAGE_MAP()
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// CHmmvTab message handlers
|
|
|
|
|
|
|
|
//********************************************************
|
|
// CHmmvTab::WasModified
|
|
//
|
|
// Check to see if anything that appears on the tabs was
|
|
// modified.
|
|
//
|
|
// Parameters:
|
|
// None.
|
|
//
|
|
// Returns:
|
|
// TRUE if something was modified.
|
|
//
|
|
//*********************************************************
|
|
BOOL CHmmvTab::WasModified()
|
|
{
|
|
BOOL bModified = m_pgridProps->WasModified();
|
|
if (m_pgridMeths) {
|
|
bModified |= m_pgridMeths->WasModified();
|
|
}
|
|
return bModified;
|
|
}
|
|
|
|
//********************************************************
|
|
// CHmmvTab::LayoutChildren
|
|
//
|
|
// Layout the position of the child windows.
|
|
//
|
|
// Parameters:
|
|
// None.
|
|
//
|
|
// Returns:
|
|
// Nothing.
|
|
//
|
|
//*********************************************************
|
|
void CHmmvTab::LayoutChildren()
|
|
{
|
|
CRect rcClient;
|
|
GetClientRect(rcClient);
|
|
|
|
UINT cyTabDescription = 0;
|
|
if (::IsWindow(m_edtDescription.m_hWnd)) {
|
|
CFont* pfont = m_edtDescription.GetFont();
|
|
if (pfont) {
|
|
LOGFONT lf;
|
|
pfont->GetLogFont(&lf);
|
|
cyTabDescription = 2 * lf.lfHeight;
|
|
}
|
|
}
|
|
if (cyTabDescription == 0) {
|
|
cyTabDescription = CY_TAB_DESCRIPTION;
|
|
}
|
|
|
|
// First layout the tab description rectangle because the content falls below
|
|
// the description.
|
|
if (m_bDecorateWithDescription) {
|
|
m_rcDescription.left = rcClient.left + CX_LEFT_MARGIN;
|
|
m_rcDescription.right = rcClient.right - CX_RIGHT_MARGIN;
|
|
m_rcDescription.top = rcClient.top + CY_TOP_MARGIN;
|
|
m_rcDescription.bottom = m_rcDescription.top + cyTabDescription;
|
|
|
|
if (m_bDecorateWithIcon) {
|
|
m_rcDescription.left += CX_TAB_ICON + CX_TAB_ICON_MARGIN;
|
|
}
|
|
}
|
|
else {
|
|
m_rcDescription.top = rcClient.top;
|
|
m_rcDescription.bottom = rcClient.top;
|
|
m_rcDescription.left = rcClient.left + CX_LEFT_MARGIN;
|
|
m_rcDescription.right = rcClient.right - CX_RIGHT_MARGIN;
|
|
}
|
|
|
|
// Now layout the tab content.
|
|
m_rcContent.top = m_rcDescription.bottom + CY_CONTENT_LEADING;
|
|
m_rcContent.bottom = rcClient.bottom - CY_BOTTOM_MARGIN;
|
|
m_rcContent.left = rcClient.left + CX_LEFT_MARGIN;
|
|
m_rcContent.right = m_rcDescription.right;
|
|
}
|
|
|
|
|
|
|
|
//********************************************************
|
|
// CHmmvTab::DrawTabIcon
|
|
//
|
|
// Draw the icon that appears on the tab for the selected tab.
|
|
//
|
|
// Parameters:
|
|
// [in] CDC* pdc
|
|
/// Pointer to the display context.
|
|
//
|
|
// Returns:
|
|
// Nothing.
|
|
//
|
|
//*********************************************************
|
|
void CHmmvTab::DrawTabIcon(CDC* pdc)
|
|
{
|
|
CIcon* picon;
|
|
|
|
switch (m_iCurSel) {
|
|
case ITAB_PROPERTIES:
|
|
picon = m_piconPropTab;
|
|
break;
|
|
case ITAB_METHODS:
|
|
picon = m_piconMethodsTab;
|
|
break;
|
|
case ITAB_ASSOCIATIONS:
|
|
picon = m_piconAssocTab;
|
|
break;
|
|
default:
|
|
ASSERT(FALSE);
|
|
break;
|
|
}
|
|
|
|
CRect rcClient;
|
|
GetClientRect(rcClient);
|
|
int ix = rcClient.left + CX_TAB_ICON_MARGIN;
|
|
int iy = rcClient.top + CY_TOP_MARGIN;
|
|
|
|
// The icon has transparent areas, so draw clear the background first.
|
|
CRect rcIcon(ix, iy, ix + CX_TAB_ICON, iy + CY_TAB_ICON);
|
|
CBrush br3DFACE(GetSysColor(COLOR_3DFACE));
|
|
|
|
picon->Draw(pdc, ix, iy, (HBRUSH) br3DFACE);
|
|
}
|
|
|
|
|
|
void CHmmvTab::SetDescriptionText(LPCTSTR psz)
|
|
{
|
|
m_sDescriptionText = psz;
|
|
UpdateDescriptionText();
|
|
}
|
|
|
|
|
|
//*********************************************************
|
|
// CHmmvTab::UpdateDescriptionText
|
|
//
|
|
// Update the description text window with the current description
|
|
// text. Also, if the text is too long, truncate it with "..."
|
|
//
|
|
// Parameters:
|
|
// None.
|
|
//
|
|
// Returns:
|
|
// Nothing.
|
|
//
|
|
//*********************************************************
|
|
void CHmmvTab::UpdateDescriptionText()
|
|
{
|
|
m_edtDescription.SetWindowText(m_sDescriptionText);
|
|
|
|
int nCh = m_sDescriptionText.GetLength() - 3;
|
|
CString s;
|
|
while ((nCh > 0) && (m_edtDescription.GetLineCount() > 2)) {
|
|
s = m_sDescriptionText.Left(nCh);
|
|
s = s + _T(" ...");
|
|
m_edtDescription.SetWindowText(s);
|
|
--nCh;
|
|
}
|
|
}
|
|
|
|
|
|
//********************************************************************
|
|
// CHmmvTab::InitializeChildren
|
|
//
|
|
// This method is called just after the tab control is created to initialize
|
|
// the child windows of the tab control.
|
|
//
|
|
// Parameters:
|
|
// None.
|
|
//
|
|
// Returns:
|
|
// Nothing.
|
|
//
|
|
//********************************************************************
|
|
void CHmmvTab::InitializeChildren()
|
|
{
|
|
|
|
LayoutChildren();
|
|
|
|
|
|
if (m_bDecorateWithDescription) {
|
|
m_edtDescription.Create(ES_READONLY | ES_MULTILINE | WS_CHILD | WS_VISIBLE, m_rcDescription, this, GenerateWindowID());
|
|
m_edtDescription.SetFont(&m_psv->GetFont());
|
|
CString sDescription;
|
|
sDescription.LoadString(IDS_PROP_TAB_DESCRIPTION);
|
|
SetDescriptionText(sDescription);
|
|
}
|
|
|
|
BOOL bDidCreate = m_pgridProps->Create(m_rcContent, this, GenerateWindowID(), TRUE);
|
|
|
|
if (bDidCreate) {
|
|
|
|
m_pgridProps->ShowWindow(SW_SHOW);
|
|
m_pgridProps->SetFocus();
|
|
}
|
|
|
|
|
|
if (m_bMethodsTabEnabled && m_pgridMeths==NULL) {
|
|
m_pgridMeths = new CMethodGrid(m_psv);
|
|
m_pgridMeths->Create(m_rcContent, this, GenerateWindowID(), FALSE);
|
|
}
|
|
|
|
if (m_bAssocTabEnabled && m_pAssocGraph==NULL) {
|
|
m_pAssocGraph = new CAssocGraph(m_psv);
|
|
m_pAssocGraph->Create(m_rcContent, this, GenerateWindowID(), FALSE);
|
|
}
|
|
|
|
bDidCreate = m_pwndIcon->Create(
|
|
WS_CHILD | WS_VISIBLE,
|
|
CX_TAB_ICON_MARGIN,
|
|
CY_TOP_MARGIN,
|
|
this);
|
|
|
|
UpdateWindow();
|
|
}
|
|
|
|
|
|
|
|
//********************************************************************
|
|
// CHmmvTab::OnSelchange
|
|
//
|
|
// This method is called when the user clicks on a new tab. When this
|
|
// occurs, it is necessary to "flip" the content of the tabcontrol to
|
|
// the new view. This is done by hiding the current content window and
|
|
// showing the new content windows corresponding to the selected tab.
|
|
//
|
|
// Parameters:
|
|
// See the MFC documentation.
|
|
//
|
|
// Returns:
|
|
// Nothing.
|
|
//
|
|
//********************************************************************
|
|
void CHmmvTab::OnSelchange(NMHDR* pNMHDR, LRESULT* pResult)
|
|
{
|
|
|
|
|
|
// The tab index is stored in the lParam of the tab control item.
|
|
// Get the tab index.
|
|
int iItem = GetCurSel();
|
|
|
|
TC_ITEM TabCtrlItem;
|
|
TabCtrlItem.mask = TCIF_PARAM;
|
|
GetItem(iItem, &TabCtrlItem );
|
|
|
|
int iCurSel = (int) TabCtrlItem.lParam;
|
|
|
|
|
|
if (iCurSel == m_iCurSel) {
|
|
*pResult = 0;
|
|
return;
|
|
}
|
|
|
|
// All of the real work is done by SelecTab. The SelectTab method
|
|
// allows the tab to be switched using a simpler interface.
|
|
SelectTab(iCurSel) ;
|
|
m_psv->ContextChanged();
|
|
|
|
*pResult = 0;
|
|
}
|
|
|
|
|
|
//********************************************************************
|
|
// CHmmvTab::OnDestroy
|
|
//
|
|
// Destroy this window and any child window that will have problems if
|
|
// the parent window disappears.
|
|
//
|
|
// Parameters:
|
|
// None.
|
|
//
|
|
// Returns:
|
|
// Nothing.
|
|
//
|
|
//********************************************************************
|
|
void CHmmvTab::OnDestroy()
|
|
{
|
|
DeleteMethodsTab();
|
|
DeleteAssocTab();
|
|
CTabCtrl::OnDestroy();
|
|
}
|
|
|
|
|
|
//********************************************************************
|
|
// CHmmvTab::Refresh
|
|
//
|
|
// Load the tab control and its child windows with data from the
|
|
// current HMOM class object. The current object is contained in
|
|
// the "generic" view.
|
|
//
|
|
// Parameters:
|
|
// None.
|
|
//
|
|
// Returns:
|
|
// Nothing.
|
|
//
|
|
//********************************************************************
|
|
void CHmmvTab::Refresh()
|
|
{
|
|
CSelection& sel = m_psv->Selection();
|
|
BOOL bNeedsAssocTab = sel.ClassObjectNeedsAssocTab();
|
|
BOOL bNeedsMethodsTab = sel.ClassObjectNeedsMethodsTab();
|
|
|
|
EnableMethodsTab(bNeedsMethodsTab);
|
|
EnableAssocTab(bNeedsAssocTab);
|
|
|
|
|
|
|
|
CRect rcChild;
|
|
switch (m_iCurSel) {
|
|
case ITAB_PROPERTIES:
|
|
if (::IsWindow(m_pgridProps->m_hWnd)) {
|
|
m_pgridProps->GetClientRect(rcChild);
|
|
m_pgridProps->InvalidateRect(&rcChild);
|
|
}
|
|
break;
|
|
case ITAB_METHODS:
|
|
if (::IsWindow(m_pgridMeths->m_hWnd)) {
|
|
m_pgridMeths->GetClientRect(rcChild);
|
|
m_pgridMeths->InvalidateRect(&rcChild);
|
|
}
|
|
break;
|
|
case ITAB_ASSOCIATIONS:
|
|
if (::IsWindow(m_pAssocGraph->m_hWnd)) {
|
|
m_pAssocGraph->GetClientRect(rcChild);
|
|
m_pAssocGraph->InvalidateRect(&rcChild);
|
|
}
|
|
break;
|
|
}
|
|
|
|
|
|
|
|
// empty the pages' grids.
|
|
m_pgridProps->Refresh();
|
|
if (m_pgridMeths) {
|
|
m_pgridMeths->Refresh();
|
|
}
|
|
|
|
if (m_pAssocGraph)
|
|
{
|
|
m_pAssocGraph->Clear();
|
|
}
|
|
|
|
if (m_bAssocTabEnabled)
|
|
{
|
|
ASSERT(m_pAssocGraph != NULL);
|
|
if (m_iCurSel == ITAB_ASSOCIATIONS)
|
|
{
|
|
BOOL bCanceled = m_pAssocGraph->Refresh();
|
|
if (bCanceled) {
|
|
SelectTab(ITAB_PROPERTIES);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
m_pAssocGraph->DoDelayedRefresh();
|
|
}
|
|
}
|
|
|
|
switch (m_iCurSel) {
|
|
case ITAB_PROPERTIES:
|
|
if (::IsWindow(m_pgridProps->m_hWnd)) {
|
|
m_pgridProps->UpdateWindow();
|
|
}
|
|
break;
|
|
case ITAB_METHODS:
|
|
if (::IsWindow(m_pgridMeths->m_hWnd)) {
|
|
m_pgridMeths->RedrawWindow();
|
|
}
|
|
break;
|
|
case ITAB_ASSOCIATIONS:
|
|
if (::IsWindow(m_pAssocGraph->m_hWnd)) {
|
|
m_pAssocGraph->RedrawWindow();
|
|
}
|
|
break;
|
|
}
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
//********************************************************************
|
|
// CHmmvTab::OnSize
|
|
//
|
|
// Resize this window and its children.
|
|
//
|
|
// Parameters:
|
|
// See the MFC documentation.
|
|
//
|
|
// Returns:
|
|
// Nothing.
|
|
//
|
|
//********************************************************************
|
|
void CHmmvTab::OnSize(UINT nType, int cx, int cy)
|
|
{
|
|
CTabCtrl::OnSize(nType, cx, cy);
|
|
|
|
|
|
|
|
LayoutChildren();
|
|
|
|
if (m_edtDescription.m_hWnd) {
|
|
m_edtDescription.MoveWindow(m_rcDescription);
|
|
UpdateDescriptionText();
|
|
}
|
|
|
|
if (m_pgridProps->m_hWnd) {
|
|
m_pgridProps->MoveWindow(m_rcContent);
|
|
}
|
|
|
|
if ((m_pgridMeths!=NULL) && (m_pgridMeths->m_hWnd)) {
|
|
m_pgridMeths->MoveWindow(m_rcContent);
|
|
}
|
|
|
|
if ((m_pAssocGraph!=NULL) && (m_pAssocGraph->m_hWnd != NULL)) {
|
|
|
|
m_pAssocGraph->MoveWindow(m_rcContent);
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
//********************************************************************
|
|
// CHmmvTab::Serialize
|
|
//
|
|
// Save the state of this tab control and its children.
|
|
//
|
|
// Parameters:
|
|
// None.
|
|
//
|
|
// Returns:
|
|
// SCODE
|
|
// S_OK if successful, otherwise a failure code.
|
|
//
|
|
//********************************************************************
|
|
SCODE CHmmvTab::Serialize()
|
|
{
|
|
SCODE sc;
|
|
sc = m_pgridProps->Serialize();
|
|
if (FAILED(sc)) {
|
|
return sc;
|
|
}
|
|
|
|
if (m_pgridMeths) {
|
|
sc = m_pgridMeths->Serialize();
|
|
}
|
|
return sc;
|
|
|
|
}
|
|
|
|
|
|
//*******************************************************
|
|
// CHmmvTab::SelectTab
|
|
//
|
|
// Select one of the tabs.
|
|
//
|
|
// Parameters:
|
|
// [in] const int iTabIndex
|
|
//
|
|
// Returns:
|
|
// Nothing.
|
|
//
|
|
//******************************************************
|
|
void CHmmvTab::SelectTab(/* [in] */ int iTabIndex,
|
|
/* [in] */ const BOOL bRedraw)
|
|
{
|
|
if (iTabIndex == m_iCurSel) {
|
|
SetFocus();
|
|
return;
|
|
}
|
|
|
|
|
|
switch (m_iCurSel) {
|
|
case ITAB_PROPERTIES:
|
|
m_pgridProps->ShowWindow(SW_HIDE);
|
|
break;
|
|
case ITAB_METHODS:
|
|
m_pgridMeths->ShowWindow(SW_HIDE);
|
|
break;
|
|
case ITAB_ASSOCIATIONS:
|
|
m_pAssocGraph->ShowWindow(SW_HIDE);
|
|
break;
|
|
}
|
|
|
|
|
|
CString sDescription;
|
|
|
|
BOOL bCanceled;
|
|
switch(iTabIndex) {
|
|
case ITAB_ASSOCIATIONS:
|
|
if (m_bAssocTabEnabled) {
|
|
sDescription.LoadString(IDS_ASSOCIATIONS_TAB_DESCRIPTION);
|
|
if (m_bDecorateWithDescription) {
|
|
SetDescriptionText(sDescription);
|
|
}
|
|
|
|
bCanceled = m_pAssocGraph->SyncContent();
|
|
if (bCanceled) {
|
|
m_iCurSel = ITAB_ASSOCIATIONS;
|
|
SelectTab(ITAB_PROPERTIES, TRUE);
|
|
return;
|
|
}
|
|
|
|
m_pAssocGraph->ShowWindow(SW_SHOW);
|
|
m_pAssocGraph->SetFocus();
|
|
if (!bRedraw) {
|
|
m_pAssocGraph->UpdateWindow();
|
|
}
|
|
break;
|
|
}
|
|
|
|
// Fall trhough to ITAB_PROPERTIES
|
|
ASSERT(FALSE);
|
|
iTabIndex = ITAB_PROPERTIES;
|
|
case ITAB_PROPERTIES:
|
|
sDescription.LoadString(IDS_PROP_TAB_DESCRIPTION);
|
|
if (m_bDecorateWithDescription) {
|
|
SetDescriptionText(sDescription);
|
|
}
|
|
m_pgridProps->ShowWindow(SW_SHOW);
|
|
m_pgridProps->SetFocus();
|
|
if (!bRedraw) {
|
|
m_pgridProps->UpdateWindow();
|
|
}
|
|
break;
|
|
case ITAB_METHODS:
|
|
if (m_bMethodsTabEnabled) {
|
|
sDescription.LoadString(IDS_METHODS_TAB_DESCRIPTION);
|
|
if (m_bDecorateWithDescription) {
|
|
SetDescriptionText(sDescription);
|
|
}
|
|
m_pgridMeths->ShowWindow(SW_SHOW);
|
|
m_pgridMeths->SetFocus();
|
|
if (!bRedraw) {
|
|
m_pgridMeths->UpdateWindow();
|
|
}
|
|
}
|
|
break;
|
|
}
|
|
|
|
m_iCurSel = iTabIndex;
|
|
m_pwndIcon->SelectIcon(iTabIndex);
|
|
|
|
int iItem = FindTab(iTabIndex);
|
|
if (iItem >= 0) {
|
|
SetCurSel(iItem);
|
|
}
|
|
else {
|
|
SetCurSel(0);
|
|
}
|
|
if (IsWindowVisible() && bRedraw) {
|
|
RedrawWindow();
|
|
m_psv->InvalidateControl();
|
|
}
|
|
SetFocus();
|
|
}
|
|
|
|
|
|
void CHmmvTab::NotifyNamespaceChange()
|
|
{
|
|
if (m_pAssocGraph) {
|
|
m_pAssocGraph->NotifyNamespaceChange();
|
|
}
|
|
}
|
|
|
|
|
|
int CHmmvTab::OnCreate(LPCREATESTRUCT lpCreateStruct)
|
|
{
|
|
if (CWnd::OnCreate(lpCreateStruct) == -1)
|
|
return -1;
|
|
|
|
|
|
InitializeChildren();
|
|
return 0;
|
|
}
|
|
|
|
|
|
|
|
void CHmmvTab::OnSetFocus(CWnd* pOldWnd)
|
|
{
|
|
CWnd::OnSetFocus(pOldWnd);
|
|
|
|
if (!m_bUIActive)
|
|
{
|
|
m_bUIActive = TRUE;
|
|
m_psv->OnRequestUIActive();
|
|
}
|
|
|
|
CRect rcChild;
|
|
switch (m_iCurSel) {
|
|
case ITAB_PROPERTIES:
|
|
if (::IsWindow(m_pgridProps->m_hWnd)) {
|
|
m_pgridProps->SetFocus();
|
|
}
|
|
break;
|
|
case ITAB_METHODS:
|
|
if (::IsWindow(m_pgridMeths->m_hWnd)) {
|
|
m_pgridMeths->SetFocus();
|
|
}
|
|
break;
|
|
case ITAB_ASSOCIATIONS:
|
|
if (::IsWindow(m_pAssocGraph->m_hWnd)) {
|
|
m_pAssocGraph->SetFocus();
|
|
}
|
|
break;
|
|
}
|
|
|
|
|
|
}
|
|
|
|
void CHmmvTab::OnKillFocus(CWnd* pNewWnd)
|
|
{
|
|
CWnd::OnKillFocus(pNewWnd);
|
|
|
|
m_bUIActive = FALSE;
|
|
|
|
}
|
|
|
|
|
|
|
|
BOOL CHmmvTab::OnEraseBkgnd(CDC* pDC)
|
|
{
|
|
CRect rcClient;
|
|
GetClientRect(rcClient);
|
|
pDC->FillRect(rcClient, m_pbrBackground);
|
|
return TRUE;
|
|
}
|
|
|
|
HBRUSH CHmmvTab::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
|
|
{
|
|
|
|
pDC->SetBkColor( m_clrBackground); // text bkgnd
|
|
if (m_pbrBackground) {
|
|
return (HBRUSH) (*m_pbrBackground);
|
|
}
|
|
else {
|
|
return NULL;
|
|
}
|
|
}
|
|
|
|
|
|
//*********************************************************
|
|
// CHmmvTab::FindTab
|
|
//
|
|
// Given a logical tab index, find the corresponding tab
|
|
// control item.
|
|
//
|
|
// Parameters:
|
|
// [in] const int iTabIndex
|
|
// One of the following:
|
|
// ITAB_PROPERTIES
|
|
// ITAB_METHODS
|
|
// ITAB_ASSOCIATIONS
|
|
//
|
|
// Returns:
|
|
// The tab control item index for the corresponding
|
|
// tab. -1 if there is no item corresponding to the
|
|
// requested tab.
|
|
//
|
|
//********************************************************
|
|
int CHmmvTab::FindTab(const int iTabIndex) const
|
|
{
|
|
TC_ITEM tci;
|
|
int nItems = GetItemCount();
|
|
for (int iItem=0; iItem < nItems; ++iItem) {
|
|
tci.mask = TCIF_PARAM;
|
|
GetItem(iItem, &tci);
|
|
if (tci.lParam == iTabIndex) {
|
|
return iItem;
|
|
}
|
|
}
|
|
return -1;
|
|
}
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// CIconWnd
|
|
|
|
CIconWnd::CIconWnd()
|
|
{
|
|
m_piconPropTab = new CIcon(CSize(CX_TAB_ICON, CY_TAB_ICON), IDI_TAB_PROPERTIES);
|
|
m_piconAssocTab = new CIcon(CSize(CX_TAB_ICON, CY_TAB_ICON), IDI_TAB_ASSOCIATIONS);
|
|
m_piconMethodsTab = new CIcon(CSize(CX_TAB_ICON, CY_TAB_ICON), IDI_TAB_METHODS);
|
|
|
|
m_iIcon = ITAB_PROPERTIES;
|
|
|
|
m_clrBackground = GetSysColor(COLOR_3DFACE);
|
|
m_pbrBackground = new CBrush(m_clrBackground);
|
|
}
|
|
|
|
CIconWnd::~CIconWnd()
|
|
{
|
|
delete m_piconPropTab;
|
|
delete m_piconAssocTab;
|
|
delete m_piconMethodsTab;
|
|
delete m_pbrBackground;
|
|
}
|
|
|
|
|
|
BEGIN_MESSAGE_MAP(CIconWnd, CWnd)
|
|
//{{AFX_MSG_MAP(CIconWnd)
|
|
ON_WM_PAINT()
|
|
ON_WM_ERASEBKGND()
|
|
//}}AFX_MSG_MAP
|
|
END_MESSAGE_MAP()
|
|
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// CIconWnd message handlers
|
|
|
|
|
|
BOOL CIconWnd::Create(DWORD dwStyle, int ix, int iy, CWnd* pwndParent)
|
|
{
|
|
BOOL bDidCreate;
|
|
|
|
CRect rcIcon;
|
|
rcIcon.left = ix;
|
|
rcIcon.top = iy;
|
|
rcIcon.right = rcIcon.left + CX_TAB_ICON;
|
|
rcIcon.bottom = rcIcon.top + CY_TAB_ICON;
|
|
|
|
dwStyle |= WS_CHILD ;
|
|
bDidCreate = CWnd::Create(NULL, _T(""), dwStyle, rcIcon, pwndParent, GenerateWindowID());
|
|
return bDidCreate;
|
|
}
|
|
|
|
|
|
|
|
|
|
//****************************************************************
|
|
// CIconWnd::SelectIcon
|
|
//
|
|
// Select and icon and redraw the window if possible.
|
|
//
|
|
// Parameters:
|
|
// int iIcon
|
|
// One of the following values:
|
|
// ITAB_PROPERTIES
|
|
// ITAB_METHODS
|
|
// ITAB_ASSOCIATIONS
|
|
//
|
|
// Returns:
|
|
// Nothing.
|
|
//
|
|
//*******************************************************
|
|
void CIconWnd::SelectIcon(int iIcon)
|
|
{
|
|
m_iIcon = iIcon;
|
|
if (::IsWindow(m_hWnd)) {
|
|
RedrawWindow();
|
|
}
|
|
}
|
|
|
|
|
|
void CIconWnd::OnPaint()
|
|
{
|
|
CPaintDC dc(this); // device context for painting
|
|
CIcon* picon;
|
|
|
|
switch (m_iIcon) {
|
|
case ITAB_PROPERTIES:
|
|
picon = m_piconPropTab;
|
|
break;
|
|
case ITAB_METHODS:
|
|
picon = m_piconMethodsTab;
|
|
break;
|
|
case ITAB_ASSOCIATIONS:
|
|
picon = m_piconAssocTab;
|
|
break;
|
|
default:
|
|
ASSERT(FALSE);
|
|
break;
|
|
}
|
|
|
|
CBrush br3DFACE(GetSysColor(COLOR_3DFACE));
|
|
picon->Draw(&dc, 0, 0, (HBRUSH) br3DFACE);
|
|
|
|
// Do not call CWnd::OnPaint() for painting messages
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
BOOL CIconWnd::OnEraseBkgnd(CDC* pDC)
|
|
{
|
|
CRect rcClient;
|
|
GetClientRect(rcClient);
|
|
pDC->FillRect(rcClient, m_pbrBackground);
|
|
return TRUE;
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|