|
|
/*
* frntpage.cpp * * Purpose: * Implements the Front Page IAthenaView object * * Owner: * EricAn * * Copyright (C) Microsoft Corp. 1997 */ #include "pch.hxx"
#include "frntpage.h"
#include "resource.h"
#include "ourguid.h"
#include "thormsgs.h"
#include "goptions.h"
#include "strconst.h"
#include "frntbody.h"
#include "acctutil.h"
#include "newfldr.h"
#include <wininet.h>
#include <options.h>
#include <layout.h>
#include "finder.h"
#include <inetcfg.h>
#include "instance.h"
#include "storutil.h"
#include "menuutil.h"
#include "menures.h"
#include "statbar.h"
ASSERTDATA
/////////////////////////////////////////////////////////////////////////////
//
// Macros
//
#define FPDOUT(x) DOUTL(DOUT_LEVEL4, x)
/////////////////////////////////////////////////////////////////////////////
//
// Global Data
//
static const TCHAR s_szFrontPageWndClass[] = TEXT("ThorFrontPageWndClass");
/////////////////////////////////////////////////////////////////////////////
//
// Prototypes
//
/////////////////////////////////////////////////////////////////////////
//
// Constructors, Destructors, and Initialization
//
CFrontPage::CFrontPage() { m_cRef = 1; m_idFolder = FOLDERID_INVALID; m_pShellBrowser = NULL; m_fFirstActive = FALSE; m_uActivation = SVUIA_DEACTIVATE; m_hwndOwner = NULL; m_hwnd = NULL; m_hwndCtlFocus = NULL; m_pBodyObj = NULL; m_pBodyObjCT = NULL; #ifndef WIN16 // No RAS support in Win16
m_hMenuConnect = 0; #endif
m_pStatusBar = NULL; }
CFrontPage::~CFrontPage() { SafeRelease(m_pShellBrowser); SafeRelease(m_pBodyObj); SafeRelease(m_pBodyObjCT); SafeRelease(m_pStatusBar); #ifndef WIN16 // No RAS support in Win16
if (m_hMenuConnect) g_pConMan->FreeConnectMenu(m_hMenuConnect); #endif
}
HRESULT CFrontPage::HrInit(FOLDERID idFolder) { WNDCLASS wc;
if (!GetClassInfo(g_hInst, s_szFrontPageWndClass, &wc)) { wc.style = 0; wc.lpfnWndProc = CFrontPage::FrontPageWndProc; wc.cbClsExtra = 0; wc.cbWndExtra = 0; wc.hInstance = g_hInst; wc.hIcon = NULL; wc.hCursor = NULL; wc.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1); wc.lpszMenuName = NULL; wc.lpszClassName = s_szFrontPageWndClass; if (RegisterClass(&wc) == 0 && GetLastError() != ERROR_CLASS_ALREADY_EXISTS) return E_FAIL; }
// Make copies of our pidls
m_idFolder = idFolder; m_ftType = GetFolderType(m_idFolder);
return NOERROR; }
/////////////////////////////////////////////////////////////////////////
//
// OLE Interfaces
//
////////////////////////////////////////////////////////////////////////
//
// IUnknown
//
////////////////////////////////////////////////////////////////////////
HRESULT STDMETHODCALLTYPE CFrontPage::QueryInterface(REFIID riid, void **ppvObj) { if (IsEqualIID(riid, IID_IUnknown)) *ppvObj = (void*) (IUnknown *)(IViewWindow *) this; else if (IsEqualIID(riid, IID_IViewWindow)) *ppvObj = (void*) (IViewWindow *) this; else if (IsEqualIID(riid, IID_IOleCommandTarget)) *ppvObj = (void*) (IOleCommandTarget *) this; else { *ppvObj = NULL; return E_NOINTERFACE; }
AddRef(); return NOERROR; }
ULONG STDMETHODCALLTYPE CFrontPage::AddRef() { DOUT(TEXT("CFrontPage::AddRef() - m_cRef = %d"), m_cRef + 1); return ++m_cRef; }
ULONG STDMETHODCALLTYPE CFrontPage::Release() { DOUT(TEXT("CFrontPage::Release() - m_cRef = %d"), m_cRef - 1); if (--m_cRef == 0) { delete this; return 0; } return m_cRef; }
////////////////////////////////////////////////////////////////////////
//
// IOleWindow
//
////////////////////////////////////////////////////////////////////////
HRESULT STDMETHODCALLTYPE CFrontPage::GetWindow(HWND * lphwnd) { *lphwnd = m_hwnd; return (m_hwnd ? S_OK : E_FAIL); }
HRESULT STDMETHODCALLTYPE CFrontPage::ContextSensitiveHelp(BOOL fEnterMode) { return E_NOTIMPL; }
////////////////////////////////////////////////////////////////////////
//
// IAthenaView
//
////////////////////////////////////////////////////////////////////////
HRESULT STDMETHODCALLTYPE CFrontPage::TranslateAccelerator(LPMSG lpmsg) { // see if the body obj wants to snag it.
if (m_pBodyObj && m_pBodyObj->HrTranslateAccelerator(lpmsg) == S_OK) return S_OK;
return E_NOTIMPL; }
HRESULT STDMETHODCALLTYPE CFrontPage::UIActivate(UINT uActivation) { if (uActivation != SVUIA_DEACTIVATE) OnActivate(uActivation); else OnDeactivate(); return NOERROR; }
HRESULT STDMETHODCALLTYPE CFrontPage::CreateViewWindow(IViewWindow *lpPrevView, IAthenaBrowser *psb, RECT *prcView, HWND *phWnd) { m_pShellBrowser = psb; Assert(m_pShellBrowser); m_pShellBrowser->AddRef();
m_pShellBrowser->GetWindow(&m_hwndOwner); Assert(IsWindow(m_hwndOwner));
// Load our registry settings
LoadBaseSettings(); m_hwnd = CreateWindowEx(WS_EX_CONTROLPARENT|WS_EX_CLIENTEDGE, s_szFrontPageWndClass, NULL, WS_VISIBLE|WS_CHILD|WS_CLIPCHILDREN|WS_CLIPSIBLINGS, prcView->left, prcView->top, prcView->right - prcView->left, prcView->bottom - prcView->top, m_hwndOwner, NULL, g_hInst, (LPVOID)this);
if (!m_hwnd) return E_FAIL;
*phWnd = m_hwnd;
return NOERROR; }
HRESULT STDMETHODCALLTYPE CFrontPage::DestroyViewWindow() { if (m_hwnd) { HWND hwndDest = m_hwnd; m_hwnd = NULL; DestroyWindow(hwndDest); } return NOERROR; }
HRESULT STDMETHODCALLTYPE CFrontPage::SaveViewState() { // Save our registry settings
SaveBaseSettings(); return NOERROR; }
//
// FUNCTION: CFrontPage::OnInitMenuPopup
//
// PURPOSE: Called when the user is about to display a menu. We use this
// to update the enabled or disabled status of many of the
// commands on each menu.
//
// PARAMETERS:
// hmenu - Handle of the main menu.
// hmenuPopup - Handle of the popup menu being displayed.
// uID - Specifies the id of the menu item that
// invoked the popup.
//
// RETURN VALUE:
// Returns S_OK if we process the message.
//
//
#define MF_ENABLEFLAGS(b) (MF_BYCOMMAND|(b ? MF_ENABLED : MF_GRAYED|MF_DISABLED))
#define MF_CHECKFLAGS(b) (MF_BYCOMMAND|(b ? MF_CHECKED : MF_UNCHECKED))
HRESULT CFrontPage::OnPopupMenu(HMENU hmenu, HMENU hmenuPopup, UINT uID) { MENUITEMINFO mii;
// give the docobj a chance to update its menu
if (m_pBodyObj) m_pBodyObj->HrOnInitMenuPopup(hmenuPopup, uID);
return S_OK; }
HRESULT CFrontPage::QueryStatus(const GUID *pguidCmdGroup, ULONG cCmds, OLECMD prgCmds[], OLECMDTEXT *pCmdText) { // Let MimeEdit have a crack at them
if (m_pBodyObjCT) { m_pBodyObjCT->QueryStatus(pguidCmdGroup, cCmds, prgCmds, pCmdText); }
// handled
return S_OK; }
HRESULT CFrontPage::Exec(const GUID *pguidCmdGroup, DWORD nCmdID, DWORD nCmdExecOpt, VARIANTARG *pvaIn, VARIANTARG *pvaOut) { // make sure that the 'go to inbox' check is consistent with what is in the options dlg
// but we'll still let the browser actually handle the command
/*
if (nCmdID == ID_OPTIONS) { if (m_ftType == FOLDER_ROOTNODE) { VARIANT_BOOL b; if (SUCCEEDED(m_pBodyObj->GetSetCheck(FALSE, &b))) SetDwOption(OPT_LAUNCH_INBOX, b ? TRUE : FALSE, m_hwnd, 0); } } */ // check if the body wants to handle it
if (m_pBodyObjCT && m_pBodyObjCT->Exec(pguidCmdGroup, nCmdID, nCmdExecOpt, pvaIn, pvaOut) == NOERROR) return S_OK;
return E_FAIL; }
HRESULT STDMETHODCALLTYPE CFrontPage::OnFrameWindowActivate(BOOL fActivate) { return m_pBodyObj ? m_pBodyObj->HrFrameActivate(fActivate) : S_OK; }
HRESULT STDMETHODCALLTYPE CFrontPage::GetCurCharSet(UINT *cp) { *cp = GetACP(); return (E_NOTIMPL); }
HRESULT STDMETHODCALLTYPE CFrontPage::UpdateLayout(THIS_ BOOL fPreviewVisible, BOOL fPreviewHeader, BOOL fPreviewVert, BOOL fReload) { return (E_NOTIMPL); }
////////////////////////////////////////////////////////////////////////
//
// Message Handling
//
////////////////////////////////////////////////////////////////////////
LRESULT CALLBACK CFrontPage::FrontPageWndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) { LRESULT lRet; CFrontPage *pThis;
if (msg == WM_NCCREATE) { pThis = (CFrontPage*)((LPCREATESTRUCT)lParam)->lpCreateParams; SetWindowLongPtr(hwnd, GWLP_USERDATA, (LPARAM)pThis); } else pThis = (CFrontPage*)GetWindowLongPtr(hwnd, GWLP_USERDATA);
Assert(pThis);
return pThis->WndProc(hwnd, msg, wParam, lParam); }
LRESULT CFrontPage::WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) { BOOL fTip;
switch (msg) { HANDLE_MSG(hwnd, WM_CREATE, OnCreate); HANDLE_MSG(hwnd, WM_SIZE, OnSize); HANDLE_MSG(hwnd, WM_NOTIFY, OnNotify); HANDLE_MSG(hwnd, WM_SETFOCUS, OnSetFocus);
case WM_COMMAND: return SendMessage(m_hwndOwner, msg, wParam, lParam); case WM_MENUSELECT: HandleMenuSelect(m_pStatusBar, wParam, lParam); return 0;
case NVM_INITHEADERS: PostCreate(); return 0; /*
case CM_OPTIONADVISE: if ((wParam == OPT_LAUNCH_INBOX || wParam == 0xffffffff) && m_ftType == FOLDER_ROOTNODE) { VARIANT_BOOL b = DwGetOption(OPT_LAUNCH_INBOX) ? VARIANT_TRUE : VARIANT_FALSE; m_pBodyObj->GetSetCheck(TRUE, &b); }
case WM_UPDATELAYOUT: m_pShellBrowser->GetViewLayout(DISPID_MSGVIEW_TIPOFTHEDAY, 0, &fTip, 0, 0); m_pBodyObj->ShowTip(fTip); return 0; */ case WM_ACTIVATE: { HWND hwndFocus; DOUT("CFrontPage - WM_ACTIVATE(%#x)", LOWORD(wParam)); m_pShellBrowser->UpdateToolbar(); if (LOWORD(wParam) != WA_INACTIVE) { // DefWindowProc will set the focus to our view window, which
// is not what we want. Instead, we will let the explorer set
// the focus to our view window if we should get it, at which
// point we will set it to the proper control.
return 0; }
hwndFocus = GetFocus(); if (IsChild(hwnd, hwndFocus)) m_hwndCtlFocus = hwndFocus; else m_pBodyObj->HrGetWindow(&m_hwndCtlFocus); } break; case WM_CLOSE: // ignore CTRL-F4's
return 0;
case WM_DESTROY: OptionUnadvise(hwnd); SafeRelease(m_pStatusBar); if (m_pBodyObj) { m_pBodyObj->HrUnloadAll(NULL, 0); m_pBodyObj->HrClose(); } return 0;
#ifndef WIN16
case WM_DISPLAYCHANGE: #endif
case WM_WININICHANGE: case WM_SYSCOLORCHANGE: case WM_QUERYNEWPALETTE: case WM_PALETTECHANGED: if (m_pBodyObj) { HWND hwndBody; m_pBodyObj->HrGetWindow(&hwndBody); SendMessage(hwndBody, msg, wParam, lParam); } /* * * FALL THROUGH * * */
case FTN_PRECHANGE: case FTN_POSTCHANGE: break;
default: if (g_msgMSWheel && (msg == g_msgMSWheel)) { HWND hwndFocus = GetFocus(); if (IsChild(hwnd, hwndFocus)) return SendMessage(hwndFocus, msg, wParam, lParam); } break; } return DefWindowProc(hwnd, msg, wParam, lParam); }
//
// FUNCTION: CFrontPage::OnCreate
//
// PURPOSE: Creates the child windows necessary for the view and
// initializes the data in those child windows.
//
// PARAMETERS:
// hwnd - Handle of the view being created.
// lpCreateStruct - Pointer to the creation params passed to
// CreateWindow().
//
// RETURN VALUE:
// Returns TRUE if the initialization is successful.
//
BOOL CFrontPage::OnCreate(HWND hwnd, LPCREATESTRUCT lpCreateStruct) { // register for option update notification
SideAssert(SUCCEEDED(OptionAdvise(hwnd)));
m_pBodyObj = new CFrontBody(m_ftType, m_pShellBrowser); if (!m_pBodyObj) goto error;
if (FAILED(m_pBodyObj->HrInit(hwnd))) goto error;
if (FAILED(m_pBodyObj->HrShow(FALSE))) goto error;
return TRUE;
error: return FALSE; }
//
// FUNCTION: CFrontPage::OnSize
//
// PURPOSE: Notification that the view window has been resized. In
// response we update the positions of our child windows and
// controls.
//
// PARAMETERS:
// hwnd - Handle of the view window being resized.
// state - Type of resizing requested.
// cxClient - New width of the client area.
// cyClient - New height of the client area.
//
void CFrontPage::OnSize(HWND hwnd, UINT state, int cxClient, int cyClient) { RECT rcBody, rcFldr;
GetClientRect(hwnd, &rcBody); m_pBodyObj->HrSetSize(&rcBody); }
//
// FUNCTION: CFrontPage::OnSetFocus
//
// PURPOSE: If the focus ever is set to the view window, we want to
// make sure it goes to one of our child windows. Preferably
// the focus will go to the last child to have the focus.
//
// PARAMETERS:
// hwnd - Handle of the view window.
// hwndOldFocus - Handle of the window losing focus.
//
void CFrontPage::OnSetFocus(HWND hwnd, HWND hwndOldFocus) { FPDOUT("CFrontPage - WM_SETFOCUS");
// Check to see that we have a window stored to have focus. If not
// default to the message list.
if (!m_hwndCtlFocus || !IsWindow(m_hwndCtlFocus) || m_hwndCtlFocus == m_hwndOwner) { m_pBodyObj->HrGetWindow(&m_hwndCtlFocus); }
if (m_hwndCtlFocus && IsWindow(m_hwndCtlFocus)) SetFocus(m_hwndCtlFocus); }
//
// FUNCTION: CFrontPage::OnNotify
//
// PURPOSE: Processes the various notifications we receive from our child
// controls.
//
// PARAMETERS:
// hwnd - Handle of the view window.
// idCtl - identifies the control sending the notification
// pnmh - points to a NMHDR struct with more information regarding the
// notification
//
// RETURN VALUE:
// Dependant on the specific notification.
//
LRESULT CFrontPage::OnNotify(HWND hwnd, int idFrom, LPNMHDR pnmhdr) { if (pnmhdr->code == NM_SETFOCUS) { // if we get a setfocus from a kid, and it's not the
// body, be sure to UIDeactivate the body
HWND hwndBody = 0;
m_pBodyObj->HrGetWindow(&hwndBody); if (pnmhdr->hwndFrom != hwndBody) m_pBodyObj->HrUIActivate(FALSE); m_pShellBrowser->OnViewWindowActive(this); } return 0; } BOOL CFrontPage::OnActivate(UINT uActivation) { // if focus stays within the frame, but goes outside our view.
// ie.. TreeView gets focus then we get an activate nofocus. Be sure
// to UIDeactivate the docobj in this case
if (uActivation == SVUIA_ACTIVATE_NOFOCUS) m_pBodyObj->HrUIActivate(FALSE);
if (m_uActivation != uActivation) { OnDeactivate(); m_uActivation = uActivation; SafeRelease(m_pStatusBar); m_pShellBrowser->GetStatusBar(&m_pStatusBar); if (m_pBodyObj) m_pBodyObj->HrSetStatusBar(m_pStatusBar); if (!m_fFirstActive) { PostMessage(m_hwnd, NVM_INITHEADERS, 0, 0L); m_fFirstActive = TRUE; } } return TRUE; }
BOOL CFrontPage::OnDeactivate() { if (m_uActivation != SVUIA_DEACTIVATE) { m_uActivation = SVUIA_DEACTIVATE; if (m_pBodyObj) m_pBodyObj->HrSetStatusBar(NULL); } return TRUE; }
BOOL CFrontPage::LoadBaseSettings() { return TRUE; }
BOOL CFrontPage::SaveBaseSettings() { return TRUE; }
void CFrontPage::PostCreate() { Assert(m_pShellBrowser);
m_pBodyObj->HrLoadPage();
ProcessICW(m_hwndOwner, m_ftType); }
|