xref: /AOO41X/main/sc/source/ui/view/output3.cxx (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 // MARKER(update_precomp.py): autogen include statement, do not remove
25 #include "precompiled_sc.hxx"
26 
27 
28 
29 // INCLUDE ---------------------------------------------------------------
30 
31 #include <editeng/eeitem.hxx>
32 #include <svx/svdograf.hxx>
33 #include <svx/svdoole2.hxx>
34 #include <svx/svdoutl.hxx>
35 #include <svx/svdpage.hxx>
36 #include <svx/svdpagv.hxx>
37 #include <svx/svdview.hxx>
38 #include <vcl/svapp.hxx>
39 
40 #include "output.hxx"
41 #include "drwlayer.hxx"
42 #include "document.hxx"
43 #include "tabvwsh.hxx"
44 #include "fillinfo.hxx"
45 
46 #include <svx/fmview.hxx>
47 
48 // STATIC DATA -----------------------------------------------------------
49 
50 SdrObject* pSkipPaintObj = NULL;
51 
52 //==================================================================
53 
54 // #i72502#
55 Point ScOutputData::PrePrintDrawingLayer(long nLogStX, long nLogStY )
56 {
57     Rectangle aRect;
58     SCCOL nCol;
59     Point aOffset;
60     long nLayoutSign(bLayoutRTL ? -1 : 1);
61 
62     for (nCol=0; nCol<nX1; nCol++)
63         aOffset.X() -= pDoc->GetColWidth( nCol, nTab ) * nLayoutSign;
64     aOffset.Y() -= pDoc->GetRowHeight( 0, nY1-1, nTab );
65 
66     long nDataWidth = 0;
67     long nDataHeight = 0;
68     for (nCol=nX1; nCol<=nX2; nCol++)
69         nDataWidth += pDoc->GetColWidth( nCol, nTab );
70     nDataHeight += pDoc->GetRowHeight( nY1, nY2, nTab );
71 
72     if ( bLayoutRTL )
73         aOffset.X() += nDataWidth;
74 
75     aRect.Left() = aRect.Right()  = -aOffset.X();
76     aRect.Top()  = aRect.Bottom() = -aOffset.Y();
77 
78     Point aMMOffset( aOffset );
79     aMMOffset.X() = (long)(aMMOffset.X() * HMM_PER_TWIPS);
80     aMMOffset.Y() = (long)(aMMOffset.Y() * HMM_PER_TWIPS);
81 
82     if (!bMetaFile)
83         aMMOffset += Point( nLogStX, nLogStY );
84 
85     for (nCol=nX1; nCol<=nX2; nCol++)
86         aRect.Right() += pDoc->GetColWidth( nCol, nTab );
87     aRect.Bottom() += pDoc->GetRowHeight( nY1, nY2, nTab );
88 
89     aRect.Left()   = (long) (aRect.Left()   * HMM_PER_TWIPS);
90     aRect.Top()    = (long) (aRect.Top()    * HMM_PER_TWIPS);
91     aRect.Right()  = (long) (aRect.Right()  * HMM_PER_TWIPS);
92     aRect.Bottom() = (long) (aRect.Bottom() * HMM_PER_TWIPS);
93 
94     if(pViewShell || pDrawView)
95     {
96         SdrView* pLocalDrawView = (pDrawView) ? pDrawView : pViewShell->GetSdrView();
97 
98         if(pLocalDrawView)
99         {
100             // #i76114# MapMode has to be set because BeginDrawLayers uses GetPaintRegion
101             MapMode aOldMode = pDev->GetMapMode();
102             if (!bMetaFile)
103                 pDev->SetMapMode( MapMode( MAP_100TH_MM, aMMOffset, aOldMode.GetScaleX(), aOldMode.GetScaleY() ) );
104 
105             // #i74769# work with SdrPaintWindow directly
106             // #i76114# pass bDisableIntersect = true, because the intersection of the table area
107             // with the Window's paint region can be empty
108             Region aRectRegion(aRect);
109             mpTargetPaintWindow = pLocalDrawView->BeginDrawLayers(pDev, aRectRegion, true);
110             OSL_ENSURE(mpTargetPaintWindow, "BeginDrawLayers: Got no SdrPaintWindow (!)");
111 
112             if (!bMetaFile)
113                 pDev->SetMapMode( aOldMode );
114         }
115     }
116 
117     return aMMOffset;
118 }
119 
120 // #i72502#
121 void ScOutputData::PostPrintDrawingLayer(const Point& rMMOffset) // #i74768#
122 {
123     // #i74768# just use offset as in PrintDrawingLayer() to also get the form controls
124     // painted with offset
125     MapMode aOldMode = pDev->GetMapMode();
126 
127     if (!bMetaFile)
128     {
129         pDev->SetMapMode( MapMode( MAP_100TH_MM, rMMOffset, aOldMode.GetScaleX(), aOldMode.GetScaleY() ) );
130     }
131 
132     if(pViewShell || pDrawView)
133     {
134         SdrView* pLocalDrawView = (pDrawView) ? pDrawView : pViewShell->GetSdrView();
135 
136         if(pLocalDrawView)
137         {
138             // #i74769# work with SdrPaintWindow directly
139             pLocalDrawView->EndDrawLayers(*mpTargetPaintWindow, true);
140             mpTargetPaintWindow = 0;
141         }
142     }
143 
144     // #i74768#
145     if (!bMetaFile)
146     {
147         pDev->SetMapMode( aOldMode );
148     }
149 }
150 
151 // #i72502#
152 void ScOutputData::PrintDrawingLayer(const sal_uInt16 nLayer, const Point& rMMOffset)
153 {
154     bool bHideAllDrawingLayer(false);
155 
156     if(pViewShell || pDrawView)
157     {
158         SdrView* pLocalDrawView = (pDrawView) ? pDrawView : pViewShell->GetSdrView();
159 
160         if(pLocalDrawView)
161         {
162             bHideAllDrawingLayer = pLocalDrawView->getHideOle() && pLocalDrawView->getHideChart()
163                     && pLocalDrawView->getHideDraw() && pLocalDrawView->getHideFormControl();
164         }
165     }
166 
167     // #109985#
168     if(bHideAllDrawingLayer || (!pDoc->GetDrawLayer()))
169     {
170         return;
171     }
172 
173     MapMode aOldMode = pDev->GetMapMode();
174 
175     if (!bMetaFile)
176     {
177         pDev->SetMapMode( MapMode( MAP_100TH_MM, rMMOffset, aOldMode.GetScaleX(), aOldMode.GetScaleY() ) );
178     }
179 
180     // #109985#
181     DrawSelectiveObjects( nLayer );
182 
183     if (!bMetaFile)
184     {
185         pDev->SetMapMode( aOldMode );
186     }
187 }
188 
189 // #109985#
190 void ScOutputData::DrawSelectiveObjects(const sal_uInt16 nLayer)
191 {
192     ScDrawLayer* pModel = pDoc->GetDrawLayer();
193     if (!pModel)
194         return;
195 
196     //  #i46362# high contrast mode (and default text direction) must be handled
197     //  by the application, so it's still needed when using DrawLayer().
198 
199     SdrOutliner& rOutl = pModel->GetDrawOutliner();
200     rOutl.EnableAutoColor( bUseStyleColor );
201     rOutl.SetDefaultHorizontalTextDirection(
202                 (EEHorizontalTextDirection)pDoc->GetEditTextDirection( nTab ) );
203 
204     //  #i69767# The hyphenator must be set (used to be before drawing a text shape with hyphenation).
205     //  LinguMgr::GetHyphenator (EditEngine) uses a wrapper now that creates the real hyphenator on demand,
206     //  so it's not a performance problem to call UseHyphenator even when it's not needed.
207 
208     pModel->UseHyphenator();
209 
210     sal_uLong nOldDrawMode = pDev->GetDrawMode();
211     if ( bUseStyleColor && Application::GetSettings().GetStyleSettings().GetHighContrastMode() )
212     {
213         pDev->SetDrawMode( nOldDrawMode | DRAWMODE_SETTINGSLINE | DRAWMODE_SETTINGSFILL |
214                             DRAWMODE_SETTINGSTEXT | DRAWMODE_SETTINGSGRADIENT );
215     }
216 
217     // #109985#
218     if(pViewShell || pDrawView)
219     {
220         SdrView* pLocalDrawView = (pDrawView) ? pDrawView : pViewShell->GetSdrView();
221 
222         if(pLocalDrawView)
223         {
224             SdrPageView* pPageView = pLocalDrawView->GetSdrPageView();
225 
226             if(pPageView)
227             {
228                 pPageView->DrawLayer(sal::static_int_cast<SdrLayerID>(nLayer), pDev);
229             }
230         }
231     }
232 
233     pDev->SetDrawMode(nOldDrawMode);
234 
235     // #109985#
236     return;
237 }
238 
239 //  Teile nur fuer Bildschirm
240 
241 // #109985#
242 void ScOutputData::DrawingSingle(const sal_uInt16 nLayer)
243 {
244     sal_Bool    bHad    = sal_False;
245     long    nPosY   = nScrY;
246     SCSIZE  nArrY;
247     for (nArrY=1; nArrY+1<nArrCount; nArrY++)
248     {
249         RowInfo* pThisRowInfo = &pRowInfo[nArrY];
250 
251         if ( pThisRowInfo->bChanged )
252         {
253             if (!bHad)
254             {
255                 bHad = sal_True;
256             }
257         }
258         else if (bHad)
259         {
260             DrawSelectiveObjects( nLayer );
261             bHad = sal_False;
262         }
263         nPosY += pRowInfo[nArrY].nHeight;
264     }
265 
266     if (bHad)
267         DrawSelectiveObjects( nLayer );
268 }
269 
270 
271 
272 
273