/* -*- 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.
 */

#ifndef __GenericFrame_H
#define __GenericFrame_H

// genframe.h : header file
//
#include "frameglu.h"
#include "htrdf.h"

#define WIN_ANIMATE_ICON_TIMER	4
#define MSG_TASK_NOTIFY			(WM_USER + 1)

// Longest menu item length for Composer's last-edited history submenus
#define MAX_MENU_ITEM_LENGTH	45

//cmanske: As much as I dislike assume fixed menu positions,
//  it infinitely simplifies finding submenus when building menus at runtime
enum {
    ED_MENU_FILE,
    ED_MENU_EDIT,
    ED_MENU_VIEW,
    ED_MENU_INSERT,
    ED_MENU_FORMAT,
    ED_MENU_TABLE,
    ED_MENU_TOOLS,
    ED_MENU_COMMUNICATOR,
    ED_MENU_HELP
};

// Load a URL into a new Browser window
// This simply creates the URL struct and calls CFE_CreateNewDocWindow
MWContext * wfe_CreateNavigator(char * pURL = NULL);
/////////////////////////////////////////////////////////////////////////////
// CGenericFrame frame

class CNSGenFrame : public CFrameWnd
{
	DECLARE_DYNCREATE(CNSGenFrame)
public:
	CNSNavFrame* GetDockedNavCenter();
	virtual BOOL AllowDocking();
protected:
	afx_msg void OnActivate( UINT nState, CWnd* pWndOther, BOOL bMinimized);
	DECLARE_MESSAGE_MAP()
};

class CGenericFrame : public CNSGenFrame, public CFrameGlue
{
	DECLARE_DYNCREATE(CGenericFrame)
protected:
	CGenericFrame();           // protected constructor used by dynamic creation
	BOOL m_bPreCreated;

	CTreeMenu *m_pBookmarksMenu;
	CTreeMenu *m_pFileBookmarkMenu;
	CTreeItemList *m_BookmarksGarbageList;
	CTreeItemList *m_OriginalBookmarksGarbageList;
	CBitmap *m_pBookmarkBitmap;
	CBitmap *m_pBookmarkFolderBitmap;
	CBitmap *m_pBookmarkFolderOpenBitmap;

	CTreeMenu* m_pCachedTreeMenu;
	int m_nCachedStartPoint;

	HT_Pane m_BookmarkMenuPane; // Added for Aurora (Dave Hyatt 2/12/97)

	void BuildBookmarkMenu(CTreeMenu* pMenu, HT_Resource pRoot, int nStart = 0); 
	
	void BuildFileBookmarkMenu(CTreeMenu* pMenu, HT_Resource pRoot);
	void BuildDirectoryMenu(CMenu* pMenu);
	
	//Returns TRUE if pFolder is changed, FALSE otherwise
	virtual BOOL FileBookmark(HT_Resource pFolder);
	void InitFileBookmarkMenu(void);
	void LoadBookmarkMenuBitmaps(void);

// Menu Map 
// Everything below is for the case where a frame wants to dynamically load its
// menus.  This is done to save user resources in Win16.
protected:
#ifdef _WIN32
	CMapPtrToPtr *m_pMenuMap;
#else
	CMapWordToPtr *m_pMenuMap;
#endif

	void AddToMenuMap(int nIndex, UINT nID);
	void LoadFrameMenu(CMenu *pPopup, UINT nIndex);
	void DeleteFrameMenu(HMENU hMenu);
	void DeleteMenuMapMenus(void);
	void DeleteMenuMapIDs(void);


public:
	CTreeMenu * GetBookmarksMenu(void) { return m_pBookmarksMenu; }
	void FinishMenuExpansion(HT_Resource pRoot); 


#ifdef XP_WIN32
	// jliu added the following to support CJK caption print
	virtual int16 GetTitleWinCSID();
#endif


public:
    // ugh this should really be private
    CGenericFrame  * m_pNext;  // the next frame in the theApp.m_pFrameList
    // Use only by editor to avoid double-prompting for saving changes
    //  when we call CGenericDoc::CanCloseFrame followed by frame's OnClose()
    BOOL m_bSkipSaveEditChanges;
	BOOL m_isClosing;
	BOOL m_DockOrientation;

//	CFrameGlue required overrides
public:
	virtual CFrameWnd *GetFrameWnd();
	virtual void UpdateHistoryDialog();
	void		 BuildHelpMenu(CMenu * pMenu);

