blob: 8548c9d49aeef53127843079bd997e319bbf2297 [file] [log] [blame]
/**************************************************************
*
* 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_svx.hxx"
#include <vcl/svapp.hxx>
#include <svx/svdomedia.hxx>
#include "svx/svdglob.hxx"
#include "svx/svdstr.hrc"
#include <svx/sdr/contact/viewcontactofsdrmediaobj.hxx>
#include <avmedia/mediawindow.hxx>
// ---------------
// - SdrMediaObj -
// ---------------
TYPEINIT1( SdrMediaObj, SdrRectObj );
// ------------------------------------------------------------------------------
SdrMediaObj::SdrMediaObj()
{
}
// ------------------------------------------------------------------------------
SdrMediaObj::SdrMediaObj( const Rectangle& rRect ) :
SdrRectObj( rRect )
{
}
// ------------------------------------------------------------------------------
SdrMediaObj::~SdrMediaObj()
{
}
// ------------------------------------------------------------------------------
FASTBOOL SdrMediaObj::HasTextEdit() const
{
return sal_False;
}
// ------------------------------------------------------------------------------
sdr::contact::ViewContact* SdrMediaObj::CreateObjectSpecificViewContact()
{
return new ::sdr::contact::ViewContactOfSdrMediaObj( *this );
}
// ------------------------------------------------------------------------------
void SdrMediaObj::TakeObjInfo( SdrObjTransformInfoRec& rInfo ) const
{
rInfo.bSelectAllowed = true;
rInfo.bMoveAllowed = true;
rInfo.bResizeFreeAllowed = true;
rInfo.bResizePropAllowed = true;
rInfo.bRotateFreeAllowed = false;
rInfo.bRotate90Allowed = false;
rInfo.bMirrorFreeAllowed = false;
rInfo.bMirror45Allowed = false;
rInfo.bMirror90Allowed = false;
rInfo.bTransparenceAllowed = false;
rInfo.bGradientAllowed = false;
rInfo.bShearAllowed = false;
rInfo.bEdgeRadiusAllowed = false;
rInfo.bNoOrthoDesired = false;
rInfo.bNoContortion = false;
rInfo.bCanConvToPath = false;
rInfo.bCanConvToPoly = false;
rInfo.bCanConvToContour = false;
rInfo.bCanConvToPathLineToArea = false;
rInfo.bCanConvToPolyLineToArea = false;
}
// ------------------------------------------------------------------------------
sal_uInt16 SdrMediaObj::GetObjIdentifier() const
{
return sal_uInt16( OBJ_MEDIA );
}
// ------------------------------------------------------------------------------
void SdrMediaObj::TakeObjNameSingul(XubString& rName) const
{
rName=ImpGetResStr(STR_ObjNameSingulMEDIA);
String aName( GetName() );
if(aName.Len())
{
rName += sal_Unicode(' ');
rName += sal_Unicode('\'');
rName += aName;
rName += sal_Unicode('\'');
}
}
// ------------------------------------------------------------------------------
void SdrMediaObj::TakeObjNamePlural(XubString& rName) const
{
rName=ImpGetResStr(STR_ObjNamePluralMEDIA);
}
// ------------------------------------------------------------------------------
void SdrMediaObj::operator=(const SdrObject& rObj)
{
SdrRectObj::operator=( rObj );
if( rObj.ISA( SdrMediaObj ) )
{
const SdrMediaObj& rMediaObj = static_cast< const SdrMediaObj& >( rObj );
setMediaProperties( rMediaObj.getMediaProperties() );
setGraphic( rMediaObj.mapGraphic.get() );
}
}
// ------------------------------------------------------------------------------
void SdrMediaObj::AdjustToMaxRect( const Rectangle& rMaxRect, bool bShrinkOnly /* = false */ )
{
Size aSize( Application::GetDefaultDevice()->PixelToLogic( getPreferredSize(), MAP_100TH_MM ) );
Size aMaxSize( rMaxRect.GetSize() );
if( aSize.Height() != 0 && aSize.Width() != 0 )
{
Point aPos( rMaxRect.TopLeft() );
// Falls Grafik zu gross, wird die Grafik
// in die Seite eingepasst
if ( (!bShrinkOnly ||
( aSize.Height() > aMaxSize.Height() ) ||
( aSize.Width() > aMaxSize.Width() ) )&&
aSize.Height() && aMaxSize.Height() )
{
float fGrfWH = (float)aSize.Width() /
(float)aSize.Height();
float fWinWH = (float)aMaxSize.Width() /
(float)aMaxSize.Height();
// Grafik an Pagesize anpassen (skaliert)
if ( fGrfWH < fWinWH )
{
aSize.Width() = (long)(aMaxSize.Height() * fGrfWH);
aSize.Height()= aMaxSize.Height();
}
else if ( fGrfWH > 0.F )
{
aSize.Width() = aMaxSize.Width();
aSize.Height()= (long)(aMaxSize.Width() / fGrfWH);
}
aPos = rMaxRect.Center();
}
if( bShrinkOnly )
aPos = aRect.TopLeft();
aPos.X() -= aSize.Width() / 2;
aPos.Y() -= aSize.Height() / 2;
SetLogicRect( Rectangle( aPos, aSize ) );
}
}
// ------------------------------------------------------------------------------
void SdrMediaObj::setURL( const ::rtl::OUString& rURL )
{
::avmedia::MediaItem aURLItem;
aURLItem.setURL( rURL );
setMediaProperties( aURLItem );
}
// ------------------------------------------------------------------------------
const ::rtl::OUString& SdrMediaObj::getURL() const
{
return getMediaProperties().getURL();
}
// ------------------------------------------------------------------------------
void SdrMediaObj::setMediaProperties( const ::avmedia::MediaItem& rState )
{
mediaPropertiesChanged( rState );
static_cast< ::sdr::contact::ViewContactOfSdrMediaObj& >( GetViewContact() ).executeMediaItem( getMediaProperties() );
}
// ------------------------------------------------------------------------------
const ::avmedia::MediaItem& SdrMediaObj::getMediaProperties() const
{
return maMediaProperties;
}
// ------------------------------------------------------------------------------
bool SdrMediaObj::hasPreferredSize() const
{
return static_cast< ::sdr::contact::ViewContactOfSdrMediaObj& >( GetViewContact() ).hasPreferredSize();
}
// ------------------------------------------------------------------------------
Size SdrMediaObj::getPreferredSize() const
{
return static_cast< ::sdr::contact::ViewContactOfSdrMediaObj& >( GetViewContact() ).getPreferredSize();
}
// ------------------------------------------------------------------------------
const Graphic& SdrMediaObj::getGraphic() const
{
if( !mapGraphic.get() )
const_cast< SdrMediaObj* >( this )->mapGraphic.reset( new Graphic( ::avmedia::MediaWindow::grabFrame( getURL(), true ) ) );
return *mapGraphic;
}
// ------------------------------------------------------------------------------
void SdrMediaObj::setGraphic( const Graphic* pGraphic )
{
mapGraphic.reset( pGraphic ? new Graphic( *pGraphic ) : NULL );
}
// ------------------------------------------------------------------------------
void SdrMediaObj::mediaPropertiesChanged( const ::avmedia::MediaItem& rNewProperties )
{
const sal_uInt32 nMaskSet = rNewProperties.getMaskSet();
// use only a subset of MediaItem properties for own own properties
if( ( AVMEDIA_SETMASK_URL & nMaskSet ) &&
( rNewProperties.getURL() != getURL() ) )
{
setGraphic();
maMediaProperties.setURL( rNewProperties.getURL() );
}
if( AVMEDIA_SETMASK_LOOP & nMaskSet )
maMediaProperties.setLoop( rNewProperties.isLoop() );
if( AVMEDIA_SETMASK_MUTE & nMaskSet )
maMediaProperties.setMute( rNewProperties.isMute() );
if( AVMEDIA_SETMASK_VOLUMEDB & nMaskSet )
maMediaProperties.setVolumeDB( rNewProperties.getVolumeDB() );
if( AVMEDIA_SETMASK_ZOOM & nMaskSet )
maMediaProperties.setZoom( rNewProperties.getZoom() );
}