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

#include "stdafx.h"
#include "winproto.h"
#include "template.h"
#include "netsvw.h"
#include "mainfrm.h"
#ifdef MOZ_MAIL_NEWS
#include "mailfrm.h"
#include "compfrm.h"
#endif /* MOZ_MAIL_NEWS */
#include "prefapi.h"
#include "cxwin.h"

#ifdef AFX_CORE2_SEG
#pragma code_seg(AFX_CORE2_SEG)
#endif

#ifdef _DEBUG
#undef THIS_FILE
static char BASED_CODE THIS_FILE[] = __FILE__;
#endif

IMPLEMENT_DYNAMIC(CGenericDocTemplate, CDocTemplate)
IMPLEMENT_DYNAMIC(CNetscapeDocTemplate, CGenericDocTemplate)
#ifdef EDITOR
IMPLEMENT_DYNAMIC(CNetscapeEditTemplate, CGenericDocTemplate)
#endif // EDITOR
#ifdef MOZ_MAIL_NEWS
IMPLEMENT_DYNAMIC(CNetscapeComposeTemplate, CGenericDocTemplate)
IMPLEMENT_DYNAMIC(CNetscapeTextComposeTemplate, CGenericDocTemplate)
IMPLEMENT_DYNAMIC(CNetscapeAddrTemplate, CGenericDocTemplate)
#endif /* MOZ_MAIL_NEWS */
#ifndef _AFXDLL
#define new DEBUG_NEW  // MSVC Debugging new...goes to regular new in release mode
#endif

//CLM:
//  Set TRUE when starting an Editor
//  with curent Browser document
//  (CGenframe::OnNavigateToEdit)
BOOL wfe_bUseLastFrameLocation = FALSE;
// The last active frame before creating a new one
CGenericFrame *wfe_pLastFrame = NULL;

/////////////////////////////////////////////////////////////////////////////
// construction/destruction
CGenericDocTemplate::CGenericDocTemplate(UINT nIDResource,
    CRuntimeClass* pDocClass,
    CRuntimeClass* pFrameClass, CRuntimeClass* pViewClass)
	: CDocTemplate(nIDResource, pDocClass, pFrameClass, pViewClass)
{
    m_nUntitledCount = 0;
    m_hMenuShared = NULL;
    m_hAccelTable = NULL;
    m_bHideTitlebar = FALSE;
    m_bDependent = FALSE;
	m_bPopupWindow = FALSE;
	m_hPopupParent = NULL;
    m_bBorder = TRUE;
}

CGenericDocTemplate::~CGenericDocTemplate()
{
    //  Delete shared components
    if(m_hMenuShared != NULL)   {
	::DestroyMenu(m_hMenuShared);
    }
    if(m_hAccelTable != NULL)   {
	::FreeResource((HGLOBAL)m_hAccelTable);
    }
}


/////////////////////////////////////////////////////////////////////////////
//  CNetscapeDocTemplate attributes

POSITION CGenericDocTemplate::GetFirstDocPosition() const  {
    return m_docList.GetHeadPosition();
}

CDocument *CGenericDocTemplate::GetNextDoc(POSITION& rPos) const   {
    return(CDocument *)m_docList.GetNext(rPos);
}


/////////////////////////////////////////////////////////////////////////////
//  CNetscapeDocTemplate document management (list of open docs)

void CGenericDocTemplate::AddDocument(CDocument *pDoc) {
    CDocTemplate::AddDocument(pDoc);
    m_docList.AddTail(pDoc);
}

void CGenericDocTemplate::RemoveDocument(CDocument *pDoc)  {
    CDocTemplate::RemoveDocument(pDoc);
    m_docList.RemoveAt(m_docList.Find(pDoc));
}

/////////////////////////////////////////////////////////////////////////////
//  CNetscapeDocTemplate misc

BOOL CGenericDocTemplate::GetDocString(CString& rString, enum DocStringIndex index) const
{
    switch(index) {
    case CDocTemplate::windowTitle:
	rString = "Netscape Navigator";
	break;
    case CDocTemplate::docName:
	rString = "Netscape";
	break;
    case CDocTemplate::fileNewName:
	rString = "Hypertext";
	break;
    case CDocTemplate::filterName:
	rString = szLoadString(IDS_SOURCE_FILETYPE);
	break;
    case CDocTemplate::filterExt:
	rString = ".htm";
	break;
    case CDocTemplate::regFileTypeId:
	rString = "NetscapeMarkup";
	break;
    case CDocTemplate::regFileTypeName:
	rString = "Netscape Hypertext Document";
	break;
    default:
	return(FALSE);
    }

    return(TRUE);
}

