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.
 
 
 
 
 
 

368 lines
11 KiB

// ipframe.cpp : implementation of the CInPlaceFrame class
//
// This is a part of the Microsoft Foundation Classes C++ library.
// Copyright (C) 1992-1995 Microsoft Corporation
// All rights reserved.
//
// This source code is only intended as a supplement to the
// Microsoft Foundation Classes Reference and related
// electronic documentation provided with the library.
// See these sources for detailed information regarding the
// Microsoft Foundation Classes product.
#include "stdafx.h"
#include "wordpad.h"
#include "formatba.h"
#include "ruler.h"
#include "ipframe.h"
#include "wordpdoc.h"
#include "wordpvw.h"
#include "colorlis.h"
#ifdef _DEBUG
#undef THIS_FILE
static char BASED_CODE THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CInPlaceFrame
IMPLEMENT_DYNCREATE(CInPlaceFrame, COleIPFrameWnd)
BEGIN_MESSAGE_MAP(CInPlaceFrame, COleIPFrameWnd)
//{{AFX_MSG_MAP(CInPlaceFrame)
ON_WM_CREATE()
ON_WM_DESTROY()
ON_COMMAND(ID_HELP, OnHelpFinder)
ON_COMMAND(ID_CHAR_COLOR, OnCharColor)
ON_COMMAND(ID_HELP_INDEX, OnHelpFinder)
ON_COMMAND(ID_PEN_TOGGLE, OnPenToggle)
//}}AFX_MSG_MAP
ON_UPDATE_COMMAND_UI(ID_VIEW_TOOLBAR, OnUpdateControlBarMenu)
ON_COMMAND_EX(ID_VIEW_TOOLBAR, OnBarCheck)
ON_UPDATE_COMMAND_UI(ID_VIEW_FORMATBAR, OnUpdateControlBarMenu)
ON_COMMAND_EX(ID_VIEW_FORMATBAR, OnBarCheck)
ON_UPDATE_COMMAND_UI(ID_VIEW_RULER, OnUpdateControlBarMenu)
ON_COMMAND_EX(ID_VIEW_RULER, OnBarCheck)
ON_MESSAGE(WM_SIZECHILD, OnResizeChild)
ON_MESSAGE(WPM_BARSTATE, OnBarState)
ON_COMMAND(ID_DEFAULT_HELP, OnHelpFinder)
// ON_COMMAND(ID_CONTEXT_HELP, COleIPFrameWnd::OnContextHelp)
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// arrays of IDs used to initialize control bars
static UINT BASED_CODE toolButtons[] =
{
// same order as in the bitmap 'itoolbar.bmp'
ID_EDIT_CUT,
ID_EDIT_COPY,
ID_EDIT_PASTE,
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,
};
/////////////////////////////////////////////////////////////////////////////
// CInPlaceFrame construction/destruction
int CInPlaceFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (COleIPFrameWnd::OnCreate(lpCreateStruct) == -1)
return -1;
// CResizeBar implements in-place resizing.
if (!m_wndResizeBar.Create(this))
{
TRACE0("Failed to create resize bar\n");
return -1; // fail to create
}
if (!CreateRulerBar(this))
return FALSE;
// By default, it is a good idea to register a drop-target that does
// nothing with your frame window. This prevents drops from
// "falling through" to a container that supports drag-drop.
m_dropTarget.Register(this);
return 0;
}
// OnCreateControlBars is called by the framework to create control bars on the
// container application's windows. pWndFrame is the top level frame window of
// the container and is always non-NULL. pWndDoc is the doc level frame window
// and will be NULL when the container is an SDI application. A server
// application can place MFC control bars on either window.
BOOL CInPlaceFrame::OnCreateControlBars(CFrameWnd* pWndFrame, CFrameWnd* /*pWndDoc*/)
{
if (!CreateToolBar(pWndFrame))
return FALSE;
if (!CreateFormatBar(pWndFrame))
return FALSE;
// set owner to this window, so messages are delivered to correct app
m_wndToolBar.EnableDocking(CBRS_ALIGN_ANY);
m_wndFormatBar.EnableDocking(CBRS_ALIGN_TOP|CBRS_ALIGN_BOTTOM);
pWndFrame->EnableDocking(CBRS_ALIGN_ANY);
pWndFrame->DockControlBar(&m_wndToolBar);
pWndFrame->DockControlBar(&m_wndFormatBar);
m_wndToolBar.SetOwner(this);
m_wndFormatBar.SetOwner(this);
m_wndRulerBar.SetOwner(this);
OnBarState(1, RD_EMBEDDED); //load bar state
return TRUE;
}
BOOL CInPlaceFrame::CreateToolBar(CWnd* pWndFrame)
{
// Create toolbar on client's frame window
ASSERT(m_wndToolBar.m_hWnd == NULL);
int nPen = GetSystemMetrics(SM_PENWINDOWS) ? NUM_PEN_TOGGLE :
NUM_PEN_ITEMS;
UINT nID = theApp.m_bLargeIcons ?
IDR_SRVR_INPLACE_BIG : IDR_SRVR_INPLACE;
if (!m_wndToolBar.Create(pWndFrame, WS_CHILD|WS_VISIBLE|CBRS_TOP|
CBRS_TOOLTIPS|CBRS_FLYBY|CBRS_SIZE_DYNAMIC)||
!m_wndToolBar.LoadBitmap(nID) ||
!m_wndToolBar.SetButtons(toolButtons,
sizeof(toolButtons)/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 CInPlaceFrame::CreateFormatBar(CWnd* pWndFrame)
{
ASSERT(m_wndFormatBar.m_hWnd == NULL);
m_wndFormatBar.m_hWndOwner = m_hWnd;
UINT nID = theApp.m_bLargeIcons ? IDB_FORMATBAR_BIG : IDB_FORMATBAR;
if (!m_wndFormatBar.Create(pWndFrame, 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;
}
CInPlaceFrame::CreateRulerBar(CWnd* pWndFrame)
{
if (!m_wndRulerBar.Create(pWndFrame,
WS_CHILD|WS_VISIBLE|CBRS_ALIGN_TOP|CBRS_HIDE_INPLACE, ID_VIEW_RULER))
{
TRACE0("Failed to create ruler\n");
return FALSE; // fail to create
}
return TRUE;
}
/////////////////////////////////////////////////////////////////////////////
// CInPlaceFrame Operations
/////////////////////////////////////////////////////////////////////////////
// CInPlaceFrame diagnostics
#ifdef _DEBUG
void CInPlaceFrame::AssertValid() const
{
COleIPFrameWnd::AssertValid();
}
void CInPlaceFrame::Dump(CDumpContext& dc) const
{
COleIPFrameWnd::Dump(dc);
}
#endif //_DEBUG
/////////////////////////////////////////////////////////////////////////////
// CInPlaceFrame commands
void CInPlaceFrame::OnDestroy()
{
m_wndToolBar.DestroyWindow();
m_wndFormatBar.DestroyWindow();
COleIPFrameWnd::OnDestroy();
}
void CInPlaceFrame::RepositionFrame(LPCRECT lpPosRect, LPCRECT lpClipRect)
{
CRect rectNew = lpPosRect;
rectNew.left -= HORZ_TEXTOFFSET;
rectNew.top -= VERT_TEXTOFFSET;
m_wndResizeBar.BringWindowToTop();
COleIPFrameWnd::RepositionFrame(&rectNew, lpClipRect);
CWnd* pWnd = GetActiveView();
if (pWnd != NULL)
pWnd->BringWindowToTop();
m_wndRulerBar.BringWindowToTop();
}
void CInPlaceFrame::RecalcLayout(BOOL bNotify)
{
if (m_wndResizeBar.m_hWnd != NULL)
m_wndResizeBar.BringWindowToTop();
COleIPFrameWnd::RecalcLayout(bNotify);
CWnd* pWnd = GetActiveView();
if (pWnd != NULL)
pWnd->BringWindowToTop();
if (m_wndRulerBar.m_hWnd != NULL)
m_wndRulerBar.BringWindowToTop();
// at least 12 pt region plus ruler if it exists
CDisplayIC dc;
CSize size;
size.cy = MulDiv(12, dc.GetDeviceCaps(LOGPIXELSY), 72)+1;
size.cx = dc.GetDeviceCaps(LOGPIXELSX)/4; // 1/4"
size.cx += HORZ_TEXTOFFSET; //adjust for offset
size.cy += VERT_TEXTOFFSET;
if (m_wndRulerBar.m_hWnd != NULL && m_wndRulerBar.IsVisible())
{
CRect rect;
m_wndRulerBar.GetWindowRect(&rect);
size.cy += rect.Height();
}
m_wndResizeBar.SetMinSize(size);
}
void CInPlaceFrame::CalcWindowRect(LPRECT lpClientRect, UINT nAdjustType)
{
COleIPFrameWnd::CalcWindowRect(lpClientRect, nAdjustType);
}
LRESULT CInPlaceFrame::OnResizeChild(WPARAM /*wParam*/, LPARAM lParam)
{
// notify the container that the rectangle has changed!
CWordPadDoc* pDoc = (CWordPadDoc*)GetActiveDocument();
if (pDoc == NULL)
return 0;
ASSERT(pDoc->IsKindOf(RUNTIME_CLASS(CWordPadDoc)));
// get new rect and parent
CRect rectNew;
rectNew.CopyRect((LPCRECT)lParam);
CWnd* pParentWnd = GetParent();
ASSERT_VALID(pParentWnd);
// convert rectNew relative to pParentWnd
ClientToScreen(&rectNew);
pParentWnd->ScreenToClient(&rectNew);
if (m_wndRulerBar.GetStyle()&WS_VISIBLE)
{
CRect rect;
m_wndRulerBar.GetWindowRect(&rect);
rectNew.top += rect.Height();
}
rectNew.left += HORZ_TEXTOFFSET;
rectNew.top += VERT_TEXTOFFSET;
// adjust the new rectangle for the current control bars
CWnd* pLeftOver = GetDlgItem(AFX_IDW_PANE_FIRST);
ASSERT(pLeftOver != NULL);
CRect rectCur = m_rectPos;
pLeftOver->CalcWindowRect(&rectCur, CWnd::adjustOutside);
rectNew.left += m_rectPos.left - rectCur.left;
rectNew.top += m_rectPos.top - rectCur.top;
rectNew.right -= rectCur.right - m_rectPos.right;
rectNew.bottom -= rectCur.bottom - m_rectPos.bottom;
OnRequestPositionChange(rectNew);
return 0;
}
LONG CInPlaceFrame::OnBarState(UINT wParam, LONG lParam)
{
if (lParam == -1)
return 0L;
if (wParam == 0)
{
GetDockState(theApp.GetDockState(RD_EMBEDDED));
ASSERT(m_pMainFrame != NULL);
m_pMainFrame->GetDockState(theApp.GetDockState(RD_EMBEDDED, FALSE));
}
else
{
SetDockState(theApp.GetDockState(RD_EMBEDDED));
m_pMainFrame->SetDockState(theApp.GetDockState(RD_EMBEDDED, FALSE));
}
return 0L;
}
void CInPlaceFrame::OnHelpFinder()
{
::HtmlHelpA( ::GetDesktopWindow(), "wordpad.chm", HH_DISPLAY_TOPIC, 0L );
}
void CInPlaceFrame::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 CInPlaceFrame::OnPenToggle()
{
static int nPen = 0;
m_wndToolBar.SetButtons(toolButtons, sizeof(toolButtons)/sizeof(UINT) - nPen);
nPen = (nPen == 0) ? NUM_PEN_TOGGLE : 0;
m_wndToolBar.Invalidate();
m_wndToolBar.GetParentFrame()->RecalcLayout();
}