xref: /trunk/main/sc/source/ui/inc/printfun.hxx (revision 1ecadb572e7010ff3b3382ad9bf179dbc6efadbb)
1 /*************************************************************************
2  *
3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4  *
5  * Copyright 2000, 2010 Oracle and/or its affiliates.
6  *
7  * OpenOffice.org - a multi-platform office productivity suite
8  *
9  * This file is part of OpenOffice.org.
10  *
11  * OpenOffice.org is free software: you can redistribute it and/or modify
12  * it under the terms of the GNU Lesser General Public License version 3
13  * only, as published by the Free Software Foundation.
14  *
15  * OpenOffice.org is distributed in the hope that it will be useful,
16  * but WITHOUT ANY WARRANTY; without even the implied warranty of
17  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18  * GNU Lesser General Public License version 3 for more details
19  * (a copy is included in the LICENSE file that accompanied this code).
20  *
21  * You should have received a copy of the GNU Lesser General Public License
22  * version 3 along with OpenOffice.org.  If not, see
23  * <http://www.openoffice.org/license.html>
24  * for a copy of the LGPLv3 License.
25  *
26  ************************************************************************/
27 
28 #ifndef SC_PRINTFUN_HXX
29 #define SC_PRINTFUN_HXX
30 
31 
32 #include "pagepar.hxx"
33 #include "editutil.hxx"
34 
35 #ifndef _PRINT_HXX //autogen
36 #include <vcl/print.hxx>
37 #endif
38 
39 class SfxPrinter;
40 class SfxProgress;
41 class ScDocShell;
42 class ScDocument;
43 class ScViewData;
44 class SfxItemSet;
45 class ScPageHFItem;
46 class EditTextObject;
47 class MultiSelection;
48 class ScHeaderEditEngine;
49 class ScPageBreakData;
50 class ScPreviewLocationData;
51 class ScPrintOptions;
52 class SvxBoxItem;
53 class SvxBrushItem;
54 class SvxShadowItem;
55 class FmFormView;
56 
57 #define RANGENO_NORANGE             USHRT_MAX
58 
59 #define PRINT_HEADER_WIDTH          (1.0 * TWIPS_PER_CM)
60 #define PRINT_HEADER_HEIGHT         (12.8 * TWIPS_PER_POINT)
61 #define PRINT_HEADER_FONTHEIGHT     200
62 
63 
64                                             //  Einstellungen fuer Kopf-/Fusszeilen
65 struct ScPrintHFParam
66 {
67     sal_Bool                bEnable;
68     sal_Bool                bDynamic;
69     sal_Bool                bShared;
70     long                nHeight;            //  insgesamt (Hoehe+Abstand+Rahmen)
71     long                nManHeight;         //  eingestellte Groesse (Min. bei dynamisch)
72     sal_uInt16              nDistance;
73     sal_uInt16              nLeft;              //  Raender
74     sal_uInt16              nRight;
75     const ScPageHFItem* pLeft;
76     const ScPageHFItem* pRight;
77     const SvxBoxItem*   pBorder;
78     const SvxBrushItem* pBack;
79     const SvxShadowItem* pShadow;
80 };
81 
82 
83 // "Ersatz" fuer SV-JobSetup:
84 
85 class ScJobSetup
86 {
87 public:
88     ScJobSetup( SfxPrinter* pPrinter );
89 
90     Size        aUserSize;
91     MapMode     aUserMapMode;
92     Paper   ePaper;
93     Orientation eOrientation;
94     sal_uInt16      nPaperBin;
95 };
96 
97 struct ScPrintState                         //  Variablen aus ScPrintFunc retten
98 {
99     SCTAB   nPrintTab;
100     SCCOL   nStartCol;
101     SCROW   nStartRow;
102     SCCOL   nEndCol;
103     SCROW   nEndRow;
104     sal_uInt16  nZoom;
105     size_t  nPagesX;
106     size_t  nPagesY;
107     long    nTabPages;
108     long    nTotalPages;
109     long    nPageStart;
110     long    nDocPages;
111 };
112 
113 class ScPageRowEntry
114 {
115 private:
116     SCROW   nStartRow;
117     SCROW   nEndRow;
118     size_t  nPagesX;
119     sal_Bool*   pHidden;
120     //!     Anzahl wirklich sichtbarer cachen???
121 
122 public:
123             ScPageRowEntry()    { nStartRow = nEndRow = 0; nPagesX = 0; pHidden = NULL; }
124             ~ScPageRowEntry()   { delete[] pHidden; }
125 
126             ScPageRowEntry(const ScPageRowEntry& r);
127     const ScPageRowEntry& operator=(const ScPageRowEntry& r);
128 
129     SCROW   GetStartRow() const     { return nStartRow; }
130     SCROW   GetEndRow() const       { return nEndRow; }
131     size_t  GetPagesX() const       { return nPagesX; }
132     void    SetStartRow(SCROW n)    { nStartRow = n; }
133     void    SetEndRow(SCROW n)      { nEndRow = n; }
134 
135     void    SetPagesX(size_t nNew);
136     void    SetHidden(size_t nX);
137     sal_Bool    IsHidden(size_t nX) const;
138 
139     size_t  CountVisible() const;
140 };
141 
142 class ScPrintFunc
143 {
144 private:
145     ScDocShell*         pDocShell;
146     ScDocument*         pDoc;
147     SfxPrinter*         pPrinter;
148     OutputDevice*       pDev;
149     FmFormView*         pDrawView;
150 
151     MapMode             aOldPrinterMode;    //  MapMode vor dem Aufruf
152 
153     Point               aSrcOffset;         //  Papier-1/100 mm
154     Point               aOffset;            //  mit Faktor aus Seitenformat skaliert
155     sal_uInt16              nManualZoom;        //  Zoom in Preview (Prozent)
156     sal_Bool                bClearWin;          //  Ausgabe vorher loeschen
157     sal_Bool                bUseStyleColor;
158     sal_Bool                bIsRender;
159 
160     SCTAB               nPrintTab;
161     long                nPageStart;         //  Offset fuer erste Seite
162     long                nDocPages;          //  Seiten im Dokument
163 
164     const ScRange*      pUserArea;          //  Selektion, wenn im Dialog eingestellt
165 
166     const SfxItemSet*   pParamSet;          //  eingestellte Vorlage
167     sal_Bool                bState;             //  aus State-struct erzeugt
168 
169                                             //  Parameter aus Vorlage:
170     sal_uInt16              nLeftMargin;
171     sal_uInt16              nTopMargin;
172     sal_uInt16              nRightMargin;
173     sal_uInt16              nBottomMargin;
174     sal_Bool                bCenterHor;
175     sal_Bool                bCenterVer;
176     sal_Bool                bLandscape;
177     sal_Bool                bSourceRangeValid;
178 
179     sal_uInt16              nPageUsage;
180     Size                aPageSize;          //  Drucker-Twips
181     const SvxBoxItem*   pBorderItem;
182     const SvxBrushItem* pBackgroundItem;
183     const SvxShadowItem* pShadowItem;
184 
185     ScRange             aLastSourceRange;
186     ScPrintHFParam      aHdr;
187     ScPrintHFParam      aFtr;
188     ScPageTableParam    aTableParam;
189     ScPageAreaParam     aAreaParam;
190 
191                                             //  berechnete Werte:
192     sal_uInt16              nZoom;
193     sal_Bool                bPrintCurrentTable;
194     sal_Bool                bMultiArea;
195     long                nTabPages;
196     long                nTotalPages;
197 
198     Rectangle           aPageRect;          //  Dokument-Twips
199 
200     MapMode             aLogicMode;         //  in DoPrint gesetzt
201     MapMode             aOffsetMode;
202     MapMode             aTwipMode;
203     double              nScaleX;
204     double              nScaleY;
205 
206     SCCOL               nRepeatStartCol;
207     SCCOL               nRepeatEndCol;
208     SCROW               nRepeatStartRow;
209     SCROW               nRepeatEndRow;
210 
211     SCCOL               nStartCol;
212     SCROW               nStartRow;
213     SCCOL               nEndCol;
214     SCROW               nEndRow;
215 
216     SCCOL*              pPageEndX;          // Seitenaufteilung
217     SCROW*              pPageEndY;
218     ScPageRowEntry*     pPageRows;
219     size_t              nPagesX;
220     size_t              nPagesY;
221     size_t              nTotalY;
222 
223     ScHeaderEditEngine* pEditEngine;
224     SfxItemSet*         pEditDefaults;
225 
226     ScHeaderFieldData   aFieldData;
227 
228     List                aNotePosList;       //  Reihenfolge der Notizen
229 
230     ScPageBreakData*    pPageData;          // zum Eintragen der Umbrueche etc.
231 
232 public:
233                     ScPrintFunc( ScDocShell* pShell, SfxPrinter* pNewPrinter, SCTAB nTab,
234                                  long nPage = 0, long nDocP = 0,
235                                  const ScRange* pArea = NULL,
236                                  const ScPrintOptions* pOptions = NULL,
237                                  ScPageBreakData* pData = NULL );
238 
239                     // ctors for device other than printer - for preview and pdf:
240 
241                     ScPrintFunc( OutputDevice* pOutDev, ScDocShell* pShell, SCTAB nTab,
242                                  long nPage = 0, long nDocP = 0,
243                                  const ScRange* pArea = NULL,
244                                  const ScPrintOptions* pOptions = NULL );
245 
246                     ScPrintFunc( OutputDevice* pOutDev, ScDocShell* pShell,
247                                  const ScPrintState& rState,
248                                  const ScPrintOptions* pOptions );
249 
250                     ~ScPrintFunc();
251 
252     static void     DrawToDev( ScDocument* pDoc, OutputDevice* pDev, double nPrintFactor,
253                                 const Rectangle& rBound, ScViewData* pViewData, sal_Bool bMetaFile );
254 
255     void            SetDrawView( FmFormView* pNew );
256 
257     void            SetOffset( const Point& rOfs );
258     void            SetManualZoom( sal_uInt16 nNewZoom );
259     void            SetDateTime( const Date& rDate, const Time& rTime );
260 
261     void            SetClearFlag( sal_Bool bFlag );
262     void            SetUseStyleColor( sal_Bool bFlag );
263     void            SetRenderFlag( sal_Bool bFlag );
264 
265     void            SetExclusivelyDrawOleAndDrawObjects();//for printing selected objects without surrounding cell contents
266 
267     sal_Bool            UpdatePages();
268 
269     void            ApplyPrintSettings();       // aus DoPrint() schon gerufen
270     long            DoPrint( const MultiSelection& rPageRanges,
271                                 long nStartPage, long nDisplayStart, sal_Bool bDoPrint,
272                                 ScPreviewLocationData* pLocationData );
273 
274                     //  Werte abfragen - sofort
275 
276     Size            GetPageSize() const { return aPageSize; }
277     Size            GetDataSize() const;
278     void            GetScaleData( Size& rPhysSize, long& rDocHdr, long& rDocFtr );
279     long            GetFirstPageNo() const  { return aTableParam.nFirstPageNo; }
280 
281                     //  letzte Werte abfragen - nach DoPrint !!!
282 
283     double          GetScaleX() const { return nScaleX; }
284     double          GetScaleY() const { return nScaleY; }
285     long            GetTotalPages() const { return nTotalPages; }
286     sal_uInt16          GetZoom() const { return nZoom; }
287 
288     void            ResetBreaks( SCTAB nTab );
289 
290     void            GetPrintState( ScPrintState& rState );
291     sal_Bool            GetLastSourceRange( ScRange& rRange ) const;
292     sal_uInt16          GetLeftMargin() const{return nLeftMargin;}
293     sal_uInt16          GetRightMargin() const{return nRightMargin;}
294     sal_uInt16          GetTopMargin() const{return nTopMargin;}
295     sal_uInt16          GetBottomMargin() const{return nBottomMargin;}
296     void            SetLeftMargin(sal_uInt16 nRulerLeftDistance){ nLeftMargin = nRulerLeftDistance; }
297     void            SetRightMargin(sal_uInt16 nRulerRightDistance){ nRightMargin = nRulerRightDistance; }
298     void            SetTopMargin(sal_uInt16 nRulerTopDistance){ nTopMargin = nRulerTopDistance; }
299     void            SetBottomMargin(sal_uInt16 nRulerBottomDistance){ nBottomMargin = nRulerBottomDistance; }
300     ScPrintHFParam  GetHeader(){return aHdr;}
301     ScPrintHFParam  GetFooter(){return aFtr;}
302 
303 private:
304     void            Construct( const ScPrintOptions* pOptions );
305     void            InitParam( const ScPrintOptions* pOptions );
306     void            CalcZoom( sal_uInt16 nRangeNo );
307     void            CalcPages();
308     long            CountPages();
309     long            CountNotePages();
310 
311     sal_Bool            AdjustPrintArea( sal_Bool bNew );
312 
313     Size            GetDocPageSize();
314 
315     long            TextHeight( const EditTextObject* pObject );
316     void            MakeEditEngine();
317     void            UpdateHFHeight( ScPrintHFParam& rParam );
318 
319     void            InitModes();
320 
321     sal_Bool            IsLeft( long nPageNo );
322     sal_Bool            IsMirror( long nPageNo );
323     void            ReplaceFields( long nPageNo );      // aendert Text in pEditEngine
324     void            MakeTableString();                  // setzt aTableStr
325 
326     void            PrintPage( long nPageNo,
327                                     SCCOL nX1, SCROW nY1, SCCOL nX2, SCROW nY2,
328                                     sal_Bool bDoPrint, ScPreviewLocationData* pLocationData );
329     void            PrintArea( SCCOL nX1, SCROW nY1, SCCOL nX2, SCROW nY2,
330                                     long nScrX, long nScrY,
331                                     sal_Bool bShLeft, sal_Bool bShTop, sal_Bool bShRight, sal_Bool bShBottom );
332     void            LocateArea( SCCOL nX1, SCROW nY1, SCCOL nX2, SCROW nY2,
333                                     long nScrX, long nScrY, sal_Bool bRepCol, sal_Bool bRepRow,
334                                     ScPreviewLocationData& rLocationData );
335     void            PrintColHdr( SCCOL nX1, SCCOL nX2, long nScrX, long nScrY );
336     void            PrintRowHdr( SCROW nY1, SCROW nY2, long nScrX, long nScrY );
337     void            LocateColHdr( SCCOL nX1, SCCOL nX2, long nScrX, long nScrY,
338                                 sal_Bool bRepCol, ScPreviewLocationData& rLocationData );
339     void            LocateRowHdr( SCROW nY1, SCROW nY2, long nScrX, long nScrY,
340                                 sal_Bool bRepRow, ScPreviewLocationData& rLocationData );
341     void            PrintHF( long nPageNo, sal_Bool bHeader, long nStartY,
342                                     sal_Bool bDoPrint, ScPreviewLocationData* pLocationData );
343 
344     long            PrintNotes( long nPageNo, long nNoteStart, sal_Bool bDoPrint, ScPreviewLocationData* pLocationData );
345     long            DoNotes( long nNoteStart, sal_Bool bDoPrint, ScPreviewLocationData* pLocationData );
346 
347     void            DrawBorder( long nScrX, long nScrY, long nScrW, long nScrH,
348                                     const SvxBoxItem* pBorderData,
349                                     const SvxBrushItem* pBackground,
350                                     const SvxShadowItem* pShadow );
351 
352     void            FillPageData();
353 };
354 
355 
356 
357 #endif
358 
359