123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306 |
- /* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
- /* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
- #ifndef nsPrintEngine_h___
- #define nsPrintEngine_h___
- #include "mozilla/Attributes.h"
- #include "mozilla/UniquePtr.h"
- #include "nsCOMPtr.h"
- #include "nsPrintObject.h"
- #include "nsPrintData.h"
- #include "nsFrameList.h"
- #include "nsIFrame.h"
- #include "nsIWebProgress.h"
- #include "mozilla/dom/HTMLCanvasElement.h"
- #include "nsIWebProgressListener.h"
- #include "nsWeakReference.h"
- // Interfaces
- #include "nsIObserver.h"
- // Classes
- class nsPagePrintTimer;
- class nsIDocShell;
- class nsIDocument;
- class nsIDocumentViewerPrint;
- class nsPrintObject;
- class nsIDocShell;
- class nsIPageSequenceFrame;
- //------------------------------------------------------------------------
- // nsPrintEngine Class
- //
- //------------------------------------------------------------------------
- class nsPrintEngine final : public nsIObserver,
- public nsIWebProgressListener,
- public nsSupportsWeakReference
- {
- public:
- // nsISupports interface...
- NS_DECL_ISUPPORTS
- // nsIObserver
- NS_DECL_NSIOBSERVER
- NS_DECL_NSIWEBPROGRESSLISTENER
- // Old nsIWebBrowserPrint methods; not cleaned up yet
- NS_IMETHOD Print(nsIPrintSettings* aPrintSettings,
- nsIWebProgressListener* aWebProgressListener);
- NS_IMETHOD PrintPreview(nsIPrintSettings* aPrintSettings,
- mozIDOMWindowProxy* aChildDOMWin,
- nsIWebProgressListener* aWebProgressListener);
- NS_IMETHOD GetIsFramesetDocument(bool *aIsFramesetDocument);
- NS_IMETHOD GetIsIFrameSelected(bool *aIsIFrameSelected);
- NS_IMETHOD GetIsRangeSelection(bool *aIsRangeSelection);
- NS_IMETHOD GetIsFramesetFrameSelected(bool *aIsFramesetFrameSelected);
- NS_IMETHOD GetPrintPreviewNumPages(int32_t *aPrintPreviewNumPages);
- NS_IMETHOD EnumerateDocumentNames(uint32_t* aCount, char16_t*** aResult);
- static nsresult GetGlobalPrintSettings(nsIPrintSettings** aPrintSettings);
- NS_IMETHOD GetDoingPrint(bool *aDoingPrint);
- NS_IMETHOD GetDoingPrintPreview(bool *aDoingPrintPreview);
- NS_IMETHOD GetCurrentPrintSettings(nsIPrintSettings **aCurrentPrintSettings);
- // This enum tells indicates what the default should be for the title
- // if the title from the document is null
- enum eDocTitleDefault {
- eDocTitleDefBlank,
- eDocTitleDefURLDoc
- };
- nsPrintEngine();
- void Destroy();
- void DestroyPrintingData();
- nsresult Initialize(nsIDocumentViewerPrint* aDocViewerPrint,
- nsIDocShell* aContainer,
- nsIDocument* aDocument,
- float aScreenDPI,
- FILE* aDebugFile);
- nsresult GetSeqFrameAndCountPages(nsIFrame*& aSeqFrame, int32_t& aCount);
- //
- // The following three methods are used for printing...
- //
- nsresult DocumentReadyForPrinting();
- nsresult GetSelectionDocument(nsIDeviceContextSpec * aDevSpec,
- nsIDocument ** aNewDoc);
- nsresult SetupToPrintContent();
- nsresult EnablePOsForPrinting();
- nsPrintObject* FindSmallestSTF();
- bool PrintDocContent(nsPrintObject* aPO, nsresult& aStatus);
- nsresult DoPrint(nsPrintObject * aPO);
- void SetPrintPO(nsPrintObject* aPO, bool aPrint);
- void TurnScriptingOn(bool aDoTurnOn);
- bool CheckDocumentForPPCaching();
- void InstallPrintPreviewListener();
- // nsIDocumentViewerPrint Printing Methods
- bool HasPrintCallbackCanvas();
- bool PrePrintPage();
- bool PrintPage(nsPrintObject* aPOect, bool& aInRange);
- bool DonePrintingPages(nsPrintObject* aPO, nsresult aResult);
- //---------------------------------------------------------------------
- void BuildDocTree(nsIDocShell * aParentNode,
- nsTArray<nsPrintObject*> * aDocList,
- nsPrintObject * aPO);
- nsresult ReflowDocList(nsPrintObject * aPO, bool aSetPixelScale);
- nsresult ReflowPrintObject(nsPrintObject * aPO);
- void CheckForChildFrameSets(nsPrintObject* aPO);
- void CalcNumPrintablePages(int32_t& aNumPages);
- void ShowPrintProgress(bool aIsForPrinting, bool& aDoNotify);
- nsresult CleanupOnFailure(nsresult aResult, bool aIsPrinting);
- // If FinishPrintPreview() fails, caller may need to reset the state of the
- // object, for example by calling CleanupOnFailure().
- nsresult FinishPrintPreview();
- static void CloseProgressDialog(nsIWebProgressListener* aWebProgressListener);
- void SetDocAndURLIntoProgress(nsPrintObject* aPO,
- nsIPrintProgressParams* aParams);
- void EllipseLongString(nsAString& aStr, const uint32_t aLen, bool aDoFront);
- nsresult CheckForPrinters(nsIPrintSettings* aPrintSettings);
- void CleanupDocTitleArray(char16_t**& aArray, int32_t& aCount);
- bool IsThereARangeSelection(nsPIDOMWindowOuter* aDOMWin);
- void FirePrintingErrorEvent(nsresult aPrintError);
- //---------------------------------------------------------------------
- // Timer Methods
- nsresult StartPagePrintTimer(nsPrintObject* aPO);
- bool IsWindowsInOurSubTree(nsPIDOMWindowOuter* aDOMWindow);
- static bool IsParentAFrameSet(nsIDocShell * aParent);
- bool IsThereAnIFrameSelected(nsIDocShell* aDocShell,
- nsPIDOMWindowOuter* aDOMWin,
- bool& aIsParentFrameSet);
- static nsPrintObject* FindPrintObjectByDOMWin(nsPrintObject* aParentObject,
- nsPIDOMWindowOuter* aDOMWin);
- // get the currently infocus frame for the document viewer
- already_AddRefed<nsPIDOMWindowOuter> FindFocusedDOMWindow();
- //---------------------------------------------------------------------
- // Static Methods
- //---------------------------------------------------------------------
- static void GetDocumentTitleAndURL(nsIDocument* aDoc,
- nsAString& aTitle,
- nsAString& aURLStr);
- void GetDisplayTitleAndURL(nsPrintObject* aPO,
- nsAString& aTitle,
- nsAString& aURLStr,
- eDocTitleDefault aDefType);
- static bool HasFramesetChild(nsIContent* aContent);
- bool CheckBeforeDestroy();
- nsresult Cancelled();
- nsIPresShell* GetPrintPreviewPresShell() {return mPrtPreview->mPrintObject->mPresShell;}
- float GetPrintPreviewScale() { return mPrtPreview->mPrintObject->
- mPresContext->GetPrintPreviewScale(); }
- static nsIPresShell* GetPresShellFor(nsIDocShell* aDocShell);
- // These calls also update the DocViewer
- void SetIsPrinting(bool aIsPrinting);
- bool GetIsPrinting()
- {
- return mIsDoingPrinting;
- }
- void SetIsPrintPreview(bool aIsPrintPreview);
- bool GetIsPrintPreview()
- {
- return mIsDoingPrintPreview;
- }
- void SetIsCreatingPrintPreview(bool aIsCreatingPrintPreview)
- {
- mIsCreatingPrintPreview = aIsCreatingPrintPreview;
- }
- bool GetIsCreatingPrintPreview()
- {
- return mIsCreatingPrintPreview;
- }
- void SetDisallowSelectionPrint(bool aDisallowSelectionPrint)
- {
- mDisallowSelectionPrint = aDisallowSelectionPrint;
- }
- protected:
- ~nsPrintEngine();
- nsresult CommonPrint(bool aIsPrintPreview, nsIPrintSettings* aPrintSettings,
- nsIWebProgressListener* aWebProgressListener,
- nsIDOMDocument* aDoc);
- nsresult DoCommonPrint(bool aIsPrintPreview, nsIPrintSettings* aPrintSettings,
- nsIWebProgressListener* aWebProgressListener,
- nsIDOMDocument* aDoc);
- void FirePrintCompletionEvent();
- static nsresult GetSeqFrameAndCountPagesInternal(nsPrintObject* aPO,
- nsIFrame*& aSeqFrame,
- int32_t& aCount);
- static nsresult FindSelectionBoundsWithList(nsFrameList::Enumerator& aChildFrames,
- nsIFrame * aParentFrame,
- nsRect& aRect,
- nsIFrame *& aStartFrame,
- nsRect& aStartRect,
- nsIFrame *& aEndFrame,
- nsRect& aEndRect);
- static nsresult FindSelectionBounds(nsIFrame * aParentFrame,
- nsRect& aRect,
- nsIFrame *& aStartFrame,
- nsRect& aStartRect,
- nsIFrame *& aEndFrame,
- nsRect& aEndRect);
- static nsresult GetPageRangeForSelection(nsIPageSequenceFrame* aPageSeqFrame,
- nsIFrame** aStartFrame,
- int32_t& aStartPageNum,
- nsRect& aStartRect,
- nsIFrame** aEndFrame,
- int32_t& aEndPageNum,
- nsRect& aEndRect);
- static void MapContentForPO(nsPrintObject* aPO, nsIContent* aContent);
- static void MapContentToWebShells(nsPrintObject* aRootPO, nsPrintObject* aPO);
- static void SetPrintAsIs(nsPrintObject* aPO, bool aAsIs = true);
- void DisconnectPagePrintTimer();
- // Static member variables
- bool mIsCreatingPrintPreview;
- bool mIsDoingPrinting;
- bool mIsDoingPrintPreview; // per DocumentViewer
- bool mProgressDialogIsShown;
- nsCOMPtr<nsIDocumentViewerPrint> mDocViewerPrint;
- nsWeakPtr mContainer;
- float mScreenDPI;
- // We are the primary owner of our nsPrintData member vars. These vars
- // are refcounted so that functions (e.g. nsPrintData methods) can create
- // temporary owning references when they need to fire a callback that
- // could conceivably destroy this nsPrintEngine owner object and all its
- // member-data.
- RefPtr<nsPrintData> mPrt;
- nsPagePrintTimer* mPagePrintTimer;
- nsWeakFrame mPageSeqFrame;
- // Print Preview
- RefPtr<nsPrintData> mPrtPreview;
- RefPtr<nsPrintData> mOldPrtPreview;
- nsCOMPtr<nsIDocument> mDocument;
- FILE* mDebugFile;
- int32_t mLoadCounter;
- bool mDidLoadDataForPrinting;
- bool mIsDestroying;
- bool mDisallowSelectionPrint;
- nsresult AfterNetworkPrint(bool aHandleError);
- nsresult SetRootView(nsPrintObject* aPO,
- bool& aDoReturn,
- bool& aDocumentIsTopLevel,
- nsSize& aAdjSize);
- nsView* GetParentViewForRoot();
- bool DoSetPixelScale();
- void UpdateZoomRatio(nsPrintObject* aPO, bool aSetPixelScale);
- nsresult ReconstructAndReflow(bool aDoSetPixelScale);
- nsresult UpdateSelectionAndShrinkPrintObject(nsPrintObject* aPO,
- bool aDocumentIsTopLevel);
- nsresult InitPrintDocConstruction(bool aHandleError);
- void FirePrintPreviewUpdateEvent();
- private:
- nsPrintEngine& operator=(const nsPrintEngine& aOther) = delete;
- };
- #endif /* nsPrintEngine_h___ */
|