| /************************************************************** |
| * |
| * 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_vcl.hxx" |
| |
| #include <dndlcon.hxx> |
| |
| using namespace ::cppu; |
| using namespace ::com::sun::star::uno; |
| using namespace ::com::sun::star::datatransfer; |
| using namespace ::com::sun::star::datatransfer::dnd; |
| |
| //================================================================================================== |
| // |
| //================================================================================================== |
| |
| DNDListenerContainer::DNDListenerContainer( sal_Int8 nDefaultActions ) |
| : WeakComponentImplHelper4< XDragGestureRecognizer, XDropTargetDragContext, XDropTargetDropContext, XDropTarget >(GetMutex()) |
| { |
| m_bActive = sal_True; |
| m_nDefaultActions = nDefaultActions; |
| } |
| |
| //================================================================================================== |
| // |
| //================================================================================================== |
| |
| DNDListenerContainer::~DNDListenerContainer() |
| { |
| } |
| |
| //================================================================================================== |
| // DNDListenerContainer::addDragGestureListener |
| //================================================================================================== |
| |
| void SAL_CALL DNDListenerContainer::addDragGestureListener( const Reference< XDragGestureListener >& dgl ) |
| throw(RuntimeException) |
| { |
| rBHelper.addListener( getCppuType( ( const Reference< XDragGestureListener > * ) 0 ), dgl ); |
| } |
| |
| //================================================================================================== |
| // DNDListenerContainer::removeDragGestureListener |
| //================================================================================================== |
| |
| void SAL_CALL DNDListenerContainer::removeDragGestureListener( const Reference< XDragGestureListener >& dgl ) |
| throw(RuntimeException) |
| { |
| rBHelper.removeListener( getCppuType( ( const Reference< XDragGestureListener > * ) 0 ), dgl ); |
| } |
| |
| //================================================================================================== |
| // DNDListenerContainer::resetRecognizer |
| //================================================================================================== |
| |
| void SAL_CALL DNDListenerContainer::resetRecognizer( ) |
| throw(RuntimeException) |
| { |
| } |
| |
| //================================================================================================== |
| // DNDListenerContainer::addDropTargetListener |
| //================================================================================================== |
| |
| void SAL_CALL DNDListenerContainer::addDropTargetListener( const Reference< XDropTargetListener >& dtl ) |
| throw(RuntimeException) |
| { |
| rBHelper.addListener( getCppuType( ( const Reference< XDropTargetListener > * ) 0 ), dtl ); |
| } |
| |
| //================================================================================================== |
| // DNDListenerContainer::removeDropTargetListener |
| //================================================================================================== |
| |
| void SAL_CALL DNDListenerContainer::removeDropTargetListener( const Reference< XDropTargetListener >& dtl ) |
| throw(RuntimeException) |
| { |
| rBHelper.removeListener( getCppuType( ( const Reference< XDropTargetListener > * ) 0 ), dtl ); |
| } |
| |
| //================================================================================================== |
| // DNDListenerContainer::isActive |
| //================================================================================================== |
| |
| sal_Bool SAL_CALL DNDListenerContainer::isActive( ) |
| throw(RuntimeException) |
| { |
| return m_bActive; |
| } |
| |
| //================================================================================================== |
| // DNDListenerContainer::setActive |
| //================================================================================================== |
| |
| void SAL_CALL DNDListenerContainer::setActive( sal_Bool active ) |
| throw(RuntimeException) |
| { |
| m_bActive = active; |
| } |
| |
| //================================================================================================== |
| // DNDListenerContainer::getDefaultActions |
| //================================================================================================== |
| |
| sal_Int8 SAL_CALL DNDListenerContainer::getDefaultActions( ) |
| throw(RuntimeException) |
| { |
| return m_nDefaultActions; |
| } |
| |
| //================================================================================================== |
| // DNDListenerContainer::setDefaultActions |
| //================================================================================================== |
| |
| void SAL_CALL DNDListenerContainer::setDefaultActions( sal_Int8 actions ) |
| throw(RuntimeException) |
| { |
| m_nDefaultActions = actions; |
| } |
| |
| //================================================================================================== |
| // DNDListenerContainer::fireDropEvent |
| //================================================================================================== |
| |
| sal_uInt32 DNDListenerContainer::fireDropEvent( const Reference< XDropTargetDropContext >& context, |
| sal_Int8 dropAction, sal_Int32 locationX, sal_Int32 locationY, sal_Int8 sourceActions, |
| const Reference< XTransferable >& transferable ) |
| { |
| sal_uInt32 nRet = 0; |
| |
| // fire DropTargetDropEvent on all XDropTargetListeners |
| OInterfaceContainerHelper *pContainer = rBHelper.getContainer( getCppuType( ( Reference < XDropTargetListener > * ) 0) ); |
| |
| if( pContainer && m_bActive ) |
| { |
| OInterfaceIteratorHelper aIterator( *pContainer ); |
| |
| // remember context to use in own context methods |
| m_xDropTargetDropContext = context; |
| |
| // do not construct the event before you are sure at least one listener is registered |
| DropTargetDropEvent aEvent( static_cast < XDropTarget * > (this), 0, |
| static_cast < XDropTargetDropContext * > (this), dropAction, |
| locationX, locationY, sourceActions, transferable ); |
| |
| while (aIterator.hasMoreElements()) |
| { |
| // FIXME: this can be simplified as soon as the Iterator has a remove method |
| Reference< XInterface > xElement( aIterator.next() ); |
| |
| try |
| { |
| // this may result in a runtime exception |
| Reference < XDropTargetListener > xListener( xElement, UNO_QUERY ); |
| |
| if( xListener.is() ) |
| { |
| // fire drop until the first one has accepted |
| if( m_xDropTargetDropContext.is() ) |
| xListener->drop( aEvent ); |
| else |
| { |
| DropTargetEvent aDTEvent( static_cast < XDropTarget * > (this), 0 ); |
| xListener->dragExit( aDTEvent ); |
| } |
| |
| nRet++; |
| } |
| } |
| |
| catch( RuntimeException&) |
| { |
| pContainer->removeInterface( xElement ); |
| } |
| } |
| |
| // if context still valid, then reject drop |
| if( m_xDropTargetDropContext.is() ) |
| { |
| m_xDropTargetDropContext.clear(); |
| |
| try |
| { |
| context->rejectDrop(); |
| } |
| |
| catch( RuntimeException&) |
| { |
| } |
| } |
| } |
| |
| return nRet; |
| } |
| |
| //================================================================================================== |
| // DNDListenerContainer::fireDragExitEvent |
| //================================================================================================== |
| |
| sal_uInt32 DNDListenerContainer::fireDragExitEvent() |
| { |
| sal_uInt32 nRet = 0; |
| |
| // fire DropTargetDropEvent on all XDropTargetListeners |
| OInterfaceContainerHelper *pContainer = rBHelper.getContainer( getCppuType( ( Reference < XDropTargetListener > * ) 0) ); |
| |
| if( pContainer && m_bActive ) |
| { |
| OInterfaceIteratorHelper aIterator( *pContainer ); |
| |
| // do not construct the event before you are sure at least one listener is registered |
| DropTargetEvent aEvent( static_cast < XDropTarget * > (this), 0 ); |
| |
| while (aIterator.hasMoreElements()) |
| { |
| // FIXME: this can be simplified as soon as the Iterator has a remove method |
| Reference< XInterface > xElement( aIterator.next() ); |
| |
| try |
| { |
| // this may result in a runtime exception |
| Reference < XDropTargetListener > xListener( xElement, UNO_QUERY ); |
| |
| if( xListener.is() ) |
| { |
| xListener->dragExit( aEvent ); |
| nRet++; |
| } |
| } |
| |
| catch( RuntimeException&) |
| { |
| pContainer->removeInterface( xElement ); |
| } |
| } |
| } |
| |
| return nRet; |
| } |
| |
| //================================================================================================== |
| // DNDListenerContainer::fireDragOverEvent |
| //================================================================================================== |
| |
| sal_uInt32 DNDListenerContainer::fireDragOverEvent( const Reference< XDropTargetDragContext >& context, |
| sal_Int8 dropAction, sal_Int32 locationX, sal_Int32 locationY, sal_Int8 sourceActions ) |
| { |
| sal_uInt32 nRet = 0; |
| |
| // fire DropTargetDropEvent on all XDropTargetListeners |
| OInterfaceContainerHelper *pContainer = rBHelper.getContainer( getCppuType( ( Reference < XDropTargetListener > * ) 0) ); |
| |
| if( pContainer && m_bActive ) |
| { |
| OInterfaceIteratorHelper aIterator( *pContainer ); |
| |
| // remember context to use in own context methods |
| m_xDropTargetDragContext = context; |
| |
| // do not construct the event before you are sure at least one listener is registered |
| DropTargetDragEvent aEvent( static_cast < XDropTarget * > (this), 0, |
| static_cast < XDropTargetDragContext * > (this), |
| dropAction, locationX, locationY, sourceActions ); |
| |
| while (aIterator.hasMoreElements()) |
| { |
| // FIXME: this can be simplified as soon as the Iterator has a remove method |
| Reference< XInterface > xElement( aIterator.next() ); |
| |
| try |
| { |
| // this may result in a runtime exception |
| Reference < XDropTargetListener > xListener( xElement, UNO_QUERY ); |
| |
| if( xListener.is() ) |
| { |
| if( m_xDropTargetDragContext.is() ) |
| xListener->dragOver( aEvent ); |
| nRet++; |
| } |
| } |
| |
| catch( RuntimeException&) |
| { |
| pContainer->removeInterface( xElement ); |
| } |
| } |
| |
| // if context still valid, then reject drag |
| if( m_xDropTargetDragContext.is() ) |
| { |
| m_xDropTargetDragContext.clear(); |
| |
| try |
| { |
| context->rejectDrag(); |
| } |
| |
| catch( RuntimeException&) |
| { |
| } |
| } |
| } |
| |
| return nRet; |
| } |
| |
| //================================================================================================== |
| // DNDListenerContainer::fireDragEnterEvent |
| //================================================================================================== |
| |
| sal_uInt32 DNDListenerContainer::fireDragEnterEvent( const Reference< XDropTargetDragContext >& context, |
| sal_Int8 dropAction, sal_Int32 locationX, sal_Int32 locationY, sal_Int8 sourceActions, |
| const Sequence< DataFlavor >& dataFlavors ) |
| { |
| sal_uInt32 nRet = 0; |
| |
| // fire DropTargetDropEvent on all XDropTargetListeners |
| OInterfaceContainerHelper *pContainer = rBHelper.getContainer( getCppuType( ( Reference < XDropTargetListener > * ) 0) ); |
| |
| if( pContainer && m_bActive ) |
| { |
| OInterfaceIteratorHelper aIterator( *pContainer ); |
| |
| // remember context to use in own context methods |
| m_xDropTargetDragContext = context; |
| |
| // do not construct the event before you are sure at least one listener is registered |
| DropTargetDragEnterEvent aEvent( static_cast < XDropTarget * > (this), 0, |
| static_cast < XDropTargetDragContext * > (this), |
| dropAction, locationX, locationY, sourceActions, dataFlavors ); |
| |
| while (aIterator.hasMoreElements()) |
| { |
| // FIXME: this can be simplified as soon as the Iterator has a remove method |
| Reference< XInterface > xElement( aIterator.next() ); |
| |
| try |
| { |
| // this may result in a runtime exception |
| Reference < XDropTargetListener > xListener( xElement, UNO_QUERY ); |
| |
| if( xListener.is() ) |
| { |
| if( m_xDropTargetDragContext.is() ) |
| xListener->dragEnter( aEvent ); |
| nRet++; |
| } |
| } |
| |
| catch( RuntimeException&) |
| { |
| pContainer->removeInterface( xElement ); |
| } |
| } |
| |
| // if context still valid, then reject drag |
| if( m_xDropTargetDragContext.is() ) |
| { |
| m_xDropTargetDragContext.clear(); |
| |
| try |
| { |
| context->rejectDrag(); |
| } |
| |
| catch( RuntimeException&) |
| { |
| } |
| } |
| } |
| |
| return nRet; |
| } |
| |
| //================================================================================================== |
| // DNDListenerContainer::fireDropActionChangedEvent |
| //================================================================================================== |
| |
| sal_uInt32 DNDListenerContainer::fireDropActionChangedEvent( const Reference< XDropTargetDragContext >& context, |
| sal_Int8 dropAction, sal_Int32 locationX, sal_Int32 locationY, sal_Int8 sourceActions ) |
| { |
| sal_uInt32 nRet = 0; |
| |
| // fire DropTargetDropEvent on all XDropTargetListeners |
| OInterfaceContainerHelper *pContainer = rBHelper.getContainer( getCppuType( ( Reference < XDropTargetListener > * ) 0) ); |
| |
| if( pContainer && m_bActive ) |
| { |
| OInterfaceIteratorHelper aIterator( *pContainer ); |
| |
| // remember context to use in own context methods |
| m_xDropTargetDragContext = context; |
| |
| // do not construct the event before you are sure at least one listener is registered |
| DropTargetDragEvent aEvent( static_cast < XDropTarget * > (this), 0, |
| static_cast < XDropTargetDragContext * > (this), |
| dropAction, locationX, locationY, sourceActions ); |
| |
| while (aIterator.hasMoreElements()) |
| { |
| // FIXME: this can be simplified as soon as the Iterator has a remove method |
| Reference< XInterface > xElement( aIterator.next() ); |
| |
| try |
| { |
| // this may result in a runtime exception |
| Reference < XDropTargetListener > xListener( xElement, UNO_QUERY ); |
| |
| if( xListener.is() ) |
| { |
| if( m_xDropTargetDragContext.is() ) |
| xListener->dropActionChanged( aEvent ); |
| nRet++; |
| } |
| } |
| |
| catch( RuntimeException&) |
| { |
| pContainer->removeInterface( xElement ); |
| } |
| } |
| |
| // if context still valid, then reject drag |
| if( m_xDropTargetDragContext.is() ) |
| { |
| m_xDropTargetDragContext.clear(); |
| |
| try |
| { |
| context->rejectDrag(); |
| } |
| |
| catch( RuntimeException&) |
| { |
| } |
| } |
| } |
| |
| return nRet; |
| } |
| |
| //================================================================================================== |
| // DNDListenerContainer::fireDragGestureEvent |
| //================================================================================================== |
| |
| sal_uInt32 DNDListenerContainer::fireDragGestureEvent( sal_Int8 dragAction, sal_Int32 dragOriginX, |
| sal_Int32 dragOriginY, const Reference< XDragSource >& dragSource, const Any& triggerEvent ) |
| { |
| sal_uInt32 nRet = 0; |
| |
| // fire DropTargetDropEvent on all XDropTargetListeners |
| OInterfaceContainerHelper *pContainer = rBHelper.getContainer( getCppuType( ( Reference < XDragGestureListener > * ) 0) ); |
| |
| if( pContainer ) |
| { |
| OInterfaceIteratorHelper aIterator( *pContainer ); |
| |
| // do not construct the event before you are sure at least one listener is registered |
| DragGestureEvent aEvent( static_cast < XDragGestureRecognizer * > (this), dragAction, |
| dragOriginX, dragOriginY, dragSource, triggerEvent ); |
| |
| while( aIterator.hasMoreElements() ) |
| { |
| // FIXME: this can be simplified as soon as the Iterator has a remove method |
| Reference< XInterface > xElement( aIterator.next() ); |
| |
| try |
| { |
| // this may result in a runtime exception |
| Reference < XDragGestureListener > xListener( xElement, UNO_QUERY ); |
| |
| if( xListener.is() ) |
| { |
| xListener->dragGestureRecognized( aEvent ); |
| nRet++; |
| } |
| } |
| |
| catch( RuntimeException&) |
| { |
| pContainer->removeInterface( xElement ); |
| } |
| } |
| } |
| |
| return nRet; |
| } |
| |
| //================================================================================================== |
| // DNDListenerContainer::acceptDrag |
| //================================================================================================== |
| |
| void SAL_CALL DNDListenerContainer::acceptDrag( sal_Int8 dragOperation ) throw (RuntimeException) |
| { |
| if( m_xDropTargetDragContext.is() ) |
| { |
| m_xDropTargetDragContext->acceptDrag( dragOperation ); |
| m_xDropTargetDragContext.clear(); |
| } |
| } |
| |
| //================================================================================================== |
| // DNDListenerContainer::rejectDrag |
| //================================================================================================== |
| |
| void SAL_CALL DNDListenerContainer::rejectDrag( ) throw (RuntimeException) |
| { |
| // nothing to do here |
| } |
| |
| //================================================================================================== |
| // DNDListenerContainer::acceptDrop |
| //================================================================================================== |
| |
| void SAL_CALL DNDListenerContainer::acceptDrop( sal_Int8 dropOperation ) throw (RuntimeException) |
| { |
| if( m_xDropTargetDropContext.is() ) |
| m_xDropTargetDropContext->acceptDrop( dropOperation ); |
| } |
| |
| //================================================================================================== |
| // DNDListenerContainer::rejectDrop |
| //================================================================================================== |
| |
| void SAL_CALL DNDListenerContainer::rejectDrop( ) throw (RuntimeException) |
| { |
| // nothing to do here |
| } |
| |
| //================================================================================================== |
| // DNDListenerContainer::dropComplete |
| //================================================================================================== |
| |
| void SAL_CALL DNDListenerContainer::dropComplete( sal_Bool success ) throw (RuntimeException) |
| { |
| if( m_xDropTargetDropContext.is() ) |
| { |
| m_xDropTargetDropContext->dropComplete( success ); |
| m_xDropTargetDropContext.clear(); |
| } |
| } |