gecko-dev/cmd/winfe/cxprint.h

301 lines
10 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.
*/
#ifndef __PrintContext_H
// Avoid include redundancy
//
#define __PrintContext_H
// Purpose: Provide a context specifically for printing
// Comments:
// Required Includes
//
#include "cxdc.h"
#include "cxprndlg.h"
#include "drawable.h"
// Constants
//
#define POS_CENTER 1
#define POS_LEFT 2
#define POS_RIGHT 3
#define POS_HEADER 1
#define POS_FOOTER 2
typedef enum {
BLOCK_DISPLAY,
CAPTURE_POSITION,
DISPLAY
} PrinterDisplayMode;
// Structures
//
class CPrintCX : public CDCCX {
// Construction, destruction, indirect construction
public:
CPrintCX(URL_Struct *pUrl, SHIST_SavedData *pSavedData = NULL, char *pDisplayUrl = NULL);
~CPrintCX();
virtual void DestroyContext();
static void PrintAnchorObject(URL_Struct *pUrl, CView *pView,
SHIST_SavedData *pSavedData = NULL, char *pDisplayUrl = NULL);
static void PreviewAnchorObject(CPrintCX *& pPreview, URL_Struct *pUrl, CView *pView, CDC* pDC,
CPrintInfo *pInfo, SHIST_SavedData *pSavedData = NULL, char *pDisplayUrl = NULL);
static void AutomatedPrint(const char *pDocument, const char *pPrinter, const char *pDriver, const char *pPort);
// The anchor we're printing.
protected:
char *m_pAnchor;
// The actual anchor name to use for Header/Footer
// (In Composer: we may be printing from a temporary local file)
char *m_pDisplayUrl;
HFONT m_hFont;
int m_iFontCSID;
int m_iMaxWidth;
int m_offscrnWidth;
int m_offscrnHeight;
// CDC Access
private:
HDC m_hdcPrint;
#ifdef XP_WIN32
HDC m_hOffscrnDC;
HDC m_hOrgPrintDC;
HDC m_hOtherPrintDC;
HBITMAP m_hOffScrnBitmap;
HBITMAP m_saveBitmap;
BOOL m_printBk;
void SubOffscreenPrintDC() {m_hOrgPrintDC = m_hdcPrint; m_hdcPrint = m_hOffscrnDC;}
void RestorePrintDC() { m_hdcPrint = m_hOrgPrintDC;}
#endif
CDC *m_previewDC;
lo_SavedEmbedListData* m_embedList; /* to save the savedData from the URL struct.*/
public:
virtual HDC GetContextDC(){
if(IsPrintPreview())
return m_previewDC->GetSafeHdc();
else
return m_hdcPrint;
}
virtual BOOL IsDeviceDC();
#ifdef XP_WIN32
BOOL IsPrintingBackground() {return m_printBk;}
#endif
virtual HDC GetAttribDC();
virtual void ReleaseContextDC(HDC pDC);
// Post Initialization
public:
virtual void Initialize(BOOL bOwnDC, RECT *pRect = NULL, BOOL bInitialPalette = TRUE, BOOL bNewMemDC = TRUE);
private:
// Margins
int32 m_lLeftMargin;
int32 m_lTopMargin;
int32 m_lRightMargin;
int32 m_lBottomMargin;
// True page dimensions
int32 m_lPageHeight;
int32 m_lPageWidth;
// Document dimensions
int32 m_lDocWidth;
int32 m_lDocHeight;
// Color contingencies
BOOL m_bBlackText; // All text as black?
BOOL m_bBlackLines; // All line drawing as black?
// Drawing contingencies
BOOL m_bSolidLines; // All lines are solid?
BOOL m_bBackground; // Should we draw the backgrounds?
BOOL m_bBitmaps; // Should we print bitmaps?
BOOL m_bReverseOrder; // Print in reverse order?
// Headers/footers
BOOL m_bNumber; // Number the pages?
BOOL m_bTitle; // Give each page the appropriate title?
CPrinterDrawable *m_pDrawable; // Drawable that represents the printer
// Print status dialog, also the parent of any dialogs we present!
private:
CPrintStatusDialog *m_pStatusDialog;
// the real meat of the print process
public:
#ifdef XP_WIN32
HDC GetOffscreenDC() {return m_hOffscrnDC;}
virtual int GetLeftMargin()
{ if (m_printBk && m_hdcPrint == m_hOffscrnDC)
return 0;
else return m_lLeftMargin;
}
virtual int GetTopMargin()
{ if (m_printBk && m_hdcPrint == m_hOffscrnDC)
return 0;
else return m_lTopMargin;
}
int32 GetXConvertUnit()
{
if (m_printBk && (m_hdcPrint == m_hOffscrnDC)) return 1;
else return m_lConvertX;
}
int32 GetYConvertUnit()
{
if (m_printBk && (m_hdcPrint == m_hOffscrnDC)) return 1;
else return m_lConvertY;
}
#endif
void PrintPage(int iPage, HDC pNewDC = NULL, CPrintInfo *pNewInfo = NULL);
private:
void CommencePrinting(URL_Struct *pUrl);
void FormatPages();
void CapturePositions();
void Capture(int32 lOrgX, int32 lOrgY, int32 lWidth, int32 lHeight);
CPtrList m_cplCaptured;
CPtrList m_cplPages;
int32 m_lCaptureScrollOffset;
void CreateHeaderFooterFont();
// Useful information.
private:
int m_iLastPagePrinted;
public:
int PageCount();
int LastPagePrinted();
private:
PrinterDisplayMode m_iDisplayMode;
public:
static BOOL m_bGlobalBlockDisplay;
PrinterDisplayMode GetDisplayMode();
// Output overrides.
public:
virtual void DisplayIcon(int32 x, int32 y, int icon_number);
BOOL AdjustRect(LTRB& Rect);
virtual BOOL ResolveElement(LTRB& Rect, int32 x, int32 y, int32 x_offset, int32 y_offset,
int32 width, int32 height);
virtual BOOL ResolveElement(LTRB& Rect, NI_Pixmap *pImage, int32 lX, int32 lY,
int32 orgx, int32 orgy,
uint32 ulWidth, uint32 ulHeight,
int32 lScaleWidth, int32 lScaleHeight);
virtual BOOL ResolveElement(LTRB& Rect, LO_EmbedStruct *pEmbed, int iLocation, Bool bWindowed);
virtual BOOL ResolveElement(LTRB& Rect, LO_FormElementStruct *pFormElement);
virtual COLORREF ResolveTextColor(LO_TextAttr *pAttr);
virtual COLORREF ResolveBGColor(unsigned uRed, unsigned uGreen, unsigned uBlue);
virtual BOOL ResolveHRSolid(LO_HorizRuleStruct *pHorizRule);
virtual BOOL ResolveLineSolid();
virtual void ResolveTransparentColor(unsigned uRed, unsigned uGreen, unsigned uBlue);
virtual COLORREF ResolveDarkLineColor();
virtual COLORREF ResolveLightLineColor();
virtual COLORREF ResolveBorderColor(LO_TextAttr *pAttr);
virtual PRBool ResolveIncrementalImages();
virtual void SetDocDimension(MWContext *pContext, int iLocation, int32 lWidth, int32 lHeight);
virtual void GetDrawingOrigin(int32 *plOrgX, int32 *plOrgY);
virtual FE_Region GetDrawingClip();
virtual void EraseBackground(MWContext *pContext, int iLocation,
int32 x, int32 y, uint32 width, uint32 height,
LO_Color *pColor);
// Members needed to properly implement printing.
protected:
CPrintInfo *m_pcpiPrintJob;
DOCINFO m_docInfo;
// document charset id
public:
int m_iCSID;
void* p_TimeOut;
// Members need to properly implement print preview.
protected:
CView *m_pPreviewView;
BOOL m_bPreview;
public:
BOOL IsPrintPreview() const {
return(m_bPreview);
}
// Overrides
public:
// Dialog owner
virtual CWnd *GetDialogOwner() const;
// Progress messages.
virtual void Progress(MWContext *pContext, const char *pMessage);
// All connections complete.
virtual void AllConnectionsComplete(MWContext *pContext);
virtual void FinishedLayout(MWContext *pContext);
// Display routines
virtual void DisplayBullet(MWContext *pContext, int iLocation, LO_BullettStruct *pBullet);
virtual void DisplayEmbed(MWContext *pContext, int iLocation, LO_EmbedStruct *pEmbed);
virtual void DisplayFormElement(MWContext *pContext, int iLocation, LO_FormElementStruct *pFormElement);
virtual void DisplayHR(MWContext *pContext, int iLocation, LO_HorizRuleStruct *pHorizRule);
virtual int DisplayPixmap(NI_Pixmap* image, NI_Pixmap* mask, int32 x, int32 y, int32 x_offset, int32 y_offset, int32 width, int32 height, int32 lScaleWidth, int32 lScaleHeight, LTRB& Rect);
virtual void DisplayLineFeed(MWContext *pContext, int iLocation, LO_LinefeedStruct *pLineFeed, XP_Bool clear);
virtual void DisplaySubDoc(MWContext *pContext, int iLocation, LO_SubDocStruct *pSubDoc);
virtual void DisplayCell(MWContext *pContext, int iLocation, LO_CellStruct *pCell);
virtual void DisplaySubtext(MWContext *pContext, int iLocation, LO_TextStruct *pText, int32 lStartPos, int32 lEndPos, XP_Bool clear);
virtual void DisplayTable(MWContext *pContext, int iLocation, LO_TableStruct *pTable);
virtual void DisplayText(MWContext *pContext, int iLocation, LO_TextStruct *pText, XP_Bool clear);
virtual void DisplayPlugin(MWContext *pContext, LO_EmbedStruct *pEmbed, NPEmbeddedApp* pEmbeddedApp, int iLocation);
virtual void DisplayWindowlessPlugin(MWContext *pContext, LO_EmbedStruct *pEmbed, NPEmbeddedApp *pEmbeddedApp, int iLocation);
#ifdef XP_WIN32
void CopyOffscreenBitmap(NI_Pixmap* image, int32 x, int32 y, int32 x_offset, int32 y_offset, int32 width, int32 height, int32 lScaleWidth, int32 lScaleHeight, LTRB& Rect);
#endif
// Layout initialization respecting page size.
virtual void LayoutNewDocument(MWContext *pContext, URL_Struct *pURL, int32 *pWidth, int32 *pHeight, int32 *pmWidth, int32 *pmHeight);
virtual void GetUrlExitRoutine(URL_Struct *pUrl, int iStatus, MWContext *pContext);
// Call this to cancel the print job.
public:
void CancelPrintJob();
private:
BOOL m_bCancel;
// this is to prevent the destroycontext get call twice.
BOOL m_bHandleCancel;
// These determine wether or not we need to continue to attempt to start the
// document, and how we end the printing of the document.
// Doesn't apply to preview.
private:
BOOL m_bAbort;
BOOL m_bNeedStartDoc;
BOOL m_bAllConnectionCompleteCalled;
BOOL m_bFormatStarted;
BOOL m_bFinishedLayoutCalled;
SIZE screenRes;
SIZE printRes;
int StartDoc();
void PrintTextAllign ( HDC pDC, char * szBuffer, int position, int hpos );
void ScreenToPrint(POINT* point, int num = 1);
void FormatAndPrintPages(MWContext *context);
};
#endif // __PrintContext_H