xref: /trunk/main/sd/source/ui/dlg/docprev.cxx (revision 79aad27f)
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_sd.hxx"
26 #include <com/sun/star/drawing/XDrawPage.hpp>
27 #include <com/sun/star/animations/XAnimationNode.hpp>
28 #include "slideshow.hxx"
29 #include <sfx2/objsh.hxx>
30 #include <vcl/gdimtf.hxx>
31 #include <vcl/virdev.hxx>
32 #include <com/sun/star/presentation/FadeEffect.hpp>
33 #include <fadedef.h>
34 #include <vcl/ctrl.hxx>
35 #include <svx/svdoutl.hxx>
36 #include <svx/svdpagv.hxx>
37 #include <svx/svdorect.hxx>
38 
39 #include "docprev.hxx"
40 #include "drawdoc.hxx"
41 #include "DrawDocShell.hxx"
42 #include "ViewShell.hxx"
43 #include "ViewShellBase.hxx"
44 #include "drawview.hxx"
45 #include "sdpage.hxx"
46 #include "sfx2/viewfrm.hxx"
47 #include <vcl/svapp.hxx>
48 
49 #include <memory>
50 
51 using ::com::sun::star::drawing::XDrawPage;
52 using ::com::sun::star::animations::XAnimationNode;
53 using namespace ::com::sun::star;
54 using namespace ::com::sun::star::uno;
55 
56 const int SdDocPreviewWin::FRAME = 4;
57 
SetObjectShell(SfxObjectShell * pObj,sal_uInt16 nShowPage)58 void SdDocPreviewWin::SetObjectShell( SfxObjectShell* pObj, sal_uInt16 nShowPage )
59 {
60 	mpObj = pObj;
61 	mnShowPage = nShowPage;
62     if (mxSlideShow.is())
63     {
64         mxSlideShow->end();
65         mxSlideShow.clear();
66     }
67 	updateViewSettings();
68 }
69 
SdDocPreviewWin(Window * pParent,const ResId & rResId)70 SdDocPreviewWin::SdDocPreviewWin( Window* pParent, const ResId& rResId )
71 : Control(pParent, rResId), pMetaFile( 0 ), bInEffect(sal_False), mpObj(NULL), mnShowPage(0)
72 {
73     SetBorderStyle( WINDOW_BORDER_MONO );
74     svtools::ColorConfig aColorConfig;
75 	Wallpaper aEmpty;
76     SetBackground( aEmpty );
77 }
78 
~SdDocPreviewWin()79 SdDocPreviewWin::~SdDocPreviewWin()
80 {
81 	delete pMetaFile;
82 }
83 
Resize()84 void SdDocPreviewWin::Resize()
85 {
86 	Invalidate();
87 	if( mxSlideShow.is() )
88 		mxSlideShow->resize( GetSizePixel() );
89 }
90 
CalcSizeAndPos(GDIMetaFile * pFile,Size & rSize,Point & rPoint)91 void SdDocPreviewWin::CalcSizeAndPos( GDIMetaFile* pFile, Size& rSize, Point& rPoint )
92 {
93 	Size aTmpSize = pFile ? pFile->GetPrefSize() : Size(1,1 );
94 	long nWidth = rSize.Width() - 2*FRAME;
95 	long nHeight = rSize.Height() - 2*FRAME;
96 	if( nWidth < 0 ) nWidth = 0;
97 	if( nHeight < 0 ) nHeight = 0;
98 
99 	double dRatio=((double)aTmpSize.Width())/aTmpSize.Height();
100 	double dRatioPreV=((double) nWidth ) / nHeight;
101 
102 	if (dRatio>dRatioPreV)
103 	{
104 		rSize=Size(nWidth, (sal_uInt16)(nWidth/dRatio));
105 		rPoint=Point( 0, (sal_uInt16)((nHeight-rSize.Height())/2));
106 	}
107 	else
108 	{
109 		rSize=Size((sal_uInt16)(nHeight*dRatio), nHeight);
110 		rPoint=Point((sal_uInt16)((nWidth-rSize.Width())/2),0);
111 	}
112 }
113 
ImpPaint(GDIMetaFile * pFile,OutputDevice * pVDev)114 void SdDocPreviewWin::ImpPaint( GDIMetaFile* pFile, OutputDevice* pVDev )
115 {
116 	Point aPoint;
117 	Size aSize = pVDev->GetOutputSize();
118 	Point bPoint(aSize.Width()-2*FRAME, aSize.Height()-2*FRAME );
119 	CalcSizeAndPos( pFile, aSize, aPoint );
120 	bPoint -= aPoint;
121 	aPoint += Point( FRAME, FRAME );
122 
123     svtools::ColorConfig aColorConfig;
124 
125 	pVDev->SetLineColor();
126     pVDev->SetFillColor( Color( aColorConfig.GetColorValue( svtools::APPBACKGROUND ).nColor ) );
127 	pVDev->DrawRect(Rectangle( Point(0,0 ), pVDev->GetOutputSize()));
128 	if( pFile )
129 	{
130 		pVDev->SetFillColor( maDocumentColor );
131 		pVDev->DrawRect(Rectangle(aPoint, aSize));
132 		pFile->WindStart();
133 		pFile->Play( pVDev, aPoint, aSize  );
134 	}
135 }
136 
Paint(const Rectangle & rRect)137 void SdDocPreviewWin::Paint( const Rectangle& rRect )
138 {
139 	if( (!mxSlideShow.is()) || (!mxSlideShow->isRunning() ) )
140 	{
141 		SvtAccessibilityOptions aAccOptions;
142 		bool bUseContrast = aAccOptions.GetIsForPagePreviews() && Application::GetSettings().GetStyleSettings().GetHighContrastMode();
143 		SetDrawMode( bUseContrast
144 			? ::sd::ViewShell::OUTPUT_DRAWMODE_CONTRAST
145 			: ::sd::ViewShell::OUTPUT_DRAWMODE_COLOR );
146 
147 		ImpPaint( pMetaFile, (VirtualDevice*)this );
148 	}
149 	else
150 	{
151 		mxSlideShow->paint( rRect );
152 	}
153 }
154 
startPreview()155 void SdDocPreviewWin::startPreview()
156 {
157 	::sd::DrawDocShell* pDocShell = dynamic_cast< ::sd::DrawDocShell * >( mpObj );
158 	if( mpObj )
159 	{
160 		SdDrawDocument* pDoc = pDocShell->GetDoc();
161 
162 		if( pDoc )
163 		{
164 			SdPage* pPage = pDoc->GetSdPage( mnShowPage, PK_STANDARD );
165 
166 			if( pPage && (pPage->getTransitionType() != 0) )
167 			{
168 				if( !mxSlideShow.is() )
169 					mxSlideShow = sd::SlideShow::Create( pDoc );
170 
171                 Reference< XDrawPage > xDrawPage( pPage->getUnoPage(), UNO_QUERY );
172                 Reference< XAnimationNode > xAnimationNode;
173 
174                 mxSlideShow->startPreview( xDrawPage, xAnimationNode, this );
175 			}
176 		}
177 	}
178 }
179 
Notify(NotifyEvent & rNEvt)180 long SdDocPreviewWin::Notify( NotifyEvent& rNEvt )
181 {
182 	if ( rNEvt.GetType() == EVENT_MOUSEBUTTONDOWN )
183 	{
184 		const MouseEvent* pMEvt = rNEvt.GetMouseEvent();
185 		if ( pMEvt->IsLeft() )
186 		{
187 			if( rNEvt.GetWindow() == this )
188 			{
189 				if(aClickHdl.IsSet())
190 					aClickHdl.Call(this);
191 			}
192 		}
193 	}
194 
195 	return Control::Notify( rNEvt );
196 }
197 
198 
updateViewSettings()199 void SdDocPreviewWin::updateViewSettings()
200 {
201 	::sd::DrawDocShell* pDocShell = PTR_CAST(::sd::DrawDocShell,mpObj);
202 	SdDrawDocument* pDoc = pDocShell?pDocShell->GetDoc():NULL;
203 
204 	SvtAccessibilityOptions aAccOptions;
205 	bool bUseWhiteColor = !aAccOptions.GetIsForPagePreviews() && GetSettings().GetStyleSettings().GetHighContrastMode();
206 	if( bUseWhiteColor )
207 	{
208 		maDocumentColor = Color( COL_WHITE );
209 	}
210 	else
211 	{
212         svtools::ColorConfig aColorConfig;
213         maDocumentColor = Color( aColorConfig.GetColorValue( svtools::DOCCOLOR ).nColor );
214 	}
215 
216 	GDIMetaFile* pMtf = NULL;
217 
218 	if(pDoc)
219 	{
220 		SdPage * pPage = pDoc->GetSdPage( mnShowPage, PK_STANDARD );
221 		if( pPage )
222 		{
223 			SdrOutliner& rOutl = pDoc->GetDrawOutliner();
224 			Color aOldBackgroundColor = rOutl.GetBackgroundColor();
225 			rOutl.SetBackgroundColor( maDocumentColor );
226 
227 			pMtf = new GDIMetaFile;
228 
229 			VirtualDevice		aVDev;
230 
231 			const Fraction		aFrac( pDoc->GetScaleFraction() );
232 			const MapMode 		aMap( pDoc->GetScaleUnit(), Point(), aFrac, aFrac );
233 
234 			aVDev.SetMapMode( aMap );
235 
236 			// #109058# Disable output, as we only want to record a metafile
237 			aVDev.EnableOutput( sal_False );
238 
239 			pMtf->Record( &aVDev );
240 
241 			::sd::DrawView* pView = new ::sd::DrawView(pDocShell, this, NULL);
242 
243 
244 			const Size aSize( pPage->GetSize() );
245 
246 			pView->SetBordVisible( sal_False );
247 			pView->SetPageVisible( sal_False );
248 			pView->ShowSdrPage( pPage );
249 
250 			const Point	aNewOrg( pPage->GetLftBorder(), pPage->GetUppBorder() );
251 			const Size aNewSize( aSize.Width() - pPage->GetLftBorder() - pPage->GetRgtBorder(),
252 								  aSize.Height() - pPage->GetUppBorder() - pPage->GetLwrBorder() );
253 			const Rectangle aClipRect( aNewOrg, aNewSize );
254 			MapMode			aVMap( aMap );
255 
256 			aVDev.Push();
257 			aVMap.SetOrigin( Point( -aNewOrg.X(), -aNewOrg.Y() ) );
258 			aVDev.SetRelativeMapMode( aVMap );
259 			aVDev.IntersectClipRegion( aClipRect );
260 
261 		// Use new StandardCheckVisisbilityRedirector
262 		StandardCheckVisisbilityRedirector aRedirector;
263 		const Rectangle aRedrawRectangle = Rectangle( Point(), aNewSize );
264 		Region aRedrawRegion(aRedrawRectangle);
265 		pView->SdrPaintView::CompleteRedraw(&aVDev,aRedrawRegion,&aRedirector);
266 
267 			aVDev.Pop();
268 
269 			pMtf->Stop();
270 			pMtf->WindStart();
271 			pMtf->SetPrefMapMode( aMap );
272 			pMtf->SetPrefSize( aNewSize );
273 
274 			rOutl.SetBackgroundColor( aOldBackgroundColor );
275 
276 			delete pView;
277 		}
278 	}
279 
280 	delete pMetaFile;
281 	pMetaFile = pMtf;
282 
283 	Invalidate();
284 }
285 
Notify(SfxBroadcaster &,const SfxHint & rHint)286 void SdDocPreviewWin::Notify(SfxBroadcaster&, const SfxHint& rHint)
287 {
288 	if( rHint.ISA( SfxSimpleHint ) && ( (SfxSimpleHint&) rHint ).GetId() == SFX_HINT_COLORS_CHANGED )
289 	{
290 		updateViewSettings();
291 	}
292 }
DataChanged(const DataChangedEvent & rDCEvt)293 void SdDocPreviewWin::DataChanged( const DataChangedEvent& rDCEvt )
294 {
295 	Control::DataChanged( rDCEvt );
296 
297 	if ( (rDCEvt.GetType() == DATACHANGED_SETTINGS) && (rDCEvt.GetFlags() & SETTINGS_STYLE) )
298 	{
299 		updateViewSettings();
300 	}
301 }
302