blob: f155e6ac262082c6c6643234a11dd3e3bad0022b [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.
*
*************************************************************/
#ifndef _DROPTARGET_HXX_
#define _DROPTARGET_HXX_
#include <com/sun/star/lang/XInitialization.hpp>
#include <com/sun/star/datatransfer/dnd/XDropTarget.hpp>
#include <com/sun/star/datatransfer/dnd/XDropTargetDragContext.hpp>
#include <com/sun/star/datatransfer/dnd/XDropTargetDropContext.hpp>
#include <com/sun/star/datatransfer/dnd/DropTargetDragEnterEvent.hpp>
#include <com/sun/star/lang/XServiceInfo.hpp>
#include <cppuhelper/basemutex.hxx>
#include <cppuhelper/compbase5.hxx>
#include <cppuhelper/interfacecontainer.hxx>
#include <osl/mutex.hxx>
#include "globals.hxx"
using namespace cppu;
using namespace osl;
using namespace rtl;
using namespace com::sun::star::datatransfer;
using namespace com::sun::star::datatransfer::dnd;
using namespace com::sun::star::lang;
using namespace com::sun::star::uno;
// The client
// has to call XComponent::dispose. The thread that calls initialize
// must also execute the destruction of the instance. This is because
// initialize calls OleInitialize and the destructor calls OleUninitialize.
// If the service calls OleInitialize then it also calls OleUnitialize when
// it is destroyed. Therefore no second instance may exist which was
// created in the same thread and still needs OLE.
class DropTarget: public cppu::BaseMutex,
public WeakComponentImplHelper5< XInitialization,
XDropTarget,
XDropTargetDragContext,
XDropTargetDropContext,
XServiceInfo>
{
private:
Reference<XMultiServiceFactory> m_serviceFactory;
// The native window which acts as drop target.
HWND m_hWnd;
POINTL ptlMouse;
// OS/2 does not provide a DM_DRAGENTER message, provide emulation
bool dragEnterEmulation;
// If mbActive == sal_True then events are fired to XDropTargetListener s,
// none otherwise. The default value is sal_True.
bool mbActive;
sal_Int8 mDragSourceSupportedActions;
sal_Int8 mSelectedDropAction;
sal_Int8 mDefaultActions;
Reference<XTransferable> mXTransferable;
public:
DropTarget( const Reference<XMultiServiceFactory>& sf);
virtual ~DropTarget();
// Overrides WeakComponentImplHelper::disposing which is called by
// WeakComponentImplHelper::dispose
// Must be called.
virtual void SAL_CALL disposing();
// XInitialization
virtual void SAL_CALL initialize( const Sequence< Any >& aArguments)
throw(Exception);
// XDropTarget
virtual void SAL_CALL addDropTargetListener( const Reference< XDropTargetListener >& dtl )
throw(RuntimeException);
virtual void SAL_CALL removeDropTargetListener( const Reference< XDropTargetListener >& dtl )
throw(RuntimeException);
// Default is not active
virtual sal_Bool SAL_CALL isActive() throw(RuntimeException);
virtual void SAL_CALL setActive(sal_Bool) throw(RuntimeException);
virtual sal_Int8 SAL_CALL getDefaultActions() throw(RuntimeException);
virtual void SAL_CALL setDefaultActions(sal_Int8) throw(RuntimeException);
// XDropTargetDragContext
virtual void SAL_CALL acceptDrag( sal_Int8) throw(RuntimeException);
virtual void SAL_CALL rejectDrag() throw(RuntimeException);
// XDropTargetDropContext
virtual void SAL_CALL acceptDrop(sal_Int8) throw (RuntimeException);
virtual void SAL_CALL rejectDrop() throw (RuntimeException);
virtual void SAL_CALL dropComplete(sal_Bool) throw (RuntimeException);
// XServiceInfo
virtual rtl::OUString SAL_CALL getImplementationName() throw (RuntimeException);
virtual sal_Bool SAL_CALL supportsService(const rtl::OUString& ServiceName) throw (RuntimeException);
virtual Sequence< rtl::OUString > SAL_CALL getSupportedServiceNames() throw (RuntimeException);
// OS/2 window messaging handlers
MRESULT dragEnter( PDRAGINFO dragInfo);
MRESULT dragOver( PDRAGINFO dragInfo);
MRESULT dragLeave( PDRAGINFO dragInfo);
MRESULT drop( PDRAGINFO dragInfo);
MRESULT renderComplete( PDRAGTRANSFER);
public:
// default window frame procedure
PFNWP defWndProc;
private:
void fire_drop(const DropTargetDropEvent& dte);
void fire_dragEnter(const DropTargetDragEnterEvent& dtdee);
void fire_dragExit(const DropTargetEvent& dte);
void fire_dragOver(const DropTargetDragEvent& dtde);
void fire_dropActionChanged(const DropTargetDragEvent& dtde);
};
#endif // _DROPTARGET_HXX_