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