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