You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
484 lines
14 KiB
484 lines
14 KiB
/////////////////////////////////////////////////////////////////////////////
|
|
//
|
|
// Copyright (c) 1996-2002 Microsoft Corporation
|
|
//
|
|
// Module Name:
|
|
// MainFrm.cpp
|
|
//
|
|
// Abstract:
|
|
// Implementation of the CMainFrame class.
|
|
//
|
|
// Author:
|
|
// David Potter (davidp) May 1, 1996
|
|
//
|
|
// Revision History:
|
|
//
|
|
// Notes:
|
|
//
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
|
|
#include "stdafx.h"
|
|
#include "CluAdmin.h"
|
|
#include "ConstDef.h"
|
|
#include "MainFrm.h"
|
|
#include "TraceTag.h"
|
|
|
|
#ifdef _DEBUG
|
|
#define new DEBUG_NEW
|
|
#undef THIS_FILE
|
|
static char THIS_FILE[] = __FILE__;
|
|
#endif
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// Global Variables
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
|
|
#ifdef _DEBUG
|
|
CTraceTag g_tagMainFrame(TEXT("UI"), TEXT("MAIN FRAME"), 0);
|
|
#endif
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// CMainFrame
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
|
|
IMPLEMENT_DYNAMIC(CMainFrame, CMDIFrameWnd)
|
|
|
|
static UINT indicators[] =
|
|
{
|
|
ID_SEPARATOR, // status line indicator
|
|
ID_INDICATOR_CAPS,
|
|
ID_INDICATOR_NUM,
|
|
ID_INDICATOR_SCRL,
|
|
};
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// Message Maps
|
|
|
|
BEGIN_MESSAGE_MAP(CMainFrame, CMDIFrameWnd)
|
|
//{{AFX_MSG_MAP(CMainFrame)
|
|
ON_WM_CREATE()
|
|
ON_WM_CLOSE()
|
|
//}}AFX_MSG_MAP
|
|
// Global help commands
|
|
ON_COMMAND(ID_HELP_FINDER, OnHelp)
|
|
ON_COMMAND(ID_HELP, OnHelp)
|
|
ON_COMMAND(ID_CONTEXT_HELP, OnHelp)
|
|
ON_COMMAND(ID_DEFAULT_HELP, OnHelp)
|
|
ON_MESSAGE(WM_CAM_RESTORE_DESKTOP, OnRestoreDesktop)
|
|
ON_MESSAGE(WM_CAM_CLUSTER_NOTIFY, OnClusterNotify)
|
|
END_MESSAGE_MAP()
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
//++
|
|
//
|
|
// CMainFrame::CMainFrame
|
|
//
|
|
// Routine Description:
|
|
// Default construtor.
|
|
//
|
|
// Arguments:
|
|
// None.
|
|
//
|
|
// Return Value:
|
|
// None.
|
|
//
|
|
//--
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
CMainFrame::CMainFrame(void)
|
|
{
|
|
} //*** CMainFrame::CMainFrame()
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
//++
|
|
//
|
|
// CMainFrame::OnCreate
|
|
//
|
|
// Routine Description:
|
|
// Handler for the WM_CREATE message. Create the contents of the frame,
|
|
// including toolbars, status bars, etc.
|
|
//
|
|
// Arguments:
|
|
// lpCreateStruct Pointer to a CREATESTRUCT.
|
|
//
|
|
// Return Value:
|
|
// -1 Failed to create.
|
|
// 0 Created successfully.
|
|
//
|
|
//--
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
|
|
{
|
|
int nCreateStatus = -1;
|
|
|
|
if (CMDIFrameWnd::OnCreate(lpCreateStruct) == -1)
|
|
{
|
|
goto Cleanup;
|
|
}
|
|
|
|
if (!m_wndToolBar.Create(this) ||
|
|
!m_wndToolBar.LoadToolBar(IDR_MAINFRAME))
|
|
{
|
|
Trace(g_tagMainFrame, _T("Failed to create toolbar"));
|
|
goto Cleanup; // fail to create
|
|
}
|
|
|
|
if (!m_wndStatusBar.Create(this)
|
|
|| !m_wndStatusBar.SetIndicators(
|
|
indicators,
|
|
sizeof(indicators)/sizeof(UINT)
|
|
))
|
|
{
|
|
Trace(g_tagMainFrame, _T("Failed to create status bar"));
|
|
goto Cleanup; // fail to create
|
|
}
|
|
|
|
// TODO: Remove this if you don't want tool tips or a resizeable toolbar
|
|
m_wndToolBar.SetBarStyle(
|
|
m_wndToolBar.GetBarStyle()
|
|
| CBRS_TOOLTIPS
|
|
| CBRS_FLYBY
|
|
| CBRS_SIZE_DYNAMIC
|
|
);
|
|
|
|
// TODO: Delete these three lines if you don't want the toolbar to
|
|
// be dockable
|
|
m_wndToolBar.EnableDocking(CBRS_ALIGN_ANY);
|
|
EnableDocking(CBRS_ALIGN_ANY);
|
|
DockControlBar(&m_wndToolBar);
|
|
|
|
// Hide the toolbar and/or status bar is that is the current setting.
|
|
{
|
|
BOOL bShowToolBar;
|
|
BOOL bShowStatusBar;
|
|
|
|
// Read the settings from the user's profile.
|
|
bShowToolBar = AfxGetApp()->GetProfileInt(
|
|
REGPARAM_SETTINGS,
|
|
REGPARAM_SHOW_TOOL_BAR,
|
|
TRUE
|
|
);
|
|
bShowStatusBar = AfxGetApp()->GetProfileInt(
|
|
REGPARAM_SETTINGS,
|
|
REGPARAM_SHOW_STATUS_BAR,
|
|
TRUE
|
|
);
|
|
|
|
// Show or hide the toolbar and status bar.
|
|
m_wndToolBar.ShowWindow(bShowToolBar);
|
|
m_wndStatusBar.ShowWindow(bShowStatusBar);
|
|
} // Hide the toolbar and/or status bar is that is the current setting
|
|
|
|
nCreateStatus = 0;
|
|
|
|
Cleanup:
|
|
|
|
return nCreateStatus;
|
|
|
|
} //*** CMainFrame::OnCreate()
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
//++
|
|
//
|
|
// CMainFrame::GetMessageString
|
|
//
|
|
// Routine Description:
|
|
// Get a string for a command ID.
|
|
//
|
|
// Arguments:
|
|
// nID [IN] Command ID for which a string should be returned.
|
|
// rMessage [OUT] String in which to return the message.
|
|
//
|
|
// Return Value:
|
|
// None.
|
|
//
|
|
//--
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
void CMainFrame::GetMessageString(UINT nID, CString& rMessage) const
|
|
{
|
|
CFrameWnd * pframe;
|
|
|
|
// Pass off to the active MDI child frame window, if there is one.
|
|
pframe = MDIGetActive();
|
|
if (pframe == NULL)
|
|
{
|
|
CMDIFrameWnd::GetMessageString(nID, rMessage);
|
|
}
|
|
else
|
|
{
|
|
pframe->GetMessageString(nID, rMessage);
|
|
}
|
|
|
|
} //*** CMainFrame::GetMessageString()
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// CMainFrame diagnostics
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
|
|
#ifdef _DEBUG
|
|
void CMainFrame::AssertValid(void) const
|
|
{
|
|
CMDIFrameWnd::AssertValid();
|
|
|
|
} //*** CMainFrame::AssertValid()
|
|
|
|
void CMainFrame::Dump(CDumpContext& dc) const
|
|
{
|
|
CMDIFrameWnd::Dump(dc);
|
|
|
|
} //*** CMainFrame::Dump()
|
|
|
|
#endif //_DEBUG
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
//++
|
|
//
|
|
// CMainFrame::OnClusterNotify
|
|
//
|
|
// Routine Description:
|
|
// Handler for the WM_CAM_CLUSTER_NOTIFY message.
|
|
// Processes cluster notifications.
|
|
//
|
|
// Arguments:
|
|
// None.
|
|
//
|
|
// Return Value:
|
|
// Value returned from the application method.
|
|
//
|
|
//--
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
void CMainFrame::OnClose(void)
|
|
{
|
|
// Save the current window position and size.
|
|
{
|
|
WINDOWPLACEMENT wp;
|
|
wp.length = sizeof wp;
|
|
if (GetWindowPlacement(&wp))
|
|
{
|
|
wp.flags = 0;
|
|
if (IsZoomed())
|
|
{
|
|
wp.flags |= WPF_RESTORETOMAXIMIZED;
|
|
}
|
|
if (IsIconic())
|
|
{
|
|
wp.showCmd = SW_SHOWMINNOACTIVE;
|
|
}
|
|
|
|
// and write it to the .INI file
|
|
WriteWindowPlacement(&wp, REGPARAM_SETTINGS, 0);
|
|
} // if: window placement retrieved successfully
|
|
} // Save the current window position and size
|
|
|
|
// Save the current connections.
|
|
GetClusterAdminApp()->SaveConnections();
|
|
|
|
// Save the current toolbar and status bar show state.
|
|
AfxGetApp()->WriteProfileInt(
|
|
REGPARAM_SETTINGS,
|
|
REGPARAM_SHOW_TOOL_BAR,
|
|
((m_wndToolBar.GetStyle() & WS_VISIBLE) ? TRUE : FALSE)
|
|
);
|
|
AfxGetApp()->WriteProfileInt(
|
|
REGPARAM_SETTINGS,
|
|
REGPARAM_SHOW_STATUS_BAR,
|
|
((m_wndStatusBar.GetStyle() & WS_VISIBLE) ? TRUE : FALSE)
|
|
);
|
|
|
|
CMDIFrameWnd::OnClose();
|
|
|
|
} //*** CMainFrame::OnClose()
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
//++
|
|
//
|
|
// CMainFrame::OnRestoreDesktop
|
|
//
|
|
// Routine Description:
|
|
// Handler for the WM_CAM_RESTORE_DESKTOP message.
|
|
// Restores the desktop from the saved parameters.
|
|
//
|
|
// Arguments:
|
|
// wparam 1st parameter.
|
|
// lparam 2nd parameter.
|
|
//
|
|
// Return Value:
|
|
// Value returned from the application method.
|
|
//
|
|
//--
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
LRESULT CMainFrame::OnRestoreDesktop(WPARAM wparam, LPARAM lparam)
|
|
{
|
|
// Call this method on the application.
|
|
return GetClusterAdminApp()->OnRestoreDesktop(wparam, lparam);
|
|
|
|
} //*** CMainFrame::OnRestoreDesktop()
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
//++
|
|
//
|
|
// CMainFrame::OnClusterNotify
|
|
//
|
|
// Routine Description:
|
|
// Handler for the WM_CAM_CLUSTER_NOTIFY message.
|
|
// Processes cluster notifications.
|
|
//
|
|
// Arguments:
|
|
// wparam 1st parameter.
|
|
// lparam 2nd parameter.
|
|
//
|
|
// Return Value:
|
|
// Value returned from the application method.
|
|
//
|
|
//--
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
LRESULT CMainFrame::OnClusterNotify(WPARAM wparam, LPARAM lparam)
|
|
{
|
|
CClusterAdminApp * papp = GetClusterAdminApp();
|
|
|
|
// Call this method on the application.
|
|
return papp->OnClusterNotify(wparam, lparam);
|
|
|
|
} //*** CMainFrame::OnClusterNotify()
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
//++
|
|
//
|
|
// CMainFrame::OnHelp
|
|
//
|
|
// Routine Description:
|
|
// Handler for the IDM_HELP_FINDER menu command.
|
|
//
|
|
// Arguments:
|
|
// None.
|
|
//
|
|
// Return Value:
|
|
// None.
|
|
//
|
|
//--
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
void CMainFrame::OnHelp(void)
|
|
{
|
|
HtmlHelpW( m_hWnd, _T("MSCSConcepts.chm"), HH_DISPLAY_TOPIC, 0L );
|
|
|
|
} //*** CMainFrame::OnHelp()
|
|
|
|
|
|
//*************************************************************************//
|
|
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// Helpers for saving/restoring window state
|
|
|
|
static TCHAR g_szFormat[] = _T("%u,%u,%d,%d,%d,%d,%d,%d,%d,%d");
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
//++
|
|
//
|
|
// ReadWindowPlacement
|
|
//
|
|
// Routine Description:
|
|
// Read window placement parameters.
|
|
//
|
|
// Arguments:
|
|
// pwp [OUT] WINDOWPLACEMENT structure to fill.
|
|
// pszSection [IN] Section name under which to read data.
|
|
// nValueNum [IN] Number of the value to read.
|
|
//
|
|
// Return Value:
|
|
// TRUE Parameters read.
|
|
// FALSE Parameters not read.
|
|
//
|
|
//--
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
BOOL ReadWindowPlacement(
|
|
OUT LPWINDOWPLACEMENT pwp,
|
|
IN LPCTSTR pszSection,
|
|
IN DWORD nValueNum
|
|
)
|
|
{
|
|
CString strBuffer;
|
|
CString strValueName;
|
|
BOOL bParametersRead = FALSE;
|
|
|
|
if (nValueNum <= 1)
|
|
{
|
|
strValueName = REGPARAM_WINDOW_POS;
|
|
}
|
|
else
|
|
{
|
|
strValueName.Format(REGPARAM_WINDOW_POS _T("-%d"), nValueNum);
|
|
}
|
|
|
|
strBuffer = AfxGetApp()->GetProfileString(pszSection, strValueName);
|
|
if (strBuffer.IsEmpty())
|
|
{
|
|
goto Cleanup;
|
|
}
|
|
|
|
WINDOWPLACEMENT wp;
|
|
int nRead = _stscanf(strBuffer, g_szFormat,
|
|
&wp.flags, &wp.showCmd,
|
|
&wp.ptMinPosition.x, &wp.ptMinPosition.y,
|
|
&wp.ptMaxPosition.x, &wp.ptMaxPosition.y,
|
|
&wp.rcNormalPosition.left, &wp.rcNormalPosition.top,
|
|
&wp.rcNormalPosition.right, &wp.rcNormalPosition.bottom);
|
|
|
|
if (nRead != 10)
|
|
{
|
|
goto Cleanup;
|
|
}
|
|
|
|
wp.length = sizeof wp;
|
|
*pwp = wp;
|
|
bParametersRead = TRUE;
|
|
|
|
Cleanup:
|
|
|
|
return bParametersRead;
|
|
|
|
} //*** ReadWindowPlacement()
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
//++
|
|
//
|
|
// WriteWindowPlacement
|
|
//
|
|
// Routine Description:
|
|
// Write window placement parameters.
|
|
//
|
|
// Arguments:
|
|
// pwp [IN] WINDOWPLACEMENT structure to save.
|
|
// pszSection [IN] Section name under which to write data.
|
|
// nValueNum [IN] Number of the value to write.
|
|
//
|
|
// Return Value:
|
|
// TRUE Parameters read.
|
|
// FALSE Parameters not read.
|
|
//
|
|
//--
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
void WriteWindowPlacement(
|
|
IN const LPWINDOWPLACEMENT pwp,
|
|
IN LPCTSTR pszSection,
|
|
IN DWORD nValueNum
|
|
)
|
|
{
|
|
TCHAR szBuffer[sizeof("-32767")*8 + sizeof("65535")*2];
|
|
CString strBuffer;
|
|
CString strValueName;
|
|
HRESULT hr;
|
|
|
|
if (nValueNum <= 1)
|
|
strValueName = REGPARAM_WINDOW_POS;
|
|
else
|
|
strValueName.Format(REGPARAM_WINDOW_POS _T("-%d"), nValueNum);
|
|
|
|
hr = StringCchPrintf(szBuffer, RTL_NUMBER_OF( szBuffer ), g_szFormat,
|
|
pwp->flags, pwp->showCmd,
|
|
pwp->ptMinPosition.x, pwp->ptMinPosition.y,
|
|
pwp->ptMaxPosition.x, pwp->ptMaxPosition.y,
|
|
pwp->rcNormalPosition.left, pwp->rcNormalPosition.top,
|
|
pwp->rcNormalPosition.right, pwp->rcNormalPosition.bottom);
|
|
AfxGetApp()->WriteProfileString(pszSection, strValueName, szBuffer);
|
|
|
|
} //*** WriteWindowPlacement()
|