1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336
|
/* -*- 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_SC_SOURCE_UI_INC_PRINTFUN_HXX
#define INCLUDED_SC_SOURCE_UI_INC_PRINTFUN_HXX
#include "pagepar.hxx"
#include "editutil.hxx"
#include <vcl/print.hxx>
class SfxPrinter;
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
// Settings for headers/footers
struct ScPrintHFParam
{
bool bEnable;
bool bDynamic;
bool bShared;
long nHeight; // in total (height + distance + frames)
long nManHeight; // set size (min when dynamic)
sal_uInt16 nDistance;
sal_uInt16 nLeft; // edges
sal_uInt16 nRight;
const ScPageHFItem* pLeft;
const ScPageHFItem* pRight;
const SvxBoxItem* pBorder;
const SvxBrushItem* pBack;
const SvxShadowItem* pShadow;
};
struct ScPrintState // Save Variables from ScPrintFunc
{
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;
bool* pHidden;
//! Cache Number of really visible?
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);
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 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;
long nPageStart; // Offset for the first page
long nDocPages; // Number of Pages in Document
const ScRange* pUserArea; // Selection, if set in dialog
const SfxItemSet* pParamSet; // Selected template
bool bState; // 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;
sal_uInt16 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;
long nTabPages;
long nTotalPages;
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;
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;
std::vector<ScAddress> aNotePosList; // The order of notes
ScPageBreakData* pPageData; // for recording the breaks 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, 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( 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()
long DoPrint( const MultiSelection& rPageRanges,
long nStartPage, long nDisplayStart, bool bDoPrint,
ScPreviewLocationData* pLocationData );
// Query values - immediately
Size GetPageSize() const { return aPageSize; }
Size GetDataSize() const;
void GetScaleData( Size& rPhysSize, long& rDocHdr, long& rDocFtr );
long GetFirstPageNo() const { return aTableParam.nFirstPageNo; }
// Query last value - after 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 );
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;}
bool HasPrintRange() const;
private:
void Construct( const ScPrintOptions* pOptions );
void InitParam( const ScPrintOptions* pOptions );
void CalcZoom( sal_uInt16 nRangeNo );
void CalcPages();
long CountPages();
long CountNotePages();
bool AdjustPrintArea( bool bNew );
Size GetDocPageSize();
long TextHeight( const EditTextObject* pObject );
void MakeEditEngine();
void UpdateHFHeight( ScPrintHFParam& rParam );
void InitModes();
bool IsLeft( long nPageNo );
bool IsMirror( long nPageNo );
void ReplaceFields( long nPageNo ); // changes Text in pEditEngine
void MakeTableString(); // sets aTableStr
void PrintPage( long nPageNo,
SCCOL nX1, SCROW nY1, SCCOL nX2, SCROW nY2,
bool bDoPrint, ScPreviewLocationData* pLocationData );
void PrintArea( SCCOL nX1, SCROW nY1, SCCOL nX2, SCROW nY2,
long nScrX, long nScrY,
bool bShLeft, bool bShTop, bool bShRight, bool bShBottom );
void LocateArea( SCCOL nX1, SCROW nY1, SCCOL nX2, SCROW nY2,
long nScrX, long nScrY, bool bRepCol, 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,
bool bRepCol, ScPreviewLocationData& rLocationData );
void LocateRowHdr( SCROW nY1, SCROW nY2, long nScrX, long nScrY,
bool bRepRow, ScPreviewLocationData& rLocationData );
void PrintHF( long nPageNo, bool bHeader, long nStartY,
bool bDoPrint, ScPreviewLocationData* pLocationData );
long PrintNotes( long nPageNo, long nNoteStart, bool bDoPrint, ScPreviewLocationData* pLocationData );
long DoNotes( long nNoteStart, 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
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|