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 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 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 79 SdDocPreviewWin::~SdDocPreviewWin() 80 { 81 delete pMetaFile; 82 } 83 84 void SdDocPreviewWin::Resize() 85 { 86 Invalidate(); 87 if( mxSlideShow.is() ) 88 mxSlideShow->resize( GetSizePixel() ); 89 } 90 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 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 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 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 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 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 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 } 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