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
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);
|
|
}
|