gecko-dev/cmd/winfe/genframe.cpp

3347 lines
93 KiB
C++

/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
*
* The contents of this file are subject to the Netscape Public License
* Version 1.0 (the "NPL"); you may not use this file except in
* compliance with the NPL. You may obtain a copy of the NPL at
* http://www.mozilla.org/NPL/
*
* Software distributed under the NPL is distributed on an "AS IS" basis,
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL
* for the specific language governing rights and limitations under the
* NPL.
*
* The Initial Developer of this code under the NPL is Netscape
* Communications Corporation. Portions created by Netscape are
* Copyright (C) 1998 Netscape Communications Corporation. All Rights
* Reserved.
*/
// genframe.cpp : implementation file
//
#include "stdafx.h"
#include "confhook.h"
#ifdef MOZ_MAIL_NEWS
#include "mailfrm.h"
#endif
#ifdef EDITOR
#include "edt.h"
#endif
#include "winclose.h"
#include "prefapi.h"
#ifdef MOZ_OFFLINE
#include "dlgdwnld.h"
#endif
#include "genchrom.h"
#include "intl_csi.h"
#include "quickfil.h"
#ifndef XP_WIN16
#include "navFram.h"
#endif
#include "property.h"
#ifdef _WIN32
#include "intelli.h"
#endif
#ifdef JAVA
#include "java.h"
#endif
// for whitebox testing
//#define DEBUG_WHITEBOX
#ifdef DEBUG_WHITEBOX
#include "TestcaseDlg.h"
#endif
extern void wfe_Progress(MWContext *pContext, const char *pMessage);
#ifdef _DEBUG
#undef THIS_FILE
static char BASED_CODE THIS_FILE[] = __FILE__;
#endif
//CLM: Global in TEMPLATE.CPP - saves last frame location
// for new window postioning - cleared in ::OnClose method here
extern CGenericFrame *wfe_pLastFrame;
//
// Bookmark stuff
//
// This is used to remember the number of existing menu items on the
// bookmark menu before we add the bookmark items. We need this so we
// know how many menu items to delete when the menu goes away
static int nExistingBookmarkMenuItems;
// We destroy the menu items we added when we receive the WM_MENUSELECT.
// Because Windows sends the WM_MENUSELECT that the menu is going away
// before they send the WM_COMMAND, we need to remember the last menu item
// selected and its data (i.e. URL address or History_entry*)
static UINT nLastSelectedCmdID;
static void* nLastSelectedData;
// Macro to use for graying toolbar and menu items
// when we don't have a context or it is in "waiting" mode
// This is used by both Navigator and Composer frames,
// so we check if Editor is blocked
#define CAN_INTERACT_IF_EDITOR (GetMainContext() != NULL && GetMainContext()->GetContext() != NULL \
&& !GetMainContext()->GetContext()->waitingMode \
&& (!EDT_IS_EDITOR(GetMainContext()->GetContext()) \
|| !EDT_IsBlocked(GetMainContext()->GetContext())))
#ifndef _AFXDLL
#undef new
#endif
IMPLEMENT_DYNCREATE(CNSGenFrame, CFrameWnd)
#ifndef _AFXDLL
#define new DEBUG_NEW
#endif
/////////////////////////////////////////////////////////////////////////////
// CGenericFrame
#ifndef _AFXDLL
#undef new
#endif
IMPLEMENT_DYNCREATE(CGenericFrame, CNSGenFrame)
#ifndef _AFXDLL
#define new DEBUG_NEW
#endif
// The Event Handler
static void qfNotifyProcedure (HT_Notification ns, HT_Resource n, HT_Event whatHappened)
{
if (whatHappened == HT_EVENT_NODE_OPENCLOSE_CHANGED)
{
// The node was opened.
PRBool openState;
HT_GetOpenState(n, &openState);
if (openState)
{
CGenericFrame* pFrame = (CGenericFrame*)ns->data;
pFrame->FinishMenuExpansion(n);
}
}
}
CGenericFrame::CGenericFrame()
{
// Construct the notification struct used by HT
HT_Notification ns = new HT_NotificationStruct;
ns->notifyProc = qfNotifyProcedure;
ns->data = this;
m_BookmarkMenuPane = theApp.m_bInGetCriticalFiles ? NULL : HT_NewQuickFilePane(ns);
m_nBookmarkItems = 0;
m_nFileBookmarkItems = 0;
m_pHotlistMenuMap = new CMapWordToPtr();
m_isClosing = FALSE;
#ifdef XP_WIN32
m_pSubmenuMap = new CMapPtrToPtr();
#else
m_pSubmenuMap = new CMapWordToPtr();
#endif
#ifdef XP_WIN32
m_pFileSubmenuMap = new CMapPtrToPtr();
#else
m_pFileSubmenuMap = new CMapWordToPtr();
#endif
m_pBookmarkBitmap = NULL;
m_pBookmarkFolderBitmap = NULL;
m_pBookmarkFolderOpenBitmap = NULL;
m_pBookmarksMenu = NULL;
m_BookmarksGarbageList = NULL;
m_OriginalBookmarksGarbageList = NULL;
#ifdef _WIN32
m_pMenuMap = new CMapPtrToPtr();
#else
m_pMenuMap = new CMapWordToPtr();
#endif
#ifdef EDITOR
extern void FED_SetupStrings(void);
FED_SetupStrings();
m_bCloseFrame = FALSE;
m_bSkipSaveEditChanges = FALSE;
#endif
// Initially we'll be allowing the frame to resize.
m_bCanResize = TRUE;
m_bDisableHotkeys = FALSE;
m_bPreCreated = FALSE;
m_bZOrderLocked = FALSE;
m_bBottommost = FALSE;
m_pChrome = NULL;
m_wAddedExStyles = 0L;
m_wRemovedExStyles = 0L;
m_hPopupParent = NULL;
m_bConference = FALSE;
#ifdef XP_WIN32
// jliu added the following to support CJK caption print
m_bActive = FALSE;
m_csid = CIntlWin::GetSystemLocaleCsid();
SetupCapFont( m_csid ); // setup the default font first
DWORD dwVersion = ::GetVersion();
if( LOBYTE(dwVersion) < 4 )
capStyle = DT_CENTER; // for NT 3.51
else
capStyle = DT_LEFT; // for NT 4.0 and Win95
#endif
}
#ifdef XP_WIN32
// jliu added the following to support CJK caption print
int16 CGenericFrame::GetTitleWinCSID()
{
CWinCX *pContext = GetMainWinContext();
MWContext* pMWContext = NULL;
if( pContext == NULL || ( pMWContext = pContext->GetContext() ) == NULL ){
return -1;
}
INTL_CharSetInfo csi = LO_GetDocumentCharacterSetInfo(pMWContext);
return INTL_GetCSIWinCSID(csi);
}
////////////////////////////////////////////////////////////////////
// this function is called outside to get the wincsid
// and then setup the Caption Font.
//
void CGenericFrame::SetupCapFont( int16 csid, BOOL force )
{
if( !force && ( m_csid == csid ) && ( hCapFont.m_hObject != NULL ) )
return;
// set the wincsid
if( csid <= 0 )
m_csid = CIntlWin::GetSystemLocaleCsid();
else
m_csid = csid;
// set the caption print font
if( hCapFont.m_hObject != NULL )
hCapFont.DeleteObject();
// get the system caption print font first
NONCLIENTMETRICS nc;
nc.cbSize = sizeof(NONCLIENTMETRICS);
BOOL b = SystemParametersInfo( SPI_GETNONCLIENTMETRICS, sizeof(NONCLIENTMETRICS), &nc, 0 );
XP_ASSERT( b );
LOGFONT lf = nc.lfCaptionFont; // get the logic font used to paint the caption
csid = CIntlWin::GetSystemLocaleCsid();
if( force || ( m_csid != csid ) ){ // in case user changes system font
lf.lfCharSet = IntlGetLfCharset( m_csid );
_tcscpy( lf.lfFaceName, IntlGetUIPropFaceName( m_csid ) );
hCapFont.CreateFontIndirect( &lf );
}
// create the default font if the above step failure
if( hCapFont.m_hObject == NULL ){
hCapFont.CreateFontIndirect( &nc.lfCaptionFont );
m_csid = csid;
}
}
//////////////////
// User changed system settings, such as font. Or changed
// encoding method, coming from compfrm.cpp
// Invalidate everything to generate anew.
//
LRESULT CGenericFrame::OnSettingChange( WPARAM, LPARAM )
{
SetupCapFont( GetTitleWinCSID(), TRUE );
SendMessage(WM_NCPAINT);
return 0;
}
//////////////////
// Someone called SetWindowText: paint new text.
//
LRESULT CGenericFrame::OnSetText(WPARAM wParam, LPARAM lParam)
{
SetupCapFont( GetTitleWinCSID() );
// Turn WS_VISIBLE style off before calling Windows to
// set the text, then turn it back on again after.
//
DWORD dwStyle = GetStyle();
if( dwStyle & WS_VISIBLE )
SetWindowLong( m_hWnd, GWL_STYLE, dwStyle & ~WS_VISIBLE );
LRESULT lRet = DefWindowProc(WM_SETTEXT, wParam, lParam);
if( dwStyle & WS_VISIBLE )
SetWindowLong( m_hWnd, GWL_STYLE, dwStyle );
SendMessage(WM_NCPAINT); // paint non-client area (frame too)
return lRet;
}
//////////////////
// Non-client area (de)activated: paint it
//
BOOL CGenericFrame::OnNcActivate(BOOL bActive)
{
if( m_nFlags & WF_STAYACTIVE )
bActive = TRUE;
if( !IsWindowEnabled() )
bActive = FALSE;
if( bActive == m_bActive )
return TRUE;
MSG& msg = AfxGetThreadState()->m_lastSentMsg;
if( msg.wParam > 1 )
msg.wParam = TRUE;
m_bActive = bActive = msg.wParam;
// Turn WS_VISIBLE off before calling DefWindowProc,
// so DefWindowProc won't paint and thereby cause flicker.
//
DWORD dwStyle = GetStyle();
if( dwStyle & WS_VISIBLE )
::SetWindowLong(m_hWnd, GWL_STYLE, (dwStyle & ~WS_VISIBLE));
DefWindowProc(WM_NCACTIVATE, bActive, 0L); // don't call CFrameWnd::OnNcActivate()
if( dwStyle & WS_VISIBLE )
::SetWindowLong(m_hWnd, GWL_STYLE, dwStyle);
SendMessage( WM_NCPAINT ); // paint non-client area and frame
return TRUE;
}
void CGenericFrame::OnNcPaint()
{
DWORD dwStyle = GetStyle();
if( !( dwStyle & WS_CAPTION ) ){
CFrameWnd::OnNcPaint(); // do the default one first
return;
}
CSize szFrame = (dwStyle & WS_THICKFRAME) ?
CSize(GetSystemMetrics(SM_CXSIZEFRAME),
GetSystemMetrics(SM_CYSIZEFRAME)) :
CSize(GetSystemMetrics(SM_CXFIXEDFRAME),
GetSystemMetrics(SM_CYFIXEDFRAME));
int dxIcon = GetSystemMetrics(SM_CXSIZE); // width of caption icon/button
// Compute rectangle
CRect rc; // window rect in screen coords
GetWindowRect( &rc );
rc.left += szFrame.cx; // frame
rc.right -= szFrame.cx; // frame
rc.top += szFrame.cy; // top = end of frame
rc.bottom = rc.top + GetSystemMetrics(SM_CYCAPTION) // height of caption
- GetSystemMetrics(SM_CYBORDER); // minus gray shadow border
MSG& msg = AfxGetThreadState()->m_lastSentMsg;
// Don't paint if the caption doesn't lie within the region.
//
if (msg.wParam > 1 && !::RectInRegion((HRGN)msg.wParam, &rc)) {
CFrameWnd::OnNcPaint(); // do the default one first
return; // quit
}
// setup the update region, include the title text region
CRect rectCaption;
GetWindowRect( &rectCaption );
CWindowDC dc(this);
CFont* hFontOld = dc.SelectObject( &hCapFont );
HRGN hRgnCaption = ::CreateRectRgnIndirect(&rc);
HRGN hRgnNew = ::CreateRectRgnIndirect(&rc);
if( msg.wParam > 1 ){
// wParam is a valid region: subtract caption from it
::CombineRgn( hRgnNew, (HRGN)msg.wParam, hRgnCaption, RGN_OR );
} else {
// wParam is not a valid region: create one that's the whole window
DeleteObject( hRgnNew );
hRgnNew = ::CreateRectRgnIndirect(&rectCaption);
}
// call the default NcPaint
WPARAM savewp = msg.wParam; // save original wParam
msg.wParam = (WPARAM)hRgnNew; // set new region for DefWindowProc
CFrameWnd::OnNcPaint(); // paint the caption bar except title text
DeleteObject( hRgnCaption ); // clean up
DeleteObject( hRgnNew ); // clean up
msg.wParam = savewp; // restore original wParam
// Compute rectangle
// Within the basic button rectangle, Windows 95 uses a 1 or 2 pixel border
// Icon has 2 pixel border on left, 1 pixel on top/bottom, 0 right
// Close box has a 2 pixel border on all sides but left, which is zero
// Minimize button has 2 pixel border on all sides but right.
rectCaption -= rectCaption.TopLeft(); // convert caption rectangle origin to (0,0)
rectCaption.left += (szFrame.cx + 2 + dxIcon);
rectCaption.right -= (szFrame.cx + 2 + dxIcon);
rectCaption.top += szFrame.cy; // top = end of frame
rectCaption.bottom = rectCaption.top + GetSystemMetrics(SM_CYCAPTION) // height of caption
- GetSystemMetrics(SM_CYBORDER); // minus gray shadow border
// i don't know why MS supports this feature ...
if( ( dwStyle & WS_MAXIMIZEBOX ) || ( dwStyle & WS_MINIMIZEBOX ) ){
rectCaption.right -= ( dxIcon + 2 + dxIcon );
if( capStyle != DT_LEFT ) // for NT 3.51
rectCaption.right += dxIcon + 4;
}
// create a brush for caption background
CBrush brCaption;
brCaption.CreateSolidBrush(
::GetSysColor( m_bActive ? COLOR_ACTIVECAPTION : COLOR_INACTIVECAPTION ) );
CString strTitle;
GetWindowText( strTitle );
dc.FillRect(&rectCaption, &brCaption);
dc.SetTextColor(::GetSysColor(m_bActive ? COLOR_CAPTIONTEXT : COLOR_INACTIVECAPTIONTEXT));
dc.SetBkMode(TRANSPARENT);
int titleLen = _tcslen( strTitle );
UINT cs = capStyle;
if( cs != DT_LEFT ){ // it is NT 3.51
CSize size = dc.GetTextExtent( strTitle, titleLen );
if( size.cx >= rectCaption.Width() )
cs = DT_LEFT;
}
CIntlWin::DrawText( m_csid, (HDC)dc, strTitle.GetBuffer( titleLen ), titleLen,
&rectCaption, cs|DT_VCENTER|DT_SINGLELINE|DT_END_ELLIPSIS );
dc.SelectObject(hFontOld);
}
#endif // #ifdef XP_WIN32
CGenericFrame::~CGenericFrame()
{
if (m_BookmarkMenuPane)
{
HT_DeletePane(m_BookmarkMenuPane);
m_BookmarkMenuPane = NULL;
}
#ifdef XP_WIN32
if( hCapFont.m_hObject != NULL )
hCapFont.DeleteObject();
#endif
if (m_pHotlistMenuMap) {
delete m_pHotlistMenuMap;
m_pHotlistMenuMap = NULL;
}
if (m_pSubmenuMap) {
delete m_pSubmenuMap;
m_pSubmenuMap = NULL;
}
if (m_pFileSubmenuMap) {
delete m_pFileSubmenuMap;
m_pFileSubmenuMap = NULL;
}
if (m_pMenuMap)
{
DeleteMenuMapIDs();
delete m_pMenuMap;
m_pMenuMap = NULL;
}
if (m_pChrome) {
m_pChrome->Release();
}
// Remove it from the list of frames kept by theApp
// Done here as was done in OnClose, but needed here since
// hidden frame when in place never remove's itself from the
// list as OnClose never gets called if not active when
// deleted.
if(theApp.m_pFrameList == this) {
// first one
theApp.m_pFrameList = m_pNext;
// Reset the global last frame
// (this is unlikely unless we are only frame left)
if( wfe_pLastFrame == this )
wfe_pLastFrame = NULL;
} else {
// loop through for the one pointing to me
for(CGenericFrame * f = theApp.m_pFrameList; f; f = f->m_pNext)
if(f->m_pNext == this){
// Change the "last frame" to the one before
if( wfe_pLastFrame == this )
wfe_pLastFrame = f;
f->m_pNext = m_pNext;
}
}
}
#define SEPARATORS_BEFORE_BOOKMARKS_START 2
#define ITEMS_BEFORE_BOOKMARKS_START 6
#define ITEMS_AFTER_BOOKMARKS_END 0
void CGenericFrame::BuildDirectoryMenu(CMenu * pMenu)
{
if (!pMenu) return;
if(GetMainContext() == NULL) {
return;
}
int idx =0, idx2=0;
int iItems = pMenu->GetMenuItemCount();
char *label;
int bOK = PREF_NOERROR;
for (idx=0; bOK==PREF_NOERROR; idx++) {
bOK = PREF_CopyIndexConfigString("menu.places.item",idx,"label",&label);
// if the label is blank, truncate the menu here.
if (!label || !label[0])
bOK = PREF_ERROR;
if (bOK == PREF_NOERROR) {
if (idx < iItems) {
if (!strcmpi("SEPARATOR",label) || !strcmpi("-",label))
pMenu->ModifyMenu(CASTUINT(idx),CASTUINT(MF_BYPOSITION | MF_SEPARATOR),NULL,"");
else
pMenu->ModifyMenu(CASTUINT(idx),CASTUINT(MF_BYPOSITION | MF_STRING),CASTUINT(FIRST_PLACES_MENU_ID + idx),label);
} else {
if (!strcmpi("SEPARATOR",label) || !strcmpi("-",label))
pMenu->InsertMenu(CASTUINT(idx),CASTUINT(MF_BYPOSITION | MF_SEPARATOR),NULL,"");
else
pMenu->InsertMenu(CASTUINT(idx),CASTUINT(MF_BYPOSITION | MF_STRING),CASTUINT(FIRST_PLACES_MENU_ID + idx),label);
}
}
if (label) {
XP_FREE(label);
label = NULL;
}
}
}
void CGenericFrame::BuildFileBookmarkMenu(CTreeMenu* pMenu, HT_Resource pRoot)
{
char *entryName;
entryName = HT_GetNodeName(pRoot);
if(strcmp(entryName, "") == 0)
entryName = szLoadString(IDS_UNTITLED_FOLDER);
CTreeItem *item= new CTreeItem(NULL, NULL, FIRST_FILE_BOOKMARK_MENU_ID + m_nFileBookmarkItems, CString(entryName));
pMenu->AddItem(item, 0, NULL);
m_pHotlistMenuMap->SetAt(FIRST_FILE_BOOKMARK_MENU_ID + m_nFileBookmarkItems++, pRoot);
pMenu->InsertMenu(FIRST_FILE_BOOKMARK_MENU_ID + m_nFileBookmarkItems++, MF_BYPOSITION | MF_SEPARATOR);
m_BookmarksGarbageList->Add(item);
CTreeItem *pItem;
HT_Cursor theCursor = HT_NewCursor(pRoot);
HT_Resource pEntry = NULL;
while (pEntry = HT_GetNextItem(theCursor))
{
if(HT_IsContainer(pEntry))
{
entryName = HT_GetNodeName(pEntry);
if(strcmp(entryName, "") == 0)
entryName = szLoadString(IDS_UNTITLED_FOLDER);
pItem= new CTreeItem(NULL, NULL, FIRST_FILE_BOOKMARK_MENU_ID + m_nFileBookmarkItems, FEU_EscapeAmpersand(CString(entryName)));
pMenu->AddItem(pItem, FIRST_FILE_BOOKMARK_MENU_ID + m_nFileBookmarkItems, NULL);
m_pHotlistMenuMap->SetAt(FIRST_FILE_BOOKMARK_MENU_ID + m_nFileBookmarkItems++, pEntry);
m_BookmarksGarbageList->Add(pItem);
}
}
}
// Append menu items for each of the bookmark entries in pRoot. Uses
// member data m_nBookmarkItems
void CGenericFrame::BuildBookmarkMenu(CTreeMenu* pMenu, HT_Resource pRoot, int nStart)
{
ASSERT(pMenu && pRoot);
if (!pMenu || !pRoot)
return;
m_pCachedTreeMenu = pMenu;
m_nCachedStartPoint = nStart;
// Send the open/close event.
PRBool isOpen;
HT_GetOpenState(pRoot, &isOpen);
if (!isOpen)
{
HT_SetOpenState(pRoot, PR_TRUE);
}
else FinishMenuExpansion(pRoot);
}
void CGenericFrame::FinishMenuExpansion(HT_Resource pRoot)
{
CTreeMenu* pMenu = m_pCachedTreeMenu;
int nStart = m_nCachedStartPoint;
// See how big the menu can be. Menus taller than the screen cause GPFs and hangs
// Do we want this static? In Win95, menu font can change and this may no longer
// be valid after the first time through
//static int nItemHeight = GetSystemMetrics(SM_CYMENU);
int nItemHeight = GetSystemMetrics(SM_CYMENU);
static int nScreenHeight = GetSystemMetrics(SM_CYSCREEN);
// While we have more items in the list and we haven't run out of screen
// real-estate continue to add items
BOOL bStillRoom = TRUE;
int nItemsAdded = pMenu->GetMenuItemCount(); // remember the constant items
HT_Cursor theCursor = HT_NewCursor(pRoot);
HT_Resource pEntry = NULL;
while (theCursor && (pEntry = HT_GetNextItem(theCursor)) && bStillRoom)
{
char* lpszShortName = NULL;
CString csAmpersandName;
// Don't add more menu items than we can handle
if((FIRST_BOOKMARK_MENU_ID + m_nBookmarkItems) > LAST_BOOKMARK_MENU_ID)
break;
// fe_MiddleCutString() doesn't like NULL pointers
if (HT_GetNodeName(pEntry)){
lpszShortName = fe_MiddleCutString(HT_GetNodeName(pEntry), MAX_MENU_ITEM_LENGTH);
csAmpersandName = FEU_EscapeAmpersand(CString(lpszShortName));
}
// If this is a nested list or an item we must have a name
if ( !lpszShortName && !HT_IsSeparator(pEntry))
continue;
if (HT_IsSeparator(pEntry))
{
// Handle separators
pMenu->InsertMenu(nStart, MF_BYPOSITION | MF_SEPARATOR);
}
else if (HT_IsContainer(pEntry))
{
// Append a nested pop-up menu. We add an empty menu now, and when
// the user displays the sub-menu we dynamically add the menu items.
// This is faster, and it uses fewer USER resources (big deal for
// Win16)
CTreeMenu *pSubMenu=new CTreeMenu;
pSubMenu->CreatePopupMenu();
IconType nIconType = DetermineIconType(pEntry, FALSE);
void* pCustomIcon = NULL;
if (nIconType == LOCAL_FILE)
pCustomIcon = FetchLocalFileIcon(pEntry);
else if (nIconType == ARBITRARY_URL)
pCustomIcon = FetchCustomIcon(pEntry, pMenu, FALSE);
CTreeItem *item= new CTreeItem(m_pBookmarkFolderBitmap, m_pBookmarkFolderOpenBitmap,
(UINT)pSubMenu->GetSafeHmenu(),csAmpersandName, pSubMenu);
pSubMenu->SetParent(this);
pMenu->AddItem(item, nStart, pSubMenu, pCustomIcon, nIconType);
m_BookmarksGarbageList->Add(item);
// Add the HMENU to the map. We need to do this because Windows doesn't
// allow any client data to be associated with menu items. We can't use
// the same map as we use for menu items, because sub-menus don't have
// command IDs
m_pSubmenuMap->SetAt(pSubMenu->GetSafeHmenu(), pEntry);
}
else
{
// We're an URL
IconType nIconType = DetermineIconType(pEntry, FALSE);
void* pCustomIcon = NULL;
if (nIconType == LOCAL_FILE)
pCustomIcon = FetchLocalFileIcon(pEntry);
else if (nIconType == ARBITRARY_URL)
pCustomIcon = FetchCustomIcon(pEntry, pMenu, FALSE);
CTreeItem *item= new CTreeItem(m_pBookmarkBitmap, m_pBookmarkBitmap,
FIRST_BOOKMARK_MENU_ID + m_nBookmarkItems, csAmpersandName);
pMenu->AddItem(item, nStart, NULL, pCustomIcon, nIconType);
m_BookmarksGarbageList->Add(item);
// Add the URL to the map. We need to do this because Windows doesn't
// allow any client data to be associated with menu items. Note that
// we aren't making a copy of the string
m_pHotlistMenuMap->SetAt(FIRST_BOOKMARK_MENU_ID + m_nBookmarkItems,
HT_GetNodeURL(pEntry));
}
// Even though separators and pull-right sub-menus don't have command IDs,
// increment the count of bookmark items for all three, because we rely
// on this being greater than zero to indicate that we have already built
// the bookmark menu
m_nBookmarkItems++;
// In all three cases we added a new menu item
nItemsAdded++;
nStart++;
// Make sure we haven't grown too much -- allow to fill 4/5 of the
// screen
if ((nItemsAdded * nItemHeight > nScreenHeight * 4 / 5))
{
// Stop adding new ones
bStillRoom = FALSE;
// Let the user know we have truncated the list
CTreeItem *item= new CTreeItem(NULL, NULL, ID_HOTLIST_VIEW, szLoadString(IDS_MORE_BOOKMARKS));
pMenu->AddItem(item, nStart, NULL);
m_BookmarksGarbageList->Add(item);
}
if (lpszShortName)
XP_FREE(lpszShortName);
}
}
BEGIN_MESSAGE_MAP(CGenericFrame, CFrameWnd)
ON_WM_TIMER()
ON_WM_ENTERIDLE()
ON_WM_CLOSE()
ON_WM_DESTROY()
ON_WM_CREATE()
ON_WM_SYSCOLORCHANGE()
ON_WM_QUERYNEWPALETTE()
ON_WM_PALETTECHANGED()
ON_WM_INITMENUPOPUP()
ON_WM_MENUSELECT()
ON_WM_MEASUREITEM()
ON_WM_MENUCHAR()
ON_MESSAGE(WM_SETMESSAGESTRING, OnSetMessageString)
ON_WM_SETFOCUS()
ON_WM_WINDOWPOSCHANGED()
ON_WM_WINDOWPOSCHANGING()
ON_WM_SIZE()
ON_WM_MOVE()
ON_WM_GETMINMAXINFO()
ON_WM_SETFOCUS()
ON_WM_WINDOWPOSCHANGED()
ON_WM_ACTIVATE()
ON_COMMAND(ID_FILE_CLOSE, OnFrameExit)
ON_COMMAND(ID_FILE_PAGE_SETUP, OnFilePageSetup)
ON_COMMAND(ID_OPEN_MAIL_WINDOW, OnOpenMailWindow)
ON_COMMAND(ID_OPEN_NEWS_WINDOW, OnOpenNewsWindow)
ON_COMMAND(ID_WINDOW_BOOKMARKWINDOW, OnShowBookmarkWindow)
ON_COMMAND(ID_WINDOW_ADDRESSBOOK, OnShowAddressBookWindow)
#ifdef JAVA
ON_COMMAND(ID_OPTIONS_SHOWJAVACONSOLE, OnToggleJavaConsole)
ON_UPDATE_COMMAND_UI(ID_OPTIONS_SHOWJAVACONSOLE, OnUpdateJavaConsole)
#endif
ON_COMMAND(ID_FILE_MAILNEW, OnFileMailNew)
#ifdef MOZ_TASKBAR
ON_COMMAND(ID_WINDOW_TASKBAR, OnTaskbar)
#endif /* MOZ_TASKBAR */
ON_COMMAND(ID_WINDOW_LIVECALL, OnLiveCall)
ON_UPDATE_COMMAND_UI(ID_WINDOW_LIVECALL, OnUpdateLiveCall)
ON_COMMAND(ID_WINDOW_CALENDAR, OnCalendar)
ON_COMMAND(ID_WINDOW_IBMHOSTONDEMAND, OnIBMHostOnDemand)
ON_COMMAND(ID_WINDOW_NETCASTER, OnNetcaster)
ON_COMMAND(ID_WINDOW_AIM, OnAim)
ON_COMMAND(ID_COMMAND_ABOUT, OnAbout)
ON_COMMAND(ID_APP_ABOUT, OnAbout)
ON_COMMAND(ID_DOCUMENT_TOP, OnDocumentTop)
ON_COMMAND(ID_DOCUMENT_BOTTOM, OnDocumentBottom)
ON_COMMAND(ID_HOTLIST_FISHCAM, OnFishCam)
ON_COMMAND(ID_OPTIONS_PREFERENCES, OnDisplayPreferences)
ON_COMMAND(ID_OPTIONS_MAILANDNEWS, OnPrefsMailNews)
ON_COMMAND(ID_BIG_SWITCH, OnGoOffline)
ON_UPDATE_COMMAND_UI(ID_BIG_SWITCH, OnUpdateGoOffline)
ON_COMMAND(ID_DONEGOINGOFFLINE, OnDoneGoingOffline)
#ifdef FORTEZZA
ON_COMMAND(ID_FORTEZZA_CARD, OnStartFortezzaCard)
ON_COMMAND(ID_FORTEZZA_CHANGE, OnStartFortezzaChange)
ON_COMMAND(ID_FORTEZZA_VIEW, OnStartFortezzaView)
ON_COMMAND(ID_FORTEZZA_INFO, OnDoFortezzaInfo)
ON_COMMAND(ID_FORTEZZA_LOG, OnDoFortezzaLog)
#endif
ON_COMMAND(ID_FILE_CLOSE, OnFrameExit)
ON_UPDATE_COMMAND_UI(ID_VIEW_COMMANDTOOLBAR, OnUpdateViewCommandToolbar)
ON_COMMAND(ID_VIEW_COMMANDTOOLBAR, OnViewCommandToolbar)
ON_UPDATE_COMMAND_UI(ID_VIEW_LOCATIONTOOLBAR, OnUpdateViewLocationToolbar)
ON_COMMAND(ID_VIEW_LOCATIONTOOLBAR, OnViewLocationToolbar)
ON_UPDATE_COMMAND_UI(ID_VIEW_CUSTOMTOOLBAR, OnUpdateViewCustomToolbar)
ON_COMMAND(ID_VIEW_CUSTOMTOOLBAR, OnViewCustomToolbar)
ON_UPDATE_COMMAND_UI(ID_VIEW_NAVCENTER, OnUpdateViewNavCenter)
ON_COMMAND(ID_VIEW_NAVCENTER, OnViewNavCenter)
ON_UPDATE_COMMAND_UI(ID_CUSTOMIZE_TOOLBAR, OnUpdateCustomizeToolbar)
ON_COMMAND(ID_CUSTOMIZE_TOOLBAR, OnCustomizeToolbar)
ON_UPDATE_COMMAND_UI(ID_PLACES, OnUpdatePlaces)
ON_UPDATE_COMMAND_UI(ID_SECURITY, OnUpdateSecurity)
ON_COMMAND(ID_SECURITY, OnSecurity)
ON_COMMAND(ID_GO_HISTORY, OnGoHistory)
ON_COMMAND(ID_VIEW_INCREASEFONT, OnIncreaseFont)
ON_COMMAND(ID_VIEW_DECREASEFONT, OnDecreaseFont)
ON_COMMAND(ID_ANIMATION_BONK, OnAnimationBonk )
ON_COMMAND(ID_NEW_FRAME, OnNewFrame)
ON_UPDATE_COMMAND_UI(ID_NEW_FRAME, OnUpdateNewFrame)
ON_COMMAND(ID_FILE_OPENURL, OnFileOpenurl)
ON_UPDATE_COMMAND_UI(ID_FILE_OPENURL, OnUpdateFileOpenurl)
ON_COMMAND(ID_NEXT_WINDOW, OnNextWindow)
ON_COMMAND(ID_SAVE_OPTIONS, OnSaveOptions)
ON_COMMAND(ID_HOTLIST_VIEW,OnShowBookmarkWindow)
ON_COMMAND(ID_HOTLIST_ADDCURRENTTOHOTLIST, OnHotlistAddcurrenttohotlist)
ON_UPDATE_COMMAND_UI(ID_HOTLIST_ADDCURRENTTOHOTLIST, OnUpdateHotlistAddcurrenttohotlist)
ON_COMMAND(ID_HOTLIST_TOOLBAR, OnHotlistAddcurrenttotoolbar)
ON_UPDATE_COMMAND_UI(ID_HOTLIST_TOOLBAR, OnUpdateHotlistAddcurrenttotoolbar)
#ifdef MOZ_TASKBAR
ON_UPDATE_COMMAND_UI(ID_WINDOW_TASKBAR, OnUpdateTaskbar)
#endif /* MOZ_TASKBAR */
ON_COMMAND(ID_TOOLS_MAIL, OnOpenMailWindow)
ON_COMMAND(ID_TOOLS_INBOX, OnOpenInboxWindow)
ON_COMMAND(ID_TOOLS_NEWS, OnOpenNewsWindow)
ON_COMMAND(ID_TOOLS_WEB, OnToolsWeb)
#ifdef EDITOR
ON_COMMAND(ID_TOOLS_EDITOR, OnOpenComposerWindow)
#endif
#ifdef MOZ_MAIL_NEWS
ON_COMMAND(ID_TOOLS_ADDRESSBOOK, OnShowAddressBookWindow)
#endif /* MOZ_MAIL_NEWS */
ON_COMMAND(ID_TOOLS_BOOKMARKS, OnShowBookmarkWindow)
ON_COMMAND(ID_VIEW_ADVANCEDTOOLBARS, OnShowAdvanced)
ON_COMMAND(ID_EDIT_LDAPSEARCH, OnLDAPSearch)
ON_UPDATE_COMMAND_UI(ID_VIEW_ADVANCEDTOOLBARS, OnUpdateShowAdvanced)
ON_REGISTERED_MESSAGE(WM_FINDREPLACE, OnFindReplace)
ON_COMMAND(IDM_SEARCHADDRESSES, OnLDAPSearch)
ON_COMMAND(ID_COMMAND_PAGE_FROM_WIZARD, OnPageFromWizard)
ON_REGISTERED_MESSAGE(WM_HELPMSG, OnHelpMsg)
#ifdef ON_COMMAND_RANGE
ON_COMMAND_RANGE(ID_OPTIONS_ENCODING_1, ID_OPTIONS_ENCODING_70, OnToggleEncoding)
ON_UPDATE_COMMAND_UI_RANGE(ID_OPTIONS_ENCODING_1, ID_OPTIONS_ENCODING_70, OnUpdateEncoding)
#endif
#ifdef EDITOR
ON_COMMAND(ID_EDT_NEW_DOC_BLANK, OnEditNewBlankDocument)
ON_UPDATE_COMMAND_UI(ID_EDT_NEW_DOC_BLANK, OnUpdateCanInteract)
ON_COMMAND(ID_ACTIVATE_SITE_MANAGER, OnActivateSiteManager)
ON_UPDATE_COMMAND_UI(ID_ACTIVATE_SITE_MANAGER, OnUpdateActivateSiteManager)
ON_COMMAND(ID_EDIT_DOCUMENT, OnNavigateToEdit)
ON_COMMAND(ID_EDIT_FRAME, OnEditFrame)
ON_UPDATE_COMMAND_UI(ID_EDIT_DOCUMENT, OnUpdateCanInteract)
ON_UPDATE_COMMAND_UI(ID_EDIT_FRAME, OnUpdateEditFrame)
ON_COMMAND(ID_EDT_NEW_DOC_FROM_TEMPLATE, OnEditNewDocFromTemplate)
ON_UPDATE_COMMAND_UI(ID_EDT_NEW_DOC_FROM_TEMPLATE, OnUpdateCanInteract)
#ifdef XP_WIN32
ON_REGISTERED_MESSAGE(WM_SITE_MANAGER, OnSiteMgrMessage)
// jliu added the following to support CJK caption print
ON_WM_NCPAINT()
ON_MESSAGE(WM_SETTEXT, OnSetText)
ON_WM_NCACTIVATE()
ON_MESSAGE(WM_SETTINGCHANGE, OnSettingChange)
#endif
ON_REGISTERED_MESSAGE(WM_NG_IS_ACTIVE, OnNetscapeGoldIsActive)
ON_REGISTERED_MESSAGE(WM_OPEN_EDITOR, OnOpenEditor)
ON_REGISTERED_MESSAGE(WM_OPEN_NAVIGATOR, OnOpenNavigator)
#endif // EDITOR
ON_COMMAND(ID_COMMAND_HELPINDEX, OnHelpMenu)
ON_UPDATE_COMMAND_UI(ID_BOOKMARKS_FILEROOT, OnUpdateFileRoot)
// Conditionally compile these if supported.
#ifdef WM_DEVICECHANGE
ON_WM_DEVICECHANGE()
#endif
#ifdef WM_SIZING
ON_WM_SIZING()
#endif
#ifdef _WIN32
ON_REGISTERED_MESSAGE(msg_MouseWheel, OnHackedMouseWheel)
#endif
#ifdef DEBUG_WHITEBOX
ON_COMMAND(IDS_WHITEBOX_MENU, OnWhiteBox)
#endif
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CGenericFrame message handlers
void CGenericFrame::RecalcLayout ( BOOL bNotify )
{
for(CGenericFrame * f = theApp.m_pFrameList; f; f = f->m_pNext)
f->CFrameWnd::RecalcLayout ( );
}
void CGenericFrame::GetMessageString( UINT nID, CString& rMessage ) const
{
LPTSTR lpsz = NULL;
if (nID >= FIRST_BOOKMARK_MENU_ID && nID <= LAST_BOOKMARK_MENU_ID) {
m_pHotlistMenuMap->Lookup(nID, (void*&)lpsz);
if (lpsz) {
rMessage = lpsz;
}
} else if (IS_PLACESMENU_ID(nID) || IS_HELPMENU_ID(nID)) {
rMessage = ""; // for now -- jonm
} else if (nID==ID_COMMAND_HELPINDEX) {
rMessage = szLoadString(IDS_COMMAND_HELPINDEX);
} else if (nID==ID_COMMAND_ABOUT) {
rMessage = szLoadString(IDS_COMMAND_ABOUT);
} else {
#ifdef _WIN32
if ( nID ) {
CFrameWnd::GetMessageString( nID, rMessage );
}
#else
// Use the wParam as a string ID
lpsz = szLoadString(nID);
// If we got an empty string, punt
if (lpsz && lpsz[0]) {
// Only display until the newline so we don't get the tool tip string
AfxExtractSubString( rMessage, lpsz, 0 );
}
#endif
}
}
// Read the initial sizes out of preferences file
//
BOOL CGenericFrame::PreCreateWindow(CREATESTRUCT& cs)
{
BOOL retval;
if(m_hPopupParent)
cs.style |= WS_POPUP;
m_bPreCreated = TRUE;
// Let's sanity check those values, kiddies
if ( cs.x > ( GetSystemMetrics(SM_CXFULLSCREEN) - 100 ) ) {
cs.x = GetSystemMetrics(SM_CXFULLSCREEN) - 100;
}
if ( cs.y > ( GetSystemMetrics(SM_CYFULLSCREEN) - 100 ) ) {
cs.y = GetSystemMetrics(SM_CYFULLSCREEN) - 100;
}
retval = CFrameWnd::PreCreateWindow(cs);
#ifdef WIN32
// Modify Ex_Styles set by MFC.
cs.dwExStyle |= m_wAddedExStyles;
cs.dwExStyle &= ~m_wRemovedExStyles;
#endif
return(retval);
}
//
// Create widgets used by all frame windows
//
static void CopyMenu(CMenu *srcMenu, CTreeMenu *destMenu, CTreeItemList *pGarbageList)
{
if (!srcMenu)
return;
int nCount = srcMenu->GetMenuItemCount();
for(int dstPos = 0, srcPos = 0; dstPos< nCount; dstPos++, srcPos++)
{
UINT nID = srcMenu->GetMenuItemID(srcPos);
if(nID == 0)
{
destMenu->InsertMenu(dstPos, MF_BYPOSITION | MF_SEPARATOR);
}
else
{
char lpszMenuString[64];
srcMenu->GetMenuString(srcPos, lpszMenuString, 64, MF_BYPOSITION);
CString menuString(lpszMenuString);
int nMnemonicPos;
TCHAR cMnemonicChar = 0;
if((nMnemonicPos = menuString.Find('&')) != -1)
if(nMnemonicPos + 1 < menuString.GetLength())
cMnemonicChar = menuString[nMnemonicPos + 1];
if(nID == (UINT) -1)
{
CMenu *pSubMenu = srcMenu->GetSubMenu(srcPos);
CTreeMenu *pTreeSubMenu=new CTreeMenu;
pTreeSubMenu->CreatePopupMenu();
CopyMenu(pSubMenu, pTreeSubMenu, pGarbageList);
srcMenu->RemoveMenu(srcPos, MF_BYPOSITION);
CTreeItem *pItem= new CTreeItem(NULL, NULL,(UINT)pTreeSubMenu->GetSafeHmenu(), menuString, pTreeSubMenu);
((CTreeMenu*)destMenu)->AddItem(pItem, dstPos,pTreeSubMenu );
if(cMnemonicChar != 0)
destMenu->AddMnemonic(cMnemonicChar, 0, dstPos);
pGarbageList->Add(pItem);
//since we removed a menu we want to use the same position next time
//and there is one less item in the menu we are copying.
srcPos--;
}
else if(nID > 0)
{
CTreeItem *pItem= new CTreeItem(NULL, NULL, nID, lpszMenuString);
((CTreeMenu*)destMenu)->AddItem(pItem, dstPos);
if(cMnemonicChar != 0)
destMenu->AddMnemonic(cMnemonicChar, nID, dstPos);
pGarbageList->Add(pItem);
//destMenu->InsertMenu(i, MF_BYPOSITION | MF_STRING, nID, (const char*)menuString);
}
}
}
((CTreeMenu*)destMenu)->CalculateItemDimensions();
}
void CGenericFrame::InitFileBookmarkMenu(void)
{
int nCount = m_pFileBookmarkMenu->GetMenuItemCount();
for(int i = nCount - 1; i >=0; i--)
m_pFileBookmarkMenu->DeleteMenu(i, MF_BYPOSITION);
m_pFileBookmarkMenu->ClearItems(0, 0);
m_pFileSubmenuMap->RemoveAll();
HT_View pView = HT_GetSelectedView(m_BookmarkMenuPane);
m_pFileSubmenuMap->SetAt(m_pFileBookmarkMenu->GetSafeHmenu(), HT_TopNode(pView));
}
void CGenericFrame::LoadBookmarkMenuBitmaps(void)
{
HDC hDC = ::GetDC(m_hWnd);
WFE_InitializeUIPalette(hDC);
HPALETTE hPalette = WFE_GetUIPalette(this);
m_pBookmarksMenu->SetParent(this);
HPALETTE hOldPalette = ::SelectPalette(hDC, hPalette, FALSE);
m_pBookmarkBitmap=new CBitmap;
m_pBookmarkBitmap->Attach(wfe_LoadBitmap(AfxGetResourceHandle(), hDC, MAKEINTRESOURCE(IDB_BOOKMARK_ITEM)));
m_pBookmarkFolderBitmap=new CBitmap;
m_pBookmarkFolderBitmap->Attach(wfe_LoadBitmap(AfxGetResourceHandle(), hDC, MAKEINTRESOURCE(IDB_BOOKMARK_FOLDER2)));
m_pBookmarkFolderOpenBitmap=new CBitmap;
m_pBookmarkFolderOpenBitmap->Attach(wfe_LoadBitmap(AfxGetResourceHandle(), hDC, MAKEINTRESOURCE(IDB_BOOKMARK_FOLDER_OPEN)));
::SelectPalette(hDC, hOldPalette, TRUE);
::ReleaseDC(m_hWnd, hDC);
}
void CGenericFrame::AddToMenuMap(int nIndex, UINT nID)
{
HMENU hMainMenu = ::GetMenu(m_hWnd);
if(hMainMenu)
{
HMENU hSubMenu = ::GetSubMenu(hMainMenu, nIndex);
if(hSubMenu && m_pMenuMap)
{
UINT * pID = new UINT;
if(pID)
{
*pID = nID;
#ifdef _WIN32
m_pMenuMap->SetAt(hSubMenu, pID);
#else
m_pMenuMap->SetAt((WORD)hSubMenu, pID);
#endif
}
}
}
}
void CGenericFrame::OnDestroy()
{
ASSERT(!m_pHotlistMenuMap || m_pHotlistMenuMap->IsEmpty());
ASSERT(!m_pSubmenuMap || m_pSubmenuMap->IsEmpty());
// ASSERT(!m_pFileSubmenuMap || m_pFileSubmenuMap->IsEmpty());
// Unload the bookmark bitmaps and delete them
if ( m_pBookmarkBitmap ) {
m_pBookmarkBitmap->DeleteObject();
m_pBookmarkFolderBitmap->DeleteObject();
m_pBookmarkFolderOpenBitmap->DeleteObject();
}
delete m_pBookmarkBitmap;
delete m_pBookmarkFolderBitmap;
delete m_pBookmarkFolderOpenBitmap;
if ( m_pBookmarksMenu ) {
HMENU hBookmarkMenu=m_pBookmarksMenu->m_hMenu;
ASSERT(hBookmarkMenu);
int nCount;
if ((nCount = ::GetMenuItemCount(hBookmarkMenu)) > 0) {
// Because the bookmark menu has separators and pull-right sub-menus,
// neither of which have command IDs, we can't tell just by looking
// at the menu items whether they should be deleted. So instead we
// delete everything
for (int i = nCount - 1;
i >= 0; i--) {
// This will delete any sub-menus as well (recursively)
if(m_pBookmarksMenu->GetSubMenu(i) != NULL)
m_pBookmarksMenu->GetSubMenu(i)->DestroyMenu();
VERIFY(::DeleteMenu(hBookmarkMenu, i, MF_BYPOSITION));
}
//don't care about separator before bookmarks
m_pBookmarksMenu->ClearItems(0, 0);
m_nBookmarkItems = 0; // reset the number of current bookmark menu items
delete m_OriginalBookmarksGarbageList;
}
m_pBookmarksMenu->DestroyMenu();
}
delete m_pBookmarksMenu;
//
// Explicitly destroy the status bar window. Normally the status bar is a child of this
// frame and receives a WM_DESTROY as a result of this window destroying. However, when
// this frame is serving an OLE container the status bar's parent is the container, hence
// we need to destroy the window now. Note the status bar is an auto-delete CWnd object.
//
LPNSSTATUSBAR pIStatusBar = NULL;
if( GetChrome() &&
SUCCEEDED(GetChrome()->QueryInterface( IID_INSStatusBar, (LPVOID *)&pIStatusBar )) &&
pIStatusBar )
{
CNetscapeStatusBar *pStatusBar = ((CGenericStatusBar *)pIStatusBar)->GetNetscapeStatusBar();
if( pStatusBar )
{
pStatusBar->DestroyWindow();
}
pIStatusBar->Release();
}
// we no longer need a taskbar.
#ifdef MOZ_TASKBAR
theApp.GetTaskBarMgr().Reference(FALSE);
#endif /* MOZ_TASKBAR */
}
BOOL CGenericFrame::OnQueryNewPalette()
{
// Have the main context in this window realize its palette.
CWinCX *pWinCX = GetMainWinContext();
CView* focusWnd = GetActiveView();
BOOL retval = FALSE;
HPALETTE hPal = WFE_GetUIPalette(this);
if (pWinCX) {
if (!pWinCX->IsDestroyed()) {
// Make sure this is needed.
if(pWinCX->GetPalette() != NULL) {
// Realize the palette.
retval = CFrameGlue::GetFrameGlue(this)->RealizePalette(this, pWinCX->GetPane(), FALSE);
}
}
}
else {
CDC* pDC = GetDC();
if (pDC) {
::SelectPalette(pDC->GetSafeHdc(), hPal, FALSE);
retval = ::RealizePalette(pDC->GetSafeHdc());
Invalidate();
SendMessageToDescendants(WM_PALETTECHANGED, (WPARAM)GetSafeHwnd());
#ifdef MOZ_TASKBAR
if(theApp.GetTaskBarMgr().IsInitialized() && theApp.GetTaskBarMgr().IsFloating())
theApp.GetTaskBarMgr().ChangeTaskBarsPalette(GetSafeHwnd());
#endif /* MOZ_TASKBAR */
ReleaseDC(pDC);
}
}
return retval;
}
// Only top-level windows will receive this message
void CGenericFrame::OnPaletteChanged(CWnd* pFocusWnd)
{
// CFrameWnd::OnPaletteChanged(pFocusWnd);
// Don't do this if we caused it to happen.
if(pFocusWnd == (CWnd *)this) {
return;
}
TRACE("CGenericFrame::OnPaletteChanged(%p)\n", pFocusWnd);
// Tell the main context to realize the palette and redraw. f
CWinCX *pWinCX = GetActiveWinContext();
if(pWinCX && !pWinCX->IsDestroyed()) {
HPALETTE pPal = pWinCX->GetPalette();
// Make sure this is needed.
if( pPal ) {
// Realize the palette.
// Detect if it's a child view, and don't do anything. If we cause a
// palette change.
if ((IsChild(pFocusWnd) == TRUE) && FEU_IsNetscapeFrame(pFocusWnd)) {
TRACE("Blocking child view palette change\n");
}
else {
// Either a plug-in or a Java child window realized its
// palette, or a different top-level window realized
// its palette. Realize the Navigator's palette in
// the background.
CFrameGlue::GetFrameGlue(this)->RealizePalette(this, pFocusWnd->GetSafeHwnd(), TRUE);
}
}
}
}
extern void FE_PokeLibSecOnIdle();
BOOL CGenericFrame::OnCmdMsg(UINT nID, int nCode, void* pExtra, AFX_CMDHANDLERINFO* pHandlerInfo)
{
if( nID >= ID_OPTIONS_ENCODING_1 && nID <= ID_OPTIONS_ENCODING_70 &&
(nCode == CN_UPDATE_COMMAND_UI))
{
OnUpdateEncoding( (CCmdUI*) pExtra );
return TRUE;
}
// give me extra randomness for the first couple of messages
static int s_nLibSecCount = 0;
if(s_nLibSecCount < 300) {
FE_PokeLibSecOnIdle();
s_nLibSecCount++;
}
// Pump through any active child first.
// This will catch active control bars, etc.
CWnd *pFocus = GetFocus();
if( pFocus ) {
// Make sure it's a child of us, and not a CGenericView (we handle those below).
// Also make sure it's not a child of our main view.
// Those are handled by the view, not us.
BOOL bFrameChild = IsChild(pFocus);
BOOL bGenericView = pFocus->IsKindOf(RUNTIME_CLASS(CGenericView));
BOOL bViewChild = FALSE;
if(GetMainWinContext() && GetMainWinContext()->GetPane()) {
bViewChild = ::IsChild(GetMainWinContext()->GetPane(), pFocus->m_hWnd);
}
if(bFrameChild == TRUE && bGenericView == FALSE && bViewChild == FALSE) {
// Try an OnCmdMessage, probably a URL bar, or message list.
// Walk up the list of parents until we reach ourselves.
CWnd *pTarget = pFocus;
while(pTarget != NULL && pTarget != (CWnd *)this) {
if(pTarget->OnCmdMsg(nID, nCode, pExtra, pHandlerInfo)) {
return(TRUE);
}
pTarget = pTarget->GetParent();
// There are cases now where a child is actually a CGenericView
// such as the NavCenter HTML pane. Do not allow it to
// receive these messages.
if(pTarget->IsKindOf(RUNTIME_CLASS(CGenericView))) {
pTarget = NULL;
}
}
}
}
// Pump the message through our active context first.
CWinCX *pActiveCX = GetActiveWinContext();
CGenericView *pGenView = pActiveCX ? pActiveCX->GetView() : NULL;
if(pGenView) {
if(pGenView->OnCmdMsg(nID, nCode, pExtra, pHandlerInfo)) {
return(TRUE);
}
}
// Next, pump the message through our main context.
pActiveCX = GetMainWinContext();
pGenView = pActiveCX ? pActiveCX->GetView() : NULL;
if(pGenView) {
if(pGenView->OnCmdMsg(nID, nCode, pExtra, pHandlerInfo)) {
return(TRUE);
}
}
// always enable bookmark entries
if((nID >= FIRST_BOOKMARK_MENU_ID) && (nID < LAST_BOOKMARK_MENU_ID) && (nCode == CN_UPDATE_COMMAND_UI)) {
ASSERT(pExtra);
CCmdUI* pCmdUI = (CCmdUI*)pExtra;
pCmdUI->Enable();
return(TRUE);
}
// always enable windows menu entries
if((nID >= ID_WINDOW_WINDOW_0) && (nID < ID_WINDOW_WINDOW_0 + 10) && (nCode == CN_UPDATE_COMMAND_UI)) {
ASSERT(pExtra);
CCmdUI* pCmdUI = (CCmdUI*)pExtra;
pCmdUI->Enable();
return(TRUE);
}
// was this a windows menu selection ?
if((nID >= ID_WINDOW_WINDOW_0) && (nID < ID_WINDOW_WINDOW_0 + 10) && (nCode == CN_COMMAND)) {
CGenericFrame * pFrame = theApp.m_pFrameList;
BOOL bDone = FALSE;
// walk down frame list till we get to the one we wanted
int iToGo = CASTINT(nID - ID_WINDOW_WINDOW_0);
while( pFrame && !bDone ) {
if (iToGo == 0) {
bDone = TRUE;
break;
} else {
iToGo--;
// Fall through to default to move to next frame.
}
pFrame = pFrame->m_pNext;
}
// if we got something un-minimize it and pop it to the front
if(pFrame) {
if(pFrame->IsIconic()) {
pFrame->ShowWindow(SW_RESTORE);
}
pFrame->BringWindowToTop();
}
// assume we got something or at least the message was for us
return(TRUE);
}
// then pump through frame
return(CFrameWnd::OnCmdMsg(nID, nCode, pExtra, pHandlerInfo));
}
#ifdef EDITOR
// Used to gray menu/toolbar commands depending on presence of
// context and its loading and blocked states
void CGenericFrame::OnUpdateCanInteract(CCmdUI* pCmdUI)
{
pCmdUI->Enable(GetMainWinContext() && GetMainWinContext()->GetContext());
}
void CGenericFrame::OnUpdateEditFrame(CCmdUI *pCmdUI)
{
// enable EditFrame menu only if a frame in a frameset is selected.
pCmdUI->Enable(GetActiveWinContext() && GetActiveWinContext()->GetContext() && GetActiveWinContext()->IsGridCell());
}
//
// NOTE: Editor-related methods of CGenericFrame are in EDFRAME.CPP
//
#endif // EDITOR
void CGenericFrame::BuildHelpMenu(CMenu * pMenu)
{
if (!pMenu) return;
if(GetMainContext() == NULL) {
return;
}
//static bChanged = TRUE;
//if (!bChanged) return;
int idx =0, idx2=0;
int iItems = pMenu->GetMenuItemCount();
char *label;
int bOK = PREF_NOERROR;
CString helpContents;
helpContents.LoadString(IDS_HELPCONTENTS);
if (idx < iItems)
pMenu->ModifyMenu(idx,MF_BYPOSITION | MF_STRING,ID_COMMAND_HELPINDEX, helpContents);
else
pMenu->InsertMenu(idx,MF_BYPOSITION | MF_STRING,ID_COMMAND_HELPINDEX, helpContents);
for (idx=1; bOK==PREF_NOERROR; idx++) {
bOK = PREF_CopyIndexConfigString("menu.help.item",idx,"label",&label);
// if the label is blank, truncate the menu here.
if (!label || !label[0])
bOK = PREF_ERROR;
if (bOK == PREF_NOERROR) {
if (idx < iItems) {
if (!strcmpi("SEPARATOR",label) || !strcmpi("-",label))
pMenu->ModifyMenu(idx,MF_BYPOSITION | MF_SEPARATOR,NULL,"");
else
pMenu->ModifyMenu(CASTUINT(idx),CASTUINT(MF_BYPOSITION | MF_STRING),CASTUINT(FIRST_HELP_MENU_ID + idx),label);
} else {
if (!strcmpi("SEPARATOR",label) || !strcmpi("-",label))
pMenu->InsertMenu(idx,MF_BYPOSITION | MF_SEPARATOR,NULL,"");
else
pMenu->InsertMenu(CASTUINT(idx),CASTUINT(MF_BYPOSITION | MF_STRING),CASTUINT(FIRST_HELP_MENU_ID + idx),label);
}
}
if (label) {
XP_FREE(label);
label = NULL;
}
}
// Add about page item
// Must be done here, such that choice is always
// available.
CString aboutCommunicator;
aboutCommunicator.LoadString(IDS_ABOUTNETSCAPE);
if (idx < iItems)
pMenu->ModifyMenu(idx,MF_BYPOSITION | MF_STRING,ID_COMMAND_ABOUT, aboutCommunicator);
else
pMenu->InsertMenu(idx,MF_BYPOSITION | MF_STRING,ID_COMMAND_ABOUT, aboutCommunicator);
}
/****************************************************************************
*
* CGenericFrame::OnToolsWeb
*
* PARAMETERS:
* None
*
* RETURNS:
* void
*
* DESCRIPTION:
* Handles the Tools->Web menu item, and can be called by anyone else
* (such as the task bar) that wants to perform the trick of getting the
* proper browser window up.
*
****************************************************************************/
void CGenericFrame::OnToolsWeb()
{
// TODO - not exactly to spec yet...
// Single click on web icon means bring forth the browser window
CAbstractCX * pCX = GetMainContext();
if (pCX != NULL)
{
int nCount = FEU_GetNumActiveFrames(MWContextBrowser);
if((nCount == 1 && pCX->GetContext()->type == MWContextBrowser && !EDT_IS_EDITOR(pCX->GetContext())) || nCount == 0)
pCX->NewWindow();
else if(nCount > 1 || !(pCX->GetContext()->type == MWContextBrowser && !EDT_IS_EDITOR(pCX->GetContext())))
{
CFrameWnd *pFrame;
//if we are a browser then get the bottom most browser
if(pCX->GetContext()->type == MWContextBrowser)
{
pFrame = FEU_GetBottomFrame(MWContextBrowser);
}
else
// if we are not a browser, then get the last active browser
pFrame = FEU_GetLastActiveFrame(MWContextBrowser);
if(pFrame)
{
if(pFrame->IsIconic())
pFrame->ShowWindow(SW_RESTORE);
#ifdef _WIN32
pFrame->SetForegroundWindow();
#else
pFrame->SetActiveWindow();
#endif
}
}
}
} // END OF FUNCTION CGenericFrame::OnToolsWeb()
//
// Build the "Window" menu
//
void CGenericFrame::OnConstructWindowMenu(CMenu * pPopup)
{
UINT nFlags = MF_STRING | MF_ENABLED;
ASSERT(pPopup);
if(!pPopup)
return;
if(theApp.m_hPostalLib)
FEU_AltMail_SetAltMailMenus(pPopup);
// delete the old menu items
int index = 0;
UINT nID = 0;
int iCount = pPopup->GetMenuItemCount();
while ( index < iCount && nID != ID_WINDOW_WINDOW_0 ) {
nID = pPopup->GetMenuItemID(index);
if (nID != ID_WINDOW_WINDOW_0)
index++;
}
while ( iCount > index ) {
pPopup->RemoveMenu(index, MF_BYPOSITION);
iCount--;
}
// list windows here
CGenericFrame * pFrame = NULL;
int nItemCount = 0;
// We can't have more than 10 window menu items because we only reserved 10 IDs. Sigh.
for(pFrame = theApp.m_pFrameList; pFrame && nItemCount < 10; pFrame = pFrame->m_pNext) {
CAbstractCX * pContext = pFrame->GetMainContext();
// all better be enabled
nFlags = MF_STRING | MF_ENABLED;
if(!pContext)
continue;
MWContext * pXPContext = pContext->GetContext();
if(!pXPContext)
continue;
if(pFrame == this)
nFlags |= MF_CHECKED;
CString csContext = "";
CString csTitle;
csContext.Format(_T("&%d "), nItemCount);
csTitle.LoadString(IDS_TITLE_NOTITLE);
switch (pXPContext->type) {
case MWContextBrowser:
if( EDT_IS_EDITOR(pXPContext) ){
csContext += szLoadString(IDS_TITLE_COMPOSE_PAGE);
} else {
csContext += szLoadString(IDS_TITLE_WEB);
}
break;
#ifdef MOZ_MAIL_NEWS
case MWContextMessageComposition:
csContext += szLoadString(IDS_TITLE_COMPOSE_MESSAGE);
csTitle.LoadString(IDS_TITLE_NOSUBJECT);
break;
case MWContextMail:
case MWContextMailMsg:
if ( pFrame->IsKindOf( RUNTIME_CLASS( CMailNewsFrame ) ) ) {
csContext += ((CMailNewsFrame *) pFrame)->GetWindowMenuTitle();
}
break;
case MWContextAddressBook:
csContext += szLoadString( IDS_TITLE_ADDRESSBOOK );
break;
#endif /* MOZ_MAIL_NEWS */
case MWContextBookmarks:
csContext += szLoadString( IDS_TITLE_BOOKMARKS );
break;
default:
continue;
}
switch (pXPContext->type) {
case MWContextMessageComposition:
case MWContextBrowser:
if(pXPContext->title) {
csContext += fe_MiddleCutString(pXPContext->title, 40);
} else {
csContext += csTitle;
}
break;
}
if(pFrame == this)
nFlags |= MF_CHECKED;
pPopup->AppendMenu( nFlags, CASTUINT(ID_WINDOW_WINDOW_0 + nItemCount), csContext);
// we added an item
nItemCount++;
}
// keep windows happy
DrawMenuBar();
}
// this deletes all of the UINT * nIDs stored in the menu map.
void CGenericFrame::DeleteMenuMapIDs(void)
{
if(!m_pMenuMap)
return;
POSITION pos = m_pMenuMap->GetStartPosition();
HMENU hMenu;
UINT * pID;
while(pos != NULL)
{
pID = NULL;
#ifdef _WIN32
m_pMenuMap->GetNextAssoc( pos, (void*&)hMenu, (void*&)pID );
#else
m_pMenuMap->GetNextAssoc( pos, (WORD&)hMenu, (void*&)pID );
#endif
if(pID)
{
delete pID;
}
}
}
// This copies src into dest.
static void CopyMenu(CMenu *srcMenu, CMenu *destMenu)
{
if (!srcMenu)
return;
int nCount = srcMenu->GetMenuItemCount();
for(int dstPos = 0, srcPos = 0; dstPos< nCount; dstPos++, srcPos++)
{
UINT nID = srcMenu->GetMenuItemID(srcPos);
// it's a separator
if(nID == 0)
{
destMenu->InsertMenu(dstPos, MF_BYPOSITION | MF_SEPARATOR);
}
else
{
char lpszMenuString[64];
srcMenu->GetMenuString(srcPos, lpszMenuString, 63, MF_BYPOSITION);
CString menuString(lpszMenuString);
// it's a submenu
if(nID == (UINT) -1)
{
CMenu *pSubMenu = srcMenu->GetSubMenu(srcPos);
CMenu *pNewSubMenu=new CMenu;
if(pNewSubMenu)
{
pNewSubMenu->CreatePopupMenu();
CopyMenu(pSubMenu, pNewSubMenu);
destMenu->InsertMenu(dstPos, MF_STRING | MF_BYPOSITION | MF_POPUP, (UINT)pNewSubMenu->m_hMenu, menuString);
// detach and delete the submenu created above.
pNewSubMenu->Detach();
delete pNewSubMenu;
}
}
// it's a regular menu item.
else if(nID > 0)
{
destMenu->InsertMenu(dstPos, MF_BYPOSITION | MF_STRING, nID, menuString);
}
}
}
}
// This loads a menu from the menubar dynamically
void CGenericFrame::LoadFrameMenu(CMenu *pPopup, UINT nIndex)
{
CMenu *pMenu = GetMenu();
if(pMenu)
{
CMenu *pSubMenu = pMenu->GetSubMenu(nIndex);
// verify that this menu is on the main menubar.
if(pSubMenu && (pSubMenu == pPopup))
{
UINT * pID;
// find the resource id associated with the menu
#ifdef _WIN32
if(m_pMenuMap && m_pMenuMap->Lookup(pPopup->m_hMenu, (void*&)pID))
#else
if(m_pMenuMap && m_pMenuMap->Lookup((WORD)pPopup->m_hMenu, (void*&)pID))
#endif
{
// clear everything out
int nCount = pPopup->GetMenuItemCount();
for(int i = nCount - 1; i >= 0; i--)
{
pPopup->DeleteMenu(i, MF_BYPOSITION);
}
CMenu *pSrcPopup = new CMenu();
if(pSrcPopup && pID)
{
// load the menu and copy it into pPopup.
if(pSrcPopup->LoadMenu(*pID));
CopyMenu(pSrcPopup, pPopup);
delete pSrcPopup;
}
}
}
}
}
// Delete the menu items in the menus in m_pMenuMap
void CGenericFrame::DeleteMenuMapMenus(void)
{
if(!m_pMenuMap)
return;
POSITION pos = m_pMenuMap->GetStartPosition();
HMENU hMenu;
UINT * pID;
while(pos != NULL)
{
hMenu = NULL;
#ifdef _WIN32
m_pMenuMap->GetNextAssoc( pos, (void*&)hMenu, (void*&)pID );
#else
m_pMenuMap->GetNextAssoc( pos, (WORD&)hMenu, (void*&)pID );
#endif
if(hMenu)
{
DeleteFrameMenu(hMenu);
}
}
}
void CGenericFrame::DeleteFrameMenu(HMENU hMenu)
{
if(hMenu)
{
int nCount = ::GetMenuItemCount(hMenu);
// It's easiest to do this by walking backwards over the menu items
for (int i = nCount - 1; i >= 0; i--) {
VERIFY(::DeleteMenu(hMenu, i, MF_BYPOSITION));
}
}
}
void CGenericFrame::OnInitMenuPopup(CMenu * pPopup, UINT nIndex, BOOL bSysMenu)
{
AfxLockTempMaps();
// load this menu if it needs to be loaded dynamically.
LoadFrameMenu(pPopup, nIndex);
CFrameWnd::OnInitMenuPopup(pPopup, nIndex, bSysMenu);
if (!bSysMenu)
{
if( m_pBookmarksMenu && pPopup->m_hMenu == m_pBookmarksMenu->m_hMenu)
{
m_BookmarksGarbageList = new CTreeItemList;
// We need to check whether we have already built the menu.
// Even though we destroy the menu items each time the menus go away,
// this only happens when the user is all done with the menu bar and
// not when each individual pop-up menu is dismissed
//
// Note: we use a different check to tell whether the menu has been
// built. We do this because the bookmark menu can have pull-right
// sub-menus and separators, neither of which have command IDs. That
// means the check we use for history elements won't work
if (m_nBookmarkItems == 0) {
// Before we add the menu items, get the number of existing
// menu items. We need to know this so we can remove the items
// we have added
nExistingBookmarkMenuItems = pPopup->GetMenuItemCount();
// Now go ahead and add the bookmark items
BuildBookmarkMenu((CTreeMenu*)pPopup,
HT_TopNode(HT_GetSelectedView(m_BookmarkMenuPane)),
ITEMS_BEFORE_BOOKMARKS_START);
// if there were any bookmarks, add a separator after them
int nCount = pPopup->GetMenuItemCount();
if(nCount > nExistingBookmarkMenuItems && ITEMS_AFTER_BOOKMARKS_END > 0)
pPopup->InsertMenu(nCount - ITEMS_AFTER_BOOKMARKS_END, MF_SEPARATOR | MF_BYPOSITION);
}
((CTreeMenu*)pPopup)->CalculateItemDimensions();
}
else if (pPopup->GetMenuItemID(0) == IDC_FIRST_PLACES_MENU_ID)
{
BuildDirectoryMenu(pPopup);
}
else if (pPopup->GetMenuItemID(0) == IDC_FIRST_HELP_MENU_ID)
{
BuildHelpMenu(pPopup);
}
else
{
HT_Resource pEntry;
// See if this is a bookmark sub-menu
ASSERT(m_pSubmenuMap);
if (m_pSubmenuMap->Lookup(pPopup->GetSafeHmenu(), (void*&)pEntry))
{
// If the menu isn't empty then we've already added the bookmark
// items
if (pPopup->GetMenuItemCount() == 0)
{
// Haven't yet added the bookmark menu items for this sub-menu.
// Do it now
BuildBookmarkMenu((CTreeMenu*)pPopup, pEntry);
((CTreeMenu*)pPopup)->CalculateItemDimensions();
}
}
//see if this is a file bookmark sub-menu
if(pPopup == m_pFileBookmarkMenu)
InitFileBookmarkMenu();
if (m_pFileSubmenuMap->Lookup(pPopup->GetSafeHmenu(), (void*&)pEntry))
{
if(pPopup->GetMenuItemCount()==0)
{
BuildFileBookmarkMenu((CTreeMenu*)pPopup, pEntry);
((CTreeMenu*)pPopup)->CalculateItemDimensions();
}
}
CMenu * pFrameMenu = GetMenu();
if (pFrameMenu != NULL)
{
if ((pPopup != NULL) &&
(pPopup->GetMenuItemID(0) == ID_TOOLS_WEB))
{
OnConstructWindowMenu(pPopup);
}
if ((pPopup != NULL) &&
(pPopup->GetMenuItemID(0) == IDC_FIRST_HELP_MENU_ID))
{
BuildHelpMenu(pPopup);
}
}
}
}
// This function must always be executed, so please, do NOT put any
// return statements in the above code!
AfxUnlockTempMaps();
}
//
// Over-ride this cuz something is writing the status message into
// pane 0 instead of actually looking up what the correct pane to write into
// was.
//
LRESULT CGenericFrame::OnSetMessageString(WPARAM wParam, LPARAM lParam)
{
CString csStatus = _T("");
// set the message bar text
if (lParam != NULL)
{
ASSERT(wParam == 0); // can't have both an ID and a string
// set an explicit string
csStatus = (LPCSTR)lParam;
} else {
GetMessageString( (UINT) wParam, csStatus );
}
if( csStatus.IsEmpty() ) {
CAbstractCX *pContext = GetMainContext();
if( pContext ) {
wfe_Progress( pContext->GetContext(), NULL );
}
}
else {
CStatusBar* pMessageBar = (CStatusBar *) GetMessageBar();
if ( pMessageBar ) {
int nIndex = pMessageBar->CommandToIndex( ID_SEPARATOR );
if ( nIndex >= 0 ) {
pMessageBar->SetPaneText( nIndex, csStatus );
}
}
}
UINT nIDLast = m_nIDLastMessage;
m_nIDLastMessage = (UINT)wParam; // new ID (or 0)
m_nIDTracking = (UINT)wParam; // so F1 on toolbar buttons work
return nIDLast;
}
void CGenericFrame::OnMenuSelect(UINT nItemID, UINT nFlags, HMENU hSysMenu)
{
if ( nFlags == 0xffff ) {
DeleteMenuMapMenus();
HMENU hMenu = ::GetMenu(m_hWnd);
// Not all top-level windows have a menu bar (e.g. the chromeless ones)
// Also, Editor frame doesn't have these submenus
if (hMenu && m_pBookmarksMenu ) {
int nCount;
// Menu is going away so destroy all the menu items we added (both
// bookmark and history). Cleanup the bookmark menu first.
HMENU hBookmarkMenu=m_pBookmarksMenu->m_hMenu;
ASSERT(hBookmarkMenu);
if ((nCount = ::GetMenuItemCount(hBookmarkMenu)) >
ITEMS_BEFORE_BOOKMARKS_START + ITEMS_AFTER_BOOKMARKS_END) {
//FileBookMark is always the first popup menu in the Bookmark menu loop through to find it.
UINT nfileBookmarksPosition = 0;
while(!m_pBookmarksMenu->GetSubMenu(nfileBookmarksPosition) && nfileBookmarksPosition < m_pBookmarksMenu->GetMenuItemCount())
nfileBookmarksPosition++;
CTreeMenu *pFileBookmarkMenu = (CTreeMenu*)m_pBookmarksMenu->GetSubMenu(nfileBookmarksPosition);
// Because the bookmark menu has separators and pull-right sub-menus,
// neither of which have command IDs, we can't tell just by looking
// at the menu items whether they should be deleted. So instead we
// delete everything
for (int i = nCount - 1 - ITEMS_AFTER_BOOKMARKS_END;
i >= ITEMS_BEFORE_BOOKMARKS_START; i--) {
// This will delete any sub-menus as well (recursively)
if(m_pBookmarksMenu->GetSubMenu(i) != NULL)
m_pBookmarksMenu->GetSubMenu(i)->DestroyMenu();
VERIFY(::DeleteMenu(hBookmarkMenu, i, MF_BYPOSITION));
}
//don't care about separator before bookmarks
m_pBookmarksMenu->ClearItems(ITEMS_BEFORE_BOOKMARKS_START - SEPARATORS_BEFORE_BOOKMARKS_START,
ITEMS_AFTER_BOOKMARKS_END);
// we also need to delete items added to file bookmarks
nCount = pFileBookmarkMenu->GetMenuItemCount();
for(i = nCount - 1; i >= 0 ; i--)
{
// This will delete any sub-menus as well (recursively)
if(pFileBookmarkMenu->GetSubMenu(i) != NULL)
pFileBookmarkMenu->GetSubMenu(i)->DestroyMenu();
VERIFY(pFileBookmarkMenu->DeleteMenu(i, MF_BYPOSITION));
}
pFileBookmarkMenu->ClearItems(0, 0);
delete m_BookmarksGarbageList;
m_nBookmarkItems = 0; // reset the number of current bookmark menu items
m_nFileBookmarkItems = 0;
}
// The maps are no longer needed
if (m_pHotlistMenuMap)
m_pHotlistMenuMap->RemoveAll();
if (m_pSubmenuMap)
m_pSubmenuMap->RemoveAll();
if (m_pFileSubmenuMap)
{
m_pFileSubmenuMap->RemoveAll();
// but we need to make sure that the file menu is still in the map.
//FileBookMark is always the first popup menu in the Bookmark menu loop through to find it.
UINT nfileBookmarksPosition = 0;
while(!m_pBookmarksMenu->GetSubMenu(nfileBookmarksPosition) && nfileBookmarksPosition < m_pBookmarksMenu->GetMenuItemCount())
nfileBookmarksPosition++;
CTreeMenu *pFileBookmarkMenu = (CTreeMenu*)m_pBookmarksMenu->GetSubMenu(nfileBookmarksPosition);
if(pFileBookmarkMenu != NULL)
{
m_pFileSubmenuMap->SetAt(pFileBookmarkMenu->GetSafeHmenu(),
HT_TopNode(HT_GetSelectedView(m_BookmarkMenuPane)));
}
}
}
} else if (!(nItemID == 0 || nFlags & (MF_SEPARATOR|MF_POPUP|MF_MENUBREAK|MF_MENUBARBREAK))) {
// If the menu item is for a bookmark item or history entry, save
// away the client data for later. We need to do this because Windows
// sends the WM_COMMAND for a selected menu item after sending the
// WM_MENUSELECT to indicate the menu has been taken down. Alternatively
// we could wait to purge the map until later, but Win32 allows client
// data to be associated with a menu item and there would be no map in that
// case anyway
if (IS_BOOKMARK_ID(nItemID) || IS_HISTORY_ID(nItemID)) {
ASSERT(m_pHotlistMenuMap);
if (m_pHotlistMenuMap->Lookup(nItemID, nLastSelectedData))
nLastSelectedCmdID = nItemID;
}
if (IS_FILE_BOOKMARK_ID(nItemID)) {
if(m_pHotlistMenuMap->Lookup(nItemID, nLastSelectedData))
nLastSelectedCmdID = nItemID;
}
}
#ifdef EDITOR
// Do Composer stuff
OnMenuSelectComposer(nItemID, nFlags, hSysMenu);
#endif // EDITOR
CFrameWnd::OnMenuSelect(nItemID, nFlags, hSysMenu);
}
// Because CTreeMenu's are owner draw, they don't handle mnemonics. Therefore
// we have to handle them ourselves.
LRESULT CGenericFrame::OnMenuChar( UINT nChar, UINT nFlags, CMenu* pMenu )
{
LRESULT result = 0;
if(pMenu == m_pBookmarksMenu)
{
int nPosition;
UINT nCommand;
if(m_pBookmarksMenu->GetMnemonic(nChar, nCommand, nPosition))
{
if(nCommand == 0)
return MAKELRESULT(nPosition, 2);
else
{
SendMessage(WM_COMMAND, nCommand);
return MAKELRESULT(0, 1);
}
}
}
return CFrameWnd::OnMenuChar(nChar, nFlags, pMenu);
}
// Find a popup menu matching the given ID,
// including searching into submenus
// This is necessary in order to act upon MeasureItem
// messages in the OnMeasureItem function.
// Userdata will always be of type CTreeItem *
static CMenu* FindPopupMenu(CMenu* pMenu, UINT nID, DWORD userData)
{
if( pMenu )
{
int iCount= pMenu->GetMenuItemCount();
for( int i = 0; i < iCount; i++ )
{
CMenu* pPopup = pMenu->GetSubMenu(i);
//if it's a submenu then see if it is or if it contains the submenu we want
if( pPopup )
{
//if the submenu and the menu we are looking for are the same then return this
if( (UINT)pPopup->m_hMenu == ((CTreeItem*)userData)->GetID() )
{
return pMenu;
}
// otherwise recurse to child popup
pPopup = FindPopupMenu( pPopup, nID, userData );
// check popups on this popup
if( pPopup )
return pPopup;
}
// otherwise check to see if it is the menu item that we want
else if( nID == pMenu->GetMenuItemID(i) )
{
return pMenu;
}
}
}
return NULL;
}
/****************************************************************************
*
* CGenericFrame::OnMeasureItem
*
* PARAMETERS:
* nIDCtl - control ID
* lpMI - pointer to MEASUREITEMSTRUCT
*
* RETURNS:
* void
*
* DESCRIPTION:
* We must override this handler because MFC has a bug that prevents
* the CMenu::MeasureItem() from being called for owner draw sub-menus.
*
****************************************************************************/
void CGenericFrame::OnMeasureItem(int nIDCtl, LPMEASUREITEMSTRUCT lpMI)
{
if (lpMI->CtlType == ODT_MENU)
{
ASSERT(lpMI->CtlID == 0);
CMenu * pMenu = NULL;
#if defined(WIN32)
_AFX_THREAD_STATE* pThreadState = AfxGetThreadState();
if (pThreadState->m_hTrackingWindow == m_hWnd)
{
// start from popup
pMenu = CMenu::FromHandle(pThreadState->m_hTrackingMenu);
}
else
{
// start from menubar
pMenu = GetMenu();
}
#else // WIN16
// start from menubar
pMenu = GetMenu();
#endif // WIN32
ASSERT(pMenu != NULL);
pMenu = FindPopupMenu(pMenu, lpMI->itemID, lpMI->itemData);
if (pMenu != NULL)
{
pMenu->MeasureItem(lpMI);
}
}
else
{
// Pass off to base class if not a menu
CFrameWnd::OnMeasureItem(nIDCtl, lpMI);
}
} // END OF FUNCTION CGenericFrame::OnMeasureItem()
// Scroll to the top of the document
//
void CGenericFrame::OnDocumentTop()
{
MWContext *pContext = GetActiveWinContext() != NULL ? GetActiveWinContext()->GetContext() : NULL;
if (pContext)
#ifdef EDITOR
if (EDT_IS_EDITOR(pContext))
EDT_BeginOfDocument(pContext, FALSE);
else
#endif // EDITOR
FE_SetDocPosition(GetActiveWinContext()->GetContext(), FE_VIEW, 0, 0);
}
// Scroll to the bottom of the document
//
void CGenericFrame::OnDocumentBottom()
{
MWContext *pContext = GetActiveWinContext() != NULL ? GetActiveWinContext()->GetContext() : NULL;
if (pContext)
#ifdef EDITOR
if (EDT_IS_EDITOR(pContext))
EDT_EndOfDocument(pContext, FALSE);
else
#endif // EDITOR
FE_SetDocPosition(pContext, FE_VIEW, 0, GetActiveWinContext()->GetDocumentHeight());
}
void CGenericFrame::OnAbout()
{
CAbstractCX * pContext = GetMainContext();
if(pContext) {
if (pContext->GetContext()->type != MWContextBrowser ||
EDT_IS_EDITOR(pContext->GetContext()))
pContext->NormalGetUrl(szLoadString(IDS_ABOUT_PAGE),NULL,NULL,TRUE);
else
pContext->NormalGetUrl(szLoadString(IDS_ABOUT_PAGE));
}
}
///////////////////////////////////////////////////////////////////////////////
void CGenericFrame::OnShowBookmarkWindow()
{
theApp.CreateNewNavCenter(NULL, TRUE, HT_VIEW_BOOKMARK);
}
///////////////////////////////////////////////////////////////////////////////
#ifdef JAVA
void CGenericFrame::OnToggleJavaConsole()
{
if( LJ_IsConsoleShowing() ) {
LJ_HideConsole();
} else {
LJ_ShowConsole();
}
}
void CGenericFrame::OnUpdateJavaConsole(CCmdUI* pCmdUI)
{
if (LJJavaStatus_Failed != LJ_GetJavaStatus()) {
pCmdUI->SetCheck( LJ_IsConsoleShowing() );
} else {
pCmdUI->Enable(FALSE);
}
}
#endif /* JAVA */
void CGenericFrame::OnTaskbar()
{
#ifdef MOZ_TASKBAR
if(theApp.GetTaskBarMgr().IsFloating())
theApp.GetTaskBarMgr().OnDockTaskBar();
else
theApp.GetTaskBarMgr().OnUnDockTaskBar();
#endif /* MOZ_TASKBAR */
}
void CGenericFrame::OnUpdateTaskbar(CCmdUI *pCmdUI)
{
#ifdef MOZ_TASKBAR
BOOL bUndocked = theApp.GetTaskBarMgr().IsFloating();
if( pCmdUI->m_pMenu ){
pCmdUI->m_pMenu->ModifyMenu(CASTUINT(ID_WINDOW_TASKBAR), CASTUINT(MF_BYCOMMAND | MF_STRING), CASTUINT(ID_WINDOW_TASKBAR),
szLoadString(CASTUINT(bUndocked ? IDS_DOCK_TASKBAR : IDS_SHOW_TASKBAR)) );
} else {
pCmdUI->SetCheck(bUndocked);
}
#endif /* MOZ_TASKBAR */
}
void CGenericFrame::OnUpdateLiveCall(CCmdUI* pCmdUI)
{
pCmdUI->Enable(m_bConference);
}
void CGenericFrame::OnIBMHostOnDemand()
{
CString installDirectory, executable;
if(!FEU_IsIBMHostOnDemandAvailable)
return;
#ifdef WIN32
CString ibmHostRegistry;
ibmHostRegistry.LoadString(IDS_3270_REGISTRY);
ibmHostRegistry = FEU_GetCurrentRegistry(ibmHostRegistry);
if(ibmHostRegistry.IsEmpty())
return;
installDirectory = FEU_GetInstallationDirectory(ibmHostRegistry, szLoadString(IDS_INSTALL_DIRECTORY));
#else ifdef XP_WIN16
installDirectory = FEU_GetInstallationDirectory(szLoadString(IDS_3270), szLoadString(IDS_INSTALL_DIRECTORY));
#endif
if(!installDirectory.IsEmpty())
{
executable = installDirectory + szLoadString(IDS_3270HTML);
if(((CDocTemplate *)theApp.m_ViewTmplate)->OpenDocumentFile( executable ))
{
return;
}
}
MessageBox(szLoadString(IDS_CANT3270), szLoadString(IDS_IBMHOSTONDEMAND), MB_OK);
}
void CGenericFrame::OnNetcaster()
{
FEU_OpenNetcaster() ;
}
void CGenericFrame::OnAim()
{
FEU_OpenAim();
}
void CGenericFrame::OnCalendar()
{
if(!FEU_IsCalendarAvailable())
return;
CString installDirectory, executable;
#ifdef WIN32
CString calRegistry;
calRegistry.LoadString(IDS_CALENDAR_REGISTRY);
calRegistry = FEU_GetCurrentRegistry(calRegistry);
if(calRegistry.IsEmpty())
return;
installDirectory = FEU_GetInstallationDirectory(calRegistry, szLoadString(IDS_INSTALL_DIRECTORY));
executable = szLoadString(IDS_CALENDAR32EXE);
#else ifdef XP_WIN16
installDirectory = FEU_GetInstallationDirectory(szLoadString(IDS_CALENDAR),szLoadString(IDS_INSTALL_DIRECTORY));
executable = szLoadString(IDS_CALENDAR16EXE);
#endif
if(!installDirectory.IsEmpty())
{
executable = installDirectory + executable;
if( WinExec(executable, SW_SHOW) >= 31)
return;
}
MessageBox(szLoadString(IDS_CANTCALENDAR), szLoadString(IDS_CALENDAR), MB_OK);
}
void CGenericFrame::OnShowAdvanced()
{
int32 prefInt;
PREF_GetIntPref("browser.chrome.button_style",&prefInt);
prefInt = (prefInt + 1) % 3; // reverse it!
PREF_SetIntPref("browser.chrome.button_style",prefInt);
theApp.m_pToolbarStyle = CASTINT(prefInt);
//theApp.m_pAdvancedToolbar = theApp.m_pAdvancedToolbar->IsYes() ? "No" : "Yes";
CGenericFrame *pGenFrame;
for(pGenFrame = theApp.m_pFrameList; pGenFrame; pGenFrame = pGenFrame->m_pNext) {
LPNSTOOLBAR pIToolBar = NULL;
pGenFrame->GetChrome()->QueryInterface( IID_INSToolBar, (LPVOID *) &pIToolBar );
if (pIToolBar) {
pIToolBar->SetToolbarStyle(theApp.m_pToolbarStyle);
pIToolBar->Release();
pGenFrame->RecalcLayout();
}
}
}
void CGenericFrame::OnUpdateShowAdvanced( CCmdUI *pCmdUI )
{
pCmdUI->SetCheck(theApp.m_pToolbarStyle);
pCmdUI->Enable(TRUE);
}
void CGenericFrame::OnViewCommandToolbar()
{
GetChrome()->ShowToolbar(ID_NAVIGATION_TOOLBAR, !GetChrome()->GetToolbarVisible(ID_NAVIGATION_TOOLBAR));
}
void CGenericFrame::OnUpdateViewCommandToolbar(CCmdUI *pCmdUI)
{
BOOL bShow = GetChrome()->GetToolbarVisible(ID_NAVIGATION_TOOLBAR);
if( pCmdUI->m_pMenu ){
pCmdUI->m_pMenu->ModifyMenu(CASTUINT(ID_VIEW_COMMANDTOOLBAR), CASTUINT(MF_BYCOMMAND | MF_STRING), CASTUINT(ID_VIEW_COMMANDTOOLBAR),
szLoadString(CASTUINT(bShow ? IDS_HIDE_COMMANDTOOLBAR : IDS_SHOW_COMMANDTOOLBAR)) );
} else {
pCmdUI->SetCheck(bShow);
}
}
void CGenericFrame::OnViewNavCenter()
{
CNSNavFrame* pFrame = GetDockedNavCenter();
if (pFrame)
pFrame->DeleteNavCenter();
else theApp.CreateNewNavCenter(this);
}
void CGenericFrame::OnUpdateViewNavCenter(CCmdUI *pCmdUI)
{
CNSNavFrame* pFrame = GetDockedNavCenter();
BOOL bShow = (pFrame != NULL);
if( pCmdUI->m_pMenu )
{
pCmdUI->m_pMenu->ModifyMenu(CASTUINT(ID_VIEW_NAVCENTER), CASTUINT(MF_BYCOMMAND | MF_STRING), CASTUINT(ID_VIEW_NAVCENTER),
szLoadString(CASTUINT(bShow ? IDS_HIDE_NAVCENTER : IDS_SHOW_NAVCENTER)) );
}
else
{
pCmdUI->SetCheck(bShow);
}
}
void CGenericFrame::OnViewLocationToolbar()
{
GetChrome()->ShowToolbar(ID_LOCATION_TOOLBAR, !GetChrome()->GetToolbarVisible(ID_LOCATION_TOOLBAR));
}
void CGenericFrame::OnUpdateViewLocationToolbar(CCmdUI *pCmdUI)
{
BOOL bShow = GetChrome()->GetToolbarVisible(ID_LOCATION_TOOLBAR);
if( pCmdUI->m_pMenu ){
pCmdUI->m_pMenu->ModifyMenu(CASTUINT(ID_VIEW_LOCATIONTOOLBAR), CASTUINT(MF_BYCOMMAND | MF_STRING), CASTUINT(ID_VIEW_LOCATIONTOOLBAR),
szLoadString(CASTUINT(bShow ? IDS_HIDE_LOCATIONTOOLBAR : IDS_SHOW_LOCATIONTOOLBAR)) );
} else {
pCmdUI->SetCheck(bShow);
}
}
static void
NiceReloadAllWindows()
{
for(CGenericFrame *f = theApp.m_pFrameList; f; f= f->m_pNext){
CWinCX *pContext = f->GetMainWinContext();
if(pContext && pContext->GetContext()) {
#ifdef EDITOR
if( EDT_IS_EDITOR(pContext->GetContext()))
EDT_RefreshLayout(pContext->GetContext());
else
#endif // EDITOR
pContext->NiceReload();
}
}
}
void CGenericFrame::OnIncreaseFont()
{
CWinCX *pWinCX = GetActiveWinContext();
if(!pWinCX)
pWinCX = GetMainWinContext();
if(pWinCX)
pWinCX->ChangeFontOffset(1);
}
int CGenericFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if(CFrameWnd::OnCreate(lpCreateStruct) == -1)
return(-1);
ApiApiPtr(api);
LPUNKNOWN pUnk = api->CreateClassInstance(APICLASS_CHROME, NULL);
if (pUnk) {
HRESULT hRes = pUnk->QueryInterface(IID_IChrome,(LPVOID*)&m_pChrome);
ASSERT(hRes==NOERROR);
pUnk->Release();
m_pChrome->Initialize(this);
}
// guess we made it
m_bConference = FEU_IsConfAppAvailable();
CMenu *pMenu=GetMenu();
if (pMenu)
{
#ifdef DEBUG_WHITEBOX
pMenu->AppendMenu(MF_STRING,IDS_WHITEBOX_MENU,"&WhiteBox");
#endif
CString communicatorStr, bookmarksStr, fileBookmarkStr;
//Communicator is always the second to last menu popup so adjust accordingly
int nWindowPosition = pMenu->GetMenuItemCount() - 2;
if(nWindowPosition != -1)
{
CMenu *pWindowMenu = pMenu->GetSubMenu(nWindowPosition);
// Check if we need to add the Calendar menu item
if(FEU_IsCalendarAvailable())
{
int nTaskBarPosition = WFE_FindMenuItem(pWindowMenu, ID_WINDOW_TASKBAR);
if(nTaskBarPosition != -1)
pWindowMenu->InsertMenu(nTaskBarPosition - 1, MF_BYPOSITION, ID_WINDOW_CALENDAR, szLoadString(IDS_CALENDAR_MENU));
}
if(FEU_IsIBMHostOnDemandAvailable())
{
int nTaskBarPosition = WFE_FindMenuItem(pWindowMenu, ID_WINDOW_TASKBAR);
if(nTaskBarPosition != -1)
pWindowMenu->InsertMenu(nTaskBarPosition - 1, MF_BYPOSITION, ID_WINDOW_IBMHOSTONDEMAND, szLoadString(IDS_IBMHOSTONDEMAND_MENU));
}
if(FEU_IsNetcasterAvailable())
{
int nTaskBarPosition = WFE_FindMenuItem(pWindowMenu, ID_WINDOW_TASKBAR);
#ifndef MOZ_TASKBAR
if (nTaskBarPosition == -1)
nTaskBarPosition = 2 ; // Right below &Navigator on Lite version
#endif
if(nTaskBarPosition != -1)
pWindowMenu->InsertMenu(nTaskBarPosition - 1, MF_BYPOSITION, ID_WINDOW_NETCASTER, szLoadString(IDS_NETCASTER_MENU));
}
if(FEU_IsAimAvailable())
{
int nTaskBarPosition = WFE_FindMenuItem(pWindowMenu, ID_WINDOW_TASKBAR);
if(nTaskBarPosition != -1)
pWindowMenu->InsertMenu(nTaskBarPosition - 1, MF_BYPOSITION, ID_WINDOW_AIM, szLoadString(IDS_AIM_MENU));
}
#ifdef XP_WIN32
// We can start or activate LiveWire SiteManager
// if we have a registration handle
if( bSiteMgrIsRegistered ){
int nTaskBarPosition = WFE_FindMenuItem(pWindowMenu, ID_WINDOW_TASKBAR);
if(nTaskBarPosition != -1)
pWindowMenu->InsertMenu(nTaskBarPosition - 1, MF_BYPOSITION, ID_ACTIVATE_SITE_MANAGER, szLoadString(IDS_SITE_MANAGER));
}
#endif
// Replace the bookmark menu with a new menu that can have ON_DRAWITEM overridden
//BookMark is the First Popup in the Communicator Menu so loop through to find it.
UINT nBookmarksPosition = 0;
while(!pWindowMenu->GetSubMenu(nBookmarksPosition) && nBookmarksPosition < pWindowMenu->GetMenuItemCount())
nBookmarksPosition++;
if(nBookmarksPosition < pWindowMenu->GetMenuItemCount())
{
CMenu *pOldBookmarksMenu = pWindowMenu->GetSubMenu(nBookmarksPosition);
char bookmarksStr[30];
if(pOldBookmarksMenu)
{
m_pBookmarksMenu=new CTreeMenu;
m_pBookmarksMenu->CreatePopupMenu();
m_OriginalBookmarksGarbageList = new CTreeItemList;
CopyMenu(pOldBookmarksMenu, m_pBookmarksMenu, m_OriginalBookmarksGarbageList);
pWindowMenu->GetMenuString(nBookmarksPosition, bookmarksStr, 30, MF_BYPOSITION);
pWindowMenu->DeleteMenu(nBookmarksPosition, MF_BYPOSITION);
pWindowMenu->InsertMenu(nBookmarksPosition, MF_BYPOSITION|MF_STRING|MF_POPUP, (UINT)m_pBookmarksMenu->GetSafeHmenu(), bookmarksStr);
//FileBookmark is the First Popup in the BookMarks Menu so loop through to find it.
UINT nfileBookmarksPosition = 0;
while(!m_pBookmarksMenu->GetSubMenu(nfileBookmarksPosition) && nfileBookmarksPosition < m_pBookmarksMenu->GetMenuItemCount())
nfileBookmarksPosition++;
m_pFileBookmarkMenu = (CTreeMenu*)m_pBookmarksMenu->GetSubMenu(nfileBookmarksPosition);
LoadBookmarkMenuBitmaps();
}
}
}
}
#ifdef MOZ_TASKBAR
// We use a taskbar
theApp.GetTaskBarMgr().Reference(TRUE);
#endif // MOZ_TASKBAR
return 0;
}
void CGenericFrame::OnDecreaseFont()
{
CWinCX *pWinCX = GetActiveWinContext();
if(!pWinCX)
pWinCX = GetMainWinContext();
if(pWinCX)
pWinCX->ChangeFontOffset(-1);
}
void CGenericFrame::OnUpdateViewCustomToolbar(CCmdUI *pCmdUI)
{
BOOL bShow = GetChrome()->GetToolbarVisible(ID_PERSONAL_TOOLBAR);
if( pCmdUI->m_pMenu ){
pCmdUI->m_pMenu->ModifyMenu(CASTUINT(ID_VIEW_CUSTOMTOOLBAR), CASTUINT(MF_BYCOMMAND | MF_STRING), CASTUINT(ID_VIEW_CUSTOMTOOLBAR),
szLoadString(CASTUINT(bShow ? IDS_HIDE_CUSTOMTOOLBAR : IDS_SHOW_CUSTOMTOOLBAR)) );
} else {
pCmdUI->SetCheck(bShow);
}
}
void CGenericFrame::OnViewCustomToolbar()
{
GetChrome()->ShowToolbar(ID_PERSONAL_TOOLBAR, !GetChrome()->GetToolbarVisible(ID_PERSONAL_TOOLBAR));
}
void CGenericFrame::OnCustomizeToolbar()
{
GetChrome()->Customize();
}
void CGenericFrame::OnUpdateCustomizeToolbar(CCmdUI *pCmdUI)
{
pCmdUI->Enable(TRUE);
}
void CGenericFrame::OnUpdatePlaces(CCmdUI *pCmdUI)
{
pCmdUI->Enable(TRUE);
}
void CGenericFrame::OnSaveConfiguration()
{
// Save out the preferences that might have changed
PREF_SavePrefFile();
// Save global configuration stuff
theApp.WriteProfileString("Main", "Temp Directory", theApp.m_pTempDir);
// security
if(theApp.m_nSecurityCheck[SD_ENTERING_SECURE_SPACE])
theApp.WriteProfileString("Security", "Warn Entering", "yes");
else
theApp.WriteProfileString("Security", "Warn Entering", "no");
if(theApp.m_nSecurityCheck[SD_LEAVING_SECURE_SPACE])
theApp.WriteProfileString("Security", "Warn Leaving", "yes");
else
theApp.WriteProfileString("Security", "Warn Leaving", "no");
if(theApp.m_nSecurityCheck[SD_INSECURE_DOCS_WITHIN_SECURE_DOCS_NOT_SHOWN])
theApp.WriteProfileString("Security", "Warn Mixed", "yes");
else
theApp.WriteProfileString("Security", "Warn Mixed", "no");
if(theApp.m_nSecurityCheck[SD_INSECURE_POST_FROM_INSECURE_DOC])
theApp.WriteProfileString("Security", "Warn Insecure Forms", "yes");
else
theApp.WriteProfileString("Security", "Warn Insecure Forms", "no");
}
// For Whitebox testing
#ifdef DEBUG_WHITEBOX
void CGenericFrame::OnWhiteBox()
{
CWhiteBoxDlg WhiteBoxDlg;
WhiteBoxDlg.DoModal();
}
#endif
/////////////////////////////////////////////////////////////////////////////
// CNetscapePropertySheet dialog
BEGIN_MESSAGE_MAP(CNetscapePropertySheet, CPropertySheet)
ON_COMMAND(IDOK, OnOK)
ON_COMMAND(ID_HELP, OnHelp)
ON_WM_CREATE()
ON_WM_DESTROY()
#ifdef XP_WIN32
ON_WM_HELPINFO()
#endif //XP_WIN32
END_MESSAGE_MAP()
CNetscapePropertySheet::CNetscapePropertySheet(const char * pName, CWnd * pParent, UINT nStart,
MWContext *pMWContext, BOOL bUseApplyButton)
: CPropertySheet(pName, pParent, nStart),
m_pMWContext(pMWContext),
m_bUseApplyButton(bUseApplyButton)
{
#if defined(MSVC4)
// CLM: For preferences dialogs, ommitting the Apply button is good,
// but in the Editor, Apply is very useful, so I added this param
// Default behavior is to not use apply button
if( !bUseApplyButton )
m_psh.dwFlags |= PSH_NOAPPLYNOW;
#endif
}
void CNetscapePropertySheet::SetPageTitle (int nPage, LPCTSTR pszText)
{
//TODO: How can we do this in Win16???
#ifndef XP_WIN16
CTabCtrl* pTab = GetTabControl();
ASSERT (pTab);
TC_ITEM ti;
ti.mask = TCIF_TEXT;
ti.pszText = (char*)pszText;
VERIFY (pTab->SetItem (nPage, &ti));
#endif
}
//
// Pass the help message along to the active page cuz that is the only
// place we have easy access to the dialog ID
//
void CNetscapePropertySheet::OnHelp()
{
CNetscapePropertyPage * pPage = (CNetscapePropertyPage *) GetActivePage();
if(pPage)
pPage->OnHelp();
}
#ifdef XP_WIN32
BOOL CNetscapePropertySheet::OnHelpInfo(HELPINFO *)//32bit messagemapping.
{
OnHelp();
return TRUE;
}
#endif//XP_WIN32
//
// MFC's OnOK() only calls for current page, we want to do all pages
//
void CNetscapePropertySheet::OnOK()
{
ASSERT_VALID(this);
#if defined(MSVC4)
// Save active page to pass out after we close down
m_nCurrentPage = GetActiveIndex();
#endif
if (GetActivePage()->OnKillActive())
{
// call OnOK for everyone
int count = m_pages.GetSize();
for(int i = 0; i < count; i++)
((CPropertyPage *) m_pages[i])->OnOK();
if (!m_bModeless)
EndDialog(IDOK);
}
}
#if defined(MSVC4)
//
// Make sure the starting page is actually a page that exists
//
BOOL CNetscapePropertySheet::SetCurrentPage(int iPage)
{
int nCurPage = 0;
if(iPage < m_pages.GetSize())
nCurPage = iPage;
m_nCurrentPage = nCurPage;
return(SetActivePage(nCurPage));
}
#else
//
// Make sure the starting page is actually a page that exists
//
int CNetscapePropertySheet::SetCurrentPage(int iPage)
{
if(iPage < m_pages.GetSize())
m_nCurPage = iPage;
else
m_nCurPage = 0;
return(m_nCurPage);
}
#endif // MSVC4
#if defined(MSVC4)
// A change to MFC broke this -- it doesn't return last page
// once the dialog is closed, which is how we always use it!
int CNetscapePropertySheet::GetCurrentPage()
{
if( m_hWnd ){
m_nCurrentPage = GetActiveIndex();
}
// We will set this in OnOK so it reflects
// correct page just before exiting dialog
return m_nCurrentPage;
}
#endif
int CNetscapePropertySheet::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if( CPropertySheet::OnCreate(lpCreateStruct) == -1 ){
return -1;
}
#ifdef XP_WIN16
// Since we can't remove Apply button using PSH_NOAPPLYNOW
// in MFC 1.52, let's do it ourselves
if( !m_bUseApplyButton ){
CWnd *pButton = GetDlgItem(ID_APPLY_NOW);
CRect crRectApply;
CRect crRectCancel;
if( pButton ){
pButton->GetWindowRect(&crRectApply);
ScreenToClient(&crRectApply);
// Hide Apply button
GetDlgItem(ID_APPLY_NOW)->ShowWindow(SW_HIDE);
// Move the Cancel button to the Apply position
pButton = GetDlgItem(IDCANCEL);
if( pButton ){
pButton->GetWindowRect(&crRectCancel);
ScreenToClient(&crRectCancel);
pButton->SetWindowPos(NULL, crRectApply.left, crRectApply.top, 0,0,
SWP_NOACTIVATE | SWP_NOSIZE);
// Move the OK button to the Cancel position
pButton = GetDlgItem(IDOK);
if( pButton ){
pButton->SetWindowPos(NULL, crRectCancel.left, crRectCancel.top, 0,0,
SWP_NOACTIVATE | SWP_NOSIZE);
}
}
}
}
#endif
return 0;
}
void CNetscapePropertySheet::OnDestroy()
{
CPropertySheet::OnDestroy();
}
extern int32 wfe_iFontSizeMode;
// Toggle Go offline, Go online menu item
//
void CGenericFrame::OnGoOffline()
{
#ifdef MOZ_OFFLINE
BOOL bOnline;
CDownLoadDlg rDlg(this);
PREF_GetBoolPref("network.online", &bOnline);
rDlg.InitDialog(!bOnline);
rDlg.DoModal();
// don't set the offline preference here! GoOffline won't work if we're offline!
#endif /* MOZ_OFFLINE */
}
void CGenericFrame::OnUpdateGoOffline(CCmdUI* pCmdUI)
{
#ifdef MOZ_OFFLINE
BOOL bOnline;
CString menuText;
PREF_GetBoolPref("network.online", &bOnline);
if (bOnline)
{ //online now, set to offline
menuText.LoadString(IDS_GO_OFFLINE);
}
else
{ //offline now, set to online
menuText.LoadString(IDS_GO_ONLINE);
}
pCmdUI->SetText(LPCTSTR(menuText));
#endif /* MOZ_OFFLINE */
}
void CGenericFrame::OnDoneGoingOffline()
{
#ifdef MOZ_OFFLINE
// I'm sure this could happen at the worst possible time
if (!GetMainContext() || !GetMainContext()->GetContext())
return;
MWContext *pContext = GetMainContext()->GetContext();
if (NET_IsOffline() && !XP_IsContextBusy(pContext)) {
FE_Progress(pContext, szLoadString(IDS_STATUS_OFFLINE));
} else {
FE_Progress(pContext, szLoadString(IDS_DOC_DONE));
}
#endif // MOZ_OFFLINE
}
#ifdef FORTEZZA
/*
* It would be nice to replace the following code with a single routine
* that switches off the Resource ID. (do this in CGenericFrame::OnCmdMsg)
*/
void CGenericFrame::OnStartFortezzaCard()
{
MWContext *pContext = GetMainContext() != NULL ?
GetMainContext()->GetContext() : NULL;
SSL_FortezzaMenu(pContext,SSL_FORTEZZA_CARD_SELECT);
}
void CGenericFrame::OnStartFortezzaChange()
{
MWContext *pContext = GetMainContext() != NULL ?
GetMainContext()->GetContext() : NULL;
SSL_FortezzaMenu(pContext,SSL_FORTEZZA_CHANGE_PERSONALITY);
}
void CGenericFrame::OnStartFortezzaView()
{
MWContext *pContext = GetMainContext() != NULL ?
GetMainContext()->GetContext() : NULL;
SSL_FortezzaMenu(pContext,SSL_FORTEZZA_VIEW_PERSONALITY);
}
void CGenericFrame::OnDoFortezzaInfo()
{
MWContext *pContext = GetMainContext() != NULL ?
GetMainContext()->GetContext() : NULL;
SSL_FortezzaMenu(pContext,SSL_FORTEZZA_CARD_INFO);
}
void CGenericFrame::OnDoFortezzaLog()
{
MWContext *pContext = GetMainContext() != NULL ?
GetMainContext()->GetContext() : NULL;
SSL_FortezzaMenu(pContext,SSL_FORTEZZA_LOGOUT);
}
#endif
//
// Just call OnClose
//
void CGenericFrame::OnFrameExit()
{
PostMessage(WM_CLOSE);
}
void CGenericFrame::OnSetFocus(CWnd* pOldWnd)
{
CFrameWnd::OnSetFocus(pOldWnd);
// Put us on the active stack.
SetAsActiveFrame();
}
void CGenericFrame::OnWindowPosChanged(WINDOWPOS *lpWndPos)
{
// Call the base.
CFrameWnd::OnWindowPosChanged(lpWndPos);
// Tell ncapi people window is changing position.
if(GetMainContext() && GetMainContext()->GetContext()->type == MWContextBrowser) {
CWindowChangeItem::Sizing(GetMainContext()->GetContextID(), lpWndPos->x, lpWndPos->y, lpWndPos->cx, lpWndPos->cy);
}
}
void CGenericFrame::OnWindowPosChanging(WINDOWPOS *lpWndPos)
{
if (m_bZOrderLocked){
lpWndPos->flags = lpWndPos->flags | SWP_NOZORDER | SWP_NOOWNERZORDER;
}
// Call the base
CFrameWnd::OnWindowPosChanging( lpWndPos);
}
void CGenericFrame::OnSize(UINT nType, int cx, int cy)
{
CFrameWnd::OnSize(nType, cx, cy);
// See what type of information we're going to be sending to our window tracking service.
// ncapi
if(GetMainContext() != NULL && GetMainContext()->GetContext()->type == MWContextBrowser) {
switch(nType) {
case SIZE_MAXIMIZED:
CWindowChangeItem::Maximizing(GetMainContext()->GetContextID());
break;
case SIZE_MINIMIZED:
CWindowChangeItem::Minimizing(GetMainContext()->GetContextID());
break;
case SIZE_RESTORED:
CWindowChangeItem::Normalizing(GetMainContext()->GetContextID());
break;
}
}
}
BOOL CGenericFrame::OnCommand(UINT wParam,LONG lParam)
{
#ifdef WIN32
int nCode = HIWORD(wParam);
#else
int nCode = HIWORD(lParam);
#endif
UINT nID = LOWORD(wParam);
if( nID >= ID_OPTIONS_ENCODING_1 && nID <= ID_OPTIONS_ENCODING_70)
{
OnToggleEncoding( nID );
return TRUE;
}
if (m_bDisableHotkeys && nCode==1) {
switch (LOWORD(wParam)) {
case ID_SECURITY:
case ID_APP_EXIT:
case ID_EDIT_PASTE:
case ID_EDIT_COPY:
case ID_EDIT_CUT:
break;
default:
return(TRUE);
}
}
if(CFrameWnd::OnCommand(wParam, lParam)) {
return(TRUE);
}
// See if it was a bookmark item
if (IS_BOOKMARK_ID(nID) && GetMainContext()) {
// Make sure the command ID is consistent with the last
// selected menu item
ASSERT(nLastSelectedCmdID == nID && nLastSelectedData);
if (nLastSelectedCmdID != nID || !nLastSelectedData)
return FALSE;
#ifdef EDITOR
// It is much safer to go through Composer's LoadUrl routine
if(EDT_IS_EDITOR(GetMainContext()->GetContext()))
FE_LoadUrl((char*)nLastSelectedData, TRUE);
else
#endif
GetMainContext()->NormalGetUrl((char*)nLastSelectedData);
return TRUE;
}
if(IS_FILE_BOOKMARK_ID(nID) && GetMainContext()) {
if(nLastSelectedCmdID != nID || !nLastSelectedData)
return FALSE;
if(GetMainContext())
{
FileBookmark((HT_Resource)nLastSelectedData);
}
return TRUE;
}
return CommonCommand(wParam, lParam);
}
// returns TRUE if something was added to the folder, false otherwise
BOOL CGenericFrame::FileBookmark(HT_Resource pFolder)
{
return FALSE;
}
void CGenericFrame::OnAnimationBonk()
{
if ( GetMainContext() ) {
GetMainContext()->NormalGetUrl( szLoadString( IDS_DIRECT_HOME ) );
}
}
void CGenericFrame::OnUpdateFileRoot(CCmdUI* pCmdUI)
{
if( pCmdUI->m_pMenu ){
pCmdUI->m_pMenu->ModifyMenu(ID_BOOKMARKS_FILEROOT, MF_BYCOMMAND | MF_STRING, ID_BOOKMARKS_FILEROOT,
HT_GetNodeName(HT_TopNode(HT_GetSelectedView(m_BookmarkMenuPane))));
}
}
void CGenericFrame::OnNewFrame()
{
// Pass it off to the context for handling.
if(GetMainContext()) {
GetMainContext()->NewWindow();
}
}
void CGenericFrame::OnUpdateNewFrame(CCmdUI* pCmdUI)
{
// Defer to the context's wisdom.
if(GetMainContext()) {
pCmdUI->Enable(GetMainContext()->CanNewWindow());
}
else {
pCmdUI->Enable(FALSE);
}
}
// This is used by browser or editor
// to open a URL into either a browser
// or editor window (Radio buttons
// added to dialog to choose destination)
// If destination is a Browser and calling from Browser,
// open in same window (same as current behavior),
// for all other cases, open in new window
void CGenericFrame::OnFileOpenurl()
{
if(GetMainContext()) {
GetMainContext()->OpenUrl();
}
}
void CGenericFrame::OnUpdateFileOpenurl(CCmdUI* pCmdUI)
{
if(GetMainContext()) {
pCmdUI->Enable(GetMainContext()->CanOpenUrl());
}
else {
pCmdUI->Enable(FALSE);
}
}
void CGenericFrame::OnHotlistAddcurrenttohotlist()
{
if(GetMainContext()) {
GetMainContext()->AddToBookmarks();
}
}
void CGenericFrame::OnUpdateHotlistAddcurrenttohotlist(CCmdUI* pCmdUI)
{
if(GetMainContext()) {
pCmdUI->Enable(GetMainContext()->CanAddToBookmarks());
}
else {
pCmdUI->Enable(FALSE);
}
}
void CGenericFrame::OnHotlistAddcurrenttotoolbar()
{
/* PERSONAL
if(GetMainContext()) {
History_entry *pHistEnt = SHIST_GetCurrent( &(GetMainContext()->GetContext()->hist) );
ASSERT(pHistEnt);
BM_Entry *pEntry = BM_NewUrl( GetMainContext()->GetContext()->title, pHistEnt->address, NULL,
pHistEnt->last_access );
ASSERT(pEntry);
BM_AppendToHeader( theApp.m_pBmContext, theApp.GetLinkToolbarManager().GetToolbarHeader(),
pEntry );
theApp.GetLinkToolbarManager().ToolbarHeaderChanged();
}
*/
}
void CGenericFrame::OnUpdateHotlistAddcurrenttotoolbar(CCmdUI* pCmdUI)
{
if(GetMainContext()) {
pCmdUI->Enable(GetMainContext()->CanAddToBookmarks());
}
else {
pCmdUI->Enable(FALSE);
}
}
// Give the focus to the next top-level window
//
void CGenericFrame::OnNextWindow()
{
// User has pressed ctrl-tab to switch windows
if (this->m_pNext) {// goto next if exists
this->m_pNext->SetActiveWindow();
} else { // else start at beginning
if(theApp.m_pFrameList)
theApp.m_pFrameList->SetActiveWindow();
}
}
void CGenericFrame::OnSaveOptions()
{
// Save Encoding Info
theApp.m_iCSID = m_iCSID ; // Change Global default CSID
PREF_SetIntPref("intl.character_set",m_iCSID);
}
LRESULT CGenericFrame::OnFindReplace(WPARAM wParam, LPARAM lParam)
{
CWinCX *pContext = GetActiveWinContext();
if(!pContext)
pContext = GetMainWinContext();
if(pContext && pContext->GetPane())
return(pContext->GetView()->OnFindReplace(wParam, lParam));
return(FALSE);
}
void CGenericFrame::OnMove(int x, int y)
{
CFrameWnd::OnMove(x, y);
// Tell our main context that we've moved.
if(GetMainWinContext()) {
GetMainWinContext()->OnMoveCX();
}
}
void CGenericFrame::OnGetMinMaxInfo(MINMAXINFO FAR* lpMMI)
{
// Do the default first.
CFrameWnd::OnGetMinMaxInfo(lpMMI);
// If we're not allowing resize, be sure and set the min max tracking information
// which effectively blocks the user from resizing the window.
if(m_bCanResize == FALSE && IsIconic() == FALSE && IsZoomed() == FALSE) {
// Set up the min and max tracking info to be the same to block resize.
lpMMI->ptMinTrackSize.x = lpMMI->ptMaxTrackSize.x = m_crMinMaxRect.Width();
lpMMI->ptMinTrackSize.y = lpMMI->ptMaxTrackSize.y = m_crMinMaxRect.Height();
}
}
// Sets a flag determining wether or now we'll let the user resize the window.
void CGenericFrame::EnableResize(BOOL bEnable)
{
long lStyles = 0;
// Set the flag.
m_bCanResize = bEnable;
GetWindowRect(m_crMinMaxRect);
lStyles = GetWindowLong(GetSafeHwnd(), GWL_STYLE);
if (lStyles & WS_POPUP)
return;
if (bEnable) {
// We need to make sure the windows maximize buttons come back if we killed them.
if (lStyles & WS_MAXIMIZEBOX)
return;
lStyles |= WS_MAXIMIZEBOX;
SetWindowLong(GetSafeHwnd(), GWL_STYLE, lStyles);
}
else { //The window is being set non-resizable. Kill the windows maximize button as well.
if (!(lStyles & WS_MAXIMIZEBOX))
return;
lStyles &= ~WS_MAXIMIZEBOX;
SetWindowLong(GetSafeHwnd(), GWL_STYLE, lStyles);
}
}
void CGenericFrame::DisableHotkeys(BOOL bDisable)
{
// Set the flag.
m_bDisableHotkeys = bDisable;
}
void CGenericFrame::SetZOrder(BOOL bZLock, BOOL bBottommost)
{
// Set the flag.
m_bZOrderLocked = bZLock;
m_bBottommost = bBottommost;
if (m_bBottommost)
m_bZOrderLocked = TRUE;
}
#ifdef WIN32
//These functions don't do anything on Win16.
void CGenericFrame::SetExStyles(DWORD wAddedExStyles, DWORD wRemovedExStyles)
{
// Set any ws_ex_styles for the window
m_wAddedExStyles |= wAddedExStyles;
m_wRemovedExStyles |= wRemovedExStyles;
}
DWORD CGenericFrame::GetRemovedExStyles()
{
// Set any ws_ex_styles we are setting for the window
return (m_wRemovedExStyles);
}
#endif
void CGenericFrame::SetAsPopup(HWND hPopupParent)
{
m_hPopupParent = hPopupParent;
}
#ifdef WM_SIZING
void CGenericFrame::OnSizing(UINT nSide, LPRECT lpRect)
{
// User is resizing window.
// Save the current size of the window (used in get min max info)
// in case we have to hold us to that.
GetWindowRect(m_crMinMaxRect);
}
#endif
#ifdef _WIN32
LONG CGenericFrame::OnHackedMouseWheel(WPARAM wParam, LPARAM lParam)
{
// Determine if we're the destination.
BOOL bUs = TRUE;
HWND hFocus = ::GetFocus();
if(hFocus) {
// Is the focus window our child?
BOOL bChild = ::IsChild(m_hWnd, hFocus);
if(bChild) {
// Pass along.
bUs = FALSE;
}
}
// Either call ourselves or pass along.
if(bUs == TRUE) {
// Zero means not handled.
return(0);
}
else {
return(::SendMessage(hFocus, msg_MouseWheel, wParam, lParam));
}
}
#endif
// Call to start a new Browser window with supplied URL
// or load homepage if none supplied
MWContext * wfe_CreateNavigator(char * pUrl)
{
URL_Struct *pUrlStruct = NULL;
if ( pUrl != NULL && XP_STRLEN(pUrl) > 0 )
{
// Create a new URL structure and copy URL string to it
pUrlStruct = NET_CreateURLStruct(pUrl, NET_DONT_RELOAD);
// Must clear this to correctly load URL
if ( pUrlStruct ) {
pUrlStruct->fe_data = NULL;
}
}
// Always create a new context
return CFE_CreateNewDocWindow(NULL, pUrlStruct );
}