void CGenericDocTemplate::SetDefaultTitle(CDocument* pDocument)
{
    CString strDocName;
    if (!GetDocString(strDocName, CDocTemplate::docName) ||
	strDocName.IsEmpty())
    {
	// use generic 'untitled'
	VERIFY(strDocName.LoadString(AFX_IDS_UNTITLED));
    }
    pDocument->SetTitle(strDocName);
}

//
// Add the newly created frame to the end of theApp's m_pFrameList
void 
WFE_AddNewFrameToFrameList(CGenericFrame * pFrame)
{

    //  If the application doesn't have a main frame window yet,
    //      this frame is it.
    if(theApp.m_pFrameList == NULL) {
	theApp.m_pFrameList = pFrame;
	pFrame->m_pNext = NULL;
    }
    //  Otherwise, we need to add this to the list of frame windows
    else {
	CGenericFrame *CMFp = theApp.m_pFrameList;
	
	while(CMFp->m_pNext != NULL) {
	    CMFp = CMFp->m_pNext;
	}
	
	//  Our next is NULL.  Set it to the new frame.
	CMFp->m_pNext = pFrame;
	pFrame->m_pNext = NULL;
	
    }

}


CDocument *CGenericDocTemplate::OpenDocumentFile(const char *pszPathName, 
												 BOOL bMakeVisible)
{
    //CLM: Save last active frame for InitialUpdateFrame location mangling
    //     We want either browser or editor frame only
	CFrameWnd* pFrameWnd = FEU_GetLastActiveFrame(MWContextBrowser, TRUE);
	if (pFrameWnd && pFrameWnd->IsKindOf(RUNTIME_CLASS(CGenericFrame)))
		wfe_pLastFrame = (CGenericFrame*)pFrameWnd;
	else wfe_pLastFrame = NULL;
    //Don't use restricted target windows to keep them from
    //being used as size and position references.
    if (wfe_pLastFrame && wfe_pLastFrame->GetMainContext() && 
		    wfe_pLastFrame->GetMainContext()->GetContext() &&
		    wfe_pLastFrame->GetMainContext()->GetContext()->restricted_target)
		wfe_pLastFrame = NULL;

    //  Create the document
    CDocument *pDocument = CreateNewDocument();
    if(pDocument == NULL)   {
	return(NULL);
    }
    
    //  Create the frame, several steps
    BOOL bAutoDelete = pDocument->m_bAutoDelete;
    pDocument->m_bAutoDelete = FALSE;   //  don't destroy if something goes wrong
    
    //  We do a nasty manual frame creation technique here.
    //  Don't try this at home, kids.
    CCreateContext CCC;
    CCC.m_pCurrentFrame = NULL; //  nothing to base on
    CCC.m_pCurrentDoc = pDocument;  //  yes, we have doc
    CCC.m_pNewViewClass = m_pViewClass; //  whatever
    CCC.m_pNewDocTemplate = this;   //  we are the template, duh    
    
    CFrameWnd *pFrame = (CFrameWnd *)m_pFrameClass->CreateObject();
	CRuntimeClass* pRunTimeClass = GetRuntimeClass();

#ifdef MOZ_MAIL_NEWS
	ASSERT(pRunTimeClass);
	if (!stricmp("CNetscapeComposeTemplate",pRunTimeClass->m_lpszClassName))
  	    ((CComposeFrame *) pFrame)->SetHtmlMode(TRUE);
#endif /* MOZ_MAIL_NEWS */
    pDocument->m_bAutoDelete = bAutoDelete;
    if(pFrame == NULL)  {
	delete pDocument;   //  explicit delete upon error
	return(NULL);
    }

    //Keep dependent windows off of the Win95/NT taskbar
#ifdef WIN32    
    if (m_bDependent)
	((CGenericFrame*)pFrame)->SetExStyles(WS_EX_TOOLWINDOW, 0);
    if (m_bHideTitlebar || theApp.m_bSuperKioskMode)
	((CGenericFrame*)pFrame)->SetExStyles(0, WS_EX_CLIENTEDGE);
#endif
	
	if(m_bPopupWindow)
		((CGenericFrame*)pFrame)->SetAsPopup(m_hPopupParent);

	m_bPopupWindow = FALSE;
	m_hPopupParent = NULL;

    //  Create the new frame from some resources
	if (m_bHideTitlebar || theApp.m_bSuperKioskMode){	
		// ZZZ: Removed WS_CLIPCHILDREN because it was interfering with the frame
		// gride edge tracking code. Troy
		if(!pFrame->LoadFrame(m_nIDResource, WS_CLIPSIBLINGS |
		WS_OVERLAPPED, NULL, &CCC))   {
			delete pDocument;   //  explicit delete upon error
			return(NULL);
		}   
	}else{
		// ZZZ: Removed WS_CLIPCHILDREN because it was interfering with the frame
		// gride edge tracking code. Troy

		if(!pFrame->LoadFrame(m_nIDResource, WS_CLIPSIBLINGS |
		WS_OVERLAPPEDWINDOW, NULL, &CCC))   {
			delete pDocument;   //  explicit delete upon error
			return(NULL);
		}
	}

    if(m_bHideTitlebar || theApp.m_bSuperKioskMode) {
	long lStyles = GetWindowLong(pFrame->GetSafeHwnd(), GWL_STYLE); 
	lStyles |= WS_SYSMENU | WS_GROUP | WS_TABSTOP;
	lStyles &= ~WS_CAPTION;
	SetWindowLong(pFrame->GetSafeHwnd(), GWL_STYLE, lStyles);
    }

    if(theApp.m_ParentAppWindow) {
	SetParent(pFrame->GetSafeHwnd(), theApp.m_ParentAppWindow);
	theApp.m_bChildWindow = TRUE;
	theApp.m_ParentAppWindow = 0;
    }

    //  Here's some hack to get some context information, and activate
    //      a view
    if(pFrame->GetActiveView() == NULL) {
	CView *pView = (CView *)pFrame->
	    GetDescendantWindow(AFX_IDW_PANE_FIRST);
	if(pView != NULL && pView->IsKindOf(RUNTIME_CLASS(CView)))  {
	    pFrame->SetActiveView(pView);
	}
    }

    // add to the global frame list
	if (pFrame->IsKindOf(RUNTIME_CLASS(CGenericFrame))) {
	    WFE_AddNewFrameToFrameList((CGenericFrame *) pFrame);
    }
    //  Wether or not to create a new or existing document is determined
    //      via the path name passed in.
    if(pszPathName == NULL) {
	//  Create a new document - with default document name
	UINT nUntitled = m_nUntitledCount + 1;
	
	CString strDocName;
	if(GetDocString(strDocName, CDocTemplate::docName) &&
	    !strDocName.IsEmpty())  {
	    char szNum[16];
	    wsprintf(szNum, "%d", nUntitled);
	    strDocName += szNum;
	}
	else    {
	    //  use generic 'untitiled' - ignore untitled count
	    VERIFY(strDocName.LoadString(AFX_IDS_UNTITLED));
	}
	pDocument->SetTitle(strDocName);
	
	if(bMakeVisible && !pDocument->OnNewDocument()) {
	    //  user has been alerted to what failed in OnNewDocument
	    pFrame->DestroyWindow();
	    return(NULL);
	}
	
	//  it worked, bump up the untitiled count
	m_nUntitledCount++;
    }
    else    {
	//  Open an existing document
	BeginWaitCursor();
	if(!pDocument->OnOpenDocument(pszPathName)) {
	    //  user has been alerted to what failed in OnOpenDocument
	    pFrame->DestroyWindow();
	    EndWaitCursor();
	    return(NULL);
	}
	pDocument->SetPathName(pszPathName);
	EndWaitCursor();
    }

	InitialUpdateFrame(pFrame, pDocument, bMakeVisible);
	
	return pDocument;
}





