Mozilla/mozilla/embedding/qa/testembed/PrintProgressDialog.cpp
rods%netscape.com 20b4083174 1) Removes the arg of nsIDOMWindow in the nsIWebBrowserPrint calls
2) Adds a couple of new methods and an attr to nsIWebBrowserPrint (navigate, is frameset, & exitPP)
3) Removes all but one method from nsIContentViewerFile.idl/h the remaining call is for print regression testing
4) Removes the "static" implementation of nsIContentViewerFile.h
5) Fixed up nsIContentViewerFile.idl and turned it back on so it is now generating the header file
6) Removed all uses of nsIContentViewerFile.h except for the WebCrawler (uses it for Printing Regression testing)
7) nsDocumentViewer.cpp now implements nsIWebBrowserPrint.idl this makes it easier to add new print functionality in one place
8) You can now ask an instance of the ContentViewer for a nsIWebBrowserPrint to do printing (it retruns the nsIWebBrowserPrint interface implemented by the nsDocumentViewer)
9) Anybody who was using nsIContentViewerFile to print will now use nsIWebBrowserPrint
10) You can now do a "GetInterface()" on a GlobalWindow for a nsIWebBrowserPrint
11) The browser UI now uses the GetInterface on the GlobalWindow to get a nsIWebBrowserPrint object to do printing and this can be used for all printing functionality
Bug 120622 r=dcone sr=waterson


git-svn-id: svn://10.0.0.236/trunk@113419 18797224-902f-48f8-a5cc-f745e15eee43
2002-02-01 14:52:11 +00:00

268 lines
7.4 KiB
C++

