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