/////////////////////////////////////////////////////////////////////////////
//  CNetscapeDocTemplate commands
CNetscapeDocTemplate::CNetscapeDocTemplate(UINT nIDResource,
    CRuntimeClass* pDocClass,
    CRuntimeClass* pFrameClass, CRuntimeClass* pViewClass)
	: CGenericDocTemplate(nIDResource, pDocClass, pFrameClass, pViewClass)
{
    HINSTANCE hInst = AfxGetResourceHandle();
    m_hMenuShared = ::LoadMenu(hInst, MAKEINTRESOURCE(nIDResource));
    m_hAccelTable = ::LoadAccelerators(hInst, MAKEINTRESOURCE(nIDResource));
}

// Common stuff for CNetscapeDocTemplate and CNetscapeEditTemplate
void wfe_InitialUpdateFrame(CFrameWnd* pFrame, 
			    CDocument* pDocument, 
						BOOL bMakeVisible)      
{
	
    WINDOWPLACEMENT wp;
    FEU_InitWINDOWPLACEMENT(pFrame->GetSafeHwnd(), &wp);

    BOOL bSetLocation = FALSE;
    int screenX = sysInfo.m_iScreenWidth;
    int screenY = sysInfo.m_iScreenHeight;
	int16 iLeft,iRight,iTop,iBottom;
	PREF_GetRectPref("browser.window_rect", &iLeft, &iTop, &iRight, &iBottom);

    if ( wfe_pLastFrame ) {
        bSetLocation = TRUE;

        int captionY = ::GetSystemMetrics(SM_CYCAPTION);
        int titleY = ::GetSystemMetrics(SM_CYSIZE) + ::GetSystemMetrics(SM_CYFRAME);

        // Get placement and location of last frame
        wfe_pLastFrame->GetWindowPlacement(&wp);
        CRect rectLastFrame = wp.rcNormalPosition;

        // Impose lower and upper limits on frame size
        if( rectLastFrame.Width() < 300 ){
	        rectLastFrame.right = rectLastFrame.left + 300;
        }
        if( rectLastFrame.Height() < 300 ){
	        rectLastFrame.bottom = rectLastFrame.top + 300;
        }
        if( rectLastFrame.Width() > screenX ){
	        rectLastFrame.right = rectLastFrame.left + screenX;
        }
        if( rectLastFrame.Height() > screenY ){
	        rectLastFrame.bottom = rectLastFrame.top + screenY;
        }

        if ( wfe_bUseLastFrameLocation ) {
	        // Keep same location and size as last frame
	        // Good for just one new window!
	        wfe_bUseLastFrameLocation = FALSE;
        } else {
	        // Cascade: Start down and to the right of current frame
	        wp.rcNormalPosition.left += titleY;
	        wp.rcNormalPosition.top  += titleY;
        }

        // Set the right and bottom
        wp.rcNormalPosition.right = 
	        wp.rcNormalPosition.left + rectLastFrame.Width();
        wp.rcNormalPosition.bottom = 
	        wp.rcNormalPosition.top + rectLastFrame.Height();

        //  If we go off the screen to the right or to the bottom and
        //    pulling us back to 0,0 would make us fit on the screen then
        //    pull the origin back to 0,0
        //  But only if these coordinates are not the same as those on 
        //    the command line.
        if( wp.rcNormalPosition.right > screenX &&
	        rectLastFrame.Width() < screenX     &&
	        wp.rcNormalPosition.left != theApp.m_iCmdLnX ) {

	        wp.rcNormalPosition.left = 0;
	        wp.rcNormalPosition.right = rectLastFrame.Width();
        }

        if( wp.rcNormalPosition.bottom > screenY &&
	        rectLastFrame.Height() < screenY  &&
	        wp.rcNormalPosition.top != theApp.m_iCmdLnY ) {

	        wp.rcNormalPosition.top = 0;
	        wp.rcNormalPosition.bottom = rectLastFrame.Height();
        }
	        
        // Preserve International character set
        ((CGenericFrame*)pFrame)->m_iCSID = (wfe_pLastFrame)->m_iCSID;
    }
    else if (iLeft != -1) {
        bSetLocation = TRUE;
        int32 prefInt;
        PREF_GetIntPref("browser.wfe.show_value",&prefInt);
        wp.showCmd = CASTINT(prefInt);

        if(theApp.m_bInInitInstance)  {
	        //  Any frames created while in init instance must use the style passed therein.
	        //  See WinExec and how we don't pay attention to it....
	        //  We can get away with this only if we weren't told to show up normal.
	        if(theApp.m_iFrameCmdShow != SW_SHOWNORMAL) {
	        wp.showCmd = theApp.m_iFrameCmdShow;
	        }
        }

        // We don't have a "last frame" -- probably 1st time through
        // Still do range checking in case junk was saved in preferences
        wp.rcNormalPosition.left = max( 0, min(screenX-300, iLeft) );
        wp.rcNormalPosition.top  = max( 0, min(screenY-300, iTop) );
        wp.rcNormalPosition.right  = max( 300, min(screenX, iRight) );
        wp.rcNormalPosition.bottom = max( 300, min(screenY,  iBottom) );
    }
    else if( iLeft == -1) {
        // Bug 48772. Set window size if never set before
        bSetLocation = TRUE;
        wp.showCmd = SW_SHOWNORMAL;
        wp.rcNormalPosition.left = 0;
        wp.rcNormalPosition.top  = 0;
        wp.rcNormalPosition.right  = min(632, screenX);
        wp.rcNormalPosition.bottom = min(480, screenY);
    }

    if ( bSetLocation ) {
        // Use the modified position info for new window,
        //  but set other flags first
        if (wp.showCmd == SW_SHOWMINIMIZED) {
	        //  Can't do this conversion without first checking to see what is right and wrong
	        //      when paying attention to nCmdShow (winmain).
	        if(theApp.m_bInInitInstance == FALSE || theApp.m_iFrameCmdShow == SW_SHOWNORMAL)   {
	        wp.showCmd = SW_RESTORE;
	        }
        }

        //  We're not supposed to make visible, but is it visible (someone already handled up stream).
        if(bMakeVisible == FALSE && pFrame->IsWindowVisible() == FALSE) {
	        //      Don't show if told not to.
	        //      We do allow placement however, for size saving on close.
	        wp.showCmd = SW_HIDE;
        }
	if (theApp.m_bSuperKioskMode)
		wp.showCmd = SW_SHOWMAXIMIZED;

        // Note: if last frame was maximized, new frame will be also
        pFrame->SetWindowPlacement(&wp);
    }

	if (bMakeVisible && pDocument && pFrame) {
		if (theApp.m_pFrameList == pFrame) {
			switch (theApp.m_nCmdShow) {
			case SW_SHOWMINIMIZED:
			case SW_HIDE:
			case SW_SHOWMINNOACTIVE:
			case SW_MINIMIZE:
				pFrame->ActivateFrame(theApp.m_nCmdShow);
				// So InitialUpdateFrame doesn't do this again
				bMakeVisible = FALSE;
			default:
				break;
			}
		} else {
			pFrame->ActivateFrame(SW_SHOW);
			bMakeVisible = FALSE;
		}
	}
}

