Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
W
wine-cw
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Registry
Registry
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
wine
wine-cw
Commits
08a2a609
Commit
08a2a609
authored
Dec 02, 2005
by
Michael Jung
Committed by
Alexandre Julliard
Dec 02, 2005
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Implemented scrolling during drag&drop for the shellview class.
parent
35617401
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
67 additions
and
2 deletions
+67
-2
shlview.c
dlls/shell32/shlview.c
+67
-2
No files found.
dlls/shell32/shlview.c
View file @
08a2a609
...
@@ -103,6 +103,7 @@ typedef struct
...
@@ -103,6 +103,7 @@ typedef struct
IDropTarget
*
pCurDropTarget
;
/* The sub-item, which is currently dragged over */
IDropTarget
*
pCurDropTarget
;
/* The sub-item, which is currently dragged over */
IDataObject
*
pCurDataObject
;
/* The dragged data-object */
IDataObject
*
pCurDataObject
;
/* The dragged data-object */
LONG
iDragOverItem
;
/* Dragged over item's index, iff pCurDropTarget != NULL */
LONG
iDragOverItem
;
/* Dragged over item's index, iff pCurDropTarget != NULL */
UINT
iActiveTimersMask
;
/* Bookkeeping of activated timers for drag scrolling */
}
IShellViewImpl
;
}
IShellViewImpl
;
static
const
IShellViewVtbl
svvt
;
static
const
IShellViewVtbl
svvt
;
...
@@ -196,6 +197,7 @@ IShellView * IShellView_Constructor( IShellFolder * pFolder)
...
@@ -196,6 +197,7 @@ IShellView * IShellView_Constructor( IShellFolder * pFolder)
sv
->
pCurDropTarget
=
NULL
;
sv
->
pCurDropTarget
=
NULL
;
sv
->
pCurDataObject
=
NULL
;
sv
->
pCurDataObject
=
NULL
;
sv
->
iDragOverItem
=
0
;
sv
->
iDragOverItem
=
0
;
sv
->
iActiveTimersMask
=
0
;
TRACE
(
"(%p)->(%p)
\n
"
,
sv
,
pFolder
);
TRACE
(
"(%p)->(%p)
\n
"
,
sv
,
pFolder
);
return
(
IShellView
*
)
sv
;
return
(
IShellView
*
)
sv
;
...
@@ -2177,11 +2179,56 @@ static ULONG WINAPI ISVDropTarget_Release( IDropTarget *iface)
...
@@ -2177,11 +2179,56 @@ static ULONG WINAPI ISVDropTarget_Release( IDropTarget *iface)
}
}
/******************************************************************************
/******************************************************************************
* scroll_timer_proc [Internal]
*
* Timer callback function for drag&drop scrolling
*/
#define IDT_UP 0x1u
#define IDT_DOWN 0x2u
#define IDT_LEFT 0x4u
#define IDT_RIGHT 0x8u
VOID
CALLBACK
scroll_timer_proc
(
HWND
hwnd
,
UINT
uMsg
,
UINT_PTR
idTimer
,
DWORD
dwTimer
)
{
switch
(
idTimer
)
{
case
IDT_UP
:
SendMessageW
(
hwnd
,
WM_VSCROLL
,
SB_LINEUP
,
0
);
break
;
case
IDT_DOWN
:
SendMessageW
(
hwnd
,
WM_VSCROLL
,
SB_LINEDOWN
,
0
);
break
;
case
IDT_LEFT
:
SendMessageW
(
hwnd
,
WM_HSCROLL
,
SB_LINEUP
,
0
);
break
;
case
IDT_RIGHT
:
SendMessageW
(
hwnd
,
WM_HSCROLL
,
SB_LINEDOWN
,
0
);
break
;
}
}
/******************************************************************************
* start_stop_timer [Internal]
*/
static
inline
void
start_stop_timer
(
IShellViewImpl
*
This
,
UINT_PTR
idTimer
,
BOOL
fStart
)
{
if
(
fStart
&&
!
(
This
->
iActiveTimersMask
&
idTimer
))
{
SetTimer
(
This
->
hWndList
,
idTimer
,
200
,
scroll_timer_proc
);
This
->
iActiveTimersMask
|=
idTimer
;
}
if
(
!
fStart
&&
This
->
iActiveTimersMask
&
idTimer
)
{
KillTimer
(
This
->
hWndList
,
idTimer
);
This
->
iActiveTimersMask
&=
~
idTimer
;
}
}
/******************************************************************************
* drag_notify_subitem [Internal]
* drag_notify_subitem [Internal]
*
*
* Figure out the shellfolder object, which is currently under the mouse cursor
* Figure out the shellfolder object, which is currently under the mouse cursor
* and notify it via the IDropTarget interface.
* and notify it via the IDropTarget interface.
*/
*/
#define SCROLLAREAWIDTH 20
static
HRESULT
drag_notify_subitem
(
IShellViewImpl
*
This
,
DWORD
grfKeyState
,
POINTL
pt
,
static
HRESULT
drag_notify_subitem
(
IShellViewImpl
*
This
,
DWORD
grfKeyState
,
POINTL
pt
,
DWORD
*
pdwEffect
)
DWORD
*
pdwEffect
)
{
{
...
@@ -2189,15 +2236,23 @@ static HRESULT drag_notify_subitem(IShellViewImpl *This, DWORD grfKeyState, POIN
...
@@ -2189,15 +2236,23 @@ static HRESULT drag_notify_subitem(IShellViewImpl *This, DWORD grfKeyState, POIN
LVITEMA
lvItem
;
LVITEMA
lvItem
;
LONG
lResult
;
LONG
lResult
;
HRESULT
hr
;
HRESULT
hr
;
RECT
clientRect
;
/* Map from global to client coordinates and query the index of the listview-item, which is
/* Map from global to client coordinates and query the index of the listview-item, which is
* currently under the mouse cursor. */
* currently under the mouse cursor. */
htinfo
.
pt
.
x
=
pt
.
x
;
htinfo
.
pt
.
x
=
pt
.
x
;
htinfo
.
pt
.
y
=
pt
.
y
;
htinfo
.
pt
.
y
=
pt
.
y
;
htinfo
.
flags
=
LVHT_ONITEM
;
htinfo
.
flags
=
LVHT_ONITEM
;
MapWindowPoints
(
NULL
,
This
->
hWndList
,
&
htinfo
.
pt
,
1
);
ScreenToClient
(
This
->
hWndList
,
&
htinfo
.
pt
);
lResult
=
SendMessageW
(
This
->
hWndList
,
LVM_HITTEST
,
0
,
(
LPARAM
)
&
htinfo
);
lResult
=
SendMessageW
(
This
->
hWndList
,
LVM_HITTEST
,
0
,
(
LPARAM
)
&
htinfo
);
/* Start or stop the drag scrolling timers */
GetClientRect
(
This
->
hWndList
,
&
clientRect
);
start_stop_timer
(
This
,
IDT_LEFT
,
htinfo
.
pt
.
x
<
SCROLLAREAWIDTH
);
start_stop_timer
(
This
,
IDT_RIGHT
,
htinfo
.
pt
.
x
>
clientRect
.
right
-
SCROLLAREAWIDTH
);
start_stop_timer
(
This
,
IDT_UP
,
htinfo
.
pt
.
y
<
SCROLLAREAWIDTH
);
start_stop_timer
(
This
,
IDT_DOWN
,
htinfo
.
pt
.
y
>
clientRect
.
bottom
-
SCROLLAREAWIDTH
);
/* If we are still over the previous sub-item, notify it via DragOver and return. */
/* If we are still over the previous sub-item, notify it via DragOver and return. */
if
(
This
->
pCurDropTarget
&&
lResult
==
This
->
iDragOverItem
)
if
(
This
->
pCurDropTarget
&&
lResult
==
This
->
iDragOverItem
)
return
IDropTarget_DragOver
(
This
->
pCurDropTarget
,
grfKeyState
,
pt
,
pdwEffect
);
return
IDropTarget_DragOver
(
This
->
pCurDropTarget
,
grfKeyState
,
pt
,
pdwEffect
);
...
@@ -2265,7 +2320,12 @@ static HRESULT WINAPI ISVDropTarget_DragLeave(IDropTarget *iface) {
...
@@ -2265,7 +2320,12 @@ static HRESULT WINAPI ISVDropTarget_DragLeave(IDropTarget *iface) {
This
->
pCurDataObject
=
NULL
;
This
->
pCurDataObject
=
NULL
;
This
->
pCurDropTarget
=
NULL
;
This
->
pCurDropTarget
=
NULL
;
This
->
iDragOverItem
=
0
;
This
->
iDragOverItem
=
0
;
start_stop_timer
(
This
,
IDT_LEFT
,
FALSE
);
start_stop_timer
(
This
,
IDT_RIGHT
,
FALSE
);
start_stop_timer
(
This
,
IDT_UP
,
FALSE
);
start_stop_timer
(
This
,
IDT_DOWN
,
FALSE
);
return
S_OK
;
return
S_OK
;
}
}
...
@@ -2282,6 +2342,11 @@ static HRESULT WINAPI ISVDropTarget_Drop(IDropTarget *iface, IDataObject* pDataO
...
@@ -2282,6 +2342,11 @@ static HRESULT WINAPI ISVDropTarget_Drop(IDropTarget *iface, IDataObject* pDataO
This
->
pCurDropTarget
=
NULL
;
This
->
pCurDropTarget
=
NULL
;
This
->
iDragOverItem
=
0
;
This
->
iDragOverItem
=
0
;
start_stop_timer
(
This
,
IDT_LEFT
,
FALSE
);
start_stop_timer
(
This
,
IDT_RIGHT
,
FALSE
);
start_stop_timer
(
This
,
IDT_UP
,
FALSE
);
start_stop_timer
(
This
,
IDT_DOWN
,
FALSE
);
return
S_OK
;
return
S_OK
;
}
}
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment