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.
4173 lines
124 KiB
4173 lines
124 KiB
/*
|
|
* browser.cpp
|
|
*
|
|
* Purpose:
|
|
* Implements a browser object
|
|
*
|
|
* Owner:
|
|
* EricAn
|
|
*
|
|
* Copyright (C) Microsoft Corp. 1996
|
|
*/
|
|
#include "pch.hxx"
|
|
#include "bodybar.h"
|
|
#include "browser.h"
|
|
#include <shellapi.h>
|
|
#include "resource.h"
|
|
#include "options.h"
|
|
#include "ipab.h"
|
|
#include "inetcfg.h"
|
|
#include "acctutil.h"
|
|
#include "mailutil.h"
|
|
#include "impapi.h"
|
|
#include "menuutil.h"
|
|
#include "ourguid.h"
|
|
#include "thormsgs.h"
|
|
#include "error.h"
|
|
#include "fonts.h"
|
|
#include "treeview.h"
|
|
#include "goptions.h"
|
|
#include "strconst.h"
|
|
#include "note.h"
|
|
#include "tbbands.h"
|
|
#include "statbar.h"
|
|
#include "newfldr.h"
|
|
#include "conman.h"
|
|
#include "acctutil.h"
|
|
#include "spoolapi.h"
|
|
#include "statnery.h"
|
|
#include "inpobj.h"
|
|
#include "fldbar.h"
|
|
#include "layout.h"
|
|
#include "htmlhelp.h"
|
|
#include "shared.h"
|
|
#include "mailutil.h"
|
|
#include <shlwapi.h>
|
|
#include "shlwapip.h"
|
|
#include "instance.h"
|
|
#include "ruleutil.h"
|
|
#include "envfact.h"
|
|
#include "storutil.h"
|
|
#include "finder.h"
|
|
#include "demand.h"
|
|
#include "multiusr.h"
|
|
#include "menures.h"
|
|
#include "store.h"
|
|
#include "subscr.h"
|
|
#include "outbar.h"
|
|
#include "navpane.h"
|
|
#include "msostd.h"
|
|
#include "inetreg.h"
|
|
#include "mapiutil.h"
|
|
#include "adbar.h"
|
|
#include <mirror.h>
|
|
|
|
#define MAX_SIZE_EXT_STR 128
|
|
|
|
ASSERTDATA
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
//
|
|
// Defines
|
|
//
|
|
|
|
#define CBM_POSTCREATE (WM_USER + 4000)
|
|
#define TIME_TO_CLEAR_NEWMSGSTATUS (20*1000) // 20 seconds
|
|
#define TIMER_CLEAR_STATUS 1003
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
//
|
|
// Macros
|
|
//
|
|
|
|
#define CBDOUT(x) DOUTL(DOUT_LEVEL4, x)
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
//
|
|
// Global Data
|
|
//
|
|
|
|
static const TCHAR s_szCallClient[] = TEXT("Internet Call");
|
|
static const TCHAR s_szMailClient[] = TEXT("Mail");
|
|
static const TCHAR s_szNewsClient[] = TEXT("News");
|
|
|
|
static HACCEL s_hAccelBrowser = NULL;
|
|
static s_fQuickShutdown = FALSE;
|
|
|
|
enum {
|
|
IMAGE_STATBAR_BLANK,
|
|
IMAGE_STATBAR_WARNING,
|
|
IMAGE_STATBAR_SPOOLER
|
|
};
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
//
|
|
// Prototypes
|
|
//
|
|
|
|
//
|
|
// FUNCTION: ShellUtil_IsRegisteredClient()
|
|
//
|
|
// PURPOSE: Returns whether the specified client type is handled.
|
|
//
|
|
BOOL ShellUtil_IsRegisteredClient(LPCTSTR pszClient)
|
|
{
|
|
LONG cbSize = 0;
|
|
TCHAR szKey[MAX_PATH];
|
|
|
|
wnsprintf(szKey, ARRAYSIZE(szKey), c_szPathFileFmt, c_szRegPathClients, pszClient);
|
|
return (RegQueryValue(HKEY_LOCAL_MACHINE, szKey, NULL, &cbSize) == ERROR_SUCCESS) &&
|
|
(cbSize > 1);
|
|
}
|
|
|
|
//
|
|
// FUNCTION: ShellUtil_RunIndirectRegCommand()
|
|
//
|
|
// PURPOSE: find the default value under HKLM\Software\Clients\pszClient
|
|
// tack on shell\open\command
|
|
// then runreg that
|
|
//
|
|
void ShellUtil_RunClientRegCommand(HWND hwnd, LPCTSTR pszClient)
|
|
{
|
|
TCHAR szDefApp[MAX_PATH], szExpanded[MAX_PATH];
|
|
TCHAR szKey[MAX_PATH];
|
|
DWORD cbSize = sizeof(szDefApp);
|
|
DWORD dwType;
|
|
|
|
wnsprintf(szKey, ARRAYSIZE(szKey), c_szPathFileFmt, c_szRegPathClients, pszClient);
|
|
if (RegQueryValueEx(HKEY_LOCAL_MACHINE, szKey, 0, NULL, (LPBYTE)szDefApp, &cbSize) == ERROR_SUCCESS)
|
|
{
|
|
TCHAR szFullKey[MAX_PATH];
|
|
|
|
// tack on shell\open\command
|
|
wnsprintf(szFullKey, ARRAYSIZE(szFullKey), TEXT("%s\\%s\\shell\\open\\command"), szKey, szDefApp);
|
|
cbSize = sizeof(szDefApp);
|
|
if (RegQueryValueEx(HKEY_LOCAL_MACHINE, szFullKey, 0, &dwType, (LPBYTE)szDefApp, &cbSize) == ERROR_SUCCESS)
|
|
{
|
|
LPSTR pszArgs;
|
|
SHELLEXECUTEINFO ExecInfo;
|
|
|
|
pszArgs = PathGetArgs(szDefApp);
|
|
PathRemoveArgs(szDefApp);
|
|
PathUnquoteSpaces(szDefApp);
|
|
|
|
if (REG_EXPAND_SZ == dwType)
|
|
{
|
|
ExpandEnvironmentStrings(szDefApp, szExpanded, ARRAYSIZE(szExpanded));
|
|
ExecInfo.lpFile = szExpanded;
|
|
}
|
|
else
|
|
ExecInfo.lpFile = szDefApp;
|
|
|
|
ExecInfo.hwnd = hwnd;
|
|
ExecInfo.lpVerb = NULL;
|
|
ExecInfo.lpParameters = pszArgs;
|
|
ExecInfo.lpDirectory = NULL;
|
|
ExecInfo.nShow = SW_SHOWNORMAL;
|
|
ExecInfo.fMask = 0;
|
|
ExecInfo.cbSize = sizeof(SHELLEXECUTEINFO);
|
|
|
|
ShellExecuteEx(&ExecInfo);
|
|
}
|
|
}
|
|
}
|
|
|
|
/////////////////////////////////////////////////////////////////////////
|
|
//
|
|
// Constructors, Destructors, and Initialization
|
|
//
|
|
|
|
CBrowser::CBrowser()
|
|
{
|
|
m_cRef = 1;
|
|
m_hwnd = NULL;
|
|
m_pView = NULL;
|
|
m_pViewCT = NULL;
|
|
m_hwndInner = NULL;
|
|
m_ftSel = FOLDER_TYPESMAX;
|
|
m_idSelected = FOLDERID_INVALID;
|
|
m_fPainted = FALSE;
|
|
m_hIconPhone = 0;
|
|
m_hIconError = 0;
|
|
m_hIconAthena = 0;
|
|
m_hIconOffline = 0;
|
|
m_hIcon = 0;
|
|
m_hIconSm = 0;
|
|
m_pTreeView = NULL;
|
|
m_pStatus = NULL;
|
|
m_pCoolbar = NULL;
|
|
m_pBodyBar = NULL;
|
|
m_pFolderBar = NULL;
|
|
m_hwndLastFocus = NULL;
|
|
m_fInternal = 0;
|
|
*m_szName = 0;
|
|
ZeroMemory(m_rgTBar, sizeof(m_rgTBar));
|
|
m_itbLastFocus = ITB_NONE;
|
|
m_cAcctMenu = 0;
|
|
m_pAcctMenu = NULL;
|
|
m_fAnimate = FALSE;
|
|
m_hMenuLanguage = NULL;
|
|
m_pDocObj = NULL;
|
|
CoIncrementInit("CBrowser::CBrowser", MSOEAPI_START_SHOWERRORS, NULL, NULL);
|
|
m_fEnvMenuInited = FALSE;
|
|
m_fRebuildAccountMenu = TRUE;
|
|
m_fInitNewAcctMenu = FALSE;
|
|
m_hMenu = NULL;
|
|
ZeroMemory(&m_hlDisabled, sizeof(HWNDLIST));
|
|
m_dwIdentCookie = 0;
|
|
m_fSwitchIsLogout = FALSE;
|
|
m_fNoModifyAccts = FALSE;
|
|
m_pAdBar = NULL;
|
|
}
|
|
|
|
CBrowser::~CBrowser()
|
|
{
|
|
Assert(NULL == m_pView);
|
|
Assert(NULL == m_pViewCT);
|
|
SafeRelease(m_pTreeView);
|
|
SafeRelease(m_pCoolbar);
|
|
SafeRelease(m_pBodyBar);
|
|
SafeRelease(m_pFolderBar);
|
|
SafeRelease(m_pStatus);
|
|
SafeRelease(m_pOutBar);
|
|
SafeRelease(m_pNavPane);
|
|
SafeRelease(m_pAdBar);
|
|
|
|
SafeMemFree(m_pAcctMenu);
|
|
g_pBrowser = NULL;
|
|
|
|
if (m_hIconPhone)
|
|
SideAssert(DestroyIcon(m_hIconPhone));
|
|
|
|
if (m_hIconError)
|
|
SideAssert(DestroyIcon(m_hIconError));
|
|
|
|
if (m_hIconAthena)
|
|
SideAssert(DestroyIcon(m_hIconAthena));
|
|
|
|
if (m_hIconOffline)
|
|
SideAssert(DestroyIcon(m_hIconOffline));
|
|
|
|
if (m_hIcon)
|
|
SideAssert(DestroyIcon(m_hIcon));
|
|
|
|
if (m_hIconSm)
|
|
SideAssert(DestroyIcon(m_hIconSm));
|
|
|
|
if (m_hMenuLanguage)
|
|
{
|
|
DeinitMultiLanguage();
|
|
if(IsMenu(m_hMenuLanguage))
|
|
DestroyMenu(m_hMenuLanguage);
|
|
}
|
|
|
|
DOUT("CBrowser calling CoDecrementInit()");
|
|
CoDecrementInit("CBrowser::CBrowser", NULL);
|
|
|
|
if (m_hMenu && IsMenu(m_hMenu))
|
|
DestroyMenu(m_hMenu);
|
|
}
|
|
|
|
HRESULT CBrowser::HrInit(UINT nCmdShow, FOLDERID idFolder, HWND hWndParent)
|
|
{
|
|
DWORD cb, type, dw;
|
|
WNDCLASSEX wc;
|
|
WINDOWPLACEMENT wp;
|
|
DWORD dwExStyle = 0;
|
|
// Only load the layout from the registry only if we're standalone
|
|
LoadLayoutSettings();
|
|
|
|
m_idSelected = idFolder;
|
|
|
|
if (!s_hAccelBrowser)
|
|
s_hAccelBrowser = LoadAccelerators(g_hLocRes, MAKEINTRESOURCE(IDA_BROWSER_ACCEL));
|
|
|
|
wc.cbSize = sizeof(WNDCLASSEX);
|
|
if (!GetClassInfoEx(g_hInst, c_szBrowserWndClass, &wc))
|
|
{
|
|
wc.style = 0;
|
|
wc.lpfnWndProc = CBrowser::BrowserWndProc;
|
|
wc.cbClsExtra = 0;
|
|
wc.cbWndExtra = 0;
|
|
wc.hInstance = g_hInst;
|
|
wc.hIcon = NULL; // Handled in WM_CREATE
|
|
wc.hCursor = LoadCursor(NULL, IDC_ARROW);
|
|
wc.hbrBackground = NULL;
|
|
wc.lpszMenuName = NULL; // Handled in WM_CREATE
|
|
wc.lpszClassName = c_szBrowserWndClass;
|
|
wc.hIconSm = NULL; // Handled in WM_CREATE
|
|
if (RegisterClassEx(&wc) == 0 && GetLastError() != ERROR_CLASS_ALREADY_EXISTS)
|
|
return E_FAIL;
|
|
}
|
|
if(IS_BIDI_LOCALIZED_SYSTEM())
|
|
{
|
|
dwExStyle |= RTL_MIRRORED_WINDOW;
|
|
}
|
|
m_hwnd = CreateWindowEx(dwExStyle, c_szBrowserWndClass, NULL, WS_OVERLAPPEDWINDOW | WS_CLIPCHILDREN,
|
|
CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,
|
|
hWndParent, NULL, g_hInst, (LPVOID) this);
|
|
|
|
if (GetOption(OPT_BROWSERPOS, (LPVOID)&wp, sizeof(wp)))
|
|
{
|
|
// If the user has SHOWNORMAL as the default setting in the shortcut, then
|
|
// we'll respect the setting that we saved earlier. Otherwise, we have to
|
|
// go with what's in the shortcut.
|
|
if (nCmdShow != SW_SHOWNORMAL)
|
|
wp.showCmd = nCmdShow;
|
|
|
|
// Also, don't allow the user to come up minimized. That's kinda wierd.
|
|
else if (wp.showCmd == SW_SHOWMINIMIZED)
|
|
wp.showCmd = SW_SHOWNORMAL;
|
|
|
|
SetWindowPlacement(m_hwnd, &wp);
|
|
}
|
|
else
|
|
{
|
|
CenterDialog(m_hwnd);
|
|
ShowWindow(m_hwnd, nCmdShow);
|
|
}
|
|
|
|
// Register with identity manager
|
|
SideAssert(SUCCEEDED(MU_RegisterIdentityNotifier((IUnknown *)(IAthenaBrowser *)this, &m_dwIdentCookie)));
|
|
|
|
SetForegroundWindow(m_hwnd);
|
|
|
|
if (!m_hwnd)
|
|
return E_FAIL;
|
|
|
|
cb = sizeof(DWORD);
|
|
if (ERROR_SUCCESS == SHGetValue(HKEY_LOCAL_MACHINE, c_szRegFlat, c_szRegValNoModifyAccts, &type, &dw, &cb) &&
|
|
dw != 0)
|
|
m_fNoModifyAccts = TRUE;
|
|
|
|
return NOERROR;
|
|
}
|
|
|
|
/////////////////////////////////////////////////////////////////////////
|
|
//
|
|
// OLE Interfaces
|
|
//
|
|
|
|
////////////////////////////////////////////////////////////////////////
|
|
//
|
|
// IUnknown
|
|
//
|
|
////////////////////////////////////////////////////////////////////////
|
|
|
|
HRESULT STDMETHODCALLTYPE CBrowser::QueryInterface(REFIID riid, void **ppvObj)
|
|
{
|
|
if (IsEqualIID(riid, IID_IUnknown))
|
|
*ppvObj = (void*) (IUnknown *)(IAthenaBrowser *) this;
|
|
else if (IsEqualIID(riid, IID_IAthenaBrowser))
|
|
*ppvObj = (void*) (IAthenaBrowser *) this;
|
|
else if (IsEqualIID(riid, IID_IDockingWindowSite))
|
|
*ppvObj = (void*) (IDockingWindowSite *) this;
|
|
else if (IsEqualIID(riid, IID_IInputObjectSite))
|
|
*ppvObj = (void*) (IInputObjectSite *) this;
|
|
else if (IsEqualIID(riid, IID_IOleCommandTarget))
|
|
*ppvObj = (void*) (IOleCommandTarget *) this;
|
|
else if (IsEqualIID(riid, IID_IIdentityChangeNotify))
|
|
*ppvObj = (void*) (IIdentityChangeNotify *) this;
|
|
else
|
|
{
|
|
*ppvObj = NULL;
|
|
return E_NOINTERFACE;
|
|
}
|
|
|
|
AddRef();
|
|
return NOERROR;
|
|
}
|
|
|
|
ULONG STDMETHODCALLTYPE CBrowser::AddRef()
|
|
{
|
|
DOUT(TEXT("CBrowser::AddRef() - m_cRef = %d"), m_cRef + 1);
|
|
return ++m_cRef;
|
|
}
|
|
|
|
ULONG STDMETHODCALLTYPE CBrowser::Release()
|
|
{
|
|
DOUT(TEXT("CBrowser::Release() - m_cRef = %d"), m_cRef - 1);
|
|
if (--m_cRef == 0)
|
|
{
|
|
delete this;
|
|
return 0;
|
|
}
|
|
return m_cRef;
|
|
}
|
|
|
|
////////////////////////////////////////////////////////////////////////
|
|
//
|
|
// IStoreCallback
|
|
//
|
|
////////////////////////////////////////////////////////////////////////
|
|
|
|
STDMETHODIMP CBrowser::GetParentWindow(DWORD dwReserved, HWND *phwndParent)
|
|
{
|
|
*phwndParent = GetLastActivePopup(m_hwnd);
|
|
return(S_OK);
|
|
}
|
|
|
|
////////////////////////////////////////////////////////////////////////
|
|
//
|
|
// IOleWindow
|
|
//
|
|
////////////////////////////////////////////////////////////////////////
|
|
|
|
HRESULT STDMETHODCALLTYPE CBrowser::GetWindow(HWND * lphwnd)
|
|
{
|
|
*lphwnd = m_hwnd;
|
|
return (m_hwnd ? S_OK : E_FAIL);
|
|
}
|
|
|
|
HRESULT STDMETHODCALLTYPE CBrowser::ContextSensitiveHelp(BOOL fEnterMode)
|
|
{
|
|
return E_NOTIMPL;
|
|
}
|
|
|
|
////////////////////////////////////////////////////////////////////////
|
|
//
|
|
// IAthenaBrowser
|
|
//
|
|
////////////////////////////////////////////////////////////////////////
|
|
|
|
BOOL IsOwner(HWND hwndOwner, HWND hwnd)
|
|
{
|
|
// Loop through until we find the topmost window
|
|
HWND hwndTemp = hwnd;
|
|
if (GetParent(hwndTemp))
|
|
{
|
|
while (GetParent(hwndTemp))
|
|
hwndTemp = GetParent(hwndTemp);
|
|
|
|
if (hwndOwner == hwndTemp)
|
|
return (TRUE);
|
|
}
|
|
|
|
return (FALSE);
|
|
}
|
|
|
|
HRESULT CBrowser::TranslateAccelerator(LPMSG lpmsg)
|
|
{
|
|
HWND hwndFocus;
|
|
BOOL fInnerValid, fViewFocus;
|
|
int i;
|
|
|
|
if (!(m_hwnd && IsWindow(m_hwnd)))
|
|
return S_FALSE;
|
|
|
|
if (FWABTranslateAccelerator(lpmsg))
|
|
return S_TRUE;
|
|
|
|
hwndFocus = GetFocus();
|
|
|
|
//check if it is a menu message
|
|
if (!GetTlsGlobalActiveNote())
|
|
{
|
|
if (m_pCoolbar->IsMenuMessage(lpmsg) == S_OK)
|
|
return S_OK;
|
|
}
|
|
|
|
// handle the mousewheel messages for this thread
|
|
if ((g_msgMSWheel && (lpmsg->message == g_msgMSWheel)) || (lpmsg->message == WM_MOUSEWHEEL))
|
|
{
|
|
POINT pt;
|
|
HWND hwndT;
|
|
|
|
pt.x = GET_X_LPARAM(lpmsg->lParam);
|
|
pt.y = GET_Y_LPARAM(lpmsg->lParam);
|
|
|
|
hwndT = WindowFromPoint(pt);
|
|
if (hwndT != m_hwnd && IsChild(m_hwnd, hwndT))
|
|
SendMessage(hwndT, lpmsg->message, lpmsg->wParam, lpmsg->lParam);
|
|
else if (hwndFocus != m_hwnd && IsChild(m_hwnd, hwndFocus))
|
|
SendMessage(hwndFocus, lpmsg->message, lpmsg->wParam, lpmsg->wParam);
|
|
else
|
|
return S_FALSE;
|
|
return S_OK;
|
|
}
|
|
|
|
HWND hwndDropDown = HwndGlobalDropDown();
|
|
BOOL fRetCode;
|
|
|
|
if (hwndDropDown)
|
|
{
|
|
if (lpmsg->message == WM_LBUTTONDOWN ||
|
|
lpmsg->message == WM_NCLBUTTONDOWN ||
|
|
lpmsg->message == WM_RBUTTONDOWN ||
|
|
lpmsg->message == WM_NCRBUTTONDOWN)
|
|
{
|
|
fRetCode = (BOOL)::SendMessage(hwndDropDown, WMR_CLICKOUTSIDE,
|
|
CLK_OUT_MOUSE, (LPARAM)lpmsg->hwnd);
|
|
if (fRetCode)
|
|
return (S_OK);
|
|
}
|
|
|
|
if (lpmsg->message == WM_KEYDOWN &&
|
|
// One of the possible hot keys
|
|
(lpmsg->wParam==VK_ESCAPE || lpmsg->wParam==VK_TAB))
|
|
{
|
|
fRetCode = (BOOL)::SendMessage(hwndDropDown, WMR_CLICKOUTSIDE,
|
|
CLK_OUT_KEYBD, (LPARAM)lpmsg->wParam);
|
|
if (fRetCode)
|
|
return S_OK;
|
|
}
|
|
}
|
|
|
|
if (!(hwndFocus && (IsChild(m_hwnd, hwndFocus) || m_hwnd == hwndFocus || IsOwner(m_hwnd, hwndFocus))))
|
|
return S_FALSE;
|
|
|
|
fInnerValid = m_pView && m_hwndInner && IsWindow(m_hwndInner);
|
|
fViewFocus = fInnerValid && hwndFocus && (IsChild(m_hwndInner, hwndFocus) || m_hwndInner == hwndFocus);
|
|
|
|
if (fViewFocus)
|
|
{
|
|
if (m_pView->TranslateAccelerator(lpmsg) == S_OK)
|
|
return S_OK;
|
|
}
|
|
|
|
for (i=0; i<ITB_MAX; i++)
|
|
{
|
|
if (m_rgTBar[i].ptbar && UnkHasFocusIO(m_rgTBar[i].ptbar) == S_OK)
|
|
{
|
|
if (UnkTranslateAcceleratorIO(m_rgTBar[i].ptbar, lpmsg) == S_OK)
|
|
return S_OK;
|
|
break;
|
|
}
|
|
}
|
|
|
|
// Handle tabbing between windows
|
|
if (lpmsg->hwnd &&
|
|
IsChild(m_hwnd, lpmsg->hwnd))
|
|
{
|
|
if (lpmsg->message == WM_KEYDOWN)
|
|
{
|
|
if (lpmsg->wParam == VK_TAB && (FALSE == !!(0x8000 & GetKeyState(VK_CONTROL))))
|
|
{
|
|
SHORT state = GetKeyState(VK_SHIFT);
|
|
HWND hwndNext = GetNextDlgTabItem(m_hwnd, GetFocus(), !!(state & 0x8000));
|
|
SetFocus(hwndNext);
|
|
return (S_OK);
|
|
}
|
|
}
|
|
}
|
|
|
|
if (lpmsg->hwnd &&
|
|
IsChild(m_hwnd, lpmsg->hwnd) && s_hAccelBrowser && ::TranslateAccelerator(m_hwnd, s_hAccelBrowser, lpmsg))
|
|
return S_OK;
|
|
|
|
// if the view doesn't have focus, it still gets a chance at the accelerator, after the browser
|
|
if (fInnerValid && !fViewFocus)
|
|
if (m_pView->TranslateAccelerator(lpmsg) == S_OK)
|
|
return S_OK;
|
|
|
|
return S_FALSE;
|
|
}
|
|
|
|
//
|
|
// Add the specified toolbar (as punkSrc) to this toolbar site
|
|
//
|
|
// Returns: S_OK, if successfully done.
|
|
// E_FAIL, if failed (exceeded maximum).
|
|
// E_NOINTERFACE, the toolbar does not support an approriate interface.
|
|
//
|
|
HRESULT CBrowser::AddToolbar(IUnknown* punk, DWORD dwIndex, BOOL fShow, BOOL fActivate)
|
|
{
|
|
HRESULT hres = E_FAIL;
|
|
|
|
Assert(ITB_NONE == FindTBar(punk));
|
|
Assert(dwIndex < ITB_MAX);
|
|
Assert(m_rgTBar[dwIndex].ptbar == NULL);
|
|
|
|
if (punk->QueryInterface(IID_IOleCommandTarget, (LPVOID*)&m_rgTBar[dwIndex].pOleCmdTarget) != S_OK)
|
|
{
|
|
m_rgTBar[dwIndex].pOleCmdTarget = NULL;
|
|
}
|
|
|
|
hres = punk->QueryInterface(IID_IDockingWindow, (LPVOID*)&m_rgTBar[dwIndex].ptbar);
|
|
if (SUCCEEDED(hres))
|
|
{
|
|
m_rgTBar[dwIndex].fShow = fShow;
|
|
UnkSetSite(m_rgTBar[dwIndex].ptbar, (IAthenaBrowser *)this);
|
|
|
|
if (fActivate)
|
|
m_rgTBar[dwIndex].ptbar->ShowDW(fShow);
|
|
}
|
|
|
|
return hres;
|
|
}
|
|
|
|
HRESULT CBrowser::ShowToolbar(IUnknown* punkSrc, BOOL fShow)
|
|
{
|
|
UINT itb = FindTBar(punkSrc);
|
|
if (itb == ITB_NONE)
|
|
{
|
|
Assert(0);
|
|
return E_INVALIDARG;
|
|
}
|
|
|
|
if (m_rgTBar[itb].ptbar)
|
|
{
|
|
m_rgTBar[itb].fShow = fShow;
|
|
m_rgTBar[itb].ptbar->ShowDW(fShow);
|
|
}
|
|
|
|
return S_OK;
|
|
}
|
|
|
|
HRESULT CBrowser::RemoveToolbar(IUnknown* punkSrc)
|
|
{
|
|
UINT itb = FindTBar(punkSrc);
|
|
if (itb == ITB_NONE)
|
|
{
|
|
Assert(0);
|
|
return E_INVALIDARG;
|
|
}
|
|
|
|
ReleaseToolbarItem(itb, TRUE);
|
|
|
|
// Clear the rect and resize the inner ones (including the view).
|
|
SetRect(&m_rgTBar[itb].rcBorderTool, 0, 0, 0, 0);
|
|
ResizeNextBorder(itb+1);
|
|
|
|
return S_OK;
|
|
}
|
|
|
|
HRESULT CBrowser::HasFocus(UINT itb)
|
|
{
|
|
HRESULT hres = S_FALSE;
|
|
|
|
if (ITB_OEVIEW == itb)
|
|
hres = (ITB_OEVIEW == m_itbLastFocus) ? S_OK : S_FALSE;
|
|
else if (m_rgTBar[itb].fShow && m_rgTBar[itb].ptbar)
|
|
hres = UnkHasFocusIO(m_rgTBar[itb].ptbar);
|
|
|
|
return hres;
|
|
}
|
|
|
|
HRESULT CBrowser::OnViewWindowActive(IViewWindow *pAV)
|
|
{
|
|
_OnFocusChange(ITB_OEVIEW);
|
|
return NOERROR;
|
|
}
|
|
|
|
HRESULT CBrowser::BrowseObject(FOLDERID idFolder, DWORD dwFlags)
|
|
{
|
|
if (!m_pTreeView)
|
|
return E_FAIL;
|
|
return m_pTreeView->SetSelection(idFolder, TVSS_INSERTIFNOTFOUND);
|
|
}
|
|
|
|
HRESULT CBrowser::GetStatusBar(CStatusBar * * ppStatusBar)
|
|
{
|
|
if (m_pStatus)
|
|
{
|
|
*ppStatusBar = m_pStatus;
|
|
m_pStatus->AddRef();
|
|
return S_OK;
|
|
}
|
|
*ppStatusBar = NULL;
|
|
return E_FAIL;
|
|
}
|
|
|
|
HRESULT CBrowser::GetCoolbar(CBands * * ppCoolbar)
|
|
{
|
|
if (m_pCoolbar)
|
|
{
|
|
*ppCoolbar = m_pCoolbar;
|
|
m_pCoolbar->AddRef();
|
|
return S_OK;
|
|
}
|
|
*ppCoolbar = NULL;
|
|
return E_FAIL;
|
|
}
|
|
|
|
HRESULT CBrowser::GetTreeView(CTreeView * * ppTreeView)
|
|
{
|
|
if (m_pTreeView)
|
|
{
|
|
*ppTreeView = m_pTreeView;
|
|
m_pTreeView->AddRef();
|
|
return S_OK;
|
|
}
|
|
*ppTreeView = NULL;
|
|
return E_FAIL;
|
|
}
|
|
|
|
HRESULT CBrowser::GetFolderBar(CFolderBar * * ppFolderBar)
|
|
{
|
|
if (m_pFolderBar)
|
|
{
|
|
*ppFolderBar = m_pFolderBar;
|
|
m_pFolderBar->AddRef();
|
|
return S_OK;
|
|
}
|
|
*ppFolderBar = NULL;
|
|
return E_FAIL;
|
|
}
|
|
|
|
HRESULT CBrowser::GetLanguageMenu(HMENU *phMenu, UINT uiCodepage)
|
|
{
|
|
if(!m_hMenuLanguage)
|
|
InitMultiLanguage();
|
|
else if (IsMenu(m_hMenuLanguage))
|
|
DestroyMenu(m_hMenuLanguage);
|
|
|
|
UINT cp;
|
|
|
|
if(uiCodepage)
|
|
cp = uiCodepage;
|
|
else if(m_pView)
|
|
{
|
|
IMessageWindow *pWindow;
|
|
|
|
if (SUCCEEDED(m_pView->QueryInterface(IID_IMessageWindow, (LPVOID *) &pWindow)))
|
|
{
|
|
pWindow->GetCurCharSet(&cp);
|
|
pWindow->Release();
|
|
}
|
|
else
|
|
cp = GetACP();
|
|
}
|
|
else
|
|
cp = GetACP();
|
|
|
|
m_hMenuLanguage = CreateMimeLanguageMenu(TRUE,TRUE, cp);
|
|
|
|
if (!m_hMenuLanguage)
|
|
return E_FAIL;
|
|
|
|
*phMenu = m_hMenuLanguage;
|
|
return S_OK;
|
|
}
|
|
|
|
HRESULT CBrowser::InitPopupMenu(HMENU hMenu)
|
|
{
|
|
if (!hMenu)
|
|
return E_INVALIDARG;
|
|
MenuUtil_EnablePopupMenu(hMenu, this);
|
|
|
|
return S_OK;
|
|
}
|
|
|
|
HRESULT CBrowser::UpdateToolbar()
|
|
{
|
|
if (m_pCoolbar)
|
|
return (m_pCoolbar->Update());
|
|
|
|
return (E_FAIL);
|
|
}
|
|
|
|
|
|
HRESULT CBrowser::GetFolderType(FOLDERTYPE *pftType)
|
|
{
|
|
if (pftType)
|
|
{
|
|
*pftType = m_ftSel;
|
|
return (S_OK);
|
|
}
|
|
|
|
return (E_INVALIDARG);
|
|
}
|
|
|
|
HRESULT CBrowser::GetCurrentFolder(FOLDERID *pidFolder)
|
|
{
|
|
if (pidFolder)
|
|
{
|
|
*pidFolder = m_idSelected;
|
|
return (S_OK);
|
|
}
|
|
|
|
return (E_INVALIDARG);
|
|
}
|
|
|
|
HRESULT CBrowser::GetCurrentView(IViewWindow **ppView)
|
|
{
|
|
if (ppView)
|
|
{
|
|
*ppView = m_pView;
|
|
(*ppView)->AddRef();
|
|
return (S_OK);
|
|
}
|
|
|
|
return (E_INVALIDARG);
|
|
}
|
|
|
|
////////////////////////////////////////////////////////////////////////
|
|
//
|
|
// IDockingWindowSite
|
|
//
|
|
////////////////////////////////////////////////////////////////////////
|
|
|
|
//
|
|
// This is an implementation of IDockingWindowSite::GetBorderDW.
|
|
//
|
|
// This function returns a bounding rectangle for the specified toolbar
|
|
// (by punkSrc). It gets the effective client area, then subtract border
|
|
// area taken by "outer" toolbars.
|
|
//
|
|
HRESULT CBrowser::GetBorderDW(IUnknown* punkSrc, LPRECT lprectBorder)
|
|
{
|
|
UINT itb = FindTBar(punkSrc);
|
|
if (itb == ITB_NONE)
|
|
{
|
|
Assert(0);
|
|
return E_INVALIDARG;
|
|
}
|
|
|
|
GetClientArea(lprectBorder);
|
|
|
|
//
|
|
// Subtract border area taken by "outer toolbars"
|
|
//
|
|
for (UINT i=0; i<itb; i++)
|
|
{
|
|
lprectBorder->left += m_rgTBar[i].rcBorderTool.left;
|
|
lprectBorder->top += m_rgTBar[i].rcBorderTool.top;
|
|
lprectBorder->right -= m_rgTBar[i].rcBorderTool.right;
|
|
lprectBorder->bottom -= m_rgTBar[i].rcBorderTool.bottom;
|
|
}
|
|
|
|
DOUTL(4, "CBrowser::GetBorderDW called returning=%x,%x,%x,%x",
|
|
lprectBorder->left, lprectBorder->top, lprectBorder->right, lprectBorder->bottom);
|
|
return S_OK;
|
|
}
|
|
|
|
HRESULT CBrowser::RequestBorderSpaceDW(IUnknown* punkSrc, LPCBORDERWIDTHS pborderwidths)
|
|
{
|
|
UINT itb = FindTBar(punkSrc);
|
|
if (itb == ITB_NONE)
|
|
{
|
|
Assert(0);
|
|
return E_INVALIDARG;
|
|
}
|
|
|
|
DOUTL(4, "CBrowser::ReqestBorderSpaceST pborderwidths=%x,%x,%x,%x",
|
|
pborderwidths->left, pborderwidths->top, pborderwidths->right, pborderwidths->bottom);
|
|
return S_OK;
|
|
}
|
|
|
|
HRESULT CBrowser::SetBorderSpaceDW(IUnknown* punkSrc, LPCBORDERWIDTHS pborderwidths)
|
|
{
|
|
UINT itb = FindTBar(punkSrc);
|
|
if (itb == ITB_NONE)
|
|
{
|
|
Assert(0);
|
|
return E_INVALIDARG;
|
|
}
|
|
|
|
DOUTL(4, "CBrowser::SetBorderSpaceDW pborderwidths=%x,%x,%x,%x",
|
|
pborderwidths->left, pborderwidths->top, pborderwidths->right, pborderwidths->bottom);
|
|
|
|
m_rgTBar[itb].rcBorderTool = *pborderwidths;
|
|
ResizeNextBorder(itb+1);
|
|
return S_OK;
|
|
}
|
|
|
|
////////////////////////////////////////////////////////////////////////
|
|
//
|
|
// IInputObjectSite
|
|
//
|
|
////////////////////////////////////////////////////////////////////////
|
|
|
|
HRESULT CBrowser::OnFocusChangeIS(IUnknown* punkSrc, BOOL fSetFocus)
|
|
{
|
|
UINT itb = FindTBar(punkSrc);
|
|
if (itb == ITB_NONE)
|
|
{
|
|
//Assert(0);
|
|
return E_INVALIDARG;
|
|
}
|
|
|
|
//
|
|
// Note that we keep track of which toolbar got the focus last.
|
|
// We can't reliably monitor the kill focus event because OLE's
|
|
// window procedure hook (for merged menu dispatching code) changes
|
|
// focus around.
|
|
//
|
|
if (fSetFocus)
|
|
{
|
|
_OnFocusChange(itb);
|
|
}
|
|
|
|
UpdateToolbar();
|
|
|
|
return S_OK;
|
|
}
|
|
|
|
////////////////////////////////////////////////////////////////////////
|
|
//
|
|
// Support functions for IAthenaBrowser and IDockingWindowSite
|
|
//
|
|
////////////////////////////////////////////////////////////////////////
|
|
|
|
//
|
|
// This function is called, when either tree control or the drives
|
|
// get the focus.
|
|
//
|
|
void CBrowser::_OnFocusChange(UINT itb)
|
|
{
|
|
//
|
|
// If the view is loosing the focus (within the explorer),
|
|
// we should let it know. We should update _itbLastFocus before
|
|
// calling UIActivate, because it will call our InsertMenu back.
|
|
//
|
|
if (m_itbLastFocus == itb)
|
|
return;
|
|
|
|
UINT itbPrevFocus = m_itbLastFocus;
|
|
m_itbLastFocus = itb;
|
|
|
|
if (itbPrevFocus == ITB_OEVIEW)
|
|
{
|
|
if (m_pView)
|
|
m_pView->UIActivate(SVUIA_ACTIVATE_NOFOCUS);
|
|
}
|
|
else if (itbPrevFocus != ITB_NONE)
|
|
{
|
|
UnkUIActivateIO(m_rgTBar[itbPrevFocus].ptbar, FALSE, NULL);
|
|
}
|
|
|
|
UpdateToolbar();
|
|
}
|
|
|
|
|
|
UINT CBrowser::FindTBar(IUnknown* punkSrc)
|
|
{
|
|
int i;
|
|
|
|
Assert(punkSrc);
|
|
|
|
// Quick check without QI
|
|
for (i=0; i<ITB_MAX ;i++ )
|
|
{
|
|
if (punkSrc == m_rgTBar[i].ptbar)
|
|
return i;
|
|
}
|
|
|
|
// If failed, do the real COM object identity check.
|
|
for (i=0; i<ITB_MAX ;i++ )
|
|
{
|
|
if (m_rgTBar[i].ptbar)
|
|
{
|
|
if (_IsSameObject(m_rgTBar[i].ptbar, punkSrc)==S_OK)
|
|
{
|
|
return i;
|
|
}
|
|
}
|
|
}
|
|
|
|
return ITB_NONE;
|
|
}
|
|
|
|
void CBrowser::ReleaseToolbarItem(int itb, BOOL fClose)
|
|
{
|
|
IDockingWindow *ptbTmp;
|
|
|
|
// grab it and NULL it out to eliminate race condition.
|
|
// (actually, there's still a v. small window btwn the 2 statements).
|
|
//
|
|
// e.g. if you close a WebBar and then quickly shutdown windows,
|
|
// the close destroys the window etc. but then the shutdown code
|
|
// does _SaveToolbars which tries to do ->Save on that destroyed guy.
|
|
ptbTmp = m_rgTBar[itb].ptbar;
|
|
m_rgTBar[itb].ptbar = NULL;
|
|
|
|
if (fClose)
|
|
ptbTmp->CloseDW(0);
|
|
UnkSetSite(ptbTmp, NULL);
|
|
ptbTmp->Release();
|
|
|
|
SafeRelease(m_rgTBar[itb].pOleCmdTarget);
|
|
m_rgTBar[itb].pOleCmdTarget = NULL;
|
|
}
|
|
|
|
void CBrowser::ResizeNextBorder(UINT itb)
|
|
{
|
|
// Find the next toolbar (even non-visible one)
|
|
RECT rc;
|
|
IDockingWindow* ptbarNext = NULL;
|
|
|
|
for (int i=itb; i<ITB_MAX; i++)
|
|
{
|
|
if (m_rgTBar[i].ptbar)
|
|
{
|
|
ptbarNext = m_rgTBar[i].ptbar;
|
|
break;
|
|
}
|
|
}
|
|
|
|
if (ptbarNext)
|
|
{
|
|
GetBorderDW(ptbarNext, &rc);
|
|
ptbarNext->ResizeBorderDW(&rc, (IUnknown*)(IAthenaBrowser*)this, TRUE);
|
|
}
|
|
else
|
|
{
|
|
// resize the inner shell view
|
|
GetViewRect(&rc);
|
|
if (m_hwndInner)
|
|
{
|
|
SetWindowPos(m_hwndInner,
|
|
NULL,
|
|
rc.left,
|
|
rc.top,
|
|
rc.right - rc.left,
|
|
rc.bottom - rc.top,
|
|
SWP_NOZORDER | SWP_NOACTIVATE);
|
|
}
|
|
else
|
|
{
|
|
InvalidateRect(m_hwnd, &rc, FALSE);
|
|
}
|
|
}
|
|
}
|
|
|
|
void CBrowser::GetClientArea(LPRECT prc)
|
|
{
|
|
static const int s_rgCtlIds[] = { 1, 0, 1, IDC_STATUS_BAR, 0, 0};
|
|
Assert(m_hwnd);
|
|
GetEffectiveClientRect(m_hwnd, prc, (LPINT)s_rgCtlIds);
|
|
}
|
|
|
|
HRESULT CBrowser::GetViewRect(LPRECT prc)
|
|
{
|
|
Assert(m_hwnd);
|
|
GetClientArea(prc);
|
|
|
|
//
|
|
// Extract the border taken by all "frame" toolbars
|
|
//
|
|
for (int i=0; i<ITB_MAX; i++)
|
|
{
|
|
prc->left += m_rgTBar[i].rcBorderTool.left;
|
|
prc->top += m_rgTBar[i].rcBorderTool.top;
|
|
prc->right -= m_rgTBar[i].rcBorderTool.right;
|
|
prc->bottom -= m_rgTBar[i].rcBorderTool.bottom;
|
|
}
|
|
|
|
return (S_OK);
|
|
}
|
|
|
|
HRESULT CBrowser::GetLayout(PLAYOUT playout)
|
|
{
|
|
Assert(playout);
|
|
if (playout->cbSize != sizeof(LAYOUT))
|
|
return(E_FAIL);
|
|
|
|
Assert(m_rLayout.cbSize == sizeof(LAYOUT));
|
|
CopyMemory(playout, &m_rLayout, sizeof(LAYOUT));
|
|
|
|
return (S_OK);
|
|
}
|
|
|
|
HRESULT CBrowser::QueryStatus(const GUID *pguidCmdGroup, ULONG cCmds, OLECMD prgCmds[],
|
|
OLECMDTEXT *pCmdText)
|
|
{
|
|
ULONG cServer;
|
|
HRESULT hr = S_OK;
|
|
|
|
// ATTENZIONE!
|
|
// the view gets it first because it might want to handle a command that the treeview normally
|
|
// handles. this is really only necessary for acct views where folders are displayed in the right
|
|
// pane, and folder-related commands should work on the selected folder and not the current
|
|
// treeview selection
|
|
|
|
// View always get's it
|
|
if (m_pViewCT)
|
|
{
|
|
m_pViewCT->QueryStatus(pguidCmdGroup, cCmds, prgCmds, pCmdText);
|
|
}
|
|
|
|
// TreeView always get's it
|
|
if (m_pTreeView)
|
|
{
|
|
m_pTreeView->QueryStatus(pguidCmdGroup, cCmds, prgCmds, pCmdText);
|
|
}
|
|
|
|
// Contact's get's it
|
|
if (m_pNavPane)
|
|
{
|
|
m_pNavPane->QueryStatus(pguidCmdGroup, cCmds, prgCmds, pCmdText);
|
|
}
|
|
|
|
MenuUtil_NewMessageIDsQueryStatus(pguidCmdGroup, cCmds, prgCmds, pCmdText, (m_ftSel != FOLDER_NEWS));
|
|
|
|
// Loop through the list looking for commands the view didn't handle
|
|
for (ULONG i = 0; i < cCmds; i++)
|
|
{
|
|
if (prgCmds[i].cmdf == 0)
|
|
{
|
|
// Handle the Send and Receive popup menu
|
|
if (prgCmds[i].cmdID >= ID_ACCOUNT_FIRST && prgCmds[i].cmdID<= ID_ACCOUNT_LAST)
|
|
{
|
|
prgCmds[i].cmdf = OLECMDF_SUPPORTED | OLECMDF_ENABLED;
|
|
continue;
|
|
}
|
|
|
|
// Envelope stuff
|
|
if (prgCmds[i].cmdID >= ID_ENVELOPE_HOST_FIRST && prgCmds[i].cmdID <= ID_ENVELOPE_HOST_LAST)
|
|
{
|
|
prgCmds[i].cmdf = OLECMDF_SUPPORTED | OLECMDF_ENABLED;
|
|
continue;
|
|
}
|
|
|
|
if (prgCmds[i].cmdID >= ID_NEW_ACCT_FIRST && prgCmds[i].cmdID <= ID_NEW_ACCT_LAST)
|
|
{
|
|
prgCmds[i].cmdf = OLECMDF_SUPPORTED | OLECMDF_ENABLED;
|
|
continue;
|
|
}
|
|
|
|
// Regular commands
|
|
switch (prgCmds[i].cmdID)
|
|
{
|
|
case ID_WORK_OFFLINE:
|
|
{
|
|
// Always enabled and supported
|
|
prgCmds[i].cmdf = OLECMDF_SUPPORTED | OLECMDF_ENABLED;
|
|
if (g_pConMan->IsGlobalOffline())
|
|
prgCmds[i].cmdf |= OLECMDF_LATCHED;
|
|
break;
|
|
}
|
|
|
|
case ID_SEND_RECEIVE:
|
|
if (g_dwAthenaMode & MODE_NEWSONLY)
|
|
{
|
|
//We want to leave it enabled;
|
|
prgCmds[i].cmdf = OLECMDF_SUPPORTED | OLECMDF_ENABLED;
|
|
break;
|
|
}
|
|
//Fall through. In News Only mode we want to do Send All even for Send & Receive All
|
|
case ID_POPUP_ENVELOPE_HOST:
|
|
case ID_RECEIVE_ALL:
|
|
{
|
|
// At least one SMTP server is configured
|
|
if (SUCCEEDED(g_pAcctMan->GetAccountCount(ACCT_MAIL, &cServer)))
|
|
{
|
|
if (cServer)
|
|
prgCmds[i].cmdf = OLECMDF_SUPPORTED | OLECMDF_ENABLED;
|
|
else
|
|
prgCmds[i].cmdf = OLECMDF_SUPPORTED;
|
|
}
|
|
break;
|
|
}
|
|
|
|
case ID_SEND_ALL:
|
|
{
|
|
DWORD cMail = 0, cNews = 0;
|
|
|
|
// At least one SMTP server is configured
|
|
if (SUCCEEDED(g_pAcctMan->GetAccountCount(ACCT_MAIL, &cMail)) &&
|
|
SUCCEEDED(g_pAcctMan->GetAccountCount(ACCT_NEWS, &cNews)))
|
|
{
|
|
if (cMail || cNews)
|
|
prgCmds[i].cmdf = OLECMDF_SUPPORTED | OLECMDF_ENABLED;
|
|
else
|
|
prgCmds[i].cmdf = OLECMDF_SUPPORTED;
|
|
}
|
|
break;
|
|
}
|
|
|
|
case ID_IMAP_FOLDERS:
|
|
{
|
|
// At least one news server is configured
|
|
if (SUCCEEDED(g_pAcctMan->GetAccountCount(ACCT_MAIL, &cServer)))
|
|
{
|
|
if (cServer)
|
|
prgCmds[i].cmdf = OLECMDF_SUPPORTED | OLECMDF_ENABLED;
|
|
else
|
|
prgCmds[i].cmdf = OLECMDF_SUPPORTED;
|
|
}
|
|
break;
|
|
}
|
|
|
|
case ID_FOLDER_LIST:
|
|
{
|
|
// Always enabled
|
|
prgCmds[i].cmdf = OLECMDF_SUPPORTED | OLECMDF_ENABLED;
|
|
|
|
// Is it checked?
|
|
if (m_rLayout.fFolderList)
|
|
prgCmds[i].cmdf |= OLECMDF_LATCHED;
|
|
|
|
break;
|
|
}
|
|
|
|
case ID_CONTACTS_LIST:
|
|
{
|
|
// enabled only when not in outnews mode
|
|
prgCmds[i].cmdf = OLECMDF_SUPPORTED;
|
|
|
|
if ((g_dwAthenaMode & MODE_OUTLOOKNEWS) != MODE_OUTLOOKNEWS)
|
|
{
|
|
prgCmds[i].cmdf |= OLECMDF_ENABLED;
|
|
}
|
|
|
|
// Is it checked?
|
|
if (m_rLayout.fContacts)
|
|
prgCmds[i].cmdf |= OLECMDF_LATCHED;
|
|
|
|
break;
|
|
}
|
|
|
|
case ID_EXIT_LOGOFF:
|
|
case ID_LOGOFF_IDENTITY:
|
|
{
|
|
if (MU_CountUsers() > 1)
|
|
prgCmds[i].cmdf = OLECMDF_SUPPORTED | OLECMDF_ENABLED;
|
|
else
|
|
prgCmds[i].cmdf = OLECMDF_SUPPORTED;
|
|
break;
|
|
}
|
|
|
|
case ID_DELETE_ACCEL:
|
|
case ID_DELETE_NO_TRASH_ACCEL:
|
|
{
|
|
IOleCommandTarget *pTarget = NULL;
|
|
OLECMD cmd = { 0 };
|
|
|
|
// Check to see if it's the treeview
|
|
if (S_OK == m_pTreeView->HasFocusIO())
|
|
{
|
|
pTarget = m_pTreeView;
|
|
}
|
|
|
|
// Check to see if it's anything else on the Info Column
|
|
else if (m_pNavPane->IsContactsFocus())
|
|
{
|
|
pTarget = m_pNavPane;
|
|
cmd.cmdID = ID_DELETE_CONTACT;
|
|
}
|
|
|
|
// Otherwise, it must be the view
|
|
else
|
|
{
|
|
pTarget = m_pViewCT;
|
|
if (prgCmds[i].cmdID == ID_DELETE_NO_TRASH_ACCEL)
|
|
cmd.cmdID = ID_DELETE_NO_TRASH;
|
|
else
|
|
cmd.cmdID = ID_DELETE;
|
|
}
|
|
|
|
// Hit the target with the right command
|
|
if (pTarget)
|
|
{
|
|
pTarget->QueryStatus(NULL, 1, &cmd, NULL);
|
|
prgCmds[i].cmdf = cmd.cmdf;
|
|
}
|
|
else
|
|
{
|
|
prgCmds[i].cmdf = OLECMDF_SUPPORTED;
|
|
}
|
|
break;
|
|
}
|
|
|
|
case ID_UP_ONE_LEVEL:
|
|
if (m_idSelected != FOLDERID_ROOT)
|
|
prgCmds[i].cmdf = OLECMDF_SUPPORTED | OLECMDF_ENABLED;
|
|
break;
|
|
|
|
case ID_SHOW_TOOLBAR:
|
|
case ID_SHOW_FILTERBAR:
|
|
prgCmds[i].cmdf = OLECMDF_SUPPORTED | OLECMDF_ENABLED;
|
|
break;
|
|
|
|
case ID_SWITCH_IDENTITY:
|
|
case ID_IDENTITIES:
|
|
case ID_MANAGE_IDENTITIES:
|
|
case ID_NEW_IDENTITY:
|
|
if (((g_dwAthenaMode & MODE_OUTLOOKNEWS) == MODE_OUTLOOKNEWS) && (MU_CountUsers() <= 1))
|
|
{
|
|
prgCmds[i].cmdf = OLECMDF_SUPPORTED;
|
|
}
|
|
else
|
|
{
|
|
prgCmds[i].cmdf = OLECMDF_SUPPORTED | OLECMDF_ENABLED;
|
|
}
|
|
break;
|
|
|
|
case ID_MESSAGE_RULES_MAIL:
|
|
case ID_POPUP_NEW_ACCT:
|
|
if (g_dwAthenaMode & MODE_OUTLOOKNEWS)
|
|
{
|
|
prgCmds[i].cmdf = OLECMDF_SUPPORTED;
|
|
}
|
|
else
|
|
{
|
|
prgCmds[i].cmdf = OLECMDF_SUPPORTED | OLECMDF_ENABLED;
|
|
}
|
|
break;
|
|
|
|
case ID_MESSAGE_RULES_JUNK:
|
|
if (g_dwAthenaMode & MODE_OUTLOOKNEWS)
|
|
{
|
|
prgCmds[i].cmdf = OLECMDF_SUPPORTED;
|
|
}
|
|
else if (g_dwAthenaMode & MODE_JUNKMAIL)
|
|
{
|
|
prgCmds[i].cmdf = OLECMDF_SUPPORTED | OLECMDF_ENABLED;
|
|
}
|
|
break;
|
|
|
|
// always enabled
|
|
|
|
// File Menu
|
|
case ID_POPUP_NEW:
|
|
case ID_POPUP_FOLDER:
|
|
case ID_POPUP_IMPORT:
|
|
case ID_POPUP_EXPORT:
|
|
case ID_POPUP_USERS:
|
|
case ID_IMPORT_ADDRESS_BOOK:
|
|
case ID_IMPORT_WAB:
|
|
case ID_IMPORT_MESSAGES:
|
|
case ID_IMPORT_MAIL_ACCOUNTS:
|
|
case ID_IMPORT_NEWS_ACCOUNTS:
|
|
case ID_IMPORT_RULES:
|
|
case ID_EXPORT_ADDRESS_BOOK:
|
|
case ID_EXPORT_MESSAGES:
|
|
case ID_EXPORT_RULES:
|
|
case ID_EXIT:
|
|
|
|
// Edit Menu
|
|
case ID_POPUP_FIND:
|
|
case ID_FIND_MESSAGE:
|
|
case ID_FIND_PEOPLE:
|
|
|
|
// View Menu
|
|
case ID_POPUP_TOOLBAR:
|
|
case ID_POPUP_NEXT:
|
|
case ID_LAYOUT:
|
|
case ID_CUSTOMIZE:
|
|
|
|
// Go Menu
|
|
case ID_GO_INBOX:
|
|
case ID_GO_NEWS:
|
|
case ID_GO_FOLDER:
|
|
case ID_GO_NETMEETING:
|
|
case ID_GO_OUTBOX:
|
|
case ID_GO_SENT_ITEMS:
|
|
case ID_GO_DRAFTS:
|
|
|
|
// Message Menu
|
|
|
|
// Tools
|
|
case ID_POPUP_SEND_AND_RECEIVE:
|
|
case ID_SYNCHRONIZE:
|
|
case ID_ADDRESS_BOOK:
|
|
case ID_POPUP_RULES:
|
|
//case ID_MESSAGE_RULES_MAIL:
|
|
case ID_MESSAGE_RULES_NEWS:
|
|
//case ID_MESSAGE_RULES_JUNK:
|
|
case ID_MESSAGE_RULES_SENDERS:
|
|
case ID_OPTIONS:
|
|
case ID_ACCOUNTS:
|
|
|
|
// Help
|
|
case ID_HELP_CONTENTS:
|
|
case ID_README:
|
|
case ID_POPUP_MSWEB:
|
|
case ID_MSWEB_FREE_STUFF:
|
|
case ID_MSWEB_PRODUCT_NEWS:
|
|
case ID_MSWEB_FAQ:
|
|
case ID_MSWEB_SUPPORT:
|
|
case ID_MSWEB_FEEDBACK:
|
|
case ID_MSWEB_BEST:
|
|
case ID_MSWEB_SEARCH:
|
|
case ID_MSWEB_HOME:
|
|
case ID_MSWEB_HOTMAIL:
|
|
case ID_ABOUT:
|
|
prgCmds[i].cmdf = OLECMDF_SUPPORTED | OLECMDF_ENABLED;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
return S_OK;
|
|
}
|
|
|
|
|
|
HRESULT CBrowser::Exec(const GUID *pguidCmdGroup, DWORD nCmdID, DWORD nCmdExecOpt,
|
|
VARIANTARG *pvaIn, VARIANTARG *pvaOut)
|
|
{
|
|
AssertSz(FALSE, "NYI");
|
|
return (E_NOTIMPL);
|
|
}
|
|
|
|
////////////////////////////////////////////////////////////////////////
|
|
//
|
|
// ITreeViewNotify
|
|
//
|
|
////////////////////////////////////////////////////////////////////////
|
|
|
|
void CBrowser::OnSelChange(FOLDERID idFolder)
|
|
{
|
|
HRESULT hr = S_OK;
|
|
IViewWindow *pNewView = NULL;
|
|
BOOL fViewFocus = FALSE;
|
|
|
|
// don't refresh if the pidls match
|
|
if (m_pView)
|
|
{
|
|
if (idFolder == m_idSelected)
|
|
return;
|
|
}
|
|
|
|
// Get Focus
|
|
HWND hwndFocus = GetFocus();
|
|
fViewFocus = (IsWindow(m_hwndInner) && IsChild(m_hwndInner, hwndFocus));
|
|
|
|
// hold on to the current pidl
|
|
m_idSelected = idFolder;
|
|
|
|
SetFolderType(idFolder);
|
|
|
|
hr = CreateFolderViewObject(m_idSelected, m_hwnd, IID_IViewWindow, (LPVOID *)&pNewView);
|
|
if (SUCCEEDED(hr))
|
|
{
|
|
IViewWindow *pOldView;
|
|
|
|
if (m_pView)
|
|
hr = m_pView->SaveViewState();
|
|
|
|
if (SUCCEEDED(hr))
|
|
{
|
|
RECT rc;
|
|
HWND hwnd;
|
|
|
|
// Release the old command target
|
|
if (m_pViewCT)
|
|
{
|
|
m_pViewCT->Release();
|
|
m_pViewCT = NULL;
|
|
}
|
|
|
|
pOldView = m_pView;
|
|
m_pView = pNewView;
|
|
|
|
GetViewRect(&rc);
|
|
hr = pNewView->CreateViewWindow(pOldView, (IAthenaBrowser*)this, &rc, &hwnd);
|
|
if (SUCCEEDED(hr))
|
|
{
|
|
if (pOldView)
|
|
{
|
|
pOldView->UIActivate(SVUIA_DEACTIVATE);
|
|
pOldView->DestroyViewWindow();
|
|
pOldView->Release();
|
|
}
|
|
|
|
m_pView->AddRef();
|
|
|
|
// Get the command target interface for the new view. If it fails,
|
|
// we can proceed, we just can't send commands.
|
|
if (FAILED(m_pView->QueryInterface(IID_IOleCommandTarget, (LPVOID *) &m_pViewCT)))
|
|
{
|
|
// Make sure that m_pViewCT is NULL
|
|
m_pViewCT = NULL;
|
|
}
|
|
|
|
m_hwndInner = hwnd;
|
|
m_pView->UIActivate(SVUIA_ACTIVATE_FOCUS);
|
|
if (m_itbLastFocus == ITB_NONE || m_itbLastFocus == ITB_OEVIEW || fViewFocus)
|
|
{
|
|
SetFocus(m_hwndInner);
|
|
m_itbLastFocus = ITB_OEVIEW;
|
|
}
|
|
UpdateToolbar();
|
|
|
|
if (m_pCoolbar)
|
|
m_pCoolbar->UpdateViewState();
|
|
}
|
|
else
|
|
{
|
|
// Bug #20855 - If we failed to browse, try to navigate to the root
|
|
// instead. If we failed to browse to the root, then
|
|
// we should just leave the view empty.
|
|
m_pView = pOldView;
|
|
AthMessageBoxW(m_hwnd, MAKEINTRESOURCEW(idsAthena), MAKEINTRESOURCEW(idsErrFailedNavigate),
|
|
0, MB_OK | MB_ICONSTOP);
|
|
BrowseObject(FOLDERID_ROOT, NULL);
|
|
}
|
|
|
|
/*
|
|
if (m_ftSel != FOLDER_HTTPMAIL)
|
|
{
|
|
if (m_pAdBar)
|
|
ShowToolbar((IDockingWindow*)m_pAdBar, FALSE);
|
|
|
|
if (m_pBodyBar)
|
|
ShowToolbar((IUnknown *) (IDockingWindow *) m_pBodyBar, m_rLayout.fInfoPane);
|
|
}
|
|
else
|
|
{
|
|
if (m_pBodyBar && m_rLayout.fInfoPane)
|
|
ShowToolbar((IUnknown *) (IDockingWindow *)m_pBodyBar, FALSE);
|
|
|
|
if (m_pAdBar && m_pAdBar->fValidUrl())
|
|
{
|
|
ShowToolbar((IDockingWindow*)m_pAdBar, TRUE);
|
|
}
|
|
}
|
|
*/
|
|
}
|
|
SafeRelease(pNewView);
|
|
}
|
|
|
|
}
|
|
|
|
void CBrowser::OnRename(FOLDERID idFolder)
|
|
{
|
|
m_idSelected = idFolder;
|
|
SetFolderType(idFolder);
|
|
}
|
|
|
|
void CBrowser::OnDoubleClick(FOLDERID idFolder)
|
|
{
|
|
return;
|
|
}
|
|
|
|
HRESULT CBrowser::OnConnectionNotify(CONNNOTIFY nCode, LPVOID pvData,
|
|
CConnectionManager *pConMan)
|
|
{
|
|
PostMessage(m_hwnd, CM_UPDATETOOLBAR, 0, 0L);
|
|
|
|
if (CONNNOTIFY_WORKOFFLINE == nCode)
|
|
{
|
|
if (NULL != pvData)
|
|
{
|
|
if (m_pStatus)
|
|
m_pStatus->SetConnectedStatus(CONN_STATUS_WORKOFFLINE);
|
|
}
|
|
else
|
|
{
|
|
if (m_pStatus)
|
|
m_pStatus->SetConnectedStatus(CONN_STATUS_CONNECTED);
|
|
}
|
|
}
|
|
else
|
|
if ((CONNNOTIFY_USER_CANCELLED == nCode) || (CONNNOTIFY_CONNECTED == nCode))
|
|
{
|
|
PostMessage(m_hwnd, WM_COMMAND, MAKEWPARAM(ID_RESYNCHRONIZE, 0), 0);
|
|
}
|
|
|
|
return (S_OK);
|
|
}
|
|
|
|
|
|
////////////////////////////////////////////////////////////////////////
|
|
//
|
|
// Message Handling
|
|
//
|
|
////////////////////////////////////////////////////////////////////////
|
|
|
|
LRESULT CALLBACK CBrowser::BrowserWndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
|
|
{
|
|
LRESULT lRet;
|
|
CBrowser *pThis;
|
|
LRESULT lres;
|
|
MSG Menumsg;
|
|
|
|
if (msg == WM_NCCREATE)
|
|
{
|
|
pThis = (CBrowser*)((LPCREATESTRUCT)lParam)->lpCreateParams;
|
|
SetWindowLongPtr(hwnd, GWLP_USERDATA, (LPARAM)pThis);
|
|
}
|
|
else
|
|
{
|
|
pThis = (CBrowser*)GetWindowLongPtr(hwnd, GWLP_USERDATA);
|
|
if (msg == WM_NCDESTROY)
|
|
{
|
|
SetWindowLongPtr(hwnd, GWLP_USERDATA, (LPARAM)0);
|
|
pThis->Release();
|
|
|
|
// If this shutdown is due to an identity switch...
|
|
if (s_fQuickShutdown)
|
|
{
|
|
if (NULL != g_pInstance)
|
|
{
|
|
// ... break out of the message loop in COutlookExpress::Start
|
|
g_pInstance->SetSwitchingUsers(TRUE);
|
|
}
|
|
|
|
s_fQuickShutdown = FALSE;
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
}
|
|
|
|
Menumsg.hwnd = hwnd;
|
|
Menumsg.message = msg;
|
|
Menumsg.wParam = wParam;
|
|
Menumsg.lParam = lParam;
|
|
|
|
if (pThis && (pThis->TranslateMenuMessage(&Menumsg, &lres) == S_OK))
|
|
return lres;
|
|
|
|
wParam = Menumsg.wParam;
|
|
lParam = Menumsg.lParam;
|
|
|
|
if (pThis)
|
|
return pThis->WndProc(hwnd, msg, wParam, lParam);
|
|
else
|
|
return DefWindowProc(hwnd, msg, wParam, lParam);
|
|
}
|
|
|
|
LRESULT CBrowser::WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
|
|
{
|
|
int i;
|
|
HWND hwndActive;
|
|
|
|
switch (msg)
|
|
{
|
|
HANDLE_MSG(hwnd, WM_CREATE, OnCreate);
|
|
HANDLE_MSG(hwnd, WM_SIZE, OnSize);
|
|
HANDLE_MSG(hwnd, WM_INITMENUPOPUP, OnInitMenuPopup);
|
|
HANDLE_MSG(hwnd, WM_COMMAND, OnCommand);
|
|
|
|
|
|
case WM_ENABLE:
|
|
if (!m_fInternal)
|
|
{
|
|
Assert (wParam || (m_hlDisabled.cHwnd == NULL && m_hlDisabled.rgHwnd == NULL));
|
|
EnableThreadWindows(&m_hlDisabled, (NULL != wParam), ETW_OE_WINDOWS_ONLY, hwnd);
|
|
g_hwndActiveModal = wParam ? NULL : hwnd;
|
|
}
|
|
break;
|
|
|
|
case WM_OE_ENABLETHREADWINDOW:
|
|
m_fInternal = 1;
|
|
EnableWindow(hwnd, (BOOL)wParam);
|
|
m_fInternal = 0;
|
|
break;
|
|
|
|
case WM_OE_ACTIVATETHREADWINDOW:
|
|
hwndActive = GetLastActivePopup(hwnd);
|
|
if (hwndActive && IsWindowEnabled(hwndActive) && IsWindowVisible(hwndActive))
|
|
ActivatePopupWindow(hwndActive);
|
|
break;
|
|
|
|
case WM_OESETFOCUS:
|
|
if (IsWindow((HWND) wParam) && IsWindowVisible((HWND) wParam))
|
|
SetFocus((HWND) wParam);
|
|
break;
|
|
|
|
case CBM_POSTCREATE:
|
|
DOUTL(2, "CBM_POSTCREATE: GetTickCount() = %ld", GetTickCount());
|
|
|
|
UpdateWindow(m_hwnd);
|
|
UpdateStatusBar();
|
|
m_fPainted = TRUE;
|
|
|
|
if (m_pTreeView)
|
|
{
|
|
m_pTreeView->Refresh();
|
|
|
|
if (!g_pConMan->IsGlobalOffline())
|
|
g_pConMan->DoOfflineTransactions();
|
|
|
|
// Set the focus to the view
|
|
m_itbLastFocus = ITB_OEVIEW;
|
|
|
|
m_pTreeView->SetSelection(m_idSelected, TVSS_INSERTIFNOTFOUND);
|
|
}
|
|
|
|
if (g_pConMan)
|
|
g_pConMan->OnActivate(TRUE);
|
|
|
|
ProcessIncompleteAccts(m_hwnd);
|
|
|
|
Assert(g_pSpooler);
|
|
|
|
if (g_pSpooler)
|
|
g_pSpooler->Advise(m_hwnd, TRUE);
|
|
|
|
|
|
// Tell the spooler we're done init'ing
|
|
if (g_pSpooler)
|
|
{
|
|
//safe fix for Bug#8149
|
|
g_pSpooler->OnStartupFinished();
|
|
}
|
|
|
|
if (g_pSpooler)
|
|
{
|
|
if (!!DwGetOption(OPT_POLLFORMSGS_ATSTARTUP))
|
|
{
|
|
DWORD dwFlags;
|
|
|
|
dwFlags = (!(g_dwAthenaMode & MODE_NEWSONLY)) ? DELIVER_NO_NEWSPOLL : 0;
|
|
|
|
g_pSpooler->StartDelivery(m_hwnd, NULL, FOLDERID_INVALID,
|
|
|
|
dwFlags | DELIVER_SEND | DELIVER_MAIL_RECV | DELIVER_POLL |
|
|
DELIVER_DIAL_ALWAYS | DELIVER_BACKGROUND |
|
|
DELIVER_OFFLINE_FLAGS | DELIVER_SERVER_TYPE_ALL);
|
|
}
|
|
}
|
|
|
|
return 0;
|
|
|
|
case CM_UPDATETOOLBAR:
|
|
UpdateToolbar();
|
|
return 0;
|
|
|
|
case WM_UPDATELAYOUT:
|
|
{
|
|
if (m_itbLastFocus == ITB_TREE)
|
|
CycleFocus(FALSE);
|
|
|
|
// Update our view to reflect these new options
|
|
if (m_pFolderBar)
|
|
m_pFolderBar->Update(FALSE, TRUE);
|
|
|
|
if (m_rgTBar[ITB_FOLDERBAR].fShow != m_rLayout.fFolderBar)
|
|
{
|
|
m_rgTBar[ITB_FOLDERBAR].fShow = !m_rgTBar[ITB_FOLDERBAR].fShow;
|
|
m_rgTBar[ITB_FOLDERBAR].ptbar->ShowDW(m_rgTBar[ITB_FOLDERBAR].fShow);
|
|
}
|
|
|
|
}
|
|
return 0;
|
|
|
|
case WM_PAINT:
|
|
DOUTL(2, "WM_PAINT: GetTickCount() = %ld", GetTickCount());
|
|
// if we don't have a shell view, paint a "clientedge window" instead
|
|
if (!m_pView)
|
|
{
|
|
HDC hdc;
|
|
PAINTSTRUCT ps;
|
|
RECT rc;
|
|
HBRUSH hBrush;
|
|
|
|
GetViewRect(&rc);
|
|
hdc = BeginPaint(hwnd, &ps);
|
|
DrawEdge(hdc, &rc, EDGE_SUNKEN, BF_RECT|BF_ADJUST);
|
|
hBrush = SelectBrush(hdc, GetSysColorBrush(COLOR_WINDOW));
|
|
PatBlt(hdc, rc.left, rc.top, rc.right - rc.left, rc.bottom - rc.top, PATCOPY);
|
|
SelectBrush(hdc, hBrush);
|
|
EndPaint(hwnd, &ps);
|
|
return 0;
|
|
}
|
|
break;
|
|
|
|
case WM_DISPLAYCHANGE:
|
|
{
|
|
WINDOWPLACEMENT wp;
|
|
wp.length = sizeof(wp);
|
|
GetWindowPlacement(hwnd, &wp);
|
|
SetWindowPlacement(hwnd, &wp);
|
|
}
|
|
if (m_hwndInner)
|
|
return SendMessage(m_hwndInner, msg, wParam, lParam);
|
|
return 0;
|
|
|
|
case WM_FONTCHANGE:
|
|
DeinitMultiLanguage();
|
|
// fail thru
|
|
case WM_SYSCOLORCHANGE:
|
|
case WM_WININICHANGE:
|
|
case WM_QUERYNEWPALETTE:
|
|
case WM_PALETTECHANGED:
|
|
// tell the toolbars Minus one coz we inform the InfoColumn seperately
|
|
for (i=0; i<ITB_MAX - 1; i++)
|
|
{
|
|
HWND hwndToolbar;
|
|
if (m_rgTBar[i].ptbar && SUCCEEDED(m_rgTBar[i].ptbar->GetWindow(&hwndToolbar)))
|
|
SendMessage(hwndToolbar, msg, wParam, lParam);
|
|
}
|
|
|
|
// Someone changed the default mail client.
|
|
#if 0
|
|
// The mapistub gets quite upset if you unload it while it has an active mapi
|
|
// call running
|
|
if (g_hlibMAPI && lParam && !lstrcmpi((LPSTR) lParam, "Software\\Clients\\Mail"))
|
|
{
|
|
FreeLibrary(g_hlibMAPI);
|
|
g_hlibMAPI = 0;
|
|
}
|
|
#endif
|
|
|
|
if (m_hwndInner)
|
|
return SendMessage(m_hwndInner, msg, wParam, lParam);
|
|
return 0;
|
|
|
|
case WM_MENUSELECT:
|
|
if (LOWORD(wParam) >= ID_STATIONERY_RECENT_0 && LOWORD(wParam) <= ID_STATIONERY_RECENT_9)
|
|
{
|
|
m_pStatus->ShowSimpleText(MAKEINTRESOURCE(idsRSListGeneralHelp));
|
|
return 0;
|
|
}
|
|
|
|
if (m_hwndInner)
|
|
return SendMessage(m_hwndInner, msg, wParam, lParam);
|
|
return 0;
|
|
|
|
case WM_NOTIFY:
|
|
if (IDC_STATUS_BAR == wParam && lParam)
|
|
{
|
|
m_pStatus->OnNotify((NMHDR *) lParam);
|
|
}
|
|
|
|
if (m_hwndInner)
|
|
return SendMessage(m_hwndInner, msg, wParam, lParam);
|
|
return 0;
|
|
|
|
case WM_DRAWITEM:
|
|
case WM_MEASUREITEM:
|
|
case WM_EXITMENULOOP:
|
|
case WM_ENTERMENULOOP:
|
|
case WM_ENTERSIZEMOVE:
|
|
case WM_EXITSIZEMOVE:
|
|
case WM_TIMECHANGE:
|
|
if (m_hwndInner)
|
|
return SendMessage(m_hwndInner, msg, wParam, lParam);
|
|
return 0;
|
|
|
|
case WM_SETFOCUS:
|
|
break;
|
|
|
|
case WM_INITMENU:
|
|
CancelGlobalDropDown();
|
|
break;
|
|
|
|
case WM_ACTIVATEAPP:
|
|
if (wParam && g_hwndActiveModal && g_hwndActiveModal != hwnd &&
|
|
!IsWindowEnabled(hwnd))
|
|
{
|
|
// $MODAL
|
|
// if we are getting activated, and are disabled then
|
|
// bring our 'active' window to the top
|
|
Assert (IsWindow(g_hwndActiveModal));
|
|
PostMessage(g_hwndActiveModal, WM_OE_ACTIVATETHREADWINDOW, 0, 0);
|
|
}
|
|
|
|
FrameActivatePopups(NULL != wParam);
|
|
break;
|
|
|
|
case WM_SYSCOMMAND:
|
|
// if we're minimizing, get the control with focus, as when we get the
|
|
// next WM_ACTIVATE we will already be minimized
|
|
if (wParam == SC_MINIMIZE)
|
|
m_hwndLastFocus = GetFocus();
|
|
break;
|
|
|
|
case WM_ACTIVATE:
|
|
if (LOWORD(wParam) == WA_INACTIVE)
|
|
{
|
|
if (!HIWORD(wParam))
|
|
{
|
|
// save the control with the focus don't do this is we're
|
|
// minimized, otherwise GetFocus()==m_hwnd
|
|
m_hwndLastFocus = GetFocus();
|
|
}
|
|
if (g_pConMan)
|
|
g_pConMan->OnActivate(FALSE);
|
|
FrameActivatePopups(FALSE);
|
|
}
|
|
else
|
|
{
|
|
HWND hwndFocus;
|
|
if (m_hwndLastFocus && IsWindow(m_hwndLastFocus) && IsChild(hwnd, m_hwndLastFocus))
|
|
SetFocus(m_hwndLastFocus);
|
|
else if (m_rgTBar[ITB_TREE].fShow && SUCCEEDED(m_rgTBar[ITB_TREE].ptbar->GetWindow(&hwndFocus)))
|
|
SetFocus(hwndFocus);
|
|
else if (m_hwndInner)
|
|
SetFocus(m_hwndInner);
|
|
|
|
if (g_pConMan && m_fPainted)
|
|
g_pConMan->OnActivate(TRUE);
|
|
|
|
FrameActivatePopups(FALSE);
|
|
}
|
|
|
|
if (m_pView)
|
|
{
|
|
// If the inner window is a message view, we need to hit it with
|
|
// a OnFrameWindowAcivate() so the preview pane get's updated
|
|
// correctly.
|
|
IMessageWindow *pWindow;
|
|
|
|
if (SUCCEEDED(m_pView->QueryInterface(IID_IMessageWindow, (LPVOID *) &pWindow)))
|
|
{
|
|
pWindow->OnFrameWindowActivate(LOWORD(wParam) != WA_INACTIVE);
|
|
pWindow->Release();
|
|
}
|
|
}
|
|
|
|
return 0;
|
|
|
|
case WM_ENDSESSION:
|
|
if (wParam)
|
|
{
|
|
DOUTL(2, "CBrowser::WM_ENDSESSION");
|
|
// g_fCheckOutboxOnShutdown = FALSE;
|
|
SendMessage(hwnd, WM_CLOSE, 0, 0L);
|
|
}
|
|
return 0;
|
|
|
|
case PUI_OFFICE_COMMAND:
|
|
if(wParam == PLUGUI_CMD_QUERY)
|
|
{
|
|
PLUGUI_QUERY pq;
|
|
|
|
pq.uQueryVal = 0; // initialize
|
|
pq.PlugUIInfo.uMajorVersion = OFFICE_VERSION_9; // Value filled in by Apps
|
|
pq.PlugUIInfo.uOleServer = FALSE; // Value filled in by Apps
|
|
|
|
return (pq.uQueryVal); // The state of the App
|
|
}
|
|
if(wParam != PLUGUI_CMD_SHUTDOWN)
|
|
return(0);
|
|
|
|
// for PLUGUI_CMD_SHUTDOWN fall to close application
|
|
CloseFinderTreads();
|
|
CloseThreadWindows(hwnd, GetCurrentThreadId());
|
|
|
|
case WM_CLOSE:
|
|
{
|
|
WINDOWPLACEMENT wp;
|
|
|
|
// WriteUnreadCount();
|
|
AcctUtil_FreeSendReceieveMenu(m_hMenu, m_cAcctMenu);
|
|
FreeNewAcctMenu(m_hMenu);
|
|
|
|
// Close any active RAS connections we brought up
|
|
if (g_pConMan)
|
|
{
|
|
// Release our notification for connection changes
|
|
g_pConMan->Unadvise(this);
|
|
}
|
|
|
|
if (g_pSpooler)
|
|
g_pSpooler->Advise(m_hwnd, FALSE);
|
|
|
|
if (m_pView)
|
|
{
|
|
FOLDERSETTINGS fs;
|
|
if (m_pViewCT)
|
|
{
|
|
m_pViewCT->Release();
|
|
m_pViewCT = NULL;
|
|
}
|
|
m_pView->SaveViewState();
|
|
m_pView->UIActivate(SVUIA_DEACTIVATE);
|
|
m_hwndInner = NULL;
|
|
m_pView->DestroyViewWindow();
|
|
m_pView->Release();
|
|
m_pView = NULL;
|
|
}
|
|
|
|
if (DwGetOption(OPT_PURGEWASTE))
|
|
EmptySpecialFolder(hwnd, FOLDER_DELETED);
|
|
|
|
// clean up the toolbars
|
|
for (i=0; i<ITB_MAX; i++)
|
|
{
|
|
if (m_rgTBar[i].ptbar)
|
|
ReleaseToolbarItem(i, TRUE);
|
|
}
|
|
|
|
// save browser settings
|
|
wp.length = sizeof(wp);
|
|
GetWindowPlacement(hwnd, &wp);
|
|
SetOption(OPT_BROWSERPOS, (LPVOID)&wp, sizeof(wp), NULL, 0);
|
|
|
|
if (m_idClearStatusTimer)
|
|
KillTimer(m_hwnd, m_idClearStatusTimer);
|
|
|
|
SaveLayoutSettings();
|
|
|
|
//Let the DocObj know that the browser is dying
|
|
if (m_pDocObj)
|
|
{
|
|
m_pDocObj->BrowserExiting();
|
|
}
|
|
|
|
// Unregister with Identity manager
|
|
if (m_dwIdentCookie != 0)
|
|
{
|
|
MU_UnregisterIdentityNotifier(m_dwIdentCookie);
|
|
m_dwIdentCookie = 0;
|
|
}
|
|
|
|
DestroyWindow(hwnd);
|
|
}
|
|
return 0;
|
|
|
|
case WM_NEW_MAIL:
|
|
Assert(0 == wParam);
|
|
Assert(0 == lParam);
|
|
|
|
// Add the tray icon
|
|
if (g_pInstance)
|
|
g_pInstance->UpdateTrayIcon(TRAYICONACTION_ADD);
|
|
|
|
// Play a sound
|
|
if (DwGetOption(OPT_NEWMAILSOUND) != 0)
|
|
{
|
|
if (!sndPlaySound((LPTSTR) s_szMailSndKey, SND_ASYNC | SND_NODEFAULT))
|
|
MessageBeep(MB_OK);
|
|
}
|
|
return 0;
|
|
|
|
case MVM_NOTIFYICONEVENT:
|
|
if (lParam == WM_LBUTTONDBLCLK)
|
|
{
|
|
if (IsIconic(m_hwnd))
|
|
ShowWindow(m_hwnd, SW_RESTORE);
|
|
SetForegroundWindow(m_hwnd);
|
|
}
|
|
return 0;
|
|
|
|
case MVM_SPOOLERDELIVERY:
|
|
SpoolerDeliver(wParam, lParam);
|
|
return 0;
|
|
|
|
case WM_TIMER:
|
|
if (wParam == TIMER_CLEAR_STATUS)
|
|
{
|
|
KillTimer(m_hwnd, m_idClearStatusTimer);
|
|
m_idClearStatusTimer = 0;
|
|
if (m_pStatus)
|
|
m_pStatus->SetSpoolerStatus(DELIVERY_NOTIFY_COMPLETE, 0);
|
|
}
|
|
return 0;
|
|
|
|
case WM_DESTROY:
|
|
{
|
|
#if 0
|
|
// We need to free our menu resource
|
|
HMENU hMenu = GetMenu(m_hwnd);
|
|
//SetMenu(m_hwnd, NULL);
|
|
DestroyMenu(hMenu);
|
|
#endif
|
|
RemoveProp(hwnd, c_szOETopLevel);
|
|
break;
|
|
}
|
|
|
|
}
|
|
|
|
return DefWindowProc(hwnd, msg, wParam, lParam);
|
|
}
|
|
|
|
//
|
|
// FUNCTION: CBrowser::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 CBrowser::OnCreate(HWND hwnd, LPCREATESTRUCT lpCreateStruct)
|
|
{
|
|
// Spooler comes first
|
|
g_fCheckOutboxOnShutdown = TRUE;
|
|
|
|
m_hwnd = hwnd;
|
|
|
|
// Set the title bar icon to the mailnews icon
|
|
UINT idRes = (g_dwAthenaMode & MODE_NEWSONLY) ? idiNewsGroup : idiMailNews;
|
|
|
|
m_hIcon = (HICON) LoadImage(g_hLocRes, MAKEINTRESOURCE(idRes), IMAGE_ICON, GetSystemMetrics(SM_CXICON), GetSystemMetrics(SM_CYICON), 0);
|
|
SendMessage(hwnd, WM_SETICON, ICON_BIG, (LPARAM)m_hIcon);
|
|
m_hIconSm = (HICON) LoadImage(g_hLocRes, MAKEINTRESOURCE(idRes), IMAGE_ICON, GetSystemMetrics(SM_CXSMICON), GetSystemMetrics(SM_CYSMICON), 0);
|
|
SendMessage(hwnd, WM_SETICON, ICON_SMALL, (LPARAM)m_hIconSm);
|
|
|
|
SetProp(hwnd, c_szOETopLevel, (HANDLE)TRUE);
|
|
|
|
m_pStatus = new CStatusBar();
|
|
if (!m_pStatus)
|
|
goto error;
|
|
|
|
m_pStatus->Initialize(m_hwnd, 0);
|
|
m_pStatus->ShowStatus(m_rLayout.fStatusBar);
|
|
|
|
// Init the menu bar
|
|
m_hMenu = LoadMenu(g_hLocRes, MAKEINTRESOURCE(IDR_BROWSER_MENU));
|
|
|
|
MenuUtil_ReplaceHelpMenu(m_hMenu);
|
|
MenuUtil_ReplaceNewMsgMenus(m_hMenu);
|
|
MenuUtil_ReplaceMessengerMenus(m_hMenu);
|
|
|
|
// Register for connection changes
|
|
if (g_pConMan)
|
|
g_pConMan->Advise((IConnectionNotify *) this);
|
|
|
|
// Create all our toolbar windows
|
|
if (!_InitToolbars())
|
|
goto error;
|
|
|
|
// Initialize the folder bar
|
|
SetFolderType(NULL);
|
|
m_pFolderBar->Update(FALSE, TRUE);
|
|
|
|
// Post this so we can do post creation init
|
|
PostMessage(m_hwnd, CBM_POSTCREATE, 0, 0L);
|
|
return TRUE;
|
|
|
|
error:
|
|
return FALSE;
|
|
}
|
|
|
|
|
|
//
|
|
// FUNCTION: CBrowser::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 CBrowser::OnSize(HWND hwnd, UINT state, int cxClient, int cyClient)
|
|
{
|
|
if (state != SIZE_MINIMIZED)
|
|
{
|
|
if (m_pStatus)
|
|
m_pStatus->OnSize(cxClient, cyClient);
|
|
ResizeNextBorder(0);
|
|
}
|
|
}
|
|
|
|
HRESULT CBrowser::OnCommand(HWND hwnd, int id, HWND hwndCtl, UINT codeNotify)
|
|
{
|
|
ACCTTYPE type;
|
|
RULEID ridTag;
|
|
|
|
Assert(m_pTreeView != NULL);
|
|
if (S_OK == m_pTreeView->ForceSelectionChange())
|
|
{
|
|
PostMessage(hwnd, WM_COMMAND, MAKEWPARAM(id, codeNotify), (LPARAM)hwndCtl);
|
|
return(S_OK);
|
|
}
|
|
|
|
// Check to see if the command is even enabled
|
|
OLECMD cmd;
|
|
cmd.cmdID = id;
|
|
cmd.cmdf = 0;
|
|
|
|
HRESULT hr = QueryStatus(&CMDSETID_OutlookExpress, 1, &cmd, NULL);
|
|
if (FAILED(hr) || (0 == (cmd.cmdf & OLECMDF_ENABLED)))
|
|
return (OLECMDERR_E_DISABLED);
|
|
|
|
// Give the view first chance at any command so that it can override
|
|
// browser behavior.
|
|
VARIANTARG va;
|
|
|
|
va.vt = VT_I8;
|
|
va.ullVal = (ULONGLONG)hwndCtl;
|
|
|
|
// ATTENZIONE!
|
|
// the view gets it first because it might want to handle a command that the treeview normally
|
|
// handles. this is really only necessary for acct views where folders are displayed in the right
|
|
// pane, and folder-related commands should work on the selected folder and not the current
|
|
// treeview selection
|
|
|
|
// We should always allow the views to see the command list.
|
|
if (m_pViewCT && SUCCEEDED(hr = m_pViewCT->Exec(&CMDSETID_OutlookExpress, id, OLECMDEXECOPT_DODEFAULT, &va, NULL)))
|
|
return (S_OK);
|
|
|
|
// Infocolumn always get's a chance
|
|
if (m_pTreeView && SUCCEEDED(hr = m_pTreeView->Exec(NULL, id, OLECMDEXECOPT_DODEFAULT, NULL, NULL)))
|
|
return (S_OK);
|
|
|
|
// Infocolumn always get's a chance
|
|
if (m_pNavPane && SUCCEEDED(hr = m_pNavPane->Exec(NULL, id, OLECMDEXECOPT_DODEFAULT, NULL, NULL)))
|
|
return (S_OK);
|
|
|
|
// $REVIEW - Why should we route commands to a toolbar?
|
|
if (m_pCoolbar && (m_pCoolbar->OnCommand(hwnd, id, hwndCtl, codeNotify) == S_OK))
|
|
return S_OK;
|
|
|
|
if (Envelope_WMCommand(hwnd, id, (WORD) codeNotify)== S_OK)
|
|
return S_OK;
|
|
|
|
// Handle the extra help menu commands
|
|
if (id > ID_MSWEB_BASE && id < ID_MSWEB_LAST)
|
|
{
|
|
OnHelpGoto(m_hwnd, id);
|
|
return S_OK;
|
|
}
|
|
|
|
// Handle the Receive From... popup menu
|
|
if (id >= ID_ACCOUNT_FIRST && id <= ID_ACCOUNT_LAST)
|
|
{
|
|
Assert(g_pSpooler);
|
|
CmdSendReceieveAccount(id, OLECMDEXECOPT_DODEFAULT, NULL, NULL);
|
|
return (S_OK);
|
|
}
|
|
|
|
if (id >= ID_NEW_ACCT_FIRST && id <= ID_NEW_ACCT_LAST)
|
|
{
|
|
HandleNewAcctMenu(m_hwnd, m_hMenu, id);
|
|
return(S_OK);
|
|
}
|
|
|
|
// Handle all "create new note" IDs
|
|
if (MenuUtil_HandleNewMessageIDs(id, m_hwnd, m_idSelected, m_ftSel != FOLDER_NEWS, FALSE, NULL))
|
|
return S_OK;
|
|
|
|
switch (id)
|
|
{
|
|
// File Menu
|
|
case ID_EXPORT_ADDRESS_BOOK:
|
|
case ID_IMPORT_ADDRESS_BOOK:
|
|
MailUtil_OnImportExportAddressBook(m_hwnd, id == ID_IMPORT_ADDRESS_BOOK);
|
|
break;
|
|
|
|
case ID_IMPORT_WAB:
|
|
ImportWAB(m_hwnd);
|
|
break;
|
|
|
|
case ID_IMPORT_MESSAGES:
|
|
DoImport(m_hwnd);
|
|
break;
|
|
|
|
case ID_IMPORT_MAIL_ACCOUNTS:
|
|
case ID_IMPORT_NEWS_ACCOUNTS:
|
|
DoAcctImport(m_hwnd, id == ID_IMPORT_MAIL_ACCOUNTS);
|
|
break;
|
|
|
|
case ID_EXPORT_MESSAGES:
|
|
DoExport(m_hwnd);
|
|
break;
|
|
|
|
case ID_IMPORT_RULES:
|
|
RuleUtil_HrImportRules(m_hwnd);
|
|
break;
|
|
|
|
case ID_EXPORT_RULES:
|
|
RuleUtil_HrExportRules(m_hwnd);
|
|
break;
|
|
|
|
case ID_NEW_IDENTITY:
|
|
MU_NewIdentity(m_hwnd);
|
|
break;
|
|
|
|
case ID_SWITCH_IDENTITY:
|
|
MU_Login(m_hwnd, TRUE, NULL);
|
|
break;
|
|
|
|
case ID_EXIT_LOGOFF:
|
|
case ID_LOGOFF_IDENTITY:
|
|
MU_Logoff(m_hwnd);
|
|
break;
|
|
|
|
case ID_MANAGE_IDENTITIES:
|
|
MU_ManageIdentities(m_hwnd);
|
|
break;
|
|
|
|
case ID_EXIT:
|
|
PostMessage(m_hwnd, WM_CLOSE, 0, 0L);
|
|
break;
|
|
|
|
case ID_WORK_OFFLINE:
|
|
if (g_pConMan)
|
|
{
|
|
g_pConMan->SetGlobalOffline(!g_pConMan->IsGlobalOffline(), hwnd);
|
|
UpdateToolbar();
|
|
}
|
|
break;
|
|
|
|
|
|
// Edit Menu
|
|
case ID_FIND_MESSAGE:
|
|
DoFindMsg(m_idSelected, FOLDER_LOCAL);
|
|
break;
|
|
|
|
case ID_FIND_PEOPLE:
|
|
{
|
|
TCHAR szWABExePath[MAX_PATH];
|
|
if(S_OK == HrLoadPathWABEXE(szWABExePath, sizeof(szWABExePath)))
|
|
ShellExecute(NULL, "open", szWABExePath, "/find", "", SW_SHOWNORMAL);
|
|
break;
|
|
}
|
|
|
|
// View Menu
|
|
case ID_LAYOUT:
|
|
{
|
|
LayoutProp_Create(m_hwnd, this, &m_rLayout);
|
|
break;
|
|
}
|
|
|
|
case ID_SHOW_TOOLBAR:
|
|
{
|
|
SetViewLayout(DISPID_MSGVIEW_TOOLBAR, LAYOUT_POS_NA, !m_rLayout.fToolbar, 0, 0);
|
|
break;
|
|
}
|
|
|
|
case ID_SHOW_FILTERBAR:
|
|
{
|
|
SetViewLayout(DISPID_MSGVIEW_FILTERBAR, LAYOUT_POS_NA, !m_rLayout.fFilterBar, 0, 0);
|
|
break;
|
|
}
|
|
|
|
// Go Menu
|
|
case ID_UP_ONE_LEVEL:
|
|
Assert(m_ftSel != FOLDER_ROOTNODE);
|
|
m_pTreeView->SelectParent();
|
|
break;
|
|
|
|
case ID_GO_FOLDER:
|
|
{
|
|
FOLDERID idFolder;
|
|
if (SUCCEEDED(SelectFolderDialog(m_hwnd, SFD_SELECTFOLDER, FOLDERID_ROOT, NOFLAGS, MAKEINTRESOURCE(idsGoToFolderTitle), MAKEINTRESOURCE(idsGoToFolderText), &idFolder)))
|
|
BrowseObject(idFolder, 0);
|
|
break;
|
|
}
|
|
|
|
case ID_GO_INBOX:
|
|
// special case this for newsonly mode
|
|
if (g_dwAthenaMode & MODE_NEWSONLY)
|
|
{
|
|
ShellUtil_RunClientRegCommand(m_hwnd, s_szMailClient);
|
|
}
|
|
else
|
|
// fall through
|
|
|
|
case ID_GO_OUTBOX:
|
|
case ID_GO_SENT_ITEMS:
|
|
case ID_GO_DRAFTS:
|
|
{
|
|
FOLDERID idStore;
|
|
FOLDERINFO Folder;
|
|
SPECIALFOLDER sf;
|
|
|
|
if (id == ID_GO_OUTBOX)
|
|
sf = FOLDER_OUTBOX;
|
|
else if (id == ID_GO_INBOX)
|
|
sf = FOLDER_INBOX;
|
|
else if (id == ID_GO_SENT_ITEMS)
|
|
sf = FOLDER_SENT;
|
|
else
|
|
sf = FOLDER_DRAFT;
|
|
|
|
if (FAILED(GetDefaultServerId(ACCT_MAIL, &idStore)))
|
|
idStore = FOLDERID_LOCAL_STORE;
|
|
|
|
if (SUCCEEDED(g_pStore->GetSpecialFolderInfo(idStore, sf, &Folder)))
|
|
{
|
|
BrowseObject(Folder.idFolder, SBSP_DEFBROWSER | SBSP_DEFMODE | SBSP_ABSOLUTE);
|
|
g_pStore->FreeRecord(&Folder);
|
|
}
|
|
else
|
|
{
|
|
// We might not have this special folder for this account. Try local.
|
|
if (SUCCEEDED(g_pStore->GetSpecialFolderInfo(FOLDERID_LOCAL_STORE, sf, &Folder)))
|
|
{
|
|
BrowseObject(Folder.idFolder, SBSP_DEFBROWSER | SBSP_DEFMODE | SBSP_ABSOLUTE);
|
|
g_pStore->FreeRecord(&Folder);
|
|
}
|
|
}
|
|
|
|
break;
|
|
}
|
|
|
|
case ID_GO_NEWS:
|
|
{
|
|
if (g_dwAthenaMode & MODE_MAILONLY)
|
|
{
|
|
ShellUtil_RunClientRegCommand(m_hwnd, s_szNewsClient);
|
|
}
|
|
else
|
|
{
|
|
FOLDERID idServer;
|
|
|
|
ProcessICW(m_hwnd, FOLDER_NEWS, TRUE);
|
|
|
|
if (SUCCEEDED(GetDefaultServerId(ACCT_NEWS, &idServer)))
|
|
{
|
|
BrowseObject(idServer, 0);
|
|
}
|
|
}
|
|
|
|
break;
|
|
}
|
|
|
|
case ID_GO_NETMEETING:
|
|
ShellUtil_RunClientRegCommand(m_hwnd, s_szCallClient);
|
|
break;
|
|
|
|
// Tools Menu
|
|
case ID_SEND_RECEIVE:
|
|
Assert(g_pSpooler);
|
|
|
|
if (!(g_dwAthenaMode & MODE_NEWSONLY))
|
|
{
|
|
if (g_pSpooler)
|
|
{
|
|
DWORD dwFlags = 0;
|
|
|
|
dwFlags = (!(g_dwAthenaMode & MODE_NEWSONLY)) ? DELIVER_NO_NEWSPOLL : 0;
|
|
|
|
g_pSpooler->StartDelivery(m_hwnd, NULL, FOLDERID_INVALID,
|
|
dwFlags | DELIVER_SEND | DELIVER_MAIL_RECV |
|
|
DELIVER_POLL | DELIVER_OFFLINE_FLAGS | DELIVER_SERVER_TYPE_ALL);
|
|
}
|
|
// $REVIEW - Can someone explain why it's here??? - steveser
|
|
// Tell currently selected folder to refresh itself
|
|
// if (NULL != m_pViewCT)
|
|
// m_pViewCT->Exec(NULL, ID_REFRESH, OLECMDEXECOPT_DODEFAULT, NULL, NULL);
|
|
break;
|
|
}
|
|
//Fall through. In News only mode we want to do Send All even for Send & Receive All
|
|
case ID_SEND_ALL:
|
|
Assert(g_pSpooler);
|
|
if (g_pSpooler)
|
|
g_pSpooler->StartDelivery(m_hwnd, NULL, FOLDERID_INVALID,
|
|
DELIVER_SEND | DELIVER_NOSKIP | DELIVER_NEWS_TYPE | DELIVER_SMTP_TYPE | DELIVER_HTTP_TYPE);
|
|
break;
|
|
|
|
case ID_RECEIVE_ALL:
|
|
Assert(g_pSpooler);
|
|
if (g_pSpooler)
|
|
g_pSpooler->StartDelivery(m_hwnd, NULL, FOLDERID_INVALID,
|
|
DELIVER_MAIL_RECV | DELIVER_POLL | DELIVER_OFFLINE_FLAGS | DELIVER_IMAP_TYPE |
|
|
DELIVER_HTTP_TYPE);
|
|
break;
|
|
|
|
case ID_SYNCHRONIZE:
|
|
{
|
|
Assert(g_pSpooler);
|
|
if (g_pSpooler)
|
|
g_pSpooler->StartDelivery(m_hwnd, NULL, FOLDERID_INVALID, DELIVER_OFFLINE_SYNC | DELIVER_UPDATE_ALL);
|
|
|
|
/*
|
|
Bug# 60668
|
|
// Tell currently selected folder to refresh itself
|
|
if (NULL != m_pViewCT)
|
|
m_pViewCT->Exec(NULL, ID_REFRESH, OLECMDEXECOPT_DODEFAULT, NULL, NULL);
|
|
*/
|
|
break;
|
|
}
|
|
|
|
case ID_ADDRESS_BOOK:
|
|
{
|
|
CWab *pWab = NULL;
|
|
if (SUCCEEDED(HrCreateWabObject(&pWab)))
|
|
{
|
|
pWab->HrBrowse(m_hwnd);
|
|
pWab->Release();
|
|
}
|
|
else
|
|
{
|
|
AthMessageBoxW(m_hwnd, MAKEINTRESOURCEW(idsAthena), MAKEINTRESOURCEW(idsGeneralWabError),
|
|
NULL, MB_OK | MB_ICONEXCLAMATION);
|
|
}
|
|
break;
|
|
}
|
|
|
|
case ID_MESSAGE_RULES_MAIL:
|
|
case ID_MESSAGE_RULES_NEWS:
|
|
case ID_MESSAGE_RULES_JUNK:
|
|
case ID_MESSAGE_RULES_SENDERS:
|
|
{
|
|
DWORD dwFlags = 0;
|
|
switch (id)
|
|
{
|
|
case ID_MESSAGE_RULES_MAIL:
|
|
dwFlags = MRDF_MAIL;
|
|
break;
|
|
|
|
case ID_MESSAGE_RULES_NEWS:
|
|
dwFlags = MRDF_NEWS;
|
|
break;
|
|
|
|
case ID_MESSAGE_RULES_JUNK:
|
|
dwFlags = MRDF_JUNK;
|
|
break;
|
|
|
|
case ID_MESSAGE_RULES_SENDERS:
|
|
dwFlags = MRDF_SENDERS;
|
|
break;
|
|
|
|
default:
|
|
Assert(FALSE);
|
|
dwFlags = MRDF_MAIL;
|
|
break;
|
|
}
|
|
DoMessageRulesDialog(m_hwnd, dwFlags);
|
|
break;
|
|
}
|
|
|
|
case ID_OPTIONS:
|
|
ShowOptions(hwnd, ATHENA_OPTIONS, 0, this);
|
|
break;
|
|
|
|
case ID_ACCOUNTS:
|
|
{
|
|
if (m_ftSel == FOLDER_NEWS)
|
|
type = ACCT_NEWS;
|
|
else if (m_ftSel == FOLDER_IMAP || m_ftSel == FOLDER_LOCAL)
|
|
type = ACCT_MAIL;
|
|
else
|
|
type = ACCT_LAST;
|
|
|
|
DoAccountListDialog(m_hwnd, type);
|
|
break;
|
|
}
|
|
|
|
// HELP MENU COMMANDS
|
|
case ID_HELP_CONTENTS:
|
|
OEHtmlHelp(m_hwnd, c_szMailHelpFileHTML, HH_DISPLAY_TOPIC, (DWORD_PTR) (LPCSTR) c_szCtxHelpDefault);
|
|
break;
|
|
|
|
case ID_README:
|
|
DoReadme(m_hwnd);
|
|
break;
|
|
|
|
case ID_ABOUT:
|
|
DoAboutAthena(m_hwnd, m_ftSel == FOLDER_NEWS ? idiNews : idiMail);
|
|
break;
|
|
|
|
// Toolbar Buttons & Accelerators
|
|
case ID_FOLDER_LIST:
|
|
if (m_itbLastFocus == ITB_NAVPANE)
|
|
CycleFocus(FALSE);
|
|
|
|
SetViewLayout(DISPID_MSGVIEW_FOLDERLIST, LAYOUT_POS_NA, !m_rLayout.fFolderList, 0, 0);
|
|
|
|
if (m_pFolderBar)
|
|
m_pFolderBar->Update(FALSE, TRUE);
|
|
break;
|
|
|
|
case ID_CONTACTS_LIST:
|
|
if (m_itbLastFocus == ITB_NAVPANE)
|
|
CycleFocus(FALSE);
|
|
|
|
SetViewLayout(DISPID_MSGVIEW_CONTACTS, LAYOUT_POS_NA, !m_rLayout.fContacts, 0, 0);
|
|
break;
|
|
|
|
// $REVIEW - Do we still need this?
|
|
/*
|
|
case idmAccelNextCtl:
|
|
case idmAccelPrevCtl:
|
|
CycleFocus(id == idmAccelPrevCtl);
|
|
break;
|
|
*/
|
|
|
|
case ID_DELETE_ACCEL:
|
|
case ID_DELETE_NO_TRASH_ACCEL:
|
|
return (CmdDeleteAccel(id, OLECMDEXECOPT_DODEFAULT, NULL, NULL));
|
|
|
|
//Msglist handles this command. But if our view is frontpage or account view, this is not handled by them.
|
|
//So we break here so we don't show NYI.
|
|
case ID_RESYNCHRONIZE:
|
|
break;
|
|
|
|
default:
|
|
#ifdef DEBUG
|
|
if (!hwndCtl || codeNotify == BN_CLICKED)
|
|
nyi(MAKEINTRESOURCE(idsNYIGeneral));
|
|
#endif
|
|
return E_NOTIMPL;
|
|
}
|
|
return S_OK;
|
|
}
|
|
|
|
|
|
#define MF_CHECKFLAGS(b) (MF_BYCOMMAND|(b ? MF_CHECKED : MF_UNCHECKED))
|
|
|
|
void CBrowser::OnInitMenuPopup(HWND hwnd, HMENU hmenuPopup, UINT uPos, BOOL fSystemMenu)
|
|
{
|
|
char sz[CCHMAX_STRINGRES], szT[CCHMAX_STRINGRES];
|
|
MENUITEMINFO mii;
|
|
UINT uIDPopup;
|
|
HMENU hMenuLang;
|
|
FOLDERINFO info;
|
|
HRESULT hr;
|
|
|
|
mii.cbSize = sizeof(MENUITEMINFO);
|
|
mii.fMask = MIIM_ID | MIIM_SUBMENU;
|
|
|
|
// make sure we recognize the popup as one of ours
|
|
if (m_hMenu == NULL || !GetMenuItemInfo(m_hMenu, uPos, TRUE, &mii) || mii.hSubMenu != hmenuPopup)
|
|
{
|
|
HMENU hMenuDrop = NULL;
|
|
int cItems = 0;
|
|
|
|
if (GetMenuItemInfo(m_hMenu, ID_POPUP_LANGUAGE_DEFERRED, FALSE, &mii) && mii.hSubMenu == hmenuPopup)
|
|
{
|
|
// MessageView will take care of creating language menu
|
|
// let's just fix menu ID
|
|
mii.fMask = MIIM_ID;
|
|
mii.wID = ID_POPUP_LANGUAGE;
|
|
SetMenuItemInfo(m_hMenu, ID_POPUP_LANGUAGE_DEFERRED, FALSE, &mii);
|
|
}
|
|
|
|
// Get the drop down menu
|
|
hMenuDrop = GetSubMenu(m_hMenu, uPos);
|
|
if (NULL == hMenuDrop)
|
|
{
|
|
goto exit;
|
|
}
|
|
|
|
// Get the number of items in the drop down menu
|
|
cItems = GetMenuItemCount(hMenuDrop);
|
|
if (-1 == cItems)
|
|
{
|
|
goto exit;
|
|
}
|
|
|
|
// Initialize the menu info
|
|
mii.cbSize = sizeof(MENUITEMINFO);
|
|
mii.fMask = MIIM_ID | MIIM_SUBMENU;
|
|
|
|
// Spin throught the submenus finding the correct menu id
|
|
for (cItems--; cItems >= 0; cItems--)
|
|
{
|
|
if (FALSE == GetMenuItemInfo(hMenuDrop, cItems, TRUE, &mii))
|
|
{
|
|
continue;
|
|
}
|
|
|
|
if (hmenuPopup == mii.hSubMenu)
|
|
{
|
|
break;
|
|
}
|
|
}
|
|
|
|
// Did we find anything?
|
|
if (cItems < 0)
|
|
{
|
|
goto exit;
|
|
}
|
|
}
|
|
|
|
uIDPopup = mii.wID;
|
|
|
|
switch (uIDPopup)
|
|
{
|
|
case ID_POPUP_FILE:
|
|
hr = g_pStore->GetFolderInfo(m_idSelected, &info);
|
|
if (SUCCEEDED(hr))
|
|
{
|
|
if (info.tyFolder == FOLDER_IMAP)
|
|
{
|
|
AthLoadString(idsShowFolderCmd, sz, ARRAYSIZE(sz));
|
|
ModifyMenu(hmenuPopup, ID_SUBSCRIBE, MF_BYCOMMAND | MF_STRING, ID_SUBSCRIBE, sz);
|
|
AthLoadString(idsHideFolderCmd, sz, ARRAYSIZE(sz));
|
|
ModifyMenu(hmenuPopup, ID_UNSUBSCRIBE, MF_BYCOMMAND | MF_STRING, ID_UNSUBSCRIBE, sz);
|
|
}
|
|
else
|
|
{
|
|
AthLoadString(idsSubscribeFolderCmd, sz, ARRAYSIZE(sz));
|
|
ModifyMenu(hmenuPopup, ID_SUBSCRIBE, MF_BYCOMMAND | MF_STRING, ID_SUBSCRIBE, sz);
|
|
AthLoadString(idsUnsubscribeFolderCmd, sz, ARRAYSIZE(sz));
|
|
ModifyMenu(hmenuPopup, ID_UNSUBSCRIBE, MF_BYCOMMAND | MF_STRING, ID_UNSUBSCRIBE, sz);
|
|
}
|
|
|
|
g_pStore->FreeRecord(&info);
|
|
}
|
|
MU_UpdateIdentityMenus(hmenuPopup);
|
|
|
|
if (m_fNoModifyAccts)
|
|
{
|
|
DeleteMenu(hmenuPopup, ID_IMPORT_MAIL_ACCOUNTS, MF_BYCOMMAND);
|
|
DeleteMenu(hmenuPopup, ID_IMPORT_NEWS_ACCOUNTS, MF_BYCOMMAND);
|
|
}
|
|
break;
|
|
|
|
case ID_POPUP_TOOLS:
|
|
{
|
|
DWORD dwHeaders;
|
|
|
|
// See if things were changed
|
|
if (m_fRebuildAccountMenu)
|
|
{
|
|
AcctUtil_FreeSendReceieveMenu(hmenuPopup, m_cAcctMenu);
|
|
}
|
|
|
|
// Get the submenu for Send & Receieve
|
|
if (m_fRebuildAccountMenu && GetMenuItemInfo(m_hMenu, ID_POPUP_SEND_AND_RECEIVE, FALSE, &mii))
|
|
{
|
|
AcctUtil_CreateSendReceieveMenu(mii.hSubMenu, &m_cAcctMenu);
|
|
m_fRebuildAccountMenu = FALSE;
|
|
}
|
|
|
|
if (!m_fInitNewAcctMenu)
|
|
{
|
|
InitNewAcctMenu(hmenuPopup);
|
|
m_fInitNewAcctMenu = TRUE;
|
|
}
|
|
|
|
// Figure out if the user has the "Download 300 headers" turned on
|
|
dwHeaders = DwGetOption(OPT_DOWNLOADCHUNKS);
|
|
if (OPTION_OFF != dwHeaders)
|
|
{
|
|
// Load a new menu string from the resources
|
|
AthLoadString(idsGetHeaderFmt, sz, ARRAYSIZE(sz));
|
|
|
|
// Format it
|
|
wnsprintf(szT, ARRAYSIZE(szT), sz, dwHeaders);
|
|
|
|
// Splat it on the menu
|
|
ModifyMenu(hmenuPopup, ID_GET_HEADERS, MF_BYCOMMAND | MF_STRING, ID_GET_HEADERS, szT);
|
|
}
|
|
else
|
|
{
|
|
// Load a new menu string from the resources
|
|
AthLoadString(idsGetNewHeaders, sz, ARRAYSIZE(sz));
|
|
|
|
// Splat it on the menu
|
|
ModifyMenu(hmenuPopup, ID_GET_HEADERS, MF_BYCOMMAND | MF_STRING, ID_GET_HEADERS, sz);
|
|
}
|
|
|
|
if (m_fNoModifyAccts)
|
|
{
|
|
DeleteMenu(hmenuPopup, ID_ACCOUNTS, MF_BYCOMMAND);
|
|
DeleteMenu(hmenuPopup, ID_POPUP_NEW_ACCT, MF_BYCOMMAND);
|
|
}
|
|
|
|
//Change Sync Folder to Sync Account or Sync NewsGroup depending on the folder selected
|
|
MENUITEMINFO mii = {0};
|
|
FOLDERINFO FolderInfo = {0};
|
|
int id;
|
|
TCHAR szMenuName[CCHMAX_STRINGRES] = {0};
|
|
|
|
if (g_pStore && SUCCEEDED(g_pStore->GetFolderInfo(m_idSelected, &FolderInfo)))
|
|
{
|
|
if (ISFLAGSET(FolderInfo.dwFlags, FOLDER_SERVER))
|
|
{
|
|
id = idsSynchronizeNowBtnTT;
|
|
}
|
|
else if(FolderInfo.tyFolder == FOLDER_NEWS)
|
|
{
|
|
id = idsDownloadNewsgroupTT;
|
|
}
|
|
else
|
|
id = idsSyncFolder;
|
|
|
|
LoadString(g_hLocRes, id, szMenuName, ARRAYSIZE(szMenuName));
|
|
|
|
mii.cbSize = sizeof(MENUITEMINFO);
|
|
mii.fMask = MIIM_TYPE;
|
|
mii.fType = MFT_STRING;
|
|
mii.dwTypeData = szMenuName;
|
|
|
|
SetMenuItemInfo(hmenuPopup, ID_SYNC_THIS_NOW, FALSE, &mii);
|
|
|
|
g_pStore->FreeRecord(&FolderInfo);
|
|
}
|
|
|
|
if (0 == (g_dwAthenaMode & MODE_JUNKMAIL))
|
|
DeleteMenu(hmenuPopup, ID_MESSAGE_RULES_JUNK, MF_BYCOMMAND);
|
|
break;
|
|
}
|
|
|
|
case ID_POPUP_MESSAGE:
|
|
{
|
|
AddStationeryMenu(hmenuPopup, ID_POPUP_NEW_MSG, ID_STATIONERY_RECENT_0, ID_STATIONERY_MORE);
|
|
|
|
if (!m_fEnvMenuInited && DwGetOption(OPT_SHOW_ENVELOPES))
|
|
{
|
|
Envelope_AddHostMenu(hmenuPopup, 2);
|
|
m_fEnvMenuInited=TRUE;
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
|
|
// let the view handle it last so that it can override any browser init if necessary
|
|
if (m_pView)
|
|
{
|
|
m_pView->OnPopupMenu(m_hMenu, hmenuPopup, uIDPopup);
|
|
if(uIDPopup == ID_POPUP_LANGUAGE) // It was destroyed
|
|
hmenuPopup = m_hMenuLanguage;
|
|
}
|
|
|
|
// now enable/disable the items
|
|
MenuUtil_EnablePopupMenu(hmenuPopup, this);
|
|
|
|
exit:
|
|
return;
|
|
}
|
|
|
|
inline void CBrowser::_AppendIdentityName(LPCTSTR pszIdentityName, LPSTR pszName, DWORD cchName)
|
|
{
|
|
/*
|
|
if (((g_dwAthenaMode & MODE_OUTLOOKNEWS) != MODE_OUTLOOKNEWS) && pszIdentityName && *pszIdentityName)
|
|
{
|
|
*/
|
|
if (pszIdentityName && *pszIdentityName)
|
|
{
|
|
StrCatBuff(pszName, c_szSpaceDashSpace, cchName);
|
|
StrCatBuff(pszName, pszIdentityName, cchName);
|
|
}
|
|
/*
|
|
}
|
|
*/
|
|
}
|
|
|
|
void CBrowser::SetFolderType(FOLDERID idFolder)
|
|
{
|
|
int iIcon;
|
|
LPSTR pszName=NULL;
|
|
LPCSTR pszIdentityName=NULL;
|
|
HICON hIconOld, hIcon;
|
|
FOLDERTYPE ftNew;
|
|
int cch;
|
|
DWORD type, cb, dwLen;
|
|
FOLDERINFO Folder;
|
|
FOLDERINFO SvrFolderInfo = {0};
|
|
IImnAccount *pAccount = NULL;
|
|
DWORD dwShow = 0;
|
|
CHAR szAccountId[CCHMAX_ACCOUNT_NAME];
|
|
HRESULT hr = S_OK;
|
|
BOOL fHideHotMail = FALSE;
|
|
|
|
if (*m_szName == 0)
|
|
{
|
|
// TODO: it seems like the window title should a global setting not per user
|
|
cb = sizeof(m_szName);
|
|
if (ERROR_SUCCESS != AthUserGetValue(NULL, c_szWindowTitle, &type, (LPBYTE)m_szName, &cb) ||
|
|
FIsEmpty(m_szName))
|
|
{
|
|
if ((g_dwAthenaMode & MODE_OUTLOOKNEWS) == MODE_OUTLOOKNEWS)
|
|
{
|
|
LoadString(g_hLocRes, idsMSOutlookNewsReader, m_szName, ARRAYSIZE(m_szName));
|
|
}
|
|
else
|
|
{
|
|
LoadString(g_hLocRes, idsAthena, m_szName, ARRAYSIZE(m_szName));
|
|
}
|
|
}
|
|
|
|
Assert(*m_szName != 0);
|
|
}
|
|
|
|
pszIdentityName = MU_GetCurrentIdentityName();
|
|
|
|
if (FOLDERID_ROOT != idFolder && SUCCEEDED(g_pStore->GetFolderInfo(idFolder, &Folder)))
|
|
{
|
|
iIcon = GetFolderIcon(&Folder);
|
|
ftNew = Folder.tyFolder;
|
|
|
|
dwLen = lstrlen(Folder.pszName) + lstrlen(m_szName) + lstrlen(c_szSpaceDashSpace) + 1;
|
|
|
|
if (*pszIdentityName)
|
|
dwLen += (lstrlen(pszIdentityName) + lstrlen(c_szSpaceDashSpace));
|
|
|
|
//Its better to allocate a few extra bytes now than having to reallocate later depending on the outnews switch.
|
|
//This memory gets freed before exiting the function
|
|
if (MemAlloc((LPVOID *)&pszName, dwLen))
|
|
{
|
|
StrCpyN(pszName, Folder.pszName, dwLen);
|
|
StrCatBuff(pszName, c_szSpaceDashSpace, dwLen);
|
|
StrCatBuff(pszName, m_szName, dwLen);
|
|
|
|
_AppendIdentityName(pszIdentityName, pszName, dwLen);
|
|
|
|
}
|
|
g_pStore->FreeRecord(&Folder);
|
|
}
|
|
else
|
|
{
|
|
iIcon = iMailNews;
|
|
ftNew = FOLDER_ROOTNODE;
|
|
if (*pszIdentityName)
|
|
{
|
|
dwLen = lstrlen(m_szName) + 1;
|
|
|
|
if (*pszIdentityName)
|
|
dwLen += lstrlen(pszIdentityName) + lstrlen(c_szSpaceDashSpace);
|
|
|
|
if (MemAlloc((LPVOID *)&pszName, dwLen))
|
|
{
|
|
StrCpyN(pszName, m_szName, dwLen);
|
|
|
|
_AppendIdentityName(pszIdentityName, pszName, dwLen);
|
|
}
|
|
}
|
|
else
|
|
pszName = PszDupA(m_szName);
|
|
}
|
|
|
|
SetWindowText(m_hwnd, pszName?pszName:m_szName);
|
|
|
|
// Update the folder bar
|
|
if (m_pFolderBar)
|
|
m_pFolderBar->SetCurrentFolder(idFolder);
|
|
|
|
// Update of Adv Bar
|
|
if (m_pAdBar) // Say that for Hotmail we have Ad bar always
|
|
{
|
|
if (FOLDER_HTTPMAIL == ftNew)
|
|
{
|
|
//At startup too if the cached state is to show the URL, then just show the toolbar with whatever it is loaded with
|
|
// Get the server for this folder
|
|
IF_FAILEXIT(hr = GetFolderServer(idFolder, &SvrFolderInfo));
|
|
|
|
// Get the account ID for the server
|
|
*szAccountId = 0;
|
|
IF_FAILEXIT(hr = GetFolderAccountId(&SvrFolderInfo, szAccountId, ARRAYSIZE(szAccountId)));
|
|
|
|
// Get the account interface
|
|
IF_FAILEXIT(hr = g_pAcctMan->FindAccount(AP_ACCOUNT_ID, szAccountId, &pAccount));
|
|
|
|
IF_FAILEXIT(hr = pAccount->GetPropDw(AP_HTTPMAIL_DOMAIN_MSN, &dwShow));
|
|
if(dwShow)
|
|
{
|
|
if(!HideHotmail())
|
|
{
|
|
|
|
IF_FAILEXIT(hr = pAccount->GetPropDw(AP_HTTPMAIL_SHOW_ADBAR, &dwShow));
|
|
ShowToolbar((IDockingWindow*)m_pAdBar, !!dwShow);
|
|
}
|
|
else
|
|
fHideHotMail = TRUE;
|
|
}
|
|
}
|
|
else
|
|
ShowToolbar((IDockingWindow*)m_pAdBar, FALSE);
|
|
}
|
|
|
|
// update the coolbar and menus if we're changing folder type
|
|
if (m_ftSel != ftNew)
|
|
{
|
|
m_ftSel = ftNew;
|
|
_ResetMenu(ftNew, fHideHotMail);
|
|
m_pCoolbar->SetFolderType(ftNew);
|
|
}
|
|
|
|
if (m_pBodyBar)
|
|
ShowToolbar((IDockingWindow*)m_pBodyBar,
|
|
m_rLayout.fInfoPaneEnabled && m_rLayout.fInfoPane && (m_ftSel != FOLDER_HTTPMAIL));
|
|
|
|
exit:
|
|
SafeMemFree(pszName);
|
|
g_pStore->FreeRecord(&SvrFolderInfo);
|
|
ReleaseObj(pAccount);
|
|
|
|
}
|
|
|
|
void CBrowser::_ResetMenu(FOLDERTYPE ftNew, BOOL fHideHotMail)
|
|
{
|
|
HMENU hMenu, hMenuT;
|
|
MENUITEMINFO mii;
|
|
BOOL fNews;
|
|
DWORD cServers;
|
|
IImnEnumAccounts *pEnum;
|
|
|
|
if (m_hMenuLanguage)
|
|
{
|
|
DeinitMultiLanguage();
|
|
if (IsMenu(m_hMenuLanguage))
|
|
DestroyMenu(m_hMenuLanguage);
|
|
m_hMenuLanguage = NULL;
|
|
}
|
|
|
|
// load the new menu for the view
|
|
SideAssert(hMenu = LoadMenu(g_hLocRes, MAKEINTRESOURCE(IDR_BROWSER_MENU)));
|
|
|
|
MenuUtil_ReplaceNewMsgMenus(hMenu);
|
|
MenuUtil_ReplaceHelpMenu(hMenu);
|
|
MenuUtil_ReplaceMessengerMenus(hMenu);
|
|
|
|
mii.cbSize = sizeof(MENUITEMINFO);
|
|
mii.fMask = MIIM_SUBMENU;
|
|
|
|
if ((g_dwHideMessenger == BL_HIDE) || (g_dwHideMessenger == BL_DISABLE))
|
|
{
|
|
// get the file popup
|
|
SideAssert(GetMenuItemInfo(hMenu, ID_POPUP_FILE, FALSE, &mii));
|
|
|
|
DeleteMenu(mii.hSubMenu, ID_SEND_INSTANT_MESSAGE, MF_BYCOMMAND);
|
|
}
|
|
|
|
if ((ftNew != FOLDER_NEWS) && (ftNew != FOLDER_IMAP))
|
|
{
|
|
// get the edit popup
|
|
SideAssert(GetMenuItemInfo(hMenu, ID_POPUP_EDIT, FALSE, &mii));
|
|
|
|
if (ftNew != FOLDER_NEWS)
|
|
DeleteMenu(mii.hSubMenu, ID_CATCH_UP, MF_BYCOMMAND);
|
|
|
|
if (ftNew != FOLDER_IMAP)
|
|
{
|
|
DeleteMenu(mii.hSubMenu, ID_UNDELETE, MF_BYCOMMAND);
|
|
DeleteMenu(mii.hSubMenu, ID_PURGE_DELETED, MF_BYCOMMAND);
|
|
}
|
|
}
|
|
|
|
if (ftNew != FOLDER_NEWS)
|
|
{
|
|
g_pAcctMan->GetAccountCount(ACCT_NEWS, &cServers);
|
|
fNews = (cServers > 0);
|
|
|
|
// get the message popup
|
|
SideAssert(GetMenuItemInfo(hMenu, ID_POPUP_MESSAGE, FALSE, &mii));
|
|
|
|
DeleteMenu(mii.hSubMenu, ID_UNSCRAMBLE, MF_BYCOMMAND);
|
|
DeleteMenu(mii.hSubMenu, ID_CANCEL_MESSAGE, MF_BYCOMMAND);
|
|
if (!fNews)
|
|
DeleteMenu(mii.hSubMenu, ID_REPLY_GROUP, MF_BYCOMMAND);
|
|
}
|
|
else
|
|
{
|
|
fNews = TRUE;
|
|
}
|
|
|
|
// get the tools popup
|
|
SideAssert(GetMenuItemInfo(hMenu, ID_POPUP_TOOLS, FALSE, &mii));
|
|
|
|
if (ftNew != FOLDER_NEWS)
|
|
{
|
|
DeleteMenu(mii.hSubMenu, ID_GET_HEADERS, MF_BYCOMMAND);
|
|
if (!fNews)
|
|
DeleteMenu(mii.hSubMenu, ID_NEWSGROUPS, MF_BYCOMMAND);
|
|
}
|
|
|
|
if ((ftNew == FOLDER_LOCAL) || fHideHotMail)
|
|
{
|
|
DeleteMenu(mii.hSubMenu, ID_POPUP_RETRIEVE, MF_BYCOMMAND);
|
|
DeleteMenu(mii.hSubMenu, ID_SYNC_THIS_NOW, MF_BYCOMMAND);
|
|
}
|
|
|
|
if (ftNew != FOLDER_IMAP)
|
|
{
|
|
cServers = 0;
|
|
if (S_OK == g_pAcctMan->Enumerate(SRV_IMAP, &pEnum))
|
|
{
|
|
pEnum->GetCount(&cServers);
|
|
pEnum->Release();
|
|
}
|
|
|
|
if (cServers == 0)
|
|
{
|
|
DeleteMenu(mii.hSubMenu, ID_IMAP_FOLDERS, MF_BYCOMMAND);
|
|
if (!fNews)
|
|
DeleteMenu(mii.hSubMenu, SEP_SUBSCRIBE, MF_BYCOMMAND);
|
|
}
|
|
}
|
|
|
|
if ((g_dwHideMessenger == BL_HIDE) || (g_dwHideMessenger == BL_DISABLE))
|
|
{
|
|
DeleteMenu(mii.hSubMenu, SEP_MESSENGER, MF_BYCOMMAND);
|
|
DeleteMenu(mii.hSubMenu, ID_POPUP_MESSENGER, MF_BYCOMMAND);
|
|
DeleteMenu(mii.hSubMenu, ID_POPUP_MESSENGER_STATUS, MF_BYCOMMAND);
|
|
}
|
|
|
|
m_pCoolbar->ResetMenu(hMenu);
|
|
if (m_hMenu != NULL)
|
|
{
|
|
if (IsMenu(m_hMenu))
|
|
{
|
|
AcctUtil_FreeSendReceieveMenu(m_hMenu, m_cAcctMenu);
|
|
m_cAcctMenu = 0;
|
|
m_fRebuildAccountMenu = TRUE;
|
|
|
|
FreeNewAcctMenu(m_hMenu);
|
|
m_fInitNewAcctMenu = FALSE;
|
|
|
|
DestroyMenu(m_hMenu);
|
|
}
|
|
}
|
|
|
|
m_hMenu = hMenu;
|
|
}
|
|
|
|
void CBrowser::SpoolerDeliver(WPARAM wParam, LPARAM lParam)
|
|
{
|
|
HWND hwndCoolbar = 0;
|
|
char szRes[256], sz[256];
|
|
LPSTR pszRes = 0;
|
|
static BOOL s_fWarnings=FALSE;
|
|
static ULONG s_cMsgs=0;
|
|
|
|
if (wParam != DELIVERY_NOTIFY_ALLDONE)
|
|
m_pStatus->SetSpoolerStatus((DELIVERYNOTIFYTYPE) wParam, 0);
|
|
|
|
switch (wParam)
|
|
{
|
|
case DELIVERY_NOTIFY_STARTING:
|
|
s_cMsgs = 0;
|
|
s_fWarnings = FALSE;
|
|
break;
|
|
|
|
case DELIVERY_NOTIFY_CONNECTING:
|
|
if (m_pCoolbar)
|
|
m_pCoolbar->Invoke(idDownloadBegin, 0);
|
|
|
|
if (m_idClearStatusTimer)
|
|
{
|
|
KillTimer(m_hwnd, m_idClearStatusTimer);
|
|
m_idClearStatusTimer = 0;
|
|
}
|
|
|
|
if (m_pCoolbar)
|
|
m_pCoolbar->GetWindow(&hwndCoolbar);
|
|
break;
|
|
|
|
case DELIVERY_NOTIFY_RESULT:
|
|
if (EVENT_FAILED == lParam || EVENT_WARNINGS == lParam)
|
|
s_fWarnings = TRUE;
|
|
break;
|
|
|
|
case DELIVERY_NOTIFY_COMPLETE:
|
|
s_cMsgs += (ULONG) lParam;
|
|
break;
|
|
|
|
case DELIVERY_NOTIFY_ALLDONE:
|
|
// Stop coolbar animation
|
|
if (m_pCoolbar)
|
|
m_pCoolbar->Invoke(idDownloadEnd, 0);
|
|
|
|
if (s_cMsgs && IsWindow(m_hwnd))
|
|
{
|
|
PostMessage(m_hwnd, WM_NEW_MAIL, 0, 0);
|
|
}
|
|
|
|
// Show the Warnings Icon
|
|
if (s_fWarnings)
|
|
{
|
|
m_pStatus->SetSpoolerStatus((DELIVERYNOTIFYTYPE) wParam, -1);
|
|
}
|
|
else
|
|
{
|
|
m_pStatus->SetSpoolerStatus((DELIVERYNOTIFYTYPE) wParam, s_cMsgs);
|
|
|
|
// Clear the Timer
|
|
m_idClearStatusTimer = SetTimer(m_hwnd, TIMER_CLEAR_STATUS, TIME_TO_CLEAR_NEWMSGSTATUS, NULL);
|
|
}
|
|
|
|
|
|
break;
|
|
}
|
|
}
|
|
|
|
HRESULT CBrowser::CycleFocus(BOOL fReverse)
|
|
{
|
|
DWORD dwFlags;
|
|
BOOL bLast;
|
|
|
|
HWND hwndFocus = GetFocus();
|
|
HWND hwndNext;
|
|
|
|
if (IsWindowVisible(hwndFocus))
|
|
{
|
|
hwndNext = GetNextDlgTabItem(m_hwnd, hwndFocus, fReverse);
|
|
}
|
|
else
|
|
{
|
|
hwndNext = GetNextDlgTabItem(m_hwnd, NULL, fReverse);
|
|
}
|
|
|
|
SetFocus(hwndNext);
|
|
|
|
if (hwndNext == m_hwndInner || IsChild(m_hwndInner, hwndNext))
|
|
m_itbLastFocus = ITB_OEVIEW;
|
|
else
|
|
m_itbLastFocus = ITB_NAVPANE;
|
|
|
|
return (S_OK);
|
|
}
|
|
|
|
|
|
void CBrowser::FrameActivatePopups(BOOL fActivate)
|
|
{
|
|
HWND hwndDropDown = HwndGlobalDropDown();
|
|
|
|
if (!fActivate && hwndDropDown)
|
|
SendMessage(hwndDropDown, WMR_CLICKOUTSIDE, CLK_OUT_DEACTIVATE, 0);
|
|
}
|
|
|
|
|
|
void CBrowser::UpdateStatusBar(void)
|
|
{
|
|
if (g_pConMan && m_pStatus)
|
|
{
|
|
if (g_pConMan->IsGlobalOffline())
|
|
{
|
|
m_pStatus->SetConnectedStatus(CONN_STATUS_WORKOFFLINE);
|
|
}
|
|
else
|
|
{
|
|
m_pStatus->SetConnectedStatus(CONN_STATUS_CONNECTED);
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// Support for drop-down treeview. Trust me, this is necessary no matter
|
|
// how gross it is.
|
|
|
|
// currently active global drop down (if any)
|
|
static HWND s_hwndDropDown = NULL;
|
|
|
|
void RegisterGlobalDropDown(HWND hwndCtrl)
|
|
{
|
|
Assert(s_hwndDropDown == 0);
|
|
s_hwndDropDown = hwndCtrl;
|
|
}
|
|
|
|
void UnregisterGlobalDropDown(HWND hwndCtrl)
|
|
{
|
|
if (s_hwndDropDown == hwndCtrl)
|
|
s_hwndDropDown = 0;
|
|
}
|
|
|
|
void CancelGlobalDropDown()
|
|
{
|
|
if (s_hwndDropDown)
|
|
SendMessage(s_hwndDropDown, WMR_CLICKOUTSIDE, 0, 0);
|
|
}
|
|
|
|
HWND HwndGlobalDropDown()
|
|
{
|
|
return s_hwndDropDown;
|
|
}
|
|
|
|
BOOL ModifyLocalFolderMenu(HMENU hMenu)
|
|
{
|
|
MENUITEMINFO mii;
|
|
TCHAR szRes[CCHMAX_STRINGRES];
|
|
|
|
if (g_dwAthenaMode & MODE_NEWSONLY)
|
|
{
|
|
// File menu
|
|
DeleteMenu(hMenu, ID_IMPORT_MESSAGES, MF_BYCOMMAND);
|
|
DeleteMenu(hMenu, ID_IMPORT_MAIL_ACCOUNTS, MF_BYCOMMAND);
|
|
DeleteMenu(hMenu, ID_EXPORT_MESSAGES, MF_BYCOMMAND);
|
|
|
|
// Tools
|
|
ZeroMemory(&mii, sizeof(MENUITEMINFO));
|
|
mii.cbSize = sizeof(MENUITEMINFO);
|
|
mii.fMask = MIIM_SUBMENU;
|
|
|
|
if (GetMenuItemInfo(hMenu, ID_POPUP_TOOLS, FALSE, &mii))
|
|
{
|
|
// Remove Send & Receive and Message Rules
|
|
DeleteMenu(mii.hSubMenu, ID_SEND_RECEIVE, MF_BYCOMMAND);
|
|
}
|
|
}
|
|
|
|
return (TRUE);
|
|
}
|
|
|
|
BOOL ModifyRootFolderMenu(HMENU hMenu)
|
|
{
|
|
if (g_dwAthenaMode & MODE_NEWSONLY)
|
|
{
|
|
// File menu
|
|
DeleteMenu(hMenu, ID_IMPORT_MESSAGES, MF_BYCOMMAND);
|
|
DeleteMenu(hMenu, ID_IMPORT_MAIL_ACCOUNTS, MF_BYCOMMAND);
|
|
DeleteMenu(hMenu, ID_EXPORT_MESSAGES, MF_BYCOMMAND);
|
|
|
|
// Tools
|
|
DeleteMenu(hMenu, ID_SEND_RECEIVE, MF_BYCOMMAND);
|
|
}
|
|
|
|
return (TRUE);
|
|
}
|
|
|
|
HRESULT CBrowser::GetViewLayout(DWORD opt, LAYOUTPOS *pPos, BOOL *pfVisible, DWORD *pdwFlags, DWORD *pdwSize)
|
|
{
|
|
HRESULT hr = E_FAIL;
|
|
|
|
switch (opt)
|
|
{
|
|
case DISPID_MSGVIEW_TOOLBAR:
|
|
{
|
|
if (pfVisible)
|
|
*pfVisible = m_rgTBar[ITB_COOLBAR].fShow;
|
|
|
|
if (pdwFlags)
|
|
*pdwFlags = 0;
|
|
|
|
hr = S_OK;
|
|
break;
|
|
}
|
|
|
|
case DISPID_MSGVIEW_STATUSBAR:
|
|
{
|
|
if (pfVisible)
|
|
*pfVisible = m_rLayout.fStatusBar;
|
|
if (pPos)
|
|
*pPos = LAYOUT_POS_NA;
|
|
if (pdwFlags)
|
|
*pdwFlags = 0;
|
|
|
|
hr = S_OK;
|
|
break;
|
|
}
|
|
|
|
case DISPID_MSGVIEW_FOLDERBAR:
|
|
{
|
|
if (pfVisible)
|
|
*pfVisible = m_rgTBar[ITB_COOLBAR].fShow;
|
|
if (pPos)
|
|
*pPos = LAYOUT_POS_NA;
|
|
if (pdwFlags)
|
|
*pdwFlags = 0;
|
|
|
|
hr = S_OK;
|
|
break;
|
|
}
|
|
|
|
case DISPID_MSGVIEW_FOLDERLIST:
|
|
{
|
|
if (pfVisible)
|
|
*pfVisible = m_rLayout.fFolderList;
|
|
if (pPos)
|
|
*pPos = LAYOUT_POS_NA;
|
|
if (pdwFlags)
|
|
*pdwFlags = 0;
|
|
|
|
hr = S_OK;
|
|
break;
|
|
}
|
|
|
|
case DISPID_MSGVIEW_TIPOFTHEDAY:
|
|
{
|
|
if (pfVisible)
|
|
*pfVisible = m_rLayout.fTipOfTheDay;
|
|
if (pPos)
|
|
*pPos = LAYOUT_POS_NA;
|
|
if (pdwFlags)
|
|
*pdwFlags = 0;
|
|
|
|
hr = S_OK;
|
|
break;
|
|
}
|
|
|
|
case DISPID_MSGVIEW_INFOPANE:
|
|
{
|
|
if (pfVisible)
|
|
*pfVisible = m_rLayout.fInfoPane;
|
|
if (pPos)
|
|
*pPos = LAYOUT_POS_NA;
|
|
if (pdwFlags)
|
|
*pdwFlags = 0;
|
|
|
|
hr = S_OK;
|
|
break;
|
|
}
|
|
|
|
case DISPID_MSGVIEW_OUTLOOK_BAR:
|
|
{
|
|
if (pfVisible)
|
|
*pfVisible = m_rLayout.fOutlookBar;
|
|
if (pPos)
|
|
*pPos = LAYOUT_POS_NA;
|
|
if (pdwFlags)
|
|
*pdwFlags = 0;
|
|
|
|
hr = S_OK;
|
|
break;
|
|
}
|
|
|
|
case DISPID_MSGVIEW_CONTACTS:
|
|
{
|
|
if (pfVisible)
|
|
*pfVisible = m_rLayout.fContacts;
|
|
if (pPos)
|
|
*pPos = LAYOUT_POS_NA;
|
|
if (pdwFlags)
|
|
*pdwFlags = 0;
|
|
|
|
hr = S_OK;
|
|
break;
|
|
}
|
|
|
|
case DISPID_MSGVIEW_PREVIEWPANE_NEWS:
|
|
{
|
|
if (pfVisible)
|
|
*pfVisible = m_rLayout.fNewsPreviewPane;
|
|
if (pPos)
|
|
*pPos = m_rLayout.fNewsSplitVertically ? LAYOUT_POS_LEFT : LAYOUT_POS_BOTTOM ;
|
|
if (pdwFlags)
|
|
*pdwFlags = m_rLayout.fNewsPreviewPaneHeader;
|
|
if (pdwSize)
|
|
{
|
|
if (0 == m_rLayout.bNewsSplitHorzPct)
|
|
m_rLayout.bNewsSplitHorzPct = 50;
|
|
if (0 == m_rLayout.bNewsSplitVertPct)
|
|
m_rLayout.bNewsSplitVertPct = 50;
|
|
*pdwSize = MAKELONG((WORD) m_rLayout.bNewsSplitHorzPct, (WORD) m_rLayout.bNewsSplitVertPct);
|
|
}
|
|
|
|
hr = S_OK;
|
|
break;
|
|
}
|
|
|
|
case DISPID_MSGVIEW_PREVIEWPANE_MAIL:
|
|
{
|
|
if (pfVisible)
|
|
*pfVisible = m_rLayout.fMailPreviewPane;
|
|
if (pPos)
|
|
*pPos = m_rLayout.fMailSplitVertically ? LAYOUT_POS_LEFT : LAYOUT_POS_BOTTOM ;
|
|
if (pdwFlags)
|
|
*pdwFlags = m_rLayout.fMailPreviewPaneHeader;
|
|
if (pdwSize)
|
|
{
|
|
if (0 == m_rLayout.bMailSplitHorzPct)
|
|
m_rLayout.bMailSplitHorzPct = 50;
|
|
if (0 == m_rLayout.bMailSplitVertPct)
|
|
m_rLayout.bMailSplitVertPct = 50;
|
|
*pdwSize = MAKELONG((WORD) m_rLayout.bMailSplitHorzPct, (WORD) m_rLayout.bMailSplitVertPct);
|
|
}
|
|
|
|
hr = S_OK;
|
|
break;
|
|
}
|
|
|
|
default:
|
|
AssertSz(0, "CBrowser::GetViewLayout() - Called with an unrecognized layout option.");
|
|
}
|
|
|
|
return (hr);
|
|
}
|
|
|
|
|
|
HRESULT CBrowser::SetViewLayout(DWORD opt, LAYOUTPOS pos, BOOL fVisible, DWORD dwFlags, DWORD dwSize)
|
|
{
|
|
HRESULT hr = E_FAIL;
|
|
|
|
switch (opt)
|
|
{
|
|
case DISPID_MSGVIEW_TOOLBAR:
|
|
{
|
|
m_rLayout.fToolbar = !!fVisible;
|
|
|
|
// This can be called before the windows are created. If so, we
|
|
// store the setting and will use it later.
|
|
if (m_pCoolbar)
|
|
{
|
|
m_pCoolbar->HideToolbar(!m_rLayout.fToolbar);
|
|
}
|
|
|
|
hr = S_OK;
|
|
break;
|
|
}
|
|
|
|
case DISPID_MSGVIEW_FILTERBAR:
|
|
{
|
|
m_rLayout.fFilterBar = !!fVisible;
|
|
|
|
if (m_pCoolbar)
|
|
m_pCoolbar->HideToolbar(!m_rLayout.fFilterBar, CBTYPE_RULESTOOLBAR);
|
|
|
|
hr = S_OK;
|
|
break;
|
|
}
|
|
|
|
case DISPID_MSGVIEW_STATUSBAR:
|
|
{
|
|
m_rLayout.fStatusBar = !!fVisible;
|
|
|
|
if (m_pStatus)
|
|
{
|
|
m_pStatus->ShowStatus(m_rLayout.fStatusBar);
|
|
ResizeNextBorder(0);
|
|
}
|
|
|
|
hr = S_OK;
|
|
break;
|
|
}
|
|
|
|
case DISPID_MSGVIEW_FOLDERBAR:
|
|
{
|
|
m_rLayout.fFolderBar = fVisible;
|
|
|
|
if (m_pFolderBar)
|
|
ShowToolbar((IUnknown *) (IDockingWindow *) m_pFolderBar, fVisible);
|
|
|
|
hr = S_OK;
|
|
break;
|
|
}
|
|
|
|
case DISPID_MSGVIEW_FOLDERLIST:
|
|
{
|
|
m_rLayout.fFolderList = fVisible;
|
|
|
|
if (m_pNavPane)
|
|
{
|
|
m_pNavPane->ShowFolderList(fVisible);
|
|
m_pFolderBar->Update(FALSE, TRUE);
|
|
}
|
|
UpdateToolbar();
|
|
hr = S_OK;
|
|
break;
|
|
}
|
|
|
|
case DISPID_MSGVIEW_TIPOFTHEDAY:
|
|
{
|
|
m_rLayout.fTipOfTheDay = fVisible;
|
|
|
|
if (m_hwndInner)
|
|
SendMessage(m_hwndInner, WM_UPDATELAYOUT, 0, 0);
|
|
|
|
hr = S_OK;
|
|
break;
|
|
}
|
|
|
|
case DISPID_MSGVIEW_INFOPANE:
|
|
{
|
|
m_rLayout.fInfoPane = fVisible;
|
|
|
|
if (m_pBodyBar)
|
|
ShowToolbar((IUnknown *) (IDockingWindow *) m_pBodyBar, fVisible);
|
|
|
|
hr = S_OK;
|
|
break;
|
|
}
|
|
|
|
case DISPID_MSGVIEW_OUTLOOK_BAR:
|
|
{
|
|
m_rLayout.fOutlookBar = fVisible;
|
|
|
|
if (m_pOutBar)
|
|
ShowToolbar((IUnknown *) (IDockingWindow *) m_pOutBar, fVisible);
|
|
|
|
hr = S_OK;
|
|
break;
|
|
}
|
|
|
|
case DISPID_MSGVIEW_CONTACTS:
|
|
{
|
|
m_rLayout.fContacts = fVisible;
|
|
|
|
if (m_pNavPane)
|
|
{
|
|
m_pNavPane->ShowContacts(fVisible);
|
|
}
|
|
UpdateToolbar();
|
|
hr = S_OK;
|
|
break;
|
|
}
|
|
|
|
case DISPID_MSGVIEW_PREVIEWPANE_NEWS:
|
|
{
|
|
BOOL fForceUpdate = (m_rLayout.fMailPreviewPane != (unsigned) !!fVisible);
|
|
|
|
m_rLayout.fNewsPreviewPane = !!fVisible;
|
|
m_rLayout.fNewsPreviewPaneHeader = !!dwFlags;
|
|
if (pos != LAYOUT_POS_NA)
|
|
m_rLayout.fNewsSplitVertically = (LAYOUT_POS_LEFT == pos);
|
|
|
|
if (LOWORD(dwSize))
|
|
{
|
|
m_rLayout.bNewsSplitHorzPct = (BYTE) LOWORD(dwSize);
|
|
}
|
|
|
|
if (HIWORD(dwSize))
|
|
{
|
|
m_rLayout.bNewsSplitVertPct = (BYTE) HIWORD(dwSize);
|
|
}
|
|
|
|
if (m_pView)
|
|
{
|
|
IMessageWindow *pWindow;
|
|
|
|
if (SUCCEEDED(m_pView->QueryInterface(IID_IMessageWindow, (LPVOID *) &pWindow)))
|
|
{
|
|
pWindow->UpdateLayout(fVisible, (BOOL) dwFlags, m_rLayout.fNewsSplitVertically, fForceUpdate);
|
|
pWindow->Release();
|
|
}
|
|
}
|
|
|
|
UpdateToolbar();
|
|
|
|
hr = S_OK;
|
|
break;
|
|
}
|
|
|
|
case DISPID_MSGVIEW_PREVIEWPANE_MAIL:
|
|
{
|
|
BOOL fForceUpdate = (m_rLayout.fMailPreviewPane != (unsigned) !!fVisible);
|
|
|
|
m_rLayout.fMailPreviewPane = !!fVisible;
|
|
m_rLayout.fMailPreviewPaneHeader = !!dwFlags;
|
|
if (pos != LAYOUT_POS_NA)
|
|
m_rLayout.fMailSplitVertically = (LAYOUT_POS_LEFT == pos);
|
|
|
|
if (LOWORD(dwSize))
|
|
{
|
|
m_rLayout.bMailSplitHorzPct = (BYTE) LOWORD(dwSize);
|
|
}
|
|
|
|
if (HIWORD(dwSize))
|
|
{
|
|
m_rLayout.bMailSplitVertPct = (BYTE) HIWORD(dwSize);
|
|
}
|
|
|
|
if (m_pView)
|
|
{
|
|
IMessageWindow *pWindow;
|
|
|
|
if (SUCCEEDED(m_pView->QueryInterface(IID_IMessageWindow, (LPVOID *) &pWindow)))
|
|
{
|
|
pWindow->UpdateLayout(fVisible, (BOOL) dwFlags, m_rLayout.fMailSplitVertically, fForceUpdate);
|
|
pWindow->Release();
|
|
}
|
|
}
|
|
|
|
UpdateToolbar();
|
|
|
|
hr = S_OK;
|
|
break;
|
|
}
|
|
|
|
default:
|
|
AssertSz(0, "CBrowser::SetViewLayout() - Called with an unrecognized layout option.");
|
|
}
|
|
|
|
return (hr);
|
|
}
|
|
|
|
|
|
//
|
|
// FUNCTION: CBrowser::LoadLayoutSettings()
|
|
//
|
|
// PURPOSE: Loads all of the layout settings from the registry and
|
|
// caches them in the rLayout member.
|
|
//
|
|
// RETURN VALUE:
|
|
// Returns S_OK all the time
|
|
//
|
|
HRESULT CBrowser::LoadLayoutSettings(void)
|
|
{
|
|
TraceCall("CBrowser::LoadLayoutSettings");
|
|
|
|
m_rLayout.cbSize = sizeof(LAYOUT);
|
|
|
|
// Things that can be turned on or off
|
|
m_rLayout.fStatusBar = DwGetOption(OPT_SHOWSTATUSBAR);
|
|
m_rLayout.fFolderBar = !DwGetOption(OPT_HIDEFOLDERBAR);
|
|
m_rLayout.fFolderList = DwGetOption(OPT_SHOWTREE);
|
|
m_rLayout.fTipOfTheDay = DwGetOption(OPT_TIPOFTHEDAY);
|
|
m_rLayout.fInfoPaneEnabled = FALSE;
|
|
m_rLayout.fInfoPane = DwGetOption(OPT_SHOWBODYBAR);
|
|
m_rLayout.fOutlookBar = DwGetOption(OPT_SHOWOUTLOOKBAR);
|
|
m_rLayout.fContacts = DwGetOption(OPT_SHOWCONTACTS);
|
|
m_rLayout.fMailPreviewPane = DwGetOption(OPT_MAILHYBRIDVIEW);
|
|
m_rLayout.fMailPreviewPaneHeader = DwGetOption(OPT_MAILSHOWHEADERINFO);
|
|
m_rLayout.fMailSplitVertically = DwGetOption(OPT_MAILSPLITDIR);
|
|
m_rLayout.fNewsPreviewPane = DwGetOption(OPT_NEWSHYBRIDVIEW);
|
|
m_rLayout.fNewsPreviewPaneHeader = DwGetOption(OPT_NEWSSHOWHEADERINFO);
|
|
m_rLayout.fNewsSplitVertically = DwGetOption(OPT_NEWSSPLITDIR);
|
|
|
|
// Coolbar Side
|
|
//m_rLayout.csToolbarSide = COOLBAR_TOP;
|
|
|
|
// Preview Pane widths
|
|
m_rLayout.bMailSplitHorzPct = (BYTE) DwGetOption(OPT_MAILCYSPLIT);
|
|
m_rLayout.bMailSplitVertPct = (BYTE) DwGetOption(OPT_MAILCXSPLIT);
|
|
m_rLayout.bNewsSplitHorzPct = (BYTE) DwGetOption(OPT_NEWSCYSPLIT);
|
|
m_rLayout.bNewsSplitVertPct = (BYTE) DwGetOption(OPT_NEWSCXSPLIT);
|
|
|
|
return (S_OK);
|
|
}
|
|
|
|
|
|
|
|
//
|
|
// FUNCTION: CBrowser::SaveLayoutSettings()
|
|
//
|
|
// PURPOSE: Saves all of the layout configuration back to the registry.
|
|
//
|
|
// RETURN VALUE:
|
|
// Returns S_OK all the time
|
|
//
|
|
HRESULT CBrowser::SaveLayoutSettings(void)
|
|
{
|
|
TraceCall("CBrowser::SaveLayoutSettings");
|
|
|
|
// Things that can be turned on or off
|
|
SetDwOption(OPT_SHOWSTATUSBAR, m_rLayout.fStatusBar, 0, 0);
|
|
SetDwOption(OPT_HIDEFOLDERBAR, !m_rLayout.fFolderBar, 0, 0);
|
|
SetDwOption(OPT_SHOWTREE, m_rLayout.fFolderList, 0, 0);
|
|
SetDwOption(OPT_TIPOFTHEDAY, m_rLayout.fTipOfTheDay, 0, 0);
|
|
SetDwOption(OPT_SHOWBODYBAR, m_rLayout.fInfoPane, 0, 0);
|
|
SetDwOption(OPT_SHOWOUTLOOKBAR, m_rLayout.fOutlookBar, 0, 0);
|
|
SetDwOption(OPT_SHOWCONTACTS, m_rLayout.fContacts, 0, 0);
|
|
SetDwOption(OPT_MAILHYBRIDVIEW, m_rLayout.fMailPreviewPane, 0, 0);
|
|
SetDwOption(OPT_MAILSHOWHEADERINFO, m_rLayout.fMailPreviewPaneHeader, 0, 0);
|
|
SetDwOption(OPT_MAILSPLITDIR, m_rLayout.fMailSplitVertically, 0, 0);
|
|
SetDwOption(OPT_NEWSHYBRIDVIEW, m_rLayout.fNewsPreviewPane, 0, 0);
|
|
SetDwOption(OPT_NEWSSHOWHEADERINFO, m_rLayout.fNewsPreviewPaneHeader, 0, 0);
|
|
SetDwOption(OPT_NEWSSPLITDIR, m_rLayout.fNewsSplitVertically, 0, 0);
|
|
|
|
// Preview Pane widths
|
|
SetDwOption(OPT_MAILCYSPLIT, (DWORD) m_rLayout.bMailSplitHorzPct, 0, 0);
|
|
SetDwOption(OPT_MAILCXSPLIT, (DWORD) m_rLayout.bMailSplitVertPct, 0, 0);
|
|
SetDwOption(OPT_NEWSCYSPLIT, (DWORD) m_rLayout.bNewsSplitHorzPct, 0, 0);
|
|
SetDwOption(OPT_NEWSCXSPLIT, (DWORD) m_rLayout.bNewsSplitVertPct, 0, 0);
|
|
|
|
return (S_OK);
|
|
}
|
|
|
|
|
|
HRESULT CBrowser::CmdSendReceieveAccount(DWORD nCmdID, DWORD nCmdExecOpt, VARIANTARG *pvaIn, VARIANTARG *pvaOut)
|
|
{
|
|
MENUITEMINFO mii;
|
|
|
|
mii.cbSize = sizeof(MENUITEMINFO);
|
|
mii.fMask = MIIM_DATA;
|
|
mii.dwItemData = 0;
|
|
|
|
if (GetMenuItemInfo(m_hMenu, nCmdID, FALSE, &mii))
|
|
{
|
|
if (mii.dwItemData)
|
|
{
|
|
g_pSpooler->StartDelivery(m_hwnd, (LPTSTR) mii.dwItemData, FOLDERID_INVALID,
|
|
DELIVER_MAIL_SEND | DELIVER_MAIL_RECV | DELIVER_NOSKIP |
|
|
DELIVER_POLL | DELIVER_OFFLINE_FLAGS);
|
|
}
|
|
else
|
|
{
|
|
g_pSpooler->StartDelivery(m_hwnd, NULL, FOLDERID_INVALID,
|
|
DELIVER_MAIL_SEND | DELIVER_MAIL_RECV | DELIVER_POLL |
|
|
DELIVER_OFFLINE_FLAGS);
|
|
}
|
|
}
|
|
|
|
return (S_OK);
|
|
}
|
|
|
|
|
|
HRESULT CBrowser::CmdDeleteAccel(DWORD nCmdID, DWORD nCmdExecOpt, VARIANTARG *pvaIn, VARIANTARG *pvaOut)
|
|
{
|
|
BOOL fNoTrash;
|
|
IOleCommandTarget *pTarget = NULL;
|
|
|
|
|
|
// Figure out where the focus is
|
|
HWND hwndFocus = GetFocus();
|
|
|
|
Assert(nCmdID == ID_DELETE_ACCEL || nCmdID == ID_DELETE_NO_TRASH_ACCEL);
|
|
|
|
fNoTrash = (nCmdID == ID_DELETE_NO_TRASH_ACCEL);
|
|
|
|
// Check to see if it's the treeview
|
|
if (S_OK == m_pTreeView->HasFocusIO())
|
|
{
|
|
pTarget = m_pTreeView;
|
|
nCmdID = fNoTrash ? ID_DELETE_NO_TRASH : ID_DELETE_FOLDER;
|
|
}
|
|
|
|
// Check to see if it's anything else on the Info Column
|
|
else if (m_pNavPane->IsContactsFocus())
|
|
{
|
|
pTarget = m_pNavPane;
|
|
nCmdID = ID_DELETE_CONTACT;
|
|
}
|
|
|
|
// Otherwise, it must be the view
|
|
else
|
|
{
|
|
pTarget = m_pViewCT;
|
|
nCmdID = fNoTrash ? ID_DELETE_NO_TRASH : ID_DELETE;
|
|
}
|
|
|
|
// Hit the target with the right command
|
|
if (pTarget)
|
|
return (pTarget->Exec(NULL, nCmdID, nCmdExecOpt, pvaIn, pvaOut));
|
|
else
|
|
return (OLECMDERR_E_NOTSUPPORTED);
|
|
}
|
|
|
|
HRESULT CBrowser::TranslateMenuMessage(MSG *lpmsg, LRESULT *lres)
|
|
{
|
|
if (m_pCoolbar)
|
|
return m_pCoolbar->TranslateMenuMessage(lpmsg, lres);
|
|
else
|
|
return S_FALSE;
|
|
}
|
|
|
|
BOOL CBrowser::_InitToolbars(void)
|
|
{
|
|
DWORD dwTreeFlags = 0;
|
|
|
|
if (!(m_pTreeView = new CTreeView(this)))
|
|
goto error;
|
|
|
|
if (g_dwAthenaMode & MODE_OUTLOOKNEWS)
|
|
dwTreeFlags |= TREEVIEW_NOIMAP | TREEVIEW_NOHTTP;
|
|
|
|
if (FAILED(m_pTreeView->HrInit(dwTreeFlags, this)))
|
|
goto error;
|
|
|
|
|
|
if (!(m_pCoolbar = new CBands()))
|
|
goto error;
|
|
|
|
if (FAILED(m_pCoolbar->HrInit(NULL, m_hMenu, PARENT_TYPE_BROWSER)))
|
|
goto error;
|
|
|
|
if (FAILED(AddToolbar((IDockingWindow*)m_pCoolbar, ITB_COOLBAR, TRUE, TRUE)))
|
|
goto error;
|
|
|
|
//m_pCoolbar->HideToolbar(!m_rLayout.fToolbar);
|
|
m_rLayout.fToolbar = m_pCoolbar->IsBandVisible(CBTYPE_TOOLS);
|
|
m_rLayout.fFilterBar = m_pCoolbar->IsBandVisible(CBTYPE_RULESTOOLBAR);
|
|
|
|
if (FAILED(m_pCoolbar->SetFolderType(m_ftSel)))
|
|
goto error;
|
|
|
|
if (!(m_pOutBar = new COutBar()))
|
|
goto error;
|
|
|
|
if (FAILED(m_pOutBar->HrInit(NULL, this)))
|
|
goto error;
|
|
|
|
if (FAILED(AddToolbar((IDockingWindow *) m_pOutBar, ITB_OUTBAR, m_rLayout.fOutlookBar, TRUE)))
|
|
goto error;
|
|
|
|
#ifdef HOTMAILADV
|
|
if (!(m_pAdBar = new CAdBar()))
|
|
goto error;
|
|
|
|
if (FAILED(AddToolbar((IDockingWindow*)m_pAdBar, ITB_ADBAR, TRUE, FALSE)))
|
|
goto error;
|
|
#endif // HOTMAILADV
|
|
|
|
if (!(m_pBodyBar = new CBodyBar()))
|
|
goto error;
|
|
|
|
BOOL fBodyBarEnabled;
|
|
if (FAILED(m_pBodyBar->HrInit(&fBodyBarEnabled)))
|
|
goto error;
|
|
m_rLayout.fInfoPaneEnabled = !!fBodyBarEnabled;
|
|
|
|
if (FAILED(AddToolbar((IDockingWindow*)m_pBodyBar, ITB_BODYBAR,
|
|
m_rLayout.fInfoPaneEnabled && m_rLayout.fInfoPane, FALSE)))
|
|
goto error;
|
|
|
|
if (!(m_pFolderBar = new CFolderBar()))
|
|
goto error;
|
|
|
|
if (FAILED(m_pFolderBar->HrInit(this)))
|
|
goto error;
|
|
|
|
if (FAILED(AddToolbar((IDockingWindow*)m_pFolderBar, ITB_FOLDERBAR, m_rLayout.fFolderBar, TRUE)))
|
|
goto error;
|
|
|
|
if (!(m_pNavPane = new CNavPane()))
|
|
goto error;
|
|
|
|
if (FAILED(m_pNavPane->Initialize(m_pTreeView)))
|
|
goto error;
|
|
|
|
if (FAILED(AddToolbar((IDockingWindow*) m_pNavPane, ITB_NAVPANE, m_rLayout.fFolderList || m_rLayout.fContacts, TRUE)))
|
|
goto error;
|
|
|
|
return (TRUE);
|
|
|
|
error:
|
|
SafeRelease(m_pStatus);
|
|
SafeRelease(m_pTreeView);
|
|
SafeRelease(m_pCoolbar);
|
|
SafeRelease(m_pFolderBar);
|
|
|
|
return (FALSE);
|
|
}
|
|
|
|
|
|
HRESULT CBrowser::QuerySwitchIdentities()
|
|
{
|
|
TraceCall("CBrowser::QuerySwitchIdentities");
|
|
|
|
if (!IsWindowEnabled(m_hwnd))
|
|
{
|
|
Assert(IsWindowVisible(m_hwnd));
|
|
return E_PROCESS_CANCELLED_SWITCH;
|
|
}
|
|
|
|
if (g_pConMan->IsConnected())
|
|
{
|
|
SetForegroundWindow(m_hwnd);
|
|
|
|
if (IDNO == AthMessageBoxW(m_hwnd, MAKEINTRESOURCEW(idsSwitchUser),MAKEINTRESOURCEW(idsMaintainConnection),
|
|
NULL, MB_ICONEXCLAMATION | MB_YESNO | MB_DEFBUTTON1 | MB_SYSTEMMODAL))
|
|
g_pConMan->Disconnect(m_hwnd, TRUE, FALSE, FALSE );
|
|
}
|
|
|
|
m_fSwitchIsLogout = MU_CheckForIdentityLogout();
|
|
|
|
return S_OK;
|
|
}
|
|
|
|
HRESULT CBrowser::SwitchIdentities()
|
|
{
|
|
TraceCall("CBrowser::SwitchIdentities");
|
|
|
|
if (!m_fSwitchIsLogout)
|
|
{
|
|
// Let ::BrowserWndProc know that this close is due to an id switch
|
|
s_fQuickShutdown = TRUE;
|
|
}
|
|
else
|
|
{
|
|
s_fQuickShutdown = FALSE;
|
|
g_pInstance->SetSwitchingUsers(FALSE);
|
|
}
|
|
|
|
// We can't SendMessage here as we'd cause ole to throw RPC_E_CANTCALLOUT_ININPUTSYNCCALL
|
|
PostMessage(m_hwnd, WM_CLOSE, 0, 0);
|
|
|
|
return S_OK;
|
|
}
|
|
|
|
HRESULT CBrowser::IdentityInformationChanged(DWORD dwType)
|
|
{
|
|
TraceCall("CBrowser::IdentityInformationChanged");
|
|
|
|
// Refresh for adds, delete, or current identity changed
|
|
// since adding could require that the name show up,
|
|
// deleteing could require that it go away and changed
|
|
// should be reflected immediately.
|
|
if (dwType != IIC_IDENTITY_CHANGED)
|
|
{
|
|
MU_IdentityChanged();
|
|
OnRename(m_idSelected);
|
|
}
|
|
return S_OK;
|
|
}
|
|
|
|
HRESULT CBrowser::ShowAdBar(BSTR bstr)
|
|
{
|
|
HRESULT hr = S_OK;
|
|
#ifdef HOTMAILADV
|
|
LPSTR pszAdInfo = NULL;
|
|
BOOL fShowAdPane = FALSE;
|
|
LPSTR pszActualUrl = NULL;
|
|
DWORD ActualCount = 0;
|
|
CHAR szAdPaneValue[MAX_PATH];
|
|
DWORD cchRetCount = 0;
|
|
CHAR szAdOther[MAX_PATH];
|
|
CHAR szEncodedString[MAX_PATH];
|
|
CHAR szAdSvr[MAX_PATH];
|
|
FOLDERINFO FolderInfo = {0};
|
|
CHAR szAccountId[CCHMAX_ACCOUNT_NAME];
|
|
IImnAccount *pAccount = NULL;
|
|
CHAR szCachedAdUrl[INTERNET_MAX_URL_LENGTH];
|
|
|
|
IF_FAILEXIT(hr = HrBSTRToLPSZ(CP_ACP, bstr, &pszAdInfo));
|
|
|
|
//Search for AdPane token
|
|
IF_FAILEXIT(hr = HrProcessAdTokens(pszAdInfo, c_szAdPane, szAdPaneValue, ARRAYSIZE(szAdPaneValue), &cchRetCount));
|
|
|
|
fShowAdPane = (lstrcmp(szAdPaneValue, c_szAdPaneOn) == 0);
|
|
|
|
// Get the server for this folder
|
|
IF_FAILEXIT(hr = GetFolderServer(m_idSelected, &FolderInfo));
|
|
|
|
// Get the account ID for the server
|
|
IF_FAILEXIT(hr = GetFolderAccountId(&FolderInfo, szAccountId));
|
|
|
|
// Get the account interface
|
|
IF_FAILEXIT(hr = g_pAcctMan->FindAccount(AP_ACCOUNT_ID, szAccountId, &pAccount));
|
|
|
|
IF_FAILEXIT(hr = pAccount->SetPropDw(AP_HTTPMAIL_SHOW_ADBAR, fShowAdPane));
|
|
|
|
if (fShowAdPane)
|
|
{
|
|
//Plus one for null in version string
|
|
ActualCount += CCH_REDIRECT_ADURL + strlen(c_szUrlSubPVER) + 1;
|
|
|
|
//Search for AdSvr token
|
|
IF_FAILEXIT(hr = HrProcessAdTokens(pszAdInfo, c_szAdSvr, szAdSvr, ARRAYSIZE(szAdSvr), &cchRetCount));
|
|
|
|
ActualCount += cchRetCount;
|
|
|
|
ActualCount += CCH_ADSVR_TOKEN_FORMAT;
|
|
|
|
//Search for the token other
|
|
IF_FAILEXIT(hr = HrProcessAdTokens(pszAdInfo, c_szAdOther, szAdOther, ARRAYSIZE(szAdOther), &cchRetCount));
|
|
|
|
//Encode the other string
|
|
IF_FAILEXIT(hr = HrEscapeOtherAdToken(szAdOther, szEncodedString, ARRAYSIZE(szEncodedString), &cchRetCount));
|
|
|
|
ActualCount += cchRetCount;
|
|
|
|
//one for null
|
|
ActualCount += CCH_OTHER_FORMAT + 1;
|
|
|
|
IF_FAILEXIT(hr = HrAlloc((LPVOID*)&pszActualUrl, ActualCount));
|
|
|
|
*pszActualUrl = 0;
|
|
|
|
wnsprintf(pszActualUrl, ActualCount, c_szAdRedirectFormat, c_szRedirectAdUrl, c_szUrlSubPVER,
|
|
c_szAdSvrFormat, szAdSvr, c_szAdOtherFormat, szEncodedString);
|
|
|
|
|
|
IF_FAILEXIT(hr = m_pAdBar->SetUrl(pszActualUrl));
|
|
|
|
IF_FAILEXIT(hr = pAccount->SetPropSz(AP_HTTPMAIL_ADURL, pszActualUrl));
|
|
}
|
|
|
|
ShowToolbar((IDockingWindow*)m_pAdBar, fShowAdPane);
|
|
|
|
//We need to do this to persist the property into registry.
|
|
IF_FAILEXIT(hr = pAccount->WriteChanges());
|
|
|
|
exit:
|
|
|
|
if (FAILED(hr) && fShowAdPane)
|
|
{
|
|
BOOL fSucceeded = FALSE;
|
|
|
|
//We are supposed to show adpane, but something went wrong in the info we got.
|
|
//We just display the cached URL.
|
|
*szCachedAdUrl = 0;
|
|
|
|
if (pAccount)
|
|
{
|
|
if (SUCCEEDED(pAccount->GetPropSz(AP_HTTPMAIL_ADURL, szCachedAdUrl, ARRAYSIZE(szCachedAdUrl))))
|
|
{
|
|
fSucceeded = SUCCEEDED(m_pAdBar->SetUrl(szCachedAdUrl));
|
|
}
|
|
}
|
|
|
|
if (!fSucceeded)
|
|
{
|
|
//If we can't get the cached ad or if the cached is empty, we turn off the adpane
|
|
ShowToolbar((IDockingWindow*)m_pAdBar, FALSE);
|
|
}
|
|
|
|
}
|
|
|
|
g_pStore->FreeRecord(&FolderInfo);
|
|
ReleaseObj(pAccount);
|
|
MemFree(pszActualUrl);
|
|
MemFree(pszAdInfo);
|
|
#endif // HOTMAILADV
|
|
|
|
return hr;
|
|
}
|
|
|
|
void CBrowser::WriteUnreadCount(void)
|
|
{
|
|
IImnEnumAccounts *pEnum = NULL;
|
|
IImnAccount *pAcct = NULL;
|
|
DWORD cServers = 0;
|
|
IMessageFolder *pFolder = NULL;
|
|
DWORD nCount = 0 ;
|
|
FOLDERID idServer;
|
|
TCHAR szUserEmail[CCHMAX_EMAIL_ADDRESS];
|
|
WCHAR wsz[CCHMAX_EMAIL_ADDRESS];
|
|
HRESULT hr = S_OK;
|
|
|
|
// can't proceed if there's no accnt manager
|
|
if (g_pAcctMan == NULL)
|
|
return;
|
|
|
|
// 1. Enumerate POP3 accounts:
|
|
if (S_OK == g_pAcctMan->Enumerate(SRV_POP3, &pEnum))
|
|
{
|
|
// Get count of servers
|
|
pEnum->GetCount(&cServers);
|
|
|
|
if(cServers == 1)
|
|
{
|
|
// a). All POP3 account in local store
|
|
if(SUCCEEDED(pEnum->GetNext(&pAcct)) && g_pStore)
|
|
{
|
|
IF_FAILEXIT(hr = g_pStore->OpenSpecialFolder(FOLDERID_LOCAL_STORE, NULL, FOLDER_INBOX, &pFolder));
|
|
|
|
nCount = _GetNumberOfUnreadMsg(pFolder);
|
|
IF_FAILEXIT(hr = pAcct->GetPropSz(AP_SMTP_EMAIL_ADDRESS, szUserEmail, ARRAYSIZE(szUserEmail)));
|
|
if(MultiByteToWideChar(CP_ACP, 0, szUserEmail, -1, wsz, ARRAYSIZE(wsz)) != 0)
|
|
// write # unread messages to registry
|
|
hr = SHSetUnreadMailCountW(wsz, nCount, L"msimn");
|
|
SafeRelease(pFolder);
|
|
}
|
|
|
|
}
|
|
}
|
|
|
|
// 1. Enumerate IMAP accounts:
|
|
IF_FAILEXIT(hr = _CheckAndWriteUnreadNumber(SRV_IMAP));
|
|
IF_FAILEXIT(hr = _CheckAndWriteUnreadNumber(SRV_HTTPMAIL));
|
|
|
|
exit:
|
|
SafeRelease(pAcct);
|
|
SafeRelease(pEnum);
|
|
return;
|
|
}
|
|
|
|
DWORD CBrowser::_GetNumberOfUnreadMsg(IMessageFolder *pFolder)
|
|
{
|
|
DWORD nCount = 0;
|
|
HROWSET hRowset=NULL;
|
|
MESSAGEINFO Message={0};
|
|
HRESULT hr = S_OK;
|
|
// Create Rowset
|
|
IF_FAILEXIT(hr = pFolder->CreateRowset(IINDEX_PRIMARY, NOFLAGS, &hRowset));
|
|
|
|
// Iterate throug the messages
|
|
while (S_OK == pFolder->QueryRowset(hRowset, 1, (LPVOID *)&Message, NULL))
|
|
{
|
|
// Not Read
|
|
if (FALSE == ISFLAGSET(Message.dwFlags, ARF_READ))
|
|
nCount++;
|
|
|
|
// Free
|
|
pFolder->FreeRecord(&Message);
|
|
}
|
|
|
|
exit:
|
|
// Clenaup
|
|
pFolder->CloseRowset(&hRowset);
|
|
|
|
return(nCount);
|
|
}
|
|
|
|
HRESULT CBrowser::_CheckAndWriteUnreadNumber(DWORD dwSrvTypes)
|
|
{
|
|
IImnEnumAccounts *pEnum = NULL;
|
|
IImnAccount *pAcct = NULL;
|
|
DWORD cServers = 0;
|
|
IMessageFolder *pFolder = NULL;
|
|
DWORD nCount = 0 ;
|
|
FOLDERID idServer;
|
|
TCHAR szAccountId[CCHMAX_ACCOUNT_NAME];
|
|
TCHAR szUserEmail[CCHMAX_EMAIL_ADDRESS];
|
|
WCHAR wsz[CCHMAX_EMAIL_ADDRESS];
|
|
HRESULT hr = S_OK;
|
|
|
|
if(g_pStore == NULL)
|
|
return(hr);
|
|
|
|
if (S_OK == g_pAcctMan->Enumerate(dwSrvTypes, &pEnum))
|
|
{
|
|
while(SUCCEEDED(pEnum->GetNext(&pAcct)))
|
|
{
|
|
// Get the Account ID for pAccount
|
|
IF_FAILEXIT(hr = pAcct->GetPropSz(AP_ACCOUNT_ID, szAccountId, ARRAYSIZE(szAccountId)));
|
|
|
|
// Find the Server Id
|
|
IF_FAILEXIT(hr = g_pStore->FindServerId(szAccountId, &idServer));
|
|
|
|
// Open Store
|
|
IF_FAILEXIT(hr = g_pStore->OpenSpecialFolder(idServer, NULL, FOLDER_INBOX, &pFolder));
|
|
|
|
nCount = _GetNumberOfUnreadMsg(pFolder);
|
|
|
|
// write # unread messages to registry
|
|
IF_FAILEXIT(hr = pAcct->GetPropSz(AP_SMTP_EMAIL_ADDRESS, szUserEmail, ARRAYSIZE(szUserEmail)));
|
|
|
|
if(MultiByteToWideChar(CP_ACP, 0, szUserEmail, -1, wsz, ARRAYSIZE(wsz)) != 0)
|
|
hr = SHSetUnreadMailCountW(wsz, nCount, L"msimn");
|
|
SafeRelease(pFolder);
|
|
SafeRelease(pAcct);
|
|
}
|
|
}
|
|
exit:
|
|
SafeRelease(pFolder);
|
|
SafeRelease(pAcct);
|
|
SafeRelease(pEnum);
|
|
return(hr);
|
|
}
|