gecko-dev/cmd/winfe/mainfrm.cpp

810 lines
21 KiB
C++
Raw Normal View History

1998-03-28 02:44:41 +00:00
/* -*- 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.
*/
// mainfrm.cpp : implementation of the CMainFrame class
//
#include "stdafx.h"
1998-06-22 21:19:46 +00:00
#include "rosetta.h"
1998-03-28 02:44:41 +00:00
#include "dialog.h"
#include "winclose.h"
#include "cntritem.h"
#include "timer.h"
#include "cxsave.h"
#include "edt.h"
#include "mainfrm.h"
#include "edframe.h"
#include "netsvw.h"
#include "hiddenfr.h"
#include "intlwin.h"
#include "msgcom.h"
#include "custom.h"
#include "statbar.h"
#include "histbld.h"
#include "nethelp.h"
#include "mnwizard.h"
#include "ssl.h"
#include "prefapi.h"
#include "prefInfo.h"
#include "medit.h"
#include "profile.h"
1998-03-28 02:44:41 +00:00
#include "np.h"
#include "npapi.h" // for NPWindow
1998-06-03 06:19:45 +00:00
#if defined(OJI)
#include "jvmmgr.h"
#elif defined(JAVA)
1998-03-28 02:44:41 +00:00
#include "java.h"
#endif
#include "timing.h"
1998-03-28 02:44:41 +00:00
#ifdef _DEBUG
#undef THIS_FILE
static char BASED_CODE THIS_FILE[] = __FILE__;
#endif
#ifndef _AFXDLL
#define new DEBUG_NEW // MSVC Debugging new...goes to regular new in release mode
#endif
#define SECURE_BITMAP_INDEX 10
#define MIDSECURE_BITMAP_INDEX 9
#define UNSECURE_BITMAP_INDEX 8
//
// If we are already calling NET_ProcessNet() cuz of a socket ready message
// do not call it again via a timer interrupt
//
MODULE_PRIVATE int winfeInProcessNet = FALSE;
static int calledProcessNet = FALSE;
// remember a socket which got a network event while we were thinking
static long m_nSocketToDealWith = 0;
extern CMapStringToOb DNSCacheMap;
static CHistoryMenuBuilder histBuilder;
#include "toolbar.cpp"
/////////////////////////////////////////////////////////////////////////////
// CMainFrame diagnostics
#ifdef _DEBUG
void CMainFrame::AssertValid() const
{
CGenericFrame::AssertValid();
}
void CMainFrame::Dump(CDumpContext& dc) const
{
CGenericFrame::Dump(dc);
}
#endif //_DEBUG
//
// Pop up an alert box for the user
//
void CMainFrame::Alert(char * Msg)
{
MessageBox(Msg, szLoadString(AFX_IDS_APP_TITLE), MB_ICONEXCLAMATION | MB_OK);
}
//
// Pop up a message to the user.
// Return TRUE if the user clicks on the "OK" button else FALSE
//
int CMainFrame::Confirm(char * Msg)
{
int res = GetActiveWindow()->MessageBox(Msg, szLoadString(AFX_IDS_APP_TITLE), MB_ICONQUESTION | MB_OKCANCEL);
return(res == IDOK);
}
char * CMainFrame::Prompt(const char * Msg, const char * Dflt)
{
// CDialogPRMT foo(this->GetActiveWindow());
// Must always use ActiveWindow so preference dialogs are the parent,
// else user can move focus to preference dialog and loose prompt dialog
CDialogPRMT foo(this->GetActiveWindow());
return(foo.DoModal(Msg, Dflt));
}
char * CMainFrame::PromptPassword(char * Msg)
{
// CDialogPASS foo(this);
CDialogPASS foo(this->GetActiveWindow());
return(foo.DoModal(Msg));
}
#define IS_IN_WINDOW(hParent,hChild)\
(((hParent) == (hChild)) || ::IsChild(hParent, hChild))
BOOL CMainFrame::setNextTabFocus( int forward )
{
CWinCX *pWinCX = GetMainWinContext();
if( pWinCX ) {
// setTabFocusNext will search siblings
BOOL ret = pWinCX->setTabFocusNext( forward );
if( ret )
return( TRUE );
}
return( FALSE );
}
BOOL CMainFrame::PreTranslateMessage(MSG* pMsg)
{
BOOL bTranslated = CGenericFrame::PreTranslateMessage(pMsg);
if (bTranslated)
return TRUE; // msg handled
if (pMsg->message != WM_KEYDOWN)
return FALSE; // we're not interested in translating this message
// Do not continue with tab processing if in an editor
if( (pMsg->wParam != VK_TAB && pMsg->wParam != VK_SPACE && pMsg->wParam != VK_RETURN)
|| EDT_IS_EDITOR(GetMainContext()->GetContext()) )
return( FALSE );
// if a plugin has the focus, we don't touch the any (TAB,SAPCE,CR) key.
if( GetActiveWinContext() && GetActiveWinContext()->GetContext() ) {
// get the plugin list
NPEmbeddedApp * pPlugin = GetActiveWinContext()->GetContext()->pluginList;
// check each plugin in the list, to see if a plugin is the parent
// of the focus window.
while( pPlugin != NULL ) {
NPWindow* npWindow = pPlugin->wdata;
if( npWindow && npWindow->type == NPWindowTypeWindow ) {
// check relation of parent(plugin) - child(msg window)
if( npWindow->window && IS_IN_WINDOW( (HWND)npWindow->window, pMsg->hwnd) )
return(FALSE); // plugin has focus, dont touch TAB key
}
pPlugin = pPlugin->next;
}
}
/*
The windows messaging systems such as CWnd::WalkPreTranslateTree(), only
walk from leaf to root of the window tree.
To navigate in frames(grids), Tab navigation needs to go from one window(view)
to its sibling. Therefor, we need to walk the tree.
*/
CGenericView *pView;
UINT forward = GetKeyState(VK_SHIFT)<0 ? 0 : 1 ; // 1 is forward
UINT controlKey = GetKeyState(VK_CONTROL)<0 ? 1 : 0 ; // 1 controlKey, go to next group
int ii;
// IF child A reached the end of tabable elements, and child B
// has no tabable elements, we need go back to child A to set
// tab focus. That is the "for" loop for.
for( ii = 0; ii < 2 && !bTranslated; ii ++ ) {
// the chrome(location and starter bar) get Tab focus first
if( GetChrome() != NULL ) {
if( m_tabFocusInMainFrm == TAB_FOCUS_IN_NULL ) {
// first time,
if( pMsg->wParam != VK_TAB ) // #49928 only handle Tab key in Chrome
return( FALSE );
// set focus to the location box.
bTranslated = GetChrome()->procTabNavigation( pMsg->wParam, 1, controlKey );
if( bTranslated ) {
m_tabFocusInMainFrm = TAB_FOCUS_IN_CHROME;
return( TRUE );
} // else, do nothing, fall to setting focus in views.
} else if( m_tabFocusInMainFrm == TAB_FOCUS_IN_CHROME ) {
if( pMsg->wParam != VK_TAB ) // #49928 only handle Tab key in Chrome
return( FALSE );
bTranslated = GetChrome()->procTabNavigation( pMsg->wParam, 0, controlKey );
if( bTranslated ) {
// chrome consummed the Tab key
m_tabFocusInMainFrm = TAB_FOCUS_IN_CHROME;
return( TRUE );
} else {
m_tabFocusInMainFrm = TAB_FOCUS_IN_NULL;
// fall to setting focus in views.
}
}
} else { // no chrome, user may just close the chrom
if( m_tabFocusInMainFrm == TAB_FOCUS_IN_CHROME )
m_tabFocusInMainFrm = TAB_FOCUS_IN_NULL;
// fall to setting focus in views.
}
if( bTranslated )
return(TRUE);
#ifdef DEBUG_aliu
// we should have returned, if focus was set in chrome.
ASSERT( m_tabFocusInMainFrm != TAB_FOCUS_IN_CHROME );
#endif
if( ! GetActiveView() ) { // #55453 something wrong, try my best.
bTranslated = setNextTabFocus(forward); // setNextTabableFrame( NULL, forward ); //NULL start with the first frame
} else {
if( ! GetActiveView()->IsKindOf(RUNTIME_CLASS( CGenericView ) ) )
return(FALSE); // not html, maybe print-preview #44362
// now try to set tab focus to the views(grids)
if( m_tabFocusInMainFrm == TAB_FOCUS_IN_GRID ) {
// Starting with the active view, procTabNavigation() will
// search siblings in this frame window.
pView = (CGenericView *) GetActiveView( );
if( pView == NULL )
return(FALSE);
// TODO control key is for Tab-group(Form, table) or for Frame???
if( ! controlKey ) {
// try active view first
bTranslated = pView->procTabNavigation( pMsg->wParam, forward, controlKey ); // for Tab, or SpaceBar
if ( bTranslated ) {
m_tabFocusInMainFrm = TAB_FOCUS_IN_GRID ;
return( TRUE ); // msg handled
}
}
if( pMsg->wParam != VK_TAB )
return( FALSE );
// active frame has nothing to tab to.
m_tabFocusInMainFrm = TAB_FOCUS_IN_NULL;
// try other frames(if any), starting from this
// bTranslated = setNextTabableFrame( this, forward );
} else { // TAB_FOCUS_IN_NULL,
// start with the first frame
bTranslated = setNextTabFocus(forward); // setNextTabableFrame( NULL, forward );
}
} // if( ! GetActiveView() )
if ( bTranslated ) {
m_tabFocusInMainFrm = TAB_FOCUS_IN_GRID ;
return( TRUE ); // msg handled
}
} // for( ii = 0; ii < 2; ii ++ )
return(FALSE);
} // BOOL CMainFrame::PreTranslateMessage(MSG* pMsg)
void CMainFrame::OnToggleFancyFtp()
{
if(GetMainContext()) {
GetMainContext()->GetContext()->fancyFTP = !GetMainContext()->GetContext()->fancyFTP;
}
}
void CMainFrame::OnUpdateToggleFancyFtp(CCmdUI* pCmdUI)
{
if(GetMainContext()) {
pCmdUI->SetCheck(GetMainContext()->GetContext()->fancyFTP);
}
}
void CMainFrame::RefreshNewEncoding(int16 csid, BOOL bIgnore)
{
if (m_iCSID != csid)
{
if(GetMainContext()) {
int iOldCSID = m_iCSID;
// Must set before EDT_SetEncoding.
m_iCSID = csid;
#ifdef EDITOR
if( EDT_IS_EDITOR(GetMainContext()->GetContext()) )
{
// EDT_SetEncoding takes care of reloading.
if ( ! EDT_SetEncoding(GetMainContext()->GetContext(), csid) ) {
// revert m_iCSID
m_iCSID = iOldCSID;
return;
}
}
else
#endif /* EDITOR */
{
// Must use NET_NORMAL_RELOAD else reload uses NET_RESIZE_RELOAD
// and the text is not updated
GetMainContext()->NiceReload(NET_NORMAL_RELOAD);
1998-03-28 02:44:41 +00:00
}
}
}
}
//
// Toggle the showing of the location bar
//
void CMainFrame::OnOptionsTitlelocationBar()
{
if(GetChrome()->GetToolbarVisible(ID_LOCATION_TOOLBAR)) {
GetChrome()->ShowToolbar(ID_LOCATION_TOOLBAR, FALSE);
m_bLocationBar= FALSE;
} else {
GetChrome()->ShowToolbar(ID_LOCATION_TOOLBAR, TRUE);
m_bLocationBar= TRUE;
}
}
void CMainFrame::OnUpdateOptionsTitlelocationBar(CCmdUI* pCmdUI)
{
pCmdUI->SetCheck(GetChrome()->GetToolbarVisible(ID_LOCATION_TOOLBAR));
}
XP_BEGIN_PROTOS
extern char * NET_PrintNetlibStatus();
XP_END_PROTOS
void CMainFrame::OnOptionsTogglenetdebug()
{
if(GetActiveContext() != NULL) {
char *rv = NET_PrintNetlibStatus();
FE_Alert(GetActiveContext()->GetContext(), rv);
XP_FREE(rv);
NET_ToggleTrace();
}
}
void CMainFrame::OnOptionsToggleProfile()
{
TimingSetEnabled(! TimingIsEnabled());
}
1998-03-28 02:44:41 +00:00
void CMainFrame::OnToggleImageLoad()
{
CWinCX *pWinCX;
if( pWinCX = GetMainWinContext()) {
if( prefInfo.m_bAutoLoadImages) {
prefInfo.m_bAutoLoadImages = FALSE;
GetChrome()->ImagesButton(TRUE);
} else {
prefInfo.m_bAutoLoadImages = TRUE;;
GetChrome()->ImagesButton(FALSE);
}
}
}
void CMainFrame::OnUpdateToggleImageLoad(CCmdUI* pCmdUI)
{
CWinCX *pWinCX;
if( pWinCX = GetMainWinContext()) {
pCmdUI->SetCheck(prefInfo.m_bAutoLoadImages);
}
}
void CMainFrame::OnNetSearch()
{
char * url = NULL;
int iError = PREF_CopyConfigString("internal_url.net_search.url",&url);
1998-03-28 02:44:41 +00:00
if(PREF_ERROR != iError && GetMainContext() && url)
1998-03-28 02:44:41 +00:00
{
GetMainContext()->NormalGetUrl(url);
XP_FREE(url);
}
}
void CMainFrame::OnUpdateNetSearch(CCmdUI *pCmdUI)
{
pCmdUI->Enable(TRUE);
}
void CMainFrame::OnUpdateSecurity(CCmdUI *pCmdUI)
{
1998-06-22 21:19:46 +00:00
HG73537
1998-03-28 02:44:41 +00:00
MWContext *pContext = GetMainContext()->GetContext();
if(EDT_IS_EDITOR(pContext))
CGenericFrame::OnUpdateSecurity(pCmdUI);
else
{
int status = XP_GetSecurityStatus(pContext);
BOOL bHasSecurity = status == SSL_SECURITY_STATUS_ON_LOW || status == SSL_SECURITY_STATUS_ON_HIGH;
if(m_pCommandToolbar)
{
switch(status)
{
case SSL_SECURITY_STATUS_ON_LOW:
m_pCommandToolbar->ReplaceButtonBitmapIndex(ID_SECURITY, SECURE_BITMAP_INDEX);
break;
case SSL_SECURITY_STATUS_ON_HIGH:
m_pCommandToolbar->ReplaceButtonBitmapIndex(ID_SECURITY, SECURE_BITMAP_INDEX);
break;
default:
m_pCommandToolbar->ReplaceButtonBitmapIndex(ID_SECURITY, UNSECURE_BITMAP_INDEX);
break;
}
pCmdUI->Enable(TRUE);
}
else
pCmdUI->Enable(FALSE);
}
}
void CMainFrame::OnUpdateSecurityStatus(CCmdUI *pCmdUI)
{
1998-06-22 21:19:46 +00:00
HG73537
1998-03-28 02:44:41 +00:00
int status = XP_GetSecurityStatus(GetMainContext()->GetContext());
pCmdUI->Enable(status == SSL_SECURITY_STATUS_ON_LOW || status == SSL_SECURITY_STATUS_ON_HIGH);
}
void CMainFrame::OnUpdateViewCommandToolbar(CCmdUI *pCmdUI)
{
CGenericFrame::OnUpdateViewCommandToolbar(pCmdUI);
if(!IsEditFrame() && PREF_PrefIsLocked("browser.chrome.show_toolbar"))
pCmdUI->Enable(FALSE);
}
void CMainFrame::OnUpdateViewLocationToolbar(CCmdUI *pCmdUI)
{
CGenericFrame::OnUpdateViewLocationToolbar(pCmdUI);
if(!IsEditFrame() && PREF_PrefIsLocked("browser.chrome.show_url_bar"))
pCmdUI->Enable(FALSE);
}
void CMainFrame::OnUpdateViewCustomToolbar(CCmdUI *pCmdUI)
{
CGenericFrame::OnUpdateViewCustomToolbar(pCmdUI);
if(!IsEditFrame() && PREF_PrefIsLocked("browser.chrome.show_directory_buttons"))
pCmdUI->Enable(FALSE);
}
BOOL CMainFrame::OnCommand(UINT wParam,LONG lParam)
{
if(CGenericFrame::OnCommand(wParam, lParam))
return TRUE;
// Extract the command ID
UINT nID = LOWORD(wParam);
// IS it a command or a menu?
if ((nID == 0) || (LOWORD(lParam) != 0)) {
// Menu IDs cannot be 0
// For menus, the low-order word of lParam is zero
return FALSE;
}
// See if it was one of the items in the history list
if (IS_HISTORY_ID(nID) && GetMainContext()) {
// Make sure the command ID is consistent with the last
// selected menu item
histBuilder.Execute(nID);
return TRUE;
}
if (IS_SHORTCUT_ID(nID) && GetMainContext()) {
LoadShortcut(nID-FIRST_SHORTCUT_ID);
}
return FALSE; // no obe wanted it
}
void CMainFrame::OnInitMenuPopup(CMenu* pPopup, UINT nIndex, BOOL bSysMenu)
{
AfxLockTempMaps();
CGenericFrame::OnInitMenuPopup(pPopup,nIndex,bSysMenu);
if (!bSysMenu && pPopup) {
// if it contains Back has the first item and nIndex is not 0 then
// fill in the menu. nIndex would be 0 if it's a popup or if
// it's the first menu in the system
if (pPopup->GetMenuItemID(0) == ID_NAVIGATE_BACK && nIndex != 0){
// 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
if (pPopup->GetMenuState(FIRST_HISTORY_MENU_ID, MF_BYCOMMAND) == (UINT)-1)
BuildHistoryMenu(pPopup);
}
}
// This function must always be executed, so please, do NOT put any
// return statements in the above code!
AfxUnlockTempMaps();
}
void CMainFrame::GetMessageString( UINT nID, CString& rMessage ) const
{
// See if it's a history entry
if (nID >= FIRST_HISTORY_MENU_ID && nID <= LAST_HISTORY_MENU_ID) {
rMessage = histBuilder.GetURL(nID);
if (rMessage.IsEmpty())
{
ASSERT(FALSE);
}
} else {
CGenericFrame::GetMessageString( nID, rMessage );
}
}
void CMainFrame::OnMenuSelect(UINT nItemID, UINT nFlags, HMENU hSysMenu)
{
if (nFlags == 0xFFFF) {
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 && !IsEditFrame() ) {
int nCount;
UINT nCmdID;
// Menu is going away so destroy all the menu items we
// Now cleanup the history menu. We don't need to make any assumptions
// about the number of menu items, because there are no separators or
// pull-right sub-menus so we can tell by looking at the command IDs
HMENU hPopupMenu = FEU_FindSubmenu(hMenu, ID_NAVIGATE_BACK);
if (hPopupMenu) {
ASSERT(hPopupMenu);
nCount = ::GetMenuItemCount(hPopupMenu);
// It's easiest to do this by walking backwards over the menu items
for (int i = nCount - 1; i >= 0; i--) {
nCmdID = ::GetMenuItemID(hPopupMenu, i);
if (IS_HISTORY_ID(nCmdID))
VERIFY(::DeleteMenu(hPopupMenu, i, MF_BYPOSITION));
}
}
}
}
CGenericFrame::OnMenuSelect(nItemID, nFlags, hSysMenu);
}
void CMainFrame::BuildHistoryMenu(CMenu * pMenu)
{
ASSERT_VALID(pMenu);
if (!pMenu)
return;
histBuilder.Fill(pMenu->m_hMenu, MAX_MENU_ITEM_LENGTH, eFILLALL);
}
LRESULT CMainFrame::OnButtonMenuOpen(WPARAM wParam, LPARAM lParam)
{
HMENU hMenu = (HMENU) lParam;
UINT nCommand = (UINT) LOWORD(wParam);
if(nCommand == ID_NAVIGATE_BACK)
{
histBuilder.Fill(hMenu, MAX_MENU_ITEM_LENGTH, eFILLBACKWARD);
}
else if(nCommand == ID_NAVIGATE_FORWARD)
{
histBuilder.Fill(hMenu, MAX_MENU_ITEM_LENGTH, eFILLFORWARD);
}
else if(nCommand == ID_PLACES)
{
FillPlacesMenu(hMenu);
}
return 1;
}
void CMainFrame::FillPlacesMenu(HMENU hMenu)
{
CString str;
int bOK = PREF_NOERROR;
char * label;
for(int i = 0; bOK == PREF_NOERROR ; i++)
{
bOK = PREF_CopyIndexConfigString("toolbar.places.item",i,"label",&label);
if (bOK == PREF_NOERROR && label && label[0]) {
if (!strcmp(label,"-"))
AppendMenu(hMenu, MF_SEPARATOR, FIRST_SHORTCUT_ID+i, "");
else
AppendMenu(hMenu, MF_STRING, FIRST_SHORTCUT_ID+i, label);
XP_FREE(label);
}
}
}
//lpttt->szText can only hold 80 characters
#define MAX_TOOLTIP_CHARS 79
//status can only hold 1000 characters
#define MAX_STATUS_CHARS 999
LRESULT CMainFrame::OnFillInToolTip(WPARAM wParam, LPARAM lParam)
{
HWND hwnd = (HWND)wParam;
LPTOOLTIPTEXT lpttt = (LPTOOLTIPTEXT) lParam;
CToolbarButton *pButton = (CToolbarButton *)CWnd::FromHandle(hwnd);
UINT nCommand = pButton->GetButtonCommand();
const char * pTipText = pButton->GetToolTipText();
const char * pText = NULL;
if(nCommand == ID_NAVIGATE_BACK || nCommand == ID_NAVIGATE_FORWARD)
{
pText = FindHistoryToolTipText(nCommand);
}
else if(nCommand == ID_GO_HOME)
{
pText = theApp.m_pHomePage;
}
else if(nCommand == ID_FILE_PRINT)
{
if(GetActiveWinContext() && GetActiveWinContext()->IsGridCell())
pText = szLoadString(ID_PRINT_FRAME_SELECTED);
else if(GetMainContext() && GetMainContext()->IsGridParent())
pText = szLoadString(ID_PRINT_FRAME_NOSELECTION);
else
pText = szLoadString(ID_PRINT_PAGE);
}
if(pText == NULL || XP_STRCMP(pText, "") == 0)
strncpy(lpttt->szText, pTipText, MAX_TOOLTIP_CHARS);
else
strncpy(lpttt->szText, pText, MAX_TOOLTIP_CHARS);
return 1;
}
LRESULT CMainFrame::OnFillInToolbarButtonStatus(WPARAM wParam, LPARAM lParam)
{
UINT nCommand = LOWORD(wParam);
char *pStatus = (char*)lParam;
if(nCommand == ID_FILE_PRINT)
{
if(GetActiveWinContext() && GetActiveWinContext()->IsGridCell())
strncpy(pStatus, szLoadString(ID_PRINT_FRAME_SELECTED), MAX_STATUS_CHARS);
else if(GetMainContext() && GetMainContext()->IsGridParent())
strncpy(pStatus, szLoadString(ID_PRINT_FRAME_NOSELECTION), MAX_STATUS_CHARS);
else
strncpy(pStatus, szLoadString(ID_PRINT_PAGE), MAX_STATUS_CHARS);
}
return 1;
}
void CMainFrame::OnIncreaseFont()
{
CGenericFrame::OnIncreaseFont();
}
void CMainFrame::OnDecreaseFont()
{
CGenericFrame::OnDecreaseFont();
}
const char *CMainFrame::FindHistoryToolTipText(UINT nCommand)
{
CGenericFrame * pFrame = (CGenericFrame * )FEU_GetLastActiveFrame();
if(!pFrame)
return NULL;
CAbstractCX * pCX = pFrame->GetMainContext();
if (!pCX)
return NULL;
// Get the session history list
XP_List* pList = SHIST_GetList(pCX->GetContext());
// Get the pointer to the current history entry
History_entry* pCurrentDoc = pCX->GetContext()->hist.cur_doc_ptr;
XP_List *pCurrentNode = XP_ListFindObject(pList, pCurrentDoc);
if (!pCurrentNode)
return NULL;
XP_List *pNode = NULL;
if(nCommand == ID_NAVIGATE_FORWARD)
{
pNode = pCurrentNode->next;
}
else if(nCommand == ID_NAVIGATE_BACK)
{
pNode = pCurrentNode->prev;
}
if(pNode == NULL)
return NULL;
History_entry * pEntry = (History_entry*)pNode->object;
//if the page has no title, then the url is in the title field
return pEntry->title;
}
void CMainFrame::OnFlushCache()
{
FE_FlushCache();
}
void CMainFrame::OnOptionsViewToolBar()
{
LPNSTOOLBAR pIToolBar = NULL;
GetChrome()->QueryInterface(IID_INSToolBar, (LPVOID *) &pIToolBar );
if ( pIToolBar && pIToolBar->GetHWnd() ) {
if (::IsWindowVisible( pIToolBar->GetHWnd()) ) {
m_bShowToolbar = FALSE;
} else {
m_bShowToolbar = TRUE;
}
pIToolBar->Show( m_bShowToolbar );
pIToolBar->Release();
}
}
void CMainFrame::OnHelpMenu()
{
CGenericFrame::OnHelpMenu();
}
//
// Toggle the starter bar
//
void CMainFrame::OnOptionsShowstarterbuttons()
{
}
void CMainFrame::OnUpdateOptionsShowstarterbuttons(CCmdUI* pCmdUI)
{
}
// Post a close message on the approprate system command, can't let
// it handle or we GPF when closing the minimized main window.
void CMainFrame::OnSysCommand(UINT nID, LPARAM lParam)
{
if(nID == SC_CLOSE) {
PostMessage(WM_CLOSE);
return;
}
CGenericFrame::OnSysCommand(nID, lParam);
}
// No meaning in generic frame windows?
// The only possible thing to undo is typing in the URL/Location edit field
void CMainFrame::OnUpdateEditUndo(CCmdUI* pCmdUI)
{
pCmdUI->Enable(FALSE);
}