1 /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ 2 /* 3 * This file is part of the LibreOffice project. 4 * 5 * This Source Code Form is subject to the terms of the Mozilla Public 6 * License, v. 2.0. If a copy of the MPL was not distributed with this 7 * file, You can obtain one at http://mozilla.org/MPL/2.0/. 8 * 9 * This file incorporates work covered by the following license notice: 10 * 11 * Licensed to the Apache Software Foundation (ASF) under one or more 12 * contributor license agreements. See the NOTICE file distributed 13 * with this work for additional information regarding copyright 14 * ownership. The ASF licenses this file to you under the Apache 15 * License, Version 2.0 (the "License"); you may not use this file 16 * except in compliance with the License. You may obtain a copy of 17 * the License at http://www.apache.org/licenses/LICENSE-2.0 . 18 */ 19 20 #ifndef INCLUDED_VCL_OSX_DROPTARGET_HXX 21 #define INCLUDED_VCL_OSX_DROPTARGET_HXX 22 23 #include "DataFlavorMapping.hxx" 24 #include <cppuhelper/compbase.hxx> 25 #include <com/sun/star/lang/XInitialization.hpp> 26 #include <com/sun/star/datatransfer/dnd/XDropTarget.hpp> 27 28 #include <com/sun/star/datatransfer/dnd/XDropTargetListener.hpp> 29 #include <com/sun/star/datatransfer/dnd/DropTargetDragEnterEvent.hpp> 30 #include <com/sun/star/datatransfer/dnd/XDropTargetDragContext.hpp> 31 #include <com/sun/star/datatransfer/dnd/XDropTargetDropContext.hpp> 32 #include <com/sun/star/datatransfer/clipboard/XClipboard.hpp> 33 #include <com/sun/star/lang/XServiceInfo.hpp> 34 #include <cppuhelper/basemutex.hxx> 35 #include <com/sun/star/lang/XMultiComponentFactory.hpp> 36 37 #include <premac.h> 38 #import <Cocoa/Cocoa.h> 39 #include <postmac.h> 40 41 class DropTarget; 42 class AquaSalFrame; 43 44 /* The functions declared in this protocol are actually 45 declared in vcl/inc/osx/salframe.h. Because we want 46 to avoid importing VCL headers in UNO services and 47 on the other hand want to avoid warnings caused by 48 gcc complaining about unknowness of these functions 49 we declare them in a protocol here and cast at the 50 appropriate places. 51 */ 52 @protocol DraggingDestinationHandler 53 -(void)registerDraggingDestinationHandler:(id)theHandler; 54 -(void)unregisterDraggingDestinationHandler:(id)theHandler; 55 @end 56 57 @interface DropTargetHelper : NSObject 58 { 59 DropTarget* mDropTarget; 60 } 61 62 -(DropTargetHelper*)initWithDropTarget:(DropTarget*)pdt; 63 64 -(NSDragOperation)draggingEntered:(id <NSDraggingInfo>)sender; 65 -(NSDragOperation)draggingUpdated:(id <NSDraggingInfo>)sender; 66 -(void)draggingExited:(id <NSDraggingInfo>)sender; 67 -(BOOL)prepareForDragOperation:(id <NSDraggingInfo>)sender; 68 -(BOOL)performDragOperation:(id <NSDraggingInfo>)sender; 69 -(void)concludeDragOperation:(id <NSDraggingInfo>)sender; 70 71 @end 72 73 class DropTarget: public cppu::BaseMutex, 74 public cppu::WeakComponentImplHelper< css::lang::XInitialization, 75 css::datatransfer::dnd::XDropTarget, 76 css::datatransfer::dnd::XDropTargetDragContext, 77 css::datatransfer::dnd::XDropTargetDropContext, 78 css::lang::XServiceInfo > 79 { 80 public: 81 DropTarget(); 82 virtual ~DropTarget() override; 83 DropTarget(const DropTarget&) = delete; 84 DropTarget& operator=(const DropTarget&) = delete; 85 86 // Overrides WeakComponentImplHelper::disposing which is called by 87 // WeakComponentImplHelper::dispose 88 // Must be called. 89 virtual void SAL_CALL disposing() override; 90 91 // XInitialization 92 virtual void SAL_CALL initialize( const css::uno::Sequence< css::uno::Any >& aArguments ) override; 93 94 // XDropTarget 95 virtual void SAL_CALL addDropTargetListener( const css::uno::Reference< css::datatransfer::dnd::XDropTargetListener >& dtl ) override; 96 97 virtual void SAL_CALL removeDropTargetListener( const css::uno::Reference< css::datatransfer::dnd::XDropTargetListener >& dtl ) override; 98 99 // Default is not active 100 virtual sal_Bool SAL_CALL isActive() override; 101 virtual void SAL_CALL setActive(sal_Bool isActive) override; 102 virtual sal_Int8 SAL_CALL getDefaultActions() override; 103 virtual void SAL_CALL setDefaultActions(sal_Int8 actions) override; 104 105 // XDropTargetDragContext 106 virtual void SAL_CALL acceptDrag(sal_Int8 dragOperation) override; 107 virtual void SAL_CALL rejectDrag() override; 108 109 // XDropTargetDragContext 110 virtual void SAL_CALL acceptDrop(sal_Int8 dropOperation) override; 111 virtual void SAL_CALL rejectDrop() override; 112 virtual void SAL_CALL dropComplete(sal_Bool success) override; 113 114 // XServiceInfo 115 virtual OUString SAL_CALL getImplementationName() override; 116 virtual sal_Bool SAL_CALL supportsService(const OUString& ServiceName) override; 117 virtual css::uno::Sequence< OUString > SAL_CALL getSupportedServiceNames() override; 118 119 // NSDraggingDestination protocol functions 120 NSDragOperation draggingEntered(id sender); 121 NSDragOperation draggingUpdated(id sender); 122 void draggingExited(id sender); 123 static BOOL prepareForDragOperation(); 124 BOOL performDragOperation(); 125 void concludeDragOperation(id sender); 126 127 /* If multiple actions are supported by the drag source and 128 the user did not choose a specific action by pressing a 129 modifier key choose a default action to be proposed to 130 the application. 131 */ 132 sal_Int8 determineDropAction(sal_Int8 dropActions, id sender) const; 133 134 private: 135 void fire_drop(const css::datatransfer::dnd::DropTargetDropEvent& dte); 136 void fire_dragEnter(const css::datatransfer::dnd::DropTargetDragEnterEvent& dtdee); 137 void fire_dragExit(const css::datatransfer::dnd::DropTargetEvent& dte); 138 void fire_dragOver(const css::datatransfer::dnd::DropTargetDragEvent& dtde); 139 void fire_dropActionChanged(const css::datatransfer::dnd::DropTargetDragEvent& dtde); 140 141 private: 142 css::uno::Reference< css::datatransfer::dnd::XDropTargetDragContext > mXCurrentDragContext; 143 css::uno::Reference< css::datatransfer::dnd::XDropTargetDropContext > mXCurrentDropContext; 144 css::uno::Reference< css::datatransfer::clipboard::XClipboard > mXCurrentDragClipboard; 145 DataFlavorMapperPtr_t mDataFlavorMapper; 146 id mView; 147 AquaSalFrame* mpFrame; 148 DropTargetHelper* mDropTargetHelper; 149 bool mbActive; 150 sal_Int8 mDragSourceSupportedActions; 151 sal_Int8 mSelectedDropAction; 152 sal_Int8 mDefaultActions; 153 }; 154 155 #endif // INCLUDED_VCL_OSX_DROPTARGET_HXX 156 157 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ 158