1/*
2 * Copyright 2006, Axel D��rfler, axeld@pinc-software.de. All rights reserved.
3 * Distributed under the terms of the MIT License.
4 */
5
6
7#include "DropTargetListView.h"
8
9
10DropTargetListView::DropTargetListView(const char* name,
11		list_view_type type, uint32 flags)
12	: BListView(name, type, flags),
13	fDropTarget(false)
14{
15}
16
17
18DropTargetListView::~DropTargetListView()
19{
20}
21
22
23void
24DropTargetListView::Draw(BRect updateRect)
25{
26	BListView::Draw(updateRect);
27
28	if (fDropTarget) {
29		// mark this view as a drop target
30		rgb_color color = HighColor();
31
32		SetHighColor(0, 0, 0);
33		SetPenSize(2);
34		BRect rect = Bounds();
35// TODO: this is an incompatibility between R5 and Haiku and should be fixed!
36#ifdef HAIKU_TARGET_PLATFORM_HAIKU
37		rect.left++;
38		rect.top++;
39#else
40		rect.right--;
41		rect.bottom--;
42#endif
43		StrokeRect(rect);
44
45		SetPenSize(1);
46		SetHighColor(color);
47	}
48}
49
50
51void
52DropTargetListView::MouseMoved(BPoint where, uint32 transit,
53	const BMessage* dragMessage)
54{
55	if (dragMessage != NULL && AcceptsDrag(dragMessage)) {
56		bool dropTarget = transit == B_ENTERED_VIEW || transit == B_INSIDE_VIEW;
57		if (dropTarget != fDropTarget) {
58			fDropTarget = dropTarget;
59			_InvalidateFrame();
60		}
61	} else if (fDropTarget) {
62		fDropTarget = false;
63		_InvalidateFrame();
64	}
65}
66
67
68bool
69DropTargetListView::AcceptsDrag(const BMessage* /*message*/)
70{
71	return true;
72}
73
74
75void
76DropTargetListView::_InvalidateFrame()
77{
78	// only update the parts affected by the change to reduce flickering
79	BRect rect = Bounds();
80	rect.right = rect.left + 1;
81	Invalidate(rect);
82
83	rect = Bounds();
84	rect.left = rect.right - 1;
85	Invalidate(rect);
86
87	rect = Bounds();
88	rect.bottom = rect.top + 1;
89	Invalidate(rect);
90
91	rect = Bounds();
92	rect.top = rect.bottom - 1;
93	Invalidate(rect);
94}
95