void CNetscapeDocTemplate::InitialUpdateFrame(CFrameWnd* pFrame, 
											  CDocument* pDocument, 
											  BOOL bMakeVisible)    
{
    // Window positioning code shared by Editor and Browser
    wfe_InitialUpdateFrame( pFrame, pDocument, bMakeVisible );
	//      Call the base.
	CDocTemplate::InitialUpdateFrame(pFrame, pDocument, bMakeVisible);
}


#ifdef EDITOR
// CLM: Copy of CNetscapeDocTemplate -- used by CNetscapeEditView
// MUST BE MAINTAINED TO MATCH ABOVE FUNCTIONS!
////////////////////////////////////////////////////////////////////////////////
//  CNetscapeEditTemplate commands
CNetscapeEditTemplate::CNetscapeEditTemplate(UINT nIDResource,
    CRuntimeClass* pDocClass,
    CRuntimeClass* pFrameClass, CRuntimeClass* pViewClass)
	: CGenericDocTemplate(nIDResource, pDocClass, pFrameClass, pViewClass)
{
}

void CNetscapeEditTemplate::InitialUpdateFrame(CFrameWnd *pFrame, 
											   CDocument *pDocument, 
											   BOOL bMakeVisible)
{
    // Window positioning code shared by Editor and Browser
    wfe_InitialUpdateFrame( pFrame, pDocument, bMakeVisible );
	//      Call the base.
	CDocTemplate::InitialUpdateFrame(pFrame, pDocument, /*bMakeVisible */ TRUE );
}
#endif // EDITOR

