xref: /trunk/main/vcl/source/components/dtranscomp.cxx (revision 91144cd0085a7583d2099b982122deb2184ab956)
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_vcl.hxx"
26 
27 #include "vos/mutex.hxx"
28 
29 #include "osl/mutex.hxx"
30 
31 #include "vcl/svapp.hxx"
32 
33 #include "svdata.hxx"
34 #include "salinst.hxx"
35 
36 #include "com/sun/star/lang/XServiceInfo.hpp"
37 #include "com/sun/star/lang/XSingleServiceFactory.hpp"
38 #include "com/sun/star/lang/XInitialization.hpp"
39 #include "com/sun/star/lang/DisposedException.hpp"
40 #include "com/sun/star/datatransfer/XTransferable.hpp"
41 #include "com/sun/star/datatransfer/clipboard/XClipboard.hpp"
42 #include "com/sun/star/datatransfer/clipboard/XClipboardEx.hpp"
43 #include "com/sun/star/datatransfer/clipboard/XClipboardNotifier.hpp"
44 #include "com/sun/star/datatransfer/clipboard/XClipboardListener.hpp"
45 #include "com/sun/star/datatransfer/dnd/XDragSource.hpp"
46 #include "com/sun/star/datatransfer/dnd/XDropTarget.hpp"
47 #include "com/sun/star/datatransfer/dnd/DNDConstants.hpp"
48 
49 #include "cppuhelper/compbase1.hxx"
50 #include "cppuhelper/compbase2.hxx"
51 #include "cppuhelper/compbase3.hxx"
52 #include "cppuhelper/implbase1.hxx"
53 
54 using rtl::OUString;
55 using namespace com::sun::star;
56 using namespace com::sun::star::uno;
57 using namespace com::sun::star::lang;
58 
59 // -----------------------------------------------------------------------
60 
61 namespace vcl
62 {
63 // generic implementation to satisfy SalInstance
64 class GenericClipboard :
65         public cppu::WeakComponentImplHelper3 <
66         datatransfer::clipboard::XClipboardEx,
67         datatransfer::clipboard::XClipboardNotifier,
68         XServiceInfo
69         >
70 {
71     osl::Mutex                                                              m_aMutex;
72     Reference< ::com::sun::star::datatransfer::XTransferable >              m_aContents;
73     Reference< ::com::sun::star::datatransfer::clipboard::XClipboardOwner > m_aOwner;
74     std::list< Reference< ::com::sun::star::datatransfer::clipboard::XClipboardListener > > m_aListeners;
75 
76     void fireChangedContentsEvent();
77     void clearContents();
78 
79 public:
80 
GenericClipboard()81     GenericClipboard() : cppu::WeakComponentImplHelper3<
82         datatransfer::clipboard::XClipboardEx,
83         datatransfer::clipboard::XClipboardNotifier,
84         XServiceInfo
85         >( m_aMutex )
86     {}
87     virtual ~GenericClipboard();
88 
89     /*
90      * XServiceInfo
91      */
92 
93     virtual rtl::OUString SAL_CALL getImplementationName();
94     virtual sal_Bool SAL_CALL supportsService( const ::rtl::OUString& ServiceName );
95     virtual Sequence< ::rtl::OUString > SAL_CALL getSupportedServiceNames();
96 
97     static rtl::OUString getImplementationName_static();
98     static Sequence< rtl::OUString > getSupportedServiceNames_static();
99 
100     /*
101      * XClipboard
102      */
103 
104     virtual Reference< ::com::sun::star::datatransfer::XTransferable > SAL_CALL getContents();
105 
106     virtual void SAL_CALL setContents(
107         const Reference< ::com::sun::star::datatransfer::XTransferable >& xTrans,
108         const Reference< ::com::sun::star::datatransfer::clipboard::XClipboardOwner >& xClipboardOwner );
109 
110     virtual ::rtl::OUString SAL_CALL getName();
111 
112     /*
113      * XClipboardEx
114      */
115 
116     virtual sal_Int8 SAL_CALL getRenderingCapabilities();
117 
118     /*
119      * XClipboardNotifier
120      */
121     virtual void SAL_CALL addClipboardListener(
122         const Reference< ::com::sun::star::datatransfer::clipboard::XClipboardListener >& listener );
123 
124     virtual void SAL_CALL removeClipboardListener(
125         const Reference< ::com::sun::star::datatransfer::clipboard::XClipboardListener >& listener );
126 };
127 
~GenericClipboard()128 GenericClipboard::~GenericClipboard()
129 {
130 }
131 
getImplementationName_static()132 rtl::OUString GenericClipboard::getImplementationName_static()
133 {
134     return rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.datatransfer.VCLGenericClipboard" ) );
135 }
136 
getSupportedServiceNames_static()137 Sequence< rtl::OUString > GenericClipboard::getSupportedServiceNames_static()
138 {
139     Sequence< OUString > aRet(1);
140     aRet[0] = OUString::createFromAscii("com.sun.star.datatransfer.clipboard.SystemClipboard");
141     return aRet;
142 }
143 
getImplementationName()144 rtl::OUString GenericClipboard::getImplementationName()
145 {
146     return getImplementationName_static();
147 }
148 
getSupportedServiceNames()149 Sequence< rtl::OUString > GenericClipboard::getSupportedServiceNames()
150 {
151     return getSupportedServiceNames_static();
152 }
153 
supportsService(const::rtl::OUString & ServiceName)154 sal_Bool GenericClipboard::supportsService( const ::rtl::OUString& ServiceName )
155 {
156     Sequence< OUString > aServices( getSupportedServiceNames() );
157     sal_Int32 nServices = aServices.getLength();
158     for( sal_Int32 i = 0; i < nServices; i++ )
159     {
160         if( aServices[i] == ServiceName )
161             return sal_True;
162     }
163     return sal_False;
164 }
165 
getContents()166 Reference< ::com::sun::star::datatransfer::XTransferable > GenericClipboard::getContents()
167 {
168     return m_aContents;
169 }
170 
setContents(const Reference<::com::sun::star::datatransfer::XTransferable> & xTrans,const Reference<::com::sun::star::datatransfer::clipboard::XClipboardOwner> & xClipboardOwner)171 void GenericClipboard::setContents(
172         const Reference< ::com::sun::star::datatransfer::XTransferable >& xTrans,
173         const Reference< ::com::sun::star::datatransfer::clipboard::XClipboardOwner >& xClipboardOwner )
174 {
175     osl::ClearableMutexGuard aGuard( m_aMutex );
176     Reference< datatransfer::clipboard::XClipboardOwner > xOldOwner( m_aOwner );
177     Reference< datatransfer::XTransferable > xOldContents( m_aContents );
178     m_aContents = xTrans;
179     m_aOwner = xClipboardOwner;
180 
181     std::list< Reference< datatransfer::clipboard::XClipboardListener > > xListeners( m_aListeners );
182     datatransfer::clipboard::ClipboardEvent aEv;
183     aEv.Contents = m_aContents;
184 
185     aGuard.clear();
186 
187     if( xOldOwner.is() && xOldOwner != xClipboardOwner )
188         xOldOwner->lostOwnership( this, xOldContents );
189     for( std::list< Reference< datatransfer::clipboard::XClipboardListener > >::iterator it =
190          xListeners.begin(); it != xListeners.end() ; ++it )
191     {
192         (*it)->changedContents( aEv );
193     }
194 }
195 
getName()196 rtl::OUString GenericClipboard::getName()
197 {
198     return rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "CLIPBOARD" ) );
199 }
200 
getRenderingCapabilities()201 sal_Int8 GenericClipboard::getRenderingCapabilities()
202 {
203     return 0;
204 }
205 
addClipboardListener(const Reference<datatransfer::clipboard::XClipboardListener> & listener)206 void GenericClipboard::addClipboardListener( const Reference< datatransfer::clipboard::XClipboardListener >& listener )
207 {
208     osl::ClearableMutexGuard aGuard( m_aMutex );
209 
210     m_aListeners.push_back( listener );
211 }
212 
removeClipboardListener(const Reference<datatransfer::clipboard::XClipboardListener> & listener)213 void GenericClipboard::removeClipboardListener( const Reference< datatransfer::clipboard::XClipboardListener >& listener )
214 {
215     osl::ClearableMutexGuard aGuard( m_aMutex );
216 
217     m_aListeners.remove( listener );
218 }
219 
220 // ------------------------------------------------------------------------
221 
222 class ClipboardFactory : public ::cppu::WeakComponentImplHelper1<
223     com::sun::star::lang::XSingleServiceFactory
224 >
225 {
226     osl::Mutex m_aMutex;
227 public:
228     ClipboardFactory();
229     virtual ~ClipboardFactory();
230 
231     /*
232      *  XSingleServiceFactory
233      */
234     virtual Reference< XInterface > SAL_CALL createInstance() throw();
235     virtual Reference< XInterface > SAL_CALL createInstanceWithArguments( const Sequence< Any >& rArgs ) throw();
236 };
237 
238 // ------------------------------------------------------------------------
239 
ClipboardFactory()240 ClipboardFactory::ClipboardFactory() :
241         cppu::WeakComponentImplHelper1<
242     com::sun::star::lang::XSingleServiceFactory
243 >( m_aMutex )
244 {
245 }
246 
247 // ------------------------------------------------------------------------
248 
~ClipboardFactory()249 ClipboardFactory::~ClipboardFactory()
250 {
251 }
252 
253 // ------------------------------------------------------------------------
254 
createInstance()255 Reference< XInterface > ClipboardFactory::createInstance() throw()
256 {
257     return createInstanceWithArguments( Sequence< Any >() );
258 }
259 
260 // ------------------------------------------------------------------------
261 
createInstanceWithArguments(const Sequence<Any> & arguments)262 Reference< XInterface > ClipboardFactory::createInstanceWithArguments( const Sequence< Any >& arguments ) throw()
263 {
264     vos::OGuard aGuard( Application::GetSolarMutex() );
265     Reference< XInterface > xResult = ImplGetSVData()->mpDefInst->CreateClipboard( arguments );
266     return xResult;
267 }
268 
269 // ------------------------------------------------------------------------
270 
Clipboard_getSupportedServiceNames()271 Sequence< OUString > SAL_CALL Clipboard_getSupportedServiceNames()
272 {
273     Sequence< OUString > aRet(1);
274     aRet[0] = OUString::createFromAscii("com.sun.star.datatransfer.clipboard.SystemClipboard");
275     return aRet;
276 }
277 
Clipboard_getImplementationName()278 OUString SAL_CALL Clipboard_getImplementationName()
279 {
280     #if defined UNX
281     return OUString( RTL_CONSTASCII_USTRINGPARAM(
282     #if ! defined QUARTZ
283     "com.sun.star.datatransfer.X11ClipboardSupport"
284     #else
285     "com.sun.star.datatransfer.clipboard.AquaClipboard"
286     #endif
287     ) );
288     #else
289     return GenericClipboard::getImplementationName_static();
290     #endif
291 }
292 
Clipboard_createFactory(const Reference<XMultiServiceFactory> &)293 Reference< XSingleServiceFactory > SAL_CALL Clipboard_createFactory( const Reference< XMultiServiceFactory > &  )
294 {
295     return Reference< XSingleServiceFactory >( new ClipboardFactory() );
296 }
297 
298 /*
299 *   generic DragSource dummy
300 */
301 class GenericDragSource : public cppu::WeakComponentImplHelper2<
302             datatransfer::dnd::XDragSource,
303             XInitialization
304             >
305 {
306     osl::Mutex                          m_aMutex;
307 public:
GenericDragSource()308     GenericDragSource() : cppu::WeakComponentImplHelper2< datatransfer::dnd::XDragSource, XInitialization >( m_aMutex ) {}
309     virtual ~GenericDragSource();
310 
311     // XDragSource
312     virtual sal_Bool    SAL_CALL isDragImageSupported() throw();
313     virtual sal_Int32   SAL_CALL getDefaultCursor( sal_Int8 dragAction ) throw();
314     virtual void        SAL_CALL startDrag(
315                                      const datatransfer::dnd::DragGestureEvent& trigger,
316                                      sal_Int8 sourceActions, sal_Int32 cursor, sal_Int32 image,
317                                      const Reference< datatransfer::XTransferable >& transferable,
318                                      const Reference< datatransfer::dnd::XDragSourceListener >& listener
319                                      ) throw();
320 
321     // XInitialization
322     virtual void        SAL_CALL initialize( const Sequence< Any >& arguments );
323 
getSupportedServiceNames_static()324     static Sequence< OUString > getSupportedServiceNames_static()
325     {
326         Sequence< OUString > aRet( 1 );
327         aRet[0] = OUString::createFromAscii( "com.sun.star.datatransfer.dnd.GenericDragSource" );
328         return aRet;
329     }
330 
getImplementationName_static()331     static OUString getImplementationName_static()
332     {
333         return OUString::createFromAscii( "com.sun.star.datatransfer.dnd.VclGenericDragSource" );
334     }
335 };
336 
~GenericDragSource()337 GenericDragSource::~GenericDragSource()
338 {
339 }
340 
isDragImageSupported()341 sal_Bool GenericDragSource::isDragImageSupported() throw()
342 {
343     return sal_False;
344 }
345 
getDefaultCursor(sal_Int8)346 sal_Int32 GenericDragSource::getDefaultCursor( sal_Int8 ) throw()
347 {
348     return 0;
349 }
350 
startDrag(const datatransfer::dnd::DragGestureEvent &,sal_Int8,sal_Int32,sal_Int32,const Reference<datatransfer::XTransferable> &,const Reference<datatransfer::dnd::XDragSourceListener> & listener)351 void GenericDragSource::startDrag( const datatransfer::dnd::DragGestureEvent&,
352                                    sal_Int8 /*sourceActions*/, sal_Int32 /*cursor*/, sal_Int32 /*image*/,
353                                    const Reference< datatransfer::XTransferable >&,
354                                    const Reference< datatransfer::dnd::XDragSourceListener >& listener
355                                    ) throw()
356 {
357     datatransfer::dnd::DragSourceDropEvent aEv;
358     aEv.DropAction = datatransfer::dnd::DNDConstants::ACTION_COPY;
359     aEv.DropSuccess = sal_False;
360     listener->dragDropEnd( aEv );
361 }
362 
initialize(const Sequence<Any> &)363 void GenericDragSource::initialize( const Sequence< Any >& )
364 {
365 }
366 
367 
DragSource_getSupportedServiceNames()368 Sequence< OUString > SAL_CALL DragSource_getSupportedServiceNames()
369 {
370     #if defined UNX
371     static OUString aServiceName( RTL_CONSTASCII_USTRINGPARAM(
372     #if ! defined QUARTZ
373     "com.sun.star.datatransfer.dnd.X11DragSource"
374     #else
375     "com.sun.star.datatransfer.dnd.OleDragSource"
376     #endif
377                                                               ) );
378     static Sequence< OUString > aServiceNames( &aServiceName, 1 );
379     return aServiceNames;
380     #else
381     return GenericDragSource::getSupportedServiceNames_static();
382     #endif
383 }
384 
DragSource_getImplementationName()385 OUString SAL_CALL DragSource_getImplementationName()
386 {
387     #if defined UNX
388     return OUString( RTL_CONSTASCII_USTRINGPARAM(
389     #if ! defined QUARTZ
390     "com.sun.star.datatransfer.dnd.XdndSupport"
391     #else
392     "com.sun.star.comp.datatransfer.dnd.OleDragSource_V1"
393     #endif
394                                                  ) );
395     #else
396     return GenericDragSource::getImplementationName_static();
397     #endif
398 }
399 
DragSource_createInstance(const Reference<XMultiServiceFactory> &)400 Reference< XInterface > SAL_CALL DragSource_createInstance( const Reference< XMultiServiceFactory >&  )
401 {
402     vos::OGuard aGuard( Application::GetSolarMutex() );
403     Reference< XInterface > xResult = ImplGetSVData()->mpDefInst->CreateDragSource();
404     return xResult;
405 }
406 
407 /*
408 *   generic DragSource dummy
409 */
410 
411 class GenericDropTarget : public cppu::WeakComponentImplHelper2<
412                                            datatransfer::dnd::XDropTarget,
413                                            XInitialization
414                                            >
415 {
416     osl::Mutex m_aMutex;
417 public:
GenericDropTarget()418     GenericDropTarget() : cppu::WeakComponentImplHelper2<
419                                            datatransfer::dnd::XDropTarget,
420                                            XInitialization
421                                            > ( m_aMutex )
422     {}
423     virtual ~GenericDropTarget();
424 
425     // XInitialization
426     virtual void        SAL_CALL initialize( const Sequence< Any >& args );
427 
428     // XDropTarget
429     virtual void        SAL_CALL addDropTargetListener( const Reference< ::com::sun::star::datatransfer::dnd::XDropTargetListener >& ) throw();
430     virtual void        SAL_CALL removeDropTargetListener( const Reference< ::com::sun::star::datatransfer::dnd::XDropTargetListener >& ) throw();
431     virtual sal_Bool    SAL_CALL isActive() throw();
432     virtual void        SAL_CALL setActive( sal_Bool active ) throw();
433     virtual sal_Int8    SAL_CALL getDefaultActions() throw();
434     virtual void        SAL_CALL setDefaultActions( sal_Int8 actions ) throw();
435 
getSupportedServiceNames_static()436     static Sequence< OUString > getSupportedServiceNames_static()
437     {
438         Sequence< OUString > aRet( 1 );
439         aRet[0] = OUString::createFromAscii( "com.sun.star.datatransfer.dnd.GenericDropTarget" );
440         return aRet;
441     }
442 
getImplementationName_static()443     static OUString getImplementationName_static()
444     {
445         return OUString::createFromAscii( "com.sun.star.datatransfer.dnd.VclGenericDropTarget" );
446     }
447 };
448 
~GenericDropTarget()449 GenericDropTarget::~GenericDropTarget()
450 {
451 }
452 
initialize(const Sequence<Any> &)453 void GenericDropTarget::initialize( const Sequence< Any >& )
454 {
455 }
456 
addDropTargetListener(const Reference<::com::sun::star::datatransfer::dnd::XDropTargetListener> &)457 void GenericDropTarget::addDropTargetListener( const Reference< ::com::sun::star::datatransfer::dnd::XDropTargetListener >& ) throw()
458 {
459 }
460 
removeDropTargetListener(const Reference<::com::sun::star::datatransfer::dnd::XDropTargetListener> &)461 void GenericDropTarget::removeDropTargetListener( const Reference< ::com::sun::star::datatransfer::dnd::XDropTargetListener >& ) throw()
462 {
463 }
464 
isActive()465 sal_Bool GenericDropTarget::isActive() throw()
466 {
467     return sal_False;
468 }
469 
setActive(sal_Bool)470 void GenericDropTarget::setActive( sal_Bool ) throw()
471 {
472 }
473 
getDefaultActions()474 sal_Int8 GenericDropTarget::getDefaultActions() throw()
475 {
476     return 0;
477 }
478 
setDefaultActions(sal_Int8)479 void GenericDropTarget::setDefaultActions( sal_Int8) throw()
480 {
481 }
482 
DropTarget_getSupportedServiceNames()483 Sequence< OUString > SAL_CALL DropTarget_getSupportedServiceNames()
484 {
485     #if defined UNX
486     static OUString aServiceName( RTL_CONSTASCII_USTRINGPARAM(
487     #if ! defined QUARTZ
488     "com.sun.star.datatransfer.dnd.X11DropTarget"
489     #else
490     "com.sun.star.datatransfer.dnd.OleDropTarget"
491     #endif
492                                                               ) );
493     static Sequence< OUString > aServiceNames( &aServiceName, 1 );
494     return aServiceNames;
495     #else
496     return GenericDropTarget::getSupportedServiceNames_static();
497     #endif
498 }
499 
DropTarget_getImplementationName()500 OUString SAL_CALL DropTarget_getImplementationName()
501 {
502     #if defined UNX
503     return OUString( RTL_CONSTASCII_USTRINGPARAM(
504     #if ! defined QUARTZ
505     "com.sun.star.datatransfer.dnd.XdndDropTarget"
506     #else
507     "com.sun.star.comp.datatransfer.dnd.OleDropTarget_V1"
508     #endif
509                     ) );
510     #else
511     return GenericDropTarget::getImplementationName_static();
512     #endif
513 }
514 
DropTarget_createInstance(const Reference<XMultiServiceFactory> &)515 Reference< XInterface > SAL_CALL DropTarget_createInstance( const Reference< XMultiServiceFactory >&  )
516 {
517     vos::OGuard aGuard( Application::GetSolarMutex() );
518     Reference< XInterface > xResult = ImplGetSVData()->mpDefInst->CreateDropTarget();
519     return xResult;
520 }
521 
522 
523 } // namespace vcl
524 
525 /*
526 *   SalInstance generic
527 */
CreateClipboard(const Sequence<Any> &)528 Reference< XInterface > SalInstance::CreateClipboard( const Sequence< Any >& )
529 {
530     return Reference< XInterface >( ( cppu::OWeakObject * )new vcl::GenericClipboard() );
531 }
532 
CreateDragSource()533 Reference< XInterface > SalInstance::CreateDragSource()
534 {
535     return Reference< XInterface >( ( cppu::OWeakObject * )new vcl::GenericDragSource() );
536 }
537 
CreateDropTarget()538 Reference< XInterface > SalInstance::CreateDropTarget()
539 {
540     return Reference< XInterface >( ( cppu::OWeakObject * )new vcl::GenericDropTarget() );
541 }
542