1/*
2 * Copyright (c) 1999-2000, Eric Moon.
3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
7 * are met:
8 *
9 * 1. Redistributions of source code must retain the above copyright
10 *    notice, this list of conditions, and the following disclaimer.
11 *
12 * 2. Redistributions in binary form must reproduce the above copyright
13 *    notice, this list of conditions, and the following disclaimer in the
14 *    documentation and/or other materials provided with the distribution.
15 *
16 * 3. The name of the author may not be used to endorse or promote products
17 *    derived from this software without specific prior written permission.
18 *
19 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR
20 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
21 * OF TITLE, NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS FOR A PARTICULAR
22 * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
23 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
24 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
25 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
26 * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR
27 * TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
28 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29 */
30
31
32// MouseTrackingHelpers.cpp
33// e.moon 8mar99
34
35#include "MouseTrackingHelpers.h"
36
37#include "debug_tools.h"
38
39__USE_CORTEX_NAMESPACE
40
41
42MouseTrackingSourceView::MouseTrackingSourceView(BRect frame, const char* name,
43		uint32 resizeMode, uint32 flags, uint32 trackingFlags)
44	: BView(frame, name, resizeMode, flags),
45	m_pDest(0),
46	m_trackingFlags(trackingFlags),
47	m_bTracking(false)
48{
49	//FrameResized(frame.Width(), frame.Height());
50}
51
52
53MouseTrackingSourceView::~MouseTrackingSourceView()
54{
55}
56
57
58// get mouse-down point in screen coordinates; returns
59// B_OK on success, or B_ERROR if no longer tracking
60// the mouse.
61status_t MouseTrackingSourceView::getTrackingOrigin(
62	BPoint* poPoint) const {
63	if(!m_bTracking)
64		return B_ERROR;
65	*poPoint = m_initPoint;
66	return B_OK;
67}
68
69// fetch/set the destination handler
70
71status_t MouseTrackingSourceView::setTrackingDestination(
72	IMouseTrackingDestination* pDest) {
73	if(m_bTracking)
74		return B_ERROR;
75
76	m_pDest = pDest;
77	return B_OK;
78}
79
80// ---------------------------------------------------------------- //
81// BView impl.
82// ---------------------------------------------------------------- //
83
84// handle mouse events
85void MouseTrackingSourceView::MouseDown(BPoint point) {
86	if(!m_trackingFlags)
87		return;
88
89	// get mouse state & initial point
90	uint32 buttons;
91	GetMouse(&point, &buttons);
92	m_prevPoint = ConvertToScreen(point);
93	m_initPoint = m_prevPoint;
94
95	// start tracking the mouse
96	SetMouseEventMask(B_POINTER_EVENTS,
97		B_LOCK_WINDOW_FOCUS|B_NO_POINTER_HISTORY);
98	m_bTracking = true;
99
100	// notify destination
101	if(m_pDest)
102		m_pDest->mouseTrackingBegin(this, buttons, point);
103}
104
105void MouseTrackingSourceView::MouseMoved(BPoint point, uint32 transit,
106	const BMessage* pMsg) {
107
108	if(m_bTracking) {
109
110		// mouse-tracking update: figure number of pixels moved
111		// (along the axes I care about)
112		uint32 buttons;
113		GetMouse(&point, &buttons, false);
114		ConvertToScreen(&point);
115
116		if(point == m_prevPoint) // no motion?
117			return;
118
119		float xDelta = m_trackingFlags & TRACK_HORIZONTAL ?
120			point.x - m_prevPoint.x : 0.0;
121		float yDelta = m_trackingFlags & TRACK_VERTICAL ?
122			point.y - m_prevPoint.y : 0.0;
123
124		// pass info to destination view
125		if(m_pDest)
126			m_pDest->mouseTrackingUpdate(buttons, xDelta, yDelta, point);
127
128		// store point for future delta calculations
129		m_prevPoint = point;
130	}
131}
132
133void MouseTrackingSourceView::MouseUp(BPoint point) {
134	if(m_bTracking) {
135//		PRINT(( "MouseTrackingSourceView::MouseUp()\n"));
136
137		// +++++ handle final update
138
139		// clean up
140		m_bTracking = false;
141		if(m_pDest)
142			m_pDest->mouseTrackingEnd();
143	}
144}
145
146// look for a default destination
147void MouseTrackingSourceView::AttachedToWindow() {
148	if(m_pDest) // already have a destination
149		return;
150
151	for(BView* pParent = Parent(); pParent; pParent = pParent->Parent()) {
152		IMouseTrackingDestination* pFound =
153			dynamic_cast<IMouseTrackingDestination*>(pParent);
154		if(pFound) // found a valid destination
155			m_pDest = pFound;
156	}
157}
158
159/*
160// track current frame rectangle
161void MouseTrackingSourceView::FrameResized(float width, float height) {
162	_inherited::FrameResized(width, height);
163	m_prevFrame = Frame();
164
165	// +++++ adjust if currently tracking?
166}
167*/
168
169// END -- MouseTrackingHelpers.cpp --
170
171