1*b1cdbd2cSJim Jagielski /**************************************************************
2*b1cdbd2cSJim Jagielski  *
3*b1cdbd2cSJim Jagielski  * Licensed to the Apache Software Foundation (ASF) under one
4*b1cdbd2cSJim Jagielski  * or more contributor license agreements.  See the NOTICE file
5*b1cdbd2cSJim Jagielski  * distributed with this work for additional information
6*b1cdbd2cSJim Jagielski  * regarding copyright ownership.  The ASF licenses this file
7*b1cdbd2cSJim Jagielski  * to you under the Apache License, Version 2.0 (the
8*b1cdbd2cSJim Jagielski  * "License"); you may not use this file except in compliance
9*b1cdbd2cSJim Jagielski  * with the License.  You may obtain a copy of the License at
10*b1cdbd2cSJim Jagielski  *
11*b1cdbd2cSJim Jagielski  *   http://www.apache.org/licenses/LICENSE-2.0
12*b1cdbd2cSJim Jagielski  *
13*b1cdbd2cSJim Jagielski  * Unless required by applicable law or agreed to in writing,
14*b1cdbd2cSJim Jagielski  * software distributed under the License is distributed on an
15*b1cdbd2cSJim Jagielski  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*b1cdbd2cSJim Jagielski  * KIND, either express or implied.  See the License for the
17*b1cdbd2cSJim Jagielski  * specific language governing permissions and limitations
18*b1cdbd2cSJim Jagielski  * under the License.
19*b1cdbd2cSJim Jagielski  *
20*b1cdbd2cSJim Jagielski  *************************************************************/
21*b1cdbd2cSJim Jagielski 
22*b1cdbd2cSJim Jagielski 
23*b1cdbd2cSJim Jagielski 
24*b1cdbd2cSJim Jagielski // MARKER(update_precomp.py): autogen include statement, do not remove
25*b1cdbd2cSJim Jagielski #include "precompiled_sd.hxx"
26*b1cdbd2cSJim Jagielski 
27*b1cdbd2cSJim Jagielski #include "PreviewRenderer.hxx"
28*b1cdbd2cSJim Jagielski 
29*b1cdbd2cSJim Jagielski #include "DrawDocShell.hxx"
30*b1cdbd2cSJim Jagielski #include "drawdoc.hxx"
31*b1cdbd2cSJim Jagielski #include "drawview.hxx"
32*b1cdbd2cSJim Jagielski #include "sdpage.hxx"
33*b1cdbd2cSJim Jagielski #include "ViewShell.hxx"
34*b1cdbd2cSJim Jagielski #include <vcl/virdev.hxx>
35*b1cdbd2cSJim Jagielski #include <svx/svdpagv.hxx>
36*b1cdbd2cSJim Jagielski #include <svx/svdoutl.hxx>
37*b1cdbd2cSJim Jagielski #include <editeng/eeitem.hxx>
38*b1cdbd2cSJim Jagielski #include <editeng/editstat.hxx>
39*b1cdbd2cSJim Jagielski #include <tools/link.hxx>
40*b1cdbd2cSJim Jagielski #include <vcl/svapp.hxx>
41*b1cdbd2cSJim Jagielski #include <tools/diagnose_ex.h>
42*b1cdbd2cSJim Jagielski #include <svx/sdr/contact/viewobjectcontact.hxx>
43*b1cdbd2cSJim Jagielski #include <svx/sdr/contact/viewcontact.hxx>
44*b1cdbd2cSJim Jagielski 
45*b1cdbd2cSJim Jagielski using namespace ::com::sun::star;
46*b1cdbd2cSJim Jagielski using namespace ::com::sun::star::uno;
47*b1cdbd2cSJim Jagielski 
48*b1cdbd2cSJim Jagielski 
49*b1cdbd2cSJim Jagielski namespace sd {
50*b1cdbd2cSJim Jagielski 
51*b1cdbd2cSJim Jagielski const int PreviewRenderer::snSubstitutionTextSize = 11;
52*b1cdbd2cSJim Jagielski const int PreviewRenderer::snFrameWidth = 1;
53*b1cdbd2cSJim Jagielski 
54*b1cdbd2cSJim Jagielski namespace {
55*b1cdbd2cSJim Jagielski     /** This incarnation of the ViewObjectContactRedirector filters away all
56*b1cdbd2cSJim Jagielski         PageObj objects, unconditionally.
57*b1cdbd2cSJim Jagielski     */
58*b1cdbd2cSJim Jagielski     class ViewRedirector : public ::sdr::contact::ViewObjectContactRedirector
59*b1cdbd2cSJim Jagielski     {
60*b1cdbd2cSJim Jagielski     public:
61*b1cdbd2cSJim Jagielski         ViewRedirector (void);
62*b1cdbd2cSJim Jagielski         virtual ~ViewRedirector (void);
63*b1cdbd2cSJim Jagielski         virtual drawinglayer::primitive2d::Primitive2DSequence createRedirectedPrimitive2DSequence(
64*b1cdbd2cSJim Jagielski             const sdr::contact::ViewObjectContact& rOriginal,
65*b1cdbd2cSJim Jagielski                 const sdr::contact::DisplayInfo& rDisplayInfo);
66*b1cdbd2cSJim Jagielski     };
67*b1cdbd2cSJim Jagielski }
68*b1cdbd2cSJim Jagielski 
69*b1cdbd2cSJim Jagielski 
70*b1cdbd2cSJim Jagielski 
71*b1cdbd2cSJim Jagielski 
72*b1cdbd2cSJim Jagielski //===== PreviewRenderer =======================================================
73*b1cdbd2cSJim Jagielski 
PreviewRenderer(OutputDevice * pTemplate,const bool bHasFrame)74*b1cdbd2cSJim Jagielski PreviewRenderer::PreviewRenderer (
75*b1cdbd2cSJim Jagielski     OutputDevice* pTemplate,
76*b1cdbd2cSJim Jagielski     const bool bHasFrame)
77*b1cdbd2cSJim Jagielski     : mpPreviewDevice (new VirtualDevice()),
78*b1cdbd2cSJim Jagielski       mpView(NULL),
79*b1cdbd2cSJim Jagielski       mpDocShellOfView(NULL),
80*b1cdbd2cSJim Jagielski       mnWidthOfView(0),
81*b1cdbd2cSJim Jagielski       maFrameColor (svtools::ColorConfig().GetColorValue(svtools::DOCBOUNDARIES).nColor),
82*b1cdbd2cSJim Jagielski       mbHasFrame(bHasFrame)
83*b1cdbd2cSJim Jagielski {
84*b1cdbd2cSJim Jagielski     if (pTemplate != NULL)
85*b1cdbd2cSJim Jagielski     {
86*b1cdbd2cSJim Jagielski         mpPreviewDevice->SetDigitLanguage (pTemplate->GetDigitLanguage());
87*b1cdbd2cSJim Jagielski         mpPreviewDevice->SetBackground(pTemplate->GetBackground());
88*b1cdbd2cSJim Jagielski     }
89*b1cdbd2cSJim Jagielski     else
90*b1cdbd2cSJim Jagielski     {
91*b1cdbd2cSJim Jagielski         mpPreviewDevice->SetBackground(Wallpaper(
92*b1cdbd2cSJim Jagielski             Application::GetSettings().GetStyleSettings().GetWindowColor()));
93*b1cdbd2cSJim Jagielski     }
94*b1cdbd2cSJim Jagielski }
95*b1cdbd2cSJim Jagielski 
96*b1cdbd2cSJim Jagielski 
97*b1cdbd2cSJim Jagielski 
98*b1cdbd2cSJim Jagielski 
~PreviewRenderer(void)99*b1cdbd2cSJim Jagielski PreviewRenderer::~PreviewRenderer (void)
100*b1cdbd2cSJim Jagielski {
101*b1cdbd2cSJim Jagielski     if (mpDocShellOfView != NULL)
102*b1cdbd2cSJim Jagielski         EndListening (*mpDocShellOfView);
103*b1cdbd2cSJim Jagielski }
104*b1cdbd2cSJim Jagielski 
105*b1cdbd2cSJim Jagielski 
106*b1cdbd2cSJim Jagielski 
107*b1cdbd2cSJim Jagielski 
RenderPage(const SdPage * pPage,const sal_Int32 nWidth,const String & rSubstitutionText,const bool bObeyHighContrastMode,const bool bDisplayPresentationObjects)108*b1cdbd2cSJim Jagielski Image PreviewRenderer::RenderPage (
109*b1cdbd2cSJim Jagielski     const SdPage* pPage,
110*b1cdbd2cSJim Jagielski     const sal_Int32 nWidth,
111*b1cdbd2cSJim Jagielski     const String& rSubstitutionText,
112*b1cdbd2cSJim Jagielski     const bool bObeyHighContrastMode,
113*b1cdbd2cSJim Jagielski     const bool bDisplayPresentationObjects)
114*b1cdbd2cSJim Jagielski {
115*b1cdbd2cSJim Jagielski     if (pPage != NULL)
116*b1cdbd2cSJim Jagielski     {
117*b1cdbd2cSJim Jagielski         const Size aPageModelSize (pPage->GetSize());
118*b1cdbd2cSJim Jagielski         const double nAspectRatio (
119*b1cdbd2cSJim Jagielski             double(aPageModelSize.Width()) / double(aPageModelSize.Height()));
120*b1cdbd2cSJim Jagielski         const sal_Int32 nFrameWidth (mbHasFrame ? snFrameWidth : 0);
121*b1cdbd2cSJim Jagielski         const sal_Int32 nHeight (sal::static_int_cast<sal_Int32>(
122*b1cdbd2cSJim Jagielski             (nWidth - 2*nFrameWidth) / nAspectRatio + 2*nFrameWidth + 0.5));
123*b1cdbd2cSJim Jagielski         return RenderPage (
124*b1cdbd2cSJim Jagielski             pPage,
125*b1cdbd2cSJim Jagielski             Size(nWidth,nHeight),
126*b1cdbd2cSJim Jagielski             rSubstitutionText,
127*b1cdbd2cSJim Jagielski             bObeyHighContrastMode,
128*b1cdbd2cSJim Jagielski             bDisplayPresentationObjects);
129*b1cdbd2cSJim Jagielski     }
130*b1cdbd2cSJim Jagielski     else
131*b1cdbd2cSJim Jagielski         return Image();
132*b1cdbd2cSJim Jagielski }
133*b1cdbd2cSJim Jagielski 
134*b1cdbd2cSJim Jagielski 
135*b1cdbd2cSJim Jagielski 
136*b1cdbd2cSJim Jagielski 
RenderPage(const SdPage * pPage,Size aPixelSize,const String & rSubstitutionText,const bool bObeyHighContrastMode,const bool bDisplayPresentationObjects)137*b1cdbd2cSJim Jagielski Image PreviewRenderer::RenderPage (
138*b1cdbd2cSJim Jagielski     const SdPage* pPage,
139*b1cdbd2cSJim Jagielski     Size aPixelSize,
140*b1cdbd2cSJim Jagielski     const String& rSubstitutionText,
141*b1cdbd2cSJim Jagielski     const bool bObeyHighContrastMode,
142*b1cdbd2cSJim Jagielski     const bool bDisplayPresentationObjects)
143*b1cdbd2cSJim Jagielski {
144*b1cdbd2cSJim Jagielski     Image aPreview;
145*b1cdbd2cSJim Jagielski 
146*b1cdbd2cSJim Jagielski     if (pPage != NULL)
147*b1cdbd2cSJim Jagielski     {
148*b1cdbd2cSJim Jagielski         try
149*b1cdbd2cSJim Jagielski         {
150*b1cdbd2cSJim Jagielski             if (Initialize(pPage, aPixelSize, bObeyHighContrastMode))
151*b1cdbd2cSJim Jagielski             {
152*b1cdbd2cSJim Jagielski                 PaintPage(pPage, bDisplayPresentationObjects);
153*b1cdbd2cSJim Jagielski                 PaintSubstitutionText(rSubstitutionText);
154*b1cdbd2cSJim Jagielski                 PaintFrame();
155*b1cdbd2cSJim Jagielski 
156*b1cdbd2cSJim Jagielski                 Size aSize (mpPreviewDevice->GetOutputSizePixel());
157*b1cdbd2cSJim Jagielski                 aPreview = mpPreviewDevice->GetBitmap (
158*b1cdbd2cSJim Jagielski                     mpPreviewDevice->PixelToLogic(Point(0,0)),
159*b1cdbd2cSJim Jagielski                     mpPreviewDevice->PixelToLogic(aSize));
160*b1cdbd2cSJim Jagielski 
161*b1cdbd2cSJim Jagielski                 Cleanup();
162*b1cdbd2cSJim Jagielski             }
163*b1cdbd2cSJim Jagielski         }
164*b1cdbd2cSJim Jagielski         catch (const com::sun::star::uno::Exception&)
165*b1cdbd2cSJim Jagielski         {
166*b1cdbd2cSJim Jagielski             DBG_UNHANDLED_EXCEPTION();
167*b1cdbd2cSJim Jagielski         }
168*b1cdbd2cSJim Jagielski     }
169*b1cdbd2cSJim Jagielski 
170*b1cdbd2cSJim Jagielski     return aPreview;
171*b1cdbd2cSJim Jagielski }
172*b1cdbd2cSJim Jagielski 
173*b1cdbd2cSJim Jagielski 
174*b1cdbd2cSJim Jagielski 
175*b1cdbd2cSJim Jagielski 
RenderSubstitution(const Size & rPreviewPixelSize,const String & rSubstitutionText)176*b1cdbd2cSJim Jagielski Image PreviewRenderer::RenderSubstitution (
177*b1cdbd2cSJim Jagielski     const Size& rPreviewPixelSize,
178*b1cdbd2cSJim Jagielski     const String& rSubstitutionText)
179*b1cdbd2cSJim Jagielski {
180*b1cdbd2cSJim Jagielski     Image aPreview;
181*b1cdbd2cSJim Jagielski 
182*b1cdbd2cSJim Jagielski     try
183*b1cdbd2cSJim Jagielski     {
184*b1cdbd2cSJim Jagielski         // Set size.
185*b1cdbd2cSJim Jagielski         mpPreviewDevice->SetOutputSizePixel(rPreviewPixelSize);
186*b1cdbd2cSJim Jagielski 
187*b1cdbd2cSJim Jagielski         // Adjust contrast mode.
188*b1cdbd2cSJim Jagielski         const bool bUseContrast (
189*b1cdbd2cSJim Jagielski             Application::GetSettings().GetStyleSettings().GetHighContrastMode());
190*b1cdbd2cSJim Jagielski         mpPreviewDevice->SetDrawMode (bUseContrast
191*b1cdbd2cSJim Jagielski             ? ViewShell::OUTPUT_DRAWMODE_CONTRAST
192*b1cdbd2cSJim Jagielski             : ViewShell::OUTPUT_DRAWMODE_COLOR);
193*b1cdbd2cSJim Jagielski 
194*b1cdbd2cSJim Jagielski         // Set a map mode that makes a typical substitution text completely
195*b1cdbd2cSJim Jagielski         // visible.
196*b1cdbd2cSJim Jagielski         MapMode aMapMode (mpPreviewDevice->GetMapMode());
197*b1cdbd2cSJim Jagielski         aMapMode.SetMapUnit(MAP_100TH_MM);
198*b1cdbd2cSJim Jagielski         const double nFinalScale (25.0 * rPreviewPixelSize.Width() / 28000.0);
199*b1cdbd2cSJim Jagielski         aMapMode.SetScaleX(nFinalScale);
200*b1cdbd2cSJim Jagielski         aMapMode.SetScaleY(nFinalScale);
201*b1cdbd2cSJim Jagielski         const sal_Int32 nFrameWidth (mbHasFrame ? snFrameWidth : 0);
202*b1cdbd2cSJim Jagielski         aMapMode.SetOrigin(mpPreviewDevice->PixelToLogic(
203*b1cdbd2cSJim Jagielski             Point(nFrameWidth,nFrameWidth),aMapMode));
204*b1cdbd2cSJim Jagielski         mpPreviewDevice->SetMapMode (aMapMode);
205*b1cdbd2cSJim Jagielski 
206*b1cdbd2cSJim Jagielski         // Clear the background.
207*b1cdbd2cSJim Jagielski         const Rectangle aPaintRectangle (
208*b1cdbd2cSJim Jagielski             Point(0,0),
209*b1cdbd2cSJim Jagielski             mpPreviewDevice->GetOutputSizePixel());
210*b1cdbd2cSJim Jagielski         mpPreviewDevice->EnableMapMode(sal_False);
211*b1cdbd2cSJim Jagielski         mpPreviewDevice->SetLineColor();
212*b1cdbd2cSJim Jagielski         svtools::ColorConfig aColorConfig;
213*b1cdbd2cSJim Jagielski         mpPreviewDevice->SetFillColor(aColorConfig.GetColorValue(svtools::DOCCOLOR).nColor);
214*b1cdbd2cSJim Jagielski         mpPreviewDevice->DrawRect (aPaintRectangle);
215*b1cdbd2cSJim Jagielski         mpPreviewDevice->EnableMapMode(sal_True);
216*b1cdbd2cSJim Jagielski 
217*b1cdbd2cSJim Jagielski         // Paint substitution text and a frame around it.
218*b1cdbd2cSJim Jagielski         PaintSubstitutionText (rSubstitutionText);
219*b1cdbd2cSJim Jagielski         PaintFrame();
220*b1cdbd2cSJim Jagielski 
221*b1cdbd2cSJim Jagielski         const Size aSize (mpPreviewDevice->GetOutputSizePixel());
222*b1cdbd2cSJim Jagielski         aPreview = mpPreviewDevice->GetBitmap (
223*b1cdbd2cSJim Jagielski             mpPreviewDevice->PixelToLogic(Point(0,0)),
224*b1cdbd2cSJim Jagielski             mpPreviewDevice->PixelToLogic(aSize));
225*b1cdbd2cSJim Jagielski     }
226*b1cdbd2cSJim Jagielski     catch (const com::sun::star::uno::Exception&)
227*b1cdbd2cSJim Jagielski     {
228*b1cdbd2cSJim Jagielski         DBG_UNHANDLED_EXCEPTION();
229*b1cdbd2cSJim Jagielski     }
230*b1cdbd2cSJim Jagielski 
231*b1cdbd2cSJim Jagielski     return aPreview;
232*b1cdbd2cSJim Jagielski }
233*b1cdbd2cSJim Jagielski 
234*b1cdbd2cSJim Jagielski 
235*b1cdbd2cSJim Jagielski 
236*b1cdbd2cSJim Jagielski 
Initialize(const SdPage * pPage,const Size & rPixelSize,const bool bObeyHighContrastMode)237*b1cdbd2cSJim Jagielski bool PreviewRenderer::Initialize (
238*b1cdbd2cSJim Jagielski     const SdPage* pPage,
239*b1cdbd2cSJim Jagielski     const Size& rPixelSize,
240*b1cdbd2cSJim Jagielski     const bool bObeyHighContrastMode)
241*b1cdbd2cSJim Jagielski {
242*b1cdbd2cSJim Jagielski     bool bSuccess = false;
243*b1cdbd2cSJim Jagielski     do
244*b1cdbd2cSJim Jagielski     {
245*b1cdbd2cSJim Jagielski         if (pPage == NULL)
246*b1cdbd2cSJim Jagielski             break;
247*b1cdbd2cSJim Jagielski 
248*b1cdbd2cSJim Jagielski         SdrModel* pModel = pPage->GetModel();
249*b1cdbd2cSJim Jagielski         if (pModel == NULL)
250*b1cdbd2cSJim Jagielski             break;
251*b1cdbd2cSJim Jagielski 
252*b1cdbd2cSJim Jagielski         SetupOutputSize(*pPage, rPixelSize);
253*b1cdbd2cSJim Jagielski 
254*b1cdbd2cSJim Jagielski         SdDrawDocument* pDocument
255*b1cdbd2cSJim Jagielski             = static_cast<SdDrawDocument*>(pPage->GetModel());
256*b1cdbd2cSJim Jagielski         DrawDocShell* pDocShell = pDocument->GetDocSh();
257*b1cdbd2cSJim Jagielski 
258*b1cdbd2cSJim Jagielski         // Create view
259*b1cdbd2cSJim Jagielski         ProvideView (pDocShell);
260*b1cdbd2cSJim Jagielski         if (mpView.get() == NULL)
261*b1cdbd2cSJim Jagielski             break;
262*b1cdbd2cSJim Jagielski 
263*b1cdbd2cSJim Jagielski         // Adjust contrast mode.
264*b1cdbd2cSJim Jagielski         bool bUseContrast (bObeyHighContrastMode
265*b1cdbd2cSJim Jagielski             && Application::GetSettings().GetStyleSettings().GetHighContrastMode());
266*b1cdbd2cSJim Jagielski         mpPreviewDevice->SetDrawMode (bUseContrast
267*b1cdbd2cSJim Jagielski             ? ViewShell::OUTPUT_DRAWMODE_CONTRAST
268*b1cdbd2cSJim Jagielski             : ViewShell::OUTPUT_DRAWMODE_COLOR);
269*b1cdbd2cSJim Jagielski         mpPreviewDevice->SetSettings(Application::GetSettings());
270*b1cdbd2cSJim Jagielski 
271*b1cdbd2cSJim Jagielski         // Tell the view to show the given page.
272*b1cdbd2cSJim Jagielski         SdPage* pNonConstPage = const_cast<SdPage*>(pPage);
273*b1cdbd2cSJim Jagielski         if (pPage->IsMasterPage())
274*b1cdbd2cSJim Jagielski 		{
275*b1cdbd2cSJim Jagielski 			mpView->ShowSdrPage(mpView->GetModel()->GetMasterPage(pPage->GetPageNum()));
276*b1cdbd2cSJim Jagielski 		}
277*b1cdbd2cSJim Jagielski         else
278*b1cdbd2cSJim Jagielski 		{
279*b1cdbd2cSJim Jagielski             mpView->ShowSdrPage(pNonConstPage);
280*b1cdbd2cSJim Jagielski 		}
281*b1cdbd2cSJim Jagielski 
282*b1cdbd2cSJim Jagielski         // Make sure that a page view exists.
283*b1cdbd2cSJim Jagielski         SdrPageView* pPageView = mpView->GetSdrPageView();
284*b1cdbd2cSJim Jagielski         if (pPageView == NULL)
285*b1cdbd2cSJim Jagielski             break;
286*b1cdbd2cSJim Jagielski 
287*b1cdbd2cSJim Jagielski         // #121224# No need to set SetApplicationBackgroundColor (which is the color
288*b1cdbd2cSJim Jagielski         // of the area 'behind' the page (formally called 'Wiese') since the page previews
289*b1cdbd2cSJim Jagielski         // produced exactly cover the page's area, so it would never be visible. What
290*b1cdbd2cSJim Jagielski         // needs to be set is the ApplicationDocumentColor which is derived from
291*b1cdbd2cSJim Jagielski         // svtools::DOCCOLOR normally
292*b1cdbd2cSJim Jagielski         svtools::ColorConfig aColorConfig;
293*b1cdbd2cSJim Jagielski         Color aApplicationDocumentColor;
294*b1cdbd2cSJim Jagielski 
295*b1cdbd2cSJim Jagielski         if(!pPageView || pPageView->GetApplicationDocumentColor() == COL_AUTO)
296*b1cdbd2cSJim Jagielski         {
297*b1cdbd2cSJim Jagielski             svtools::ColorConfig aColorConfig;
298*b1cdbd2cSJim Jagielski             aApplicationDocumentColor = aColorConfig.GetColorValue( svtools::DOCCOLOR ).nColor;
299*b1cdbd2cSJim Jagielski         }
300*b1cdbd2cSJim Jagielski         else
301*b1cdbd2cSJim Jagielski         {
302*b1cdbd2cSJim Jagielski             aApplicationDocumentColor = pPageView->GetApplicationDocumentColor();
303*b1cdbd2cSJim Jagielski         }
304*b1cdbd2cSJim Jagielski 
305*b1cdbd2cSJim Jagielski         pPageView->SetApplicationDocumentColor(aApplicationDocumentColor);
306*b1cdbd2cSJim Jagielski         SdrOutliner& rOutliner(pDocument->GetDrawOutliner(NULL));
307*b1cdbd2cSJim Jagielski         rOutliner.SetBackgroundColor(aApplicationDocumentColor);
308*b1cdbd2cSJim Jagielski         rOutliner.SetDefaultLanguage(pDocument->GetLanguage(EE_CHAR_LANGUAGE));
309*b1cdbd2cSJim Jagielski         mpPreviewDevice->SetBackground(Wallpaper(aApplicationDocumentColor));
310*b1cdbd2cSJim Jagielski         mpPreviewDevice->Erase();
311*b1cdbd2cSJim Jagielski 
312*b1cdbd2cSJim Jagielski         bSuccess = true;
313*b1cdbd2cSJim Jagielski     }
314*b1cdbd2cSJim Jagielski     while (false);
315*b1cdbd2cSJim Jagielski 
316*b1cdbd2cSJim Jagielski     return bSuccess;
317*b1cdbd2cSJim Jagielski }
318*b1cdbd2cSJim Jagielski 
319*b1cdbd2cSJim Jagielski 
320*b1cdbd2cSJim Jagielski 
321*b1cdbd2cSJim Jagielski 
Cleanup(void)322*b1cdbd2cSJim Jagielski void PreviewRenderer::Cleanup (void)
323*b1cdbd2cSJim Jagielski {
324*b1cdbd2cSJim Jagielski     mpView->HideSdrPage();
325*b1cdbd2cSJim Jagielski }
326*b1cdbd2cSJim Jagielski 
327*b1cdbd2cSJim Jagielski 
328*b1cdbd2cSJim Jagielski 
329*b1cdbd2cSJim Jagielski 
PaintPage(const SdPage * pPage,const bool bDisplayPresentationObjects)330*b1cdbd2cSJim Jagielski void PreviewRenderer::PaintPage (
331*b1cdbd2cSJim Jagielski     const SdPage* pPage,
332*b1cdbd2cSJim Jagielski     const bool bDisplayPresentationObjects)
333*b1cdbd2cSJim Jagielski {
334*b1cdbd2cSJim Jagielski     // Paint the page.
335*b1cdbd2cSJim Jagielski     Rectangle aPaintRectangle (Point(0,0), pPage->GetSize());
336*b1cdbd2cSJim Jagielski     Region aRegion (aPaintRectangle);
337*b1cdbd2cSJim Jagielski 
338*b1cdbd2cSJim Jagielski     // Turn off online spelling and redlining.
339*b1cdbd2cSJim Jagielski     SdrOutliner* pOutliner = NULL;
340*b1cdbd2cSJim Jagielski     sal_uLong nSavedControlWord (0);
341*b1cdbd2cSJim Jagielski     if (mpDocShellOfView!=NULL && mpDocShellOfView->GetDoc()!=NULL)
342*b1cdbd2cSJim Jagielski     {
343*b1cdbd2cSJim Jagielski         pOutliner = &mpDocShellOfView->GetDoc()->GetDrawOutliner();
344*b1cdbd2cSJim Jagielski         nSavedControlWord = pOutliner->GetControlWord();
345*b1cdbd2cSJim Jagielski         pOutliner->SetControlWord((nSavedControlWord & ~EE_CNTRL_ONLINESPELLING));
346*b1cdbd2cSJim Jagielski     }
347*b1cdbd2cSJim Jagielski 
348*b1cdbd2cSJim Jagielski     // Use a special redirector to prevent PresObj shapes from being painted.
349*b1cdbd2cSJim Jagielski     boost::scoped_ptr<ViewRedirector> pRedirector;
350*b1cdbd2cSJim Jagielski     if ( ! bDisplayPresentationObjects)
351*b1cdbd2cSJim Jagielski         pRedirector.reset(new ViewRedirector());
352*b1cdbd2cSJim Jagielski 
353*b1cdbd2cSJim Jagielski     try
354*b1cdbd2cSJim Jagielski     {
355*b1cdbd2cSJim Jagielski         mpView->CompleteRedraw(mpPreviewDevice.get(), aRegion, pRedirector.get());
356*b1cdbd2cSJim Jagielski     }
357*b1cdbd2cSJim Jagielski     catch (const ::com::sun::star::uno::Exception&)
358*b1cdbd2cSJim Jagielski     {
359*b1cdbd2cSJim Jagielski         DBG_UNHANDLED_EXCEPTION();
360*b1cdbd2cSJim Jagielski     }
361*b1cdbd2cSJim Jagielski 
362*b1cdbd2cSJim Jagielski     // Restore the previous online spelling and redlining states.
363*b1cdbd2cSJim Jagielski     if (pOutliner != NULL)
364*b1cdbd2cSJim Jagielski         pOutliner->SetControlWord(nSavedControlWord);
365*b1cdbd2cSJim Jagielski }
366*b1cdbd2cSJim Jagielski 
367*b1cdbd2cSJim Jagielski 
368*b1cdbd2cSJim Jagielski 
369*b1cdbd2cSJim Jagielski 
PaintSubstitutionText(const String & rSubstitutionText)370*b1cdbd2cSJim Jagielski void PreviewRenderer::PaintSubstitutionText (const String& rSubstitutionText)
371*b1cdbd2cSJim Jagielski {
372*b1cdbd2cSJim Jagielski     if (rSubstitutionText.Len() > 0)
373*b1cdbd2cSJim Jagielski     {
374*b1cdbd2cSJim Jagielski         // Set the font size.
375*b1cdbd2cSJim Jagielski         const Font& rOriginalFont (mpPreviewDevice->GetFont());
376*b1cdbd2cSJim Jagielski         Font aFont (mpPreviewDevice->GetSettings().GetStyleSettings().GetAppFont());
377*b1cdbd2cSJim Jagielski         sal_Int32 nHeight (mpPreviewDevice->PixelToLogic(Size(0,snSubstitutionTextSize)).Height());
378*b1cdbd2cSJim Jagielski         aFont.SetHeight(nHeight);
379*b1cdbd2cSJim Jagielski         mpPreviewDevice->SetFont (aFont);
380*b1cdbd2cSJim Jagielski 
381*b1cdbd2cSJim Jagielski         // Paint the substitution text.
382*b1cdbd2cSJim Jagielski         Rectangle aTextBox (
383*b1cdbd2cSJim Jagielski             Point(0,0),
384*b1cdbd2cSJim Jagielski             mpPreviewDevice->PixelToLogic(
385*b1cdbd2cSJim Jagielski                 mpPreviewDevice->GetOutputSizePixel()));
386*b1cdbd2cSJim Jagielski         sal_uInt16 nTextStyle =
387*b1cdbd2cSJim Jagielski             TEXT_DRAW_CENTER
388*b1cdbd2cSJim Jagielski             | TEXT_DRAW_VCENTER
389*b1cdbd2cSJim Jagielski             | TEXT_DRAW_MULTILINE
390*b1cdbd2cSJim Jagielski             | TEXT_DRAW_WORDBREAK;
391*b1cdbd2cSJim Jagielski         mpPreviewDevice->DrawText (aTextBox, rSubstitutionText, nTextStyle);
392*b1cdbd2cSJim Jagielski 
393*b1cdbd2cSJim Jagielski         // Restore the font.
394*b1cdbd2cSJim Jagielski         mpPreviewDevice->SetFont (rOriginalFont);
395*b1cdbd2cSJim Jagielski     }
396*b1cdbd2cSJim Jagielski }
397*b1cdbd2cSJim Jagielski 
398*b1cdbd2cSJim Jagielski 
399*b1cdbd2cSJim Jagielski 
400*b1cdbd2cSJim Jagielski 
PaintFrame(void)401*b1cdbd2cSJim Jagielski void PreviewRenderer::PaintFrame (void)
402*b1cdbd2cSJim Jagielski {
403*b1cdbd2cSJim Jagielski     if (mbHasFrame)
404*b1cdbd2cSJim Jagielski     {
405*b1cdbd2cSJim Jagielski         // Paint a frame arround the preview.
406*b1cdbd2cSJim Jagielski         Rectangle aPaintRectangle (
407*b1cdbd2cSJim Jagielski             Point(0,0),
408*b1cdbd2cSJim Jagielski             mpPreviewDevice->GetOutputSizePixel());
409*b1cdbd2cSJim Jagielski         mpPreviewDevice->EnableMapMode(sal_False);
410*b1cdbd2cSJim Jagielski         mpPreviewDevice->SetLineColor(maFrameColor);
411*b1cdbd2cSJim Jagielski         mpPreviewDevice->SetFillColor();
412*b1cdbd2cSJim Jagielski         mpPreviewDevice->DrawRect(aPaintRectangle);
413*b1cdbd2cSJim Jagielski         mpPreviewDevice->EnableMapMode(sal_True);
414*b1cdbd2cSJim Jagielski      }
415*b1cdbd2cSJim Jagielski }
416*b1cdbd2cSJim Jagielski 
417*b1cdbd2cSJim Jagielski 
418*b1cdbd2cSJim Jagielski 
419*b1cdbd2cSJim Jagielski 
SetupOutputSize(const SdPage & rPage,const Size & rFramePixelSize)420*b1cdbd2cSJim Jagielski void PreviewRenderer::SetupOutputSize (
421*b1cdbd2cSJim Jagielski     const SdPage& rPage,
422*b1cdbd2cSJim Jagielski     const Size& rFramePixelSize)
423*b1cdbd2cSJim Jagielski {
424*b1cdbd2cSJim Jagielski     // First set the map mode to some arbitrary scale that is numerically
425*b1cdbd2cSJim Jagielski     // stable.
426*b1cdbd2cSJim Jagielski     MapMode aMapMode (mpPreviewDevice->GetMapMode());
427*b1cdbd2cSJim Jagielski 	aMapMode.SetMapUnit(MAP_PIXEL);
428*b1cdbd2cSJim Jagielski 
429*b1cdbd2cSJim Jagielski     // Adapt it to the desired width.
430*b1cdbd2cSJim Jagielski     const Size aPageModelSize (rPage.GetSize());
431*b1cdbd2cSJim Jagielski     if (aPageModelSize.Width()>0 || aPageModelSize.Height()>0)
432*b1cdbd2cSJim Jagielski     {
433*b1cdbd2cSJim Jagielski         const sal_Int32 nFrameWidth (mbHasFrame ? snFrameWidth : 0);
434*b1cdbd2cSJim Jagielski         aMapMode.SetScaleX(
435*b1cdbd2cSJim Jagielski             Fraction(rFramePixelSize.Width()-2*nFrameWidth-1, aPageModelSize.Width()));
436*b1cdbd2cSJim Jagielski         aMapMode.SetScaleY(
437*b1cdbd2cSJim Jagielski             Fraction(rFramePixelSize.Height()-2*nFrameWidth-1, aPageModelSize.Height()));
438*b1cdbd2cSJim Jagielski         aMapMode.SetOrigin(mpPreviewDevice->PixelToLogic(Point(nFrameWidth,nFrameWidth),aMapMode));
439*b1cdbd2cSJim Jagielski     }
440*b1cdbd2cSJim Jagielski     else
441*b1cdbd2cSJim Jagielski     {
442*b1cdbd2cSJim Jagielski         // We should never get here.
443*b1cdbd2cSJim Jagielski         OSL_ASSERT(false);
444*b1cdbd2cSJim Jagielski         aMapMode.SetScaleX(1.0);
445*b1cdbd2cSJim Jagielski         aMapMode.SetScaleY(1.0);
446*b1cdbd2cSJim Jagielski     }
447*b1cdbd2cSJim Jagielski     mpPreviewDevice->SetMapMode (aMapMode);
448*b1cdbd2cSJim Jagielski     mpPreviewDevice->SetOutputSizePixel(rFramePixelSize);
449*b1cdbd2cSJim Jagielski }
450*b1cdbd2cSJim Jagielski 
451*b1cdbd2cSJim Jagielski 
452*b1cdbd2cSJim Jagielski 
453*b1cdbd2cSJim Jagielski 
ProvideView(DrawDocShell * pDocShell)454*b1cdbd2cSJim Jagielski void PreviewRenderer::ProvideView (DrawDocShell* pDocShell)
455*b1cdbd2cSJim Jagielski {
456*b1cdbd2cSJim Jagielski     if (pDocShell != mpDocShellOfView)
457*b1cdbd2cSJim Jagielski     {
458*b1cdbd2cSJim Jagielski         // Destroy the view that is connected to the current doc shell.
459*b1cdbd2cSJim Jagielski         mpView.reset();
460*b1cdbd2cSJim Jagielski 
461*b1cdbd2cSJim Jagielski         // Switch our attention, i.e. listening for DYING events, to
462*b1cdbd2cSJim Jagielski         // the new doc shell.
463*b1cdbd2cSJim Jagielski         if (mpDocShellOfView != NULL)
464*b1cdbd2cSJim Jagielski             EndListening (*mpDocShellOfView);
465*b1cdbd2cSJim Jagielski         mpDocShellOfView = pDocShell;
466*b1cdbd2cSJim Jagielski         if (mpDocShellOfView != NULL)
467*b1cdbd2cSJim Jagielski             StartListening (*mpDocShellOfView);
468*b1cdbd2cSJim Jagielski     }
469*b1cdbd2cSJim Jagielski     if (mpView.get() == NULL)
470*b1cdbd2cSJim Jagielski     {
471*b1cdbd2cSJim Jagielski         mpView.reset (new DrawView (pDocShell, mpPreviewDevice.get(), NULL));
472*b1cdbd2cSJim Jagielski     }
473*b1cdbd2cSJim Jagielski 	mpView->SetPreviewRenderer(true);
474*b1cdbd2cSJim Jagielski #if 1
475*b1cdbd2cSJim Jagielski     mpView->SetPageVisible(false);
476*b1cdbd2cSJim Jagielski 	mpView->SetPageBorderVisible(true);
477*b1cdbd2cSJim Jagielski 	mpView->SetBordVisible(false);
478*b1cdbd2cSJim Jagielski #else
479*b1cdbd2cSJim Jagielski     // This works in the slide sorter but prevents the master page
480*b1cdbd2cSJim Jagielski     // background being painted in the list of current master pages in the
481*b1cdbd2cSJim Jagielski     // task manager.
482*b1cdbd2cSJim Jagielski     mpView->SetPagePaintingAllowed(false);
483*b1cdbd2cSJim Jagielski #endif
484*b1cdbd2cSJim Jagielski }
485*b1cdbd2cSJim Jagielski 
486*b1cdbd2cSJim Jagielski 
487*b1cdbd2cSJim Jagielski 
488*b1cdbd2cSJim Jagielski 
ScaleBitmap(const BitmapEx & rBitmapEx,int nWidth)489*b1cdbd2cSJim Jagielski Image PreviewRenderer::ScaleBitmap (
490*b1cdbd2cSJim Jagielski     const BitmapEx& rBitmapEx,
491*b1cdbd2cSJim Jagielski     int nWidth)
492*b1cdbd2cSJim Jagielski {
493*b1cdbd2cSJim Jagielski     Image aPreview;
494*b1cdbd2cSJim Jagielski 
495*b1cdbd2cSJim Jagielski     do
496*b1cdbd2cSJim Jagielski     {
497*b1cdbd2cSJim Jagielski         // Adjust contrast mode.
498*b1cdbd2cSJim Jagielski         bool bUseContrast = Application::GetSettings().GetStyleSettings().
499*b1cdbd2cSJim Jagielski             GetHighContrastMode();
500*b1cdbd2cSJim Jagielski         mpPreviewDevice->SetDrawMode (bUseContrast
501*b1cdbd2cSJim Jagielski             ? ViewShell::OUTPUT_DRAWMODE_CONTRAST
502*b1cdbd2cSJim Jagielski             : ViewShell::OUTPUT_DRAWMODE_COLOR);
503*b1cdbd2cSJim Jagielski 
504*b1cdbd2cSJim Jagielski         // Set output size.
505*b1cdbd2cSJim Jagielski         Size aSize (rBitmapEx.GetSizePixel());
506*b1cdbd2cSJim Jagielski         if (aSize.Width() <= 0)
507*b1cdbd2cSJim Jagielski             break;
508*b1cdbd2cSJim Jagielski         Size aFrameSize (
509*b1cdbd2cSJim Jagielski             nWidth,
510*b1cdbd2cSJim Jagielski             (long)((nWidth*1.0 * aSize.Height()) / aSize.Width() + 0.5));
511*b1cdbd2cSJim Jagielski         Size aPreviewSize (aFrameSize.Width()-2,aFrameSize.Height()-2);
512*b1cdbd2cSJim Jagielski         MapMode aMapMode (mpPreviewDevice->GetMapMode());
513*b1cdbd2cSJim Jagielski         aMapMode.SetMapUnit(MAP_PIXEL);
514*b1cdbd2cSJim Jagielski         aMapMode.SetOrigin (Point());
515*b1cdbd2cSJim Jagielski         aMapMode.SetScaleX (1.0);
516*b1cdbd2cSJim Jagielski         aMapMode.SetScaleY (1.0);
517*b1cdbd2cSJim Jagielski         mpPreviewDevice->SetMapMode (aMapMode);
518*b1cdbd2cSJim Jagielski         mpPreviewDevice->SetOutputSize (aFrameSize);
519*b1cdbd2cSJim Jagielski 
520*b1cdbd2cSJim Jagielski         // Paint a frame arround the preview.
521*b1cdbd2cSJim Jagielski         mpPreviewDevice->SetLineColor (maFrameColor);
522*b1cdbd2cSJim Jagielski         mpPreviewDevice->SetFillColor ();
523*b1cdbd2cSJim Jagielski         mpPreviewDevice->DrawRect (Rectangle(Point(0,0), aFrameSize));
524*b1cdbd2cSJim Jagielski 
525*b1cdbd2cSJim Jagielski         // Paint the bitmap scaled to the desired width.
526*b1cdbd2cSJim Jagielski         BitmapEx aScaledBitmap (rBitmapEx.GetBitmap());
527*b1cdbd2cSJim Jagielski         aScaledBitmap.Scale (aPreviewSize, BMP_SCALE_INTERPOLATE);
528*b1cdbd2cSJim Jagielski         mpPreviewDevice->DrawBitmap (
529*b1cdbd2cSJim Jagielski             Point(1,1),
530*b1cdbd2cSJim Jagielski             aPreviewSize,
531*b1cdbd2cSJim Jagielski             aScaledBitmap.GetBitmap());
532*b1cdbd2cSJim Jagielski 
533*b1cdbd2cSJim Jagielski         // Get the resulting bitmap.
534*b1cdbd2cSJim Jagielski         aPreview = mpPreviewDevice->GetBitmap (Point(0,0), aFrameSize);
535*b1cdbd2cSJim Jagielski     }
536*b1cdbd2cSJim Jagielski     while (false);
537*b1cdbd2cSJim Jagielski 
538*b1cdbd2cSJim Jagielski     return aPreview;
539*b1cdbd2cSJim Jagielski }
540*b1cdbd2cSJim Jagielski 
541*b1cdbd2cSJim Jagielski 
542*b1cdbd2cSJim Jagielski 
543*b1cdbd2cSJim Jagielski 
Notify(SfxBroadcaster &,const SfxHint & rHint)544*b1cdbd2cSJim Jagielski void PreviewRenderer::Notify(SfxBroadcaster&, const SfxHint& rHint)
545*b1cdbd2cSJim Jagielski {
546*b1cdbd2cSJim Jagielski 	if (rHint.IsA(TYPE(SfxSimpleHint))
547*b1cdbd2cSJim Jagielski         && mpDocShellOfView != NULL)
548*b1cdbd2cSJim Jagielski     {
549*b1cdbd2cSJim Jagielski         const SfxSimpleHint* pSimpleHint = PTR_CAST(SfxSimpleHint, &rHint);
550*b1cdbd2cSJim Jagielski         if (pSimpleHint != NULL
551*b1cdbd2cSJim Jagielski             && pSimpleHint->GetId() == SFX_HINT_DYING)
552*b1cdbd2cSJim Jagielski 		{
553*b1cdbd2cSJim Jagielski             // The doc shell is dying.  Our view uses its item pool and
554*b1cdbd2cSJim Jagielski             // has to be destroyed as well.  The next call to
555*b1cdbd2cSJim Jagielski             // ProvideView will create a new one (for another
556*b1cdbd2cSJim Jagielski             // doc shell, of course.)
557*b1cdbd2cSJim Jagielski             mpView.reset();
558*b1cdbd2cSJim Jagielski             mpDocShellOfView = NULL;
559*b1cdbd2cSJim Jagielski         }
560*b1cdbd2cSJim Jagielski     }
561*b1cdbd2cSJim Jagielski }
562*b1cdbd2cSJim Jagielski 
563*b1cdbd2cSJim Jagielski 
564*b1cdbd2cSJim Jagielski 
565*b1cdbd2cSJim Jagielski 
566*b1cdbd2cSJim Jagielski //===== ViewRedirector ========================================================
567*b1cdbd2cSJim Jagielski 
568*b1cdbd2cSJim Jagielski namespace {
569*b1cdbd2cSJim Jagielski 
ViewRedirector(void)570*b1cdbd2cSJim Jagielski ViewRedirector::ViewRedirector (void)
571*b1cdbd2cSJim Jagielski {
572*b1cdbd2cSJim Jagielski }
573*b1cdbd2cSJim Jagielski 
574*b1cdbd2cSJim Jagielski 
575*b1cdbd2cSJim Jagielski 
576*b1cdbd2cSJim Jagielski 
~ViewRedirector(void)577*b1cdbd2cSJim Jagielski ViewRedirector::~ViewRedirector (void)
578*b1cdbd2cSJim Jagielski {
579*b1cdbd2cSJim Jagielski }
580*b1cdbd2cSJim Jagielski 
581*b1cdbd2cSJim Jagielski 
582*b1cdbd2cSJim Jagielski 
583*b1cdbd2cSJim Jagielski 
createRedirectedPrimitive2DSequence(const sdr::contact::ViewObjectContact & rOriginal,const sdr::contact::DisplayInfo & rDisplayInfo)584*b1cdbd2cSJim Jagielski drawinglayer::primitive2d::Primitive2DSequence ViewRedirector::createRedirectedPrimitive2DSequence(
585*b1cdbd2cSJim Jagielski 	const sdr::contact::ViewObjectContact& rOriginal,
586*b1cdbd2cSJim Jagielski 	const sdr::contact::DisplayInfo& rDisplayInfo)
587*b1cdbd2cSJim Jagielski {
588*b1cdbd2cSJim Jagielski 	SdrObject* pObject = rOriginal.GetViewContact().TryToGetSdrObject();
589*b1cdbd2cSJim Jagielski 
590*b1cdbd2cSJim Jagielski 	if (pObject==NULL || pObject->GetPage() == NULL)
591*b1cdbd2cSJim Jagielski 	{
592*b1cdbd2cSJim Jagielski 		// not a SdrObject visualisation (maybe e.g. page) or no page
593*b1cdbd2cSJim Jagielski 		return sdr::contact::ViewObjectContactRedirector::createRedirectedPrimitive2DSequence(
594*b1cdbd2cSJim Jagielski             rOriginal,
595*b1cdbd2cSJim Jagielski             rDisplayInfo);
596*b1cdbd2cSJim Jagielski     }
597*b1cdbd2cSJim Jagielski 
598*b1cdbd2cSJim Jagielski     const bool bDoCreateGeometry (pObject->GetPage()->checkVisibility( rOriginal, rDisplayInfo, true));
599*b1cdbd2cSJim Jagielski 
600*b1cdbd2cSJim Jagielski     if ( ! bDoCreateGeometry
601*b1cdbd2cSJim Jagielski         && (pObject->GetObjInventor() != SdrInventor || pObject->GetObjIdentifier() != OBJ_PAGE))
602*b1cdbd2cSJim Jagielski     {
603*b1cdbd2cSJim Jagielski         return drawinglayer::primitive2d::Primitive2DSequence();
604*b1cdbd2cSJim Jagielski     }
605*b1cdbd2cSJim Jagielski 
606*b1cdbd2cSJim Jagielski     if (pObject->IsEmptyPresObj())
607*b1cdbd2cSJim Jagielski         return drawinglayer::primitive2d::Primitive2DSequence();
608*b1cdbd2cSJim Jagielski 
609*b1cdbd2cSJim Jagielski     return sdr::contact::ViewObjectContactRedirector::createRedirectedPrimitive2DSequence(
610*b1cdbd2cSJim Jagielski         rOriginal,
611*b1cdbd2cSJim Jagielski         rDisplayInfo);
612*b1cdbd2cSJim Jagielski }
613*b1cdbd2cSJim Jagielski 
614*b1cdbd2cSJim Jagielski } // end of anonymous namespace
615*b1cdbd2cSJim Jagielski 
616*b1cdbd2cSJim Jagielski 
617*b1cdbd2cSJim Jagielski } // end of namespace ::sd
618