    // override this only if you want to
    virtual void OnConstructWindowMenu ( CMenu * pMenu );
	void		OnSaveConfiguration();

// Attributes
public:
	// Used for bookmark menu items and history menu items
	int				m_nBookmarkItems;	// current number of bookmark menu items
	int				m_nFileBookmarkItems;
#ifdef XP_WIN32
	CMapPtrToPtr*	m_pSubmenuMap;  	// HMENU -> BM_Entry*
#else
	CMapWordToPtr*	m_pSubmenuMap;  	// HMENU -> BM_Entry*
#endif

#ifdef XP_WIN32
	CMapPtrToPtr*	m_pFileSubmenuMap;  	// HMENU -> BM_Entry*
#else
	CMapWordToPtr*	m_pFileSubmenuMap;  	// HMENU -> BM_Entry*
#endif

    CMapWordToPtr*	m_pHotlistMenuMap;  // command ID -> URL and
										// command ID -> History_Entry*

//	We may or may not allow the window to resize.
private:
	BOOL m_bCanResize;
    CRect m_crMinMaxRect;
	BOOL m_bZOrderLocked;
	BOOL m_bBottommost;
	BOOL m_bDisableHotkeys;
	DWORD m_wAddedExStyles;
	DWORD m_wRemovedExStyles;

#ifdef XP_WIN32
	// jliu added the following to support CJK caption print
	void SetupCapFont( int16 csid, BOOL force = FALSE );
	UINT  capStyle;
	BOOL  m_bActive;
	CFont hCapFont;
	int16 m_csid;				// WinCSID of current document
#endif

	HWND  m_hPopupParent;
	BOOL  m_bConference;


public:
	void EnableResize(BOOL bEnable = TRUE);
	BOOL CanResize(){ return m_bCanResize; }
	void SetZOrder(BOOL bZLock = FALSE, BOOL bBottommost = FALSE);
	BOOL IsZOrderLocked(){ return m_bZOrderLocked; }
	BOOL IsBottommost(){ return m_bBottommost; }
	void DisableHotkeys(BOOL bDisable = FALSE);
	BOOL HotkeysDisabled(){ return m_bDisableHotkeys; }
#ifdef WIN32
	void SetExStyles(DWORD wAddedExStyles, DWORD wRemovedExStyles);
	DWORD GetRemovedExStyles();
#endif
	void SetAsPopup(HWND hPopupParent);

// Operations
public:

//	Some static public data, initialized in genframe.cpp
//  used to offset frame windows from one another
    static int      m_FirstFrame;

// Overrides
	// ClassWizard generated virtual function overrides
	//{{AFX_VIRTUAL(CGenericFrame)
	public:
    virtual void RecalcLayout( BOOL bNotify = TRUE );
    virtual BOOL PreTranslateMessage(MSG *pMsg);
    virtual BOOL PreCreateWindow(CREATESTRUCT& cs);
	virtual BOOL OnCmdMsg(UINT nID, int nCode, void* pExtra, AFX_CMDHANDLERINFO* pHandlerInfo);
	protected:
	virtual BOOL OnCommand(WPARAM wParam, LPARAM lParam);
	//}}AFX_VIRTUAL

public:
    // assorted people can cause us to open windows.  Make these public so we
    //   can try to localize the functionality
	afx_msg void OnOpenMailWindow();
	afx_msg void OnOpenInboxWindow();
	afx_msg void OnOpenNewsWindow();
	afx_msg void OnToolsWeb();
    afx_msg void OnOpenComposerWindow(); // Implemented in edframe.cpp


	afx_msg void OnToggleEncoding(UINT nID);
	afx_msg void OnUpdateEncoding(CCmdUI* pCmdUI);

// Implementation
protected:

	virtual ~CGenericFrame();
	virtual void GetMessageString( UINT nID, CString& rMessage ) const;

