changeset 707:86d76fc09237

Added support for scrollbar line and page scrolling. Need to check the calculations... It may need to scroll minus the viewport length instead of the entire range.
author bsmith@81767d24-ef19-dc11-ae90-00e081727c95
date Sat, 12 Mar 2011 01:50:20 +0000
parents 79b38b1f3346
children 5fe2ca5ef88b
files mac/dw.m
diffstat 1 files changed, 51 insertions(+), 1 deletions(-) [+]
line wrap: on
line diff
--- a/mac/dw.m	Fri Mar 11 21:53:01 2011 +0000
+++ b/mac/dw.m	Sat Mar 12 01:50:20 2011 +0000
@@ -699,7 +699,57 @@
 -(float)range { return range; }
 -(float)visible { return visible; }
 -(void)setRange:(float)input1 andVisible:(float)input2 { range = input1; visible = input2; }
--(void)scrollerChanged:(id)sender { int result = (int)([self doubleValue] * [self range]); _event_handler(self, (void *)result, 14); }
+-(void)scrollerChanged:(id)sender 
+{ 
+    double proportion = [self knobProportion];
+    int result = (int)([self doubleValue] * range);
+    int newpos = result;
+    int page = (int)(proportion * range);
+    int max = (int)(range - page);
+    
+    switch ([sender hitPart]) 
+    {
+            
+        case NSScrollerDecrementLine:
+            if(newpos > 0)
+            {
+                newpos--;
+            }
+            break;
+            
+        case NSScrollerIncrementLine:
+            if(newpos < range)
+            {
+                newpos++;
+            }
+            break;
+            
+        case NSScrollerDecrementPage:
+            newpos -= page;
+            if(newpos < 0)
+            {
+                newpos = 0;
+            }
+            break;
+            
+        case NSScrollerIncrementPage:
+            newpos += page;
+            if(newpos > range)
+            {
+                newpos = range;
+            }
+            break;
+            
+        default:
+            ; // do nothing
+    }
+    if(newpos != result)
+    {
+        double newposd = (double)newpos/range;
+        [self setDoubleValue:newposd];
+    }
+    _event_handler(self, (void *)newpos, 14); 
+}
 -(void)dealloc { UserData *root = userdata; _remove_userdata(&root, NULL, TRUE); [super dealloc]; }
 @end