#ifdef MOZ_MAIL_NEWS
/////////////////////////////////////////////////////////////////////////////
//  CNetscapeComposeTemplate commands
CNetscapeComposeTemplate::CNetscapeComposeTemplate(UINT nIDResource,
    CRuntimeClass* pDocClass,
    CRuntimeClass* pFrameClass, CRuntimeClass* pViewClass)
	: CGenericDocTemplate(nIDResource, pDocClass, pFrameClass, pViewClass)
{
    // for the compose window we will use shared menus and accelerators but
    //  we will not actually load them until the first compose window is created
}

void CNetscapeComposeTemplate::InitialUpdateFrame(CFrameWnd *pFrame, 
												  CDocument *pDocument, 
												  BOOL bMakeVisible)    
{
	if (pDocument && pFrame) {
	    // tell the frame what type of widgets to create
		((CComposeFrame *) pFrame)->SetType(MWContextMessageComposition);

		// Pass win_csid to ComposeFrame, eventually ComposeEdit will use
		// it to select font

		((CComposeFrame *) pFrame)->SetCSID(win_csid);      
		//  Activate the frame but do not show it until we get a call to 
		//    FE_RaiseMailCompositionWindow() --- this allows us to use
		//    the composition frame as a context to quote messages with and
		//    such before loading exchange without flashing the netscape compose
		//    window up
		pFrame->ActivateFrame(SW_RESTORE);
    }
	CDocTemplate::InitialUpdateFrame(pFrame, pDocument, FALSE);
}