	// Generated message map functions
    afx_msg void OnEnterIdle(UINT nWhy, CWnd* pWho );
    afx_msg void OnInitMenuPopup(CMenu * pPopup, UINT nIndex, BOOL bSysMenu);
	afx_msg void OnMenuSelect( UINT nItemID, UINT nFlags, HMENU hSysMenu );
	afx_msg void OnMeasureItem(int nIDCtl, LPMEASUREITEMSTRUCT lpMeasureItemStruct);
	afx_msg LRESULT OnMenuChar( UINT nChar, UINT nFlags, CMenu* pMenu );
	afx_msg LRESULT OnSetMessageString(WPARAM wParam, LPARAM lParam);
    afx_msg void OnClose();
	afx_msg void OnDestroy();
	afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);
	afx_msg void OnSysColorChange();
	afx_msg BOOL OnQueryNewPalette();
	afx_msg void OnPaletteChanged(CWnd* pFocusWnd);

	afx_msg void OnNewFrame();
	afx_msg void OnUpdateNewFrame(CCmdUI* pCmdUI);
	afx_msg void OnFileOpenurl();
	afx_msg void OnUpdateFileOpenurl(CCmdUI* pCmdUI);
	afx_msg void OnHotlistAddcurrenttohotlist();
	afx_msg void OnUpdateHotlistAddcurrenttohotlist(CCmdUI* pCmdUI);
	afx_msg void OnHotlistAddcurrenttotoolbar();
	afx_msg void OnUpdateHotlistAddcurrenttotoolbar(CCmdUI* pCmdUI);
	afx_msg void OnUpdateOpenMailWindow(CCmdUI* pCmdUI);
	afx_msg void OnUpdateOpenNewsWindow(CCmdUI* pCmdUI);
	afx_msg void OnUpdateTaskbar(CCmdUI *pCmdUI);
	afx_msg void OnAbout();
    afx_msg void OnDocumentTop();
    afx_msg void OnDocumentBottom();
	afx_msg void OnFishCam(); 
    afx_msg void OnShowBookmarkWindow();
    afx_msg void OnShowAddressBookWindow();
#ifdef JAVA
	afx_msg void OnToggleJavaConsole();
	afx_msg void OnUpdateJavaConsole(CCmdUI* pCmdUI);
#endif
	afx_msg void OnSecurity();
	afx_msg void OnUpdateSecurity(CCmdUI *pCmdUI);
	afx_msg void OnViewCommandToolbar();
	afx_msg void OnUpdateViewCommandToolbar(CCmdUI* pCmdUI);
	afx_msg void OnViewLocationToolbar();
	afx_msg void OnUpdateViewLocationToolbar(CCmdUI* pCmdUI);
	afx_msg void OnViewCustomToolbar();
	afx_msg void OnUpdateViewCustomToolbar(CCmdUI* pCmdUI);
	afx_msg void OnViewNavCenter();
	afx_msg void OnUpdateViewNavCenter(CCmdUI* pCmdUI);
	afx_msg void OnUpdatePlaces(CCmdUI* pCmdUI);
	afx_msg void OnUpdateCustomizeToolbar(CCmdUI *pCmdUI);
	afx_msg void OnCustomizeToolbar();
	afx_msg void OnIncreaseFont();
	afx_msg void OnDecreaseFont();
	afx_msg void OnGoHistory();
	afx_msg void OnFileMailNew();
	afx_msg void OnTaskbar();
	afx_msg void OnUpdateLiveCall(CCmdUI *pCmdUI);
	afx_msg void OnLiveCall();
	afx_msg void OnCalendar();
	afx_msg void OnIBMHostOnDemand();
 	afx_msg void OnNetcaster();
	afx_msg void OnAim();
    afx_msg void OnDisplayPreferences();
    afx_msg void OnPrefsGeneral();
    afx_msg void OnPrefsMailNews();
    afx_msg void OnPrefsNetwork();
    afx_msg void OnPrefsSecurity();
	afx_msg void OnAnimationBonk();
	afx_msg void OnUpdateFileRoot(CCmdUI* pCmdUI);
	afx_msg void OnGoOffline();
	afx_msg void OnUpdateGoOffline(CCmdUI* pCmdUI);
	afx_msg void OnDoneGoingOffline();
#ifdef FORTEZZA
    afx_msg void OnStartFortezzaCard();
    afx_msg void OnStartFortezzaChange();
    afx_msg void OnStartFortezzaView();
    afx_msg void OnDoFortezzaInfo();
    afx_msg void OnDoFortezzaLog();
