xref: /aoo41x/main/svx/source/svdraw/svdomedia.cxx (revision cdf0e10c)
1 /*************************************************************************
2  *
3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4  *
5  * Copyright 2000, 2010 Oracle and/or its affiliates.
6  *
7  * OpenOffice.org - a multi-platform office productivity suite
8  *
9  * This file is part of OpenOffice.org.
10  *
11  * OpenOffice.org is free software: you can redistribute it and/or modify
12  * it under the terms of the GNU Lesser General Public License version 3
13  * only, as published by the Free Software Foundation.
14  *
15  * OpenOffice.org is distributed in the hope that it will be useful,
16  * but WITHOUT ANY WARRANTY; without even the implied warranty of
17  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18  * GNU Lesser General Public License version 3 for more details
19  * (a copy is included in the LICENSE file that accompanied this code).
20  *
21  * You should have received a copy of the GNU Lesser General Public License
22  * version 3 along with OpenOffice.org.  If not, see
23  * <http://www.openoffice.org/license.html>
24  * for a copy of the LGPLv3 License.
25  *
26  ************************************************************************/
27 
28 // MARKER(update_precomp.py): autogen include statement, do not remove
29 #include "precompiled_svx.hxx"
30 
31 #include <vcl/svapp.hxx>
32 
33 #include <svx/svdomedia.hxx>
34 #include "svx/svdglob.hxx"
35 #include "svx/svdstr.hrc"
36 #include <svx/sdr/contact/viewcontactofsdrmediaobj.hxx>
37 #include <avmedia/mediawindow.hxx>
38 
39 // ---------------
40 // - SdrMediaObj -
41 // ---------------
42 
43 TYPEINIT1( SdrMediaObj, SdrRectObj );
44 
45 // ------------------------------------------------------------------------------
46 
47 SdrMediaObj::SdrMediaObj()
48 {
49 }
50 
51 // ------------------------------------------------------------------------------
52 
53 SdrMediaObj::SdrMediaObj( const Rectangle& rRect ) :
54 	SdrRectObj( rRect )
55 {
56 }
57 
58 // ------------------------------------------------------------------------------
59 
60 SdrMediaObj::~SdrMediaObj()
61 {
62 }
63 
64 // ------------------------------------------------------------------------------
65 
66 FASTBOOL SdrMediaObj::HasTextEdit() const
67 {
68 	return sal_False;
69 }
70 
71 // ------------------------------------------------------------------------------
72 
73 sdr::contact::ViewContact* SdrMediaObj::CreateObjectSpecificViewContact()
74 {
75 	return new ::sdr::contact::ViewContactOfSdrMediaObj( *this );
76 }
77 
78 // ------------------------------------------------------------------------------
79 
80 void SdrMediaObj::TakeObjInfo( SdrObjTransformInfoRec& rInfo ) const
81 {
82 	rInfo.bSelectAllowed = true;
83 	rInfo.bMoveAllowed = true;
84 	rInfo.bResizeFreeAllowed = true;
85 	rInfo.bResizePropAllowed = true;
86 	rInfo.bRotateFreeAllowed = false;
87 	rInfo.bRotate90Allowed = false;
88 	rInfo.bMirrorFreeAllowed = false;
89 	rInfo.bMirror45Allowed = false;
90 	rInfo.bMirror90Allowed = false;
91 	rInfo.bTransparenceAllowed = false;
92 	rInfo.bGradientAllowed = false;
93 	rInfo.bShearAllowed = false;
94 	rInfo.bEdgeRadiusAllowed = false;
95 	rInfo.bNoOrthoDesired = false;
96 	rInfo.bNoContortion = false;
97 	rInfo.bCanConvToPath = false;
98 	rInfo.bCanConvToPoly = false;
99 	rInfo.bCanConvToContour = false;
100 	rInfo.bCanConvToPathLineToArea = false;
101 	rInfo.bCanConvToPolyLineToArea = false;
102 }
103 
104 // ------------------------------------------------------------------------------
105 
106 sal_uInt16 SdrMediaObj::GetObjIdentifier() const
107 {
108 	return sal_uInt16( OBJ_MEDIA );
109 }
110 
111 // ------------------------------------------------------------------------------
112 
113 void SdrMediaObj::TakeObjNameSingul(XubString& rName) const
114 {
115 	rName=ImpGetResStr(STR_ObjNameSingulMEDIA);
116 
117 	String aName( GetName() );
118 
119 	if(aName.Len())
120 	{
121 		rName += sal_Unicode(' ');
122 		rName += sal_Unicode('\'');
123 		rName += aName;
124 		rName += sal_Unicode('\'');
125 	}
126 }
127 
128 // ------------------------------------------------------------------------------
129 
130 void SdrMediaObj::TakeObjNamePlural(XubString& rName) const
131 {
132 	rName=ImpGetResStr(STR_ObjNamePluralMEDIA);
133 }
134 
135 // ------------------------------------------------------------------------------
136 
137 void SdrMediaObj::operator=(const SdrObject& rObj)
138 {
139 	SdrRectObj::operator=( rObj );
140 
141 	if( rObj.ISA( SdrMediaObj ) )
142     {
143         const SdrMediaObj& rMediaObj = static_cast< const SdrMediaObj& >( rObj );
144 
145         setMediaProperties( rMediaObj.getMediaProperties() );
146         setGraphic( rMediaObj.mapGraphic.get() );
147     }
148 }
149 
150 // ------------------------------------------------------------------------------
151 
152 void SdrMediaObj::AdjustToMaxRect( const Rectangle& rMaxRect, bool bShrinkOnly /* = false */ )
153 {
154 	Size aSize( Application::GetDefaultDevice()->PixelToLogic( getPreferredSize(), MAP_100TH_MM ) );
155 	Size aMaxSize( rMaxRect.GetSize() );
156 
157 	if( aSize.Height() != 0 && aSize.Width() != 0 )
158 	{
159 		Point aPos( rMaxRect.TopLeft() );
160 
161 		// Falls Grafik zu gross, wird die Grafik
162 		// in die Seite eingepasst
163 		if ( (!bShrinkOnly                          ||
164 	    	 ( aSize.Height() > aMaxSize.Height() ) ||
165 		 	( aSize.Width()  > aMaxSize.Width()  ) )&&
166 		 	aSize.Height() && aMaxSize.Height() )
167 		{
168 			float fGrfWH =	(float)aSize.Width() /
169 							(float)aSize.Height();
170 			float fWinWH =	(float)aMaxSize.Width() /
171 							(float)aMaxSize.Height();
172 
173 			// Grafik an Pagesize anpassen (skaliert)
174 			if ( fGrfWH < fWinWH )
175 			{
176 				aSize.Width() = (long)(aMaxSize.Height() * fGrfWH);
177 				aSize.Height()= aMaxSize.Height();
178 			}
179 			else if ( fGrfWH > 0.F )
180 			{
181 				aSize.Width() = aMaxSize.Width();
182 				aSize.Height()= (long)(aMaxSize.Width() / fGrfWH);
183 			}
184 
185 			aPos = rMaxRect.Center();
186 		}
187 
188 		if( bShrinkOnly )
189 			aPos = aRect.TopLeft();
190 
191 		aPos.X() -= aSize.Width() / 2;
192 		aPos.Y() -= aSize.Height() / 2;
193 		SetLogicRect( Rectangle( aPos, aSize ) );
194 	}
195 }
196 
197 // ------------------------------------------------------------------------------
198 
199 void SdrMediaObj::setURL( const ::rtl::OUString& rURL )
200 {
201 	::avmedia::MediaItem aURLItem;
202 
203 	aURLItem.setURL( rURL );
204 	setMediaProperties( aURLItem );
205 }
206 
207 // ------------------------------------------------------------------------------
208 
209 const ::rtl::OUString& SdrMediaObj::getURL() const
210 {
211 	return getMediaProperties().getURL();
212 }
213 
214 // ------------------------------------------------------------------------------
215 
216 void SdrMediaObj::setMediaProperties( const ::avmedia::MediaItem& rState )
217 {
218 	mediaPropertiesChanged( rState );
219 	static_cast< ::sdr::contact::ViewContactOfSdrMediaObj& >( GetViewContact() ).executeMediaItem( getMediaProperties() );
220 }
221 
222 // ------------------------------------------------------------------------------
223 
224 const ::avmedia::MediaItem& SdrMediaObj::getMediaProperties() const
225 {
226 	return maMediaProperties;
227 }
228 
229 // ------------------------------------------------------------------------------
230 
231 bool SdrMediaObj::hasPreferredSize() const
232 {
233 	return static_cast< ::sdr::contact::ViewContactOfSdrMediaObj& >( GetViewContact() ).hasPreferredSize();
234 }
235 
236 // ------------------------------------------------------------------------------
237 
238 Size SdrMediaObj::getPreferredSize() const
239 {
240 	return static_cast< ::sdr::contact::ViewContactOfSdrMediaObj& >( GetViewContact() ).getPreferredSize();
241 }
242 
243 // ------------------------------------------------------------------------------
244 
245 const Graphic& SdrMediaObj::getGraphic() const
246 {
247     if( !mapGraphic.get() )
248         const_cast< SdrMediaObj* >( this )->mapGraphic.reset( new Graphic( ::avmedia::MediaWindow::grabFrame( getURL(), true ) ) );
249 
250     return *mapGraphic;
251 }
252 
253 // ------------------------------------------------------------------------------
254 
255 void SdrMediaObj::setGraphic( const Graphic* pGraphic )
256 {
257     mapGraphic.reset( pGraphic ? new Graphic( *pGraphic ) : NULL );
258 }
259 
260 // ------------------------------------------------------------------------------
261 
262 void SdrMediaObj::mediaPropertiesChanged( const ::avmedia::MediaItem& rNewProperties )
263 {
264 	const sal_uInt32 nMaskSet = rNewProperties.getMaskSet();
265 
266 	// use only a subset of MediaItem properties for own own properties
267 	if( ( AVMEDIA_SETMASK_URL & nMaskSet ) &&
268         ( rNewProperties.getURL() != getURL() ) )
269     {
270         setGraphic();
271     	maMediaProperties.setURL( rNewProperties.getURL() );
272     }
273 
274 	if( AVMEDIA_SETMASK_LOOP & nMaskSet )
275 		maMediaProperties.setLoop( rNewProperties.isLoop() );
276 
277 	if( AVMEDIA_SETMASK_MUTE & nMaskSet )
278 		maMediaProperties.setMute( rNewProperties.isMute() );
279 
280 	if( AVMEDIA_SETMASK_VOLUMEDB & nMaskSet )
281 		maMediaProperties.setVolumeDB( rNewProperties.getVolumeDB() );
282 
283 	if( AVMEDIA_SETMASK_ZOOM & nMaskSet )
284 		maMediaProperties.setZoom( rNewProperties.getZoom() );
285 }
286