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 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358
|
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
/*************************************************************************
*
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* Copyright 2000, 2010 Oracle and/or its affiliates.
*
* OpenOffice.org - a multi-platform office productivity suite
*
* This file is part of OpenOffice.org.
*
* OpenOffice.org is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License version 3
* only, as published by the Free Software Foundation.
*
* OpenOffice.org is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License version 3 for more details
* (a copy is included in the LICENSE file that accompanied this code).
*
* You should have received a copy of the GNU Lesser General Public License
* version 3 along with OpenOffice.org. If not, see
* <http://www.openoffice.org/license.html>
* for a copy of the LGPLv3 License.
*
************************************************************************/
#ifndef SC_PRINTFUN_HXX
#define SC_PRINTFUN_HXX
#include "pagepar.hxx"
#include "editutil.hxx"
#include <vcl/print.hxx>
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;
SCCOL* pPageEndX; // Seitenaufteilung
SCROW* pPageEndY;
ScPageRowEntry* pPageRows;
size_t nPagesX;
size_t nPagesY;
size_t nTotalY;
ScHeaderEditEngine* pEditEngine;
SfxItemSet* pEditDefaults;
ScHeaderFieldData aFieldData;
std::vector<ScAddress> 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, 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
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|