#endif
    afx_msg void OnFrameExit();
	afx_msg void OnSetFocus(CWnd* pOldWnd);
	afx_msg void OnWindowPosChanged(WINDOWPOS* lpwndpos);
	afx_msg void OnWindowPosChanging(WINDOWPOS* lpwndpos);
	afx_msg void OnSize(UINT nType, int cx, int cy);
	afx_msg void OnSizing(UINT nSide, LPRECT lpRect);
	afx_msg void OnNextWindow();
    afx_msg void OnSaveOptions();
    afx_msg LRESULT OnFindReplace(WPARAM wParam, LPARAM lParam);
	afx_msg LRESULT OnHelpMsg(WPARAM wParam, LPARAM lParam);
	afx_msg void OnMove(int x, int y);
	afx_msg void OnFilePageSetup();
	afx_msg void OnGetMinMaxInfo(MINMAXINFO FAR* lpMMI);
	afx_msg LONG OnTaskNotify(WPARAM wParam, LPARAM lParam);
	afx_msg void OnShowAdvanced();
	afx_msg void OnUpdateShowAdvanced( CCmdUI *pCmdUI );
    afx_msg void OnHelpMenu();
    afx_msg void OnLDAPSearch();
	afx_msg void OnPageFromWizard();
#ifdef EDITOR
	afx_msg void OnEditNewBlankDocument();
    afx_msg void OnActivateSiteManager();
    afx_msg void OnUpdateActivateSiteManager(CCmdUI* pCmdUI);
    // Response to Registered messages to detect 1st instance
    afx_msg LRESULT OnNetscapeGoldIsActive(WPARAM wParam, LPARAM lParam);
    // Response to Registered messages to open Editor or Navigator
    //  from attempted 2nd instance or Site Manager
    afx_msg LRESULT OnOpenEditor(WPARAM wParam, LPARAM lParam);
    afx_msg LRESULT OnOpenNavigator(WPARAM wParam, LPARAM lParam);
#ifdef XP_WIN32
    afx_msg LRESULT OnSiteMgrMessage(WPARAM wParam, LPARAM lParam);
#endif
    // These are hooked up to menu commands...
    afx_msg void OnNavigateToEdit();
    afx_msg void OnEditFrame();
    // ...and call this after setting appropriate m_iLoadUrlEditorState
    void OpenEditorWindow(int iStyle);
    
    // This is used for all of above - prevent interaction
    //  with menus when no context, edit buffer, etc exists
    afx_msg void OnUpdateCanInteract(CCmdUI* pCmdUI);
	afx_msg void OnUpdateEditFrame(CCmdUI* pCmdUI);
    afx_msg void OnEditNewDocFromTemplate();
#endif


#ifdef _WIN32
    afx_msg LONG OnHackedMouseWheel(WPARAM wParam, LPARAM lParam);
	// jliu added the following to support CJK caption print
	afx_msg void OnNcPaint();
	afx_msg BOOL OnNcActivate( BOOL );
	afx_msg LRESULT OnSetText(WPARAM wParam, LPARAM lParam);
	afx_msg LRESULT OnSettingChange(WPARAM, LPARAM);
#endif
	afx_msg void OnActivate( UINT nState, CWnd* pWndOther, BOOL bMinimized);
#ifdef DEBUG_WHITEBOX
	afx_msg void OnWhiteBox();
#endif
	DECLARE_MESSAGE_MAP()

#ifdef EDITOR
public:
    // Load a URL into a new edit window,
    //  OR the existing window if bNewWindow is FALSE
    //     (used only when Composer is first window)
    void LoadUrlEditor(char * pURL = NULL,
                       BOOL bNewWindow = TRUE,
                       int iLoadStyle = 0, 
                       MWContext * pCopyHistoryContext = NULL);

    // Called from Edit view only after CheckAndSaveDocument
    void OpenNavigatorWindow(MWContext * pMWContext);

    // Currently used only when canceling an already-loaded URL
    //   in editor and user doesn't want to save to disk
    //   (replaces editor with a browser with the same URL)
	void EditToNavigate(MWContext * pEditContext, BOOL bNewDocument );
    
    // Put all Composer-only code here - called only from CGenericFrame::OnMenuSelect()
    void OnMenuSelectComposer(UINT nItemID, UINT nFlags, HMENU hSysMenu);
    BOOL m_bCloseFrame;

#endif

	virtual void RefreshNewEncoding(int16 csid, BOOL bIgnore=TRUE);
};

#ifdef EDITOR
// Global helpers so CEditFrame and CComposeFrame (mail message) can share 
//   dynamic menu functionality
BOOL edt_GetMessageString(CView *pView, UINT MenuId, CString& Message);
BOOL edt_IsEditorDynamicMenu(WPARAM wParam);
#endif

CGenericFrame *wfe_FrameFromXPContext(MWContext * pXPCX);

static UINT NEAR WM_FINDREPLACE = ::RegisterWindowMessage(FINDMSGSTRING);
static UINT NEAR WM_HELPMSG = ::RegisterWindowMessage(HELPMSGSTRING);
#endif