// PrintProgressDialog.cpp : implementation file
//
#include "stdafx.h"
#include "Testembed.h"
#include "PrintProgressDialog.h"
#include "BrowserView.h"
#include "nsIWebBrowser.h"
#include "nsIWebBrowserPrint.h"
#include "nsIWebProgressListener.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CPrintProgressDialog dialog
class CDlgPrintListener : public nsIWebProgressListener
{
// Construction
public:
CDlgPrintListener(CPrintProgressDialog* aDlg);
NS_DECL_ISUPPORTS
NS_DECL_NSIWEBPROGRESSLISTENER
void ClearDlg() { m_PrintDlg = NULL; } // weak reference
// Implementation
protected:
CPrintProgressDialog* m_PrintDlg;
};
NS_IMPL_ADDREF(CDlgPrintListener)
NS_IMPL_RELEASE(CDlgPrintListener)
NS_INTERFACE_MAP_BEGIN(CDlgPrintListener)
NS_INTERFACE_MAP_ENTRY_AMBIGUOUS(nsISupports, nsIWebProgressListener)
NS_INTERFACE_MAP_ENTRY(nsIWebProgressListener)
NS_INTERFACE_MAP_END
CDlgPrintListener::CDlgPrintListener(CPrintProgressDialog* aDlg) :
m_PrintDlg(aDlg)
{
NS_INIT_ISUPPORTS();
//NS_ADDREF_THIS();
}
/* void onStateChange (in nsIWebProgress aWebProgress, in nsIRequest aRequest, in long aStateFlags, in unsigned long aStatus); */
NS_IMETHODIMP
CDlgPrintListener::OnStateChange(nsIWebProgress *aWebProgress, nsIRequest *aRequest, PRInt32 aStateFlags, PRUint32 aStatus)
{
if (m_PrintDlg) {
if (aStateFlags == (nsIWebProgressListener::STATE_START|nsIWebProgressListener::STATE_IS_DOCUMENT)) {
return m_PrintDlg->OnStartPrinting();
} else if (aStateFlags == (nsIWebProgressListener::STATE_STOP|nsIWebProgressListener::STATE_IS_DOCUMENT)) {
return m_PrintDlg->OnEndPrinting(aStatus);
}
}
return NS_OK;
}
/* void onProgressChange (in nsIWebProgress aWebProgress, in nsIRequest aRequest, in long aCurSelfProgress, in long aMaxSelfProgress, in long aCurTotalProgress, in long aMaxTotalProgress); */
NS_IMETHODIMP
CDlgPrintListener::OnProgressChange(nsIWebProgress *aWebProgress, nsIRequest *aRequest, PRInt32 aCurSelfProgress, PRInt32 aMaxSelfProgress, PRInt32 aCurTotalProgress, PRInt32 aMaxTotalProgress)
{
if (m_PrintDlg) {
return m_PrintDlg->OnProgressPrinting(aCurSelfProgress, aMaxSelfProgress);
}
return NS_OK;
}
/* void onLocationChange (in nsIWebProgress aWebProgress, in nsIRequest aRequest, in nsIURI location); */
NS_IMETHODIMP
CDlgPrintListener::OnLocationChange(nsIWebProgress *aWebProgress, nsIRequest *aRequest, nsIURI *location)
{
return NS_ERROR_NOT_IMPLEMENTED;
}
/* void onStatusChange (in nsIWebProgress aWebProgress, in nsIRequest aRequest, in nsresult aStatus, in wstring aMessage); */
NS_IMETHODIMP
CDlgPrintListener::OnStatusChange(nsIWebProgress *aWebProgress, nsIRequest *aRequest, nsresult aStatus, const PRUnichar *aMessage)
{
return NS_ERROR_NOT_IMPLEMENTED;
}
/* void onSecurityChange (in nsIWebProgress aWebProgress, in nsIRequest aRequest, in long state); */
NS_IMETHODIMP
CDlgPrintListener::OnSecurityChange(nsIWebProgress *aWebProgress, nsIRequest *aRequest, PRInt32 state)
{
return NS_ERROR_NOT_IMPLEMENTED;
}
/////////////////////////////////////////////////////////////////////////////
// CPrintProgressDialog dialog
CPrintProgressDialog::CPrintProgressDialog(nsIWebBrowser* aWebBrowser,
nsIPrintSettings* aPrintSettings,
CWnd* pParent /*=NULL*/)
: CDialog(CPrintProgressDialog::IDD, pParent),
m_WebBrowser(aWebBrowser),
m_PrintListener(nsnull),
m_PrintSettings(aPrintSettings),
m_InModalMode(PR_FALSE)
{
//{{AFX_DATA_INIT(CPrintProgressDialog)
// NOTE: the ClassWizard will add member initialization here
//}}AFX_DATA_INIT
}
CPrintProgressDialog::~CPrintProgressDialog()
{
CDlgPrintListener * pl = (CDlgPrintListener*)m_PrintListener.get();
if (pl) {
pl->ClearDlg();
}
}
void CPrintProgressDialog::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CPrintProgressDialog)
// NOTE: the ClassWizard will add DDX and DDV calls here
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CPrintProgressDialog, CDialog)
//{{AFX_MSG_MAP(CPrintProgressDialog)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CPrintProgressDialog message handlers
static void GetLocalRect(CWnd * aWnd, CRect& aRect, CWnd * aParent)
{
CRect wr;
aParent->GetWindowRect(wr);
CRect cr;
aParent->GetClientRect(cr);
aWnd->GetWindowRect(aRect);
int borderH = wr.Height() - cr.Height();
int borderW = (wr.Width() - cr.Width())/2;
aRect.top -= wr.top+borderH-borderW;
aRect.left -= wr.left+borderW;
aRect.right -= wr.left+borderW;
aRect.bottom -= wr.top+borderH-borderW;
}
BOOL CPrintProgressDialog::OnInitDialog()
{
CDialog::OnInitDialog();
CRect clientRect;
GetClientRect(&clientRect);
CRect titleRect;
GetLocalRect(GetDlgItem(IDC_PPD_DOC_TITLE_STATIC), titleRect, this);
CRect itemRect;
GetLocalRect(GetDlgItem(IDC_PPD_DOC_TXT), itemRect, this);
CRect progRect;
progRect.left = titleRect.left;
progRect.top = itemRect.top+itemRect.Height()+5;
progRect.right = clientRect.Width()-(2*titleRect.left);
progRect.bottom = progRect.top+titleRect.Height();
m_wndProgress.Create (WS_CHILD | WS_VISIBLE, progRect, this, -1);
m_wndProgress.SetPos (0);
return TRUE; // return TRUE unless you set the focus to a control
// EXCEPTION: OCX Property Pages should return FALSE
}
int CPrintProgressDialog::DoModal( )
{
PRBool doModal = PR_FALSE;
nsCOMPtr<nsIWebBrowserPrint> print(do_GetInterface(m_WebBrowser));
if(print)
{
m_PrintListener = new CDlgPrintListener(this); // constructor addrefs
if (m_PrintListener) {
// doModal will be set to false if the print job was cancelled
nsIWebProgressListener * wpl = NS_STATIC_CAST(nsIWebProgressListener*, m_PrintListener);
doModal = NS_SUCCEEDED(print->Print(m_PrintSettings, wpl)) == PR_TRUE;
}
}
if (doModal) {
m_InModalMode = PR_TRUE;
return CDialog::DoModal();
}
return 0;
}
/* void OnStartPrinting (); */
NS_IMETHODIMP
CPrintProgressDialog::OnStartPrinting()
{
return NS_OK;
}
/* void OnProgressPrinting (in PRUint32 aProgress, in PRUint32 aProgressMax); */
NS_IMETHODIMP
CPrintProgressDialog::OnProgressPrinting(PRUint32 aProgress, PRUint32 aProgressMax)
{
if (m_wndProgress.m_hWnd == NULL) return NS_OK;
// Initialize the progress meter we we get the "zero" progress
// which also tells us the max progress
if (aProgress == 0) {
CWnd *pWnd = GetDlgItem(IDC_PPD_DOC_TXT);
if(pWnd)
pWnd->SetWindowText(m_URL);
m_wndProgress.SetRange(0, aProgressMax);
m_wndProgress.SetPos(0);
}
m_wndProgress.SetPos(aProgress);
RedrawWindow(NULL, NULL, RDW_INVALIDATE | RDW_UPDATENOW);
return NS_OK;
}
/* void OnEndPrinting (in PRUint32 aStatus); */
NS_IMETHODIMP
CPrintProgressDialog::OnEndPrinting(PRUint32 aStatus)
{
// Here we need to know whether we have gone "modal"
// because we could get notified here if the user cancels
// before we ever get a chance to go into the modal loop
if (m_InModalMode) {
EndDialog(1);
}
return NS_OK;
}
void CPrintProgressDialog::OnCancel()
{
nsCOMPtr<nsIWebBrowserPrint> print(do_GetInterface(m_WebBrowser));
if (print) {
print->Cancel();
}
CDialog::OnCancel();
}
void CPrintProgressDialog::SetURI(const char* aTitle)
{
m_URL = _T(aTitle);
}