diff options
Diffstat (limited to 'sw/inc/printdata.hxx')
-rw-r--r-- | sw/inc/printdata.hxx | 295 |
1 files changed, 295 insertions, 0 deletions
diff --git a/sw/inc/printdata.hxx b/sw/inc/printdata.hxx new file mode 100644 index 000000000..1092f977f --- /dev/null +++ b/sw/inc/printdata.hxx @@ -0,0 +1,295 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * 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/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ +#ifndef INCLUDED_SW_INC_PRINTDATA_HXX +#define INCLUDED_SW_INC_PRINTDATA_HXX + +#include <sal/types.h> +#include <rtl/ustring.hxx> +#include <vcl/print.hxx> +#include <sfx2/objsh.hxx> + +#include <set> +#include <map> +#include <vector> +#include <utility> +#include <memory> + +class SwDoc; +class SwDocShell; +class SetGetExpFields; +class SwViewOption; +class SwViewOptionAdjust_Impl; +class SwViewShell; +class SwRenderData; + +/** this must match the definitions in css::text::NotePrintMode */ +enum class SwPostItMode +{ + NONE = 0, + Only = 1, + EndDoc = 2, + EndPage = 3, + InMargins = 4 +}; + + +class SwPrintData +{ + const SwRenderData * m_pRenderData; // not owner + +public: + + bool m_bPrintGraphic, m_bPrintTable, m_bPrintDraw, m_bPrintControl, m_bPrintPageBackground, + m_bPrintBlackFont, + //#i81434# - printing of hidden text + m_bPrintHiddenText, m_bPrintTextPlaceholder, + m_bPrintLeftPages, m_bPrintRightPages, m_bPrintReverse, m_bPrintProspect, + m_bPrintProspectRTL, + m_bPrintSingleJobs, m_bPaperFromSetup, + /// Print empty pages + m_bPrintEmptyPages; + + SwPostItMode m_nPrintPostIts; + OUString m_sFaxName; + + SwPrintData() + { + m_pRenderData = nullptr; + + m_bPrintGraphic = + m_bPrintTable = + m_bPrintDraw = + m_bPrintControl = + m_bPrintLeftPages = + m_bPrintRightPages = + m_bPrintPageBackground = + m_bPrintEmptyPages = true; + + m_bPaperFromSetup = + m_bPrintReverse = + m_bPrintProspect = + m_bPrintProspectRTL = + m_bPrintSingleJobs = + m_bPrintBlackFont = + m_bPrintHiddenText = + m_bPrintTextPlaceholder = false; + + m_nPrintPostIts = SwPostItMode::NONE; + } + + virtual ~SwPrintData() {} + + SwPrintData(SwPrintData const &) = default; + SwPrintData(SwPrintData &&) = default; + SwPrintData & operator =(SwPrintData const &) = default; + SwPrintData & operator =(SwPrintData &&) = default; + + bool operator==(const SwPrintData& rData)const + { + return + m_bPrintGraphic == rData.m_bPrintGraphic && + m_bPrintTable == rData.m_bPrintTable && + m_bPrintDraw == rData.m_bPrintDraw && + m_bPrintControl == rData.m_bPrintControl && + m_bPrintPageBackground== rData.m_bPrintPageBackground && + m_bPrintBlackFont == rData.m_bPrintBlackFont && + m_bPrintLeftPages == rData.m_bPrintLeftPages && + m_bPrintRightPages == rData.m_bPrintRightPages && + m_bPrintReverse == rData.m_bPrintReverse && + m_bPrintProspect == rData.m_bPrintProspect && + m_bPrintProspectRTL == rData.m_bPrintProspectRTL && + m_bPrintSingleJobs == rData.m_bPrintSingleJobs && + m_bPaperFromSetup == rData.m_bPaperFromSetup && + m_bPrintEmptyPages == rData.m_bPrintEmptyPages && + m_nPrintPostIts == rData.m_nPrintPostIts && + m_sFaxName == rData.m_sFaxName && + m_bPrintHiddenText == rData.m_bPrintHiddenText && + m_bPrintTextPlaceholder == rData.m_bPrintTextPlaceholder; + } + + /** Note: in the context where this class is used the pointers should always be valid + during the lifetime of this object */ + const SwRenderData & GetRenderData() const { return *m_pRenderData; } + void SetRenderData( const SwRenderData *pData ) { m_pRenderData = pData; } + + bool IsPrintGraphic() const { return m_bPrintGraphic; } + bool IsPrintTable() const { return m_bPrintTable; } + bool IsPrintDraw() const { return m_bPrintDraw; } + bool IsPrintControl() const { return m_bPrintControl; } + bool IsPrintLeftPage() const { return m_bPrintLeftPages; } + bool IsPrintRightPage() const { return m_bPrintRightPages; } + bool IsPrintReverse() const { return m_bPrintReverse; } + bool IsPaperFromSetup() const { return m_bPaperFromSetup; } + bool IsPrintEmptyPages() const { return m_bPrintEmptyPages; } + bool IsPrintProspect() const { return m_bPrintProspect; } + bool IsPrintProspectRTL() const { return m_bPrintProspectRTL; } + bool IsPrintPageBackground() const { return m_bPrintPageBackground; } + bool IsPrintBlackFont() const { return m_bPrintBlackFont; } + bool IsPrintSingleJobs() const { return m_bPrintSingleJobs; } + SwPostItMode GetPrintPostIts() const { return m_nPrintPostIts; } + const OUString& GetFaxName() const { return m_sFaxName; } + bool IsPrintHiddenText() const { return m_bPrintHiddenText; } + bool IsPrintTextPlaceholder() const { return m_bPrintTextPlaceholder; } + + void SetPrintGraphic( bool b ) { doSetModified(); m_bPrintGraphic = b; } + void SetPrintTable( bool b ) { doSetModified(); m_bPrintTable = b; } + void SetPrintDraw( bool b ) { doSetModified(); m_bPrintDraw = b; } + void SetPrintControl( bool b ) { doSetModified(); m_bPrintControl = b; } + void SetPrintLeftPage( bool b ) { doSetModified(); m_bPrintLeftPages = b; } + void SetPrintRightPage( bool b ) { doSetModified(); m_bPrintRightPages = b; } + void SetPrintReverse( bool b ) { doSetModified(); m_bPrintReverse = b; } + void SetPaperFromSetup( bool b ) { doSetModified(); m_bPaperFromSetup = b; } + void SetPrintEmptyPages( bool b ) { doSetModified(); m_bPrintEmptyPages = b; } + void SetPrintPostIts( SwPostItMode n ) { doSetModified(); m_nPrintPostIts = n; } + void SetPrintProspect( bool b ) { doSetModified(); m_bPrintProspect = b; } + void SetPrintProspect_RTL( bool b ) { doSetModified(); m_bPrintProspectRTL = b; } + void SetPrintPageBackground( bool b ) { doSetModified(); m_bPrintPageBackground = b; } + void SetPrintBlackFont( bool b ) { doSetModified(); m_bPrintBlackFont = b; } + void SetPrintSingleJobs( bool b ) { doSetModified(); m_bPrintSingleJobs = b; } + void SetFaxName( const OUString& rSet ) { m_sFaxName = rSet; } + void SetPrintHiddenText( bool b ) { doSetModified(); m_bPrintHiddenText = b; } + void SetPrintTextPlaceholder( bool b ) { doSetModified(); m_bPrintTextPlaceholder = b; } + + virtual void doSetModified () {} +}; + +class SwPrintUIOptions final : public vcl::PrinterOptionsHelper +{ + VclPtr< OutputDevice > m_pLast; + const SwPrintData & m_rDefaultPrintData; + +public: + SwPrintUIOptions( sal_uInt16 nCurrentPage, bool bWeb, bool bSwSrcView, bool bHasSelection, bool bHasPostIts, const SwPrintData &rDefaultPrintData ); + virtual ~SwPrintUIOptions(); + + bool processPropertiesAndCheckFormat( const css::uno::Sequence< css::beans::PropertyValue >& i_rNewProp ); + + bool IsPrintFormControls() const { return getBoolValue( "PrintControls", m_rDefaultPrintData.m_bPrintControl ); } + bool IsPrintPageBackground() const { return getBoolValue( "PrintPageBackground", m_rDefaultPrintData.m_bPrintPageBackground ); } + bool IsPrintProspect() const { return getBoolValue( "PrintProspect", m_rDefaultPrintData.m_bPrintProspect ); } + bool IsPrintProspectRTL() const { return getIntValue( "PrintProspectRTL", m_rDefaultPrintData.m_bPrintProspectRTL ? 1 : 0 ) != 0; } + bool IsPrintTextPlaceholders() const { return getBoolValue( "PrintTextPlaceholder", m_rDefaultPrintData.m_bPrintTextPlaceholder ); } + bool IsPrintHiddenText() const { return getBoolValue( "PrintHiddenText", m_rDefaultPrintData.m_bPrintHiddenText ); } + bool IsPrintWithBlackTextColor() const { return getBoolValue( "PrintBlackFonts", m_rDefaultPrintData.m_bPrintBlackFont ); } + SwPostItMode GetPrintPostItsType() const { return static_cast< SwPostItMode >(getIntValue( "PrintAnnotationMode", static_cast<sal_uInt16>(m_rDefaultPrintData.m_nPrintPostIts) )); } + bool IsPaperFromSetup() const { return getBoolValue( "PrintPaperFromSetup", m_rDefaultPrintData.m_bPaperFromSetup ); } + + bool IsPrintLeftPages() const; + bool IsPrintRightPages() const; + bool IsPrintEmptyPages( bool bIsPDFExport ) const; + bool IsPrintGraphics() const; + bool IsPrintDrawings() const; +}; + +/** A class that stores temporary data that is needed for rendering the document. + Usually this data is created when 'getRendererCount' is called and + and it is used in the 'render' function of that same interface */ +class SwRenderData +{ + /** pages valid for printing (according to the current settings) + This set of pages does NOT depend on the 'PageRange' that is used as a printing option! */ + std::set< sal_Int32 > m_aValidPages; ///< the set of possible pages (see StringRangeEnumerator::getRangesFromString ) + + /// printer paper tray to use for each of the m_aValidPages above + std::map< sal_Int32, sal_Int32 > m_aPrinterPaperTrays; + + /** vector of pages and their order to be printed (duplicates and any order allowed!) + (see 'render' in unotxdoc.cxx) + negative entry indicates the page to be printed is from the post-it doc */ + std::vector< sal_Int32 > m_aPagesToPrint; + + /** for prospect printing: the pairs of pages to be printed together on a single prospect page. + -1 indicates a half page to be left empty. */ + std::vector< std::pair< sal_Int32, sal_Int32 > > m_aPagePairs; + + OUString m_aPageRange; + + /** temp print document -- must live longer than m_pViewOptionAdjust! + also this is a Lock and not a Ref because Ref does not delete the doc */ + SfxObjectShellLock m_xTempDocShell; + + /// the view options to be applied for printing + std::unique_ptr<SwViewOptionAdjust_Impl> m_pViewOptionAdjust; + + std::unique_ptr<SwPrintData> m_pPrtOptions; + +public: + + // PostIt relevant data + /// an array of "SetGetExpField *" sorted by page and line numbers + std::unique_ptr<SetGetExpFields> m_pPostItFields; + /// this contains a SwDoc with the post-it content + std::unique_ptr<SwViewShell> m_pPostItShell; + +public: + SwRenderData(); + ~SwRenderData(); + + bool HasPostItData() const { return m_pPostItShell != nullptr; } + void CreatePostItData( SwDoc *pDoc, const SwViewOption *pViewOpt, OutputDevice *pOutDev ); + void DeletePostItData(); + + SfxObjectShellLock const& GetTempDocShell() const { return m_xTempDocShell;} + void SetTempDocShell(SfxObjectShellLock const&); + + bool IsViewOptionAdjust() const { return m_pViewOptionAdjust != nullptr; } + bool NeedNewViewOptionAdjust( const SwViewShell& ) const; + void ViewOptionAdjustStart( SwViewShell &rSh, const SwViewOption &rViewOptions); + void ViewOptionAdjust( SwPrintData const* const pPrtOptions, bool setShowPlaceHoldersInPDF ); + void ViewOptionAdjustStop(); + void ViewOptionAdjustCrashPreventionKludge(); + + bool HasSwPrtOptions() const { return m_pPrtOptions != nullptr; } + SwPrintData const* GetSwPrtOptions() const { return m_pPrtOptions.get(); } + void MakeSwPrtOptions( SwDocShell const*const pDocShell, + SwPrintUIOptions const*const pOpt, bool const bIsPDFExport ); + + typedef std::vector< std::pair< sal_Int32, sal_Int32 > > PagePairsVec_t; + + std::set< sal_Int32 > & GetValidPagesSet() { return m_aValidPages; } + const std::set< sal_Int32 > & GetValidPagesSet() const { return m_aValidPages; } + + /** a map for printer paper tray numbers to use for each document page + a value of -1 for the tray means that there is no specific tray defined */ + std::map< sal_Int32, sal_Int32 >& GetPrinterPaperTrays() { return m_aPrinterPaperTrays; } + const std::map< sal_Int32, sal_Int32 >& GetPrinterPaperTrays() const { return m_aPrinterPaperTrays; } + + /** used for 'normal' printing + A page value of 0 as entry indicates that this page is not from the document but + from the post-it document. (See also GetPostItStartFrame below) */ + std::vector< sal_Int32 > & GetPagesToPrint() { return m_aPagesToPrint; } + const std::vector< sal_Int32 > & GetPagesToPrint() const { return m_aPagesToPrint; } + + /// used for prospect printing only + PagePairsVec_t & GetPagePairsForProspectPrinting() { return m_aPagePairs; } + const PagePairsVec_t & GetPagePairsForProspectPrinting() const { return m_aPagePairs; } + + const OUString& GetPageRange() const { return m_aPageRange; } + void SetPageRange( const OUString &rRange ) { m_aPageRange = rRange; } +}; + +namespace sw { + +void InitPrintOptionsFromApplication(SwPrintData & o_rData, bool const bWeb); + +} ///< namespace sw + +#endif // INCLUDED_SW_INC_PRINTDATA_HXX + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ |