1cc13e73eSYuri Dario /**************************************************************
2cc13e73eSYuri Dario *
3cc13e73eSYuri Dario * Licensed to the Apache Software Foundation (ASF) under one
4cc13e73eSYuri Dario * or more contributor license agreements. See the NOTICE file
5cc13e73eSYuri Dario * distributed with this work for additional information
6cc13e73eSYuri Dario * regarding copyright ownership. The ASF licenses this file
7cc13e73eSYuri Dario * to you under the Apache License, Version 2.0 (the
8cc13e73eSYuri Dario * "License"); you may not use this file except in compliance
9cc13e73eSYuri Dario * with the License. You may obtain a copy of the License at
10cc13e73eSYuri Dario *
11cc13e73eSYuri Dario * http://www.apache.org/licenses/LICENSE-2.0
12cc13e73eSYuri Dario *
13cc13e73eSYuri Dario * Unless required by applicable law or agreed to in writing,
14cc13e73eSYuri Dario * software distributed under the License is distributed on an
15cc13e73eSYuri Dario * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16cc13e73eSYuri Dario * KIND, either express or implied. See the License for the
17cc13e73eSYuri Dario * specific language governing permissions and limitations
18cc13e73eSYuri Dario * under the License.
19cc13e73eSYuri Dario *
20cc13e73eSYuri Dario *************************************************************/
21cc13e73eSYuri Dario
22cc13e73eSYuri Dario
23cc13e73eSYuri Dario // MARKER(update_precomp.py): autogen include statement, do not remove
24cc13e73eSYuri Dario #include "precompiled_dtrans.hxx"
25cc13e73eSYuri Dario #include <com/sun/star/datatransfer/dnd/DNDConstants.hpp>
26cc13e73eSYuri Dario #include <com/sun/star/datatransfer/XTransferable.hpp>
27cc13e73eSYuri Dario #include <rtl/ustring.h>
28cc13e73eSYuri Dario #include <cppuhelper/implbase1.hxx>
29cc13e73eSYuri Dario
30cc13e73eSYuri Dario #include <vcl/window.hxx>
31cc13e73eSYuri Dario
32cc13e73eSYuri Dario #include "globals.hxx"
33cc13e73eSYuri Dario #include "DropTarget.hxx"
34cc13e73eSYuri Dario #include "DragSource.hxx"
35cc13e73eSYuri Dario #include "OTransferable.hxx"
36cc13e73eSYuri Dario
37cc13e73eSYuri Dario
38cc13e73eSYuri Dario using namespace com::sun::star;
39cc13e73eSYuri Dario using namespace com::sun::star::io;
40cc13e73eSYuri Dario using namespace com::sun::star::datatransfer::dnd::DNDConstants;
41cc13e73eSYuri Dario
42cc13e73eSYuri Dario
DropTarget(const Reference<XMultiServiceFactory> & sf)43cc13e73eSYuri Dario DropTarget::DropTarget( const Reference<XMultiServiceFactory>& sf):
44cc13e73eSYuri Dario WeakComponentImplHelper5< XInitialization,
45cc13e73eSYuri Dario XDropTarget,
46cc13e73eSYuri Dario XDropTargetDragContext,
47cc13e73eSYuri Dario XDropTargetDropContext,
48cc13e73eSYuri Dario XServiceInfo>(m_aMutex),
49cc13e73eSYuri Dario m_serviceFactory( sf),
50cc13e73eSYuri Dario dragEnterEmulation( true),
51cc13e73eSYuri Dario mbActive(false),
52cc13e73eSYuri Dario mDragSourceSupportedActions(ACTION_NONE),
53cc13e73eSYuri Dario mSelectedDropAction(ACTION_NONE),
54cc13e73eSYuri Dario mDefaultActions(ACTION_COPY_OR_MOVE | ACTION_LINK | ACTION_DEFAULT)
55cc13e73eSYuri Dario {
56cc13e73eSYuri Dario g_moduleCount.modCnt.acquire( &g_moduleCount.modCnt );
57cc13e73eSYuri Dario }
58cc13e73eSYuri Dario
~DropTarget()59cc13e73eSYuri Dario DropTarget::~DropTarget()
60cc13e73eSYuri Dario {
61cc13e73eSYuri Dario debug_printf("DropTarget::~DropTarget");
62cc13e73eSYuri Dario
63cc13e73eSYuri Dario // This will free the previous instance if present,
64cc13e73eSYuri Dario // so it removes the tmp file
65cc13e73eSYuri Dario mXTransferable = Reference<XTransferable>();
66cc13e73eSYuri Dario
67cc13e73eSYuri Dario g_moduleCount.modCnt.release( &g_moduleCount.modCnt );
68cc13e73eSYuri Dario }
69cc13e73eSYuri Dario
initialize(const Sequence<Any> & aArguments)70cc13e73eSYuri Dario void SAL_CALL DropTarget::initialize(const Sequence< Any >& aArguments)
71cc13e73eSYuri Dario throw(Exception)
72cc13e73eSYuri Dario {
73cc13e73eSYuri Dario if (aArguments.getLength() < 2) {
74cc13e73eSYuri Dario throw RuntimeException(OUString(RTL_CONSTASCII_USTRINGPARAM("DropTarget::initialize: Cannot install window event handler")),
75cc13e73eSYuri Dario static_cast<OWeakObject*>(this));
76cc13e73eSYuri Dario }
77cc13e73eSYuri Dario
78cc13e73eSYuri Dario m_hWnd = *(HWND*) aArguments[0].getValue();
79cc13e73eSYuri Dario debug_printf("DropTarget::initialize hwnd %x", m_hWnd);
80cc13e73eSYuri Dario
81cc13e73eSYuri Dario // subclass window to allow intercepting D&D messages
82cc13e73eSYuri Dario defWndProc = WinSubclassWindow( m_hWnd, dndFrameProc);
83cc13e73eSYuri Dario SetWindowDropTargetPtr( m_hWnd, this);
84cc13e73eSYuri Dario }
85cc13e73eSYuri Dario
86cc13e73eSYuri Dario // called from WeakComponentImplHelperX::dispose
87cc13e73eSYuri Dario // WeakComponentImplHelper calls disposing before it destroys
88cc13e73eSYuri Dario // itself.
disposing()89cc13e73eSYuri Dario void SAL_CALL DropTarget::disposing()
90cc13e73eSYuri Dario {
91cc13e73eSYuri Dario debug_printf("DropTarget::disposing hwnd %x", m_hWnd);
92cc13e73eSYuri Dario
93cc13e73eSYuri Dario // revert window subclassing
94cc13e73eSYuri Dario WinSubclassWindow( m_hWnd, defWndProc);
95cc13e73eSYuri Dario defWndProc = NULL;
96cc13e73eSYuri Dario SetWindowDropTargetPtr( m_hWnd, 0);
97cc13e73eSYuri Dario }
98cc13e73eSYuri Dario
addDropTargetListener(const uno::Reference<XDropTargetListener> & dtl)99cc13e73eSYuri Dario void SAL_CALL DropTarget::addDropTargetListener(const uno::Reference<XDropTargetListener>& dtl)
100cc13e73eSYuri Dario throw(RuntimeException)
101cc13e73eSYuri Dario {
102cc13e73eSYuri Dario debug_printf("DropTarget::addDropTargetListener hwnd %x", m_hWnd);
103cc13e73eSYuri Dario rBHelper.addListener(::getCppuType(&dtl), dtl);
104cc13e73eSYuri Dario }
105cc13e73eSYuri Dario
removeDropTargetListener(const uno::Reference<XDropTargetListener> & dtl)106cc13e73eSYuri Dario void SAL_CALL DropTarget::removeDropTargetListener(const uno::Reference<XDropTargetListener>& dtl)
107cc13e73eSYuri Dario throw(RuntimeException)
108cc13e73eSYuri Dario {
109cc13e73eSYuri Dario debug_printf("DropTarget::removeDropTargetListener hwnd %x", m_hWnd);
110cc13e73eSYuri Dario rBHelper.removeListener(::getCppuType(&dtl), dtl);
111cc13e73eSYuri Dario }
112cc13e73eSYuri Dario
isActive()113cc13e73eSYuri Dario sal_Bool SAL_CALL DropTarget::isActive( ) throw(RuntimeException)
114cc13e73eSYuri Dario {
115cc13e73eSYuri Dario debug_printf("DropTarget::isActive %d", mbActive);
116cc13e73eSYuri Dario return mbActive;
117cc13e73eSYuri Dario }
118cc13e73eSYuri Dario
setActive(sal_Bool active)119cc13e73eSYuri Dario void SAL_CALL DropTarget::setActive(sal_Bool active) throw(RuntimeException)
120cc13e73eSYuri Dario {
121cc13e73eSYuri Dario debug_printf("DropTarget::setActive %d", active);
122cc13e73eSYuri Dario mbActive = active;
123cc13e73eSYuri Dario }
124cc13e73eSYuri Dario
getDefaultActions()125cc13e73eSYuri Dario sal_Int8 SAL_CALL DropTarget::getDefaultActions() throw(RuntimeException)
126cc13e73eSYuri Dario {
127cc13e73eSYuri Dario debug_printf("DropTarget::getDefaultActions %d", mDefaultActions);
128cc13e73eSYuri Dario return mDefaultActions;
129cc13e73eSYuri Dario }
130cc13e73eSYuri Dario
setDefaultActions(sal_Int8 actions)131cc13e73eSYuri Dario void SAL_CALL DropTarget::setDefaultActions(sal_Int8 actions) throw(RuntimeException)
132cc13e73eSYuri Dario {
133cc13e73eSYuri Dario OSL_ENSURE( actions < 8, "No valid default actions");
134cc13e73eSYuri Dario mDefaultActions= actions;
135cc13e73eSYuri Dario }
136cc13e73eSYuri Dario
137cc13e73eSYuri Dario //
138cc13e73eSYuri Dario // XDropTargetDragContext
139cc13e73eSYuri Dario //
140cc13e73eSYuri Dario // Non - interface functions ============================================================
141cc13e73eSYuri Dario // DropTarget fires events to XDropTargetListeners. The event object can contains an
142*7670ab77SJohn Bampton // XDropTargetDragContext implementation. When the listener calls on that interface
143cc13e73eSYuri Dario // then the calls are delegated from DragContext (XDropTargetDragContext) to these
144cc13e73eSYuri Dario // functions.
145cc13e73eSYuri Dario // Only one listener which visible area is affected is allowed to call on
146cc13e73eSYuri Dario // XDropTargetDragContext
147cc13e73eSYuri Dario
acceptDrag(sal_Int8 dragOperation)148cc13e73eSYuri Dario void SAL_CALL DropTarget::acceptDrag(sal_Int8 dragOperation) throw (RuntimeException)
149cc13e73eSYuri Dario {
150cc13e73eSYuri Dario debug_printf("DropTarget::acceptDrag hwnd %x, dragOperation %d", m_hWnd, dragOperation);
151cc13e73eSYuri Dario mSelectedDropAction = dragOperation;
152cc13e73eSYuri Dario }
153cc13e73eSYuri Dario
rejectDrag()154cc13e73eSYuri Dario void SAL_CALL DropTarget::rejectDrag() throw (RuntimeException)
155cc13e73eSYuri Dario {
156cc13e73eSYuri Dario debug_printf("DropTarget::rejectDrag hwnd %x", m_hWnd);
157cc13e73eSYuri Dario mSelectedDropAction = ACTION_NONE;
158cc13e73eSYuri Dario }
159cc13e73eSYuri Dario
160cc13e73eSYuri Dario //
161cc13e73eSYuri Dario // XDropTargetDropContext
162cc13e73eSYuri Dario //
163cc13e73eSYuri Dario // Non - interface functions ============================================================
164cc13e73eSYuri Dario // DropTarget fires events to XDropTargetListeners. The event object contains an
165*7670ab77SJohn Bampton // XDropTargetDropContext implementation. When the listener calls on that interface
166cc13e73eSYuri Dario // then the calls are delegated from DropContext (XDropTargetDropContext) to these
167cc13e73eSYuri Dario // functions.
168cc13e73eSYuri Dario // Only one listener which visible area is affected is allowed to call on
169cc13e73eSYuri Dario // XDropTargetDropContext
170cc13e73eSYuri Dario // Returning sal_False would cause the XDropTargetDropContext or ..DragContext implementation
171cc13e73eSYuri Dario // to throw an InvalidDNDOperationException, meaning that a Drag is not currently performed.
172cc13e73eSYuri Dario // return sal_False results in throwing a InvalidDNDOperationException in the caller.
173cc13e73eSYuri Dario //
acceptDrop(sal_Int8 dropOperation)174cc13e73eSYuri Dario void SAL_CALL DropTarget::acceptDrop(sal_Int8 dropOperation) throw( RuntimeException)
175cc13e73eSYuri Dario {
176cc13e73eSYuri Dario debug_printf("DropTarget::acceptDrop hwnd %x, dragOperation %d", m_hWnd, dropOperation);
177cc13e73eSYuri Dario mSelectedDropAction = dropOperation;
178cc13e73eSYuri Dario }
179cc13e73eSYuri Dario
rejectDrop()180cc13e73eSYuri Dario void SAL_CALL DropTarget::rejectDrop() throw (RuntimeException)
181cc13e73eSYuri Dario {
182cc13e73eSYuri Dario debug_printf("DropTarget::rejectDrop hwnd %x", m_hWnd);
183cc13e73eSYuri Dario mSelectedDropAction = ACTION_NONE;
184cc13e73eSYuri Dario }
185cc13e73eSYuri Dario
dropComplete(sal_Bool success)186cc13e73eSYuri Dario void SAL_CALL DropTarget::dropComplete(sal_Bool success) throw (RuntimeException)
187cc13e73eSYuri Dario {
188cc13e73eSYuri Dario debug_printf("DropTarget::dropComplete hwnd %x", m_hWnd);
189cc13e73eSYuri Dario
190cc13e73eSYuri Dario // reset action flags
191cc13e73eSYuri Dario mDragSourceSupportedActions = ACTION_NONE;
192cc13e73eSYuri Dario mSelectedDropAction = ACTION_NONE;
193cc13e73eSYuri Dario // enable drag enter emulation again
194cc13e73eSYuri Dario dragEnterEmulation = true;
195cc13e73eSYuri Dario // free local transferable list on next d&d or destruction
196cc13e73eSYuri Dario
197cc13e73eSYuri Dario // post a dummy message to source window to allow DragSource
198cc13e73eSYuri Dario // release resources and close internal d&d
199cc13e73eSYuri Dario if (DragSource::g_DragSourceHwnd != NULLHANDLE) {
200cc13e73eSYuri Dario debug_printf("DropTarget::renderComplete post DM_AOO_ENDCONVERSATION to source");
201cc13e73eSYuri Dario WinPostMsg( DragSource::g_DragSourceHwnd, DM_AOO_ENDCONVERSATION, 0,
202cc13e73eSYuri Dario MPFROMSHORT(success ? DMFL_TARGETSUCCESSFUL : DMFL_TARGETFAIL));
203cc13e73eSYuri Dario }
204cc13e73eSYuri Dario
205cc13e73eSYuri Dario }
206cc13e73eSYuri Dario
207cc13e73eSYuri Dario //
208cc13e73eSYuri Dario // XServiceInfo
209cc13e73eSYuri Dario //
getImplementationName()210cc13e73eSYuri Dario OUString SAL_CALL DropTarget::getImplementationName() throw (RuntimeException)
211cc13e73eSYuri Dario {
21294f40e84Smseidel return OUString(RTL_CONSTASCII_USTRINGPARAM(OS2_DNDTARGET_IMPL_NAME));
213cc13e73eSYuri Dario }
214cc13e73eSYuri Dario
supportsService(const OUString & ServiceName)215cc13e73eSYuri Dario sal_Bool SAL_CALL DropTarget::supportsService( const OUString& ServiceName ) throw (RuntimeException)
216cc13e73eSYuri Dario {
217cc13e73eSYuri Dario return ServiceName.equals(OUString(RTL_CONSTASCII_USTRINGPARAM( OS2_DNDTARGET_SERVICE_NAME)));
218cc13e73eSYuri Dario }
219cc13e73eSYuri Dario
getSupportedServiceNames()220cc13e73eSYuri Dario Sequence< OUString > SAL_CALL DropTarget::getSupportedServiceNames( ) throw (RuntimeException)
221cc13e73eSYuri Dario {
222cc13e73eSYuri Dario OUString names[1]= {OUString(RTL_CONSTASCII_USTRINGPARAM( OS2_DNDTARGET_SERVICE_NAME))};
223cc13e73eSYuri Dario return Sequence<OUString>(names, 1);
224cc13e73eSYuri Dario }
225cc13e73eSYuri Dario
226cc13e73eSYuri Dario //
227cc13e73eSYuri Dario // AOO private interface events
228cc13e73eSYuri Dario //
fire_drop(const DropTargetDropEvent & dte)229cc13e73eSYuri Dario void DropTarget::fire_drop( const DropTargetDropEvent& dte)
230cc13e73eSYuri Dario {
231cc13e73eSYuri Dario OInterfaceContainerHelper* pContainer= rBHelper.getContainer( getCppuType( (uno::Reference<XDropTargetListener>* )0 ) );
232cc13e73eSYuri Dario if( pContainer)
233cc13e73eSYuri Dario {
234cc13e73eSYuri Dario OInterfaceIteratorHelper iter( *pContainer);
235cc13e73eSYuri Dario while( iter.hasMoreElements())
236cc13e73eSYuri Dario {
237cc13e73eSYuri Dario uno::Reference<XDropTargetListener> listener( static_cast<XDropTargetListener*>( iter.next()));
238cc13e73eSYuri Dario
239cc13e73eSYuri Dario try { listener->drop( dte); }
240cc13e73eSYuri Dario catch(RuntimeException&) {}
241cc13e73eSYuri Dario }
242cc13e73eSYuri Dario }
243cc13e73eSYuri Dario debug_printf("DropTarget::fire_drop fired");
244cc13e73eSYuri Dario }
245cc13e73eSYuri Dario
fire_dragEnter(const DropTargetDragEnterEvent & e)246cc13e73eSYuri Dario void DropTarget::fire_dragEnter(const DropTargetDragEnterEvent& e)
247cc13e73eSYuri Dario {
248cc13e73eSYuri Dario OInterfaceContainerHelper* pContainer= rBHelper.getContainer( getCppuType( (uno::Reference<XDropTargetListener>* )0 ) );
249cc13e73eSYuri Dario if( pContainer)
250cc13e73eSYuri Dario {
251cc13e73eSYuri Dario OInterfaceIteratorHelper iter( *pContainer);
252cc13e73eSYuri Dario while( iter.hasMoreElements())
253cc13e73eSYuri Dario {
254cc13e73eSYuri Dario uno::Reference<XDropTargetListener> listener( static_cast<XDropTargetListener*>( iter.next()));
255cc13e73eSYuri Dario
256cc13e73eSYuri Dario try { listener->dragEnter( e); }
257cc13e73eSYuri Dario catch (RuntimeException&) {}
258cc13e73eSYuri Dario }
259cc13e73eSYuri Dario }
260cc13e73eSYuri Dario debug_printf("DropTarget::fire_dragEnter fired");
261cc13e73eSYuri Dario }
262cc13e73eSYuri Dario
fire_dragExit(const DropTargetEvent & dte)263cc13e73eSYuri Dario void DropTarget::fire_dragExit(const DropTargetEvent& dte)
264cc13e73eSYuri Dario {
265cc13e73eSYuri Dario OInterfaceContainerHelper* pContainer= rBHelper.getContainer( getCppuType( (uno::Reference<XDropTargetListener>* )0 ) );
266cc13e73eSYuri Dario
267cc13e73eSYuri Dario if( pContainer)
268cc13e73eSYuri Dario {
269cc13e73eSYuri Dario OInterfaceIteratorHelper iter( *pContainer);
270cc13e73eSYuri Dario while( iter.hasMoreElements())
271cc13e73eSYuri Dario {
272cc13e73eSYuri Dario uno::Reference<XDropTargetListener> listener( static_cast<XDropTargetListener*>( iter.next()));
273cc13e73eSYuri Dario
274cc13e73eSYuri Dario try { listener->dragExit( dte); }
275cc13e73eSYuri Dario catch (RuntimeException&) {}
276cc13e73eSYuri Dario }
277cc13e73eSYuri Dario }
278cc13e73eSYuri Dario debug_printf("DropTarget::fire_dragExit fired");
279cc13e73eSYuri Dario }
280cc13e73eSYuri Dario
fire_dragOver(const DropTargetDragEvent & dtde)281cc13e73eSYuri Dario void DropTarget::fire_dragOver(const DropTargetDragEvent& dtde)
282cc13e73eSYuri Dario {
283cc13e73eSYuri Dario OInterfaceContainerHelper* pContainer= rBHelper.getContainer( getCppuType( (uno::Reference<XDropTargetListener>* )0 ) );
284cc13e73eSYuri Dario if( pContainer)
285cc13e73eSYuri Dario {
286cc13e73eSYuri Dario OInterfaceIteratorHelper iter( *pContainer );
287cc13e73eSYuri Dario while( iter.hasMoreElements())
288cc13e73eSYuri Dario {
289cc13e73eSYuri Dario uno::Reference<XDropTargetListener> listener( static_cast<XDropTargetListener*>( iter.next()));
290cc13e73eSYuri Dario
291cc13e73eSYuri Dario try { listener->dragOver( dtde); }
292cc13e73eSYuri Dario catch (RuntimeException&) {}
293cc13e73eSYuri Dario }
294cc13e73eSYuri Dario }
295cc13e73eSYuri Dario debug_printf("DropTarget::fire_dragOver fired");
296cc13e73eSYuri Dario }
297cc13e73eSYuri Dario
fire_dropActionChanged(const DropTargetDragEvent & dtde)298cc13e73eSYuri Dario void DropTarget::fire_dropActionChanged(const DropTargetDragEvent& dtde)
299cc13e73eSYuri Dario {
300cc13e73eSYuri Dario OInterfaceContainerHelper* pContainer= rBHelper.getContainer( getCppuType( (uno::Reference<XDropTargetListener>* )0 ) );
301cc13e73eSYuri Dario if( pContainer)
302cc13e73eSYuri Dario {
303cc13e73eSYuri Dario OInterfaceIteratorHelper iter( *pContainer);
304cc13e73eSYuri Dario while( iter.hasMoreElements())
305cc13e73eSYuri Dario {
306cc13e73eSYuri Dario uno::Reference<XDropTargetListener> listener( static_cast<XDropTargetListener*>( iter.next()));
307cc13e73eSYuri Dario
308cc13e73eSYuri Dario try { listener->dropActionChanged( dtde); }
309cc13e73eSYuri Dario catch (RuntimeException&) {}
310cc13e73eSYuri Dario }
311cc13e73eSYuri Dario }
312cc13e73eSYuri Dario debug_printf("DropTarget::fire_dropActionChanged fired");
313cc13e73eSYuri Dario }
314cc13e73eSYuri Dario
315cc13e73eSYuri Dario //
316cc13e73eSYuri Dario // OS/2 specific platform code
317cc13e73eSYuri Dario //
318cc13e73eSYuri Dario
dragEnter(PDRAGINFO dragInfo)319cc13e73eSYuri Dario MRESULT DropTarget::dragEnter( PDRAGINFO dragInfo)
320cc13e73eSYuri Dario {
321cc13e73eSYuri Dario debug_printf("DropTarget::dragEnter start hwnd 0x%x", m_hWnd);
322cc13e73eSYuri Dario
323cc13e73eSYuri Dario // disable drag enter emulation until next DM_DRAGLEAVE
324cc13e73eSYuri Dario dragEnterEmulation = false;
325cc13e73eSYuri Dario
326cc13e73eSYuri Dario // Get access to the DRAGINFO data structure
327cc13e73eSYuri Dario DrgAccessDraginfo( dragInfo);
328cc13e73eSYuri Dario
329cc13e73eSYuri Dario // Initially when DnD will be started no modifier key can be pressed yet
330cc13e73eSYuri Dario // thus we are getting all actions that the drag source supports, we save
331cc13e73eSYuri Dario // this value because later the system masks the drag source actions if
332cc13e73eSYuri Dario // a modifier key will be pressed
333cc13e73eSYuri Dario mDragSourceSupportedActions =
334cc13e73eSYuri Dario SystemToOfficeDragActions( dragInfo->usOperation);
335cc13e73eSYuri Dario
336cc13e73eSYuri Dario // Only if the drop target is really interested in the drag actions
337cc13e73eSYuri Dario // supported by the source
338cc13e73eSYuri Dario if (mDragSourceSupportedActions & mDefaultActions) {
339cc13e73eSYuri Dario
340cc13e73eSYuri Dario //sal_Int8 currentAction = determineDropAction(mDragSourceSupportedActions, sender);
341cc13e73eSYuri Dario sal_Int8 currentAction = mDragSourceSupportedActions;
342cc13e73eSYuri Dario
343cc13e73eSYuri Dario // map from desktop to client window
344cc13e73eSYuri Dario MapWindowPoint( m_hWnd, dragInfo, &ptlMouse);
345cc13e73eSYuri Dario
346cc13e73eSYuri Dario // This will free the previous instance if present,
347cc13e73eSYuri Dario // so it removes the tmp file
348cc13e73eSYuri Dario mXTransferable = Reference<XTransferable>();
349cc13e73eSYuri Dario
350cc13e73eSYuri Dario // if g_XTransferable is empty this is an external drop operation,
351cc13e73eSYuri Dario // create a new transferable set
352cc13e73eSYuri Dario mXTransferable = DragSource::g_XTransferable;
353cc13e73eSYuri Dario if (!mXTransferable.is()) {
354cc13e73eSYuri Dario mXTransferable =
355cc13e73eSYuri Dario //new OTransferable( OUString::createFromAscii( "TestString" ) );
356cc13e73eSYuri Dario new OTransferable( m_hWnd, dragInfo);
357cc13e73eSYuri Dario }
358cc13e73eSYuri Dario
359cc13e73eSYuri Dario #if 1
360cc13e73eSYuri Dario // dump data flavours
361cc13e73eSYuri Dario Sequence<DataFlavor> seq = mXTransferable->getTransferDataFlavors();
362cc13e73eSYuri Dario for( int i=0; i<seq.getLength(); i++) {
363cc13e73eSYuri Dario DataFlavor df = seq[i];
364cc13e73eSYuri Dario debug_printf("DropTarget::dragEnter mimetype %s",
365cc13e73eSYuri Dario ::rtl::OUStringToOString( df.MimeType, RTL_TEXTENCODING_UTF8 ).getStr());
366cc13e73eSYuri Dario }
367cc13e73eSYuri Dario #endif
368cc13e73eSYuri Dario
369cc13e73eSYuri Dario debug_printf("DropTarget::dragEnter (%dx%d) mDragSourceSupportedActions %d",
370cc13e73eSYuri Dario ptlMouse.x, ptlMouse.y,
371cc13e73eSYuri Dario mDragSourceSupportedActions);
372cc13e73eSYuri Dario
373cc13e73eSYuri Dario DropTargetDragEnterEvent dtdee(static_cast<OWeakObject*>(this),
374cc13e73eSYuri Dario 0, this, currentAction,
375cc13e73eSYuri Dario ptlMouse.x, ptlMouse.y,
376cc13e73eSYuri Dario mDragSourceSupportedActions,
377cc13e73eSYuri Dario mXTransferable->getTransferDataFlavors());
378cc13e73eSYuri Dario fire_dragEnter(dtdee);
379cc13e73eSYuri Dario }
380cc13e73eSYuri Dario
381cc13e73eSYuri Dario // Release the draginfo data structure
382cc13e73eSYuri Dario DrgFreeDraginfo(dragInfo);
383cc13e73eSYuri Dario
384cc13e73eSYuri Dario return OfficeToSystemDragActions( mSelectedDropAction);
385cc13e73eSYuri Dario }
386cc13e73eSYuri Dario
dragOver(PDRAGINFO dragInfo)387cc13e73eSYuri Dario MRESULT DropTarget::dragOver( PDRAGINFO dragInfo)
388cc13e73eSYuri Dario {
389cc13e73eSYuri Dario MRESULT dragOp = MRFROM2SHORT( DOR_NODROPOP, 0);
390cc13e73eSYuri Dario
391cc13e73eSYuri Dario if (dragEnterEmulation)
392cc13e73eSYuri Dario return dragEnter( dragInfo);
393cc13e73eSYuri Dario
394cc13e73eSYuri Dario // Get access to the DRAGINFO data structure
395cc13e73eSYuri Dario DrgAccessDraginfo( dragInfo);
396cc13e73eSYuri Dario
397cc13e73eSYuri Dario sal_Int8 currentDragSourceActions =
398cc13e73eSYuri Dario SystemToOfficeDragActions( dragInfo->usOperation);
399cc13e73eSYuri Dario
400cc13e73eSYuri Dario // Only if the drop target is really interessted in the drag actions
401cc13e73eSYuri Dario // supported by the source
402cc13e73eSYuri Dario if (currentDragSourceActions & mDefaultActions) {
403cc13e73eSYuri Dario //sal_Int8 currentAction = determineDropAction(mDragSourceSupportedActions, sender);
404cc13e73eSYuri Dario sal_Int8 currentAction = currentDragSourceActions;
405cc13e73eSYuri Dario
406cc13e73eSYuri Dario // map from desktop to client window
407cc13e73eSYuri Dario MapWindowPoint( m_hWnd, dragInfo, &ptlMouse);
408cc13e73eSYuri Dario
409cc13e73eSYuri Dario DropTargetDragEvent dtde(static_cast<OWeakObject*>(this),
410cc13e73eSYuri Dario 0, this, currentAction,
411cc13e73eSYuri Dario ptlMouse.x, ptlMouse.y,
412cc13e73eSYuri Dario mDragSourceSupportedActions);
413cc13e73eSYuri Dario // firing the event will result in a XDropTargetDragContext event
414cc13e73eSYuri Dario fire_dragOver(dtde);
415cc13e73eSYuri Dario
416cc13e73eSYuri Dario dragOp = OfficeToSystemDragActions(mSelectedDropAction);
417cc13e73eSYuri Dario }
418cc13e73eSYuri Dario
419cc13e73eSYuri Dario // Release the draginfo data structure
420cc13e73eSYuri Dario DrgFreeDraginfo(dragInfo);
421cc13e73eSYuri Dario return dragOp;
422cc13e73eSYuri Dario }
423cc13e73eSYuri Dario
dragLeave(PDRAGINFO)424cc13e73eSYuri Dario MRESULT DropTarget::dragLeave( PDRAGINFO /* dragInfo */)
425cc13e73eSYuri Dario {
426cc13e73eSYuri Dario debug_printf("DropTarget::dragLeave");
427cc13e73eSYuri Dario
428cc13e73eSYuri Dario DropTargetEvent dte(static_cast<OWeakObject*>(this), 0);
429cc13e73eSYuri Dario fire_dragExit(dte);
430cc13e73eSYuri Dario
431cc13e73eSYuri Dario // reset action flags
432cc13e73eSYuri Dario mDragSourceSupportedActions = ACTION_NONE;
433cc13e73eSYuri Dario mSelectedDropAction = ACTION_NONE;
434cc13e73eSYuri Dario // enable drag enter emulation again
435cc13e73eSYuri Dario dragEnterEmulation = true;
436cc13e73eSYuri Dario // free local transferable list on next d&d or destruction
437cc13e73eSYuri Dario
438cc13e73eSYuri Dario return 0;
439cc13e73eSYuri Dario }
440cc13e73eSYuri Dario
drop(PDRAGINFO dragInfo)441cc13e73eSYuri Dario MRESULT DropTarget::drop( PDRAGINFO dragInfo)
442cc13e73eSYuri Dario {
443cc13e73eSYuri Dario debug_printf("DropTarget::drop");
444cc13e73eSYuri Dario
445cc13e73eSYuri Dario // Get access to the DRAGINFO data structure
446cc13e73eSYuri Dario DrgAccessDraginfo( dragInfo);
447cc13e73eSYuri Dario
448cc13e73eSYuri Dario MRESULT dropOp = MRFROM2SHORT( DOR_NODROPOP, 0);
449cc13e73eSYuri Dario
450cc13e73eSYuri Dario if (mSelectedDropAction != ACTION_NONE) {
451cc13e73eSYuri Dario
452cc13e73eSYuri Dario bool rr = false;
453cc13e73eSYuri Dario
454cc13e73eSYuri Dario // map from desktop to client window
455cc13e73eSYuri Dario MapWindowPoint( m_hWnd, dragInfo, &ptlMouse);
456cc13e73eSYuri Dario
457cc13e73eSYuri Dario // if external d&d, request rendering
458cc13e73eSYuri Dario OTransferable* ot = dynamic_cast<OTransferable*>(mXTransferable.get());
459cc13e73eSYuri Dario if (ot != NULL) {
460cc13e73eSYuri Dario // request rendering, if operation is already possible it
461cc13e73eSYuri Dario // will return false
462cc13e73eSYuri Dario rr = ot->requestRendering();
463cc13e73eSYuri Dario debug_printf("DropTarget::drop requestRendering=%d", rr);
464cc13e73eSYuri Dario }
465cc13e73eSYuri Dario
466cc13e73eSYuri Dario // no rendering requested, post a DM_RENDERCOMPLETE to ourselves
467cc13e73eSYuri Dario // to fire AOO drop event
468cc13e73eSYuri Dario if (rr == false)
469cc13e73eSYuri Dario WinPostMsg( m_hWnd, DM_RENDERCOMPLETE, 0, 0);
470cc13e73eSYuri Dario
471cc13e73eSYuri Dario dropOp = OfficeToSystemDragActions(mSelectedDropAction);
472cc13e73eSYuri Dario }
473cc13e73eSYuri Dario
474cc13e73eSYuri Dario // Release the draginfo data structure
475cc13e73eSYuri Dario DrgFreeDraginfo(dragInfo);
476cc13e73eSYuri Dario
477cc13e73eSYuri Dario return dropOp;
478cc13e73eSYuri Dario
479cc13e73eSYuri Dario }
480cc13e73eSYuri Dario
renderComplete(PDRAGTRANSFER dragTransfer)481cc13e73eSYuri Dario MRESULT DropTarget::renderComplete( PDRAGTRANSFER dragTransfer)
482cc13e73eSYuri Dario {
483cc13e73eSYuri Dario debug_printf("DropTarget::renderComplete dragTransfer 0x%x", dragTransfer);
484cc13e73eSYuri Dario
485cc13e73eSYuri Dario if (dragTransfer != NULL) {
486cc13e73eSYuri Dario OTransferable* ot = dynamic_cast<OTransferable*>(mXTransferable.get());
487cc13e73eSYuri Dario // DM_RENDERCOMPLETE cannot be received in internal AOO d&d
488cc13e73eSYuri Dario if (ot == NULL) {
489cc13e73eSYuri Dario debug_printf("DropTarget::renderComplete INTERNAL ERROR null dragtransfer");
490cc13e73eSYuri Dario return 0;
491cc13e73eSYuri Dario }
492cc13e73eSYuri Dario
493cc13e73eSYuri Dario // set rendered data
494cc13e73eSYuri Dario ot->renderComplete( dragTransfer);
495cc13e73eSYuri Dario }
496cc13e73eSYuri Dario
497cc13e73eSYuri Dario debug_printf("DropTarget::renderComplete mXTransferable.is() %d", mXTransferable.is());
498cc13e73eSYuri Dario
499cc13e73eSYuri Dario // complete AOO drop event, this will make AOO call
500cc13e73eSYuri Dario // XTransferable::getTransferData() for external ops,
501cc13e73eSYuri Dario // then acceptDrop(), dropComplete() are called from listeners
502cc13e73eSYuri Dario DropTargetDropEvent dtde( static_cast<OWeakObject*>(this),
503cc13e73eSYuri Dario 0, this, mSelectedDropAction,
504cc13e73eSYuri Dario ptlMouse.x, ptlMouse.y,
505cc13e73eSYuri Dario mDragSourceSupportedActions,
506cc13e73eSYuri Dario mXTransferable);
507cc13e73eSYuri Dario fire_drop(dtde);
508cc13e73eSYuri Dario
509cc13e73eSYuri Dario // Reserved value, should be 0
510cc13e73eSYuri Dario return 0;
511cc13e73eSYuri Dario }
512