blob: ca76e0684ed2e07b455cf00287488caa1e071bc2 [file] [log] [blame]
/**************************************************************
*
* 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
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*
*************************************************************/
#ifndef SC_PRINTFUN_HXX
#define SC_PRINTFUN_HXX
#include "pagepar.hxx"
#include "editutil.hxx"
#ifndef _PRINT_HXX //autogen
#include <vcl/print.hxx>
#endif
class SfxPrinter;
class SfxProgress;
class ScDocShell;
class ScDocument;
class ScViewData;
class SfxItemSet;
class ScPageHFItem;
class EditTextObject;
class MultiSelection;
class ScHeaderEditEngine;
class ScPageBreakData;
class ScPreviewLocationData;
class ScPrintOptions;
class SvxBoxItem;
class SvxBrushItem;
class SvxShadowItem;
class FmFormView;
#define RANGENO_NORANGE USHRT_MAX
#define PRINT_HEADER_WIDTH (1.0 * TWIPS_PER_CM)
#define PRINT_HEADER_HEIGHT (12.8 * TWIPS_PER_POINT)
#define PRINT_HEADER_FONTHEIGHT 200
// Einstellungen fuer Kopf-/Fusszeilen
struct ScPrintHFParam
{
sal_Bool bEnable;
sal_Bool bDynamic;
sal_Bool bShared;
long nHeight; // insgesamt (Hoehe+Abstand+Rahmen)
long nManHeight; // eingestellte Groesse (Min. bei dynamisch)
sal_uInt16 nDistance;
sal_uInt16 nLeft; // Raender
sal_uInt16 nRight;
const ScPageHFItem* pLeft;
const ScPageHFItem* pRight;
const SvxBoxItem* pBorder;
const SvxBrushItem* pBack;
const SvxShadowItem* pShadow;
};
// "Ersatz" fuer SV-JobSetup:
class ScJobSetup
{
public:
ScJobSetup( SfxPrinter* pPrinter );
Size aUserSize;
MapMode aUserMapMode;
Paper ePaper;
Orientation eOrientation;
sal_uInt16 nPaperBin;
};
struct ScPrintState // Variablen aus ScPrintFunc retten
{
SCTAB nPrintTab;
SCCOL nStartCol;
SCROW nStartRow;
SCCOL nEndCol;
SCROW nEndRow;
sal_uInt16 nZoom;
size_t nPagesX;
size_t nPagesY;
long nTabPages;
long nTotalPages;
long nPageStart;
long nDocPages;
};
class ScPageRowEntry
{
private:
SCROW nStartRow;
SCROW nEndRow;
size_t nPagesX;
sal_Bool* pHidden;
//! Anzahl wirklich sichtbarer cachen???
public:
ScPageRowEntry() { nStartRow = nEndRow = 0; nPagesX = 0; pHidden = NULL; }
~ScPageRowEntry() { delete[] pHidden; }
ScPageRowEntry(const ScPageRowEntry& r);
const 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);
sal_Bool IsHidden(size_t nX) const;
size_t CountVisible() const;
};
class ScPrintFunc
{
private:
ScDocShell* pDocShell;
ScDocument* pDoc;
SfxPrinter* pPrinter;
OutputDevice* pDev;
FmFormView* pDrawView;
MapMode aOldPrinterMode; // MapMode vor dem Aufruf
Point aSrcOffset; // Papier-1/100 mm
Point aOffset; // mit Faktor aus Seitenformat skaliert
sal_uInt16 nManualZoom; // Zoom in Preview (Prozent)
sal_Bool bClearWin; // Ausgabe vorher loeschen
sal_Bool bUseStyleColor;
sal_Bool bIsRender;
SCTAB nPrintTab;
long nPageStart; // Offset fuer erste Seite
long nDocPages; // Seiten im Dokument
const ScRange* pUserArea; // Selektion, wenn im Dialog eingestellt
const SfxItemSet* pParamSet; // eingestellte Vorlage
sal_Bool bState; // aus State-struct erzeugt
// Parameter aus Vorlage:
sal_uInt16 nLeftMargin;
sal_uInt16 nTopMargin;
sal_uInt16 nRightMargin;
sal_uInt16 nBottomMargin;
sal_Bool bCenterHor;
sal_Bool bCenterVer;
sal_Bool bLandscape;
sal_Bool bSourceRangeValid;
sal_uInt16 nPageUsage;
Size aPageSize; // Drucker-Twips
const SvxBoxItem* pBorderItem;
const SvxBrushItem* pBackgroundItem;
const SvxShadowItem* pShadowItem;
ScRange aLastSourceRange;
ScPrintHFParam aHdr;
ScPrintHFParam aFtr;
ScPageTableParam aTableParam;
ScPageAreaParam aAreaParam;
// berechnete Werte:
sal_uInt16 nZoom;
sal_Bool bPrintCurrentTable;
sal_Bool bMultiArea;
long nTabPages;
long nTotalPages;
Rectangle aPageRect; // Dokument-Twips
MapMode aLogicMode; // in DoPrint gesetzt
MapMode aOffsetMode;
MapMode aTwipMode;
double nScaleX;
double nScaleY;
SCCOL nRepeatStartCol;
SCCOL nRepeatEndCol;
SCROW nRepeatStartRow;
SCROW nRepeatEndRow;
SCCOL nStartCol;
SCROW nStartRow;
SCCOL nEndCol;
SCROW nEndRow;
// #123672# use dynamic mem to react on size changes
std::vector< SCCOL > maPageEndX;
std::vector< SCROW > maPageEndY;
std::vector< ScPageRowEntry> maPageRows;
size_t nPagesX;
size_t nPagesY;
size_t nTotalY;
ScHeaderEditEngine* pEditEngine;
SfxItemSet* pEditDefaults;
ScHeaderFieldData aFieldData;
List aNotePosList; // Reihenfolge der Notizen
ScPageBreakData* pPageData; // zum Eintragen der Umbrueche etc.
public:
ScPrintFunc( ScDocShell* pShell, SfxPrinter* pNewPrinter, SCTAB nTab,
long nPage = 0, long nDocP = 0,
const ScRange* pArea = NULL,
const ScPrintOptions* pOptions = NULL,
ScPageBreakData* pData = NULL );
// ctors for device other than printer - for preview and pdf:
ScPrintFunc( OutputDevice* pOutDev, ScDocShell* pShell, SCTAB nTab,
long nPage = 0, long nDocP = 0,
const ScRange* pArea = NULL,
const ScPrintOptions* pOptions = NULL );
ScPrintFunc( OutputDevice* pOutDev, ScDocShell* pShell,
const ScPrintState& rState,
const ScPrintOptions* pOptions );
~ScPrintFunc();
static void DrawToDev( ScDocument* pDoc, OutputDevice* pDev, double nPrintFactor,
const Rectangle& rBound, ScViewData* pViewData, sal_Bool bMetaFile );
void SetDrawView( FmFormView* pNew );
void SetOffset( const Point& rOfs );
void SetManualZoom( sal_uInt16 nNewZoom );
void SetDateTime( const Date& rDate, const Time& rTime );
void SetClearFlag( sal_Bool bFlag );
void SetUseStyleColor( sal_Bool bFlag );
void SetRenderFlag( sal_Bool bFlag );
void SetExclusivelyDrawOleAndDrawObjects();//for printing selected objects without surrounding cell contents
sal_Bool UpdatePages();
void ApplyPrintSettings(); // aus DoPrint() schon gerufen
long DoPrint( const MultiSelection& rPageRanges,
long nStartPage, long nDisplayStart, sal_Bool bDoPrint,
ScPreviewLocationData* pLocationData );
// Werte abfragen - sofort
Size GetPageSize() const { return aPageSize; }
Size GetDataSize() const;
void GetScaleData( Size& rPhysSize, long& rDocHdr, long& rDocFtr );
long GetFirstPageNo() const { return aTableParam.nFirstPageNo; }
// letzte Werte abfragen - nach DoPrint !!!
double GetScaleX() const { return nScaleX; }
double GetScaleY() const { return nScaleY; }
long GetTotalPages() const { return nTotalPages; }
sal_uInt16 GetZoom() const { return nZoom; }
void ResetBreaks( SCTAB nTab );
void GetPrintState( ScPrintState& rState );
sal_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;}
void SetLeftMargin(sal_uInt16 nRulerLeftDistance){ nLeftMargin = nRulerLeftDistance; }
void SetRightMargin(sal_uInt16 nRulerRightDistance){ nRightMargin = nRulerRightDistance; }
void SetTopMargin(sal_uInt16 nRulerTopDistance){ nTopMargin = nRulerTopDistance; }
void SetBottomMargin(sal_uInt16 nRulerBottomDistance){ nBottomMargin = nRulerBottomDistance; }
ScPrintHFParam GetHeader(){return aHdr;}
ScPrintHFParam GetFooter(){return aFtr;}
private:
void Construct( const ScPrintOptions* pOptions );
void InitParam( const ScPrintOptions* pOptions );
void CalcZoom( sal_uInt16 nRangeNo );
void CalcPages();
long CountPages();
long CountNotePages();
sal_Bool AdjustPrintArea( sal_Bool bNew );
Size GetDocPageSize();
long TextHeight( const EditTextObject* pObject );
void MakeEditEngine();
void UpdateHFHeight( ScPrintHFParam& rParam );
void InitModes();
sal_Bool IsLeft( long nPageNo );
sal_Bool IsMirror( long nPageNo );
void ReplaceFields( long nPageNo ); // aendert Text in pEditEngine
void MakeTableString(); // setzt aTableStr
void PrintPage( long nPageNo,
SCCOL nX1, SCROW nY1, SCCOL nX2, SCROW nY2,
sal_Bool bDoPrint, ScPreviewLocationData* pLocationData );
void PrintArea( SCCOL nX1, SCROW nY1, SCCOL nX2, SCROW nY2,
long nScrX, long nScrY,
sal_Bool bShLeft, sal_Bool bShTop, sal_Bool bShRight, sal_Bool bShBottom );
void LocateArea( SCCOL nX1, SCROW nY1, SCCOL nX2, SCROW nY2,
long nScrX, long nScrY, sal_Bool bRepCol, sal_Bool bRepRow,
ScPreviewLocationData& rLocationData );
void PrintColHdr( SCCOL nX1, SCCOL nX2, long nScrX, long nScrY );
void PrintRowHdr( SCROW nY1, SCROW nY2, long nScrX, long nScrY );
void LocateColHdr( SCCOL nX1, SCCOL nX2, long nScrX, long nScrY,
sal_Bool bRepCol, ScPreviewLocationData& rLocationData );
void LocateRowHdr( SCROW nY1, SCROW nY2, long nScrX, long nScrY,
sal_Bool bRepRow, ScPreviewLocationData& rLocationData );
void PrintHF( long nPageNo, sal_Bool bHeader, long nStartY,
sal_Bool bDoPrint, ScPreviewLocationData* pLocationData );
long PrintNotes( long nPageNo, long nNoteStart, sal_Bool bDoPrint, ScPreviewLocationData* pLocationData );
long DoNotes( long nNoteStart, sal_Bool bDoPrint, ScPreviewLocationData* pLocationData );
void DrawBorder( long nScrX, long nScrY, long nScrW, long nScrH,
const SvxBoxItem* pBorderData,
const SvxBrushItem* pBackground,
const SvxShadowItem* pShadow );
void FillPageData();
};
#endif