| /************************************************************** |
| * |
| * Licensed to the Apache Software Foundation (ASF) under one |
| * or more contributor license agreements. See the NOTICE file |
| * distributed with this work for additional information |
| * regarding copyright ownership. The ASF licenses this file |
| * to you under the Apache License, Version 2.0 (the |
| * "License"); you may not use this file except in compliance |
| * with the License. You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, |
| * software distributed under the License is distributed on an |
| * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY |
| * KIND, either express or implied. See the License for the |
| * specific language governing permissions and limitations |
| * under the License. |
| * |
| *************************************************************/ |
| |
| |
| |
| // MARKER(update_precomp.py): autogen include statement, do not remove |
| #include "precompiled_sd.hxx" |
| #include <com/sun/star/drawing/XDrawPage.hpp> |
| #include <com/sun/star/animations/XAnimationNode.hpp> |
| #include "slideshow.hxx" |
| #include <sfx2/objsh.hxx> |
| #include <vcl/gdimtf.hxx> |
| #include <vcl/virdev.hxx> |
| #include <com/sun/star/presentation/FadeEffect.hpp> |
| #include <fadedef.h> |
| #include <vcl/ctrl.hxx> |
| #include <svx/svdoutl.hxx> |
| #include <svx/svdpagv.hxx> |
| #include <svx/svdorect.hxx> |
| |
| #include "docprev.hxx" |
| #include "drawdoc.hxx" |
| #include "DrawDocShell.hxx" |
| #include "ViewShell.hxx" |
| #include "ViewShellBase.hxx" |
| #include "drawview.hxx" |
| #include "sdpage.hxx" |
| #include "sfx2/viewfrm.hxx" |
| #include <vcl/svapp.hxx> |
| |
| #include <memory> |
| |
| using ::com::sun::star::drawing::XDrawPage; |
| using ::com::sun::star::animations::XAnimationNode; |
| using namespace ::com::sun::star; |
| using namespace ::com::sun::star::uno; |
| |
| const int SdDocPreviewWin::FRAME = 4; |
| |
| void SdDocPreviewWin::SetObjectShell( SfxObjectShell* pObj, sal_uInt16 nShowPage ) |
| { |
| mpObj = pObj; |
| mnShowPage = nShowPage; |
| if (mxSlideShow.is()) |
| { |
| mxSlideShow->end(); |
| mxSlideShow.clear(); |
| } |
| updateViewSettings(); |
| } |
| |
| SdDocPreviewWin::SdDocPreviewWin( Window* pParent, const ResId& rResId ) |
| : Control(pParent, rResId), pMetaFile( 0 ), bInEffect(sal_False), mpObj(NULL), mnShowPage(0) |
| { |
| SetBorderStyle( WINDOW_BORDER_MONO ); |
| svtools::ColorConfig aColorConfig; |
| Wallpaper aEmpty; |
| SetBackground( aEmpty ); |
| } |
| |
| SdDocPreviewWin::~SdDocPreviewWin() |
| { |
| delete pMetaFile; |
| } |
| |
| void SdDocPreviewWin::Resize() |
| { |
| Invalidate(); |
| if( mxSlideShow.is() ) |
| mxSlideShow->resize( GetSizePixel() ); |
| } |
| |
| void SdDocPreviewWin::CalcSizeAndPos( GDIMetaFile* pFile, Size& rSize, Point& rPoint ) |
| { |
| Size aTmpSize = pFile ? pFile->GetPrefSize() : Size(1,1 ); |
| long nWidth = rSize.Width() - 2*FRAME; |
| long nHeight = rSize.Height() - 2*FRAME; |
| if( nWidth < 0 ) nWidth = 0; |
| if( nHeight < 0 ) nHeight = 0; |
| |
| double dRatio=((double)aTmpSize.Width())/aTmpSize.Height(); |
| double dRatioPreV=((double) nWidth ) / nHeight; |
| |
| if (dRatio>dRatioPreV) |
| { |
| rSize=Size(nWidth, (sal_uInt16)(nWidth/dRatio)); |
| rPoint=Point( 0, (sal_uInt16)((nHeight-rSize.Height())/2)); |
| } |
| else |
| { |
| rSize=Size((sal_uInt16)(nHeight*dRatio), nHeight); |
| rPoint=Point((sal_uInt16)((nWidth-rSize.Width())/2),0); |
| } |
| } |
| |
| void SdDocPreviewWin::ImpPaint( GDIMetaFile* pFile, OutputDevice* pVDev ) |
| { |
| Point aPoint; |
| Size aSize = pVDev->GetOutputSize(); |
| Point bPoint(aSize.Width()-2*FRAME, aSize.Height()-2*FRAME ); |
| CalcSizeAndPos( pFile, aSize, aPoint ); |
| bPoint -= aPoint; |
| aPoint += Point( FRAME, FRAME ); |
| |
| svtools::ColorConfig aColorConfig; |
| |
| pVDev->SetLineColor(); |
| pVDev->SetFillColor( Color( aColorConfig.GetColorValue( svtools::APPBACKGROUND ).nColor ) ); |
| pVDev->DrawRect(Rectangle( Point(0,0 ), pVDev->GetOutputSize())); |
| if( pFile ) |
| { |
| pVDev->SetFillColor( maDocumentColor ); |
| pVDev->DrawRect(Rectangle(aPoint, aSize)); |
| pFile->WindStart(); |
| pFile->Play( pVDev, aPoint, aSize ); |
| } |
| } |
| |
| void SdDocPreviewWin::Paint( const Rectangle& rRect ) |
| { |
| if( (!mxSlideShow.is()) || (!mxSlideShow->isRunning() ) ) |
| { |
| SvtAccessibilityOptions aAccOptions; |
| bool bUseContrast = aAccOptions.GetIsForPagePreviews() && Application::GetSettings().GetStyleSettings().GetHighContrastMode(); |
| SetDrawMode( bUseContrast |
| ? ::sd::ViewShell::OUTPUT_DRAWMODE_CONTRAST |
| : ::sd::ViewShell::OUTPUT_DRAWMODE_COLOR ); |
| |
| ImpPaint( pMetaFile, (VirtualDevice*)this ); |
| } |
| else |
| { |
| mxSlideShow->paint( rRect ); |
| } |
| } |
| |
| void SdDocPreviewWin::startPreview() |
| { |
| ::sd::DrawDocShell* pDocShell = dynamic_cast< ::sd::DrawDocShell * >( mpObj ); |
| if( mpObj ) |
| { |
| SdDrawDocument* pDoc = pDocShell->GetDoc(); |
| |
| if( pDoc ) |
| { |
| SdPage* pPage = pDoc->GetSdPage( mnShowPage, PK_STANDARD ); |
| |
| if( pPage && (pPage->getTransitionType() != 0) ) |
| { |
| if( !mxSlideShow.is() ) |
| mxSlideShow = sd::SlideShow::Create( pDoc ); |
| |
| Reference< XDrawPage > xDrawPage( pPage->getUnoPage(), UNO_QUERY ); |
| Reference< XAnimationNode > xAnimationNode; |
| |
| mxSlideShow->startPreview( xDrawPage, xAnimationNode, this ); |
| } |
| } |
| } |
| } |
| |
| long SdDocPreviewWin::Notify( NotifyEvent& rNEvt ) |
| { |
| if ( rNEvt.GetType() == EVENT_MOUSEBUTTONDOWN ) |
| { |
| const MouseEvent* pMEvt = rNEvt.GetMouseEvent(); |
| if ( pMEvt->IsLeft() ) |
| { |
| if( rNEvt.GetWindow() == this ) |
| { |
| if(aClickHdl.IsSet()) |
| aClickHdl.Call(this); |
| } |
| } |
| } |
| |
| return Control::Notify( rNEvt ); |
| } |
| |
| |
| void SdDocPreviewWin::updateViewSettings() |
| { |
| ::sd::DrawDocShell* pDocShell = PTR_CAST(::sd::DrawDocShell,mpObj); |
| SdDrawDocument* pDoc = pDocShell?pDocShell->GetDoc():NULL; |
| |
| SvtAccessibilityOptions aAccOptions; |
| bool bUseWhiteColor = !aAccOptions.GetIsForPagePreviews() && GetSettings().GetStyleSettings().GetHighContrastMode(); |
| if( bUseWhiteColor ) |
| { |
| maDocumentColor = Color( COL_WHITE ); |
| } |
| else |
| { |
| svtools::ColorConfig aColorConfig; |
| maDocumentColor = Color( aColorConfig.GetColorValue( svtools::DOCCOLOR ).nColor ); |
| } |
| |
| GDIMetaFile* pMtf = NULL; |
| |
| if(pDoc) |
| { |
| SdPage * pPage = pDoc->GetSdPage( mnShowPage, PK_STANDARD ); |
| if( pPage ) |
| { |
| SdrOutliner& rOutl = pDoc->GetDrawOutliner(); |
| Color aOldBackgroundColor = rOutl.GetBackgroundColor(); |
| rOutl.SetBackgroundColor( maDocumentColor ); |
| |
| pMtf = new GDIMetaFile; |
| |
| VirtualDevice aVDev; |
| |
| const Fraction aFrac( pDoc->GetScaleFraction() ); |
| const MapMode aMap( pDoc->GetScaleUnit(), Point(), aFrac, aFrac ); |
| |
| aVDev.SetMapMode( aMap ); |
| |
| // #109058# Disable output, as we only want to record a metafile |
| aVDev.EnableOutput( sal_False ); |
| |
| pMtf->Record( &aVDev ); |
| |
| ::sd::DrawView* pView = new ::sd::DrawView(pDocShell, this, NULL); |
| |
| |
| const Size aSize( pPage->GetSize() ); |
| |
| pView->SetBordVisible( sal_False ); |
| pView->SetPageVisible( sal_False ); |
| pView->ShowSdrPage( pPage ); |
| |
| const Point aNewOrg( pPage->GetLftBorder(), pPage->GetUppBorder() ); |
| const Size aNewSize( aSize.Width() - pPage->GetLftBorder() - pPage->GetRgtBorder(), |
| aSize.Height() - pPage->GetUppBorder() - pPage->GetLwrBorder() ); |
| const Rectangle aClipRect( aNewOrg, aNewSize ); |
| MapMode aVMap( aMap ); |
| |
| aVDev.Push(); |
| aVMap.SetOrigin( Point( -aNewOrg.X(), -aNewOrg.Y() ) ); |
| aVDev.SetRelativeMapMode( aVMap ); |
| aVDev.IntersectClipRegion( aClipRect ); |
| |
| // Use new StandardCheckVisisbilityRedirector |
| StandardCheckVisisbilityRedirector aRedirector; |
| const Rectangle aRedrawRectangle = Rectangle( Point(), aNewSize ); |
| Region aRedrawRegion(aRedrawRectangle); |
| pView->SdrPaintView::CompleteRedraw(&aVDev,aRedrawRegion,&aRedirector); |
| |
| aVDev.Pop(); |
| |
| pMtf->Stop(); |
| pMtf->WindStart(); |
| pMtf->SetPrefMapMode( aMap ); |
| pMtf->SetPrefSize( aNewSize ); |
| |
| rOutl.SetBackgroundColor( aOldBackgroundColor ); |
| |
| delete pView; |
| } |
| } |
| |
| delete pMetaFile; |
| pMetaFile = pMtf; |
| |
| Invalidate(); |
| } |
| |
| void SdDocPreviewWin::Notify(SfxBroadcaster&, const SfxHint& rHint) |
| { |
| if( rHint.ISA( SfxSimpleHint ) && ( (SfxSimpleHint&) rHint ).GetId() == SFX_HINT_COLORS_CHANGED ) |
| { |
| updateViewSettings(); |
| } |
| } |
| void SdDocPreviewWin::DataChanged( const DataChangedEvent& rDCEvt ) |
| { |
| Control::DataChanged( rDCEvt ); |
| |
| if ( (rDCEvt.GetType() == DATACHANGED_SETTINGS) && (rDCEvt.GetFlags() & SETTINGS_STYLE) ) |
| { |
| updateViewSettings(); |
| } |
| } |