xref: /trunk/main/vcl/aqua/source/dtrans/DropTarget.cxx (revision cf6516809c57e1bb0a940545cca99cdad54d4ce2)
19f62ea84SAndrew Rist /**************************************************************
2cdf0e10cSrcweir  *
39f62ea84SAndrew Rist  * Licensed to the Apache Software Foundation (ASF) under one
49f62ea84SAndrew Rist  * or more contributor license agreements.  See the NOTICE file
59f62ea84SAndrew Rist  * distributed with this work for additional information
69f62ea84SAndrew Rist  * regarding copyright ownership.  The ASF licenses this file
79f62ea84SAndrew Rist  * to you under the Apache License, Version 2.0 (the
89f62ea84SAndrew Rist  * "License"); you may not use this file except in compliance
99f62ea84SAndrew Rist  * with the License.  You may obtain a copy of the License at
10cdf0e10cSrcweir  *
119f62ea84SAndrew Rist  *   http://www.apache.org/licenses/LICENSE-2.0
12cdf0e10cSrcweir  *
139f62ea84SAndrew Rist  * Unless required by applicable law or agreed to in writing,
149f62ea84SAndrew Rist  * software distributed under the License is distributed on an
159f62ea84SAndrew Rist  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
169f62ea84SAndrew Rist  * KIND, either express or implied.  See the License for the
179f62ea84SAndrew Rist  * specific language governing permissions and limitations
189f62ea84SAndrew Rist  * under the License.
19cdf0e10cSrcweir  *
209f62ea84SAndrew Rist  *************************************************************/
219f62ea84SAndrew Rist 
229f62ea84SAndrew Rist 
23cdf0e10cSrcweir 
24cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove
25cdf0e10cSrcweir #include "precompiled_vcl.hxx"
26cdf0e10cSrcweir #include <com/sun/star/datatransfer/dnd/DNDConstants.hpp>
27cdf0e10cSrcweir #include <com/sun/star/datatransfer/XTransferable.hpp>
28cdf0e10cSrcweir #include <com/sun/star/datatransfer/dnd/DropTargetDragEnterEvent.hpp>
29cdf0e10cSrcweir #include <rtl/unload.h>
30cdf0e10cSrcweir 
31cdf0e10cSrcweir #ifndef COMPHELPER_MAKESEQUENCE_HXX_INCLUDED
32cdf0e10cSrcweir #include "comphelper/makesequence.hxx"
33cdf0e10cSrcweir #endif
34cdf0e10cSrcweir #include <cppuhelper/interfacecontainer.hxx>
35cdf0e10cSrcweir 
36cdf0e10cSrcweir #include "aqua_clipboard.hxx"
37cdf0e10cSrcweir #include "DropTarget.hxx"
38cdf0e10cSrcweir #include "DragActionConversion.hxx"
39cdf0e10cSrcweir 
40cdf0e10cSrcweir #include "DragSource.hxx"
41cdf0e10cSrcweir 
42cdf0e10cSrcweir #include <rtl/ustring.h>
43cdf0e10cSrcweir #include <stdio.h>
44cdf0e10cSrcweir 
45cdf0e10cSrcweir #include <premac.h>
46cdf0e10cSrcweir #include <Carbon/Carbon.h>
47cdf0e10cSrcweir #include <postmac.h>
48cdf0e10cSrcweir 
49cdf0e10cSrcweir #include <aqua/salframe.h>
50cdf0e10cSrcweir #include <aqua/salframeview.h>
51cdf0e10cSrcweir 
52cdf0e10cSrcweir using namespace rtl;
53cdf0e10cSrcweir using namespace cppu;
54cdf0e10cSrcweir using namespace osl;
55cdf0e10cSrcweir using namespace com::sun::star::datatransfer;
56cdf0e10cSrcweir using namespace com::sun::star::datatransfer::dnd;
57cdf0e10cSrcweir using namespace com::sun::star::datatransfer::dnd::DNDConstants;
58cdf0e10cSrcweir using namespace com::sun::star::datatransfer::clipboard;
59cdf0e10cSrcweir using namespace com::sun::star::lang;
60cdf0e10cSrcweir using namespace com::sun::star::uno;
61cdf0e10cSrcweir using namespace com::sun::star;
62cdf0e10cSrcweir using namespace comphelper;
63cdf0e10cSrcweir 
dropTarget_getImplementationName()64cdf0e10cSrcweir OUString dropTarget_getImplementationName()
65cdf0e10cSrcweir {
66cdf0e10cSrcweir   return OUString(RTL_CONSTASCII_USTRINGPARAM("com.sun.star.comp.datatransfer.dnd.OleDropTarget_V1"));
67cdf0e10cSrcweir }
68cdf0e10cSrcweir 
69cdf0e10cSrcweir 
dropTarget_getSupportedServiceNames()70cdf0e10cSrcweir Sequence<OUString> dropTarget_getSupportedServiceNames()
71cdf0e10cSrcweir {
72cdf0e10cSrcweir   return makeSequence(OUString(RTL_CONSTASCII_USTRINGPARAM("com.sun.star.datatransfer.dnd.OleDropTarget")));
73cdf0e10cSrcweir }
74cdf0e10cSrcweir 
75cdf0e10cSrcweir 
76cdf0e10cSrcweir namespace /* private */
77cdf0e10cSrcweir {
78cdf0e10cSrcweir   // Cocoa's coordinate system has its origin lower-left, VCL's
79cdf0e10cSrcweir   // coordinate system upper-left hence we need to transform
80cdf0e10cSrcweir   // coordinates
81cdf0e10cSrcweir 
CocoaToVCL(NSPoint & rPoint,const NSRect & bounds)82cdf0e10cSrcweir   inline void CocoaToVCL(NSPoint& rPoint, const NSRect& bounds)
83cdf0e10cSrcweir   {
84cdf0e10cSrcweir     rPoint.y = bounds.size.height - rPoint.y;
85cdf0e10cSrcweir   }
86cdf0e10cSrcweir 
CocoaToVCL(NSRect & rRect,const NSRect & bounds)87cdf0e10cSrcweir   inline void CocoaToVCL(NSRect& rRect, const NSRect& bounds)
88cdf0e10cSrcweir   {
89cdf0e10cSrcweir     rRect.origin.y = bounds.size.height - (rRect.origin.y + rRect.size.height);
90cdf0e10cSrcweir   }
91cdf0e10cSrcweir }
92cdf0e10cSrcweir 
93cdf0e10cSrcweir 
94cdf0e10cSrcweir @implementation DropTargetHelper
95cdf0e10cSrcweir 
96cdf0e10cSrcweir 
97cdf0e10cSrcweir -(DropTargetHelper*)initWithDropTarget:(DropTarget*)pdt
98cdf0e10cSrcweir {
99cdf0e10cSrcweir   self = [super init];
100cdf0e10cSrcweir 
101cdf0e10cSrcweir   if (self)
102cdf0e10cSrcweir     {
103cdf0e10cSrcweir       mDropTarget = pdt;
104cdf0e10cSrcweir     }
105cdf0e10cSrcweir 
106cdf0e10cSrcweir   return self;
107cdf0e10cSrcweir }
108cdf0e10cSrcweir 
109cdf0e10cSrcweir 
110cdf0e10cSrcweir -(NSDragOperation)draggingEntered:(id <NSDraggingInfo>)sender
111cdf0e10cSrcweir {
112cdf0e10cSrcweir   return mDropTarget->draggingEntered(sender);
113cdf0e10cSrcweir }
114cdf0e10cSrcweir 
115cdf0e10cSrcweir 
116cdf0e10cSrcweir -(NSDragOperation)draggingUpdated:(id <NSDraggingInfo>)sender
117cdf0e10cSrcweir {
118cdf0e10cSrcweir   return mDropTarget->draggingUpdated(sender);
119cdf0e10cSrcweir }
120cdf0e10cSrcweir 
121cdf0e10cSrcweir 
122cdf0e10cSrcweir -(void)draggingExited:(id <NSDraggingInfo>)sender
123cdf0e10cSrcweir {
124cdf0e10cSrcweir   mDropTarget->draggingExited(sender);
125cdf0e10cSrcweir }
126cdf0e10cSrcweir 
127cdf0e10cSrcweir 
128cdf0e10cSrcweir -(BOOL)prepareForDragOperation:(id <NSDraggingInfo>)sender
129cdf0e10cSrcweir {
130cdf0e10cSrcweir   return mDropTarget->prepareForDragOperation(sender);
131cdf0e10cSrcweir }
132cdf0e10cSrcweir 
133cdf0e10cSrcweir 
134cdf0e10cSrcweir -(BOOL)performDragOperation:(id <NSDraggingInfo>)sender
135cdf0e10cSrcweir {
136*f9bb485fSHerbert Dürr   (void) sender;
137*f9bb485fSHerbert Dürr   return mDropTarget->performDragOperation();
138cdf0e10cSrcweir }
139cdf0e10cSrcweir 
140cdf0e10cSrcweir 
141cdf0e10cSrcweir -(void)concludeDragOperation:(id <NSDraggingInfo>)sender
142cdf0e10cSrcweir {
143cdf0e10cSrcweir   mDropTarget->concludeDragOperation(sender);
144cdf0e10cSrcweir }
145cdf0e10cSrcweir 
146cdf0e10cSrcweir 
147cdf0e10cSrcweir @end
148cdf0e10cSrcweir 
149cdf0e10cSrcweir 
DropTarget()150cdf0e10cSrcweir DropTarget::DropTarget() :
151cdf0e10cSrcweir   WeakComponentImplHelper5<XInitialization, XDropTarget, XDropTargetDragContext, XDropTargetDropContext, XServiceInfo>(m_aMutex),
152cdf0e10cSrcweir   mView(nil),
153cdf0e10cSrcweir   mpFrame(NULL),
154cdf0e10cSrcweir   mDropTargetHelper(nil),
155cdf0e10cSrcweir   mbActive(false),
156cdf0e10cSrcweir   mDragSourceSupportedActions(DNDConstants::ACTION_NONE),
157cdf0e10cSrcweir   mSelectedDropAction(DNDConstants::ACTION_NONE),
158cdf0e10cSrcweir   mDefaultActions(DNDConstants::ACTION_COPY_OR_MOVE | DNDConstants::ACTION_LINK | DNDConstants::ACTION_DEFAULT)
159cdf0e10cSrcweir {
160cdf0e10cSrcweir   mDataFlavorMapper = DataFlavorMapperPtr_t(new DataFlavorMapper());
161cdf0e10cSrcweir }
162cdf0e10cSrcweir 
163cdf0e10cSrcweir 
~DropTarget()164cdf0e10cSrcweir DropTarget::~DropTarget()
165cdf0e10cSrcweir {
166cdf0e10cSrcweir     if( AquaSalFrame::isAlive( mpFrame ) )
167cdf0e10cSrcweir         [(id <DraggingDestinationHandler>)mView unregisterDraggingDestinationHandler:mDropTargetHelper];
168cdf0e10cSrcweir     [mDropTargetHelper release];
169cdf0e10cSrcweir }
170cdf0e10cSrcweir 
171cdf0e10cSrcweir 
determineDropAction(sal_Int8 dropActions,id sender) const172cdf0e10cSrcweir sal_Int8 DropTarget::determineDropAction(sal_Int8 dropActions, id sender) const
173cdf0e10cSrcweir {
174cdf0e10cSrcweir   sal_Int8 dropAct = dropActions;
175cdf0e10cSrcweir   bool srcAndDestEqual = false;
176cdf0e10cSrcweir 
177cdf0e10cSrcweir   if ([sender draggingSource] != nil)
178cdf0e10cSrcweir     {
179cdf0e10cSrcweir       // Internal DnD
180cdf0e10cSrcweir       NSView* destView = [[sender draggingDestinationWindow] contentView];
181cdf0e10cSrcweir       srcAndDestEqual = (DragSource::g_DragSourceView == destView);
182cdf0e10cSrcweir     }
183cdf0e10cSrcweir 
184cdf0e10cSrcweir   // If ACTION_DEFAULT is set this means NSDragOperationGeneric
185cdf0e10cSrcweir   // has been set and we map this to ACTION_MOVE or ACTION_COPY
186cdf0e10cSrcweir   // depending on whether or not source and dest are equal,
187cdf0e10cSrcweir   // this hopefully satisfies all parties
188cdf0e10cSrcweir   if( (dropActions == DNDConstants::ACTION_DEFAULT)
189cdf0e10cSrcweir   || ((dropActions == mDragSourceSupportedActions)
190cdf0e10cSrcweir      && !(~mDragSourceSupportedActions & DNDConstants::ACTION_COPY_OR_MOVE ) ) )
191cdf0e10cSrcweir     {
192cdf0e10cSrcweir       dropAct = srcAndDestEqual ? DNDConstants::ACTION_MOVE :
193cdf0e10cSrcweir         DNDConstants::ACTION_COPY;
194cdf0e10cSrcweir     }
195cdf0e10cSrcweir      // if more than one drop actions have been specified
196cdf0e10cSrcweir      // set ACTION_DEFAULT in order to let the drop target
197cdf0e10cSrcweir      // decide which one to use
198cdf0e10cSrcweir   else if (dropActions != DNDConstants::ACTION_NONE &&
199cdf0e10cSrcweir            dropActions != DNDConstants::ACTION_MOVE &&
200cdf0e10cSrcweir            dropActions != DNDConstants::ACTION_COPY &&
201cdf0e10cSrcweir            dropActions != DNDConstants::ACTION_LINK)
202cdf0e10cSrcweir     {
203cdf0e10cSrcweir       if (srcAndDestEqual)
204cdf0e10cSrcweir         {
205cdf0e10cSrcweir           dropAct = dropActions;
206cdf0e10cSrcweir         }
207cdf0e10cSrcweir       else // source and destination are different
208cdf0e10cSrcweir         {
209cdf0e10cSrcweir           if (dropActions & DNDConstants::ACTION_COPY)
210cdf0e10cSrcweir             dropAct = DNDConstants::ACTION_COPY;
211cdf0e10cSrcweir           else if (dropActions & DNDConstants::ACTION_MOVE)
212cdf0e10cSrcweir             dropAct = DNDConstants::ACTION_MOVE;
213cdf0e10cSrcweir           else if (dropActions & DNDConstants::ACTION_LINK)
214cdf0e10cSrcweir             dropAct = DNDConstants::ACTION_LINK;
215cdf0e10cSrcweir         }
216cdf0e10cSrcweir 
217cdf0e10cSrcweir       dropAct |= DNDConstants::ACTION_DEFAULT;
218cdf0e10cSrcweir     }
219cdf0e10cSrcweir 
220cdf0e10cSrcweir   return dropAct;
221cdf0e10cSrcweir }
222cdf0e10cSrcweir 
223cdf0e10cSrcweir 
draggingEntered(id sender)224cdf0e10cSrcweir NSDragOperation DropTarget::draggingEntered(id sender)
225cdf0e10cSrcweir {
226cdf0e10cSrcweir   // Initially when DnD will be started no modifier key can be pressed yet
227cdf0e10cSrcweir   // thus we are getting all actions that the drag source supports, we save
228cdf0e10cSrcweir   // this value because later the system masks the drag source actions if
229cdf0e10cSrcweir   // a modifier key will be pressed
230cdf0e10cSrcweir   mDragSourceSupportedActions = SystemToOfficeDragActions([sender draggingSourceOperationMask]);
231cdf0e10cSrcweir 
232cdf0e10cSrcweir   // Only if the drop target is really interessted in the drag actions
233cdf0e10cSrcweir   // supported by the source
234cdf0e10cSrcweir   if (mDragSourceSupportedActions & mDefaultActions)
235cdf0e10cSrcweir     {
236cdf0e10cSrcweir       sal_Int8 currentAction = determineDropAction(mDragSourceSupportedActions, sender);
237cdf0e10cSrcweir 
238cdf0e10cSrcweir       NSRect bounds = [mView bounds];
239*f9bb485fSHerbert Dürr       NSPoint mouseLoc = [NSEvent mouseLocation];
240*f9bb485fSHerbert Dürr 
241*f9bb485fSHerbert Dürr       id wnd = [mView window];
242*f9bb485fSHerbert Dürr       NSPoint dragLocation = [mView convertPoint:[wnd convertScreenToBase:mouseLoc] fromView:nil];
243cdf0e10cSrcweir 
244cdf0e10cSrcweir       CocoaToVCL(dragLocation, bounds);
245cdf0e10cSrcweir 
246cdf0e10cSrcweir       sal_Int32 posX = static_cast<sal_Int32>(dragLocation.x);
247cdf0e10cSrcweir       sal_Int32 posY = static_cast<sal_Int32>(dragLocation.y);
248cdf0e10cSrcweir 
249cdf0e10cSrcweir       NSPasteboard* dragPboard = [sender draggingPasteboard];
250cdf0e10cSrcweir       mXCurrentDragClipboard = new AquaClipboard(dragPboard, false);
251cdf0e10cSrcweir 
252cdf0e10cSrcweir       uno::Reference<XTransferable> xTransferable = DragSource::g_XTransferable.is() ?
253cdf0e10cSrcweir         DragSource::g_XTransferable : mXCurrentDragClipboard->getContents();
254cdf0e10cSrcweir 
255cdf0e10cSrcweir       DropTargetDragEnterEvent dtdee(static_cast<OWeakObject*>(this),
256cdf0e10cSrcweir                                      0,
257cdf0e10cSrcweir                                      this,
258cdf0e10cSrcweir                                      currentAction,
259cdf0e10cSrcweir                                      posX,
260cdf0e10cSrcweir                                      posY,
261cdf0e10cSrcweir                                      mDragSourceSupportedActions,
262cdf0e10cSrcweir                                      xTransferable->getTransferDataFlavors());
263cdf0e10cSrcweir 
264cdf0e10cSrcweir       fire_dragEnter(dtdee);
265cdf0e10cSrcweir     }
266cdf0e10cSrcweir 
267cdf0e10cSrcweir   return OfficeToSystemDragActions(mSelectedDropAction);
268cdf0e10cSrcweir }
269cdf0e10cSrcweir 
270cdf0e10cSrcweir 
draggingUpdated(id sender)271cdf0e10cSrcweir NSDragOperation DropTarget::draggingUpdated(id sender)
272cdf0e10cSrcweir {
273cdf0e10cSrcweir   sal_Int8 currentDragSourceActions =
274cdf0e10cSrcweir     SystemToOfficeDragActions([sender draggingSourceOperationMask]);
275cdf0e10cSrcweir   NSDragOperation dragOp = NSDragOperationNone;
276cdf0e10cSrcweir 
277cdf0e10cSrcweir   if (currentDragSourceActions & mDefaultActions)
278cdf0e10cSrcweir     {
279cdf0e10cSrcweir       sal_Int8 currentAction = determineDropAction(currentDragSourceActions, sender);
280cdf0e10cSrcweir       NSRect bounds = [mView bounds];
281*f9bb485fSHerbert Dürr       NSPoint mouseLoc = [NSEvent mouseLocation];
282*f9bb485fSHerbert Dürr 
283*f9bb485fSHerbert Dürr       id wnd = [mView window];
284*f9bb485fSHerbert Dürr       NSPoint dragLocation = [mView convertPoint:[wnd convertScreenToBase:mouseLoc] fromView:nil];
285cdf0e10cSrcweir 
286cdf0e10cSrcweir       CocoaToVCL(dragLocation, bounds);
287cdf0e10cSrcweir 
288cdf0e10cSrcweir       sal_Int32 posX = static_cast<sal_Int32>(dragLocation.x);
289cdf0e10cSrcweir       sal_Int32 posY = static_cast<sal_Int32>(dragLocation.y);
290cdf0e10cSrcweir 
291cdf0e10cSrcweir       DropTargetDragEvent dtde(static_cast<OWeakObject*>(this),
292cdf0e10cSrcweir                                0,
293cdf0e10cSrcweir                                this,
294cdf0e10cSrcweir                                currentAction,
295cdf0e10cSrcweir                                posX,
296cdf0e10cSrcweir                                posY,
297cdf0e10cSrcweir                                mDragSourceSupportedActions);
298cdf0e10cSrcweir 
299cdf0e10cSrcweir       fire_dragOver(dtde);
300cdf0e10cSrcweir 
301cdf0e10cSrcweir       // drag over callbacks likely have rendered something
302cdf0e10cSrcweir       [mView setNeedsDisplay: TRUE];
303cdf0e10cSrcweir 
304cdf0e10cSrcweir       dragOp = OfficeToSystemDragActions(mSelectedDropAction);
305cdf0e10cSrcweir 
306cdf0e10cSrcweir       //NSLog(@"Drag update: Source actions: %x proposed action %x selected action %x", mDragSourceSupportedActions, currentAction, mSelectedDropAction);
307cdf0e10cSrcweir     }
308cdf0e10cSrcweir 
309cdf0e10cSrcweir   if (dragOp == NSDragOperationNone)
3102dae3561SHerbert Dürr     [[NSCursor operationNotAllowedCursor] set];
311cdf0e10cSrcweir   else if (dragOp == NSDragOperationCopy)
3122dae3561SHerbert Dürr     [[NSCursor dragCopyCursor] set];
313cdf0e10cSrcweir   else
3142dae3561SHerbert Dürr     [[NSCursor arrowCursor] set];
315cdf0e10cSrcweir 
316cdf0e10cSrcweir   return dragOp;
317cdf0e10cSrcweir }
318cdf0e10cSrcweir 
319cdf0e10cSrcweir 
draggingExited(id)320cdf0e10cSrcweir void DropTarget::draggingExited(id /*sender*/)
321cdf0e10cSrcweir {
322cdf0e10cSrcweir     DropTargetEvent dte(static_cast<OWeakObject*>(this), 0);
323cdf0e10cSrcweir     fire_dragExit(dte);
324cdf0e10cSrcweir     mDragSourceSupportedActions = DNDConstants::ACTION_NONE;
325cdf0e10cSrcweir     mSelectedDropAction = DNDConstants::ACTION_NONE;
3262dae3561SHerbert Dürr     [[NSCursor arrowCursor] set];
327cdf0e10cSrcweir }
328cdf0e10cSrcweir 
329cdf0e10cSrcweir 
prepareForDragOperation(id)330cdf0e10cSrcweir BOOL DropTarget::prepareForDragOperation(id /*sender*/)
331cdf0e10cSrcweir {
332cdf0e10cSrcweir     return 1;
333cdf0e10cSrcweir }
334cdf0e10cSrcweir 
335cdf0e10cSrcweir 
performDragOperation()336*f9bb485fSHerbert Dürr BOOL DropTarget::performDragOperation()
337cdf0e10cSrcweir {
338cdf0e10cSrcweir   bool bSuccess = false;
339cdf0e10cSrcweir 
340cdf0e10cSrcweir   if (mSelectedDropAction != DNDConstants::ACTION_NONE)
341cdf0e10cSrcweir     {
342cdf0e10cSrcweir         uno::Reference<XTransferable> xTransferable = DragSource::g_XTransferable;
343cdf0e10cSrcweir 
344cdf0e10cSrcweir       if (!DragSource::g_XTransferable.is())
345cdf0e10cSrcweir         {
346cdf0e10cSrcweir           xTransferable = mXCurrentDragClipboard->getContents();
347cdf0e10cSrcweir         }
348cdf0e10cSrcweir 
349cdf0e10cSrcweir       NSRect bounds = [mView bounds];
350*f9bb485fSHerbert Dürr       NSPoint mouseLoc = [NSEvent mouseLocation];
351*f9bb485fSHerbert Dürr 
352*f9bb485fSHerbert Dürr       id wnd = [mView window];
353*f9bb485fSHerbert Dürr       NSPoint dragLocation = [mView convertPoint:[wnd convertScreenToBase:mouseLoc] fromView:nil];
354cdf0e10cSrcweir 
355cdf0e10cSrcweir       CocoaToVCL(dragLocation, bounds);
356cdf0e10cSrcweir 
357cdf0e10cSrcweir       sal_Int32 posX = static_cast<sal_Int32>(dragLocation.x);
358cdf0e10cSrcweir       sal_Int32 posY = static_cast<sal_Int32>(dragLocation.y);
359cdf0e10cSrcweir 
360cdf0e10cSrcweir       DropTargetDropEvent dtde(static_cast<OWeakObject*>(this),
361cdf0e10cSrcweir                                0,
362cdf0e10cSrcweir                                this,
363cdf0e10cSrcweir                                mSelectedDropAction,
364cdf0e10cSrcweir                                posX,
365cdf0e10cSrcweir                                posY,
366cdf0e10cSrcweir                                mDragSourceSupportedActions,
367cdf0e10cSrcweir                                xTransferable);
368cdf0e10cSrcweir 
369cdf0e10cSrcweir       fire_drop(dtde);
370cdf0e10cSrcweir 
371cdf0e10cSrcweir       bSuccess = true;
372cdf0e10cSrcweir     }
373cdf0e10cSrcweir 
374cdf0e10cSrcweir   return bSuccess;
375cdf0e10cSrcweir }
376cdf0e10cSrcweir 
377cdf0e10cSrcweir 
concludeDragOperation(id)378cdf0e10cSrcweir void DropTarget::concludeDragOperation(id /*sender*/)
379cdf0e10cSrcweir {
380cdf0e10cSrcweir     mDragSourceSupportedActions = DNDConstants::ACTION_NONE;
381cdf0e10cSrcweir     mSelectedDropAction = DNDConstants::ACTION_NONE;
382cdf0e10cSrcweir     mXCurrentDragClipboard = uno::Reference<XClipboard>();
3832dae3561SHerbert Dürr     [[NSCursor arrowCursor] set];
384cdf0e10cSrcweir }
385cdf0e10cSrcweir 
386cdf0e10cSrcweir 
387cdf0e10cSrcweir   // called from WeakComponentImplHelperX::dispose
388cdf0e10cSrcweir   // WeakComponentImplHelper calls disposing before it destroys
389cdf0e10cSrcweir   // itself.
disposing()390cdf0e10cSrcweir   void SAL_CALL DropTarget::disposing()
391cdf0e10cSrcweir   {
392cdf0e10cSrcweir   }
393cdf0e10cSrcweir 
394cdf0e10cSrcweir 
initialize(const Sequence<Any> & aArguments)395cdf0e10cSrcweir   void SAL_CALL DropTarget::initialize(const Sequence< Any >& aArguments)
396cdf0e10cSrcweir     throw(Exception)
397cdf0e10cSrcweir   {
398cdf0e10cSrcweir     if (aArguments.getLength() < 2)
399cdf0e10cSrcweir       {
400cdf0e10cSrcweir         throw RuntimeException(OUString(RTL_CONSTASCII_USTRINGPARAM("DropTarget::initialize: Cannot install window event handler")),
401cdf0e10cSrcweir                                static_cast<OWeakObject*>(this));
402cdf0e10cSrcweir       }
403cdf0e10cSrcweir 
404cdf0e10cSrcweir     Any pNSView = aArguments[0];
405cdf0e10cSrcweir     sal_uInt64 tmp = 0;
406cdf0e10cSrcweir     pNSView >>= tmp;
407cdf0e10cSrcweir     mView = (id)tmp;
408cdf0e10cSrcweir     mpFrame = [(SalFrameView*)mView getSalFrame];
409cdf0e10cSrcweir 
410cdf0e10cSrcweir     mDropTargetHelper = [[DropTargetHelper alloc] initWithDropTarget: this];
411cdf0e10cSrcweir 
412cdf0e10cSrcweir     [(id <DraggingDestinationHandler>)mView registerDraggingDestinationHandler:mDropTargetHelper];
413cdf0e10cSrcweir     [mView registerForDraggedTypes: mDataFlavorMapper->getAllSupportedPboardTypes()];
414cdf0e10cSrcweir 
415cdf0e10cSrcweir     id wnd = [mView window];
416cdf0e10cSrcweir     NSWindow* parentWnd = [wnd parentWindow];
417cdf0e10cSrcweir     unsigned int topWndStyle = (NSTitledWindowMask | NSClosableWindowMask | NSResizableWindowMask);
418cdf0e10cSrcweir     unsigned int wndStyles = [wnd styleMask] & topWndStyle;
419cdf0e10cSrcweir 
420cdf0e10cSrcweir     if (parentWnd == nil && (wndStyles == topWndStyle))
421cdf0e10cSrcweir       {
422cdf0e10cSrcweir         [wnd registerDraggingDestinationHandler:mDropTargetHelper];
423cdf0e10cSrcweir         [wnd registerForDraggedTypes: [NSArray arrayWithObjects: NSFilenamesPboardType, nil]];
424cdf0e10cSrcweir       }
425cdf0e10cSrcweir   }
426cdf0e10cSrcweir 
427cdf0e10cSrcweir 
addDropTargetListener(const uno::Reference<XDropTargetListener> & dtl)428cdf0e10cSrcweir   void SAL_CALL DropTarget::addDropTargetListener(const uno::Reference<XDropTargetListener>& dtl)
429cdf0e10cSrcweir     throw(RuntimeException)
430cdf0e10cSrcweir   {
431cdf0e10cSrcweir     rBHelper.addListener(::getCppuType(&dtl), dtl);
432cdf0e10cSrcweir   }
433cdf0e10cSrcweir 
434cdf0e10cSrcweir 
removeDropTargetListener(const uno::Reference<XDropTargetListener> & dtl)435cdf0e10cSrcweir   void SAL_CALL DropTarget::removeDropTargetListener(const uno::Reference<XDropTargetListener>& dtl)
436cdf0e10cSrcweir     throw(RuntimeException)
437cdf0e10cSrcweir   {
438cdf0e10cSrcweir     rBHelper.removeListener(::getCppuType(&dtl), dtl);
439cdf0e10cSrcweir   }
440cdf0e10cSrcweir 
441cdf0e10cSrcweir 
isActive()442cdf0e10cSrcweir   sal_Bool SAL_CALL DropTarget::isActive(  ) throw(RuntimeException)
443cdf0e10cSrcweir   {
444cdf0e10cSrcweir     return mbActive;
445cdf0e10cSrcweir   }
446cdf0e10cSrcweir 
447cdf0e10cSrcweir 
setActive(sal_Bool active)448cdf0e10cSrcweir   void SAL_CALL DropTarget::setActive(sal_Bool active) throw(RuntimeException)
449cdf0e10cSrcweir   {
450cdf0e10cSrcweir     mbActive = active;
451cdf0e10cSrcweir   }
452cdf0e10cSrcweir 
453cdf0e10cSrcweir 
getDefaultActions()454cdf0e10cSrcweir   sal_Int8 SAL_CALL DropTarget::getDefaultActions() throw(RuntimeException)
455cdf0e10cSrcweir   {
456cdf0e10cSrcweir     return mDefaultActions;
457cdf0e10cSrcweir   }
458cdf0e10cSrcweir 
459cdf0e10cSrcweir 
setDefaultActions(sal_Int8 actions)460cdf0e10cSrcweir   void SAL_CALL DropTarget::setDefaultActions(sal_Int8 actions) throw(RuntimeException)
461cdf0e10cSrcweir   {
462cdf0e10cSrcweir     OSL_ENSURE( actions < 8, "No valid default actions");
463cdf0e10cSrcweir     mDefaultActions= actions;
464cdf0e10cSrcweir   }
465cdf0e10cSrcweir 
466cdf0e10cSrcweir 
467cdf0e10cSrcweir   // XDropTargetDragContext
468cdf0e10cSrcweir 
acceptDrag(sal_Int8 dragOperation)469cdf0e10cSrcweir   void SAL_CALL DropTarget::acceptDrag(sal_Int8 dragOperation) throw (RuntimeException)
470cdf0e10cSrcweir   {
471cdf0e10cSrcweir     mSelectedDropAction = dragOperation;
472cdf0e10cSrcweir   }
473cdf0e10cSrcweir 
474cdf0e10cSrcweir 
rejectDrag()475cdf0e10cSrcweir   void SAL_CALL DropTarget::rejectDrag() throw (RuntimeException)
476cdf0e10cSrcweir   {
477cdf0e10cSrcweir     mSelectedDropAction = DNDConstants::ACTION_NONE;
478cdf0e10cSrcweir   }
479cdf0e10cSrcweir 
480cdf0e10cSrcweir 
481cdf0e10cSrcweir   //XDropTargetDropContext
482cdf0e10cSrcweir 
acceptDrop(sal_Int8 dropOperation)483cdf0e10cSrcweir   void SAL_CALL DropTarget::acceptDrop(sal_Int8 dropOperation) throw( RuntimeException)
484cdf0e10cSrcweir   {
485cdf0e10cSrcweir     mSelectedDropAction = dropOperation;
486cdf0e10cSrcweir   }
487cdf0e10cSrcweir 
488cdf0e10cSrcweir 
rejectDrop()489cdf0e10cSrcweir   void SAL_CALL DropTarget::rejectDrop() throw (RuntimeException)
490cdf0e10cSrcweir   {
491cdf0e10cSrcweir     mSelectedDropAction = DNDConstants::ACTION_NONE;
492cdf0e10cSrcweir   }
493cdf0e10cSrcweir 
494cdf0e10cSrcweir 
dropComplete(sal_Bool success)495cdf0e10cSrcweir   void SAL_CALL DropTarget::dropComplete(sal_Bool success) throw (RuntimeException)
496cdf0e10cSrcweir   {
497cdf0e10cSrcweir     // Reset the internal transferable used as shortcut in case this is
498cdf0e10cSrcweir     // an internal D&D operation
499cdf0e10cSrcweir     DragSource::g_XTransferable = uno::Reference<XTransferable>();
500cdf0e10cSrcweir     DragSource::g_DropSuccessSet = true;
501cdf0e10cSrcweir     DragSource::g_DropSuccess = success;
502cdf0e10cSrcweir   }
503cdf0e10cSrcweir 
504cdf0e10cSrcweir 
fire_drop(const DropTargetDropEvent & dte)505cdf0e10cSrcweir   void DropTarget::fire_drop( const DropTargetDropEvent& dte)
506cdf0e10cSrcweir   {
507cdf0e10cSrcweir       OInterfaceContainerHelper* pContainer= rBHelper.getContainer( getCppuType( (uno::Reference<XDropTargetListener>* )0 ) );
508cdf0e10cSrcweir     if( pContainer)
509cdf0e10cSrcweir       {
510cdf0e10cSrcweir         OInterfaceIteratorHelper iter( *pContainer);
511cdf0e10cSrcweir         while( iter.hasMoreElements())
512cdf0e10cSrcweir           {
513cdf0e10cSrcweir               uno::Reference<XDropTargetListener> listener( static_cast<XDropTargetListener*>( iter.next()));
514cdf0e10cSrcweir 
515cdf0e10cSrcweir             try { listener->drop( dte); }
516cdf0e10cSrcweir             catch(RuntimeException&) {}
517cdf0e10cSrcweir           }
518cdf0e10cSrcweir       }
519cdf0e10cSrcweir   }
520cdf0e10cSrcweir 
521cdf0e10cSrcweir 
fire_dragEnter(const DropTargetDragEnterEvent & e)522cdf0e10cSrcweir   void DropTarget::fire_dragEnter(const DropTargetDragEnterEvent& e)
523cdf0e10cSrcweir   {
524cdf0e10cSrcweir       OInterfaceContainerHelper* pContainer= rBHelper.getContainer( getCppuType( (uno::Reference<XDropTargetListener>* )0 ) );
525cdf0e10cSrcweir     if( pContainer)
526cdf0e10cSrcweir       {
527cdf0e10cSrcweir         OInterfaceIteratorHelper iter( *pContainer);
528cdf0e10cSrcweir         while( iter.hasMoreElements())
529cdf0e10cSrcweir           {
530cdf0e10cSrcweir               uno::Reference<XDropTargetListener> listener( static_cast<XDropTargetListener*>( iter.next()));
531cdf0e10cSrcweir 
532cdf0e10cSrcweir             try { listener->dragEnter( e); }
533cdf0e10cSrcweir             catch (RuntimeException&) {}
534cdf0e10cSrcweir           }
535cdf0e10cSrcweir       }
536cdf0e10cSrcweir   }
537cdf0e10cSrcweir 
538cdf0e10cSrcweir 
fire_dragExit(const DropTargetEvent & dte)539cdf0e10cSrcweir   void DropTarget::fire_dragExit(const DropTargetEvent& dte)
540cdf0e10cSrcweir   {
541cdf0e10cSrcweir       OInterfaceContainerHelper* pContainer= rBHelper.getContainer( getCppuType( (uno::Reference<XDropTargetListener>* )0 ) );
542cdf0e10cSrcweir 
543cdf0e10cSrcweir     if( pContainer)
544cdf0e10cSrcweir       {
545cdf0e10cSrcweir         OInterfaceIteratorHelper iter( *pContainer);
546cdf0e10cSrcweir         while( iter.hasMoreElements())
547cdf0e10cSrcweir           {
548cdf0e10cSrcweir               uno::Reference<XDropTargetListener> listener( static_cast<XDropTargetListener*>( iter.next()));
549cdf0e10cSrcweir 
550cdf0e10cSrcweir             try { listener->dragExit( dte); }
551cdf0e10cSrcweir             catch (RuntimeException&) {}
552cdf0e10cSrcweir           }
553cdf0e10cSrcweir       }
554cdf0e10cSrcweir   }
555cdf0e10cSrcweir 
556cdf0e10cSrcweir 
fire_dragOver(const DropTargetDragEvent & dtde)557cdf0e10cSrcweir   void DropTarget::fire_dragOver(const DropTargetDragEvent& dtde)
558cdf0e10cSrcweir   {
559cdf0e10cSrcweir       OInterfaceContainerHelper* pContainer= rBHelper.getContainer( getCppuType( (uno::Reference<XDropTargetListener>* )0 ) );
560cdf0e10cSrcweir     if( pContainer)
561cdf0e10cSrcweir       {
562cdf0e10cSrcweir         OInterfaceIteratorHelper iter( *pContainer );
563cdf0e10cSrcweir         while( iter.hasMoreElements())
564cdf0e10cSrcweir           {
565cdf0e10cSrcweir               uno::Reference<XDropTargetListener> listener( static_cast<XDropTargetListener*>( iter.next()));
566cdf0e10cSrcweir 
567cdf0e10cSrcweir             try { listener->dragOver( dtde); }
568cdf0e10cSrcweir             catch (RuntimeException&) {}
569cdf0e10cSrcweir           }
570cdf0e10cSrcweir       }
571cdf0e10cSrcweir   }
572cdf0e10cSrcweir 
573cdf0e10cSrcweir 
fire_dropActionChanged(const DropTargetDragEvent & dtde)574cdf0e10cSrcweir   void DropTarget::fire_dropActionChanged(const DropTargetDragEvent& dtde)
575cdf0e10cSrcweir   {
576cdf0e10cSrcweir       OInterfaceContainerHelper* pContainer= rBHelper.getContainer( getCppuType( (uno::Reference<XDropTargetListener>* )0 ) );
577cdf0e10cSrcweir     if( pContainer)
578cdf0e10cSrcweir       {
579cdf0e10cSrcweir         OInterfaceIteratorHelper iter( *pContainer);
580cdf0e10cSrcweir         while( iter.hasMoreElements())
581cdf0e10cSrcweir           {
582cdf0e10cSrcweir               uno::Reference<XDropTargetListener> listener( static_cast<XDropTargetListener*>( iter.next()));
583cdf0e10cSrcweir 
584cdf0e10cSrcweir             try { listener->dropActionChanged( dtde); }
585cdf0e10cSrcweir             catch (RuntimeException&) {}
586cdf0e10cSrcweir           }
587cdf0e10cSrcweir       }
588cdf0e10cSrcweir   }
589cdf0e10cSrcweir 
590cdf0e10cSrcweir 
591cdf0e10cSrcweir   // XServiceInfo
592cdf0e10cSrcweir 
getImplementationName()593cdf0e10cSrcweir   OUString SAL_CALL DropTarget::getImplementationName() throw (RuntimeException)
594cdf0e10cSrcweir   {
595cdf0e10cSrcweir     return dropTarget_getImplementationName();
596cdf0e10cSrcweir   }
597cdf0e10cSrcweir 
598cdf0e10cSrcweir 
supportsService(const OUString & ServiceName)599cdf0e10cSrcweir   sal_Bool SAL_CALL DropTarget::supportsService( const OUString& ServiceName ) throw (RuntimeException)
600cdf0e10cSrcweir   {
601cdf0e10cSrcweir     return ServiceName.equals(OUString(RTL_CONSTASCII_USTRINGPARAM("com.sun.star.datatransfer.dnd.OleDropTarget")));
602cdf0e10cSrcweir   }
603cdf0e10cSrcweir 
604cdf0e10cSrcweir 
getSupportedServiceNames()605cdf0e10cSrcweir   Sequence< OUString > SAL_CALL DropTarget::getSupportedServiceNames(  ) throw (RuntimeException)
606cdf0e10cSrcweir   {
607cdf0e10cSrcweir     return dropTarget_getSupportedServiceNames();
608cdf0e10cSrcweir   }
609