1 /* 2 * Copyright 2006, Haiku. 3 * Distributed under the terms of the MIT License. 4 * 5 * Authors: 6 * Ingo Weinhold <bonefish@cs.tu-berlin.de> 7 */ 8 9 #include "Scroller.h" 10 11 #include <stdio.h> 12 13 #include <Point.h> 14 #include <Rect.h> 15 16 #include "Scrollable.h" 17 18 // constructor 19 Scroller::Scroller() 20 : fScrollTarget(NULL), 21 fScrollingEnabled(true) 22 { 23 } 24 25 // destructor 26 Scroller::~Scroller() 27 { 28 } 29 30 // SetScrollTarget 31 // 32 // Sets a new scroll target. Notifies the old and the new target 33 // of the change if necessary . 34 void 35 Scroller::SetScrollTarget(Scrollable* target) 36 { 37 Scrollable* oldTarget = fScrollTarget; 38 if (oldTarget != target) { 39 fScrollTarget = NULL; 40 // Notify the old target, if it doesn't know about the change. 41 if (oldTarget && oldTarget->ScrollSource() == this) 42 oldTarget->SetScrollSource(NULL); 43 fScrollTarget = target; 44 // Notify the new target, if it doesn't know about the change. 45 if (target && target->ScrollSource() != this) 46 target->SetScrollSource(this); 47 // Notify ourselves. 48 ScrollTargetChanged(oldTarget, target); 49 } 50 } 51 52 // ScrollTarget 53 // 54 // Returns the current scroll target. May be NULL, if we don't have any. 55 Scrollable* 56 Scroller::ScrollTarget() const 57 { 58 return fScrollTarget; 59 } 60 61 // SetDataRect 62 // 63 // Sets the data rect of the scroll target, if we have one. 64 void 65 Scroller::SetDataRect(BRect dataRect) 66 { 67 if (fScrollTarget) 68 fScrollTarget->SetDataRect(dataRect); 69 } 70 71 // DataRect 72 // 73 // Returns the data rect of the scroll target or a undefined value, if 74 // we have none. 75 BRect 76 Scroller::DataRect() const 77 { 78 if (fScrollTarget) 79 return fScrollTarget->DataRect(); 80 return BRect(); 81 } 82 83 // SetScrollOffset 84 // 85 // Sets the scroll offset of the scroll target, if we have one. 86 void 87 Scroller::SetScrollOffset(BPoint offset) 88 { 89 if (fScrollTarget) 90 fScrollTarget->SetScrollOffset(offset); 91 } 92 93 // ScrollOffset 94 // 95 // Returns the scroll offset of the scroll target or a undefined value, if 96 // we have none. 97 BPoint 98 Scroller::ScrollOffset() const 99 { 100 if (fScrollTarget) 101 return fScrollTarget->ScrollOffset(); 102 return BPoint(0.0, 0.0); 103 } 104 105 // SetVisibleSize 106 // 107 // Sets the visible size of the scroll target, if we have one. 108 void 109 Scroller::SetVisibleSize(float width, float height) 110 { 111 if (fScrollTarget) 112 fScrollTarget->SetVisibleSize(width, height); 113 } 114 115 // VisibleBounds 116 // 117 // Returns the visible bounds of the scroll target or a undefined value, if 118 // we have none. 119 BRect 120 Scroller::VisibleBounds() const 121 { 122 if (fScrollTarget) 123 return fScrollTarget->VisibleBounds(); 124 return BRect(); 125 } 126 127 // VisibleRect 128 // 129 // Returns the visible rect of the scroll target or a undefined value, if 130 // we have none. 131 BRect 132 Scroller::VisibleRect() const 133 { 134 if (fScrollTarget) 135 return fScrollTarget->VisibleRect(); 136 return BRect(); 137 } 138 139 // SetScrollingEnabled 140 void 141 Scroller::SetScrollingEnabled(bool enabled) 142 { 143 fScrollingEnabled = enabled; 144 } 145 146 // IsScrolling 147 bool 148 Scroller::IsScrolling() const 149 { 150 return false; 151 } 152 153 // hooks 154 155 // DataRectChanged 156 // 157 // Hook function. Implemented by derived classes to get notified when 158 // the data rect of the sroll target has changed. 159 void 160 Scroller::DataRectChanged(BRect /*oldDataRect*/, BRect /*newDataRect*/) 161 { 162 } 163 164 // ScrollOffsetChanged 165 // 166 // Hook function. Implemented by derived classes to get notified when 167 // the scroll offset of the sroll target has changed. 168 void 169 Scroller::ScrollOffsetChanged(BPoint /*oldOffset*/, BPoint /*newOffset*/) 170 { 171 } 172 173 // VisiblSizeChanged 174 // 175 // Hook function. Implemented by derived classes to get notified when 176 // the visible size of the sroll target has changed. 177 void 178 Scroller::VisibleSizeChanged(float /*oldWidth*/, float /*oldHeight*/, 179 float /*newWidth*/, float /*newHeight*/) 180 { 181 } 182 183 // ScrollTargetChanged 184 // 185 // Hook function. Implemented by derived classes to get notified when 186 // the sroll target has changed. /target/ may be NULL. 187 void 188 Scroller::ScrollTargetChanged(Scrollable* /*oldTarget*/, 189 Scrollable* /*newTarget*/) 190 { 191 } 192 193