/////////////////////////////////////////////////////////////////////////////
//  CNetscapeTextComposeTemplate commands
CNetscapeTextComposeTemplate::CNetscapeTextComposeTemplate(UINT nIDResource,
    CRuntimeClass* pDocClass,
    CRuntimeClass* pFrameClass, CRuntimeClass* pViewClass)
	: CGenericDocTemplate(nIDResource, pDocClass, pFrameClass, pViewClass)
{
    // for the compose window we will use shared menus and accelerators but
    //  we will not actually load them until the first compose window is created
}

void CNetscapeTextComposeTemplate::InitialUpdateFrame(
    CFrameWnd *pFrame, CDocument *pDocument, BOOL bMakeVisible)    
{
	if (pDocument && pFrame) {
	    // tell the frame what type of widgets to create
		((CComposeFrame *) pFrame)->SetType(MWContextMessageComposition);

		// Pass win_csid to ComposeFrame, eventually ComposeEdit will use
		// it to select font

		((CComposeFrame *) pFrame)->SetCSID(win_csid);
      
		//  Activate the frame but do not show it until we get a call to 
		//    FE_RaiseMailCompositionWindow() --- this allows us to use
		//    the composition frame as a context to quote messages with and
		//    such before loading exchange without flashing the netscape compose
		//    window up
		if(bMakeVisible)// SW_RESTORE i.e. show frame only if bMakeVisible. 
			pFrame->ActivateFrame(SW_RESTORE);
    }
	CDocTemplate::InitialUpdateFrame(pFrame, pDocument, FALSE);
}



/////////////////////////////////////////////////////////////////////////////
//  CNetscapeAddrTemplate commands
CNetscapeAddrTemplate::CNetscapeAddrTemplate(UINT nIDResource,
    CRuntimeClass* pDocClass,
    CRuntimeClass* pFrameClass, CRuntimeClass* pViewClass)
	: CGenericDocTemplate(nIDResource, pDocClass, pFrameClass, pViewClass)
{
}

void CNetscapeAddrTemplate::InitialUpdateFrame(CFrameWnd *pFrame, 
											   CDocument *pDocument, 
											   BOOL bMakeVisible)    
{
	if (pDocument && pFrame) {
		 //  Show it 
		int16 iLeft,iRight,iTop,iBottom;
		PREF_GetRectPref("mail.addr_book_window_rect", &iLeft, &iTop, &iRight, &iBottom);
		if (iLeft != -1) {
			int32 showCmd; // = *theApp.m_pAddrShow;
			PREF_GetIntPref("mail.wfe.addr_book.show_value",&showCmd);

			if (showCmd == SW_SHOWMINIMIZED)
				showCmd = SW_RESTORE;
			pFrame->ActivateFrame(CASTINT(showCmd));
		}
    }    
	CDocTemplate::InitialUpdateFrame(pFrame, pDocument, bMakeVisible);
}

#endif // MOZ_MAIL_NEWS
