diff --git a/ChangeLog b/ChangeLog index 5840547e9..987a64889 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,22 @@ +2002-02-28 Pierre-Yves Rivaille + + * Headers/gnustep/gui/NSEvent.h: + new element in event_data union, provides support for deltaX, deltaY + and deltaZ. + * Source/NSEvent.m + ([NSEvent +mouseEventWithType:location:modifierFlags:timestamp: + windowNumber:context:deltaX:deltaY:deltaZ:]): + new method : support for creating event with deltaX, deltaY and deltaZ. + ([NSEvent -delta{X, Y, Z}]): methods implemented. + ([NSEvent -description]): + ([NSEvent -initWithCoder:]): + ([NSEvent -encodeWithCoder:]): + suppor for deltaX, deltaY and deltaZ + * Source/NSResponder.m ([NSResponder -scrollWheel:]): + implementation. + * Source/NSScrollView.m ([NSScrollView -scrollWheel:]): + implementation, does scroll the document view. + Thu Feb 28 16:47:58 2002 Nicola Pero * Tools/make_services.m: Use 'Applications' not 'Apps'. diff --git a/Headers/gnustep/gui/NSEvent.h b/Headers/gnustep/gui/NSEvent.h index 2b81fba09..5f3d3153f 100644 --- a/Headers/gnustep/gui/NSEvent.h +++ b/Headers/gnustep/gui/NSEvent.h @@ -113,9 +113,9 @@ enum { { struct { - int event_num; - int click; - float pressure; + int event_num; + int click; + float pressure; } mouse; struct { @@ -130,6 +130,12 @@ enum { int tracking_num; void *user_data; } tracking; + struct + { + float deltaX; + float deltaY; + float deltaZ; + } scrollWheel; struct { short sub_type; @@ -174,6 +180,16 @@ enum { clickCount: (int)clickNum pressure: (float)pressureValue; ++ (NSEvent*) mouseEventWithType: (NSEventType)type + location: (NSPoint)location + modifierFlags: (unsigned int)flags + timestamp: (NSTimeInterval)time + windowNumber: (int)windowNum + context: (NSGraphicsContext*)context + deltaX: (float)deltaX + deltaY: (float)deltaY + deltaZ: (float)deltaZ; + + (NSEvent*) otherEventWithType: (NSEventType)type location: (NSPoint)location modifierFlags: (unsigned int)flags diff --git a/Source/NSEvent.m b/Source/NSEvent.m index 78cfb2af6..fb8d430d0 100644 --- a/Source/NSEvent.m +++ b/Source/NSEvent.m @@ -188,6 +188,41 @@ static Class eventClass; return e; } ++ (NSEvent*) mouseEventWithType: (NSEventType)type + location: (NSPoint)location + modifierFlags: (unsigned int)flags + timestamp: (NSTimeInterval)time + windowNumber: (int)windowNum + context: (NSGraphicsContext*)context + deltaX: (float)deltaX + deltaY: (float)deltaY + deltaZ: (float)deltaZ +{ + NSEvent *e; + + if ((type < NSMouseMoved || type > NSRightMouseDragged) + && (type != NSScrollWheel)) + [NSException raise: NSInvalidArgumentException + format: @"mouseEvent with wrong type"]; + + e = (NSEvent*)NSAllocateObject(self, 0, NSDefaultMallocZone()); + if (self != eventClass) + e = [e init]; + AUTORELEASE(e); + + e->event_type = type; + e->location_point = location; + e->modifier_flags = flags; + e->event_time = time; + e->window_num = windowNum; + e->event_context = context; + e->event_data.scrollWheel.deltaX = deltaX; + e->event_data.scrollWheel.deltaY = deltaY; + e->event_data.scrollWheel.deltaZ = deltaZ; + + return e; +} + + (NSEvent*) otherEventWithType: (NSEventType)type location: (NSPoint)location modifierFlags: (unsigned int)flags @@ -506,31 +541,70 @@ static Class eventClass; /* * Scroll event data */ +/** +

+ Returns the movement of the mouse on the X axis. +

+

+ This method is only valid for NSMouseMoved, NS*MouseDragged and + NSScrollWheel events, otherwise it will raise an + NSInvalidArgumentException. +

+ */ - (float)deltaX { - if (event_type != NSScrollWheel) + if (event_type != NSScrollWheel + && (event_type < NSMouseMoved + || event_type > NSRightMouseDragged)) [NSException raise: NSInvalidArgumentException format: @"deltaX requested for invalid event type"]; - // FIXME - return 0.0; + + return event_data.scrollWheel.deltaX; } +/** +

+ Returns the movement of the mouse on the Y axis. +

+

+ This method is only valid for NSMouseMoved, NS*MouseDragged and + NSScrollWheel events, otherwise it will raise an + NSInvalidArgumentException. +

+ */ - (float)deltaY { - if (event_type != NSScrollWheel) + if (event_type != NSScrollWheel + && (event_type < NSMouseMoved + || event_type > NSRightMouseDragged)) [NSException raise: NSInvalidArgumentException format: @"deltaY requested for invalid event type"]; - // FIXME - return 0.0; + + return event_data.scrollWheel.deltaY; } +/** +

+ Returns the movement of the mouse on the Z axis. +

+

+ This method is only valid for NSMouseMoved, NS*MouseDragged and + NSScrollWheel events, otherwise it will raise an + NSInvalidArgumentException. +

+

+ The value returned is 0.0 in most cases. +

+ */ - (float)deltaZ { - if (event_type != NSScrollWheel) + if (event_type != NSScrollWheel + && (event_type < NSMouseMoved + || event_type > NSRightMouseDragged)) [NSException raise: NSInvalidArgumentException format: @"deltaZ requested for invalid event type"]; - // FIXME - return 0.0; + + return event_data.scrollWheel.deltaZ; } /* @@ -552,10 +626,6 @@ static Class eventClass; case NSMiddleMouseUp: case NSRightMouseDown: case NSRightMouseUp: - case NSMouseMoved: - case NSLeftMouseDragged: - case NSMiddleMouseDragged: - case NSRightMouseDragged: [aCoder encodeValuesOfObjCTypes: "iif", &event_data.mouse.event_num, &event_data.mouse.click, &event_data.mouse.pressure]; break; @@ -586,7 +656,14 @@ static Class eventClass; &event_data.misc.data1, &event_data.misc.data2]; break; case NSScrollWheel: - // FIXME + case NSMouseMoved: + case NSLeftMouseDragged: + case NSMiddleMouseDragged: + case NSRightMouseDragged: + [aCoder encodeValuesOfObjCTypes: "fff", + &event_data.scrollWheel.deltaX, + &event_data.scrollWheel.deltaY, + &event_data.scrollWheel.deltaZ]; break; } } @@ -608,10 +685,6 @@ static Class eventClass; case NSMiddleMouseUp: case NSRightMouseDown: case NSRightMouseUp: - case NSMouseMoved: - case NSLeftMouseDragged: - case NSMiddleMouseDragged: - case NSRightMouseDragged: [aDecoder decodeValuesOfObjCTypes: "iif", &event_data.mouse.event_num, &event_data.mouse.click, &event_data.mouse.pressure]; break; @@ -643,7 +716,14 @@ static Class eventClass; break; case NSScrollWheel: - // FIXME + case NSMouseMoved: + case NSLeftMouseDragged: + case NSMiddleMouseDragged: + case NSRightMouseDragged: + [aDecoder decodeValuesOfObjCTypes: "fff", + &event_data.scrollWheel.deltaX, + &event_data.scrollWheel.deltaY, + &event_data.scrollWheel.deltaZ]; break; } @@ -691,7 +771,8 @@ static Class eventClass; "systemDefined", "applicationDefined", "periodic", - "cursorUpdate" + "cursorUpdate", + "scrollWheel" }; switch (event_type) @@ -702,10 +783,6 @@ static Class eventClass; case NSMiddleMouseUp: case NSRightMouseDown: case NSRightMouseUp: - case NSMouseMoved: - case NSLeftMouseDragged: - case NSMiddleMouseDragged: - case NSRightMouseDragged: return [NSString stringWithFormat: @"NSEvent: eventType = %s, point = { %f, %f }, modifiers = %u," @" time = %f, window = %d, dpsContext = %p," @@ -757,8 +834,21 @@ static Class eventClass; event_data.misc.sub_type, event_data.misc.data1, event_data.misc.data2]; break; + case NSScrollWheel: - // FIXME + case NSMouseMoved: + case NSLeftMouseDragged: + case NSMiddleMouseDragged: + case NSRightMouseDragged: + return [NSString stringWithFormat: + @"NSEvent: eventType = %s, point = { %f, %f }, modifiers = %u," + @" time = %f, window = %d, dpsContext = %p," + @" deltaX = %f, deltaY = %f, deltaZ = %f", + eventTypes[event_type], location_point.x, location_point.y, + modifier_flags, event_time, window_num, event_context, + event_data.scrollWheel.deltaX, + event_data.scrollWheel.deltaY, + event_data.scrollWheel.deltaZ]; break; } diff --git a/Source/NSResponder.m b/Source/NSResponder.m index c867bd3b6..9d922e448 100644 --- a/Source/NSResponder.m +++ b/Source/NSResponder.m @@ -289,8 +289,10 @@ - (void) scrollWheel: (NSEvent *)theEvent { - // FIXME - NSLog(@"Sorry, currently no support for scroll wheel."); + if (_next_responder) + return [_next_responder scrollWheel: theEvent]; + else + return [self noResponderFor: @selector(scrollWheel:)]; } /* diff --git a/Source/NSScrollView.m b/Source/NSScrollView.m index 9b5df9a65..e65b85a69 100644 --- a/Source/NSScrollView.m +++ b/Source/NSScrollView.m @@ -292,7 +292,52 @@ static float scrollerWidth; - (void) scrollWheel: (NSEvent *)theEvent { - // FIXME + NSRect clipViewBounds = [_contentView bounds]; + float deltaY = [theEvent deltaY]; + float amount; + NSPoint point = clipViewBounds.origin; + + + if (([theEvent modifierFlags] & NSAlternateKeyMask) == NSAlternateKeyMask) + { + amount = - (clipViewBounds.size.height - _vPageScroll) * deltaY; + } + else + { + amount = - _vLineScroll * deltaY; + } + + if (!_contentView->_rFlags.flipped_view) + { + /* If view is flipped reverse the scroll direction */ + amount = -amount; + } + NSDebugLog (@"increment/decrement: amount = %f, flipped = %d", + amount, _contentView->_rFlags.flipped_view); + point.y = clipViewBounds.origin.y + amount; + + if (_hasHeaderView) + { + NSPoint scrollTo; + + scrollTo = [_headerClipView bounds].origin; + scrollTo.x += point.x - clipViewBounds.origin.x; + [_headerClipView scrollToPoint: scrollTo]; + } + [_contentView scrollToPoint: point]; + + if (_rulersVisible == YES) + { + if (_hasHorizRuler) + { + [_horizRuler setNeedsDisplay: YES]; + } + if (_hasVertRuler) + { + [_vertRuler setNeedsDisplay: YES]; + } + } + } - (void) _doScroll: (NSScroller*)scroller