1*cc13e73eSYuri Dario /**************************************************************
2*cc13e73eSYuri Dario *
3*cc13e73eSYuri Dario * Licensed to the Apache Software Foundation (ASF) under one
4*cc13e73eSYuri Dario * or more contributor license agreements. See the NOTICE file
5*cc13e73eSYuri Dario * distributed with this work for additional information
6*cc13e73eSYuri Dario * regarding copyright ownership. The ASF licenses this file
7*cc13e73eSYuri Dario * to you under the Apache License, Version 2.0 (the
8*cc13e73eSYuri Dario * "License"); you may not use this file except in compliance
9*cc13e73eSYuri Dario * with the License. You may obtain a copy of the License at
10*cc13e73eSYuri Dario *
11*cc13e73eSYuri Dario * http://www.apache.org/licenses/LICENSE-2.0
12*cc13e73eSYuri Dario *
13*cc13e73eSYuri Dario * Unless required by applicable law or agreed to in writing,
14*cc13e73eSYuri Dario * software distributed under the License is distributed on an
15*cc13e73eSYuri Dario * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*cc13e73eSYuri Dario * KIND, either express or implied. See the License for the
17*cc13e73eSYuri Dario * specific language governing permissions and limitations
18*cc13e73eSYuri Dario * under the License.
19*cc13e73eSYuri Dario *
20*cc13e73eSYuri Dario *************************************************************/
21*cc13e73eSYuri Dario
22*cc13e73eSYuri Dario
23*cc13e73eSYuri Dario // MARKER(update_precomp.py): autogen include statement, do not remove
24*cc13e73eSYuri Dario #include "precompiled_dtrans.hxx"
25*cc13e73eSYuri Dario
26*cc13e73eSYuri Dario #include <com/sun/star/datatransfer/dnd/DNDConstants.hpp>
27*cc13e73eSYuri Dario
28*cc13e73eSYuri Dario #include "globals.hxx"
29*cc13e73eSYuri Dario #include "DragSource.hxx"
30*cc13e73eSYuri Dario #include "DropTarget.hxx"
31*cc13e73eSYuri Dario
32*cc13e73eSYuri Dario using namespace com::sun::star::datatransfer::dnd::DNDConstants;
33*cc13e73eSYuri Dario
34*cc13e73eSYuri Dario //
35*cc13e73eSYuri Dario // Convert office drag actions as defined in
36*cc13e73eSYuri Dario // <type>com::sun::star::datatransfer::dnd::DNDConstants</type>
37*cc13e73eSYuri Dario // into system conform drag actions.
38*cc13e73eSYuri Dario //
OfficeToSystemDragActions(sal_Int8 dragActions)39*cc13e73eSYuri Dario MRESULT OfficeToSystemDragActions( sal_Int8 dragActions)
40*cc13e73eSYuri Dario {
41*cc13e73eSYuri Dario MRESULT actions = MRFROM2SHORT( DOR_NODROP, 0);
42*cc13e73eSYuri Dario
43*cc13e73eSYuri Dario if (dragActions & ACTION_COPY)
44*cc13e73eSYuri Dario {
45*cc13e73eSYuri Dario actions = MRFROM2SHORT( DOR_DROP, DO_COPY);
46*cc13e73eSYuri Dario }
47*cc13e73eSYuri Dario
48*cc13e73eSYuri Dario if (dragActions & ACTION_MOVE)
49*cc13e73eSYuri Dario {
50*cc13e73eSYuri Dario actions = MRFROM2SHORT( DOR_DROP, DO_MOVE);
51*cc13e73eSYuri Dario }
52*cc13e73eSYuri Dario
53*cc13e73eSYuri Dario if (dragActions & ACTION_LINK)
54*cc13e73eSYuri Dario {
55*cc13e73eSYuri Dario actions = MRFROM2SHORT( DOR_DROP, DO_LINK);
56*cc13e73eSYuri Dario }
57*cc13e73eSYuri Dario
58*cc13e73eSYuri Dario debug_printf("OfficeToSystemDragActions %d->0x%x", dragActions, actions);
59*cc13e73eSYuri Dario return actions;
60*cc13e73eSYuri Dario }
61*cc13e73eSYuri Dario
62*cc13e73eSYuri Dario //
63*cc13e73eSYuri Dario // Convert system conform drag actions into office conform
64*cc13e73eSYuri Dario // drag actions as defined in
65*cc13e73eSYuri Dario // <type>com::sun::star::datatransfer::dnd::DNDConstants</type>.
66*cc13e73eSYuri Dario //
SystemToOfficeDragActions(USHORT usOperation)67*cc13e73eSYuri Dario sal_Int8 SystemToOfficeDragActions( USHORT usOperation)
68*cc13e73eSYuri Dario {
69*cc13e73eSYuri Dario sal_Int8 actions = ACTION_NONE;
70*cc13e73eSYuri Dario
71*cc13e73eSYuri Dario switch( usOperation) {
72*cc13e73eSYuri Dario case DO_UNKNOWN:
73*cc13e73eSYuri Dario break;
74*cc13e73eSYuri Dario case DO_DEFAULT:
75*cc13e73eSYuri Dario actions |= ACTION_MOVE;
76*cc13e73eSYuri Dario break;
77*cc13e73eSYuri Dario case DO_MOVE:
78*cc13e73eSYuri Dario actions |= ACTION_MOVE;
79*cc13e73eSYuri Dario break;
80*cc13e73eSYuri Dario case DO_COPY:
81*cc13e73eSYuri Dario actions |= ACTION_COPY;
82*cc13e73eSYuri Dario break;
83*cc13e73eSYuri Dario case DO_LINK:
84*cc13e73eSYuri Dario actions |= ACTION_LINK;
85*cc13e73eSYuri Dario break;
86*cc13e73eSYuri Dario }
87*cc13e73eSYuri Dario
88*cc13e73eSYuri Dario debug_printf("SystemToOfficeDragActions 0x%x->%d", usOperation, actions);
89*cc13e73eSYuri Dario return actions;
90*cc13e73eSYuri Dario }
91*cc13e73eSYuri Dario
92*cc13e73eSYuri Dario
93*cc13e73eSYuri Dario //
94*cc13e73eSYuri Dario // functions used by dnd.dll to get access to Window class data fields
95*cc13e73eSYuri Dario // in the subclassed window procedure
96*cc13e73eSYuri Dario //
97*cc13e73eSYuri Dario
98*cc13e73eSYuri Dario // Store DropTarget object reference
SetWindowDropTargetPtr(HWND hWnd,void * dropTarget)99*cc13e73eSYuri Dario void SetWindowDropTargetPtr( HWND hWnd, void* dropTarget )
100*cc13e73eSYuri Dario {
101*cc13e73eSYuri Dario WinSetWindowULong( hWnd, SAL_FRAME_DROPTARGET, (ULONG)dropTarget);
102*cc13e73eSYuri Dario }
103*cc13e73eSYuri Dario
104*cc13e73eSYuri Dario // Get DropTarget object reference
GetWindowDropTargetPtr(HWND hWnd)105*cc13e73eSYuri Dario void* GetWindowDropTargetPtr( HWND hWnd )
106*cc13e73eSYuri Dario {
107*cc13e73eSYuri Dario return (void*)WinQueryWindowULong( hWnd, SAL_FRAME_DROPTARGET);
108*cc13e73eSYuri Dario }
109*cc13e73eSYuri Dario
110*cc13e73eSYuri Dario // Store DragSource object reference
SetWindowDragSourcePtr(HWND hWnd,void * dragSource)111*cc13e73eSYuri Dario void SetWindowDragSourcePtr( HWND hWnd, void* dragSource )
112*cc13e73eSYuri Dario {
113*cc13e73eSYuri Dario WinSetWindowULong( hWnd, SAL_FRAME_DRAGSOURCE, (ULONG)dragSource);
114*cc13e73eSYuri Dario }
115*cc13e73eSYuri Dario
116*cc13e73eSYuri Dario // Get DropTarget object reference
GetWindowDragSourcePtr(HWND hWnd)117*cc13e73eSYuri Dario void* GetWindowDragSourcePtr( HWND hWnd )
118*cc13e73eSYuri Dario {
119*cc13e73eSYuri Dario return (void*)WinQueryWindowULong( hWnd, SAL_FRAME_DRAGSOURCE);
120*cc13e73eSYuri Dario }
121*cc13e73eSYuri Dario
122*cc13e73eSYuri Dario // map desktop coordinates of mouse pointer to local window
123*cc13e73eSYuri Dario // inverting also the y axis
MapWindowPoint(HWND hwnd,PDRAGINFO dragInfo,PPOINTL ptlMouse)124*cc13e73eSYuri Dario void MapWindowPoint( HWND hwnd, PDRAGINFO dragInfo, PPOINTL ptlMouse)
125*cc13e73eSYuri Dario {
126*cc13e73eSYuri Dario RECTL rclClient;
127*cc13e73eSYuri Dario ptlMouse->x = dragInfo->xDrop;
128*cc13e73eSYuri Dario ptlMouse->y = dragInfo->yDrop;
129*cc13e73eSYuri Dario WinMapWindowPoints( HWND_DESKTOP, hwnd, ptlMouse, 1);
130*cc13e73eSYuri Dario // invert y-coordinate
131*cc13e73eSYuri Dario WinQueryWindowRect( hwnd, &rclClient);
132*cc13e73eSYuri Dario ptlMouse->y = rclClient.yTop - ptlMouse->y;
133*cc13e73eSYuri Dario }
134*cc13e73eSYuri Dario
135*cc13e73eSYuri Dario
136*cc13e73eSYuri Dario //
137*cc13e73eSYuri Dario // subclassed frame window procedure: used to intercept DM_* messages
138*cc13e73eSYuri Dario // without accessing default window procedure inside VCL private code
139*cc13e73eSYuri Dario //
dndFrameProc(HWND hwnd,ULONG msg,MPARAM mp1,MPARAM mp2)140*cc13e73eSYuri Dario extern "C" MRESULT EXPENTRY dndFrameProc(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2)
141*cc13e73eSYuri Dario {
142*cc13e73eSYuri Dario #if 0
143*cc13e73eSYuri Dario debug_printf("dndFrameProc hwnd %x, msg %x", hwnd, msg);
144*cc13e73eSYuri Dario #endif
145*cc13e73eSYuri Dario DropTarget* dt = (DropTarget*) GetWindowDropTargetPtr( hwnd);
146*cc13e73eSYuri Dario DragSource* ds = NULL;
147*cc13e73eSYuri Dario MRESULT mr;
148*cc13e73eSYuri Dario
149*cc13e73eSYuri Dario switch( msg) {
150*cc13e73eSYuri Dario
151*cc13e73eSYuri Dario case DM_DRAGOVER:
152*cc13e73eSYuri Dario debug_printf("dndFrameProc hwnd %x, dt %x, DM_DRAGOVER", hwnd, dt);
153*cc13e73eSYuri Dario return dt->dragOver( (PDRAGINFO) mp1);
154*cc13e73eSYuri Dario break;
155*cc13e73eSYuri Dario
156*cc13e73eSYuri Dario case DM_DRAGLEAVE:
157*cc13e73eSYuri Dario debug_printf("dndFrameProc hwnd %x, dt %x, DM_DRAGLEAVE", hwnd, dt);
158*cc13e73eSYuri Dario return dt->dragLeave( (PDRAGINFO) mp1);
159*cc13e73eSYuri Dario break;
160*cc13e73eSYuri Dario
161*cc13e73eSYuri Dario case DM_DROP:
162*cc13e73eSYuri Dario debug_printf("dndFrameProc hwnd %x, dt %x, DM_DROP", hwnd, dt);
163*cc13e73eSYuri Dario mr = dt->drop( (PDRAGINFO) mp1);
164*cc13e73eSYuri Dario debug_printf("dndFrameProc hwnd %x, dt %x, DM_DROP mr=%x", hwnd, dt, mr);
165*cc13e73eSYuri Dario return mr;
166*cc13e73eSYuri Dario break;
167*cc13e73eSYuri Dario
168*cc13e73eSYuri Dario case DM_RENDERCOMPLETE:
169*cc13e73eSYuri Dario debug_printf("dndFrameProc hwnd %x, dt %x, DM_RENDERCOMPLETE", hwnd, dt);
170*cc13e73eSYuri Dario mr = dt->renderComplete( (PDRAGTRANSFER) mp1);
171*cc13e73eSYuri Dario debug_printf("dndFrameProc hwnd %x, dt %x, DM_RENDERCOMPLETE mr=0x%x", hwnd, dt, mr);
172*cc13e73eSYuri Dario return mr;
173*cc13e73eSYuri Dario break;
174*cc13e73eSYuri Dario
175*cc13e73eSYuri Dario case DM_RENDERPREPARE:
176*cc13e73eSYuri Dario debug_printf("dndFrameProc hwnd %x, dt %x, DM_RENDERPREPARE", hwnd, dt);
177*cc13e73eSYuri Dario break;
178*cc13e73eSYuri Dario
179*cc13e73eSYuri Dario case DM_RENDER:
180*cc13e73eSYuri Dario ds = (DragSource*) GetWindowDragSourcePtr( hwnd);
181*cc13e73eSYuri Dario debug_printf("dndFrameProc hwnd %x, dt %x, DM_RENDER", hwnd, ds);
182*cc13e73eSYuri Dario mr = ds->render( (PDRAGTRANSFER) mp1);
183*cc13e73eSYuri Dario return mr;
184*cc13e73eSYuri Dario break;
185*cc13e73eSYuri Dario
186*cc13e73eSYuri Dario // sent from target window to source window after rendering
187*cc13e73eSYuri Dario case DM_ENDCONVERSATION:
188*cc13e73eSYuri Dario // sent from AOO to DropSource to notify end of dragging
189*cc13e73eSYuri Dario case DM_AOO_ENDCONVERSATION:
190*cc13e73eSYuri Dario ds = (DragSource*) GetWindowDragSourcePtr( hwnd);
191*cc13e73eSYuri Dario debug_printf("dndFrameProc hwnd %x, dt %x, DM_ENDCONVERSATION", hwnd, ds);
192*cc13e73eSYuri Dario mr = ds->endConversation( (ULONG) mp1, (ULONG) mp2);
193*cc13e73eSYuri Dario return mr;
194*cc13e73eSYuri Dario break;
195*cc13e73eSYuri Dario
196*cc13e73eSYuri Dario }
197*cc13e73eSYuri Dario
198*cc13e73eSYuri Dario // forward to VCL frame proc
199*cc13e73eSYuri Dario return dt->defWndProc(hwnd, msg, mp1, mp2);
200*cc13e73eSYuri Dario }
201