1139749Simp/*
212437Speter * Copyright (c) 1999-2000, Eric Moon.
312437Speter * All rights reserved.
412437Speter *
512437Speter * Redistribution and use in source and binary forms, with or without
612437Speter * modification, are permitted provided that the following conditions
712437Speter * are met:
812437Speter *
912437Speter * 1. Redistributions of source code must retain the above copyright
1012437Speter *    notice, this list of conditions, and the following disclaimer.
1112437Speter *
1212437Speter * 2. Redistributions in binary form must reproduce the above copyright
1312437Speter *    notice, this list of conditions, and the following disclaimer in the
1412437Speter *    documentation and/or other materials provided with the distribution.
1512437Speter *
1612437Speter * 3. The name of the author may not be used to endorse or promote products
1712437Speter *    derived from this software without specific prior written permission.
1812437Speter *
1912437Speter * THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR
2012437Speter * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
2112437Speter * OF TITLE, NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS FOR A PARTICULAR
2212437Speter * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
2312437Speter * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
2412437Speter * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
2512437Speter * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
2612437Speter * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR
2712437Speter * TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
2812437Speter * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
2912437Speter */
3012437Speter
3112437Speter
3250477Speter// MouseTrackingHelpers.cpp
3312437Speter// e.moon 8mar99
3412437Speter
3512437Speter#include "MouseTrackingHelpers.h"
3612437Speter
3712437Speter#include "debug_tools.h"
3812437Speter
3912437Speter__USE_CORTEX_NAMESPACE
4012437Speter
4112437Speter
4212437SpeterMouseTrackingSourceView::MouseTrackingSourceView(BRect frame, const char* name,
4312437Speter		uint32 resizeMode, uint32 flags, uint32 trackingFlags)
4412437Speter	: BView(frame, name, resizeMode, flags),
4512437Speter	m_pDest(0),
4612437Speter	m_trackingFlags(trackingFlags),
4712437Speter	m_bTracking(false)
4812437Speter{
4912437Speter	//FrameResized(frame.Width(), frame.Height());
5012437Speter}
5112437Speter
5212437Speter
5312437SpeterMouseTrackingSourceView::~MouseTrackingSourceView()
5412437Speter{
5512437Speter}
5612437Speter
5712437Speter
5812437Speter// get mouse-down point in screen coordinates; returns
5912437Speter// B_OK on success, or B_ERROR if no longer tracking
6012437Speter// the mouse.
6112437Speterstatus_t MouseTrackingSourceView::getTrackingOrigin(
6212437Speter	BPoint* poPoint) const {
6312437Speter	if(!m_bTracking)
6412437Speter		return B_ERROR;
6512437Speter	*poPoint = m_initPoint;
6612437Speter	return B_OK;
6712437Speter}
6812437Speter
6912437Speter// fetch/set the destination handler
7012437Speter
7112437Speterstatus_t MouseTrackingSourceView::setTrackingDestination(
7212437Speter	IMouseTrackingDestination* pDest) {
7312437Speter	if(m_bTracking)
7412437Speter		return B_ERROR;
7512437Speter
7612437Speter	m_pDest = pDest;
7712437Speter	return B_OK;
7812437Speter}
7912437Speter
8012437Speter// ---------------------------------------------------------------- //
8112437Speter// BView impl.
8212437Speter// ---------------------------------------------------------------- //
8312437Speter
8412437Speter// handle mouse events
8512437Spetervoid MouseTrackingSourceView::MouseDown(BPoint point) {
8612437Speter	if(!m_trackingFlags)
8712437Speter		return;
8812437Speter
8912437Speter	// get mouse state & initial point
9012437Speter	uint32 buttons;
9112437Speter	GetMouse(&point, &buttons);
9212437Speter	m_prevPoint = ConvertToScreen(point);
9312437Speter	m_initPoint = m_prevPoint;
9412437Speter
9512437Speter	// start tracking the mouse
9612437Speter	SetMouseEventMask(B_POINTER_EVENTS,
9712437Speter		B_LOCK_WINDOW_FOCUS|B_NO_POINTER_HISTORY);
9812437Speter	m_bTracking = true;
9919235Sjhay
10012437Speter	// notify destination
10112437Speter	if(m_pDest)
10212437Speter		m_pDest->mouseTrackingBegin(this, buttons, point);
10312437Speter}
10412437Speter
10512437Spetervoid MouseTrackingSourceView::MouseMoved(BPoint point, uint32 transit,
10612437Speter	const BMessage* pMsg) {
10712437Speter
10812437Speter	if(m_bTracking) {
10912437Speter
11012437Speter		// mouse-tracking update: figure number of pixels moved
11112437Speter		// (along the axes I care about)
11212437Speter		uint32 buttons;
11312437Speter		GetMouse(&point, &buttons, false);
11412437Speter		ConvertToScreen(&point);
11512437Speter
11612437Speter		if(point == m_prevPoint) // no motion?
11712437Speter			return;
11812437Speter
11912437Speter		float xDelta = m_trackingFlags & TRACK_HORIZONTAL ?
12012437Speter			point.x - m_prevPoint.x : 0.0;
12112437Speter		float yDelta = m_trackingFlags & TRACK_VERTICAL ?
12212437Speter			point.y - m_prevPoint.y : 0.0;
12312437Speter
12412437Speter		// pass info to destination view
12512437Speter		if(m_pDest)
12612437Speter			m_pDest->mouseTrackingUpdate(buttons, xDelta, yDelta, point);
12712437Speter
12812437Speter		// store point for future delta calculations
12912437Speter		m_prevPoint = point;
13012437Speter	}
13112437Speter}
13212437Speter
13312437Spetervoid MouseTrackingSourceView::MouseUp(BPoint point) {
13412437Speter	if(m_bTracking) {
13512437Speter//		PRINT(( "MouseTrackingSourceView::MouseUp()\n"));
13612437Speter
13712437Speter		// +++++ handle final update
13812437Speter
13912437Speter		// clean up
14012437Speter		m_bTracking = false;
14112437Speter		if(m_pDest)
14212437Speter			m_pDest->mouseTrackingEnd();
14312437Speter	}
14412437Speter}
14512437Speter
14612437Speter// look for a default destination
14712437Spetervoid MouseTrackingSourceView::AttachedToWindow() {
14812437Speter	if(m_pDest) // already have a destination
14912437Speter		return;
15012437Speter
15112437Speter	for(BView* pParent = Parent(); pParent; pParent = pParent->Parent()) {
15212437Speter		IMouseTrackingDestination* pFound =
15312437Speter			dynamic_cast<IMouseTrackingDestination*>(pParent);
15412437Speter		if(pFound) // found a valid destination
15512437Speter			m_pDest = pFound;
15612437Speter	}
15712437Speter}
15812437Speter
15912437Speter/*
16012437Speter// track current frame rectangle
16112437Spetervoid MouseTrackingSourceView::FrameResized(float width, float height) {
16212437Speter	_inherited::FrameResized(width, height);
16312437Speter	m_prevFrame = Frame();
16412437Speter
16512437Speter	// +++++ adjust if currently tracking?
16612437Speter}
16712437Speter*/
16812437Speter
16912437Speter// END -- MouseTrackingHelpers.cpp --
17012437Speter
17112437Speter