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