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.h 33// e.moon 8mar99 34// 35// Some helper classes for mouse tracking, designed to make 36// it easier to delegate drag operations to a parent class 37// (especially useful for pane-separator bars & other operations 38// in which a view is moved or resized as the user drags 39// within it.) 40// 41// HISTORY 42// e.moon 11may99: fixed m_bTracking bug (not init'd in ctor) 43// fixed mouseTrackingBegin() documentation 44// (point is in view, not screen, coords) 45 46#ifndef __MouseTrackingHelpers_H__ 47#define __MouseTrackingHelpers_H__ 48 49#include <View.h> 50 51#include "cortex_defs.h" 52__BEGIN_CORTEX_NAMESPACE 53 54class MouseTrackingSourceView; 55 56// interface for a mouse-tracking destination 57class IMouseTrackingDestination { 58public: // operations 59 IMouseTrackingDestination() { } 60 virtual ~IMouseTrackingDestination() { } 61 // a MouseTrackingSourceView has started tracking the mouse 62 // (point is in pSource view coordinates) 63 virtual void mouseTrackingBegin( 64 MouseTrackingSourceView* pSource, 65 uint32 buttons, 66 BPoint point)=0; 67 68 // mouse-tracking update from child view 69 // (point is in screen coordinates) 70 virtual void mouseTrackingUpdate( 71 uint32 buttons, 72 float xDelta, 73 float yDelta, 74 BPoint point)=0; 75 76 // mouse-tracking done 77 virtual void mouseTrackingEnd()=0; 78}; 79 80// mouse-tracking 'source' view 81// hands off to a destination view (by default its immediate 82// parent) 83 84class MouseTrackingSourceView : public BView { 85 typedef BView _inherited; 86 87public: // types & constants 88 // these bits determine which mouse axes will be tracked 89 // (ie. if TRACK_HORIZONTAL isn't set, mouseTrackUpdate() 90 // will always be called with xDelta == 0.0) 91 enum mouse_tracking_flag_t { 92 TRACK_HORIZONTAL = 1, 93 TRACK_VERTICAL = 2 94 }; 95 96public: // ctor/dtor 97 MouseTrackingSourceView( 98 BRect frame, 99 const char* pName, 100 uint32 resizeMode=B_FOLLOW_LEFT|B_FOLLOW_TOP, 101 uint32 flags=B_WILL_DRAW|B_FRAME_EVENTS, 102 uint32 trackingFlags=TRACK_HORIZONTAL|TRACK_VERTICAL); 103 104 ~MouseTrackingSourceView(); 105 106 bool isTracking() const { return m_bTracking; } 107 108 // get mouse-down point in screen coordinates; returns 109 // B_OK on success, or B_ERROR if no longer tracking 110 // the mouse. 111 status_t getTrackingOrigin(BPoint* poPoint) const; 112 113 // fetch/set the destination handler 114 // (if not yet attached to a window, or if no parent 115 // implements IMouseTrackDestination, trackingDestination() 116 // returns 0) 117 // 118 // setting the destination handler isn't allowed if a tracking 119 // operation is currently in progress 120 121 IMouseTrackingDestination* trackingDestination() const { 122 return m_pDest; 123 } 124 status_t setTrackingDestination(IMouseTrackingDestination* pDest); 125 126public: // BView impl. 127 128 // handle mouse events 129 virtual void MouseDown(BPoint point); 130 virtual void MouseMoved(BPoint point, uint32 transit, 131 const BMessage* pMsg); 132 virtual void MouseUp(BPoint point); 133 134 // look for a default destination 135 virtual void AttachedToWindow(); 136 137/* 138 // track current frame rectangle 139 virtual void FrameResized(float width, float height); 140*/ 141protected: // members 142 143 IMouseTrackingDestination* m_pDest; 144 uint32 m_trackingFlags; 145 146 // mouse-tracking state 147 bool m_bTracking; 148 BPoint m_prevPoint; // in screen coords 149 BPoint m_initPoint; // in screen coords 150 151// BRect m_prevFrame; 152}; 153 154__END_CORTEX_NAMESPACE 155#endif /* __MouseTrackingHelpers_H__ */ 156