1*cc13e73eSYuri Dario /************************************************************** 2*cc13e73eSYuri Dario * 3*cc13e73eSYuri Dario * Licensed to the Apache Software Foundation (ASF) under one 4*cc13e73eSYuri Dario * or more contributor license agreements. See the NOTICE file 5*cc13e73eSYuri Dario * distributed with this work for additional information 6*cc13e73eSYuri Dario * regarding copyright ownership. The ASF licenses this file 7*cc13e73eSYuri Dario * to you under the Apache License, Version 2.0 (the 8*cc13e73eSYuri Dario * "License"); you may not use this file except in compliance 9*cc13e73eSYuri Dario * with the License. You may obtain a copy of the License at 10*cc13e73eSYuri Dario * 11*cc13e73eSYuri Dario * http://www.apache.org/licenses/LICENSE-2.0 12*cc13e73eSYuri Dario * 13*cc13e73eSYuri Dario * Unless required by applicable law or agreed to in writing, 14*cc13e73eSYuri Dario * software distributed under the License is distributed on an 15*cc13e73eSYuri Dario * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 16*cc13e73eSYuri Dario * KIND, either express or implied. See the License for the 17*cc13e73eSYuri Dario * specific language governing permissions and limitations 18*cc13e73eSYuri Dario * under the License. 19*cc13e73eSYuri Dario * 20*cc13e73eSYuri Dario *************************************************************/ 21*cc13e73eSYuri Dario 22*cc13e73eSYuri Dario 23*cc13e73eSYuri Dario #ifndef _DROPTARGET_HXX_ 24*cc13e73eSYuri Dario #define _DROPTARGET_HXX_ 25*cc13e73eSYuri Dario 26*cc13e73eSYuri Dario #include <com/sun/star/lang/XInitialization.hpp> 27*cc13e73eSYuri Dario #include <com/sun/star/datatransfer/dnd/XDropTarget.hpp> 28*cc13e73eSYuri Dario #include <com/sun/star/datatransfer/dnd/XDropTargetDragContext.hpp> 29*cc13e73eSYuri Dario #include <com/sun/star/datatransfer/dnd/XDropTargetDropContext.hpp> 30*cc13e73eSYuri Dario #include <com/sun/star/datatransfer/dnd/DropTargetDragEnterEvent.hpp> 31*cc13e73eSYuri Dario #include <com/sun/star/lang/XServiceInfo.hpp> 32*cc13e73eSYuri Dario 33*cc13e73eSYuri Dario #include <cppuhelper/basemutex.hxx> 34*cc13e73eSYuri Dario #include <cppuhelper/compbase5.hxx> 35*cc13e73eSYuri Dario #include <cppuhelper/interfacecontainer.hxx> 36*cc13e73eSYuri Dario #include <osl/mutex.hxx> 37*cc13e73eSYuri Dario 38*cc13e73eSYuri Dario #include "globals.hxx" 39*cc13e73eSYuri Dario 40*cc13e73eSYuri Dario 41*cc13e73eSYuri Dario using namespace cppu; 42*cc13e73eSYuri Dario using namespace osl; 43*cc13e73eSYuri Dario using namespace rtl; 44*cc13e73eSYuri Dario using namespace com::sun::star::datatransfer; 45*cc13e73eSYuri Dario using namespace com::sun::star::datatransfer::dnd; 46*cc13e73eSYuri Dario using namespace com::sun::star::lang; 47*cc13e73eSYuri Dario using namespace com::sun::star::uno; 48*cc13e73eSYuri Dario 49*cc13e73eSYuri Dario 50*cc13e73eSYuri Dario // The client 51*cc13e73eSYuri Dario // has to call XComponent::dispose. The thread that calls initialize 52*cc13e73eSYuri Dario // must also execute the destruction of the instance. This is because 53*cc13e73eSYuri Dario // initialize calls OleInitialize and the destructor calls OleUninitialize. 54*cc13e73eSYuri Dario // If the service calls OleInitialize then it also calls OleUnitialize when 55*cc13e73eSYuri Dario // it is destroyed. Therefore no second instance may exist which was 56*cc13e73eSYuri Dario // created in the same thread and still needs OLE. 57*cc13e73eSYuri Dario class DropTarget: public cppu::BaseMutex, 58*cc13e73eSYuri Dario public WeakComponentImplHelper5< XInitialization, 59*cc13e73eSYuri Dario XDropTarget, 60*cc13e73eSYuri Dario XDropTargetDragContext, 61*cc13e73eSYuri Dario XDropTargetDropContext, 62*cc13e73eSYuri Dario XServiceInfo> 63*cc13e73eSYuri Dario { 64*cc13e73eSYuri Dario private: 65*cc13e73eSYuri Dario Reference<XMultiServiceFactory> m_serviceFactory; 66*cc13e73eSYuri Dario // The native window which acts as drop target. 67*cc13e73eSYuri Dario HWND m_hWnd; 68*cc13e73eSYuri Dario POINTL ptlMouse; 69*cc13e73eSYuri Dario // OS/2 does not provide a DM_DRAGENTER message, provide emulation 70*cc13e73eSYuri Dario bool dragEnterEmulation; 71*cc13e73eSYuri Dario // If mbActive == sal_True then events are fired to XDropTargetListener s, 72*cc13e73eSYuri Dario // none otherwise. The default value is sal_True. 73*cc13e73eSYuri Dario bool mbActive; 74*cc13e73eSYuri Dario sal_Int8 mDragSourceSupportedActions; 75*cc13e73eSYuri Dario sal_Int8 mSelectedDropAction; 76*cc13e73eSYuri Dario sal_Int8 mDefaultActions; 77*cc13e73eSYuri Dario Reference<XTransferable> mXTransferable; 78*cc13e73eSYuri Dario 79*cc13e73eSYuri Dario public: 80*cc13e73eSYuri Dario DropTarget( const Reference<XMultiServiceFactory>& sf); 81*cc13e73eSYuri Dario virtual ~DropTarget(); 82*cc13e73eSYuri Dario 83*cc13e73eSYuri Dario // Overrides WeakComponentImplHelper::disposing which is called by 84*cc13e73eSYuri Dario // WeakComponentImplHelper::dispose 85*cc13e73eSYuri Dario // Must be called. 86*cc13e73eSYuri Dario virtual void SAL_CALL disposing(); 87*cc13e73eSYuri Dario 88*cc13e73eSYuri Dario // XInitialization 89*cc13e73eSYuri Dario virtual void SAL_CALL initialize( const Sequence< Any >& aArguments) 90*cc13e73eSYuri Dario throw(Exception); 91*cc13e73eSYuri Dario 92*cc13e73eSYuri Dario // XDropTarget 93*cc13e73eSYuri Dario virtual void SAL_CALL addDropTargetListener( const Reference< XDropTargetListener >& dtl ) 94*cc13e73eSYuri Dario throw(RuntimeException); 95*cc13e73eSYuri Dario virtual void SAL_CALL removeDropTargetListener( const Reference< XDropTargetListener >& dtl ) 96*cc13e73eSYuri Dario throw(RuntimeException); 97*cc13e73eSYuri Dario 98*cc13e73eSYuri Dario // Default is not active 99*cc13e73eSYuri Dario virtual sal_Bool SAL_CALL isActive() throw(RuntimeException); 100*cc13e73eSYuri Dario virtual void SAL_CALL setActive(sal_Bool) throw(RuntimeException); 101*cc13e73eSYuri Dario virtual sal_Int8 SAL_CALL getDefaultActions() throw(RuntimeException); 102*cc13e73eSYuri Dario virtual void SAL_CALL setDefaultActions(sal_Int8) throw(RuntimeException); 103*cc13e73eSYuri Dario 104*cc13e73eSYuri Dario // XDropTargetDragContext 105*cc13e73eSYuri Dario virtual void SAL_CALL acceptDrag( sal_Int8) throw(RuntimeException); 106*cc13e73eSYuri Dario virtual void SAL_CALL rejectDrag() throw(RuntimeException); 107*cc13e73eSYuri Dario 108*cc13e73eSYuri Dario // XDropTargetDropContext 109*cc13e73eSYuri Dario virtual void SAL_CALL acceptDrop(sal_Int8) throw (RuntimeException); 110*cc13e73eSYuri Dario virtual void SAL_CALL rejectDrop() throw (RuntimeException); 111*cc13e73eSYuri Dario virtual void SAL_CALL dropComplete(sal_Bool) throw (RuntimeException); 112*cc13e73eSYuri Dario 113*cc13e73eSYuri Dario // XServiceInfo 114*cc13e73eSYuri Dario virtual rtl::OUString SAL_CALL getImplementationName() throw (RuntimeException); 115*cc13e73eSYuri Dario virtual sal_Bool SAL_CALL supportsService(const rtl::OUString& ServiceName) throw (RuntimeException); 116*cc13e73eSYuri Dario virtual Sequence< rtl::OUString > SAL_CALL getSupportedServiceNames() throw (RuntimeException); 117*cc13e73eSYuri Dario 118*cc13e73eSYuri Dario // OS/2 window messaging handlers 119*cc13e73eSYuri Dario MRESULT dragEnter( PDRAGINFO dragInfo); 120*cc13e73eSYuri Dario MRESULT dragOver( PDRAGINFO dragInfo); 121*cc13e73eSYuri Dario MRESULT dragLeave( PDRAGINFO dragInfo); 122*cc13e73eSYuri Dario MRESULT drop( PDRAGINFO dragInfo); 123*cc13e73eSYuri Dario MRESULT renderComplete( PDRAGTRANSFER); 124*cc13e73eSYuri Dario 125*cc13e73eSYuri Dario public: 126*cc13e73eSYuri Dario // default window frame procedure 127*cc13e73eSYuri Dario PFNWP defWndProc; 128*cc13e73eSYuri Dario 129*cc13e73eSYuri Dario private: 130*cc13e73eSYuri Dario void fire_drop(const DropTargetDropEvent& dte); 131*cc13e73eSYuri Dario void fire_dragEnter(const DropTargetDragEnterEvent& dtdee); 132*cc13e73eSYuri Dario void fire_dragExit(const DropTargetEvent& dte); 133*cc13e73eSYuri Dario void fire_dragOver(const DropTargetDragEvent& dtde); 134*cc13e73eSYuri Dario void fire_dropActionChanged(const DropTargetDragEvent& dtde); 135*cc13e73eSYuri Dario 136*cc13e73eSYuri Dario }; 137*cc13e73eSYuri Dario #endif // _DROPTARGET_HXX_ 138