1
0
Fork 0
libreoffice/sc/source/ui/inc/printfun.hxx
Daniel Baumann 8e63e14cf6
Adding upstream version 4:25.2.3.
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
2025-06-22 16:20:04 +02:00

436 lines
16 KiB
C++

/* -*- 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 .
*/
#pragma once
#include <memory>
#include <map>
#include <pagepar.hxx>
#include <editutil.hxx>
class SfxPrinter;
class ScDocShell;
class ScDocument;
class ScViewData;
class SfxItemSet;
class ScPageHFItem;
class EditTextObject;
class MultiSelection;
class ScPageBreakData;
class ScPreviewLocationData;
class ScPrintOptions;
class SvxBoxItem;
class SvxBrushItem;
class SvxShadowItem;
class FmFormView;
#define RANGENO_NORANGE USHRT_MAX
constexpr sal_Int64 PRINT_HEADER_WIDTH = o3tl::toTwips(1, o3tl::Length::cm);
constexpr sal_Int64 PRINT_HEADER_HEIGHT = o3tl::toTwips(12.8, o3tl::Length::pt);
// Settings for headers/footers
struct ScPrintHFParam
{
bool bEnable;
bool bDynamic;
bool bShared;
bool bSharedFirst;
tools::Long nHeight; // in total (height + distance + frames)
tools::Long nManHeight; // set size (min when dynamic)
sal_uInt16 nDistance;
sal_uInt16 nLeft; // edges
sal_uInt16 nRight;
const ScPageHFItem* pLeft;
const ScPageHFItem* pRight;
const ScPageHFItem* pFirst;
const SvxBoxItem* pBorder;
const SvxBrushItem* pBack;
const SvxShadowItem* pShadow;
};
class ScPageRowEntry
{
private:
SCROW nStartRow;
SCROW nEndRow;
size_t nPagesX;
std::vector<bool> aHidden;
//! Cache Number of really visible?
public:
ScPageRowEntry() { nStartRow = nEndRow = 0; nPagesX = 0; }
ScPageRowEntry(const ScPageRowEntry& r);
ScPageRowEntry& operator=(const ScPageRowEntry& r);
SCROW GetStartRow() const { return nStartRow; }
SCROW GetEndRow() const { return nEndRow; }
size_t GetPagesX() const { return nPagesX; }
void SetStartRow(SCROW n) { nStartRow = n; }
void SetEndRow(SCROW n) { nEndRow = n; }
void SetPagesX(size_t nNew);
void SetHidden(size_t nX);
bool IsHidden(size_t nX) const;
size_t CountVisible() const;
};
namespace sc
{
struct PrintPageRangesInput
{
bool m_bSkipEmpty;
bool m_bPrintArea;
ScRange m_aRange;
Size m_aDocSize;
PrintPageRangesInput()
: m_bSkipEmpty(false)
, m_bPrintArea(false)
{}
PrintPageRangesInput(bool bSkipEmpty, bool bPrintArea, ScRange const& rRange, Size const& rDocSize)
: m_bSkipEmpty(bSkipEmpty)
, m_bPrintArea(bPrintArea)
, m_aRange(rRange)
, m_aDocSize(rDocSize)
{}
bool operator==(PrintPageRangesInput const& rInput) const
{
return
m_bSkipEmpty == rInput.m_bSkipEmpty &&
m_bPrintArea == rInput.m_bPrintArea &&
m_aRange == rInput.m_aRange &&
m_aDocSize == rInput.m_aDocSize;
}
PrintPageRangesInput& operator=(PrintPageRangesInput const& rInput)
{
m_bSkipEmpty = rInput.m_bSkipEmpty;
m_bPrintArea = rInput.m_bPrintArea;
m_aRange = rInput.m_aRange;
m_aDocSize = rInput.m_aDocSize;
return *this;
}
SCROW getStartRow() const
{
return m_aRange.aStart.Row();
}
SCROW getEndRow() const
{
return m_aRange.aEnd.Row();
}
SCCOL getStartColumn() const
{
return m_aRange.aStart.Col();
}
SCCOL getEndColumn() const
{
return m_aRange.aEnd.Col();
}
SCTAB getPrintTab() const
{
return m_aRange.aStart.Tab();
}
};
class PrintPageRanges
{
public:
PrintPageRanges();
// use shared_ptr to avoid copying this (potentially large) data back and forth
std::shared_ptr<std::vector<SCCOL>> m_xPageEndX;
std::shared_ptr<std::vector<SCROW>> m_xPageEndY;
std::shared_ptr<std::map<size_t, ScPageRowEntry>> m_xPageRows;
size_t m_nPagesX;
size_t m_nPagesY;
size_t m_nTotalY;
PrintPageRangesInput m_aInput;
void calculate(ScDocument& rDoc, PrintPageRangesInput const& rInput);
};
} // end sc namespace
// Used to save expensive-to-compute data from ScPrintFunc in between
// uses of ScPrintFunc
struct ScPrintState
{
SCTAB nPrintTab;
SCCOL nStartCol;
SCROW nStartRow;
SCCOL nEndCol;
SCROW nEndRow;
bool bPrintAreaValid; // the 4 variables above are set
sal_uInt16 nZoom;
tools::Long nTabPages;
tools::Long nTotalPages;
tools::Long nPageStart;
tools::Long nDocPages;
// Additional state of page ranges
sc::PrintPageRanges m_aRanges;
ScPrintState()
: nPrintTab(0)
, nStartCol(0)
, nStartRow(0)
, nEndCol(0)
, nEndRow(0)
, bPrintAreaValid(false)
, nZoom(0)
, nTabPages(0)
, nTotalPages(0)
, nPageStart(0)
, nDocPages(0)
{}
};
class ScPrintFunc
{
private:
ScDocShell* pDocShell;
ScDocument& rDoc;
VclPtr<SfxPrinter> pPrinter;
VclPtr<OutputDevice> pDev;
FmFormView* pDrawView;
MapMode aOldPrinterMode; // MapMode before the call
Point aSrcOffset; // Paper-1/100 mm
Point aOffset; // scaled by a factor of page size
sal_uInt16 nManualZoom; // Zoom in Preview (percent)
bool bClearWin; // Clear output before
bool bUseStyleColor;
bool bIsRender;
SCTAB nPrintTab;
tools::Long nPageStart; // Offset for the first page
tools::Long nDocPages; // Number of Pages in Document
const ScRange* pUserArea; // Selection, if set in dialog
const SfxItemSet* pParamSet; // Selected template
bool bFromPrintState; // created from State-struct
// Parameter from template:
sal_uInt16 nLeftMargin;
sal_uInt16 nTopMargin;
sal_uInt16 nRightMargin;
sal_uInt16 nBottomMargin;
bool bCenterHor;
bool bCenterVer;
bool bLandscape;
bool bSourceRangeValid;
SvxPageUsage nPageUsage;
Size aPageSize; // Printer Twips
const SvxBoxItem* pBorderItem;
const SvxBrushItem* pBackgroundItem;
const SvxShadowItem* pShadowItem;
ScRange aLastSourceRange;
ScPrintHFParam aHdr;
ScPrintHFParam aFtr;
ScPageTableParam aTableParam;
ScPageAreaParam aAreaParam;
// Calculated values:
sal_uInt16 nZoom;
bool bPrintCurrentTable;
bool bMultiArea;
bool mbHasPrintRange;
tools::Long nTabPages;
tools::Long nTotalPages;
tools::Rectangle aPageRect; // Document Twips
MapMode aLogicMode; // Set in DoPrint
MapMode aOffsetMode;
MapMode aTwipMode;
double nScaleX;
double nScaleY;
SCCOL nRepeatStartCol;
SCCOL nRepeatEndCol;
SCROW nRepeatStartRow;
SCROW nRepeatEndRow;
SCCOL nStartCol;
SCROW nStartRow;
SCCOL nEndCol;
SCROW nEndRow;
bool bPrintAreaValid; // the 4 variables above are set
sc::PrintPageRanges m_aRanges;
std::unique_ptr<ScHeaderEditEngine> pEditEngine;
std::unique_ptr<SfxItemSet> pEditDefaults;
ScHeaderFieldData aFieldData;
std::vector<ScAddress> aNotePosList; // The order of notes
ScPageBreakData* pPageData; // for recording the breaks etc.
Size aPrintPageSize; // print page size in Print dialog
bool bPrintPageLandscape; // print page orientation in Print dialog
bool bUsePrintDialogSetting; // use Print dialog setting
public:
ScPrintFunc( ScDocShell* pShell, SfxPrinter* pNewPrinter, SCTAB nTab,
tools::Long nPage = 0, tools::Long nDocP = 0,
const ScRange* pArea = nullptr,
const ScPrintOptions* pOptions = nullptr,
ScPageBreakData* pData = nullptr,
Size aPrintPageSize = {},
bool bPrintPageLandscape = false,
bool bUsePrintDialogSetting = false );
ScPrintFunc( ScDocShell* pShell, SfxPrinter* pNewPrinter,
const ScPrintState& rState, const ScPrintOptions* pOptions,
Size aPrintPageSize = {},
bool bPrintPageLandscape = false,
bool bUsePrintDialogSetting = false );
// ctors for device other than printer - for preview and pdf:
ScPrintFunc( OutputDevice* pOutDev, ScDocShell* pShell, SCTAB nTab,
tools::Long nPage = 0, tools::Long nDocP = 0,
const ScRange* pArea = nullptr,
const ScPrintOptions* pOptions = nullptr );
ScPrintFunc( OutputDevice* pOutDev, ScDocShell* pShell,
const ScPrintState& rState,
const ScPrintOptions* pOptions, Size aPrintPageSize = {},
bool bPrintPageLandscape = false,
bool bUsePrintDialogSetting = false);
~ScPrintFunc();
static void DrawToDev( ScDocument& rDoc, OutputDevice* pDev, double nPrintFactor,
const tools::Rectangle& rBound, ScViewData* pViewData, bool bMetaFile );
void SetDrawView( FmFormView* pNew );
void SetOffset( const Point& rOfs );
void SetManualZoom( sal_uInt16 nNewZoom );
void SetDateTime( const DateTime& );
void SetClearFlag( bool bFlag );
void SetUseStyleColor( bool bFlag );
void SetRenderFlag( bool bFlag );
void SetExclusivelyDrawOleAndDrawObjects();//for printing selected objects without surrounding cell contents
bool UpdatePages();
void ApplyPrintSettings(); // Already called from DoPrint()
tools::Long DoPrint( const MultiSelection& rPageRanges,
tools::Long nStartPage, tools::Long nDisplayStart, bool bDoPrint,
ScPreviewLocationData* pLocationData );
// Query values - immediately
const Size& GetPageSize() const { return aPageSize; }
Size GetDataSize() const;
void GetScaleData( Size& rPhysSize, tools::Long& rDocHdr, tools::Long& rDocFtr );
tools::Long GetFirstPageNo() const { return aTableParam.nFirstPageNo; }
tools::Long GetTotalPages() const { return nTotalPages; }
sal_uInt16 GetZoom() const { return nZoom; }
void ResetBreaks( SCTAB nTab );
void GetPrintState(ScPrintState& rState);
bool GetLastSourceRange( ScRange& rRange ) const;
sal_uInt16 GetLeftMargin() const{return nLeftMargin;}
sal_uInt16 GetRightMargin() const{return nRightMargin;}
sal_uInt16 GetTopMargin() const{return nTopMargin;}
sal_uInt16 GetBottomMargin() const{return nBottomMargin;}
const ScPrintHFParam& GetHeader() const {return aHdr;}
const ScPrintHFParam& GetFooter() const {return aFtr;}
bool HasPrintRange() const { return mbHasPrintRange;}
private:
void Construct( const ScPrintOptions* pOptions );
void InitParam( const ScPrintOptions* pOptions );
void CalcZoom( sal_uInt16 nRangeNo );
void CalcPages();
tools::Long CountPages();
tools::Long CountNotePages();
bool AdjustPrintArea( bool bNew );
Size GetDocPageSize();
tools::Long TextHeight( const EditTextObject* pObject );
void MakeEditEngine();
void UpdateHFHeight( ScPrintHFParam& rParam );
void InitModes();
bool IsLeft( tools::Long nPageNo );
bool IsMirror( tools::Long nPageNo );
void MakeTableString(); // sets aTableStr
void PrintPage( tools::Long nPageNo,
SCCOL nX1, SCROW nY1, SCCOL nX2, SCROW nY2,
bool bDoPrint, ScPreviewLocationData* pLocationData );
void PrintArea( SCCOL nX1, SCROW nY1, SCCOL nX2, SCROW nY2,
tools::Long nScrX, tools::Long nScrY,
bool bShLeft, bool bShTop, bool bShRight, bool bShBottom );
void LocateArea( SCCOL nX1, SCROW nY1, SCCOL nX2, SCROW nY2,
tools::Long nScrX, tools::Long nScrY, bool bRepCol, bool bRepRow,
ScPreviewLocationData& rLocationData );
void PrintColHdr( SCCOL nX1, SCCOL nX2, tools::Long nScrX, tools::Long nScrY );
void PrintRowHdr( SCROW nY1, SCROW nY2, tools::Long nScrX, tools::Long nScrY );
void LocateColHdr( SCCOL nX1, SCCOL nX2, tools::Long nScrX, tools::Long nScrY,
bool bRepCol, ScPreviewLocationData& rLocationData );
void LocateRowHdr( SCROW nY1, SCROW nY2, tools::Long nScrX, tools::Long nScrY,
bool bRepRow, ScPreviewLocationData& rLocationData );
void PrintHF( tools::Long nPageNo, bool bHeader, tools::Long nStartY,
bool bDoPrint, ScPreviewLocationData* pLocationData );
tools::Long PrintNotes( tools::Long nPageNo, tools::Long nNoteStart, bool bDoPrint, ScPreviewLocationData* pLocationData );
tools::Long DoNotes( tools::Long nNoteStart, bool bDoPrint, ScPreviewLocationData* pLocationData );
void DrawBorder( tools::Long nScrX, tools::Long nScrY, tools::Long nScrW, tools::Long nScrH,
const SvxBoxItem* pBorderData,
const SvxBrushItem* pBackground,
const SvxShadowItem* pShadow );
void FillPageData();
};
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */