/************************************************************** * * 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 #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