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

814 lines
14 KiB
C++

// Copyright (c) 1997-2001 Microsoft Corporation, All Rights Reserved
#include "stdafx.h"
#include <afxcmn.h>
#include "mvbase.h"
#include "mv.h"
#include "sv.h"
#include "PolyView.h"
#include "utils.h"
#include "hmmvctl.h"
#include "titlebar.h"
#include "resource.h"
enum {EDITMODE_BROWSER=0, EDITMODE_STUDIO=1, EDITMODE_READONLY=2}; // There needs to be a common define for this somewhere.
CPolyView::CPolyView(CWBEMViewContainerCtrl* phmmv)
{
m_phmmv = phmmv;
m_pmv = NULL;
m_psv = NULL;
m_bDidCreateWindow = FALSE;
m_bDelaySvContextRestore = FALSE;
m_bInStudioMode = FALSE;
m_bShowSingleView = TRUE;
}
CPolyView::~CPolyView()
{
//hmh if (m_pmv!=NULL && m_pmv->m_hWnd!=NULL) {
// m_pmv->NotifyWillDestroy();
// }
delete m_pmv;
//kmh if (m_psv!=NULL && m_psv->m_hWnd!=NULL) {
// m_psv->NotifyWillDestroy();
// }
delete m_psv;
}
BOOL CPolyView::Create(CRect& rcView)
{
m_pmv = new CMultiView(m_phmmv);
m_psv = new CSingleView(m_phmmv);
BOOL bDidCreate;
bDidCreate = m_psv->Create(_T("SingleView"), NULL, WS_CHILD | WS_CLIPCHILDREN, rcView, m_phmmv, GenerateWindowID(), NULL);
if (bDidCreate) {
//kmh m_psv->NotifyDidCreate();
m_psv->SetEditMode(m_bInStudioMode ? EDITMODE_STUDIO : EDITMODE_BROWSER);
}
else {
ASSERT(FALSE);
delete m_psv;
m_psv = NULL;
return FALSE;
}
bDidCreate = m_pmv->Create(_T("MultiView"), NULL, WS_CHILD | WS_CLIPCHILDREN, rcView, m_phmmv, GenerateWindowID(), NULL);
if (bDidCreate) {
//kmh m_pmv->NotifyDidCreate();
m_pmv->SetEditMode(m_bInStudioMode ? EDITMODE_STUDIO : EDITMODE_BROWSER);
}
else {
ASSERT(FALSE);
delete m_pmv;
m_pmv = NULL;
return FALSE;
}
m_bDidCreateWindow = TRUE;
return TRUE;
}
BOOL CPolyView::IsShowingMultiview()
{
BOOL bShowingMultiview = FALSE;
BOOL bShowingSingleview = FALSE;
if (m_pmv) {
if (::IsWindow(m_pmv->m_hWnd)) {
bShowingMultiview = m_pmv->IsWindowVisible();
}
}
if (m_psv) {
if (::IsWindow(m_psv->m_hWnd)) {
bShowingSingleview = m_psv->IsWindowVisible();
}
}
if (bShowingMultiview && bShowingSingleview) {
// Control should never come here, but for some
// unknown reason there are times when both views
// want to become visible simultaneously (by magic).
// Turn off the unwanted view.
if (m_bShowSingleView) {
m_pmv->ShowWindow(SW_HIDE);
bShowingMultiview = FALSE;
}
else {
m_psv->ShowWindow(SW_HIDE);
bShowingSingleview = FALSE;
}
}
return bShowingMultiview;
}
BOOL CPolyView::IsShowingSingleview()
{
BOOL bShowingMultiview = FALSE;
BOOL bShowingSingleview = FALSE;
if (m_pmv) {
if (::IsWindow(m_pmv->m_hWnd)) {
bShowingMultiview = m_pmv->IsWindowVisible();
}
}
if (m_psv) {
if (::IsWindow(m_psv->m_hWnd)) {
bShowingSingleview = m_psv->IsWindowVisible();
}
}
if (bShowingMultiview && bShowingSingleview) {
// Control should never come here, but for some
// unknown reason there are times when both views
// want to become visible simultaneously (by magic).
// Turn off the unwanted view.
if (m_bShowSingleView) {
m_pmv->ShowWindow(SW_HIDE);
bShowingMultiview = FALSE;
}
else {
m_psv->ShowWindow(SW_HIDE);
bShowingSingleview = FALSE;
}
}
return bShowingSingleview;
}
void CPolyView::SetEditMode(BOOL bCanEdit)
{
if (m_psv) {
m_psv->SetEditMode(bCanEdit ? EDITMODE_STUDIO : EDITMODE_BROWSER);
}
}
BOOL CPolyView::RedrawWindow( LPCRECT lpRectUpdate, CRgn* prgnUpdate, UINT flags)
{
BOOL bDidRedraw = FALSE;
CWnd* pwnd;
if (IsShowingMultiview()) {
pwnd = m_pmv;
}
else {
pwnd = m_psv;
}
if (pwnd==NULL || pwnd->m_hWnd==NULL) {
return FALSE;
}
if (!pwnd->IsWindowVisible()) {
return FALSE;
}
bDidRedraw = pwnd->RedrawWindow(lpRectUpdate, prgnUpdate, flags);
return bDidRedraw;
}
void CPolyView::MoveWindow( LPCRECT lpRect, BOOL bRepaint)
{
if (m_pmv!=NULL && m_pmv->m_hWnd!=NULL) {
m_pmv->MoveWindow(lpRect, bRepaint);
}
if (m_psv!=NULL && m_psv->m_hWnd!=NULL) {
m_psv->MoveWindow(lpRect, bRepaint);
}
}
void CPolyView::UpdateWindow( )
{
CWnd* pwnd;
if (IsShowingMultiview()) {
pwnd = m_pmv;
}
else {
pwnd = m_psv;
}
if (pwnd==NULL || pwnd->m_hWnd==NULL) {
return;
}
pwnd->UpdateWindow();
}
void CPolyView::SetFont(CFont& font)
{
if (m_psv != NULL) {
m_psv->SetFont(&font);
}
if (m_pmv != NULL) {
m_pmv->SetFont(&font);
}
}
SCODE CPolyView::RefreshView()
{
if (m_psv==NULL || m_pmv==NULL) {
ASSERT(FALSE);
return E_FAIL;
}
SCODE sc = E_FAIL;
if (IsShowingMultiview()) {
sc = m_pmv->RefreshView();
}
else {
sc = m_psv->RefreshView();
}
return sc;
}
SCODE CPolyView::GetSelectedObject(CString& sPath)
{
if (m_psv==NULL || m_pmv==NULL) {
ASSERT(FALSE);
return E_FAIL;
}
long lPos;
sPath.Empty();
if (IsShowingMultiview()) {
lPos = m_pmv->StartObjectEnumeration(OBJECT_CURRENT);
if (lPos != -1) {
sPath = m_pmv->GetObjectPath(lPos);
}
}
else {
lPos = m_psv->StartObjectEnumeration(OBJECT_CURRENT);
if (lPos != -1) {
sPath = m_psv->GetObjectPath(lPos);
}
}
if (sPath.IsEmpty()) {
return E_FAIL;
}
else {
return S_OK;
}
}
SCODE CPolyView::SelectObjectByPath(BSTR bstrPath)
{
CString sPath;
sPath = bstrPath;
SCODE sc = SelectObjectByPath(sPath);
return sc;
}
SCODE CPolyView::SelectObjectByPath(LPCTSTR szObjectPath)
{
SCODE sc = E_FAIL;
if (IsShowingMultiview()) {
if (m_pmv != NULL) {
sc = m_pmv->SelectObjectByPath(szObjectPath);
}
}
else {
if (m_psv != NULL) {
sc = m_psv->SelectObjectByPath(szObjectPath);
}
}
return sc;
}
void CPolyView::ShowMultiView()
{
m_bShowSingleView = FALSE;
CTitleBar* pTitleBar = m_phmmv->m_pTitleBar;
if ((pTitleBar != NULL) && m_phmmv->InStudioMode()) {
pTitleBar->CheckButton(ID_CMD_SWITCH_VIEW, TRUE);
}
if (IsShowingMultiview()) {
if (m_pmv->IsWindowVisible()) {
if (m_psv != NULL) {
// It should not be possible, but somehow the singleview becomes
// visible when only the multiview should be visible, so hide
// the singleview if this is the case.
m_psv->ShowWindow(SW_HIDE);
ASSERT(FALSE);
}
return;
}
}
SCODE sc = S_OK;
if (IsShowingSingleview()) {
m_psv->ShowWindow(SW_HIDE);
m_psv->UpdateWindow();
}
if (!IsShowingMultiview() && (m_pmv != NULL)) {
m_pmv->NotifyWillShow();;
m_pmv->ShowWindow(SW_SHOW);
}
}
void CPolyView::SetNamespace(LPCTSTR pszNamespace)
{
if (m_psv) {
if (::IsWindow(m_psv->m_hWnd)) {
m_psv->SetNameSpace(pszNamespace);
}
}
if (m_pmv) {
if (::IsWindow(m_pmv->m_hWnd)) {
m_pmv->SetNameSpace(pszNamespace);
m_pmv->ViewClassInstances(_T(""));
}
}
}
void CPolyView::ShowSingleView()
{
m_bShowSingleView = TRUE;
CTitleBar* pTitleBar = m_phmmv->m_pTitleBar;
if ((pTitleBar != NULL) && m_phmmv->InStudioMode()) {
pTitleBar->CheckButton(ID_CMD_SWITCH_VIEW, FALSE);
}
if (IsShowingSingleview()) {
return;
}
SCODE sc = S_OK;
if (m_bDelaySvContextRestore) {
sc = m_psv->RestoreContext(m_lContextHandleSvDelayed);
m_bDelaySvContextRestore = FALSE;
}
if (IsShowingMultiview()) {
m_pmv->ShowWindow(SW_HIDE);
m_pmv->UpdateWindow();
}
if (!IsShowingSingleview() && (m_psv != NULL)) {
m_psv->ShowWindow(SW_SHOW);
m_psv->UpdateWindow();
}
}
SCODE CPolyView::CreateInstance()
{
SCODE sc = E_FAIL;
if (m_psv != NULL) {
sc = m_psv->CreateInstanceOfCurrentClass();
}
return sc;
}
SCODE CPolyView::DeleteInstance()
{
SCODE sc = E_FAIL;
CString sPath;
long lPos;
if (IsShowingMultiview()) {
if (m_pmv != NULL) {
lPos = m_pmv->StartObjectEnumeration(OBJECT_CURRENT);
if (lPos != -1) {
sPath = m_pmv->GetObjectPath(lPos);
}
sc = m_pmv->DeleteInstance();
if (SUCCEEDED(sc) && (lPos!=-1) && m_psv!=NULL) {
m_psv->ExternInstanceDeleted(sPath);
}
}
}
else {
if (m_psv != NULL) {
lPos = m_psv->StartObjectEnumeration(OBJECT_CURRENT);
if (lPos != -1) {
sPath = m_psv->GetObjectPath(lPos);
}
sc = m_psv->DeleteInstance();
if (SUCCEEDED(sc) && (lPos!=-1) && m_pmv!=NULL) {
m_pmv->ExternInstanceDeleted(sPath);
}
}
}
return sc;
}
void CPolyView::NotifyInstanceCreated(LPCTSTR szObjectPath)
{
if (IsShowingMultiview()) {
if (m_psv != NULL) {
m_psv->ExternInstanceCreated(szObjectPath);
}
}
else {
if (m_pmv != NULL) {
m_pmv->ExternInstanceCreated(szObjectPath);
}
}
}
void CPolyView::NotifyInstanceDeleted(LPCTSTR szObjectPath)
{
if (IsShowingMultiview()) {
if (m_psv != NULL) {
m_psv->ExternInstanceDeleted(szObjectPath);
}
}
else {
if (m_pmv != NULL) {
m_pmv->ExternInstanceDeleted(szObjectPath);
}
}
}
BOOL CPolyView::QueryCanCreateInstance()
{
BOOL bCanCreateInstance = FALSE;
if (IsShowingMultiview()) {
if (m_pmv != NULL) {
bCanCreateInstance = m_pmv->QueryCanCreateInstance();
}
}
else {
if (m_psv != NULL) {
bCanCreateInstance = m_psv->QueryCanCreateInstance();
}
}
return bCanCreateInstance;
}
BOOL CPolyView::QueryCanDeleteInstance()
{
BOOL bCanDeleteInstance = FALSE;
if (IsShowingMultiview()) {
if (m_pmv != NULL) {
bCanDeleteInstance = m_pmv->QueryCanDeleteInstance();
}
}
else {
if (m_psv != NULL) {
bCanDeleteInstance = m_psv->QueryCanDeleteInstance();
}
}
return bCanDeleteInstance;
}
BOOL CPolyView::QueryNeedsSave()
{
BOOL bNeedsSave = FALSE;
if (IsShowingMultiview()) {
if (m_pmv != NULL) {
bNeedsSave = m_pmv->QueryNeedsSave();
}
}
else {
if (m_psv != NULL) {
bNeedsSave = m_psv->QueryNeedsSave();
}
}
return bNeedsSave;
}
BOOL CPolyView::QueryObjectSelected()
{
BOOL bObjectSelected = FALSE;
if (IsShowingMultiview()) {
if (m_pmv != NULL) {
bObjectSelected = m_pmv->QueryObjectSelected();
}
}
else {
if (m_psv != NULL) {
bObjectSelected = m_psv->QueryObjectSelected();
}
}
return bObjectSelected;
}
CString CPolyView::GetObjectPath(long lPosition)
{
CString sPath;
BOOL bObjectSelected = FALSE;
if (IsShowingMultiview()) {
if (m_pmv != NULL) {
sPath = m_pmv->GetObjectPath(lPosition);
if (::IsEmptyString(sPath)) {
// Normalize the path if it is only white space.
sPath.Empty();
}
}
}
else {
if (m_psv != NULL) {
sPath = m_psv->GetObjectPath(lPosition);
}
}
return sPath;
}
long CPolyView::StartViewEnumeration(long lWhere)
{
long lPosition = -1;
if (IsShowingMultiview()) {
if (m_pmv != NULL) {
lPosition = m_pmv->StartViewEnumeration(lWhere);
}
}
else {
if (m_psv != NULL) {
lPosition = m_psv->StartViewEnumeration(lWhere);
}
}
return lPosition;
}
SCODE CPolyView::GetTitle(BSTR* pszTitle, LPDISPATCH* lpPictureDisp)
{
SCODE sc = E_FAIL;
if (IsShowingMultiview()) {
if (m_pmv != NULL) {
sc = m_pmv->GetTitle(pszTitle, lpPictureDisp);
}
}
else {
if (m_psv != NULL) {
sc = m_psv->GetTitle(pszTitle, lpPictureDisp);
}
}
return sc;
}
CString CPolyView::GetViewTitle(long lPosition)
{
CString sViewTitle;
if (IsShowingMultiview()) {
if (m_pmv != NULL) {
sViewTitle = m_pmv->GetViewTitle(lPosition);
}
}
else {
if (m_psv != NULL) {
sViewTitle = m_psv->GetViewTitle(lPosition);
}
}
return sViewTitle;
}
long CPolyView::NextViewTitle(long lPosition, BSTR* pbstrTitle)
{
if (IsShowingMultiview()) {
if (m_pmv != NULL) {
lPosition = m_pmv->NextViewTitle(lPosition, pbstrTitle);
}
}
else {
if (m_psv != NULL) {
lPosition = m_psv->NextViewTitle(lPosition, pbstrTitle);
}
}
return lPosition;
}
long CPolyView::PrevViewTitle(long lPosition, BSTR* pbstrTitle)
{
if (IsShowingMultiview()) {
if (m_pmv != NULL) {
lPosition = m_pmv->PrevViewTitle(lPosition, pbstrTitle);
}
else {
lPosition = -1;
}
}
else {
if (m_psv != NULL) {
lPosition = m_psv->PrevViewTitle(lPosition, pbstrTitle);
}
else {
lPosition = -1;
}
}
return lPosition;
}
SCODE CPolyView::SelectView(long lPosition)
{
SCODE sc = E_FAIL;
if (IsShowingMultiview()) {
if (m_pmv != NULL) {
sc = m_pmv->SelectView(lPosition);
}
}
else {
if (m_psv != NULL) {
sc = m_psv->SelectView(lPosition);
}
}
return sc;
}
long CPolyView::StartObjectEnumeration(long lWhere)
{
long lPosition = -1;
if (IsShowingMultiview()) {
if (m_pmv != NULL) {
lPosition = m_pmv->StartObjectEnumeration(lWhere);
}
}
else {
if (m_psv != NULL) {
lPosition = m_psv->StartObjectEnumeration(lWhere);
}
}
return lPosition;
}
CString CPolyView::GetObjectTitle(long lPos)
{
CString sObjectTitle;
if (IsShowingMultiview()) {
if (m_pmv != NULL) {
sObjectTitle = m_pmv->GetObjectTitle(lPos);
}
}
else {
if (m_psv != NULL) {
sObjectTitle = m_psv->GetObjectTitle(lPos);
}
}
return sObjectTitle;
}
SCODE CPolyView::SaveData()
{
SCODE sc = E_FAIL;
if (IsShowingMultiview()) {
if (m_pmv != NULL) {
sc = m_pmv->SaveData();
}
}
else {
if (m_psv != NULL) {
sc = m_psv->SaveData();
}
}
return sc;
}
void CPolyView::SetPropertyFilters(long lPropFilters)
{
if (m_pmv != NULL) {
m_pmv->SetPropertyFilter(lPropFilters);
}
if (m_psv != NULL) {
m_psv->SetPropertyFilter(lPropFilters);
}
}
//************************************************************
// CPolyView::SetStudioModeEnabled
//
// Set the StudioMode enabled flag.
//
// Parameters:
// [in] BOOL bInStudioMode
// TRUE if the view should be the StudioMode view. This
// corresponds to the mode where the user is allowed to
// create and delete properties, etc.
//
// Returns:
// Nothing.
//
//************************************************************
void CPolyView::SetStudioModeEnabled(BOOL bInStudioMode)
{
if (m_psv != NULL) {
m_psv->SetEditMode(bInStudioMode ? EDITMODE_STUDIO : EDITMODE_BROWSER);
}
if (m_pmv != NULL) {
m_pmv->SetEditMode(bInStudioMode ? EDITMODE_STUDIO : EDITMODE_BROWSER);
}
m_bInStudioMode = bInStudioMode;
}
CWnd* CPolyView::SetFocus()
{
CWnd* pwndPrev = NULL;
if (IsShowingMultiview()) {
if (m_pmv != NULL) {
pwndPrev = m_pmv->SetFocus();
}
}
else if (m_psv != NULL) {
pwndPrev = m_psv->SetFocus();
}
return pwndPrev;
}