Leaked source code of windows server 2003
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.
 
 
 
 
 
 

550 lines
15 KiB

// mainfrm.cpp : implementation of the CMainFrame class
//
// Copyright (C) 1992-1999 Microsoft Corporation
// All rights reserved.
#include "stdafx.h"
#include "wordpad.h"
#include "mainfrm.h"
#include "wordpdoc.h"
#include "wordpvw.h"
#include "strings.h"
#include "colorlis.h"
#include "filedlg.h"
#ifdef _DEBUG
#undef THIS_FILE
static char BASED_CODE THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CMainFrame
IMPLEMENT_DYNCREATE(CMainFrame, CFrameWnd)
BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd)
//{{AFX_MSG_MAP(CMainFrame)
ON_WM_CREATE()
ON_WM_SYSCOLORCHANGE()
ON_WM_SIZE()
ON_WM_MOVE()
ON_COMMAND(ID_HELP, OnHelpFinder)
ON_WM_DROPFILES()
ON_COMMAND(ID_CHAR_COLOR, OnCharColor)
ON_COMMAND(ID_PEN_TOGGLE, OnPenToggle)
ON_WM_FONTCHANGE()
ON_WM_QUERYNEWPALETTE()
ON_WM_PALETTECHANGED()
ON_WM_DEVMODECHANGE()
ON_COMMAND(ID_HELP_INDEX, OnHelpFinder)
//}}AFX_MSG_MAP
// Global help commands
// ON_COMMAND(ID_CONTEXT_HELP, CFrameWnd::OnContextHelp)
ON_COMMAND(ID_DEFAULT_HELP, OnHelpFinder)
ON_UPDATE_COMMAND_UI(ID_VIEW_FORMATBAR, OnUpdateControlBarMenu)
ON_UPDATE_COMMAND_UI(ID_VIEW_RULER, OnUpdateControlBarMenu)
ON_MESSAGE(WPM_BARSTATE, OnBarState)
ON_REGISTERED_MESSAGE(CWordPadApp::m_nOpenMsg, OnOpenMsg)
ON_COMMAND_EX(ID_VIEW_STATUS_BAR, OnBarCheck)
ON_COMMAND_EX(ID_VIEW_TOOLBAR, OnBarCheck)
ON_COMMAND_EX(ID_VIEW_FORMATBAR, OnBarCheck)
ON_COMMAND_EX(ID_VIEW_RULER, OnBarCheck)
ON_REGISTERED_MESSAGE(CWordPadApp::m_nOLEHelpMsg, OnOLEHelpMsg)
ON_MESSAGE_VOID(WM_IDLEUPDATECMDUI, OnIdleUpdateCmdUI)
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// arrays of IDs used to initialize control bars
// toolbar buttons - IDs are command buttons
static UINT BASED_CODE toolbar[] =
{
// same order as in the bitmap 'toolbar.bmp'
// (int nBitmap, int nCommand, BYTE byteState, BYTE byteStyle, DWORD dw, int nString)
ID_FILE_NEW,
ID_FILE_OPEN,
ID_FILE_SAVE,
ID_SEPARATOR,
ID_FILE_PRINT_DIRECT,
ID_FILE_PRINT_PREVIEW,
ID_SEPARATOR,
ID_EDIT_FIND,
ID_SEPARATOR,
ID_EDIT_CUT,
ID_EDIT_COPY,
ID_EDIT_PASTE,
ID_EDIT_UNDO,
ID_SEPARATOR,
ID_INSERT_DATE_TIME,
ID_SEPARATOR,
ID_PEN_TOGGLE,
ID_PEN_PERIOD,
ID_PEN_SPACE,
ID_PEN_BACKSPACE,
ID_PEN_NEWLINE,
ID_PEN_LENS
};
#define NUM_PEN_ITEMS 7
#define NUM_PEN_TOGGLE 5
static UINT BASED_CODE format[] =
{
// same order as in the bitmap 'format.bmp'
ID_SEPARATOR, // font name combo box
ID_SEPARATOR,
ID_SEPARATOR, // font size combo box
ID_SEPARATOR,
ID_SEPARATOR, // font script combo box
ID_SEPARATOR,
ID_CHAR_BOLD,
ID_CHAR_ITALIC,
ID_CHAR_UNDERLINE,
ID_CHAR_COLOR,
ID_SEPARATOR,
ID_PARA_LEFT,
ID_PARA_CENTER,
ID_PARA_RIGHT,
ID_SEPARATOR,
ID_INSERT_BULLET,
};
static UINT BASED_CODE indicators[] =
{
ID_SEPARATOR, // status line indicator
ID_INDICATOR_CAPS,
ID_INDICATOR_NUM,
};
/////////////////////////////////////////////////////////////////////////////
// CMainFrame construction/destruction
CMainFrame::CMainFrame()
{
m_hIconDoc = theApp.LoadIcon(IDI_ICON_DOC);
m_hIconText = theApp.LoadIcon(IDI_ICON_TEXT);
m_hIconWrite = theApp.LoadIcon(IDI_ICON_WRITE);
m_inupdate = false;
m_reset = false;
}
CMainFrame::~CMainFrame()
{
}
BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs)
{
WNDCLASS wndcls;
BOOL bRes = CFrameWnd::PreCreateWindow(cs);
HINSTANCE hInst = AfxGetInstanceHandle();
// see if the class already exists
if (!::GetClassInfo(hInst, szWordPadClass, &wndcls))
{
// get default stuff
::GetClassInfo(hInst, cs.lpszClass, &wndcls);
wndcls.style &= ~(CS_HREDRAW|CS_VREDRAW);
// register a new class
wndcls.lpszClassName = szWordPadClass;
wndcls.hIcon = ::LoadIcon(hInst, MAKEINTRESOURCE(IDR_MAINFRAME));
ASSERT(wndcls.hIcon != NULL);
if (!AfxRegisterClass(&wndcls))
AfxThrowResourceException();
}
cs.lpszClass = szWordPadClass;
CRect rect = theApp.m_rectInitialFrame;
if (rect.Width() > 0 && rect.Height() > 0)
{
// make sure window will be visible
CDisplayIC dc;
CRect rectDisplay(0, 0, dc.GetDeviceCaps(HORZRES),
dc.GetDeviceCaps(VERTRES));
if (rectDisplay.PtInRect(rect.TopLeft()) &&
rectDisplay.PtInRect(rect.BottomRight()))
{
cs.x = rect.left;
cs.y = rect.top;
cs.cx = rect.Width();
cs.cy = rect.Height();
}
}
return bRes;
}
int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CFrameWnd::OnCreate(lpCreateStruct) == -1)
return -1;
if (!CreateToolBar())
return -1;
if (!CreateFormatBar())
return -1;
if (!CreateStatusBar())
return -1;
EnableDocking(CBRS_ALIGN_ANY);
if (!CreateRulerBar())
return -1;
m_wndToolBar.EnableDocking(CBRS_ALIGN_ANY);
m_wndFormatBar.EnableDocking(CBRS_ALIGN_TOP|CBRS_ALIGN_BOTTOM);
DockControlBar(&m_wndToolBar);
DockControlBar(&m_wndFormatBar);
CWnd* pView = GetDlgItem(AFX_IDW_PANE_FIRST);
if (pView != NULL)
{
pView->SetWindowPos(&wndBottom, 0, 0, 0, 0,
SWP_NOSIZE|SWP_NOMOVE|SWP_NOACTIVATE);
}
return 0;
}
BOOL CMainFrame::CreateToolBar()
{
int nPen = GetSystemMetrics(SM_PENWINDOWS) ? NUM_PEN_TOGGLE :
NUM_PEN_ITEMS;
UINT nID = theApp.m_bLargeIcons ? IDR_MAINFRAME1_BIG :
IDR_MAINFRAME1;
// If we have Large Icons then we should specify the correct Image size for
// the toolbar before calling LoadBitmap because the number of buttons in the
// toolbar calculated inside MFC (AddReplaceBitmap in BarTool.cpp) as Bitmap width
// divided by ImageSize.cx. and this conflict with mirroring support if you have
// incorrect number of buttons .
if (theApp.m_bLargeIcons)
m_wndToolBar.SetSizes(CSize(31,30), CSize(24,24));
if (!m_wndToolBar.Create(this,
WS_CHILD|WS_VISIBLE|CBRS_TOP|CBRS_TOOLTIPS|CBRS_FLYBY|CBRS_SIZE_DYNAMIC)||
!m_wndToolBar.LoadBitmap(nID) ||
!m_wndToolBar.SetButtons(toolbar, sizeof(toolbar)/sizeof(UINT) - nPen))
{
TRACE0("Failed to create toolbar\n");
return FALSE; // fail to create
}
if (theApp.m_bLargeIcons)
m_wndToolBar.SetSizes(CSize(31,30), CSize(24,24));
else
m_wndToolBar.SetSizes(CSize(23,22), CSize(16,16));
CString str;
str.LoadString(IDS_TITLE_TOOLBAR);
m_wndToolBar.SetWindowText(str);
return TRUE;
}
BOOL CMainFrame::CreateFormatBar()
{
UINT nID = theApp.m_bLargeIcons ? IDB_FORMATBAR_BIG : IDB_FORMATBAR;
// If we have Large Icons then we should specify the correct Image size for
// the toolbar before calling LoadBitmap because the number of buttons in the
// toolbar calculated inside MFC (AddReplaceBitmap in BarTool.cpp) as Bitmap width
// divided by ImageSize.cx. and this conflict with mirroring support if you have
// incorrect number of buttons .
if (theApp.m_bLargeIcons)
m_wndFormatBar.SetSizes(CSize(31,30), CSize(24,24));
if (!m_wndFormatBar.Create(this,
WS_CHILD|WS_VISIBLE|CBRS_TOP|CBRS_TOOLTIPS|CBRS_FLYBY|CBRS_HIDE_INPLACE|CBRS_SIZE_DYNAMIC,
ID_VIEW_FORMATBAR) ||
!m_wndFormatBar.LoadBitmap(nID) ||
!m_wndFormatBar.SetButtons(format, sizeof(format)/sizeof(UINT)))
{
TRACE0("Failed to create FormatBar\n");
return FALSE; // fail to create
}
if (theApp.m_bLargeIcons)
m_wndFormatBar.SetSizes(CSize(31,30), CSize(24,24));
else
m_wndFormatBar.SetSizes(CSize(23,22), CSize(16,16));
CString str;
str.LoadString(IDS_TITLE_FORMATBAR);
m_wndFormatBar.SetWindowText(str);
m_wndFormatBar.PositionCombos();
return TRUE;
}
BOOL CMainFrame::CreateRulerBar()
{
if (!m_wndRulerBar.Create(this,
WS_CHILD|WS_VISIBLE|CBRS_TOP|CBRS_HIDE_INPLACE, ID_VIEW_RULER))
{
TRACE0("Failed to create ruler\n");
return FALSE; // fail to create
}
return TRUE;
}
BOOL CMainFrame::CreateStatusBar()
{
if (!m_wndStatusBar.Create(this) ||
!m_wndStatusBar.SetIndicators(indicators,
sizeof(indicators)/sizeof(UINT)))
{
TRACE0("Failed to create status bar\n");
return FALSE; // fail to create
}
return TRUE;
}
/////////////////////////////////////////////////////////////////////////////
// CMainFrame Operations
HICON CMainFrame::GetIcon(int nDocType)
{
switch (nDocType)
{
case RD_WINWORD6:
case RD_WORDPAD:
case RD_EMBEDDED:
case RD_RICHTEXT:
return m_hIconDoc;
case RD_TEXT:
case RD_OEMTEXT:
return m_hIconText;
case RD_WRITE:
return m_hIconWrite;
}
return m_hIconDoc;
}
/////////////////////////////////////////////////////////////////////////////
// CMainFrame diagnostics
#ifdef _DEBUG
void CMainFrame::AssertValid() const
{
CFrameWnd::AssertValid();
}
void CMainFrame::Dump(CDumpContext& dc) const
{
CFrameWnd::Dump(dc);
}
#endif //_DEBUG
/////////////////////////////////////////////////////////////////////////////
// CMainFrame message handlers
void CMainFrame::OnFontChange()
{
m_wndFormatBar.SendMessage(CWordPadApp::m_nPrinterChangedMsg);
}
void CMainFrame::OnDevModeChange(LPTSTR lpDeviceName)
{
theApp.NotifyPrinterChanged();
CFrameWnd::OnDevModeChange(lpDeviceName); //sends message to descendants
}
void CMainFrame::OnSysColorChange()
{
CFrameWnd::OnSysColorChange();
m_wndRulerBar.SendMessage(WM_SYSCOLORCHANGE);
}
void CMainFrame::ActivateFrame(int nCmdShow)
{
WINDOWPLACEMENT wp ;
wp.length = sizeof(WINDOWPLACEMENT) ;
if (GetWindowPlacement(&wp))
{
memcpy(&wp.rcNormalPosition, &theApp.m_rectInitialFrame, sizeof(RECT)) ;
if (-1 != nCmdShow)
wp.showCmd = nCmdShow;
SetWindowPlacement(&wp) ;
}
CFrameWnd::ActivateFrame(nCmdShow);
// make sure and display the toolbar, ruler, etc while loading a document.
OnIdleUpdateCmdUI();
UpdateWindow();
}
void CMainFrame::OnSize(UINT nType, int cx, int cy)
{
CFrameWnd::OnSize(nType, cx, cy);
theApp.m_bMaximized = (nType == SIZE_MAXIMIZED);
if (nType == SIZE_RESTORED)
GetWindowRect(theApp.m_rectInitialFrame);
}
BOOL CMainFrame::OnBarCheck(UINT barID)
{
CDocOptions::CBarState &state = theApp.GetDocOptions().GetBarState();
CControlBar *bar = GetControlBar(barID);
BOOL bVisible = !(bar->GetStyle() & WS_VISIBLE);
switch (barID)
{
case ID_VIEW_STATUS_BAR: state.m_bStatusBar = bVisible; break;
case ID_VIEW_FORMATBAR: state.m_bFormatBar = bVisible; break;
case ID_VIEW_RULER: state.m_bRulerBar = bVisible; break;
case ID_VIEW_TOOLBAR: state.m_bToolBar = bVisible; break;
}
return CFrameWnd::OnBarCheck(barID);
}
LONG CMainFrame::OnBarState(UINT wParam, LONG lParam)
{
if (lParam == -1)
return 0L;
ASSERT(lParam != RD_EMBEDDED);
if (wParam == 0)
{
CDockState& ds = theApp.GetDockState(lParam);
ds.Clear(); // empty out the dock state
GetDockState(ds);
}
else
{
if (IsTextType(lParam))
{
// in text mode hide the ruler and format bar so that it is the default
CControlBar* pBar = GetControlBar(ID_VIEW_FORMATBAR);
if (pBar != NULL)
pBar->ShowWindow(SW_HIDE);
pBar = GetControlBar(ID_VIEW_RULER);
if (pBar != NULL)
pBar->ShowWindow(SW_HIDE);
}
HICON hIcon = GetIcon((int)lParam);
SendMessage(WM_SETICON, TRUE, (LPARAM)hIcon);
SetDockState(theApp.GetDockState(lParam));
}
return 0L;
}
void CMainFrame::OnMove(int x, int y)
{
CFrameWnd::OnMove(x, y);
WINDOWPLACEMENT wp;
wp.length = sizeof(wp);
GetWindowPlacement(&wp);
theApp.m_rectInitialFrame = wp.rcNormalPosition;
CView* pView = GetActiveView();
if (pView != NULL)
pView->SendMessage(WM_MOVE);
}
LONG CMainFrame::OnOpenMsg(UINT, LONG lParam)
{
TCHAR szAtomName[256];
szAtomName[0] = NULL;
GlobalGetAtomName((ATOM)lParam, szAtomName, 256);
CWordPadDoc* pDoc = (CWordPadDoc*)GetActiveDocument();
if (szAtomName[0] != NULL && pDoc != NULL)
{
if (lstrcmpi(szAtomName, pDoc->GetPathName()) == 0)
return TRUE;
}
return FALSE;
}
LONG CMainFrame::OnOLEHelpMsg(UINT, LONG)
{
CWnd* pMainWnd = AfxGetMainWnd();
ASSERT_VALID(pMainWnd);
// return global app help mode state to FALSE (backward compatibility)
m_bHelpMode = FALSE;
pMainWnd->PostMessage(WM_KICKIDLE); // trigger idle update
::HtmlHelpA( ::GetDesktopWindow(), "wordpad.chm", HH_DISPLAY_TOPIC, 0L );
return TRUE ;
}
void CMainFrame::OnHelpFinder()
{
::HtmlHelpA( ::GetDesktopWindow(), "wordpad.chm", HH_DISPLAY_TOPIC, 0L );
}
void CMainFrame::OnDropFiles(HDROP hDropInfo)
{
TCHAR szFileName[_MAX_PATH];
::DragQueryFile(hDropInfo, 0, szFileName, _MAX_PATH);
::DragFinish(hDropInfo);
theApp.OpenDocumentFile(szFileName);
}
void CMainFrame::OnCharColor()
{
CColorMenu colorMenu;
CRect rc;
int index = m_wndFormatBar.CommandToIndex(ID_CHAR_COLOR);
m_wndFormatBar.GetItemRect(index, &rc);
m_wndFormatBar.ClientToScreen(rc);
colorMenu.TrackPopupMenu(TPM_LEFTALIGN|TPM_LEFTBUTTON,rc.left,rc.bottom, this);
}
void CMainFrame::OnPenToggle()
{
static int nPen = 0;
m_wndToolBar.SetButtons(toolbar, sizeof(toolbar)/sizeof(UINT) - nPen);
nPen = (nPen == 0) ? NUM_PEN_TOGGLE : 0;
m_wndToolBar.Invalidate();
m_wndToolBar.GetParentFrame()->RecalcLayout();
}
BOOL CMainFrame::OnQueryNewPalette()
{
CView* pView = GetActiveView();
if (pView != NULL)
return pView->SendMessage(WM_QUERYNEWPALETTE) != 0;
return FALSE;
}
void CMainFrame::OnPaletteChanged(CWnd* pFocusWnd)
{
CView* pView = GetActiveView();
if (pView != NULL)
pView->SendMessage(WM_PALETTECHANGED, (WPARAM)pFocusWnd->GetSafeHwnd());
}
//
// HACKHACK: MFC has a bug where m_nIdleFlags gets clobbered if the flags are
// updated during idle processing (MFC4.2). Workaround it by
// forcing idleMenu and idleLayout after idle processing if
// DelayUpdateFrameMenu gets called during idle processing.
//
void CMainFrame::OnIdleUpdateCmdUI()
{
m_inupdate = true;
CFrameWnd::OnIdleUpdateCmdUI();
if (m_reset)
{
m_nIdleFlags |= idleMenu | idleLayout;
m_reset = false;
}
m_inupdate = false;
}
void CMainFrame::DelayUpdateFrameMenu(HMENU hMenuAlt)
{
if (m_inupdate)
m_reset = true;
CFrameWnd::DelayUpdateFrameMenu(hMenuAlt);
}