1 ! Copyright (C) 2008, 2009 Joe Groff, Slava Pestov.
2 ! Copyright (C) 2017-2018 Alexander Ilin.
3 ! See http://factorcode.org/license.txt for BSD license.
4 USING: accessors alien.accessors classes.struct kernel
5 namespaces sequences ui.backend.windows ui.gadgets.worlds
6 ui.gestures windows.com windows.com.wrapper windows.dropfiles
7 windows.kernel32 windows.ole32 windows.user32 ;
8 IN: windows.dragdrop-listener
10 : handle-data-object ( handler: ( hdrop -- x ) data-object -- filenames )
14 DVASPECT_CONTENT >>dwAspect
18 [ IDataObject::GetData ] keep swap succeeded? [
20 [ rot execute( hdrop -- x ) ] with-global-lock
24 : filenames-from-data-object ( data-object -- filenames )
25 \ filenames-from-hdrop swap handle-data-object ;
27 : filecount-from-data-object ( data-object -- n )
28 \ filecount-from-hdrop swap handle-data-object ;
30 TUPLE: listener-dragdrop world last-drop-effect ;
32 : <listener-dragdrop> ( world -- object )
33 DROPEFFECT_NONE listener-dragdrop boa ;
36 SYMBOL: +listener-dragdrop-wrapper+
42 [ ! HRESULT DragEnter ( IDataObject* pDataObject, DWORD grfKeyState, POINTL pt, DWORD* pdwEffect )
43 DROPEFFECT_COPY swap 0 set-alien-unsigned-4 3drop
44 DROPEFFECT_COPY >>last-drop-effect drop
46 ] [ ! HRESULT DragOver ( DWORD grfKeyState, POINTL pt, DWORD* pdwEffect )
49 [ world>> children>> first hand-gadget set-global ]
50 [ last-drop-effect>> ] bi
51 ] dip 0 set-alien-unsigned-4
53 ] [ ! HRESULT DragLeave ( )
55 ] [ ! HRESULT Drop ( IDataObject* pDataObject, DWORD grfKeyState, POINTL pt, DWORD* pdwEffect )
58 filenames-from-data-object dropped-files set-global
59 key-modifiers <file-drop> hand-gadget get-global propagate-gesture
61 ] dip 0 set-alien-unsigned-4
65 } <com-wrapper> +listener-dragdrop-wrapper+ set-global
68 : dragdrop-listener-window ( -- )
69 world get dup <listener-dragdrop>
70 +listener-dragdrop-wrapper+ get-global com-wrap [
71 [ handle>> hWnd>> ] dip
72 2dup RegisterDragDrop dup E_OUTOFMEMORY =
73 [ drop ole-initialize RegisterDragDrop ] [ 2nip ] if
75 ] with-com-interface ;